From a007678f344943d6ea86392723004a3a72320d9e Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Wed, 4 Jan 2012 10:40:44 +0000 Subject: make the torrent add tree view and the files tree view fairly consistent, sharing code where possible. this allows changing priority and enabled using a directory. expand/collapse all buttons. the one taken from Transmission for torrent add dialog now has menus and the mime icons. may be bugs here, I know there's one with directories appearing as mixed and not updating upwards properly, but it's a start. --- src/trg-files-tree-view.c | 267 +++++++++++----------------------------------- 1 file changed, 64 insertions(+), 203 deletions(-) (limited to 'src/trg-files-tree-view.c') diff --git a/src/trg-files-tree-view.c b/src/trg-files-tree-view.c index eb145af..a1d791e 100644 --- a/src/trg-files-tree-view.c +++ b/src/trg-files-tree-view.c @@ -22,6 +22,8 @@ #include "trg-client.h" #include "trg-tree-view.h" +#include "trg-files-model-common.h" +#include "trg-files-tree-view-common.h" #include "trg-files-tree-view.h" #include "trg-files-model.h" #include "trg-main-window.h" @@ -40,68 +42,29 @@ struct _TrgFilesTreeViewPrivate { TrgMainWindow *win; }; -static void trg_files_tree_view_class_init(TrgFilesTreeViewClass * klass) -{ +static void trg_files_tree_view_class_init(TrgFilesTreeViewClass * klass) { g_type_class_add_private(klass, sizeof(TrgFilesTreeViewPrivate)); } -static void set_wanted_foreachfunc(GtkTreeModel * model, - GtkTreePath * path G_GNUC_UNUSED, - GtkTreeIter * iter, - gpointer data) -{ - gint id; - gtk_tree_model_get(model, iter, FILESCOL_ID, &id, -1); - - if (id >= 0) { - gtk_tree_store_set(GTK_TREE_STORE(model), iter, FILESCOL_WANTED, - (gchar*)data, -1); - } -} - -static void set_priority_foreachfunc(GtkTreeModel * model, - GtkTreePath * path G_GNUC_UNUSED, - GtkTreeIter * iter, gpointer data) -{ - gint id; - GValue value = { 0 }; - - gtk_tree_model_get(model, iter, FILESCOL_ID, &id, -1); - - if(id >= 0) { - g_value_init(&value, G_TYPE_INT64); - g_value_set_int64(&value, (gint64) GPOINTER_TO_INT(data)); - - gtk_tree_store_set_value(GTK_TREE_STORE(model), iter, - FILESCOL_PRIORITY, &value); - } -} - -static void send_updated_file_prefs_foreachfunc(GtkTreeModel * model, - GtkTreePath * - path G_GNUC_UNUSED, - GtkTreeIter * iter, - gpointer data) -{ +static gboolean send_updated_file_prefs_foreachfunc(GtkTreeModel * model, + GtkTreePath * path G_GNUC_UNUSED, GtkTreeIter * iter, gpointer data) { JsonObject *args = (JsonObject *) data; - gint64 priority; + gint priority; gint id; - gchar *wanted; + gint wanted; gtk_tree_model_get(model, iter, FILESCOL_ID, &id, -1); if (id < 0) - return; + return FALSE; - gtk_tree_model_get(model, iter, FILESCOL_WANTED, &wanted, - FILESCOL_PRIORITY, &priority, -1); + gtk_tree_model_get(model, iter, FILESCOL_WANTED, &wanted, FILESCOL_PRIORITY, + &priority, -1); - if (!g_strcmp0(wanted, GTK_STOCK_CANCEL)) - add_file_id_to_array(args, FIELD_FILES_UNWANTED, id); - else + if (wanted) add_file_id_to_array(args, FIELD_FILES_WANTED, id); - - g_free(wanted); + else + add_file_id_to_array(args, FIELD_FILES_UNWANTED, id); if (priority == TR_PRI_LOW) add_file_id_to_array(args, FIELD_FILES_PRIORITY_LOW, id); @@ -109,33 +72,32 @@ static void send_updated_file_prefs_foreachfunc(GtkTreeModel * model, add_file_id_to_array(args, FIELD_FILES_PRIORITY_HIGH, id); else add_file_id_to_array(args, FIELD_FILES_PRIORITY_NORMAL, id); + + return FALSE; } -static gboolean on_files_update(gpointer data) -{ +static gboolean on_files_update(gpointer data) { trg_response *response = (trg_response *) data; TrgFilesTreeViewPrivate *priv = - TRG_FILES_TREE_VIEW_GET_PRIVATE(response->cb_data); - GtkTreeModel *model = - gtk_tree_view_get_model(GTK_TREE_VIEW(response->cb_data)); + TRG_FILES_TREE_VIEW_GET_PRIVATE(response->cb_data); + GtkTreeModel *model = gtk_tree_view_get_model( + GTK_TREE_VIEW(response->cb_data)); trg_files_model_set_accept(TRG_FILES_MODEL(model), TRUE); response->cb_data = priv->win; + return on_generic_interactive_action(data); } -static void send_updated_file_prefs(TrgFilesTreeView * tv) -{ +static void send_updated_file_prefs(TrgFilesTreeView * tv) { TrgFilesTreeViewPrivate *priv = TRG_FILES_TREE_VIEW_GET_PRIVATE(tv); JsonNode *req; JsonObject *args; - GtkTreeSelection *selection; GtkTreeModel *model; gint64 targetId; JsonArray *targetIdArray; - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); model = gtk_tree_view_get_model(GTK_TREE_VIEW(tv)); targetId = trg_files_model_get_torrent_id(TRG_FILES_MODEL(model)); targetIdArray = json_array_new(); @@ -145,188 +107,87 @@ static void send_updated_file_prefs(TrgFilesTreeView * tv) args = node_get_arguments(req); request_set_tag(req, targetId); - gtk_tree_selection_selected_foreach(selection, - send_updated_file_prefs_foreachfunc, - args); + gtk_tree_model_foreach(model, send_updated_file_prefs_foreachfunc, args); trg_files_model_set_accept(TRG_FILES_MODEL(model), FALSE); dispatch_async(priv->client, req, on_files_update, tv); } -static void set_low(GtkWidget * w G_GNUC_UNUSED, gpointer data) -{ - TrgFilesTreeView *tv = TRG_FILES_TREE_VIEW(data); - GtkTreeSelection *selection = - gtk_tree_view_get_selection(GTK_TREE_VIEW(data)); - gtk_tree_selection_selected_foreach(selection, - set_priority_foreachfunc, - GINT_TO_POINTER(TR_PRI_LOW)); - send_updated_file_prefs(tv); -} - -static void set_normal(GtkWidget * w G_GNUC_UNUSED, gpointer data) -{ - TrgFilesTreeView *tv = TRG_FILES_TREE_VIEW(data); - GtkTreeSelection *selection = - gtk_tree_view_get_selection(GTK_TREE_VIEW(data)); - gtk_tree_selection_selected_foreach(selection, - set_priority_foreachfunc, - GINT_TO_POINTER(TR_PRI_NORMAL)); - send_updated_file_prefs(tv); +static void set_low(GtkWidget * w G_GNUC_UNUSED, gpointer data) { + trg_files_tree_model_set_priority(GTK_TREE_VIEW(data), FILESCOL_PRIORITY, + TR_PRI_LOW); + send_updated_file_prefs(TRG_FILES_TREE_VIEW(data)); } -static void set_high(GtkWidget * w G_GNUC_UNUSED, gpointer data) -{ - TrgFilesTreeView *tv = TRG_FILES_TREE_VIEW(data); - GtkTreeSelection *selection = - gtk_tree_view_get_selection(GTK_TREE_VIEW(data)); - gtk_tree_selection_selected_foreach(selection, - set_priority_foreachfunc, - GINT_TO_POINTER(TR_PRI_HIGH)); - send_updated_file_prefs(tv); +static void set_normal(GtkWidget * w G_GNUC_UNUSED, gpointer data) { + trg_files_tree_model_set_priority(GTK_TREE_VIEW(data), FILESCOL_PRIORITY, + TR_PRI_NORMAL); + send_updated_file_prefs(TRG_FILES_TREE_VIEW(data)); } -static void set_unwanted(GtkWidget * w G_GNUC_UNUSED, gpointer data) -{ - TrgFilesTreeView *tv = TRG_FILES_TREE_VIEW(data); - GtkTreeSelection *selection = - gtk_tree_view_get_selection(GTK_TREE_VIEW(data)); - gtk_tree_selection_selected_foreach(selection, - set_wanted_foreachfunc, GTK_STOCK_CANCEL); - send_updated_file_prefs(tv); +static void set_high(GtkWidget * w G_GNUC_UNUSED, gpointer data) { + trg_files_tree_model_set_priority(GTK_TREE_VIEW(data), FILESCOL_PRIORITY, + TR_PRI_HIGH); + send_updated_file_prefs(TRG_FILES_TREE_VIEW(data)); } -static void set_wanted(GtkWidget * w G_GNUC_UNUSED, gpointer data) -{ - TrgFilesTreeView *tv = TRG_FILES_TREE_VIEW(data); - GtkTreeSelection *selection = - gtk_tree_view_get_selection(GTK_TREE_VIEW(data)); - gtk_tree_selection_selected_foreach(selection, - set_wanted_foreachfunc, GTK_STOCK_APPLY); - send_updated_file_prefs(tv); +static void set_unwanted(GtkWidget * w G_GNUC_UNUSED, gpointer data) { + trg_files_model_set_wanted(GTK_TREE_VIEW(data), FILESCOL_WANTED, FALSE); + send_updated_file_prefs(TRG_FILES_TREE_VIEW(data)); } -static void -view_popup_menu(GtkWidget * treeview, GdkEventButton * event, - gpointer data G_GNUC_UNUSED) -{ - GtkWidget *menu, *menuitem; - - menu = gtk_menu_new(); - - menuitem = gtk_menu_item_new_with_label(_("High Priority")); - g_signal_connect(menuitem, "activate", G_CALLBACK(set_high), treeview); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Normal Priority")); - g_signal_connect(menuitem, "activate", G_CALLBACK(set_normal), - treeview); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Low Priority")); - g_signal_connect(menuitem, "activate", G_CALLBACK(set_low), treeview); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - - gtk_menu_shell_append(GTK_MENU_SHELL(menu), - gtk_separator_menu_item_new()); - - menuitem = gtk_image_menu_item_new_with_label(GTK_STOCK_APPLY); - gtk_image_menu_item_set_use_stock(GTK_IMAGE_MENU_ITEM(menuitem), TRUE); - gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM - (menuitem), TRUE); - gtk_menu_item_set_label(GTK_MENU_ITEM(menuitem), _("Download")); - g_signal_connect(menuitem, "activate", G_CALLBACK(set_wanted), - treeview); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - - menuitem = gtk_image_menu_item_new_with_label(GTK_STOCK_CANCEL); - gtk_image_menu_item_set_use_stock(GTK_IMAGE_MENU_ITEM(menuitem), TRUE); - gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM - (menuitem), TRUE); - gtk_menu_item_set_label(GTK_MENU_ITEM(menuitem), _("Skip")); - g_signal_connect(menuitem, "activate", G_CALLBACK(set_unwanted), - treeview); - 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 void set_wanted(GtkWidget * w G_GNUC_UNUSED, gpointer data) { + trg_files_model_set_wanted(GTK_TREE_VIEW(data), FILESCOL_WANTED, TRUE); + send_updated_file_prefs(TRG_FILES_TREE_VIEW(data)); } -static gboolean -view_onButtonPressed(GtkWidget * treeview, GdkEventButton * event, - gpointer userdata) -{ - GtkTreeSelection *selection; - GtkTreePath *path; - - if (event->type == GDK_BUTTON_PRESS && event->button == 3) { - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); - - if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), - (gint) event->x, - (gint) event->y, &path, - NULL, NULL, NULL)) { - if (!gtk_tree_selection_path_is_selected(selection, path)) { - gtk_tree_selection_unselect_all(selection); - gtk_tree_selection_select_path(selection, path); - } - gtk_tree_path_free(path); - - view_popup_menu(treeview, event, userdata); - return TRUE; - } - } +static gboolean view_onButtonPressed(GtkWidget * treeview, + GdkEventButton * event, gpointer userdata) { + gboolean handled = trg_files_tree_view_onViewButtonPressed(treeview, event, + FILESCOL_PRIORITY, FILESCOL_WANTED, G_CALLBACK(set_low), + G_CALLBACK(set_normal), G_CALLBACK(set_high), + G_CALLBACK(set_wanted), G_CALLBACK(set_unwanted), userdata); - return FALSE; -} + if (handled) + send_updated_file_prefs(TRG_FILES_TREE_VIEW(treeview)); -static gboolean view_onPopupMenu(GtkWidget * treeview, gpointer userdata) -{ - view_popup_menu(treeview, NULL, userdata); - return TRUE; + return handled; } -static void trg_files_tree_view_init(TrgFilesTreeView * self) -{ +static void trg_files_tree_view_init(TrgFilesTreeView * self) { TrgTreeView *ttv = TRG_TREE_VIEW(self); trg_column_description *desc; - desc = - trg_tree_view_reg_column(ttv, TRG_COLTYPE_FILEICONTEXT, FILESCOL_NAME, - _("Name"), "name", 0); + desc = trg_tree_view_reg_column(ttv, TRG_COLTYPE_FILEICONTEXT, + FILESCOL_NAME, _("Name"), "name", 0); desc->model_column_extra = FILESCOL_ID; - trg_tree_view_reg_column(ttv, TRG_COLTYPE_SIZE, FILESCOL_SIZE, - _("Size"), "size", 0); + trg_tree_view_reg_column(ttv, TRG_COLTYPE_SIZE, FILESCOL_SIZE, _("Size"), + "size", 0); trg_tree_view_reg_column(ttv, TRG_COLTYPE_PROG, FILESCOL_PROGRESS, - _("Progress"), "progress", 0); - trg_tree_view_reg_column(ttv, TRG_COLTYPE_ICON, FILESCOL_WANTED, - _("Wanted"), "wanted", 0); + _("Progress"), "progress", 0); + trg_tree_view_reg_column(ttv, TRG_COLTYPE_WANTED, FILESCOL_WANTED, + _("Download"), "wanted", 0); trg_tree_view_reg_column(ttv, TRG_COLTYPE_PRIO, FILESCOL_PRIORITY, - _("Priority"), "priority", 0); + _("Priority"), "priority", 0); gtk_tree_view_set_search_column(GTK_TREE_VIEW(self), FILESCOL_NAME); g_signal_connect(self, "button-press-event", - G_CALLBACK(view_onButtonPressed), NULL); - g_signal_connect(self, "popup-menu", G_CALLBACK(view_onPopupMenu), - NULL); + G_CALLBACK(view_onButtonPressed), NULL); + g_signal_connect(self, "popup-menu", + G_CALLBACK(trg_files_tree_view_viewOnPopupMenu), NULL); } TrgFilesTreeView *trg_files_tree_view_new(TrgFilesModel * model, - TrgMainWindow * win, - TrgClient * client) -{ + TrgMainWindow * win, TrgClient * client) { GObject *obj = g_object_new(TRG_TYPE_FILES_TREE_VIEW, NULL); TrgFilesTreeViewPrivate *priv = TRG_FILES_TREE_VIEW_GET_PRIVATE(obj); - trg_tree_view_set_prefs(TRG_TREE_VIEW(obj), - trg_client_get_prefs(client)); + trg_tree_view_set_prefs(TRG_TREE_VIEW(obj), trg_client_get_prefs(client)); gtk_tree_view_set_model(GTK_TREE_VIEW(obj), GTK_TREE_MODEL(model)); + priv->client = client; priv->win = win; -- cgit v1.2.3