summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-04-23 13:35:04 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-04-23 13:35:04 +0000
commit448a320aeb1b523893bd450c2ac9e52230da9410 (patch)
tree2c91dd1ec8635ec5d5e9d4d9bae1aa68187f8bac
parentfc4ffcaa3bc34da935ac6f46cab71be932de306c (diff)
header right click menu to show/hide
-rw-r--r--po/POTFILES.in1
-rw-r--r--src/trg-files-tree-view.c10
-rw-r--r--src/trg-main-window.c4
-rw-r--r--src/trg-peers-tree-view.c16
-rw-r--r--src/trg-torrent-model.c3
-rw-r--r--src/trg-torrent-model.h1
-rw-r--r--src/trg-torrent-tree-view.c30
-rw-r--r--src/trg-trackers-tree-view.c6
-rw-r--r--src/trg-tree-view.c95
-rw-r--r--src/trg-tree-view.h9
10 files changed, 137 insertions, 38 deletions
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 6e4b240..d5da8ae 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -21,3 +21,4 @@ src/trg-trackers-tree-view.c
src/util.c
src/trg-cell-renderer-priority.c
src/trg-torrent-add-dialog.c
+src/trg-tree-view.c
diff --git a/src/trg-files-tree-view.c b/src/trg-files-tree-view.c
index 0c61f10..78e7735 100644
--- a/src/trg-files-tree-view.c
+++ b/src/trg-files-tree-view.c
@@ -287,18 +287,18 @@ static void trg_files_tree_view_init(TrgFilesTreeView * self)
desc =
trg_tree_view_reg_column(ttv, TRG_COLTYPE_ICONTEXT, FILESCOL_NAME,
- _("Name"), "name", 1);
+ _("Name"), "name", 0);
desc->model_column_icon = FILESCOL_ICON;
desc->defaultWidth = 300;
trg_tree_view_reg_column(ttv, TRG_COLTYPE_SIZE, FILESCOL_SIZE,
- _("Size"), "size", 1);
+ _("Size"), "size", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_PROG, FILESCOL_PROGRESS,
- _("Progress"), "progress", 1);
+ _("Progress"), "progress", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_WANT, FILESCOL_WANTED,
- _("Wanted"), "wanted", 1);
+ _("Wanted"), "wanted", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_PRIO, FILESCOL_PRIORITY,
- _("Priority"), "priority", 1);
+ _("Priority"), "priority", 0);
gtk_tree_view_set_search_column(GTK_TREE_VIEW(self), FILESCOL_NAME);
diff --git a/src/trg-main-window.c b/src/trg-main-window.c
index 3bacab5..a1caff9 100644
--- a/src/trg-main-window.c
+++ b/src/trg-main-window.c
@@ -433,7 +433,7 @@ gboolean trg_add_from_filename(TrgMainWindow * win, gchar ** uris)
int i;
for (i = 0; uris[i]; i++)
- filesList = g_slist_append(filesList, g_strdup(uris[i]));
+ filesList = g_slist_append(filesList, uris[i]);
if (pref_get_add_options_dialog(client->gconf)) {
gdk_threads_enter();
@@ -454,7 +454,7 @@ gboolean trg_add_from_filename(TrgMainWindow * win, gchar ** uris)
launch_add_thread(args);
}
- g_strfreev(uris);
+ g_free(uris);
return TRUE;
}
diff --git a/src/trg-peers-tree-view.c b/src/trg-peers-tree-view.c
index f2da8dd..1935853 100644
--- a/src/trg-peers-tree-view.c
+++ b/src/trg-peers-tree-view.c
@@ -47,26 +47,26 @@ static void trg_peers_tree_view_init(TrgPeersTreeView * self)
desc =
trg_tree_view_reg_column(ttv, TRG_COLTYPE_ICONTEXT, PEERSCOL_ICON,
- _("IP"), "ip", 1);
+ _("IP"), "ip", 0);
desc->model_column_icon = PEERSCOL_ICON;
trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT, PEERSCOL_HOST,
- _("Host"), "host", 1);
+ _("Host"), "host", 0);
#ifdef HAVE_GEOIP
trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT, PEERSCOL_COUNTRY,
- _("Country"), "country", 1);
+ _("Country"), "country", 0);
#endif
trg_tree_view_reg_column(ttv, TRG_COLTYPE_SPEED, PEERSCOL_DOWNSPEED,
- _("Down Speed"), "down-speed", 1);
+ _("Down Speed"), "down-speed", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_SPEED, PEERSCOL_UPSPEED,
- _("Up Speed"), "up-speed", 1);
+ _("Up Speed"), "up-speed", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_PROG, PEERSCOL_PROGRESS,
- _("Progress"), "progress", 1);
+ _("Progress"), "progress", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT, PEERSCOL_FLAGS,
- _("Flags"), "flags", 1);
+ _("Flags"), "flags", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT, PEERSCOL_CLIENT,
- _("Client"), "client", 1);
+ _("Client"), "client", 0);
gtk_tree_view_set_search_column(GTK_TREE_VIEW(self), PEERSCOL_HOST);
trg_tree_view_setup_columns(ttv);
diff --git a/src/trg-torrent-model.c b/src/trg-torrent-model.c
index 7045ed9..a442145 100644
--- a/src/trg-torrent-model.c
+++ b/src/trg-torrent-model.c
@@ -175,6 +175,7 @@ static void trg_torrent_model_init(TrgTorrentModel * self)
column_types[TORRENT_COLUMN_JSON] = G_TYPE_POINTER;
column_types[TORRENT_COLUMN_UPDATESERIAL] = G_TYPE_INT64;
column_types[TORRENT_COLUMN_FLAGS] = G_TYPE_INT;
+ column_types[TORRENT_COLUMN_DOWNLOADDIR] = G_TYPE_STRING;
gtk_list_store_set_column_types(GTK_LIST_STORE(self),
TORRENT_COLUMN_COLUMNS, column_types);
@@ -320,6 +321,7 @@ update_torrent_iter(TrgTorrentModel * model, gint64 serial,
gtk_list_store_set(GTK_LIST_STORE(model), iter,
TORRENT_COLUMN_ADDED, torrent_get_added_date(t),
-1);
+ gtk_list_store_set(GTK_LIST_STORE(model), iter, TORRENT_COLUMN_DOWNLOADDIR, torrent_get_download_dir(t));
#else
gtk_list_store_set(GTK_LIST_STORE(model), iter,
TORRENT_COLUMN_ICON, statusIcon,
@@ -340,6 +342,7 @@ update_torrent_iter(TrgTorrentModel * model, gint64 serial,
0
&& downloaded >
0 ? (double) uploaded / (double) downloaded : 0,
+ TORRENT_COLUMN_DOWNLOADDIR, torrent_get_download_dir(t),
TORRENT_COLUMN_ID, id, TORRENT_COLUMN_JSON, t,
TORRENT_COLUMN_UPDATESERIAL, serial, -1);
#endif
diff --git a/src/trg-torrent-model.h b/src/trg-torrent-model.h
index 1924b78..df969e1 100644
--- a/src/trg-torrent-model.h
+++ b/src/trg-torrent-model.h
@@ -96,6 +96,7 @@ enum {
TORRENT_COLUMN_JSON,
TORRENT_COLUMN_UPDATESERIAL,
TORRENT_COLUMN_FLAGS,
+ TORRENT_COLUMN_DOWNLOADDIR,
TORRENT_COLUMN_COLUMNS
};
diff --git a/src/trg-torrent-tree-view.c b/src/trg-torrent-tree-view.c
index 76f4c83..f2d6f7b 100644
--- a/src/trg-torrent-tree-view.c
+++ b/src/trg-torrent-tree-view.c
@@ -41,39 +41,43 @@ static void trg_torrent_tree_view_init(TrgTorrentTreeView * tttv)
desc =
trg_tree_view_reg_column(ttv, TRG_COLTYPE_ICONTEXT,
TORRENT_COLUMN_NAME, _("Name"), "name",
- 1);
+ 0);
desc->model_column_icon = TORRENT_COLUMN_ICON;
desc->defaultWidth = 250;
trg_tree_view_reg_column(ttv, TRG_COLTYPE_SIZE, TORRENT_COLUMN_SIZE,
- _("Size"), "size", 1);
+ _("Size"), "size", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_PROG, TORRENT_COLUMN_DONE,
- _("Done"), "done", 1);
+ _("Done"), "done", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT, TORRENT_COLUMN_STATUS,
- _("Status"), "status", 1);
+ _("Status"), "status", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT, TORRENT_COLUMN_SEEDS,
- _("Seeds"), "seeds", 1);
+ _("Seeds"), "seeds", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT,
TORRENT_COLUMN_LEECHERS, _("Leechers"),
- "leechers", 1);
+ "leechers", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_SPEED,
TORRENT_COLUMN_DOWNSPEED, _("Down Speed"),
- "down-speed", 1);
+ "down-speed", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_SPEED,
TORRENT_COLUMN_UPSPEED, _("Up Speed"),
- "up-speed", 1);
+ "up-speed", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_ETA, TORRENT_COLUMN_ETA,
- _("ETA"), "eta", 1);
+ _("ETA"), "eta", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_SIZE,
TORRENT_COLUMN_UPLOADED, _("Uploaded"),
- "uploaded", 1);
+ "uploaded", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_SIZE,
TORRENT_COLUMN_DOWNLOADED, _("Downloaded"),
- "downloaded", 1);
+ "downloaded", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_RATIO, TORRENT_COLUMN_RATIO,
- _("Ratio"), "ratio", 1);
+ _("Ratio"), "ratio", 0);
trg_tree_view_reg_column(ttv, TRG_COLTYPE_EPOCH, TORRENT_COLUMN_ADDED,
- _("Added"), "added", 1);
+ _("Added"), "added", 0);
+ trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT, TORRENT_COLUMN_DOWNLOADDIR,
+ _("Location"), "download-dir", TRG_COLUMN_EXTRA);
+ trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT, TORRENT_COLUMN_ID,
+ _("ID"), "id", TRG_COLUMN_EXTRA);
gtk_tree_view_set_search_column(GTK_TREE_VIEW(tttv),
TORRENT_COLUMN_NAME);
diff --git a/src/trg-trackers-tree-view.c b/src/trg-trackers-tree-view.c
index 8b07818..ccf10b9 100644
--- a/src/trg-trackers-tree-view.c
+++ b/src/trg-trackers-tree-view.c
@@ -152,13 +152,13 @@ static void trg_trackers_tree_view_init(TrgTrackersTreeView * self)
desc =
trg_tree_view_reg_column(ttv, TRG_COLTYPE_ICONTEXT,
- TRACKERCOL_TIER, _("Tier"), "tier", -1);
+ TRACKERCOL_TIER, _("Tier"), "tier", 0);
desc->model_column_icon = TRACKERCOL_ICON;
desc =
trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT,
TRACKERCOL_ANNOUNCE, _("Announce URL"),
- "announce-url", -1);
+ "announce-url", TRG_COLUMN_ALWAYS);
priv->announceRenderer = desc->customRenderer =
gtk_cell_renderer_text_new();
g_signal_connect(priv->announceRenderer, "edited",
@@ -172,7 +172,7 @@ static void trg_trackers_tree_view_init(TrgTrackersTreeView * self)
desc->out = &priv->announceColumn;
trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT, TRACKERCOL_SCRAPE,
- _("Scrape URL"), "scrape-url", 1);
+ _("Scrape URL"), "scrape-url", 0);
trg_tree_view_setup_columns(ttv);
}
diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c
index 42e7343..c1b8bcc 100644
--- a/src/trg-tree-view.c
+++ b/src/trg-tree-view.c
@@ -20,6 +20,7 @@
#include <stdlib.h>
#include <gtk/gtk.h>
#include <gconf/gconf-client.h>
+#include <glib/gi18n.h>
#include "trg-tree-view.h"
#include "trg-cell-renderer-speed.h"
@@ -39,11 +40,15 @@ struct _TrgTreeViewPrivate {
GList *columns;
};
+static void trg_tree_view_add_column_after(TrgTreeView * tv,
+ trg_column_description * desc,
+ gchar ** widths, gint i, GtkTreeViewColumn *after_col);
+
trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv,
gint type,
gint model_column,
gchar * header,
- gchar * id, gint show)
+ gchar * id, gint flags)
{
TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv);
trg_column_description *desc = g_new0(trg_column_description, 1);
@@ -52,7 +57,7 @@ trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv,
desc->model_column = model_column;
desc->header = g_strdup(header);
desc->id = g_strdup(id);
- desc->show = show;
+ desc->flags = flags;
priv->columns = g_list_append(priv->columns, desc);
@@ -95,10 +100,80 @@ static gchar **trg_gconf_get_csv(TrgTreeView * tv, gchar * key)
return ret;
}
+static void trg_tree_view_hide_column(GtkWidget *w, GtkTreeViewColumn *col)
+{
+ trg_column_description *desc = g_object_get_data(G_OBJECT(col), "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);
+}
+
static void trg_tree_view_add_column(TrgTreeView * tv,
trg_column_description * desc,
gchar ** widths, gint i)
{
+ trg_tree_view_add_column_after(tv, desc, widths, i, NULL);
+}
+
+static void trg_tree_view_user_add_column_cb(GtkWidget *w, trg_column_description *desc)
+{
+ GtkTreeViewColumn *col = g_object_get_data(G_OBJECT(w), "parent-col");
+ TrgTreeView *tv = TRG_TREE_VIEW(gtk_tree_view_column_get_tree_view(col));
+
+ trg_tree_view_add_column_after(tv, desc, NULL, -1, col);
+}
+
+static void
+view_popup_menu(GtkButton *button, GdkEventButton * event,
+ GtkTreeViewColumn *column)
+{
+ GtkWidget *tv = gtk_tree_view_column_get_tree_view(column);
+ TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv);
+ GtkWidget *menu, *menuitem;
+ trg_column_description *desc;
+ GList *li;
+
+ menu = gtk_menu_new();
+
+ desc = g_object_get_data(G_OBJECT(column), "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", G_CALLBACK(trg_tree_view_hide_column), column);
+ gtk_widget_set_sensitive(menuitem, !(desc->flags & TRG_COLUMN_ALWAYS));
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
+ for (li = priv->columns; li; li = g_list_next(li)) {
+ trg_column_description *desc = (trg_column_description *)li->data;
+ if (!(desc->flags & TRG_COLUMN_SHOWING)) {
+ menuitem = gtk_check_menu_item_new_with_label(desc->header);
+ g_object_set_data(G_OBJECT(menuitem), "parent-col", column);
+ g_signal_connect(menuitem, "activate", G_CALLBACK(trg_tree_view_user_add_column_cb), desc);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ }
+ }
+ gtk_widget_show_all(menu);
+
+ gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
+ (event != NULL) ? event->button : 0,
+ gdk_event_get_time((GdkEvent *) event));
+}
+
+static gboolean
+col_onButtonPressed(GtkButton* button, GdkEventButton * event,
+ GtkTreeViewColumn *col)
+{
+ if (event->type == GDK_BUTTON_PRESS && event->button == 3) {
+ view_popup_menu(button, event, col);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void trg_tree_view_add_column_after(TrgTreeView * tv,
+ trg_column_description * desc,
+ gchar ** widths, gint i, GtkTreeViewColumn *after_col)
+{
GtkCellRenderer *renderer;
GtkTreeViewColumn *column = NULL;
@@ -204,7 +279,7 @@ static void trg_tree_view_add_column(TrgTreeView * tv,
gtk_tree_view_column_set_reorderable(column, TRUE);
gtk_tree_view_column_set_sort_column_id(column, desc->model_column);
- if (i < 0 && desc->defaultWidth > 0) {
+ if (!widths && 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);
@@ -220,8 +295,16 @@ static void trg_tree_view_add_column(TrgTreeView * tv,
gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column);
+ if (after_col)
+ gtk_tree_view_move_column_after(GTK_TREE_VIEW(tv), column, after_col);
+
+ g_signal_connect(column->button, "button-press-event",
+ G_CALLBACK(col_onButtonPressed), column);
+
if (desc->out)
*(desc->out) = column;
+
+ desc->flags |= TRG_COLUMN_SHOWING;
}
void trg_tree_view_persist(TrgTreeView * tv)
@@ -283,11 +366,13 @@ void trg_tree_view_setup_columns(TrgTreeView * tv)
if (desc)
trg_tree_view_add_column(tv, desc, widths, i);
}
+ g_strfreev(columns);
+ g_strfreev(widths);
} else {
for (li = priv->columns; li; li = g_list_next(li)) {
desc = (trg_column_description *) li->data;
- if (desc && desc->show != 0)
- trg_tree_view_add_column(tv, desc, widths, -1);
+ if (desc && !(desc->flags & TRG_COLUMN_EXTRA))
+ trg_tree_view_add_column(tv, desc, NULL, -1);
}
}
}
diff --git a/src/trg-tree-view.h b/src/trg-tree-view.h
index 9723ec3..2e26303 100644
--- a/src/trg-tree-view.h
+++ b/src/trg-tree-view.h
@@ -66,18 +66,23 @@ typedef struct {
gint model_column_icon;
gchar *header;
gchar *id;
- gint show;
+ gint flags;
gint defaultWidth;
gint type;
GtkCellRenderer *customRenderer;
GtkTreeViewColumn **out;
} trg_column_description;
+#define TRG_COLUMN_DEFAULT 0x00
+#define TRG_COLUMN_SHOWING (1 << 0) /* 0x01 */
+#define TRG_COLUMN_ALWAYS (1 << 1) /* 0x02 */
+#define TRG_COLUMN_EXTRA (1 << 2) /* 0x04 */
+
trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv,
gint type,
gint model_column,
gchar * header,
- gchar * id, gint show);
+ gchar * id, gint flags);
void trg_tree_view_setup_columns(TrgTreeView * tv);
void trg_tree_view_persist(TrgTreeView * tv);