[gtk+/dialogs: 13/25] about dialog: Use headerbar



commit 4da4d05991f7d30b1789c952beedbc2ac76ea8c5
Author: William Jon McCann <william jon mccann gmail com>
Date:   Sun Dec 8 13:40:50 2013 +0100

    about dialog: Use headerbar
    
    Use a GtkHeaderBar for the credits and about buttons
    when desired.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=720059

 gtk/gtkaboutdialog.c    |  233 +++++++++++++++++++++++------------------------
 gtk/gtkaboutdialog.ui   |   77 +--------------
 gtk/gtkaboutdialog.ui.h |    6 +-
 3 files changed, 125 insertions(+), 191 deletions(-)
---
diff --git a/gtk/gtkaboutdialog.c b/gtk/gtkaboutdialog.c
index 84dd8d5..e9f7761 100644
--- a/gtk/gtkaboutdialog.c
+++ b/gtk/gtkaboutdialog.c
@@ -50,6 +50,10 @@
 #include "gtkmessagedialog.h"
 #include "gtktogglebutton.h"
 #include "gtktypebuiltins.h"
+#include "gtkstack.h"
+#include "gtkstackswitcher.h"
+#include "gtksettings.h"
+#include "gtkheaderbar.h"
 #include "gtkprivate.h"
 #include "gtkintl.h"
 
@@ -149,6 +153,7 @@ struct _GtkAboutDialogPrivate
   gboolean license_page_initialized;
 
   GtkWidget *stack;
+  GtkWidget *stack_switcher;
   GtkWidget *logo_image;
   GtkWidget *name_label;
   GtkWidget *version_label;
@@ -157,8 +162,8 @@ struct _GtkAboutDialogPrivate
   GtkWidget *license_label;
   GtkWidget *website_label;
 
-  GtkWidget *credits_button;
-  GtkWidget *license_button;
+  GtkWidget *credits_page;
+  GtkWidget *license_page;
 
   GtkWidget *credits_grid;
   GtkWidget *license_view;
@@ -195,6 +200,9 @@ enum
   PROP_LICENSE_TYPE
 };
 
+static GObject *            gtk_about_dialog_constructor   (GType                  type, 
+                                                            guint                  n_params,
+                                                            GObjectConstructParam *params);
 static void                 gtk_about_dialog_finalize       (GObject            *object);
 static void                 gtk_about_dialog_get_property   (GObject            *object,
                                                              guint               prop_id,
@@ -214,17 +222,11 @@ static void                 set_cursor_if_appropriate       (GtkAboutDialog
                                                              GdkDevice          *device,
                                                              gint                x,
                                                              gint                y);
-static void                 display_credits_page            (GtkWidget          *button,
-                                                             gpointer            data);
-static void                 display_license_page            (GtkWidget          *button,
-                                                             gpointer            data);
+static void                 populate_credits_page           (GtkAboutDialog     *about);
+static void                 populate_license_page           (GtkAboutDialog     *about);
 static void                 close_cb                        (GtkAboutDialog     *about);
 static gboolean             gtk_about_dialog_activate_link  (GtkAboutDialog     *about,
                                                              const gchar        *uri);
-static void                 credits_button_clicked          (GtkButton          *button,
-                                                            gpointer            data);
-static void                 license_button_clicked          (GtkButton          *button,
-                                                            gpointer            data);
 static gboolean             emit_activate_link              (GtkAboutDialog     *about,
                                                             const gchar        *uri);
 static gboolean             text_view_key_press_event       (GtkWidget          *text_view,
@@ -250,6 +252,34 @@ static guint signals[LAST_SIGNAL] = { 0 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtkAboutDialog, gtk_about_dialog, GTK_TYPE_DIALOG)
 
+static gboolean
+stack_visible_child_notify (GtkStack       *stack,
+                            GParamSpec     *pspec,
+                            GtkAboutDialog *about)
+{
+  GtkAboutDialogPrivate *priv = about->priv;
+  GtkWidget *child;
+
+  child = gtk_stack_get_visible_child (stack);
+  if (child == priv->credits_page)
+    {
+      if (!priv->credits_page_initialized)
+        {
+          populate_credits_page (about);
+          priv->credits_page_initialized = TRUE;
+        }
+    }
+  else if (child == priv->license_page)
+    {
+      if (!priv->license_page_initialized)
+        {
+          populate_license_page (about);
+          priv->license_page_initialized = TRUE;
+        }
+    }
+
+  return FALSE;
+}
 
 static void
 gtk_about_dialog_class_init (GtkAboutDialogClass *klass)
@@ -263,6 +293,7 @@ gtk_about_dialog_class_init (GtkAboutDialogClass *klass)
   object_class->set_property = gtk_about_dialog_set_property;
   object_class->get_property = gtk_about_dialog_get_property;
 
+  object_class->constructor = gtk_about_dialog_constructor;
   object_class->finalize = gtk_about_dialog_finalize;
 
   widget_class->show = gtk_about_dialog_show;
@@ -566,18 +597,17 @@ gtk_about_dialog_class_init (GtkAboutDialogClass *klass)
   gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, copyright_label);
   gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, license_label);
   gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, website_label);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, credits_button);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, license_button);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, credits_page);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, license_page);
   gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, credits_grid);
   gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, license_view);
 
