[gnome-control-center/gbsneto/keyboard-shortcuts-rename: 3/4] shell: Add position to cc_shell_embed_widget_in_header()



commit 75f150d5a2ecaa7c02620a4b787118d74e9b00c7
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Tue May 21 12:57:45 2019 -0300

    shell: Add position to cc_shell_embed_widget_in_header()
    
    So we can control where the widget should be added to. The
    main window only supports left and right positions.
    
    https://gitlab.gnome.org/GNOME/gnome-control-center/issues/528

 panels/applications/cc-applications-panel.c  |  2 +-
 panels/bluetooth/cc-bluetooth-panel.c        |  2 +-
 panels/datetime/cc-datetime-panel.c          |  4 +++-
 panels/keyboard/cc-keyboard-panel.c          |  2 +-
 panels/mouse/cc-mouse-panel.c                |  2 +-
 panels/network/cc-wifi-panel.c               |  2 +-
 panels/printers/cc-printers-panel.c          |  4 ++--
 panels/region/cc-region-panel.c              |  3 ++-
 panels/search/cc-search-panel.c              |  2 +-
 panels/sharing/cc-sharing-panel.c            |  3 ++-
 panels/thunderbolt/cc-bolt-panel.c           |  2 +-
 panels/user-accounts/cc-user-panel.c         |  2 +-
 panels/wacom/cc-wacom-panel.c                |  2 +-
 shell/cc-shell.c                             |  6 ++++--
 shell/cc-shell.h                             | 10 +++++----
 shell/cc-window.c                            | 32 ++++++++++++++++++++++++----
 shell/cc-window.ui                           |  7 +++++-
 tests/interactive-panels/gtp-header-widget.c |  2 +-
 tests/network/cc-test-window.c               |  5 +++--
 19 files changed, 66 insertions(+), 28 deletions(-)
---
diff --git a/panels/applications/cc-applications-panel.c b/panels/applications/cc-applications-panel.c
index 57a6d49ad..1cc476093 100644
--- a/panels/applications/cc-applications-panel.c
+++ b/panels/applications/cc-applications-panel.c
@@ -1627,7 +1627,7 @@ cc_applications_panel_constructed (GObject *object)
   G_OBJECT_CLASS (cc_applications_panel_parent_class)->constructed (object);
 
   shell = cc_panel_get_shell (CC_PANEL (self));
-  cc_shell_embed_widget_in_header (shell, self->header_button);
+  cc_shell_embed_widget_in_header (shell, self->header_button, GTK_POS_RIGHT);
 }
 
 static GtkWidget*
diff --git a/panels/bluetooth/cc-bluetooth-panel.c b/panels/bluetooth/cc-bluetooth-panel.c
index 576e527b3..28f5a8c54 100644
--- a/panels/bluetooth/cc-bluetooth-panel.c
+++ b/panels/bluetooth/cc-bluetooth-panel.c
@@ -90,7 +90,7 @@ cc_bluetooth_panel_constructed (GObject *object)
        /* add kill switch widgets  */
        self->kill_switch_header = g_object_ref (WID ("box_power"));
        cc_shell_embed_widget_in_header (cc_panel_get_shell (CC_PANEL (self)),
-                                        self->kill_switch_header);
+                                        self->kill_switch_header, GTK_POS_RIGHT);
        gtk_widget_show (self->kill_switch_header);
 }
 
diff --git a/panels/datetime/cc-datetime-panel.c b/panels/datetime/cc-datetime-panel.c
index c452b89c2..cb7ddf5f1 100644
--- a/panels/datetime/cc-datetime-panel.c
+++ b/panels/datetime/cc-datetime-panel.c
@@ -175,7 +175,9 @@ cc_date_time_panel_constructed (GObject *object)
 
   G_OBJECT_CLASS (cc_date_time_panel_parent_class)->constructed (object);
 
-  cc_shell_embed_widget_in_header (cc_panel_get_shell (CC_PANEL (self)), GTK_WIDGET (self->lock_button));
+  cc_shell_embed_widget_in_header (cc_panel_get_shell (CC_PANEL (self)),
+                                   GTK_WIDGET (self->lock_button),
+                                   GTK_POS_RIGHT);
 }
 
 static const char *
