From bde2488267f01dd6349a62e95c91e8d8cc761c73 Mon Sep 17 00:00:00 2001 From: zhangjiaping Date: Fri, 25 Dec 2020 19:16:44 +0800 Subject: [PATCH] feat(SearchPage): Add detail widget. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Description: 添加搜索结果详情页 Log: 添加搜索结果详情页 --- control/control.pri | 4 + control/option-view.cpp | 185 +++++++++++++++++++++++++++++++++ control/option-view.h | 50 +++++++++ control/search-detail-view.cpp | 176 +++++++++++++++++++++++++++++++ control/search-detail-view.h | 31 ++++++ control/search-list-view.cpp | 59 ++++++++++- control/search-list-view.h | 20 +++- file-utils.cpp | 28 +++-- file-utils.h | 2 +- model/search-item.cpp | 16 ++- model/search-item.h | 4 +- res/icons/desktop.png | Bin 512 -> 998 bytes res/translations/bo.ts | 73 ++++++++++++- res/translations/tr.ts | 73 ++++++++++++- res/translations/zh_CN.ts | 75 ++++++++++++- src/content-widget.cpp | 33 +++--- src/content-widget.h | 9 +- src/mainwindow.cpp | 28 ++++- src/mainwindow.h | 1 + 19 files changed, 813 insertions(+), 54 deletions(-) create mode 100644 control/option-view.cpp create mode 100644 control/option-view.h create mode 100644 control/search-detail-view.cpp create mode 100644 control/search-detail-view.h diff --git a/control/control.pri b/control/control.pri index a13c212..016e0c7 100644 --- a/control/control.pri +++ b/control/control.pri @@ -2,6 +2,10 @@ INCLUDEPATH += $$PWD HEADERS += \ $$PWD/search-list-view.h \ + $$PWD/search-detail-view.h \ + $$PWD/option-view.h \ SOURCES += \ $$PWD/search-list-view.cpp \ + $$PWD/search-detail-view.cpp \ + $$PWD/option-view.cpp \ diff --git a/control/option-view.cpp b/control/option-view.cpp new file mode 100644 index 0000000..3c4fb4d --- /dev/null +++ b/control/option-view.cpp @@ -0,0 +1,185 @@ +#include "option-view.h" +#include +#include + +OptionView::OptionView(QWidget *parent, const int& type) : QWidget(parent) +{ + m_mainLyt = new QVBoxLayout(this); + this->setLayout(m_mainLyt); + m_mainLyt->setContentsMargins(0,8,0,0); + m_mainLyt->setSpacing(8); + initComponent(type); +} + +OptionView::~OptionView() +{ + if (m_openLabel) { + delete m_openLabel; + m_openLabel = NULL; + } + if (m_shortcutLabel) { + delete m_shortcutLabel; + m_shortcutLabel = NULL; + } + if (m_panelLabel) { + delete m_panelLabel; + m_panelLabel = NULL; + } + if (m_openPathLabel) { + delete m_openPathLabel; + m_openPathLabel = NULL; + } + if (m_copyPathLabel) { + delete m_copyPathLabel; + m_copyPathLabel = NULL; + } +} + +/** + * @brief OptionView::initComponent 构建可用选项表 + * @param type 详情页类型 + */ +void OptionView::initComponent(const int& type) { + switch (type) { + case SearchListView::ResType::App : { + setupAppOptions(); + break; + } + case SearchListView::ResType::File : { + setupFileOptions(); + break; + } + case SearchListView::ResType::Setting : { + setupSettingOptions(); + break; + } + case SearchListView::ResType::Dir : { + setupDirOptions(); + break; + } + default: + break; + } +} + +/** + * @brief setupOptionLabel 创建每一个单独的选项 + * @param opt 选项类型 + */ +void OptionView::setupOptionLabel(const int& opt) { + QFrame * optionFrame = new QFrame(this); + QHBoxLayout * optionLyt = new QHBoxLayout(optionFrame); + optionLyt->setContentsMargins(8, 0, 0, 0); + switch (opt) { + case Options::Open: { + m_openLabel = new QLabel(optionFrame); + m_openLabel->setText(tr("Open")); //打开 + m_openLabel->setStyleSheet("QLabel{font-size: 14px; color: #3D6BE5}"); + m_openLabel->setCursor(QCursor(Qt::PointingHandCursor)); + m_openLabel->installEventFilter(this); + optionLyt->addWidget(m_openLabel); + break; + } + case Options::Shortcut: { + m_shortcutLabel = new QLabel(optionFrame); + m_shortcutLabel->setText(tr("Add Shortcut to Desktop")); //添加到桌面快捷方式 + m_shortcutLabel->setStyleSheet("QLabel{font-size: 14px; color: #3D6BE5}"); + m_shortcutLabel->setCursor(QCursor(Qt::PointingHandCursor)); + m_shortcutLabel->installEventFilter(this); + optionLyt->addWidget(m_shortcutLabel); + break; + } + case Options::Panel: { + m_panelLabel = new QLabel(optionFrame); + m_panelLabel->setText(tr("Add Shortcut to Panel")); //添加到任务栏快捷方式 + m_panelLabel->setStyleSheet("QLabel{font-size: 14px; color: #3D6BE5}"); + m_panelLabel->setCursor(QCursor(Qt::PointingHandCursor)); + m_panelLabel->installEventFilter(this); + optionLyt->addWidget(m_panelLabel); + break; + } + case Options::OpenPath: { + m_openPathLabel = new QLabel(optionFrame); + m_openPathLabel->setText(tr("Open path")); //打开所在路径 + m_openPathLabel->setStyleSheet("QLabel{font-size: 14px; color: #3D6BE5}"); + m_openPathLabel->setCursor(QCursor(Qt::PointingHandCursor)); + m_openPathLabel->installEventFilter(this); + optionLyt->addWidget(m_openPathLabel); + break; + } + case Options::CopyPath: { + m_copyPathLabel = new QLabel(optionFrame); + m_copyPathLabel->setText(tr("Copy path")); //复制所在路径 + m_copyPathLabel->setStyleSheet("QLabel{font-size: 14px; color: #3D6BE5}"); + m_copyPathLabel->setCursor(QCursor(Qt::PointingHandCursor)); + m_copyPathLabel->installEventFilter(this); + optionLyt->addWidget(m_copyPathLabel); + break; + } + default: + break; + } + optionLyt->addStretch(); + optionFrame->setLayout(optionLyt); + m_mainLyt->addWidget(optionFrame); +} + +/** + * @brief OptionView::setupAppOptions 为应用类型的详情页构建选项表 + */ +void OptionView::setupAppOptions() { + setupOptionLabel(Options::Open); + setupOptionLabel(Options::Shortcut); + setupOptionLabel(Options::Panel); +} + +/** + * @brief OptionView::setupFileOptions 为文件类型的详情页构建选项表 + */ +void OptionView::setupFileOptions() { + setupOptionLabel(Options::Open); + setupOptionLabel(Options::OpenPath); + setupOptionLabel(Options::CopyPath); +} + +/** + * @brief OptionView::setupDirOptions 为文件夹类型的详情页构建选项表 + */ +void OptionView::setupDirOptions() { + setupOptionLabel(Options::Open); + setupOptionLabel(Options::OpenPath); + setupOptionLabel(Options::CopyPath); +} + +/** + * @brief OptionView::setupSettingOptions 为设置类型的详情页构建选项表 + */ +void OptionView::setupSettingOptions() { + setupOptionLabel(Options::Open); +} + +/** + * @brief OptionView::eventFilter 相应鼠标点击事件并发出信号供detailview处理 + * @param watched + * @param event + * @return + */ +bool OptionView::eventFilter(QObject *watched, QEvent *event){ + if (m_openLabel && watched == m_openLabel && event->type() == QEvent::MouseButtonPress){ + Q_EMIT onOptionClicked(Options::Open); + return true; + } else if (m_shortcutLabel && watched == m_shortcutLabel && event->type() == QEvent::MouseButtonPress) { + Q_EMIT onOptionClicked(Options::Shortcut); + return true; + } else if (m_panelLabel && watched == m_panelLabel && event->type() == QEvent::MouseButtonPress) { + Q_EMIT onOptionClicked(Options::Panel); + return true; + } else if (m_openPathLabel && watched == m_openPathLabel && event->type() == QEvent::MouseButtonPress) { + Q_EMIT onOptionClicked(Options::OpenPath); + return true; + } else if (m_copyPathLabel && watched == m_copyPathLabel && event->type() == QEvent::MouseButtonPress) { + Q_EMIT onOptionClicked(Options::CopyPath); + return true; + } + return QObject::eventFilter(watched, event); +} diff --git a/control/option-view.h b/control/option-view.h new file mode 100644 index 0000000..edbdb6c --- /dev/null +++ b/control/option-view.h @@ -0,0 +1,50 @@ +#ifndef OPTIONVIEW_H +#define OPTIONVIEW_H + +#include +#include +#include +#include +#include +#include "search-list-view.h" + +class OptionView : public QWidget +{ + Q_OBJECT +public: + explicit OptionView(QWidget *, const int&); + ~OptionView(); + + enum Options { + Open, + Shortcut, + Panel, + OpenPath, + CopyPath + }; + +protected: + bool eventFilter(QObject *, QEvent *); + +private: + void initComponent(const int&); + void setupAppOptions(); + void setupFileOptions(); + void setupDirOptions(); + void setupSettingOptions(); + void setupOptionLabel(const int&); + + int m_type; + + QVBoxLayout * m_mainLyt = nullptr; + QLabel * m_openLabel = nullptr; + QLabel * m_shortcutLabel = nullptr; + QLabel * m_panelLabel = nullptr; + QLabel * m_openPathLabel = nullptr; + QLabel * m_copyPathLabel = nullptr; + +Q_SIGNALS: + void onOptionClicked(const int&); +}; + +#endif // OPTIONVIEW_H diff --git a/control/search-detail-view.cpp b/control/search-detail-view.cpp new file mode 100644 index 0000000..68d3d9a --- /dev/null +++ b/control/search-detail-view.cpp @@ -0,0 +1,176 @@ +#include "search-detail-view.h" +#include +#include +#include + +SearchDetailView::SearchDetailView(QWidget *parent) : QWidget(parent) +{ + m_layout = new QVBoxLayout(this); + this->setLayout(m_layout); + m_layout->setContentsMargins(16, 60, 16, 24); + this->setObjectName("detailView"); + this->setStyleSheet("QWidget#detailView{background:transparent;}"); +} + +SearchDetailView::~SearchDetailView() +{ + if (m_layout) { + clearLayout(); + delete m_layout; + m_layout = NULL; + } +} + +/** + * @brief SearchDetailView::clearLayout 清空布局 + */ +void SearchDetailView::clearLayout() { + QLayoutItem * child; + while ((child = m_layout->takeAt(0)) != 0) { + if(child->widget()) + { + child->widget()->setParent(NULL); //防止删除后窗口看上去没有消失 + } + delete child; + } + child = NULL; +} + +/** + * @brief SearchDetailView::setupWidget 构建右侧搜索结果详情区域 + * @param type 搜索类型 + * @param path 结果路径 + */ +void SearchDetailView::setupWidget(const int& type, const QString& path) { + clearLayout(); + + //图标和名称、分割线区域 + QLabel * iconLabel = new QLabel(this); + iconLabel->setAlignment(Qt::AlignCenter); + iconLabel->setFixedHeight(120); + + QFrame * nameFrame = new QFrame(this); + QHBoxLayout * nameLayout = new QHBoxLayout(nameFrame); + QLabel * nameLabel = new QLabel(nameFrame); + QLabel * typeLabel = new QLabel(nameFrame); + nameLabel->setStyleSheet("QLabel{font-size: 18px;}"); + typeLabel->setStyleSheet("QLabel{font-size: 14px; color: rgba(0, 0, 0, 0.43);}"); + nameFrame->setFixedHeight(48); + nameLabel->setMaximumWidth(240); + nameLayout->addWidget(nameLabel); + nameLayout->addStretch(); + nameLayout->addWidget(typeLabel); + nameFrame->setLayout(nameLayout); + + QFrame * hLine = new QFrame(this); + hLine->setLineWidth(0); + hLine->setFixedHeight(1); + hLine->setStyleSheet("QFrame{background: rgba(0,0,0,0.2);}"); + + OptionView * optionView = new OptionView(this, type); + connect(optionView, &OptionView::onOptionClicked, this, [ = ](const int& option) { + execActions(type, option, path); + }); + + m_layout->addWidget(iconLabel); + m_layout->addWidget(nameFrame); + m_layout->addWidget(hLine); + m_layout->addWidget(optionView); + m_layout->addStretch(); + + //根据不同类型的搜索结果切换加载图片和名称的方式 + switch (type) { + case SearchListView::ResType::App : { + QIcon icon = FileUtils::getAppIcon(path); + iconLabel->setPixmap(icon.pixmap(icon.actualSize(QSize(96, 96)))); + nameLabel->setText(FileUtils::getAppName(path)); + typeLabel->setText(tr("Application")); + break; + } + case SearchListView::ResType::File : { + QIcon icon = FileUtils::getFileIcon(QString("file://%1").arg(path)); + iconLabel->setPixmap(icon.pixmap(icon.actualSize(QSize(100, 100)))); + nameLabel->setText(FileUtils::getFileName(path)); + typeLabel->setText(tr("Document")); + break; + } + case SearchListView::ResType::Setting : { + QIcon icon = FileUtils::getSettingIcon(path, true); + iconLabel->setPixmap(icon.pixmap(icon.actualSize(QSize(100, 100)))); + QString settingType = path.mid(path.indexOf("/") + 1, path.lastIndexOf("/") - path.indexOf("/") - 1); //配置项所属控制面板插件名 + nameLabel->setText(settingType); + typeLabel->setText(FileUtils::getSettingName(path)); + break; + } + case SearchListView::ResType::Dir : + break; + default: + break; + } +} + +/** + * @brief SearchDetailView::execActions 根据点击的选项执行指定动作 + * @param type 选中的类型 + */ +void SearchDetailView::execActions(const int& type, const int& option, const QString& path) { + switch (option) { + case OptionView::Options::Open: { + openAction(type, path); + break; + } + case OptionView::Options::Shortcut: { + addDesktopShortcut(path); + break; + } + case OptionView::Options::Panel: { + addPanelShortcut(path); + break; + } + case OptionView::Options::OpenPath: { + openPathAction(path); + break; + } + case OptionView::Options::CopyPath: { + copyPathAction(path); + break; + } + default: + break; + } +} + +/** + * @brief SearchDetailView::openAction 执行“打开”动作 + * @return + */ +bool SearchDetailView::openAction(const int&, const QString&) { +} + +/** + * @brief SearchDetailView::addDesktopShortcut 添加到桌面快捷方式 + * @return + */ +bool SearchDetailView::addDesktopShortcut(const QString&) { +} + +/** + * @brief SearchDetailView::addPanelShortcut 添加到任务栏 + * @return + */ +bool SearchDetailView::addPanelShortcut(const QString&) { +} + +/** + * @brief SearchDetailView::openPathAction 打开文件所在路径 + * @return + */ +bool SearchDetailView::openPathAction(const QString&) { +} + +/** + * @brief SearchDetailView::copyPathAction 复制文件所在路径 + * @return + */ +bool SearchDetailView::copyPathAction(const QString&) { +} diff --git a/control/search-detail-view.h b/control/search-detail-view.h new file mode 100644 index 0000000..8a10d70 --- /dev/null +++ b/control/search-detail-view.h @@ -0,0 +1,31 @@ +#ifndef SEARCHDETAILVIEW_H +#define SEARCHDETAILVIEW_H + +#include +#include "option-view.h" + +class SearchDetailView : public QWidget +{ + Q_OBJECT +public: + explicit SearchDetailView(QWidget *parent = nullptr); + ~SearchDetailView(); + + void setupWidget(const int&, const QString&); + +private: + QVBoxLayout * m_layout = nullptr; + + void clearLayout(); + bool openAction(const int&, const QString&); + bool addDesktopShortcut(const QString&); + bool addPanelShortcut(const QString&); + bool openPathAction(const QString&); + bool copyPathAction(const QString&); +Q_SIGNALS: + +private Q_SLOTS: + void execActions(const int&, const int&, const QString&); +}; + +#endif // SEARCHDETAILVIEW_H diff --git a/control/search-list-view.cpp b/control/search-list-view.cpp index 1d5e560..b48aa52 100644 --- a/control/search-list-view.cpp +++ b/control/search-list-view.cpp @@ -1,8 +1,11 @@ #include "search-list-view.h" #include +#include -SearchListView::SearchListView(QWidget * parent, const QStringList& list, int type) : QTreeView(parent) +SearchListView::SearchListView(QWidget * parent, const QStringList& list, const int& type) : QTreeView(parent) { + setSelectionBehavior(QAbstractItemView::SelectRows); + setSelectionMode(QAbstractItemView::SingleSelection); m_model = new SearchItemModel; m_item = new SearchItem; m_item->setSearchList(type, list); @@ -15,6 +18,11 @@ SearchListView::SearchListView(QWidget * parent, const QStringList& list, int ty this->setAttribute(Qt::WA_TranslucentBackground, true); this->setAutoFillBackground(false); this->setStyleSheet("QWidget{background:transparent;}"); + + m_type = type; + connect(this->selectionModel(), &QItemSelectionModel::selectionChanged, this, [ = ]() { + Q_EMIT this->currentRowChanged(getCurrentType(), m_item->m_pathlist.at(this->currentIndex().row())); + }); } SearchListView::~SearchListView() @@ -28,3 +36,52 @@ SearchListView::~SearchListView() m_item = NULL; } } + +//获取当前选项所属搜索类型 +int SearchListView::getCurrentType() { + switch (m_type) { + case SearchItem::SearchType::Apps : +// qDebug()<<"qDebug: One row selected, its type is application."; + return ResType::App; + case SearchItem::SearchType::Files: +// qDebug()<<"qDebug: One row selected, its type is file."; + return ResType::File; + case SearchItem::SearchType::Settings: +// qDebug()<<"qDebug: One row selected, its type is setting."; + return ResType::Setting; + case SearchItem::SearchType::Dirs: +// qDebug()<<"qDebug: One row selected, its type is dir."; + return ResType::Dir; + default: //All或者Best的情况,需要自己判断文件类型 + return getResType(m_item->m_pathlist.at(this->currentIndex().row())); + break; + } +} + +/** + * @brief SearchListView::getResType 根据路径返回文件类型 + * @param path 路径 + * @return + */ +int SearchListView::getResType(const QString& path) { + if (path.endsWith(".desktop")) { +// qDebug()<<"qDebug: One row selected, its path is "<selectionModel()->clearSelection(); +} diff --git a/control/search-list-view.h b/control/search-list-view.h index dd352a7..43e44f5 100644 --- a/control/search-list-view.h +++ b/control/search-list-view.h @@ -10,12 +10,30 @@ class SearchListView : public QTreeView { Q_OBJECT public: - explicit SearchListView(QWidget *, const QStringList&, int); + explicit SearchListView(QWidget *, const QStringList&, const int&); ~SearchListView(); + enum ResType { //搜索结果可能出现的类型:应用、文件、设置、文件夹 + App, + File, + Setting, + Dir + }; + + int getCurrentType(); + int getResType(const QString&); + private: SearchItemModel * m_model = nullptr; SearchItem * m_item = nullptr; + + int m_type; + +Q_SIGNALS: + void currentRowChanged(const int&, const QString&); + +public Q_SLOTS: + void clearSelection(); }; #endif // SEARCHLISTVIEW_H diff --git a/file-utils.cpp b/file-utils.cpp index 4c77373..d358b44 100644 --- a/file-utils.cpp +++ b/file-utils.cpp @@ -27,7 +27,7 @@ QIcon FileUtils::getFileIcon(const QString &uri, bool checkValid) nullptr, nullptr)); if (!G_IS_FILE_INFO (info.get()->get())) - return QIcon(""); + return QIcon::fromTheme("unknown"); GIcon *g_icon = g_file_info_get_icon (info.get()->get()); QString icon_name; //do not unref the GIcon from info. @@ -50,6 +50,9 @@ QIcon FileUtils::getFileIcon(const QString &uri, bool checkValid) } } } + if (QIcon::fromTheme(icon_name).isNull()) { + return QIcon::fromTheme("unknown"); + } return QIcon::fromTheme(icon_name); } @@ -65,7 +68,7 @@ QIcon FileUtils::getAppIcon(const QString &path) { keyfile = g_key_file_new(); if (!g_key_file_load_from_file(keyfile, ba.data(), G_KEY_FILE_NONE, NULL)){ g_key_file_free (keyfile); - return QIcon(""); + return QIcon::fromTheme("unknown"); } QString icon = QString(g_key_file_get_locale_string(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, NULL, NULL)); g_key_file_free(keyfile); @@ -78,16 +81,26 @@ QIcon FileUtils::getAppIcon(const QString &path) { /** * @brief FileUtils::getSettingIcon 获取设置图标 * @param setting 设置项传入参数,格式为 About/About->Properties + * @param is_white 选择是否返回白色图标 * @return */ -QIcon FileUtils::getSettingIcon(const QString& setting) { +QIcon FileUtils::getSettingIcon(const QString& setting, const bool& is_white) { QString name = setting.left(setting.indexOf("/")); - QString path = QString("/usr/share/ukui-control-center/shell/res/secondaryleftmenu/%1.svg").arg(name); + QString path; + if (is_white) { + path = QString("/usr/share/ukui-control-center/shell/res/secondaryleftmenu/%1White.svg").arg(name); + } else { + path = QString("/usr/share/ukui-control-center/shell/res/secondaryleftmenu/%1.svg").arg(name); + } QFile file(path); if (file.exists()) { return QIcon(path); } else { - return QIcon(QString("/usr/share/ukui-control-center/shell/res/secondaryleftmenu/%1.svg").arg("About")); + if (is_white) { + return QIcon(QString("/usr/share/ukui-control-center/shell/res/secondaryleftmenu/%1White.svg").arg("About")); + } else { + return QIcon(QString("/usr/share/ukui-control-center/shell/res/secondaryleftmenu/%1.svg").arg("About")); + } } } @@ -98,6 +111,9 @@ QIcon FileUtils::getSettingIcon(const QString& setting) { */ QString FileUtils::getFileName(const QString& uri) { QUrl url = uri; + if (url.fileName().isEmpty()) { + return "Unknown File"; + } return url.fileName(); } @@ -126,5 +142,5 @@ QString FileUtils::getAppName(const QString& path) { * @return */ QString FileUtils::getSettingName(const QString& setting) { - return setting.right(setting.length() - setting.indexOf("/") - 1); + return setting.right(setting.length() - setting.lastIndexOf("/") - 1); } diff --git a/file-utils.h b/file-utils.h index e3b2929..1d1275b 100644 --- a/file-utils.h +++ b/file-utils.h @@ -12,7 +12,7 @@ public: static QIcon getFileIcon(const QString &, bool checkValid = true); static QIcon getAppIcon(const QString &); - static QIcon getSettingIcon(const QString &); + static QIcon getSettingIcon(const QString &, const bool&); static QString getFileName(const QString &); static QString getAppName(const QString &); diff --git a/model/search-item.cpp b/model/search-item.cpp index 3efa8e9..d16979a 100644 --- a/model/search-item.cpp +++ b/model/search-item.cpp @@ -7,10 +7,6 @@ SearchItem::SearchItem(QObject *parent) : QObject(parent) SearchItem::~SearchItem() { - if (m_util) { - delete m_util; - m_util = NULL; - } } /** @@ -23,11 +19,11 @@ QIcon SearchItem::getIcon(int index) { return QIcon(""); switch (m_searchtype) { case Settings : //设置项,返回控制面板对应插件的图标 - return m_util->getSettingIcon(m_pathlist.at(index)); + return FileUtils::getSettingIcon(m_pathlist.at(index), false); case Files : //文件,返回文件图标 - return m_util->getFileIcon(QString("file://%1").arg(m_pathlist.at(index))); + return FileUtils::getFileIcon(QString("file://%1").arg(m_pathlist.at(index))); case Apps : //应用,返回应用图标 - return m_util->getAppIcon(m_pathlist.at(index)); + return FileUtils::getAppIcon(m_pathlist.at(index)); case Best : //最佳匹配,含全部类型,需要自己判断,返回不同类型的图标 return QIcon(":/res/icons/edit-find-symbolic.svg"); default: @@ -45,11 +41,11 @@ QString SearchItem::getName(int index) { return 0; switch (m_searchtype) { case Settings : //设置项,返回功能点名 - return m_util->getSettingName(m_pathlist.at(index)); + return FileUtils::getSettingName(m_pathlist.at(index)); case Files : //文件,返回文件名 - return m_util->getFileName(m_pathlist.at(index)); + return FileUtils::getFileName(m_pathlist.at(index)); case Apps : //应用,返回应用名 - return m_util->getAppName(m_pathlist.at(index)); + return FileUtils::getAppName(m_pathlist.at(index)); case Best : //最佳匹配,含全部类型,需要自己判断,返回不同类型的名称 return m_pathlist.at(index); default: diff --git a/model/search-item.h b/model/search-item.h index 2ef4018..e668835 100644 --- a/model/search-item.h +++ b/model/search-item.h @@ -9,6 +9,7 @@ class SearchItem : public QObject { friend class SearchItemModel; + friend class SearchListView; Q_OBJECT public: explicit SearchItem(QObject *parent = nullptr); @@ -19,6 +20,7 @@ public: Apps, Settings, Files, + Dirs, Best }; @@ -34,8 +36,6 @@ private: QIcon getIcon(int); QString getName(int); - FileUtils * m_util = nullptr; - Q_SIGNALS: }; diff --git a/res/icons/desktop.png b/res/icons/desktop.png index 20bed1c0ff191e4dc927df88ea65552ac344fea1..92c38eea599766ac785310ae4413cb8fee9875c2 100644 GIT binary patch literal 998 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GGLLkg|>2BR01_tIC zo-U3d6?5LsJ(zttK<0S-?X#hd+ZHKYd}t;+kA;0+n=^YHtG`m*5_SDUU+fG1u{(cw zv~pfb#m#qIO3ktAC-@cxrQSH5AZA;V6Z<4Q>P6B$?``{@%>GtuFQAcl^3r?t_kZK! zCh0!^y-&&F(-}E#)`o=)1|ke?Oa}rOB)Axy851-Zc(4hc3AnQUf7snwx9vY@|32I7 zy>ER{vs?#nk>yi<(NFi=KkfYV^yEj=%X+=rRrZH%fA{{K>3xGAj}?{N+PL|bsUM$S zYJGugg7N;1*Z-XOQ0=TD(#~yOs_S^0)pPsh^$+*2S<|+zK4#zSU+2BsCM^xhvdWRp z6`W>gfA6|#;EYXIxDu`>^9N6pX=?(z*3Fvd@1Lja^CP#MxT-C@u(UxJ;5;-Bsur+NsI0^HhUJ#yKA@F&SuvNHSfcJ3r=i2xu;>N z_46xhR|c;=e|?YO){O>B)AlI+*^x6blkw^6#jj5GURqdsb?)A4Mj9z$4Rf9reJc;n zms#=YcGMfI3;ZcT4I;5Gzq@z0^ZOsVzrr-(_*9meGOV6Igp=F5-+umnJ1h0G|C`zZ zqjxh(#P9O0o?Ur^Rk+r+P-xGYs~n%#*ByJceX`CjKi^}ehojGe3({XV?G9C#G)jb248i zc2}X(*L8-PExnT6Wg+ynEY0{W&sK^5y`r9Se9i}9HfS((2ECGB YT~xKkc%{1yFyk_Ky85}Sb4q9e07G%Q?EnA( delta 501 zcmV`2iBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^pPPKe*v;d zL_t(oh3%KkO2a@Dg>U93tu2DnoeL2Oxbg{nh(hs2T)0puu0&n9b?*xZ+GlYk6e%uT zW@E9MzcQ0fnoKfHQqr_g50q)>WWICHoe8NC1Ocp5Xsz_EH}G$Oi^MNJKELiJzs`l{ z2Sk6%^1{e)n+^JKbg+LV7m1D`e}|8M{w`NkXhQ8B^In>WTEHu>67u-;nmMX0k-*#g zXb%AFDh=f6nHKZ5-Eph~v~RAselquvKbHS!}?+`xH_1|n8u rfHC$00KF9_!PoB1SVCL=?-&548@bhm^___W00000NkvXXu0mjfpgGs# diff --git a/res/translations/bo.ts b/res/translations/bo.ts index a99558d..470253a 100644 --- a/res/translations/bo.ts +++ b/res/translations/bo.ts @@ -1,20 +1,89 @@ + + ContentWidget + + + Apps + + + + + Settings + + + + + Files + + + + + Best Matches + + + + + Unknown + + + MainWindow - + Search + + OptionView + + + Open + + + + + Add Shortcut to Desktop + + + + + Add Shortcut to Panel + + + + + Open path + + + + + Copy path + + + QObject - + ukui-search is already running! + + SearchDetailView + + + Application + + + + + Document + + + diff --git a/res/translations/tr.ts b/res/translations/tr.ts index a99558d..470253a 100644 --- a/res/translations/tr.ts +++ b/res/translations/tr.ts @@ -1,20 +1,89 @@ + + ContentWidget + + + Apps + + + + + Settings + + + + + Files + + + + + Best Matches + + + + + Unknown + + + MainWindow - + Search + + OptionView + + + Open + + + + + Add Shortcut to Desktop + + + + + Add Shortcut to Panel + + + + + Open path + + + + + Copy path + + + QObject - + ukui-search is already running! + + SearchDetailView + + + Application + + + + + Document + + + diff --git a/res/translations/zh_CN.ts b/res/translations/zh_CN.ts index f284b47..ec68e13 100644 --- a/res/translations/zh_CN.ts +++ b/res/translations/zh_CN.ts @@ -1,20 +1,89 @@ - + + + ContentWidget + + + Apps + 应用 + + + + Settings + 配置项 + + + + Files + 文件 + + + + Best Matches + 最佳匹配 + + + + Unknown + 未知 + + MainWindow - + Search 搜索 + + OptionView + + + Open + 打开 + + + + Add Shortcut to Desktop + 添加到桌面快捷方式 + + + + Add Shortcut to Panel + 添加到任务栏快捷方式 + + + + Open path + 打开文件所在路径 + + + + Copy path + 复制文件路径 + + QObject - + ukui-search is already running! + + SearchDetailView + + + Application + 应用 + + + + Document + 文件 + + diff --git a/src/content-widget.cpp b/src/content-widget.cpp index 1277af2..d3d2579 100644 --- a/src/content-widget.cpp +++ b/src/content-widget.cpp @@ -5,21 +5,6 @@ ContentWidget::ContentWidget(QWidget * parent):QStackedWidget(parent) { initUI(); - QVector types; - QVector lists; - QStringList list; - list<<"/usr/share/applications/code.desktop"<<"/usr/share/applications/fcitx.desktop"<<"/usr/share/applications/peony.desktop"<<"/usr/share/applications/info.desktop"<<"/usr/share/applications/yelp.desktop"; - QStringList list2; - list2<<"/home/zjp/下载/搜索结果.png"<<"/home/zjp/下载/显示不全.mp4"<<"/home/zjp/下载/u=1747586012,2959413014&fm=26&gp=0.jpg"<<"/home/zjp/下载/dmesg.log"<<"/home/zjp/下载/WiFi_AP选择.docx"; - QStringList list3; - list3<<"About/设置->功能点"<<"Area/设置->功能点"<<"Datetime/设置->功能点"<<"Theme/设置->功能点"<<"233/设置->功能点"; - types.append(SearchItem::SearchType::Apps); - types.append(SearchItem::SearchType::Files); - types.append(SearchItem::SearchType::Settings); - lists.append(list); - lists.append(list2); - lists.append(list3); - refreshSearchList(types, lists); } ContentWidget::~ContentWidget() @@ -35,8 +20,7 @@ ContentWidget::~ContentWidget() } /** - * @brief initUI - * 初始化homepage和resultpage + * @brief initUI 初始化homepage和resultpage */ void ContentWidget::initUI() { m_homePage = new QWidget; @@ -69,9 +53,12 @@ void ContentWidget::initUI() { m_listLyt->setSpacing(0); m_resultListArea->setWidget(m_resultList); m_resultListArea->setWidgetResizable(true); + m_detailView = new SearchDetailView(m_resultDetailArea); + m_resultDetailArea->setWidget(m_detailView); + m_resultDetailArea->setWidgetResizable(true); m_homePage->setStyleSheet("QWidget{background:pink;}"); m_resultListArea->setStyleSheet("QScrollArea{background:transparent;}"); - m_resultDetailArea->setStyleSheet("QScrollArea{background:yellow;}"); + m_resultDetailArea->setStyleSheet("QScrollArea{background: rgba(0,0,0,0.05); border-radius: 4px;}"); this->addWidget(m_homePage); this->addWidget(m_resultPage); @@ -107,11 +94,19 @@ void ContentWidget::refreshSearchList(const QVector& types, const QVectorsetContentsMargins(8, 0, 0, 0); - titleLabel->setStyleSheet("QLabel{background: rgba(0,0,0,0.1)}"); + titleLabel->setStyleSheet("QLabel{background: rgba(0,0,0,0.1);}"); titleLabel->setText(getTitleName(types.at(i))); m_listLyt->addWidget(titleLabel); m_listLyt->addWidget(searchList); m_resultList->setFixedHeight(m_resultList->height() + searchList->height() + titleLabel->height()); + + if (i == 0) { + searchList->setCurrentIndex(searchList->model()->index(0,1, QModelIndex())); + m_detailView->setupWidget(searchList->getCurrentType(), lists.at(0).at(0)); + } + connect(searchList, &SearchListView::currentRowChanged, this, [ = ](const int& type, const QString& path) { + m_detailView->setupWidget(type, path); + }); } } diff --git a/src/content-widget.h b/src/content-widget.h index 91c3311..90a8abd 100644 --- a/src/content-widget.h +++ b/src/content-widget.h @@ -2,12 +2,9 @@ #define CONTENTWIDGET_H #include -#include #include -#include -#include #include -#include "control/search-list-view.h" +#include "control/search-detail-view.h" class ContentWidget : public QStackedWidget { @@ -18,6 +15,7 @@ public: void setPageType(const int&); int currentType(); + void refreshSearchList(const QVector&, const QVector&); private: void initUI(); QWidget * m_homePage = nullptr; @@ -31,12 +29,13 @@ private: QWidget * m_resultDetail = nullptr; QVBoxLayout * m_detailLyt = nullptr; + SearchDetailView * m_detailView = nullptr; + int m_currentType = 0; QString getTitleName(const int&); private Q_SLOTS: - void refreshSearchList(const QVector&, const QVector&); void clearSearchList(); }; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 4bcd6c0..6be9970 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -167,7 +167,7 @@ bool MainWindow::event ( QEvent * event ) switch (event->type()){ case QEvent::ActivationChange: if(QApplication::activeWindow() != this){ - this->hide(); + this->close(); } break; } @@ -203,7 +203,31 @@ void MainWindow::primaryScreenChangedSlot(QScreen *screen) * @param searchcontent */ void MainWindow::searchContent(QString searchcontent){ - Q_UNUSED(searchcontent); + QVector types; + QVector lists; + + //测试用数据 + QStringList list; + list<<"/usr/share/applications/peony.desktop"<<"/usr/share/applications/fcitx.desktop"<<"/usr/share/applications/info.desktop"; + QStringList list2; + list2<<"/home/zjp/下载/搜索结果.png"<<"/home/zjp/下载/显示不全.mp4"<<"/home/zjp/下载/dmesg.log"<<"/home/zjp/下载/WiFi_AP选择.docx"; + QStringList list3; + list3<<"About/关于/计算机属性"<<"Area/语言和地区/货币单位"<<"Datetime/时间和日期/手动更改时间"<<"Theme/主题/图标主题"; + types.append(SearchItem::SearchType::Apps); + types.append(SearchItem::SearchType::Settings); + types.append(SearchItem::SearchType::Files); + + lists.append(list); + lists.append(list3); + lists.append(list2); + + //文件搜索 +// QStringList res = IndexGenerator::IndexSearch(searchcontent); +// types.append(SearchItem::SearchType::Files); +// lists.append(res); + + //将搜索结果加入列表 + m_contentFrame->refreshSearchList(types, lists); } //使用GSetting获取当前窗口应该使用的透明度 diff --git a/src/mainwindow.h b/src/mainwindow.h index cc9838b..6da0c53 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -39,6 +39,7 @@ #include #include "content-widget.h" #include "input-box.h" +#include "index/index-generator.h" class MainWindow : public QMainWindow {