From e00ec3f86a7fcd5e659c6f25971c8fbb6199f2bd Mon Sep 17 00:00:00 2001 From: heliguy Date: Wed, 10 Jul 2024 14:53:52 -0400 Subject: [PATCH] Add filters page ui --- src/filters_page/filters_page.blp | 118 ++++++++++++++++++++++++ src/filters_page/filters_page.py | 11 +++ src/meson.build | 2 + src/packages_page/packages_page.blp | 19 +++- src/packages_page/packages_page.py | 27 +++++- src/properties_page/properties_page.blp | 2 - src/warehouse.gresource.xml | 1 + 7 files changed, 169 insertions(+), 11 deletions(-) create mode 100644 src/filters_page/filters_page.blp create mode 100644 src/filters_page/filters_page.py diff --git a/src/filters_page/filters_page.blp b/src/filters_page/filters_page.blp new file mode 100644 index 0000000..afa07a1 --- /dev/null +++ b/src/filters_page/filters_page.blp @@ -0,0 +1,118 @@ +using Gtk 4.0; +using Adw 1; + +template $FiltersPage : Adw.NavigationPage { + title: _("Filter Packages"); + Adw.ToolbarView { + [top] + Adw.HeaderBar {} + ScrolledWindow { + Adw.Clamp { + Box { + margin-start: 12; + margin-end: 12; + margin-bottom: 12; + orientation: vertical; + halign: fill; + spacing: 24; + Adw.PreferencesGroup { + title: _("Package Type"); + description: _("Show packages of these types"); + header-suffix: + Button all_types_button { + Adw.ButtonContent { + label: _("Select All"); + icon-name: "selection-mode-symbolic"; + } + valign: center; + styles ["flat"] + } + ; + Adw.ActionRow application_row { + title: _("Applications"); + subtitle: _("Packages that can be opened"); + CheckButton app_check { + styles["selection-mode"] + } + activatable-widget: app_check; + } + Adw.ActionRow runtime_row { + title: _("Runtimes"); + subtitle: _("Packages that applications depend on"); + CheckButton runtime-check { + styles["selection-mode"] + } + activatable-widget: runtime-check; + } + } + Adw.PreferencesGroup { + title: _("Remotes"); + description: _("Show packages from these remotes"); + header-suffix: + Button all_remotes_button { + Adw.ButtonContent { + label: _("Select All"); + icon-name: "selection-mode-symbolic"; + } + valign: center; + styles ["flat"] + } + ; + Adw.ActionRow { + title: _("Flathub"); + subtitle: _("Installation: User"); + CheckButton { + styles["selection-mode"] + } + } + Adw.ActionRow { + title: _("Flathub"); + subtitle: _("Installation: System"); + CheckButton { + styles["selection-mode"] + } + } + } + Adw.PreferencesGroup { + title: _("Runtimes"); + description: _("Show apps that use these runtimes"); + header-suffix: + Button all_runtimes_button { + Adw.ButtonContent { + label: _("Select All"); + icon-name: "selection-mode-symbolic"; + } + valign: center; + styles ["flat"] + } + ; + Adw.ActionRow { + title: _("org.freedesktop.Platform.ffmpeg-full/x86_64/23.08"); + CheckButton { + styles["selection-mode"] + } + } + Adw.ActionRow { + title: _("org.gnome.Platform/x86_64/44"); + CheckButton { + styles["selection-mode"] + } + } + Adw.ActionRow { + title: _("org.gnome.Platform/x86_64/45"); + CheckButton { + styles["selection-mode"] + } + } + Adw.ActionRow { + title: _("org.freedesktop.Platform.Compat.i386/x86_64/23.08"); + CheckButton { + styles["selection-mode"] + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/filters_page/filters_page.py b/src/filters_page/filters_page.py new file mode 100644 index 0000000..8a425d6 --- /dev/null +++ b/src/filters_page/filters_page.py @@ -0,0 +1,11 @@ +from gi.repository import Adw, Gtk, GLib#, Gio, Pango +from .host_info import HostInfo + +@Gtk.Template(resource_path="/io/github/flattool/Warehouse/filters_page/filters_page.ui") +class FiltersPage(Adw.NavigationPage): + __gtype_name__ = 'FiltersPage' + gtc = Gtk.Template.Child + + def __init__(self, main_window, packages_page, **kwargs): + super().__init__(**kwargs) + # self.connect("hidden", lambda *_: packages_page.filter_button.set_active(False)) \ No newline at end of file diff --git a/src/meson.build b/src/meson.build index 16a4967..9c2023e 100644 --- a/src/meson.build +++ b/src/meson.build @@ -9,6 +9,7 @@ blueprints = custom_target('blueprints', 'gtk/help-overlay.blp', 'main_window/window.blp', 'packages_page/packages_page.blp', + 'filters_page/filters_page.blp', 'properties_page/properties_page.blp', 'change_version_page/change_version_page.blp', ), @@ -58,6 +59,7 @@ warehouse_sources = [ 'widgets/status_box.py', 'main_window/window.py', 'packages_page/packages_page.py', + 'filters_page/filters_page.py', 'properties_page/properties_page.py', 'change_version_page/change_version_page.py', '../data/style.css', diff --git a/src/packages_page/packages_page.blp b/src/packages_page/packages_page.blp index 417479e..448927c 100644 --- a/src/packages_page/packages_page.blp +++ b/src/packages_page/packages_page.blp @@ -11,6 +11,7 @@ template $PackagesPage : Adw.BreakpointBin { setters { packages_split.collapsed: true; packages_split.show-content: false; + content_stack.transition-duration: 9999999; } } @@ -42,16 +43,16 @@ template $PackagesPage : Adw.BreakpointBin { tooltip-text: _("Search Packages"); } [start] - Button filter_button { - icon-name: "funnel-symbolic"; - tooltip-text: _("Filter Packages"); - } - [end] Button refresh_button { icon-name: "arrow-circular-top-right-symbolic"; tooltip-text: _("Refresh List"); } [end] + ToggleButton filter_button { + icon-name: "funnel-symbolic"; + tooltip-text: _("Filter Packages"); + } + [end] ToggleButton select_button { icon-name: "selection-mode-symbolic"; tooltip-text: _("Select Packages"); @@ -108,6 +109,14 @@ template $PackagesPage : Adw.BreakpointBin { } } ; + content: + Adw.NavigationPage { + title: "Content Stack"; + Stack content_stack { + transition-type: slide_left_right; + } + } + ; } } } diff --git a/src/packages_page/packages_page.py b/src/packages_page/packages_page.py index b19c2a9..29e7d84 100644 --- a/src/packages_page/packages_page.py +++ b/src/packages_page/packages_page.py @@ -4,15 +4,18 @@ from .app_row import AppRow from .error_toast import ErrorToast from .properties_page import PropertiesPage from .status_box import StatusBox +from .filters_page import FiltersPage @Gtk.Template(resource_path="/io/github/flattool/Warehouse/packages_page/packages_page.ui") class PackagesPage(Adw.BreakpointBin): __gtype_name__ = 'PackagesPage' gtc = Gtk.Template.Child + packages_bpt = gtc() packages_toast_overlay = gtc() stack = gtc() scrolled_window = gtc() sidebar_button = gtc() + filter_button = gtc() refresh_button = gtc() search_bar = gtc() search_entry = gtc() @@ -21,6 +24,7 @@ class PackagesPage(Adw.BreakpointBin): select_button = gtc() packages_navpage = gtc() status_view = gtc() + content_stack = gtc() # Referred to in the main window # It is used to determine if a new page should be made or not @@ -52,6 +56,7 @@ class PackagesPage(Adw.BreakpointBin): self.properties_page.set_properties(row.package) self.properties_page.nav_view.pop() self.packages_split.set_show_content(True) + self.filter_button.set_active(False) def filter_func(self, row): search_text = self.search_entry.get_text().lower() @@ -80,18 +85,32 @@ class PackagesPage(Adw.BreakpointBin): def select_button_handler(self, button): self.set_selection_mode(button.get_active()) + def filter_button_handler(self, button): + if button.get_active(): + self.content_stack.set_visible_child(self.filters_page) + self.packages_split.set_show_content(True) + else: + self.content_stack.set_visible_child(self.properties_page) + + def filter_page_handler(self, *args): + if self.packages_split.get_collapsed() and not self.packages_split.get_show_content(): + self.filter_button.set_active(False) + def __init__(self, main_window, **kwargs): super().__init__(**kwargs) # Extra Object Creation self.main_window = main_window self.properties_page = PropertiesPage(main_window) + self.filters_page = FiltersPage(main_window, self) + self.loading_status = StatusBox(_("Fetching Packages"), _("This should only take a moment")) # Apply HostInfo.get_flatpaks(callback=self.generate_list) self.packages_list_box.set_filter_func(self.filter_func) - self.packages_split.set_content(self.properties_page) + self.content_stack.add_child(self.properties_page) + self.content_stack.add_child(self.filters_page) self.__class__.instance = self # Connections @@ -103,7 +122,7 @@ class PackagesPage(Adw.BreakpointBin): self.search_bar.set_key_capture_widget(main_window) self.packages_list_box.connect("row-activated", self.row_select_handler) self.refresh_button.connect("clicked", self.refresh_button_handler) - self.select_button.connect("clicked", self.select_button_handler) - - self.loading_status = StatusBox(_("Fetching Packages"), _("This should only take a moment")) + self.filter_button.connect("toggled", self.filter_button_handler) + self.packages_split.connect("notify::show-content", self.filter_page_handler) + self.packages_bpt.connect("apply", self.filter_page_handler) \ No newline at end of file diff --git a/src/properties_page/properties_page.blp b/src/properties_page/properties_page.blp index 84db7ec..9e47f9f 100644 --- a/src/properties_page/properties_page.blp +++ b/src/properties_page/properties_page.blp @@ -51,7 +51,6 @@ template $PropertiesPage : Adw.NavigationPage { margin-bottom: 12; orientation: vertical; halign: fill; - hexpand: true; Image app_icon { pixel-size: 100; @@ -147,7 +146,6 @@ template $PropertiesPage : Adw.NavigationPage { Adw.ExpanderRow version_row { title: _("Version"); styles ["property"] - expanded: true; [suffix] Label mask_label { label: _("Updates Disabled"); diff --git a/src/warehouse.gresource.xml b/src/warehouse.gresource.xml index cb2aebd..52f9312 100644 --- a/src/warehouse.gresource.xml +++ b/src/warehouse.gresource.xml @@ -6,6 +6,7 @@ widgets/app_row.ui main_window/window.ui packages_page/packages_page.ui + filters_page/filters_page.ui properties_page/properties_page.ui change_version_page/change_version_page.ui widgets/status_box.ui