✨ Filtering keeps top level item shown.
This commit is contained in:
+14
-9
@@ -396,7 +396,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
self.populate_tree_results(results)
|
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:
|
if not parent:
|
||||||
self.model_tr_results.removeRows(0, self.model_tr_results.rowCount())
|
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)
|
child: tuple = self.populate_tree_result_child(item=item, index_count_digits=count_digits)
|
||||||
|
|
||||||
if parent:
|
if parent:
|
||||||
parent.addChild(child)
|
parent.appendRow(child)
|
||||||
else:
|
else:
|
||||||
self.s_tr_results_add_top_level_item.emit(child)
|
self.s_tr_results_add_top_level_item.emit(child)
|
||||||
|
|
||||||
@@ -751,7 +751,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
self,
|
self,
|
||||||
media_list: Album | Playlist | Mix | Artist | None = None,
|
media_list: Album | Playlist | Mix | Artist | None = None,
|
||||||
point: QtCore.QPoint | None = None,
|
point: QtCore.QPoint | None = None,
|
||||||
parent: QtWidgets.QTreeWidgetItem = None,
|
parent: QtGui.QStandardItem = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
if point:
|
if point:
|
||||||
item = self.tr_lists_user.itemAt(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.")
|
logger_gui.error("Please select a row first.")
|
||||||
else:
|
else:
|
||||||
for item in items:
|
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)
|
queue_dl_item: QueueDownloadItem = self.media_to_queue_download_model(media)
|
||||||
|
|
||||||
if queue_dl_item:
|
if queue_dl_item:
|
||||||
@@ -957,15 +959,18 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
def on_preferences(self) -> None:
|
def on_preferences(self) -> None:
|
||||||
DialogPreferences(settings=self.settings, settings_save=self.s_settings_save, parent=self)
|
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
|
# 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:
|
if load_children:
|
||||||
list_item.removeChild(list_item.child(0))
|
item.removeRow(0)
|
||||||
media_list: [Mix | Album | Playlist | Artist] = list_item.data(1, QtCore.Qt.ItemDataRole.UserRole)
|
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):
|
def button_reload_status(self, status: bool):
|
||||||
button_text: str = "Reloading..."
|
button_text: str = "Reloading..."
|
||||||
|
|||||||
@@ -105,8 +105,10 @@ class FilterHeader(QtWidgets.QHeaderView):
|
|||||||
|
|
||||||
def sizeHint(self):
|
def sizeHint(self):
|
||||||
size = super().sizeHint()
|
size = super().sizeHint()
|
||||||
|
|
||||||
if self._editors:
|
if self._editors:
|
||||||
height = self._editors[0].sizeHint().height()
|
height = self._editors[0].sizeHint().height()
|
||||||
|
|
||||||
size.setHeight(size.height() + height + self._padding)
|
size.setHeight(size.height() + height + self._padding)
|
||||||
|
|
||||||
return size
|
return size
|
||||||
@@ -114,6 +116,7 @@ class FilterHeader(QtWidgets.QHeaderView):
|
|||||||
def updateGeometries(self):
|
def updateGeometries(self):
|
||||||
if self._editors:
|
if self._editors:
|
||||||
height = self._editors[0].sizeHint().height()
|
height = self._editors[0].sizeHint().height()
|
||||||
|
|
||||||
self.setViewportMargins(0, 0, 0, height + self._padding)
|
self.setViewportMargins(0, 0, 0, height + self._padding)
|
||||||
else:
|
else:
|
||||||
self.setViewportMargins(0, 0, 0, 0)
|
self.setViewportMargins(0, 0, 0, 0)
|
||||||
@@ -167,18 +170,25 @@ class HumanProxyModel(QtCore.QSortFilterProxyModel):
|
|||||||
|
|
||||||
@filters.setter
|
@filters.setter
|
||||||
def filters(self, filters):
|
def filters(self, filters):
|
||||||
print("filters() called.")
|
|
||||||
|
|
||||||
self._filters = filters
|
self._filters = filters
|
||||||
|
|
||||||
self.invalidateFilter()
|
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:
|
for i, text in self.filters:
|
||||||
if 0 <= i < self.columnCount():
|
if 0 <= i < self.columnCount():
|
||||||
ix = self.sourceModel().index(sourceRow, i, sourceParent)
|
ix = self.sourceModel().index(source_row, i, source_parent)
|
||||||
data = ix.data()
|
data = ix.data()
|
||||||
if str(data) in text:
|
|
||||||
return False
|
return bool(text.lower() in str(data).lower())
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|||||||
Reference in New Issue
Block a user