Enlightenment CVS committal Author : moom Project : e17 Module : libs/etk
Dir : e17/libs/etk/src/lib Modified Files: etk_editable.c etk_engine.h etk_entry.c etk_entry.h etk_frame.c etk_frame.h etk_signal.c etk_widget.c Log Message: * [Entry] The entry height now depends on the font-size of the entry's text. "Seems" to fix some problems of text placement too * Some cleanups =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_editable.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- etk_editable.c 10 Mar 2007 03:18:36 -0000 1.7 +++ etk_editable.c 12 Mar 2007 01:46:13 -0000 1.8 @@ -951,7 +951,7 @@ else offset_x += (ow - tw) * sd->align; - new_ty = oy + ((oh - th) / 2); + new_ty = oy + ((oh - th) / 2) + 1; evas_object_move(sd->text_object, tx + offset_x, new_ty); evas_object_move(sd->cursor_object, cx + offset_x, cy + (new_ty - ty)); evas_object_move(sd->selection_object, sx + offset_x, sy + (new_ty - ty)); =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_engine.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- etk_engine.h 8 Oct 2006 10:04:54 -0000 1.13 +++ etk_engine.h 12 Mar 2007 01:46:13 -0000 1.14 @@ -16,7 +16,7 @@ */ /** - * @brief @widget The structure of an engine regrouping the different methods to call + * @brief The structure of an engine regrouping the different methods to call * @structinfo */ struct Etk_Engine =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_entry.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -3 -r1.29 -r1.30 --- etk_entry.c 22 Feb 2007 04:36:25 -0000 1.29 +++ etk_entry.c 12 Mar 2007 01:46:13 -0000 1.30 @@ -3,19 +3,24 @@ #include <stdlib.h> #include <string.h> #include "etk_editable.h" +#include "etk_image.h" #include "etk_toplevel.h" #include "etk_selection.h" #include "etk_event.h" #include "etk_signal.h" #include "etk_signal_callback.h" #include "etk_utils.h" -#include "etk_image.h" + +/* TODO: parent changed! */ +/* TODO: use etk_widget_color_set() instead of evas_object_color_set(...) when it'll be implemented... */ /** * @addtogroup Etk_Entry * @{ */ +#define IMAGE_SIZE 16 + enum Etk_Entry_Signal_Id { ETK_ENTRY_TEXT_CHANGED_SIGNAL, @@ -31,8 +36,13 @@ static void _etk_entry_destructor(Etk_Entry *entry); static void _etk_entry_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value); static void _etk_entry_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value); -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_size_request(Etk_Widget *widget, Etk_Size *size); +static void _etk_entry_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); +static void _etk_entry_internal_size_request(Etk_Widget *widget, Etk_Size *size); +static void _etk_entry_internal_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); + +static void _etk_entry_internal_realize_cb(Etk_Object *object, void *data); +static void _etk_entry_internal_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_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); @@ -48,7 +58,6 @@ 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]; @@ -64,20 +73,20 @@ * @brief Gets the type of an Etk_Entry * @return Returns the type of an Etk_Entry */ -Etk_Type *etk_entry_type_get() +Etk_Type *etk_entry_type_get(void) { static Etk_Type *entry_type = NULL; if (!entry_type) { entry_type = etk_type_new("Etk_Entry", ETK_WIDGET_TYPE, sizeof(Etk_Entry), - ETK_CONSTRUCTOR(_etk_entry_constructor), ETK_DESTRUCTOR(_etk_entry_destructor)); + ETK_CONSTRUCTOR(_etk_entry_constructor), ETK_DESTRUCTOR(_etk_entry_destructor)); _etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL] = etk_signal_new("text_changed", - entry_type, -1, etk_marshaller_VOID__VOID, NULL, NULL); + 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)); + 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; @@ -90,10 +99,9 @@ * @brief Creates a new entry * @return Returns the new entry widget */ -Etk_Widget *etk_entry_new() +Etk_Widget *etk_entry_new(void) { - return etk_widget_new(ETK_ENTRY_TYPE, "theme_group", "entry", - "focusable", ETK_TRUE, "focus_on_click", ETK_TRUE, NULL); + return etk_widget_new(ETK_ENTRY_TYPE, "focusable", ETK_TRUE, "focus_on_click", ETK_TRUE, NULL); } /** @@ -148,14 +156,17 @@ /** * @brief Sets an image inside the entry * @param entry an entry - * @param position image position + * @param position the position where to place the image: ETK_ENTRY_IMAGE_PRIMARY to place it on the left, and + * ETK_ENTRY_IMAGE_SECONDARY to place it on the right * @param image an image - * @note If you want to remove an existing image, pass NULL instead of an Etk_Image + * @note If there was an existing image already there, it will be destroyed. To avoid this, or if you just want to + * remove the previous image, you hav to unparent it with etk_widget_parent_set(prev_image, NULL) + * @note By default, the new image will be highlighted on mouse-over. You can change this behavior with + * etk_entry_image_highlight_set() + * @note The given image will be automatically shown */ void etk_entry_image_set(Etk_Entry *entry, Etk_Entry_Image_Position position, Etk_Image *image) { - int ok = 0; - if (!entry) return; @@ -165,16 +176,8 @@ 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; - + etk_object_destroy(ETK_OBJECT(entry->primary_image)); entry->primary_image = image; - ok = 1; } else if (position == ETK_ENTRY_IMAGE_SECONDARY) { @@ -182,33 +185,65 @@ 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; - + etk_object_destroy(ETK_OBJECT(entry->secondary_image)); entry->secondary_image = image; - ok = 1; } + else + return; - if (ok) + if (image) { - etk_widget_parent_set(ETK_WIDGET(image), ETK_WIDGET(entry)); + etk_widget_parent_set(ETK_WIDGET(image), entry->internal_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); } + etk_widget_size_recalc_queue(ETK_WIDGET(entry)); +} + +/** + * @brief Gets the image of the entry + * @param entry an entry + * @param position the position of the image to get: ETK_ENTRY_IMAGE_PRIMARY for the left image, + * ETK_ENTRY_IMAGE_SECONDARY for the right image + * @return Returns the image of the 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 Adds a "Clear" button on the right of the entry + * @param entry an entry + */ +void etk_entry_clear_button_add(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 Sets whether the image will be highlighted on mouse-over * @param entry an entry - * @param position image position + * @param position the position of the image to set: ETK_ENTRY_IMAGE_PRIMARY for the left image, + * ETK_ENTRY_IMAGE_SECONDARY for the right image * @param highlight if @a highlight is ETK_TRUE, the image will be highlighted - * @note By default, the image has mouse highlight turn on + * @note By default, the image has mouse highlight turned on */ void etk_entry_image_highlight_set(Etk_Entry *entry, Etk_Entry_Image_Position position, Etk_Bool highlight) { @@ -235,71 +270,36 @@ entry->secondary_image_highlight = highlight; } - else return; + else + return; if (highlight) { etk_signal_connect("mouse_in", ETK_OBJECT(image), - ETK_CALLBACK(_etk_entry_image_mouse_in_cb), entry); + 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_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_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); + 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_CALLBACK(_etk_entry_image_mouse_in_cb)); etk_signal_disconnect("mouse_out", ETK_OBJECT(image), - ETK_CALLBACK(_etk_entry_image_mouse_out_cb)); + 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_CALLBACK(_etk_entry_image_mouse_down_cb)); etk_signal_disconnect("mouse_up", ETK_OBJECT(image), - ETK_CALLBACK(_etk_entry_image_mouse_up_cb)); + ETK_CALLBACK(_etk_entry_image_mouse_up_cb)); evas_object_color_set(etk_image_evas_object_get(image), 255, 255, 255, 255); } } /** - * @brief Adds a clear button to the entry - * @param entry an entry - */ -void etk_entry_clear_button_add(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 Gets the image of the entry - * @param entry an entry - * @param position image position - * @return Returns the image of the 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 @@ -343,25 +343,39 @@ if (!(widget = ETK_WIDGET(entry))) return; - + + entry->editable_object = NULL; entry->primary_image = NULL; entry->secondary_image = NULL; - entry->editable_object = NULL; entry->password_mode = ETK_FALSE; entry->selection_dragging = ETK_FALSE; + entry->pointer_set = ETK_FALSE; entry->primary_image_highlight = ETK_FALSE; entry->secondary_image_highlight = ETK_FALSE; - entry->pointer_set = ETK_FALSE; 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); + 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; + widget->size_request = _etk_entry_size_request; 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("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); + etk_signal_connect("realize", ETK_OBJECT(entry->internal_entry), + ETK_CALLBACK(_etk_entry_internal_realize_cb), NULL); + etk_signal_connect("unrealize", ETK_OBJECT(entry->internal_entry), + ETK_CALLBACK(_etk_entry_internal_unrealize_cb), NULL); + etk_signal_connect("key_down", ETK_OBJECT(entry), + ETK_CALLBACK(_etk_entry_key_down_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); + } /* Destroys the entry */ @@ -370,11 +384,6 @@ 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" */ @@ -413,17 +422,69 @@ } } +/* Calculates the ideal size of the entry */ +static void _etk_entry_size_request(Etk_Widget *widget, Etk_Size *size) +{ + Etk_Entry *entry; + + if (!(entry = ETK_ENTRY(widget))) + return; + etk_widget_size_request(entry->internal_entry, size); +} + /* Resizes the entry to the allocated size */ static void _etk_entry_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) { Etk_Entry *entry; + Etk_Size requested_size; if (!(entry = ETK_ENTRY(widget))) return; - if (!geometry.w || !geometry.h) + etk_widget_size_request(entry->internal_entry, &requested_size); + geometry.y = geometry.y + (geometry.h - requested_size.h) / 2; + geometry.h = requested_size.h; + etk_widget_size_allocate(entry->internal_entry, geometry); +} + +/* Calculates the ideal size of the entry's internal widget */ +static void _etk_entry_internal_size_request(Etk_Widget *widget, Etk_Size *size) +{ + Etk_Entry *entry; + + if (!widget || !size) return; + if (!(entry = ETK_ENTRY(etk_object_data_get(ETK_OBJECT(widget), "_Etk_Entry::Entry")))) + return; + + if (!entry->editable_object) + { + size->w = 0; + size->h = 0; + } + else + { + int cw, ch; + + etk_editable_char_size_get(entry->editable_object, &cw, &ch); + size->w = 15 * cw; + size->h = ETK_MAX(ch, IMAGE_SIZE); + + if (entry->primary_image) + size->w += IMAGE_SIZE + entry->image_interspace; + if (entry->secondary_image) + size->w += IMAGE_SIZE + entry->image_interspace; + } +} +/* Resizes the entry's internal widget to the allocated size */ +static void _etk_entry_internal_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) +{ + Etk_Entry *entry; + + if (!widget || !(entry = ETK_ENTRY(etk_object_data_get(ETK_OBJECT(widget), "_Etk_Entry::Entry")))) + return; + if (!entry->primary_image && !entry->secondary_image) { evas_object_move(entry->editable_object, geometry.x, geometry.y); @@ -440,15 +501,11 @@ 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; + 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; @@ -457,15 +514,11 @@ 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; + 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; @@ -482,19 +535,22 @@ * **************************/ -/* Called when the entry is realized */ -static void _etk_entry_realize_cb(Etk_Object *object, void *data) +/* Called when the entry's internal widget is realized */ +static void _etk_entry_internal_realize_cb(Etk_Object *object, void *data) { Etk_Entry *entry; + Etk_Widget *internal_entry; Evas *evas; - if (!(entry = ETK_ENTRY(object)) || !(evas = etk_widget_toplevel_evas_get(ETK_WIDGET(entry)))) + if (!(internal_entry = ETK_WIDGET(object)) || !(evas = etk_widget_toplevel_evas_get(internal_entry))) + return; + if (!(entry = ETK_ENTRY(etk_object_data_get(object, "_Etk_Entry::Entry")))) return; entry->editable_object = etk_editable_add(evas); 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_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))) @@ -503,22 +559,22 @@ etk_editable_selection_hide(entry->editable_object); } evas_object_show(entry->editable_object); - etk_widget_member_object_add(ETK_WIDGET(entry), entry->editable_object); + etk_widget_member_object_add(internal_entry, entry->editable_object); evas_object_event_callback_add(entry->editable_object, EVAS_CALLBACK_MOUSE_IN, - _etk_entry_editable_mouse_in_cb, entry); + _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); + _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); + _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); + _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); + _etk_entry_editable_mouse_move_cb, entry); - if (etk_widget_theme_data_get(ETK_WIDGET(entry), "icon_highlight_color", "%d %d %d %d", - &entry->highlight_color.r, &entry->highlight_color.g, - &entry->highlight_color.b, &entry->highlight_color.a) != 4) + if (etk_widget_theme_data_get(internal_entry, "icon_highlight_color", "%d %d %d %d", + &entry->highlight_color.r, &entry->highlight_color.g, + &entry->highlight_color.b, &entry->highlight_color.a) != 4) { entry->highlight_color.r = 128; entry->highlight_color.g = 128; @@ -528,21 +584,21 @@ else { evas_color_argb_premul(entry->highlight_color.a, &entry->highlight_color.r, - &entry->highlight_color.g, &entry->highlight_color.b); + &entry->highlight_color.g, &entry->highlight_color.b); } - if (etk_widget_theme_data_get(ETK_WIDGET(entry), "icon_interspace", "%d", &entry->image_interspace) != 1) + if (etk_widget_theme_data_get(internal_entry, "icon_interspace", "%d", &entry->image_interspace) != 1) entry->image_interspace = 5; } -/* Called when the entry is unrealized */ -static void _etk_entry_unrealize_cb(Etk_Object *object, void *data) +/* Called when the entry's internal widget is unrealized */ +static void _etk_entry_internal_unrealize_cb(Etk_Object *object, void *data) { Etk_Entry *entry; const char *text; - if (!(entry = ETK_ENTRY(object))) + if (!(entry = ETK_ENTRY(etk_object_data_get(object, "_Etk_Entry::Entry")))) return; free(entry->text); @@ -797,9 +853,7 @@ Etk_Entry *entry; Etk_Image *image; - if (!(entry = ETK_ENTRY(data))) - return; - if (!(image = ETK_IMAGE(widget))) + if (!(entry = ETK_ENTRY(data)) || !(image = ETK_IMAGE(widget))) return; evas_object_color_set(etk_image_evas_object_get(image), @@ -817,7 +871,6 @@ return; if (!(image = ETK_IMAGE(widget))) return; - evas_object_color_set(etk_image_evas_object_get(image), 255, 255, 255, 255); } @@ -827,11 +880,9 @@ Etk_Entry *entry; Etk_Image *image; - if (!(entry = ETK_ENTRY(data))) - return; - if (!(image = ETK_IMAGE(widget))) + if (!(entry = ETK_ENTRY(data)) || !(image = ETK_IMAGE(widget))) return; - + evas_object_color_set(etk_image_evas_object_get(image), 255, 255, 255, 255); } @@ -841,14 +892,12 @@ Etk_Entry *entry; Etk_Image *image; - if (!(entry = ETK_ENTRY(data))) - return; - if (!(image = ETK_IMAGE(widget))) + if (!(entry = ETK_ENTRY(data)) || !(image = ETK_IMAGE(widget))) return; evas_object_color_set(etk_image_evas_object_get(image), - entry->highlight_color.r, entry->highlight_color.g, - entry->highlight_color.b, entry->highlight_color.a); + entry->highlight_color.r, entry->highlight_color.g, + entry->highlight_color.b, entry->highlight_color.a); } /* Called when the clear button is pressed */ @@ -858,7 +907,6 @@ if (!(entry = ETK_ENTRY(data))) return; - etk_entry_clear(entry); } @@ -872,6 +920,7 @@ etk_editable_cursor_show(entry->editable_object); etk_editable_selection_show(entry->editable_object); + etk_widget_theme_signal_emit(entry->internal_entry, "etk,state,focused", ETK_FALSE); } /* Called when the entry is unfocused */ @@ -886,6 +935,7 @@ etk_editable_selection_move_to_end(entry->editable_object); etk_editable_cursor_hide(entry->editable_object); etk_editable_selection_hide(entry->editable_object); + etk_widget_theme_signal_emit(entry->internal_entry, "etk,state,unfocused", ETK_FALSE); } /* Called when the selection/clipboard content is received */ @@ -899,7 +949,8 @@ 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)) + if (ev->type == ETK_SELECTION_TEXT && (text = ev->data.text) && text[0] != '\0' + && (strlen(text) != 1 || text[0] >= 0x20)) { int cursor_pos, selection_pos; int start_pos, end_pos; =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_entry.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- etk_entry.h 19 Feb 2007 01:05:27 -0000 1.12 +++ etk_entry.h 12 Mar 2007 01:46:13 -0000 1.13 @@ -8,7 +8,7 @@ /** * @defgroup Etk_Entry Etk_Entry - * @brief An Etk_Entry is a widget that allows the user to type, select or delete a single-line text + * @brief An Etk_Entry is a widget that allows the user to edit a single-line text * @{ */ @@ -19,15 +19,17 @@ /** Checks if the object is an Etk_Entry */ #define ETK_IS_ENTRY(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_ENTRY_TYPE)) + /** @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_PRIMARY, /**< The image is primary, to the left of the editable object */ + ETK_ENTRY_IMAGE_SECONDARY /**< The image is secondary, to the right of the editable object */ } Etk_Entry_Image_Position; + /** - * @brief @widget A field where the user can edit a single-line text + * @brief @widget A widget that allows the user to edit a single-line text * @structinfo */ struct Etk_Entry @@ -36,14 +38,14 @@ /* Inherit from Etk_Widget */ Etk_Widget widget; + Etk_Widget *internal_entry; + Evas_Object *editable_object; 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 primary_image_highlight; Etk_Bool secondary_image_highlight; Etk_Color highlight_color; @@ -53,16 +55,16 @@ }; -Etk_Type *etk_entry_type_get(); -Etk_Widget *etk_entry_new(); +Etk_Type *etk_entry_type_get(void); +Etk_Widget *etk_entry_new(void); 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_clear_button_add(Etk_Entry *entry); +void etk_entry_clear_button_add(Etk_Entry *entry); +void etk_entry_image_highlight_set(Etk_Entry *entry, Etk_Entry_Image_Position position, Etk_Bool highlight); void etk_entry_password_mode_set(Etk_Entry *entry, Etk_Bool password_mode); Etk_Bool etk_entry_password_mode_get(Etk_Entry *entry); =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_frame.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- etk_frame.c 23 Feb 2007 20:44:41 -0000 1.14 +++ etk_frame.c 12 Mar 2007 01:46:13 -0000 1.15 @@ -33,7 +33,7 @@ * @brief Gets the type of an Etk_Frame * @return Returns the type of an Etk_Frame */ -Etk_Type *etk_frame_type_get() +Etk_Type *etk_frame_type_get(void) { static Etk_Type *frame_type = NULL; @@ -75,26 +75,22 @@ if (label != frame->label) { free(frame->label); - if (label) - frame->label = strdup(label); - else - frame->label = NULL; - etk_object_notify(ETK_OBJECT(frame), "label"); + frame->label = label ? strdup(label) : NULL; } - if (ETK_WIDGET(frame)->theme_object) + if (!frame->label || frame->label[0] == '\0') + { + etk_widget_theme_part_text_set(ETK_WIDGET(frame), "etk.text.label", ""); + etk_widget_theme_signal_emit(ETK_WIDGET(frame), "etk,action,hide,label", ETK_TRUE); + } + else { - if (!frame->label || *frame->label == '\0') - { - etk_widget_theme_part_text_set(ETK_WIDGET(frame), "etk.text.label", ""); - etk_widget_theme_signal_emit(ETK_WIDGET(frame), "etk,action,hide,label", ETK_TRUE); - } - else - { - etk_widget_theme_part_text_set(ETK_WIDGET(frame), "etk.text.label", frame->label); - etk_widget_theme_signal_emit(ETK_WIDGET(frame), "etk,action,show,label", ETK_TRUE); - } + etk_widget_theme_part_text_set(ETK_WIDGET(frame), "etk.text.label", frame->label); + etk_widget_theme_signal_emit(ETK_WIDGET(frame), "etk,action,show,label", ETK_TRUE); } + + if (label != frame->label) + etk_object_notify(ETK_OBJECT(frame), "label"); } /** =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_frame.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_frame.h 6 Oct 2006 17:04:14 -0000 1.4 +++ etk_frame.h 12 Mar 2007 01:46:13 -0000 1.5 @@ -18,6 +18,7 @@ /** Checks if the object is an Etk_Frame */ #define ETK_IS_FRAME(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_FRAME_TYPE)) + /** * @brief @widget A bin container with a label * @structinfo @@ -31,7 +32,8 @@ char *label; }; -Etk_Type *etk_frame_type_get(); + +Etk_Type *etk_frame_type_get(void); Etk_Widget *etk_frame_new(const char *label); void etk_frame_label_set(Etk_Frame *frame, const char *label); =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_signal.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -3 -r1.25 -r1.26 --- etk_signal.c 10 Mar 2007 23:09:32 -0000 1.25 +++ etk_signal.c 12 Mar 2007 01:46:13 -0000 1.26 @@ -471,7 +471,7 @@ } /* Then we call the corresponding callbacks */ - if (object_ptr) + if (object_ptr && !emitted_signal->stop_emission) { callbacks = NULL; etk_object_signal_callbacks_get(object, signal, &callbacks); =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_widget.c,v retrieving revision 1.101 retrieving revision 1.102 diff -u -3 -r1.101 -r1.102 --- etk_widget.c 10 Mar 2007 23:09:32 -0000 1.101 +++ etk_widget.c 12 Mar 2007 01:46:13 -0000 1.102 @@ -216,7 +216,7 @@ widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); etk_type_property_add(widget_type, "parent", ETK_WIDGET_PARENT_PROPERTY, - ETK_PROPERTY_POINTER, ETK_PROPERTY_READABLE, etk_property_value_pointer(NULL)); + ETK_PROPERTY_POINTER, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_pointer(NULL)); etk_type_property_add(widget_type, "theme_file", ETK_WIDGET_THEME_FILE_PROPERTY, ETK_PROPERTY_STRING, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_string(NULL)); etk_type_property_add(widget_type, "theme_group", ETK_WIDGET_THEME_GROUP_PROPERTY, @@ -1895,6 +1895,9 @@ switch (property_id) { + case ETK_WIDGET_PARENT_PROPERTY: + etk_widget_parent_set(widget, ETK_WIDGET(etk_property_value_pointer_get(value))); + break; case ETK_WIDGET_THEME_FILE_PROPERTY: etk_widget_theme_file_set(widget, etk_property_value_string_get(value)); break; @@ -3475,7 +3478,7 @@ * \par Properties: * @prop_name "parent": The parent of the widget * @prop_type Pointer (Etk_Widget *) - * @prop_ro + * @prop_rw * @prop_val NULL * \par * @prop_name "theme_file": The path to the theme-file used by the widget (NULL if the widget used ------------------------------------------------------------------------- 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