summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/torrent-cell-renderer.c46
-rw-r--r--src/torrent-cell-renderer.h1
-rw-r--r--src/trg-main-window.c12
-rw-r--r--src/trg-menu-bar.c25
-rw-r--r--src/trg-prefs.c2
-rw-r--r--src/trg-prefs.h7
-rw-r--r--src/trg-torrent-tree-view.c77
-rw-r--r--src/trg-tree-view.c103
-rw-r--r--src/trg-tree-view.h11
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);