From 027c0c63c9c73b48ac4bbd2bfb5029620da7ef18 Mon Sep 17 00:00:00 2001 From: heliguy Date: Sun, 21 Jul 2024 14:42:00 -0400 Subject: [PATCH] Add UI for remote actions --- src/main_window/window.py | 9 +++++- src/meson.build | 2 ++ src/remotes_page/remote_row.blp | 43 +++++++++++++++++++++++++++++ src/remotes_page/remote_row.py | 46 +++++++++++++++++++++++++++++++ src/remotes_page/remotes_page.blp | 15 ++-------- src/remotes_page/remotes_page.py | 17 ++++++++++-- src/warehouse.gresource.xml | 1 + 7 files changed, 117 insertions(+), 16 deletions(-) create mode 100644 src/remotes_page/remote_row.blp create mode 100644 src/remotes_page/remote_row.py diff --git a/src/main_window/window.py b/src/main_window/window.py index 32cabf1..d42b5eb 100644 --- a/src/main_window/window.py +++ b/src/main_window/window.py @@ -75,6 +75,13 @@ class WarehouseWindow(Adw.ApplicationWindow): self.refresh_button.set_sensitive(False) HostInfo.get_flatpaks(callback=self.end_loading) + def activate_row(self, nav_row): + idx = 0 + while row := self.navigation_row_listbox.get_row_at_index(idx): + idx += 1 + if row.get_child() is nav_row: + row.activate() + def __init__(self, **kwargs): super().__init__(**kwargs) @@ -109,7 +116,7 @@ class WarehouseWindow(Adw.ApplicationWindow): # file_drop.connect("drop", self.drop_callback) self.refresh_button.connect("clicked", self.refresh_handler) - self.navigation_row_listbox.get_row_at_index(1).activate() + self.activate_row(self.remotes_row) self.main_split.set_show_sidebar(True) self.start_loading() diff --git a/src/meson.build b/src/meson.build index 16f2ae2..ad607ca 100644 --- a/src/meson.build +++ b/src/meson.build @@ -14,6 +14,7 @@ blueprints = custom_target('blueprints', 'user_data_page/user_data_page.blp', 'user_data_page/data_subpage.blp', 'remotes_page/remotes_page.blp', + 'remotes_page/remote_row.blp', 'change_version_page/change_version_page.blp', ), output: '.', @@ -68,6 +69,7 @@ warehouse_sources = [ 'user_data_page/user_data_page.py', 'user_data_page/data_subpage.py', 'remotes_page/remotes_page.py', + 'remotes_page/remote_row.py', '../data/style.css', ] diff --git a/src/remotes_page/remote_row.blp b/src/remotes_page/remote_row.blp new file mode 100644 index 0000000..86f3004 --- /dev/null +++ b/src/remotes_page/remote_row.blp @@ -0,0 +1,43 @@ +using Gtk 4.0; +using Adw 1; + +template $RemoteRow : Adw.ActionRow { + [suffix] + Label suffix_label { + styles ["subtitle"] + margin-end: 6; + } + [suffix] + Button { + styles ["flat"] + valign: center; + icon-name: "funnel-symbolic"; + tooltip-text: _("Set a Filter for this Remote"); + } + [suffix] + MenuButton menu_button { + styles ["flat"] + valign: center; + popover: menu_pop; + icon-name: "view-more-symbolic"; + tooltip-text: _("More Actions"); + } +} + +Popover menu_pop { + styles ["menu"] + ListBox menu_listbox { + Label copy_title { + label: _("Copy Title"); + halign: start; + } + Label copy_name { + label: _("Copy Name"); + halign: start; + } + Label remove { + label: _("Remove"); + halign: start; + } + } +} \ No newline at end of file diff --git a/src/remotes_page/remote_row.py b/src/remotes_page/remote_row.py new file mode 100644 index 0000000..22ca980 --- /dev/null +++ b/src/remotes_page/remote_row.py @@ -0,0 +1,46 @@ +from gi.repository import Adw, Gtk, GLib, Gio, Pango +from .host_info import HostInfo + +@Gtk.Template(resource_path="/io/github/flattool/Warehouse/remotes_page/remote_row.ui") +class RemoteRow(Adw.ActionRow): + __gtype_name__ = 'RemoteRow' + gtc = Gtk.Template.Child + + suffix_label = gtc() + menu_pop = gtc() + menu_listbox = gtc() + + copy_title = gtc() + copy_name = gtc() + remove = gtc() + + def on_menu_action(self, listbox, row): + row = row.get_child() + if row is self.copy_title: + HostInfo.clipboard.set(self.get_title()) + self.parent_page.toast_overlay.add_toast(Adw.Toast(title=_("Copied title"))) + elif row is self.copy_name: + HostInfo.clipboard.set(self.get_subtitle()) + self.parent_page.toast_overlay.add_toast(Adw.Toast(title=_("Copied name"))) + elif row is self.remove: + print("remove") + self.menu_pop.popdown() + + def idle_stuff(self): + self.set_title(self.remote.title) + self.set_subtitle(_("Installation: {}").format(self.installation)) + self.suffix_label.set_label(self.remote.name) + + def __init__(self, parent_page, installation, remote, **kwargs): + super().__init__(**kwargs) + + # Extra Object Creation + self.parent_page = parent_page + self.remote = remote + self.installation = installation + + # Apply + GLib.idle_add(lambda *_: self.idle_stuff()) + + # Connections + self.menu_listbox.connect("row-activated", self.on_menu_action) \ No newline at end of file diff --git a/src/remotes_page/remotes_page.blp b/src/remotes_page/remotes_page.blp index 613fc17..6985999 100644 --- a/src/remotes_page/remotes_page.blp +++ b/src/remotes_page/remotes_page.blp @@ -28,7 +28,7 @@ template $RemotesPage : Adw.NavigationPage { } } } - Adw.ToastOverlay { + Adw.ToastOverlay toast_overlay { Stack stack { Adw.StatusPage loading_remotes { title: _("Loading Remotes"); @@ -50,20 +50,11 @@ template $RemotesPage : Adw.NavigationPage { icon-name: "error-symbolic"; } Adw.PreferencesPage content_page { - Adw.PreferencesGroup current_remotes { + Adw.PreferencesGroup current_remotes_group { title: _("Current Remotes"); description: _("Remotes available on your system"); - Adw.ActionRow { - title: "test"; - } - Adw.ActionRow { - title: "test"; - } - Adw.ActionRow { - title: "test"; - } } - Adw.PreferencesGroup new_remotes { + Adw.PreferencesGroup new_remotes_group { title: _("Add Remotes"); description: _("Add new remotes to get more software"); Adw.ActionRow { diff --git a/src/remotes_page/remotes_page.py b/src/remotes_page/remotes_page.py index a4075c7..710ff5d 100644 --- a/src/remotes_page/remotes_page.py +++ b/src/remotes_page/remotes_page.py @@ -1,6 +1,7 @@ from gi.repository import Adw, Gtk, GLib, Gio from .host_info import HostInfo from .error_toast import ErrorToast +from .remote_row import RemoteRow import subprocess @Gtk.Template(resource_path="/io/github/flattool/Warehouse/remotes_page/remotes_page.ui") @@ -10,9 +11,10 @@ class RemotesPage(Adw.NavigationPage): sidebar_button = gtc() search_bar = gtc() + toast_overlay = gtc() stack = gtc() - current_remotes = gtc() - new_remotes = gtc() + current_remotes_group = gtc() + new_remotes_group = gtc() # Statuses loading_remotes = gtc() @@ -26,17 +28,26 @@ class RemotesPage(Adw.NavigationPage): def start_loading(self): self.stack.set_visible_child(self.loading_remotes) + for row in self.current_remote_rows: + self.current_remotes_group.remove(row) + self.current_remote_rows.clear() def end_loading(self): self.stack.set_visible_child(self.content_page) + for install in HostInfo.installations: + for remote in HostInfo.remotes[install]: + row = RemoteRow(self, install, remote) + self.current_remotes_group.add(row) + self.current_remote_rows.append(row) def __init__(self, main_window, **kwargs): super().__init__(**kwargs) # Extra Object Creation + self.__class__.instance = self ms = main_window.main_split self.search_bar.set_key_capture_widget(main_window) - self.__class__.instance = self + self.current_remote_rows = [] # Connections ms.connect("notify::show-sidebar", lambda *_: self.sidebar_button.set_active(ms.get_show_sidebar())) diff --git a/src/warehouse.gresource.xml b/src/warehouse.gresource.xml index d16d910..043a096 100644 --- a/src/warehouse.gresource.xml +++ b/src/warehouse.gresource.xml @@ -13,6 +13,7 @@ user_data_page/user_data_page.ui user_data_page/data_subpage.ui remotes_page/remotes_page.ui + remotes_page/remote_row.ui