From a21b99fed222ee3de6f6f8bfeeba0e8847678326 Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Sun, 13 Feb 2022 22:30:59 -0600 Subject: [PATCH] Addon Manager: Add GUI for enabling/disabling addons --- src/Mod/AddonManager/AddonManagerRepo.py | 21 ++++++++ src/Mod/AddonManager/expanded_view.py | 2 + src/Mod/AddonManager/package_details.py | 68 ++++++++++++++++++++++++ src/Mod/AddonManager/package_list.py | 19 +++++-- 4 files changed, 106 insertions(+), 4 deletions(-) diff --git a/src/Mod/AddonManager/AddonManagerRepo.py b/src/Mod/AddonManager/AddonManagerRepo.py index 69bcad1862..d171129ee4 100644 --- a/src/Mod/AddonManager/AddonManagerRepo.py +++ b/src/Mod/AddonManager/AddonManagerRepo.py @@ -364,3 +364,24 @@ class AddonManagerRepo: def set_status(self, status): with self.status_lock: self.update_status = status + + def is_disabled(self): + # Check for existence of disabling stopfile: + stopfile = os.path.join(FreeCAD.getUserAppDataDir(), "Mod", self.name, "ADDON_DISABLED") + if os.path.exists(stopfile): + return True + else: + return False + + def disable(self): + stopfile = os.path.join(FreeCAD.getUserAppDataDir(), "Mod", self.name, "ADDON_DISABLED") + with open(stopfile,"w") as f: + f.write("The existence of this file prevents FreeCAD from loading this Addon. To re-enable, delete the file.") + + def enable(self): + stopfile = os.path.join(FreeCAD.getUserAppDataDir(), "Mod", self.name, "ADDON_DISABLED") + try: + os.unlink(stopfile) + except Exception: + pass + diff --git a/src/Mod/AddonManager/expanded_view.py b/src/Mod/AddonManager/expanded_view.py index ade4e580cb..9f40dcf360 100644 --- a/src/Mod/AddonManager/expanded_view.py +++ b/src/Mod/AddonManager/expanded_view.py @@ -60,6 +60,7 @@ class Ui_ExpandedView(object): self.labelVersion = QLabel(ExpandedView) self.labelVersion.setObjectName(u"labelVersion") + self.labelVersion.setTextFormat(Qt.RichText) sizePolicy2 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) sizePolicy2.setHorizontalStretch(0) sizePolicy2.setVerticalStretch(0) @@ -110,6 +111,7 @@ class Ui_ExpandedView(object): self.labelStatus = QLabel(ExpandedView) self.labelStatus.setObjectName(u"labelStatus") + self.labelStatus.setTextFormat(Qt.RichText) self.labelStatus.setAlignment( Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter ) diff --git a/src/Mod/AddonManager/package_details.py b/src/Mod/AddonManager/package_details.py index ed8f6c8e3e..35eb74e9fa 100644 --- a/src/Mod/AddonManager/package_details.py +++ b/src/Mod/AddonManager/package_details.py @@ -96,6 +96,8 @@ class PackageDetails(QWidget): lambda: self.check_for_update.emit(self.repo) ) self.ui.buttonChangeBranch.clicked.connect(self.change_branch_clicked) + self.ui.buttonEnable.clicked.connect(self.enable_clicked) + self.ui.buttonDisable.clicked.connect(self.disable_clicked) if HAS_QTWEBENGINE: self.ui.webView.loadStarted.connect(self.load_started) self.ui.webView.loadProgress.connect(self.load_progress) @@ -166,6 +168,7 @@ class PackageDetails(QWidget): def display_repo_status(self, status): repo = self.repo self.set_change_branch_button_state() + self.set_disable_button_state() if status != AddonManagerRepo.UpdateStatus.NOT_INSTALLED: version = repo.installed_version @@ -361,6 +364,16 @@ class PackageDetails(QWidget): self.ui.labelWarningInfo.setStyleSheet( "color:" + utils.warning_color_string() ) + elif repo.is_disabled(): + self.ui.labelWarningInfo.show() + self.ui.labelWarningInfo.setText( + "

" + + translate("AddonsInstaller", "WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable.") + + "

