Changeset 4304
- Timestamp:
- Dec 24, 2007, 12:14:39 AM (15 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/AUTHORS
r4096 r4304 71 71 Andy Matuschak for use of Sparkle. <http://sparkle.andymatuschak.org/> 72 72 M. Uli Kusterer for use of UKKQueue. 73 Christian Hammond for use of icon entry. <http://www.chipx86.com/wiki/Libsexy> -
trunk/NEWS
r4295 r4304 20 20 - GTK+: 21 21 + Minimal Mode for showing more torrents in less desktop space 22 + Torrent filtering 22 23 + Port forwarding tester in Preferences 23 24 + Statistics window -
trunk/gtk/Makefile.am
r4210 r4304 21 21 msgwin.h \ 22 22 stats.h \ 23 sexy-icon-entry.h \ 23 24 torrent-cell-renderer.h \ 24 25 torrent-inspector.h \ … … 43 44 makemeta-ui.c \ 44 45 msgwin.c \ 46 sexy-icon-entry.c \ 45 47 stats.c \ 46 48 torrent-cell-renderer.c \ -
trunk/gtk/actions.c
r4244 r4304 104 104 { "sort-reversed", NULL, 105 105 N_("_Reverse Sort Order"), NULL, NULL, G_CALLBACK(toggle_pref_cb), FALSE }, 106 { "show-filter-bar", NULL, 107 N_("Show _Filter Bar"), NULL, NULL, G_CALLBACK(toggle_pref_cb), FALSE }, 106 108 { "show-status-bar", NULL, 107 109 N_("Show _Status Bar"), NULL, NULL, G_CALLBACK(toggle_pref_cb), FALSE }, … … 177 179 { tr_arrow_down, "tr-arrow-down" }, 178 180 { tr_arrow_up, "tr-arrow-up" }, 179 { tr_yin_yang, "tr-yin-yang" } 181 { tr_yin_yang, "tr-yin-yang" }, 182 { tr_search_pulldown, "tr-search-pulldown" } 180 183 }; 181 184 -
trunk/gtk/main.c
r4248 r4304 396 396 selectionChangedCB( sel, NULL ); 397 397 model = tr_core_model( cbdata->core ); 398 gtk_tree_view_set_model ( gtk_tree_selection_get_tree_view(sel), model );398 //gtk_tree_view_set_model ( gtk_tree_selection_get_tree_view(sel), model ); 399 399 g_signal_connect( model, "row-changed", G_CALLBACK(rowChangedCB), sel ); 400 400 g_signal_connect( wind, "delete-event", G_CALLBACK( winclose ), cbdata ); -
trunk/gtk/status-bar-icons.h
r4240 r4304 114 114 115 115 116 /* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ 117 118 #ifdef __SUNPRO_C 119 #pragma align 4 (tr_search_pulldown) 120 #endif 121 #ifdef __GNUC__ 122 static const guint8 tr_search_pulldown[] __attribute__ ((__aligned__ (4))) = 123 #else 124 static const guint8 tr_search_pulldown[] = 125 #endif 126 { "" 127 /* Pixbuf magic (0x47646b50) */ 128 "GdkP" 129 /* length: header (24) + pixel_data (1715) */ 130 "\0\0\6\313" 131 /* pixdata_type (0x2010002) */ 132 "\2\1\0\2" 133 /* rowstride (96) */ 134 "\0\0\0`" 135 /* width (24) */ 136 "\0\0\0\30" 137 /* height (24) */ 138 "\0\0\0\30" 139 /* pixel_data: */ 140 "\240\0\0\0\0\17\346\346\346\0\347\347\347\0\0\0\0\77\0\0\0\217\0\0\0" 141 "\277\24\24\24\377&&&\377$$$\377\0\0\0\317\0\0\0\237\0\0\0_\0\0\0\17\210" 142 "\216\277\0\204\212\274\0\201\207\271\0\211\0\0\0\0\17\0\0\0\77\0\0\0" 143 "\317GGG\377\210\210\210\377\262\262\262\377\255\255\255\377\245\245\245" 144 "\377\235\235\235\377\225\225\225\377ooo\377AAA\377\10\10\10\357\0\0\0" 145 "o\207\215\277\0\204\212\274\0\210\0\0\0\0\6\0\0\0_'''\377\261\261\261" 146 "\377\260\274\311\377\220\260\320\377m\235\314\377\204f\231\314\377\6" 147 "v\235\303\377\202\225\250\377|||\377000\377\0\0\0\237\207\215\276\0\207" 148 "\0\0\0\0\21\0\0\0\37\35\35\35\357\304\307\313\377\200\247\315\377j\235" 149 "\316\377\211\270\342\377\234\311\355\377\242\324\364\377\255\325\363" 150 "\377\300\337\370\377\263\332\367\377\226\305\353\377u\245\324\377l\230" 151 "\305\377{\205\217\377(((\377\0\0\0_\207\0\0\0\0\11\0\0\0\217\220\220" 152 "\220\377\232\266\323\377|\256\333\377\250\333\372\377\243\342\375\377" 153 "\233\343\377\377\225\342\377\377\343\367\377\377\202\377\377\377\377" 154 "\6\365\373\377\377\326\354\374\377s\244\323\377i\226\303\377qqq\377\0" 155 "\0\0\317\207\0\0\0\0\11\0\0\0\277\263\263\263\377x\245\321\377\252\341" 156 "\374\377\250\345\377\377\242\344\377\377\234\343\377\377\226\342\377" 157 "\377\273\354\377\377\203\377\377\377\377\5\367\374\377\377\202\332\374" 158 "\377m\246\325\377\177\214\230\377\30\30\30\377\207\0\0\0\0\21\0\0\0\277" 159 "\270\270\270\377\252\322\355\377\257\347\377\377\251\346\377\377\244" 160 "\345\377\377\236\343\377\377\231\342\377\377\224\341\377\377\244\346" 161 "\377\377\276\355\377\377\265\353\377\377\216\341\377\377\210\337\377" 162 "\377\201\316\362\377\207\221\232\377%%%\377\207\0\0\0\0\21\0\0\0\277" 163 "\234\234\234\377\325\342\357\377\257\344\374\377\253\346\377\377\246" 164 "\345\377\377\241\344\377\377\234\343\377\377\227\342\377\377\223\341" 165 "\377\377\220\340\377\377\215\340\377\377\214\340\377\377\215\340\377" 166 "\377\222\303\327\377\231\231\231\377&&&\377\207\0\0\0\0\21\0\0\0\277" 167 "]]]\377\330\330\330\377\325\342\357\377\255\336\366\377\251\346\377\377" 168 "\244\345\377\377\240\344\377\377\233\343\377\377\230\342\377\377\225" 169 "\342\377\377\223\341\377\377\221\334\371\377\235\306\325\377\247\247" 170 "\247\377\244\244\244\377&&&\377\207\0\0\0\0\21\0\0\0\237UUU\377\215\215" 171 "\215\377\315\315\315\377\354\356\360\377\313\334\351\377\261\326\352" 172 "\377\243\326\357\377\233\325\357\377\230\323\356\377\245\325\351\377" 173 "\250\310\326\377\266\274\277\377\304\304\304\377\302\302\302\377\234" 174 "\234\234\377\0\0\0\337\207\0\0\0\0\21\0\0\0\77\37\37\37\377\215\215\215" 175 "\377\231\231\231\377\247\247\247\377\316\316\316\377\327\327\327\377" 176 "\332\332\332\377\325\325\325\377\323\323\323\377\321\321\321\377\325" 177 "\325\325\377\347\347\347\377\341\341\341\377\304\304\304\377VVV\377\0" 178 "\0\0\177\206\0\0\0\0\22\0\0\0\17\0\0\0\177\0\0\0\357ZZZ\377\237\237\237" 179 "\377\266\266\266\377\314\314\314\377\270\270\270\377\263\263\263\377" 180 "\266\266\266\377\303\303\303\377\320\320\320\377\336\336\336\377\354" 181 "\354\354\377\341\341\341\377ppp\377\0\0\0\317\342\343\354\0\205\0\0\0" 182 "\0\10\0\0\0\17\0\0\0\317k\22\4\377\267%\12\377\303H*\377\301\246\236" 183 "\377\314\314\314\377\305\305\305\377\202\263\263\263\377\2\266\266\266" 184 "\377\303\303\303\377\202\320\320\320\377\5\223\223\223\377999\377\0\0" 185 "\0\217\0\0\0\17\314\314\314\0\204\0\0\0\0\24\0\0\0\17\0\0\0\317v\24\5" 186 "\377\303'\12\377\3143\20\377\365k:\377\371zJ\377\244\244\244\377\13\13" 187 "\13\377\26\26\26\377,,,\377---\377000\377&&&\377\0\0\0\337\0\0\0\237" 188 "\0\0\0/\347\347\347\0\327\327\327\0\271\271\271\0\203\0\0\0\0\14\0\0" 189 "\0\17\0\0\0\317v\24\5\377\303'\12\377\3143\20\377\365k:\377\377xE\377" 190 "\351\\&\3776\22\5\377\0\0\0/JJJ\0\0\0\0/\202\0\0\0\77\4\245\245\245\0" 191 "\340\340\340\0\360\360\360\0\361\361\361\0\202\362\362\362\0\1\363\363" 192 "\363\0\202\0\0\0\0\22\0\0\0\17\0\0\0\317w\25\5\377\3110\15\377\3120\17" 193 "\377\365k:\377\377xE\377\351\\&\377\306A\21\377\15\4\1\357\323\323\323" 194 "\0JJJ\0\215\215\215\0\221\221\221\0\226\226\226\0\242\242\242\0\337\337" 195 "\337\0\357\357\357\0\202\360\360\360\0\2\361\361\361\0\362\362\362\0" 196 "\202\0\0\0\0\23\0\0\0\277\205*\10\377\332H\21\377\335L\24\377\354`)\377" 197 "\377xE\377\351\\&\377\306A\21\377%\13\3\377\0\0\0_\321\321\321\0JJJ\0" 198 "\206\206\206\0\213\213\213\0\217\217\217\0\236\236\236\0\336\336\336" 199 "\0\355\355\355\0\356\356\356\0\202\357\357\357\0\1\360\360\360\0\202" 200 "\0\0\0\0\21&\12\1\377\320<\11\377\324A\14\377\330E\17\377\333J\22\377" 201 "\341Q\32\377\306A\21\377%\13\3\377\0\0\0_\317\317\317\0\320\320\320\0" 202 "JJJ\0\177\177\177\0\204\204\204\0\211\211\211\0\232\232\232\0\335\335" 203 "\335\0\202\354\354\354\0\3\355\355\355\0\356\356\356\0\357\357\357\0" 204 "\202\0\0\0\0\10""2\14\0\377\3125\5\377\316:\7\377\322>\12\377\325C\15" 205 "\377\306@\17\377%\13\3\377\0\0\0_\202\315\315\315\0\7\316\316\316\0J" 206 "JJ\0xxx\0}}}\0\202\202\202\0\226\226\226\0\334\334\334\0\205\0\0\0\377" 207 "\202\0\0\0\0\7\0\0\0\317\240&\0\377\3103\3\377\3147\6\377\3028\10\377" 208 "$\10\1\377\0\0\0_\202\313\313\313\0\11\314\314\314\0\315\315\315\0JJ" 209 "J\0rrr\0vvv\0{{{\0\223\223\223\0\332\332\332\0\377\377\377\0\203\0\0" 210 "\0\377\1\377\377\377\0\202\0\0\0\0\26\0\0\0/\15\3\0\357U\24\0\377c\31" 211 "\1\377\31\6\0\377\0\0\0_\0\0\0\0XXX\0\213\213\213\0\276\276\276\0\313" 212 "\313\313\0JJJ\0kkk\0ppp\0ttt\0\217\217\217\0\331\331\331\0\365\365\365" 213 "\0\377\377\377\0\0\0\0\377\377\377\377\0\365\365\365\0\203\0\0\0\0\4" 214 "\0\0\0\17\0\0\0O\0\0\0o\0\0\0\37\205\0\0\0\0\12&&&\0\40\40\40\0BBB\0" 215 "___\0mmm\0\213\213\213\0\327\327\327\0\345\345\345\0\346\346\346\0\347" 216 "\347\347\0\202\350\350\350\0\231\0\0\0\0"}; 217 218 -
trunk/gtk/tr_prefs.c
r4272 r4304 33 33 pref_int_set_default ( PREF_KEY_MAX_PEERS_PER_TORRENT, 60 ); 34 34 35 pref_flag_set_default ( PREF_KEY_TOOLBAR, TRUE ); 36 pref_flag_set_default ( PREF_KEY_FILTER_BAR, TRUE ); 37 pref_flag_set_default ( PREF_KEY_STATUS_BAR, TRUE ); 35 38 pref_string_set_default ( PREF_KEY_STATUS_BAR_STATS, "total-ratio" ); 36 pref_flag_set_default ( PREF_KEY_STATUS_BAR, TRUE );37 pref_flag_set_default ( PREF_KEY_TOOLBAR, TRUE );38 39 39 40 pref_flag_set_default ( PREF_KEY_DL_LIMIT_ENABLED, FALSE ); -
trunk/gtk/tr_prefs.h
r4272 r4304 39 39 #define PREF_KEY_SORT_REVERSED "sort-reversed" 40 40 #define PREF_KEY_MINIMAL_VIEW "minimal-view" 41 #define PREF_KEY_FILTER_BAR "show-filter-bar" 41 42 #define PREF_KEY_STATUS_BAR "show-status-bar" 42 43 #define PREF_KEY_STATUS_BAR_STATS "status-bar-stats" -
trunk/gtk/tr_window.c
r4284 r4304 33 33 #include "conf.h" 34 34 #include "hig.h" 35 #include "sexy-icon-entry.h" 35 36 #include "torrent-cell-renderer.h" 36 37 #include "tr_prefs.h" … … 49 50 #endif 50 51 52 typedef enum 53 { 54 FILTER_TEXT_MODE_NAME, 55 FILTER_TEXT_MODE_FILES, 56 FILTER_TEXT_MODE_TRACKER, 57 FILTER_TEXT_MODE_QTY 58 } 59 filter_text_mode_t; 60 61 typedef enum 62 { 63 FILTER_MODE_ALL, 64 FILTER_MODE_ACTIVE, 65 FILTER_MODE_DOWNLOADING, 66 FILTER_MODE_SEEDING, 67 FILTER_MODE_PAUSED, 68 FILTER_MODE_QTY 69 } 70 filter_mode_t; 71 51 72 typedef struct 52 73 { … … 54 75 GtkWidget * view; 55 76 GtkWidget * toolbar; 77 GtkWidget * filter; 56 78 GtkWidget * status; 57 79 GtkWidget * status_menu; … … 62 84 GtkCellRenderer * renderer; 63 85 GtkTreeViewColumn * column; 86 GtkTreeModel * filter_model; 64 87 TrCore * core; 65 88 gulong pref_handler_id; 89 filter_mode_t filter_mode; 90 filter_text_mode_t filter_text_mode; 91 char * filter_text; 66 92 } 67 93 PrivateData; 68 94 69 95 #define PRIVATE_DATA_KEY "private-data" 96 97 #define FILTER_MODE_KEY "tr-filter-mode" 98 #define FILTER_TEXT_MODE_KEY "tr-filter-text-mode" 99 #define FILTER_TOGGLES_KEY "tr-filter-toggles" 70 100 71 101 PrivateData* … … 97 127 } 98 128 129 static gboolean is_row_visible( GtkTreeModel *, GtkTreeIter *, gpointer ); 130 99 131 static GtkWidget* 100 makeview( PrivateData * p )132 makeview( PrivateData * p, TrCore * core ) 101 133 { 102 134 GtkWidget * view; … … 104 136 GtkTreeSelection * sel; 105 137 GtkCellRenderer * r; 138 GtkTreeModel * filter_model; 106 139 107 140 view = gtk_tree_view_new(); … … 132 165 G_CALLBACK(view_row_activated), NULL); 133 166 167 168 filter_model = p->filter_model = gtk_tree_model_filter_new( tr_core_model( core ), NULL ); 169 170 gtk_tree_model_filter_set_visible_func( GTK_TREE_MODEL_FILTER( filter_model ), 171 is_row_visible, 172 p, NULL ); 173 174 gtk_tree_view_set_model( GTK_TREE_VIEW( view ), filter_model ); 175 134 176 return view; 135 177 } … … 159 201 const gboolean isEnabled = pref_flag_get( key ); 160 202 g_object_set( p->status, "visible", isEnabled, NULL ); 203 } 204 else if( !strcmp( key, PREF_KEY_FILTER_BAR ) ) 205 { 206 const gboolean isEnabled = pref_flag_get( key ); 207 g_object_set( p->filter, "visible", isEnabled, NULL ); 161 208 } 162 209 else if( !strcmp( key, PREF_KEY_TOOLBAR ) ) … … 210 257 211 258 /*** 259 **** FILTER 260 ***/ 261 262 static int 263 checkFilterText( filter_text_mode_t filter_text_mode, 264 const tr_info * torInfo, 265 const char * text ) 266 { 267 int i; 268 int ret = 0; 269 char * pch; 270 271 switch( filter_text_mode ) 272 { 273 case FILTER_TEXT_MODE_FILES: 274 for( i=0; i<torInfo->fileCount && !ret; ++i ) { 275 pch = g_ascii_strdown( torInfo->files[i].name, -1 ); 276 ret = !text || strstr( pch, text ) != NULL; 277 g_free( pch ); 278 } 279 break; 280 281 case FILTER_TEXT_MODE_TRACKER: 282 pch = g_ascii_strdown( torInfo->primaryAddress, -1 ); 283 ret = !text || ( strstr( pch, text ) != NULL ); 284 g_free( pch ); 285 break; 286 287 default: /* NAME */ 288 pch = g_ascii_strdown( torInfo->name, -1 ); 289 ret = !text || ( strstr( pch, text ) != NULL ); 290 g_free( pch ); 291 break; 292 } 293 294 return ret; 295 } 296 297 static int 298 checkFilterMode( filter_mode_t filter_mode, 299 const tr_stat * torStat ) 300 { 301 int ret = 0; 302 const int haveDown = ((int)( torStat->rateDownload * 1024 )) > 1.0; 303 const int haveUp = ((int)( torStat->rateUpload * 1024 )) > 1.0; 304 305 switch( filter_mode ) 306 { 307 case FILTER_MODE_ACTIVE: 308 ret = haveUp || haveDown; 309 break; 310 case FILTER_MODE_DOWNLOADING: 311 ret = torStat->status == TR_STATUS_DOWNLOAD; 312 break; 313 case FILTER_MODE_SEEDING: 314 ret = ( torStat->status == TR_STATUS_DONE ) 315 || ( torStat->status == TR_STATUS_SEED ); 316 break; 317 case FILTER_MODE_PAUSED: 318 ret = torStat->status == TR_STATUS_STOPPED; 319 break; 320 default: /* all */ 321 ret = 1; 322 } 323 324 return ret; 325 } 326 327 static gboolean 328 is_row_visible( GtkTreeModel * model, 329 GtkTreeIter * iter, 330 gpointer vprivate ) 331 { 332 PrivateData * p = vprivate; 333 tr_torrent * tor; 334 gtk_tree_model_get( model, iter, MC_TORRENT_RAW, &tor, -1 ); 335 336 return checkFilterMode( p->filter_mode, tr_torrentStatCached( tor ) ) 337 && checkFilterText( p->filter_text_mode, tr_torrentInfo( tor ), p->filter_text ); 338 } 339 340 static void 341 refilter( PrivateData * p ) 342 { 343 gtk_tree_model_filter_refilter( GTK_TREE_MODEL_FILTER( p->filter_model ) ); 344 } 345 346 static void 347 filter_text_toggled_cb( GtkCheckMenuItem * menu_item, 348 gpointer vprivate ) 349 { 350 if( gtk_check_menu_item_get_active( menu_item ) ) 351 { 352 PrivateData * p = (PrivateData*) vprivate; 353 p->filter_text_mode = GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( menu_item ), 354 FILTER_TEXT_MODE_KEY ) ); 355 refilter( p ); 356 } 357 } 358 359 static void 360 filter_toggled_cb( GtkToggleButton * toggle, gpointer vprivate ) 361 { 362 PrivateData * p = (PrivateData*) vprivate; 363 GSList * l; 364 GSList * toggles = g_object_get_data( G_OBJECT( toggle ), FILTER_TOGGLES_KEY ); 365 const gboolean isActive = gtk_toggle_button_get_active( toggle ); 366 const filter_mode_t mode = GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( toggle ), FILTER_MODE_KEY ) ); 367 368 /* update the filter */ 369 if( isActive ) { 370 p->filter_mode = mode; 371 refilter( p ); 372 } 373 374 /* deactivate the other toggles */ 375 for( l=toggles; l!=NULL; l=l->next ) { 376 GtkToggleButton * walk = GTK_TOGGLE_BUTTON( l->data ); 377 if( isActive && ( toggle != walk ) ) 378 gtk_toggle_button_set_active( walk, FALSE ); 379 } 380 381 /* at least one button must always be set */ 382 if( !isActive && ( p->filter_mode == mode ) ) 383 gtk_toggle_button_set_active( toggle, TRUE ); 384 } 385 386 static void 387 filter_entry_changed( GtkEditable * e, gpointer vprivate ) 388 { 389 char * pch; 390 PrivateData * p = (PrivateData*) vprivate; 391 g_free( p->filter_text ); 392 pch = gtk_editable_get_chars( e, 0, -1 ); 393 p->filter_text = g_ascii_strdown( pch, -1 ); 394 refilter( p ); 395 g_free( pch ); 396 } 397 398 static void 399 entry_icon_released( SexyIconEntry * entry UNUSED, 400 SexyIconEntryPosition icon_pos, 401 int button UNUSED, 402 gpointer menu ) 403 { 404 if ( icon_pos == SEXY_ICON_ENTRY_PRIMARY ) 405 gtk_menu_popup ( GTK_MENU( menu ), 0, 0, 0, 0, 0, gtk_get_current_event_time( ) ); 406 } 407 408 static void 409 entry_icon_released_2( SexyIconEntry * entry, 410 SexyIconEntryPosition icon_pos, 411 int button UNUSED, 412 gpointer vprivate UNUSED ) 413 { 414 if ( icon_pos == SEXY_ICON_ENTRY_SECONDARY ) 415 gtk_editable_delete_text( GTK_EDITABLE( entry ), 0, -1 ); 416 } 417 418 419 /*** 212 420 **** PUBLIC 213 421 ***/ … … 220 428 char * pch; 221 429 PrivateData * p = g_new( PrivateData, 1 ); 222 GtkWidget *vbox, *w, *self, *h, *c; 430 GtkWidget *vbox, *w, *self, *h, *c, *s, *image, *menu; 431 GSList * l; 432 GSList * toggles; 433 const char * filter_names[FILTER_MODE_QTY] = { 434 N_( "A_ll"), N_("_Active"), 435 N_("_Downloading"), N_("_Seeding"), N_("_Paused") 436 }; 437 const char * filter_text_names[FILTER_TEXT_MODE_QTY] = { 438 N_("Name"), N_("Files"), N_("Tracker") 439 }; 223 440 224 441 /* make the window */ … … 244 461 245 462 /* status menu */ 246 GtkWidget *menu = p->status_menu = gtk_menu_new( );463 menu = p->status_menu = gtk_menu_new( ); 247 464 status_stats_mode = 0; 248 GSList *l = NULL;465 l = NULL; 249 466 pch = pref_string_get( PREF_KEY_STATUS_BAR_STATS ); 250 467 for( i=0, n=G_N_ELEMENTS(stats_modes); i<n; ++i ) … … 285 502 w = p->stats_lb = gtk_label_new( NULL ); 286 503 gtk_box_pack_start( GTK_BOX(h), w, FALSE, FALSE, 0 ); 287 288 504 gtk_box_pack_start( GTK_BOX(vbox), h, FALSE, FALSE, 0 ); 289 505 506 w = gtk_hseparator_new( ); 507 gtk_box_pack_start( GTK_BOX(vbox), w, FALSE, FALSE, 0 ); 508 509 /* filter */ 510 toggles = NULL; 511 h = p->filter = gtk_hbox_new( FALSE, GUI_PAD ); 512 gtk_container_set_border_width( GTK_CONTAINER( h ), GUI_PAD_SMALL ); 513 for( i=0; i<FILTER_MODE_QTY; ++i ) { 514 const char * mnemonic = _( filter_names[i] ); 515 w = gtk_toggle_button_new_with_mnemonic( mnemonic ); 516 g_object_set_data( G_OBJECT( w ), FILTER_MODE_KEY, GINT_TO_POINTER( i ) ); 517 gtk_button_set_relief( GTK_BUTTON( w ), GTK_RELIEF_NONE ); 518 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), i==FILTER_MODE_ALL ); 519 toggles = g_slist_prepend( toggles, w ); 520 g_signal_connect( w, "toggled", G_CALLBACK(filter_toggled_cb), p ); 521 gtk_box_pack_start( GTK_BOX( h ), w, FALSE, FALSE, 0 ); 522 } 523 for( l=toggles; l!=NULL; l=l->next ) 524 g_object_set_data( G_OBJECT( l->data ), FILTER_TOGGLES_KEY, toggles ); 525 s = sexy_icon_entry_new( ); 526 image = gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU ); 527 sexy_icon_entry_set_icon( SEXY_ICON_ENTRY(s), SEXY_ICON_ENTRY_SECONDARY, GTK_IMAGE(image) ); 528 sexy_icon_entry_set_icon_highlight( SEXY_ICON_ENTRY(s), SEXY_ICON_ENTRY_SECONDARY, TRUE ); 529 image = gtk_image_new_from_stock( "tr-search-pulldown", GTK_ICON_SIZE_MENU ); 530 sexy_icon_entry_set_icon( SEXY_ICON_ENTRY(s), SEXY_ICON_ENTRY_PRIMARY, GTK_IMAGE(image) ); 531 sexy_icon_entry_set_icon_highlight( SEXY_ICON_ENTRY(s), SEXY_ICON_ENTRY_PRIMARY, TRUE ); 532 gtk_box_pack_end( GTK_BOX( h ), s, FALSE, FALSE, 0 ); 533 gtk_box_pack_start( GTK_BOX(vbox), h, FALSE, FALSE, 0 ); 534 g_signal_connect( s, "changed", G_CALLBACK( filter_entry_changed ), p ); 535 536 menu = gtk_menu_new( ); 537 l = NULL; 538 for( i=0; i<FILTER_TEXT_MODE_QTY; ++i ) 539 { 540 const char * name = _( filter_text_names[i] ); 541 GtkWidget * w = gtk_radio_menu_item_new_with_label ( l, name ); 542 l = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM( w ) ); 543 g_object_set_data( G_OBJECT( w ), FILTER_TEXT_MODE_KEY, GINT_TO_POINTER( i ) ); 544 g_signal_connect( w, "toggled", G_CALLBACK( filter_text_toggled_cb ), p ); 545 gtk_menu_shell_append( GTK_MENU_SHELL( menu ), w ); 546 gtk_widget_show( w ); 547 } 548 g_signal_connect( s, "icon-released", G_CALLBACK(entry_icon_released), menu ); 549 g_signal_connect( s, "icon-released", G_CALLBACK( entry_icon_released_2 ), p ); 550 551 290 552 /* workarea */ 291 p->view = makeview( p );553 p->view = makeview( p, core ); 292 554 w = p->scroll = gtk_scrolled_window_new( NULL, NULL ); 293 555 gtk_container_add( GTK_CONTAINER(w), p->view ); … … 306 568 p->core = core; 307 569 prefsChanged( core, PREF_KEY_MINIMAL_VIEW, self ); 570 prefsChanged( core, PREF_KEY_FILTER_BAR, self ); 308 571 prefsChanged( core, PREF_KEY_STATUS_BAR, self ); 309 572 prefsChanged( core, PREF_KEY_STATUS_BAR_STATS, self ); -
trunk/gtk/ui.h
r4240 r4304 32 32 " <menuitem action='show-toolbar'/>\n" 33 33 " <menuitem action='show-status-bar'/>\n" 34 " <menuitem action='show-filter-bar'/>\n" 34 35 " <separator/>\n" 35 36 " </menu>\n"
Note: See TracChangeset
for help on using the changeset viewer.