[gnome-software/1364-implement-other-apps-by-author-section-in-app-details-page: 4/4] gs-shell: Implement 'Back' function for the 'Details' page




commit e309268de5e1bd6bc1fef14093b76283abe1fa66
Author: Milan Crha <mcrha redhat com>
Date:   Mon May 30 12:52:11 2022 +0200

    gs-shell: Implement 'Back' function for the 'Details' page
    
    Let the GsShell handle the 'Back' history for the 'Details' page,
    which is used when going through other developer apps.

 src/gs-shell.c  | 31 ++++++++++++++++++++++++++++++-
 src/gs-shell.ui |  1 +
 2 files changed, 31 insertions(+), 1 deletion(-)
---
diff --git a/src/gs-shell.c b/src/gs-shell.c
index db449a9b0..4d6c5e27e 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -58,6 +58,8 @@ typedef struct {
        GtkWidget       *focus;
        GsCategory      *category;
        gchar           *search;
+       GsApp           *app;
+       gdouble          vscroll_position;
 } BackEntry;
 
 struct _GsShell
@@ -431,6 +433,7 @@ free_back_entry (BackEntry *entry)
                g_object_remove_weak_pointer (G_OBJECT (entry->focus),
                                              (gpointer *) &entry->focus);
        g_clear_object (&entry->category);
+       g_clear_object (&entry->app);
        g_free (entry->search);
        g_free (entry);
 }
@@ -598,8 +601,11 @@ gs_shell_change_mode (GsShell *shell,
        GsPage *page;
        gboolean mode_is_main = gs_shell_get_mode_is_main (mode);
 
-       if (gs_shell_get_mode (shell) == mode)
+       if (gs_shell_get_mode (shell) == mode &&
+           (mode != GS_SHELL_MODE_DETAILS ||
+            data == gs_details_page_get_app (GS_DETAILS_PAGE (shell->pages[mode])))) {
                return;
+       }
 
        /* switch page */
        if (mode == GS_SHELL_MODE_LOADING) {
@@ -712,6 +718,10 @@ save_back_entry (GsShell *shell)
                g_debug ("pushing back entry for %s with %s",
                         page_name[entry->mode], entry->search);
                break;
+       case GS_SHELL_MODE_DETAILS:
+               entry->app = g_object_ref (gs_details_page_get_app (GS_DETAILS_PAGE 
(shell->pages[GS_SHELL_MODE_DETAILS])));
+               entry->vscroll_position = gs_details_page_get_vscroll_position (GS_DETAILS_PAGE 
(shell->pages[GS_SHELL_MODE_DETAILS]));
+               break;
        default:
                g_debug ("pushing back entry for %s", page_name[entry->mode]);
                break;
@@ -825,6 +835,14 @@ gs_shell_go_back (GsShell *shell)
                gs_shell_change_mode (shell, entry->mode,
                                      (gpointer) entry->search, FALSE);
                break;
+       case GS_SHELL_MODE_DETAILS:
+               g_debug ("popping back entry for %s with app %s and vscroll position %f",
+                        page_name[entry->mode],
+                        gs_app_get_unique_id (entry->app),
+                        entry->vscroll_position);
+               gs_shell_change_mode (shell, entry->mode, entry->app, FALSE);
+               gs_details_page_set_vscroll_position (GS_DETAILS_PAGE (shell->pages[GS_SHELL_MODE_DETAILS]), 
entry->vscroll_position);
+               break;
        default:
                g_debug ("popping back entry for %s", page_name[entry->mode]);
                gs_shell_change_mode (shell, entry->mode, NULL, FALSE);
@@ -2181,6 +2199,16 @@ category_page_app_clicked_cb (GsCategoryPage *page,
        gs_shell_show_app (shell, app);
 }
 
+static void
+details_page_app_clicked_cb (GsDetailsPage *page,
+                            GsApp         *app,
+                            gpointer       user_data)
+{
+       GsShell *shell = GS_SHELL (user_data);
+
+       gs_shell_show_app (shell, app);
+}
+
 void
 gs_shell_setup (GsShell *shell, GsPluginLoader *plugin_loader, GCancellable *cancellable)
 {
@@ -2642,6 +2670,7 @@ gs_shell_class_init (GsShellClass *klass)
        gtk_widget_class_bind_template_callback (widget_class, initial_refresh_done);
        gtk_widget_class_bind_template_callback (widget_class, overlay_get_child_position_cb);
        gtk_widget_class_bind_template_callback (widget_class, gs_shell_details_page_metainfo_loaded_cb);
+       gtk_widget_class_bind_template_callback (widget_class, details_page_app_clicked_cb);
 
        gtk_widget_class_add_binding_action (widget_class, GDK_KEY_q, GDK_CONTROL_MASK, "window.close", NULL);
 }
diff --git a/src/gs-shell.ui b/src/gs-shell.ui
index cf5a941f8..52e4a43f0 100644
--- a/src/gs-shell.ui
+++ b/src/gs-shell.ui
@@ -474,6 +474,7 @@
                               <object class="GsDetailsPage" id="details_page">
                                 <property name="is-narrow" bind-source="GsShell" bind-property="is-narrow" 
bind-flags="sync-create"/>
                                 <signal name="metainfo-loaded" 
handler="gs_shell_details_page_metainfo_loaded_cb"/>
+                                <signal name="app-clicked" handler="details_page_app_clicked_cb"/>
                               </object>
                             </child>
                           </object>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]