diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/torrent-cell-renderer.c | 46 | ||||
-rw-r--r-- | src/torrent-cell-renderer.h | 1 | ||||
-rw-r--r-- | src/trg-main-window.c | 12 | ||||
-rw-r--r-- | src/trg-menu-bar.c | 25 | ||||
-rw-r--r-- | src/trg-prefs.c | 2 | ||||
-rw-r--r-- | src/trg-prefs.h | 7 | ||||
-rw-r--r-- | src/trg-torrent-tree-view.c | 77 | ||||
-rw-r--r-- | src/trg-tree-view.c | 103 | ||||
-rw-r--r-- | src/trg-tree-view.h | 11 |
9 files changed, 189 insertions, 95 deletions
diff --git a/src/torrent-cell-renderer.c b/src/torrent-cell-renderer.c index c94e175..296f288 100644 --- a/src/torrent-cell-renderer.c +++ b/src/torrent-cell-renderer.c @@ -47,6 +47,7 @@ enum P_CONNECTED, P_FILECOUNT, P_BAR_HEIGHT, + P_OWNER, P_COMPACT }; @@ -100,6 +101,8 @@ struct TorrentCellRendererPrivate GString * gstr2; int bar_height; + guint flags; + guint fileCount; gint64 uploadedEver; gint64 sizeWhenDone; gint64 totalSize; @@ -108,22 +111,20 @@ struct TorrentCellRendererPrivate gint64 haveUnchecked; gint64 upSpeed; gint64 downSpeed; - gpointer json; - gdouble done; - gdouble metadataPercentComplete; - gdouble ratio; - guint flags; gint64 peersFromUs; gint64 webSeedsToUs; gint64 peersToUs; gint64 connected; - guint fileCount; gint64 eta; gint64 error; gint64 seedRatioMode; + gdouble done; + gdouble metadataPercentComplete; + gdouble ratio; gdouble seedRatioLimit; + gpointer json; TrgClient *client; - + GtkTreeView *owner; gboolean compact; }; @@ -542,20 +543,20 @@ get_text_color( TorrentCellRenderer *r, GtkWidget *widget, GtrColor * setme ) { struct TorrentCellRendererPrivate *p = r->priv; #if GTK_CHECK_VERSION( 3,0,0 ) - static const GdkRGBA red = { 1.0, 0, 0, 0 }; + if( p->error ) *setme = red; else if( p->flags & TORRENT_FLAG_PAUSED ) gtk_style_context_get_color( gtk_widget_get_style_context( widget ), GTK_STATE_FLAG_INSENSITIVE, setme ); else gtk_style_context_get_color( gtk_widget_get_style_context( widget ), GTK_STATE_FLAG_NORMAL, setme ); - #else static const GdkColor red = { 0, 65535, 0, 0 }; + if( p->error ) *setme = red; - else if( p->error & TORRENT_FLAG_PAUSED ) + else if( p->flags & TORRENT_FLAG_PAUSED ) *setme = gtk_widget_get_style(widget)->text[GTK_STATE_INSENSITIVE]; else *setme = gtk_widget_get_style(widget)->text[GTK_STATE_NORMAL]; @@ -708,6 +709,9 @@ static void torrent_cell_renderer_set_property(GObject * object, case P_CLIENT: p->client = g_value_get_pointer(v); break; + case P_OWNER: + p->owner = g_value_get_pointer(v); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID( object, property_id, pspec); break; @@ -720,18 +724,7 @@ torrent_cell_renderer_get_property( GObject * object, GValue * v, GParamSpec * pspec ) { - /*const TorrentCellRenderer * self = TORRENT_CELL_RENDERER( object ); - struct TorrentCellRendererPrivate * p = self->priv; - - switch( property_id ) - { - case P_TORRENT: g_value_set_pointer( v, p->tor ); break; - case P_UPLOAD_SPEED: g_value_set_double( v, p->upload_speed_KBps ); break; - case P_DOWNLOAD_SPEED: g_value_set_double( v, p->download_speed_KBps ); break; - case P_BAR_HEIGHT: g_value_set_int( v, p->bar_height ); break; - case P_COMPACT: g_value_set_boolean( v, p->compact ); break; - default: G_OBJECT_WARN_INVALID_PROPERTY_ID( object, property_id, pspec ); break; - }*/ + G_OBJECT_WARN_INVALID_PROPERTY_ID( object, property_id, pspec ); } G_DEFINE_TYPE (TorrentCellRenderer, torrent_cell_renderer, GTK_TYPE_CELL_RENDERER) @@ -779,6 +772,10 @@ torrent_cell_renderer_class_init( TorrentCellRendererClass * klass ) "client", G_PARAM_READWRITE ) ); + g_object_class_install_property( gobject_class, P_OWNER, + g_param_spec_pointer( "owner", NULL, + "owner", + G_PARAM_READWRITE ) ); g_object_class_install_property( gobject_class, P_RATIO, g_param_spec_double( "ratio", NULL, @@ -1132,3 +1129,8 @@ render_full( TorrentCellRenderer * cell, /* cleanup */ g_object_unref( icon ); } + +GtkTreeView *torrent_cell_renderer_get_owner(TorrentCellRenderer *r) +{ + return r->priv->owner; +} diff --git a/src/torrent-cell-renderer.h b/src/torrent-cell-renderer.h index 14da210..817d58b 100644 --- a/src/torrent-cell-renderer.h +++ b/src/torrent-cell-renderer.h @@ -48,5 +48,6 @@ struct TorrentCellRendererClass GType torrent_cell_renderer_get_type( void ) G_GNUC_CONST; GtkCellRenderer * torrent_cell_renderer_new( void ); +GtkTreeView *torrent_cell_renderer_get_owner(TorrentCellRenderer *r); #endif /* GTR_TORRENT_CELL_RENDERER_H */ diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 72c5f66..6d1925d 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -401,10 +401,14 @@ destroy_window(TrgMainWindow * win, gpointer data G_GNUC_UNUSED) gtk_paned_get_position(GTK_PANED(priv->hpaned)), TRG_PREFS_GLOBAL); - trg_tree_view_persist(TRG_TREE_VIEW(priv->peersTreeView), FALSE); - trg_tree_view_persist(TRG_TREE_VIEW(priv->filesTreeView), FALSE); - trg_tree_view_persist(TRG_TREE_VIEW(priv->torrentTreeView), TRUE); - trg_tree_view_persist(TRG_TREE_VIEW(priv->trackersTreeView), FALSE); + trg_tree_view_persist(TRG_TREE_VIEW(priv->peersTreeView), TRG_TREE_VIEW_PERSIST_SORT | TRG_TREE_VIEW_PERSIST_LAYOUT); + trg_tree_view_persist(TRG_TREE_VIEW(priv->filesTreeView), TRG_TREE_VIEW_PERSIST_SORT | TRG_TREE_VIEW_PERSIST_LAYOUT); + trg_tree_view_persist(TRG_TREE_VIEW(priv->torrentTreeView), + TRG_TREE_VIEW_PERSIST_SORT | TRG_TREE_VIEW_SORTABLE_PARENT + | (trg_prefs_get_int(prefs, TRG_PREFS_KEY_STYLE, + TRG_PREFS_GLOBAL) == TRG_STYLE_CLASSIC ? + TRG_TREE_VIEW_PERSIST_LAYOUT : 0)); + trg_tree_view_persist(TRG_TREE_VIEW(priv->trackersTreeView), TRG_TREE_VIEW_PERSIST_SORT | TRG_TREE_VIEW_PERSIST_LAYOUT); trg_prefs_save(prefs); gtk_main_quit(); diff --git a/src/trg-menu-bar.c b/src/trg-menu-bar.c index fd5756c..338389d 100644 --- a/src/trg-menu-bar.c +++ b/src/trg-menu-bar.c @@ -24,6 +24,7 @@ #include <gdk/gdkkeysyms-compat.h> #endif +#include "trg-prefs.h" #include "trg-torrent-graph.h" #include "trg-main-window.h" #include "trg-menu-bar.h" @@ -67,6 +68,7 @@ enum { }; #define G_DATAKEY_CONF_KEY "conf-key" +#define G_DATAKEY_PREF_VALUE "pref-index" G_DEFINE_TYPE(TrgMenuBar, trg_menu_bar, GTK_TYPE_MENU_BAR) #define TRG_MENU_BAR_GET_PRIVATE(o) \ @@ -336,8 +338,7 @@ static void view_menu_radio_item_toggled_cb(GtkCheckMenuItem * w, gpointer data) (gchar *) g_object_get_data(G_OBJECT(w), G_DATAKEY_CONF_KEY); if (gtk_check_menu_item_get_active(w)) { - gint index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w), "pref-index")); - g_message("active index = %d", index); + gint index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w), G_DATAKEY_PREF_VALUE)); trg_prefs_set_int(p, key, index, TRG_PREFS_GLOBAL); } } @@ -345,7 +346,7 @@ static void view_menu_radio_item_toggled_cb(GtkCheckMenuItem * w, gpointer data) static void view_menu_item_toggled_cb(GtkCheckMenuItem * w, gpointer data) { TrgPrefs *p = TRG_PREFS(data); - gchar *key = + const gchar *key = (gchar *) g_object_get_data(G_OBJECT(w), G_DATAKEY_CONF_KEY); trg_prefs_set_bool(p, key, gtk_check_menu_item_get_active(w), TRG_PREFS_GLOBAL); @@ -363,7 +364,7 @@ static void trg_menu_bar_view_item_update(TrgPrefs * p, const gchar * updatedKey, gpointer data) { - gchar *key = + const gchar *key = (gchar *) g_object_get_data(G_OBJECT(data), G_DATAKEY_CONF_KEY); if (!g_strcmp0(updatedKey, key)) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(data), @@ -377,7 +378,7 @@ trg_menu_bar_view_radio_item_update(TrgPrefs * p, const gchar * updatedKey, { const gchar *key = (gchar *) g_object_get_data(G_OBJECT(data), G_DATAKEY_CONF_KEY); - gint myIndex = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), "pref-index")); + gint myIndex = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), G_DATAKEY_PREF_VALUE)); if (!g_strcmp0(updatedKey, key)) { gboolean shouldBeActive = trg_prefs_get_int(p, key, TRG_PREFS_GLOBAL) == myIndex; @@ -395,7 +396,7 @@ static GtkWidget *trg_menu_bar_view_radio_item_new(TrgPrefs * prefs, GtkWidget *w = gtk_radio_menu_item_new_with_label(group, label); g_object_set_data_full(G_OBJECT(w), G_DATAKEY_CONF_KEY, g_strdup(key), g_free); - g_object_set_data(G_OBJECT(w), "pref-index", GINT_TO_POINTER(index)); + g_object_set_data(G_OBJECT(w), G_DATAKEY_PREF_VALUE, GINT_TO_POINTER(index)); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w), trg_prefs_get_int(prefs, key, @@ -448,16 +449,14 @@ static GtkWidget *trg_menu_bar_view_menu_new(TrgMenuBar * mb) gtk_menu_item_set_submenu(GTK_MENU_ITEM(view), viewMenu); - priv->mb_view_classic = trg_menu_bar_view_radio_item_new(priv->prefs, NULL, "style", 0, _("Classic")); - gtk_menu_shell_append(GTK_MENU_SHELL(viewMenu), priv->mb_view_classic); - group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (priv->mb_view_classic)); - priv->mb_view_transmission = trg_menu_bar_view_radio_item_new(priv->prefs, group, "style", 1, _("Transmission")); + priv->mb_view_transmission = trg_menu_bar_view_radio_item_new(priv->prefs, NULL, TRG_PREFS_KEY_STYLE, TRG_STYLE_TR, _("Transmission Style")); gtk_menu_shell_append(GTK_MENU_SHELL(viewMenu), priv->mb_view_transmission); group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (priv->mb_view_transmission)); - priv->mb_view_transmission_compact = trg_menu_bar_view_radio_item_new(priv->prefs, group, "style", 2, _("Transmission Compact")); + priv->mb_view_transmission_compact = trg_menu_bar_view_radio_item_new(priv->prefs, group, TRG_PREFS_KEY_STYLE, TRG_STYLE_TR_COMPACT, _("Transmission Compact Style")); gtk_menu_shell_append(GTK_MENU_SHELL(viewMenu), priv->mb_view_transmission_compact); - - priv->mb_view_classic = + group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (priv->mb_view_transmission_compact)); + priv->mb_view_classic = trg_menu_bar_view_radio_item_new(priv->prefs, group, TRG_PREFS_KEY_STYLE, TRG_STYLE_CLASSIC, _("Classic Style")); + gtk_menu_shell_append(GTK_MENU_SHELL(viewMenu), priv->mb_view_classic); priv->mb_view_states = trg_menu_bar_view_item_new(priv->prefs, diff --git a/src/trg-prefs.c b/src/trg-prefs.c index 253009d..a80afa6 100644 --- a/src/trg-prefs.c +++ b/src/trg-prefs.c @@ -116,7 +116,7 @@ static void trg_prefs_create_defaults(TrgPrefs * p) trg_prefs_add_default_bool_true(p, TRG_PREFS_KEY_SHOW_GRAPH); trg_prefs_add_default_bool_true(p, TRG_PREFS_KEY_ADD_OPTIONS_DIALOG); trg_prefs_add_default_bool_true(p, TRG_PREFS_KEY_SHOW_STATE_SELECTOR); - trg_prefs_add_default_bool_true(p, TRG_PREFS_KEY_SHOW_NOTEBOOK); + //trg_prefs_add_default_bool_true(p, TRG_PREFS_KEY_SHOW_NOTEBOOK); } static GObject *trg_prefs_constructor(GType type, diff --git a/src/trg-prefs.h b/src/trg-prefs.h index 535eb31..465ad81 100644 --- a/src/trg-prefs.h +++ b/src/trg-prefs.h @@ -64,6 +64,7 @@ #define TRG_PREFS_STATE_SELECTOR_LAST "state-selector-last" #define TRG_PREFS_ACTIVEONLY_FULLSYNC_ENABLED "activeonly-fullsync-enabled" #define TRG_PREFS_ACTIVEONLY_FULLSYNC_EVERY "activeonly-fullsync-every" +#define TRG_PREFS_KEY_STYLE "style" #define TRG_PREFS_KEY_TREE_VIEWS "tree-views" #define TRG_PREFS_KEY_TV_SORT_TYPE "sort-type" #define TRG_PREFS_KEY_TV_SORT_COL "sort-col" @@ -86,6 +87,12 @@ #define TRG_PREFS_NEWNODE (1 << 4) /* 0x08 */ #define TRG_PREFS_REPLACENODE (1 << 5) /* 0x16 */ +enum { + TRG_STYLE_TR = 0, + TRG_STYLE_CLASSIC, + TRG_STYLE_TR_COMPACT +}; + typedef struct _TrgPrefsPrivate TrgPrefsPrivate; G_BEGIN_DECLS diff --git a/src/trg-torrent-tree-view.c b/src/trg-torrent-tree-view.c index 6c6bf36..f079e5a 100644 --- a/src/trg-torrent-tree-view.c +++ b/src/trg-torrent-tree-view.c @@ -28,9 +28,18 @@ G_DEFINE_TYPE(TrgTorrentTreeView, trg_torrent_tree_view, TRG_TYPE_TREE_VIEW) +#define GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRG_TYPE_TORRENT_TREE_VIEW, TrgTorrentTreeViewPrivate)) +typedef struct _TrgTorrentTreeViewPrivate TrgTorrentTreeViewPrivate; + +struct _TrgTorrentTreeViewPrivate { + TrgClient *client; +}; + static void trg_torrent_tree_view_class_init(TrgTorrentTreeViewClass * klass G_GNUC_UNUSED) { + g_type_class_add_private(klass, sizeof(TrgTorrentTreeViewPrivate)); } static void trg_torrent_tree_view_init(TrgTorrentTreeView * tttv) @@ -163,9 +172,35 @@ JsonArray *build_json_id_array(TrgTorrentTreeView * tv) return ids; } -static void setup_classic_layout(TrgClient *tc, TrgTorrentTreeView *tv) +static void setup_classic_layout(TrgTorrentTreeView *tv) { + gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(tv), TRUE); + gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(tv), TRUE); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tv), TRUE); + trg_tree_view_setup_columns(TRG_TREE_VIEW(tv)); +} + +static void +trg_torrent_tree_view_renderer_pref_changed(TrgPrefs * p, const gchar * updatedKey, + gpointer data) { + if (!g_strcmp0(updatedKey, TRG_PREFS_KEY_STYLE)) { + GtkTreeView *tv = torrent_cell_renderer_get_owner(TORRENT_CELL_RENDERER(data)); + gboolean compact = trg_prefs_get_int(p, TRG_PREFS_KEY_STYLE, TRG_PREFS_GLOBAL) == TRG_STYLE_TR_COMPACT; + g_object_set(G_OBJECT(data), "compact", GINT_TO_POINTER(compact), NULL); +#if GTK_CHECK_VERSION( 3,0,0 ) + g_signal_emit_by_name( tv, "style-updated", NULL, NULL ); +#else + g_signal_emit_by_name( tv, "style-set", NULL, NULL ); +#endif + } +} + +static void setup_transmission_layout(TrgTorrentTreeView *tv, gint64 style) +{ + TrgTorrentTreeViewPrivate *priv = GET_PRIVATE(tv); GtkCellRenderer *renderer = torrent_cell_renderer_new(); + TrgPrefs *prefs = trg_client_get_prefs(priv->client); + GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes("", renderer, "status", TORRENT_COLUMN_FLAGS, @@ -191,9 +226,13 @@ static void setup_classic_layout(TrgClient *tc, TrgTorrentTreeView *tv) "connected", TORRENT_COLUMN_PEERS_CONNECTED, NULL); - g_object_set(G_OBJECT(renderer), "client", tc, NULL); + g_object_set(G_OBJECT(renderer), "client", priv->client, + "owner", tv, + "compact", style == TRG_STYLE_TR_COMPACT, NULL); + + g_signal_connect_object(prefs, "pref-changed", + G_CALLBACK(trg_torrent_tree_view_renderer_pref_changed), renderer, G_CONNECT_AFTER); - //gtk_tree_view_column_set_min_width(column, 0); gtk_tree_view_column_set_resizable(column, FALSE); gtk_tree_view_column_set_reorderable(column, FALSE); gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(tv), FALSE); @@ -205,15 +244,43 @@ static void setup_classic_layout(TrgClient *tc, TrgTorrentTreeView *tv) gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column); } +static void +trg_torrent_tree_view_pref_changed(TrgPrefs * p, const gchar * updatedKey, + gpointer data) +{ + if (!g_strcmp0(updatedKey, TRG_PREFS_KEY_STYLE)) { + TrgTorrentTreeViewPrivate *priv = GET_PRIVATE(data); + TrgPrefs *prefs = trg_client_get_prefs(priv->client); + + trg_tree_view_remove_all_columns(TRG_TREE_VIEW(data)); + if (trg_prefs_get_int(p, TRG_PREFS_KEY_STYLE, TRG_PREFS_GLOBAL) == TRG_STYLE_CLASSIC) + setup_classic_layout(TRG_TORRENT_TREE_VIEW(data)); + else + setup_transmission_layout(TRG_TORRENT_TREE_VIEW(data), trg_prefs_get_int(prefs, TRG_PREFS_KEY_STYLE, TRG_PREFS_GLOBAL)); + } +} + TrgTorrentTreeView *trg_torrent_tree_view_new(TrgClient *tc, GtkTreeModel * model) { GObject *obj = g_object_new(TRG_TYPE_TORRENT_TREE_VIEW, NULL); + TrgTorrentTreeViewPrivate *priv = GET_PRIVATE(obj); + TrgPrefs *prefs = trg_client_get_prefs(tc); + gint64 style = trg_prefs_get_int(prefs, TRG_PREFS_KEY_STYLE, TRG_PREFS_GLOBAL); trg_tree_view_set_prefs(TRG_TREE_VIEW(obj), trg_client_get_prefs(tc)); gtk_tree_view_set_model(GTK_TREE_VIEW(obj), model); - //trg_tree_view_setup_columns(TRG_TREE_VIEW(obj)); - setup_classic_layout(tc, TRG_TORRENT_TREE_VIEW(obj)); + + priv->client = tc; + + if (style == TRG_STYLE_CLASSIC) { + setup_classic_layout(TRG_TORRENT_TREE_VIEW(obj)); + } else { + setup_transmission_layout(TRG_TORRENT_TREE_VIEW(obj), style); + } + + g_signal_connect(prefs, "pref-changed", + G_CALLBACK(trg_torrent_tree_view_pref_changed), obj); trg_tree_view_restore_sort(TRG_TREE_VIEW(obj), TRUE); diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c index 47ffabd..42d4885 100644 --- a/src/trg-tree-view.c +++ b/src/trg-tree-view.c @@ -59,6 +59,8 @@ struct _TrgTreeViewPrivate { TrgPrefs *prefs; }; +#define GDATA_KEY_COLUMN_DESC "column-desc" + gboolean trg_tree_view_is_column_showing(TrgTreeView * tv, gint index) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); @@ -146,8 +148,8 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv, gint type, gint model_column, - gchar * header, - gchar * id, gint flags) + const gchar * header, + const gchar * id, gint flags) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); trg_column_description *desc = g_new0(trg_column_description, 1); @@ -183,7 +185,7 @@ static void trg_tree_view_hide_column(GtkWidget * w, GtkTreeViewColumn * col) { trg_column_description *desc = g_object_get_data(G_OBJECT(col), - "column-desc"); + GDATA_KEY_COLUMN_DESC); GtkWidget *tv = gtk_tree_view_column_get_tree_view(col); desc->flags &= ~TRG_COLUMN_SHOWING; gtk_tree_view_remove_column(GTK_TREE_VIEW(tv), col); @@ -219,7 +221,7 @@ view_popup_menu(GtkButton * button, GdkEventButton * event, menu = gtk_menu_new(); - desc = g_object_get_data(G_OBJECT(column), "column-desc"); + desc = g_object_get_data(G_OBJECT(column), GDATA_KEY_COLUMN_DESC); menuitem = gtk_check_menu_item_new_with_label(desc->header); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); g_signal_connect(menuitem, "activate", @@ -435,7 +437,7 @@ trg_tree_view_add_column_after(TrgTreeView * tv, gtk_tree_view_column_set_fixed_width(column, width); } - g_object_set_data(G_OBJECT(column), "column-desc", desc); + g_object_set_data(G_OBJECT(column), GDATA_KEY_COLUMN_DESC, desc); gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column); @@ -458,64 +460,71 @@ trg_tree_view_add_column_after(TrgTreeView * tv, desc->flags |= TRG_COLUMN_SHOWING; } -void trg_tree_view_persist(TrgTreeView * tv, gboolean parentIsSortable) +void trg_tree_view_remove_all_columns(TrgTreeView *tv) { + GtkTreeView *gtv = GTK_TREE_VIEW(tv); + GList *cols = gtk_tree_view_get_columns(gtv); + GList *li; + for (li = cols; li; li = g_list_next(li)) { + gtk_tree_view_remove_column(gtv, GTK_TREE_VIEW_COLUMN(li->data)); + } + g_list_free(cols); +} + +void trg_tree_view_persist(TrgTreeView * tv, guint flags) { 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)); - - if (cols && g_object_get_data(G_OBJECT(cols->data), "column-desc") == NULL) { - g_list_free(cols); - return; - } - - GList *li; + GList *cols, *li; + JsonArray *widths, *columns; gint sort_column_id; GtkSortType sort_type; - JsonArray *widths, *columns; - if (json_object_has_member(props, TRG_PREFS_KEY_TV_WIDTHS)) - json_object_remove_member(props, TRG_PREFS_KEY_TV_WIDTHS); + if (flags & TRG_TREE_VIEW_PERSIST_SORT) { + gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE + ((flags & TRG_TREE_VIEW_SORTABLE_PARENT) ? + gtk_tree_model_filter_get_model + (GTK_TREE_MODEL_FILTER(model)) : + model), &sort_column_id, &sort_type); - 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_SORT_COL)) + json_object_remove_member(props, TRG_PREFS_KEY_TV_SORT_COL); - if (json_object_has_member(props, TRG_PREFS_KEY_TV_COLUMNS)) - json_object_remove_member(props, TRG_PREFS_KEY_TV_COLUMNS); + if (json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_TYPE)) + json_object_remove_member(props, TRG_PREFS_KEY_TV_SORT_TYPE); - columns = json_array_new(); - json_object_set_array_member(props, TRG_PREFS_KEY_TV_COLUMNS, columns); + 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); + } - 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"); + if (flags & TRG_TREE_VIEW_PERSIST_LAYOUT) { + cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(tv) ); - json_array_add_string_element(columns, desc->id); - json_array_add_int_element(widths, - gtk_tree_view_column_get_width(col)); - } + 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); - g_list_free(cols); + if (json_object_has_member(props, TRG_PREFS_KEY_TV_COLUMNS)) + json_object_remove_member(props, TRG_PREFS_KEY_TV_COLUMNS); - gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE - (parentIsSortable ? - gtk_tree_model_filter_get_model - (GTK_TREE_MODEL_FILTER(model)) : - model), &sort_column_id, - &sort_type); + columns = json_array_new(); + json_object_set_array_member(props, TRG_PREFS_KEY_TV_COLUMNS, columns); - if (json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_COL)) - json_object_remove_member(props, TRG_PREFS_KEY_TV_SORT_COL); + 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), + GDATA_KEY_COLUMN_DESC); - if (json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_TYPE)) - json_object_remove_member(props, TRG_PREFS_KEY_TV_SORT_TYPE); + json_array_add_string_element(columns, desc->id); + json_array_add_int_element(widths, + gtk_tree_view_column_get_width(col)); + } - 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); + g_list_free(cols); + } } void diff --git a/src/trg-tree-view.h b/src/trg-tree-view.h index 562ca5c..a7b2315 100644 --- a/src/trg-tree-view.h +++ b/src/trg-tree-view.h @@ -82,14 +82,19 @@ typedef struct { #define TRG_COLUMN_UNREMOVABLE (1 << 1) /* 0x02 */ #define TRG_COLUMN_EXTRA (1 << 2) /* 0x04 */ +#define TRG_TREE_VIEW_PERSIST_SORT (1 << 0) +#define TRG_TREE_VIEW_PERSIST_LAYOUT (1 << 1) +#define TRG_TREE_VIEW_SORTABLE_PARENT (1 << 2) + trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv, gint type, gint model_column, - gchar * header, - gchar * id, gint flags); + const gchar * header, + const gchar * id, gint flags); void trg_tree_view_setup_columns(TrgTreeView * tv); void trg_tree_view_set_prefs(TrgTreeView * tv, TrgPrefs * prefs); -void trg_tree_view_persist(TrgTreeView * tv, gboolean parentIsSortable); +void trg_tree_view_persist(TrgTreeView * tv, guint flags); +void trg_tree_view_remove_all_columns(TrgTreeView *tv); void trg_tree_view_restore_sort(TrgTreeView * tv, gboolean parentIsSortable); gboolean trg_tree_view_is_column_showing(TrgTreeView * tv, gint index); |