Merge pull request #783 from ynput/bugfix/loader-tool-grouping

Loader tool: Fix filtering
This commit is contained in:
Jakub Trllo 2024-07-18 12:36:39 +02:00 committed by GitHub
commit 564365ab00
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 39 additions and 38 deletions

View file

@ -140,12 +140,6 @@ class VersionComboBox(QtWidgets.QComboBox):
self.value_changed.emit(self._product_id, value)
class EditorInfo:
def __init__(self, widget):
self.widget = widget
self.added = False
class VersionDelegate(QtWidgets.QStyledItemDelegate):
"""A delegate that display version integer formatted as version string."""
@ -154,7 +148,7 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._editor_by_id: Dict[str, EditorInfo] = {}
self._editor_by_id: Dict[str, VersionComboBox] = {}
self._statuses_filter = None
def displayText(self, value, locale):
@ -164,8 +158,8 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate):
def set_statuses_filter(self, status_names):
self._statuses_filter = set(status_names)
for info in self._editor_by_id.values():
info.widget.set_statuses_filter(status_names)
for widget in self._editor_by_id.values():
widget.set_statuses_filter(status_names)
def paint(self, painter, option, index):
fg_color = index.data(QtCore.Qt.ForegroundRole)
@ -229,11 +223,11 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate):
editor = VersionComboBox(product_id, parent)
editor.setProperty("itemId", item_id)
self._editor_by_id[item_id] = EditorInfo(editor)
editor.value_changed.connect(self._on_editor_change)
editor.destroyed.connect(self._on_destroy)
self._editor_by_id[item_id] = editor
return editor
def setEditorData(self, editor, index):
@ -242,12 +236,10 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate):
# Current value of the index
versions = index.data(VERSION_NAME_EDIT_ROLE) or []
version_id = index.data(VERSION_ID_ROLE)
editor.update_versions(versions, version_id)
editor.set_statuses_filter(self._statuses_filter)
item_id = editor.property("itemId")
self._editor_by_id[item_id].added = True
def setModelData(self, editor, model, index):
"""Apply the integer version back in the model"""

View file

@ -132,7 +132,7 @@ class ProductsModel(QtGui.QStandardItemModel):
def get_product_item_indexes(self):
return [
item.index()
self.indexFromItem(item)
for item in self._items_by_id.values()
]
@ -156,16 +156,18 @@ class ProductsModel(QtGui.QStandardItemModel):
if product_item is None:
return
self.setData(
product_item.index(), version_id, VERSION_NAME_EDIT_ROLE
)
index = self.indexFromItem(product_item)
self.setData(index, version_id, VERSION_NAME_EDIT_ROLE)
def set_enable_grouping(self, enable_grouping):
if enable_grouping is self._grouping_enabled:
return
self._grouping_enabled = enable_grouping
# Ignore change if groups are not available
self.refresh(self._last_project_name, self._last_folder_ids)
self.refresh(
self._last_project_name,
self._last_folder_ids
)
def flags(self, index):
# Make the version column editable
@ -454,7 +456,7 @@ class ProductsModel(QtGui.QStandardItemModel):
def get_last_project_name(self):
return self._last_project_name
def refresh(self, project_name, folder_ids, status_names):
def refresh(self, project_name, folder_ids):
self._clear()
self._last_project_name = project_name
@ -486,17 +488,9 @@ class ProductsModel(QtGui.QStandardItemModel):
}
last_version_by_product_id = {}
for product_item in product_items:
all_versions = list(product_item.version_items.values())
all_versions.sort()
versions = [
version_item
for version_item in all_versions
if status_names is None or version_item.status in status_names
]
if versions:
last_version = versions[-1]
else:
last_version = all_versions[-1]
versions = list(product_item.version_items.values())
versions.sort()
last_version = versions[-1]
last_version_by_product_id[product_item.product_id] = (
last_version
)
@ -543,10 +537,11 @@ class ProductsModel(QtGui.QStandardItemModel):
for product_name, product_items in groups.items():
group_product_types |= {p.product_type for p in product_items}
for product_item in product_items:
group_product_types |= {
group_status_names |= {
version_item.status
for version_item in product_item.version_items.values()
}
group_product_types.add(product_item.product_type)
if len(product_items) == 1:
top_items.append(product_items[0])
@ -589,13 +584,15 @@ class ProductsModel(QtGui.QStandardItemModel):
product_name, product_items = path_info
(merged_color_hex, merged_color_qt) = self._get_next_color()
merged_color = qtawesome.icon(
"fa.circle", color=merged_color_qt)
"fa.circle", color=merged_color_qt
)
merged_item = self._get_merged_model_item(
product_name, len(product_items), merged_color_hex)
merged_item.setData(merged_color, QtCore.Qt.DecorationRole)
new_items.append(merged_item)
merged_product_types = set()
merged_status_names = set()
new_merged_items = []
for product_item in product_items:
item = self._get_product_model_item(
@ -608,9 +605,21 @@ class ProductsModel(QtGui.QStandardItemModel):
)
new_merged_items.append(item)
merged_product_types.add(product_item.product_type)
merged_status_names |= {
version_item.status
for version_item in (
product_item.version_items.values()
)
}
merged_item.setData(
"|".join(merged_product_types), PRODUCT_TYPE_ROLE)
"|".join(merged_product_types),
PRODUCT_TYPE_ROLE
)
merged_item.setData(
"|".join(merged_status_names),
STATUS_NAME_FILTER_ROLE
)
if new_merged_items:
merged_item.appendRows(new_merged_items)

View file

@ -186,11 +186,12 @@ class ProductsWidget(QtWidgets.QWidget):
products_proxy_model.rowsInserted.connect(self._on_rows_inserted)
products_proxy_model.rowsMoved.connect(self._on_rows_moved)
products_model.refreshed.connect(self._on_refresh)
products_model.version_changed.connect(self._on_version_change)
products_view.customContextMenuRequested.connect(
self._on_context_menu)
products_view.selectionModel().selectionChanged.connect(
products_view_sel_model = products_view.selectionModel()
products_view_sel_model.selectionChanged.connect(
self._on_selection_change)
products_model.version_changed.connect(self._on_version_change)
version_delegate.version_changed.connect(
self._on_version_delegate_change
)
@ -321,8 +322,7 @@ class ProductsWidget(QtWidgets.QWidget):
def _refresh_model(self):
self._products_model.refresh(
self._selected_project_name,
self._selected_folder_ids,
self._products_proxy_model.get_statuses_filter()
self._selected_folder_ids
)
def _on_context_menu(self, point):