From f595d3cec4d71e2ef5fb095677c40f6c738169ab Mon Sep 17 00:00:00 2001 From: heliguy Date: Thu, 4 Jul 2024 19:12:26 -0400 Subject: [PATCH] Start triple pane UI and packages list --- src/host_info.py | 3 +- src/main.py | 1 + src/main_window/window.blp | 137 ++++++++++++++++------------ src/main_window/window.py | 17 ++-- src/meson.build | 6 +- src/packages_page/packages_page.blp | 43 +++++++++ src/packages_page/packages_page.py | 31 +++++++ src/warehouse.gresource.xml | 2 + src/widgets/app_row.blp | 15 +++ src/widgets/app_row.py | 16 ++++ 10 files changed, 201 insertions(+), 70 deletions(-) create mode 100644 src/packages_page/packages_page.blp create mode 100644 src/packages_page/packages_page.py create mode 100644 src/widgets/app_row.blp create mode 100644 src/widgets/app_row.py diff --git a/src/host_info.py b/src/host_info.py index f5f40bd..b98ebc3 100644 --- a/src/host_info.py +++ b/src/host_info.py @@ -41,7 +41,7 @@ class Flatpak: ) except GLib.GError as e: print(e) - icon_path = None + self.icon_path = None class Remote: @@ -79,6 +79,7 @@ class HostInfo: lines = output.strip().split("\n") for i in lines: this.flatpaks.append(Flatpak(i.split("\t"))) + this.flatpaks = sorted(this.flatpaks, key=lambda flatpak: flatpak.info["name"].lower()) Gio.Task.new(None, None, callback).run_in_thread(thread) diff --git a/src/main.py b/src/main.py index 1295026..c7b0a20 100644 --- a/src/main.py +++ b/src/main.py @@ -26,6 +26,7 @@ gi.require_version("Gtk", "4.0") gi.require_version("Adw", "1") from gi.repository import Gtk, Gio, Adw, GLib +from .host_info import HostInfo from .window import WarehouseWindow from .const import Config diff --git a/src/main_window/window.blp b/src/main_window/window.blp index e59ba94..9a2ab85 100644 --- a/src/main_window/window.blp +++ b/src/main_window/window.blp @@ -2,75 +2,92 @@ using Gtk 4.0; using Adw 1; template $WarehouseWindow: Adw.ApplicationWindow { - title: "Warehouse"; - content: - Adw.OverlaySplitView { - sidebar: - Adw.ToolbarView main_toolbar_view { - [top] - Adw.HeaderBar header_bar { - [end] - MenuButton main_menu { - icon-name: "open-menu-symbolic"; - tooltip-text: _("Main Menu"); - menu-model: primary_menu; - } - } + title: "Warehouse"; + Adw.Breakpoint main_breakpoint { + condition ("max-width: 865") + + setters { + main_split.collapsed: true; + main_split.max-sidebar-width: 280; } - ; - content: - Adw.NavigationPage { - title: "Test"; - Adw.ToolbarView { - [top] - Adw.HeaderBar {} - } - } - ; } - ; + content: + Adw.OverlaySplitView main_split { + sidebar-width-fraction: 0.2; + max-sidebar-width: 999999999; + sidebar: + Adw.NavigationPage { + title: "Warehouse"; + Adw.ToolbarView main_toolbar_view { + [top] + Adw.HeaderBar header_bar { + [start] + Button sidebar_button { + label: "SB"; + } + [end] + MenuButton main_menu { + icon-name: "open-menu-symbolic"; + tooltip-text: _("Main Menu"); + menu-model: primary_menu; + } + } + content: + ScrolledWindow { + ListBox { + Adw.ActionRow { + title: "test"; + } + } + } + ; + } + } + ; + } + ; } menu primary_menu { - section { - item { - label: _("Manage Leftover Data…"); - action: "app.manage-data-folders"; - } + section { + item { + label: _("Manage Leftover Data…"); + action: "app.manage-data-folders"; + } - /*item { - label: _("_Preferences"); - action: "app.preferences"; - }*/ - item { - label: _("Manage Remotes…"); - action: "app.show-remotes-window"; - } - } - section { - item { - label: _("Install From File…"); - action: "app.install-from-file"; + /*item { + label: _("_Preferences"); + action: "app.preferences"; + }*/ + item { + label: _("Manage Remotes…"); + action: "app.show-remotes-window"; + } } + section { + item { + label: _("Install From File…"); + action: "app.install-from-file"; + } - item { - label: _("Install From The Web…"); - action: "app.open-search-install"; - } - } - section { - item { - label: _("Refresh List"); - action: "app.refresh-list"; - } - item { - label: _("_Keyboard Shortcuts"); - action: "win.show-help-overlay"; + item { + label: _("Install From The Web…"); + action: "app.open-search-install"; + } } + section { + item { + label: _("Refresh List"); + action: "app.refresh-list"; + } + item { + label: _("_Keyboard Shortcuts"); + action: "win.show-help-overlay"; + } - item { - label: _("_About Warehouse"); - action: "app.about"; + item { + label: _("_About Warehouse"); + action: "app.about"; + } } - } } \ No newline at end of file diff --git a/src/main_window/window.py b/src/main_window/window.py index f3af6bf..a8b4e08 100644 --- a/src/main_window/window.py +++ b/src/main_window/window.py @@ -23,12 +23,16 @@ import re import time from gi.repository import Adw, Gdk, Gio, GLib, Gtk -from .host_info import HostInfo +from .packages_page import PackagesPage from .const import Config @Gtk.Template(resource_path="/io/github/flattool/Warehouse/main_window/window.ui") class WarehouseWindow(Adw.ApplicationWindow): __gtype_name__ = "WarehouseWindow" + gtc = Gtk.Template.Child + main_breakpoint = gtc() + main_split = gtc() + sidebar_button = gtc() def key_handler(self, controller, keyval, keycode, state): if keyval == Gdk.KEY_w and state == Gdk.ModifierType.CONTROL_MASK: @@ -61,11 +65,8 @@ class WarehouseWindow(Adw.ApplicationWindow): # file_drop.connect("drop", self.drop_callback) # self.scrolled_window.add_controller(file_drop) + self.main_split.set_content(PackagesPage(self)) + self.sidebar_button.connect("clicked", lambda *_: self.main_split.set_show_sidebar(False)) + if Config.DEVEL: - self.add_css_class("devel") - - def guh(*args): - for i in HostInfo.flatpaks: - print(i.info["name"]) - - HostInfo.get_flatpaks() \ No newline at end of file + self.add_css_class("devel") \ No newline at end of file diff --git a/src/meson.build b/src/meson.build index 81f232d..1830fc4 100644 --- a/src/meson.build +++ b/src/meson.build @@ -4,8 +4,10 @@ gnome = import('gnome') blueprints = custom_target('blueprints', input: files( + 'widgets/app_row.blp', 'gtk/help-overlay.blp', 'main_window/window.blp', + 'packages_page/packages_page.blp' ), output: '.', command: [find_program('blueprint-compiler'), 'batch-compile', '@OUTPUT@', '@CURRENT_SOURCE_DIR@', '@INPUT@'], @@ -47,8 +49,10 @@ configure_file( warehouse_sources = [ '__init__.py', 'main.py', - 'main_window/window.py', 'host_info.py', + 'widgets/app_row.py', + 'main_window/window.py', + 'packages_page/packages_page.py', '../data/style.css', ] diff --git a/src/packages_page/packages_page.blp b/src/packages_page/packages_page.blp new file mode 100644 index 0000000..3c75834 --- /dev/null +++ b/src/packages_page/packages_page.blp @@ -0,0 +1,43 @@ +using Gtk 4.0; +using Adw 1; + +template $PackagesPage : Adw.BreakpointBin { + width-request: 1; + height-request: 1; + + Adw.Breakpoint packages_bpt { + condition ("max-width: 625") + } + + Adw.NavigationSplitView { + sidebar-width-fraction: 0.4; + max-sidebar-width: 999999999; + sidebar: + Adw.NavigationPage { + title: "Packages"; + Adw.ToolbarView { + [top] + Adw.HeaderBar { + [start] + Button sidebar_button { + label: "SB"; + } + } + ScrolledWindow { + ListBox packages_list_box { + styles ["navigation-sidebar"] + } + } + } + } + ; + content: + Adw.NavigationPage { + title: "Properties"; + Adw.StatusPage { + title: "Properties Panel"; + } + } + ; + } +} \ No newline at end of file diff --git a/src/packages_page/packages_page.py b/src/packages_page/packages_page.py new file mode 100644 index 0000000..16cac9a --- /dev/null +++ b/src/packages_page/packages_page.py @@ -0,0 +1,31 @@ +from gi.repository import Adw, Gtk, GLib, Gio, Pango +from .host_info import HostInfo +from .app_row import AppRow + +@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_list_box = gtc() + sidebar_button = gtc() + + package_rows = [] + + def generate_list(self, *args): + for package in HostInfo.flatpaks: + self.packages_list_box.append(AppRow(package)) + + def row_select_handler(self, list_box, row): + print(row.get_title()) + + def sidebar_button_visibility_handler(self): + self.sidebar_button.set_visible(self.main_window.main_split.get_collapsed() or not self.main_window.main_split.get_show_sidebar()) + + def __init__(self, main_window, **kwargs): + super().__init__(**kwargs) + self.main_window = main_window + HostInfo.get_flatpaks(self.generate_list) + self.sidebar_button.connect("clicked", lambda *_: main_window.main_split.set_show_sidebar(True)) + main_window.main_split.connect("notify::show-sidebar", lambda sidebar, *_: self.sidebar_button.set_visible(sidebar.get_collapsed() or not sidebar.get_show_sidebar())) + main_window.main_split.connect("notify::collapsed", lambda sidebar, *_: self.sidebar_button.set_visible) + # self.packages_list_box.connect("row-selected", self.row_select_handler) diff --git a/src/warehouse.gresource.xml b/src/warehouse.gresource.xml index 403e1c6..7bf11fc 100644 --- a/src/warehouse.gresource.xml +++ b/src/warehouse.gresource.xml @@ -2,7 +2,9 @@ ../data/style.css + widgets/app_row.ui main_window/window.ui + packages_page/packages_page.ui gtk/help-overlay.ui diff --git a/src/widgets/app_row.blp b/src/widgets/app_row.blp new file mode 100644 index 0000000..7db98d9 --- /dev/null +++ b/src/widgets/app_row.blp @@ -0,0 +1,15 @@ +using Gtk 4.0; +using Adw 1; + +template $AppRow : Adw.ActionRow { + [prefix] + Image image { + icon-size: large; + icon-name: "application-x-executable-symbolic"; + } + [suffix] + CheckButton check_button { + styles["selection-mode"] + visible: false; + } +} \ No newline at end of file diff --git a/src/widgets/app_row.py b/src/widgets/app_row.py new file mode 100644 index 0000000..a39a43c --- /dev/null +++ b/src/widgets/app_row.py @@ -0,0 +1,16 @@ +from gi.repository import Adw, Gtk, GLib, Gio, Pango +from .host_info import HostInfo + +@Gtk.Template(resource_path="/io/github/flattool/Warehouse/widgets/app_row.ui") +class AppRow(Adw.ActionRow): + __gtype_name__ = 'AppRow' + gtc = Gtk.Template.Child + image = gtc() + + def __init__(self, package, **kwargs): + super().__init__(**kwargs) + self.package = package + self.set_title(package.info["name"]) + self.set_subtitle(package.info["id"]) + if package.icon_path: + self.image.set_from_file(package.icon_path) \ No newline at end of file