From 130057674213cb8c271ab5b50126c4e1206633bc Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Sat, 27 Aug 2011 17:52:52 +0000 Subject: use a saved pointer to the profile object instead of getting the index and retrieving each time --- src/trg-preferences-dialog.c | 28 +++++++++++---------- src/trg-prefs.c | 59 +++++++++++++++++++++++++++++++++----------- src/trg-prefs.h | 7 +++--- 3 files changed, 64 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c index 7b421c9..3e8c307 100644 --- a/src/trg-preferences-dialog.c +++ b/src/trg-preferences-dialog.c @@ -96,7 +96,7 @@ static void trg_pref_widget_save(TrgPreferencesDialog *dlg, static void trg_pref_widget_save_all(TrgPreferencesDialog *dlg) { TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg); - if (trg_prefs_get_profile_id(priv->prefs) < 0) + if (trg_prefs_get_profile(priv->prefs) == NULL) return; GList *li; @@ -377,14 +377,14 @@ static void profile_changed_cb(GtkWidget *w, gpointer data) { TRG_PREFERENCES_DIALOG_GET_PRIVATE(data); GtkTreeIter iter; - gint profile_id; + JsonObject *profile; trg_pref_widget_save_all(TRG_PREFERENCES_DIALOG(data)); gint n_children = gtk_tree_model_iter_n_children(model, NULL); if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(w), &iter)) { - gtk_tree_model_get(model, &iter, 0, &profile_id, -1); - trg_prefs_set_profile(priv->prefs, profile_id); + gtk_tree_model_get(model, &iter, 0, &profile, -1); + trg_prefs_set_profile(priv->prefs, profile); trg_pref_widget_refresh_all(TRG_PREFERENCES_DIALOG(data)); gtk_widget_set_sensitive(priv->profileDelButton, n_children > 1); } else { @@ -415,10 +415,12 @@ static void trg_prefs_profile_combo_populate(TrgPreferencesDialog *dialog, name_value = _(TRG_PROFILE_NAME_DEFAULT); } GtkTreeIter iter; - gtk_list_store_insert_with_values(store, &iter, INT_MAX, 0, i, 1, + gtk_list_store_insert_with_values(store, &iter, INT_MAX, 0, profile, 1, name_value, -1); - if (i++ == profile_id) + if (i == profile_id) gtk_combo_box_set_active_iter(combo, &iter); + + i++; } gtk_widget_set_sensitive(priv->profileDelButton, g_list_length(profiles) > 1); @@ -429,7 +431,7 @@ static void trg_prefs_profile_combo_populate(TrgPreferencesDialog *dialog, static GtkWidget *trg_prefs_profile_combo_new(TrgClient *tc) { GtkWidget *w; GtkCellRenderer *r; - GtkListStore *store = gtk_list_store_new(2, G_TYPE_INT, G_TYPE_STRING); + GtkListStore *store = gtk_list_store_new(2, G_TYPE_POINTER, G_TYPE_STRING); w = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)); r = gtk_cell_renderer_text_new(); @@ -462,12 +464,12 @@ static void del_profile_cb(GtkWidget *w, gpointer data) { GtkComboBox *combo = GTK_COMBO_BOX(data); GtkTreeModel *profileModel = gtk_combo_box_get_model(combo); GtkTreeIter iter; - gint profile_id; + JsonObject *profile; if (gtk_combo_box_get_active_iter(combo, &iter)) { - gtk_tree_model_get(profileModel, &iter, 0, &profile_id, -1); - trg_prefs_del_profile(prefs, (guint)profile_id); - trg_prefs_set_profile(prefs, -1); + gtk_tree_model_get(profileModel, &iter, 0, &profile, -1); + trg_prefs_del_profile(prefs, profile); + trg_prefs_set_profile(prefs, NULL); gtk_list_store_remove(GTK_LIST_STORE(profileModel), &iter); gtk_combo_box_set_active(combo, 0); } @@ -480,9 +482,9 @@ static void add_profile_cb(GtkWidget *w, gpointer data) { GtkTreeModel *profileModel = gtk_combo_box_get_model(combo); GtkTreeIter iter; - gint new_id = trg_prefs_new_profile(priv->prefs); + JsonObject *profile = trg_prefs_new_profile(priv->prefs); gtk_list_store_insert_with_values(GTK_LIST_STORE(profileModel), &iter, - INT_MAX, 0, new_id, 1, _(TRG_PROFILE_NAME_DEFAULT), -1); + INT_MAX, 0, profile, 1, _(TRG_PROFILE_NAME_DEFAULT), -1); gtk_combo_box_set_active_iter(combo, &iter); } diff --git a/src/trg-prefs.c b/src/trg-prefs.c index 5ef7ff9..7c11879 100644 --- a/src/trg-prefs.c +++ b/src/trg-prefs.c @@ -38,6 +38,7 @@ struct _TrgPrefsPrivate { JsonObject *defaultsObj; JsonNode *user; JsonObject *userObj; + JsonObject *profile; gchar *file; }; @@ -146,16 +147,11 @@ gint trg_prefs_get_profile_id(TrgPrefs *p) { return (gint)json_object_get_int_member(priv->userObj, TRG_PREFS_KEY_PROFILE_ID); } -JsonObject *trg_prefs_get_current_profile(TrgPrefs *p) { - JsonArray *profiles = trg_prefs_get_profiles(p); - return json_array_get_object_element(profiles, trg_prefs_get_profile_id(p)); -} - JsonNode *trg_prefs_get_value(TrgPrefs *p, gchar *key, int flags) { TrgPrefsPrivate *priv = GET_PRIVATE(p); if ((flags & TRG_PREFS_PROFILE)) { - JsonObject *profile = trg_prefs_get_current_profile(p); + JsonObject *profile = trg_prefs_get_profile(p); if (json_object_has_member(profile, key)) { return json_object_get_member(profile, key); } else if ((flags & TRG_PREFS_NEWNODE)) { @@ -224,20 +220,52 @@ void trg_prefs_set_string(TrgPrefs *p, gchar *key, const gchar *value, json_node_set_string(node, value); } -void trg_prefs_set_profile(TrgPrefs *p, int index) { - trg_prefs_set_int(p, TRG_PREFS_KEY_PROFILE_ID, index, TRG_PREFS_GLOBAL); +void trg_prefs_set_profile(TrgPrefs *p, JsonObject *profile) { + TrgPrefsPrivate *priv = GET_PRIVATE(p); + JsonArray *profiles = trg_prefs_get_profiles(p); + priv->profile = profile; + + GList *li; + gint i = 0; + + for (li = json_array_get_elements(profiles); li; li = g_list_next(li)) + { + if (json_node_get_object((JsonNode*)li->data) == profile) { + trg_prefs_set_int(p, TRG_PREFS_KEY_PROFILE_ID, i, TRG_PREFS_GLOBAL); + break; + } + i++; + } } -gint trg_prefs_new_profile(TrgPrefs *p) { +JsonObject *trg_prefs_new_profile(TrgPrefs *p) { JsonArray *profiles = trg_prefs_get_profiles(p); JsonObject *newp = trg_prefs_new_profile_object(); json_array_add_object_element(profiles, newp); - return json_array_get_length(profiles) - 1; + return newp; } -void trg_prefs_del_profile(TrgPrefs *p, guint index) { +void trg_prefs_del_profile(TrgPrefs *p, JsonObject *profile) { JsonArray *profiles = trg_prefs_get_profiles(p); - json_array_remove_element(profiles, index); + + GList *li; + JsonNode *node; + int i = 0; + for (li = json_array_get_elements(profiles); li; li = g_list_next(li)) + { + node = (JsonNode*)li->data; + if (profile == (gpointer)json_node_get_object(node)) { + json_array_remove_element(profiles, i); + break; + } + i++; + } + +} + +JsonObject* trg_prefs_get_profile(TrgPrefs *p) { + TrgPrefsPrivate *priv = GET_PRIVATE(p); + return priv->profile; } JsonArray* trg_prefs_get_profiles(TrgPrefs *p) { @@ -344,12 +372,15 @@ void trg_prefs_load(TrgPrefs *p) { n_profiles = json_array_get_length(profiles); if (n_profiles < 1) { - json_array_add_object_element(profiles, trg_prefs_new_profile_object()); + priv->profile = trg_prefs_new_profile_object(); + json_array_add_object_element(profiles, priv->profile); trg_prefs_set_int(p, TRG_PREFS_KEY_PROFILE_ID, 0, TRG_PREFS_GLOBAL); } else { gint profile_id = trg_prefs_get_int(p, TRG_PREFS_KEY_PROFILE_ID, TRG_PREFS_GLOBAL); if (profile_id >= n_profiles) - trg_prefs_set_int(p, TRG_PREFS_KEY_PROFILE_ID, 0, TRG_PREFS_GLOBAL); + trg_prefs_set_int(p, TRG_PREFS_KEY_PROFILE_ID, profile_id=0, TRG_PREFS_GLOBAL); + + priv->profile = json_array_get_object_element(profiles, profile_id); } } diff --git a/src/trg-prefs.h b/src/trg-prefs.h index 0bbdd74..b655d74 100644 --- a/src/trg-prefs.h +++ b/src/trg-prefs.h @@ -106,11 +106,12 @@ gchar *trg_prefs_get_string(TrgPrefs *p, gchar *key, int flags); int trg_prefs_get_int(TrgPrefs *p, gchar *key, int flags); gdouble trg_prefs_get_double(TrgPrefs *p, gchar *key, int flags); gboolean trg_prefs_get_bool(TrgPrefs *p, gchar *key, int flags); +JsonObject* trg_prefs_get_profile(TrgPrefs *p); JsonArray* trg_prefs_get_profiles(TrgPrefs *p); gint trg_prefs_get_profile_id(TrgPrefs *p); -void trg_prefs_del_profile(TrgPrefs *p, guint index); -void trg_prefs_set_profile(TrgPrefs *p, int index); -gint trg_prefs_new_profile(TrgPrefs *p); +void trg_prefs_del_profile(TrgPrefs *p, JsonObject *profile); +void trg_prefs_set_profile(TrgPrefs *p, JsonObject *profile); +JsonObject *trg_prefs_new_profile(TrgPrefs *p); JsonObject *trg_get_current_profile(TrgPrefs *p); JsonObject *trg_prefs_get_root(TrgPrefs *p); -- cgit v1.2.3