]> granicus.if.org Git - transmission/commitdiff
(trunk gtk) add utility function for creating a combobox that shows the values of...
authorCharles Kerr <charles@transmissionbt.com>
Fri, 23 Jul 2010 06:54:49 +0000 (06:54 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Fri, 23 Jul 2010 06:54:49 +0000 (06:54 +0000)
gtk/msgwin.c
gtk/tr-prefs.c
gtk/util.c
gtk/util.h

index 4faff78e81246d24f8cbf08f46e6e538cf7a4344..286659ddc76fc5e53262c0e1d11cbb532676785f 100644 (file)
@@ -55,23 +55,15 @@ static struct tr_msg_list * myHead = NULL;
 ***/
 
 static void
-level_combo_changed_cb( GtkWidget * w,
-                        gpointer    gdata )
+level_combo_changed_cb( GtkWidget * w, gpointer gdata )
 {
     struct MsgData * data = gdata;
-    GtkTreeIter      iter;
+    const int level = gtr_combo_box_get_active_val( w );
 
-    if( gtk_combo_box_get_active_iter( GTK_COMBO_BOX( w ), &iter ) )
-    {
-        int            level = 0;
-        GtkTreeModel * m = gtk_combo_box_get_model( GTK_COMBO_BOX( w ) );
-        gtk_tree_model_get( m, &iter, 1, &level, -1 );
-
-        tr_setMessageLevel( level );
-        tr_core_set_pref_int( data->core, TR_PREFS_KEY_MSGLEVEL, level );
-        data->maxLevel = level;
-        gtk_tree_model_filter_refilter( GTK_TREE_MODEL_FILTER( data->filter ) );
-    }
+    tr_setMessageLevel( level );
+    tr_core_set_pref_int( data->core, TR_PREFS_KEY_MSGLEVEL, level );
+    data->maxLevel = level;
+    gtk_tree_model_filter_refilter( GTK_TREE_MODEL_FILTER( data->filter ) );
 }
 
 static void
@@ -150,8 +142,7 @@ onSaveRequest( GtkWidget * w,
 }
 
 static void
-onClearRequest( GtkWidget * w UNUSED,
-                gpointer      gdata )
+onClearRequest( GtkWidget * w UNUSED, gpointer gdata )
 {
     struct MsgData * data = gdata;
 
@@ -161,25 +152,13 @@ onClearRequest( GtkWidget * w UNUSED,
 }
 
 static void
-onPauseToggled( GtkToggleToolButton * w,
-                gpointer              gdata )
+onPauseToggled( GtkToggleToolButton * w, gpointer gdata )
 {
     struct MsgData * data = gdata;
 
     data->isPaused = gtk_toggle_tool_button_get_active( w );
 }
 
-static struct
-{
-    const char *  label;
-    const char *  pref;
-    int           id;
-} trLevels[] = {
-    { N_( "Error" ),       "error",       TR_MSG_ERR          },
-    { N_( "Information" ), "info",        TR_MSG_INF          },
-    { N_( "Debug" ),       "debug",       TR_MSG_DBG          },
-};
-
 static const char*
 getForegroundColor( int msgLevel )
 {
@@ -382,38 +361,12 @@ onRefresh( gpointer gdata )
 static GtkWidget*
 debug_level_combo_new( void )
 {
-    unsigned int      i;
-    int               ii;
-    int               curlevel;
-    GtkWidget *       levels;
-    GtkListStore *    store;
-    GtkCellRenderer * renderer;
-
-    store = gtk_list_store_new ( 2, G_TYPE_STRING, G_TYPE_INT );
-
-    curlevel = pref_int_get( TR_PREFS_KEY_MSGLEVEL );
-    for( i = ii = 0; i < G_N_ELEMENTS( trLevels ); ++i )
-    {
-        GtkTreeIter iter;
-        gtk_list_store_append ( store, &iter );
-        gtk_list_store_set ( store, &iter, 0, _( trLevels[i].label ),
-                             1, trLevels[i].id,
-                             -1 );
-        if( trLevels[i].id == curlevel )
-            ii = i;
-    }
-    levels = gtk_combo_box_new_with_model ( GTK_TREE_MODEL( store ) );
-    g_object_unref( G_OBJECT( store ) );
-    store = NULL;
-
-    renderer = gtk_cell_renderer_text_new ( );
-    gtk_cell_layout_pack_start( GTK_CELL_LAYOUT( levels ), renderer, TRUE );
-    gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT( levels ), renderer,
-                                    "text", 0,
-                                    NULL );
-    gtk_combo_box_set_active( GTK_COMBO_BOX( levels ), ii );
-
-    return levels;
+    GtkWidget * w = gtr_combo_box_new_enum( _( "Error" ),       TR_MSG_ERR,
+                                            _( "Information" ), TR_MSG_INF,
+                                            _( "Debug" ),       TR_MSG_DBG,
+                                            NULL );
+    gtr_combo_box_set_active_val( w, pref_int_get( TR_PREFS_KEY_MSGLEVEL ) );
+    return w;
 }
 
 /**
@@ -476,8 +429,7 @@ msgwin_new( TrCore * core )
     gtk_toolbar_insert( GTK_TOOLBAR( toolbar ), item, -1 );
 
     w = debug_level_combo_new( );
-    g_signal_connect( w, "changed", G_CALLBACK(
-                          level_combo_changed_cb ), data );
+    g_signal_connect( w, "changed", G_CALLBACK( level_combo_changed_cb ), data );
     item = gtk_tool_item_new( );
     gtk_container_add( GTK_CONTAINER( item ), w );
     gtk_toolbar_insert( GTK_TOOLBAR( toolbar ), item, -1 );
index 580b546db00512c06dc37c10a998c53058bc82b4..81668ceca427d517d80e21680b6a80441fdbe3b9 100644 (file)
@@ -321,9 +321,9 @@ torrentPage( GObject * core )
     hig_workarea_add_section_divider( t, &row );
     hig_workarea_add_section_title( t, &row, _( "Seeding" ) );
 
-    s = _( "_Seed torrent until its ratio reaches:" );
+    s = _( "Stop seeding at _ratio:" );
     w = new_check_button( s, TR_PREFS_KEY_RATIO_ENABLED, core );
-    w2 = new_spin_button_double( TR_PREFS_KEY_RATIO, core, 0, INT_MAX, .05 );
+    w2 = new_spin_button_double( TR_PREFS_KEY_RATIO, core, 0, 1000, .05 );
     gtk_widget_set_sensitive( GTK_WIDGET( w2 ), pref_flag_get( TR_PREFS_KEY_RATIO_ENABLED ) );
     g_signal_connect( w, "toggled", G_CALLBACK( target_cb ), w2 );
     hig_workarea_add_row_w( t, &row, w, w2, NULL );
@@ -450,58 +450,21 @@ onBlocklistUpdate( GtkButton * w, gpointer gdata )
 static void
 onIntComboChanged( GtkComboBox * w, gpointer core )
 {
-    GtkTreeIter iter;
-
-    if( gtk_combo_box_get_active_iter( w, &iter ) )
-    {
-        int val = 0;
-        const char * key = g_object_get_data( G_OBJECT( w ), PREF_KEY );
-        gtk_tree_model_get( gtk_combo_box_get_model( w ), &iter, 0, &val, -1 );
-        tr_core_set_pref_int( TR_CORE( core ), key, val );
-    }
+    const int val = gtr_combo_box_get_active_val( GTK_WIDGET( w ) );
+    const char * key = g_object_get_data( G_OBJECT( w ), PREF_KEY );
+    tr_core_set_pref_int( TR_CORE( core ), key, val );
 }
 
 static GtkWidget*
 new_encryption_combo( GObject * core, const char * key )
 {
-    int i;
-    int selIndex;
-    GtkWidget * w;
-    GtkCellRenderer * r;
-    GtkListStore * store;
-    const int currentValue = pref_int_get( key );
-    const struct {
-        int value;
-        const char * text;
-    } items[] = {
-        { TR_CLEAR_PREFERRED,      N_( "Allow encryption" )  },
-        { TR_ENCRYPTION_PREFERRED, N_( "Prefer encryption" ) },
-        { TR_ENCRYPTION_REQUIRED,  N_( "Require encryption" )  }
-    };
-
-    /* build a store for encryption */
-    selIndex = -1;
-    store = gtk_list_store_new( 2, G_TYPE_INT, G_TYPE_STRING );
-    for( i=0; i<(int)G_N_ELEMENTS(items); ++i ) {
-        GtkTreeIter iter;
-        gtk_list_store_append( store, &iter );
-        gtk_list_store_set( store, &iter, 0, items[i].value, 1, _( items[i].text ), -1 );
-        if( items[i].value == currentValue )
-            selIndex = i;
-    }
-
-    /* build the widget */
-    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, TRUE );
-    gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT( w ), r, "text", 1, NULL );
+    GtkWidget * w = gtr_combo_box_new_enum( _( "Allow encryption" ),   TR_CLEAR_PREFERRED,
+                                            _( "Prefer encryption" ),  TR_ENCRYPTION_PREFERRED,
+                                            _( "Require encryption" ), TR_ENCRYPTION_REQUIRED,
+                                            NULL );
+    gtr_combo_box_set_active_val( w, pref_int_get( key ) );
     g_object_set_data_full( G_OBJECT( w ), PREF_KEY, tr_strdup( key ), g_free );
