Use a stack in GtkAboutDialog

This lets us slide the credits and license sections up and down,
instead of just popping them into existence abruptly.
This commit is contained in:
Matthias Clasen 2013-09-25 23:50:51 -04:00
parent 256da35c11
commit 5315661721
2 changed files with 36 additions and 35 deletions

View File

@ -41,7 +41,7 @@
#include "gtklabel.h" #include "gtklabel.h"
#include "gtklinkbutton.h" #include "gtklinkbutton.h"
#include "gtkmarshalers.h" #include "gtkmarshalers.h"
#include "gtknotebook.h" #include "gtkstack.h"
#include "gtkorientable.h" #include "gtkorientable.h"
#include "gtkscrolledwindow.h" #include "gtkscrolledwindow.h"
#include "gtktextview.h" #include "gtktextview.h"
@ -142,10 +142,10 @@ struct _GtkAboutDialogPrivate
GSList *credit_sections; GSList *credit_sections;
gint credits_page; gboolean credits_page_initialized;
gint license_page; gboolean license_page_initialized;
GtkWidget *notebook; GtkWidget *stack;
GtkWidget *logo_image; GtkWidget *logo_image;
GtkWidget *name_label; GtkWidget *name_label;
GtkWidget *version_label; GtkWidget *version_label;
@ -169,12 +169,9 @@ struct _GtkAboutDialogPrivate
guint hovering_over_link : 1; guint hovering_over_link : 1;
guint wrap_license : 1; guint wrap_license : 1;
guint in_child_changed : 1;
}; };
/* The indexes of the credits and license page in the builder xml */
#define CREDITS_PAGE_ID 1
#define LICENSE_PAGE_ID 2
enum enum
{ {
PROP_0, PROP_0,
@ -558,7 +555,7 @@ gtk_about_dialog_class_init (GtkAboutDialogClass *klass)
gtk_widget_class_set_template_from_resource (widget_class, gtk_widget_class_set_template_from_resource (widget_class,
"/org/gtk/libgtk/gtkaboutdialog.ui"); "/org/gtk/libgtk/gtkaboutdialog.ui");
gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, notebook); gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, stack);
gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, logo_image); gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, logo_image);
gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, name_label); gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, name_label);
gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, version_label); gtk_widget_class_bind_template_child_private (widget_class, GtkAboutDialog, version_label);
@ -623,11 +620,11 @@ update_credits_button_visibility (GtkAboutDialog *about)
static void static void
switch_page (GtkAboutDialog *about, switch_page (GtkAboutDialog *about,
gint page) const gchar *name)
{ {
GtkAboutDialogPrivate *priv = about->priv; GtkAboutDialogPrivate *priv = about->priv;
gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), page); gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), name);
} }
static void static void
@ -636,7 +633,7 @@ display_main_page (GtkButton *button,
{ {
GtkAboutDialog *about = (GtkAboutDialog *)data; GtkAboutDialog *about = (GtkAboutDialog *)data;
switch_page (about, 0); switch_page (about, "main");
} }
static void static void
@ -647,11 +644,16 @@ credits_button_clicked (GtkButton *button,
GtkAboutDialogPrivate *priv = about->priv; GtkAboutDialogPrivate *priv = about->priv;
gboolean active; gboolean active;
if (priv->in_child_changed)
return;
active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
if (active) if (active)
{ {
priv->in_child_changed = TRUE;
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->license_button), FALSE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->license_button), FALSE);
priv->in_child_changed = FALSE;
display_credits_page (NULL, data); display_credits_page (NULL, data);
} }
else else
@ -668,11 +670,16 @@ license_button_clicked (GtkButton *button,
GtkAboutDialogPrivate *priv = about->priv; GtkAboutDialogPrivate *priv = about->priv;
gboolean active; gboolean active;
if (priv->in_child_changed)
return;
active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
if (active) if (active)
{ {
priv->in_child_changed = TRUE;
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->credits_button), FALSE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->credits_button), FALSE);
priv->in_child_changed = FALSE;
display_license_page (NULL, data); display_license_page (NULL, data);
} }
else else
@ -712,7 +719,7 @@ gtk_about_dialog_init (GtkAboutDialog *about)
gtk_widget_init_template (GTK_WIDGET (about)); gtk_widget_init_template (GTK_WIDGET (about));
switch_page (about, 0); switch_page (about, "main");
/* force defaults */ /* force defaults */
gtk_about_dialog_set_program_name (about, NULL); gtk_about_dialog_set_program_name (about, NULL);
@ -2325,13 +2332,13 @@ display_credits_page (GtkWidget *button,
GtkAboutDialog *about = (GtkAboutDialog *)data; GtkAboutDialog *about = (GtkAboutDialog *)data;
GtkAboutDialogPrivate *priv = about->priv; GtkAboutDialogPrivate *priv = about->priv;
if (priv->credits_page == 0) if (!priv->credits_page_initialized)
{ {
populate_credits_page (about); populate_credits_page (about);
priv->credits_page = CREDITS_PAGE_ID; priv->credits_page_initialized = TRUE;
} }
switch_page (about, priv->credits_page); switch_page (about, "credits");
} }
static void static void
@ -2357,13 +2364,13 @@ display_license_page (GtkWidget *button,
GtkAboutDialog *about = (GtkAboutDialog *)data; GtkAboutDialog *about = (GtkAboutDialog *)data;
GtkAboutDialogPrivate *priv = about->priv; GtkAboutDialogPrivate *priv = about->priv;
if (priv->license_page == 0) if (!priv->license_page_initialized)
{ {
populate_license_page (about); populate_license_page (about);
priv->license_page = LICENSE_PAGE_ID; priv->license_page_initialized = TRUE;
} }
switch_page (about, priv->license_page); switch_page (about, "license");
} }
/** /**
@ -2388,7 +2395,7 @@ close_cb (GtkAboutDialog *about)
{ {
GtkAboutDialogPrivate *priv = about->priv; GtkAboutDialogPrivate *priv = about->priv;
switch_page (about, 0); 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->credits_button), FALSE);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->license_button), FALSE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->license_button), FALSE);
gtk_widget_hide (GTK_WIDGET (about)); gtk_widget_hide (GTK_WIDGET (about));

View File

@ -116,13 +116,13 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkNotebook" id="notebook"> <object class="GtkStack" id="stack">
<property name="width_request">400</property> <property name="width_request">400</property>
<property name="height_request">100</property> <property name="height_request">100</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="show_tabs">False</property> <property name="homogeneous">True</property>
<property name="show_border">False</property> <property name="transition-type">over-up-down</property>
<child> <child>
<object class="GtkBox" id="page_vbox"> <object class="GtkBox" id="page_vbox">
<property name="visible">True</property> <property name="visible">True</property>
@ -218,9 +218,9 @@
</packing> </packing>
</child> </child>
</object> </object>
</child> <packing>
<child type="tab"> <property name="name">main</property>
<placeholder/> </packing>
</child> </child>
<child> <child>
<object class="GtkBox" id="credits_page"> <object class="GtkBox" id="credits_page">
@ -291,12 +291,9 @@
</child> </child>
</object> </object>
<packing> <packing>
<property name="position">1</property> <property name="name">credits</property>
</packing> </packing>
</child> </child>
<child type="tab">
<placeholder/>
</child>
<child> <child>
<object class="GtkBox" id="license_page"> <object class="GtkBox" id="license_page">
<property name="visible">True</property> <property name="visible">True</property>
@ -332,12 +329,9 @@
</child> </child>
</object> </object>
<packing> <packing>
<property name="position">2</property> <property name="name">license</property>
</packing> </packing>
</child> </child>
<child type="tab">
<placeholder/>
</child>
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>