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