-    if( selIndex >= 0 )
-        gtk_combo_box_set_active( GTK_COMBO_BOX( w ), selIndex );
     g_signal_connect( w, "changed", G_CALLBACK( onIntComboChanged ), core );
-
-    /* cleanup */
-    g_object_unref( G_OBJECT( store ) );
     return w;
 }
 
@@ -911,7 +874,6 @@ webPage( GObject * core )
 
 struct ProxyPage
 {
-    TrCore *  core;
     GSList *  proxy_widgets;
     GSList *  proxy_auth_widgets;
 };
@@ -948,34 +910,17 @@ proxyPageFree( gpointer gpage )
     g_free( page );
 }
 
-static GtkTreeModel*
-proxyTypeModelNew( void )
-{
-    GtkTreeIter    iter;
-    GtkListStore * store = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_INT );
-
-    gtk_list_store_append( store, &iter );
-    gtk_list_store_set( store, &iter, 0, "HTTP", 1, TR_PROXY_HTTP, -1 );
-    gtk_list_store_append( store, &iter );
-    gtk_list_store_set( store, &iter, 0, "SOCKS4", 1, TR_PROXY_SOCKS4, -1 );
-    gtk_list_store_append( store, &iter );
-    gtk_list_store_set( store, &iter, 0, "SOCKS5", 1, TR_PROXY_SOCKS5, -1 );
-    return GTK_TREE_MODEL( store );
-}
-
-static void
-onProxyTypeChanged( GtkComboBox * w,
-                    gpointer      gpage )
+static GtkWidget*
+proxy_combo_box_new( GObject * core, const char * key )
 {
-    GtkTreeIter iter;
-
-    if( gtk_combo_box_get_active_iter( w, &iter ) )
-    {
-        struct ProxyPage * page = gpage;
-        int type = TR_PROXY_HTTP;
-        gtk_tree_model_get( gtk_combo_box_get_model( w ), &iter, 1, &type, -1 );
-        tr_core_set_pref_int( TR_CORE( page->core ), TR_PREFS_KEY_PROXY_TYPE, type );
-    }
+    GtkWidget * w =  gtr_combo_box_new_enum( "HTTP",   TR_PROXY_HTTP,
+                                             "SOCKS4", TR_PROXY_SOCKS4,
+                                             "SOCKS5", TR_PROXY_SOCKS5,
+                                             NULL );
+    gtr_combo_box_set_active_val( w, pref_int_get( key ) );
+    g_object_set_data_full( G_OBJECT( w ), PREF_KEY, tr_strdup( key ), g_free );
+    g_signal_connect( w, "changed", G_CALLBACK( onIntComboChanged ), core );
+    return w;
 }
 
 static GtkWidget*
