From 2bc62fc2a2de51474382ecbb65855503b4fb1c0b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 11 Jun 2025 14:35:56 +0200 Subject: [PATCH] added helper buttons --- .../ayon_core/tools/loader/ui/search_bar.py | 61 +++++++++++++++++++ client/ayon_core/tools/loader/ui/window.py | 1 + 2 files changed, 62 insertions(+) diff --git a/client/ayon_core/tools/loader/ui/search_bar.py b/client/ayon_core/tools/loader/ui/search_bar.py index b2c0e73bb5..bf04fec926 100644 --- a/client/ayon_core/tools/loader/ui/search_bar.py +++ b/client/ayon_core/tools/loader/ui/search_bar.py @@ -315,10 +315,30 @@ class FilterValueItemsView(QtWidgets.QWidget): scroll_area.setWidget(content_widget) + btns_widget = QtWidgets.QWidget(self) + btns_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground, True) + + select_all_btn = QtWidgets.QPushButton("Select all", btns_widget) + clear_btn = QtWidgets.QPushButton("Clear", btns_widget) + swap_btn = QtWidgets.QPushButton("Swap", btns_widget) + + btns_layout = QtWidgets.QHBoxLayout(btns_widget) + btns_layout.setContentsMargins(0, 0, 0, 0) + btns_layout.addStretch(1) + btns_layout.addWidget(select_all_btn, 0) + btns_layout.addWidget(clear_btn, 0) + btns_layout.addWidget(swap_btn, 0) + main_layout = QtWidgets.QVBoxLayout(self) main_layout.setContentsMargins(0, 0, 0, 0) main_layout.addWidget(scroll_area) + main_layout.addWidget(btns_widget, 0) + select_all_btn.clicked.connect(self._on_select_all) + clear_btn.clicked.connect(self._on_clear_selection) + swap_btn.clicked.connect(self._on_swap_selection) + + self._btns_widget = btns_widget self._multiselection = False self._content_layout = content_layout self._last_selected_widget = None @@ -368,6 +388,11 @@ class FilterValueItemsView(QtWidgets.QWidget): def set_multiselection(self, multiselection: bool): self._multiselection = multiselection + if not self._widgets_by_id or not self._multiselection: + self._btns_widget.setVisible(False) + else: + self._btns_widget.setVisible(True) + if not self._widgets_by_id or self._multiselection: return @@ -422,9 +447,45 @@ class FilterValueItemsView(QtWidgets.QWidget): empty_label = QtWidgets.QLabel( "No items to select from...", self ) + self._btns_widget.setVisible(False) self._content_layout.addWidget(empty_label, 0) + else: + self._btns_widget.setVisible(self._multiselection) self._content_layout.addStretch(1) + def _on_select_all(self): + changed = False + for widget in self._widgets_by_id.values(): + if not widget.is_selected(): + changed = True + widget.set_selected(True) + if self._last_selected_widget is None: + self._last_selected_widget = widget + + if changed: + self.value_changed.emit() + + def _on_swap_selection(self): + self._last_selected_widget = None + for widget in self._widgets_by_id.values(): + selected = not widget.is_selected() + widget.set_selected(selected) + if selected and self._last_selected_widget is None: + self._last_selected_widget = widget + + self.value_changed.emit() + + def _on_clear_selection(self): + self._last_selected_widget = None + changed = False + for widget in self._widgets_by_id.values(): + if widget.is_selected(): + changed = True + widget.set_selected(False) + + if changed: + self.value_changed.emit() + def _on_item_clicked(self, widget_id): widget = self._widgets_by_id.get(widget_id) if widget is None: diff --git a/client/ayon_core/tools/loader/ui/window.py b/client/ayon_core/tools/loader/ui/window.py index 1e2904b667..6f87e95375 100644 --- a/client/ayon_core/tools/loader/ui/window.py +++ b/client/ayon_core/tools/loader/ui/window.py @@ -451,6 +451,7 @@ class LoaderWindow(QtWidgets.QWidget): elif filter_name == "product_types": product_types = self._search_bar.get_filter_value("product_types") self._products_widget.set_product_type_filter(product_types) + elif filter_name == "statuses": status_names = self._search_bar.get_filter_value("statuses") self._products_widget.set_statuses_filter(status_names)