diff --git a/panels/keyboard/cc-keyboard-panel.c b/panels/keyboard/cc-keyboard-panel.c
index 33029a220..fc2639265 100644
--- a/panels/keyboard/cc-keyboard-panel.c
+++ b/panels/keyboard/cc-keyboard-panel.c
@@ -652,7 +652,7 @@ cc_keyboard_panel_constructed (GObject *object)
   toplevel = GTK_WINDOW (cc_shell_get_toplevel (cc_panel_get_shell (CC_PANEL (self))));
   gtk_window_set_transient_for (GTK_WINDOW (self->shortcut_editor), toplevel);
 
-  cc_shell_embed_widget_in_header (cc_panel_get_shell (CC_PANEL (self)), self->search_button);
+  cc_shell_embed_widget_in_header (cc_panel_get_shell (CC_PANEL (self)), self->search_button, GTK_POS_RIGHT);
 
   self->search_bar_handler_id =
     g_signal_connect_swapped (toplevel,
diff --git a/panels/mouse/cc-mouse-panel.c b/panels/mouse/cc-mouse-panel.c
index af3ed17c8..f3130f46f 100644
--- a/panels/mouse/cc-mouse-panel.c
+++ b/panels/mouse/cc-mouse-panel.c
@@ -83,7 +83,7 @@ cc_mouse_panel_constructed (GObject *object)
   gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
   gtk_widget_set_visible (button, TRUE);
 
-  cc_shell_embed_widget_in_header (shell, button);
+  cc_shell_embed_widget_in_header (shell, button, GTK_POS_RIGHT);
 
   g_signal_connect (GTK_BUTTON (button), "toggled",
                     G_CALLBACK (shell_test_button_toggled),
diff --git a/panels/network/cc-wifi-panel.c b/panels/network/cc-wifi-panel.c
index 09e16baf8..de5069425 100644
--- a/panels/network/cc-wifi-panel.c
+++ b/panels/network/cc-wifi-panel.c
@@ -572,7 +572,7 @@ cc_wifi_panel_constructed (GObject *object)
 
   G_OBJECT_CLASS (cc_wifi_panel_parent_class)->constructed (object);
 
-  cc_shell_embed_widget_in_header (shell, GTK_WIDGET (self->header_stack));
+  cc_shell_embed_widget_in_header (shell, GTK_WIDGET (self->header_stack), GTK_POS_RIGHT);
 }
 
 static void
diff --git a/panels/printers/cc-printers-panel.c b/panels/printers/cc-printers-panel.c
index 2333e9257..9fc0c7980 100644
--- a/panels/printers/cc-printers-panel.c
+++ b/panels/printers/cc-printers-panel.c
@@ -241,7 +241,7 @@ cc_printers_panel_constructed (GObject *object)
   G_OBJECT_CLASS (cc_printers_panel_parent_class)->constructed (object);
 
   shell = cc_panel_get_shell (CC_PANEL (self));
-  cc_shell_embed_widget_in_header (shell, self->headerbar_buttons);
+  cc_shell_embed_widget_in_header (shell, self->headerbar_buttons, GTK_POS_RIGHT);
 
   widget = (GtkWidget*)
     gtk_builder_get_object (self->builder, "lock-button");
@@ -249,7 +249,7 @@ cc_printers_panel_constructed (GObject *object)
 
   widget = (GtkWidget*)
     gtk_builder_get_object (self->builder, "search-button");
-  cc_shell_embed_widget_in_header (shell, widget);
+  cc_shell_embed_widget_in_header (shell, widget, GTK_POS_RIGHT);
 
   widget = (GtkWidget*)
     gtk_builder_get_object (self->builder, "search-bar");
diff --git a/panels/region/cc-region-panel.c b/panels/region/cc-region-panel.c
index 664097da2..e968e1379 100644
--- a/panels/region/cc-region-panel.c
+++ b/panels/region/cc-region-panel.c
@@ -187,7 +187,8 @@ cc_region_panel_constructed (GObject *object)
 
         if (self->permission)
                 cc_shell_embed_widget_in_header (cc_panel_get_shell (CC_PANEL (object)),
-                                                 GTK_WIDGET (self->login_button));
+                                                 GTK_WIDGET (self->login_button),
+                                                 GTK_POS_RIGHT);
 }
 
 static const char *
