From 2ac7052236ec441dc790b06d2372abb56d7e3208 Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Thu, 27 Jan 2022 16:06:23 -0600 Subject: [PATCH] Addon Manager: Add search and display of tags --- src/App/MetadataPyImp.cpp | 9 ++++++--- src/Mod/AddonManager/AddonManagerRepo.py | 17 +++++++++++++++- src/Mod/AddonManager/expanded_view.py | 14 +++++++++++-- src/Mod/AddonManager/expanded_view.ui | 11 +++++++++-- src/Mod/AddonManager/package_list.py | 25 ++++++++++++++++++++++-- 5 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/App/MetadataPyImp.cpp b/src/App/MetadataPyImp.cpp index c96a1b93f5..43e7ebd982 100644 --- a/src/App/MetadataPyImp.cpp +++ b/src/App/MetadataPyImp.cpp @@ -39,8 +39,11 @@ std::string MetadataPy::representation(void) const str << ptr->name(); str << "), Description=("; str << ptr->description(); - str << "), Maintainer=("; - str << ptr->maintainer().front().name << ")]"; + if (!ptr->maintainer().empty()) { + str << "), Maintainer=("; + str << ptr->maintainer().front().name; + } + str << ")]"; return str.str(); } @@ -258,7 +261,7 @@ Py::Object MetadataPy::getContent(void) const for (const auto& key : keys) { Py::List pyContentForKey; auto elements = content.equal_range(key); - for (auto element = elements.first; element != elements.second; ++element) { + for (auto & element = elements.first; element != elements.second; ++element) { auto contentMetadataItem = new MetadataPy(new Metadata(element->second)); pyContentForKey.append(Py::asObject(contentMetadataItem)); } diff --git a/src/Mod/AddonManager/AddonManagerRepo.py b/src/Mod/AddonManager/AddonManagerRepo.py index 3c3cdb4bea..a5aeb0ee52 100644 --- a/src/Mod/AddonManager/AddonManagerRepo.py +++ b/src/Mod/AddonManager/AddonManagerRepo.py @@ -96,6 +96,7 @@ class AddonManagerRepo: self.rejected = False self.repo_type = AddonManagerRepo.RepoType.WORKBENCH self.description = None + self.tags = set() # Just a cache, loaded from Metadata from addonmanager_utilities import construct_git_url if "github" in self.url or "gitlab" in self.url or "salsa" in self.url: @@ -198,9 +199,13 @@ class AddonManagerRepo: } def load_metadata_file(self, file: str) -> None: - if os.path.isfile(file): + if os.path.exists(file): metadata = FreeCAD.Metadata(file) self.set_metadata(metadata) + else: + FreeCAD.Console.PrintMessage( + "Internal error: {} does not exist".format(file) + ) def set_metadata(self, metadata: FreeCAD.Metadata) -> None: self.metadata = metadata @@ -214,6 +219,16 @@ class AddonManagerRepo: self.branch = url["branch"] else: self.branch = "master" + self.extract_tags(self.metadata) + + def extract_tags(self, metadata: FreeCAD.Metadata) -> None: + for new_tag in metadata.Tag: + self.tags.add(new_tag) + + content = metadata.Content + for key, value in content.items(): + for item in value: + self.extract_tags(item) def contains_workbench(self) -> bool: """Determine if this package contains (or is) a workbench""" diff --git a/src/Mod/AddonManager/expanded_view.py b/src/Mod/AddonManager/expanded_view.py index 5c8a7c2797..ade4e580cb 100644 --- a/src/Mod/AddonManager/expanded_view.py +++ b/src/Mod/AddonManager/expanded_view.py @@ -17,8 +17,8 @@ class Ui_ExpandedView(object): def setupUi(self, ExpandedView): if not ExpandedView.objectName(): ExpandedView.setObjectName(u"ExpandedView") - ExpandedView.resize(657, 64) - sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Minimum) + ExpandedView.resize(807, 141) + sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(ExpandedView.sizePolicy().hasHeightForWidth()) @@ -36,6 +36,8 @@ class Ui_ExpandedView(object): sizePolicy1.setHeightForWidth(self.labelIcon.sizePolicy().hasHeightForWidth()) self.labelIcon.setSizePolicy(sizePolicy1) self.labelIcon.setMinimumSize(QSize(48, 48)) + self.labelIcon.setMaximumSize(QSize(48, 48)) + self.labelIcon.setBaseSize(QSize(48, 48)) self.horizontalLayout_2.addWidget(self.labelIcon) @@ -68,6 +70,11 @@ class Ui_ExpandedView(object): self.horizontalLayout.addWidget(self.labelVersion) + self.labelTags = QLabel(ExpandedView) + self.labelTags.setObjectName(u"labelTags") + + self.horizontalLayout.addWidget(self.labelTags) + self.horizontalSpacer_2 = QSpacerItem( 40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum ) @@ -128,6 +135,9 @@ class Ui_ExpandedView(object): self.labelVersion.setText( QCoreApplication.translate("ExpandedView", u"Version", None) ) + self.labelTags.setText( + QCoreApplication.translate("ExpandedView", u"(tags)", None) + ) self.labelDescription.setText( QCoreApplication.translate("ExpandedView", u"Description", None) ) diff --git a/src/Mod/AddonManager/expanded_view.ui b/src/Mod/AddonManager/expanded_view.ui index 0ba3e6dcb9..ee98fd9e18 100644 --- a/src/Mod/AddonManager/expanded_view.ui +++ b/src/Mod/AddonManager/expanded_view.ui @@ -6,8 +6,8 @@ 0 0 - 657 - 64 + 807 + 141 @@ -115,6 +115,13 @@ + + + + (tags) + + + diff --git a/src/Mod/AddonManager/package_list.py b/src/Mod/AddonManager/package_list.py index ce34d80ce5..770a801420 100644 --- a/src/Mod/AddonManager/package_list.py +++ b/src/Mod/AddonManager/package_list.py @@ -338,6 +338,7 @@ class PackageListItemDelegate(QStyledItemDelegate): self.widget.ui.labelIcon.setPixmap(repo.icon.pixmap(QSize(16, 16))) self.widget.ui.labelIcon.setText("") + self.widget.ui.labelTags.setText("") if repo.metadata: self.widget.ui.labelDescription.setText(repo.metadata.Description) self.widget.ui.labelVersion.setText(f"v{repo.metadata.Version}") @@ -353,8 +354,16 @@ class PackageListItemDelegate(QStyledItemDelegate): n = len(maintainers) string = translate("AddonsInstaller", "Maintainers:", "", n) for maintainer in maintainers: - string += f"\n{maintainer['name']} <{maintainer['email']}>" - self.widget.ui.labelMaintainer.setText(string) + maintainers_string += ( + f"\n{maintainer['name']} <{maintainer['email']}>" + ) + self.widget.ui.labelMaintainer.setText(maintainers_string) + if repo.tags: + self.widget.ui.labelTags.setText( + translate("AddonsInstaller", "Tags") + + ": " + + ", ".join(repo.tags) + ) elif repo.macro and repo.macro.parsed: self.widget.ui.labelDescription.setText(repo.macro.comment) self.widget.ui.labelVersion.setText(repo.macro.version) @@ -562,6 +571,9 @@ class PackageListFilter(QSortFilterProxyModel): and re.match(data.macro.comment).hasMatch() ): return True + for tag in data.tags: + if re.match(tag).hasMatch(): + return True return False else: return False @@ -573,6 +585,15 @@ class PackageListFilter(QSortFilterProxyModel): return True if re.indexIn(desc) != -1: return True + if ( + data.macro + and data.macro.comment + and re.indexIn(data.macro.comment) != -1 + ): + return True + for tag in data.tags: + if re.indexIn(tag) != -1: + return True return False else: return False