SF.net SVN: geany-plugins:[1869] trunk/geany-plugins/webhelper/src

colombanw at users.sourceforge.net colombanw at xxxxx
Sun Jan 23 14:24:17 UTC 2011


Revision: 1869
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1869&view=rev
Author:   colombanw
Date:     2011-01-23 14:24:16 +0000 (Sun, 23 Jan 2011)

Log Message:
-----------
WebHelper: Add notification support for settings display widgets

Add support for callbacks when the value displayed by a widget changes.
This might be useful to e.g. update the sensitivity of another widget
if it depends on a setting that was just disabled.

Modified Paths:
--------------
    trunk/geany-plugins/webhelper/src/gwh-settings.c
    trunk/geany-plugins/webhelper/src/gwh-settings.h

Modified: trunk/geany-plugins/webhelper/src/gwh-settings.c
===================================================================
--- trunk/geany-plugins/webhelper/src/gwh-settings.c	2011-01-23 11:30:25 UTC (rev 1868)
+++ trunk/geany-plugins/webhelper/src/gwh-settings.c	2011-01-23 14:24:16 UTC (rev 1869)
@@ -456,9 +456,40 @@
 
 /* display/edit widgets stuff */
 
+/*
+ * gwh_settings_widget_<type>_notify:
+ *   calls user's callback with appropriate arguments
+ * gwh_settings_widget_<type>_notify_callback:
+ *   a callback connected to a signal on the widget.
+ *   calls gwh_settings_widget_<type>_notify
+ * gwh_settings_widget_<type>_new:
+ *   creates the widget
+ * gwh_settings_widget_<type>_sync:
+ *   syncs widget's value with its setting
+ */
 
+
+typedef struct _GwhSettingsWidgetNotifyData
+{
+  GwhSettings  *settings;
+  GCallback     callback;
+  gpointer      user_data;
+} GwhSettingsWidgetNotifyData;
+
+
+static void
+gwh_settings_widget_boolean_notify (GObject                      *tbutton,
+                                    GwhSettingsWidgetNotifyData  *data)
+{
+  ((GwhSettingsWidgetBooleanNotify)data->callback) (data->settings,
+                                                    gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tbutton)),
+                                                    data->user_data);
+}
+
+#define gwh_settings_widget_boolean_notify_callback gwh_settings_widget_boolean_notify
+
 static GtkWidget *
-gwh_settings_widget_new_boolean (GwhSettings   *self,
+gwh_settings_widget_boolean_new (GwhSettings   *self,
                                  const GValue  *value,
                                  GParamSpec    *pspec,
                                  gboolean      *needs_label)
@@ -474,7 +505,7 @@
 }
 
 static void
-gwh_settings_widget_sync_boolean (GwhSettings *self,
+gwh_settings_widget_boolean_sync (GwhSettings *self,
                                   GParamSpec  *pspec,
                                   GtkWidget   *widget)
 {
@@ -483,8 +514,26 @@
                 NULL);
 }
 
+static void
+gwh_settings_widget_enum_notify (GObject                     *object,
+                                 GwhSettingsWidgetNotifyData *data)
+{
+  GtkTreeIter   iter;
+  GtkComboBox  *cbox = GTK_COMBO_BOX (object);
+  
+  if (gtk_combo_box_get_active_iter (cbox, &iter)) {
+    gint val;
+    
+    gtk_tree_model_get (gtk_combo_box_get_model (cbox), &iter, 0, &val, -1);
+    ((GwhSettingsWidgetEnumNotify)data->callback) (data->settings, val,
+                                                   data->user_data);
+  }
+}
+
+#define gwh_settings_widget_enum_notify_callback gwh_settings_widget_enum_notify
+
 static GtkWidget *
-gwh_settings_widget_new_enum (GwhSettings  *self,
+gwh_settings_widget_enum_new (GwhSettings  *self,
                               const GValue *value,
                               GParamSpec   *pspec,
                               gboolean     *needs_label)
@@ -525,7 +574,7 @@
 }
 
 static void
-gwh_settings_widget_sync_enum (GwhSettings *self,
+gwh_settings_widget_enum_sync (GwhSettings *self,
                                GParamSpec  *pspec,
                                GtkWidget   *widget)
 {
@@ -541,8 +590,19 @@
   }
 }
 
+static void
+gwh_settings_widget_int_notify (GObject                     *spin,
+                                GwhSettingsWidgetNotifyData *data)
+{
+  ((GwhSettingsWidgetIntNotify)data->callback) (data->settings,
+                                                gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin)),
+                                                data->user_data);
+}
+
+#define gwh_settings_widget_int_notify_callback gwh_settings_widget_int_notify
+
 static GtkWidget *
