[glade] Added true-string and false-string properties Start using default height and biggest width of both t



commit 9b100d8ef5e421166a5ceaf028b17b859164e113
Author: Juan Pablo Ugarte <juanpablougarte gmail com>
Date:   Mon Apr 1 16:33:37 2013 -0300

    Added true-string and false-string properties
    Start using default height and biggest width of both true and false string including normal button 
paddings

 gladeui/glade-bool-toggle.c |  153 +++++++++++++++++++++++++++++++++----------
 gladeui/glade-bool-toggle.h |    7 +-
 2 files changed, 121 insertions(+), 39 deletions(-)
---
diff --git a/gladeui/glade-bool-toggle.c b/gladeui/glade-bool-toggle.c
index 8038ef6..af918f5 100644
--- a/gladeui/glade-bool-toggle.c
+++ b/gladeui/glade-bool-toggle.c
@@ -25,19 +25,48 @@
 #include <config.h>
 #endif
 
-#define TRUE_STRING _("<span color='green'>✓</span>True")
-#define FALSE_STRING _("<span color='red'>✗</span>False")
-
 #include "glade-bool-toggle.h"
 #include <glib/gi18n-lib.h>
 
+enum
+{
+  PROP_0,
+  PROP_TRUE_STRING,
+  PROP_FALSE_STRING
+};
+
+struct _GladeBoolTogglePrivate
+{
+  gchar *true_string;
+  gchar *false_string;
+};
+
+#define GLADE_BOOL_TOGGLE_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), \
+                                               GLADE_TYPE_BOOL_TOGGLE,                \
+                                               GladeBoolTogglePrivate))
+#define GLADE_BOOL_TOGGLE_PRIVATE(object) (((GladeBoolToggle*)object)->priv)
+
 G_DEFINE_TYPE (GladeBoolToggle, glade_bool_toggle, GTK_TYPE_TOGGLE_BUTTON);
 
+
+/* translators: This is the string used in boolean property editor toggle button when is active */
+#define TRUE_STRING  _("<span color='green'>✓</span>True")
+
+/* translators: This is the string used in boolean property editor toggle button when is not active */
+#define FALSE_STRING _("<span color='red'>✗</span>False")
+
 static void
 glade_bool_toggle_init (GladeBoolToggle *toggle)
 {
+  GladeBoolTogglePrivate *priv = GLADE_BOOL_TOGGLE_GET_PRIVATE (toggle);
   GtkWidget *label = gtk_label_new ("");
-  gtk_label_set_markup (GTK_LABEL (label), FALSE_STRING);
+
+  toggle->priv = priv;
+
+  priv->true_string = g_strdup (TRUE_STRING);
+  priv->false_string = g_strdup (FALSE_STRING);
+
+  gtk_label_set_markup (GTK_LABEL (label), priv->false_string);
   gtk_container_add (GTK_CONTAINER (toggle), label);
   gtk_widget_show (label);
 }
@@ -49,32 +78,36 @@ glade_bool_toggle_finalize (GObject *object)
 }
 
 static gint
-layout_get_value (PangoLayout *layout, const gchar *string, gboolean width)
+layout_get_value (PangoLayout *layout, const gchar *string)
 {
   PangoRectangle rect;
   pango_layout_set_markup (layout, string, -1);
   pango_layout_get_extents (layout, NULL, &rect);
   pango_extents_to_pixels (&rect, NULL);
-  return width ? rect.width : rect.height;
+  return rect.width;
 }
 
 static void
