[gnome-software: 17/29] gs-shell: Bind GsPage:title to application_details_header:label




commit 3a6d59191c71da09f8848588abd4784f62e9cf3f
Author: Philip Withnall <pwithnall endlessos org>
Date:   Thu Jan 21 11:53:50 2021 +0000

    gs-shell: Bind GsPage:title to application_details_header:label
    
    This allows a fair amount of manual widget update code to be removed
    from individual `GsPage` implementations, while retaining the same
    functionality.
    
    Signed-off-by: Philip Withnall <pwithnall endlessos org>

 src/gnome-software.ui  |  2 +-
 src/gs-category-page.c | 12 ------------
 src/gs-details-page.c  | 15 ---------------
 src/gs-extras-page.c   |  9 ---------
 src/gs-shell.c         | 14 ++++++++++++--
 5 files changed, 13 insertions(+), 39 deletions(-)
---
diff --git a/src/gnome-software.ui b/src/gnome-software.ui
index 995fa3790..542c7b7c1 100644
--- a/src/gnome-software.ui
+++ b/src/gnome-software.ui
@@ -171,7 +171,7 @@
                 </child>
                 <child>
                   <object class="GtkLabel" id="application_details_header">
-                    <property name="visible">False</property>
+                    <property name="visible">True</property>
                     <property name="selectable">False</property>
                     <property name="ellipsize">end</property>
                     <style>
diff --git a/src/gs-category-page.c b/src/gs-category-page.c
index 78606fa33..e6e51c9b4 100644
--- a/src/gs-category-page.c
+++ b/src/gs-category-page.c
@@ -61,17 +61,6 @@ typedef enum {
        PROP_TITLE = 1,
 } GsCategoryPageProperty;
 
-static void
-gs_category_page_switch_to (GsPage *page)
-{
-       GsCategoryPage *self = GS_CATEGORY_PAGE (page);
-       GtkWidget *widget;
-
-       widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "application_details_header"));
-       gtk_widget_show (widget);
-       gtk_label_set_label (GTK_LABEL (widget), gs_page_get_title (page));
-}
-
 static void
 app_tile_clicked (GsAppTile *tile, gpointer data)
 {
@@ -590,7 +579,6 @@ gs_category_page_class_init (GsCategoryPageClass *klass)
        object_class->get_property = gs_category_page_get_property;
        object_class->dispose = gs_category_page_dispose;
 
-       page_class->switch_to = gs_category_page_switch_to;
        page_class->reload = gs_category_page_reload;
        page_class->setup = gs_category_page_setup;
 
diff --git a/src/gs-details-page.c b/src/gs-details-page.c
index a4b266133..b777b6005 100644
--- a/src/gs-details-page.c
+++ b/src/gs-details-page.c
@@ -292,16 +292,6 @@ app_has_pending_action (GsApp *app)
               (gs_app_get_state (app) == GS_APP_STATE_QUEUED_FOR_INSTALL);
 }
 
-static void
-gs_details_page_update_header_label (GsDetailsPage *self)
-{
-       GtkWidget *widget;
-
-       widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "application_details_header"));
-       gtk_label_set_label (GTK_LABEL (widget), gs_page_get_title (GS_PAGE (self)));
-       gtk_widget_set_visible (widget, gtk_label_get_label (GTK_LABEL (widget)) != NULL);
-}
-
 static void
 gs_details_page_switch_to (GsPage *page)
 {
@@ -318,8 +308,6 @@ gs_details_page_switch_to (GsPage *page)
        if (self->app == NULL)
                return;
 
-       gs_details_page_update_header_label (self);
-
        adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_details));
        gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj));
 
@@ -1222,7 +1210,6 @@ gs_details_page_refresh_all (GsDetailsPage *self)
 
        /* change widgets */
        tmp = gs_app_get_name (self->app);
