Changeset 2048
- Timestamp:
- 02/19/10 07:45:52 (5 months ago)
- Files:
-
- 1 modified
-
trunk/plugins/e2p_find.c (modified) (23 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/plugins/e2p_find.c
r2028 r2048 61 61 #include "e2_dialog.h" 62 62 #include "e2_task.h" 63 64 #define PAGE_DATAKEY "__book-child" 65 #define LABEL_DATAKEY "__tab-label" 63 66 64 67 //support mime-type search criteria … … 296 299 }; 297 300 */ 301 302 static void _e2p_find_reset_spin_button (GtkWidget *widget); 303 static void _e2p_find_reset_entry (GtkWidget *widget); 304 static void _e2p_find_reset_combo (GtkWidget *widget); 305 static void _e2p_find_set_toggle_button_on (GtkToggleButton *button); 306 static void _e2p_find_set_toggle_button_off (GtkToggleButton *button); 298 307 299 308 #ifdef TRACKERFIND … … 1794 1803 // current->second = (gfloat) tm_time.tm_sec; 1795 1804 } 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 */ 1815 static 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 */ 1854 static 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 */ 1886 static 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 */ 1924 static 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 } 1796 1935 /** 1797 1936 @brief reset each resettable widget in the dialog … … 1802 1941 1803 1942 @param widget to be processed 1804 @param data UNUSED data for the foreach fn1805 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 */ 1947 static void _e2p_find_reset_all_widgets (GtkWidget *widget, gpointer user_data) 1809 1948 { 1810 1949 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"); 1814 1955 if (reset_function != NULL) 1815 1956 (*reset_function) (widget); … … 2259 2400 } 2260 2401 } 2402 _e2p_find_widget_changed_cb (GTK_WIDGET(button), NULL); 2261 2403 } 2262 2404 /** … … 2317 2459 break; 2318 2460 } 2461 _e2p_find_widget_changed_cb (GTK_WIDGET(button), NULL); 2319 2462 } 2320 2463 /** … … 2359 2502 { 2360 2503 _e2p_find_reset_all_widgets (rt->dialog, NULL); 2504 _e2p_find_update_tablabels (rt->notebook); 2361 2505 } 2362 2506 /** … … 3022 3166 _e2p_find_make_owner_tab (rt->notebook, rt); //page 8 3023 3167 _e2p_find_make_type_tab (rt->notebook, rt); //page 9 3168 3169 _e2p_find_update_tablabels (rt->notebook); 3024 3170 } 3025 3171 /** … … 3057 3203 #endif 3058 3204 3205 _e2p_find_notify_all_widgets (vbox, vbox); 3206 g_object_set_data (G_OBJECT(vbox), LABEL_DATAKEY, label); 3059 3207 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 3060 3208 } … … 3078 3226 GtkWidget *hbox = _e2p_find_create_hbox (vbox); 3079 3227 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); 3081 3229 _e2p_find_create_toggle_button (hbox, 3082 3230 FSIZE_EQ_P, FALSE, _("equal to:"), rt); 3083 3231 _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); 3085 3233 3086 3234 hbox = _e2p_find_create_hbox (vbox); … … 3097 3245 FSIZE_MB_P, FALSE, _("Mbytes"), rt); 3098 3246 3247 _e2p_find_notify_all_widgets (vbox, vbox); 3248 g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 3099 3249 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 3100 3250 } … … 3122 3272 #endif 3123 3273 3274 _e2p_find_notify_all_widgets (vbox, vbox); 3275 g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 3124 3276 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 3125 3277 } … … 3162 3314 rt->mrel_combo = _e2p_find_create_combo (hbox, periods, PERIODCOUNT, 1); //default days 3163 3315 3316 _e2p_find_notify_all_widgets (vbox, vbox); 3317 g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 3164 3318 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 3165 3319 } … … 3203 3357 rt->arel_combo = _e2p_find_create_combo (hbox, periods, PERIODCOUNT, 1); //default days 3204 3358 3359 _e2p_find_notify_all_widgets (vbox, vbox); 3360 g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 3205 3361 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 3206 3362 } … … 3244 3400 rt->crel_combo = _e2p_find_create_combo (hbox, periods, PERIODCOUNT, 1); //default days 3245 3401 3402 _e2p_find_notify_all_widgets (vbox, vbox); 3403 g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 3246 3404 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 3247 3405 } … … 3304 3462 STICKY_P, FALSE, _("sticky"), rt); 3305 3463 3464 _e2p_find_notify_all_widgets (vbox, vbox); 3465 g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 3306 3466 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 3307 3467 } … … 3364 3524 FIFO_P, FALSE, _("fifo"), rt); 3365 3525 3526 _e2p_find_notify_all_widgets (vbox, vbox); 3527 g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 3366 3528 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 3367 3529 } … … 3456 3618 } 3457 3619 3620 _e2p_find_notify_all_widgets (vbox, vbox); 3621 g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 3458 3622 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 3459 3623 } … … 3549 3713 #endif 3550 3714 3715 _e2p_find_notify_all_widgets (vbox, vbox); 3716 g_object_set_data (G_OBJECT (vbox), LABEL_DATAKEY, label); 3551 3717 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 3552 3718 } … … 3578 3744 else 3579 3745 histdefault = -1; 3746 g_signal_connect (G_OBJECT (rv), "changed", G_CALLBACK (_e2p_find_widget_changed_cb), NULL); 3580 3747 g_object_set_data (G_OBJECT (rv), "default_index", GINT_TO_POINTER (histdefault)); 3581 3748 g_object_set_data (G_OBJECT (rv), "reset_yourself", _e2p_find_reset_combo); … … 3593 3760 { 3594 3761 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); 3595 3763 g_object_set_data (G_OBJECT (rv), "reset_yourself", _e2p_find_reset_entry); 3596 3764 return rv; … … 3599 3767 @brief create a hbox in @a box 3600 3768 3601 @param box the widget into which the buttonis to be placed3769 @param box the widget into which the hbox is to be placed 3602 3770 3603 3771 @return the created box widget … … 3784 3952 GtkWidget *button = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1.0, 0); 3785 3953 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); 3786 3955 g_object_set_data (G_OBJECT (button), "default_value", default_value); 3787 3956 g_object_set_data (G_OBJECT (button), "reset_yourself", _e2p_find_reset_spin_button);