@@ -985,12 +930,8 @@ trackerPage( GObject * core )
     const char *       s;
     GtkWidget *        t;
     GtkWidget *        w;
-    GtkTreeModel *     m;
-    GtkCellRenderer *  r;
     struct ProxyPage * page = tr_new0( struct ProxyPage, 1 );
 
-    page->core = TR_CORE( core );
-
     t = hig_workarea_create( );
     hig_workarea_add_section_title ( t, &row, _( "Tracker" ) );
 
@@ -1011,14 +952,7 @@ trackerPage( GObject * core )
     page->proxy_widgets = g_slist_append( page->proxy_widgets, w );
 
     s = _( "Proxy _type:" );
-    m = proxyTypeModelNew( );
-    w = gtk_combo_box_new_with_model( m );
-    r = gtk_cell_renderer_text_new( );
-    gtk_cell_layout_pack_start( GTK_CELL_LAYOUT( w ), r, TRUE );
-    gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT( w ), r, "text", 0, NULL );
-    gtk_combo_box_set_active( GTK_COMBO_BOX( w ), pref_int_get( TR_PREFS_KEY_PROXY_TYPE ) );
-    g_signal_connect( w, "changed", G_CALLBACK( onProxyTypeChanged ), page );
-    g_object_unref( G_OBJECT( m ) );
+    w = proxy_combo_box_new( core, TR_PREFS_KEY_PROXY_TYPE );
     page->proxy_widgets = g_slist_append( page->proxy_widgets, w );
     w = hig_workarea_add_row( t, &row, s, w, NULL );
     page->proxy_widgets = g_slist_append( page->proxy_widgets, w );