-  gtk_widget_class_bind_template_callback (widget_class, credits_button_clicked);
-  gtk_widget_class_bind_template_callback (widget_class, license_button_clicked);
   gtk_widget_class_bind_template_callback (widget_class, emit_activate_link);
   gtk_widget_class_bind_template_callback (widget_class, text_view_event_after);
   gtk_widget_class_bind_template_callback (widget_class, text_view_key_press_event);
   gtk_widget_class_bind_template_callback (widget_class, text_view_visibility_notify_event);
   gtk_widget_class_bind_template_callback (widget_class, text_view_motion_notify_event);
+  gtk_widget_class_bind_template_callback (widget_class, stack_visible_child_notify);
 }
 
 static gboolean
@@ -592,14 +622,28 @@ emit_activate_link (GtkAboutDialog *about,
 }
 
 static void
+update_stack_switcher_visibility (GtkAboutDialog *about)
+{
+  GtkAboutDialogPrivate *priv = about->priv;
+
+  if (gtk_widget_get_visible (priv->credits_page) ||
+      gtk_widget_get_visible (priv->license_page))
+    gtk_widget_show (priv->stack_switcher);
+  else
+    gtk_widget_hide (priv->stack_switcher);
+}
+
+static void
 update_license_button_visibility (GtkAboutDialog *about)
 {
   GtkAboutDialogPrivate *priv = about->priv;
 
   if (priv->license_type == GTK_LICENSE_CUSTOM && priv->license != NULL)
-    gtk_widget_show (priv->license_button);
+    gtk_widget_show (priv->license_page);
   else
-    gtk_widget_hide (priv->license_button);
+    gtk_widget_hide (priv->license_page);
+
+  update_stack_switcher_visibility (about);
 }
 
 static void
@@ -616,9 +660,11 @@ update_credits_button_visibility (GtkAboutDialog *about)
           strcmp (priv->translator_credits, "translator_credits") &&
           strcmp (priv->translator_credits, "translator-credits")));
   if (show)
-    gtk_widget_show (priv->credits_button);
+    gtk_widget_show (priv->credits_page);
   else
-    gtk_widget_hide (priv->credits_button);
+    gtk_widget_hide (priv->credits_page);
+
+  update_stack_switcher_visibility (about);
 }
 
 static void
@@ -631,66 +677,6 @@ switch_page (GtkAboutDialog *about,
 }
 
 static void