-gwh_settings_widget_new_int (GwhSettings  *self,
+gwh_settings_widget_int_new (GwhSettings  *self,
                              const GValue *value,
                              GParamSpec   *pspec,
                              gboolean     *needs_label)
@@ -562,7 +622,7 @@
 }
 
 static void
-gwh_settings_widget_sync_int (GwhSettings *self,
+gwh_settings_widget_int_sync (GwhSettings *self,
                               GParamSpec  *pspec,
                               GtkWidget   *widget)
 {
@@ -571,8 +631,25 @@
                 NULL);
 }
 
+static void
+gwh_settings_widget_string_notify (GObject                     *entry,
+                                   GwhSettingsWidgetNotifyData *data)
+{
+  ((GwhSettingsWidgetStringNotify)data->callback) (data->settings,
+                                                   gtk_entry_get_text (GTK_ENTRY (entry)),
+                                                   data->user_data);
+}
+
+static void
+gwh_settings_widget_string_notify_callback (GObject                     *object,
+                                            GParamSpec                  *pspec,
+                                            GwhSettingsWidgetNotifyData *data)
+{
+  gwh_settings_widget_string_notify (object, data);
+}
+
 static GtkWidget *
-gwh_settings_widget_new_string (GwhSettings  *self,
+gwh_settings_widget_string_new (GwhSettings  *self,
                                 const GValue *value,
                                 GParamSpec   *pspec,
                                 gboolean     *needs_label)
@@ -587,7 +664,7 @@
 }
 
 static void
