source: trunk/gtk/tr_prefs.c @ 3449

Last change on this file since 3449 was 3449, checked in by charles, 15 years ago

(gtk) remember between sessions which column is used for sorting in the main window's torrent list

  • Property svn:keywords set to Date Rev Author Id
File size: 9.5 KB
Line 
1/*
2 * This file Copyright (C) 2007 Charles Kerr <charles@rebelbase.com>
3 *
4 * This file is licensed by the GPL version 2.  Works owned by the
5 * Transmission project are granted a special exemption to clause 2(b)
6 * so that the bulk of its code can remain under the MIT license.
7 * This exemption does not extend to derived works not owned by
8 * the Transmission project.
9 *
10 * $Id: tr_prefs.c 3449 2007-10-17 18:31:12Z charles $
11 */
12
13#include <glib/gi18n.h>
14#include <gtk/gtk.h>
15#include <libtransmission/transmission.h>
16#include "conf.h"
17#include "hig.h"
18#include "tr_core.h"
19#include "tr_prefs.h"
20#include "util.h"
21
22/**
23 * This is where we initialize the preferences file with the default values.
24 * If you add a new preferences key, you /must/ add a default value here.
25 */
26void
27tr_prefs_init_global( void )
28{
29    pref_flag_set_default   ( PREF_KEY_DL_LIMIT_ENABLED, FALSE );
30    pref_int_set_default    ( PREF_KEY_DL_LIMIT, 100 );
31    pref_flag_set_default   ( PREF_KEY_UL_LIMIT_ENABLED, FALSE );
32    pref_int_set_default    ( PREF_KEY_UL_LIMIT, 50 );
33
34    pref_flag_set_default   ( PREF_KEY_DIR_ASK, FALSE );
35    pref_string_set_default ( PREF_KEY_DIR_DEFAULT, g_get_home_dir() );
36
37    pref_int_set_default    ( PREF_KEY_PORT, TR_DEFAULT_PORT );
38
39    pref_flag_set_default   ( PREF_KEY_NAT, TRUE );
40    pref_flag_set_default   ( PREF_KEY_PEX, TRUE );
41    pref_flag_set_default   ( PREF_KEY_SYSTRAY, TRUE );
42    pref_flag_set_default   ( PREF_KEY_ASKQUIT, TRUE );
43    pref_flag_set_default   ( PREF_KEY_ENCRYPTED_ONLY, FALSE );
44
45    pref_string_set_default ( PREF_KEY_ADDSTD, toractionname(TR_TOR_COPY) );
46    pref_string_set_default ( PREF_KEY_ADDIPC, toractionname(TR_TOR_COPY) );
47
48    pref_int_set_default    ( PREF_KEY_MSGLEVEL, TR_MSG_INF );
49
50    pref_string_set_default ( PREF_KEY_SORT_COLUMN, "name" );
51
52    pref_save( NULL );
53}
54
55/**
56***
57**/
58
59int
60tr_prefs_get_action( const char * key )
61{
62    char * val = pref_string_get( key );
63    const int ret = toraddaction( val );
64    g_free( val );
65    return ret;
66}
67
68void
69tr_prefs_set_action( const char * key, int action )
70{
71    pref_string_set( key, toractionname(action) );
72}
73
74/**
75***
76**/
77
78#define PREFS_KEY "prefs-key"
79
80static void
81response_cb( GtkDialog * dialog, int response UNUSED, gpointer unused UNUSED )
82{
83    gtk_widget_destroy( GTK_WIDGET(dialog) );
84}
85
86static void
87toggled_cb( GtkToggleButton * w, gpointer core )
88{
89    const char * key = g_object_get_data( G_OBJECT(w), PREFS_KEY );
90    const gboolean flag = gtk_toggle_button_get_active( w );
91    tr_core_set_pref_bool( TR_CORE(core), key, flag );
92}
93
94static GtkWidget*
95new_check_button( const char * mnemonic, const char * key, gpointer core )
96{
97    GtkWidget * w = gtk_check_button_new_with_mnemonic( mnemonic );
98    g_object_set_data_full( G_OBJECT(w), PREFS_KEY, g_strdup(key), g_free );
99    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(w), pref_flag_get(key) );
100    g_signal_connect( w, "toggled", G_CALLBACK(toggled_cb), core );
101    return w;
102}
103
104static void
105spun_cb( GtkSpinButton * w, gpointer core )
106{
107    const char * key = g_object_get_data( G_OBJECT(w), PREFS_KEY );
108    const int value = gtk_spin_button_get_value_as_int( w );
109    tr_core_set_pref_int( TR_CORE(core), key, value );
110}
111
112static GtkWidget*
113new_spin_button( const char * key, gpointer core, int low, int high )
114{
115    GtkWidget * w = gtk_spin_button_new_with_range( low, high, 1 );
116    g_object_set_data_full( G_OBJECT(w), PREFS_KEY, g_strdup(key), g_free );
117    gtk_spin_button_set_digits( GTK_SPIN_BUTTON(w), 0 );
118    gtk_spin_button_set_value( GTK_SPIN_BUTTON(w), pref_int_get(key) );
119    g_signal_connect( w, "value-changed", G_CALLBACK(spun_cb), core );
120    return w;
121}
122
123static void
124chosen_cb( GtkFileChooser * w, gpointer core )
125{
126    const char * key = g_object_get_data( G_OBJECT(w), PREFS_KEY );
127    char * value = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(w) );
128    tr_core_set_pref( TR_CORE(core), key, value );
129    g_free( value );
130}
131
132static GtkWidget*
133new_path_chooser_button( const char * key, gpointer core )
134{
135    GtkWidget * w = gtk_file_chooser_button_new( NULL,
136                                    GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER );
137    char * path = pref_string_get( key );
138    g_object_set_data_full( G_OBJECT(w), PREFS_KEY, g_strdup(key), g_free );
139    g_signal_connect( w, "selection-changed", G_CALLBACK(chosen_cb), core );
140    gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(w), path );
141    return w;
142}
143
144static void
145action_cb( GtkComboBox * w, gpointer core )
146{
147    const char * key = g_object_get_data( G_OBJECT(w), PREFS_KEY );
148    GtkTreeIter iter;
149    if( gtk_combo_box_get_active_iter( GTK_COMBO_BOX(w), &iter ) )
150    {
151        int action;
152        GtkTreeModel * model = gtk_combo_box_get_model( GTK_COMBO_BOX(w) );
153        gtk_tree_model_get( model, &iter, 1, &action, -1 );
154        tr_core_set_pref( core, key, toractionname(action) );
155    }
156}
157
158static GtkWidget*
159new_action_combo( const char * key, gpointer core )
160{
161    const char * s;
162    GtkTreeIter iter;
163    GtkCellRenderer * rend;
164    GtkListStore * model;
165    GtkWidget * w;
166
167    model = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_INT );
168
169    s = _("Use the torrent file where it is");
170    gtk_list_store_append( model, &iter );
171    gtk_list_store_set( model, &iter, 1, TR_TOR_LEAVE, 0, s, -1 );
172
173    s = _("Keep a copy of the torrent file");
174    gtk_list_store_append( model, &iter );
175    gtk_list_store_set( model, &iter, 1, TR_TOR_COPY, 0, s, -1 );
176
177    s = _("Keep a copy and remove the original");
178    gtk_list_store_append( model, &iter );
179    gtk_list_store_set( model, &iter, 1, TR_TOR_MOVE, 0, s, -1 );
180
181    w = gtk_combo_box_new_with_model( GTK_TREE_MODEL(model) ); 
182    gtk_combo_box_set_active( GTK_COMBO_BOX(w), tr_prefs_get_action(key) );
183    g_object_set_data_full( G_OBJECT(w), PREFS_KEY, g_strdup(key), g_free );
184    rend = gtk_cell_renderer_text_new( );
185    gtk_cell_layout_pack_start( GTK_CELL_LAYOUT(w), rend, TRUE );
186    gtk_cell_layout_add_attribute( GTK_CELL_LAYOUT(w), rend, "text", 0 );
187    g_signal_connect( w, "changed", G_CALLBACK(action_cb), core );
188
189    return w;
190}
191
192GtkWidget *
193tr_prefs_dialog_new( GObject * core, GtkWindow * parent )
194{
195    int row = 0;
196    const char * s;
197    GtkWidget * t;
198    GtkWidget * w;
199    GtkWidget * l;
200    GtkWidget * d;
201
202    d = gtk_dialog_new_with_buttons( _("Preferences"), parent,
203                                     GTK_DIALOG_DESTROY_WITH_PARENT,
204                                     GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
205                                     NULL );
206
207    gtk_window_set_role( GTK_WINDOW(d), "transmission-preferences-dialog" );
208    g_signal_connect( d, "response", G_CALLBACK(response_cb), core );
209
210    t = hig_workarea_create ();
211
212    hig_workarea_add_section_title (t, &row, _("Speed Limits"));
213    hig_workarea_add_section_spacer (t, row, 4);
214
215        s = _("_Limit Upload Speed");
216        w = new_check_button( s, PREF_KEY_UL_LIMIT_ENABLED, core );
217        hig_workarea_add_wide_control( t, &row, w );
218
219        w = new_spin_button( PREF_KEY_UL_LIMIT, core, 20, INT_MAX );
220        s = _("Maximum _Upload Speed (KiB/s)");
221        l = hig_workarea_add_row( t, &row, s, w, NULL );
222       
223        s = _("Li_mit Download Speed");
224        w = new_check_button( s, PREF_KEY_DL_LIMIT_ENABLED, core );
225        hig_workarea_add_wide_control( t, &row, w );
226
227        w = new_spin_button( PREF_KEY_DL_LIMIT, core, 1, INT_MAX );
228        s = _("Maximum _Download Speed (KiB/s)");
229        l = hig_workarea_add_row( t, &row, s, w, NULL );
230
231    hig_workarea_add_section_divider( t, &row );
232    hig_workarea_add_section_title (t, &row, _("Downloads"));
233    hig_workarea_add_section_spacer (t, row, 4);
234
235        s = _("Al_ways prompt for download directory");
236        w = new_check_button( s, PREF_KEY_DIR_ASK, core );
237        hig_workarea_add_wide_control( t, &row, w );
238
239        w = new_path_chooser_button( PREF_KEY_DIR_DEFAULT, core );
240        s = _("Download Di_rectory");
241        l = hig_workarea_add_row( t, &row, s, w, NULL );
242
243        w = new_action_combo( PREF_KEY_ADDSTD, core );
244        s = _("For torrents added _normally:");
245        l = hig_workarea_add_row( t, &row, s, w, NULL );
246
247        w = new_action_combo( PREF_KEY_ADDIPC, core );
248        s = _("For torrents added from _command-line:");
249        l = hig_workarea_add_row( t, &row, s, w, NULL );
250
251    hig_workarea_add_section_divider( t, &row );
252    hig_workarea_add_section_title (t, &row, _("Network"));
253    hig_workarea_add_section_spacer (t, row, 2);
254       
255        s = _("_Automatic Port Mapping via NAT-PMP or UPnP");
256        w = new_check_button( s, PREF_KEY_NAT, core );
257        hig_workarea_add_wide_control( t, &row, w );
258
259        w = new_spin_button( PREF_KEY_PORT, core, 1, INT_MAX );
260        l = hig_workarea_add_row( t, &row, _("Listening _Port"), w, NULL );
261
262    hig_workarea_add_section_divider( t, &row );
263    hig_workarea_add_section_title (t, &row, _("Options"));
264    hig_workarea_add_section_spacer (t, row, 3);
265       
266        s = _("Use Peer _Exchange if Possible");
267        w = new_check_button( s, PREF_KEY_PEX, core );
268        hig_workarea_add_wide_control( t, &row, w );
269       
270        s = _("_Ignore Unencrypted Peers");
271        w = new_check_button( s, PREF_KEY_ENCRYPTED_ONLY, core );
272        hig_workarea_add_wide_control( t, &row, w );
273       
274        s = _("Show an Icon in the System _Tray");
275        w = new_check_button( s, PREF_KEY_SYSTRAY, core );
276        hig_workarea_add_wide_control( t, &row, w );
277       
278        s = _("Confirm _quit");
279        w = new_check_button( s, PREF_KEY_ASKQUIT, core );
280        hig_workarea_add_wide_control( t, &row, w );
281
282    hig_workarea_finish (t, &row);
283    gtk_box_pack_start_defaults( GTK_BOX(GTK_DIALOG(d)->vbox), t );
284    gtk_widget_show_all( GTK_DIALOG(d)->vbox );
285    return d;
286}
Note: See TracBrowser for help on using the repository browser.