diff --git a/src/Mod/AddonManager/AddonManager.py b/src/Mod/AddonManager/AddonManager.py
index 3c36b8a4e7..dfaa014dc2 100644
--- a/src/Mod/AddonManager/AddonManager.py
+++ b/src/Mod/AddonManager/AddonManager.py
@@ -191,6 +191,13 @@ class CommandAddonManager:
elif not os.path.isdir(am_path):
self.update_cache = True
+ # If we are checking for updates automatically, hide the Check for updates button:
+ autocheck = pref.GetBool("AutoCheck", False)
+ if autocheck:
+ self.dialog.buttonCheckForUpdates.hide()
+ else:
+ self.dialog.buttonUpdateAll.hide()
+
# Set up the listing of packages using the model-view-controller architecture
self.packageList = PackageList(self.dialog)
self.item_model = PackageListItemModel()
@@ -210,6 +217,7 @@ class CommandAddonManager:
# set nice icons to everything, by theme with fallback to FreeCAD icons
self.dialog.setWindowIcon(QtGui.QIcon(":/icons/AddonManager.svg"))
self.dialog.buttonUpdateAll.setIcon(QtGui.QIcon(":/icons/button_valid.svg"))
+ self.dialog.buttonCheckForUpdates.setIcon(QtGui.QIcon(":/icons/view-refresh.svg"))
self.dialog.buttonClose.setIcon(
QtGui.QIcon.fromTheme("close", QtGui.QIcon(":/icons/process-stop.svg"))
)
@@ -226,6 +234,7 @@ class CommandAddonManager:
# connect slots
self.dialog.rejected.connect(self.reject)
self.dialog.buttonUpdateAll.clicked.connect(self.update_all)
+ self.dialog.buttonCheckForUpdates.clicked.connect(self.manually_check_for_updates)
self.dialog.buttonClose.clicked.connect(self.dialog.reject)
self.dialog.buttonUpdateCache.clicked.connect(self.on_buttonUpdateCache_clicked)
self.dialog.buttonShowDetails.clicked.connect(self.toggle_details)
@@ -528,10 +537,9 @@ class CommandAddonManager:
pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons")
autocheck = pref.GetBool("AutoCheck", False)
if not autocheck:
- FreeCAD.Console.PrintMessage(translate(
- "AddonsInstaller",
- "Addon Manager: Skipping update check because AutoCheck user preference is False"
- ) + "\n")
+ FreeCAD.Console.PrintLog(
+ "Addon Manager: Skipping update check because AutoCheck user preference is False\n"
+ )
self.do_next_startup_phase()
return
if not self.packages_with_updates:
@@ -732,6 +740,32 @@ class CommandAddonManager:
self.item_model.reload_item(repo)
self.packageDetails.show_repo(repo)
+ def manually_check_for_updates(self) -> None:
+ if hasattr(self, "check_worker"):
+ thread = self.check_worker
+ if thread:
+ if not thread.isFinished():
+ self.do_next_startup_phase()
+ return
+ self.dialog.buttonCheckForUpdates.setText(
+ translate("AddonsInstaller", "Checking for updates...")
+ )
+ self.dialog.buttonCheckForUpdates.setEnabled(False)
+ self.show_progress_widgets()
+ self.current_progress_region = 1
+ self.number_of_progress_regions = 1
+ self.check_worker = CheckWorkbenchesForUpdatesWorker(self.item_model.repos)
+ self.check_worker.finished.connect(self.manual_update_check_complete)
+ self.check_worker.progress_made.connect(self.update_progress_bar)
+ self.check_worker.update_status.connect(self.status_updated)
+ self.check_worker.start()
+
+ def manual_update_check_complete(self) -> None:
+ self.dialog.buttonUpdateAll.show()
+ self.dialog.buttonCheckForUpdates.hide()
+ self.enable_updates(len(self.packages_with_updates))
+ self.hide_progress_widgets()
+
def update_all(self) -> None:
"""Asynchronously apply all available updates: individual failures are noted, but do not stop other updates"""
diff --git a/src/Mod/AddonManager/AddonManager.ui b/src/Mod/AddonManager/AddonManager.ui
index 54255ee5d8..ac9269af0a 100644
--- a/src/Mod/AddonManager/AddonManager.ui
+++ b/src/Mod/AddonManager/AddonManager.ui
@@ -134,6 +134,13 @@
+ -
+
+
+ Check for updates
+
+
+
-