SF.net SVN: geany-plugins:[1769] trunk/geany-plugins/webhelper/src
colombanw at users.sourceforge.net
colombanw at xxxxx
Sun Dec 12 21:41:36 UTC 2010
Revision: 1769
http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1769&view=rev
Author: colombanw
Date: 2010-12-12 21:41:36 +0000 (Sun, 12 Dec 2010)
Log Message:
-----------
WebHelper: Add API to create widgets to display and sync settings
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 2010-12-10 09:14:00 UTC (rev 1768)
+++ trunk/geany-plugins/webhelper/src/gwh-settings.c 2010-12-12 21:41:36 UTC (rev 1769)
@@ -453,3 +453,205 @@
return success;
}
+
+
+
+
+
+
+
+static GtkWidget *
+gwh_settings_widget_new_boolean (GwhSettings *self,
+ const GValue *value,
+ GParamSpec *pspec,
+ gboolean *needs_label)
+{
+ GtkWidget *widget;
+
+ widget = gtk_check_button_new_with_label (g_param_spec_get_nick (pspec));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget),
+ g_value_get_boolean (value));
+ *needs_label = FALSE;
+
+ return widget;
+}
+
+static void
+gwh_settings_widget_sync_boolean (GwhSettings *self,
+ GParamSpec *pspec,
+ GtkWidget *widget)
+{
+ g_object_set (self, pspec->name,
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
+ NULL);
+}
+
+static GtkWidget *
+gwh_settings_widget_new_enum (GwhSettings *self,
+ const GValue *value,
+ GParamSpec *pspec,
+ gboolean *needs_label)
+{
+ GtkWidget *widget;
+ GEnumClass *enum_class;
+ guint i;
+ GtkListStore *store;
+ GtkCellRenderer *renderer;
+ gint active = 0;
+
+ store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING);
+ enum_class = g_type_class_ref (G_VALUE_TYPE (value));
+ for (i = 0; i < enum_class->n_values; i++) {
+ GtkTreeIter iter;
+
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter,
+ 0, enum_class->values[i].value,
+ 1, enum_class->values[i].value_nick,
+ -1);
+ if (g_value_get_enum (value) == enum_class->values[i].value) {
+ active = i;
+ }
+ }
+ g_type_class_unref (enum_class);
+
+ widget = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (widget), renderer, TRUE);
+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (widget), renderer,
+ "text", 1, NULL);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), active);
+
+ *needs_label = TRUE;
+
+ return widget;
+}
+
+static void
+gwh_settings_widget_sync_enum (GwhSettings *self,
+ GParamSpec *pspec,
+ GtkWidget *widget)
+{
+ GtkTreeIter iter;
+
+ if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter)) {
+ GtkTreeModel *model;
+ gint val;
+
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
+ gtk_tree_model_get (model, &iter, 0, &val, -1);
+ g_object_set (self, pspec->name, val, NULL);
+ }
+}
+
+static GtkWidget *
+gwh_settings_widget_new_string (GwhSettings *self,
+ const GValue *value,
+ GParamSpec *pspec,
+ gboolean *needs_label)
+{
+ GtkWidget *widget;
+
+ widget = gtk_entry_new ();
+ gtk_entry_set_text (GTK_ENTRY (widget), g_value_get_string (value));
+ *needs_label = TRUE;
+
+ return widget;
+}
+
+static void
+gwh_settings_widget_sync_string (GwhSettings *self,
+ GParamSpec *pspec,
+ GtkWidget *widget)
+{
+ g_object_set (self, pspec->name, gtk_entry_get_text (GTK_ENTRY (widget)),
+ NULL);
+}
+
+
+#define KEY_PSPEC "gwh-settings-configure-pspec"
+#define KEY_WIDGET "gwh-settings-configure-widget"
+
+GtkWidget *
+gwh_settings_widget_new (GwhSettings *self,
+ const gchar *prop_name)
+{
+ GtkWidget *widget = NULL;
+ GParamSpec *pspec;
+ GValue value = {0};
+ gboolean needs_label = FALSE;
+
+ g_return_val_if_fail (GWH_IS_SETTINGS (self), NULL);
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (self), prop_name);
+ g_return_val_if_fail (pspec != NULL, NULL);
+
+ 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;
+
+ HANDLE_TYPE (G_TYPE_BOOLEAN, gwh_settings_widget_new_boolean)
+ HANDLE_TYPE (G_TYPE_ENUM, gwh_settings_widget_new_enum)
+ HANDLE_TYPE (G_TYPE_STRING, gwh_settings_widget_new_string)
+
+ #undef HANDLE_TYPE
+
+ default:
+ g_critical ("Unsupported property type \"%s\"",
+ G_VALUE_TYPE_NAME (&value));
+ }
+ if (widget) {
+ g_object_set_data_full (G_OBJECT (widget), KEY_PSPEC,
+ g_param_spec_ref (pspec),
+ (GDestroyNotify)g_param_spec_unref);
+ if (needs_label) {
+ GtkWidget *box;
+ gchar *label;
+
+ box = gtk_hbox_new (FALSE, 6);
+ label = g_strdup_printf ("%s:", g_param_spec_get_nick (pspec));
+ gtk_box_pack_start (GTK_BOX (box), gtk_label_new (label), FALSE, TRUE, 0);
+ g_free (label);
+ gtk_box_pack_start (GTK_BOX (box), widget, TRUE, TRUE, 0);
+ g_object_set_data_full (G_OBJECT (box), KEY_WIDGET,
+ g_object_ref (widget), g_object_unref);
+ widget = box;
+ } else {
+ g_object_set_data_full (G_OBJECT (widget), KEY_WIDGET,
+ g_object_ref (widget), g_object_unref);
+ }
+ gtk_widget_set_tooltip_text (widget, g_param_spec_get_blurb (pspec));
+ }
+
+ return widget;
+}
+
+void
+gwh_settings_widget_sync (GwhSettings *self,
+ GtkWidget *widget)
+{
+ GParamSpec *pspec;
+
+ g_return_if_fail (GWH_IS_SETTINGS (self));
+ g_return_if_fail (G_IS_OBJECT (widget));
+
+ widget = g_object_get_data (G_OBJECT (widget), KEY_WIDGET);
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ 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;
+
+ HANDLE_TYPE (G_TYPE_BOOLEAN, gwh_settings_widget_sync_boolean)
+ HANDLE_TYPE (G_TYPE_ENUM, gwh_settings_widget_sync_enum)
+ HANDLE_TYPE (G_TYPE_STRING, gwh_settings_widget_sync_string)
+
+ #undef HANDLE_TYPE
+
+ default:
+ g_critical ("Unsupported property type \"%s\"",
+ g_type_name (pspec->value_type));
+ }
+}
Modified: trunk/geany-plugins/webhelper/src/gwh-settings.h
===================================================================
--- trunk/geany-plugins/webhelper/src/gwh-settings.h 2010-12-10 09:14:00 UTC (rev 1768)
+++ trunk/geany-plugins/webhelper/src/gwh-settings.h 2010-12-12 21:41:36 UTC (rev 1769)
@@ -22,6 +22,7 @@
#include <glib.h>
#include <glib-object.h>
+#include <gtk/gtk.h>
G_BEGIN_DECLS
@@ -62,6 +63,12 @@
gboolean gwh_settings_load_from_file (GwhSettings *self,
const gchar *filename,
GError **error);
+G_GNUC_INTERNAL
+GtkWidget *gwh_settings_widget_new (GwhSettings *self,
+ const gchar *prop_name);
+G_GNUC_INTERNAL
+void gwh_settings_widget_sync (GwhSettings *self,
+ GtkWidget *widget);
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