From a14ba22976113fb41175a449205388551614a5aa Mon Sep 17 00:00:00 2001 From: Philip Chimento Date: Fri, 12 Oct 2012 14:18:30 +0200 Subject: [PATCH] Add configure UI to Frotz plugin GObject bindings do not work, for some reason! --- interpreters/Makefile.am | 2 + interpreters/chimara-frotz-plugin.c | 96 ++++++++++++++- interpreters/chimara-frotz-plugin.glade | 155 ++++++++++++++++++++++++ 3 files changed, 251 insertions(+), 2 deletions(-) create mode 100644 interpreters/chimara-frotz-plugin.glade diff --git a/interpreters/Makefile.am b/interpreters/Makefile.am index 53a2cf4..3882c6b 100644 --- a/interpreters/Makefile.am +++ b/interpreters/Makefile.am @@ -33,6 +33,8 @@ libfrotz_la_SOURCES = frotz/buffer.c frotz/err.c frotz/fastmem.c frotz/files.c \ libfrotz_la_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/libchimara libfrotz_la_CFLAGS = -Wno-pointer-sign $(PLUGIN_CFLAGS) $(AM_CFLAGS) libfrotz_la_LDFLAGS = -module $(PLUGIN_LIBS) $(PLUGIN_LIBTOOL_FLAGS) +frotzdatadir = $(plugindir)/frotz +dist_frotzdata_DATA = chimara-frotz-plugin.glade # Git diff --git a/interpreters/chimara-frotz-plugin.c b/interpreters/chimara-frotz-plugin.c index 705b12c..c390d3b 100644 --- a/interpreters/chimara-frotz-plugin.c +++ b/interpreters/chimara-frotz-plugin.c @@ -16,7 +16,6 @@ typedef struct _ChimaraFrotzPluginPrivate { #define CHIMARA_FROTZ_PLUGIN_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), CHIMARA_TYPE_FROTZ_PLUGIN, ChimaraFrotzPluginPrivate)) #define CHIMARA_FROTZ_PLUGIN_USE_PRIVATE ChimaraFrotzPluginPrivate *priv = CHIMARA_FROTZ_PLUGIN_PRIVATE(self) - static void chimara_frotz_plugin_configurable_init(PeasGtkConfigurableInterface *); static GtkWidget *chimara_frotz_plugin_create_configure_widget(PeasGtkConfigurable *); @@ -320,8 +319,101 @@ chimara_frotz_plugin_configurable_init(PeasGtkConfigurableInterface *iface) iface->create_configure_widget = chimara_frotz_plugin_create_configure_widget; } +/* Helper function to transform flags value to boolean; @data contains the +GINT_TO_POINTER()'ed but position (0=LSB). */ +static gboolean +debug_message_flags_transform_to(GBinding *binding, const GValue *source, GValue *target, gpointer data) +{ + int bit_shift = GPOINTER_TO_INT(data); + unsigned flags = g_value_get_uint(source); + g_value_set_boolean(target, flags & (1 << bit_shift)); + return TRUE; /* success */ +} + +/* Reverse of debug_message_flags_transform_to(). */ +static gboolean +debug_message_flags_transform_from(GBinding *binding, const GValue *source, GValue *target, gpointer data) +{ + int bit_shift = GPOINTER_TO_INT(data); + unsigned flags = g_value_get_uint(target); + int new_value = g_value_get_boolean(source)? 1 : 0; + g_value_set_uint(target, flags & (new_value << bit_shift)); + return TRUE; /* success */ +} + static GtkWidget * chimara_frotz_plugin_create_configure_widget(PeasGtkConfigurable *self) { - return gtk_label_new("Configure Widget"); + GError *error = NULL; + const char *datadir = peas_plugin_info_get_data_dir(peas_engine_get_plugin_info(peas_engine_get_default(), "frotz")); + char *glade_file = g_build_filename(datadir, "chimara-frotz-plugin.glade", NULL); + GtkBuilder *builder = gtk_builder_new(); + if(!gtk_builder_add_from_file(builder, glade_file, &error)) { + g_free(glade_file); + g_critical("Error building Frotz configuration dialog: %s\n", error->message); + return NULL; + } + g_free(glade_file); + GObject *retval = gtk_builder_get_object(builder, "frotz-configure-widget"); + + /* Bind GUI widget properties to this plugin's configuration properties */ + g_object_bind_property_full(self, "debug-messages", + gtk_builder_get_object(builder, "attribute-setting-button"), "active", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL, + debug_message_flags_transform_to, + debug_message_flags_transform_from, + GINT_TO_POINTER(0), NULL); + g_object_bind_property_full(self, "debug-messages", + gtk_builder_get_object(builder, "attribute-testing-button"), "active", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL, + debug_message_flags_transform_to, + debug_message_flags_transform_from, + GINT_TO_POINTER(1), NULL); + g_object_bind_property_full(self, "debug-messages", + gtk_builder_get_object(builder, "object-movement-button"), "active", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL, + debug_message_flags_transform_to, + debug_message_flags_transform_from, + GINT_TO_POINTER(2), NULL); + g_object_bind_property_full(self, "debug-messages", + gtk_builder_get_object(builder, "object-location-button"), "active", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL, + debug_message_flags_transform_to, + debug_message_flags_transform_from, + GINT_TO_POINTER(3), NULL); + g_object_bind_property(self, "ignore-errors", + gtk_builder_get_object(builder, "ignore-errors-button"), "active", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); + g_object_bind_property(self, "piracy-mode", + gtk_builder_get_object(builder, "piracy-button"), "active", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); + g_object_bind_property(self, "quetzal-save-format", + gtk_builder_get_object(builder, "quetzal-button"), "active", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); + g_object_bind_property(self, "tandy-bit", + gtk_builder_get_object(builder, "tandy-button"), "active", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); + g_object_bind_property(self, "expand-abbreviations", + gtk_builder_get_object(builder, "expand-abbreviations-button"), "active", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); + g_object_bind_property(self, "random-seed", + gtk_builder_get_object(builder, "random-seed-adjustment"), "value", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); + g_object_bind_property(self, "random-seed-set", + gtk_builder_get_object(builder, "random-seed-set-button"), "active", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); + g_object_bind_property(self, "random-seed-set", + gtk_builder_get_object(builder, "random-seed-button"), "sensitive", + G_BINDING_SYNC_CREATE); + g_object_bind_property(self, "transcript-columns", + gtk_builder_get_object(builder, "columns-adjustment"), "value", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); + g_object_bind_property(self, "undo-slots", + gtk_builder_get_object(builder, "undo-adjustment"), "value", + G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); + + /* Make sure the widget is returned with only one reference */ + g_object_ref_sink(G_OBJECT(retval)); + g_object_unref(builder); + return GTK_WIDGET(retval); } diff --git a/interpreters/chimara-frotz-plugin.glade b/interpreters/chimara-frotz-plugin.glade new file mode 100644 index 0000000..57baaa9 --- /dev/null +++ b/interpreters/chimara-frotz-plugin.glade @@ -0,0 +1,155 @@ + + + + + GTK_ORIENTATION_VERTICAL + + + Expand G, X, and Z + + + + + Pretend the story file is pirated + + + + + Pretend the interpreter is the edition sold by Tandy + + + + + Use the Quetzal saved-game format + + + + + + + Use + + + + + columns-adjustment + + + + + columns when saving transcripts + + + + + + + + + Reserve + + + + + undo-adjustment + + + + + slots for multiple undo + + + + + + + + + Options + + + + + GTK_ORIENTATION_VERTICAL + + + Ignore fatal errors + + + + + Set random seed manually + + + + + + + to + 12 + + + + + random-seed-adjustment + + + + + + + Print debug messages on: + GTK_ALIGN_START + + + + + attribute setting + 12 + + + + + attribute testing + 12 + + + + + object movement + 12 + + + + + object location + 12 + + + + + + + Debugging + + + + + 0 + 80 + 200 + 1 + + + 1 + 1 + 32767 + 1 + + + 0 + 0 + 32767 + 1 + + \ No newline at end of file -- 2.30.2