@@ -1138,51 +1072,20 @@ new_time_combo( GObject *    core,
 static GtkWidget*
 new_week_combo( GObject * core, const char * key )
 {
-    int i;
-    int selIndex;
-    GtkWidget * w;
-    GtkCellRenderer * r;
-    GtkListStore * store;
-    const int currentValue = pref_int_get( key );
-    const struct {
-        int value;
-        const char * text;
-    } items[] = {
-        { TR_SCHED_ALL,     N_( "Every Day" ) },
-        { TR_SCHED_WEEKDAY, N_( "Weekdays" ) },
-        { TR_SCHED_WEEKEND, N_( "Weekends" ) },
-        { TR_SCHED_SUN,     N_( "Sunday" ) },
-        { TR_SCHED_MON,     N_( "Monday" ) },
-        { TR_SCHED_TUES,    N_( "Tuesday" ) },
-        { TR_SCHED_WED,     N_( "Wednesday" ) },
-        { TR_SCHED_THURS,   N_( "Thursday" ) },
-        { TR_SCHED_FRI,     N_( "Friday" ) },
-        { TR_SCHED_SAT,     N_( "Saturday" ) }
-    };
-
-    /* build a store for the days of the week */
-    selIndex = -1;
-    store = gtk_list_store_new( 2, G_TYPE_INT, G_TYPE_STRING );
-    for( i=0; i<(int)G_N_ELEMENTS(items); ++i ) {
-        GtkTreeIter iter;
-        gtk_list_store_append( store, &iter );
-        gtk_list_store_set( store, &iter, 0, items[i].value, 1, _( items[i].text ), -1 );
-        if( items[i].value == currentValue )
-            selIndex = i;
-    }
-
-    /* build the widget */
-    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, TRUE );
-    gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT( w ), r, "text", 1, NULL );
+    GtkWidget * w = gtr_combo_box_new_enum( _( "Every Day" ), TR_SCHED_ALL,
+                                            _( "Weekdays" ),  TR_SCHED_WEEKDAY,
+                                            _( "Weekends" ),  TR_SCHED_WEEKEND,
+                                            _( "Sunday" ),    TR_SCHED_SUN,
+                                            _( "Monday" ),    TR_SCHED_MON,
+                                            _( "Tuesday" ),   TR_SCHED_TUES,
+                                            _( "Wednesday" ), TR_SCHED_WED,
+                                            _( "Thursday" ),  TR_SCHED_THURS,
+                                            _( "Friday" ),    TR_SCHED_FRI,
+                                            _( "Saturday" ),  TR_SCHED_SAT,
+                                            NULL );
+    gtr_combo_box_set_active_val( w, pref_int_get( key ) );
     g_object_set_data_full( G_OBJECT( w ), PREF_KEY, tr_strdup( key ), g_free );
-    if( selIndex >= 0 )
-        gtk_combo_box_set_active( GTK_COMBO_BOX( w ), selIndex );
     g_signal_connect( w, "changed", G_CALLBACK( onIntComboChanged ), core );
-
-    /* cleanup */
-    g_object_unref( G_OBJECT( store ) );
     return w;
 }
 
index ca5b41fb3141572c5e60f979f6b0ff3182e0817c..40d3751686c3c27e3fa40e41b9edc97fd89e70cf 100644 (file)
@@ -13,6 +13,7 @@
 #include <ctype.h> /* isxdigit() */
 #include <errno.h>
 #include <math.h> /* pow() */
