Addon Manager: Add GUI for enabling/disabling addons

This commit is contained in:
Chris Hennes
2022-02-13 22:30:59 -06:00
parent ec90b7f954
commit ff67ebce8a
4 changed files with 106 additions and 4 deletions

View File

@@ -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

View File

@@ -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
)

View File

@@ -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(
"<h2>"
+ translate("AddonsInstaller", "WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable.")
+ "</h2>"
)
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(
"<h3>"
+ translate("AddonsInstaller", "This Addon will be enabled next time you restart FreeCAD.")
+ "</h3>"
)
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(
"<h3>"
+ translate("AddonsInstaller", "This Addon will be disabled next time you restart FreeCAD.")
+ "</h3>"
)
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

View File

@@ -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"<span {style}> [" + translate("AddonsInstaller","DISABLED") + "]</span>"
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") + ": "
"<br/>" + translate("AddonsInstaller", "Installed version") + ": "
)
installed_version_string += repo.installed_version
else:
installed_version_string = "\n" + translate(
installed_version_string = "<br/>" + translate(
"AddonsInstaller", "Unknown version"
)
installed_date_string = ""
if repo.updated_timestamp:
installed_date_string = (
"\n" + translate("AddonsInstaller", "Installed on") + ": "
"<br/>" + 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") + ": "
"<br/>" + 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"<br/><span {style}>[" + translate("AddonsInstaller","DISABLED") + "]</span>"
return result