" + ) + self.ui.labelWarningInfo.setStyleSheet( + "color:" + utils.warning_color_string() + ) else: self.ui.labelWarningInfo.hide() @@ -423,6 +436,17 @@ class PackageDetails(QWidget): # branches, if there are any besides the one we are on: show the button self.ui.buttonChangeBranch.show() + def set_disable_button_state(self): + self.ui.buttonEnable.hide() + self.ui.buttonDisable.hide() + status = self.repo.status() + if status != AddonManagerRepo.UpdateStatus.NOT_INSTALLED: + disabled = self.repo.is_disabled() + if disabled: + self.ui.buttonEnable.show() + else: + self.ui.buttonDisable.show() + def show_workbench(self, repo: AddonManagerRepo) -> None: """loads information of a given workbench""" url = utils.get_readme_html_url(repo) @@ -582,6 +606,34 @@ class PackageDetails(QWidget): change_branch_dialog.branch_changed.connect(self.branch_changed) change_branch_dialog.exec() + def enable_clicked(self) -> None: + self.repo.enable() + self.set_disable_button_state() + self.update_status.emit(self.repo) + self.ui.labelWarningInfo.show() + self.ui.labelWarningInfo.setText( + "

" + + translate("AddonsInstaller", "This Addon will be enabled next time you restart FreeCAD.") + + "

" + ) + self.ui.labelWarningInfo.setStyleSheet( + "color:" + utils.bright_color_string() + ) + + def disable_clicked(self) -> None: + self.repo.disable() + self.set_disable_button_state() + self.update_status.emit(self.repo) + self.ui.labelWarningInfo.show() + self.ui.labelWarningInfo.setText( + "

" + + translate("AddonsInstaller", "This Addon will be disabled next time you restart FreeCAD.") + + "

" + ) + self.ui.labelWarningInfo.setStyleSheet( + "color:" + utils.attention_color_string() + ) + def branch_changed(self, name: str) -> None: QMessageBox.information( self, @@ -704,6 +756,16 @@ class Ui_PackageDetails(object): self.layoutDetailsBackButton.addWidget(self.buttonExecute) + self.buttonDisable = QPushButton(PackageDetails) + self.buttonDisable.setObjectName("buttonDisable") + + self.layoutDetailsBackButton.addWidget(self.buttonDisable) + + self.buttonEnable = QPushButton(PackageDetails) + self.buttonEnable.setObjectName("buttonEnable") + + self.layoutDetailsBackButton.addWidget(self.buttonEnable) + self.verticalLayout_2.addLayout(self.layoutDetailsBackButton) self.labelPackageDetails = QLabel(PackageDetails) @@ -795,6 +857,12 @@ class Ui_PackageDetails(object): self.buttonChangeBranch.setText( QCoreApplication.translate("AddonsInstaller", "Change Branch", None) ) + self.buttonEnable.setText( + QCoreApplication.translate("AddonsInstaller", "Enable", None) + ) + self.buttonDisable.setText( + QCoreApplication.translate("AddonsInstaller", "Disable", None) + ) self.buttonBack.setToolTip( QCoreApplication.translate( "AddonsInstaller", "Return to package list", None diff --git a/src/Mod/AddonManager/package_list.py b/src/Mod/AddonManager/package_list.py index 61d2134f69..30603e6514 100644 --- a/src/Mod/AddonManager/package_list.py +++ b/src/Mod/AddonManager/package_list.py @@ -36,6 +36,8 @@ from AddonManagerRepo import AddonManagerRepo from compact_view import Ui_CompactView from expanded_view import Ui_ExpandedView +import addonmanager_utilities as utils + translate = FreeCAD.Qt.translate @@ -423,6 +425,11 @@ class PackageListItemDelegate(QStyledItemDelegate): result = translate("AddonsInstaller", "Update available") elif repo.status() == AddonManagerRepo.UpdateStatus.PENDING_RESTART: result = translate("AddonsInstaller", "Pending restart") + + if repo.is_disabled(): + style = "style='color:" + utils.warning_color_string() + "; font-weight:bold;'" + result += f" [" + translate("AddonsInstaller","DISABLED") + "]" + return result def get_expanded_update_string(self, repo: AddonManagerRepo) -> str: @@ -434,18 +441,18 @@ class PackageListItemDelegate(QStyledItemDelegate): if repo.status() != AddonManagerRepo.UpdateStatus.NOT_INSTALLED: if repo.installed_version: installed_version_string = ( - "\n" + translate("AddonsInstaller", "Installed version") + ": " + "
" + translate("AddonsInstaller", "Installed version") + ": " ) installed_version_string += repo.installed_version else: - installed_version_string = "\n" + translate( + installed_version_string = "
" + translate( "AddonsInstaller", "Unknown version" ) installed_date_string = "" if repo.updated_timestamp: installed_date_string = ( - "\n" + translate("AddonsInstaller", "Installed on") + ": " + "
" + translate("AddonsInstaller", "Installed on") + ": " ) installed_date_string += ( QDateTime.fromTime_t(repo.updated_timestamp) @@ -456,7 +463,7 @@ class PackageListItemDelegate(QStyledItemDelegate): available_version_string = "" if repo.metadata: available_version_string = ( - "\n" + translate("AddonsInstaller", "Available version") + ": " + "
" + translate("AddonsInstaller", "Available version") + ": " ) available_version_string += repo.metadata.Version @@ -475,6 +482,10 @@ class PackageListItemDelegate(QStyledItemDelegate): result += available_version_string elif repo.status() == AddonManagerRepo.UpdateStatus.PENDING_RESTART: result = translate("AddonsInstaller", "Pending restart") + + if repo.is_disabled(): + style = "style='color:" + utils.warning_color_string() + "; font-weight:bold;'" + result += f"
[" + translate("AddonsInstaller","DISABLED") + "]" return result