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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs