diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2011-09-12 20:50:04 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2011-09-12 20:50:04 +0000 |
commit | 11b31dcf6259dc79172134737aa1540f3f93e7ab (patch) | |
tree | 1e972dcd0e479bf7f3df7af860437af60c78c496 | |
parent | 12c9db45149b9bbd926913bb0db2769cacca5e35 (diff) |
issue 94 - option to do full update after every n recently only updates
-rw-r--r-- | src/trg-main-window.c | 28 | ||||
-rw-r--r-- | src/trg-preferences-dialog.c | 75 | ||||
-rw-r--r-- | src/trg-prefs.c | 3 | ||||
-rw-r--r-- | src/trg-prefs.h | 5 |
4 files changed, 75 insertions, 36 deletions
diff --git a/src/trg-main-window.c b/src/trg-main-window.c index d9a351a..730b8c4 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -557,8 +557,7 @@ static void up_queue_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { static void top_queue_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async( - priv->client, + dispatch_async(priv->client, torrent_queue_move_top(build_json_id_array(priv->torrentTreeView)), on_generic_interactive_action, data); } @@ -568,7 +567,8 @@ static void bottom_queue_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { dispatch_async( priv->client, - torrent_queue_move_bottom(build_json_id_array(priv->torrentTreeView)), + torrent_queue_move_bottom( + build_json_id_array(priv->torrentTreeView)), on_generic_interactive_action, data); } @@ -936,13 +936,19 @@ static void on_torrent_get_update(JsonObject * response, int status, static gboolean trg_update_torrents_timerfunc(gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); TrgClient *tc = priv->client; + TrgPrefs *prefs = trg_client_get_prefs(tc); if (trg_client_is_connected(tc)) { - dispatch_async( - tc, - torrent_get(trg_client_get_activeonlyupdate(tc) ? -2 : -1), - trg_client_get_activeonlyupdate(tc) ? on_torrent_get_active - : on_torrent_get_update, data); + gboolean activeOnly = trg_client_get_activeonlyupdate(tc) + && (!trg_prefs_get_bool(prefs, + TRG_PREFS_ACTIVEONLY_FULLSYNC_ENABLED, + TRG_PREFS_PROFILE) || (trg_client_get_serial(tc) + % trg_prefs_get_int(prefs, + TRG_PREFS_ACTIVEONLY_FULLSYNC_EVERY, + TRG_PREFS_PROFILE) != 0)); + dispatch_async(tc, torrent_get(activeOnly ? -2 : -1), + activeOnly ? on_torrent_get_active : on_torrent_get_update, + data); if (trg_client_get_serial(tc) % SESSION_UPDATE_DIVISOR == 0) dispatch_async(priv->client, session_get(), on_session_get, data); @@ -1472,8 +1478,7 @@ static void trg_torrent_tv_view_menu(GtkWidget * treeview, trg_imagemenuitem_new(GTK_MENU_SHELL(menu), _("Remove & Delete"), GTK_STOCK_DELETE, TRUE, G_CALLBACK(delete_cb), data); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), - gtk_separator_menu_item_new()); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); if (priv->queuesEnabled) { trg_imagemenuitem_new(GTK_MENU_SHELL(menu), _("Start Now"), @@ -1702,7 +1707,8 @@ static void trg_client_session_updated_cb(TrgClient *tc, JsonObject *session, if (priv->queuesEnabled != queuesEnabled) { trg_menu_bar_set_supports_queues(priv->menuBar, queuesEnabled); - trg_state_selector_set_queues_enabled(priv->stateSelector, queuesEnabled); + trg_state_selector_set_queues_enabled(priv->stateSelector, + queuesEnabled); } priv->queuesEnabled = queuesEnabled; diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c index 612e0e8..ab80101 100644 --- a/src/trg-preferences-dialog.c +++ b/src/trg-preferences-dialog.c @@ -51,6 +51,7 @@ struct _TrgPreferencesDialogPrivate { GtkWidget *profileDelButton; GtkWidget *profileComboBox; GtkWidget *profileNameEntry; + GtkWidget *fullUpdateCheck; GList *widgets; }; @@ -206,13 +207,13 @@ static void check_save(TrgPrefs *prefs, void *wdp) { wd->flags); } -static void trgp_toggle_dependent(GtkToggleButton *b, gpointer data) -{ +static void trgp_toggle_dependent(GtkToggleButton *b, gpointer data) { gtk_widget_set_sensitive(GTK_WIDGET(data), gtk_toggle_button_get_active(b)); } static GtkWidget *trgp_check_new(TrgPreferencesDialog *dlg, - const char *mnemonic, gchar *key, int flags, GtkToggleButton *dependency) { + const char *mnemonic, gchar *key, int flags, + GtkToggleButton *dependency) { TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg); GtkWidget *w = gtk_check_button_new_with_mnemonic(mnemonic); @@ -222,8 +223,7 @@ static GtkWidget *trgp_check_new(TrgPreferencesDialog *dlg, wd->refreshFunc = &check_refresh; check_refresh(priv->prefs, wd); - if (dependency) - { + if (dependency) { g_signal_connect(dependency, "toggled", G_CALLBACK(trgp_toggle_dependent), w); gtk_widget_set_sensitive(w, gtk_toggle_button_get_active(dependency)); @@ -250,7 +250,7 @@ static void spin_save(TrgPrefs * prefs, void* wdp) { } static GtkWidget *trgp_spin_new(TrgPreferencesDialog *dlg, gchar * key, - int low, int high, int step, int flags) { + int low, int high, int step, int flags, GtkToggleButton *dependency) { TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg); GtkWidget *w; @@ -262,6 +262,12 @@ static GtkWidget *trgp_spin_new(TrgPreferencesDialog *dlg, gchar * key, wd->saveFunc = &spin_save; wd->refreshFunc = &spin_refresh; + if (dependency) { + g_signal_connect(dependency, "toggled", + G_CALLBACK(trgp_toggle_dependent), w); + gtk_widget_set_sensitive(w, gtk_toggle_button_get_active(dependency)); + } + spin_refresh(priv->prefs, wd); priv->widgets = g_list_append(priv->widgets, wd); @@ -278,7 +284,6 @@ static void mininterval_changed_cb(GtkWidget * w, gpointer data) { gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(w))); } - static void toggle_filter_trackers(GtkToggleButton * w, gpointer win) { TrgStateSelector *selector = trg_main_window_get_state_selector( TRG_MAIN_WINDOW(win)); @@ -307,13 +312,16 @@ static void menu_bar_toggle_filter_dirs(GtkToggleButton * w, gpointer win) { } static void view_states_toggled_cb(GtkToggleButton * w, gpointer data) { - GtkWidget *scroll = gtk_widget_get_parent(GTK_WIDGET(trg_main_window_get_state_selector(TRG_MAIN_WINDOW(data)))); - trg_widget_set_visible(scroll, - gtk_toggle_button_get_active(w)); + GtkWidget + *scroll = + gtk_widget_get_parent( + GTK_WIDGET(trg_main_window_get_state_selector(TRG_MAIN_WINDOW(data)))); + trg_widget_set_visible(scroll, gtk_toggle_button_get_active(w)); } static void notebook_toggled_cb(GtkToggleButton *b, gpointer data) { - trg_main_window_notebook_set_visible(TRG_MAIN_WINDOW(data), gtk_toggle_button_get_active(b)); + trg_main_window_notebook_set_visible(TRG_MAIN_WINDOW(data), + gtk_toggle_button_get_active(b)); } static GtkWidget *trg_prefs_desktopPage(TrgPreferencesDialog *dlg) { @@ -339,7 +347,8 @@ static GtkWidget *trg_prefs_desktopPage(TrgPreferencesDialog *dlg) { hig_workarea_add_wide_control(t, &row, w); w = trgp_check_new(dlg, _("Tracker filters"), - TRG_PREFS_KEY_FILTER_TRACKERS, TRG_PREFS_GLOBAL, GTK_TOGGLE_BUTTON(dep)); + TRG_PREFS_KEY_FILTER_TRACKERS, TRG_PREFS_GLOBAL, + GTK_TOGGLE_BUTTON(dep)); g_signal_connect(G_OBJECT(w), "toggled", G_CALLBACK(toggle_filter_trackers), priv->win); hig_workarea_add_wide_control(t, &row, w); @@ -532,12 +541,22 @@ static void add_profile_cb(GtkWidget *w, gpointer data) { gtk_combo_box_set_active_iter(combo, &iter); } +static void trgp_double_special_dependent(GtkWidget *widget, gpointer data) { + TrgPreferencesDialogPrivate *priv = + TRG_PREFERENCES_DIALOG_GET_PRIVATE(gtk_widget_get_toplevel(widget)); + gtk_widget_set_sensitive( + GTK_WIDGET(data), + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) + && gtk_widget_get_sensitive(priv->fullUpdateCheck) + && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->fullUpdateCheck))); +} + static GtkWidget *trg_prefs_serverPage(TrgPreferencesDialog *dlg) { TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg); TrgClient *tc = priv->client; TrgPrefs *prefs = priv->prefs; - GtkWidget *w, *t, *frame, *frameHbox, *profileLabel; + GtkWidget *w, *t, *frame, *frameHbox, *profileLabel, *activeOnly; GtkWidget *profileButtonsHbox; gint row = 0; @@ -583,7 +602,8 @@ static GtkWidget *trg_prefs_serverPage(TrgPreferencesDialog *dlg) { w = trgp_entry_new(dlg, TRG_PREFS_KEY_HOSTNAME, TRG_PREFS_PROFILE); hig_workarea_add_row(t, &row, _("Host:"), w, NULL); - w = trgp_spin_new(dlg, TRG_PREFS_KEY_PORT, 1, 65535, 1, TRG_PREFS_PROFILE); + w = trgp_spin_new(dlg, TRG_PREFS_KEY_PORT, 1, 65535, 1, TRG_PREFS_PROFILE, + NULL); hig_workarea_add_row(t, &row, _("Port:"), w, NULL); w = trgp_entry_new(dlg, TRG_PREFS_KEY_USERNAME, TRG_PREFS_PROFILE); @@ -593,14 +613,14 @@ static GtkWidget *trg_prefs_serverPage(TrgPreferencesDialog *dlg) { gtk_entry_set_visibility(GTK_ENTRY(w), FALSE); hig_workarea_add_row(t, &row, _("Password:"), w, NULL); - w = trgp_spin_new(dlg, TRG_PREFS_KEY_UPDATE_INTERVAL, 1, 60, 1, - TRG_PREFS_PROFILE); + w = trgp_spin_new(dlg, TRG_PREFS_KEY_UPDATE_INTERVAL, 1, INT_MAX, 1, + TRG_PREFS_PROFILE, NULL); g_signal_connect(w, "value-changed", G_CALLBACK(interval_changed_cb), tc); hig_workarea_add_row(t, &row, _("Update interval:"), w, NULL); - w = trgp_spin_new(dlg, TRG_PREFS_KEY_MINUPDATE_INTERVAL, 1, 240, 1, - TRG_PREFS_PROFILE); + w = trgp_spin_new(dlg, TRG_PREFS_KEY_MINUPDATE_INTERVAL, 1, INT_MAX, 1, + TRG_PREFS_PROFILE, NULL); g_signal_connect(w, "value-changed", G_CALLBACK(mininterval_changed_cb), tc); hig_workarea_add_row(t, &row, _("Minimised update interval:"), w, NULL); @@ -609,15 +629,27 @@ static GtkWidget *trg_prefs_serverPage(TrgPreferencesDialog *dlg) { TRG_PREFS_KEY_AUTO_CONNECT, TRG_PREFS_PROFILE, NULL); hig_workarea_add_wide_control(t, &row, w); - w = trgp_check_new(dlg, _("SSL"), TRG_PREFS_KEY_SSL, TRG_PREFS_PROFILE, NULL); + w = trgp_check_new(dlg, _("SSL"), TRG_PREFS_KEY_SSL, TRG_PREFS_PROFILE, + NULL); hig_workarea_add_wide_control(t, &row, w); - w = trgp_check_new(dlg, _("Update active torrents only"), + activeOnly = w = trgp_check_new(dlg, _("Update active torrents only"), TRG_PREFS_KEY_UPDATE_ACTIVE_ONLY, TRG_PREFS_PROFILE, NULL); g_signal_connect(w, "toggled", G_CALLBACK(update_activeonly_cb), tc); hig_workarea_add_wide_control(t, &row, w); + priv->fullUpdateCheck = trgp_check_new(dlg, + _("Full update every (?) updates"), + TRG_PREFS_ACTIVEONLY_FULLSYNC_ENABLED, TRG_PREFS_PROFILE, + GTK_TOGGLE_BUTTON(activeOnly)); + w = trgp_spin_new(dlg, TRG_PREFS_ACTIVEONLY_FULLSYNC_EVERY, 2, INT_MAX, 1, + TRG_PREFS_PROFILE, GTK_TOGGLE_BUTTON(priv->fullUpdateCheck)); + g_signal_connect(activeOnly, "toggled", + G_CALLBACK(trgp_double_special_dependent), w); + + hig_workarea_add_row_w(t, &row, priv->fullUpdateCheck, w, NULL); + hig_workarea_add_section_divider(t, &row); frame = gtk_frame_new(NULL); @@ -719,10 +751,9 @@ static void trg_preferences_dialog_class_init(TrgPreferencesDialogClass * class) GtkWidget *trg_preferences_dialog_get_instance(TrgMainWindow * win, TrgClient * client) { - if (instance == NULL) { + if (!instance) instance = g_object_new(TRG_TYPE_PREFERENCES_DIALOG, "main-window", win, "trg-client", client, NULL); - } return GTK_WIDGET(instance); } diff --git a/src/trg-prefs.c b/src/trg-prefs.c index 32315cd..4e7a23e 100644 --- a/src/trg-prefs.c +++ b/src/trg-prefs.c @@ -84,6 +84,7 @@ static void trg_prefs_create_defaults(TrgPrefs *p) { trg_prefs_add_default_int(p, TRG_PREFS_KEY_PORT, 9091); trg_prefs_add_default_int(p, TRG_PREFS_KEY_UPDATE_INTERVAL, TRG_INTERVAL_DEFAULT); trg_prefs_add_default_int(p, TRG_PREFS_KEY_MINUPDATE_INTERVAL, TRG_MININTERVAL_DEFAULT); + trg_prefs_add_default_int(p, TRG_PREFS_ACTIVEONLY_FULLSYNC_EVERY, 2); trg_prefs_add_default_bool_true(p, TRG_PREFS_KEY_FILTER_DIRS); trg_prefs_add_default_bool_true(p, TRG_PREFS_KEY_FILTER_TRACKERS); @@ -207,7 +208,7 @@ gchar *trg_prefs_get_string(TrgPrefs *p, gchar *key, int flags) { return NULL; } -int trg_prefs_get_int(TrgPrefs *p, gchar *key, int flags) { +gint64 trg_prefs_get_int(TrgPrefs *p, gchar *key, int flags) { JsonNode *node = trg_prefs_get_value(p, key, flags); if (node) return json_node_get_int(node); diff --git a/src/trg-prefs.h b/src/trg-prefs.h index b76e8cb..bc3f475 100644 --- a/src/trg-prefs.h +++ b/src/trg-prefs.h @@ -59,7 +59,8 @@ #define TRG_PREFS_KEY_UPDATE_ACTIVE_ONLY "update-active-only" #define TRG_PREFS_KEY_DELETE_LOCAL_TORRENT "delete-local-torrent" #define TRG_PREFS_STATE_SELECTOR_LAST "state-selector-last" - +#define TRG_PREFS_ACTIVEONLY_FULLSYNC_ENABLED "activeonly-fullsync-enabled" +#define TRG_PREFS_ACTIVEONLY_FULLSYNC_EVERY "activeonly-fullsync-every" #define TRG_PREFS_KEY_TREE_VIEWS "tree-views" #define TRG_PREFS_KEY_TV_SORT_TYPE "sort-type" #define TRG_PREFS_KEY_TV_SORT_COL "sort-col" @@ -110,7 +111,7 @@ void trg_prefs_add_default_bool_true(TrgPrefs *p, gchar *key); JsonNode *trg_prefs_get_value(TrgPrefs *p, gchar *key, int flags); gchar *trg_prefs_get_string(TrgPrefs *p, gchar *key, int flags); -int trg_prefs_get_int(TrgPrefs *p, gchar *key, int flags); +gint64 trg_prefs_get_int(TrgPrefs *p, gchar *key, int flags); gdouble trg_prefs_get_double(TrgPrefs *p, gchar *key, int flags); gboolean trg_prefs_get_bool(TrgPrefs *p, gchar *key, int flags); JsonObject* trg_prefs_get_profile(TrgPrefs *p); |