-gwh_settings_widget_sync_string (GwhSettings *self,
+gwh_settings_widget_string_sync (GwhSettings *self,
                                  GParamSpec  *pspec,
                                  GtkWidget   *widget)
 {
@@ -599,9 +676,30 @@
 #define KEY_PSPEC   "gwh-settings-configure-pspec"
 #define KEY_WIDGET  "gwh-settings-configure-widget"
 
+/**
+ * gwh_settings_widget_new_full:
+ * @self: A GwhSettings object
+ * @prop_name: the name of the setting for which create a widget
+ * @setting_changed_callback: a callback to be called when the widget's value
+ *                            changes, or %NULL. The type of the callback
+ *                            is GwhSettingsWidget*Notify, depending of the
+ *                            setting type
+ * @user_data: user data to pass to @callback
+ * @notify_flags: notification flags
+ * 
+ * Creates a widgets to configure the value of a setting @prop_name.
+ * This setting will not be changed automatically, you'll need to call
+ * gwh_settings_widget_sync() when you want to synchronize the widget's value to
+ * the setting.
+ * 
+ * Returns: A #GtkWidget that displays and edit @prop_name.
+ */
 GtkWidget *
-gwh_settings_widget_new (GwhSettings *self,
-                         const gchar *prop_name)
+gwh_settings_widget_new_full (GwhSettings            *self,
+                              const gchar            *prop_name,
+                              GCallback               setting_changed_callback,
+                              gpointer                user_data,
+                              GwhSettingsNotifyFlags  notify_flags)
 {
   GtkWidget  *widget      = NULL;
   GParamSpec *pspec;
@@ -616,13 +714,29 @@
   g_value_init (&value, pspec->value_type);
   g_object_get_property (G_OBJECT (self), prop_name, &value);
   switch (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (&value))) {
-    #define HANDLE_TYPE(T, h) \
-      case T: widget = ((h) (self, &value, pspec, &needs_label)); break;
+    #define HANDLE_TYPE(T, t, signal)                                          \
+      case G_TYPE_##T:                                                         \
+        widget = gwh_settings_widget_##t##_new (self, &value, pspec,           \
+                                                &needs_label);                 \
+        if (setting_changed_callback) {                                        \
+          GwhSettingsWidgetNotifyData *data = g_malloc (sizeof *data);         \
+                                                                               \
+          data->settings  = self;                                              \
+          data->callback  = setting_changed_callback;                          \
+          data->user_data = user_data;                                         \
+          g_signal_connect_data (widget, signal,                               \
+                                 G_CALLBACK (gwh_settings_widget_##t##_notify_callback),\
+                                 data, (GClosureNotify)g_free, 0);             \
+          if (notify_flags & GWH_SETTINGS_NOTIFY_ON_CONNEXION) {               \
+            gwh_settings_widget_##t##_notify (G_OBJECT (widget), data);        \
+          }                                                                    \
+        }                                                                      \
+        break;
     
-    HANDLE_TYPE (G_TYPE_BOOLEAN,  gwh_settings_widget_new_boolean)
-    HANDLE_TYPE (G_TYPE_ENUM,     gwh_settings_widget_new_enum)
-    HANDLE_TYPE (G_TYPE_INT,      gwh_settings_widget_new_int)
-    HANDLE_TYPE (G_TYPE_STRING,   gwh_settings_widget_new_string)
+    HANDLE_TYPE (BOOLEAN, boolean,  "toggled")
+    HANDLE_TYPE (ENUM,    enum,     "changed")
+    HANDLE_TYPE (INT,     int,      "value-changed")
+    HANDLE_TYPE (STRING,  string,   "notify::text")
     
     #undef HANDLE_TYPE
     
@@ -656,6 +770,13 @@
   return widget;
 }
 
+GtkWidget *
+gwh_settings_widget_new (GwhSettings *self,
+                         const gchar *prop_name)
+{
+  return gwh_settings_widget_new_full (self, prop_name, NULL, NULL, 0);
+}
+
 void
 gwh_settings_widget_sync (GwhSettings *self,
                           GtkWidget   *widget)
@@ -670,12 +791,15 @@
   pspec = g_object_get_data (G_OBJECT (widget), KEY_PSPEC);
   g_return_if_fail (G_IS_PARAM_SPEC (pspec));
   switch (G_TYPE_FUNDAMENTAL (pspec->value_type)) {
-    #define HANDLE_TYPE(T, h) case T: (h) (self, pspec, widget); break;
+    #define HANDLE_TYPE(T, t)                                                  \
+      case G_TYPE_##T:                                                         \
+        gwh_settings_widget_##t##_sync (self, pspec, widget);                  \
+        break;
     
-    HANDLE_TYPE (G_TYPE_BOOLEAN,  gwh_settings_widget_sync_boolean)
-    HANDLE_TYPE (G_TYPE_ENUM,     gwh_settings_widget_sync_enum)
-    HANDLE_TYPE (G_TYPE_INT,      gwh_settings_widget_sync_int)
-    HANDLE_TYPE (G_TYPE_STRING,   gwh_settings_widget_sync_string)
+    HANDLE_TYPE (BOOLEAN,  boolean)
+    HANDLE_TYPE (ENUM,     enum)
+    HANDLE_TYPE (INT,      int)
+    HANDLE_TYPE (STRING,   string)
     
     #undef HANDLE_TYPE
     

Modified: trunk/geany-plugins/webhelper/src/gwh-settings.h
===================================================================
--- trunk/geany-plugins/webhelper/src/gwh-settings.h	2011-01-23 11:30:25 UTC (rev 1868)
+++ trunk/geany-plugins/webhelper/src/gwh-settings.h	2011-01-23 14:24:16 UTC (rev 1869)
@@ -34,9 +34,35 @@
 #define GWH_IS_SETTINGS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GWH_TYPE_SETTINGS))
 
 
+/**
+ * GwhSettingsNotifyFlags:
+ * @GWH_SETTINGS_NOTIFY_NONE: 0, no flags
+ * @GWH_SETTINGS_NOTIFY_ON_CONNEXION: Call user callback just after widget
+ *                                    creation.
+ * 
+ * Notification flags for gwh_settings_widget_new_full().
+ */
+typedef enum _GwhSettingsNotifyFlags
+{
+  GWH_SETTINGS_NOTIFY_NONE          = 0,
+  GWH_SETTINGS_NOTIFY_ON_CONNEXION  = 1<<0
+} GwhSettingsNotifyFlags;
+
 typedef struct _GwhSettings         GwhSettings;
 typedef struct _GwhSettingsClass    GwhSettingsClass;
 typedef struct _GwhSettingsPrivate  GwhSettingsPrivate;
+typedef void (*GwhSettingsWidgetBooleanNotify)  (GwhSettings *settings,
+                                                 gboolean     value,
+                                                 gpointer     data);
+typedef void (*GwhSettingsWidgetEnumNotify)     (GwhSettings *settings,
+                                                 gint         value,
+                                                 gpointer     data);
+typedef void (*GwhSettingsWidgetIntNotify)      (GwhSettings *settings,
+                                                 gint         value,
+                                                 gpointer     data);
+typedef void (*GwhSettingsWidgetStringNotify)   (GwhSettings *settings,
+                                                 const gchar *value,
+                                                 gpointer     data);
 
 struct _GwhSettings
 {
@@ -67,6 +93,12 @@
                                                        const gchar *filename,
                                                        GError     **error);
 G_GNUC_INTERNAL
+GtkWidget      *gwh_settings_widget_new_full          (GwhSettings           *self,
+                                                       const gchar           *prop_name,
+                                                       GCallback              setting_changed_callback,
+                                                       gpointer               user_data,
+                                                       GwhSettingsNotifyFlags notify_flags);
+G_GNUC_INTERNAL
 GtkWidget      *gwh_settings_widget_new               (GwhSettings *self,
                                                        const gchar *prop_name);
 G_GNUC_INTERNAL


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Plugins-Commits mailing list