-       gs_details_page_update_header_label (self);
        if (tmp != NULL && tmp[0] != '\0') {
                gtk_label_set_label (GTK_LABEL (self->application_details_title), tmp);
                gtk_widget_set_visible (self->application_details_title, TRUE);
@@ -2117,7 +2104,6 @@ gs_details_page_set_local_file (GsDetailsPage *self, GFile *file)
        gs_details_page_set_state (self, GS_DETAILS_PAGE_STATE_LOADING);
        g_clear_object (&self->app_local_file);
        g_clear_object (&self->app);
-       gs_details_page_update_header_label (self);
        plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
                                         "file", file,
                                         "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON |
@@ -2152,7 +2138,6 @@ gs_details_page_set_url (GsDetailsPage *self, const gchar *url)
        gs_details_page_set_state (self, GS_DETAILS_PAGE_STATE_LOADING);
        g_clear_object (&self->app_local_file);
        g_clear_object (&self->app);
-       gs_details_page_update_header_label (self);
        plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_URL_TO_APP,
                                         "search", url,
                                         "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON |
diff --git a/src/gs-extras-page.c b/src/gs-extras-page.c
index 736ced3bb..2a6344db6 100644
--- a/src/gs-extras-page.c
+++ b/src/gs-extras-page.c
@@ -194,7 +194,6 @@ build_title (GsExtrasPage *self)
 static void
 gs_extras_page_update_ui_state (GsExtrasPage *self)
 {
-       GtkWidget *widget;
        g_autofree gchar *title = NULL;
 
        if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_EXTRAS)
@@ -215,10 +214,6 @@ gs_extras_page_update_ui_state (GsExtrasPage *self)
                break;
        }
 
-       /* headerbar title */
-       widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "application_details_header"));
-       gtk_label_set_label (GTK_LABEL (widget), gs_page_get_title (GS_PAGE (self)));
-
        /* stack */
        switch (self->state) {
        case GS_EXTRAS_PAGE_STATE_LOADING:
@@ -1092,7 +1087,6 @@ static void
 gs_extras_page_switch_to (GsPage *page)
 {
        GsExtrasPage *self = GS_EXTRAS_PAGE (page);
-       GtkWidget *widget;
 
        if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_EXTRAS) {
                g_warning ("Called switch_to(codecs) when in mode %s",
@@ -1100,9 +1094,6 @@ gs_extras_page_switch_to (GsPage *page)
                return;
        }
 
-       widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "application_details_header"));
-       gtk_widget_show (widget);
-
        gs_extras_page_update_ui_state (self);
 }
 
diff --git a/src/gs-shell.c b/src/gs-shell.c
index 84b1fa26e..c9bbb976d 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -75,6 +75,8 @@ struct _GsShell
        GtkStack                *stack_main;
        GsPage                  *page;
 
+       GBinding                *application_details_header_binding;
+
 #ifdef HAVE_MOGWAI
        MwscScheduler           *scheduler;
        gboolean                 scheduler_held;
@@ -420,8 +422,6 @@ stack_notify_visible_child_cb (GObject    *object,
        /* hide all mode specific header widgets here, they will be shown in the
         * refresh functions
         */
-       widget = GTK_WIDGET (gtk_builder_get_object (shell->builder, "application_details_header"));
-       gtk_widget_hide (widget);
        widget = GTK_WIDGET (gtk_builder_get_object (shell->builder, "buttonbox_main"));
        gtk_widget_hide (widget);
        widget = GTK_WIDGET (gtk_builder_get_object (shell->builder, "menu_button"));
@@ -431,6 +431,8 @@ stack_notify_visible_child_cb (GObject    *object,
        widget = GTK_WIDGET (gtk_builder_get_object (shell->builder, "origin_box"));
        gtk_widget_hide (widget);
 
+       gtk_widget_set_visible (shell->application_details_header, !buttonbox_visible);
+
        /* only show the search button in overview and search pages */
        search_button = GTK_WIDGET (gtk_builder_get_object (shell->builder, "search_button"));
        g_signal_handlers_block_by_func (search_button, search_button_clicked_cb, shell);
@@ -493,6 +495,12 @@ stack_notify_visible_child_cb (GObject    *object,
        widget = gs_page_get_header_end_widget (page);
        gs_shell_set_header_end_widget (shell, widget);
 
+       widget = GTK_WIDGET (gtk_builder_get_object (shell->builder, "application_details_header"));
+       g_clear_object (&shell->application_details_header_binding);
+       shell->application_details_header_binding = g_object_bind_property (page, "title",
+                                                                           widget, "label",
+                                                                           G_BINDING_SYNC_CREATE);
+
        /* refresh the updates bar when moving out of the loading mode, but only
         * if the Mogwai scheduler state is already known, to avoid spuriously
         * showing the updates bar */
@@ -2424,6 +2432,8 @@ gs_shell_dispose (GObject *object)
 {
        GsShell *shell = GS_SHELL (object);
 
+       g_clear_object (&shell->application_details_header_binding);
+
        if (shell->back_entry_stack != NULL) {
                g_queue_free_full (shell->back_entry_stack, (GDestroyNotify) free_back_entry);
                shell->back_entry_stack = NULL;


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