Changeset 2048

Show
Ignore:
Timestamp:
02/19/10 07:45:52 (5 months ago)
Author:
tpgww
Message:

change color of tab labels when content is non-default

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/plugins/e2p_find.c

    r2028 r2048  
    6161#include "e2_dialog.h" 
    6262#include "e2_task.h" 
     63 
     64#define PAGE_DATAKEY "__book-child" 
     65#define LABEL_DATAKEY "__tab-label" 
    6366 
    6467//support mime-type search criteria 
     
    296299}; 
    297300*/ 
     301 
     302static void _e2p_find_reset_spin_button (GtkWidget *widget); 
     303static void _e2p_find_reset_entry (GtkWidget *widget); 
     304static void _e2p_find_reset_combo (GtkWidget *widget); 
     305static void _e2p_find_set_toggle_button_on (GtkToggleButton *button); 
     306static void _e2p_find_set_toggle_button_off (GtkToggleButton *button); 
    298307 
    299308#ifdef TRACKERFIND 
     
    17941803//      current->second = (gfloat) tm_time.tm_sec; 
    17951804} 
     1805 
     1806/** 
     1807@brief recursively check whether all modifiable widgets inside @a widget currently 
     1808  hold their respective default value 
     1809@param widget when first called, this is a page-child for the dialog notebook 
     1810@param clean pointer to boolean value with which to AND the result. Should hold 
     1811  TRUE when first called 
     1812 
     1813@return nothing, the result is communicated via @a clean 
     1814*/ 
     1815static void _e2p_find_whether_page_is_clean (GtkWidget *widget, gboolean *clean) 
     1816{ 
     1817        gboolean state; 
     1818 
     1819        if (GTK_IS_CONTAINER (widget)) 
     1820                gtk_container_foreach ((GtkContainer*)widget, 
     1821                        (GtkCallback)_e2p_find_whether_page_is_clean, clean); 
     1822 
     1823        void (*reset_function) () = 
     1824                g_object_get_data (G_OBJECT (widget), "reset_yourself"); 
     1825 
     1826        if (reset_function == _e2p_find_reset_combo) 
     1827        { 
     1828                gint indx = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "default_index")); 
     1829                state = (gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) == indx); 
     1830        } 
     1831        else if (reset_function == _e2p_find_reset_entry) 
     1832                state = (*gtk_entry_get_text (GTK_ENTRY (widget)) == '\0'); 
     1833        else if (reset_function == _e2p_find_set_toggle_button_on) 
     1834                state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); 
     1835        else if (reset_function == _e2p_find_set_toggle_button_off) 
     1836                state = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); 
     1837        else if (reset_function == _e2p_find_reset_spin_button) 
     1838        { 
     1839                gfloat *value = g_object_get_data (G_OBJECT (widget), "default_value"); 
     1840                state = (gtk_spin_button_get_value (GTK_SPIN_BUTTON (widget)) == *value); 
     1841        } 
     1842 
     1843        *clean = *clean && state; 
     1844} 
     1845 
     1846/** 
     1847@brief a shared callback for each widget's "changed" signal (or the like) 
     1848@param widget the widget whose value has changed 
     1849@user_data UNUSED Note that for some types of callback the 2nd arg is something 
     1850  else e.g. GdkEvent * 
     1851 
     1852@return 
     1853*/ 
     1854static void _e2p_find_widget_changed_cb (GtkWidget *widget, gpointer user_data) 
     1855{ 
     1856        gboolean clean; 
     1857        GtkWidget *box, *label; 
     1858 
     1859        box = (GtkWidget *) g_object_get_data (G_OBJECT(widget), PAGE_DATAKEY); 
     1860 
     1861        clean = TRUE; 
     1862        _e2p_find_whether_page_is_clean (box, &clean); 
     1863 
     1864        label = (GtkWidget *) g_object_get_data (G_OBJECT(box), LABEL_DATAKEY); 
     1865        if (clean) 
     1866        { 
     1867                GtkStyle *style = gtk_widget_get_style (app.main_window); 
     1868                gtk_widget_modify_fg (label, GTK_STATE_NORMAL, &style->fg[GTK_STATE_NORMAL]); 
     1869                gtk_widget_modify_fg (label, GTK_STATE_ACTIVE, &style->fg[GTK_STATE_ACTIVE]); 
     1870        } 
     1871        else 
     1872        { 
     1873                GdkColor *new = e2_option_color_get ("color-negative"); 
     1874                gtk_widget_modify_fg (label, GTK_STATE_NORMAL, new); 
     1875                gtk_widget_modify_fg (label, GTK_STATE_ACTIVE, new); 
     1876        } 
     1877} 
     1878 
     1879/** 
     1880@brief update display of all tab-labels in @a notebook, according to whether 
     1881  all modifiable widgets in the correspoding page hold their default value 
     1882@param notebook the notebook widget of the find-dialog 
     1883 
     1884@return 
     1885*/ 
     1886static void _e2p_find_update_tablabels (GtkWidget *notebook) 
     1887{ 
     1888        gint i, count; 
     1889        GtkStyle *style; 
     1890        GdkColor *dirty; 
     1891 
     1892        style = gtk_widget_get_style (app.main_window); 
     1893        dirty = e2_option_color_get ("color-negative"); 
     1894        count = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)); 
     1895        for (i = 0; i < count; i++) 
     1896        { 
     1897                gboolean clean; 
     1898                GtkWidget *child, *label; 
     1899 
     1900                child = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), i); 
     1901                label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), child); 
     1902                clean = TRUE; 
     1903                _e2p_find_whether_page_is_clean (child, &clean); 
     1904                if (clean) 
     1905                { 
     1906                        gtk_widget_modify_fg (label, GTK_STATE_NORMAL, &style->fg[GTK_STATE_NORMAL]); 
     1907                        gtk_widget_modify_fg (label, GTK_STATE_ACTIVE, &style->fg[GTK_STATE_ACTIVE]); 
     1908                } 
     1909                else 
     1910                { 
     1911                        gtk_widget_modify_fg (label, GTK_STATE_NORMAL, dirty); 
     1912                        gtk_widget_modify_fg (label, GTK_STATE_ACTIVE, dirty); 
     1913                } 
     1914        } 
     1915} 
     1916/** 
     1917@brief make each modifiable widget in notebook page-widget aware of the 
     1918  page-widget in which it's sitting 
     1919@param widget when first called, this is a page-widget of the dialog's notebook 
     1920@param page_widget pointer to the widget to be recorded 
     1921 
     1922@return 
     1923*/ 
     1924static void _e2p_find_notify_all_widgets (GtkWidget *widget, GtkWidget *page_widget) 
     1925{ 
     1926        if (GTK_IS_CONTAINER (widget)) 
     1927                gtk_container_foreach (GTK_CONTAINER (widget), 
     1928                        (GtkCallback)_e2p_find_notify_all_widgets, page_widget); 
     1929        //only some widgets are relevant 
     1930        void (*reset_function) (GtkWidget *) = 
     1931                g_object_get_data (G_OBJECT (widget), "reset_yourself"); 
     1932        if (reset_function != NULL) 
     1933                g_object_set_data (G_OBJECT (widget), PAGE_DATAKEY, page_widget); 
     1934} 
    17961935/** 
    17971936@brief reset each resettable widget in the dialog 
     
    18021941 
    18031942@param widget to be processed 
    1804 @param data UNUSED data for the foreach fn 
    1805  
    1806 @return 
    1807 */ 
    1808 static void _e2p_find_reset_all_widgets (GtkWidget *widget, gpointer data) 
     1943@param data data supplied to the foreach func 
     1944 
     1945@return 
     1946*/ 
     1947static void _e2p_find_reset_all_widgets (GtkWidget *widget, gpointer user_data) 
    18091948{ 
    18101949        if (GTK_IS_CONTAINER (widget)) 
    1811                 gtk_container_foreach (GTK_CONTAINER (widget), _e2p_find_reset_all_widgets, NULL); 
    1812  
    1813         gpointer (*reset_function) () = g_object_get_data (G_OBJECT (widget), "reset_yourself"); 
     1950                gtk_container_foreach (GTK_CONTAINER (widget), 
     1951                        _e2p_find_reset_all_widgets, user_data); 
     1952 
     1953        void (*reset_function) (GtkWidget *) = 
     1954                g_object_get_data (G_OBJECT (widget), "reset_yourself"); 
    18141955        if (reset_function != NULL) 
    18151956                 (*reset_function) (widget); 
     
    22592400                } 
    22602401        } 
     2402        _e2p_find_widget_changed_cb (GTK_WIDGET(button), NULL); 
    22612403} 
    22622404/** 
     
    23172459                        break; 
    23182460        } 
     2461        _e2p_find_widget_changed_cb (GTK_WIDGET(button), NULL); 
    23192462} 
    23202463/** 
     
    23592502{ 
    23602503        _e2p_find_reset_all_widgets (rt->dialog, NULL); 
     2504        _e2p_find_update_tablabels (rt->notebook); 
    23612505} 
    23622506/** 
     
    30223166        _e2p_find_make_owner_tab (rt->notebook, rt);    //page 8 
    30233167        _e2p_find_make_type_tab (rt->notebook, rt);             //page 9 
     3168 
     3169        _e2p_find_update_tablabels (rt->notebook); 
    30243170} 
    30253171/** 
     
    30573203#endif 
    30583204 
     3205        _e2p_find_notify_all_widgets (vbox, vbox); 
     3206        g_object_set_data (G_OBJECT(vbox), LABEL_DATAKEY, label); 
    30593207        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 
    30603208} 
     
    30783226        GtkWidget *hbox = _e2p_find_create_hbox (vbox); 
    30793227        GtkWidget *leader = _e2p_find_create_toggle_grouped_button 
    3080                 (hbox, FSIZE_LT_P, FALSE, _("less than:"), NULL, rt); 
     3228                (hbox, FSIZE_LT_P, TRUE, _("less than:"), NULL, rt); 
    30813229        _e2p_find_create_toggle_button (hbox, 
    30823230                FSIZE_EQ_P, FALSE, _("equal to:"), rt); 
    30833231        _e2p_find_create_toggle_grouped_button (hbox, 
    3084                 FSIZE_GT_P, TRUE, _("more than"), leader, rt); 
     3232                FSIZE_GT_P, FALSE, _("more than"), leader, rt); 
    30853233 
    30863234        hbox = _e2p_find_create_hbox (vbox); 
     
    30973245                FSIZE_MB_P, FALSE, _("Mbytes"), rt); 
    30983246 
     3247        _e2p_find_notify_all_widgets (vbox, vbox); 
     3248        g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 
    30993249        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 
    31003250} 
     
    31223272#endif 
    31233273 
     3274        _e2p_find_notify_all_widgets (vbox, vbox); 
     3275        g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 
    31243276        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 
    31253277} 
     
    31623314        rt->mrel_combo = _e2p_find_create_combo (hbox, periods, PERIODCOUNT, 1); //default days 
    31633315 
     3316        _e2p_find_notify_all_widgets (vbox, vbox); 
     3317        g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 
    31643318        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 
    31653319} 
     
    32033357        rt->arel_combo = _e2p_find_create_combo (hbox, periods, PERIODCOUNT, 1); //default days 
    32043358 
     3359        _e2p_find_notify_all_widgets (vbox, vbox); 
     3360        g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 
    32053361        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 
    32063362} 
     
    32443400        rt->crel_combo = _e2p_find_create_combo (hbox, periods, PERIODCOUNT, 1); //default days 
    32453401 
     3402        _e2p_find_notify_all_widgets (vbox, vbox); 
     3403        g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 
    32463404        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 
    32473405} 
     
    33043462                STICKY_P, FALSE, _("sticky"), rt); 
    33053463 
     3464        _e2p_find_notify_all_widgets (vbox, vbox); 
     3465        g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 
    33063466        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 
    33073467} 
     
    33643524                FIFO_P, FALSE, _("fifo"), rt); 
    33653525 
     3526        _e2p_find_notify_all_widgets (vbox, vbox); 
     3527        g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 
    33663528        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 
    33673529} 
     
    34563618        } 
    34573619 
     3620        _e2p_find_notify_all_widgets (vbox, vbox); 
     3621        g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 
    34583622        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 
    34593623} 
     
    35493713#endif 
    35503714 
     3715        _e2p_find_notify_all_widgets (vbox, vbox); 
     3716        g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 
    35513717        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 
    35523718} 
     
    35783744        else 
    35793745                histdefault = -1; 
     3746        g_signal_connect (G_OBJECT (rv), "changed", G_CALLBACK (_e2p_find_widget_changed_cb), NULL); 
    35803747        g_object_set_data (G_OBJECT (rv), "default_index", GINT_TO_POINTER (histdefault)); 
    35813748        g_object_set_data (G_OBJECT (rv), "reset_yourself", _e2p_find_reset_combo); 
     
    35933760{ 
    35943761        GtkWidget *rv = e2_widget_add_entry (box, text, TRUE, FALSE); 
     3762        g_signal_connect_after (G_OBJECT (rv), "key-release-event", G_CALLBACK (_e2p_find_widget_changed_cb), NULL); 
    35953763        g_object_set_data (G_OBJECT (rv), "reset_yourself", _e2p_find_reset_entry); 
    35963764        return rv; 
     
    35993767@brief create a hbox in @a box 
    36003768 
    3601 @param box the widget into which the button is to be placed 
     3769@param box the widget into which the hbox is to be placed 
    36023770 
    36033771@return the created box widget 
     
    37843952        GtkWidget *button = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1.0, 0); 
    37853953        gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (button), TRUE); 
     3954        g_signal_connect (G_OBJECT (button), "value-changed", G_CALLBACK (_e2p_find_widget_changed_cb), NULL); 
    37863955        g_object_set_data (G_OBJECT (button), "default_value", default_value); 
    37873956        g_object_set_data (G_OBJECT (button), "reset_yourself", _e2p_find_reset_spin_button);