From 834a3f2151dd8738a1f878489f6207664c4af5aa Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Sun, 14 Jul 2013 17:14:53 -0700 Subject: Imported Upstream version 1.1.1 --- src/trg-json-widgets.c | 183 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 src/trg-json-widgets.c (limited to 'src/trg-json-widgets.c') diff --git a/src/trg-json-widgets.c b/src/trg-json-widgets.c new file mode 100644 index 0000000..abca7e1 --- /dev/null +++ b/src/trg-json-widgets.c @@ -0,0 +1,183 @@ +/* + * transmission-remote-gtk - A GTK RPC client to Transmission + * Copyright (C) 2011-2013 Alan Fitton + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include + +#include "trg-json-widgets.h" +#include "json.h" +#include "util.h" + +/* Functions for creating widgets that load/save their state from/to a JSON + * object. This is used by the torrent properties and remote settings dialogs. + * The pattern here is farily similar to that used in local configuration, + * the widget creation functions take a list as an argument, which gets a + * trg_json_widget_desc appended to it. This contains the key, and the function + * pointers for load/save. + */ + +void trg_json_widgets_save(GList * list, JsonObject * out) +{ + GList *li; + for (li = list; li; li = g_list_next(li)) { + trg_json_widget_desc *wd = (trg_json_widget_desc *) li->data; + wd->saveFunc(wd->widget, out, wd->key); + } +} + +void trg_json_widget_desc_free(trg_json_widget_desc * wd) +{ + g_free(wd->key); + g_free(wd); +} + +void trg_json_widget_desc_list_free(GList * list) +{ + GList *li; + for (li = list; li; li = g_list_next(li)) + trg_json_widget_desc_free((trg_json_widget_desc *) li->data); + + g_list_free(list); +} + +void toggle_active_arg_is_sensitive(GtkToggleButton * b, gpointer data) +{ + gtk_widget_set_sensitive(GTK_WIDGET(data), + gtk_toggle_button_get_active(b)); +} + +GtkWidget *trg_json_widget_check_new(GList ** wl, JsonObject * obj, + const gchar * key, + const gchar * label, + GtkWidget * toggleDep) +{ + GtkWidget *w = gtk_check_button_new_with_mnemonic(label); + trg_json_widget_desc *wd = g_new0(trg_json_widget_desc, 1); + + wd->saveFunc = trg_json_widget_check_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_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), + json_object_get_boolean_member(obj, key)); + + *wl = g_list_append(*wl, wd); + + return w; +} + +GtkWidget *trg_json_widget_entry_new(GList ** wl, JsonObject * obj, + const gchar * key, + GtkWidget * toggleDep) +{ + GtkWidget *w = gtk_entry_new(); + trg_json_widget_desc *wd = g_new0(trg_json_widget_desc, 1); + + wd->saveFunc = trg_json_widget_entry_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_entry_set_text(GTK_ENTRY(w), + json_object_get_string_member(obj, key)); + + *wl = g_list_append(*wl, wd); + + return w; +} + +void +trg_json_widget_time_save(GtkWidget * widget, JsonObject * obj, + gchar * key) +{ + + json_object_set_double_member(obj, key, + gtk_spin_button_get_value(GTK_SPIN_BUTTON + (widget))); +} + +GtkWidget *trg_json_widget_spin_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->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), + json_node_really_get_double(node)); + + *wl = g_list_append(*wl, wd); + + return w; +} + +void +trg_json_widget_check_save(GtkWidget * widget, JsonObject * obj, + gchar * key) +{ + gboolean active = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + json_object_set_boolean_member(obj, key, active); +} + +void +trg_json_widget_entry_save(GtkWidget * widget, JsonObject * obj, + gchar * key) +{ + json_object_set_string_member(obj, key, + gtk_entry_get_text(GTK_ENTRY(widget))); +} + +void +trg_json_widget_spin_save_double(GtkWidget * widget, JsonObject * obj, + gchar * key) +{ + json_object_set_double_member(obj, key, + gtk_spin_button_get_value(GTK_SPIN_BUTTON + (widget))); +} -- cgit v1.2.3