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