[Xfce4-commits] r23810 - xarchiver/branches/xarchiver-psybsd/src
Stephan Arts
stephan at xfce.org
Fri Nov 10 14:22:48 CET 2006
Author: stephan
Date: 2006-11-10 13:22:47 +0000 (Fri, 10 Nov 2006)
New Revision: 23810
Modified:
xarchiver/branches/xarchiver-psybsd/src/Makefile.am
xarchiver/branches/xarchiver-psybsd/src/extract_dialog.c
xarchiver/branches/xarchiver-psybsd/src/path_bar.c
xarchiver/branches/xarchiver-psybsd/src/tool_bar.c
xarchiver/branches/xarchiver-psybsd/src/widget_factory.c
xarchiver/branches/xarchiver-psybsd/src/widget_factory.h
Log:
Applied patch from Peter de Ridder <pc.ridder at zonnet.nl>
Modified: xarchiver/branches/xarchiver-psybsd/src/Makefile.am
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/Makefile.am 2006-11-10 13:18:30 UTC (rev 23809)
+++ xarchiver/branches/xarchiver-psybsd/src/Makefile.am 2006-11-10 13:22:47 UTC (rev 23810)
@@ -26,7 +26,8 @@
preferences_dialog.c preferences_dialog.h \
new_dialog.c new_dialog.h \
add_dialog.c add_dialog.h \
- extract_dialog.c extract_dialog.h
+ extract_dialog.c extract_dialog.h \
+ widget_factory.c widget_factory.h
xarchiver_CFLAGS = \
@GTK_CFLAGS@ \
Modified: xarchiver/branches/xarchiver-psybsd/src/extract_dialog.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/extract_dialog.c 2006-11-10 13:18:30 UTC (rev 23809)
+++ xarchiver/branches/xarchiver-psybsd/src/extract_dialog.c 2006-11-10 13:22:47 UTC (rev 23810)
@@ -27,6 +27,7 @@
#include <gettext.h>
#include "extract_dialog.h"
+#include "widget_factory.h"
static void
xa_extract_archive_dialog_class_init(XAExtractArchiveDialogClass *archive_class);
@@ -107,8 +108,9 @@
xa_extract_archive_dialog_new(LXAArchiveSupport *support, LXAArchive *archive, gboolean sel_option)
{
GSList *extract_options;
- GtkWidget *test, *hbox;
+ GtkWidget *test;
XAExtractArchiveDialog *dialog;
+ XAWidgetFactory *factory = xa_widget_factory_new();
dialog = g_object_new(xa_extract_archive_dialog_get_type(), "title", _("Extract archive"), "action", GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, "do-overwrite-confirmation", TRUE, NULL);
/* Handle 'extract selected files' option */
@@ -124,25 +126,8 @@
extract_options = lxa_archive_support_list_properties(support, "extract");
while(extract_options)
{
- switch(G_PARAM_SPEC(extract_options->data)->value_type)
- {
- case (G_TYPE_BOOLEAN):
- test = gtk_check_button_new_with_label(g_param_spec_get_nick(G_PARAM_SPEC(extract_options->data)));
- g_signal_connect(G_OBJECT(test), "toggled", G_CALLBACK(xa_extract_dialog_option_toggled), (void *)g_param_spec_get_name(G_PARAM_SPEC(extract_options->data)));
- gtk_box_pack_start(GTK_BOX(r_vbox), test, FALSE, FALSE, 0);
- break;
- case (G_TYPE_STRING):
- hbox = gtk_hbox_new(FALSE, 4);
- test = gtk_label_new(g_param_spec_get_nick(G_PARAM_SPEC(extract_options->data)));
- gtk_box_pack_start(GTK_BOX(hbox), test, FALSE, FALSE, 3);
-
- test = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(hbox), test, TRUE, TRUE, 3);
-
- g_signal_connect(G_OBJECT(test), "child_notify", G_CALLBACK(xa_extract_dialog_option_child_notify), (void *)g_param_spec_get_name(G_PARAM_SPEC(extract_options->data)));
- gtk_box_pack_start(GTK_BOX(r_vbox), hbox, FALSE, FALSE, 0);
- break;
- }
+ test = xa_widget_factory_create_property_widget(factory, G_OBJECT(support), g_param_spec_get_name(G_PARAM_SPEC(extract_options->data)));
+ gtk_box_pack_start(GTK_BOX(r_vbox), test, FALSE, FALSE, 0);
extract_options = extract_options->next;
}
}
Modified: xarchiver/branches/xarchiver-psybsd/src/path_bar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/path_bar.c 2006-11-10 13:18:30 UTC (rev 23809)
+++ xarchiver/branches/xarchiver-psybsd/src/path_bar.c 2006-11-10 13:22:47 UTC (rev 23810)
@@ -198,7 +198,6 @@
path_bar->scroll_click = TRUE;
gtk_widget_ref(GTK_WIDGET(path_bar));
- g_signal_connect(G_OBJECT(path_bar), "xa-store-set", (GCallback)cb_xa_path_bar_store_set, NULL);
}
XANavigationBar *
@@ -582,7 +581,6 @@
g_free(prev);
}
- xa_archive_store_set_pwd_silent(XA_NAVIGATION_BAR(path_bar)->store, path);
g_free(path);
}
Modified: xarchiver/branches/xarchiver-psybsd/src/tool_bar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/tool_bar.c 2006-11-10 13:18:30 UTC (rev 23809)
+++ xarchiver/branches/xarchiver-psybsd/src/tool_bar.c 2006-11-10 13:22:47 UTC (rev 23810)
@@ -168,8 +168,6 @@
gtk_widget_set_sensitive(GTK_WIDGET(tool_bar->hbox), 0);
gtk_widget_show_all(GTK_WIDGET(tool_bar->bar));
-
- g_signal_connect(G_OBJECT(tool_bar), "xa-store-set", (GCallback)cb_xa_tool_bar_store_set, NULL);
}
XANavigationBar *
Modified: xarchiver/branches/xarchiver-psybsd/src/widget_factory.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/widget_factory.c 2006-11-10 13:18:30 UTC (rev 23809)
+++ xarchiver/branches/xarchiver-psybsd/src/widget_factory.c 2006-11-10 13:22:47 UTC (rev 23810)
@@ -16,6 +16,7 @@
#include <config.h>
#include <string.h>
+#include <gtk/gtk.h>
#include <glib.h>
#include <glib/gstdio.h>
#include <glib-object.h>
@@ -26,42 +27,118 @@
#include "widget_factory.h"
+#define XA_PROPERTY_SPEC_DATA "xa-property-spec"
+#define XA_PROPERTY_VALUE_DATA "xa-property-value"
+
+static void
+xa_widget_factory_class_init(XAWidgetFactoryClass *factory_class);
+static void
+xa_widget_factory_init(XAWidgetFactory *factory);
+
static GtkWidget*
-xa_widget_factory_create_boolean_widget(XAWidgetFactory *factory, GObject *obj, GParamSpecs *pspec, GValue *value);
+xa_widget_factory_create_boolean_widget(XAWidgetFactory *factory, GObject *obj, GParamSpec *pspec, const GValue *value);
static GtkWidget*
-xa_widget_factory_create_numeric_widget(XAWidgetFactory *factory, GObject *obj, GParamSpecs *pspec, GValue *value);
+xa_widget_factory_create_numeric_widget(XAWidgetFactory *factory, GObject *obj, GParamSpec *pspec, const GValue *value);
+static GtkWidget*
+xa_widget_factory_create_enum_widget(XAWidgetFactory *factory, GObject *obj, GParamSpec *pspec, const GValue *value);
+static GtkWidget*
+xa_widget_factory_create_flags_widget(XAWidgetFactory *factory, GObject *obj, GParamSpec *pspec, const GValue *value);
+static GtkWidget*
+xa_widget_factory_create_string_widget(XAWidgetFactory *factory, GObject *obj, GParamSpec *pspec, const GValue *value);
+static void
+cb_xa_widget_factory_property_changed(GtkWidget *widget, gpointer user_data);
+
+GType
+xa_widget_factory_get_type()
+{
+ static GType xa_widget_factory_type = 0;
+
+ if(!xa_widget_factory_type)
+ {
+ static const GTypeInfo xa_widget_factory_info =
+ {
+ sizeof(XAWidgetFactoryClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) xa_widget_factory_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL,
+ sizeof(XAWidgetFactory),
+ 0,
+ (GInstanceInitFunc) xa_widget_factory_init,
+ NULL
+ };
+
+ xa_widget_factory_type = g_type_register_static(G_TYPE_OBJECT, "XAWidgetFactory", &xa_widget_factory_info, 0);
+ }
+ return xa_widget_factory_type;
+}
+
+static void
+xa_widget_factory_class_init(XAWidgetFactoryClass *factory_class)
+{
+/* GObjectClass *object_class = G_OBJECT_CLASS(factory_class);*/
+}
+
+static void
+xa_widget_factory_init(XAWidgetFactory *factory)
+{
+ factory->tips = gtk_tooltips_new();
+}
+
+XAWidgetFactory*
+xa_widget_factory_new()
+{
+ XAWidgetFactory *factory;
+
+ factory = g_object_new(xa_widget_factory_get_type(), NULL);
+
+ return factory;
+}
+
static GtkWidget*
-xa_widget_factory_create_boolean_widget(XAWidgetFactory *factory, GObject *obj, GParamSpecs *pspec, GValue *value)
+xa_widget_factory_create_boolean_widget(XAWidgetFactory *factory, GObject *obj, GParamSpec *pspec, const GValue *value)
{
- GtkWidget *check = gtk_check_button_new_with_label(g_param_specs_get_nick(pspec));
+ GtkWidget *check = gtk_check_button_new_with_label(g_param_spec_get_nick(pspec));
- const gchar *large_tip = g_param_specs_get_blurb(pspec);
- gchar *small_tip = g_strndup(large_tip, strchr(large_tip, '\n') - large_tip);
- large_tip = strchr(large_tip, '\n') + 1;
+ g_object_set_data(G_OBJECT(check), XA_PROPERTY_SPEC_DATA, pspec);
+ g_signal_connect(G_OBJECT(check), "toggled", G_CALLBACK(cb_xa_widget_factory_property_changed), obj);
- gtk_tooltips_set_tip(factory->tips, check, small_tip, large_tip);
+ const gchar *large_tip = g_param_spec_get_blurb(pspec);
+ gchar *small_tip = NULL;
+ if(strchr(large_tip, '\n'))
+ {
+ small_tip = g_strndup(large_tip, strchr(large_tip, '\n') - large_tip);
+ large_tip = strchr(large_tip, '\n') + 1;
+ }
+ gtk_tooltips_set_tip(factory->tips, check, small_tip?small_tip:large_tip, large_tip);
+
g_free(small_tip);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), g_value_get_boolean(value));
+ gtk_widget_show(check);
+
return check;
}
static GtkWidget*
-xa_widget_factory_create_numeric_widget(XAWidgetFactory *factory, GObject *obj, GParamSpecs *pspec, GValue *value)
+xa_widget_factory_create_numeric_widget(XAWidgetFactory *factory, GObject *obj, GParamSpec *pspec, const GValue *value)
{
- GtkWidget *box = gtk_hbox(FALSE, 3);
- GtkWidget *label = gtk_label_new(g_param_specs_get_nick(pspec));
+ GtkWidget *box = gtk_hbox_new(FALSE, 3);
+ GtkWidget *label = gtk_label_new(g_param_spec_get_nick(pspec));
GValue double_value;
gdouble min = 0, max = 0, inc = 0, step = 0;
- guint digit = 0;
+ guint digits = 0;
GtkAdjustment *adjust;
GtkWidget *spin;
+ memset(&double_value, 0, sizeof(GValue));
+
g_value_init(&double_value, G_TYPE_DOUBLE);
- g_return_val_if_fail(g_value_transform(&value, &double_value), NULL);
+ g_return_val_if_fail(g_value_transform(value, &double_value), NULL);
switch(pspec->value_type)
{
@@ -73,116 +150,246 @@
min = G_PARAM_SPEC_INT(pspec)->minimum;
max = G_PARAM_SPEC_INT(pspec)->maximum;
inc = 1;
- step = ((max-min)/5)>10?10:gint((man-min)/5);
+ step = ((max-min)/5)>10?10:(gint)((max-min)/5);
digits = 1;
break;
case G_TYPE_UINT:
min = G_PARAM_SPEC_UINT(pspec)->minimum;
max = G_PARAM_SPEC_UINT(pspec)->maximum;
inc = 1;
- step = ((max-min)/5)>10?10:guint((man-min)/5);
- digits = 1;
+ step = ((max-min)/5)>10?10:(guint)((max-min)/5);
+ digits = 0;
break;
case G_TYPE_LONG:
min = G_PARAM_SPEC_LONG(pspec)->minimum;
max = G_PARAM_SPEC_LONG(pspec)->maximum;
inc = 1;
- step = ((max-min)/5)>10?10:glong((man-min)/5);
- digits = 1;
+ step = ((max-min)/5)>10?10:(glong)((max-min)/5);
+ digits = 0;
break;
case G_TYPE_ULONG:
min = G_PARAM_SPEC_ULONG(pspec)->minimum;
max = G_PARAM_SPEC_ULONG(pspec)->maximum;
inc = 1;
- step = ((max-min)/5)>10?10:gulong((man-min)/5);
- digits = 1;
+ step = ((max-min)/5)>10?10:(gulong)((max-min)/5);
+ digits = 0;
break;
case G_TYPE_INT64:
min = G_PARAM_SPEC_INT64(pspec)->minimum;
max = G_PARAM_SPEC_INT64(pspec)->maximum;
inc = 1;
- step = ((max-min)/5)>10?10:gint64((man-min)/5);
- digits = 1;
+ step = ((max-min)/5)>10?10:(gint64)((max-min)/5);
+ digits = 0;
break;
case G_TYPE_UINT64:
min = G_PARAM_SPEC_UINT64(pspec)->minimum;
max = G_PARAM_SPEC_UINT64(pspec)->maximum;
inc = 1;
- step = ((max-min)/5)>10?10:guint64((man-min)/5);
- digits = 1;
+ step = ((max-min)/5)>10?10:(guint64)((max-min)/5);
+ digits = 0;
break;
case G_TYPE_FLOAT:
min = G_PARAM_SPEC_FLOAT(pspec)->minimum;
max = G_PARAM_SPEC_FLOAT(pspec)->maximum;
inc = 0.000001;
- step = ((max-min)/5)>0.1?0.1:gfloat((man-min)/5);
+ step = ((max-min)/5)>0.1?0.1:(gfloat)((max-min)/5);
digits = 6;
break;
case G_TYPE_DOUBLE:
min = G_PARAM_SPEC_DOUBLE(pspec)->minimum;
max = G_PARAM_SPEC_DOUBLE(pspec)->maximum;
inc = 0.0000000000000000001;
- step = ((max-min)/5)>0.01?0.01:((man-min)/5);
+ step = ((max-min)/5)>0.01?0.01:((max-min)/5);
digits = 20;
break;
}
- adjust = gtk_adjust_new(g_value_get_double(double_value), min, max, inc, step, step);
- spin = gtk_spin_button_new(adjust, step, digit);
+ adjust = GTK_ADJUSTMENT(gtk_adjustment_new(g_value_get_double(&double_value), min, max, inc, step, step));
+ spin = gtk_spin_button_new(adjust, step, digits);
- const gchar *large_tip = g_param_specs_get_blurb(pspec);
- gchar *small_tip = g_strndup(large_tip, strchr(large_tip, '\n') - large_tip);
- large_tip = strchr(large_tip, '\n') + 1;
+ g_object_set_data(G_OBJECT(spin), XA_PROPERTY_SPEC_DATA, pspec);
+ g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(cb_xa_widget_factory_property_changed), obj);
- gtk_tooltips_set_tip(factory->tips, widget, small_tip, large_tip);
+ gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 3);
+ gtk_box_pack_end(GTK_BOX(box), spin, TRUE, TRUE, 3);
+ const gchar *large_tip = g_param_spec_get_blurb(pspec);
+ gchar *small_tip = NULL;
+ if(strchr(large_tip, '\n'))
+ {
+ small_tip = g_strndup(large_tip, strchr(large_tip, '\n') - large_tip);
+ large_tip = strchr(large_tip, '\n') + 1;
+ }
+
+ gtk_tooltips_set_tip(factory->tips, label, small_tip?small_tip:large_tip, large_tip);
+ gtk_tooltips_set_tip(factory->tips, spin, small_tip?small_tip:large_tip, large_tip);
+
g_free(small_tip);
+ g_value_unset(&double_value);
+
+ gtk_widget_show_all(box);
+
return box;
}
+static GtkWidget*
+xa_widget_factory_create_enum_widget(XAWidgetFactory *factory, GObject *obj, GParamSpec *pspec, const GValue *value)
+{
+ GtkWidget *frame = gtk_frame_new(g_param_spec_get_nick(pspec));
+ GtkWidget *box = gtk_vbox_new(FALSE, 3);
+ GtkWidget *radio = NULL;
+ guint i, n = G_PARAM_SPEC_ENUM(pspec)->enum_class->n_values;
+ GEnumValue *values = G_PARAM_SPEC_ENUM(pspec)->enum_class->values;
+
+ for(i = 0; i < n; ++i)
+ {
+ radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), values[i].value_nick);
+
+ g_object_set_data(G_OBJECT(radio), XA_PROPERTY_SPEC_DATA, pspec);
+ g_signal_connect(G_OBJECT(radio), "toggled", G_CALLBACK(cb_xa_widget_factory_property_changed), obj);
+
+ if(g_value_get_enum(value) == values[i].value)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE);
+ gtk_box_pack_start(GTK_BOX(box), radio, FALSE, FALSE, 5);
+ }
+
+ gtk_container_add(GTK_CONTAINER(frame), box);
+
+ const gchar *large_tip = g_param_spec_get_blurb(pspec);
+ gchar *small_tip = NULL;
+ if(strchr(large_tip, '\n'))
+ {
+ small_tip = g_strndup(large_tip, strchr(large_tip, '\n') - large_tip);
+ large_tip = strchr(large_tip, '\n') + 1;
+ }
+
+ gtk_tooltips_set_tip(factory->tips, frame, small_tip?small_tip:large_tip, large_tip);
+
+ g_free(small_tip);
+
+ gtk_widget_show_all(frame);
+
+ return frame;
+}
+
+static GtkWidget*
+xa_widget_factory_create_flags_widget(XAWidgetFactory *factory, GObject *obj, GParamSpec *pspec, const GValue *value)
+{
+ GtkWidget *frame = gtk_frame_new(g_param_spec_get_nick(pspec));
+ GtkWidget *box = gtk_vbox_new(FALSE, 3);
+ GtkWidget *check;
+ guint i, n = G_PARAM_SPEC_FLAGS(pspec)->flags_class->n_values;
+ GFlagsValue *values = G_PARAM_SPEC_FLAGS(pspec)->flags_class->values;
+
+ gtk_container_add(GTK_CONTAINER(frame), box);
+
+ for(i = 0; i < n; ++i)
+ {
+ check = gtk_check_button_new_with_label(values[i].value_nick);
+
+ g_object_set_data(G_OBJECT(check), XA_PROPERTY_SPEC_DATA, pspec);
+ g_object_set_data(G_OBJECT(check), XA_PROPERTY_VALUE_DATA, GINT_TO_POINTER(values[i].value));
+ g_signal_connect(G_OBJECT(check), "toggled", G_CALLBACK(cb_xa_widget_factory_property_changed), obj);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), g_value_get_enum(value) & values[i].value);
+ gtk_box_pack_start(GTK_BOX(box), check, FALSE, FALSE, 5);
+ }
+
+ const gchar *large_tip = g_param_spec_get_blurb(pspec);
+ gchar *small_tip = NULL;
+ if(strchr(large_tip, '\n'))
+ {
+ small_tip = g_strndup(large_tip, strchr(large_tip, '\n') - large_tip);
+ large_tip = strchr(large_tip, '\n') + 1;
+ }
+
+ gtk_tooltips_set_tip(factory->tips, frame, small_tip?small_tip:large_tip, large_tip);
+
+ g_free(small_tip);
+
+ gtk_widget_show_all(frame);
+
+ return frame;
+}
+
+static GtkWidget*
+xa_widget_factory_create_string_widget(XAWidgetFactory *factory, GObject *obj, GParamSpec *pspec, const GValue *value)
+{
+ g_debug("string");
+ GtkWidget *box = gtk_hbox_new(FALSE, 3);
+ GtkWidget *label = gtk_label_new(g_param_spec_get_nick(pspec));
+ GtkWidget *entry = gtk_entry_new();
+
+ g_object_set_data(G_OBJECT(entry), XA_PROPERTY_SPEC_DATA, pspec);
+ g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(cb_xa_widget_factory_property_changed), obj);
+
+ gtk_entry_set_text(GTK_ENTRY(entry), g_value_get_string(value));
+
+ gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 3);
+ gtk_box_pack_end(GTK_BOX(box), entry, TRUE, TRUE, 3);
+
+ const gchar *large_tip = g_param_spec_get_blurb(pspec);
+ gchar *small_tip = NULL;
+ if(strchr(large_tip, '\n'))
+ {
+ small_tip = g_strndup(large_tip, strchr(large_tip, '\n') - large_tip);
+ large_tip = strchr(large_tip, '\n') + 1;
+ }
+
+ gtk_tooltips_set_tip(factory->tips, label, small_tip?small_tip:large_tip, large_tip);
+ gtk_tooltips_set_tip(factory->tips, entry, small_tip?small_tip:large_tip, large_tip);
+
+ g_free(small_tip);
+
+ gtk_widget_show_all(box);
+
+ return box;
+}
+
GtkWidget*
-xa_widget_factory_create_property_widget(GObject *obj, const gchar *prop)
+xa_widget_factory_create_property_widget(XAWidgetFactory *factory, GObject *obj, const gchar *prop)
{
GtkWidget *widget = NULL;
- GParamSpecs *pspec = g_object_class_find_property(G_OBJECT_GET_CLASS(obj), prop);
+ GParamSpec *pspec = g_object_class_find_property(G_OBJECT_GET_CLASS(obj), prop);
GValue value;
if(!pspec)
return NULL;
+ memset(&value, 0, sizeof(GValue));
+
+ /* FIXME: object property type string is bugged, in glib? */
+ g_value_init(&value, pspec->value_type);
g_object_get_property(obj, prop, &value);
switch(pspec->value_type)
{
case G_TYPE_BOOLEAN:
- widget = xa_widget_create_boolean(obj, pspec, &value);
+ widget = xa_widget_factory_create_boolean_widget(factory, obj, pspec, &value);
break;
+ /*
case G_TYPE_CHAR:
- break;
case G_TYPE_UCHAR:
- break;
+ break;*/
case G_TYPE_INT:
- break;
case G_TYPE_UINT:
- break;
case G_TYPE_LONG:
- break;
case G_TYPE_ULONG:
- break;
case G_TYPE_INT64:
- break;
case G_TYPE_UINT64:
- break;
case G_TYPE_FLOAT:
- break;
case G_TYPE_DOUBLE:
+ widget = xa_widget_factory_create_numeric_widget(factory, obj, pspec, &value);
break;
case G_TYPE_ENUM:
+ widget = xa_widget_factory_create_enum_widget(factory, obj, pspec, &value);
break;
case G_TYPE_FLAGS:
+ widget = xa_widget_factory_create_flags_widget(factory, obj, pspec, &value);
break;
case G_TYPE_STRING:
+ widget = xa_widget_factory_create_string_widget(factory, obj, pspec, &value);
break;
}
@@ -191,3 +398,59 @@
return widget;
}
+static void
+cb_xa_widget_factory_property_changed(GtkWidget *widget, gpointer user_data)
+{
+ GParamSpec *pspec = g_object_get_data(G_OBJECT(widget), XA_PROPERTY_SPEC_DATA);
+ GValue value, other_value;
+ memset(&value, 0, sizeof(GValue));
+ memset(&other_value, 0, sizeof(GValue));
+
+ g_value_init(&value, pspec->value_type);
+
+ switch(pspec->value_type)
+ {
+ case G_TYPE_BOOLEAN:
+ g_value_set_boolean(&value, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
+ g_object_set_property(G_OBJECT(user_data), g_param_spec_get_name(pspec), &value);
+ break;
+ /*
+ case G_TYPE_CHAR:
+ case G_TYPE_UCHAR:
+ break;*/
+ case G_TYPE_INT:
+ case G_TYPE_UINT:
+ case G_TYPE_LONG:
+ case G_TYPE_ULONG:
+ case G_TYPE_INT64:
+ case G_TYPE_UINT64:
+ case G_TYPE_FLOAT:
+ case G_TYPE_DOUBLE:
+ g_value_init(&other_value, G_TYPE_DOUBLE);
+ g_value_set_double(&other_value, gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)));
+ g_value_transform(&other_value, &value);
+ g_value_unset(&other_value);
+ g_object_set_property(G_OBJECT(user_data), g_param_spec_get_name(pspec), &value);
+ break;
+ case G_TYPE_ENUM:
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+ {
+ g_value_set_enum(&value, GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), XA_PROPERTY_VALUE_DATA)));
+ g_object_set_property(G_OBJECT(user_data), g_param_spec_get_name(pspec), &value);
+ }
+ break;
+ case G_TYPE_FLAGS:
+ // TODO: sync?
+ g_object_get_property(G_OBJECT(user_data), g_param_spec_get_name(pspec), &value);
+ g_value_set_flags(&value, g_value_get_flags(&value) ^ GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), XA_PROPERTY_VALUE_DATA)));
+ g_object_set_property(G_OBJECT(user_data), g_param_spec_get_name(pspec), &value);
+ break;
+ case G_TYPE_STRING:
+ g_value_set_string(&value, gtk_entry_get_text(GTK_ENTRY(widget)));
+ g_object_set_property(G_OBJECT(user_data), g_param_spec_get_name(pspec), &value);
+ break;
+ }
+
+ g_value_unset(&value);
+}
+
Modified: xarchiver/branches/xarchiver-psybsd/src/widget_factory.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/widget_factory.h 2006-11-10 13:18:30 UTC (rev 23809)
+++ xarchiver/branches/xarchiver-psybsd/src/widget_factory.h 2006-11-10 13:22:47 UTC (rev 23810)
@@ -25,7 +25,7 @@
xa_widget_factory_get_type(), \
LXAArchive))
-#define LXA_IS_ARCHIVE(obj) ( \
+#define LXA_IS_WIDGET_FACTORY(obj) ( \
G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
xa_widget_factory_get_type()))
@@ -34,13 +34,14 @@
xa_widget_factory_get_type(), \
LXAArchiveClass))
-#define LXA_IS_ARCHIVE_CLASS(class) ( \
+#define LXA_IS_WIDGET_FACTORY_CLASS(class) ( \
G_TYPE_CHECK_CLASS_TYPE ((class), \
xa_widget_factory_get_type()))
typedef struct
{
GObject parent;
+ GtkTooltips *tips;
} XAWidgetFactory;
typedef struct
@@ -51,8 +52,7 @@
GType xa_widget_factory_get_type(void);
XAWidgetFactory *xa_widget_factory_new();
-GtkWidget *xa_widget_factory_create_property_widget(GObject *obj, const gchar *prop);
-/*GtkWidget *xa_widget_factory_create_property_by_specs(GObject *obj, GParamSpec *prop);*/
+GtkWidget *xa_widget_factory_create_property_widget(XAWidgetFactory *, GObject *, const gchar *);
#endif /*__XA_WIDGET_FACTORY_H__*/
More information about the Xfce4-commits
mailing list