diff options
Diffstat (limited to 'src/trg-tree-view.c')
-rw-r--r-- | src/trg-tree-view.c | 284 |
1 files changed, 163 insertions, 121 deletions
diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c index a64b403..75f6674 100644 --- a/src/trg-tree-view.c +++ b/src/trg-tree-view.c @@ -19,9 +19,10 @@ #include <stdlib.h> #include <gtk/gtk.h> -#include <gconf/gconf-client.h> +#include <json-glib/json-glib.h> #include <glib/gi18n.h> +#include "trg-prefs.h" #include "trg-tree-view.h" #include "trg-cell-renderer-speed.h" #include "trg-cell-renderer-size.h" @@ -32,6 +33,11 @@ #include "trg-cell-renderer-priority.h" #include "trg-cell-renderer-numgtzero.h" +enum { + PROP_0, + PROP_PREFS +}; + G_DEFINE_TYPE(TrgTreeView, trg_tree_view, GTK_TYPE_TREE_VIEW) #define TRG_TREE_VIEW_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRG_TYPE_TREE_VIEW, TrgTreeViewPrivate)) @@ -39,11 +45,73 @@ typedef struct _TrgTreeViewPrivate TrgTreeViewPrivate; struct _TrgTreeViewPrivate { GList *columns; + TrgPrefs *prefs; }; +static void +trg_tree_view_get_property(GObject * object, guint property_id, + GValue * value, GParamSpec * pspec) +{ + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); +} + +static void +trg_tree_view_set_property(GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec) +{ + TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(object); + switch (property_id) { + case PROP_PREFS: + priv->prefs = g_value_get_object(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); + } +} + +static GObject *trg_tree_view_constructor(GType type, + guint + n_construct_properties, + GObjectConstructParam + * construct_params) +{ + GObject *obj = G_OBJECT_CLASS + (trg_tree_view_parent_class)->constructor(type, + n_construct_properties, + construct_params); + //TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(obj); + + return obj; +} + +static JsonObject* trg_prefs_get_tree_view_props(TrgTreeView *tv) +{ + TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); + JsonObject *root = trg_prefs_get_root(priv->prefs); + const gchar *className = G_OBJECT_TYPE_NAME(tv); + JsonObject *obj; + JsonObject *tvProps = NULL; + + if (!json_object_has_member(root, TRG_PREFS_KEY_TREE_VIEWS)) { + obj = json_object_new(); + json_object_set_object_member(root, TRG_PREFS_KEY_TREE_VIEWS, obj); + } else { + obj = json_object_get_object_member(root, TRG_PREFS_KEY_TREE_VIEWS); + } + + if (!json_object_has_member(obj, className)) { + tvProps = json_object_new(); + json_object_set_object_member(obj, className, tvProps); + } else { + tvProps = json_object_get_object_member(obj, className); + } + + return tvProps; +} + static void trg_tree_view_add_column_after(TrgTreeView * tv, trg_column_description * desc, - gchar ** widths, gint i, + gint64 width, GtkTreeViewColumn * after_col); trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv, @@ -67,7 +135,7 @@ trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv, } static trg_column_description *trg_tree_view_find_column(TrgTreeView * tv, - gchar * id) + const gchar * id) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); GList *li; @@ -82,26 +150,6 @@ static trg_column_description *trg_tree_view_find_column(TrgTreeView * tv, return NULL; } -static gchar **trg_gconf_get_csv(TrgTreeView * tv, gchar * key) -{ - gchar **ret = NULL; - GConfClient *gcc = gconf_client_get_default(); - gchar *gconf_key = - g_strdup_printf("/apps/transmission-remote-gtk/%s-%s", - G_OBJECT_TYPE_NAME(tv), key); - gchar *gconf_value = gconf_client_get_string(gcc, gconf_key, NULL); - - if (gconf_value) { - ret = g_strsplit(gconf_value, ",", -1); - g_free(gconf_value); - } - - g_free(gconf_key); - g_object_unref(gcc); - - return ret; -} - static void trg_tree_view_hide_column(GtkWidget * w, GtkTreeViewColumn * col) { @@ -114,9 +162,9 @@ static void trg_tree_view_hide_column(GtkWidget * w, static void trg_tree_view_add_column(TrgTreeView * tv, trg_column_description * desc, - gchar ** widths, gint i) + gint64 width) { - trg_tree_view_add_column_after(tv, desc, widths, i, NULL); + trg_tree_view_add_column_after(tv, desc, width, NULL); } static void trg_tree_view_user_add_column_cb(GtkWidget * w, @@ -126,7 +174,7 @@ static void trg_tree_view_user_add_column_cb(GtkWidget * w, TrgTreeView *tv = TRG_TREE_VIEW(gtk_tree_view_column_get_tree_view(col)); - trg_tree_view_add_column_after(tv, desc, NULL, -1, col); + trg_tree_view_add_column_after(tv, desc, -1, col); } static void @@ -182,7 +230,7 @@ col_onButtonPressed(GtkButton * button, GdkEventButton * event, static void trg_tree_view_add_column_after(TrgTreeView * tv, trg_column_description * desc, - gchar ** widths, gint i, + gint64 width, GtkTreeViewColumn * after_col) { GtkCellRenderer *renderer; @@ -299,16 +347,14 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, gtk_tree_view_column_set_reorderable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, desc->model_column); - if (!widths && desc->defaultWidth > 0) { + if (width < 0 && desc->defaultWidth > 0) { gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width(column, desc->defaultWidth); - } else if (widths && i >= 0) { - gchar *ws = widths[i]; - int w = atoi(ws); + } else if (width > 0) { gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_fixed_width(column, w); + gtk_tree_view_column_set_fixed_width(column, width); } g_object_set_data(G_OBJECT(column), "column-desc", desc); @@ -330,122 +376,100 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, void trg_tree_view_persist(TrgTreeView * tv) { - GConfClient *gcc = gconf_client_get_default(); + JsonObject *props = trg_prefs_get_tree_view_props(tv); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tv)); GList *cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(tv)); - gint n_cols = g_list_length(cols); + + GList *li; gint sort_column_id; GtkSortType sort_type; - const gchar *tree_view_name = G_OBJECT_TYPE_NAME(tv); - gchar *cols_key = - g_strdup_printf("/apps/transmission-remote-gtk/%s-columns", - tree_view_name); - gchar *widths_key = - g_strdup_printf("/apps/transmission-remote-gtk/%s-widths", - tree_view_name); - gchar **cols_v = g_new0(gchar *, n_cols + 1); - gchar **widths_v = g_new0(gchar *, n_cols + 1); - gchar *widths_js, *cols_js; - GList *li; - int i = 0; + + JsonArray *widths, *columns; + if (json_object_has_member(props, TRG_PREFS_KEY_TV_WIDTHS)) + json_object_remove_member(props, TRG_PREFS_KEY_TV_WIDTHS); + + widths = json_array_new(); + json_object_set_array_member(props, TRG_PREFS_KEY_TV_WIDTHS, widths); + + if (json_object_has_member(props, TRG_PREFS_KEY_TV_COLUMNS)) + json_object_remove_member(props, TRG_PREFS_KEY_TV_COLUMNS); + + columns = json_array_new(); + json_object_set_array_member(props, TRG_PREFS_KEY_TV_COLUMNS, columns); for (li = cols; li; li = g_list_next(li)) { GtkTreeViewColumn *col = (GtkTreeViewColumn *) li->data; trg_column_description *desc = g_object_get_data(G_OBJECT(li->data), "column-desc"); - cols_v[i] = desc->id; - widths_v[i] = - g_strdup_printf("%d", gtk_tree_view_column_get_width(col)); - i++; - } - widths_js = g_strjoinv(",", widths_v); - cols_js = g_strjoinv(",", cols_v); - - if (gtk_tree_sortable_get_sort_column_id - (GTK_TREE_SORTABLE(model), &sort_column_id, &sort_type)) { - gchar *sort_col_key = - g_strdup_printf("/apps/transmission-remote-gtk/%s-sort_col", - tree_view_name); - gchar *sort_type_key = - g_strdup_printf("/apps/transmission-remote-gtk/%s-sort_type", - tree_view_name); - gconf_client_set_int(gcc, sort_col_key, sort_column_id, NULL); - gconf_client_set_int(gcc, sort_type_key, (gint) sort_type, NULL); - g_free(sort_type_key); - g_free(sort_col_key); + json_array_add_string_element(columns, desc->id); + json_array_add_int_element(widths, gtk_tree_view_column_get_width(col)); } - gconf_client_set_string(gcc, cols_key, cols_js, NULL); - gconf_client_set_string(gcc, widths_key, widths_js, NULL); - - g_free(cols_key); - g_free(widths_key); - g_free(widths_js); - g_free(cols_js); - g_free(cols_v); - g_strfreev(widths_v); - g_list_free(cols); - g_object_unref(gcc); + gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(model), &sort_column_id, &sort_type); + + if (json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_COL)) + json_object_remove_member(props, TRG_PREFS_KEY_TV_SORT_COL); + + if (json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_TYPE)) + json_object_remove_member(props, TRG_PREFS_KEY_TV_SORT_TYPE); + + json_object_set_int_member(props, TRG_PREFS_KEY_TV_SORT_COL, (gint64)sort_column_id); + json_object_set_int_member(props, TRG_PREFS_KEY_TV_SORT_TYPE, (gint64)sort_type); } void trg_tree_view_restore_sort(TrgTreeView * tv) { - GConfClient *gcc = gconf_client_get_default(); + JsonObject *props = trg_prefs_get_tree_view_props(tv); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tv)); - gchar *sort_col_key = - g_strdup_printf("/apps/transmission-remote-gtk/%s-sort_col", - G_OBJECT_TYPE_NAME(tv)); - gchar *sort_type_key = - g_strdup_printf("/apps/transmission-remote-gtk/%s-sort_type", - G_OBJECT_TYPE_NAME(tv)); - GConfValue *sort_col_gv = - gconf_client_get_without_default(gcc, sort_col_key, NULL); - GConfValue *sort_type_gv = - gconf_client_get_without_default(gcc, sort_type_key, NULL); - if (sort_col_gv) { - gint sort_col_value = gconf_value_get_int(sort_col_gv); - GtkSortType sort_type_value = GTK_SORT_ASCENDING; - if (sort_type_gv) { - sort_type_value = - (GtkSortType) gconf_value_get_int(sort_type_gv); - gconf_value_free(sort_type_gv); - } - gconf_value_free(sort_col_gv); + + if (json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_COL) && + json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_TYPE)) { + gint64 sort_col = json_object_get_int_member(props, TRG_PREFS_KEY_TV_SORT_COL); + gint64 sort_type = json_object_get_int_member(props, TRG_PREFS_KEY_TV_SORT_TYPE); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), - sort_col_value, - sort_type_value); + sort_col, + (GtkSortType)sort_type); + } - g_free(sort_col_key); - g_free(sort_type_key); - g_object_unref(gcc); +} + +void trg_tree_view_set_prefs(TrgTreeView *tv, TrgPrefs *prefs) +{ + TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); + priv->prefs = prefs; } void trg_tree_view_setup_columns(TrgTreeView * tv) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); - gchar **columns = trg_gconf_get_csv(tv, "columns"); - GList *li; - int i; - trg_column_description *desc; + JsonObject *props = trg_prefs_get_tree_view_props(tv); - if (columns) { - gchar **widths = trg_gconf_get_csv(tv, "widths"); - for (i = 0; columns[i]; i++) { - trg_column_description *desc = - trg_tree_view_find_column(tv, columns[i]); - if (desc) - trg_tree_view_add_column(tv, desc, widths, i); - } - g_strfreev(columns); - if (widths) - g_strfreev(widths); - } else { + if (!json_object_has_member(props, TRG_PREFS_KEY_TV_COLUMNS) || + !json_object_has_member(props, TRG_PREFS_KEY_TV_WIDTHS)) { + GList *li; for (li = priv->columns; li; li = g_list_next(li)) { - desc = (trg_column_description *) li->data; + trg_column_description *desc = (trg_column_description *) li->data; if (desc && !(desc->flags & TRG_COLUMN_EXTRA)) - trg_tree_view_add_column(tv, desc, NULL, -1); + trg_tree_view_add_column(tv, desc, -1); } + return; + } + + GList *columns = json_array_get_elements(json_object_get_array_member(props, TRG_PREFS_KEY_TV_COLUMNS)); + GList *widths = json_array_get_elements(json_object_get_array_member(props, TRG_PREFS_KEY_TV_WIDTHS)); + + GList *wli = widths; + GList *cli = columns; + + for (; cli; cli = g_list_next(cli)) { + trg_column_description *desc = + trg_tree_view_find_column(tv, json_node_get_string((JsonNode*)cli->data)); + if (desc) { + gint64 width = json_node_get_int((JsonNode*)wli->data); + trg_tree_view_add_column(tv, desc, width); + } + wli = g_list_next(wli); } } @@ -469,9 +493,27 @@ GList *trg_tree_view_get_selected_refs_list(GtkTreeView * tv) } static void -trg_tree_view_class_init(TrgTreeViewClass * klass G_GNUC_UNUSED) +trg_tree_view_class_init(TrgTreeViewClass * klass) { + GObjectClass *object_class = G_OBJECT_CLASS(klass); + g_type_class_add_private(klass, sizeof(TrgTreeViewPrivate)); + + object_class->get_property = trg_tree_view_get_property; + object_class->set_property = trg_tree_view_set_property; + object_class->constructor = trg_tree_view_constructor; + + g_object_class_install_property(object_class, + PROP_PREFS, + g_param_spec_object + ("prefs", "Trg Prefs", + "Trg Prefs", + TRG_TYPE_PREFS, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); } static void trg_tree_view_init(TrgTreeView * tv) |