diff --git a/panels/search/cc-search-panel.c b/panels/search/cc-search-panel.c
index 9d2975052..26590482b 100644
--- a/panels/search/cc-search-panel.c
+++ b/panels/search/cc-search-panel.c
@@ -716,7 +716,7 @@ cc_search_panel_constructed (GObject *object)
                           G_BINDING_DEFAULT |
                           G_BINDING_SYNC_CREATE);
 
-  cc_shell_embed_widget_in_header (cc_panel_get_shell (CC_PANEL (self)), box);
+  cc_shell_embed_widget_in_header (cc_panel_get_shell (CC_PANEL (self)), box, GTK_POS_RIGHT);
 }
 
 static void
diff --git a/panels/sharing/cc-sharing-panel.c b/panels/sharing/cc-sharing-panel.c
index 91e2c660c..303a54e4f 100644
--- a/panels/sharing/cc-sharing-panel.c
+++ b/panels/sharing/cc-sharing-panel.c
@@ -142,7 +142,8 @@ cc_sharing_panel_constructed (GObject *object)
 
   /* add the master switch */
   cc_shell_embed_widget_in_header (cc_panel_get_shell (CC_PANEL (object)),
-                                   gtk_widget_get_parent (self->master_switch));
+                                   gtk_widget_get_parent (self->master_switch),
+                                   GTK_POS_RIGHT);
 }
 
 static void
diff --git a/panels/thunderbolt/cc-bolt-panel.c b/panels/thunderbolt/cc-bolt-panel.c
index dfc82bd4a..10570e168 100644
--- a/panels/thunderbolt/cc-bolt-panel.c
+++ b/panels/thunderbolt/cc-bolt-panel.c
@@ -920,7 +920,7 @@ cc_bolt_panel_constructed (GObject *object)
   G_OBJECT_CLASS (cc_bolt_panel_parent_class)->constructed (object);
 
   shell = cc_panel_get_shell (CC_PANEL (panel));
-  cc_shell_embed_widget_in_header (shell, GTK_WIDGET (panel->headerbar_box));
+  cc_shell_embed_widget_in_header (shell, GTK_WIDGET (panel->headerbar_box), GTK_POS_RIGHT);
 }
 
 static void
diff --git a/panels/user-accounts/cc-user-panel.c b/panels/user-accounts/cc-user-panel.c
index 3a1167b66..23abf48a1 100644
--- a/panels/user-accounts/cc-user-panel.c
+++ b/panels/user-accounts/cc-user-panel.c
@@ -1384,7 +1384,7 @@ cc_user_panel_constructed (GObject *object)
         G_OBJECT_CLASS (cc_user_panel_parent_class)->constructed (object);
 
         shell = cc_panel_get_shell (CC_PANEL (self));
-        cc_shell_embed_widget_in_header (shell, GTK_WIDGET (self->headerbar_button_stack));
+        cc_shell_embed_widget_in_header (shell, GTK_WIDGET (self->headerbar_button_stack), GTK_POS_RIGHT);
 
         gtk_lock_button_set_permission (self->lock_button, self->permission);
 }
diff --git a/panels/wacom/cc-wacom-panel.c b/panels/wacom/cc-wacom-panel.c
index b1f7bad7a..4e123a5ae 100644
--- a/panels/wacom/cc-wacom-panel.c
+++ b/panels/wacom/cc-wacom-panel.c
@@ -466,7 +466,7 @@ cc_wacom_panel_constructed (GObject *object)
        gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
        gtk_widget_set_visible (button, TRUE);
 
-       cc_shell_embed_widget_in_header (shell, button);
+       cc_shell_embed_widget_in_header (shell, button, GTK_POS_RIGHT);
 
        self->test_popover = gtk_popover_new (button);
        gtk_container_set_border_width (GTK_CONTAINER (self->test_popover), 6);
