diff options
author | Tristan Van Berkom <tristanvb@openismus.com> | 2013-03-23 20:38:43 +0900 |
---|---|---|
committer | Tristan Van Berkom <tristanvb@openismus.com> | 2013-04-08 21:19:28 +0900 |
commit | c6aa7cc92debd619205ce7fafd6cd79facfae047 (patch) | |
tree | e4baa9f3c457383b4f2f89e01c20ff5c5fa668af /gtk | |
parent | b9fd422acab397f47d9cf6213a6957d7d83d38e8 (diff) | |
download | gtk+-c6aa7cc92debd619205ce7fafd6cd79facfae047.tar.gz |
GtkStatusbar: Define children with a GtkBuilder template
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/Makefile.am | 3 | ||||
-rw-r--r-- | gtk/gtk.gresource.xml | 1 | ||||
-rw-r--r-- | gtk/gtkstatusbar.c | 80 | ||||
-rw-r--r-- | gtk/gtkstatusbar.ui | 50 | ||||
-rw-r--r-- | gtk/tests/templates.c | 11 |
5 files changed, 81 insertions, 64 deletions
diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 1e375aff79..b680487194 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -1102,7 +1102,8 @@ COMPOSITE_TEMPLATES = \ gtkinfobar.ui \ gtklockbutton.ui \ gtkmessagedialog.ui \ - gtkscalebutton.ui + gtkscalebutton.ui \ + gtkstatusbar.ui # # rules to generate built sources diff --git a/gtk/gtk.gresource.xml b/gtk/gtk.gresource.xml index 856b450c53..79b269cd7f 100644 --- a/gtk/gtk.gresource.xml +++ b/gtk/gtk.gresource.xml @@ -18,5 +18,6 @@ <file compressed="true">gtklockbutton.ui</file> <file compressed="true">gtkmessagedialog.ui</file> <file compressed="true">gtkscalebutton.ui</file> + <file compressed="true">gtkstatusbar.ui</file> </gresource> </gresources> diff --git a/gtk/gtkstatusbar.c b/gtk/gtkstatusbar.c index 47350376ad..f5398b9cce 100644 --- a/gtk/gtkstatusbar.c +++ b/gtk/gtkstatusbar.c @@ -34,7 +34,6 @@ #include "gtkwindow.h" #include "gtkprivate.h" #include "gtkintl.h" -#include "gtkbuildable.h" #include "gtkorientable.h" #include "gtktypebuiltins.h" #include "a11y/gtkstatusbaraccessible.h" @@ -80,6 +79,7 @@ struct _GtkStatusbarPrivate { GtkWidget *frame; GtkWidget *label; + GtkWidget *message_area; GSList *messages; GSList *keys; @@ -103,10 +103,6 @@ enum SIGNAL_LAST }; -static void gtk_statusbar_buildable_interface_init (GtkBuildableIface *iface); -static GObject *gtk_statusbar_buildable_get_internal_child (GtkBuildable *buildable, - GtkBuilder *builder, - const gchar *childname); static void gtk_statusbar_update (GtkStatusbar *statusbar, guint context_id, const gchar *text); @@ -120,16 +116,12 @@ static void gtk_statusbar_hierarchy_changed (GtkWidget *widget, static guint statusbar_signals[SIGNAL_LAST] = { 0 }; -G_DEFINE_TYPE_WITH_CODE (GtkStatusbar, gtk_statusbar, GTK_TYPE_BOX, - G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, - gtk_statusbar_buildable_interface_init)); +G_DEFINE_TYPE (GtkStatusbar, gtk_statusbar, GTK_TYPE_BOX); static void gtk_statusbar_class_init (GtkStatusbarClass *class) { - GtkWidgetClass *widget_class; - - widget_class = (GtkWidgetClass *) class; + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); widget_class->realize = gtk_statusbar_realize; widget_class->destroy = gtk_statusbar_destroy; @@ -185,17 +177,22 @@ gtk_statusbar_class_init (GtkStatusbarClass *class) GTK_SHADOW_IN, GTK_PARAM_READABLE)); - g_type_class_add_private (class, sizeof (GtkStatusbarPrivate)); + /* Bind class to template + */ + gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/gtkstatusbar.ui"); + gtk_widget_class_bind_child_internal (widget_class, GtkStatusbarPrivate, message_area); + gtk_widget_class_bind_child (widget_class, GtkStatusbarPrivate, frame); + gtk_widget_class_bind_child (widget_class, GtkStatusbarPrivate, label); + + g_type_class_add_private (class, sizeof (GtkStatusbarPrivate)); - gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_STATUSBAR_ACCESSIBLE); + gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_STATUSBAR_ACCESSIBLE); } static void gtk_statusbar_init (GtkStatusbar *statusbar) { GtkStatusbarPrivate *priv; - GtkBox *box = GTK_BOX (statusbar); - GtkWidget *message_area; GtkShadowType shadow_type; statusbar->priv = G_TYPE_INSTANCE_GET_PRIVATE (statusbar, @@ -203,59 +200,16 @@ gtk_statusbar_init (GtkStatusbar *statusbar) GtkStatusbarPrivate); priv = statusbar->priv; - gtk_widget_set_redraw_on_allocate (GTK_WIDGET (box), TRUE); - - gtk_box_set_spacing (box, 2); - gtk_box_set_homogeneous (box, FALSE); - - gtk_widget_style_get (GTK_WIDGET (statusbar), "shadow-type", &shadow_type, NULL); - - priv->frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (priv->frame), shadow_type); - gtk_box_pack_start (box, priv->frame, TRUE, TRUE, 0); - gtk_widget_show (priv->frame); - - message_area = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); - gtk_container_add (GTK_CONTAINER (priv->frame), message_area); - gtk_widget_show (message_area); - - priv->label = gtk_label_new (""); - gtk_label_set_single_line_mode (GTK_LABEL (priv->label), TRUE); - gtk_widget_set_halign (priv->label, GTK_ALIGN_START); - gtk_widget_set_valign (priv->label, GTK_ALIGN_CENTER); - gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_END); - gtk_container_add (GTK_CONTAINER (message_area), priv->label); - gtk_widget_show (priv->label); - priv->seq_context_id = 1; priv->seq_message_id = 1; priv->messages = NULL; priv->keys = NULL; -} - -static GtkBuildableIface *parent_buildable_iface; -static void -gtk_statusbar_buildable_interface_init (GtkBuildableIface *iface) -{ - parent_buildable_iface = g_type_interface_peek_parent (iface); - iface->get_internal_child = gtk_statusbar_buildable_get_internal_child; -} + gtk_widget_init_template (GTK_WIDGET (statusbar)); -static GObject * -gtk_statusbar_buildable_get_internal_child (GtkBuildable *buildable, - GtkBuilder *builder, - const gchar *childname) -{ - GtkStatusbar *statusbar = GTK_STATUSBAR (buildable); - GtkStatusbarPrivate *priv = statusbar->priv; - - if (strcmp (childname, "message_area") == 0) - return G_OBJECT (gtk_bin_get_child (GTK_BIN (priv->frame))); - - return parent_buildable_iface->get_internal_child (buildable, - builder, - childname); + gtk_widget_set_redraw_on_allocate (GTK_WIDGET (statusbar), TRUE); + gtk_widget_style_get (GTK_WIDGET (statusbar), "shadow-type", &shadow_type, NULL); + gtk_frame_set_shadow_type (GTK_FRAME (priv->frame), shadow_type); } /** @@ -580,7 +534,7 @@ gtk_statusbar_get_message_area (GtkStatusbar *statusbar) priv = statusbar->priv; - return gtk_bin_get_child (GTK_BIN (priv->frame)); + return priv->message_area; } static void diff --git a/gtk/gtkstatusbar.ui b/gtk/gtkstatusbar.ui new file mode 100644 index 0000000000..39bacbca5b --- /dev/null +++ b/gtk/gtkstatusbar.ui @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface domain="gtk30"> + <!-- interface-requires gtk+ 3.10 --> + <template class="GtkStatusbar" parent="GtkBox"> + <property name="can_focus">False</property> + <property name="vexpand">False</property> + <property name="spacing">2</property> + <child> + <object class="GtkFrame" id="frame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkBox" id="message_area"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">4</property> + <child> + <object class="GtkLabel" id="label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="valign">center</property> + <property name="ellipsize">end</property> + <property name="single_line_mode">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </template> +</interface> diff --git a/gtk/tests/templates.c b/gtk/tests/templates.c index 7cf7c63a8d..15afa28b43 100644 --- a/gtk/tests/templates.c +++ b/gtk/tests/templates.c @@ -109,6 +109,16 @@ test_scale_button_basic (void) gtk_widget_destroy (widget); } +static void +test_statusbar_basic (void) +{ + GtkWidget *widget; + + widget = gtk_statusbar_new (); + g_assert (GTK_IS_STATUSBAR (widget)); + gtk_widget_destroy (widget); +} + int main (int argc, char **argv) { @@ -129,6 +139,7 @@ main (int argc, char **argv) g_test_add_func ("/Template/GtkLockButton/Basic", test_lock_button_basic); g_test_add_func ("/Template/GtkAssistant/Basic", test_assistant_basic); g_test_add_func ("/Template/GtkScaleButton/Basic", test_scale_button_basic); + g_test_add_func ("/Template/GtkStatusBar/Basic", test_statusbar_basic); return g_test_run(); } |