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

Reply via email to