[gtk+/wip/baedert/visible-widgets] fontbutton: Be a GtkWidget



commit 26be0eaf1f10b2190aeea4c2b2d32161c7568fc3
Author: Timm Bäder <mail baedert org>
Date:   Thu Jan 19 20:15:43 2017 +0100

    fontbutton: Be a GtkWidget

 gtk/Makefile.am         |    1 -
 gtk/gtkfontbutton.c     |   93 +++++++++++++++++++++++++++++++++++++----------
 gtk/gtkfontbutton.h     |    4 +-
 gtk/ui/gtkfontbutton.ui |   46 -----------------------
 4 files changed, 76 insertions(+), 68 deletions(-)
---
diff --git a/gtk/Makefile.am b/gtk/Makefile.am
index 1040dcc..99e574c 100644
--- a/gtk/Makefile.am
+++ b/gtk/Makefile.am
@@ -1150,7 +1150,6 @@ templates =                               \
        ui/gtkdialog.ui         \
        ui/gtkfilechooserwidget.ui      \
        ui/gtkfilechooserdialog.ui      \
-       ui/gtkfontbutton.ui             \
        ui/gtkfontchooserdialog.ui      \
        ui/gtkfontchooserwidget.ui      \
        ui/gtkinfobar.ui                \
diff --git a/gtk/gtkfontbutton.c b/gtk/gtkfontbutton.c
index ab40312..fced535 100644
--- a/gtk/gtkfontbutton.c
+++ b/gtk/gtkfontbutton.c
@@ -74,6 +74,7 @@ struct _GtkFontButtonPrivate
   guint         show_size : 1;
   guint         show_preview_entry : 1;
 
+  GtkWidget     *button;
   GtkWidget     *font_dialog;
   GtkWidget     *font_label;
   GtkWidget     *size_label;
@@ -120,7 +121,8 @@ static void gtk_font_button_set_property           (GObject            *object,
                                                     const GValue       *value,
                                                     GParamSpec         *pspec);
 
-static void gtk_font_button_clicked                 (GtkButton         *button);
+static void gtk_font_button_clicked                 (GtkButton         *button,
+                                                     gpointer           user_data);
 
 /* Dialog response functions */
 static void response_cb                             (GtkDialog         *dialog,
@@ -437,28 +439,66 @@ gtk_font_button_font_chooser_iface_init (GtkFontChooserIface *iface)
   iface->get_font_map = gtk_font_button_font_chooser_get_font_map;
 }
 
-G_DEFINE_TYPE_WITH_CODE (GtkFontButton, gtk_font_button, GTK_TYPE_BUTTON,
+G_DEFINE_TYPE_WITH_CODE (GtkFontButton, gtk_font_button, GTK_TYPE_WIDGET,
                          G_ADD_PRIVATE (GtkFontButton)
                          G_IMPLEMENT_INTERFACE (GTK_TYPE_FONT_CHOOSER,
                                                 gtk_font_button_font_chooser_iface_init))
 
+
+static void
+gtk_font_button_measure (GtkWidget       *widget,
+                         GtkOrientation  orientation,
+                         int             for_size,
+                         int            *minimum,
+                         int            *natural,
+                         int            *minimum_baseline,
+                         int            *natural_baseline)
+{
+  GtkFontButton *button = GTK_FONT_BUTTON (widget);
+  GtkFontButtonPrivate *priv = gtk_font_button_get_instance_private (button);
+
+  gtk_widget_measure (priv->button, orientation, for_size,
+                      minimum, natural,
+                      minimum_baseline, natural_baseline);
+}
+
+static void
+gtk_font_button_snapshot (GtkWidget   *widget,
+                          GtkSnapshot *snapshot)
+{
+  GtkFontButton *button = GTK_FONT_BUTTON (widget);
+  GtkFontButtonPrivate *priv = gtk_font_button_get_instance_private (button);
+
+  gtk_widget_snapshot_child (widget, priv->button, snapshot);
+}
+
+static void
+gtk_font_button_size_allocate (GtkWidget     *widget,
+                               GtkAllocation *allocation)
+{
+  GtkFontButton *button = GTK_FONT_BUTTON (widget);
+  GtkFontButtonPrivate *priv = gtk_font_button_get_instance_private (button);
+
+  gtk_widget_size_allocate (priv->button, allocation);
+}
+
 static void
 gtk_font_button_class_init (GtkFontButtonClass *klass)
 {
   GObjectClass *gobject_class;
   GtkWidgetClass *widget_class;
-  GtkButtonClass *button_class;
   
   gobject_class = (GObjectClass *) klass;
   widget_class = (GtkWidgetClass *) klass;
-  button_class = (GtkButtonClass *) klass;
 
   gobject_class->finalize = gtk_font_button_finalize;
   gobject_class->set_property = gtk_font_button_set_property;
   gobject_class->get_property = gtk_font_button_get_property;
-  
-  button_class->clicked = gtk_font_button_clicked;
-  
+
+  widget_class->measure = gtk_font_button_measure;
+  widget_class->size_allocate = gtk_font_button_size_allocate;
+  widget_class->snapshot = gtk_font_button_snapshot;
+
   klass->font_set = NULL;
 
   _gtk_font_chooser_install_properties (gobject_class);
@@ -580,13 +620,6 @@ gtk_font_button_class_init (GtkFontButtonClass *klass)
                                                 g_cclosure_marshal_VOID__VOID,
                                                 G_TYPE_NONE, 0);
 
-  /* Bind class to template
-   */
-  gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/ui/gtkfontbutton.ui");
-  gtk_widget_class_bind_template_child_private (widget_class, GtkFontButton, font_label);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkFontButton, size_label);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkFontButton, font_size_box);
-
   gtk_widget_class_set_css_name (widget_class, "button");
 }
 
