diff --git a/src/Core/FlatpakBackend.vala b/src/Core/FlatpakBackend.vala index 66bdb060a..c82a4776f 100644 --- a/src/Core/FlatpakBackend.vala +++ b/src/Core/FlatpakBackend.vala @@ -20,8 +20,9 @@ public class AppCenterCore.FlatpakPackage : Package { public weak Flatpak.Installation installation { public get; construct; } - public FlatpakPackage (Flatpak.Installation installation, AppStream.Component component) { + public FlatpakPackage (string uid, Flatpak.Installation installation, AppStream.Component component) { Object ( + uid: uid, installation: installation, component: component ); @@ -233,7 +234,7 @@ public class AppCenterCore.FlatpakBackend : Object { runtime_updates_component.summary = _("Updates to app runtimes"); runtime_updates_component.add_icon (runtime_icon); - runtime_updates = new AppCenterCore.Package (runtime_updates_component); + runtime_updates = new AppCenterCore.Package ("runtime-updates", runtime_updates_component); additional_updates = new GLib.ListStore (typeof (Package)); additional_updates.append (runtime_updates); @@ -400,6 +401,14 @@ public class AppCenterCore.FlatpakBackend : Object { get_updates.begin (null); } + public Package? get_package_by_uid (string uid) { + if (uid == runtime_updates.uid) { + return runtime_updates; + } + + return package_list[uid]; + } + public void notify_package_changed (Package package) { GLib.ListStore store; if (package.is_runtime_updates) { @@ -1332,7 +1341,7 @@ public class AppCenterCore.FlatpakBackend : Object { if (package != null) { package.replace_component (comp); } else { - package = new FlatpakPackage (user_installation, comp); + package = new FlatpakPackage (key, user_installation, comp); } new_package_list[key] = package; @@ -1361,7 +1370,7 @@ public class AppCenterCore.FlatpakBackend : Object { if (package != null) { package.replace_component (comp); } else { - package = new FlatpakPackage (system_installation, comp); + package = new FlatpakPackage (key, system_installation, comp); } new_package_list[key] = package; @@ -2248,7 +2257,7 @@ public class AppCenterCore.FlatpakBackend : Object { user_appstream_pool.add_components (component_box); - var package = new AppCenterCore.FlatpakPackage (user_installation, component); + var package = new AppCenterCore.FlatpakPackage (id, user_installation, component); package_list[id] = package; return package; diff --git a/src/Core/Package.vala b/src/Core/Package.vala index 4bba1058b..05cfbd84e 100644 --- a/src/Core/Package.vala +++ b/src/Core/Package.vala @@ -103,6 +103,8 @@ public class AppCenterCore.Package : Object { public const string LOCAL_ID_SUFFIX = ".appcenter-local"; public const string DEFAULT_PRICE_DOLLARS = "1"; + public string uid { get; construct; } + public AppStream.Component component { get; protected set; } public ChangeInformation change_information { public get; private set; } public GLib.Cancellable action_cancellable { public get; private set; } @@ -427,8 +429,8 @@ public class AppCenterCore.Package : Object { action_cancellable = new GLib.Cancellable (); } - public Package (AppStream.Component component) { - Object (component: component); + public Package (string uid, AppStream.Component component) { + Object (uid: uid, component: component); } public void replace_component (AppStream.Component component) { diff --git a/src/MainWindow.vala b/src/MainWindow.vala index edd70cd4a..ca7b64d5b 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -15,6 +15,9 @@ */ public class AppCenter.MainWindow : Gtk.ApplicationWindow { + public const string ACTION_PREFIX = "win."; + public const string ACTION_SHOW_PACKAGE = "show-package"; + private Granite.Toast toast; private Adw.NavigationView navigation_view; private Granite.OverlayBar overlaybar; @@ -117,6 +120,10 @@ public class AppCenter.MainWindow : Gtk.ApplicationWindow { child = box; titlebar = new Gtk.Grid () { visible = false }; + var show_package_action = new SimpleAction (ACTION_SHOW_PACKAGE, VariantType.STRING); + show_package_action.activate.connect (on_show_package); + add_action (show_package_action); + var network_monitor = NetworkMonitor.get_default (); network_monitor.bind_property ("network-available", network_info_bar, "revealed", BindingFlags.INVERT_BOOLEAN | BindingFlags.SYNC_CREATE); @@ -128,10 +135,6 @@ public class AppCenter.MainWindow : Gtk.ApplicationWindow { show_category (category); }); - homepage.show_package.connect ((package) => { - show_package (package); - }); - navigation_view.popped.connect (update_navigation); navigation_view.pushed.connect (update_navigation); @@ -144,10 +147,6 @@ public class AppCenter.MainWindow : Gtk.ApplicationWindow { if (installed_view == null) { installed_view = new Views.AppListUpdateView (); - - installed_view.show_app.connect ((package) => { - show_package (package); - }); } } @@ -164,6 +163,15 @@ public class AppCenter.MainWindow : Gtk.ApplicationWindow { return true; } + private void on_show_package (SimpleAction action, Variant? param) { + var uid = param.get_string (); + var package = AppCenterCore.FlatpakBackend.get_default ().get_package_by_uid (uid); + + if (package != null) { + show_package (package); + } + } + public void show_package (AppCenterCore.Package package) { var pk_child = navigation_view.find_page (package.hash); if (pk_child != null) { @@ -180,11 +188,8 @@ public class AppCenter.MainWindow : Gtk.ApplicationWindow { } } - var app_info_view = new Views.AppInfoView (package); - navigation_view.push (app_info_view); + navigation_view.push (new Views.AppInfoView (package)); navigation_view.animate_transitions = true; - - app_info_view.show_other_package.connect (show_package); } private void update_navigation () { @@ -204,10 +209,6 @@ public class AppCenter.MainWindow : Gtk.ApplicationWindow { mimetype = mimetype }; - search_view.show_app.connect ((package) => { - show_package (package); - }); - navigation_view.push (search_view); } @@ -235,12 +236,6 @@ public class AppCenter.MainWindow : Gtk.ApplicationWindow { } private void show_category (AppStream.Category category) { - var category_view = new CategoryView (category); - - navigation_view.push (category_view); - - category_view.show_app.connect ((package) => { - show_package (package); - }); + navigation_view.push (new CategoryView (category)); } } diff --git a/src/Views/AppInfoView.vala b/src/Views/AppInfoView.vala index bcecfe3a7..168dc7989 100644 --- a/src/Views/AppInfoView.vala +++ b/src/Views/AppInfoView.vala @@ -25,8 +25,6 @@ public class AppCenter.Views.AppInfoView : Adw.NavigationPage { @define-color banner_fg_color %s; """; - public signal void show_other_package (AppCenterCore.Package package); - public AppCenterCore.Package package { get; construct set; } GenericArray screenshots; @@ -37,7 +35,6 @@ public class AppCenter.Views.AppInfoView : Adw.NavigationPage { private Gtk.DropDown origin_dropdown; private Gtk.Label app_subtitle; private Gtk.Overlay screenshot_overlay; - private Gtk.Revealer origin_combo_revealer; private Adw.Carousel screenshot_carousel; private Adw.Clamp screenshot_not_found_clamp; private Gtk.Stack screenshot_stack; @@ -180,11 +177,14 @@ public class AppCenter.Views.AppInfoView : Adw.NavigationPage { factory = list_factory }; - origin_combo_revealer = new Gtk.Revealer () { - child = origin_dropdown, - overflow = VISIBLE, - transition_type = SLIDE_DOWN - }; + foreach (var origin_package in package.origin_packages) { + origin_liststore.append (origin_package); + if (origin_package == package) { + origin_dropdown.selected = origin_liststore.n_items - 1; + } + } + + origin_dropdown.visible = origin_liststore.n_items > 1; var header_grid = new Gtk.Grid () { column_spacing = 12, @@ -192,7 +192,7 @@ public class AppCenter.Views.AppInfoView : Adw.NavigationPage { }; header_grid.attach (app_title, 0, 0); header_grid.attach (app_subtitle, 0, 1, 2); - header_grid.attach (origin_combo_revealer, 0, 2, 2); + header_grid.attach (origin_dropdown, 0, 2, 2); if (!package.is_local) { size_label = new Widgets.SizeLabel () { @@ -673,12 +673,9 @@ public class AppCenter.Views.AppInfoView : Adw.NavigationPage { }); } - var addon_list = new AddonList (package); - addon_list.show_addon.connect ((package) => show_other_package (package)); - var link_listbox = new LinkListBox (package_component); - content_box.append (addon_list); + content_box.append (new AddonList (package)); content_box.append (link_listbox); var body_clamp = new Adw.Clamp () { @@ -686,12 +683,6 @@ public class AppCenter.Views.AppInfoView : Adw.NavigationPage { maximum_size = MAX_WIDTH }; - var author_view = new AuthorView (package, MAX_WIDTH); - - author_view.show_other_package.connect ((package) => { - show_other_package (package); - }); - var box = new Gtk.Box (Gtk.Orientation.VERTICAL, 12); box.append (header); box.append (content_warning_clamp); @@ -702,7 +693,7 @@ public class AppCenter.Views.AppInfoView : Adw.NavigationPage { box.append (supports_clamp); box.append (body_clamp); - box.append (author_view); + box.append (new AuthorView (package, MAX_WIDTH)); var scrolled = new Gtk.ScrolledWindow () { child = box, @@ -739,7 +730,10 @@ public class AppCenter.Views.AppInfoView : Adw.NavigationPage { origin_dropdown.notify["selected-item"].connect (() => { var selected_origin_package = (AppCenterCore.Package) origin_dropdown.selected_item; if (selected_origin_package != null && selected_origin_package != package) { - show_other_package (selected_origin_package); + activate_action_variant ( + MainWindow.ACTION_PREFIX + MainWindow.ACTION_SHOW_PACKAGE, + selected_origin_package.uid + ); } }); @@ -889,19 +883,6 @@ public class AppCenter.Views.AppInfoView : Adw.NavigationPage { } private void load_more_content () { - uint count = 0; - foreach (var origin_package in package.origin_packages) { - origin_liststore.append (origin_package); - if (origin_package == package) { - origin_dropdown.selected = count; - } - - count++; - if (count > 1) { - origin_combo_revealer.reveal_child = true; - } - } - new Thread ("content-loading", () => { var description = package.get_description (); Idle.add (() => { diff --git a/src/Views/AppListUpdateView.vala b/src/Views/AppListUpdateView.vala index 06372a25f..270f10390 100644 --- a/src/Views/AppListUpdateView.vala +++ b/src/Views/AppListUpdateView.vala @@ -9,8 +9,6 @@ /** AppList for the Updates View. Sorts update_available first and shows headers. * Does not show Uninstall Button **/ public class AppCenter.Views.AppListUpdateView : Adw.NavigationPage { - public signal void show_app (AppCenterCore.Package package); - private Granite.HeaderLabel header_label; private Gtk.FlowBox installed_flowbox; private Gtk.ListBox list_box; @@ -186,18 +184,6 @@ public class AppCenter.Views.AppListUpdateView : Adw.NavigationPage { /// TRANSLATORS: the name of the Installed Apps view title = C_("view", "Installed"); - list_box.row_activated.connect ((row) => { - if (row.get_child () is Widgets.InstalledPackageRowGrid) { - show_app (((Widgets.InstalledPackageRowGrid) row.get_child ()).package); - } - }); - - installed_flowbox.child_activated.connect ((child) => { - if (child.get_child () is Widgets.InstalledPackageRowGrid) { - show_app (((Widgets.InstalledPackageRowGrid) child.get_child ()).package); - } - }); - App.settings.bind ( "automatic-updates", automatic_updates_button, diff --git a/src/Views/AuthorView.vala b/src/Views/AuthorView.vala index 1352ffd62..02cc3d39f 100644 --- a/src/Views/AuthorView.vala +++ b/src/Views/AuthorView.vala @@ -4,8 +4,6 @@ */ private class AppCenter.AuthorView : Gtk.Box { - public signal void show_other_package (AppCenterCore.Package package); - public AppCenterCore.Package package { get; construct; } public int max_width { get; construct; } @@ -65,11 +63,5 @@ private class AppCenter.AuthorView : Gtk.Box { append (clamp); add_css_class ("bottom-toolbar"); add_css_class (Granite.STYLE_CLASS_FLAT); - - flowbox.child_activated.connect ((child) => { - var package_row_grid = (AppCenter.Widgets.ListPackageRowGrid) child.get_child (); - - show_other_package (package_row_grid.package); - }); } } diff --git a/src/Views/CategoryView.vala b/src/Views/CategoryView.vala index 94f8b7730..55dca732f 100644 --- a/src/Views/CategoryView.vala +++ b/src/Views/CategoryView.vala @@ -16,8 +16,6 @@ */ public class AppCenter.CategoryView : Adw.NavigationPage { - public signal void show_app (AppCenterCore.Package package); - public AppStream.Category category { get; construct; } private Gtk.Stack stack; @@ -86,18 +84,6 @@ public class AppCenter.CategoryView : Adw.NavigationPage { populate (); - recently_updated_flowbox.show_package.connect ((package) => { - show_app (package); - }); - - paid_flowbox.show_package.connect ((package) => { - show_app (package); - }); - - free_flowbox.show_package.connect ((package) => { - show_app (package); - }); - AppCenterCore.FlatpakBackend.get_default ().package_list_changed.connect (() => { populate (); }); @@ -200,8 +186,6 @@ public class AppCenter.CategoryView : Adw.NavigationPage { } private class SubcategoryFlowbox : Gtk.Box { - public signal void show_package (AppCenterCore.Package package); - public string? label { get; construct; } private static Gtk.SizeGroup size_group; @@ -234,11 +218,6 @@ public class AppCenter.CategoryView : Adw.NavigationPage { append (header); } append (flowbox); - - flowbox.child_activated.connect ((child) => { - var row = (Widgets.ListPackageRowGrid) child.get_child (); - show_package (row.package); - }); } public void bind_model (GLib.ListModel model) { diff --git a/src/Views/Homepage.vala b/src/Views/Homepage.vala index 40cde400c..6f53ed960 100644 --- a/src/Views/Homepage.vala +++ b/src/Views/Homepage.vala @@ -19,7 +19,6 @@ */ public class AppCenter.Homepage : Adw.NavigationPage { - public signal void show_package (AppCenterCore.Package package); public signal void show_category (AppStream.Category category); private const int MAX_PACKAGES_IN_BANNER = 5; @@ -181,13 +180,7 @@ public class AppCenter.Homepage : Adw.NavigationPage { var local_package = App.local_package; if (local_package != null) { - var banner = new Widgets.Banner.from_package (local_package); - - banner_carousel.prepend (banner); - - banner.clicked.connect (() => { - show_package (local_package); - }); + banner_carousel.prepend (new Widgets.Banner.from_package (local_package)); } else { appcenter_banner = new Widgets.Banner ( _("AppCenter"), @@ -213,12 +206,6 @@ public class AppCenter.Homepage : Adw.NavigationPage { show_category (card.category); }); - recently_updated_carousel.child_activated.connect ((child) => { - var package_row_grid = (AppCenter.Widgets.ListPackageRowGrid) child.get_child (); - - show_package (package_row_grid.package); - }); - destroy.connect (() => { banner_timeout_stop (); }); @@ -253,13 +240,7 @@ public class AppCenter.Homepage : Adw.NavigationPage { if (!installed) { packages_in_banner.add (package); - - var banner = new Widgets.Banner.from_package (package); - banner.clicked.connect (() => { - show_package (package); - }); - - banner_carousel.append (banner); + banner_carousel.append (new Widgets.Banner.from_package (package)); } } diff --git a/src/Views/SearchView.vala b/src/Views/SearchView.vala index d518fd823..eedee1132 100644 --- a/src/Views/SearchView.vala +++ b/src/Views/SearchView.vala @@ -20,8 +20,6 @@ */ public class AppCenter.SearchView : Adw.NavigationPage { - public signal void show_app (AppCenterCore.Package package); - public const int VALID_QUERY_LENGTH = 3; public string search_term { get; construct; } @@ -117,7 +115,10 @@ public class AppCenter.SearchView : Adw.NavigationPage { }); grid_view.activate.connect ((index) => { - show_app ((AppCenterCore.Package) selection_model.get_item (index)); + activate_action_variant ( + MainWindow.ACTION_PREFIX + MainWindow.ACTION_SHOW_PACKAGE, + ((AppCenterCore.Package) selection_model.get_item (index)).uid + ); }); selection_model.items_changed.connect (on_items_changed); diff --git a/src/Widgets/AddonList.vala b/src/Widgets/AddonList.vala index 419552553..6dcb739e4 100644 --- a/src/Widgets/AddonList.vala +++ b/src/Widgets/AddonList.vala @@ -4,8 +4,6 @@ */ public class AppCenter.AddonList : Granite.Bin { - public signal void show_addon (AppCenterCore.Package package); - public AppCenterCore.Package package { get; construct; } public AddonList (AppCenterCore.Package package) { @@ -27,7 +25,6 @@ public class AppCenter.AddonList : Granite.Bin { single_click_activate = true, vexpand = true }; - list_view.activate.connect (on_activate); var scrolled = new Gtk.ScrolledWindow () { child = list_view, @@ -58,9 +55,4 @@ public class AppCenter.AddonList : Granite.Bin { var addon = (AppCenterCore.Package) list_item.item; list_item.child = new AppCenter.Widgets.ListPackageRowGrid (addon); } - - private void on_activate (Gtk.GridView view, uint pos) { - var addon = (AppCenterCore.Package) view.model.get_item (pos); - show_addon (addon); - } } diff --git a/src/Widgets/AppContainers/InstalledPackageRowGrid.vala b/src/Widgets/AppContainers/InstalledPackageRowGrid.vala index 50b0580a4..0a9aa772c 100644 --- a/src/Widgets/AppContainers/InstalledPackageRowGrid.vala +++ b/src/Widgets/AppContainers/InstalledPackageRowGrid.vala @@ -95,6 +95,16 @@ public class AppCenter.Widgets.InstalledPackageRowGrid : Granite.Bin { }; releases_dialog.present (); }); + + var gesture_controller = new Gtk.GestureClick () { + button = Gdk.BUTTON_PRIMARY + }; + gesture_controller.released.connect (on_clicked); + add_controller (gesture_controller); + } + + private void on_clicked () { + activate_action_variant (MainWindow.ACTION_PREFIX + MainWindow.ACTION_SHOW_PACKAGE, package.uid); } private void set_up_package () { diff --git a/src/Widgets/AppContainers/ListPackageRowGrid.vala b/src/Widgets/AppContainers/ListPackageRowGrid.vala index 7e373dc46..ddc5a5213 100644 --- a/src/Widgets/AppContainers/ListPackageRowGrid.vala +++ b/src/Widgets/AppContainers/ListPackageRowGrid.vala @@ -60,5 +60,15 @@ public class AppCenter.Widgets.ListPackageRowGrid : Granite.Bin { grid.attach (action_stack, 2, 0, 1, 2); child = grid; + + var gesture_controller = new Gtk.GestureClick () { + button = Gdk.BUTTON_PRIMARY + }; + gesture_controller.released.connect (on_clicked); + add_controller (gesture_controller); + } + + private void on_clicked () { + activate_action_variant (MainWindow.ACTION_PREFIX + MainWindow.ACTION_SHOW_PACKAGE, package.uid); } } diff --git a/src/Widgets/Banner.vala b/src/Widgets/Banner.vala index 4a4a22072..3fc8f0f9e 100644 --- a/src/Widgets/Banner.vala +++ b/src/Widgets/Banner.vala @@ -46,7 +46,9 @@ public class AppCenter.Widgets.Banner : Gtk.Button { summary: package.get_summary (), description: package.get_description (), app_icon: app_icon, - brand_color: package.get_color_primary () + brand_color: package.get_color_primary (), + action_name: MainWindow.ACTION_PREFIX + MainWindow.ACTION_SHOW_PACKAGE, + action_target: new Variant.string (package.uid) ); }