summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/protocol-constants.h1
-rw-r--r--src/requests.c1
-rw-r--r--src/torrent.c5
-rw-r--r--src/torrent.h1
-rw-r--r--src/transmission-remote-gtk.pod4
-rw-r--r--src/trg-about-window.c4
-rw-r--r--src/trg-file-parser.c2
-rw-r--r--src/trg-files-tree-view.c23
-rw-r--r--src/trg-gtk-app.c2
-rw-r--r--src/trg-json-widgets.c52
-rw-r--r--src/trg-json-widgets.h16
-rw-r--r--src/trg-main-window.c23
-rw-r--r--src/trg-menu-bar.c15
-rw-r--r--src/trg-remote-prefs-dialog.c130
-rw-r--r--src/trg-torrent-props-dialog.c24
15 files changed, 239 insertions, 64 deletions
diff --git a/src/protocol-constants.h b/src/protocol-constants.h
index 8fffb00..18c6d28 100644
--- a/src/protocol-constants.h
+++ b/src/protocol-constants.h
@@ -70,6 +70,7 @@
#define FIELD_LEFTUNTILDONE "leftUntilDone"
#define FIELD_ISFINISHED "isFinished"
#define FIELD_ISPRIVATE "isPrivate"
+#define FIELD_MAGNETLINK "magnetLink"
#define FIELD_ERROR "error"
#define FIELD_ERROR_STRING "errorString"
#define FIELD_BANDWIDTH_PRIORITY "bandwidthPriority"
diff --git a/src/requests.c b/src/requests.c
index 4e044ab..77466f9 100644
--- a/src/requests.c
+++ b/src/requests.c
@@ -212,6 +212,7 @@ JsonNode *torrent_get(gint64 id)
json_array_add_string_element(fields, FIELD_SEED_RATIO_MODE);
json_array_add_string_element(fields, FIELD_PEER_LIMIT);
json_array_add_string_element(fields, FIELD_ACTIVITY_DATE);
+ json_array_add_string_element(fields, FIELD_MAGNETLINK);
json_array_add_string_element(fields, FIELD_ERROR);
json_array_add_string_element(fields, FIELD_ERROR_STRING);
json_array_add_string_element(fields, FIELD_WANTED);
diff --git a/src/torrent.c b/src/torrent.c
index e5577ee..8e5422f 100644
--- a/src/torrent.c
+++ b/src/torrent.c
@@ -108,6 +108,11 @@ gint64 torrent_get_bandwidth_priority(JsonObject * t)
return json_object_get_int_member(t, FIELD_BANDWIDTH_PRIORITY);
}
+const gchar *torrent_get_magnetlink(JsonObject * t)
+{
+ return json_object_get_string_member(t, FIELD_MAGNETLINK);
+}
+
gint64 torrent_get_upload_limit(JsonObject * t)
{
return json_object_get_int_member(t, FIELD_UPLOAD_LIMIT);
diff --git a/src/torrent.h b/src/torrent.h
index c837046..481841d 100644
--- a/src/torrent.h
+++ b/src/torrent.h
@@ -87,6 +87,7 @@ gboolean torrent_get_is_private(JsonObject * t);
gboolean torrent_get_honors_session_limits(JsonObject * t);
gint64 torrent_get_bandwidth_priority(JsonObject * t);
gint64 torrent_get_upload_limit(JsonObject * t);
+const gchar *torrent_get_magnetlink(JsonObject * t);
gint64 torrent_get_added_date(JsonObject * t);
gint64 torrent_get_done_date(JsonObject * t);
gboolean torrent_get_upload_limited(JsonObject * t);
diff --git a/src/transmission-remote-gtk.pod b/src/transmission-remote-gtk.pod
index de7c575..34b39a3 100644
--- a/src/transmission-remote-gtk.pod
+++ b/src/transmission-remote-gtk.pod
@@ -40,7 +40,7 @@ Written by Alan Fitton.
=head1 BUGS
-Please see L<http://code.google.com/p/transmission-remote-gtk/issues>
+Please see L<https://github.com/transmission-remote-gtk/transmission-remote-gtk/issues>
=head1 COPYRIGHT
@@ -51,7 +51,7 @@ permitted by law.
=head1 SEE ALSO
-C<transmission-daemon(1)>, C<transmission-gtk(1)>, the project website C<http://code.google.com/p/transmission-remote-gtk/>
+C<transmission-daemon(1)>, C<transmission-gtk(1)>, the project website C<https://github.com/transmission-remote-gtk/transmission-remote-gtk>
=cut
diff --git a/src/trg-about-window.c b/src/trg-about-window.c
index c14482b..89e2c11 100644
--- a/src/trg-about-window.c
+++ b/src/trg-about-window.c
@@ -59,9 +59,9 @@ GtkWidget *trg_about_window_new(GtkWindow * parent)
("A remote client to transmission-daemon."));
gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(dialog),
- "http://code.google.com/p/transmission-remote-gtk/");
+ "https://github.com/transmission-remote-gtk/transmission-remote-gtk");
gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(dialog),
- "http://code.google.com/p/transmission-remote-gtk/");
+ "https://github.com/transmission-remote-gtk/transmission-remote-gtk");
gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(dialog), trgAuthors);
/*gtk_about_dialog_set_documenters(GTK_ABOUT_DIALOG(dialog), documenters); */
diff --git a/src/trg-file-parser.c b/src/trg-file-parser.c
index 2200ec6..bd27939 100644
--- a/src/trg-file-parser.c
+++ b/src/trg-file-parser.c
@@ -88,7 +88,7 @@ static trg_files_tree_node *trg_file_parser_node_insert(trg_files_tree_node
target_node->length = (gint64) file_length_node->val.i;
while (lastIter) {
- lastIter->length = target_node->length;
+ lastIter->length += target_node->length;
lastIter = lastIter->parent;
}
}
diff --git a/src/trg-files-tree-view.c b/src/trg-files-tree-view.c
index 70147f7..afe6073 100644
--- a/src/trg-files-tree-view.c
+++ b/src/trg-files-tree-view.c
@@ -180,6 +180,24 @@ view_onButtonPressed(GtkWidget * treeview,
return handled;
}
+static gboolean
+search_func (GtkTreeModel *model, gint column,
+ const gchar *key, GtkTreeIter *iter,
+ gpointer search_data)
+{
+ gchar *iter_string = NULL;
+ gchar *lowercase = NULL;
+ gboolean result = TRUE;
+ gtk_tree_model_get(model, iter, column, &iter_string, -1);
+ if (iter_string != NULL) {
+ lowercase = g_utf8_strdown(iter_string, -1);
+ result = g_strrstr(lowercase, key) == NULL;
+ }
+ g_free(lowercase);
+ g_free(iter_string);
+ return result;
+}
+
static void trg_files_tree_view_init(TrgFilesTreeView * self)
{
TrgTreeView *ttv = TRG_TREE_VIEW(self);
@@ -200,6 +218,11 @@ static void trg_files_tree_view_init(TrgFilesTreeView * self)
gtk_tree_view_set_search_column(GTK_TREE_VIEW(self), FILESCOL_NAME);
+ gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(self),
+ (GtkTreeViewSearchEqualFunc) search_func,
+ gtk_tree_view_get_model(GTK_TREE_VIEW(self)),
+ NULL);
+
g_signal_connect(self, "button-press-event",
G_CALLBACK(view_onButtonPressed), NULL);
g_signal_connect(self, "popup-menu",
diff --git a/src/trg-gtk-app.c b/src/trg-gtk-app.c
index 7865767..8f56d82 100644
--- a/src/trg-gtk-app.c
+++ b/src/trg-gtk-app.c
@@ -208,7 +208,7 @@ static void trg_gtk_app_init(TrgGtkApp * self)
TrgGtkApp *trg_gtk_app_new(TrgClient * client)
{
return g_object_new(TRG_TYPE_GTK_APP,
- "application-id", "uk.org.eth0.trg",
+ "application-id", "io.github.TransmissionRemoteGtk",
"flags", G_APPLICATION_HANDLES_COMMAND_LINE,
"trg-client", client, NULL);
}
diff --git a/src/trg-json-widgets.c b/src/trg-json-widgets.c
index 79299c6..99ccc44 100644
--- a/src/trg-json-widgets.c
+++ b/src/trg-json-widgets.c
@@ -121,16 +121,49 @@ GtkWidget *trg_json_widget_entry_new(GList ** wl, JsonObject * obj,
return w;
}
-GtkWidget *trg_json_widget_spin_new(GList ** wl, JsonObject * obj,
+GtkWidget *trg_json_widget_spin_int_new(GList ** wl, JsonObject * obj,
+ const gchar * key,
+ GtkWidget * toggleDep, gint min,
+ gint max, gint step)
+{
+ GtkWidget *w = gtk_spin_button_new_with_range((gdouble)min,
+ (gdouble)max,
+ (gdouble)step);
+
+ gtk_spin_button_set_digits(GTK_SPIN_BUTTON(w), 0);
+
+ trg_json_widget_desc *wd = g_new0(trg_json_widget_desc, 1);
+
+ wd->saveFunc = trg_json_widget_spin_int_save;
+ wd->key = g_strdup(key);
+ wd->widget = w;
+
+ if (toggleDep) {
+ gtk_widget_set_sensitive(w,
+ gtk_toggle_button_get_active
+ (GTK_TOGGLE_BUTTON(toggleDep)));
+ g_signal_connect(G_OBJECT(toggleDep), "toggled",
+ G_CALLBACK(toggle_active_arg_is_sensitive), w);
+ }
+
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
+ (double)json_object_get_int_member(obj, key));
+
+ *wl = g_list_append(*wl, wd);
+
+ return w;
+}
+
+GtkWidget *trg_json_widget_spin_double_new(GList ** wl, JsonObject * obj,
const gchar * key,
GtkWidget * toggleDep, gdouble min,
gdouble max, gdouble step)
{
GtkWidget *w = gtk_spin_button_new_with_range(min, max, step);
+
trg_json_widget_desc *wd = g_new0(trg_json_widget_desc, 1);
- JsonNode *node = json_object_get_member(obj, key);
- wd->saveFunc = trg_json_widget_spin_save_double;
+ wd->saveFunc = trg_json_widget_spin_double_save;
wd->key = g_strdup(key);
wd->widget = w;
@@ -143,7 +176,7 @@ GtkWidget *trg_json_widget_spin_new(GList ** wl, JsonObject * obj,
}
gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
- json_node_really_get_double(node));
+ json_object_get_double_member(obj, key));
*wl = g_list_append(*wl, wd);
@@ -168,7 +201,16 @@ trg_json_widget_entry_save(GtkWidget * widget, JsonObject * obj,
}
void
-trg_json_widget_spin_save_double(GtkWidget * widget, JsonObject * obj,
+trg_json_widget_spin_int_save(GtkWidget * widget, JsonObject * obj,
+ gchar * key)
+{
+ json_object_set_int_member(obj, key,
+ gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON
+ (widget)));
+}
+
+void
+trg_json_widget_spin_double_save(GtkWidget * widget, JsonObject * obj,
gchar * key)
{
json_object_set_double_member(obj, key,
diff --git a/src/trg-json-widgets.h b/src/trg-json-widgets.h
index a7dde5b..6f79f7b 100644
--- a/src/trg-json-widgets.h
+++ b/src/trg-json-widgets.h
@@ -38,17 +38,21 @@ GtkWidget *trg_json_widget_check_new(GList ** wl, JsonObject * obj,
GtkWidget *trg_json_widget_entry_new(GList ** wl, JsonObject * obj,
const gchar * key,
GtkWidget * toggleDep);
-GtkWidget *trg_json_widget_spin_new(GList ** wl, JsonObject * obj,
- const gchar * key,
- GtkWidget * toggleDep, gdouble min,
- gdouble max, gdouble step);
+GtkWidget *trg_json_widget_spin_int_new(GList ** wl, JsonObject * obj,
+ const gchar * key,
+ GtkWidget * toggleDep, gint min,
+ gint max, gint step);
+GtkWidget *trg_json_widget_spin_double_new(GList ** wl, JsonObject * obj,
+ const gchar * key,
+ GtkWidget * toggleDep, gdouble min,
+ gdouble max, gdouble step);
void trg_json_widget_check_save(GtkWidget * widget, JsonObject * obj,
gchar * key);
void trg_json_widget_entry_save(GtkWidget * widget, JsonObject * obj,
gchar * key);
-void trg_json_widget_spin_save_int(GtkWidget * widget, JsonObject * obj,
+void trg_json_widget_spin_int_save(GtkWidget * widget, JsonObject * obj,
gchar * key);
-void trg_json_widget_spin_save_double(GtkWidget * widget, JsonObject * obj,
+void trg_json_widget_spin_double_save(GtkWidget * widget, JsonObject * obj,
gchar * key);
void trg_json_widget_desc_free(trg_json_widget_desc * wd);
diff --git a/src/trg-main-window.c b/src/trg-main-window.c
index d85a364..5729254 100644
--- a/src/trg-main-window.c
+++ b/src/trg-main-window.c
@@ -449,6 +449,20 @@ static void open_props_cb(GtkWidget * w G_GNUC_UNUSED, TrgMainWindow * win)
gtk_widget_show_all(GTK_WIDGET(dialog));
}
+static void copy_magnetlink_cb(GtkWidget * w G_GNUC_UNUSED, TrgMainWindow * win)
+{
+ TrgMainWindowPrivate *priv = trg_main_window_get_instance_private(win);
+ JsonObject *json = NULL;
+ GtkClipboard *clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+
+ if (priv->selectedTorrentId < 0)
+ return;
+
+ if(get_torrent_data(trg_client_get_torrent_table(priv->client),
+ priv->selectedTorrentId, &json, NULL))
+ gtk_clipboard_set_text(clip, torrent_get_magnetlink(json), -1);
+}
+
static void
torrent_tv_onRowActivated(GtkTreeView * treeview,
GtkTreePath * path G_GNUC_UNUSED,
@@ -1785,7 +1799,7 @@ static TrgMenuBar *trg_main_window_menu_bar_new(TrgMainWindow * win)
#ifdef HAVE_RSS
*b_view_rss,
#endif
- *b_start_now;
+ *b_start_now, *b_copy_magnetlink;
TrgMenuBar *menuBar;
GtkAccelGroup *accel_group;
@@ -1818,7 +1832,8 @@ static TrgMenuBar *trg_main_window_menu_bar_new(TrgMainWindow * win)
#endif
"up-queue", &b_up_queue, "down-queue", &b_down_queue,
"top-queue", &b_top_queue, "bottom-queue",
- &b_bottom_queue, "start-now", &b_start_now, NULL);
+ &b_bottom_queue, "start-now", &b_start_now,
+ "copymagnet-button", &b_copy_magnetlink, NULL);
g_signal_connect(b_disconnect, "activate", G_CALLBACK(disconnect_cb),
win);
@@ -1871,6 +1886,7 @@ static TrgMenuBar *trg_main_window_menu_bar_new(TrgMainWindow * win)
G_CALLBACK(trg_main_window_toggle_graph_cb), win);
#endif
g_signal_connect(b_props, "activate", G_CALLBACK(open_props_cb), win);
+ g_signal_connect(b_copy_magnetlink, "activate", G_CALLBACK(copy_magnetlink_cb), win);
g_signal_connect(b_quit, "activate", G_CALLBACK(quit_cb), win);
gtk_window_add_accel_group(GTK_WINDOW(win), accel_group);
@@ -2224,6 +2240,9 @@ trg_torrent_tv_view_menu(GtkWidget * treeview,
trg_imagemenuitem_new(GTK_MENU_SHELL(menu), _("Properties"),
GTK_STOCK_PROPERTIES, TRUE,
G_CALLBACK(open_props_cb), win);
+ trg_imagemenuitem_new(GTK_MENU_SHELL(menu), _("Copy Magnet Link"),
+ GTK_STOCK_COPY, TRUE,
+ G_CALLBACK(copy_magnetlink_cb), win);
trg_imagemenuitem_new(GTK_MENU_SHELL(menu), _("Resume"),
GTK_STOCK_MEDIA_PLAY, TRUE,
G_CALLBACK(resume_cb), win);
diff --git a/src/trg-menu-bar.c b/src/trg-menu-bar.c
index faf3548..624f86f 100644
--- a/src/trg-menu-bar.c
+++ b/src/trg-menu-bar.c
@@ -48,6 +48,7 @@ enum {
PROP_VERIFY_BUTTON,
PROP_REANNOUNCE_BUTTON,
PROP_PROPS_BUTTON,
+ PROP_COPYMAGNET_BUTTON,
PROP_MOVE_BUTTON,
PROP_REMOTE_PREFS_BUTTON,
PROP_LOCAL_PREFS_BUTTON,
@@ -99,6 +100,7 @@ struct _TrgMenuBarPrivate {
GtkWidget *mb_verify;
GtkWidget *mb_reannounce;
GtkWidget *mb_props;
+ GtkWidget *mb_copy_magnetlink;
GtkWidget *mb_local_prefs;
GtkWidget *mb_remote_prefs;
GtkWidget *mb_view_states;
@@ -165,6 +167,7 @@ trg_menu_bar_torrent_actions_sensitive(TrgMenuBar * mb, gboolean sensitive)
TrgMenuBarPrivate *priv = TRG_MENU_BAR_GET_PRIVATE(mb);
gtk_widget_set_sensitive(priv->mb_props, sensitive);
+ gtk_widget_set_sensitive(priv->mb_copy_magnetlink, sensitive);
gtk_widget_set_sensitive(priv->mb_remove, sensitive);
gtk_widget_set_sensitive(priv->mb_delete, sensitive);
gtk_widget_set_sensitive(priv->mb_resume, sensitive);
@@ -265,6 +268,9 @@ trg_menu_bar_get_property(GObject * object, guint property_id,
case PROP_PROPS_BUTTON:
g_value_set_object(value, priv->mb_props);
break;
+ case PROP_COPYMAGNET_BUTTON:
+ g_value_set_object(value, priv->mb_copy_magnetlink);
+ break;
case PROP_REMOTE_PREFS_BUTTON:
g_value_set_object(value, priv->mb_remote_prefs);
break;
@@ -693,6 +699,8 @@ static GtkWidget *trg_menu_bar_file_file_menu_new(TrgMenuBar * menu)
priv->mb_quit =
trg_menu_bar_item_new(GTK_MENU_SHELL(fileMenu), _("_Quit"),
GTK_STOCK_QUIT, TRUE);
+ trg_menu_bar_accel_add(menu, priv->mb_quit, GDK_q,
+ GDK_CONTROL_MASK);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), fileMenu);
@@ -713,6 +721,11 @@ static GtkWidget *trg_menu_bar_torrent_menu_new(TrgMenuBar * menu)
FALSE);
trg_menu_bar_accel_add(menu, priv->mb_props, GDK_i, GDK_CONTROL_MASK);
+ priv->mb_copy_magnetlink =
+ trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("_Copy Magnet Link"),
+ GTK_STOCK_COPY, FALSE);
+ trg_menu_bar_accel_add(menu, priv->mb_copy_magnetlink, GDK_c, GDK_CONTROL_MASK);
+
priv->mb_resume =
trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("_Resume"),
GTK_STOCK_MEDIA_PLAY, FALSE);
@@ -904,6 +917,8 @@ static void trg_menu_bar_class_init(TrgMenuBarClass * klass)
"pause-button", "Pause Button");
trg_menu_bar_install_widget_prop(object_class, PROP_PROPS_BUTTON,
"props-button", "Props Button");
+ trg_menu_bar_install_widget_prop(object_class, PROP_COPYMAGNET_BUTTON,
+ "copymagnet-button", "Copy-magnet Button");
trg_menu_bar_install_widget_prop(object_class, PROP_ABOUT_BUTTON,
"about-button", "About Button");
trg_menu_bar_install_widget_prop(object_class, PROP_VIEW_STATS_BUTTON,
diff --git a/src/trg-remote-prefs-dialog.c b/src/trg-remote-prefs-dialog.c
index 3fcd910..a4747ea 100644
--- a/src/trg-remote-prefs-dialog.c
+++ b/src/trg-remote-prefs-dialog.c
@@ -26,6 +26,9 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include <json-glib/json-glib.h>
+#ifdef ENABLE_NL_LANGINFO
+#include <langinfo.h>
+#endif
#include "trg-main-window.h"
#include "trg-remote-prefs-dialog.h"
@@ -180,13 +183,13 @@ trg_rprefs_time_widget_savefunc(GtkWidget * w, JsonObject * obj,
{
GtkWidget *hourSpin = g_object_get_data(G_OBJECT(w), "hours-spin");
GtkWidget *minutesSpin = g_object_get_data(G_OBJECT(w), "mins-spin");
- gdouble hoursValue =
- gtk_spin_button_get_value(GTK_SPIN_BUTTON(hourSpin));
- gdouble minutesValue =
- gtk_spin_button_get_value(GTK_SPIN_BUTTON(minutesSpin));
+ gint hoursValue =
+ gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(hourSpin));
+ gint minutesValue =
+ gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(minutesSpin));
json_object_set_int_member(obj, key,
- (gint64) ((hoursValue * 60.0) +
+ (gint64) ((hoursValue * 60) +
minutesValue));
}
@@ -279,8 +282,8 @@ static GtkWidget *trg_rprefs_alt_speed_spin_new(GList ** wl,
GtkWidget * alt_check,
GtkWidget * alt_time_check)
{
- GtkWidget *w = trg_json_widget_spin_new(wl, obj, key,
- NULL, 0, INT_MAX, 5);
+ GtkWidget *w = trg_json_widget_spin_int_new(wl, obj, key,
+ NULL, 0, INT_MAX, 5);
gtk_widget_set_sensitive(w,
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
(alt_check))
@@ -296,6 +299,63 @@ static GtkWidget *trg_rprefs_alt_speed_spin_new(GList ** wl,
return w;
}
+static void
+trg_rprefs_alt_days_savefunc(GtkWidget * grid, JsonObject * obj,
+ gchar * key)
+{
+ guint64 days = 0;
+
+ for(gint i = 0, x = 1; i < 7; i++, x<<=1) {
+ GtkWidget *w = gtk_grid_get_child_at (GTK_GRID(grid), i, 0);
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
+ days += x;
+ }
+
+ json_object_set_int_member(obj, key, days);
+}
+
+static GtkWidget *trg_rprefs_alt_days(GList ** wl,
+ JsonObject * Obj,
+ const gchar * key,
+ GtkWidget *alt_time_check)
+{
+ gchar *abdays_fallback[] = {_("Sun"), _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat")};
+#ifdef ENABLE_NL_LANGINFO
+ nl_item abdays[] = {ABDAY_1, ABDAY_2, ABDAY_3, ABDAY_4, ABDAY_5, ABDAY_6, ABDAY_7};
+#endif
+ GtkWidget *grid = gtk_grid_new();
+ gtk_grid_set_column_homogeneous (GTK_GRID(grid), TRUE);
+ g_signal_connect(G_OBJECT(alt_time_check), "toggled",
+ G_CALLBACK(toggle_active_arg_is_sensitive), grid);
+
+ guint64 days = json_object_get_int_member(Obj, key);
+
+ for(gint i = 0, x = 1; i < 7; i++, x<<=1) {
+#ifdef ENABLE_NL_LANGINFO
+ gchar *utf8 = g_convert_with_fallback(nl_langinfo(abdays[i]), -1, "utf-8",
+ nl_langinfo(CODESET), NULL, NULL,
+ NULL, NULL);
+ GtkWidget *w = gtk_check_button_new_with_label (utf8 ? utf8 : abdays_fallback[i]);
+ g_free(utf8);
+#else
+ GtkWidget *w = gtk_check_button_new_with_label (abdays_fallback[i]);
+#endif
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), (days & x) == x);
+ gtk_grid_attach(GTK_GRID(grid), w, i, 0, 1, 1);
+ }
+
+ gtk_widget_set_sensitive(grid,
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alt_time_check)));
+
+ trg_json_widget_desc *wd = g_new0(trg_json_widget_desc, 1);
+ wd->key = g_strdup(key);
+ wd->widget = grid;
+ wd->saveFunc = trg_rprefs_alt_days_savefunc;
+ *wl = g_list_append(*wl, wd);
+
+ return grid;
+}
+
static GtkWidget *trg_rprefs_bandwidthPage(TrgRemotePrefsDialog * win,
JsonObject * json)
{
@@ -311,15 +371,15 @@ static GtkWidget *trg_rprefs_bandwidthPage(TrgRemotePrefsDialog * win,
tb = trg_json_widget_check_new(&priv->widgets, json,
SGET_SPEED_LIMIT_DOWN_ENABLED,
_("Down Limit (KiB/s)"), NULL);
- w = trg_json_widget_spin_new(&priv->widgets, json,
- SGET_SPEED_LIMIT_DOWN, tb, 0, INT_MAX, 5);
+ w = trg_json_widget_spin_int_new(&priv->widgets, json,
+ SGET_SPEED_LIMIT_DOWN, tb, 0, INT_MAX, 5);
hig_workarea_add_row_w(t, &row, tb, w, NULL);
tb = trg_json_widget_check_new(&priv->widgets, json,
SGET_SPEED_LIMIT_UP_ENABLED,
_("Up Limit (KiB/s)"), NULL);
- w = trg_json_widget_spin_new(&priv->widgets, json, SGET_SPEED_LIMIT_UP,
- tb, 0, INT_MAX, 5);
+ w = trg_json_widget_spin_int_new(&priv->widgets, json, SGET_SPEED_LIMIT_UP,
+ tb, 0, INT_MAX, 5);
hig_workarea_add_row_w(t, &row, tb, w, NULL);
hig_workarea_add_section_title(t, &row, _("Alternate limits"));
@@ -338,6 +398,10 @@ static GtkWidget *trg_rprefs_bandwidthPage(TrgRemotePrefsDialog * win,
w = trg_rprefs_time_begin_end_new(&priv->widgets, json, tb);
hig_workarea_add_row_w(t, &row, tb, w, NULL);
+ w = trg_rprefs_alt_days(&priv->widgets, json,
+ SGET_ALT_SPEED_TIME_DAY, priv->alt_time_check);
+ hig_workarea_add_row(t, &row, _("Alternate days"), w, NULL);
+
w = trg_rprefs_alt_speed_spin_new(&priv->widgets, json,
SGET_ALT_SPEED_DOWN, priv->alt_check,
tb);
@@ -366,9 +430,9 @@ static GtkWidget *trg_rprefs_limitsPage(TrgRemotePrefsDialog * win,
tb = trg_json_widget_check_new(&priv->widgets, json,
SGET_SEED_RATIO_LIMITED,
_("Seed ratio limit"), NULL);
- w = trg_json_widget_spin_new(&priv->widgets, json,
- SGET_SEED_RATIO_LIMIT, tb, 0, INT_MAX,
- 0.1);
+ w = trg_json_widget_spin_double_new(&priv->widgets, json,
+ SGET_SEED_RATIO_LIMIT, tb,
+ 0, INT_MAX, 0.1);
hig_workarea_add_row_w(t, &row, tb, w, NULL);
if (json_object_has_member(json, SGET_DOWNLOAD_QUEUE_ENABLED)) {
@@ -377,39 +441,39 @@ static GtkWidget *trg_rprefs_limitsPage(TrgRemotePrefsDialog * win,
tb = trg_json_widget_check_new(&priv->widgets, json,
SGET_DOWNLOAD_QUEUE_ENABLED,
_("Download queue size"), NULL);
- w = trg_json_widget_spin_new(&priv->widgets, json,
- SGET_DOWNLOAD_QUEUE_SIZE, tb, 0,
- INT_MAX, 1);
+ w = trg_json_widget_spin_int_new(&priv->widgets, json,
+ SGET_DOWNLOAD_QUEUE_SIZE, tb, 0,
+ INT_MAX, 1);
hig_workarea_add_row_w(t, &row, tb, w, NULL);
tb = trg_json_widget_check_new(&priv->widgets, json,
SGET_SEED_QUEUE_ENABLED,
_("Seed queue size"), NULL);
- w = trg_json_widget_spin_new(&priv->widgets, json,
- SGET_SEED_QUEUE_SIZE, tb, 0, INT_MAX,
- 1);
+ w = trg_json_widget_spin_int_new(&priv->widgets, json,
+ SGET_SEED_QUEUE_SIZE, tb, 0,
+ INT_MAX, 1);
hig_workarea_add_row_w(t, &row, tb, w, NULL);
tb = trg_json_widget_check_new(&priv->widgets, json,
SGET_QUEUE_STALLED_ENABLED,
_("Ignore stalled (minutes)"),
NULL);
- w = trg_json_widget_spin_new(&priv->widgets, json,
- SGET_QUEUE_STALLED_MINUTES, tb, 0,
- INT_MAX, 1);
+ w = trg_json_widget_spin_int_new(&priv->widgets, json,
+ SGET_QUEUE_STALLED_MINUTES, tb,
+ 0, INT_MAX, 1);
hig_workarea_add_row_w(t, &row, tb, w, NULL);
}
hig_workarea_add_section_title(t, &row, _("Peers"));
- w = trg_json_widget_spin_new(&priv->widgets, json,
- SGET_PEER_LIMIT_GLOBAL, NULL, 0, INT_MAX,
- 5);
+ w = trg_json_widget_spin_int_new(&priv->widgets, json,
+ SGET_PEER_LIMIT_GLOBAL, NULL, 0,
+ INT_MAX, 5);
hig_workarea_add_row(t, &row, _("Global peer limit"), w, w);
- w = trg_json_widget_spin_new(&priv->widgets, json,
- SGET_PEER_LIMIT_PER_TORRENT, NULL, 0,
- INT_MAX, 5);
+ w = trg_json_widget_spin_int_new(&priv->widgets, json,
+ SGET_PEER_LIMIT_PER_TORRENT, NULL,
+ 0, INT_MAX, 5);
hig_workarea_add_row(t, &row, _("Per torrent peer limit"), w, w);
return t;
@@ -519,8 +583,8 @@ static GtkWidget *trg_rprefs_connPage(TrgRemotePrefsDialog * win,
hig_workarea_add_section_title(t, &row, _("Connections"));
- w = trg_json_widget_spin_new(&priv->widgets, s, SGET_PEER_PORT, NULL,
- 0, 65535, 1);
+ w = trg_json_widget_spin_int_new(&priv->widgets, s, SGET_PEER_PORT,
+ NULL, 0, 65535, 1);
hig_workarea_add_row(t, &row, _("Peer port"), w, w);
priv->port_test_label = gtk_label_new(_("Port test"));
@@ -627,8 +691,8 @@ static GtkWidget *trg_rprefs_generalPage(TrgRemotePrefsDialog * win,
cache_size_mb = session_get_cache_size_mb(s);
if (cache_size_mb >= 0) {
- w = trg_json_widget_spin_new(&priv->widgets, s, SGET_CACHE_SIZE_MB,
- NULL, 0, INT_MAX, 1);
+ w = trg_json_widget_spin_int_new(&priv->widgets, s, SGET_CACHE_SIZE_MB,
+ NULL, 0, INT_MAX, 1);
hig_workarea_add_row(t, &row, _("Cache size (MiB)"), w, w);
}
diff --git a/src/trg-torrent-props-dialog.c b/src/trg-torrent-props-dialog.c
index ae75146..5192fda 100644
--- a/src/trg-torrent-props-dialog.c
+++ b/src/trg-torrent-props-dialog.c
@@ -422,9 +422,9 @@ static GtkWidget *trg_props_limits_page_new(TrgTorrentPropsDialog * win,
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_int_new(&priv->widgets, json,
+ FIELD_QUEUE_POSITION, NULL, 0,
+ INT_MAX, 1);
hig_workarea_add_row(t, &row, _("Queue Position:"), w, w);
}
@@ -432,15 +432,15 @@ static GtkWidget *trg_props_limits_page_new(TrgTorrentPropsDialog * win,
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);
+ w = trg_json_widget_spin_int_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);
+ w = trg_json_widget_spin_int_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"));
@@ -453,9 +453,9 @@ static GtkWidget *trg_props_limits_page_new(TrgTorrentPropsDialog * win,
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_double_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);
@@ -463,8 +463,8 @@ static GtkWidget *trg_props_limits_page_new(TrgTorrentPropsDialog * win,
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_int_new(&priv->widgets, json, FIELD_PEER_LIMIT,
+ NULL, 0, INT_MAX, 5);
hig_workarea_add_row(t, &row, _("Peer limit:"), w, w);
return t;