diff --git a/src/content-widget.cpp b/src/content-widget.cpp index 295b42c..8972807 100644 --- a/src/content-widget.cpp +++ b/src/content-widget.cpp @@ -2,6 +2,7 @@ #include #include #include +#include "config-file.h" ContentWidget::ContentWidget(QWidget * parent):QStackedWidget(parent) { @@ -56,6 +57,10 @@ void ContentWidget::initUI() { m_resultListArea->setWidget(m_resultList); m_resultListArea->setWidgetResizable(true); m_detailView = new SearchDetailView(m_resultDetailArea); + connect(m_detailView, &SearchDetailView::configFileChanged, this, [ = ]() { + clearLayout(m_homePageLyt); + initHomePage(); + }); m_resultDetailArea->setWidget(m_detailView); m_resultDetailArea->setWidgetResizable(true); m_resultListArea->setStyleSheet("QScrollArea{background:transparent;}"); @@ -70,13 +75,29 @@ void ContentWidget::initUI() { * @brief ContentWidget::initHomePage 向homepage填充内容 * @param lists 三个列表:常用,最近,快捷 */ -void ContentWidget::initHomePage(const QVector& lists) { +void ContentWidget::initHomePage() { + QVector lists; + QMap map = ConfigFile::readConfig(); + QStringList commonlyList; + commonlyList = map.value("Commonly"); + QStringList recentlyList; + recentlyList = map.value("Recently"); + QStringList quicklyList; + quicklyList<<"/usr/share/applications/peony.desktop"<<"/usr/share/applications/ukui-control-center.desktop"<<"Theme/主题/更改壁纸"; + lists.append(commonlyList); + lists.append(recentlyList); + lists.append(quicklyList); + for (int i = 0; i < lists.count(); i++) { + if (lists.at(i).isEmpty()) + continue; QWidget * listWidget = new QWidget(m_homePage); QVBoxLayout * itemWidgetLyt = new QVBoxLayout(listWidget); QLabel * titleLabel = new QLabel(listWidget); QWidget * itemWidget = new QWidget(listWidget); if (i == 1) { + if (lists.at(i).length() <= 2) itemWidget->setFixedHeight(48); + else itemWidget->setFixedHeight(112); titleLabel->setText(tr("Recently Opened")); QGridLayout * layout = new QGridLayout(itemWidget); layout->setSpacing(8); @@ -87,6 +108,7 @@ void ContentWidget::initHomePage(const QVector& lists) { layout->addWidget(item, j / 2, j % 2); } } else { + itemWidget->setFixedHeight(136); QHBoxLayout * layout = new QHBoxLayout(itemWidget); layout->setSpacing(8); layout->setContentsMargins(0, 0, 0, 0); @@ -95,12 +117,12 @@ void ContentWidget::initHomePage(const QVector& lists) { HomePageItem * item = new HomePageItem(itemWidget, i, path); layout->addWidget(item); } - if (i) { - titleLabel->setText(tr("Open Quickly")); + for (int j = 0; j < 4 - lists.at(i).length(); j++) { QWidget * emptyItem = new QWidget(itemWidget); - emptyItem->setFixedSize(136, 136); //占位用widget,若后续快捷打开有扩展项,可删除此widget + emptyItem->setFixedSize(136, 136); //占位用widget,少于4项会补全后方占位 layout->addWidget(emptyItem); } + if (i) titleLabel->setText(tr("Open Quickly")); else titleLabel->setText(tr("Commonly Used")); } itemWidgetLyt->setSpacing(6); @@ -109,13 +131,14 @@ void ContentWidget::initHomePage(const QVector& lists) { itemWidgetLyt->addWidget(itemWidget); m_homePageLyt->addWidget(listWidget); } + m_homePageLyt->addStretch(); } /** * @brief setPageType 预留的接口,为指定类别搜索调整界面内容 * @param type */ -void ContentWidget::setPage(const int& type){ +void ContentWidget::setPage(const int& type) { m_currentType = type; } @@ -135,7 +158,8 @@ int ContentWidget::currentPage() { */ void ContentWidget::refreshSearchList(const QVector& types, const QVector& lists, const QString& keyword) { if (!m_listLyt->isEmpty()) { - clearSearchList(); + clearLayout(m_listLyt); + m_resultList->setFixedHeight(0); } bool isEmpty = true; QStringList bestList; @@ -229,11 +253,13 @@ QString ContentWidget::getTitleName(const int& type) { } /** - * @brief ContentWidget::clearSearchList 清空搜索结果列表 + * @brief ContentWidget::clearLayout 清空搜索结果列表 + * @param layout 需要清空的布局 */ -void ContentWidget::clearSearchList() { +void ContentWidget::clearLayout(QLayout * layout) { + if (! layout) return; QLayoutItem * child; - while ((child = m_listLyt->takeAt(0)) != 0) { + while ((child = layout->takeAt(0)) != 0) { if(child->widget()) { child->widget()->setParent(NULL); //防止删除后窗口看上去没有消失 @@ -241,7 +267,6 @@ void ContentWidget::clearSearchList() { delete child; } child = NULL; - m_resultList->setFixedHeight(0); } diff --git a/src/content-widget.h b/src/content-widget.h index 327a05a..9ea84de 100644 --- a/src/content-widget.h +++ b/src/content-widget.h @@ -18,10 +18,11 @@ public: void setPage(const int&); int currentPage(); void refreshSearchList(const QVector&, const QVector&, const QString&); - void initHomePage(const QVector&); + void initHomePage(); void setContentList(const QStringList&); private: void initUI(); + void clearHomepage(); QStringList m_contentList; QWidget * m_homePage = nullptr; QVBoxLayout * m_homePageLyt = nullptr; @@ -44,7 +45,7 @@ Q_SIGNALS: void currentItemChanged(); private Q_SLOTS: - void clearSearchList(); + void clearLayout(QLayout *); }; #endif // CONTENTWIDGET_H diff --git a/src/control/config-file.cpp b/src/control/config-file.cpp index b1817a2..43bfe2d 100644 --- a/src/control/config-file.cpp +++ b/src/control/config-file.cpp @@ -1,19 +1,22 @@ #include "config-file.h" -void ConfigFile::writeCommonly(QString message){ - QSettings *m_qSettings=new QSettings(QDir::homePath()+"/.config/org.ukui/ukui-search/ukui-search.conf",QSettings::IniFormat); +bool ConfigFile::writeCommonly(QString message){ + QSettings *m_qSettings=new QSettings(QDir::homePath()+"/.config/org.ukui/ukui-search/ukui-search.conf",QSettings::IniFormat); QStringList messagelist=message.split("/"); QString appname=messagelist.last(); if(!appname.contains("desktop")) - return; + return false; m_qSettings->beginGroup("Commonly"); QStringList quickly=m_qSettings->allKeys(); - if(quickly.contains(message)){ + if(quickly.contains(message.mid(1, message.length()-1))){ m_qSettings->setValue(message,m_qSettings->value(message).toInt()+1); }else{ m_qSettings->setValue(message,1); } m_qSettings->endGroup(); + if(m_qSettings) + delete m_qSettings; + return true; } QStringList ConfigFile::readCommonly(){ @@ -28,7 +31,6 @@ QStringList ConfigFile::readCommonly(){ m_qSettings->endGroup(); QMap::iterator iter =quicklycount.begin(); QVector> vec; - QString iconamePah; while(iter !=quicklycount.end()) { vec.push_back(qMakePair(iter.key(), iter.value())); iter++; @@ -37,14 +39,14 @@ QStringList ConfigFile::readCommonly(){ return (l.second > r.second); }); for(int j=0;jbeginGroup("Recently"); @@ -54,11 +56,18 @@ void ConfigFile::writeRecently(QString message){ recently.removeOne(message); } recently.insert(0,message); + m_qSettings->beginGroup("Recently"); - m_qSettings->setValue("Recently",recently); + qWarning()<value("Recently").toStringList().length(); + if (m_qSettings->value("Recently").toStringList().length() >= 20) { + m_qSettings->setValue("Recently",QStringList(recently.mid(0, 20))); + } else { + m_qSettings->setValue("Recently",recently); + } m_qSettings->endGroup(); if(m_qSettings) delete m_qSettings; + return true; } QStringList ConfigFile::readRecently(){ @@ -69,12 +78,13 @@ QStringList ConfigFile::readRecently(){ m_qSettings->endGroup(); if(m_qSettings) delete m_qSettings; - return recently; + return recently.mid(0, 4); } -void ConfigFile::writeConfig(QString message){ - writeCommonly(message); - writeRecently(message); +bool ConfigFile::writeConfig(QString message){ + bool isWriteCommonlyDone = writeCommonly(message); + bool isWriteRecentlyDone = writeRecently(message); + return (isWriteCommonlyDone || isWriteRecentlyDone); } QMap ConfigFile::readConfig(){ diff --git a/src/control/config-file.h b/src/control/config-file.h index 9d1db24..9c6df8a 100644 --- a/src/control/config-file.h +++ b/src/control/config-file.h @@ -10,13 +10,13 @@ class ConfigFile : public QObject { Q_OBJECT public: - static void writeConfig(QString message); + static bool writeConfig(QString message); static QMap readConfig(); static void receiveMessage(QString message); private: - static void writeCommonly(QString message); + static bool writeCommonly(QString message); static QStringList readCommonly(); - static void writeRecently(QString message); + static bool writeRecently(QString message); static QStringList readRecently(); }; diff --git a/src/control/search-detail-view.cpp b/src/control/search-detail-view.cpp index 0b6b8a4..a7a3d07 100644 --- a/src/control/search-detail-view.cpp +++ b/src/control/search-detail-view.cpp @@ -13,6 +13,7 @@ #include #include #include +#include "config-file.h" SearchDetailView::SearchDetailView(QWidget *parent) : QWidget(parent) { @@ -75,6 +76,7 @@ QString SearchDetailView::getHtmlText(const QString & text, const QString & keyw htmlString.append(QString(text.at(i))); } } + htmlString.replace("\n", "
");//替换换行符 return htmlString; } @@ -241,6 +243,7 @@ bool SearchDetailView::openAction(const int& type, const QString& path) { GDesktopAppInfo * desktopAppInfo = g_desktop_app_info_new_from_filename(path.toLocal8Bit().data()); g_app_info_launch(G_APP_INFO(desktopAppInfo),nullptr, nullptr, nullptr); g_object_unref(desktopAppInfo); + writeConfigFile(path); return true; break; } @@ -252,6 +255,7 @@ bool SearchDetailView::openAction(const int& type, const QString& path) { connect(process, static_cast(&QProcess::finished), this, [ = ]() { process->deleteLater(); }); + writeConfigFile(path); return true; break; } @@ -262,6 +266,7 @@ bool SearchDetailView::openAction(const int& type, const QString& path) { connect(process, static_cast(&QProcess::finished), this, [ = ]() { process->deleteLater(); }); + writeConfigFile(path); return true; break; } @@ -270,6 +275,17 @@ bool SearchDetailView::openAction(const int& type, const QString& path) { } } +/** + * @brief SearchDetailView::writeConfigFile 将打开过的文件或应用或配置项记录下来并发出刷新Homepage的请求 + * @param path 待写入的文件路径 + * @return + */ +bool SearchDetailView::writeConfigFile(const QString& path) { + if (ConfigFile::writeConfig(path)) { + Q_EMIT this->configFileChanged(); + } +} + /** * @brief SearchDetailView::addDesktopShortcut 添加到桌面快捷方式 * @return diff --git a/src/control/search-detail-view.h b/src/control/search-detail-view.h index 3ecbe1b..b1b0c6b 100644 --- a/src/control/search-detail-view.h +++ b/src/control/search-detail-view.h @@ -25,8 +25,10 @@ private: bool openPathAction(const QString&); bool copyPathAction(const QString&); QString getHtmlText(const QString&, const QString&); -Q_SIGNALS: + bool writeConfigFile(const QString&); +Q_SIGNALS: + void configFileChanged(); private Q_SLOTS: void execActions(const int&, const int&, const QString&); }; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2c00bbb..65a3af9 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -181,22 +181,7 @@ void MainWindow::initUi() }); //初始化homepage - QVector lists; - - //测试用数据 - QStringList list; - list<<"/usr/share/applications/peony.desktop"<<"/usr/share/applications/ukui-control-center.desktop"<<"/usr/share/applications/ukui-clock.desktop"<<"/usr/share/applications/wps-office-pdf.desktop"; - QStringList list2; - list2<initHomePage(lists); + m_contentFrame->initHomePage(); } /**