Revision: 3996 http://geany.svn.sourceforge.net/geany/?rev=3996&view=rev Author: ntrel Date: 2009-07-20 12:00:06 +0000 (Mon, 20 Jul 2009)
Log Message: ----------- Add stash_group_add_widget_property() so we can save any widget's read/write properties. Use Stash for ui_prefs.sidebar_page setting.
Modified Paths: -------------- trunk/ChangeLog trunk/src/callbacks.c trunk/src/keyfile.c trunk/src/stash.c trunk/src/stash.h trunk/src/treeviews.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-07-20 11:21:05 UTC (rev 3995) +++ trunk/ChangeLog 2009-07-20 12:00:06 UTC (rev 3996) @@ -1,3 +1,12 @@ +2009-07-20 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + + * src/treeviews.c, src/callbacks.c, src/stash.c, src/stash.h, + src/keyfile.c: + Add stash_group_add_widget_property() so we can save any widget's + read/write properties. + Use Stash for ui_prefs.sidebar_page setting. + + 2009-07-19 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/dialogs.c:
Modified: trunk/src/callbacks.c =================================================================== --- trunk/src/callbacks.c 2009-07-20 11:21:05 UTC (rev 3995) +++ trunk/src/callbacks.c 2009-07-20 12:00:06 UTC (rev 3996) @@ -1629,10 +1629,6 @@ if (ignore_callback) return;
- if (ui_prefs.sidebar_visible) - ui_prefs.sidebar_page = gtk_notebook_get_current_page( - GTK_NOTEBOOK(main_widgets.sidebar_notebook)); - ui_prefs.sidebar_visible = ! ui_prefs.sidebar_visible;
if ((! interface_prefs.sidebar_openfiles_visible && ! interface_prefs.sidebar_symbol_visible)) @@ -1642,8 +1638,6 @@ }
ui_sidebar_show_hide(); - gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.sidebar_notebook), - ui_prefs.sidebar_page); }
Modified: trunk/src/keyfile.c =================================================================== --- trunk/src/keyfile.c 2009-07-20 11:21:05 UTC (rev 3995) +++ trunk/src/keyfile.c 2009-07-20 12:00:06 UTC (rev 3996) @@ -452,14 +452,7 @@
static void save_ui_prefs(GKeyFile *config) { - /* If the sidebar is visible, retrieve the active page number. Otherwise it was already - * set on hiding the sidebar. */ - if (ui_prefs.sidebar_visible) - ui_prefs.sidebar_page = gtk_notebook_get_current_page( - GTK_NOTEBOOK(main_widgets.sidebar_notebook)); - g_key_file_set_boolean(config, PACKAGE, "sidebar_visible", ui_prefs.sidebar_visible); - g_key_file_set_integer(config, PACKAGE, "sidebar_page", ui_prefs.sidebar_page); g_key_file_set_boolean(config, PACKAGE, "statusbar_visible", interface_prefs.statusbar_visible); g_key_file_set_boolean(config, PACKAGE, "msgwindow_visible", ui_prefs.msgwindow_visible); g_key_file_set_boolean(config, PACKAGE, "fullscreen", ui_prefs.fullscreen); @@ -809,7 +802,6 @@ GError *error = NULL;
ui_prefs.sidebar_visible = utils_get_setting_boolean(config, PACKAGE, "sidebar_visible", TRUE); - ui_prefs.sidebar_page = utils_get_setting_integer(config, PACKAGE, "sidebar_page", 0); ui_prefs.msgwindow_visible = utils_get_setting_boolean(config, PACKAGE, "msgwindow_visible", TRUE); ui_prefs.fullscreen = utils_get_setting_boolean(config, PACKAGE, "fullscreen", FALSE); ui_prefs.custom_date_format = utils_get_setting_string(config, PACKAGE, "custom_date_format", "");
Modified: trunk/src/stash.c =================================================================== --- trunk/src/stash.c 2009-07-20 11:21:05 UTC (rev 3995) +++ trunk/src/stash.c 2009-07-20 12:00:06 UTC (rev 3996) @@ -31,8 +31,18 @@ * * Memory Usage * Stash will not duplicate strings if they are normally static arrays, such as - * keyfile group names and key names, string default values or widget_id names. - * String settings and other dynamically allocated settings must be initialized to NULL. + * keyfile group names and key names, string default values, widget_id names, property names. + * + * String Settings + * String settings and other dynamically allocated settings must be initialized to NULL as they + * will be freed before reassigning. + * + * Widget Support + * Widgets very commonly used in configuration dialogs will be supported with their own function. + * Widgets less commonly used such as GtkExpander or widget settings that aren't commonly needed + * to be persistent won't be directly supported, to keep the library lightweight. However, you can + * use stash_group_add_widget_property() to also save these settings for any read/write widget + * property. */
/* Implementation Note @@ -251,8 +261,10 @@ { if (entry->widget_type == GTK_TYPE_RADIO_BUTTON) g_free(entry->fields); + else if (entry->widget_type == G_TYPE_PARAM) + continue; else - g_assert(entry->fields == NULL); + g_assert(entry->fields == NULL); /* to prevent memory leaks, must handle fields above */ } g_array_free(group->entries, TRUE); g_free(group); @@ -407,8 +419,7 @@
/* taken from Glade 2.x generated support.c */ static GtkWidget* -lookup_widget (GtkWidget *widget, - const gchar *widget_name) +lookup_widget(GtkWidget *widget, const gchar *widget_name) { GtkWidget *parent, *found_widget;
@@ -495,6 +506,28 @@ }
+static void handle_widget_property(GtkWidget *widget, GeanyPrefEntry *entry, + PrefAction action) +{ + GObject *object = G_OBJECT(widget); + const gchar *name = entry->fields; + + switch (action) + { + case PREF_DISPLAY: + g_object_set(object, name, entry->setting, NULL); + break; + case PREF_UPDATE: + if (entry->setting_type == G_TYPE_STRING) + g_free(entry->setting); + /* TODO: Which other types need freeing here? */ + + g_object_get(object, name, entry->setting, NULL); + break; + } +} + + static void pref_action(PrefAction action, GeanyPrefGroup *group, GtkWidget *owner) { GeanyPrefEntry *entry; @@ -503,9 +536,11 @@ { GtkWidget *widget;
+ /* ignore settings with no widgets */ if (entry->widget_type == G_TYPE_NONE) continue;
+ /* radio buttons have several widgets */ if (entry->widget_type == GTK_TYPE_RADIO_BUTTON) { handle_radio_buttons(owner, entry->fields, entry->setting, action); @@ -531,6 +566,8 @@ handle_combo_box_entry(widget, entry, action); else if (entry->widget_type == GTK_TYPE_ENTRY) handle_entry(widget, entry, action); + else if (entry->widget_type == G_TYPE_PARAM) + handle_widget_property(widget, entry, action); else g_warning("Unhandled type for %s::%s in %s()!", group->name, entry->key_name, G_STRFUNC); @@ -663,3 +700,33 @@ }
+static GType object_get_property_type(GObject *object, const gchar *property_name) +{ + GObjectClass *klass = G_OBJECT_GET_CLASS(object); + GParamSpec *ps; + + ps = g_object_class_find_property(klass, property_name); + return ps->value_type; +} + + +/* Add a widget's read/write property to the stash group. The property will be set when calling + * stash_group_display(), and read when calling stash_group_update(). + * @param setting address of e.g. an integer if using an integer property. + * @param default_value should be cast into a pointer e.g. with @c GINT_TO_POINTER(). + * @param type can be 0 if passing a GtkWidget as the @a widget_id argument to look it up from the + * GObject data. + * @warning Currently only string GValue properties will be freed before setting; patch for + * other types - see handle_widget_property(). */ +void stash_group_add_widget_property(GeanyPrefGroup *group, gpointer setting, + const gchar *key_name, gpointer default_value, gpointer widget_id, + const gchar *property_name, GType type) +{ + if (!type) + type = object_get_property_type(G_OBJECT(widget_id), property_name); + + add_widget_pref(group, type, setting, key_name, default_value, + G_TYPE_PARAM, widget_id)->fields = (gchar*)property_name; +} + +
Modified: trunk/src/stash.h =================================================================== --- trunk/src/stash.h 2009-07-20 11:21:05 UTC (rev 3995) +++ trunk/src/stash.h 2009-07-20 12:00:06 UTC (rev 3996) @@ -76,6 +76,10 @@ void stash_group_add_entry(GeanyPrefGroup *group, gchar **setting, const gchar *key_name, const gchar *default_value, gpointer widget_id);
+void stash_group_add_widget_property(GeanyPrefGroup *group, gpointer setting, + const gchar *key_name, gpointer default_value, gpointer widget_id, + const gchar *property_name, GType type); + void stash_group_display(GeanyPrefGroup *group, GtkWidget *owner);
void stash_group_update(GeanyPrefGroup *group, GtkWidget *owner);
Modified: trunk/src/treeviews.c =================================================================== --- trunk/src/treeviews.c 2009-07-20 11:21:05 UTC (rev 3995) +++ trunk/src/treeviews.c 2009-07-20 12:00:06 UTC (rev 3996) @@ -885,24 +885,38 @@ }
+GeanyPrefGroup *stash_group = NULL; + static void on_load_settings(void) { tag_window = ui_lookup_widget(main_widgets.window, "scrolledwindow2");
prepare_openfiles(); + /* note: ui_prefs.sidebar_page is reapplied after plugins are loaded */ + stash_group_display(stash_group, NULL); }
+static void on_save_settings(void) +{ + stash_group_update(stash_group, NULL); +} + + void treeviews_init(void) { GeanyPrefGroup *group;
group = stash_group_new(PACKAGE); stash_group_add_boolean(group, &documents_show_paths, "documents_show_paths", TRUE); + stash_group_add_widget_property(group, &ui_prefs.sidebar_page, "sidebar_page", GINT_TO_POINTER(0), + main_widgets.sidebar_notebook, "page", 0); configuration_add_pref_group(group, FALSE); + stash_group = group;
/* delay building documents treeview until sidebar font has been read */ g_signal_connect(geany_object, "load-settings", on_load_settings, NULL); + g_signal_connect(geany_object, "save-settings", on_save_settings, NULL); }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.