Revert "transmission: update from 2.13 to 2.22"
[tomato.git] / release / src / router / transmission / gtk / actions.c
blob04b5af1cf68bf95a4702defc316108b9b8fd3d95
1 /*
2 * This file Copyright (C) 2007-2010 Mnemosyne LLC
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.
10 * $Id: actions.c 11263 2010-09-24 15:22:53Z charles $
13 #include <string.h>
15 #include <glib/gi18n.h>
16 #include <gtk/gtk.h>
18 #include <libtransmission/transmission.h>
20 #include "actions.h"
21 #include "conf.h"
22 #include "tr-core.h"
23 #include "tr-prefs.h"
25 #include "icon-lock.h"
26 #include "icon-logo-24.h"
27 #include "icon-logo-48.h"
28 #include "icon-ratio.h"
29 #include "icon-turtle.h"
30 #include "icon-utilities.h"
32 #define UNUSED G_GNUC_UNUSED
34 static TrCore * myCore = NULL;
36 static GtkActionGroup * myGroup = NULL;
38 static void
39 action_cb( GtkAction * a,
40 gpointer user_data )
42 doAction ( gtk_action_get_name( a ), user_data );
45 #if !GTK_CHECK_VERSION( 2, 8, 0 )
46 #define GTK_STOCK_INFO GTK_STOCK_PROPERTIES
47 #endif
49 #if !GTK_CHECK_VERSION( 2, 10, 0 )
50 #define GTK_STOCK_SELECT_ALL NULL
51 #endif
53 static GtkRadioActionEntry sort_radio_entries[] =
55 { "sort-by-activity", NULL, N_( "Sort by _Activity" ), NULL, NULL, 0 },
56 { "sort-by-name", NULL, N_( "Sort by _Name" ), NULL, NULL, 1 },
57 { "sort-by-progress", NULL, N_( "Sort by _Progress" ), NULL, NULL, 2 },
58 { "sort-by-ratio", NULL, N_( "Sort by Rati_o" ), NULL, NULL, 3 },
59 { "sort-by-state", NULL, N_( "Sort by Stat_e" ), NULL, NULL, 4 },
60 { "sort-by-age", NULL, N_( "Sort by A_ge" ), NULL, NULL, 5 },
61 { "sort-by-time-left", NULL, N_( "Sort by Time _Left" ), NULL, NULL, 6 },
62 { "sort-by-size", NULL, N_( "Sort by Si_ze" ), NULL, NULL, 7 }
65 static void
66 sort_changed_cb( GtkAction * action UNUSED,
67 GtkRadioAction * current,
68 gpointer user_data UNUSED )
70 const char * key = PREF_KEY_SORT_MODE;
71 const int i = gtk_radio_action_get_current_value( current );
72 const char * val = sort_radio_entries[i].name;
74 tr_core_set_pref( myCore, key, val );
77 static GtkToggleActionEntry show_toggle_entries[] =
79 { "toggle-main-window", NULL, N_( "_Show Transmission" ), NULL, NULL, G_CALLBACK( action_cb ), TRUE },
80 { "toggle-message-log", NULL, N_( "Message _Log" ), NULL, NULL, G_CALLBACK( action_cb ), FALSE }
83 static void
84 toggle_pref_cb( GtkToggleAction * action,
85 gpointer user_data UNUSED )
87 const char * key = gtk_action_get_name( GTK_ACTION( action ) );
88 const gboolean val = gtk_toggle_action_get_active( action );
90 tr_core_set_pref_bool( myCore, key, val );
93 static GtkToggleActionEntry pref_toggle_entries[] =
95 { "alt-speed-enabled", NULL, N_( "Enable Temporary Speed _Limits" ), NULL, NULL, G_CALLBACK( toggle_pref_cb ), FALSE },
96 { "compact-view", NULL, N_( "_Compact View" ), "<alt>C", NULL, G_CALLBACK( toggle_pref_cb ), FALSE },
97 { "sort-reversed", NULL, N_( "Re_verse Sort Order" ), NULL, NULL, G_CALLBACK( toggle_pref_cb ), FALSE },
98 { "show-filterbar", NULL, N_( "_Filterbar" ), NULL, NULL, G_CALLBACK( toggle_pref_cb ), FALSE },
99 { "show-statusbar", NULL, N_( "_Statusbar" ), NULL, NULL, G_CALLBACK( toggle_pref_cb ), FALSE },
100 { "show-toolbar", NULL, N_( "_Toolbar" ), NULL, NULL, G_CALLBACK( toggle_pref_cb ), FALSE }
103 static GtkActionEntry entries[] =
105 { "file-menu", NULL, N_( "_File" ), NULL, NULL, NULL },
106 { "torrent-menu", NULL, N_( "_Torrent" ), NULL, NULL, NULL },
107 { "view-menu", NULL, N_( "_View" ), NULL, NULL, NULL },
108 { "sort-menu", NULL, N_( "_Sort Torrents By" ), NULL, NULL, NULL },
109 { "edit-menu", NULL, N_( "_Edit" ), NULL, NULL, NULL },
110 { "help-menu", NULL, N_( "_Help" ), NULL, NULL, NULL },
111 { "copy-magnet-link-to-clipboard", GTK_STOCK_COPY, N_("Copy _Magnet Link to Clipboard" ), "<control>M", NULL, G_CALLBACK( action_cb ) },
112 { "add-torrent-from-url", GTK_STOCK_ADD, N_("Add _URL..." ), NULL, N_( "Add URL..." ), G_CALLBACK( action_cb ) },
113 { "add-torrent-toolbar", GTK_STOCK_ADD, NULL, NULL, N_( "Add a torrent" ), G_CALLBACK( action_cb ) },
114 { "add-torrent-menu", GTK_STOCK_ADD, N_( "_Add File..." ), "<control>D", N_( "Add a torrent" ), G_CALLBACK( action_cb ) },
115 { "start-torrent", GTK_STOCK_MEDIA_PLAY, N_( "_Start" ), "<control>S", N_( "Start torrent" ), G_CALLBACK( action_cb ) },
116 { "show-stats", NULL, N_( "_Statistics" ), NULL, NULL, G_CALLBACK( action_cb ) },
117 { "donate", NULL, N_( "_Donate" ), NULL, NULL, G_CALLBACK( action_cb ) },
118 { "verify-torrent", NULL, N_( "_Verify Local Data" ), "<control>V", NULL, G_CALLBACK( action_cb ) },
119 { "pause-torrent", GTK_STOCK_MEDIA_PAUSE, N_( "_Pause" ), "<control>P", N_( "Pause torrent" ), G_CALLBACK( action_cb ) },
120 { "pause-all-torrents", GTK_STOCK_MEDIA_PAUSE, N_( "_Pause All" ), NULL, N_( "Pause all torrents" ), G_CALLBACK( action_cb ) },
121 { "start-all-torrents", GTK_STOCK_MEDIA_PLAY, N_( "_Start All" ), NULL, N_( "Start all torrents" ), G_CALLBACK( action_cb ) },
122 { "relocate-torrent", NULL, N_("Set _Location..." ), NULL, NULL, G_CALLBACK( action_cb ) },
123 { "remove-torrent", GTK_STOCK_REMOVE, NULL, "Delete", N_( "Remove torrent" ), G_CALLBACK( action_cb ) },
124 { "delete-torrent", GTK_STOCK_DELETE, N_( "_Delete Files and Remove" ), "<shift>Delete", NULL, G_CALLBACK( action_cb ) },
125 { "new-torrent", GTK_STOCK_NEW, N_( "_New..." ), NULL, N_( "Create a torrent" ), G_CALLBACK( action_cb ) },
126 { "quit", GTK_STOCK_QUIT, N_( "_Quit" ), NULL, NULL, G_CALLBACK( action_cb ) },
127 { "select-all", GTK_STOCK_SELECT_ALL, N_( "Select _All" ), "<control>A", NULL, G_CALLBACK( action_cb ) },
128 { "deselect-all", NULL, N_( "Dese_lect All" ), "<shift><control>A", NULL, G_CALLBACK( action_cb ) },
129 { "edit-preferences", GTK_STOCK_PREFERENCES, NULL, NULL, NULL, G_CALLBACK( action_cb ) },
130 { "show-torrent-properties", GTK_STOCK_PROPERTIES, NULL, "<alt>Return", N_( "Torrent properties" ), G_CALLBACK( action_cb ) },
131 { "open-torrent-folder", GTK_STOCK_OPEN, N_( "_Open Folder" ), NULL, NULL, G_CALLBACK( action_cb ) },
132 { "show-about-dialog", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK( action_cb ) },
133 { "help", GTK_STOCK_HELP, N_( "_Contents" ), "F1", NULL, G_CALLBACK( action_cb ) },
134 { "update-tracker", GTK_STOCK_NETWORK, N_( "Ask Tracker for _More Peers" ), NULL, NULL, G_CALLBACK( action_cb ) },
137 typedef struct
139 const guint8* raw;
140 const char * name;
142 BuiltinIconInfo;
144 static const BuiltinIconInfo my_fallback_icons[] =
146 { tr_icon_logo_48, WINDOW_ICON },
147 { tr_icon_logo_24, TRAY_ICON },
148 { tr_icon_logo_48, NOTIFICATION_ICON },
149 { tr_icon_lock, "transmission-lock" },
150 { utilities_icon, "utilities" },
151 { blue_turtle, "alt-speed-on" },
152 { grey_turtle, "alt-speed-off" },
153 { ratio_icon, "ratio" }
156 static void
157 register_my_icons( void )
159 int i;
160 const int n = G_N_ELEMENTS( my_fallback_icons );
161 GtkIconFactory * factory = gtk_icon_factory_new( );
162 GtkIconTheme * theme = gtk_icon_theme_get_default( );
164 gtk_icon_factory_add_default( factory );
166 for( i = 0; i < n; ++i )
168 const char * name = my_fallback_icons[i].name;
170 if( !gtk_icon_theme_has_icon( theme, name ) )
172 int width;
173 GdkPixbuf * p;
174 GtkIconSet * icon_set;
177 gdk_pixbuf_new_from_inline( -1, my_fallback_icons[i].raw,
178 FALSE,
179 NULL );
180 width = gdk_pixbuf_get_width( p );
181 icon_set = gtk_icon_set_new_from_pixbuf( p );
182 gtk_icon_theme_add_builtin_icon( name, width, p );
183 gtk_icon_factory_add( factory, name, icon_set );
185 g_object_unref( p );
186 gtk_icon_set_unref( icon_set );
190 g_object_unref ( G_OBJECT ( factory ) );
193 static GtkUIManager * myUIManager = NULL;
195 void
196 actions_set_core( TrCore * core )
198 myCore = core;
201 void
202 actions_init( GtkUIManager * ui_manager,
203 gpointer callback_user_data )
205 int i, n;
206 int active;
207 const char * match;
208 const int n_entries = G_N_ELEMENTS( entries );
209 GtkActionGroup * action_group;
211 myUIManager = ui_manager;
213 register_my_icons( );
215 action_group = myGroup = gtk_action_group_new( "Actions" );
216 gtk_action_group_set_translation_domain( action_group, NULL );
219 match = pref_string_get( PREF_KEY_SORT_MODE );
220 for( i = 0, n = G_N_ELEMENTS( sort_radio_entries ), active = -1;
221 active == -1 && i < n; ++i )
222 if( !strcmp( sort_radio_entries[i].name, match ) )
223 active = i;
225 gtk_action_group_add_radio_actions( action_group,
226 sort_radio_entries,
227 G_N_ELEMENTS( sort_radio_entries ),
228 active,
229 G_CALLBACK( sort_changed_cb ),
230 NULL );
232 gtk_action_group_add_toggle_actions( action_group,
233 show_toggle_entries,
234 G_N_ELEMENTS( show_toggle_entries ),
235 callback_user_data );
237 for( i = 0, n = G_N_ELEMENTS( pref_toggle_entries ); i < n; ++i )
238 pref_toggle_entries[i].is_active =
239 pref_flag_get( pref_toggle_entries[i].name );
241 gtk_action_group_add_toggle_actions( action_group,
242 pref_toggle_entries,
243 G_N_ELEMENTS( pref_toggle_entries ),
244 callback_user_data );
246 gtk_action_group_add_actions( action_group,
247 entries, n_entries,
248 callback_user_data );
250 gtk_ui_manager_insert_action_group( ui_manager, action_group, 0 );
251 g_object_unref ( G_OBJECT( action_group ) );
254 /****
255 *****
256 ****/
258 static GHashTable * key_to_action = NULL;
260 static void
261 ensure_action_map_loaded( GtkUIManager * uim )
263 GList * l;
265 if( key_to_action != NULL )
266 return;
268 key_to_action =
269 g_hash_table_new_full( g_str_hash, g_str_equal, g_free, NULL );
271 for( l = gtk_ui_manager_get_action_groups( uim ); l != NULL;
272 l = l->next )
274 GtkActionGroup * action_group = GTK_ACTION_GROUP( l->data );
275 GList * ait, *actions = gtk_action_group_list_actions(
276 action_group );
277 for( ait = actions; ait != NULL; ait = ait->next )
279 GtkAction * action = GTK_ACTION( ait->data );
280 const char * name = gtk_action_get_name( action );
281 g_hash_table_insert( key_to_action, g_strdup( name ), action );
283 g_list_free( actions );
287 static GtkAction*
288 get_action( const char* name )
290 ensure_action_map_loaded( myUIManager );
291 return ( GtkAction* ) g_hash_table_lookup( key_to_action, name );
294 void
295 action_activate( const char * name )
297 GtkAction * action = get_action( name );
299 g_assert( action != NULL );
300 gtk_action_activate( action );
303 void
304 action_sensitize( const char * name,
305 gboolean b )
307 GtkAction * action = get_action( name );
309 g_assert( action != NULL );
310 g_object_set( action, "sensitive", b, NULL );
313 void
314 action_set_important( const char * name, gboolean b )
316 GtkAction * action = get_action( name );
318 g_assert( action != NULL );
319 g_object_set( action, "is-important", b, NULL );
322 void
323 action_toggle( const char * name,
324 gboolean b )
326 GtkAction * action = get_action( name );
328 gtk_toggle_action_set_active( GTK_TOGGLE_ACTION( action ), b );
331 GtkWidget*
332 action_get_widget( const char * path )
334 return gtk_ui_manager_get_widget( myUIManager, path );