From b257f48d6a91b341580a940263c6c6f1609f893d Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Wed, 15 May 2024 08:33:39 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Filtering=20keeps=20top=20level=20i?= =?UTF-8?q?tem=20shown.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/gui.py | 23 ++++++++++++++--------- tidal_dl_ng/helper/gui.py | 22 ++++++++++++++++------ 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py index ff853a4..4a70840 100644 --- a/tidal_dl_ng/gui.py +++ b/tidal_dl_ng/gui.py @@ -396,7 +396,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.populate_tree_results(results) - def populate_tree_results(self, results: [ResultItem], parent: QtWidgets.QTreeWidgetItem = None): + def populate_tree_results(self, results: [ResultItem], parent: QtGui.QStandardItem = None): if not parent: self.model_tr_results.removeRows(0, self.model_tr_results.rowCount()) @@ -407,7 +407,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): child: tuple = self.populate_tree_result_child(item=item, index_count_digits=count_digits) if parent: - parent.addChild(child) + parent.appendRow(child) else: self.s_tr_results_add_top_level_item.emit(child) @@ -751,7 +751,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self, media_list: Album | Playlist | Mix | Artist | None = None, point: QtCore.QPoint | None = None, - parent: QtWidgets.QTreeWidgetItem = None, + parent: QtGui.QStandardItem = None, ) -> None: if point: item = self.tr_lists_user.itemAt(point) @@ -808,7 +808,9 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): logger_gui.error("Please select a row first.") else: for item in items: - media: Track | Album | Playlist | Video | Artist = get_results_media_item(item, self.proxy_tr_results, self.model_tr_results) + media: Track | Album | Playlist | Video | Artist = get_results_media_item( + item, self.proxy_tr_results, self.model_tr_results + ) queue_dl_item: QueueDownloadItem = self.media_to_queue_download_model(media) if queue_dl_item: @@ -957,15 +959,18 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def on_preferences(self) -> None: DialogPreferences(settings=self.settings, settings_save=self.s_settings_save, parent=self) - def on_tr_results_expanded(self, list_item: QtWidgets.QTreeWidgetItem) -> None: + def on_tr_results_expanded(self, index: QtCore.QModelIndex) -> None: # If the child is a dummy the list_item has not been expanded before - load_children: bool = list_item.child(0).isDisabled() + item: QtGui.QStandardItem = self.model_tr_results.itemFromIndex(self.proxy_tr_results.mapToSource(index)) + load_children: bool = not item.child(0, 0).isEnabled() if load_children: - list_item.removeChild(list_item.child(0)) - media_list: [Mix | Album | Playlist | Artist] = list_item.data(1, QtCore.Qt.ItemDataRole.UserRole) + item.removeRow(0) + media_list: [Mix | Album | Playlist | Artist] = get_results_media_item( + index, self.proxy_tr_results, self.model_tr_results + ) - self.list_items_show_result(media_list=media_list, parent=list_item) + self.list_items_show_result(media_list=media_list, parent=item) def button_reload_status(self, status: bool): button_text: str = "Reloading..." diff --git a/tidal_dl_ng/helper/gui.py b/tidal_dl_ng/helper/gui.py index 82b7f7b..82a44d8 100644 --- a/tidal_dl_ng/helper/gui.py +++ b/tidal_dl_ng/helper/gui.py @@ -105,8 +105,10 @@ class FilterHeader(QtWidgets.QHeaderView): def sizeHint(self): size = super().sizeHint() + if self._editors: height = self._editors[0].sizeHint().height() + size.setHeight(size.height() + height + self._padding) return size @@ -114,6 +116,7 @@ class FilterHeader(QtWidgets.QHeaderView): def updateGeometries(self): if self._editors: height = self._editors[0].sizeHint().height() + self.setViewportMargins(0, 0, 0, height + self._padding) else: self.setViewportMargins(0, 0, 0, 0) @@ -167,18 +170,25 @@ class HumanProxyModel(QtCore.QSortFilterProxyModel): @filters.setter def filters(self, filters): - print("filters() called.") - self._filters = filters self.invalidateFilter() - def filterAcceptsRow(self, sourceRow, sourceParent) -> bool: + def filterAcceptsRow(self, source_row: int, source_parent: QtCore.QModelIndex) -> bool: + model = self.sourceModel() + source_index = model.index(source_row, 0, source_parent) + + # Show top level children + for child_row in range(model.rowCount(source_index)): + if self.filterAcceptsRow(child_row, source_index): + return True + + # Filter for actual needle for i, text in self.filters: if 0 <= i < self.columnCount(): - ix = self.sourceModel().index(sourceRow, i, sourceParent) + ix = self.sourceModel().index(source_row, i, source_parent) data = ix.data() - if str(data) in text: - return False + + return bool(text.lower() in str(data).lower()) return True