[gnome-software/1364-implement-other-apps-by-author-section-in-app-details-page: 4/4] gs-shell: Implement 'Back' function for the 'Details' page
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/1364-implement-other-apps-by-author-section-in-app-details-page: 4/4] gs-shell: Implement 'Back' function for the 'Details' page
- Date: Mon, 30 May 2022 11:08:43 +0000 (UTC)
commit aab52f36e19c4cce0a889ff40e600f2c3ddf9b68
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]