diff --git a/shell/cc-shell.c b/shell/cc-shell.c
index 81de92a09..ffab0a68d 100644
--- a/shell/cc-shell.c
+++ b/shell/cc-shell.c
@@ -152,7 +152,9 @@ cc_shell_get_toplevel (CcShell *shell)
 }
 
 void
-cc_shell_embed_widget_in_header (CcShell *shell, GtkWidget *widget)
+cc_shell_embed_widget_in_header (CcShell         *shell,
+                                 GtkWidget       *widget,
+                                 GtkPositionType  position)
 {
   CcShellInterface *iface;
 
@@ -168,6 +170,6 @@ cc_shell_embed_widget_in_header (CcShell *shell, GtkWidget *widget)
     }
   else
     {
-      iface->embed_widget_in_header (shell, widget);
+      iface->embed_widget_in_header (shell, widget, position);
     }
 }
diff --git a/shell/cc-shell.h b/shell/cc-shell.h
index 1786aedb4..cc96365f7 100644
--- a/shell/cc-shell.h
+++ b/shell/cc-shell.h
@@ -55,8 +55,9 @@ struct _CcShellInterface
                                            GVariant     *parameters,
                                            GError      **error);
   GtkWidget * (*get_toplevel)             (CcShell      *shell);
-  void        (*embed_widget_in_header)   (CcShell      *shell,
-                                           GtkWidget    *widget);
+  void        (*embed_widget_in_header)   (CcShell         *shell,
+                                           GtkWidget       *widget,
+                                           GtkPositionType  position);
 };
 
 GType           cc_shell_get_type                 (void) G_GNUC_CONST;
@@ -70,8 +71,9 @@ gboolean        cc_shell_set_active_panel_from_id (CcShell      *shell,
                                                    GError      **error);
 GtkWidget *     cc_shell_get_toplevel             (CcShell      *shell);
 
-void            cc_shell_embed_widget_in_header   (CcShell      *shell,
-                                                   GtkWidget    *widget);
+void            cc_shell_embed_widget_in_header   (CcShell         *shell,
+                                                   GtkWidget       *widget,
+                                                   GtkPositionType  position);
 
 G_END_DECLS
 
diff --git a/shell/cc-window.c b/shell/cc-window.c
index 17e55e899..6cbe22c71 100644
--- a/shell/cc-window.c
+++ b/shell/cc-window.c
@@ -64,6 +64,7 @@ struct _CcWindow
   GtkWidget  *panel_list;
   GtkWidget  *previous_button;
   GtkWidget  *back_revealer;
+  GtkWidget  *top_left_box;
   GtkWidget  *top_right_box;
   GtkWidget  *search_button;
   GtkWidget  *search_bar;
@@ -108,6 +109,7 @@ in_flatpak_sandbox (void)
 static void
 remove_all_custom_widgets (CcWindow *self)
 {
+  GtkWidget *parent;
   GtkWidget *widget;
   guint i;
 
@@ -117,7 +119,10 @@ remove_all_custom_widgets (CcWindow *self)
   for (i = 0; i < self->custom_widgets->len; i++)
     {
       widget = g_ptr_array_index (self->custom_widgets, i);
-      gtk_container_remove (GTK_CONTAINER (self->top_right_box), widget);
+      parent = gtk_widget_get_parent (widget);
+
+      g_assert (parent == self->top_right_box || parent == self->top_left_box);
+      gtk_container_remove (GTK_CONTAINER (parent), widget);
     }
   g_ptr_array_set_size (self->custom_widgets, 0);
 
@@ -511,6 +516,7 @@ update_fold_state (CcWindow *shell)
 
   hdy_header_group_set_focus (shell->header_group, fold == HDY_FOLD_FOLDED ? GTK_HEADER_BAR (header_child) : 
NULL);
 
+  gtk_widget_set_visible (shell->back_revealer, fold == HDY_FOLD_FOLDED);
   gtk_revealer_set_reveal_child (GTK_REVEALER (shell->back_revealer), fold == HDY_FOLD_FOLDED);
 }
 
