Changeset 4304


Ignore:
Timestamp:
Dec 24, 2007, 12:14:39 AM (15 years ago)
Author:
charles
Message:

(gtk+) first cut of a filter bar

Location:
trunk
Files:
2 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/AUTHORS

    r4096 r4304  
    7171        Andy Matuschak for use of Sparkle. <http://sparkle.andymatuschak.org/>
    7272        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  
    2020- GTK+:
    2121   + Minimal Mode for showing more torrents in less desktop space
     22   + Torrent filtering
    2223   + Port forwarding tester in Preferences
    2324   + Statistics window
  • trunk/gtk/Makefile.am

    r4210 r4304  
    2121    msgwin.h \
    2222    stats.h \
     23    sexy-icon-entry.h \
    2324    torrent-cell-renderer.h \
    2425    torrent-inspector.h \
     
    4344    makemeta-ui.c \
    4445    msgwin.c \
     46    sexy-icon-entry.c \
    4547    stats.c \
    4648    torrent-cell-renderer.c \
  • trunk/gtk/actions.c

    r4244 r4304  
    104104  { "sort-reversed", NULL,
    105105    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 },
    106108  { "show-status-bar", NULL,
    107109    N_("Show _Status Bar"), NULL, NULL, G_CALLBACK(toggle_pref_cb), FALSE },
     
    177179    { tr_arrow_down, "tr-arrow-down" },
    178180    { 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" }
    180183};
    181184
  • trunk/gtk/main.c

    r4248 r4304  
    396396    selectionChangedCB( sel, NULL );
    397397    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 );
    399399    g_signal_connect( model, "row-changed", G_CALLBACK(rowChangedCB), sel );
    400400    g_signal_connect( wind, "delete-event", G_CALLBACK( winclose ), cbdata );
  • trunk/gtk/status-bar-icons.h

    r4240 r4304  
    114114
    115115
     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__
     122static const guint8 tr_search_pulldown[] __attribute__ ((__aligned__ (4))) =
     123#else
     124static 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  
    3333    pref_int_set_default    ( PREF_KEY_MAX_PEERS_PER_TORRENT, 60 );
    3434
     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 );
    3538    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 );
    3839
    3940    pref_flag_set_default   ( PREF_KEY_DL_LIMIT_ENABLED, FALSE );
  • trunk/gtk/tr_prefs.h

    r4272 r4304  
    3939#define PREF_KEY_SORT_REVERSED          "sort-reversed"
    4040#define PREF_KEY_MINIMAL_VIEW           "minimal-view"
     41#define PREF_KEY_FILTER_BAR             "show-filter-bar"
    4142#define PREF_KEY_STATUS_BAR             "show-status-bar"
    4243#define PREF_KEY_STATUS_BAR_STATS       "status-bar-stats"
  • trunk/gtk/tr_window.c

    r4284 r4304  
    3333#include "conf.h"
    3434#include "hig.h"
     35#include "sexy-icon-entry.h"
    3536#include "torrent-cell-renderer.h"
    3637#include "tr_prefs.h"
     
    4950#endif
    5051
     52typedef enum
     53{
     54    FILTER_TEXT_MODE_NAME,
     55    FILTER_TEXT_MODE_FILES,
     56    FILTER_TEXT_MODE_TRACKER,
     57    FILTER_TEXT_MODE_QTY
     58}
     59filter_text_mode_t;
     60
     61typedef 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}
     70filter_mode_t;
     71
    5172typedef struct
    5273{
     
    5475    GtkWidget * view;
    5576    GtkWidget * toolbar;
     77    GtkWidget * filter;
    5678    GtkWidget * status;
    5779    GtkWidget * status_menu;
     
    6284    GtkCellRenderer   * renderer;
    6385    GtkTreeViewColumn * column;
     86    GtkTreeModel * filter_model;
    6487    TrCore * core;
    6588    gulong pref_handler_id;
     89    filter_mode_t filter_mode;
     90    filter_text_mode_t filter_text_mode;
     91    char * filter_text;
    6692}
    6793PrivateData;
    6894
    6995#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"
    70100
    71101PrivateData*
     
    97127}
    98128
     129static gboolean is_row_visible( GtkTreeModel *, GtkTreeIter  *, gpointer );
     130
    99131static GtkWidget*
    100 makeview( PrivateData * p )
     132makeview( PrivateData * p, TrCore * core )
    101133{
    102134    GtkWidget         * view;
     
    104136    GtkTreeSelection  * sel;
    105137    GtkCellRenderer   * r;
     138    GtkTreeModel      * filter_model;
    106139
    107140    view = gtk_tree_view_new();
     
    132165                      G_CALLBACK(view_row_activated), NULL);
    133166
     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
    134176    return view;
    135177}
     
    159201        const gboolean isEnabled = pref_flag_get( key );
    160202        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 );
    161208    }
    162209    else if( !strcmp( key, PREF_KEY_TOOLBAR ) )
     
    210257
    211258/***
     259****  FILTER
     260***/
     261
     262static int
     263checkFilterText( 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
     297static int
     298checkFilterMode( 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
     327static gboolean
     328is_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
     340static void
     341refilter( PrivateData * p )
     342{
     343    gtk_tree_model_filter_refilter( GTK_TREE_MODEL_FILTER( p->filter_model ) );
     344}
     345
     346static void
     347filter_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
     359static void
     360filter_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
     386static void
     387filter_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
     398static void
     399entry_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
     408static void
     409entry_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/***
    212420****  PUBLIC
    213421***/
     
    220428    char * pch;
    221429    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    };
    223440
    224441    /* make the window */
     
    244461
    245462    /* status menu */
    246     GtkWidget * menu = p->status_menu = gtk_menu_new( );
     463    menu = p->status_menu = gtk_menu_new( );
    247464    status_stats_mode = 0;
    248     GSList * l = NULL;
     465    l = NULL;
    249466    pch = pref_string_get( PREF_KEY_STATUS_BAR_STATS );
    250467    for( i=0, n=G_N_ELEMENTS(stats_modes); i<n; ++i )
     
    285502    w = p->stats_lb = gtk_label_new( NULL );
    286503    gtk_box_pack_start( GTK_BOX(h), w, FALSE, FALSE, 0 );
    287 
    288504    gtk_box_pack_start( GTK_BOX(vbox), h, FALSE, FALSE, 0 );
    289505
     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
    290552    /* workarea */
    291     p->view = makeview( p );
     553    p->view = makeview( p, core );
    292554    w = p->scroll = gtk_scrolled_window_new( NULL, NULL );
    293555    gtk_container_add( GTK_CONTAINER(w), p->view );
     
    306568    p->core = core;
    307569    prefsChanged( core, PREF_KEY_MINIMAL_VIEW, self );
     570    prefsChanged( core, PREF_KEY_FILTER_BAR, self );
    308571    prefsChanged( core, PREF_KEY_STATUS_BAR, self );
    309572    prefsChanged( core, PREF_KEY_STATUS_BAR_STATS, self );
  • trunk/gtk/ui.h

    r4240 r4304  
    3232"      <menuitem action='show-toolbar'/>\n"
    3333"      <menuitem action='show-status-bar'/>\n"
     34"      <menuitem action='show-filter-bar'/>\n"
    3435"      <separator/>\n"
    3536"    </menu>\n"
Note: See TracChangeset for help on using the changeset viewer.