diff --git a/src/Mod/AddonManager/AddonManagerOptions.ui b/src/Mod/AddonManager/AddonManagerOptions.ui
index 5a37e33911..cbf06be88e 100644
--- a/src/Mod/AddonManager/AddonManagerOptions.ui
+++ b/src/Mod/AddonManager/AddonManagerOptions.ui
@@ -122,6 +122,22 @@ installed addons will be checked for available updates
+ -
+
+
+ Hide Addons that require a newer version of FreeCAD
+
+
+ true
+
+
+ Addons
+
+
+ HideNewerFreeCADRequired
+
+
+
-
diff --git a/src/Mod/AddonManager/package_details.py b/src/Mod/AddonManager/package_details.py
index c6c5526d6a..48c4e07dd8 100644
--- a/src/Mod/AddonManager/package_details.py
+++ b/src/Mod/AddonManager/package_details.py
@@ -35,6 +35,8 @@ from addonmanager_workers import GetMacroDetailsWorker, CheckSingleUpdateWorker
from AddonManagerRepo import AddonManagerRepo
import NetworkManager
+from typing import Optional
+
translate = FreeCAD.Qt.translate
show_javascript_console_output = False
@@ -286,6 +288,7 @@ class PackageDetails(QWidget):
self.ui.buttonUpdate.hide()
self.ui.buttonCheckForUpdate.hide()
+ required_version = self.requires_newer_freecad()
if repo.obsolete:
self.ui.labelWarningInfo.show()
self.ui.labelWarningInfo.setText(
@@ -306,9 +309,44 @@ class PackageDetails(QWidget):
self.ui.labelWarningInfo.setStyleSheet(
"color:" + utils.warning_color_string()
)
+ elif required_version:
+ self.ui.labelWarningInfo.show()
+ self.ui.labelWarningInfo.setText(
+ "
"
+ + translate("AddonsInstaller", "WARNING: This addon requires FreeCAD ")
+ + required_version
+ + "
"
+ )
+ self.ui.labelWarningInfo.setStyleSheet(
+ "color:" + utils.warning_color_string()
+ )
+
else:
self.ui.labelWarningInfo.hide()
+ def requires_newer_freecad(self) -> Optional[str]:
+ # If it's not installed, check to see if it's for a newer version of FreeCAD
+ if (
+ self.repo.status() == AddonManagerRepo.UpdateStatus.NOT_INSTALLED
+ and self.repo.metadata
+ ):
+ # Only hide if ALL content items require a newer version, otherwise
+ # it's possible that this package actually provides versions of itself
+ # for newer and older versions
+
+ first_supported_version = self.repo.metadata.getFirstSupportedFreeCADVersion()
+ if first_supported_version is not None:
+ required_version = first_supported_version.split(".")
+ fc_major = int(FreeCAD.Version()[0])
+ fc_minor = int(FreeCAD.Version()[1])
+
+ if int(required_version[0]) > fc_major:
+ return first_supported_version
+ elif int(required_version[0]) == fc_major and len(required_version) > 1:
+ if int(required_version[1]) > fc_minor:
+ return first_supported_version
+ return None
+
def show_workbench(self, repo: AddonManagerRepo) -> None:
"""loads information of a given workbench"""
url = utils.get_readme_html_url(repo)
diff --git a/src/Mod/AddonManager/package_list.py b/src/Mod/AddonManager/package_list.py
index ef181ebad8..287dd6d973 100644
--- a/src/Mod/AddonManager/package_list.py
+++ b/src/Mod/AddonManager/package_list.py
@@ -102,6 +102,7 @@ class PackageList(QWidget):
self.item_filter.setHidePy2(pref.GetBool("HidePy2", True))
self.item_filter.setHideObsolete(pref.GetBool("HideObsolete", True))
+ self.item_filter.setHideNewerFreeCADRequired(pref.GetBool("HideNewerFreeCADRequired", True))
def on_listPackages_clicked(self, index: QModelIndex):
source_selection = self.item_filter.mapToSource(index)
@@ -489,6 +490,7 @@ class PackageListFilter(QSortFilterProxyModel):
self.setSortCaseSensitivity(Qt.CaseInsensitive)
self.hide_obsolete = False
self.hide_py2 = False
+ self.hide_newer_freecad_required = False
def setPackageFilter(
self, type: int
@@ -510,6 +512,10 @@ class PackageListFilter(QSortFilterProxyModel):
self.hide_obsolete = hide_obsolete
self.invalidateFilter()
+ def setHideNewerFreeCADRequired(self, hide_nfr: bool) -> None:
+ self.hide_newer_freecad_required = hide_nfr
+ self.invalidateFilter()
+
def lessThan(self, left, right) -> bool:
l = self.sourceModel().data(left, PackageListItemModel.DataAccessRole)
r = self.sourceModel().data(right, PackageListItemModel.DataAccessRole)
@@ -555,6 +561,28 @@ class PackageListFilter(QSortFilterProxyModel):
):
return False
+ # If it's not installed, check to see if it's for a newer version of FreeCAD
+ if (
+ data.status() == AddonManagerRepo.UpdateStatus.NOT_INSTALLED
+ and self.hide_newer_freecad_required
+ and data.metadata
+ ):
+ # Only hide if ALL content items require a newer version, otherwise
+ # it's possible that this package actually provides versions of itself
+ # for newer and older versions
+
+ first_supported_version = data.metadata.getFirstSupportedFreeCADVersion()
+ if first_supported_version is not None:
+ required_version = first_supported_version.split(".")
+ fc_major = int(FreeCAD.Version()[0])
+ fc_minor = int(FreeCAD.Version()[1])
+
+ if int(required_version[0]) > fc_major:
+ return False
+ elif int(required_version[0]) == fc_major and len(required_version) > 1:
+ if int(required_version[1]) > fc_minor:
+ return False
+
name = data.display_name
desc = data.description
if hasattr(self, "filterRegularExpression"): # Added in Qt 5.12