From 05cb54e0acf151c966a574defdb48f1bad716d57 Mon Sep 17 00:00:00 2001 From: keke <243768648@qq.com> Date: Thu, 28 Jul 2022 22:55:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=9D=E6=8C=81=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appmanagercommon.h | 2 ++ appmanagerjob.cpp | 23 +++++++++++++++++++++++ appmanagerjob.h | 3 +++ appmanagermodel.cpp | 3 +++ appmanagermodel.h | 2 ++ appmanagerwidget.cpp | 34 ++++++++++++++++++++++++---------- appmanagerwidget.h | 3 +++ pkgmonitor.cpp | 2 +- 8 files changed, 61 insertions(+), 11 deletions(-) diff --git a/appmanagercommon.h b/appmanagercommon.h index 54a5fd8..c0dabc6 100644 --- a/appmanagercommon.h +++ b/appmanagercommon.h @@ -24,6 +24,7 @@ struct PkgInfo { QString depositoryUrl; // 仓库地址 QString pkgName; bool isInstalled; + bool isHoldVersion; // 是否保持版本 int installedSize; QString updatedTime; QString maintainer; @@ -41,6 +42,7 @@ struct PkgInfo { contentSize = 0; installedSize = 0; isInstalled = false; + isHoldVersion = false; pkgSize = 0; } }; diff --git a/appmanagerjob.cpp b/appmanagerjob.cpp index 3d8d42c..5a437b7 100644 --- a/appmanagerjob.cpp +++ b/appmanagerjob.cpp @@ -404,6 +404,27 @@ void AppManagerJob::installProcInfoPlugin() setRunningStatus(Normal); } +void AppManagerJob::holdPkgVersion(const QString &pkgName, bool hold) +{ + const QString &options = QString("echo %1 %2 | sudo dpkg --set-selections") + .arg(pkgName).arg(hold ? "hold" : "install"); + + QProcess proc; + proc.start("pkexec", {"sh", "-c", options}); + proc.waitForStarted(); + proc.waitForFinished(); + + QString err = proc.readAllStandardError(); + if (!err.isEmpty()) { + qInfo() << Q_FUNC_INFO << err; + proc.close(); + return; + } + + proc.close(); + onPkgUpdated(pkgName); +} + void AppManagerJob::onPkgInstalled(const QString &pkgName) { PkgInfo pkgInfo; @@ -578,6 +599,7 @@ bool AppManagerJob::getPkgInfoListFromFile(QList &pkgInfoList, const QS if (lineText.startsWith("Status: ")) { pkgInfo.isInstalled = lineText.contains("installed"); + pkgInfo.isHoldVersion = lineText.contains("hold"); continue; } @@ -682,6 +704,7 @@ bool AppManagerJob::getInstalledPkgInfo(PkgInfo &pkgInfo, const QString &pkgName if (lineText.startsWith("Status: ")) { pkgInfo.isInstalled = lineText.contains("installed"); + pkgInfo.isHoldVersion = lineText.contains("hold"); continue; } diff --git a/appmanagerjob.h b/appmanagerjob.h index c359de6..9ec949f 100644 --- a/appmanagerjob.h +++ b/appmanagerjob.h @@ -56,6 +56,9 @@ public Q_SLOTS: void installOhMyDDE(); void installProcInfoPlugin(); + // 保持软件包版本 + void holdPkgVersion(const QString &pkgName, bool hold); + private Q_SLOTS: // 包安装变动 void onPkgInstalled(const QString &pkgName); diff --git a/appmanagermodel.cpp b/appmanagermodel.cpp index 61430e7..37cb576 100644 --- a/appmanagermodel.cpp +++ b/appmanagermodel.cpp @@ -299,6 +299,9 @@ void AppManagerModel::initConnection() connect(m_appManagerJob, &AppManagerJob::appInstalled, this, &AppManagerModel::onAppInstalled); connect(m_appManagerJob, &AppManagerJob::appUpdated, this, &AppManagerModel::onAppUpdated); connect(m_appManagerJob, &AppManagerJob::appUninstalled, this, &AppManagerModel::onAppUninstalled); + + // 通知线程保持软件包版本 + connect(this, &AppManagerModel::notigyThreadHoldPkgVersion, m_appManagerJob, &AppManagerJob::holdPkgVersion); } void AppManagerModel::postInit() diff --git a/appmanagermodel.h b/appmanagermodel.h index a2b3f34..d2e0552 100644 --- a/appmanagermodel.h +++ b/appmanagermodel.h @@ -68,6 +68,8 @@ Q_SIGNALS: void appInstalled(const AM::AppInfo &appInfo); void appUpdated(const AM::AppInfo &appInfo); void appUninstalled(const AM::AppInfo &appInfo); + // 通知线程保持软件包版本 + void notigyThreadHoldPkgVersion(const QString &pkgName, bool hold); private Q_SLOTS: // 软件安装变动 diff --git a/appmanagerwidget.cpp b/appmanagerwidget.cpp index ee4a35a..b647ca3 100644 --- a/appmanagerwidget.cpp +++ b/appmanagerwidget.cpp @@ -49,6 +49,7 @@ AppManagerWidget::AppManagerWidget(AppManagerModel *model, QWidget *parent) , m_appCountLabel(nullptr) , m_appAbstractLabel(nullptr) , m_appNameLable(nullptr) + , m_holdVerComboBox(nullptr) , m_infoBtn(nullptr) , m_filesBtn(nullptr) , m_infoSwitchBtn(nullptr) @@ -170,6 +171,16 @@ AppManagerWidget::AppManagerWidget(AppManagerModel *model, QWidget *parent) appAbstractLayout->addWidget(m_appNameLable); appAbstractLayout->addStretch(1); + // 是否保持版本 + m_holdVerComboBox = new QComboBox(this); + m_holdVerComboBox->setToolTip("保持版本:不随系统更新而更新,dpkg --get-selections查询该安装包状态为hold\n" + "不保持版本:会随系统更新而更新,dpkg --get-selections查询该安装包状态为install"); + m_holdVerComboBox->setEditable(false); + m_holdVerComboBox->insertItems(0, {"保持版本", "不保持版本"}); + m_holdVerComboBox->setCurrentIndex(1); + appAbstractLayout->addWidget(m_holdVerComboBox); + + appAbstractLayout->addSpacing(20); DSuggestButton *openBtn = new DSuggestButton(this); openBtn->setText("打开"); appAbstractLayout->addWidget(openBtn); @@ -296,6 +307,13 @@ AppManagerWidget::AppManagerWidget(AppManagerModel *model, QWidget *parent) m_model->startDetachedDesktopExec(m_showingAppInfo.desktopInfo.exec); }); + connect(m_holdVerComboBox, static_cast(&QComboBox::currentIndexChanged), this, [this](int index) { + m_holdVerComboBox->blockSignals(true); + m_holdVerComboBox->setCurrentIndex(m_showingAppInfo.installedPkgInfo.isHoldVersion ? 0 : 1); + m_holdVerComboBox->blockSignals(false); + Q_EMIT m_model->notigyThreadHoldPkgVersion(m_showingAppInfo.pkgName, 0 == index); + }); + connect(m_infoSwitchBtn, &DButtonBox::buttonClicked, this, [this](QAbstractButton *btn) { if (m_infoBtn == btn) { this->showAppInfo(m_showingAppInfo); @@ -419,6 +437,11 @@ void AppManagerWidget::showAppInfo(const AppInfo &info) } m_appNameLable->setText(appName); + // 更新是否保持版本 + m_holdVerComboBox->blockSignals(true); + m_holdVerComboBox->setCurrentIndex(m_showingAppInfo.installedPkgInfo.isHoldVersion ? 0 : 1); + m_holdVerComboBox->blockSignals(false); + m_infoBtn->setChecked(true); m_appInfoTextEdit->setText(formateAppInfo(m_showingAppInfo)); @@ -428,16 +451,7 @@ void AppManagerWidget::showAppInfo(const AppInfo &info) void AppManagerWidget::showAppFileList(const AppInfo &info) { - m_showingAppInfo = info; - - const QString themeIconName = m_showingAppInfo.desktopInfo.themeIconName; - if (!themeIconName.isEmpty()) { - m_appAbstractLabel->setPixmap(QIcon::fromTheme(themeIconName).pixmap(40, 40)); - } else { - m_appAbstractLabel->setPixmap(QIcon::fromTheme(APP_THEME_ICON_DEFAULT).pixmap(40, 40)); - } - m_appNameLable->setText(m_showingAppInfo.desktopInfo.appName); - + Q_UNUSED(info); m_filesBtn->setChecked(true); m_appInfoTextEdit->hide(); diff --git a/appmanagerwidget.h b/appmanagerwidget.h index 422ff24..13ab46f 100644 --- a/appmanagerwidget.h +++ b/appmanagerwidget.h @@ -4,7 +4,9 @@ #include "appmanagermodel.h" #include + #include +#include class AppManagerModel; @@ -88,6 +90,7 @@ private: QLabel *m_appCountLabel; // 应用个数标签 QLabel *m_appAbstractLabel; QLabel *m_appNameLable; + QComboBox *m_holdVerComboBox; // 是否保持版本下拉框 DButtonBoxButton *m_infoBtn; DButtonBoxButton *m_filesBtn; diff --git a/pkgmonitor.cpp b/pkgmonitor.cpp index f19d748..ea8cfeb 100644 --- a/pkgmonitor.cpp +++ b/pkgmonitor.cpp @@ -171,7 +171,7 @@ QSet PkgMonitor::getCurrentInstalledPkgNameSet() const } if (lineText.startsWith("Status: ")) { - isInstalled = lineText.split(": ").last().startsWith("install"); + isInstalled = lineText.contains("install"); continue; } -- Gitee