+#include <stdarg.h>
 #include <stdlib.h> /* free() */
 #include <string.h> /* strcmp() */
 
@@ -652,7 +653,7 @@ gtr_button_new_from_stock( const char * stock,
 ***/
 
 void
-gtr_priority_combo_set_value( GtkWidget * w, tr_priority_t value )
+gtr_combo_box_set_active_val( GtkWidget * w, int value )
 {
     int i;
     int currentValue;
@@ -679,43 +680,27 @@ gtr_priority_combo_set_value( GtkWidget * w, tr_priority_t value )
     }
 }
 
-tr_priority_t
-gtr_priority_combo_get_value( GtkWidget * w )
-{
-    int value = 0;
-    GtkTreeIter iter;
-    GtkComboBox * combo_box = GTK_COMBO_BOX( w );
-
-    if( gtk_combo_box_get_active_iter( combo_box, &iter ) )
-        gtk_tree_model_get( gtk_combo_box_get_model( combo_box ), &iter, 0, &value, -1 );
-
-    return value;
-}
 
 GtkWidget *
-gtr_priority_combo_new( void )
+gtr_combo_box_new_enum( const char * text_1, ... )
 {
-    int i;
     GtkWidget * w;
     GtkCellRenderer * r;
     GtkListStore * store;
-    const struct {
-        int value;
-        const char * text;
-    } items[] = {
-        { TR_PRI_HIGH,   N_( "High" )  },
-        { TR_PRI_NORMAL, N_( "Normal" ) },
-        { TR_PRI_LOW,    N_( "Low" )  }
-    };
+    va_list vl;
+    const char * text;
+    va_start( vl, text_1 );
 
     store = gtk_list_store_new( 2, G_TYPE_INT, G_TYPE_STRING );
-    for( i=0; i<(int)G_N_ELEMENTS(items); ++i ) {
-        GtkTreeIter iter;
-        gtk_list_store_append( store, &iter );
-        gtk_list_store_set( store, &iter, 0, items[i].value,
-                                          1, _( items[i].text ),
-                                         -1 );
+
+    text = text_1;
+    if( text != NULL ) do
+    {
+        const int val = va_arg( vl, int );
+        gtk_list_store_insert_with_values( store, NULL, INT_MAX, 0, val, 1, text, -1 );
+        text = va_arg( vl, const char * );
     }
+    while( text != NULL );
 
     w = gtk_combo_box_new_with_model( GTK_TREE_MODEL( store ) );
     r = gtk_cell_renderer_text_new( );
@@ -727,6 +712,28 @@ gtr_priority_combo_new( void )
     return w;
 }
 
+int
+gtr_combo_box_get_active_val( GtkWidget * w )
+{
+    int value = 0;
+    GtkTreeIter iter;
+    GtkComboBox * combo_box = GTK_COMBO_BOX( w );
+
+    if( gtk_combo_box_get_active_iter( combo_box, &iter ) )
+        gtk_tree_model_get( gtk_combo_box_get_model( combo_box ), &iter, 0, &value, -1 );
+
+    return value;
+}
+
+GtkWidget *
+gtr_priority_combo_new( void )
+{
+    return gtr_combo_box_new_enum( _( "High" ),   TR_PRI_HIGH,
+                                   _( "Normal" ), TR_PRI_NORMAL,
+                                   _( "Low" ),    TR_PRI_LOW,
+                                   NULL );
+}
+
 /***
 ****
 ***/
index fb6694dc0946b174265465effe852802a703e67d..9d08496fa91334cf202ca9d9df3ca3a1ea36a811 100644 (file)
@@ -168,11 +168,13 @@ GtkWidget * gtr_button_new_from_stock( const char * stock,
 ****
 ***/
 
-void gtr_priority_combo_set_value( GtkWidget * w, tr_priority_t );
-
-tr_priority_t gtr_priority_combo_get_value( GtkWidget * w );
-
 GtkWidget * gtr_priority_combo_new( void );
+#define gtr_priority_combo_get_value(w) gtr_combo_box_get_active_val(w)
+#define gtr_priority_combo_set_value(w,val) gtr_combo_box_set_active_val(w,val)
+
+GtkWidget * gtr_combo_box_new_enum( const char * text_1, ... );
+int gtr_combo_box_get_active_val( GtkWidget * w );
+void gtr_combo_box_set_active_val( GtkWidget * w, int value );
 
 /***
 ****