@@ -697,15 +703,32 @@ cc_window_set_active_panel_from_id (CcShell      *shell,
 }
 
 static void
-cc_window_embed_widget_in_header (CcShell   *shell,
-                                  GtkWidget *widget)
+cc_window_embed_widget_in_header (CcShell         *shell,
+                                  GtkWidget       *widget,
+                                  GtkPositionType  position)
 {
   CcWindow *self = CC_WINDOW (shell);
 
   CC_ENTRY;
 
   /* add to header */
-  gtk_box_pack_end (GTK_BOX (self->top_right_box), widget, FALSE, FALSE, 0);
+  switch (position)
+    {
+    case GTK_POS_RIGHT:
+      gtk_container_add (GTK_CONTAINER (self->top_right_box), widget);
+      break;
+
+    case GTK_POS_LEFT:
+      gtk_container_add (GTK_CONTAINER (self->top_left_box), widget);
+      break;
+
+    case GTK_POS_TOP:
+    case GTK_POS_BOTTOM:
+    default:
+      g_warning ("Invalid position passed");
+      return;
+    }
+
   g_ptr_array_add (self->custom_widgets, g_object_ref (widget));
 
   gtk_size_group_add_widget (self->header_sizegroup, widget);
@@ -887,6 +910,7 @@ cc_window_class_init (CcWindowClass *klass)
   gtk_widget_class_bind_template_child (widget_class, CcWindow, search_button);
   gtk_widget_class_bind_template_child (widget_class, CcWindow, search_entry);
   gtk_widget_class_bind_template_child (widget_class, CcWindow, stack);
+  gtk_widget_class_bind_template_child (widget_class, CcWindow, top_left_box);
   gtk_widget_class_bind_template_child (widget_class, CcWindow, top_right_box);
 
   gtk_widget_class_bind_template_callback (widget_class, back_button_clicked_cb);
diff --git a/shell/cc-window.ui b/shell/cc-window.ui
index 7473dec53..45f9182f1 100644
--- a/shell/cc-window.ui
+++ b/shell/cc-window.ui
@@ -222,7 +222,6 @@
                 <property name="show_close_button">True</property>
                 <child>
                   <object class="GtkRevealer" id="back_revealer">
-                    <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="transition-type">crossfade</property>
                     <property name="transition-duration" bind-source="main_leaflet" 
bind-property="mode-transition-duration" bind-flags="bidirectional|sync-create"/>
@@ -254,6 +253,12 @@
                     </child>
                   </object>
                 </child>
+                <child>
+                  <object class="GtkBox" id="top_left_box">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                  </object>
+                </child>
                 <child>
                   <object class="GtkBox" id="top_right_box">
                     <property name="visible">True</property>
diff --git a/tests/interactive-panels/gtp-header-widget.c b/tests/interactive-panels/gtp-header-widget.c
index e56f6478f..44f6d8038 100644
--- a/tests/interactive-panels/gtp-header-widget.c
+++ b/tests/interactive-panels/gtp-header-widget.c
@@ -38,7 +38,7 @@ gtp_header_widget_constructed (GObject *object)
   G_OBJECT_CLASS (gtp_header_widget_parent_class)->constructed (object);
 
   shell = cc_panel_get_shell (CC_PANEL (self));
-  cc_shell_embed_widget_in_header (shell, self->header_widget);
+  cc_shell_embed_widget_in_header (shell, self->header_widget, GTK_POS_LEFT);
 }
 
 static void
diff --git a/tests/network/cc-test-window.c b/tests/network/cc-test-window.c
index 95c979b15..ddb6b488e 100644
--- a/tests/network/cc-test-window.c
+++ b/tests/network/cc-test-window.c
@@ -94,8 +94,9 @@ cc_test_window_set_active_panel_from_id (CcShell      *shell,
 }
 
 static void
-cc_test_window_embed_widget_in_header (CcShell   *shell,
-                                       GtkWidget *widget)
+cc_test_window_embed_widget_in_header (CcShell         *shell,
+                                       GtkWidget       *widget,
+                                       GtkPositionType  position)
 {
   CcTestWindow *self = CC_TEST_WINDOW (shell);
 


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