summaryrefslogtreecommitdiff
path: root/src/trg-preferences-dialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/trg-preferences-dialog.c')
-rw-r--r--src/trg-preferences-dialog.c666
1 files changed, 432 insertions, 234 deletions
diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c
index 0010f71..7b421c9 100644
--- a/src/trg-preferences-dialog.c
+++ b/src/trg-preferences-dialog.c
@@ -24,45 +24,92 @@
#include <glib.h>
#include <glib/gi18n.h>
#include <glib-object.h>
+#include <glib/gprintf.h>
#include <gtk/gtk.h>
-#include <gconf/gconf-client.h>
#include "hig.h"
-#include "trg-preferences-dialog.h"
#include "trg-json-widgets.h"
+#include "trg-preferences-dialog.h"
#include "trg-main-window.h"
-#include "trg-preferences.h"
+#include "trg-prefs.h"
#include "util.h"
#define TRG_PREFERENCES_DIALOG_GET_PRIVATE(object) \
(G_TYPE_INSTANCE_GET_PRIVATE ((object), TRG_TYPE_PREFERENCES_DIALOG, TrgPreferencesDialogPrivate))
G_DEFINE_TYPE(TrgPreferencesDialog, trg_preferences_dialog,
- GTK_TYPE_DIALOG)
+ GTK_TYPE_DIALOG)
enum {
- PROP_0,
- PROP_TRG_CLIENT,
- PROP_MAIN_WINDOW
+ PROP_0, PROP_TRG_CLIENT, PROP_MAIN_WINDOW
};
-#define GCONF_OBJECT_KEY "gconf-key"
-
struct _TrgPreferencesDialogPrivate {
TrgMainWindow *win;
- trg_client *client;
+ TrgClient *client;
+ TrgPrefs *prefs;
+ GtkWidget *profileDelButton;
+ GtkWidget *profileComboBox;
+ GtkWidget *profileNameEntry;
+ GList *widgets;
};
static GObject *instance = NULL;
-static void
-trg_preferences_dialog_set_property(GObject * object,
- guint prop_id,
- const GValue * value,
- GParamSpec * pspec G_GNUC_UNUSED)
-{
+static void trg_pref_widget_desc_free(trg_pref_widget_desc *wd) {
+ if (wd->key)
+ g_free(wd->key);
+ g_free(wd);
+}
+
+static trg_pref_widget_desc* trg_pref_widget_desc_new(GtkWidget *w, gchar *key,
+ int flags) {
+ trg_pref_widget_desc *desc = g_new0(trg_pref_widget_desc, 1);
+ desc->widget = w;
+ desc->key = g_strdup(key);
+ desc->flags = flags;
+ return desc;
+}
+
+static void trg_pref_widget_refresh(TrgPreferencesDialog *dlg,
+ trg_pref_widget_desc* wd) {
+ TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg);
+
+ wd->refreshFunc(priv->prefs, wd);
+}
+
+static void trg_pref_widget_refresh_all(TrgPreferencesDialog *dlg) {
+ TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg);
+
+ GList *li;
+ for (li = priv->widgets; li; li = g_list_next(li))
+ trg_pref_widget_refresh(dlg, (trg_pref_widget_desc*) li->data);
+}
+
+static void trg_pref_widget_save(TrgPreferencesDialog *dlg,
+ trg_pref_widget_desc* wd) {
+ TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg);
+
+ wd->saveFunc(priv->prefs, wd);
+}
+
+static void trg_pref_widget_save_all(TrgPreferencesDialog *dlg) {
+ TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg);
+
+ if (trg_prefs_get_profile_id(priv->prefs) < 0)
+ return;
+
+ GList *li;
+ for (li = priv->widgets; li; li = g_list_next(li)) {
+ trg_pref_widget_desc* wd = (trg_pref_widget_desc*) li->data;
+ trg_pref_widget_save(dlg, wd);
+ }
+}
+
+static void trg_preferences_dialog_set_property(GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec G_GNUC_UNUSED) {
TrgPreferencesDialogPrivate *priv =
- TRG_PREFERENCES_DIALOG_GET_PRIVATE(object);
+ TRG_PREFERENCES_DIALOG_GET_PRIVATE(object);
switch (prop_id) {
case PROP_MAIN_WINDOW:
@@ -70,26 +117,32 @@ trg_preferences_dialog_set_property(GObject * object,
break;
case PROP_TRG_CLIENT:
priv->client = g_value_get_pointer(value);
+ priv->prefs = trg_client_get_prefs(priv->client);
break;
}
}
-static void
-trg_preferences_response_cb(GtkDialog * dlg, gint res_id,
- gpointer data G_GNUC_UNUSED)
-{
+static void trg_preferences_response_cb(GtkDialog * dlg, gint res_id,
+ gpointer data G_GNUC_UNUSED) {
+ TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg);
+
+ trg_pref_widget_save_all(TRG_PREFERENCES_DIALOG(dlg));
+
+ trg_prefs_save(priv->prefs);
+
+ GList *li;
+ for (li = priv->widgets; li; li = g_list_next(li))
+ trg_pref_widget_desc_free((trg_pref_widget_desc*) li->data);
+ g_list_free(priv->widgets);
+
gtk_widget_destroy(GTK_WIDGET(dlg));
instance = NULL;
}
-static void
-trg_preferences_dialog_get_property(GObject * object,
- guint prop_id,
- GValue * value,
- GParamSpec * pspec G_GNUC_UNUSED)
-{
+static void trg_preferences_dialog_get_property(GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec G_GNUC_UNUSED) {
TrgPreferencesDialogPrivate *priv =
- TRG_PREFERENCES_DIALOG_GET_PRIVATE(object);
+ TRG_PREFERENCES_DIALOG_GET_PRIVATE(object);
switch (prop_id) {
case PROP_MAIN_WINDOW:
@@ -101,205 +154,205 @@ trg_preferences_dialog_get_property(GObject * object,
}
}
-static void update_activeonly_cb(GtkToggleButton * w, gpointer data)
-{
- trg_client *client = (trg_client *) data;
- client->activeOnlyUpdate = gtk_toggle_button_get_active(w);
+static void update_activeonly_cb(GtkToggleButton * w, gpointer data) {
+ trg_client_set_activeonlyupdate(TRG_CLIENT(data),
+ gtk_toggle_button_get_active(w));
}
-static void toggled_cb(GtkToggleButton * w, gpointer gconf)
-{
- const char *key = g_object_get_data(G_OBJECT(w), GCONF_OBJECT_KEY);
- gboolean flag = gtk_toggle_button_get_active(w);
+static void entry_refresh(TrgPrefs *prefs, void *wdp) {
+ trg_pref_widget_desc *wd = (trg_pref_widget_desc*) wdp;
+ gchar *value = trg_prefs_get_string(prefs, wd->key, wd->flags);
+ if (value) {
+ gtk_entry_set_text(GTK_ENTRY(wd->widget), value);
+ g_free(value);
+ } else {
+ gtk_entry_set_text(GTK_ENTRY(wd->widget), "");
+ }
+}
- gconf_client_set_bool(GCONF_CLIENT(gconf), key, flag, NULL);
+static void entry_save(TrgPrefs *prefs, void *wdp) {
+ trg_pref_widget_desc *wd = (trg_pref_widget_desc*) wdp;
+ trg_prefs_set_string(prefs, wd->key,
+ gtk_entry_get_text(GTK_ENTRY(wd->widget)), wd->flags);
}
-static GtkWidget *new_check_button(GConfClient * gconf,
- const char *mnemonic, const char *key)
-{
- GtkWidget *w = gtk_check_button_new_with_mnemonic(mnemonic);
+static GtkWidget *trgp_entry_new(TrgPreferencesDialog *dlg, gchar *key,
+ int flags) {
+ TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg);
+ GtkWidget *w;
- g_object_set_data_full(G_OBJECT(w), GCONF_OBJECT_KEY,
- g_strdup(key), g_free);
+ w = gtk_entry_new();
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
- gconf_client_get_bool(gconf, key, NULL));
- g_signal_connect(w, "toggled", G_CALLBACK(toggled_cb), gconf);
- return w;
-}
+ trg_pref_widget_desc *wd = trg_pref_widget_desc_new(w, key, flags);
+ wd->saveFunc = &entry_save;
+ wd->refreshFunc = &entry_refresh;
+
+ entry_refresh(priv->prefs, wd);
+ priv->widgets = g_list_append(priv->widgets, wd);
-static void interval_changed_cb(GtkWidget * w, gpointer data)
-{
- trg_client *client = (trg_client *) data;
- client->interval =
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(w));
+ return w;
}
-static void spun_cb_int(GtkWidget * widget, gpointer gconf)
-{
- gchar *key = g_object_get_data(G_OBJECT(widget), GCONF_OBJECT_KEY);
+static void check_refresh(TrgPrefs *prefs, void *wdp) {
+ trg_pref_widget_desc *wd = (trg_pref_widget_desc*) wdp;
+ gboolean value = trg_prefs_get_bool(prefs, wd->key, wd->flags);
- gconf_client_set_int(GCONF_CLIENT(gconf),
- key,
- gtk_spin_button_get_value_as_int
- (GTK_SPIN_BUTTON(widget)), NULL);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wd->widget), value);
}
-static GtkWidget *new_spin_button(GConfClient * gconf,
- const gchar * key,
- int low, int high, int step, int deflt)
-{
- GtkWidget *w;
- gint currentValue;
+static void check_save(TrgPrefs *prefs, void *wdp) {
+ trg_pref_widget_desc *wd = (trg_pref_widget_desc*) wdp;
+ trg_prefs_set_bool(prefs, wd->key,
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wd->widget)),
+ wd->flags);
+}
- w = gtk_spin_button_new_with_range(low, high, step);
- g_object_set_data_full(G_OBJECT(w), GCONF_OBJECT_KEY,
- g_strdup(key), g_free);
+static GtkWidget *trgp_check_new(TrgPreferencesDialog *dlg,
+ const char *mnemonic, gchar *key, int flags) {
+ TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg);
- gtk_spin_button_set_digits(GTK_SPIN_BUTTON(w), 0);
-
- currentValue =
- gconf_client_get_int_or_default(gconf, key, deflt, NULL);
+ GtkWidget *w = gtk_check_button_new_with_mnemonic(mnemonic);
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), currentValue);
+ trg_pref_widget_desc *wd = trg_pref_widget_desc_new(w, key, flags);
+ wd->saveFunc = &check_save;
+ wd->refreshFunc = &check_refresh;
+ check_refresh(priv->prefs, wd);
- g_signal_connect(w, "value-changed", G_CALLBACK(spun_cb_int), gconf);
+ priv->widgets = g_list_append(priv->widgets, wd);
return w;
}
-static void entry_changed_cb(GtkEntry * w, gpointer gconf)
-{
- const char *key, *value;
+static void spin_refresh(TrgPrefs *prefs, void *wdp) {
+ trg_pref_widget_desc *wd = (trg_pref_widget_desc*) wdp;
+ GtkWidget *widget = wd->widget;
- key = g_object_get_data(G_OBJECT(w), GCONF_OBJECT_KEY);
- value = gtk_entry_get_text(w);
+ gint value = trg_prefs_get_int(prefs, wd->key, wd->flags);
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), value);
+}
- gconf_client_set_string(GCONF_CLIENT(gconf), key, value, NULL);
+static void spin_save(TrgPrefs * prefs, void* wdp) {
+ trg_pref_widget_desc *wd = (trg_pref_widget_desc*) wdp;
+ trg_prefs_set_int(prefs, wd->key,
+ gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(wd->widget)),
+ wd->flags);
}
-static GtkWidget *new_entry(GConfClient * gconf, const char *key)
-{
+static GtkWidget *trgp_spin_new(TrgPreferencesDialog *dlg, gchar * key,
+ int low, int high, int step, int flags) {
+ TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg);
GtkWidget *w;
- const char *value;
- w = gtk_entry_new();
- value = gconf_client_get_string(gconf, key, NULL);
+ w = gtk_spin_button_new_with_range(low, high, step);
- if (value != NULL) {
- gtk_entry_set_text(GTK_ENTRY(w), value);
- g_free((gpointer) value);
- }
+ gtk_spin_button_set_digits(GTK_SPIN_BUTTON(w), 0);
- g_object_set_data_full(G_OBJECT(w), GCONF_OBJECT_KEY,
- g_strdup(key), g_free);
+ trg_pref_widget_desc *wd = trg_pref_widget_desc_new(w, key, flags);
+ wd->saveFunc = &spin_save;
+ wd->refreshFunc = &spin_refresh;
+
+ spin_refresh(priv->prefs, wd);
+ priv->widgets = g_list_append(priv->widgets, wd);
- g_signal_connect(w, "changed", G_CALLBACK(entry_changed_cb), gconf);
return w;
}
-static void toggle_filter_trackers(GtkToggleButton * w, gpointer win)
-{
- TrgStateSelector *selector =
- trg_main_window_get_state_selector(TRG_MAIN_WINDOW(win));
+static void interval_changed_cb(GtkWidget * w, gpointer data) {
+ trg_client_set_interval(TRG_CLIENT(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));
trg_state_selector_set_show_trackers(selector,
- gtk_toggle_button_get_active(w));
+ gtk_toggle_button_get_active(w));
}
-static void toggle_filter_dirs(GtkToggleButton * w, gpointer win)
-{
- TrgStateSelector *selector =
- trg_main_window_get_state_selector(TRG_MAIN_WINDOW(win));
- trg_state_selector_set_show_dirs(selector,
- gtk_toggle_button_get_active(w));
+static void toggle_filter_dirs(GtkToggleButton * w, gpointer win) {
+ TrgStateSelector *selector = trg_main_window_get_state_selector(
+ TRG_MAIN_WINDOW(win));
+ trg_state_selector_set_show_dirs(selector, gtk_toggle_button_get_active(w));
}
-static void toggle_graph(GtkToggleButton * w, gpointer win)
-{
+static void toggle_graph(GtkToggleButton * w, gpointer win) {
if (gtk_toggle_button_get_active(w))
trg_main_window_add_graph(TRG_MAIN_WINDOW(win), TRUE);
else
trg_main_window_remove_graph(TRG_MAIN_WINDOW(win));
}
-static void toggle_tray_icon(GtkToggleButton * w, gpointer win)
-{
+static void toggle_tray_icon(GtkToggleButton * w, gpointer win) {
if (gtk_toggle_button_get_active(w))
trg_main_window_add_status_icon(TRG_MAIN_WINDOW(win));
else
trg_main_window_remove_status_icon(TRG_MAIN_WINDOW(win));
}
-static GtkWidget *trg_prefs_desktopPage(trg_client * client,
- TrgMainWindow * win)
-{
+static GtkWidget *trg_prefs_desktopPage(TrgPreferencesDialog *dlg) {
+ TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(dlg);
+
GtkWidget *tray, *w, *t;
gint row = 0;
- GConfClient *gconf = client->gconf;
-
t = hig_workarea_create();
hig_workarea_add_section_title(t, &row, _("Features"));
- w = new_check_button(gconf, _("Directory filters"),
- TRG_GCONF_KEY_FILTER_DIRS);
+ w = trgp_check_new(dlg, _("Directory filters"), TRG_PREFS_KEY_FILTER_DIRS,
+ TRG_PREFS_GLOBAL);
g_signal_connect(G_OBJECT(w), "toggled",
- G_CALLBACK(toggle_filter_dirs), win);
+ G_CALLBACK(toggle_filter_dirs), priv->win);
hig_workarea_add_wide_control(t, &row, w);
- w = new_check_button(gconf, _("Tracker filters"),
- TRG_GCONF_KEY_FILTER_TRACKERS);
+ w = trgp_check_new(dlg, _("Tracker filters"),
+ TRG_PREFS_KEY_FILTER_TRACKERS, TRG_PREFS_GLOBAL);
g_signal_connect(G_OBJECT(w), "toggled",
- G_CALLBACK(toggle_filter_trackers), win);
+ G_CALLBACK(toggle_filter_trackers), priv->win);
hig_workarea_add_wide_control(t, &row, w);
- w = new_check_button(gconf, _("Show graph"), TRG_GCONF_KEY_SHOW_GRAPH);
+ w = trgp_check_new(dlg, _("Show graph"), TRG_PREFS_KEY_SHOW_GRAPH,
+ TRG_PREFS_GLOBAL);
g_signal_connect(G_OBJECT(w), "toggled",
- G_CALLBACK(toggle_graph), win);
+ G_CALLBACK(toggle_graph), priv->win);
hig_workarea_add_wide_control(t, &row, w);
hig_workarea_add_section_title(t, &row, _("System Tray"));
- tray = new_check_button(gconf, _("Show in system tray"),
- TRG_GCONF_KEY_SYSTEM_TRAY);
+ tray = trgp_check_new(dlg, _("Show in system tray"),
+ TRG_PREFS_KEY_SYSTEM_TRAY, TRG_PREFS_GLOBAL);
g_signal_connect(G_OBJECT(tray), "toggled",
- G_CALLBACK(toggle_tray_icon), win);
+ G_CALLBACK(toggle_tray_icon), priv->win);
hig_workarea_add_wide_control(t, &row, tray);
- w = new_check_button(gconf, _("Minimise to system tray"),
- TRG_GCONF_KEY_SYSTEM_TRAY_MINIMISE);
- gtk_widget_set_sensitive(w,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
- (tray)));
+ w = trgp_check_new(dlg, _("Minimise to system tray"),
+ TRG_PREFS_KEY_SYSTEM_TRAY_MINIMISE, TRG_PREFS_GLOBAL);
+ gtk_widget_set_sensitive(w, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
+ (tray)));
g_signal_connect(G_OBJECT(tray), "toggled",
- G_CALLBACK(toggle_active_arg_is_sensitive), w);
+ G_CALLBACK(toggle_active_arg_is_sensitive), w);
hig_workarea_add_wide_control(t, &row, w);
- w = new_check_button(gconf, _("Torrent added notifications"),
- TRG_GCONF_KEY_ADD_NOTIFY);
- gtk_widget_set_sensitive(w,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
- (tray)));
+ w = trgp_check_new(dlg, _("Torrent added notifications"),
+ TRG_PREFS_KEY_ADD_NOTIFY, TRG_PREFS_GLOBAL);
+ gtk_widget_set_sensitive(w, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
+ (tray)));
g_signal_connect(G_OBJECT(tray), "toggled",
- G_CALLBACK(toggle_active_arg_is_sensitive), w);
+ G_CALLBACK(toggle_active_arg_is_sensitive), w);
hig_workarea_add_wide_control(t, &row, w);
- w = new_check_button(gconf, _("Torrent complete notifications"),
- TRG_GCONF_KEY_COMPLETE_NOTIFY);
- gtk_widget_set_sensitive(w,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
- (tray)));
+ w = trgp_check_new(dlg, _("Torrent complete notifications"),
+ TRG_PREFS_KEY_COMPLETE_NOTIFY, TRG_PREFS_GLOBAL);
+ gtk_widget_set_sensitive(w, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
+ (tray)));
g_signal_connect(G_OBJECT(tray), "toggled",
- G_CALLBACK(toggle_active_arg_is_sensitive), w);
+ G_CALLBACK(toggle_active_arg_is_sensitive), w);
hig_workarea_add_wide_control(t, &row, w);
return t;
}
-static GtkWidget *trg_prefs_behaviorPage(trg_client * client)
-{
+static GtkWidget *trg_prefs_behaviorPage(TrgPreferencesDialog * dlg) {
GtkWidget *w, *t;
gint row = 0;
@@ -307,171 +360,316 @@ static GtkWidget *trg_prefs_behaviorPage(trg_client * client)
hig_workarea_add_section_title(t, &row, _("Torrents"));
- w = new_check_button(client->gconf, _("Start paused"),
- TRG_GCONF_KEY_START_PAUSED);
+ w = trgp_check_new(dlg, _("Start paused"), TRG_PREFS_KEY_START_PAUSED,
+ TRG_PREFS_GLOBAL);
hig_workarea_add_wide_control(t, &row, w);
- w = new_check_button(client->gconf, _("Options dialog on add"),
- TRG_GCONF_KEY_ADD_OPTIONS_DIALOG);
+ w = trgp_check_new(dlg, _("Options dialog on add"),
+ TRG_PREFS_KEY_ADD_OPTIONS_DIALOG, TRG_PREFS_GLOBAL);
hig_workarea_add_wide_control(t, &row, w);
return t;
}
-static GtkWidget *trg_prefs_serverPage(trg_client * client)
-{
- GtkWidget *w, *t;
- gint row = 0;
+static void profile_changed_cb(GtkWidget *w, gpointer data) {
+ GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(w));
+ TrgPreferencesDialogPrivate *priv =
+ TRG_PREFERENCES_DIALOG_GET_PRIVATE(data);
+
+ GtkTreeIter iter;
+ gint profile_id;
+
+ trg_pref_widget_save_all(TRG_PREFERENCES_DIALOG(data));
+
+ gint n_children = gtk_tree_model_iter_n_children(model, NULL);
+ if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(w), &iter)) {
+ gtk_tree_model_get(model, &iter, 0, &profile_id, -1);
+ trg_prefs_set_profile(priv->prefs, profile_id);
+ trg_pref_widget_refresh_all(TRG_PREFERENCES_DIALOG(data));
+ gtk_widget_set_sensitive(priv->profileDelButton, n_children > 1);
+ } else {
+ gtk_widget_set_sensitive(priv->profileDelButton, FALSE);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(w), 0);
+ }
+}
+
+static void trg_prefs_profile_combo_populate(TrgPreferencesDialog *dialog,
+ GtkComboBox *combo, TrgPrefs *prefs) {
+ TrgPreferencesDialogPrivate *priv =
+ TRG_PREFERENCES_DIALOG_GET_PRIVATE(dialog);
+
+ gint profile_id = trg_prefs_get_int(prefs, TRG_PREFS_KEY_PROFILE_ID,
+ TRG_PREFS_GLOBAL);
+ GtkListStore *store = GTK_LIST_STORE(gtk_combo_box_get_model(combo));
+ GList *profiles = json_array_get_elements(trg_prefs_get_profiles(prefs));
+ GList *li;
+
+ int i = 0;
+ for (li = profiles; li; li = g_list_next(li)) {
+ JsonObject *profile = json_node_get_object((JsonNode*) li->data);
+ const gchar *name_value;
+ if (json_object_has_member(profile, TRG_PREFS_KEY_PROFILE_NAME)) {
+ name_value = json_object_get_string_member(profile,
+ TRG_PREFS_KEY_PROFILE_NAME);
+ } else {
+ name_value = _(TRG_PROFILE_NAME_DEFAULT);
+ }
+ GtkTreeIter iter;
+ gtk_list_store_insert_with_values(store, &iter, INT_MAX, 0, i, 1,
+ name_value, -1);
+ if (i++ == profile_id)
+ gtk_combo_box_set_active_iter(combo, &iter);
+ }
+
+ gtk_widget_set_sensitive(priv->profileDelButton, g_list_length(profiles) > 1);
+
+
+}
+
+static GtkWidget *trg_prefs_profile_combo_new(TrgClient *tc) {
+ GtkWidget *w;
+ GtkCellRenderer *r;
+ GtkListStore *store = gtk_list_store_new(2, G_TYPE_INT, G_TYPE_STRING);
+
+ w = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
+ r = gtk_cell_renderer_text_new();
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT (w), r, FALSE);
+ gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(w), r, "text", 1);
+
+ return w;
+}
- GConfClient *gconf = client->gconf;
+static void name_changed_cb(GtkWidget *w, gpointer data) {
+ TrgPreferencesDialogPrivate *priv =
+ TRG_PREFERENCES_DIALOG_GET_PRIVATE(data);
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ GtkComboBox *combo;
+
+ combo = GTK_COMBO_BOX(priv->profileComboBox);
+ model = gtk_combo_box_get_model(combo);
+
+ if (gtk_combo_box_get_active_iter(combo, &iter)) {
+ gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1,
+ gtk_entry_get_text(GTK_ENTRY(w)), -1);
+ }
+}
+
+static void del_profile_cb(GtkWidget *w, gpointer data) {
+ GtkWidget *win = gtk_widget_get_toplevel(w);
+ TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(win);
+ TrgPrefs *prefs = priv->prefs;
+ GtkComboBox *combo = GTK_COMBO_BOX(data);
+ GtkTreeModel *profileModel = gtk_combo_box_get_model(combo);
+ GtkTreeIter iter;
+ gint profile_id;
+
+ if (gtk_combo_box_get_active_iter(combo, &iter)) {
+ gtk_tree_model_get(profileModel, &iter, 0, &profile_id, -1);
+ trg_prefs_del_profile(prefs, (guint)profile_id);
+ trg_prefs_set_profile(prefs, -1);
+ gtk_list_store_remove(GTK_LIST_STORE(profileModel), &iter);
+ gtk_combo_box_set_active(combo, 0);
+ }
+}
+
+static void add_profile_cb(GtkWidget *w, gpointer data) {
+ GtkWidget *win = gtk_widget_get_toplevel(w);
+ TrgPreferencesDialogPrivate *priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(win);
+ GtkComboBox *combo = GTK_COMBO_BOX(data);
+ GtkTreeModel *profileModel = gtk_combo_box_get_model(combo);
+ GtkTreeIter iter;
+
+ gint new_id = trg_prefs_new_profile(priv->prefs);
+ gtk_list_store_insert_with_values(GTK_LIST_STORE(profileModel), &iter,
+ INT_MAX, 0, new_id, 1, _(TRG_PROFILE_NAME_DEFAULT), -1);
+ gtk_combo_box_set_active_iter(combo, &iter);
+}
+
+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 *profileButtonsHbox;
+ gint row = 0;
t = hig_workarea_create();
+ /* Profile */
+
+ hig_workarea_add_section_title(t, &row, _("Profile"));
+
+ priv->profileNameEntry = trgp_entry_new(dlg, TRG_PREFS_KEY_PROFILE_NAME,
+ TRG_PREFS_PROFILE);
+
+ w = priv->profileComboBox = trg_prefs_profile_combo_new(priv->client);
+ profileLabel = gtk_label_new(_("Profile: "));
+
+ profileButtonsHbox = gtk_hbox_new(FALSE, 0);
+ w = gtk_button_new_from_stock(GTK_STOCK_ADD);
+ g_signal_connect(w, "clicked", G_CALLBACK(add_profile_cb), priv->profileComboBox);
+ gtk_box_pack_start(GTK_BOX(profileButtonsHbox), w, FALSE, FALSE, 4);
+
+ w = priv->profileDelButton = gtk_button_new_from_stock(GTK_STOCK_DELETE);
+ g_signal_connect(w, "clicked", G_CALLBACK(del_profile_cb), priv->profileComboBox);
+ gtk_widget_set_sensitive(w, FALSE);
+ gtk_box_pack_start(GTK_BOX(profileButtonsHbox), w, FALSE, FALSE, 4);
+
+ trg_prefs_profile_combo_populate(dlg, GTK_COMBO_BOX(priv->profileComboBox),
+ prefs);
+ g_signal_connect(G_OBJECT(priv->profileComboBox), "changed", G_CALLBACK(profile_changed_cb), dlg);
+
+ /* Name */
+
+ g_signal_connect(priv->profileNameEntry, "changed", G_CALLBACK(name_changed_cb), dlg);
+
+ hig_workarea_add_row(t, &row, _("Name:"), priv->profileNameEntry, NULL);
+
+ gtk_table_attach(GTK_TABLE(t), profileButtonsHbox, 1, 2, row, row + 1,
+ GTK_EXPAND | GTK_SHRINK, 0, 0, 0);
+
+ row++;
+
hig_workarea_add_section_title(t, &row, _("Server"));
- w = new_entry(gconf, TRG_GCONF_KEY_HOSTNAME);
+ w = trgp_entry_new(dlg, TRG_PREFS_KEY_HOSTNAME, TRG_PREFS_PROFILE);
hig_workarea_add_row(t, &row, _("Host:"), w, NULL);
- w = new_spin_button(gconf, TRG_GCONF_KEY_PORT, 1, 65535, 1,
- TRG_PORT_DEFAULT);
+ w = trgp_spin_new(dlg, TRG_PREFS_KEY_PORT, 1, 65535, 1, TRG_PREFS_PROFILE);
hig_workarea_add_row(t, &row, _("Port:"), w, NULL);
- w = new_check_button(gconf, _("Automatically connect"),
- TRG_GCONF_KEY_AUTO_CONNECT);
- hig_workarea_add_wide_control(t, &row, w);
+ w = trgp_entry_new(dlg, TRG_PREFS_KEY_USERNAME, TRG_PREFS_PROFILE);
+ hig_workarea_add_row(t, &row, _("Username:"), w, NULL);
- w = new_check_button(gconf, _("SSL"), TRG_GCONF_KEY_SSL);
- hig_workarea_add_wide_control(t, &row, w);
+ w = trgp_entry_new(dlg, TRG_PREFS_KEY_PASSWORD, TRG_PREFS_PROFILE);
+ gtk_entry_set_visibility(GTK_ENTRY(w), FALSE);
+ hig_workarea_add_row(t, &row, _("Password:"), w, NULL);
- w = new_spin_button(gconf, TRG_GCONF_KEY_UPDATE_INTERVAL, 1, 60, 1,
- TRG_INTERVAL_DEFAULT);
+ w = trgp_spin_new(dlg, TRG_PREFS_KEY_UPDATE_INTERVAL, 1, 60, 1,
+ TRG_PREFS_PROFILE);
g_signal_connect(w, "value-changed", G_CALLBACK(interval_changed_cb),
- client);
+ tc);
hig_workarea_add_row(t, &row, _("Update interval:"), w, NULL);
- w = new_check_button(gconf, _("Update active torrents only"),
- TRG_GCONF_KEY_UPDATE_ACTIVE_ONLY);
+ w = trgp_check_new(dlg, _("Automatically connect"),
+ TRG_PREFS_KEY_AUTO_CONNECT, TRG_PREFS_PROFILE);
+ hig_workarea_add_wide_control(t, &row, w);
+
+ w = trgp_check_new(dlg, _("SSL"), TRG_PREFS_KEY_SSL, TRG_PREFS_PROFILE);
+ hig_workarea_add_wide_control(t, &row, w);
+
+ w = trgp_check_new(dlg, _("Update active torrents only"),
+ TRG_PREFS_KEY_UPDATE_ACTIVE_ONLY, TRG_PREFS_PROFILE);
g_signal_connect(w, "toggled", G_CALLBACK(update_activeonly_cb),
- client);
+ tc);
hig_workarea_add_wide_control(t, &row, w);
hig_workarea_add_section_divider(t, &row);
- hig_workarea_add_section_title(t, &row, _("Authentication"));
-
- w = new_entry(gconf, TRG_GCONF_KEY_USERNAME);
- hig_workarea_add_row(t, &row, _("Username:"), w, NULL);
- w = new_entry(gconf, TRG_GCONF_KEY_PASSWORD);
- gtk_entry_set_visibility(GTK_ENTRY(w), FALSE);
- hig_workarea_add_row(t, &row, _("Password:"), w, NULL);
+ frame = gtk_frame_new(NULL);
+ frameHbox = gtk_hbox_new(FALSE, 2);
+ gtk_box_pack_start(GTK_BOX(frameHbox), profileLabel, FALSE, FALSE, 2);
+ gtk_box_pack_start(GTK_BOX(frameHbox), priv->profileComboBox, FALSE, FALSE,
+ 4);
+ gtk_frame_set_label_widget(GTK_FRAME(frame), frameHbox);
+ gtk_container_add(GTK_CONTAINER(frame), t);
- return t;
+ return frame;
}
static GObject *trg_preferences_dialog_constructor(GType type,
- guint
- n_construct_properties,
- GObjectConstructParam *
- construct_params)
-{
+ guint n_construct_properties, GObjectConstructParam * construct_params) {
GObject *object;
TrgPreferencesDialogPrivate *priv;
GtkWidget *notebook;
- object =
- G_OBJECT_CLASS
- (trg_preferences_dialog_parent_class)->constructor(type,
- n_construct_properties,
- construct_params);
+ object = G_OBJECT_CLASS
+ (trg_preferences_dialog_parent_class)->constructor(type,
+ n_construct_properties, construct_params);
priv = TRG_PREFERENCES_DIALOG_GET_PRIVATE(object);
- gtk_window_set_transient_for(GTK_WINDOW(object),
- GTK_WINDOW(priv->win));
+ gtk_window_set_transient_for(GTK_WINDOW(object), GTK_WINDOW(priv->win));
gtk_window_set_destroy_with_parent(GTK_WINDOW(object), TRUE);
- gtk_dialog_add_button(GTK_DIALOG(object), GTK_STOCK_CLOSE,
- GTK_RESPONSE_CLOSE);
+ gtk_dialog_add_button(GTK_DIALOG(object), GTK_STOCK_APPLY,
+ GTK_RESPONSE_APPLY);
- gtk_dialog_set_default_response(GTK_DIALOG(object),
- GTK_RESPONSE_CLOSE);
+ gtk_dialog_set_default_response(GTK_DIALOG(object), GTK_RESPONSE_CLOSE);
gtk_window_set_title(GTK_WINDOW(object), _("Local Preferences"));
gtk_container_set_border_width(GTK_CONTAINER(object), GUI_PAD);
g_signal_connect(G_OBJECT(object),
- "response",
- G_CALLBACK(trg_preferences_response_cb), NULL);
+ "response",
+ G_CALLBACK(trg_preferences_response_cb), NULL);
notebook = gtk_notebook_new();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
- trg_prefs_serverPage(priv->client),
- gtk_label_new(_("Connection")));
+ trg_prefs_serverPage(TRG_PREFERENCES_DIALOG(object)),
+ gtk_label_new(_("Connection")));
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
- trg_prefs_desktopPage(priv->client,
- priv->win),
- gtk_label_new(_("Desktop")));
+ trg_prefs_desktopPage(TRG_PREFERENCES_DIALOG(object)),
+ gtk_label_new(_("Desktop")));
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
- trg_prefs_behaviorPage(priv->client),
- gtk_label_new(_("Behavior")));
+ trg_prefs_behaviorPage(TRG_PREFERENCES_DIALOG(object)),
+ gtk_label_new(_("Behavior")));
gtk_container_set_border_width(GTK_CONTAINER(notebook), GUI_PAD);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(object)->vbox), notebook,
- TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(object)->vbox), notebook, TRUE, TRUE,
+ 0);
gtk_widget_show_all(GTK_DIALOG(object)->vbox);
return object;
}
-static void trg_preferences_dialog_init(TrgPreferencesDialog * pref_dlg)
-{
+static void trg_preferences_dialog_init(TrgPreferencesDialog * pref_dlg) {
}
-static void
-trg_preferences_dialog_class_init(TrgPreferencesDialogClass * class)
-{
+static void trg_preferences_dialog_class_init(TrgPreferencesDialogClass * class) {
GObjectClass *g_object_class = (GObjectClass *) class;
g_object_class->constructor = trg_preferences_dialog_constructor;
g_object_class->set_property = trg_preferences_dialog_set_property;
g_object_class->get_property = trg_preferences_dialog_get_property;
- g_object_class_install_property(g_object_class,
- PROP_TRG_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(g_object_class,
- PROP_MAIN_WINDOW,
- g_param_spec_object
- ("main-window", "Main Window",
- "Main 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(
+ g_object_class,
+ PROP_TRG_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(
+ g_object_class,
+ PROP_MAIN_WINDOW,
+ g_param_spec_object(
+ "main-window",
+ "Main Window",
+ "Main 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_type_class_add_private(g_object_class,
- sizeof(TrgPreferencesDialogPrivate));
+ sizeof(TrgPreferencesDialogPrivate));
}
GtkWidget *trg_preferences_dialog_get_instance(TrgMainWindow * win,
- trg_client * client)
-{
+ TrgClient * client) {
if (instance == NULL) {
- instance = g_object_new(TRG_TYPE_PREFERENCES_DIALOG,
- "main-window", win,
- "trg-client", client, NULL);
+ instance = g_object_new(TRG_TYPE_PREFERENCES_DIALOG, "main-window",
+ win, "trg-client", client, NULL);
}
return GTK_WIDGET(instance);