diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2011-04-23 13:35:04 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2011-04-23 13:35:04 +0000 |
commit | 448a320aeb1b523893bd450c2ac9e52230da9410 (patch) | |
tree | 2c91dd1ec8635ec5d5e9d4d9bae1aa68187f8bac | |
parent | fc4ffcaa3bc34da935ac6f46cab71be932de306c (diff) |
header right click menu to show/hide
-rw-r--r-- | po/POTFILES.in | 1 | ||||
-rw-r--r-- | src/trg-files-tree-view.c | 10 | ||||
-rw-r--r-- | src/trg-main-window.c | 4 | ||||
-rw-r--r-- | src/trg-peers-tree-view.c | 16 | ||||
-rw-r--r-- | src/trg-torrent-model.c | 3 | ||||
-rw-r--r-- | src/trg-torrent-model.h | 1 | ||||
-rw-r--r-- | src/trg-torrent-tree-view.c | 30 | ||||
-rw-r--r-- | src/trg-trackers-tree-view.c | 6 | ||||
-rw-r--r-- | src/trg-tree-view.c | 95 | ||||
-rw-r--r-- | src/trg-tree-view.h | 9 |
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); |