From a24407ea83d00b4f9f0c4f491c58e9c751088968 Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Mon, 27 Aug 2012 12:28:20 +0100 Subject: a details tab similar to transmission --- src/hig.c | 28 +- src/hig.h | 26 +- src/protocol-constants.h | 4 +- src/requests.c | 3 +- src/torrent.c | 15 + src/torrent.h | 3 + src/trg-preferences-dialog.c | 10 +- src/trg-prefs.c | 12 +- src/trg-remote-prefs-dialog.c | 8 +- src/trg-torrent-add-url-dialog.c | 2 +- src/trg-torrent-move-dialog.c | 2 +- src/trg-torrent-props-dialog.c | 690 +++++++++++++++++++++++---------------- src/trg-tree-view.c | 2 +- transmission-remote-gtk.pot | 531 +++++++++++++++++------------- 14 files changed, 780 insertions(+), 556 deletions(-) diff --git a/src/hig.c b/src/hig.c index af58bf3..f5c7e5f 100644 --- a/src/hig.c +++ b/src/hig.c @@ -24,7 +24,7 @@ GtkWidget *hig_workarea_create(void) return t; } -void hig_workarea_add_section_divider(GtkWidget * t, int *row) +void hig_workarea_add_section_divider(GtkWidget * t, guint *row) { GtkWidget *w = gtk_alignment_new(0.0f, 0.0f, 0.0f, 0.0f); @@ -34,7 +34,7 @@ void hig_workarea_add_section_divider(GtkWidget * t, int *row) } void -hig_workarea_add_section_title_widget(GtkWidget * t, int *row, +hig_workarea_add_section_title_widget(GtkWidget * t, guint *row, GtkWidget * w) { gtk_table_attach(GTK_TABLE(t), w, 0, 2, *row, *row + 1, ~0, 0, 0, 0); @@ -43,7 +43,7 @@ hig_workarea_add_section_title_widget(GtkWidget * t, int *row, void hig_workarea_add_section_title(GtkWidget * t, - int *row, const char *section_title) + guint *row, const char *section_title) { char buf[512]; GtkWidget *l; @@ -75,7 +75,7 @@ static GtkWidget *rowNew(GtkWidget * w) return h; } -void hig_workarea_add_wide_control(GtkWidget * t, int *row, GtkWidget * w) +void hig_workarea_add_wide_control(GtkWidget * t, guint *row, GtkWidget * w) { GtkWidget *r = rowNew(w); @@ -85,7 +85,7 @@ void hig_workarea_add_wide_control(GtkWidget * t, int *row, GtkWidget * w) } void -hig_workarea_add_wide_tall_control(GtkWidget * t, int *row, GtkWidget * w) +hig_workarea_add_wide_tall_control(GtkWidget * t, guint *row, GtkWidget * w) { GtkWidget *r = rowNew(w); @@ -97,7 +97,7 @@ hig_workarea_add_wide_tall_control(GtkWidget * t, int *row, GtkWidget * w) } GtkWidget *hig_workarea_add_wide_checkbutton(GtkWidget * t, - int *row, + guint *row, const char *mnemonic_string, gboolean is_active) { @@ -108,7 +108,7 @@ GtkWidget *hig_workarea_add_wide_checkbutton(GtkWidget * t, return w; } -void hig_workarea_add_label_w(GtkWidget * t, int row, GtkWidget * l) +void hig_workarea_add_label_w(GtkWidget * t, guint row, GtkWidget * l) { GtkWidget *w = rowNew(l); @@ -116,7 +116,7 @@ void hig_workarea_add_label_w(GtkWidget * t, int row, GtkWidget * l) GTK_FILL, 0, 0); } -GtkWidget *hig_workarea_add_label(GtkWidget * t, int row, +GtkWidget *hig_workarea_add_label(GtkWidget * t, guint row, const char *mnemonic_string) { GtkWidget *l = gtk_label_new_with_mnemonic(mnemonic_string); @@ -126,7 +126,7 @@ GtkWidget *hig_workarea_add_label(GtkWidget * t, int row, } static void -hig_workarea_add_tall_control(GtkWidget * t, int row, GtkWidget * control) +hig_workarea_add_tall_control(GtkWidget * t, guint row, GtkWidget * control) { if (GTK_IS_MISC(control)) gtk_misc_set_alignment(GTK_MISC(control), 0.0f, 0.5f); @@ -137,7 +137,7 @@ hig_workarea_add_tall_control(GtkWidget * t, int row, GtkWidget * control) GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); } -void hig_workarea_add_control(GtkWidget * t, int row, GtkWidget * control) +void hig_workarea_add_control(GtkWidget * t, guint row, GtkWidget * control) { if (GTK_IS_MISC(control)) gtk_misc_set_alignment(GTK_MISC(control), 0.0f, 0.5f); @@ -149,7 +149,7 @@ void hig_workarea_add_control(GtkWidget * t, int row, GtkWidget * control) void hig_workarea_add_row_w(GtkWidget * t, - int *row, + guint *row, GtkWidget * label, GtkWidget * control, GtkWidget * mnemonic) { @@ -162,7 +162,7 @@ hig_workarea_add_row_w(GtkWidget * t, } GtkWidget *hig_workarea_add_row(GtkWidget * t, - int *row, + guint *row, const char *mnemonic_string, GtkWidget * control, GtkWidget * mnemonic) { @@ -173,7 +173,7 @@ GtkWidget *hig_workarea_add_row(GtkWidget * t, } GtkWidget *hig_workarea_add_tall_row(GtkWidget * table, - int *row, + guint *row, const char *mnemonic_string, GtkWidget * control, GtkWidget * mnemonic) @@ -195,7 +195,7 @@ GtkWidget *hig_workarea_add_tall_row(GtkWidget * table, return l; } -void hig_workarea_finish(GtkWidget * t, int *row) +void hig_workarea_finish(GtkWidget * t, guint *row) { gtk_table_resize(GTK_TABLE(t), *row, 2); } diff --git a/src/hig.h b/src/hig.h index 63a6b76..c2b006b 100644 --- a/src/hig.h +++ b/src/hig.h @@ -22,54 +22,54 @@ GtkWidget *hig_workarea_create(void); -void hig_workarea_add_section_divider(GtkWidget * table, int *row); +void hig_workarea_add_section_divider(GtkWidget * table, guint *row); void hig_workarea_add_section_title_widget(GtkWidget * t, - int *row, GtkWidget * w); + guint *row, GtkWidget * w); void hig_workarea_add_section_title(GtkWidget * table, - int *row, const char *section_title); + guint *row, const char *section_title); void hig_workarea_add_wide_tall_control(GtkWidget * table, - int *row, GtkWidget * w); + guint *row, GtkWidget * w); void hig_workarea_add_wide_control(GtkWidget * table, - int *row, GtkWidget * w); + guint *row, GtkWidget * w); GtkWidget *hig_workarea_add_wide_checkbutton(GtkWidget * table, - int *row, + guint *row, const char *mnemonic_string, gboolean is_active); GtkWidget *hig_workarea_add_label(GtkWidget * table, - int row, const char *mnemonic_string); + guint row, const char *mnemonic_string); void hig_workarea_add_label_w(GtkWidget * table, - int row, GtkWidget * label_widget); + guint row, GtkWidget * label_widget); void hig_workarea_add_control(GtkWidget * table, - int row, GtkWidget * control); + guint row, GtkWidget * control); GtkWidget *hig_workarea_add_tall_row(GtkWidget * table, - int *row, + guint *row, const char *mnemonic_string, GtkWidget * control, GtkWidget * mnemonic_or_null_for_control); GtkWidget *hig_workarea_add_row(GtkWidget * table, - int *row, + guint *row, const char *mnemonic_string, GtkWidget * control, GtkWidget * mnemonic_or_null_for_control); void hig_workarea_add_row_w(GtkWidget * table, - int *row, + guint *row, GtkWidget * label, GtkWidget * control, GtkWidget * mnemonic_or_null_for_control); -void hig_workarea_finish(GtkWidget * table, int *row); +void hig_workarea_finish(GtkWidget * table, guint *row); void hig_message_dialog_set_text(GtkMessageDialog * dialog, const char *primary, diff --git a/src/protocol-constants.h b/src/protocol-constants.h index 8d1605b..3f29e33 100644 --- a/src/protocol-constants.h +++ b/src/protocol-constants.h @@ -40,14 +40,16 @@ #define FIELD_TOTAL_SIZE "totalSize" #define FIELD_DONE_DATE "doneDate" #define FIELD_ADDED_DATE "addedDate" +#define FIELD_DATE_CREATED "dateCreated" #define FIELD_TRACKER_STATS "trackerStats" #define FIELD_DOWNLOAD_DIR "downloadDir" #define FIELD_HASH_STRING "hashString" -#define FIELD_SWARM_SPEED "swarmSpeed" +#define FIELD_SWARM_SPEED g "swarmSpeed" #define FIELD_NAME "name" #define FIELD_SIZEWHENDONE "sizeWhenDone" #define FIELD_STATUS "status" #define FIELD_MOVE "move" +#define FIELD_CREATOR "creator" #define FIELD_LOCATION "location" #define FIELD_RATEDOWNLOAD "rateDownload" #define FIELD_RATEUPLOAD "rateUpload" diff --git a/src/requests.c b/src/requests.c index 4e8d27e..edd39ba 100644 --- a/src/requests.c +++ b/src/requests.c @@ -191,9 +191,10 @@ JsonNode *torrent_get(gint64 id) json_array_add_string_element(fields, FIELD_LEFT_UNTIL_DONE); json_array_add_string_element(fields, FIELD_ANNOUNCE_URL); json_array_add_string_element(fields, FIELD_ERROR_STRING); - json_array_add_string_element(fields, FIELD_SWARM_SPEED); json_array_add_string_element(fields, FIELD_TRACKER_STATS); + json_array_add_string_element(fields, FIELD_DATE_CREATED); json_array_add_string_element(fields, FIELD_DOWNLOAD_DIR); + json_array_add_string_element(fields, FIELD_CREATOR); json_array_add_string_element(fields, FIELD_HASH_STRING); json_array_add_string_element(fields, FIELD_DONE_DATE); json_array_add_string_element(fields, FIELD_HONORS_SESSION_LIMITS); diff --git a/src/torrent.c b/src/torrent.c index 18bc5da..21da80e 100644 --- a/src/torrent.c +++ b/src/torrent.c @@ -333,6 +333,21 @@ gint64 torrent_get_error(JsonObject * t) return json_object_get_int_member(t, FIELD_ERROR); } +const gchar *torrent_get_creator(JsonObject *t) +{ + return json_object_get_string_member(t, FIELD_CREATOR); +} + +gint64 torrent_get_date_created(JsonObject *t) +{ + return json_object_get_int_member(t, FIELD_DATE_CREATED); +} + +const gchar *torrent_get_hash(JsonObject *t) +{ + return json_object_get_string_member(t, FIELD_HASH_STRING); +} + gchar *torrent_get_status_string(gint64 rpcv, gint64 value, guint flags) { if (rpcv >= NEW_STATUS_RPC_VERSION) { diff --git a/src/torrent.h b/src/torrent.h index ae6c432..9c4845f 100644 --- a/src/torrent.h +++ b/src/torrent.h @@ -59,6 +59,9 @@ const gchar *torrent_get_comment(JsonObject * t); gint64 torrent_get_have_unchecked(JsonObject * t); gint64 torrent_get_have_valid(JsonObject * t); gint64 torrent_get_status(JsonObject * t); +const gchar *torrent_get_creator(JsonObject *t); +gint64 torrent_get_date_created(JsonObject *t); +const gchar *torrent_get_hash(JsonObject *t); gchar *torrent_get_status_string(gint64 rpcv, gint64 value, guint flags); gchar *torrent_get_status_icon(gint64 rpcv, guint flags); guint32 torrent_get_flags(JsonObject * t, gint64 rpcv, gint64 status, diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c index 30f0faa..e8cfb15 100644 --- a/src/trg-preferences-dialog.c +++ b/src/trg-preferences-dialog.c @@ -394,7 +394,7 @@ static GtkWidget *trg_prefs_generalPage(TrgPreferencesDialog * dlg) TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg); GtkWidget *w, *activeOnly, *t; - gint row = 0; + guint row = 0; t = hig_workarea_create(); @@ -592,7 +592,7 @@ static GtkWidget *trg_prefs_openExecPage(TrgPreferencesDialog * dlg) TrgPersistentTreeView *ptv; GtkListStore *model; trg_pref_widget_desc *wd; - gint row = 0; + guint row = 0; t = hig_workarea_create(); @@ -629,7 +629,7 @@ static GtkWidget *trg_prefs_dirsPage(TrgPreferencesDialog * dlg) TrgPersistentTreeView *ptv; GtkListStore *model; trg_pref_widget_desc *wd; - gint row = 0; + guint row = 0; t = hig_workarea_create(); @@ -665,7 +665,7 @@ static GtkWidget *trg_prefs_viewPage(TrgPreferencesDialog * dlg) TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg); GtkWidget *w, *dep, *t, *tray; - gint row = 0; + guint row = 0; gboolean _is_unity = is_unity(); t = hig_workarea_create(); @@ -760,7 +760,7 @@ static GtkWidget *trg_prefs_serverPage(TrgPreferencesDialog * dlg) GtkWidget *w, *t, *frame, *frameHbox, *profileLabel; GtkWidget *profileButtonsHbox; - gint row = 0; + guint row = 0; t = hig_workarea_create(); diff --git a/src/trg-prefs.c b/src/trg-prefs.c index 126737b..a1a2c8f 100644 --- a/src/trg-prefs.c +++ b/src/trg-prefs.c @@ -69,22 +69,14 @@ static void trg_prefs_get_property(GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { - switch (property_id) { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); - break; - } + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); } static void trg_prefs_set_property(GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { - switch (property_id) { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); - break; - } + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); } static void trg_prefs_dispose(GObject * object) diff --git a/src/trg-remote-prefs-dialog.c b/src/trg-remote-prefs-dialog.c index acf689b..22b29af 100644 --- a/src/trg-remote-prefs-dialog.c +++ b/src/trg-remote-prefs-dialog.c @@ -298,7 +298,7 @@ static GtkWidget *trg_rprefs_bandwidthPage(TrgRemotePrefsDialog * win, TrgRemotePrefsDialogPrivate *priv = TRG_REMOTE_PREFS_DIALOG_GET_PRIVATE(win); GtkWidget *w, *tb, *t; - gint row = 0; + guint row = 0; t = hig_workarea_create(); @@ -353,7 +353,7 @@ static GtkWidget *trg_rprefs_limitsPage(TrgRemotePrefsDialog * win, TrgRemotePrefsDialogPrivate *priv = TRG_REMOTE_PREFS_DIALOG_GET_PRIVATE(win); GtkWidget *w, *tb, *t; - gint row = 0; + guint row = 0; t = hig_workarea_create(); @@ -509,7 +509,7 @@ static GtkWidget *trg_rprefs_connPage(TrgRemotePrefsDialog * win, GtkWidget *w, *tb, *t; const gchar *stringValue; - gint row = 0; + guint row = 0; t = hig_workarea_create(); @@ -596,7 +596,7 @@ static GtkWidget *trg_rprefs_generalPage(TrgRemotePrefsDialog * win, TRG_REMOTE_PREFS_DIALOG_GET_PRIVATE(win); GtkWidget *w, *tb, *t; - gint row = 0; + guint row = 0; gint64 cache_size_mb; t = hig_workarea_create(); diff --git a/src/trg-torrent-add-url-dialog.c b/src/trg-torrent-add-url-dialog.c index 6fe07e8..ef97725 100644 --- a/src/trg-torrent-add-url-dialog.c +++ b/src/trg-torrent-add-url-dialog.c @@ -109,7 +109,7 @@ static void trg_torrent_add_url_dialog_init(TrgTorrentAddUrlDialog * self) TrgTorrentAddUrlDialogPrivate *priv = TRG_TORRENT_ADD_URL_DIALOG_GET_PRIVATE(self); GtkWidget *w, *t, *contentvbox; - gint row = 0; + guint row = 0; contentvbox = gtk_dialog_get_content_area(GTK_DIALOG(self)); diff --git a/src/trg-torrent-move-dialog.c b/src/trg-torrent-move-dialog.c index 744b821..381ed86 100644 --- a/src/trg-torrent-move-dialog.c +++ b/src/trg-torrent-move-dialog.c @@ -103,7 +103,7 @@ static GObject *trg_torrent_move_dialog_constructor(GType type, gchar *msg; GtkWidget *w, *t; - gint row = 0; + guint row = 0; t = hig_workarea_create(); 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 ); } diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c index 1fc98a8..3f7a289 100644 --- a/src/trg-tree-view.c +++ b/src/trg-tree-view.c @@ -538,7 +538,7 @@ trg_tree_view_add_column_after(TrgTreeView * tv, gtk_tree_view_column_set_reorderable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, desc->model_column); - if (width >= 0) { + if (width > 0) { gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width(column, width); diff --git a/transmission-remote-gtk.pot b/transmission-remote-gtk.pot index a72ade5..c1bfea9 100644 --- a/transmission-remote-gtk.pot +++ b/transmission-remote-gtk.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-26 13:12+0100\n" +"POT-Creation-Date: 2012-08-27 12:27+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,46 +18,46 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/torrent.c:344 src/torrent.c:364 src/trg-state-selector.c:658 +#: src/torrent.c:359 src/torrent.c:379 src/trg-state-selector.c:658 msgid "Downloading" msgstr "" -#: src/torrent.c:346 +#: src/torrent.c:361 msgid "Queued download" msgstr "" -#: src/torrent.c:348 src/torrent.c:372 +#: src/torrent.c:363 src/torrent.c:387 msgid "Waiting To Check" msgstr "" -#: src/torrent.c:350 src/torrent.c:370 src/trg-state-selector.c:684 +#: src/torrent.c:365 src/torrent.c:385 src/trg-state-selector.c:684 msgid "Checking" msgstr "" -#: src/torrent.c:352 +#: src/torrent.c:367 msgid "Queued seed" msgstr "" -#: src/torrent.c:354 src/torrent.c:368 src/trg-remote-prefs-dialog.c:360 -#: src/trg-state-selector.c:665 src/trg-torrent-props-dialog.c:208 +#: src/torrent.c:369 src/torrent.c:383 src/trg-remote-prefs-dialog.c:360 +#: src/trg-state-selector.c:665 src/trg-torrent-props-dialog.c:407 msgid "Seeding" msgstr "" -#: src/torrent.c:356 src/torrent.c:366 src/torrent-cell-renderer.c:281 +#: src/torrent.c:371 src/torrent.c:381 src/torrent-cell-renderer.c:283 #: src/trg-state-selector.c:672 msgid "Paused" msgstr "" -#: src/torrent.c:376 +#: src/torrent.c:391 src/trg-torrent-props-dialog.c:340 msgid "Unknown" msgstr "" -#: src/torrent-cell-renderer.c:162 +#: src/torrent-cell-renderer.c:157 #, c-format msgid "%1$s of %2$s (%3$s)" msgstr "" -#: src/torrent-cell-renderer.c:172 +#: src/torrent-cell-renderer.c:167 #, c-format msgid "%1$s of %2$s (%3$s), uploaded %4$s (Ratio: %5$s Goal: %6$s)" msgstr "" @@ -67,80 +67,80 @@ msgstr "" msgid "%1$s of %2$s (%3$s), uploaded %4$s (Ratio: %5$s)" msgstr "" -#: src/torrent-cell-renderer.c:196 +#: src/torrent-cell-renderer.c:200 #, c-format msgid "%1$s, uploaded %2$s (Ratio: %3$s Goal: %4$s)" msgstr "" -#: src/torrent-cell-renderer.c:208 +#: src/torrent-cell-renderer.c:214 #, c-format msgid "%1$s, uploaded %2$s (Ratio: %3$s)" msgstr "" -#: src/torrent-cell-renderer.c:222 +#: src/torrent-cell-renderer.c:230 msgid "Remaining time unknown" msgstr "" -#: src/torrent-cell-renderer.c:228 +#: src/torrent-cell-renderer.c:235 #, c-format msgid "%s remaining" msgstr "" -#: src/torrent-cell-renderer.c:252 +#: src/torrent-cell-renderer.c:257 #, c-format msgid "%1$s %2$s, %3$s %4$s" msgstr "" -#: src/torrent-cell-renderer.c:257 src/torrent-cell-renderer.c:261 +#: src/torrent-cell-renderer.c:261 src/torrent-cell-renderer.c:264 #, c-format msgid "%1$s %2$s" msgstr "" -#: src/torrent-cell-renderer.c:266 +#: src/torrent-cell-renderer.c:268 msgid "Idle" msgstr "" -#: src/torrent-cell-renderer.c:281 +#: src/torrent-cell-renderer.c:282 msgid "Finished" msgstr "" -#: src/torrent-cell-renderer.c:283 +#: src/torrent-cell-renderer.c:285 msgid "Queued for verification" msgstr "" -#: src/torrent-cell-renderer.c:285 +#: src/torrent-cell-renderer.c:287 msgid "Queued for download" msgstr "" -#: src/torrent-cell-renderer.c:287 +#: src/torrent-cell-renderer.c:289 msgid "Queued for seeding" msgstr "" -#: src/torrent-cell-renderer.c:290 +#: src/torrent-cell-renderer.c:292 #, c-format msgid "Verifying data (%1$s tested)" msgstr "" -#: src/torrent-cell-renderer.c:297 +#: src/torrent-cell-renderer.c:300 #, c-format msgid "Ratio %s" msgstr "" -#: src/torrent-cell-renderer.c:326 +#: src/torrent-cell-renderer.c:330 #, c-format msgid "Downloading from %1$li of %2$li connected peer" msgid_plural "Downloading from %1$li of %2$li connected peers" msgstr[0] "" msgstr[1] "" -#: src/torrent-cell-renderer.c:333 +#: src/torrent-cell-renderer.c:338 #, c-format msgid "Downloading metadata from %1$li peer (%2$s done)" msgid_plural "Downloading metadata from %1$li peers (%2$s done)" msgstr[0] "" msgstr[1] "" -#: src/torrent-cell-renderer.c:340 +#: src/torrent-cell-renderer.c:349 #, c-format msgid "Seeding to %1$li of %2$li connected peer" msgid_plural "Seeding to %1$li of %2$li connected peers" @@ -151,18 +151,18 @@ msgstr[1] "" msgid "A remote client to transmission-daemon." msgstr "" -#: src/trg-cell-renderer-priority.c:74 src/trg-main-window.c:1994 -#: src/trg-torrent-add-dialog.c:450 src/trg-torrent-props-dialog.c:179 +#: src/trg-cell-renderer-priority.c:74 src/trg-main-window.c:2011 +#: src/trg-torrent-add-dialog.c:450 src/trg-torrent-props-dialog.c:382 msgid "Low" msgstr "" -#: src/trg-cell-renderer-priority.c:76 src/trg-main-window.c:1990 -#: src/trg-torrent-add-dialog.c:451 src/trg-torrent-props-dialog.c:179 +#: src/trg-cell-renderer-priority.c:76 src/trg-main-window.c:2007 +#: src/trg-torrent-add-dialog.c:451 src/trg-torrent-props-dialog.c:383 msgid "High" msgstr "" -#: src/trg-cell-renderer-priority.c:78 src/trg-main-window.c:1992 -#: src/trg-torrent-add-dialog.c:450 src/trg-torrent-props-dialog.c:179 +#: src/trg-cell-renderer-priority.c:78 src/trg-main-window.c:2009 +#: src/trg-torrent-add-dialog.c:450 src/trg-torrent-props-dialog.c:383 msgid "Normal" msgstr "" @@ -170,12 +170,12 @@ msgstr "" msgid "Mixed" msgstr "" -#: src/trg-files-tree-view.c:185 src/trg-general-panel.c:277 +#: src/trg-files-tree-view.c:185 src/trg-general-panel.c:280 #: src/trg-torrent-add-dialog.c:348 src/trg-torrent-tree-view.c:52 msgid "Name" msgstr "" -#: src/trg-files-tree-view.c:189 src/trg-general-panel.c:280 +#: src/trg-files-tree-view.c:189 src/trg-general-panel.c:283 #: src/trg-torrent-add-dialog.c:366 src/trg-torrent-tree-view.c:57 msgid "Size" msgstr "" @@ -185,28 +185,28 @@ msgid "Progress" msgstr "" #: src/trg-files-tree-view.c:193 src/trg-files-tree-view-common.c:69 -#: src/trg-torrent-add-dialog.c:379 src/trg-torrent-add-dialog.c:693 +#: src/trg-torrent-add-dialog.c:379 src/trg-torrent-add-dialog.c:703 msgid "Download" msgstr "" -#: src/trg-files-tree-view.c:195 src/trg-main-window.c:1983 -#: src/trg-torrent-add-dialog.c:395 src/trg-torrent-tree-view.c:132 +#: src/trg-files-tree-view.c:195 src/trg-main-window.c:2000 +#: src/trg-torrent-add-dialog.c:395 src/trg-torrent-tree-view.c:145 msgid "Priority" msgstr "" -#: src/trg-files-tree-view-common.c:50 src/trg-torrent-add-dialog.c:687 +#: src/trg-files-tree-view-common.c:50 src/trg-torrent-add-dialog.c:694 msgid "High Priority" msgstr "" -#: src/trg-files-tree-view-common.c:54 src/trg-torrent-add-dialog.c:689 +#: src/trg-files-tree-view-common.c:54 src/trg-torrent-add-dialog.c:697 msgid "Normal Priority" msgstr "" -#: src/trg-files-tree-view-common.c:58 src/trg-torrent-add-dialog.c:691 +#: src/trg-files-tree-view-common.c:58 src/trg-torrent-add-dialog.c:700 msgid "Low Priority" msgstr "" -#: src/trg-files-tree-view-common.c:77 src/trg-torrent-add-dialog.c:695 +#: src/trg-files-tree-view-common.c:77 src/trg-torrent-add-dialog.c:706 msgid "Skip" msgstr "" @@ -218,383 +218,384 @@ msgstr "" msgid "Collapse All" msgstr "" -#: src/trg-general-panel.c:152 src/trg-general-panel.c:213 +#: src/trg-general-panel.c:153 src/trg-general-panel.c:214 msgid "N/A" msgstr "" -#: src/trg-general-panel.c:167 +#: src/trg-general-panel.c:168 msgid "(Private)" msgstr "" -#: src/trg-general-panel.c:167 +#: src/trg-general-panel.c:168 msgid "(Public)" msgstr "" -#: src/trg-general-panel.c:201 src/trg-main-window.c:1081 -#: src/trg-main-window.c:1492 src/trg-main-window.c:2118 +#: src/trg-general-panel.c:202 src/trg-main-window.c:1097 +#: src/trg-main-window.c:1505 src/trg-main-window.c:2135 #: src/trg-state-selector.c:538 src/trg-torrent-add-url-dialog.c:67 #: src/util.c:331 msgid "Error" msgstr "" -#: src/trg-general-panel.c:282 src/trg-torrent-tree-view.c:110 +#: src/trg-general-panel.c:285 src/trg-torrent-tree-view.c:123 msgid "ETA" msgstr "" -#: src/trg-general-panel.c:284 src/trg-torrent-tree-view.c:138 +#: src/trg-general-panel.c:287 src/trg-torrent-tree-view.c:151 msgid "Completed" msgstr "" -#: src/trg-general-panel.c:287 +#: src/trg-general-panel.c:290 msgid "Seeders" msgstr "" -#: src/trg-general-panel.c:289 +#: src/trg-general-panel.c:292 msgid "Rate Down" msgstr "" -#: src/trg-general-panel.c:291 src/trg-torrent-tree-view.c:115 +#: src/trg-general-panel.c:294 src/trg-torrent-tree-view.c:128 msgid "Downloaded" msgstr "" -#: src/trg-general-panel.c:294 src/trg-torrent-tree-view.c:68 +#: src/trg-general-panel.c:297 src/trg-torrent-tree-view.c:70 msgid "Leechers" msgstr "" -#: src/trg-general-panel.c:296 +#: src/trg-general-panel.c:299 msgid "Rate Up" msgstr "" -#: src/trg-general-panel.c:298 src/trg-torrent-tree-view.c:112 +#: src/trg-general-panel.c:301 src/trg-torrent-tree-view.c:125 msgid "Uploaded" msgstr "" -#: src/trg-general-panel.c:301 src/trg-torrent-tree-view.c:61 +#: src/trg-general-panel.c:304 src/trg-torrent-tree-view.c:63 msgid "Status" msgstr "" -#: src/trg-general-panel.c:303 src/trg-torrent-tree-view.c:118 +#: src/trg-general-panel.c:306 src/trg-torrent-tree-view.c:131 msgid "Ratio" msgstr "" -#: src/trg-general-panel.c:306 +#: src/trg-general-panel.c:309 msgid "Comment" msgstr "" -#: src/trg-general-panel.c:309 +#: src/trg-general-panel.c:312 msgid "Completed At" msgstr "" -#: src/trg-general-panel.c:313 src/trg-torrent-tree-view.c:126 +#: src/trg-general-panel.c:316 src/trg-torrent-tree-view.c:139 msgid "Location" msgstr "" -#: src/trg-main-window.c:362 +#: src/trg-main-window.c:363 msgid "This torrent has completed." msgstr "" -#: src/trg-main-window.c:374 +#: src/trg-main-window.c:375 msgid "This torrent has been added." msgstr "" -#: src/trg-main-window.c:585 +#: src/trg-main-window.c:596 msgid "No hostname set" msgstr "" -#: src/trg-main-window.c:588 +#: src/trg-main-window.c:599 msgid "Unknown error getting settings" msgstr "" -#: src/trg-main-window.c:603 +#: src/trg-main-window.c:614 msgid "Connecting..." msgstr "" -#: src/trg-main-window.c:861 +#: src/trg-main-window.c:873 #, c-format msgid "Remove torrent \"%s\"?" msgstr "" -#: src/trg-main-window.c:862 +#: src/trg-main-window.c:874 #, c-format msgid "Remove %d torrents?" msgstr "" -#: src/trg-main-window.c:884 +#: src/trg-main-window.c:896 #, c-format msgid "Remove and delete torrent \"%s\"?" msgstr "" -#: src/trg-main-window.c:886 +#: src/trg-main-window.c:898 #, c-format msgid "Remove and delete %d torrents?" msgstr "" -#: src/trg-main-window.c:969 src/trg-preferences-dialog.c:896 +#: src/trg-main-window.c:981 src/trg-preferences-dialog.c:897 #: src/trg-remote-prefs-dialog.c:693 msgid "General" msgstr "" -#: src/trg-main-window.c:977 +#: src/trg-main-window.c:990 src/trg-torrent-props-dialog.c:547 msgid "Trackers" msgstr "" -#: src/trg-main-window.c:985 +#: src/trg-main-window.c:998 src/trg-torrent-props-dialog.c:522 msgid "Files" msgstr "" -#: src/trg-main-window.c:992 src/trg-remote-prefs-dialog.c:399 -#: src/trg-torrent-props-dialog.c:226 src/trg-trackers-tree-view.c:190 +#: src/trg-main-window.c:1006 src/trg-remote-prefs-dialog.c:399 +#: src/trg-torrent-props-dialog.c:423 src/trg-torrent-props-dialog.c:534 +#: src/trg-trackers-tree-view.c:190 msgid "Peers" msgstr "" -#: src/trg-main-window.c:1073 +#: src/trg-main-window.c:1089 #, c-format msgid "This application supports Transmission %g and later, you have %g." msgstr "" -#: src/trg-main-window.c:1138 src/trg-status-bar.c:74 src/trg-status-bar.c:104 +#: src/trg-main-window.c:1155 src/trg-status-bar.c:74 src/trg-status-bar.c:104 msgid "Disconnected" msgstr "" -#: src/trg-main-window.c:1183 +#: src/trg-main-window.c:1200 #, c-format msgid "%d Downloading @ %s" msgstr "" -#: src/trg-main-window.c:1190 +#: src/trg-main-window.c:1207 #, c-format msgid "%d Seeding @ %s" msgstr "" -#: src/trg-main-window.c:1243 +#: src/trg-main-window.c:1258 #, c-format msgid "Request %d/%d failed: %s" msgstr "" -#: src/trg-main-window.c:2038 +#: src/trg-main-window.c:2055 msgid "No Limit" msgstr "" -#: src/trg-main-window.c:2139 src/trg-menu-bar.c:646 src/trg-toolbar.c:223 +#: src/trg-main-window.c:2156 src/trg-menu-bar.c:675 src/trg-toolbar.c:223 msgid "Properties" msgstr "" -#: src/trg-main-window.c:2142 src/trg-toolbar.c:216 +#: src/trg-main-window.c:2159 src/trg-toolbar.c:216 msgid "Resume" msgstr "" -#: src/trg-main-window.c:2145 src/trg-toolbar.c:219 +#: src/trg-main-window.c:2162 src/trg-toolbar.c:219 msgid "Pause" msgstr "" -#: src/trg-main-window.c:2148 +#: src/trg-main-window.c:2165 msgid "Verify" msgstr "" -#: src/trg-main-window.c:2151 +#: src/trg-main-window.c:2168 msgid "Re-announce" msgstr "" -#: src/trg-main-window.c:2154 src/trg-torrent-move-dialog.c:119 +#: src/trg-main-window.c:2171 src/trg-torrent-move-dialog.c:119 #: src/trg-torrent-move-dialog.c:126 msgid "Move" msgstr "" -#: src/trg-main-window.c:2157 src/trg-menu-bar.c:677 src/trg-toolbar.c:227 +#: src/trg-main-window.c:2174 src/trg-menu-bar.c:706 src/trg-toolbar.c:227 msgid "Remove" msgstr "" -#: src/trg-main-window.c:2160 +#: src/trg-main-window.c:2177 msgid "Remove & Delete" msgstr "" -#: src/trg-main-window.c:2184 src/trg-preferences-dialog.c:906 +#: src/trg-main-window.c:2201 src/trg-preferences-dialog.c:907 msgid "Actions" msgstr "" -#: src/trg-main-window.c:2213 src/trg-menu-bar.c:693 +#: src/trg-main-window.c:2230 src/trg-menu-bar.c:722 msgid "Start Now" msgstr "" -#: src/trg-main-window.c:2216 src/trg-menu-bar.c:698 +#: src/trg-main-window.c:2233 src/trg-menu-bar.c:727 msgid "Move Up Queue" msgstr "" -#: src/trg-main-window.c:2219 src/trg-menu-bar.c:705 +#: src/trg-main-window.c:2236 src/trg-menu-bar.c:734 msgid "Move Down Queue" msgstr "" -#: src/trg-main-window.c:2222 src/trg-menu-bar.c:712 +#: src/trg-main-window.c:2239 src/trg-menu-bar.c:741 msgid "Bottom Of Queue" msgstr "" -#: src/trg-main-window.c:2225 src/trg-menu-bar.c:716 +#: src/trg-main-window.c:2242 src/trg-menu-bar.c:745 msgid "Top Of Queue" msgstr "" -#: src/trg-main-window.c:2234 src/trg-main-window.c:2317 +#: src/trg-main-window.c:2251 src/trg-main-window.c:2334 msgid "Down Limit" msgstr "" -#: src/trg-main-window.c:2239 src/trg-main-window.c:2321 +#: src/trg-main-window.c:2256 src/trg-main-window.c:2338 msgid "Up Limit" msgstr "" -#: src/trg-main-window.c:2268 src/trg-main-window.c:2275 +#: src/trg-main-window.c:2285 src/trg-main-window.c:2292 #: src/trg-remote-prefs-dialog.c:497 msgid "Updating..." msgstr "" -#: src/trg-main-window.c:2289 src/trg-menu-bar.c:605 src/trg-toolbar.c:196 +#: src/trg-main-window.c:2306 src/trg-menu-bar.c:634 src/trg-toolbar.c:196 msgid "Connect" msgstr "" -#: src/trg-main-window.c:2296 src/trg-toolbar.c:206 +#: src/trg-main-window.c:2313 src/trg-toolbar.c:206 msgid "Disconnect" msgstr "" -#: src/trg-main-window.c:2300 src/trg-toolbar.c:209 +#: src/trg-main-window.c:2317 src/trg-toolbar.c:209 #: src/trg-trackers-tree-view.c:284 src/trg-trackers-tree-view.c:311 msgid "Add" msgstr "" -#: src/trg-main-window.c:2304 +#: src/trg-main-window.c:2321 msgid "Add from URL" msgstr "" -#: src/trg-main-window.c:2308 +#: src/trg-main-window.c:2325 msgid "Resume All" msgstr "" -#: src/trg-main-window.c:2312 +#: src/trg-main-window.c:2329 msgid "Pause All" msgstr "" -#: src/trg-main-window.c:2328 +#: src/trg-main-window.c:2345 msgid "Quit" msgstr "" -#: src/trg-main-window.c:2439 src/trg-menu-bar.c:507 +#: src/trg-main-window.c:2459 src/trg-menu-bar.c:536 msgid "Graph" msgstr "" -#: src/trg-main-window.c:2621 +#: src/trg-main-window.c:2647 msgid "Transmission Remote" msgstr "" -#: src/trg-menu-bar.c:453 +#: src/trg-menu-bar.c:464 msgid "_View" msgstr "" -#: src/trg-menu-bar.c:459 +#: src/trg-menu-bar.c:473 msgid "Transmission Style" msgstr "" -#: src/trg-menu-bar.c:462 +#: src/trg-menu-bar.c:483 msgid "Transmission Compact Style" msgstr "" -#: src/trg-menu-bar.c:465 +#: src/trg-menu-bar.c:493 msgid "Classic Style" msgstr "" -#: src/trg-menu-bar.c:470 +#: src/trg-menu-bar.c:499 msgid "Sort" msgstr "" -#: src/trg-menu-bar.c:475 src/trg-preferences-dialog.c:674 +#: src/trg-menu-bar.c:504 src/trg-preferences-dialog.c:675 msgid "State selector" msgstr "" -#: src/trg-menu-bar.c:481 src/trg-preferences-dialog.c:681 +#: src/trg-menu-bar.c:510 src/trg-preferences-dialog.c:682 msgid "Directory filters" msgstr "" -#: src/trg-menu-bar.c:490 src/trg-preferences-dialog.c:688 +#: src/trg-menu-bar.c:519 src/trg-preferences-dialog.c:689 msgid "Tracker filters" msgstr "" -#: src/trg-menu-bar.c:499 src/trg-preferences-dialog.c:695 +#: src/trg-menu-bar.c:528 src/trg-preferences-dialog.c:696 msgid "Torrent Details" msgstr "" -#: src/trg-menu-bar.c:513 +#: src/trg-menu-bar.c:542 msgid "_Statistics" msgstr "" -#: src/trg-menu-bar.c:525 +#: src/trg-menu-bar.c:554 msgid "_Options" msgstr "" -#: src/trg-menu-bar.c:531 +#: src/trg-menu-bar.c:560 msgid "_Local Preferences" msgstr "" -#: src/trg-menu-bar.c:538 +#: src/trg-menu-bar.c:567 msgid "_Remote Preferences" msgstr "" -#: src/trg-menu-bar.c:598 +#: src/trg-menu-bar.c:627 msgid "_File" msgstr "" -#: src/trg-menu-bar.c:611 +#: src/trg-menu-bar.c:640 msgid "_Disconnect" msgstr "" -#: src/trg-menu-bar.c:617 +#: src/trg-menu-bar.c:646 msgid "_Add" msgstr "" -#: src/trg-menu-bar.c:622 +#: src/trg-menu-bar.c:651 msgid "Add from _URL" msgstr "" -#: src/trg-menu-bar.c:628 +#: src/trg-menu-bar.c:657 msgid "_Quit" msgstr "" -#: src/trg-menu-bar.c:639 +#: src/trg-menu-bar.c:668 msgid "_Torrent" msgstr "" -#: src/trg-menu-bar.c:651 +#: src/trg-menu-bar.c:680 msgid "_Resume" msgstr "" -#: src/trg-menu-bar.c:656 +#: src/trg-menu-bar.c:685 msgid "_Pause" msgstr "" -#: src/trg-menu-bar.c:661 +#: src/trg-menu-bar.c:690 msgid "_Verify" msgstr "" -#: src/trg-menu-bar.c:667 +#: src/trg-menu-bar.c:696 msgid "Re-_announce" msgstr "" -#: src/trg-menu-bar.c:672 +#: src/trg-menu-bar.c:701 msgid "_Move" msgstr "" -#: src/trg-menu-bar.c:683 +#: src/trg-menu-bar.c:712 msgid "Remove and Delete" msgstr "" -#: src/trg-menu-bar.c:724 +#: src/trg-menu-bar.c:753 msgid "_Resume All" msgstr "" -#: src/trg-menu-bar.c:730 +#: src/trg-menu-bar.c:759 msgid "_Pause All" msgstr "" -#: src/trg-menu-bar.c:742 +#: src/trg-menu-bar.c:771 msgid "_Help" msgstr "" -#: src/trg-menu-bar.c:748 +#: src/trg-menu-bar.c:777 msgid "_About" msgstr "" @@ -610,11 +611,11 @@ msgstr "" msgid "Country" msgstr "" -#: src/trg-peers-tree-view.c:61 src/trg-torrent-tree-view.c:104 +#: src/trg-peers-tree-view.c:61 src/trg-torrent-tree-view.c:117 msgid "Down Speed" msgstr "" -#: src/trg-peers-tree-view.c:63 src/trg-torrent-tree-view.c:107 +#: src/trg-peers-tree-view.c:63 src/trg-torrent-tree-view.c:120 msgid "Up Speed" msgstr "" @@ -626,147 +627,147 @@ msgstr "" msgid "Client" msgstr "" -#: src/trg-preferences-dialog.c:400 +#: src/trg-preferences-dialog.c:401 msgid "Updates" msgstr "" -#: src/trg-preferences-dialog.c:402 +#: src/trg-preferences-dialog.c:403 msgid "Update active torrents only" msgstr "" -#: src/trg-preferences-dialog.c:409 +#: src/trg-preferences-dialog.c:410 msgid "Full update every (?) updates" msgstr "" -#: src/trg-preferences-dialog.c:423 +#: src/trg-preferences-dialog.c:424 msgid "Update interval:" msgstr "" -#: src/trg-preferences-dialog.c:427 +#: src/trg-preferences-dialog.c:428 msgid "Minimised update interval:" msgstr "" -#: src/trg-preferences-dialog.c:432 +#: src/trg-preferences-dialog.c:433 msgid "Session update interval:" msgstr "" -#: src/trg-preferences-dialog.c:434 +#: src/trg-preferences-dialog.c:435 msgid "Torrents" msgstr "" -#: src/trg-preferences-dialog.c:436 +#: src/trg-preferences-dialog.c:437 msgid "Start paused" msgstr "" -#: src/trg-preferences-dialog.c:440 +#: src/trg-preferences-dialog.c:441 msgid "Options dialog on add" msgstr "" -#: src/trg-preferences-dialog.c:445 src/trg-torrent-add-dialog.c:761 +#: src/trg-preferences-dialog.c:446 src/trg-torrent-add-dialog.c:776 msgid "Delete local .torrent file after adding" msgstr "" -#: src/trg-preferences-dialog.c:598 +#: src/trg-preferences-dialog.c:599 msgid "Commands" msgstr "" -#: src/trg-preferences-dialog.c:608 src/trg-preferences-dialog.c:646 +#: src/trg-preferences-dialog.c:609 src/trg-preferences-dialog.c:647 msgid "Label" msgstr "" -#: src/trg-preferences-dialog.c:611 +#: src/trg-preferences-dialog.c:612 msgid "Command" msgstr "" -#: src/trg-preferences-dialog.c:636 +#: src/trg-preferences-dialog.c:637 msgid "Remote Download Directories" msgstr "" -#: src/trg-preferences-dialog.c:649 +#: src/trg-preferences-dialog.c:650 msgid "Directory" msgstr "" -#: src/trg-preferences-dialog.c:672 src/trg-preferences-dialog.c:901 +#: src/trg-preferences-dialog.c:673 src/trg-preferences-dialog.c:902 msgid "View" msgstr "" -#: src/trg-preferences-dialog.c:703 +#: src/trg-preferences-dialog.c:704 msgid "Show graph" msgstr "" -#: src/trg-preferences-dialog.c:713 +#: src/trg-preferences-dialog.c:714 msgid "System Tray" msgstr "" -#: src/trg-preferences-dialog.c:715 +#: src/trg-preferences-dialog.c:716 msgid "Show in system tray" msgstr "" -#: src/trg-preferences-dialog.c:723 +#: src/trg-preferences-dialog.c:724 msgid "Minimise to system tray" msgstr "" -#: src/trg-preferences-dialog.c:739 +#: src/trg-preferences-dialog.c:740 msgid "Notifications" msgstr "" -#: src/trg-preferences-dialog.c:741 +#: src/trg-preferences-dialog.c:742 msgid "Torrent added notifications" msgstr "" -#: src/trg-preferences-dialog.c:745 +#: src/trg-preferences-dialog.c:746 msgid "Torrent complete notifications" msgstr "" -#: src/trg-preferences-dialog.c:772 +#: src/trg-preferences-dialog.c:773 msgid "Profile: " msgstr "" -#: src/trg-preferences-dialog.c:798 +#: src/trg-preferences-dialog.c:799 msgid "Name:" msgstr "" -#: src/trg-preferences-dialog.c:806 src/trg-preferences-dialog.c:891 +#: src/trg-preferences-dialog.c:807 src/trg-preferences-dialog.c:892 msgid "Connection" msgstr "" -#: src/trg-preferences-dialog.c:809 +#: src/trg-preferences-dialog.c:810 msgid "Host:" msgstr "" -#: src/trg-preferences-dialog.c:813 +#: src/trg-preferences-dialog.c:814 msgid "Port:" msgstr "" -#: src/trg-preferences-dialog.c:816 +#: src/trg-preferences-dialog.c:817 msgid "Username:" msgstr "" -#: src/trg-preferences-dialog.c:820 +#: src/trg-preferences-dialog.c:821 msgid "Password:" msgstr "" -#: src/trg-preferences-dialog.c:822 +#: src/trg-preferences-dialog.c:823 msgid "Automatically connect" msgstr "" -#: src/trg-preferences-dialog.c:828 +#: src/trg-preferences-dialog.c:829 msgid "SSL" msgstr "" -#: src/trg-preferences-dialog.c:835 +#: src/trg-preferences-dialog.c:836 msgid "Timeout:" msgstr "" -#: src/trg-preferences-dialog.c:839 +#: src/trg-preferences-dialog.c:840 msgid "Retries:" msgstr "" -#: src/trg-preferences-dialog.c:880 src/trg-toolbar.c:238 +#: src/trg-preferences-dialog.c:881 src/trg-toolbar.c:238 msgid "Local Preferences" msgstr "" -#: src/trg-preferences-dialog.c:911 +#: src/trg-preferences-dialog.c:912 msgid "Directories" msgstr "" @@ -959,11 +960,11 @@ msgstr "" msgid "Remote Preferences" msgstr "" -#: src/trg-remote-prefs-dialog.c:703 src/trg-torrent-props-dialog.c:171 +#: src/trg-remote-prefs-dialog.c:703 src/trg-torrent-props-dialog.c:376 msgid "Bandwidth" msgstr "" -#: src/trg-remote-prefs-dialog.c:708 src/trg-torrent-props-dialog.c:294 +#: src/trg-remote-prefs-dialog.c:708 src/trg-torrent-props-dialog.c:561 msgid "Limits" msgstr "" @@ -1086,43 +1087,43 @@ msgstr "" msgid "Unable to open torrent file: %s" msgstr "" -#: src/trg-torrent-add-dialog.c:574 +#: src/trg-torrent-add-dialog.c:576 msgid "(None)" msgstr "" -#: src/trg-torrent-add-dialog.c:576 +#: src/trg-torrent-add-dialog.c:578 msgid "(Multiple)" msgstr "" -#: src/trg-torrent-add-dialog.c:599 +#: src/trg-torrent-add-dialog.c:601 msgid "Add a Torrent" msgstr "" -#: src/trg-torrent-add-dialog.c:729 +#: src/trg-torrent-add-dialog.c:744 msgid "Add Torrent" msgstr "" -#: src/trg-torrent-add-dialog.c:754 +#: src/trg-torrent-add-dialog.c:769 msgid "Start _paused" msgstr "" -#: src/trg-torrent-add-dialog.c:770 +#: src/trg-torrent-add-dialog.c:785 msgid "_Torrent file:" msgstr "" -#: src/trg-torrent-add-dialog.c:787 +#: src/trg-torrent-add-dialog.c:801 msgid "_Destination folder:" msgstr "" -#: src/trg-torrent-add-dialog.c:803 +#: src/trg-torrent-add-dialog.c:815 msgid "Apply to all:" msgstr "" -#: src/trg-torrent-add-dialog.c:812 +#: src/trg-torrent-add-dialog.c:825 msgid "Torrent _priority:" msgstr "" -#: src/trg-torrent-add-dialog.c:914 +#: src/trg-torrent-add-dialog.c:926 msgid "Show _options dialog" msgstr "" @@ -1152,11 +1153,11 @@ msgstr "" msgid "Total Downloading" msgstr "" -#: src/trg-torrent-model.c:394 +#: src/trg-torrent-model.c:407 msgid "Default" msgstr "" -#: src/trg-torrent-move-dialog.c:116 +#: src/trg-torrent-move-dialog.c:116 src/trg-torrent-props-dialog.c:234 msgid "Location:" msgstr "" @@ -1170,124 +1171,214 @@ msgstr "" msgid "Move %d torrents" msgstr "" -#: src/trg-torrent-props-dialog.c:175 +#: src/trg-torrent-props-dialog.c:180 +msgid "Activity" +msgstr "" + +#: src/trg-torrent-props-dialog.c:185 +msgid "Torrent size:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:190 +msgid "Have:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:195 +msgid "Downloaded:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:200 +msgid "Uploaded:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:205 +msgid "State:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:210 +msgid "Running time:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:215 +msgid "Remaining time:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:220 +msgid "Last activity:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:225 +msgid "Error:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:229 +msgid "Details" +msgstr "" + +#: src/trg-torrent-props-dialog.c:240 +msgid "Hash:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:246 +msgid "Privacy:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:252 +msgid "Origin:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:268 +msgid "Comment:" +msgstr "" + +#: src/trg-torrent-props-dialog.c:301 +msgid "Private to this tracker -- DHT and PEX disabled" +msgstr "" + +#: src/trg-torrent-props-dialog.c:303 +msgid "Public torrent" +msgstr "" + +#: src/trg-torrent-props-dialog.c:313 +#, c-format +msgid "Created on %1$s" +msgstr "" + +#: src/trg-torrent-props-dialog.c:315 +#, c-format +msgid "Created by %1$s on %2$s" +msgstr "" + +#: src/trg-torrent-props-dialog.c:344 +msgid "No errors" +msgstr "" + +#: src/trg-torrent-props-dialog.c:348 +msgid "Active now" +msgstr "" + +#: src/trg-torrent-props-dialog.c:379 msgid "Honor global limits" msgstr "" -#: src/trg-torrent-props-dialog.c:184 +#: src/trg-torrent-props-dialog.c:387 msgid "Torrent priority:" msgstr "" -#: src/trg-torrent-props-dialog.c:190 +#: src/trg-torrent-props-dialog.c:392 msgid "Queue Position:" msgstr "" -#: src/trg-torrent-props-dialog.c:195 +#: src/trg-torrent-props-dialog.c:396 msgid "Limit download speed (KiB/s)" msgstr "" -#: src/trg-torrent-props-dialog.c:203 +#: src/trg-torrent-props-dialog.c:402 msgid "Limit upload speed (KiB/s)" msgstr "" -#: src/trg-torrent-props-dialog.c:211 +#: src/trg-torrent-props-dialog.c:409 msgid "Use global settings" msgstr "" -#: src/trg-torrent-props-dialog.c:212 +#: src/trg-torrent-props-dialog.c:410 msgid "Stop seeding at ratio" msgstr "" -#: src/trg-torrent-props-dialog.c:213 +#: src/trg-torrent-props-dialog.c:410 msgid "Seed regardless of ratio" msgstr "" -#: src/trg-torrent-props-dialog.c:216 +#: src/trg-torrent-props-dialog.c:414 msgid "Seed ratio mode:" msgstr "" -#: src/trg-torrent-props-dialog.c:224 +#: src/trg-torrent-props-dialog.c:421 msgid "Seed ratio limit:" msgstr "" -#: src/trg-torrent-props-dialog.c:230 +#: src/trg-torrent-props-dialog.c:427 msgid "Peer limit:" msgstr "" -#: src/trg-torrent-props-dialog.c:264 +#: src/trg-torrent-props-dialog.c:480 #, c-format msgid "Multiple (%d) torrent properties" msgstr "" -#: src/trg-torrent-tree-view.c:59 +#: src/trg-torrent-props-dialog.c:509 +msgid "Information" +msgstr "" + +#: src/trg-torrent-tree-view.c:60 msgid "Done" msgstr "" -#: src/trg-torrent-tree-view.c:63 +#: src/trg-torrent-tree-view.c:65 msgid "Seeds" msgstr "" -#: src/trg-torrent-tree-view.c:65 +#: src/trg-torrent-tree-view.c:67 msgid "Sending" msgstr "" -#: src/trg-torrent-tree-view.c:71 +#: src/trg-torrent-tree-view.c:73 msgid "Downloads" msgstr "" -#: src/trg-torrent-tree-view.c:74 +#: src/trg-torrent-tree-view.c:76 msgid "Receiving" msgstr "" -#: src/trg-torrent-tree-view.c:78 +#: src/trg-torrent-tree-view.c:80 msgid "Connected" msgstr "" -#: src/trg-torrent-tree-view.c:80 +#: src/trg-torrent-tree-view.c:82 msgid "PEX Peers" msgstr "" -#: src/trg-torrent-tree-view.c:83 +#: src/trg-torrent-tree-view.c:87 msgid "DHT Peers" msgstr "" -#: src/trg-torrent-tree-view.c:87 +#: src/trg-torrent-tree-view.c:93 msgid "Tracker Peers" msgstr "" -#: src/trg-torrent-tree-view.c:90 +#: src/trg-torrent-tree-view.c:97 msgid "LTEP Peers" msgstr "" -#: src/trg-torrent-tree-view.c:93 +#: src/trg-torrent-tree-view.c:102 msgid "Resumed Peers" msgstr "" -#: src/trg-torrent-tree-view.c:97 +#: src/trg-torrent-tree-view.c:108 msgid "Incoming Peers" msgstr "" -#: src/trg-torrent-tree-view.c:101 +#: src/trg-torrent-tree-view.c:113 msgid "Peers T/I/E/H/X/L/R" msgstr "" -#: src/trg-torrent-tree-view.c:120 +#: src/trg-torrent-tree-view.c:133 msgid "Added" msgstr "" -#: src/trg-torrent-tree-view.c:123 +#: src/trg-torrent-tree-view.c:136 msgid "First Tracker" msgstr "" -#: src/trg-torrent-tree-view.c:129 +#: src/trg-torrent-tree-view.c:142 msgid "ID" msgstr "" -#: src/trg-torrent-tree-view.c:135 +#: src/trg-torrent-tree-view.c:148 msgid "Queue Position" msgstr "" -#: src/trg-torrent-tree-view.c:141 +#: src/trg-torrent-tree-view.c:154 msgid "Last Active" msgstr "" @@ -1327,11 +1418,11 @@ msgstr "" msgid "Delete" msgstr "" -#: src/trg-tree-view.c:253 +#: src/trg-tree-view.c:269 msgid "Ascending" msgstr "" -#: src/trg-tree-view.c:259 +#: src/trg-tree-view.c:279 msgid "Descending" msgstr "" -- cgit v1.2.3