summaryrefslogtreecommitdiff
path: root/src/trg-files-tree-view.c
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2012-01-04 10:40:44 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2012-01-04 10:40:44 +0000
commita007678f344943d6ea86392723004a3a72320d9e (patch)
tree5d92b359914fc32906cd81c49dd86eacb0bd818d /src/trg-files-tree-view.c
parent950b833d5c7c63fddd32da986a83a9eb7215c9f4 (diff)
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.
Diffstat (limited to 'src/trg-files-tree-view.c')
-rw-r--r--src/trg-files-tree-view.c267
1 files changed, 64 insertions, 203 deletions
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;