-display_main_page (GtkButton *button,
-                   gpointer   data)
-{
-  GtkAboutDialog *about = (GtkAboutDialog *)data;
-
-  switch_page (about, "main");
-}
-
-static void
-credits_button_clicked (GtkButton *button,
-                        gpointer   data)
-{
-  GtkAboutDialog *about = (GtkAboutDialog *)data;
-  GtkAboutDialogPrivate *priv = about->priv;
-  gboolean active;
-
-  if (priv->in_child_changed)
-    return;
-
-  active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
-
-  if (active)
-    {
-      priv->in_child_changed = TRUE;
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->license_button), FALSE);
-      priv->in_child_changed = FALSE;
-      display_credits_page (NULL, data);
-    }
-  else
-    {
-      display_main_page (NULL, data);
-    }
-}
-
-static void
-license_button_clicked (GtkButton *button,
-                        gpointer   data)
-{
-  GtkAboutDialog *about = (GtkAboutDialog *)data;
-  GtkAboutDialogPrivate *priv = about->priv;
-  gboolean active;
-
-  if (priv->in_child_changed)
-    return;
-
-  active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
-
-  if (active)
-    {
-      priv->in_child_changed = TRUE;
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->credits_button), FALSE);
-      priv->in_child_changed = FALSE;
-      display_license_page (NULL, data);
-    }
-  else
-    {
-      display_main_page (NULL, data);
-    }
-}
-static void
 gtk_about_dialog_init (GtkAboutDialog *about)
 {
   GtkAboutDialogPrivate *priv;
@@ -722,13 +708,53 @@ gtk_about_dialog_init (GtkAboutDialog *about)
 
   gtk_widget_init_template (GTK_WIDGET (about));
 
-  switch_page (about, "main");
-
   /* force defaults */
   gtk_about_dialog_set_program_name (about, NULL);
   gtk_about_dialog_set_logo (about, NULL);
 }
 
+static GObject *
+gtk_about_dialog_constructor (GType                  type, 
+                              guint                  n_params,
+                              GObjectConstructParam *params)
+{
+  GObject *object;
+  GtkAboutDialog *about;
+  gboolean use_header_bar;
+  GtkWidget *parent;
+
+  object = G_OBJECT_CLASS (gtk_about_dialog_parent_class)->constructor (type, n_params, params);
+
+  about = GTK_ABOUT_DIALOG (object);
+  about->priv->stack_switcher = gtk_stack_switcher_new ();
+  gtk_widget_set_no_show_all (about->priv->stack_switcher, TRUE);
+  gtk_stack_switcher_set_stack (GTK_STACK_SWITCHER (about->priv->stack_switcher), 
+                                GTK_STACK (about->priv->stack));
+
+  g_object_get (object, "use-header-bar", &use_header_bar, NULL);
+  if (use_header_bar)
+    {
+      parent = gtk_dialog_get_header_bar (GTK_DIALOG (object));
+      gtk_header_bar_set_custom_title (GTK_HEADER_BAR (parent), about->priv->stack_switcher);
+    }
+  else
+    {
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+      parent = gtk_dialog_get_action_area (GTK_DIALOG (object));
+G_GNUC_END_IGNORE_DEPRECATIONS
+      gtk_container_add (GTK_CONTAINER (parent), about->priv->stack_switcher);
+      gtk_button_box_set_layout (GTK_BUTTON_BOX (parent), GTK_BUTTONBOX_EDGE);
+      gtk_dialog_add_buttons (GTK_DIALOG (object),
+                              _("_Close"), GTK_RESPONSE_CLOSE,
+                              NULL);
+    }
+
+  switch_page (about, "main");
+  update_stack_switcher_visibility (about);
+
+  return object;
+}
+
 static void
 destroy_credit_section (gpointer data)
 {
@@ -2318,22 +2344,6 @@ populate_credits_page (GtkAboutDialog *about)
 }
 
 static void
-display_credits_page (GtkWidget *button,
-                      gpointer   data)
-{
-  GtkAboutDialog *about = (GtkAboutDialog *)data;
-  GtkAboutDialogPrivate *priv = about->priv;
-
-  if (!priv->credits_page_initialized)
-    {
-      populate_credits_page (about);
-      priv->credits_page_initialized = TRUE;
-    }
-
-  switch_page (about, "credits");
-}
-
-static void
 populate_license_page (GtkAboutDialog *about)
 {
   GtkAboutDialogPrivate *priv = about->priv;
@@ -2349,22 +2359,6 @@ populate_license_page (GtkAboutDialog *about)
   g_object_unref (buffer);
 }
 
