Enlightenment CVS committal Author : urandom Project : e17 Module : libs/etk
Dir : e17/libs/etk/src/lib Modified Files: etk_entry.c etk_entry.h Log Message: [Entry] Never again shall entries be denied the simple right to own images! =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_entry.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -3 -r1.24 -r1.25 --- etk_entry.c 12 Jan 2007 03:16:50 -0000 1.24 +++ etk_entry.c 13 Jan 2007 18:39:23 -0000 1.25 @@ -9,6 +9,7 @@ #include "etk_signal.h" #include "etk_signal_callback.h" #include "etk_utils.h" +#include "etk_image.h" /** * @addtogroup Etk_Entry @@ -33,16 +34,22 @@ static void _etk_entry_realize_cb(Etk_Object *object, void *data); static void _etk_entry_unrealize_cb(Etk_Object *object, void *data); static void _etk_entry_key_down_cb(Etk_Object *object, Etk_Event_Key_Down *event, void *data); -static void _etk_entry_mouse_in_cb(Etk_Object *object, Etk_Event_Mouse_In *event, void *data); -static void _etk_entry_mouse_out_cb(Etk_Object *object, Etk_Event_Mouse_Out *event, void *data); -static void _etk_entry_mouse_down_cb(Etk_Object *object, Etk_Event_Mouse_Down *event, void *data); -static void _etk_entry_mouse_up_cb(Etk_Object *object, Etk_Event_Mouse_Up *event, void *data); -static void _etk_entry_mouse_move_cb(Etk_Object *object, Etk_Event_Mouse_Move *event, void *data); +static void _etk_entry_editable_mouse_in_cb(void *data, Evas *evas, Evas_Object *object, void *event_info); +static void _etk_entry_editable_mouse_out_cb(void *data, Evas *evas, Evas_Object *object, void *event_info); +static void _etk_entry_editable_mouse_down_cb(void *data, Evas *evas, Evas_Object *object, void *event_info); +static void _etk_entry_editable_mouse_up_cb(void *data, Evas *evas, Evas_Object *object, void *event_info); +static void _etk_entry_editable_mouse_move_cb(void *data, Evas *evas, Evas_Object *object, void *event_info); +static void _etk_entry_image_mouse_in_cb(Etk_Widget *widget, Etk_Event_Mouse_In *event, void *data); +static void _etk_entry_image_mouse_out_cb(Etk_Widget *widget, Etk_Event_Mouse_Out *event, void *data); +static void _etk_entry_image_mouse_down_cb(Etk_Widget *widget, Etk_Event_Mouse_Down *event, void *data); +static void _etk_entry_image_mouse_up_cb(Etk_Widget *widget, Etk_Event_Mouse_Up *event, void *data); +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_selection_received_cb(Etk_Object *object, void *event, void *data); static void _etk_entry_selection_copy(Etk_Entry *entry, Etk_Selection_Type selection, Etk_Bool cut); - +static void _etk_entry_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); + static Etk_Signal *_etk_entry_signals[ETK_ENTRY_NUM_SIGNALS]; @@ -68,10 +75,10 @@ _etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL] = etk_signal_new("text_changed", entry_type, -1, etk_marshaller_VOID__VOID, NULL, NULL); - + etk_type_property_add(entry_type, "password_mode", ETK_ENTRY_PASSWORD_MODE_PROPERTY, ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_bool(ETK_FALSE)); - + entry_type->property_set = _etk_entry_property_set; entry_type->property_get = _etk_entry_property_get; } @@ -98,7 +105,7 @@ { if (!entry) return; - + if (!entry->editable_object) { if (entry->text != text) @@ -109,7 +116,7 @@ } else etk_editable_text_set(entry->editable_object, text); - + etk_signal_emit(_etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL], ETK_OBJECT(entry), NULL); } @@ -122,7 +129,7 @@ { if (!entry) return NULL; - + if (!entry->editable_object) return entry->text; else @@ -139,6 +146,160 @@ } /** + * @brief Sets an image inside the entry + * @param entry an entry + * @param position image position + * @param image an image + * @note If you want to remove an existing image, pass NULL instead of an Etk_Image + */ +void etk_entry_image_set(Etk_Entry *entry, Etk_Entry_Image_Position position, Etk_Image *image) +{ + int ok = 0; + + if (!entry) + return; + + if (position == ETK_ENTRY_IMAGE_PRIMARY) + { + if (entry->primary_image == image) + return; + + if (entry->primary_image) + { + etk_widget_parent_set(ETK_WIDGET(entry->primary_image), NULL); + etk_widget_internal_set(ETK_WIDGET(entry->primary_image), ETK_FALSE); + entry->primary_image = NULL; + } + if (!image) + return; + + entry->primary_image = image; + ok = 1; + } + else if (position == ETK_ENTRY_IMAGE_SECONDARY) + { + if (entry->secondary_image == image) + return; + + if (entry->secondary_image) + { + etk_widget_parent_set(ETK_WIDGET(entry->secondary_image), NULL); + etk_widget_internal_set(ETK_WIDGET(entry->secondary_image), ETK_FALSE); + entry->secondary_image = NULL; + } + if (!image) + return; + + entry->secondary_image = image; + ok = 1; + } + + if (ok) + { + etk_widget_parent_set(ETK_WIDGET(image), ETK_WIDGET(entry)); + etk_widget_internal_set(ETK_WIDGET(image), ETK_TRUE); + etk_widget_show(ETK_WIDGET(image)); + etk_entry_image_highlight_set(entry, position, ETK_TRUE); + } +} + +/** + * @brief Sets whether the image will be highlighted on mouse-over + * @param entry an entry + * @param position image position + * @param highlight if @a highlight is ETK_TRUE, the image will be highlighted + * @note By default, the image has mouse highlight turn on + */ +void etk_entry_image_highlight_set(Etk_Entry *entry, Etk_Entry_Image_Position position, Etk_Bool highlight) +{ + Etk_Image *image; + + if (!entry) + return; + + if (position == ETK_ENTRY_IMAGE_PRIMARY) + { + if (!(image = entry->primary_image)) + return; + if (entry->primary_image_highlight == highlight) + return; + + entry->primary_image_highlight = highlight; + } + else if (position == ETK_ENTRY_IMAGE_SECONDARY) + { + if (!(image = entry->secondary_image)) + return; + if (entry->secondary_image_highlight == highlight) + return; + + entry->secondary_image_highlight = highlight; + } + else return; + + if (highlight) + { + etk_signal_connect("mouse_in", ETK_OBJECT(image), + ETK_CALLBACK(_etk_entry_image_mouse_in_cb), entry); + etk_signal_connect("mouse_out", ETK_OBJECT(image), + ETK_CALLBACK(_etk_entry_image_mouse_out_cb), entry); + etk_signal_connect("mouse_down", ETK_OBJECT(image), + ETK_CALLBACK(_etk_entry_image_mouse_down_cb), entry); + etk_signal_connect("mouse_up", ETK_OBJECT(image), + ETK_CALLBACK(_etk_entry_image_mouse_up_cb), entry); + } + else + { + etk_signal_disconnect("mouse_in", ETK_OBJECT(image), + ETK_CALLBACK(_etk_entry_image_mouse_in_cb)); + etk_signal_disconnect("mouse_out", ETK_OBJECT(image), + ETK_CALLBACK(_etk_entry_image_mouse_out_cb)); + etk_signal_disconnect("mouse_down", ETK_OBJECT(image), + ETK_CALLBACK(_etk_entry_image_mouse_down_cb)); + etk_signal_disconnect("mouse_up", ETK_OBJECT(image), + ETK_CALLBACK(_etk_entry_image_mouse_up_cb)); + + evas_object_color_set(etk_image_evas_object_get(image), 255, 255, 255, 255); + } +} + +/** + * @brief Gets the image of the entry + * @param entry an entry + * @param position image position + * @return Returns the image of the entry + */ +void etk_entry_add_clear_button(Etk_Entry *entry) +{ + Etk_Widget *image; + + if (!entry) + return; + + image = etk_image_new_from_stock(ETK_STOCK_EDIT_CLEAR, ETK_STOCK_SMALL); + etk_entry_image_set(entry, ETK_ENTRY_IMAGE_SECONDARY, ETK_IMAGE(image)); + etk_signal_connect("mouse_click", ETK_OBJECT(image), + ETK_CALLBACK(_etk_entry_clear_button_cb), entry); +} + +/** + * @brief Adds a clear button to the entry + * @param entry an entry + */ +Etk_Image *etk_entry_image_get(Etk_Entry *entry, Etk_Entry_Image_Position position) +{ + if (!entry) + return NULL; + + if (position == ETK_ENTRY_IMAGE_PRIMARY) + return entry->primary_image; + else if (position == ETK_ENTRY_IMAGE_SECONDARY) + return entry->secondary_image; + + return NULL; +} + +/** * @brief Sets whether or not the entry is in password mode * @param entry an entry * @param password_mode ETK_TRUE to turn the entry into a password entry, ETK_FALSE to turn it into a normal entry @@ -147,7 +308,7 @@ { if (!entry || entry->password_mode == password_mode) return; - + if (entry->editable_object) etk_editable_password_mode_set(entry->editable_object, password_mode); entry->password_mode = password_mode; @@ -175,23 +336,30 @@ /* Initializes the default values of the entry */ static void _etk_entry_constructor(Etk_Entry *entry) { + Etk_Widget *widget; + if (!entry) return; + if (!(widget = ETK_WIDGET(entry))) + return; + + entry->primary_image = NULL; + entry->secondary_image = NULL; entry->editable_object = NULL; entry->password_mode = ETK_FALSE; entry->selection_dragging = ETK_FALSE; + entry->primary_image_highlight = ETK_FALSE; + entry->secondary_image_highlight = ETK_FALSE; entry->pointer_set = ETK_FALSE; - entry->text = NULL; - + entry->text = NULL; + entry->inner_part_margin = 2; + + widget->size_allocate = _etk_entry_size_allocate; + etk_signal_connect("realize", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_realize_cb), NULL); etk_signal_connect("unrealize", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_unrealize_cb), NULL); etk_signal_connect("key_down", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_key_down_cb), NULL); - etk_signal_connect("mouse_in", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_mouse_in_cb), NULL); - etk_signal_connect("mouse_out", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_mouse_out_cb), NULL); - etk_signal_connect("mouse_down", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_mouse_down_cb), NULL); - etk_signal_connect("mouse_up", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_mouse_up_cb), NULL); - etk_signal_connect("mouse_move", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_mouse_move_cb), NULL); etk_signal_connect("focus", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_focus_cb), NULL); etk_signal_connect("unfocus", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_unfocus_cb), NULL); etk_signal_connect("selection_received", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_selection_received_cb), NULL); @@ -203,16 +371,21 @@ if (!entry) return; free(entry->text); + + if (entry->primary_image) + etk_object_destroy(ETK_OBJECT(entry->primary_image)); + if (entry->secondary_image) + etk_object_destroy(ETK_OBJECT(entry->secondary_image)); } /* Sets the property whose id is "property_id" to the value "value" */ static void _etk_entry_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value) { Etk_Entry *entry; - + if (!(entry = ETK_ENTRY(object)) || !value) return; - + switch (property_id) { case ETK_ENTRY_PASSWORD_MODE_PROPERTY: @@ -227,10 +400,10 @@ static void _etk_entry_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value) { Etk_Entry *entry; - + if (!(entry = ETK_ENTRY(object)) || !value) return; - + switch (property_id) { case ETK_ENTRY_PASSWORD_MODE_PROPERTY: @@ -241,6 +414,69 @@ } } +/* Resizes the entry to the allocated size */ +static void _etk_entry_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) +{ + Etk_Entry *entry; + + if (!(entry = ETK_ENTRY(widget))) + return; + + if (!geometry.w || !geometry.h) + return; + + if (!entry->primary_image && !entry->secondary_image) + { + evas_object_move(entry->editable_object, geometry.x, geometry.y); + evas_object_resize(entry->editable_object, geometry.w, geometry.h); + } + else + { + Etk_Image *image; + Etk_Geometry i_geometry; + int x, w; + + x = geometry.x; + w = geometry.w; + if (entry->primary_image) + { + image = entry->primary_image; + etk_image_size_get(image, &i_geometry.w, &i_geometry.h); + + i_geometry.x = geometry.x; + i_geometry.y = geometry.y; + i_geometry.w = i_geometry.h = ETK_MAX(i_geometry.w, i_geometry.h); + if (geometry.h <= i_geometry.h) + i_geometry.w = i_geometry.h = geometry.h; + else + i_geometry.y += (geometry.h - i_geometry.h)/2; + + etk_widget_size_allocate(ETK_WIDGET(image), i_geometry); + x += i_geometry.w + entry->inner_part_margin; + w -= i_geometry.w + entry->inner_part_margin; + } + if (entry->secondary_image) + { + image = entry->secondary_image; + etk_image_size_get(image, &i_geometry.w, &i_geometry.h); + + i_geometry.x = geometry.x + geometry.w - i_geometry.w; + i_geometry.y = geometry.y; + i_geometry.w = i_geometry.h = ETK_MAX(i_geometry.w, i_geometry.h); + if (geometry.h <= i_geometry.h) + i_geometry.w = i_geometry.h = geometry.h; + else + i_geometry.y += (geometry.h - i_geometry.h)/2; + + etk_widget_size_allocate(ETK_WIDGET(image), i_geometry); + w -= i_geometry.w + entry->inner_part_margin; + } + + evas_object_move(entry->editable_object, x, geometry.y); + evas_object_resize(entry->editable_object, w, geometry.h); + } +} + /************************** * * Callbacks and handlers @@ -257,7 +493,7 @@ return; entry->editable_object = etk_editable_add(evas); - evas_object_pass_events_set(entry->editable_object, 1); + evas_object_repeat_events_set(entry->editable_object, 1); etk_editable_theme_set(entry->editable_object, etk_widget_theme_file_get(ETK_WIDGET(entry)), etk_widget_theme_group_get(ETK_WIDGET(entry))); etk_editable_text_set(entry->editable_object, entry->text); @@ -268,7 +504,33 @@ etk_editable_selection_hide(entry->editable_object); } evas_object_show(entry->editable_object); - etk_widget_swallow_object(ETK_WIDGET(entry), "etk.swallow.text", entry->editable_object); + etk_widget_member_object_add(ETK_WIDGET(entry), entry->editable_object); + + 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, + _etk_entry_editable_mouse_out_cb, entry); + evas_object_event_callback_add(entry->editable_object, EVAS_CALLBACK_MOUSE_DOWN, + _etk_entry_editable_mouse_down_cb, entry); + evas_object_event_callback_add(entry->editable_object, EVAS_CALLBACK_MOUSE_UP, + _etk_entry_editable_mouse_up_cb, entry); + evas_object_event_callback_add(entry->editable_object, EVAS_CALLBACK_MOUSE_MOVE, + _etk_entry_editable_mouse_move_cb, entry); + + if (etk_widget_theme_data_get(ETK_WIDGET(entry), "highlight_image_color", "%d %d %d %d", + &entry->highlight_image_color.r, &entry->highlight_image_color.g, + &entry->highlight_image_color.b, &entry->highlight_image_color.a) != 4) + { + entry->highlight_image_color.r = 128; + entry->highlight_image_color.g = 128; + entry->highlight_image_color.b = 128; + entry->highlight_image_color.a = 255; + } + + if (etk_widget_theme_data_get(ETK_WIDGET(entry), "inner_part_margin", "%d", + &entry->inner_part_margin) != 1) + entry->inner_part_margin = 2; + } /* Called when the entry is unrealized */ @@ -279,13 +541,13 @@ if (!(entry = ETK_ENTRY(object))) return; - + free(entry->text); if ((text = etk_editable_text_get(entry->editable_object))) entry->text = strdup(text); else entry->text = NULL; - + evas_object_del(entry->editable_object); entry->editable_object = NULL; } @@ -301,7 +563,7 @@ Etk_Bool changed = ETK_FALSE; Etk_Bool selection_changed = ETK_FALSE; Etk_Bool stop_signal = ETK_TRUE; - + if (!(entry = ETK_ENTRY(object))) return; @@ -311,7 +573,7 @@ start_pos = ETK_MIN(cursor_pos, selection_pos); end_pos = ETK_MAX(cursor_pos, selection_pos); selecting = (start_pos != end_pos); - + /* Move the cursor/selection to the left */ if (strcmp(event->keyname, "Left") == 0) { @@ -412,8 +674,8 @@ } else stop_signal = ETK_FALSE; - - + + if (changed) etk_signal_emit(_etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL], ETK_OBJECT(entry), NULL); if (selection_changed) @@ -423,11 +685,11 @@ } /* Called when the mouse enters the entry */ -static void _etk_entry_mouse_in_cb(Etk_Object *object, Etk_Event_Mouse_In *event, void *data) +static void _etk_entry_editable_mouse_in_cb(void *data, Evas *evas, Evas_Object *object, void *event_info) { Etk_Entry *entry; - if (!(entry = ETK_ENTRY(object))) + if (!(entry = ETK_ENTRY(data))) return; if (!entry->pointer_set) @@ -438,11 +700,11 @@ } /* Called when the mouse leaves the entry */ -static void _etk_entry_mouse_out_cb(Etk_Object *object, Etk_Event_Mouse_Out *event, void *data) +static void _etk_entry_editable_mouse_out_cb(void *data, Evas *evas, Evas_Object *object, void *event_info) { Etk_Entry *entry; - if (!(entry = ETK_ENTRY(object))) + if (!(entry = ETK_ENTRY(data))) return; if (entry->pointer_set) @@ -453,48 +715,52 @@ } /* Called when the entry is pressed by the mouse */ -static void _etk_entry_mouse_down_cb(Etk_Object *object, Etk_Event_Mouse_Down *event, void *data) +static void _etk_entry_editable_mouse_down_cb(void *data, Evas *evas, Evas_Object *object, void *event_info) { Etk_Entry *entry; + Etk_Event_Mouse_Down event; Evas_Coord ox, oy; int pos; - - if (!(entry = ETK_ENTRY(object))) + + if (!(entry = ETK_ENTRY(data))) return; - + + etk_event_mouse_down_wrap(ETK_WIDGET(entry), event_info, &event); evas_object_geometry_get(entry->editable_object, &ox, &oy, NULL, NULL); - pos = etk_editable_pos_get_from_coords(entry->editable_object, event->canvas.x - ox, event->canvas.y - oy); - if (event->button == 1) + pos = etk_editable_pos_get_from_coords(entry->editable_object, event.canvas.x - ox, event.canvas.y - oy); + if (event.button == 1) { - if (event->flags & ETK_MOUSE_DOUBLE_CLICK) + if (event.flags & ETK_MOUSE_DOUBLE_CLICK) etk_editable_select_all(entry->editable_object); else { etk_editable_cursor_pos_set(entry->editable_object, pos); - if (!(event->modifiers & ETK_MODIFIER_SHIFT)) + if (!(event.modifiers & ETK_MODIFIER_SHIFT)) etk_editable_selection_pos_set(entry->editable_object, pos); - + entry->selection_dragging = ETK_TRUE; } } - else if (event->button == 2) + else if (event.button == 2) { etk_editable_cursor_pos_set(entry->editable_object, pos); etk_editable_selection_pos_set(entry->editable_object, pos); - + etk_selection_text_request(ETK_SELECTION_PRIMARY, ETK_WIDGET(entry)); } } /* Called when the entry is released by the mouse */ -static void _etk_entry_mouse_up_cb(Etk_Object *object, Etk_Event_Mouse_Up *event, void *data) +static void _etk_entry_editable_mouse_up_cb(void *data, Evas *evas, Evas_Object *object, void *event_info) { Etk_Entry *entry; - - if (!(entry = ETK_ENTRY(object))) + Etk_Event_Mouse_Up event; + + if (!(entry = ETK_ENTRY(data))) return; - - if (event->button == 1) + + etk_event_mouse_up_wrap(ETK_WIDGET(entry), event_info, &event); + if (event.button == 1) { entry->selection_dragging = ETK_FALSE; _etk_entry_selection_copy(entry, ETK_SELECTION_PRIMARY, ETK_FALSE); @@ -502,24 +768,97 @@ } /* Called when the mouse moves over the entry */ -static void _etk_entry_mouse_move_cb(Etk_Object *object, Etk_Event_Mouse_Move *event, void *data) +static void _etk_entry_editable_mouse_move_cb(void *data, Evas *evas, Evas_Object *object, void *event_info) { Etk_Entry *entry; + Etk_Event_Mouse_Move event; Evas_Coord ox, oy; int pos; - - if (!(entry = ETK_ENTRY(object))) + + if (!(entry = ETK_ENTRY(data))) return; - + if (entry->selection_dragging) { + etk_event_mouse_move_wrap(ETK_WIDGET(entry), event_info, &event); evas_object_geometry_get(entry->editable_object, &ox, &oy, NULL, NULL); - pos = etk_editable_pos_get_from_coords(entry->editable_object, event->cur.canvas.x - ox, event->cur.canvas.y - oy); + pos = etk_editable_pos_get_from_coords(entry->editable_object, event.cur.canvas.x - ox, event.cur.canvas.y - oy); if (pos >= 0) etk_editable_cursor_pos_set(entry->editable_object, pos); } } +/* Called when the mouse is over the image */ +static void _etk_entry_image_mouse_in_cb(Etk_Widget *widget, Etk_Event_Mouse_In *event, void *data) +{ + Etk_Entry *entry; + Etk_Image *image; + + if (!(entry = ETK_ENTRY(data))) + return; + if (!(image = ETK_IMAGE(widget))) + return; + + evas_object_color_set(etk_image_evas_object_get(image), + entry->highlight_image_color.r, entry->highlight_image_color.g, + entry->highlight_image_color.b, entry->highlight_image_color.a); +} + +/* Called when the mouse moves out of the image */ +static void _etk_entry_image_mouse_out_cb(Etk_Widget *widget, Etk_Event_Mouse_Out *event, void *data) +{ + Etk_Entry *entry; + Etk_Image *image; + + if (!(entry = ETK_ENTRY(data))) + return; + if (!(image = ETK_IMAGE(widget))) + return; + + evas_object_color_set(etk_image_evas_object_get(image), 255, 255, 255, 255); +} + +/* Called when the mouse is pressed over the image */ +static void _etk_entry_image_mouse_down_cb(Etk_Widget *widget, Etk_Event_Mouse_Down *event, void *data) +{ + Etk_Entry *entry; + Etk_Image *image; + + if (!(entry = ETK_ENTRY(data))) + return; + if (!(image = ETK_IMAGE(widget))) + return; + + evas_object_color_set(etk_image_evas_object_get(image), 255, 255, 255, 255); +} + +/* Called when the mouse released over the image */ +static void _etk_entry_image_mouse_up_cb(Etk_Widget *widget, Etk_Event_Mouse_Up *event, void *data) +{ + Etk_Entry *entry; + Etk_Image *image; + + if (!(entry = ETK_ENTRY(data))) + return; + if (!(image = ETK_IMAGE(widget))) + return; + + evas_object_color_set(etk_image_evas_object_get(image), + entry->highlight_image_color.r, entry->highlight_image_color.g, + entry->highlight_image_color.b, entry->highlight_image_color.a); +} + +/* Called when the clear button is pressed */ +static void _etk_entry_clear_button_cb(Etk_Widget *widget, Etk_Event_Mouse_Up *event, void *data) +{ + Etk_Entry *entry; + + if (!(entry = ETK_ENTRY(data))) + return; + + etk_entry_clear(entry); +} + /* Called when the entry is focused */ static void _etk_entry_focus_cb(Etk_Object *object, void *data) { @@ -527,7 +866,7 @@ if (!(entry = ETK_ENTRY(object)) || !entry->editable_object) return; - + etk_editable_cursor_show(entry->editable_object); etk_editable_selection_show(entry->editable_object); } @@ -539,7 +878,7 @@ if (!(entry = ETK_ENTRY(object)) || !entry->editable_object) return; - + etk_editable_cursor_move_to_end(entry->editable_object); etk_editable_selection_move_to_end(entry->editable_object); etk_editable_cursor_hide(entry->editable_object); @@ -553,27 +892,27 @@ Evas_Object *editable; Etk_Selection_Event *ev = event; const char *text; - + if (!(entry = ETK_ENTRY(object)) || !(editable = entry->editable_object)) return; - + if (ev->type == ETK_SELECTION_TEXT && (text = ev->data.text) && *text && (strlen(text) != 1 || text[0] >= 0x20)) { int cursor_pos, selection_pos; int start_pos, end_pos; Etk_Bool selecting; Etk_Bool changed = ETK_FALSE; - + cursor_pos = etk_editable_cursor_pos_get(editable); selection_pos = etk_editable_selection_pos_get(editable); start_pos = ETK_MIN(cursor_pos, selection_pos); end_pos = ETK_MAX(cursor_pos, selection_pos); selecting = (start_pos != end_pos); - + if (selecting) changed |= etk_editable_delete(editable, start_pos, end_pos); changed |= etk_editable_insert(editable, start_pos, text); - + if (changed) etk_signal_emit(_etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL], ETK_OBJECT(entry), NULL); } @@ -593,7 +932,7 @@ int start_pos, end_pos; Etk_Bool selecting; char *range; - + if (!entry) return; @@ -603,10 +942,10 @@ start_pos = ETK_MIN(cursor_pos, selection_pos); end_pos = ETK_MAX(cursor_pos, selection_pos); selecting = (start_pos != end_pos); - + if (!selecting) return; - + range = etk_editable_text_range_get(editable, start_pos, end_pos); if (range) { @@ -637,7 +976,7 @@ * and get the text with etk_entry_text_get(). @n * An entry can work in two modes: the normal mode (the text is visible) and the password mode * (the text is replaced by '*'). To change the mode of the entry, use etk_entry_password_mode_set(). - * + * * \par Object Hierarchy: * - Etk_Object * - Etk_Widget =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_entry.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- etk_entry.h 12 Jan 2007 02:53:56 -0000 1.8 +++ etk_entry.h 13 Jan 2007 18:39:23 -0000 1.9 @@ -20,6 +20,16 @@ #define ETK_IS_ENTRY(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_ENTRY_TYPE)) /** + * @enum Etk_Entry_Image_Position + * @brief The position of the image in the entry + */ +typedef enum Etk_Entry_Image_Position +{ + ETK_ENTRY_IMAGE_PRIMARY = 1, /**< The image is primary, usually to the left of the editable object */ + ETK_ENTRY_IMAGE_SECONDARY = 2, /**< The image is secondary, usually to the right of the editable object */ +} Etk_Entry_Image_Position; + +/** * @brief @widget A field where the user can edit a single-line text * @structinfo */ @@ -29,11 +39,19 @@ /* Inherit from Etk_Widget */ Etk_Widget widget; + Etk_Image *primary_image; + Etk_Image *secondary_image; + Evas_Object *editable_object; - Etk_Bool password_mode; - Etk_Bool selection_dragging; - Etk_Bool pointer_set; + Etk_Bool password_mode; + Etk_Bool selection_dragging; + Etk_Bool pointer_set; + Etk_Bool primary_image_highlight; + Etk_Bool secondary_image_highlight; + Etk_Color highlight_image_color; + char *text; + int inner_part_margin; }; @@ -43,6 +61,10 @@ void etk_entry_text_set(Etk_Entry *entry, const char *text); const char *etk_entry_text_get(Etk_Entry *entry); void etk_entry_clear(Etk_Entry *entry); +void etk_entry_image_set(Etk_Entry *entry, Etk_Entry_Image_Position position, Etk_Image *image); +Etk_Image *etk_entry_image_get(Etk_Entry *entry, Etk_Entry_Image_Position position); +void etk_entry_image_highlight_set(Etk_Entry *entry, Etk_Entry_Image_Position position, Etk_Bool highlight); +void etk_entry_add_clear_button(Etk_Entry *entry); void etk_entry_password_mode_set(Etk_Entry *entry, Etk_Bool password_mode); Etk_Bool etk_entry_password_mode_get(Etk_Entry *entry); ------------------------------------------------------------------------- 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