summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2012-08-26 20:18:11 +0100
committerGravatar Alan Fitton <ajf@eth0.org.uk>2012-08-26 20:18:11 +0100
commit28b1af7e5d73f8bacc3dca76166138bc3d4d24a5 (patch)
treed69b25e7b0389bf1e4f8de2bb459aa30f1bbf8d4 /src
parentfbfb76e99858588292aa6e929dcfe6acae3912b7 (diff)
add the peers/files/trackers tree view to torrent dialog in transmission style
Diffstat (limited to 'src')
-rw-r--r--src/torrent-cell-renderer.c3
-rw-r--r--src/trg-client.c13
-rw-r--r--src/trg-client.h2
-rw-r--r--src/trg-destination-combo.c3
-rw-r--r--src/trg-files-tree-view.c11
-rw-r--r--src/trg-files-tree-view.h3
-rw-r--r--src/trg-main-window.c41
-rw-r--r--src/trg-menu-bar.c6
-rw-r--r--src/trg-peers-tree-view.c9
-rw-r--r--src/trg-peers-tree-view.h3
-rw-r--r--src/trg-preferences-dialog.c3
-rw-r--r--src/trg-remote-prefs-dialog.c6
-rw-r--r--src/trg-torrent-add-dialog.c4
-rw-r--r--src/trg-torrent-model.c25
-rw-r--r--src/trg-torrent-model.h1
-rw-r--r--src/trg-torrent-props-dialog.c141
-rw-r--r--src/trg-torrent-props-dialog.h1
-rw-r--r--src/trg-torrent-tree-view.c6
-rw-r--r--src/trg-trackers-tree-view.c28
-rw-r--r--src/trg-trackers-tree-view.h3
-rw-r--r--src/trg-tree-view.c57
21 files changed, 272 insertions, 97 deletions
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;
}
@@ -328,6 +443,19 @@ trg_torrent_props_dialog_class_init(TrgTorrentPropsDialogClass * klass)
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
("parent-window", "Parent window",
@@ -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)