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