@@ -594,8 +627,29 @@ static void
 gtk_font_button_init (GtkFontButton *font_button)
 {
   GtkStyleContext *context;
+  GtkFontButtonPrivate *priv;
+  GtkWidget *box;
 
   font_button->priv = gtk_font_button_get_instance_private (font_button);
+  priv = font_button->priv;
+
+  gtk_widget_set_has_window (GTK_WIDGET (font_button), FALSE);
+
+  priv->button = gtk_button_new ();
+  g_signal_connect (priv->button, "clicked", G_CALLBACK (gtk_font_button_clicked), font_button);
+  priv->font_label = gtk_label_new (_("Font"));
+  priv->size_label = gtk_label_new ("14");
+  priv->font_size_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+
+  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+  gtk_container_add (GTK_CONTAINER (box), priv->font_label);
+ 
+  gtk_container_add (GTK_CONTAINER (priv->font_size_box), gtk_separator_new (GTK_ORIENTATION_VERTICAL));
+  gtk_container_add (GTK_CONTAINER (priv->font_size_box), priv->size_label);
+  gtk_container_add (GTK_CONTAINER (box), priv->font_size_box);
+
+  gtk_container_add (GTK_CONTAINER (priv->button), box);
+  gtk_widget_set_parent (priv->button, GTK_WIDGET (font_button));
 
   /* Initialize fields */
   font_button->priv->use_font = FALSE;
@@ -609,11 +663,9 @@ gtk_font_button_init (GtkFontButton *font_button)
   font_button->priv->font_size = -1;
   font_button->priv->title = g_strdup (_("Pick a Font"));
 
-  gtk_widget_init_template (GTK_WIDGET (font_button));
-
   gtk_font_button_take_font_desc (font_button, NULL);
 
-  context = gtk_widget_get_style_context (GTK_WIDGET (font_button));
+  context = gtk_widget_get_style_context (GTK_WIDGET (priv->button));
   gtk_style_context_add_class (context, "font");
 }
 
@@ -635,6 +687,8 @@ gtk_font_button_finalize (GObject *object)
 
   g_clear_object (&priv->provider);
 
+  gtk_widget_unparent (priv->button);
+
   G_OBJECT_CLASS (gtk_font_button_parent_class)->finalize (object);
 }
 
@@ -1039,10 +1093,11 @@ gtk_font_button_set_font_name (GtkFontButton *font_button,
 }
 
 static void
-gtk_font_button_clicked (GtkButton *button)
+gtk_font_button_clicked (GtkButton *button,
+                         gpointer   user_data)
 {
   GtkFontChooser *font_dialog;
-  GtkFontButton  *font_button = GTK_FONT_BUTTON (button);
+  GtkFontButton  *font_button = user_data;
   GtkFontButtonPrivate *priv = font_button->priv;
   
   if (!font_button->priv->font_dialog) 
diff --git a/gtk/gtkfontbutton.h b/gtk/gtkfontbutton.h
index 2a7dae6..22e6aef 100644
--- a/gtk/gtkfontbutton.h
+++ b/gtk/gtkfontbutton.h
@@ -50,14 +50,14 @@ typedef struct _GtkFontButtonClass   GtkFontButtonClass;
 typedef struct _GtkFontButtonPrivate GtkFontButtonPrivate;
 
 struct _GtkFontButton {
-  GtkButton button;
+  GtkWidget parent_instance;
 
   /*< private >*/
   GtkFontButtonPrivate *priv;
 };
 
 struct _GtkFontButtonClass {
-  GtkButtonClass parent_class;
+  GtkWidgetClass parent_class;
 
   /* font_set signal is emitted when font is chosen */
   void (* font_set) (GtkFontButton *gfp);


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