-glade_bool_toggle_get_preferred_size (GtkWidget *widget,
-                                      gboolean   width,
-                                      gint      *minimum,
-                                      gint      *natural)
+glade_bool_toggle_get_preferred_width (GtkWidget *widget,
+                                       gint      *minimum,
+                                       gint      *natural)
 {
-  PangoLayout *layout;
-  gint value, tmp;
+  GladeBoolTogglePrivate *priv = GLADE_BOOL_TOGGLE_PRIVATE (widget);
+  PangoLayout *layout = gtk_widget_create_pango_layout (widget, "");
+  GtkWidget *label = gtk_bin_get_child (GTK_BIN (widget));
+  gint value, width, true_width, false_width;
+
+  GTK_WIDGET_CLASS (glade_bool_toggle_parent_class)->get_preferred_width (widget, &width, NULL);
+
+  true_width = layout_get_value (layout, priv->true_string);
+  false_width = layout_get_value (layout, priv->false_string);
 
-  layout = gtk_widget_create_pango_layout (widget, "");
-    
-  value = MAX (layout_get_value (layout, TRUE_STRING, width),
-               layout_get_value (layout, FALSE_STRING, width));
+  if (g_strcmp0 (gtk_label_get_label (GTK_LABEL (label)), priv->true_string))
+    value = width - false_width;
+  else
+    value = width - true_width;
 
-  /* Add some extra spacing */
-  tmp = layout_get_value (layout, (width) ? "-" : "'", TRUE);
-  value += (width) ? tmp*2 : tmp;
+  value += MAX (true_width, false_width);
 
   g_object_unref (layout);
 
@@ -86,32 +119,65 @@ glade_bool_toggle_get_preferred_size (GtkWidget *widget,
 }
 
 static void
-glade_bool_toggle_get_preferred_width (GtkWidget *widget,
-                                       gint      *minimum,
-                                       gint      *natural)
+glade_bool_toggle_toggled (GtkToggleButton *toggle_button)
 {
-  glade_bool_toggle_get_preferred_size (widget, TRUE, minimum, natural);
+  GladeBoolTogglePrivate *priv = GLADE_BOOL_TOGGLE_PRIVATE (toggle_button);
+  GtkWidget *label = gtk_bin_get_child (GTK_BIN (toggle_button));
+
+  if (GTK_IS_LABEL (label))
+    {
+      if (gtk_toggle_button_get_active (toggle_button))
+        gtk_label_set_markup (GTK_LABEL (label), priv->true_string);
+      else
+        gtk_label_set_markup (GTK_LABEL (label), priv->false_string);
+    }
 }
 
 static void
-glade_bool_toggle_get_preferred_height (GtkWidget *widget,
-                                        gint      *minimum,
-                                        gint      *natural)
+glade_bool_toggle_set_property (GObject *object,
+                                guint prop_id,
+                                const GValue *value,
+                                GParamSpec *pspec)
 {
-  glade_bool_toggle_get_preferred_size (widget, FALSE, minimum, natural);
+  GladeBoolTogglePrivate *priv = GLADE_BOOL_TOGGLE_PRIVATE (object);
+  
+  switch (prop_id)
+    {
+      case PROP_TRUE_STRING:
+        g_free (priv->true_string);
+        priv->true_string = g_value_dup_string (value);
+        glade_bool_toggle_toggled (GTK_TOGGLE_BUTTON (object));
+      break;
+      case PROP_FALSE_STRING:
+        g_free (priv->false_string);
+        priv->false_string = g_value_dup_string (value);
+        glade_bool_toggle_toggled (GTK_TOGGLE_BUTTON (object));
+      break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
 }
 
 static void
-glade_bool_toggle_toggled (GtkToggleButton *toggle_button)
+glade_bool_toggle_get_property (GObject *object,
+                                guint prop_id,
+                                GValue *value,
+                                GParamSpec *pspec)
 {
-  GtkWidget *label = gtk_bin_get_child (GTK_BIN (toggle_button));
-
-  if (GTK_IS_LABEL (label))
+  GladeBoolTogglePrivate *priv = GLADE_BOOL_TOGGLE_PRIVATE (object);
+  
+  switch (prop_id)
     {
-      if (gtk_toggle_button_get_active (toggle_button))
-        gtk_label_set_markup (GTK_LABEL (label), TRUE_STRING);
-      else
-        gtk_label_set_markup (GTK_LABEL (label), FALSE_STRING);
+      case PROP_TRUE_STRING:
+        g_value_set_string (value, priv->true_string);
+      break;
+      case PROP_FALSE_STRING:
+        g_value_set_string (value, priv->false_string);
+      break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
     }
 }
 
@@ -122,10 +188,25 @@ glade_bool_toggle_class_init (GladeBoolToggleClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   GtkToggleButtonClass *toggle_class = GTK_TOGGLE_BUTTON_CLASS (klass);
 
+  object_class->get_property = glade_bool_toggle_get_property;
+  object_class->set_property = glade_bool_toggle_set_property;
   object_class->finalize = glade_bool_toggle_finalize;
   widget_class->get_preferred_width = glade_bool_toggle_get_preferred_width;
-  widget_class->get_preferred_height = glade_bool_toggle_get_preferred_height;
   toggle_class->toggled = glade_bool_toggle_toggled;
+
+  g_object_class_install_property (object_class, PROP_TRUE_STRING,
+                                   g_param_spec_string ("true-string", "True string",
+                                                        "String to use when toggled",
+                                                        TRUE_STRING,
+                                                        G_PARAM_READWRITE));
+
+  g_object_class_install_property (object_class, PROP_FALSE_STRING,
+                                   g_param_spec_string ("false-string", "False string",
+                                                        "String to use when not toggled",
+                                                        FALSE_STRING,
+                                                        G_PARAM_READWRITE));
+
+  g_type_class_add_private (object_class, sizeof (GladeBoolTogglePrivate));
 }
 
 GtkWidget *
diff --git a/gladeui/glade-bool-toggle.h b/gladeui/glade-bool-toggle.h
index 186c5b3..ae1f6e2 100644
--- a/gladeui/glade-bool-toggle.h
+++ b/gladeui/glade-bool-toggle.h
@@ -35,8 +35,9 @@ G_BEGIN_DECLS
 #define GLADE_IS_BOOL_TOGGLE_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_BOOL_TOGGLE))
 #define GLADE_BOOL_TOGGLE_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_TYPE_BOOL_TOGGLE, 
GladeBoolToggleClass))
 
-typedef struct _GladeBoolToggleClass GladeBoolToggleClass;
-typedef struct _GladeBoolToggle GladeBoolToggle;
+typedef struct _GladeBoolToggle        GladeBoolToggle;
+typedef struct _GladeBoolTogglePrivate GladeBoolTogglePrivate;
+typedef struct _GladeBoolToggleClass   GladeBoolToggleClass;
 
 struct _GladeBoolToggleClass
 {
@@ -46,7 +47,7 @@ struct _GladeBoolToggleClass
 struct _GladeBoolToggle
 {
   GtkToggleButton parent_instance;
-  gpointer priv;
+  GladeBoolTogglePrivate *priv;
 };
 
 GType glade_bool_toggle_get_type (void) G_GNUC_CONST;


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