-static void
-display_license_page (GtkWidget *button,
-                      gpointer   data)
-{
-  GtkAboutDialog *about = (GtkAboutDialog *)data;
-  GtkAboutDialogPrivate *priv = about->priv;
-
-  if (!priv->license_page_initialized)
-    {
-      populate_license_page (about);
-      priv->license_page_initialized = TRUE;
-    }
-
-  switch_page (about, "license");
-}
-
 /**
  * gtk_about_dialog_new:
  *
@@ -2377,7 +2371,15 @@ display_license_page (GtkWidget *button,
 GtkWidget *
 gtk_about_dialog_new (void)
 {
-  GtkAboutDialog *dialog = g_object_new (GTK_TYPE_ABOUT_DIALOG, NULL);
+  GtkAboutDialog *dialog;
+  gboolean use_header;
+
+  g_object_get (gtk_settings_get_default (),
+                "gtk-dialogs-use-header", &use_header,
+                NULL);
+  dialog = g_object_new (GTK_TYPE_ABOUT_DIALOG,
+                         "use-header-bar", use_header,
+                         NULL);
 
   return GTK_WIDGET (dialog);
 }
@@ -2385,11 +2387,8 @@ gtk_about_dialog_new (void)
 static void
 close_cb (GtkAboutDialog *about)
 {
-  GtkAboutDialogPrivate *priv = about->priv;
-
   switch_page (about, "main");
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->credits_button), FALSE);
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->license_button), FALSE);
+
   gtk_widget_hide (GTK_WIDGET (about));
 }
 
diff --git a/gtk/gtkaboutdialog.ui b/gtk/gtkaboutdialog.ui
index 9453ec5..3c56703 100644
--- a/gtk/gtkaboutdialog.ui
+++ b/gtk/gtkaboutdialog.ui
@@ -16,72 +16,6 @@
         <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
         <property name="spacing">2</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area1">
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkToggleButton" id="credits_button">
-                <property name="label" translatable="yes">C_redits</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="receives_default">True</property>
-                <property name="no_show_all">True</property>
-                <property name="image">image1</property>
-                <property name="use_underline">True</property>
-                <signal name="clicked" handler="credits_button_clicked" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="pack_type">end</property>
-                <property name="position">0</property>
-                <property name="secondary">True</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkToggleButton" id="license_button">
-                <property name="label" translatable="yes">_License</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="receives_default">True</property>
-                <property name="no_show_all">True</property>
-                <property name="use_underline">True</property>
-                <signal name="clicked" handler="license_button_clicked" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="pack_type">end</property>
-                <property name="position">1</property>
-                <property name="secondary">True</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="close_button">
-                <property name="label" translatable="yes">_Close</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="is_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="has_default">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_underline">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
         <child>
           <object class="GtkBox" id="box">
             <property name="visible">True</property>
@@ -124,6 +58,7 @@
                 <property name="homogeneous">True</property>
                 <property name="transition-type">over-up-down</property>
                 <property name="transition-duration">600</property>
+                <signal name="notify::visible-child" handler="stack_visible_child_notify" swapped="no"/>
                 <child>
                   <object class="GtkBox" id="page_vbox">
                     <property name="visible">True</property>
@@ -224,11 +159,12 @@
                   </object>
                   <packing>
                     <property name="name">main</property>
+                    <property name="title" translatable="yes">About</property>
                   </packing>
                 </child>
                 <child>
                   <object class="GtkBox" id="credits_page">
-                    <property name="visible">True</property>
+                    <property name="visible">False</property>
                     <property name="can_focus">False</property>
                     <property name="orientation">vertical</property>
                     <property name="spacing">8</property>
@@ -296,11 +232,12 @@
                   </object>
                   <packing>
                     <property name="name">credits</property>
+                    <property name="title" translatable="yes">Credits</property>
                   </packing>
                 </child>
                 <child>
                   <object class="GtkBox" id="license_page">
-                    <property name="visible">True</property>
+                    <property name="visible">False</property>
                     <property name="can_focus">False</property>
                     <property name="orientation">vertical</property>
                     <property name="spacing">8</property>
@@ -334,6 +271,7 @@
                   </object>
                   <packing>
                     <property name="name">license</property>
+                    <property name="title" translatable="yes">License</property>
                   </packing>
                 </child>
               </object>
@@ -352,8 +290,5 @@
         </child>
       </object>
     </child>
-    <action-widgets>
-      <action-widget response="-6">close_button</action-widget>
-    </action-widgets>
   </template>
 </interface>
diff --git a/gtk/gtkaboutdialog.ui.h b/gtk/gtkaboutdialog.ui.h
index 55b41d5..80cd5b5 100644
--- a/gtk/gtkaboutdialog.ui.h
+++ b/gtk/gtkaboutdialog.ui.h
@@ -1,3 +1,3 @@
-N_("C_redits");
-N_("_License");
-N_("_Close");
+N_("About");
+N_("Credits");
+N_("License");


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