From 28b1af7e5d73f8bacc3dca76166138bc3d4d24a5 Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Sun, 26 Aug 2012 20:18:11 +0100 Subject: add the peers/files/trackers tree view to torrent dialog in transmission style --- src/torrent-cell-renderer.c | 3 +- src/trg-client.c | 13 ---- src/trg-client.h | 2 - src/trg-destination-combo.c | 3 - src/trg-files-tree-view.c | 11 ++-- src/trg-files-tree-view.h | 3 +- src/trg-main-window.c | 41 ++++++------ src/trg-menu-bar.c | 6 +- src/trg-peers-tree-view.c | 9 ++- src/trg-peers-tree-view.h | 3 +- src/trg-preferences-dialog.c | 3 +- src/trg-remote-prefs-dialog.c | 6 +- src/trg-torrent-add-dialog.c | 4 +- src/trg-torrent-model.c | 25 ++++++-- src/trg-torrent-model.h | 1 + src/trg-torrent-props-dialog.c | 141 +++++++++++++++++++++++++++++++++++++++-- src/trg-torrent-props-dialog.h | 1 + src/trg-torrent-tree-view.c | 6 +- src/trg-trackers-tree-view.c | 28 ++++---- src/trg-trackers-tree-view.h | 3 +- src/trg-tree-view.c | 57 +++++++++++++---- 21 files changed, 272 insertions(+), 97 deletions(-) (limited to 'src') diff --git a/src/torrent-cell-renderer.c b/src/torrent-cell-renderer.c index 348b77a..ab4eeeb 100644 --- a/src/torrent-cell-renderer.c +++ b/src/torrent-cell-renderer.c @@ -340,8 +340,7 @@ static void getStatusString(GString * gstr, TorrentCellRenderer * r) priv->connected + priv->webSeedsToUs), priv->connected + priv->webSeedsToUs, tr_strlpercent(buf, - priv-> - metadataPercentComplete, + priv->metadataPercentComplete, sizeof(buf))); } } else if (priv->flags & TORRENT_FLAG_SEEDING) { diff --git a/src/trg-client.c b/src/trg-client.c index 9f01f1f..b2540fc 100644 --- a/src/trg-client.c +++ b/src/trg-client.c @@ -78,7 +78,6 @@ struct _TrgClientPrivate { char *proxy; GHashTable *torrentTable; GThreadPool *pool; - GMutex *updateMutex; TrgPrefs *prefs; GPrivate *tlsKey; gint configSerial; @@ -156,7 +155,6 @@ TrgClient *trg_client_new(void) trg_prefs_load(prefs); - priv->updateMutex = g_mutex_new(); priv->configMutex = g_mutex_new(); priv->tlsKey = g_private_new(NULL); priv->seedRatioLimited = FALSE; @@ -400,12 +398,6 @@ gboolean trg_client_is_connected(TrgClient * tc) return priv->session != NULL; } -void trg_client_updatelock(TrgClient * tc) -{ - TrgClientPrivate *priv = tc->priv; - g_mutex_lock(priv->updateMutex); -} - void trg_client_configlock(TrgClient * tc) { g_mutex_lock(tc->priv->configMutex); @@ -427,11 +419,6 @@ void trg_client_reset_failcount(TrgClient * tc) tc->priv->failCount = 0; } -void trg_client_updateunlock(TrgClient * tc) -{ - g_mutex_unlock(tc->priv->updateMutex); -} - void trg_client_configunlock(TrgClient * tc) { g_mutex_unlock(tc->priv->configMutex); diff --git a/src/trg-client.h b/src/trg-client.h index dc234d6..d7eb043 100644 --- a/src/trg-client.h +++ b/src/trg-client.h @@ -151,8 +151,6 @@ GHashTable *trg_client_get_torrent_table(TrgClient * tc); JsonObject *trg_client_get_session(TrgClient * tc); void trg_client_status_change(TrgClient * tc, gboolean connected); gboolean trg_client_is_connected(TrgClient * tc); -void trg_client_updateunlock(TrgClient * tc); -void trg_client_updatelock(TrgClient * tc); void trg_client_configunlock(TrgClient * tc); void trg_client_configlock(TrgClient * tc); guint trg_client_inc_failcount(TrgClient * tc); diff --git a/src/trg-destination-combo.c b/src/trg-destination-combo.c index 64e0c23..000d371 100644 --- a/src/trg-destination-combo.c +++ b/src/trg-destination-combo.c @@ -352,7 +352,6 @@ static GObject *trg_destination_combo_constructor(GType type, } } - trg_client_updatelock(client); list = g_hash_table_get_values(trg_client_get_torrent_table(client)); for (li = list; li; li = g_list_next(li)) { rr = (GtkTreeRowReference *) li->data; @@ -378,8 +377,6 @@ static GObject *trg_destination_combo_constructor(GType type, } } - trg_client_updateunlock(client); - for (sli = dirs; sli; sli = g_slist_next(sli)) trg_destination_combo_insert(GTK_COMBO_BOX(object), NULL, diff --git a/src/trg-files-tree-view.c b/src/trg-files-tree-view.c index aa92f90..1ff3f05 100644 --- a/src/trg-files-tree-view.c +++ b/src/trg-files-tree-view.c @@ -205,13 +205,16 @@ static void trg_files_tree_view_init(TrgFilesTreeView * self) TrgFilesTreeView *trg_files_tree_view_new(TrgFilesModel * model, TrgMainWindow * win, - TrgClient * client) + TrgClient * client, + const gchar * configId) { - GObject *obj = g_object_new(TRG_TYPE_FILES_TREE_VIEW, NULL); + GObject *obj = g_object_new(TRG_TYPE_FILES_TREE_VIEW, + "config-id", configId, + "prefs", trg_client_get_prefs(client), + NULL); + TrgFilesTreeViewPrivate *priv = TRG_FILES_TREE_VIEW_GET_PRIVATE(obj); - 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; diff --git a/src/trg-files-tree-view.h b/src/trg-files-tree-view.h index 006fc66..2f2971c 100644 --- a/src/trg-files-tree-view.h +++ b/src/trg-files-tree-view.h @@ -55,7 +55,8 @@ GType trg_files_tree_view_get_type(void); TrgFilesTreeView *trg_files_tree_view_new(TrgFilesModel * model, TrgMainWindow * win, - TrgClient * client); + TrgClient * client, + const gchar *configId); void trg_files_tree_view_renderPriority(GtkTreeViewColumn * diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 6dbbb4d..036c81c 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -290,6 +290,7 @@ update_selected_torrent_notebook(TrgMainWindow * win, gint mode, gint64 id) { TrgMainWindowPrivate *priv = win->priv; TrgClient *client = priv->client; + gint64 serial = trg_client_get_serial(client); JsonObject *t; GtkTreeIter iter; @@ -299,14 +300,13 @@ update_selected_torrent_notebook(TrgMainWindow * win, gint mode, gint64 id) trg_toolbar_torrent_actions_sensitive(priv->toolBar, TRUE); trg_menu_bar_torrent_actions_sensitive(priv->menuBar, TRUE); trg_general_panel_update(priv->genDetails, t, &iter); - trg_trackers_model_update(priv->trackersModel, - trg_client_get_serial(client), t, mode); + trg_trackers_model_update(priv->trackersModel, serial, t, mode); trg_files_model_update(priv->filesModel, GTK_TREE_VIEW(priv->filesTreeView), - trg_client_get_serial(client), t, mode); + serial, t, mode); trg_peers_model_update(priv->peersModel, TRG_TREE_VIEW(priv->peersTreeView), - trg_client_get_serial(client), t, mode); + serial, t, mode); } else { trg_main_window_torrent_scrub(win); } @@ -434,6 +434,7 @@ static void open_props_cb(GtkWidget * w G_GNUC_UNUSED, TrgMainWindow * win) dialog = trg_torrent_props_dialog_new(GTK_WINDOW(win), priv->torrentTreeView, + priv->torrentModel, priv->client); gtk_widget_show_all(GTK_WIDGET(dialog)); @@ -454,7 +455,8 @@ static void add_url_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) TrgMainWindowPrivate *priv = win->priv; TrgTorrentAddUrlDialog *dlg = trg_torrent_add_url_dialog_new(win, - priv->client); + priv-> + client); gtk_widget_show_all(GTK_WIDGET(dlg)); } @@ -980,7 +982,8 @@ static GtkWidget *trg_main_window_notebook_new(TrgMainWindow * win) priv->trackersModel = trg_trackers_model_new(); priv->trackersTreeView = - trg_trackers_tree_view_new(priv->trackersModel, priv->client, win); + trg_trackers_tree_view_new(priv->trackersModel, priv->client, win, + NULL); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), my_scrolledwin_new(GTK_WIDGET (priv->trackersTreeView)), @@ -988,14 +991,15 @@ static GtkWidget *trg_main_window_notebook_new(TrgMainWindow * win) priv->filesModel = trg_files_model_new(); priv->filesTreeView = trg_files_tree_view_new(priv->filesModel, win, - priv->client); + priv->client, NULL); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), my_scrolledwin_new(GTK_WIDGET (priv->filesTreeView)), gtk_label_new(_("Files"))); priv->peersModel = trg_peers_model_new(); - priv->peersTreeView = trg_peers_tree_view_new(prefs, priv->peersModel); + priv->peersTreeView = + trg_peers_tree_view_new(prefs, priv->peersModel, NULL); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), my_scrolledwin_new(GTK_WIDGET (priv->peersTreeView)), @@ -1230,8 +1234,6 @@ static gboolean on_torrent_get(gpointer data, int mode) return FALSE; } - trg_client_updatelock(client); - interval = gtk_widget_get_visible(GTK_WIDGET(win)) ? trg_prefs_get_int(prefs, TRG_PREFS_KEY_UPDATE_INTERVAL, @@ -1265,7 +1267,6 @@ static gboolean on_torrent_get(gpointer data, int mode) win); } - trg_client_updateunlock(client); trg_response_free(response); return FALSE; @@ -1310,7 +1311,6 @@ static gboolean on_torrent_get(gpointer data, int mode) trg_update_torrents_timerfunc, win); - trg_client_updateunlock(client); trg_response_free(response); return FALSE; } @@ -1417,7 +1417,8 @@ trg_torrent_tree_view_visible_func(GtkTreeModel * model, matchesTracker = (!json || !torrent_has_tracker(json, trg_state_selector_get_url_host_regex - (priv->stateSelector), + (priv-> + stateSelector), text)); g_free(text); if (matchesTracker) @@ -2616,10 +2617,10 @@ static GObject *trg_main_window_constructor(GType type, construct_params) { TrgMainWindow *self = TRG_MAIN_WINDOW(G_OBJECT_CLASS - (trg_main_window_parent_class)->constructor - (type, - n_construct_properties, - construct_params)); + (trg_main_window_parent_class)-> + constructor(type, + n_construct_properties, + construct_params)); TrgMainWindowPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE(self, TRG_TYPE_MAIN_WINDOW, TrgMainWindowPrivate); @@ -2679,7 +2680,8 @@ static GObject *trg_main_window_constructor(GType type, self, NULL); priv->torrentTreeView = trg_main_window_torrent_tree_view_new(self, - priv->filteredTorrentModel); + priv-> + filteredTorrentModel); g_signal_connect(priv->torrentTreeView, "popup-menu", G_CALLBACK(torrent_tv_popup_menu_cb), self); g_signal_connect(priv->torrentTreeView, "button-press-event", @@ -2733,7 +2735,8 @@ static GObject *trg_main_window_constructor(GType type, FALSE, FALSE); gtk_paned_pack2(GTK_PANED(priv->hpaned), my_scrolledwin_new(GTK_WIDGET - (priv->torrentTreeView)), + (priv-> + torrentTreeView)), TRUE, TRUE); g_signal_connect(G_OBJECT(priv->stateSelector), diff --git a/src/trg-menu-bar.c b/src/trg-menu-bar.c index df2cad9..c701cbc 100644 --- a/src/trg-menu-bar.c +++ b/src/trg-menu-bar.c @@ -485,8 +485,7 @@ static GtkWidget *trg_menu_bar_view_menu_new(TrgMenuBar * mb) priv->mb_view_transmission_compact); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM - (priv-> - mb_view_transmission_compact)); + (priv->mb_view_transmission_compact)); priv->mb_view_classic = trg_menu_bar_view_radio_item_new(priv->prefs, group, TRG_PREFS_KEY_STYLE, @@ -496,8 +495,7 @@ static GtkWidget *trg_menu_bar_view_menu_new(TrgMenuBar * mb) gtk_menu_shell_append(GTK_MENU_SHELL(viewMenu), trg_tree_view_sort_menu(TRG_TREE_VIEW - (priv-> - torrent_tree_view), + (priv->torrent_tree_view), _("Sort"))); priv->mb_view_states = diff --git a/src/trg-peers-tree-view.c b/src/trg-peers-tree-view.c index 422bca5..4364842 100644 --- a/src/trg-peers-tree-view.c +++ b/src/trg-peers-tree-view.c @@ -72,10 +72,13 @@ static void trg_peers_tree_view_init(TrgPeersTreeView * self) } TrgPeersTreeView *trg_peers_tree_view_new(TrgPrefs * prefs, - TrgPeersModel * model) + TrgPeersModel * model, + const gchar * configId) { - GObject *obj = g_object_new(TRG_TYPE_PEERS_TREE_VIEW, NULL); - trg_tree_view_set_prefs(TRG_TREE_VIEW(obj), prefs); + GObject *obj = g_object_new(TRG_TYPE_PEERS_TREE_VIEW, + "config-id", configId, + "prefs", prefs, NULL); + gtk_tree_view_set_model(GTK_TREE_VIEW(obj), GTK_TREE_MODEL(model)); trg_tree_view_restore_sort(TRG_TREE_VIEW(obj), 0x00); trg_tree_view_setup_columns(TRG_TREE_VIEW(obj)); diff --git a/src/trg-peers-tree-view.h b/src/trg-peers-tree-view.h index 298ecf6..f1a7b9d 100644 --- a/src/trg-peers-tree-view.h +++ b/src/trg-peers-tree-view.h @@ -50,7 +50,8 @@ typedef struct { GType trg_peers_tree_view_get_type(void); TrgPeersTreeView *trg_peers_tree_view_new(TrgPrefs * prefs, - TrgPeersModel * model); + TrgPeersModel * model, + const gchar *configId); G_END_DECLS #endif /* TRG_PEERS_TREE_VIEW_H_ */ diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c index 372d310..30f0faa 100644 --- a/src/trg-preferences-dialog.c +++ b/src/trg-preferences-dialog.c @@ -384,7 +384,8 @@ trgp_double_special_dependent(GtkWidget * widget, gpointer data) (priv->fullUpdateCheck) && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON - (priv->fullUpdateCheck))); + (priv-> + fullUpdateCheck))); } static GtkWidget *trg_prefs_generalPage(TrgPreferencesDialog * dlg) diff --git a/src/trg-remote-prefs-dialog.c b/src/trg-remote-prefs-dialog.c index 9a23785..acf689b 100644 --- a/src/trg-remote-prefs-dialog.c +++ b/src/trg-remote-prefs-dialog.c @@ -162,10 +162,12 @@ trg_remote_prefs_double_special_dependent(GtkWidget * widget, gtk_widget_set_sensitive(GTK_WIDGET(data), gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON - (priv->alt_time_check)) + (priv-> + alt_time_check)) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON - (priv->alt_check))); + (priv-> + alt_check))); } static void diff --git a/src/trg-torrent-add-dialog.c b/src/trg-torrent-add-dialog.c index e70b688..bde24eb 100644 --- a/src/trg-torrent-add-dialog.c +++ b/src/trg-torrent-add-dialog.c @@ -680,8 +680,8 @@ trg_torrent_add_dialog_apply_all_changed_cb(GtkWidget * w, gpointer data) } static GtkWidget - *trg_torrent_add_dialog_apply_all_combo_new(TrgTorrentAddDialog * - dialog) + * trg_torrent_add_dialog_apply_all_combo_new(TrgTorrentAddDialog * + dialog) { GtkListStore *model = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, diff --git a/src/trg-torrent-model.c b/src/trg-torrent-model.c index 501e1a1..c582bd7 100644 --- a/src/trg-torrent-model.c +++ b/src/trg-torrent-model.c @@ -56,6 +56,7 @@ enum { TMODEL_TORRENT_COMPLETED, + TMODEL_UPDATE, TMODEL_TORRENT_ADDED, TMODEL_STATE_CHANGED, TMODEL_SIGNAL_COUNT @@ -109,6 +110,18 @@ static void trg_torrent_model_class_init(TrgTorrentModelClass * klass) G_TYPE_NONE, 1, G_TYPE_POINTER); + signals[TMODEL_UPDATE] = g_signal_new("update", + G_TYPE_FROM_CLASS + (object_class), + G_SIGNAL_RUN_LAST | + G_SIGNAL_ACTION, + G_STRUCT_OFFSET + (TrgTorrentModelClass, + update), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals[TMODEL_TORRENT_ADDED] = g_signal_new("torrent-added", G_TYPE_FROM_CLASS (object_class), @@ -679,7 +692,7 @@ trg_torrent_model_update_stats *trg_torrent_model_update(TrgTorrentModel * JsonObject *args, *t; GList *li; gint64 id; - gint64 *idCopy; + gint64 serial = trg_client_get_serial(tc); JsonArray *removedTorrents; GtkTreeIter iter; GtkTreePath *path; @@ -704,10 +717,11 @@ trg_torrent_model_update_stats *trg_torrent_model_update(TrgTorrentModel * g_hash_table_lookup(priv->ht, &id); if (!result) { + gint64 *idCopy; gtk_list_store_append(GTK_LIST_STORE(model), &iter); whatsChanged |= TORRENT_UPDATE_ADDREMOVE; - update_torrent_iter(model, tc, rpcv, trg_client_get_serial(tc), + update_torrent_iter(model, tc, rpcv, serial, &iter, t, &(priv->stats), &whatsChanged); path = gtk_tree_model_get_path(GTK_TREE_MODEL(model), &iter); @@ -727,7 +741,7 @@ trg_torrent_model_update_stats *trg_torrent_model_update(TrgTorrentModel * if (gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path)) { update_torrent_iter(model, tc, rpcv, - trg_client_get_serial(tc), &iter, + serial, &iter, t, &(priv->stats), &whatsChanged); } gtk_tree_path_free(path); @@ -739,8 +753,7 @@ trg_torrent_model_update_stats *trg_torrent_model_update(TrgTorrentModel * if (mode == TORRENT_GET_MODE_UPDATE) { GList *hitlist = - trg_torrent_model_find_removed(GTK_TREE_MODEL(model), - trg_client_get_serial(tc)); + trg_torrent_model_find_removed(GTK_TREE_MODEL(model), serial); if (hitlist) { for (li = hitlist; li; li = g_list_next(li)) { g_hash_table_remove(priv->ht, li->data); @@ -774,5 +787,7 @@ trg_torrent_model_update_stats *trg_torrent_model_update(TrgTorrentModel * whatsChanged); } + g_signal_emit(model, signals[TMODEL_UPDATE], 0); + return &(priv->stats); } diff --git a/src/trg-torrent-model.h b/src/trg-torrent-model.h index 05862e4..aed9717 100644 --- a/src/trg-torrent-model.h +++ b/src/trg-torrent-model.h @@ -45,6 +45,7 @@ typedef struct { GtkListStoreClass parent_class; void (*torrent_completed) (TrgTorrentModel * model, GtkTreeIter * iter, gpointer data); + void (*update) (TrgTorrentModel * model, gpointer data); void (*torrent_added) (TrgTorrentModel * model, GtkTreeIter * iter, gpointer data); diff --git a/src/trg-torrent-props-dialog.c b/src/trg-torrent-props-dialog.c index 8f2de3b..97f2534 100644 --- a/src/trg-torrent-props-dialog.c +++ b/src/trg-torrent-props-dialog.c @@ -28,6 +28,12 @@ #include "trg-json-widgets.h" #include "requests.h" #include "protocol-constants.h" +#include "trg-peers-model.h" +#include "trg-peers-tree-view.h" +#include "trg-files-model.h" +#include "trg-files-tree-view.h" +#include "trg-trackers-model.h" +#include "trg-trackers-tree-view.h" #include "trg-torrent-model.h" #include "trg-torrent-tree-view.h" #include "trg-torrent-props-dialog.h" @@ -51,6 +57,7 @@ G_DEFINE_TYPE(TrgTorrentPropsDialog, trg_torrent_props_dialog, enum { PROP_0, PROP_TREEVIEW, + PROP_TORRENT_MODEL, PROP_PARENT_WINDOW, PROP_CLIENT }; @@ -62,6 +69,7 @@ typedef struct _TrgTorrentPropsDialogPrivate struct _TrgTorrentPropsDialogPrivate { TrgTorrentTreeView *tv; + TrgTorrentModel *torrentModel; TrgClient *client; TrgMainWindow *parent; JsonArray *targetIds; @@ -69,6 +77,13 @@ struct _TrgTorrentPropsDialogPrivate { GList *widgets; GtkWidget *bandwidthPriorityCombo, *seedRatioMode; + + TrgPeersTreeView *peersTv; + TrgPeersModel *peersModel; + TrgTrackersTreeView *trackersTv; + TrgTrackersModel *trackersModel; + TrgFilesTreeView *filesTv; + TrgFilesModel *filesModel; }; static void @@ -87,6 +102,9 @@ trg_torrent_props_dialog_set_property(GObject * object, case PROP_TREEVIEW: priv->tv = g_value_get_object(value); break; + case PROP_TORRENT_MODEL: + priv->torrentModel = g_value_get_object(value); + break; case PROP_CLIENT: priv->client = g_value_get_pointer(value); break; @@ -106,6 +124,9 @@ trg_torrent_props_dialog_get_property(GObject * object, case PROP_TREEVIEW: g_value_set_object(value, priv->tv); break; + case PROP_TORRENT_MODEL: + g_value_set_object(value, priv->torrentModel); + break; case PROP_PARENT_WINDOW: g_value_set_object(value, priv->parent); break; @@ -125,6 +146,16 @@ trg_torrent_props_response_cb(GtkDialog * dlg, gint res_id, priv = TRG_TORRENT_PROPS_DIALOG_GET_PRIVATE(dlg); + trg_tree_view_persist(TRG_TREE_VIEW(priv->peersTv), + TRG_TREE_VIEW_PERSIST_SORT | + TRG_TREE_VIEW_PERSIST_LAYOUT); + trg_tree_view_persist(TRG_TREE_VIEW(priv->filesTv), + TRG_TREE_VIEW_PERSIST_SORT | + TRG_TREE_VIEW_PERSIST_LAYOUT); + trg_tree_view_persist(TRG_TREE_VIEW(priv->trackersTv), + TRG_TREE_VIEW_PERSIST_SORT | + TRG_TREE_VIEW_PERSIST_LAYOUT); + if (res_id != GTK_RESPONSE_OK) { gtk_widget_destroy(GTK_WIDGET(dlg)); json_array_unref(priv->targetIds); @@ -136,12 +167,10 @@ trg_torrent_props_response_cb(GtkDialog * dlg, gint res_id, json_object_set_int_member(args, FIELD_SEED_RATIO_MODE, gtk_combo_box_get_active(GTK_COMBO_BOX - (priv-> - seedRatioMode))); + (priv->seedRatioMode))); json_object_set_int_member(args, FIELD_BANDWIDTH_PRIORITY, gtk_combo_box_get_active(GTK_COMBO_BOX - (priv-> - bandwidthPriorityCombo)) + (priv->bandwidthPriorityCombo)) - 1); trg_json_widgets_save(priv->widgets, args); @@ -234,6 +263,27 @@ static GtkWidget *trg_props_limitsPage(TrgTorrentPropsDialog * win, return t; } +static void models_updated(TrgTorrentModel * model, gpointer data) +{ + TrgTorrentPropsDialogPrivate *priv = + TRG_TORRENT_PROPS_DIALOG_GET_PRIVATE(data); + GHashTable *ht = get_torrent_table(model); + gint64 serial = trg_client_get_serial(priv->client); + JsonObject *t; + + if (get_torrent_data + (ht, json_array_get_int_element(priv->targetIds, 0), &t, NULL)) { + trg_files_model_update(priv->filesModel, + GTK_TREE_VIEW(priv->filesTv), serial, t, + TORRENT_GET_MODE_FIRST); + trg_peers_model_update(priv->peersModel, + TRG_TREE_VIEW(priv->peersTv), serial, t, + TORRENT_GET_MODE_FIRST); + trg_trackers_model_update(priv->trackersModel, serial, t, + TORRENT_GET_MODE_FIRST); + } +} + static GObject *trg_torrent_props_dialog_constructor(GType type, guint n_construct_properties, @@ -245,6 +295,8 @@ static GObject *trg_torrent_props_dialog_constructor(GType type, JsonObject *json; GtkTreeSelection *selection; gint rowCount; + gint64 style; + TrgPrefs *prefs; GtkWidget *notebook, *contentvbox; object = G_OBJECT_CLASS @@ -254,6 +306,10 @@ static GObject *trg_torrent_props_dialog_constructor(GType type, priv = TRG_TORRENT_PROPS_DIALOG_GET_PRIVATE(object); + prefs = trg_client_get_prefs(priv->client); + style = + trg_prefs_get_int(prefs, TRG_PREFS_KEY_STYLE, TRG_PREFS_GLOBAL); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->tv)); rowCount = gtk_tree_selection_count_selected_rows(selection); get_torrent_data(trg_client_get_torrent_table(priv->client), @@ -295,11 +351,70 @@ static GObject *trg_torrent_props_dialog_constructor(GType type, (TRG_TORRENT_PROPS_DIALOG(object), json), gtk_label_new(_("Limits"))); + if (style != TRG_STYLE_CLASSIC && rowCount == 1) { + gint64 serial = trg_client_get_serial(priv->client); + + priv->filesModel = trg_files_model_new(); + priv->filesTv = + trg_files_tree_view_new(priv->filesModel, priv->parent, + priv->client, + "TrgFilesTreeView-dialog"); + trg_files_model_update(priv->filesModel, + GTK_TREE_VIEW(priv->filesTv), serial, json, + TORRENT_GET_MODE_FIRST); + gtk_widget_set_sensitive(GTK_WIDGET(priv->filesTv), TRUE); + + priv->peersModel = trg_peers_model_new(); + priv->peersTv = + trg_peers_tree_view_new(prefs, priv->peersModel, + "TrgPeersTreeView-dialog"); + trg_peers_model_update(priv->peersModel, + TRG_TREE_VIEW(priv->peersTv), serial, json, + TORRENT_GET_MODE_FIRST); + gtk_widget_set_sensitive(GTK_WIDGET(priv->peersTv), TRUE); + + priv->trackersModel = trg_trackers_model_new(); + priv->trackersTv = + trg_trackers_tree_view_new(priv->trackersModel, priv->client, + priv->parent, + "TrgTrackersTreeView-dialog"); + trg_trackers_tree_view_new_connection(priv->trackersTv, + priv->client); + trg_trackers_model_update(priv->trackersModel, serial, json, + TORRENT_GET_MODE_FIRST); + gtk_widget_set_sensitive(GTK_WIDGET(priv->trackersTv), TRUE); + + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), + my_scrolledwin_new(GTK_WIDGET + (priv->filesTv)), + gtk_label_new(_("Files"))); + + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), + my_scrolledwin_new(GTK_WIDGET + (priv->peersTv)), + gtk_label_new(_("Peers"))); + + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), + my_scrolledwin_new(GTK_WIDGET + (priv->trackersTv)), + gtk_label_new(_("Trackers"))); + + g_object_unref(priv->trackersModel); + g_object_unref(priv->filesModel); + g_object_unref(priv->peersModel); + + g_signal_connect_object(priv->torrentModel, "update", + G_CALLBACK + (models_updated), object, G_CONNECT_AFTER); + } + gtk_container_set_border_width(GTK_CONTAINER(notebook), GUI_PAD); contentvbox = gtk_dialog_get_content_area(GTK_DIALOG(object)); gtk_box_pack_start(GTK_BOX(contentvbox), notebook, TRUE, TRUE, 0); + gtk_window_set_default_size(GTK_WINDOW(object), 500, 500); + return object; } @@ -327,6 +442,19 @@ trg_torrent_props_dialog_class_init(TrgTorrentPropsDialogClass * klass) G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + g_object_class_install_property(object_class, + PROP_TORRENT_MODEL, + g_param_spec_object + ("torrent-model", + "TrgTorrentModel", + "TrgTorrentModel", + TRG_TYPE_TORRENT_MODEL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + g_object_class_install_property(object_class, PROP_PARENT_WINDOW, g_param_spec_object @@ -359,10 +487,13 @@ trg_torrent_props_dialog_init(TrgTorrentPropsDialog * self G_GNUC_UNUSED) TrgTorrentPropsDialog *trg_torrent_props_dialog_new(GtkWindow * window, TrgTorrentTreeView * treeview, + TrgTorrentModel * + torrentModel, TrgClient * client) { return g_object_new(TRG_TYPE_TORRENT_PROPS_DIALOG, - "parent-window", window, "torrent-tree-view", treeview, + "torrent-model", torrentModel, + "parent-window", window, "trg-client", client, NULL); } diff --git a/src/trg-torrent-props-dialog.h b/src/trg-torrent-props-dialog.h index a8adff2..bb15bdb 100644 --- a/src/trg-torrent-props-dialog.h +++ b/src/trg-torrent-props-dialog.h @@ -50,6 +50,7 @@ GType trg_torrent_props_dialog_get_type(void); TrgTorrentPropsDialog *trg_torrent_props_dialog_new(GtkWindow * window, TrgTorrentTreeView * treeview, + TrgTorrentModel *torrentModel, TrgClient * client); G_END_DECLS diff --git a/src/trg-torrent-tree-view.c b/src/trg-torrent-tree-view.c index 03861ab..4f1d165 100644 --- a/src/trg-torrent-tree-view.c +++ b/src/trg-torrent-tree-view.c @@ -201,9 +201,9 @@ trg_torrent_tree_view_renderer_pref_changed(TrgPrefs * p, 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; + 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 ) diff --git a/src/trg-trackers-tree-view.c b/src/trg-trackers-tree-view.c index 528680a..d1d3634 100644 --- a/src/trg-trackers-tree-view.c +++ b/src/trg-trackers-tree-view.c @@ -78,9 +78,9 @@ trg_trackers_tree_view_new_connection(TrgTrackersTreeView * tv, gboolean editable = is_tracker_edit_supported(tc); - g_object_set(priv->announceRenderer, "editable", editable, NULL); - g_object_set(priv->announceRenderer, "mode", - editable ? GTK_CELL_RENDERER_MODE_EDITABLE : + g_object_set(priv->announceRenderer, + "editable", editable, + "mode", editable ? GTK_CELL_RENDERER_MODE_EDITABLE : GTK_CELL_RENDERER_MODE_INERT, NULL); } @@ -366,25 +366,27 @@ static gboolean view_onPopupMenu(GtkWidget * treeview, gpointer userdata) TrgTrackersTreeView *trg_trackers_tree_view_new(TrgTrackersModel * model, TrgClient * client, - TrgMainWindow * win) + TrgMainWindow * win, + const gchar * configId) { - GObject *obj = g_object_new(TRG_TYPE_TRACKERS_TREE_VIEW, NULL); + GObject *obj = g_object_new(TRG_TYPE_TRACKERS_TREE_VIEW, + "config-id", configId, + "prefs", trg_client_get_prefs(client), + NULL); + TrgTrackersTreeViewPrivate *priv = TRG_TRACKERS_TREE_VIEW_GET_PRIVATE(obj); - trg_tree_view_set_prefs(TRG_TREE_VIEW(obj), - trg_client_get_prefs(client)); - - g_signal_connect(obj, "button-press-event", - G_CALLBACK(view_onButtonPressed), NULL); - g_signal_connect(obj, "popup-menu", G_CALLBACK(view_onPopupMenu), - NULL); - gtk_tree_view_set_model(GTK_TREE_VIEW(obj), GTK_TREE_MODEL(model)); priv->client = client; priv->win = win; trg_tree_view_setup_columns(TRG_TREE_VIEW(obj)); + g_signal_connect(obj, "button-press-event", + G_CALLBACK(view_onButtonPressed), NULL); + g_signal_connect(obj, "popup-menu", G_CALLBACK(view_onPopupMenu), + NULL); + return TRG_TRACKERS_TREE_VIEW(obj); } diff --git a/src/trg-trackers-tree-view.h b/src/trg-trackers-tree-view.h index b8fba0a..95170b7 100644 --- a/src/trg-trackers-tree-view.h +++ b/src/trg-trackers-tree-view.h @@ -52,7 +52,8 @@ GType trg_trackers_tree_view_get_type(void); TrgTrackersTreeView *trg_trackers_tree_view_new(TrgTrackersModel * model, TrgClient * client, - TrgMainWindow * win); + TrgMainWindow * win, + const gchar *configId); void trg_trackers_tree_view_new_connection(TrgTrackersTreeView * tv, TrgClient * tc); diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c index 54af376..1fc98a8 100644 --- a/src/trg-tree-view.c +++ b/src/trg-tree-view.c @@ -46,7 +46,7 @@ */ enum { - PROP_0, PROP_PREFS + PROP_0, PROP_PREFS, PROP_CONFIGID }; G_DEFINE_TYPE(TrgTreeView, trg_tree_view, GTK_TYPE_TREE_VIEW) @@ -57,6 +57,7 @@ typedef struct _TrgTreeViewPrivate TrgTreeViewPrivate; struct _TrgTreeViewPrivate { GList *columns; TrgPrefs *prefs; + gchar *configId; }; #define GDATA_KEY_COLUMN_DESC "column-desc" @@ -95,6 +96,10 @@ trg_tree_view_set_property(GObject * object, guint property_id, case PROP_PREFS: priv->prefs = g_value_get_object(value); break; + case PROP_CONFIGID: + g_free(priv->configId); + priv->configId = g_value_dup_string(value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; @@ -118,7 +123,9 @@ static JsonObject *trg_prefs_get_tree_view_props(TrgTreeView * tv) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); JsonObject *root = trg_prefs_get_root(priv->prefs); - const gchar *className = G_OBJECT_TYPE_NAME(tv); + const gchar *className = priv->configId + && strlen(priv->configId) > + 0 ? priv->configId : G_OBJECT_TYPE_NAME(tv); JsonObject *obj; JsonObject *tvProps = NULL; @@ -418,7 +425,8 @@ trg_tree_view_add_column_after(TrgTreeView * tv, gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "text", - desc->model_column, + desc-> + model_column, NULL); break; @@ -427,7 +435,8 @@ trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "speed-value", - desc->model_column, + desc-> + model_column, NULL); break; case TRG_COLTYPE_EPOCH: @@ -435,7 +444,8 @@ trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "epoch-value", - desc->model_column, + desc-> + model_column, NULL); break; case TRG_COLTYPE_ETA: @@ -443,7 +453,8 @@ trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "eta-value", - desc->model_column, + desc-> + model_column, NULL); break; case TRG_COLTYPE_SIZE: @@ -451,7 +462,8 @@ trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "size-value", - desc->model_column, + desc-> + model_column, NULL); break; case TRG_COLTYPE_PROG: @@ -459,7 +471,8 @@ trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "value", - desc->model_column, + desc-> + model_column, NULL); break; case TRG_COLTYPE_RATIO: @@ -467,7 +480,8 @@ trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "ratio-value", - desc->model_column, + desc-> + model_column, NULL); break; case TRG_COLTYPE_WANTED: @@ -492,7 +506,8 @@ trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "priority-value", - desc->model_column, + desc-> + model_column, NULL); break; case TRG_COLTYPE_NUMGTZERO: @@ -500,7 +515,8 @@ trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "value", - desc->model_column, + desc-> + model_column, NULL); break; case TRG_COLTYPE_NUMGTEQZERO: @@ -508,7 +524,8 @@ trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "value", - desc->model_column, + desc-> + model_column, NULL); break; default: @@ -685,7 +702,8 @@ void trg_tree_view_setup_columns(TrgTreeView * tv) json_node_get_string ((JsonNode *) - cli->data)); + cli-> + data)); if (desc) { gint64 width = json_node_get_int((JsonNode *) wli->data); trg_tree_view_add_column(tv, desc, width); @@ -739,6 +757,19 @@ static void trg_tree_view_class_init(TrgTreeViewClass * klass) G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + + g_object_class_install_property(object_class, + PROP_CONFIGID, + g_param_spec_string + ("config-id", + "config-id", + "config-id", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); } static void trg_tree_view_init(TrgTreeView * tv) -- cgit v1.2.3