Enlightenment CVS committal Author : moom Project : e17 Module : libs/etk
Dir : e17/libs/etk/src/lib Modified Files: etk_combobox.c etk_editable.c etk_editable.h etk_entry.c etk_spinner.c etk_table.h etk_toplevel.c etk_widget.c etk_widget.h Log Message: * Modified patch from saturn_vk to make widgets "disable-able". Some widgets may need some more theme-work to look good when they are disabled * Add saturn_vk to the list of authors since he did a really amazing work on Etk lately. Thanks :) =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_combobox.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -3 -r1.42 -r1.43 --- etk_combobox.c 14 Mar 2007 05:40:21 -0000 1.42 +++ etk_combobox.c 18 Mar 2007 20:44:47 -0000 1.43 @@ -46,9 +46,11 @@ static void _etk_combobox_item_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); static void _etk_combobox_active_item_size_request(Etk_Widget *widget, Etk_Size *size); static void _etk_combobox_active_item_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); -static void _etk_combobox_focus_handler(Etk_Widget *widget); -static void _etk_combobox_unfocus_handler(Etk_Widget *widget); static void _etk_combobox_realize_cb(Etk_Object *object, void *data); +static void _etk_combobox_focused_cb(Etk_Widget *widget, void *data); +static void _etk_combobox_unfocused_cb(Etk_Widget *widget, void *data); +static void _etk_combobox_enabled_cb(Etk_Widget *widget, void *data); +static void _etk_combobox_disabled_cb(Etk_Widget *widget, void *data); static void _etk_combobox_key_down_cb(Etk_Object *object, Etk_Event_Key_Down *event, void *data); static void _etk_combobox_button_toggled_cb(Etk_Object *object, void *data); static void _etk_combobox_window_popped_down_cb(Etk_Object *object, void *data); @@ -799,12 +801,14 @@ combobox->items_height = DEFAULT_ITEM_HEIGHT; combobox->built = ETK_FALSE; - ETK_WIDGET(combobox)->focus = _etk_combobox_focus_handler; - ETK_WIDGET(combobox)->unfocus = _etk_combobox_unfocus_handler; ETK_WIDGET(combobox)->size_request = _etk_combobox_size_request; ETK_WIDGET(combobox)->size_allocate = _etk_combobox_size_allocate; etk_signal_connect("realize", ETK_OBJECT(combobox), ETK_CALLBACK(_etk_combobox_realize_cb), NULL); + etk_signal_connect("focus", ETK_OBJECT(combobox), ETK_CALLBACK(_etk_combobox_focused_cb), NULL); + etk_signal_connect("unfocus", ETK_OBJECT(combobox), ETK_CALLBACK(_etk_combobox_unfocused_cb), NULL); + etk_signal_connect("enabled", ETK_OBJECT(combobox), ETK_CALLBACK(_etk_combobox_enabled_cb), NULL); + etk_signal_connect("disabled", ETK_OBJECT(combobox), ETK_CALLBACK(_etk_combobox_disabled_cb), NULL); etk_signal_connect("key_down", ETK_OBJECT(combobox), ETK_CALLBACK(_etk_combobox_key_down_cb), NULL); } @@ -1040,45 +1044,61 @@ * **************************/ -/* Default handler for the "focus" handler */ -static void _etk_combobox_focus_handler(Etk_Widget *widget) +/* Called when the combobox is realized */ +static void _etk_combobox_realize_cb(Etk_Object *object, void *data) { Etk_Combobox *combobox; - if (!(combobox = ETK_COMBOBOX(widget))) + if (!(combobox = ETK_COMBOBOX(object))) return; - etk_widget_theme_signal_emit(widget, "etk,state,focused", ETK_FALSE); - etk_widget_theme_signal_emit(combobox->button, "etk,state,focused", ETK_FALSE); + /* Read the data defined in the theme */ + if (etk_widget_theme_data_get(ETK_WIDGET(combobox), "popup_offset_x", "%d", &combobox->popup_offset_x) != 1) + combobox->popup_offset_x = 0; + if (etk_widget_theme_data_get(ETK_WIDGET(combobox), "popup_offset_y", "%d", &combobox->popup_offset_y) != 1) + combobox->popup_offset_y = 0; + if (etk_widget_theme_data_get(ETK_WIDGET(combobox), "popup_extra_width", "%d", &combobox->popup_extra_w) != 1) + combobox->popup_extra_w = 0; } -/* Default handler for the "unfocus" handler */ -static void _etk_combobox_unfocus_handler(Etk_Widget *widget) +/* Called when the combobox is focused */ +static void _etk_combobox_focused_cb(Etk_Widget *widget, void *data) { Etk_Combobox *combobox; if (!(combobox = ETK_COMBOBOX(widget))) return; + etk_widget_theme_signal_emit(combobox->button, "etk,state,focused", ETK_FALSE); +} + +/* Called when the combobox is unfocused */ +static void _etk_combobox_unfocused_cb(Etk_Widget *widget, void *data) +{ + Etk_Combobox *combobox; - etk_widget_theme_signal_emit(widget, "etk,state,unfocused", ETK_FALSE); + if (!(combobox = ETK_COMBOBOX(widget))) + return; etk_widget_theme_signal_emit(combobox->button, "etk,state,unfocused", ETK_FALSE); } -/* Called when the combobox is realized */ -static void _etk_combobox_realize_cb(Etk_Object *object, void *data) +/* Called when the combobox is enabled */ +static void _etk_combobox_enabled_cb(Etk_Widget *widget, void *data) { Etk_Combobox *combobox; - if (!(combobox = ETK_COMBOBOX(object))) + if (!(combobox = ETK_COMBOBOX(widget))) return; + etk_widget_disabled_set(combobox->button, ETK_FALSE); +} + +/* Called when the combobox is disabled */ +static void _etk_combobox_disabled_cb(Etk_Widget *widget, void *data) +{ + Etk_Combobox *combobox; - /* Read the data defined in the theme */ - if (etk_widget_theme_data_get(ETK_WIDGET(combobox), "popup_offset_x", "%d", &combobox->popup_offset_x) != 1) - combobox->popup_offset_x = 0; - if (etk_widget_theme_data_get(ETK_WIDGET(combobox), "popup_offset_y", "%d", &combobox->popup_offset_y) != 1) - combobox->popup_offset_y = 0; - if (etk_widget_theme_data_get(ETK_WIDGET(combobox), "popup_extra_width", "%d", &combobox->popup_extra_w) != 1) - combobox->popup_extra_w = 0; + if (!(combobox = ETK_COMBOBOX(widget))) + return; + etk_widget_disabled_set(combobox->button, ETK_TRUE); } /* Called when a key is pressed while the combobox is focused*/ =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_editable.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- etk_editable.c 12 Mar 2007 01:46:13 -0000 1.8 +++ etk_editable.c 18 Mar 2007 20:44:47 -0000 1.9 @@ -28,6 +28,7 @@ int selection_pos; Etk_Bool selection_visible; Etk_Bool password_mode; + Etk_Bool disabled; Etk_String *text; int unicode_length; @@ -192,6 +193,41 @@ if (!editable || !(sd = evas_object_smart_data_get(editable))) return ETK_FALSE; return sd->password_mode; +} + +/** + * @brief Sets whether or not the editable object is disabled. This will just emit + * the "etk,state,disabled" or "etk,state,enabled" signal to the text-object of the editable + * @param editable an editable object + * @param disabled ETK_TRUE to disable the editable object, ETK_FALSE to enable it + */ +void etk_editable_disabled_set(Evas_Object *editable, Etk_Bool disabled) +{ + Etk_Editable_Smart_Data *sd; + + if (!editable || !(sd = evas_object_smart_data_get(editable))) + return; + if (sd->disabled == disabled) + return; + + if (disabled) + edje_object_signal_emit(sd->text_object, "etk,state,disabled", "etk"); + else + edje_object_signal_emit(sd->text_object, "etk,state,enabled", "etk"); +} + +/** + * @brief Gets whether or not the editable object is disabled + * @param editable an editable object + * @return Returns ETK_TRUE if the editable object is disabled, ETK_FALSE otherwise + */ +Etk_Bool etk_editable_disabled_get(Evas_Object *editable) +{ + Etk_Editable_Smart_Data *sd; + + if (!editable || !(sd = evas_object_smart_data_get(editable))) + return ETK_FALSE; + return sd->disabled; } /** =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_editable.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- etk_editable.h 28 Nov 2006 21:40:07 -0000 1.3 +++ etk_editable.h 18 Mar 2007 20:44:47 -0000 1.4 @@ -18,6 +18,8 @@ float etk_editable_align_get(Evas_Object *editable); void etk_editable_password_mode_set(Evas_Object *editable, Etk_Bool password_mode); Etk_Bool etk_editable_password_mode_get(Evas_Object *editable); +void etk_editable_disabled_set(Evas_Object *editable, Etk_Bool disabled); +Etk_Bool etk_editable_disabled_get(Evas_Object *editable); void etk_editable_text_set(Evas_Object *editable, const char *text); const char *etk_editable_text_get(Evas_Object *editable); =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_entry.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -3 -r1.31 -r1.32 --- etk_entry.c 17 Mar 2007 00:57:42 -0000 1.31 +++ etk_entry.c 18 Mar 2007 20:44:47 -0000 1.32 @@ -56,9 +56,9 @@ static void _etk_entry_clear_button_cb(Etk_Widget *widget, Etk_Event_Mouse_Up *event, void *data); static void _etk_entry_focus_cb(Etk_Object *object, void *data); static void _etk_entry_unfocus_cb(Etk_Object *object, void *data); +static void _etk_entry_enabled_cb(Etk_Object *object, void *data); +static void _etk_entry_disabled_cb(Etk_Object *object, void *data); static void _etk_entry_selection_received_cb(Etk_Object *object, void *event, void *data); -static void _etk_entry_show_cb(Etk_Object *object, void *data); -static void _etk_entry_hide_cb(Etk_Object *object, void *data); static void _etk_entry_selection_copy(Etk_Entry *entry, Etk_Selection_Type selection, Etk_Bool cut); static Etk_Signal *_etk_entry_signals[ETK_ENTRY_NUM_SIGNALS]; @@ -357,7 +357,8 @@ entry->text = NULL; entry->internal_entry = etk_widget_new(ETK_WIDGET_TYPE, "repeat_mouse_events", ETK_TRUE, - "theme_group", "entry", "theme_parent", entry, "parent", entry, NULL); + "theme_group", "entry", "theme_parent", entry, "parent", entry, "internal", ETK_TRUE, NULL); + etk_widget_show(entry->internal_entry); etk_object_data_set(ETK_OBJECT(entry->internal_entry), "_Etk_Entry::Entry", entry); entry->internal_entry->size_request = _etk_entry_internal_size_request; entry->internal_entry->size_allocate = _etk_entry_internal_size_allocate; @@ -375,12 +376,12 @@ ETK_CALLBACK(_etk_entry_focus_cb), NULL); etk_signal_connect("unfocus", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_unfocus_cb), NULL); + etk_signal_connect("enabled", ETK_OBJECT(entry), + ETK_CALLBACK(_etk_entry_enabled_cb), NULL); + etk_signal_connect("disabled", ETK_OBJECT(entry), + ETK_CALLBACK(_etk_entry_disabled_cb), NULL); etk_signal_connect("selection_received", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_selection_received_cb), NULL); - etk_signal_connect("show", ETK_OBJECT(entry), - ETK_CALLBACK(_etk_entry_show_cb), NULL); - etk_signal_connect("hide", ETK_OBJECT(entry), - ETK_CALLBACK(_etk_entry_hide_cb), NULL); } @@ -500,38 +501,30 @@ { Etk_Image *image; Etk_Geometry i_geometry; - int x, w; - x = geometry.x; - w = geometry.w; + i_geometry.w = i_geometry.h = ETK_MIN(IMAGE_SIZE, geometry.h); + i_geometry.y = geometry.y + (geometry.h - i_geometry.h) / 2; + if (entry->primary_image) { image = entry->primary_image; - i_geometry.x = geometry.x; - i_geometry.y = geometry.y; - i_geometry.w = i_geometry.h = ETK_MIN(IMAGE_SIZE, geometry.h); - i_geometry.y += (geometry.h - i_geometry.h) / 2; etk_widget_size_allocate(ETK_WIDGET(image), i_geometry); - x += i_geometry.w + entry->image_interspace; - w -= i_geometry.w + entry->image_interspace; + geometry.x += i_geometry.w + entry->image_interspace; + geometry.w -= i_geometry.w + entry->image_interspace; } if (entry->secondary_image) { image = entry->secondary_image; - i_geometry.x = geometry.x + geometry.w - i_geometry.w; - i_geometry.y = geometry.y; - i_geometry.w = i_geometry.h = ETK_MIN(IMAGE_SIZE, geometry.h); - i_geometry.y += (geometry.h - i_geometry.h) / 2; etk_widget_size_allocate(ETK_WIDGET(image), i_geometry); - w -= i_geometry.w + entry->image_interspace; + geometry.w -= i_geometry.w + entry->image_interspace; } - evas_object_move(entry->editable_object, x, geometry.y); - evas_object_resize(entry->editable_object, w, geometry.h); + evas_object_move(entry->editable_object, geometry.x, geometry.y); + evas_object_resize(entry->editable_object, geometry.w, geometry.h); } } @@ -554,19 +547,22 @@ return; entry->editable_object = etk_editable_add(evas); - evas_object_repeat_events_set(entry->editable_object, 1); + evas_object_show(entry->editable_object); + etk_widget_member_object_add(internal_entry, entry->editable_object); + etk_editable_theme_set(entry->editable_object, etk_widget_theme_file_get(internal_entry), etk_widget_theme_group_get(internal_entry)); etk_editable_text_set(entry->editable_object, entry->text); etk_editable_password_mode_set(entry->editable_object, entry->password_mode); + if (!etk_widget_is_focused(ETK_WIDGET(entry))) { etk_editable_cursor_hide(entry->editable_object); etk_editable_selection_hide(entry->editable_object); } - evas_object_show(entry->editable_object); - etk_widget_member_object_add(internal_entry, entry->editable_object); - + if (etk_widget_disabled_get(ETK_WIDGET(entry))) + etk_editable_disabled_set(entry->editable_object, ETK_TRUE); + evas_object_event_callback_add(entry->editable_object, EVAS_CALLBACK_MOUSE_IN, _etk_entry_editable_mouse_in_cb, entry); evas_object_event_callback_add(entry->editable_object, EVAS_CALLBACK_MOUSE_OUT, @@ -595,7 +591,6 @@ if (etk_widget_theme_data_get(internal_entry, "icon_interspace", "%d", &entry->image_interspace) != 1) entry->image_interspace = 5; - } /* Called when the entry's internal widget is unrealized */ @@ -944,6 +939,30 @@ etk_widget_theme_signal_emit(entry->internal_entry, "etk,state,unfocused", ETK_FALSE); } +/* Called when the entry gets enabled */ +static void _etk_entry_enabled_cb(Etk_Object *object, void *data) +{ + Etk_Entry *entry; + + if (!(entry = ETK_ENTRY(object))) + return; + + etk_widget_disabled_set(entry->internal_entry, ETK_FALSE); + etk_editable_disabled_set(entry->editable_object, ETK_FALSE); +} + +/* Called when the entry gets disabled */ +static void _etk_entry_disabled_cb(Etk_Object *object, void *data) +{ + Etk_Entry *entry; + + if (!(entry = ETK_ENTRY(object))) + return; + + etk_widget_disabled_set(entry->internal_entry, ETK_TRUE); + etk_editable_disabled_set(entry->editable_object, ETK_TRUE); +} + /* Called when the selection/clipboard content is received */ static void _etk_entry_selection_received_cb(Etk_Object *object, void *event, void *data) { @@ -976,32 +995,6 @@ if (changed) etk_signal_emit(_etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL], ETK_OBJECT(entry), NULL); } -} - -/* Redirect the show signal to the entry's children */ -static void _etk_entry_show_cb(Etk_Object *object, void *data) -{ - Etk_Entry *entry; - if (!(entry = object)) - return; - - etk_widget_show(entry->internal_entry); - etk_widget_show(entry->primary_image); - etk_widget_show(entry->secondary_image); - evas_object_show(entry->editable_object); -} - -/* Redirect the hide signal to the entry's children */ -static void _etk_entry_hide_cb(Etk_Object *object, void *data) -{ - Etk_Entry *entry; - if (!(entry = object)) - return; - - etk_widget_hide(entry->internal_entry); - etk_widget_hide(entry->primary_image); - etk_widget_hide(entry->secondary_image); - evas_object_hide(entry->editable_object); } /************************** =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_spinner.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- etk_spinner.c 22 Feb 2007 04:36:25 -0000 1.6 +++ etk_spinner.c 18 Mar 2007 20:44:47 -0000 1.7 @@ -36,6 +36,8 @@ static void _etk_spinner_unrealize_cb(Etk_Object *object, void *data); static void _etk_spinner_focus_cb(Etk_Object *object, void *data); static void _etk_spinner_unfocus_cb(Etk_Object *object, void *data); +static void _etk_spinner_enabled_cb(Etk_Object *object, void *data); +static void _etk_spinner_disabled_cb(Etk_Object *object, void *data); static void _etk_spinner_key_down_cb(Etk_Object *object, Etk_Event_Key_Down *event, void *data); static void _etk_spinner_key_up_cb(Etk_Object *object, Etk_Event_Key_Up *event, void *data); @@ -235,10 +237,12 @@ etk_signal_connect("key_up", ETK_OBJECT(spinner), ETK_CALLBACK(_etk_spinner_key_up_cb), NULL); etk_signal_connect("focus", ETK_OBJECT(spinner), ETK_CALLBACK(_etk_spinner_focus_cb), NULL); etk_signal_connect("unfocus", ETK_OBJECT(spinner), ETK_CALLBACK(_etk_spinner_unfocus_cb), NULL); + etk_signal_connect("enabled", ETK_OBJECT(spinner), ETK_CALLBACK(_etk_spinner_enabled_cb), NULL); + etk_signal_connect("disabled", ETK_OBJECT(spinner), ETK_CALLBACK(_etk_spinner_disabled_cb), NULL); etk_signal_connect("selection_received", ETK_OBJECT(spinner), - ETK_CALLBACK(_etk_spinner_selection_received_cb), NULL); + ETK_CALLBACK(_etk_spinner_selection_received_cb), NULL); etk_object_notification_callback_add(ETK_OBJECT(spinner), "step_increment", - _etk_spinner_step_increment_changed_cb, NULL); + _etk_spinner_step_increment_changed_cb, NULL); } /* Sets the property whose id is "property_id" to the value "value" */ @@ -321,8 +325,11 @@ /* Create the editable object */ spinner->editable_object = etk_editable_add(evas); + evas_object_show(spinner->editable_object); + etk_widget_member_object_add(ETK_WIDGET(spinner), spinner->editable_object); + etk_editable_theme_set(spinner->editable_object, etk_widget_theme_file_get(ETK_WIDGET(spinner)), - etk_widget_theme_group_get(ETK_WIDGET(spinner))); + etk_widget_theme_group_get(ETK_WIDGET(spinner))); etk_editable_align_set(spinner->editable_object, 1.0); if (!etk_widget_is_focused(ETK_WIDGET(spinner))) @@ -330,8 +337,9 @@ etk_editable_cursor_hide(spinner->editable_object); etk_editable_selection_hide(spinner->editable_object); } - evas_object_show(spinner->editable_object); - etk_widget_member_object_add(ETK_WIDGET(spinner), spinner->editable_object); + if (etk_widget_disabled_get(ETK_WIDGET(spinner))) + etk_editable_disabled_set(spinner->editable_object, ETK_TRUE); + evas_object_event_callback_add(spinner->editable_object, EVAS_CALLBACK_MOUSE_IN, _etk_spinner_editable_mouse_in_cb, spinner); @@ -392,6 +400,26 @@ etk_editable_selection_hide(spinner->editable_object); _etk_spinner_update_value_from_text(spinner); +} + +/* Called when the spinner gets enabled */ +static void _etk_spinner_enabled_cb(Etk_Object *object, void *data) +{ + Etk_Spinner *spinner; + + if (!(spinner = ETK_SPINNER(object))) + return; + etk_editable_disabled_set(spinner->editable_object, ETK_FALSE); +} + +/* Called when the spinner gets disabled */ +static void _etk_spinner_disabled_cb(Etk_Object *object, void *data) +{ + Etk_Spinner *spinner; + + if (!(spinner = ETK_SPINNER(object))) + return; + etk_editable_disabled_set(spinner->editable_object, ETK_TRUE); } /* Called when the user presses a key */ =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_table.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- etk_table.h 27 Jan 2007 05:14:32 -0000 1.7 +++ etk_table.h 18 Mar 2007 20:44:47 -0000 1.8 @@ -6,6 +6,8 @@ #include <Evas.h> #include "etk_types.h" +/* TODO: a table can be homogeneous vertically but not horizontally.. */ + /** * @defgroup Etk_Table Etk_Table * @brief The Etk_Table widget is a container that can contain several children aligned on a grid =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_toplevel.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- etk_toplevel.c 9 Dec 2006 09:56:33 -0000 1.3 +++ etk_toplevel.c 18 Mar 2007 20:44:47 -0000 1.4 @@ -170,7 +170,8 @@ return NULL; prev = toplevel->focused_widget; - while ((prev = _etk_toplevel_prev_to_focus_get(toplevel, prev)) && !prev->focusable); + while ((prev = _etk_toplevel_prev_to_focus_get(toplevel, prev)) + && (!prev->focusable || etk_widget_disabled_get(prev))); return prev; } @@ -188,7 +189,8 @@ return NULL; next = toplevel->focused_widget; - while ((next = _etk_toplevel_next_to_focus_get(toplevel, next)) && !next->focusable); + while ((next = _etk_toplevel_next_to_focus_get(toplevel, next)) + && (!next->focusable || etk_widget_disabled_get(next))); return next; } =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_widget.c,v retrieving revision 1.102 retrieving revision 1.103 diff -u -3 -r1.102 -r1.103 --- etk_widget.c 12 Mar 2007 01:46:13 -0000 1.102 +++ etk_widget.c 18 Mar 2007 20:44:47 -0000 1.103 @@ -9,7 +9,6 @@ #include "etk_theme.h" #include "etk_container.h" #include "etk_toplevel.h" -#include "etk_drag.h" #include "etk_event.h" #include "etk_marshallers.h" #include "etk_signal.h" @@ -56,6 +55,8 @@ ETK_WIDGET_LEAVE_SIGNAL, ETK_WIDGET_FOCUS_SIGNAL, ETK_WIDGET_UNFOCUS_SIGNAL, + ETK_WIDGET_ENABLED_SIGNAL, + ETK_WIDGET_DISABLED_SIGNAL, ETK_WIDGET_SCROLL_SIZE_CHANGED_SIGNAL, ETK_WIDGET_SELECTION_RECEIVED_SIGNAL, ETK_WIDGET_NUM_SIGNALS @@ -72,6 +73,7 @@ ETK_WIDGET_WIDTH_REQUEST_PROPERTY, ETK_WIDGET_HEIGHT_REQUEST_PROPERTY, ETK_WIDGET_VISIBLE_PROPERTY, + ETK_WIDGET_DISABLED_PROPERTY, ETK_WIDGET_INTERNAL_PROPERTY, ETK_WIDGET_REPEAT_MOUSE_EVENTS_PROPERTY, ETK_WIDGET_PASS_MOUSE_EVENTS_PROPERTY, @@ -91,6 +93,8 @@ static void _etk_widget_leave_handler(Etk_Widget *widget); static void _etk_widget_focus_handler(Etk_Widget *widget); static void _etk_widget_unfocus_handler(Etk_Widget *widget); +static void _etk_widget_enabled_handler(Etk_Widget *widget); +static void _etk_widget_disabled_handler(Etk_Widget *widget); static void _etk_widget_mouse_in_cb(void *data, Evas *evas, Evas_Object *object, void *event_info); static void _etk_widget_mouse_out_cb(void *data, Evas *evas, Evas_Object *object, void *event_info); @@ -208,6 +212,10 @@ widget_type, ETK_MEMBER_OFFSET(Etk_Widget, leave), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_FOCUS_SIGNAL] = etk_signal_new("focus", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, focus), etk_marshaller_VOID__VOID, NULL, NULL); + _etk_widget_signals[ETK_WIDGET_ENABLED_SIGNAL] = etk_signal_new("enabled", + widget_type, ETK_MEMBER_OFFSET(Etk_Widget, enable), etk_marshaller_VOID__VOID, NULL, NULL); + _etk_widget_signals[ETK_WIDGET_DISABLED_SIGNAL] = etk_signal_new("disabled", + widget_type, ETK_MEMBER_OFFSET(Etk_Widget, disable), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_UNFOCUS_SIGNAL] = etk_signal_new("unfocus", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, unfocus), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_SCROLL_SIZE_CHANGED_SIGNAL] = etk_signal_new("scroll_size_changed", @@ -724,7 +732,7 @@ return; widget->pass_mouse_events = pass_mouse_events; - if (widget->smart_object) + if (widget->smart_object && !widget->disabled) evas_object_pass_events_set(widget->smart_object, pass_mouse_events); etk_object_notify(ETK_OBJECT(widget), "pass_mouse_events"); } @@ -775,6 +783,41 @@ } /** + * @brief Sets whether or not the widget is disabled. When a widget is disabled, the user can't interact + * with it anymore until it's enabled again. The widget will also look "disabled" + * @param widget a widget + * @param disabled ETK_TRUE to disable the widget, ETK_FALSE to enable it + */ +void etk_widget_disabled_set(Etk_Widget *widget, Etk_Bool disabled) +{ + if (!widget || widget->disabled == disabled) + return; + + widget->disabled = disabled; + etk_widget_unfocus(widget); + + if (widget->smart_object && !widget->pass_mouse_events) + evas_object_pass_events_set(widget->smart_object, disabled); + if (disabled) + etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DISABLED_SIGNAL], ETK_OBJECT(widget), NULL); + else + etk_signal_emit(_etk_widget_signals[ETK_WIDGET_ENABLED_SIGNAL], ETK_OBJECT(widget), NULL); + etk_object_notify(ETK_OBJECT(widget), "disabled"); +} + +/** + * @brief Gets whether or not the widget is disabled + * @param widget a widget + * @return Returns ETK_TRUE if the widget is disabled, ETK_FALSE otherwise + */ +Etk_Bool etk_widget_disabled_get(Etk_Widget *widget) +{ + if (!widget) + return ETK_FALSE; + return widget->disabled; +} + +/** * @brief Shows the widget * @param widget a widget * @note The widget will effectively be shown if all its parents are also shown @@ -1147,7 +1190,7 @@ { Etk_Widget *focused; - if (!widget || !widget->toplevel_parent || !widget->focusable) + if (!widget || !widget->toplevel_parent || !widget->focusable || etk_widget_disabled_get(widget)) return; if ((focused = etk_toplevel_focused_widget_get(widget->toplevel_parent)) && (widget == focused)) return; @@ -1783,6 +1826,8 @@ widget->leave = _etk_widget_leave_handler; widget->focus = _etk_widget_focus_handler; widget->unfocus = _etk_widget_unfocus_handler; + widget->enable = _etk_widget_enabled_handler; + widget->disable = _etk_widget_disabled_handler; widget->inset.left = 0; widget->inset.right = 0; @@ -1818,6 +1863,7 @@ widget->internal = ETK_FALSE; widget->focusable = ETK_FALSE; widget->focus_on_click = ETK_FALSE; + widget->disabled = ETK_FALSE; widget->has_event_object = ETK_FALSE; widget->repeat_mouse_events = ETK_FALSE; widget->pass_mouse_events = ETK_FALSE; @@ -1919,6 +1965,9 @@ else etk_widget_hide(widget); break; + case ETK_WIDGET_DISABLED_PROPERTY: + etk_widget_disabled_set(widget, etk_property_value_bool_get(value)); + break; case ETK_WIDGET_INTERNAL_PROPERTY: etk_widget_internal_set(widget, etk_property_value_bool_get(value)); break; @@ -1974,6 +2023,9 @@ case ETK_WIDGET_VISIBLE_PROPERTY: etk_property_value_bool_set(value, widget->visible); break; + case ETK_WIDGET_DISABLED_PROPERTY: + etk_property_value_bool_set(value, widget->disabled); + break; case ETK_WIDGET_INTERNAL_PROPERTY: etk_property_value_bool_set(value, widget->internal); break; @@ -2035,13 +2087,29 @@ etk_widget_theme_signal_emit(widget, "etk,state,unfocused", ETK_FALSE); } -/* Sets the widget as visible and queues a visibility update */ +/* Default handler for the "show" signal */ static void _etk_widget_show_handler(Etk_Widget *widget) { if (!widget) return; etk_widget_theme_signal_emit(widget, "etk,state,shown", ETK_FALSE); } + +/* Default handler for the "enabled" signal */ +static void _etk_widget_enabled_handler(Etk_Widget *widget) +{ + if (!widget) + return; + etk_widget_theme_signal_emit(widget, "etk,state,enabled", ETK_FALSE); +} + +/* Default handler for the "disabled" signal */ +static void _etk_widget_disabled_handler(Etk_Widget *widget) +{ + if (!widget) + return; + etk_widget_theme_signal_emit(widget, "etk,state,disabled", ETK_FALSE); +} /* Evas Callback: Called when the mouse pointer enters the widget */ static void _etk_widget_mouse_in_cb(void *data, Evas *evas, Evas_Object *object, void *event_info) @@ -2052,7 +2120,7 @@ if (!(widget = ETK_WIDGET(data))) return; - if (!widget->pass_mouse_events) + if (!widget->pass_mouse_events || widget->disabled) { etk_event_mouse_in_wrap(widget, event_info, &event); etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_IN_SIGNAL], ETK_OBJECT(widget), NULL, &event); @@ -2068,7 +2136,7 @@ if (!(widget = ETK_WIDGET(data))) return; - if (!widget->pass_mouse_events) + if (!widget->pass_mouse_events || widget->disabled) { etk_event_mouse_out_wrap(widget, event_info, &event); etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_OUT_SIGNAL], ETK_OBJECT(widget), NULL, &event); @@ -2084,7 +2152,7 @@ if (!(widget = ETK_WIDGET(data))) return; - if (!widget->pass_mouse_events) + if (!widget->pass_mouse_events || widget->disabled) { etk_event_mouse_move_wrap(widget, event_info, &event); etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_MOVE_SIGNAL], ETK_OBJECT(widget), NULL, &event); @@ -2103,7 +2171,7 @@ if (!(widget = ETK_WIDGET(data))) return; - if (!widget->pass_mouse_events) + if (!widget->pass_mouse_events || widget->disabled) { etk_event_mouse_down_wrap(widget, event_info, &event); etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_DOWN_SIGNAL], ETK_OBJECT(widget), NULL, &event); @@ -2122,7 +2190,7 @@ if (!(widget = ETK_WIDGET(data))) return; - if (!widget->pass_mouse_events) + if (!widget->pass_mouse_events || widget->disabled) { etk_event_mouse_up_wrap(widget, event_info, &event); etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_UP_SIGNAL], ETK_OBJECT(widget), NULL, &event); @@ -2145,7 +2213,7 @@ Etk_Event_Mouse_Wheel event; Etk_Bool propagate; - if (!(widget = ETK_WIDGET(data))) + if (!(widget = ETK_WIDGET(data)) || etk_widget_disabled_get(widget)) return; etk_event_mouse_wheel_wrap(widget, event_info, &event); @@ -2255,7 +2323,7 @@ evas_object_hide(widget->smart_object); evas_object_propagate_events_set(widget->smart_object, 0); - evas_object_pass_events_set(widget->smart_object, widget->pass_mouse_events); + evas_object_pass_events_set(widget->smart_object, (widget->pass_mouse_events || widget->disabled)); /* Then, we create the theme-object */ widget->theme_object = edje_object_add(evas); @@ -2290,6 +2358,10 @@ widget->inset.top = 0; widget->inset.bottom = 0; } + + if (widget->disabled || (widget->emit_theme_parent_signals + && widget->theme_parent && widget->theme_parent->disabled)) + etk_widget_theme_signal_emit(widget, "etk,state,disabled", ETK_FALSE); } else { @@ -2306,17 +2378,18 @@ evas_object_lower(widget->event_object); } } - - widget->need_theme_size_recalc = ETK_TRUE; - widget->realized = ETK_TRUE; - - etk_signal_emit(_etk_widget_signals[ETK_WIDGET_REALIZE_SIGNAL], ETK_OBJECT(widget), NULL); /* Finally, we clip the widget */ if (widget->clip) evas_object_clip_set(widget->smart_object, widget->clip); + + widget->need_theme_size_recalc = ETK_TRUE; + widget->realized = ETK_TRUE; + etk_signal_emit(_etk_widget_signals[ETK_WIDGET_REALIZE_SIGNAL], ETK_OBJECT(widget), NULL); etk_widget_size_recalc_queue(widget); } + +/* TODO: Fix emission of "etk,state,shown" */ /* Unrealizes the widget: it will unload the theme and free the graphical ressources */ static void _etk_widget_unrealize(Etk_Widget *widget) =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_widget.h,v retrieving revision 1.46 retrieving revision 1.47 diff -u -3 -r1.46 -r1.47 --- etk_widget.h 8 Mar 2007 18:16:02 -0000 1.46 +++ etk_widget.h 18 Mar 2007 20:44:47 -0000 1.47 @@ -85,6 +85,8 @@ void (*leave)(Etk_Widget *widget); void (*focus)(Etk_Widget *widget); void (*unfocus)(Etk_Widget *widget); + void (*enable)(Etk_Widget *widget); + void (*disable)(Etk_Widget *widget); unsigned int realized : 1; unsigned int swallowed : 1; @@ -95,6 +97,7 @@ unsigned int has_event_object : 1; unsigned int focusable : 1; unsigned int focus_on_click : 1; + unsigned int disabled : 1; unsigned int need_size_recalc : 1; unsigned int need_redraw : 1; unsigned int need_theme_size_recalc : 1; @@ -133,6 +136,9 @@ void etk_widget_internal_set(Etk_Widget *widget, Etk_Bool internal); Etk_Bool etk_widget_internal_get(Etk_Widget *widget); + +void etk_widget_disabled_set(Etk_Widget *widget, Etk_Bool disabled); +Etk_Bool etk_widget_disabled_get(Etk_Widget *widget); void etk_widget_show(Etk_Widget *widget); void etk_widget_show_all(Etk_Widget *widget); ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs