summaryrefslogtreecommitdiff
path: root/src/trg-torrent-props-dialog.c
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2012-08-27 12:28:20 +0100
committerGravatar Alan Fitton <ajf@eth0.org.uk>2012-08-27 12:28:20 +0100
commita24407ea83d00b4f9f0c4f491c58e9c751088968 (patch)
treea2c2a7600d9eec69a7b3f9d44107321b75df9ce4 /src/trg-torrent-props-dialog.c
parent8ba9cdd592fdc47771c9b3bd8491db9d4510b5e7 (diff)
a details tab similar to transmission
Diffstat (limited to 'src/trg-torrent-props-dialog.c')
-rw-r--r--src/trg-torrent-props-dialog.c690
1 files changed, 405 insertions, 285 deletions
diff --git a/src/trg-torrent-props-dialog.c b/src/trg-torrent-props-dialog.c
index b237949..669f322 100644
--- a/src/trg-torrent-props-dialog.c
+++ b/src/trg-torrent-props-dialog.c
@@ -52,20 +52,14 @@
* values and then send it with the IDs.
*/
-G_DEFINE_TYPE(TrgTorrentPropsDialog, trg_torrent_props_dialog,
- GTK_TYPE_DIALOG)
+G_DEFINE_TYPE(TrgTorrentPropsDialog, trg_torrent_props_dialog, GTK_TYPE_DIALOG)
enum {
- PROP_0,
- PROP_TREEVIEW,
- PROP_TORRENT_MODEL,
- PROP_PARENT_WINDOW,
- PROP_CLIENT
+ PROP_0, PROP_TREEVIEW, PROP_TORRENT_MODEL, PROP_PARENT_WINDOW, PROP_CLIENT
};
-#define TRG_TORRENT_PROPS_DIALOG_GET_PRIVATE(o) \
+#define GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), TRG_TYPE_TORRENT_PROPS_DIALOG, TrgTorrentPropsDialogPrivate))
-typedef struct _TrgTorrentPropsDialogPrivate
- TrgTorrentPropsDialogPrivate;
+typedef struct _TrgTorrentPropsDialogPrivate TrgTorrentPropsDialogPrivate;
struct _TrgTorrentPropsDialogPrivate {
TrgTorrentTreeView *tv;
@@ -84,16 +78,27 @@ struct _TrgTorrentPropsDialogPrivate {
TrgTrackersModel *trackersModel;
TrgFilesTreeView *filesTv;
TrgFilesModel *filesModel;
+ JsonObject *lastJson;
+
+ GtkWidget * size_lb;
+ GtkWidget * have_lb;
+ GtkWidget * dl_lb;
+ GtkWidget * ul_lb;
+ GtkWidget * state_lb;
+ GtkWidget * date_started_lb;
+ GtkWidget * eta_lb;
+ GtkWidget * last_activity_lb;
+ GtkWidget * error_lb;
+ GtkWidget * destination_lb;
+ GtkWidget * hash_lb;
+ GtkWidget * privacy_lb;
+ GtkWidget * origin_lb;
+ GtkTextBuffer * comment_buffer;
};
-static void
-trg_torrent_props_dialog_set_property(GObject * object,
- guint prop_id,
- const GValue * value,
- GParamSpec * pspec G_GNUC_UNUSED)
-{
- TrgTorrentPropsDialogPrivate *priv =
- TRG_TORRENT_PROPS_DIALOG_GET_PRIVATE(object);
+static void trg_torrent_props_dialog_set_property(GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec G_GNUC_UNUSED) {
+ TrgTorrentPropsDialogPrivate *priv = GET_PRIVATE(object);
switch (prop_id) {
case PROP_PARENT_WINDOW:
@@ -111,318 +116,462 @@ trg_torrent_props_dialog_set_property(GObject * object,
}
}
-static void
-trg_torrent_props_dialog_get_property(GObject * object,
- guint prop_id,
- GValue * value,
- GParamSpec * pspec G_GNUC_UNUSED)
-{
- TrgTorrentPropsDialogPrivate *priv =
- TRG_TORRENT_PROPS_DIALOG_GET_PRIVATE(object);
-
- switch (prop_id) {
- 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;
- case PROP_CLIENT:
- g_value_set_pointer(value, priv->client);
- break;
- }
+static void trg_torrent_props_dialog_get_property(GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec G_GNUC_UNUSED) {
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
}
-static void
-trg_torrent_props_response_cb(GtkDialog * dlg, gint res_id,
- gpointer data G_GNUC_UNUSED)
-{
- TrgTorrentPropsDialogPrivate *priv;
+static void trg_torrent_props_response_cb(GtkDialog * dialog, gint res_id,
+ gpointer data G_GNUC_UNUSED) {
+ TrgTorrentPropsDialogPrivate *priv = GET_PRIVATE(dialog);
JsonNode *request;
JsonObject *args;
- priv = TRG_TORRENT_PROPS_DIALOG_GET_PRIVATE(dlg);
-
if (priv->peersTv) {
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);
+ TRG_TREE_VIEW_PERSIST_SORT | TRG_TREE_VIEW_PERSIST_LAYOUT);
+ if (priv->filesTv)
+ trg_tree_view_persist(TRG_TREE_VIEW(priv->filesTv),
+ TRG_TREE_VIEW_PERSIST_SORT | TRG_TREE_VIEW_PERSIST_LAYOUT);
+
+ if (priv->trackersTv)
+ 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(dialog) );
+ json_array_unref(priv->targetIds);
+ return;
+ }
+
+ request = torrent_set(priv->targetIds);
+ args = node_get_arguments(request);
+
+ json_object_set_int_member(args, FIELD_SEED_RATIO_MODE,
+ gtk_combo_box_get_active(GTK_COMBO_BOX
+ (priv->seedRatioMode) ));
+ json_object_set_int_member(args, FIELD_BANDWIDTH_PRIORITY,
+ gtk_combo_box_get_active(GTK_COMBO_BOX
+ (priv->bandwidthPriorityCombo) ) - 1);
+
+ trg_json_widgets_save(priv->widgets, args);
+ trg_json_widget_desc_list_free(priv->widgets);
+
+ dispatch_async(priv->client, request, on_generic_interactive_action,
+ priv->parent);
+
+ gtk_widget_destroy(GTK_WIDGET(dialog) );
+ }
+}
+
+static void seed_ratio_mode_changed_cb(GtkWidget * w, gpointer data) {
+ gtk_widget_set_sensitive(GTK_WIDGET(data),
+ gtk_combo_box_get_active(GTK_COMBO_BOX(w) ) == 1 ? TRUE : FALSE);
+}
+
+static GtkWidget*
+info_page_new(TrgTorrentPropsDialog * dialog) {
+ TrgTorrentPropsDialogPrivate *priv = GET_PRIVATE(dialog);
+ guint row = 0;
+ GtkTextBuffer * b;
+ GtkWidget *l, *w, *fr, *sw;
+ GtkWidget *t = hig_workarea_create();
+
+ hig_workarea_add_section_title(t, &row, _( "Activity" ));
+
+ /* size */
+ l = priv->size_lb = gtk_label_new(NULL );
+ gtk_label_set_single_line_mode(GTK_LABEL( l ), TRUE);
+ hig_workarea_add_row(t, &row, _( "Torrent size:" ), l, NULL );
+
+ /* have */
+ l = priv->have_lb = gtk_label_new(NULL );
+ gtk_label_set_single_line_mode(GTK_LABEL( l ), TRUE);
+ hig_workarea_add_row(t, &row, _( "Have:" ), l, NULL );
+
+ /* downloaded */
+ l = priv->dl_lb = gtk_label_new(NULL );
+ gtk_label_set_single_line_mode(GTK_LABEL( l ), TRUE);
+ hig_workarea_add_row(t, &row, _( "Downloaded:" ), l, NULL );
+
+ /* uploaded */
+ l = priv->ul_lb = gtk_label_new(NULL );
+ gtk_label_set_single_line_mode(GTK_LABEL( l ), TRUE);
+ hig_workarea_add_row(t, &row, _( "Uploaded:" ), l, NULL );
+
+ /* state */
+ l = priv->state_lb = gtk_label_new(NULL );
+ gtk_label_set_single_line_mode(GTK_LABEL( l ), TRUE);
+ hig_workarea_add_row(t, &row, _( "State:" ), l, NULL );
+
+ /* running for */
+ l = priv->date_started_lb = gtk_label_new(NULL );
+ gtk_label_set_single_line_mode(GTK_LABEL( l ), TRUE);
+ hig_workarea_add_row(t, &row, _( "Running time:" ), l, NULL );
+
+ /* eta */
+ l = priv->eta_lb = gtk_label_new(NULL );
+ gtk_label_set_single_line_mode(GTK_LABEL( l ), TRUE);
+ hig_workarea_add_row(t, &row, _( "Remaining time:" ), l, NULL );
+
+ /* last activity */
+ l = priv->last_activity_lb = gtk_label_new(NULL );
+ gtk_label_set_single_line_mode(GTK_LABEL( l ), TRUE);
+ hig_workarea_add_row(t, &row, _( "Last activity:" ), l, NULL );
+
+ /* error */
+ l = g_object_new(GTK_TYPE_LABEL, "selectable", TRUE, "ellipsize",
+ PANGO_ELLIPSIZE_END, NULL );
+ hig_workarea_add_row(t, &row, _( "Error:" ), l, NULL );
+ priv->error_lb = l;
+
+ hig_workarea_add_section_divider(t, &row);
+ hig_workarea_add_section_title(t, &row, _( "Details" ));
+
+ /* destination */
+ l = g_object_new(GTK_TYPE_LABEL, "selectable", TRUE, "ellipsize",
+ PANGO_ELLIPSIZE_END, NULL );
+ hig_workarea_add_row(t, &row, _( "Location:" ), l, NULL );
+ priv->destination_lb = l;
+
+ /* hash */
+ l = g_object_new(GTK_TYPE_LABEL, "selectable", TRUE, "ellipsize",
+ PANGO_ELLIPSIZE_END, NULL );
+ hig_workarea_add_row(t, &row, _( "Hash:" ), l, NULL );
+ priv->hash_lb = l;
+
+ /* privacy */
+ l = gtk_label_new(NULL );
+ gtk_label_set_single_line_mode(GTK_LABEL( l ), TRUE);
+ hig_workarea_add_row(t, &row, _( "Privacy:" ), l, NULL );
+ priv->privacy_lb = l;
+
+ /* origins */
+ l = g_object_new(GTK_TYPE_LABEL, "selectable", TRUE, "ellipsize",
+ PANGO_ELLIPSIZE_END, NULL );
+ hig_workarea_add_row(t, &row, _( "Origin:" ), l, NULL );
+ priv->origin_lb = l;
+
+ /* comment */
+ b = priv->comment_buffer = gtk_text_buffer_new(NULL );
+ w = gtk_text_view_new_with_buffer(b);
+ gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW( w ), GTK_WRAP_WORD);
+ gtk_text_view_set_editable(GTK_TEXT_VIEW( w ), FALSE);
+ sw = gtk_scrolled_window_new(NULL, NULL );
+ gtk_widget_set_size_request(sw, 350, 36);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW( sw ),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER( sw ), w);
+ fr = gtk_frame_new(NULL );
+ gtk_frame_set_shadow_type(GTK_FRAME( fr ), GTK_SHADOW_IN);
+ gtk_container_add(GTK_CONTAINER( fr ), sw);
+ w = hig_workarea_add_tall_row(t, &row, _( "Comment:" ), fr, NULL );
+ gtk_misc_set_alignment(GTK_MISC( w ), 0.0f, 0.0f);
+
+ hig_workarea_add_section_divider(t, &row);
+ return t;
+}
+
+static void info_page_update(TrgTorrentPropsDialog *dialog, JsonObject *t,
+ TrgTorrentModel *torrentModel, GtkTreeIter *iter) {
+ TrgTorrentPropsDialogPrivate *priv = GET_PRIVATE(dialog);
+ GtkTreeModel *model = GTK_TREE_MODEL(torrentModel);
+ gint64 sizeWhenDone, haveValid, downloaded, uploaded, percentDone, eta, activityDate, error;
+ gchar *statusString;
+ guint flags;
+ //const gchar * creator;
+ const gchar * str;
+
+ char buf[512];
+
+ gtk_tree_model_get(model, iter,
+ TORRENT_COLUMN_SIZEWHENDONE, &sizeWhenDone,
+ TORRENT_COLUMN_UPLOADED, &uploaded,
+ TORRENT_COLUMN_DOWNLOADED, &downloaded,
+ TORRENT_COLUMN_HAVE_VALID, &haveValid,
+ TORRENT_COLUMN_PERCENTDONE, &percentDone,
+ TORRENT_COLUMN_ETA, &eta,
+ TORRENT_COLUMN_LASTACTIVE, &activityDate,
+ TORRENT_COLUMN_STATUS, &statusString,
+ TORRENT_COLUMN_FLAGS, &flags,
+ TORRENT_COLUMN_ERROR, &error,
+ -1);
+
+ if (torrent_get_is_private(t))
+ str = _( "Private to this tracker -- DHT and PEX disabled" );
+ else
+ str = _( "Public torrent" );
+
+ gtk_label_set_text(GTK_LABEL( priv->privacy_lb ), str);
+
+ {
+ const gchar* creator = torrent_get_creator(t);
+ gint64 dateCreated = torrent_get_date_created(t);
+ gchar *dateStr = epoch_to_string(dateCreated);
+
+ if (!creator)
+ g_snprintf(buf, sizeof(buf), _( "Created on %1$s" ), dateStr);
+ else
+ g_snprintf(buf, sizeof(buf), _( "Created by %1$s on %2$s" ),
+ creator, dateStr);
+
+ g_free(dateStr);
+ gtk_label_set_text(GTK_LABEL( priv->origin_lb ), buf);
}
- if (res_id != GTK_RESPONSE_OK) {
- gtk_widget_destroy(GTK_WIDGET(dlg));
- json_array_unref(priv->targetIds);
- return;
+ gtk_text_buffer_set_text( priv->comment_buffer, torrent_get_comment(t), -1 );
+ gtk_label_set_text( GTK_LABEL( priv->destination_lb ), torrent_get_download_dir(t) );
+
+ gtk_label_set_text( GTK_LABEL( priv->state_lb ), statusString );
+ g_free(statusString);
+
+ {
+ gchar *addedStr = epoch_to_string( torrent_get_added_date(t) );
+ gtk_label_set_text( GTK_LABEL( priv->date_started_lb ), addedStr );
+ g_free(addedStr);
}
- request = torrent_set(priv->targetIds);
- args = node_get_arguments(request);
+ /* eta */
- json_object_set_int_member(args, FIELD_SEED_RATIO_MODE,
- gtk_combo_box_get_active(GTK_COMBO_BOX
- (priv->seedRatioMode)));
- json_object_set_int_member(args, FIELD_BANDWIDTH_PRIORITY,
- gtk_combo_box_get_active(GTK_COMBO_BOX
- (priv->bandwidthPriorityCombo))
- - 1);
+ if (eta > 0) {
+ tr_strltime_long(buf, eta, sizeof( buf ));
+ gtk_label_set_text(GTK_LABEL(priv->eta_lb), buf);
+ } else {
+ gtk_label_set_text(GTK_LABEL(priv->eta_lb), _( "Unknown" ));
+ }
- trg_json_widgets_save(priv->widgets, args);
- trg_json_widget_desc_list_free(priv->widgets);
+ gtk_label_set_text( GTK_LABEL( priv->hash_lb ), torrent_get_hash(t) );
+ gtk_label_set_text( GTK_LABEL(priv->error_lb), error ? torrent_get_errorstr(t) : _("No errors"));
- dispatch_async(priv->client, request,
- on_generic_interactive_action, priv->parent);
+ if (flags & TORRENT_FLAG_ACTIVE) {
+ gtk_label_set_text(GTK_LABEL (priv->last_activity_lb),
+ _( "Active now" ));
+ } else {
+ gchar *activityStr = epoch_to_string(activityDate);
+ gtk_label_set_text(GTK_LABEL (priv->last_activity_lb), activityStr);
+ g_free(activityStr);
+ }
- gtk_widget_destroy(GTK_WIDGET(dlg));
-}
+ tr_strlsize(buf, sizeWhenDone, sizeof(buf));
+ gtk_label_set_text(GTK_LABEL( priv->size_lb ), buf);
-static void seed_ratio_mode_changed_cb(GtkWidget * w, gpointer data)
-{
- gtk_widget_set_sensitive(GTK_WIDGET(data),
- gtk_combo_box_get_active(GTK_COMBO_BOX(w))
- == 1 ? TRUE : FALSE);
+ tr_strlsize(buf, downloaded, sizeof(buf));
+ gtk_label_set_text(GTK_LABEL( priv->dl_lb ), buf);
+
+ tr_strlsize(buf, uploaded, sizeof(buf));
+ gtk_label_set_text(GTK_LABEL( priv->ul_lb ), buf);
+
+ tr_strlsize(buf, haveValid, sizeof(buf));
+ gtk_label_set_text(GTK_LABEL( priv->have_lb ), buf);
}
-static GtkWidget *trg_props_limitsPage(TrgTorrentPropsDialog * win,
- JsonObject * json)
-{
- TrgTorrentPropsDialogPrivate *priv =
- TRG_TORRENT_PROPS_DIALOG_GET_PRIVATE(win);
+static GtkWidget *trg_props_limits_page_new(TrgTorrentPropsDialog * win,
+ JsonObject * json) {
+ TrgTorrentPropsDialogPrivate *priv = GET_PRIVATE(win);
GtkWidget *w, *tb, *t;
- gint row = 0;
+ guint row = 0;
t = hig_workarea_create();
hig_workarea_add_section_title(t, &row, _("Bandwidth"));
w = trg_json_widget_check_new(&priv->widgets, json,
- FIELD_HONORS_SESSION_LIMITS,
- _("Honor global limits"), NULL);
+ FIELD_HONORS_SESSION_LIMITS, _("Honor global limits"), NULL );
hig_workarea_add_wide_control(t, &row, w);
- w = priv->bandwidthPriorityCombo =
- gtr_combo_box_new_enum(_("Low"), 0, _("Normal"), 1, _("High"), 2,
- NULL);
+ w = priv->bandwidthPriorityCombo = gtr_combo_box_new_enum(_("Low"), 0,
+ _("Normal"), 1, _("High"), 2, NULL );
gtk_combo_box_set_active(GTK_COMBO_BOX(w),
- torrent_get_bandwidth_priority(json) + 1);
+ torrent_get_bandwidth_priority(json) + 1);
- hig_workarea_add_row(t, &row, _("Torrent priority:"), w, NULL);
+ hig_workarea_add_row(t, &row, _("Torrent priority:"), w, NULL );
if (json_object_has_member(json, FIELD_QUEUE_POSITION)) {
- w = trg_json_widget_spin_new(&priv->widgets, json,
- FIELD_QUEUE_POSITION, NULL, 0,
- INT_MAX, 1);
+ w = trg_json_widget_spin_new(&priv->widgets, json, FIELD_QUEUE_POSITION,
+ NULL, 0, INT_MAX, 1);
hig_workarea_add_row(t, &row, _("Queue Position:"), w, w);
}
- tb = trg_json_widget_check_new(&priv->widgets, json,
- FIELD_DOWNLOAD_LIMITED,
- _("Limit download speed (KiB/s)"),
- NULL);
- w = trg_json_widget_spin_new(&priv->widgets, json,
- FIELD_DOWNLOAD_LIMIT, tb, 0, INT_MAX, 1);
- hig_workarea_add_row_w(t, &row, tb, w, NULL);
-
- tb = trg_json_widget_check_new(&priv->widgets, json,
- FIELD_UPLOAD_LIMITED,
- _("Limit upload speed (KiB/s)"), NULL);
- w = trg_json_widget_spin_new(&priv->widgets, json,
- FIELD_UPLOAD_LIMIT, tb, 0, INT_MAX, 1);
- hig_workarea_add_row_w(t, &row, tb, w, NULL);
+ tb = trg_json_widget_check_new(&priv->widgets, json, FIELD_DOWNLOAD_LIMITED,
+ _("Limit download speed (KiB/s)"), NULL );
+ w = trg_json_widget_spin_new(&priv->widgets, json, FIELD_DOWNLOAD_LIMIT, tb,
+ 0, INT_MAX, 1);
+ hig_workarea_add_row_w(t, &row, tb, w, NULL );
+
+ tb = trg_json_widget_check_new(&priv->widgets, json, FIELD_UPLOAD_LIMITED,
+ _("Limit upload speed (KiB/s)"), NULL );
+ w = trg_json_widget_spin_new(&priv->widgets, json, FIELD_UPLOAD_LIMIT, tb,
+ 0, INT_MAX, 1);
+ hig_workarea_add_row_w(t, &row, tb, w, NULL );
hig_workarea_add_section_title(t, &row, _("Seeding"));
- w = priv->seedRatioMode =
- gtr_combo_box_new_enum(_("Use global settings"), 0,
- _("Stop seeding at ratio"), 1,
- _("Seed regardless of ratio"), 2, NULL);
+ w = priv->seedRatioMode = gtr_combo_box_new_enum(_("Use global settings"),
+ 0, _("Stop seeding at ratio"), 1, _("Seed regardless of ratio"),
+ 2, NULL );
gtk_combo_box_set_active(GTK_COMBO_BOX(w),
- torrent_get_seed_ratio_mode(json));
- hig_workarea_add_row(t, &row, _("Seed ratio mode:"), w, NULL);
+ torrent_get_seed_ratio_mode(json));
+ hig_workarea_add_row(t, &row, _("Seed ratio mode:"), w, NULL );
- w = trg_json_widget_spin_new(&priv->widgets, json,
- FIELD_SEED_RATIO_LIMIT, NULL, 0,
- INT_MAX, 0.2);
+ w = trg_json_widget_spin_new(&priv->widgets, json, FIELD_SEED_RATIO_LIMIT,
+ NULL, 0, INT_MAX, 0.2);
seed_ratio_mode_changed_cb(priv->seedRatioMode, w);
g_signal_connect(G_OBJECT(priv->seedRatioMode), "changed",
- G_CALLBACK(seed_ratio_mode_changed_cb), w);
+ G_CALLBACK(seed_ratio_mode_changed_cb), w);
hig_workarea_add_row(t, &row, _("Seed ratio limit:"), w, w);
hig_workarea_add_section_title(t, &row, _("Peers"));
- w = trg_json_widget_spin_new(&priv->widgets, json,
- FIELD_PEER_LIMIT, NULL, 0, INT_MAX, 5);
+ w = trg_json_widget_spin_new(&priv->widgets, json, FIELD_PEER_LIMIT, NULL,
+ 0, INT_MAX, 5);
hig_workarea_add_row(t, &row, _("Peer limit:"), w, w);
return t;
}
-static void models_updated(TrgTorrentModel * model, gpointer data)
-{
- TrgTorrentPropsDialogPrivate *priv =
- TRG_TORRENT_PROPS_DIALOG_GET_PRIVATE(data);
+static void models_updated(TrgTorrentModel * model, gpointer data) {
+ TrgTorrentPropsDialogPrivate *priv = 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_UPDATE);
- trg_peers_model_update(priv->peersModel,
- TRG_TREE_VIEW(priv->peersTv), serial, t,
- TORRENT_GET_MODE_UPDATE);
+ GtkTreeIter iter;
+
+ if (get_torrent_data(ht, json_array_get_int_element(priv->targetIds, 0), &t,
+ &iter) && t != priv->lastJson) {
+ trg_files_model_update(priv->filesModel, GTK_TREE_VIEW(priv->filesTv),
+ serial, t, TORRENT_GET_MODE_UPDATE);
+ trg_peers_model_update(priv->peersModel, TRG_TREE_VIEW(priv->peersTv),
+ serial, t, TORRENT_GET_MODE_UPDATE);
trg_trackers_model_update(priv->trackersModel, serial, t,
TORRENT_GET_MODE_UPDATE);
+ info_page_update(TRG_TORRENT_PROPS_DIALOG(data), t, model, &iter);
+
+ priv->lastJson = t;
}
}
static GObject *trg_torrent_props_dialog_constructor(GType type,
- guint
- n_construct_properties,
- GObjectConstructParam
- * construct_params)
-{
- GObject *object;
- TrgTorrentPropsDialogPrivate *priv;
+ guint n_construct_properties, GObjectConstructParam * construct_params) {
+ GObject *object = G_OBJECT_CLASS
+ (trg_torrent_props_dialog_parent_class) ->constructor(type,
+ n_construct_properties, construct_params);
+
+ TrgTorrentPropsDialog *propsDialog = TRG_TORRENT_PROPS_DIALOG(object);
+ GtkWindow *window = GTK_WINDOW(object);
+ TrgTorrentPropsDialogPrivate *priv = GET_PRIVATE(object);
+
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(
+ GTK_TREE_VIEW(priv->tv) );
+ gint rowCount = gtk_tree_selection_count_selected_rows(selection);
+ TrgPrefs *prefs = trg_client_get_prefs(priv->client);
+ gboolean showDetails = trg_prefs_get_int(prefs, TRG_PREFS_KEY_STYLE,
+ TRG_PREFS_GLOBAL) != TRG_STYLE_CLASSIC && rowCount == 1;
+
JsonObject *json;
- GtkTreeSelection *selection;
- gint rowCount;
- gint64 style;
- TrgPrefs *prefs;
+ GtkTreeIter iter;
GtkWidget *notebook, *contentvbox;
- object = G_OBJECT_CLASS
- (trg_torrent_props_dialog_parent_class)->constructor(type,
- n_construct_properties,
- construct_params);
-
- 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),
- trg_mw_get_selected_torrent_id(priv->parent), &json,
- NULL);
+ trg_mw_get_selected_torrent_id(priv->parent), &json, &iter);
priv->targetIds = build_json_id_array(priv->tv);
if (rowCount > 1) {
- gchar *windowTitle =
- g_strdup_printf(_("Multiple (%d) torrent properties"),
- rowCount);
- gtk_window_set_title(GTK_WINDOW(object), windowTitle);
+ gchar *windowTitle = g_strdup_printf(
+ _("Multiple (%d) torrent properties"), rowCount);
+ gtk_window_set_title(window, windowTitle);
g_free(windowTitle);
} else if (rowCount == 1) {
- gtk_window_set_title(GTK_WINDOW(object), torrent_get_name(json));
+ gtk_window_set_title(window, torrent_get_name(json));
}
- gtk_window_set_transient_for(GTK_WINDOW(object),
- GTK_WINDOW(priv->parent));
- gtk_window_set_destroy_with_parent(GTK_WINDOW(object), TRUE);
+ gtk_window_set_transient_for(window, GTK_WINDOW(priv->parent) );
+ gtk_window_set_destroy_with_parent(window, TRUE);
gtk_dialog_add_button(GTK_DIALOG(object), GTK_STOCK_CLOSE,
- GTK_RESPONSE_CLOSE);
- gtk_dialog_add_button(GTK_DIALOG(object), GTK_STOCK_OK,
- GTK_RESPONSE_OK);
+ GTK_RESPONSE_CLOSE);
+ gtk_dialog_add_button(GTK_DIALOG(object), GTK_STOCK_OK, GTK_RESPONSE_OK);
gtk_container_set_border_width(GTK_CONTAINER(object), GUI_PAD);
gtk_dialog_set_default_response(GTK_DIALOG(object), GTK_RESPONSE_OK);
- g_signal_connect(G_OBJECT(object),
- "response",
- G_CALLBACK(trg_torrent_props_response_cb), NULL);
+ g_signal_connect(G_OBJECT(object), "response",
+ G_CALLBACK(trg_torrent_props_response_cb), NULL);
notebook = gtk_notebook_new();
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
- trg_props_limitsPage
- (TRG_TORRENT_PROPS_DIALOG(object), json),
- gtk_label_new(_("Limits")));
-
- if (style != TRG_STYLE_CLASSIC && rowCount == 1) {
+ if (showDetails) {
gint64 serial = trg_client_get_serial(priv->client);
+ /* Information */
+
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+ info_page_new(propsDialog), gtk_label_new(_("Information")));
+ info_page_update(propsDialog, json, priv->torrentModel, &iter);
+
+ /* Files */
+
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);
+ 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);
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+ my_scrolledwin_new(GTK_WIDGET
+ (priv->filesTv) ), gtk_label_new(_("Files")));
+
+ /* Peers */
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);
+ 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);
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+ my_scrolledwin_new(GTK_WIDGET
+ (priv->peersTv) ), gtk_label_new(_("Peers")));
+
+ /* Trackers */
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);
+ 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);
+ 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")));
+ 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);
+ g_signal_connect_object(priv->torrentModel, "update", G_CALLBACK
+ (models_updated), object, G_CONNECT_AFTER);
+
+ priv->lastJson = json;
}
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+ trg_props_limits_page_new(propsDialog, json),
+ gtk_label_new(_("Limits")));
+
gtk_container_set_border_width(GTK_CONTAINER(notebook), GUI_PAD);
- contentvbox = gtk_dialog_get_content_area(GTK_DIALOG(object));
+ 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);
+ gtk_window_set_default_size(window, 500, 500);
return object;
}
-static void
-trg_torrent_props_dialog_class_init(TrgTorrentPropsDialogClass * klass)
-{
+static void trg_torrent_props_dialog_class_init(
+ TrgTorrentPropsDialogClass * klass) {
GObjectClass *object_class = G_OBJECT_CLASS(klass);
object_class->constructor = trg_torrent_props_dialog_constructor;
@@ -431,71 +580,42 @@ trg_torrent_props_dialog_class_init(TrgTorrentPropsDialogClass * klass)
g_type_class_add_private(klass, sizeof(TrgTorrentPropsDialogPrivate));
- g_object_class_install_property(object_class,
- PROP_TREEVIEW,
- g_param_spec_object
- ("torrent-tree-view",
- "TrgTorrentTreeView",
- "TrgTorrentTreeView",
- TRG_TYPE_TORRENT_TREE_VIEW,
- 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_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",
- "Parent window", TRG_TYPE_MAIN_WINDOW,
- 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_CLIENT,
- g_param_spec_pointer
- ("trg-client", "TClient",
- "Client",
- 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_TREEVIEW,
+ g_param_spec_object("torrent-tree-view", "TrgTorrentTreeView",
+ "TrgTorrentTreeView", TRG_TYPE_TORRENT_TREE_VIEW,
+ 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_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",
+ "Parent window", TRG_TYPE_MAIN_WINDOW,
+ 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_CLIENT,
+ g_param_spec_pointer("trg-client", "TClient", "Client",
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
+ | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK
+ | G_PARAM_STATIC_BLURB));
}
-static void
-trg_torrent_props_dialog_init(TrgTorrentPropsDialog * self G_GNUC_UNUSED)
-{
-
+static void 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,
- "torrent-tree-view", treeview,
- "torrent-model", torrentModel,
- "parent-window", window,
- "trg-client", client, NULL);
+ TrgTorrentTreeView * treeview, TrgTorrentModel * torrentModel,
+ TrgClient * client) {
+ return g_object_new(TRG_TYPE_TORRENT_PROPS_DIALOG, "torrent-tree-view",
+ treeview, "torrent-model", torrentModel, "parent-window", window,
+ "trg-client", client, NULL );
}