[gtk+/dialogs: 13/25] about dialog: Use headerbar
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/dialogs: 13/25] about dialog: Use headerbar
- Date: Wed, 15 Jan 2014 12:33:26 +0000 (UTC)
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]