Addon Manager: Refactor primary view and enable composite (#12693)

* Addon Manager: Refactor primary view and enable composite

This brings back something akin to the original Addon Manager display, with the side-by-side display of the list and details views.
This commit is contained in:
Chris Hennes
2024-03-04 08:56:55 -06:00
committed by GitHub
parent 5834042855
commit 4067cdb672
12 changed files with 242 additions and 119 deletions

View File

@@ -65,7 +65,6 @@ class PackageList(QtWidgets.QWidget):
self.ui.listPackages.setItemDelegate(self.item_delegate)
self.ui.listPackages.clicked.connect(self.on_listPackages_clicked)
self.ui.view_bar.view_changed.connect(self.set_view_style)
self.ui.view_bar.filter_changed.connect(self.update_status_filter)
self.ui.view_bar.search_changed.connect(self.item_filter.setFilterRegularExpression)
self.ui.view_bar.sort_changed.connect(self.item_filter.setSortRole)
@@ -105,6 +104,20 @@ class PackageList(QtWidgets.QWidget):
)
self.item_filter.setHideUnlicensed(pref.GetBool("HideUnlicensed", False))
def select_addon(self, addon_name: str):
for index, addon in enumerate(self.item_model.repos):
if addon.name == addon_name:
row_index = self.item_model.createIndex(index, 0)
if self.item_filter.filterAcceptsRow(index):
self.ui.listPackages.setCurrentIndex(row_index)
else:
FreeCAD.Console.PrintLog(
f"Addon {addon_name} is not visible given current "
"filter: not selecting it."
)
return
FreeCAD.Console.PrintLog(f"Could not find addon '{addon_name}' to select it")
def on_listPackages_clicked(self, index: QtCore.QModelIndex):
"""Determine what addon was selected and emit the itemSelected signal with it as
an argument."""
@@ -124,10 +137,10 @@ class PackageList(QtWidgets.QWidget):
def set_view_style(self, style: AddonManagerDisplayStyle) -> None:
"""Set the style (compact or expanded) of the list"""
self.item_model.layoutAboutToBeChanged.emit()
if self.item_model:
self.item_model.layoutAboutToBeChanged.emit()
self.item_delegate.set_view(style)
# TODO: Update to support composite
if style == AddonManagerDisplayStyle.COMPACT:
if style == AddonManagerDisplayStyle.COMPACT or style == AddonManagerDisplayStyle.COMPOSITE:
self.ui.listPackages.setSpacing(2)
self.ui.listPackages.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerItem)
self.ui.listPackages.verticalScrollBar().setSingleStep(-1)
@@ -135,7 +148,8 @@ class PackageList(QtWidgets.QWidget):
self.ui.listPackages.setSpacing(5)
self.ui.listPackages.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
self.ui.listPackages.verticalScrollBar().setSingleStep(24)
self.item_model.layoutChanged.emit()
if self.item_model:
self.item_model.layoutChanged.emit()
pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons")
pref.SetInt("ViewStyle", style)
@@ -288,6 +302,9 @@ class PackageListItemDelegate(QtWidgets.QStyledItemDelegate):
elif self.displayStyle == AddonManagerDisplayStyle.COMPACT:
self.widget = self.compact
self._setup_compact_view(repo)
elif self.displayStyle == AddonManagerDisplayStyle.COMPOSITE:
self.widget = self.compact # For now re-use the compact list
self._setup_composite_view(repo)
self.widget.adjustSize()
def _setup_expanded_view(self, addon: Addon) -> None:
@@ -334,6 +351,22 @@ class PackageListItemDelegate(QtWidgets.QStyledItemDelegate):
else:
self.widget.ui.labelDescription.setText(self._get_sort_label_text(addon))
def _setup_composite_view(self, addon: Addon) -> None:
self.widget.ui.labelPackageName.setText(f"<b>{addon.display_name}</b>")
self.widget.ui.labelIcon.setPixmap(addon.icon.pixmap(QtCore.QSize(16, 16)))
self.widget.ui.labelStatus.setText(self.get_compact_update_string(addon))
self.widget.ui.labelIcon.setText("")
if addon.metadata:
self.widget.ui.labelVersion.setText(f"<i>v{addon.metadata.version}</i>")
elif addon.macro:
self._set_macro_version_label(addon)
else:
self.widget.ui.labelVersion.setText("")
if self.sort_order != SortOptions.Alphabetical:
self.widget.ui.labelDescription.setText(self._get_sort_label_text(addon))
else:
self.widget.ui.labelDescription.setText("")
def _set_package_maintainer_label(self, addon: Addon):
maintainers = addon.metadata.maintainer
maintainers_string = ""
@@ -395,14 +428,13 @@ class PackageListItemDelegate(QtWidgets.QStyledItemDelegate):
return ""
def _get_compact_description(self, addon: Addon) -> str:
description = ""
if addon.metadata:
trimmed_text = addon.metadata.description
# TODO: Un-hardcode the 25 character limiter
return trimmed_text.replace("\r\n", " ")[:25] + "..."
if addon.macro and addon.macro.comment:
trimmed_text = addon.macro.comment
return trimmed_text.replace("\r\n", " ")[:25] + "..."
return ""
description = addon.metadata.description
elif addon.macro and addon.macro.comment:
description = addon.macro.comment
trimmed_text, _, _ = description.partition(".")
return trimmed_text.replace("\n", " ")
@staticmethod
def get_compact_update_string(repo: Addon) -> str: