summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2014-05-28 17:32:21 +0200
committerMatthias Clasen <mclasen@redhat.com>2014-06-30 19:07:56 -0400
commitb6c4865ff813023d338fab93cd94b432a590a180 (patch)
treeb951ceff4e694a5c6ef34877610352db74e8ca47
parentbb6f406f137b6a054127d204125793f027f30730 (diff)
downloadgtk+-b6c4865ff813023d338fab93cd94b432a590a180.tar.gz
gtkaboutdialog: support showing buttons in action area
Give GtkAboutDialog buttons in the action area instead of hard-coding use-header-bar to TRUE. This is for environments which don't have the Gtk/DialogsUseHeader xsetting turned on. https://bugzilla.gnome.org/show_bug.cgi?id=730893
-rw-r--r--gtk/gtkaboutdialog.c119
1 files changed, 87 insertions, 32 deletions
diff --git a/gtk/gtkaboutdialog.c b/gtk/gtkaboutdialog.c
index d8a7096084..f5decfe24d 100644
--- a/gtk/gtkaboutdialog.c
+++ b/gtk/gtkaboutdialog.c
@@ -56,6 +56,7 @@
#include "gtkheaderbar.h"
#include "gtkprivate.h"
#include "gtkintl.h"
+#include "gtkdialogprivate.h"
/**
@@ -154,6 +155,9 @@ struct _GtkAboutDialogPrivate
GtkWidget *stack;
GtkWidget *stack_switcher;
+ GtkWidget *credits_button;
+ GtkWidget *license_button;
+
GtkWidget *logo_image;
GtkWidget *name_label;
GtkWidget *version_label;
@@ -178,6 +182,7 @@ struct _GtkAboutDialogPrivate
guint hovering_over_link : 1;
guint wrap_license : 1;
guint in_child_changed : 1;
+ guint in_switch_page : 1;
};
enum
@@ -239,6 +244,10 @@ static gboolean text_view_motion_notify_event (GtkWidget
static gboolean text_view_visibility_notify_event(GtkWidget *text_view,
GdkEventVisibility *event,
GtkAboutDialog *about);
+static void toggle_credits (GtkToggleButton *button,
+ gpointer user_data);
+static void toggle_license (GtkToggleButton *button,
+ gpointer user_data);
enum {
ACTIVATE_LINK,
@@ -279,37 +288,6 @@ stack_visible_child_notify (GtkStack *stack,
return FALSE;
}
-static GObject *
-gtk_about_dialog_constructor (GType type,
- guint n_construct_properties,
- GObjectConstructParam *construct_params)
-{
- GObject *object;
- guint idx;
- GParamSpec *pspec;
- GValue *value;
-
- for (idx = 0; idx < n_construct_properties; idx++)
- {
- pspec = construct_params[idx].pspec;
- if (g_strcmp0 (pspec->name, "use-header-bar") != 0)
- continue;
-
- /* GtkDialog uses "-1" to imply an unset value for this property */
- value = construct_params[idx].value;
- if (g_value_get_int (value) == -1)
- g_value_set_int (value, 1);
-
- break;
- }
-
- object = G_OBJECT_CLASS (gtk_about_dialog_parent_class)->constructor (type,
- n_construct_properties,
- construct_params);
-
- return object;
-}
-
static void
gtk_about_dialog_class_init (GtkAboutDialogClass *klass)
{
@@ -322,7 +300,6 @@ 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;
@@ -691,6 +668,51 @@ switch_page (GtkAboutDialog *about,
GtkAboutDialogPrivate *priv = about->priv;
gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), name);
+
+ priv->in_switch_page = TRUE;
+ if (priv->credits_button)
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->credits_button),
+ g_str_equal (name, "credits"));
+ if (priv->license_button)
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->license_button),
+ g_str_equal (name, "license"));
+ priv->in_switch_page = FALSE;
+}
+
+static void
+apply_use_header_bar (GtkAboutDialog *about)
+{
+ GtkAboutDialogPrivate *priv = about->priv;
+ gboolean use_header_bar;
+
+ g_object_get (about, "use-header-bar", &use_header_bar, NULL);
+ if (!use_header_bar)
+ {
+ GtkWidget *action_area;
+
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ action_area = gtk_dialog_get_action_area (GTK_DIALOG (about));
+ G_GNUC_END_IGNORE_DEPRECATIONS
+
+ priv->credits_button = gtk_toggle_button_new_with_mnemonic ("C_redits");
+ g_object_bind_property (priv->credits_page, "visible",
+ priv->credits_button, "visible", G_BINDING_SYNC_CREATE);
+ g_signal_connect (priv->credits_button, "toggled", G_CALLBACK (toggle_credits), about);
+ gtk_container_add_with_properties (GTK_CONTAINER (action_area), priv->credits_button,
+ "secondary", TRUE,
+ NULL);
+
+ priv->license_button = gtk_toggle_button_new_with_mnemonic ("_License");
+ g_object_bind_property (priv->license_page, "visible",
+ priv->license_button, "visible", G_BINDING_SYNC_CREATE);
+ g_signal_connect (priv->license_button, "toggled", G_CALLBACK (toggle_license), about);
+ gtk_container_add_with_properties (GTK_CONTAINER (action_area), priv->license_button,
+ "secondary", TRUE,
+ NULL);
+
+
+ gtk_dialog_add_button (GTK_DIALOG (about), "_Close", GTK_RESPONSE_DELETE_EVENT);
+ }
}
static void
@@ -724,6 +746,9 @@ gtk_about_dialog_init (GtkAboutDialog *about)
gtk_dialog_set_default_response (GTK_DIALOG (about), GTK_RESPONSE_CANCEL);
gtk_widget_init_template (GTK_WIDGET (about));
+ gtk_dialog_set_use_header_bar_from_setting (GTK_DIALOG (about));
+
+ apply_use_header_bar (about);
switch_page (about, "main");
update_stack_switcher_visibility (about);
@@ -906,6 +931,36 @@ gtk_about_dialog_get_property (GObject *object,
}
}
+static void
+toggle_credits (GtkToggleButton *button,
+ gpointer user_data)
+{
+ GtkAboutDialog *about = user_data;
+ GtkAboutDialogPrivate *priv = about->priv;
+ gboolean show_credits;
+
+ if (priv->in_switch_page)
+ return;
+
+ show_credits = gtk_toggle_button_get_active (button);
+ switch_page (about, show_credits ? "credits" : "main");
+}
+
+static void
+toggle_license (GtkToggleButton *button,
+ gpointer user_data)
+{
+ GtkAboutDialog *about = user_data;
+ GtkAboutDialogPrivate *priv = about->priv;
+ gboolean show_license;
+
+ if (priv->in_switch_page)
+ return;
+
+ show_license = gtk_toggle_button_get_active (button);
+ switch_page (about, show_license ? "license" : "main");
+}
+
static gboolean
gtk_about_dialog_activate_link (GtkAboutDialog *about,
const gchar *uri)