From: Enlightenment C. <no...@cv...> - 2006-08-11 21:48:49
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/data/themes Modified Files: default_entry.edc Log Message: * Rewrite the entry widget It is now splitted in 3 files: - e_editable.c that implements a generic single-line editable object that could be used later by other widgets such as the slider or a spinner. - e_entry.c that implements an entry smart object using an editable object. - e_widget_entry.c that embeds an entry smart object in a widget. So far, text insertion and deletion have been implemented. It also supports cursor movement and mouse selection. The text also no longer gets out of the bounds of the entry. Things to come: - Password mode - Copy/Paste - Make it actually themable, for now, the colors/font/style are hardcoded =================================================================== RCS file: /cvs/e/e17/apps/e/data/themes/default_entry.edc,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- default_entry.edc 23 Jul 2006 10:24:30 -0000 1.5 +++ default_entry.edc 11 Aug 2006 21:48:18 -0000 1.6 @@ -1,6 +1,5 @@ images { image: "entry.png" COMP; - image: "entry_focus.png" COMP; } group { @@ -16,13 +15,6 @@ border: 8 8 8 8; } } - description { - state: "focus" 0.0; - inherit: "default" 0.0; - image { - normal: "entry_focus.png"; - } - } } part { name: "entry_focus"; @@ -30,10 +22,14 @@ state: "default" 0.0; visible: 0; color: 255 255 255 0; - image { - normal: "entry_focus.png"; - border: 8 8 8 8; - } + image { + normal: "focus.png"; + border: 7 7 7 7; + middle: 0; + } + fill { + smooth: 0; + } } description { state: "focus" 0.0; @@ -49,12 +45,12 @@ state: "default" 0.0; rel1 { relative: 0.0 0.0; - offset: 4 3; + offset: 4 4; to: "entry"; } rel2 { relative: 1.0 1.0; - offset: -5 -4; + offset: -5 -5; to: "entry"; } } @@ -66,7 +62,7 @@ signal: "focus_in"; source: ""; action: STATE_SET "focus" 0.0; - transition: LINEAR 0.2; + transition: DECELERATE 0.2; target: "entry_focus"; } program { @@ -74,7 +70,7 @@ signal: "focus_out"; source: ""; action: STATE_SET "default" 0.0; - transition: LINEAR 0.2; + transition: ACCELERATE 0.5; target: "entry_focus"; } } |
From: Enlightenment C. <no...@cv...> - 2006-08-11 21:48:50
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: Makefile.am e_entry.c e_entry.h e_fileman_smart.c e_includes.h e_int_config_desklock.c e_widget_entry.c e_widget_entry.h Added Files: e_editable.c e_editable.h Log Message: * Rewrite the entry widget It is now splitted in 3 files: - e_editable.c that implements a generic single-line editable object that could be used later by other widgets such as the slider or a spinner. - e_entry.c that implements an entry smart object using an editable object. - e_widget_entry.c that embeds an entry smart object in a widget. So far, text insertion and deletion have been implemented. It also supports cursor movement and mouse selection. The text also no longer gets out of the bounds of the entry. Things to come: - Password mode - Copy/Paste - Make it actually themable, for now, the colors/font/style are hardcoded =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/Makefile.am,v retrieving revision 1.133 retrieving revision 1.134 diff -u -3 -r1.133 -r1.134 --- Makefile.am 8 Aug 2006 20:41:45 -0000 1.133 +++ Makefile.am 11 Aug 2006 21:48:18 -0000 1.134 @@ -85,6 +85,7 @@ e_about.h \ e_theme_about.h \ e_apps_cache.h \ +e_editable.h \ e_entry.h \ e_fileman.h \ e_fileman_smart.h \ @@ -228,6 +229,7 @@ e_about.c \ e_theme_about.c \ e_apps_cache.c \ +e_editable.c \ e_entry.c \ e_fileman.c \ e_fileman_smart.c \ =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- e_entry.c 7 Aug 2006 20:25:34 -0000 1.20 +++ e_entry.c 11 Aug 2006 21:48:18 -0000 1.21 @@ -3,956 +3,474 @@ */ #include "e.h" -/* - * TODO: - * - implement missing _e_entry_smart_*, very easy - * - free / delete properly - * - implement focus and interact with theme - */ - -typedef struct _E_Editable_Text_Smart_Data E_Editable_Text_Smart_Data; -typedef struct _E_Entry_Smart_Data E_Entry_Smart_Data; - -struct _E_Editable_Text_Smart_Data -{ - Evas_Object *clip; - Evas_Object *text_object; - Evas_Object *cursor_object; - Evas_Object *edje_object; - Ecore_Timer *cursor_timer; - - Evas_Bool cursor_at_the_end; - Evas_Bool show_cursor; -}; +typedef struct _E_Entry_Smart_Data E_Entry_Smart_Data; struct _E_Entry_Smart_Data { Evas_Object *entry_object; - Evas_Object *edje_object; - - Evas_Coord minw, minh; + Evas_Object *editable_object; - void (*change_func) (void *data, Evas_Object *entry, char *key); - void *change_data; + int enabled; + int focused; + float valign; + int min_width; + int height; }; -static Evas_Bool _e_editable_text_is_empty(Evas_Object *object); -static void _e_editable_text_cursor_position_update(Evas_Object *object); -static void _e_editable_text_cursor_visibility_update(Evas_Object *object); -static int _e_editable_text_cursor_timer_cb(void *data); -static void _e_editable_text_size_update(Evas_Object *object); - -static void _e_editable_text_smart_add(Evas_Object *object); -static void _e_editable_text_smart_del(Evas_Object *object); -static void _e_editable_text_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y); -static void _e_editable_text_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h); -static void _e_editable_text_smart_show(Evas_Object *object); -static void _e_editable_text_smart_hide(Evas_Object *object); - -static void _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event); - -static void _e_entry_smart_add(Evas_Object *object); -static void _e_entry_smart_del(Evas_Object *object); -static void _e_entry_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y); -static void _e_entry_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h); -static void _e_entry_smart_show(Evas_Object *object); -static void _e_entry_smart_hide(Evas_Object *object); - -static Evas_Smart *e_editable_text_smart = NULL; -static Evas_Textblock_Style *e_editable_text_style = NULL; -static int e_editable_text_style_use_count = 0; - -static Evas_Smart *e_entry_smart = NULL; - -EAPI Evas_Object * -e_editable_text_add(Evas *evas) -{ - if (!e_editable_text_smart) - { - e_editable_text_smart = evas_smart_new("e_editable_entry", - _e_editable_text_smart_add, /* add */ - _e_editable_text_smart_del, /* del */ - NULL, NULL, NULL, NULL, NULL, - _e_editable_text_smart_move, /* move */ - _e_editable_text_smart_resize, /* resize */ - _e_editable_text_smart_show, /* show */ - _e_editable_text_smart_hide, /* hide */ - NULL, /* color_set */ - NULL, /* clip_set */ - NULL, /* clip_unset */ - NULL); /* data*/ - } - return evas_object_smart_add(evas, e_editable_text_smart); -} - -EAPI const char* -e_editable_text_text_get(Evas_Object *object) -{ - E_Editable_Text_Smart_Data *sd; - Evas_Textblock_Cursor *cursor; +/* local subsystem functions */ +static void _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return ""; +static void _e_entry_smart_add(Evas_Object *object); +static void _e_entry_smart_del(Evas_Object *object); +static void _e_entry_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y); +static void _e_entry_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h); +static void _e_entry_smart_show(Evas_Object *object); +static void _e_entry_smart_hide(Evas_Object *object); +static void _e_entry_color_set(Evas_Object *object, int r, int g, int b, int a); +static void _e_entry_clip_set(Evas_Object *object, Evas_Object *clip); +static void _e_entry_clip_unset(Evas_Object *object); + +/* local subsystem globals */ +static Evas_Smart *_e_entry_smart = NULL; +static int _e_entry_smart_use = 0; - cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(sd->text_object); - return evas_textblock_cursor_node_text_get(cursor); -} -/** - * @brief Sets the text of the object - * @param object an editable text object - * @param text the text to set - */ -EAPI void -e_editable_text_text_set(Evas_Object *object, const char *text) -{ - E_Editable_Text_Smart_Data *sd; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - - evas_object_textblock_text_markup_set(sd->text_object, text); - sd->cursor_at_the_end = 1; - _e_editable_text_size_update(object); - _e_editable_text_cursor_position_update(object); -} - -/** - * @brief Inserts text at the cursor position of the object - * @param object an editable text object - * @param text the text to insert - */ -EAPI void -e_editable_text_insert(Evas_Object *object, const char *text) -{ - E_Editable_Text_Smart_Data *sd; - Evas_Textblock_Cursor *cursor; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - if ((!text) || ((strlen(text) <= 1) && (text[0] < 0x20))) - return; - - cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(sd->text_object); - - if (sd->cursor_at_the_end) - evas_textblock_cursor_text_append(cursor, text); - else - evas_textblock_cursor_text_prepend(cursor, text); - _e_editable_text_size_update(object); - _e_editable_text_cursor_position_update(object); -} - -/** - * @brief Deletes the char placed before the cursor - * @param object an editable text object - */ -EAPI void -e_editable_text_delete_char_before(Evas_Object *object) -{ - E_Editable_Text_Smart_Data *sd; - Evas_Textblock_Cursor *cursor; - - if ((!object) || - (!(sd = evas_object_smart_data_get(object))) || - (_e_editable_text_is_empty(object))) - return; - - cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(sd->text_object); - - if ((sd->cursor_at_the_end) || (evas_textblock_cursor_char_prev(cursor))) - evas_textblock_cursor_char_delete(cursor); - - _e_editable_text_size_update(object); - _e_editable_text_cursor_position_update(object); -} +/* externally accessible functions */ /** - * @brief Deletes the char placed after the cursor - * @param object an editable text object + * Creates a new entry object. An entry is a field where the user can type + * single-line text. + * Use the "changed" smart callback to know when the content of the entry is + * changed + * + * @param evas the evas where the entry object should be added + * @return Returns the new entry object */ -EAPI void -e_editable_text_delete_char_after(Evas_Object *object) +EAPI Evas_Object * +e_entry_add(Evas *evas) { - E_Editable_Text_Smart_Data *sd; - Evas_Textblock_Cursor *cursor; - - if ((!object) || - (!(sd = evas_object_smart_data_get(object))) || - (_e_editable_text_is_empty(object))) - return; - - cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(sd->text_object); - - if (!sd->cursor_at_the_end) + if (!_e_entry_smart) { - if (!evas_textblock_cursor_char_next(cursor)) - sd->cursor_at_the_end = 1; - else - evas_textblock_cursor_char_prev(cursor); - evas_textblock_cursor_char_delete(cursor); + _e_entry_smart = evas_smart_new("e_entry", + _e_entry_smart_add, /* add */ + _e_entry_smart_del, /* del */ + NULL, NULL, NULL, NULL, NULL, /* stacking */ + _e_entry_smart_move, /* move */ + _e_entry_smart_resize, /* resize */ + _e_entry_smart_show, /* show */ + _e_entry_smart_hide, /* hide */ + _e_entry_color_set, /* color_set */ + _e_entry_clip_set, /* clip_set */ + _e_entry_clip_unset, /* clip_unset */ + NULL); /* data*/ + _e_entry_smart_use = 0; } - - _e_editable_text_size_update(object); - _e_editable_text_cursor_position_update(object); + + _e_entry_smart_use++; + return evas_object_smart_add(evas, _e_entry_smart); } /** - * @brief Moves the cursor of the editable text object at the start of the text - * @param object an editable text object + * Sets the text of the entry object + * + * @param entry an entry object + * @param text the text to set */ EAPI void -e_editable_text_cursor_move_at_start(Evas_Object *object) +e_entry_text_set(Evas_Object *entry, const char *text) { - E_Editable_Text_Smart_Data *sd; - Evas_Textblock_Cursor *cursor; - - if ((!object) || - (!(sd = evas_object_smart_data_get(object))) || - (_e_editable_text_is_empty(object))) + E_Entry_Smart_Data *sd; + + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return; - - cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(sd->text_object); - sd->cursor_at_the_end = 0; - evas_textblock_cursor_char_first(cursor); - - _e_editable_text_cursor_position_update(object); + + e_editable_text_set(sd->editable_object, text); + evas_object_smart_callback_call(entry, "changed", NULL); } /** - * @brief Moves the cursor of the editable text object at the end of the text - * @param object an editable text object + * Gets the text of the entry object + * + * @param entry an entry object + * @return Returns the text of the entry object */ -EAPI void -e_editable_text_cursor_move_at_end(Evas_Object *object) +EAPI const char * +e_entry_text_get(Evas_Object *entry) { - E_Editable_Text_Smart_Data *sd; - Evas_Textblock_Cursor *cursor; - - if ((!object) || - (!(sd = evas_object_smart_data_get(object))) || - (_e_editable_text_is_empty(object))) - return; - - cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(sd->text_object); - sd->cursor_at_the_end = 1; - evas_textblock_cursor_char_last(cursor); - - _e_editable_text_cursor_position_update(object); + E_Entry_Smart_Data *sd; + + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) + return NULL; + return e_editable_text_get(sd->editable_object); } /** - * @brief Moves the cursor of the editable text object to the left - * @param object an editable text object + * Clears the entry object + * + * @param entry an entry object */ EAPI void -e_editable_text_cursor_move_left(Evas_Object *object) +e_entry_clear(Evas_Object *entry) { - E_Editable_Text_Smart_Data *sd; - Evas_Textblock_Cursor *cursor; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - - cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(sd->text_object); - if (sd->cursor_at_the_end) - sd->cursor_at_the_end = 0; - else - evas_textblock_cursor_char_prev(cursor); - - _e_editable_text_size_update(object); - _e_editable_text_cursor_position_update(object); + e_entry_text_set(entry, ""); } /** - * @brief Moves the cursor of the editable text object to the right - * @param object an editable text object + * Gets the minimum size of the entry object + * + * @param entry an entry object + * @param minw the location where to store the minimun width of the entry + * @param minh the location where to store the minimun height of the entry */ EAPI void -e_editable_text_cursor_move_right(Evas_Object *object) +e_entry_min_size_get(Evas_Object *entry, Evas_Coord *minw, Evas_Coord *minh) { - E_Editable_Text_Smart_Data *sd; - Evas_Textblock_Cursor *cursor; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) + E_Entry_Smart_Data *sd; + + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return; - - cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(sd->text_object); - if (!evas_textblock_cursor_char_next(cursor)) - sd->cursor_at_the_end = 1; - - _e_editable_text_size_update(object); - _e_editable_text_cursor_position_update(object); + + if (minw) *minw = sd->min_width; + if (minh) *minh = sd->height; } /** - * @brief Shows the cursor of the editable text object - * @param object the editable text object + * Focuses the entry object. It will receives keyboard events and the user could + * then type some text (the entry should also be enabled. The cursor and the + * selection will be shown + * + * @param entry the entry to focus */ EAPI void -e_editable_text_cursor_show(Evas_Object *object) +e_entry_focus(Evas_Object *entry) { - E_Editable_Text_Smart_Data *sd; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) + E_Entry_Smart_Data *sd; + + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return; - - sd->show_cursor = 1; - _e_editable_text_cursor_visibility_update(object); + if (sd->focused) + return; + + evas_object_focus_set(entry, 1); + edje_object_signal_emit(sd->entry_object, "focus_in", ""); + if (sd->enabled) + e_editable_cursor_show(sd->editable_object); + e_editable_selection_show(sd->editable_object); + e_editable_cursor_move_to_end(sd->editable_object); + e_editable_selection_move_to_end(sd->editable_object); + sd->focused = 1; } /** - * @brief Hides the cursor of the editable text object - * @param object the editable text object + * Unfocuses the entry object. It will no longer receives keyboard events so + * the user could no longer type some text. The cursor and the selection will + * be hidden + * + * @param entry the entry object to unfocus */ EAPI void -e_editable_text_cursor_hide(Evas_Object *object) -{ - E_Editable_Text_Smart_Data *sd; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - - sd->show_cursor = 0; - _e_editable_text_cursor_visibility_update(object); -} - -EAPI void -e_editable_text_min_size_get(Evas_Object *object, Evas_Coord *mw, Evas_Coord *mh) -{ - -} - -EAPI Evas_Object * -e_entry_add(Evas *evas) -{ - if(!e_entry_smart) - e_entry_smart = evas_smart_new("e_entry", - _e_entry_smart_add, /* add */ - _e_entry_smart_del, /* del */ - NULL, NULL, NULL, NULL, NULL, - _e_entry_smart_move, /* move */ - _e_entry_smart_resize, /* resize */ - _e_entry_smart_show, /* show */ - _e_entry_smart_hide, /* hide */ - NULL, /* color_set */ - NULL, /* clip_set */ - NULL, /* clip_unset */ - NULL); /* data*/ - return evas_object_smart_add(evas, e_entry_smart); -} - -EAPI void -e_entry_change_handler_set(Evas_Object *object, void (*func)(void *data, Evas_Object *entry, char *key), void *data) +e_entry_unfocus(Evas_Object *entry) { E_Entry_Smart_Data *sd; - if ((!object) || !(sd = evas_object_smart_data_get(object))) + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return; + if (!sd->focused) + return; - sd->change_func = func; - sd->change_data = data; + evas_object_focus_set(entry, 0); + edje_object_signal_emit(sd->entry_object, "focus_out", ""); + e_editable_cursor_hide(sd->editable_object); + e_editable_selection_hide(sd->editable_object); + sd->focused = 0; } +/** + * Enables the entry object: the user will be able to type text + * + * @param entry the entry object to enable + */ EAPI void -e_entry_text_set(Evas_Object *entry, const char *text) -{ - E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) - return; - - e_editable_text_text_set(sd->entry_object, text); -} - -EAPI const char* -e_entry_text_get(Evas_Object *entry) -{ - E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) - return ""; - - return e_editable_text_text_get(sd->entry_object); -} - -EAPI void -e_entry_text_insert(Evas_Object *entry, const char *text) -{ - E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) - return; - - e_editable_text_insert(sd->entry_object, text); -} - -EAPI void -e_entry_delete_char_before(Evas_Object *entry) -{ - E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) - return; - - e_editable_text_delete_char_before(sd->entry_object); -} - -EAPI void -e_entry_delete_char_after(Evas_Object *entry) -{ - E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) - return; - - e_editable_text_delete_char_after(sd->entry_object); -} - -EAPI void -e_entry_cursor_move_at_start(Evas_Object *entry) +e_entry_enable(Evas_Object *entry) { E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) + + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return; - - e_editable_text_cursor_move_at_start(sd->entry_object); + if (sd->enabled) + return; + + edje_object_signal_emit(entry, "enabled", ""); + if (sd->focused) + e_editable_cursor_show(sd->editable_object); + sd->enabled = 1; + } -EAPI void -e_entry_cursor_move_at_end(Evas_Object *entry) -{ - E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) - return; - - e_editable_text_cursor_move_at_end(sd->entry_object); -} +/** + * Disables the entry object: the user won't be able to type anymore. Selection + * will still be possible (to copy the text) + * + * @param entry the entry object to disable + */ EAPI void -e_entry_cursor_move_left(Evas_Object *entry) +e_entry_disable(Evas_Object *entry) { E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) + + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return; - - e_editable_text_cursor_move_left(sd->entry_object); + if (!sd->enabled) + return; + + edje_object_signal_emit(entry, "disabled", ""); + e_editable_cursor_hide(sd->editable_object); + sd->enabled = 0; } -EAPI void -e_entry_cursor_move_right(Evas_Object *entry) -{ - E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) - return; - e_editable_text_cursor_move_right(sd->entry_object); -} +/* Private functions */ -EAPI void -e_entry_cursor_show(Evas_Object *entry) +/* Called when a key has been pressed by the user */ +static void +_e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) + Evas_Object *editable; + Evas_Event_Key_Down *event; + int cursor_pos, selection_pos; + int start_pos, end_pos; + int selecting; + int changed = 0; + + if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) return; - - e_editable_text_cursor_show(sd->entry_object); -} - -EAPI void -e_entry_cursor_hide(Evas_Object *entry) -{ - E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) + if (!(event = event_info) || !(event->keyname)) return; - e_editable_text_cursor_hide(sd->entry_object); -} - -EAPI void -e_entry_focus(Evas_Object *entry) -{ - E_Entry_Smart_Data *sd; + editable = sd->editable_object; + cursor_pos = e_editable_cursor_pos_get(editable); + selection_pos = e_editable_selection_pos_get(editable); + start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; + end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; + selecting = (start_pos != end_pos); - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) - return; + /* TODO: CTRL + A, X, C, V */ - edje_object_signal_emit(sd->edje_object, "focus_in", ""); -} - -EAPI void -e_entry_unfocus(Evas_Object *entry) -{ - E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) + if (!sd->enabled) return; - edje_object_signal_emit(sd->edje_object, "focus_out", ""); -} - -EAPI void -e_entry_min_size_get(Evas_Object *entry, Evas_Coord *mw, Evas_Coord *mh) -{ - E_Entry_Smart_Data *sd; - - if ((!entry) || !(sd = evas_object_smart_data_get(entry))) - return; - if (mw) *mw = sd->minw; - if (mh) *mh = sd->minh; -} - -/************************** - * - * Private functions - * - **************************/ - -/* Returns 1 if the text of the editable object is empty */ -static Evas_Bool -_e_editable_text_is_empty(Evas_Object *object) -{ - E_Editable_Text_Smart_Data *sd; - Evas_Textblock_Cursor *cursor; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return 1; - - cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(sd->text_object); - return (evas_textblock_cursor_node_text_length_get(cursor) <= 0); -} - -/* Updates the size of the text object: to be called when the text of the object is changed */ -static void -_e_editable_text_size_update(Evas_Object *object) -{ - E_Editable_Text_Smart_Data *sd; - int w, h; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - - evas_object_textblock_size_native_get(sd->text_object, &w, &h); - evas_object_resize(sd->text_object, w, h); - evas_object_resize(object, w, h); -} - -/* Updates the cursor position: to be called when the cursor or the object are moved */ -static void -_e_editable_text_cursor_position_update(Evas_Object *object) -{ - E_Editable_Text_Smart_Data *sd; - Evas_Textblock_Cursor *cursor; - Evas_Coord tx, ty, tw, th, cx, cy, cw, ch, ox, oy, ow, oh; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - - evas_object_geometry_get(sd->text_object, &tx, &ty, &tw, &th); - evas_object_geometry_get(object, &ox, &oy, &ow, &oh); - cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(sd->text_object); - - if (_e_editable_text_is_empty(object)) + /* Move the cursor/selection to the left */ + if (strcmp(event->key, "Left") == 0) { - evas_object_move(sd->cursor_object, tx, ty); - evas_object_resize(sd->cursor_object, 1, th); - return; + if (evas_key_modifier_is_set(event->modifiers, "Shift")) + e_editable_cursor_move_left(editable); + else if (selecting) + { + if (cursor_pos < selection_pos) + e_editable_selection_pos_set(editable, cursor_pos); + else + e_editable_cursor_pos_set(editable, selection_pos); + } + else + { + e_editable_cursor_move_left(editable); + e_editable_selection_pos_set(editable, + e_editable_cursor_pos_get(editable)); + } } - else if (sd->cursor_at_the_end) + /* Move the cursor/selection to the right */ + else if (strcmp(event->key, "Right") == 0) { - evas_textblock_cursor_char_last(cursor); - evas_textblock_cursor_char_geometry_get(cursor, &cx, &cy, &cw, &ch); - cx += tx + cw; + if (evas_key_modifier_is_set(event->modifiers, "Shift")) + e_editable_cursor_move_right(editable); + else if (selecting) + { + if (cursor_pos > selection_pos) + e_editable_selection_pos_set(editable, cursor_pos); + else + e_editable_cursor_pos_set(editable, selection_pos); + } + else + { + e_editable_cursor_move_right(editable); + e_editable_selection_pos_set(editable, + e_editable_cursor_pos_get(editable)); + } } - else - { - evas_textblock_cursor_char_geometry_get(cursor, &cx, &cy, &cw, &ch); - cx += tx; - } - - /* TODO: fix */ - if ((cx < ox + 20) && (cx - tx > 20)) + /* Move the cursor/selection to the start of the entry */ + else if ((strcmp(event->keyname, "Home") == 0) || + ((event->string) && (strlen(event->string) == 1) && + (event->string[0] == 0x1))) { - evas_object_move(sd->text_object, tx + ox + 20 - cx, ty); - cx = ox + 20; + e_editable_cursor_move_to_start(editable); + if (!evas_key_modifier_is_set(event->modifiers, "Shift")) + e_editable_selection_pos_set(editable, + e_editable_cursor_pos_get(editable)); } - else if (cx < ox) - { - evas_object_move(sd->text_object, tx + ox - cx, ty); - cx = ox; - } - else if ((cx > ox + ow - 20) && (tw - (cx - tx) > 20)) + /* Move the cursor/selection to the end of the entry */ + else if ((strcmp(event->keyname, "End") == 0) || + ((event->string) && (strlen(event->string) == 1) && + (event->string[0] == 0x5))) { - evas_object_move(sd->text_object, tx - cx + ox + ow - 20, ty); - cx = ox + ow - 20; + e_editable_cursor_move_to_end(editable); + if (!evas_key_modifier_is_set(event->modifiers, "Shift")) + e_editable_selection_pos_set(editable, + e_editable_cursor_pos_get(editable)); } - else if (cx > ox + ow) + /* Remove the previous character */ + else if ((strcmp(event->keyname, "BackSpace") == 0) || + ((event->string) && (strlen(event->string) == 1) && + (event->string[0] == 0x8))) { - evas_object_move(sd->text_object, tx - cx + ox + ow, ty); - cx = ox + ow; + if (selecting) + changed = e_editable_delete(editable, start_pos, end_pos); + else + changed = e_editable_delete(editable, cursor_pos - 1, cursor_pos); } - - evas_object_move(sd->cursor_object, cx, ty + cy); - evas_object_resize(sd->cursor_object, 1, ch); -} - -/* Updates the visibility state of the cursor */ -static void -_e_editable_text_cursor_visibility_update(Evas_Object *object) -{ - E_Editable_Text_Smart_Data *sd; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - - if (!sd->show_cursor) + /* Remove the next character */ + else if ((!strcmp(event->keyname, "Delete")) || + ((event->string) && (strlen(event->string) == 1) && + (event->string[0] == 0x4))) { - if (sd->cursor_timer) - { - ecore_timer_del(sd->cursor_timer); - sd->cursor_timer = NULL; - } - evas_object_hide(sd->cursor_object); + if (selecting) + changed = e_editable_delete(editable, start_pos, end_pos); + else + changed = e_editable_delete(editable, cursor_pos, cursor_pos + 1); } - else + /* Otherwise, we insert the corresponding character */ + else if ((event->string) && + ((strlen(event->string) != 1) || (event->string[0] >= 0x20))) { - if (!sd->cursor_timer) - { - sd->cursor_timer = ecore_timer_add(0.75, _e_editable_text_cursor_timer_cb, object); - evas_object_show(sd->cursor_object); - } + if (selecting) + changed = e_editable_delete(editable, start_pos, end_pos); + changed |= e_editable_insert(editable, start_pos, event->string); } + + if (changed) + evas_object_smart_callback_call(obj, "changed", NULL); } -/* Make the cursor blink */ -// FIXME: cursor should not be a rect - shoudl be an edje. timers not needed then -static int -_e_editable_text_cursor_timer_cb(void *data) -{ - Evas_Object *object; - E_Editable_Text_Smart_Data *sd; - - object = data; +/* Editable object's smart methods */ - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return 1; - - if (evas_object_visible_get(sd->cursor_object)) - { - evas_object_hide(sd->cursor_object); - ecore_timer_interval_set(sd->cursor_timer, 0.25); - } - else - { - evas_object_show(sd->cursor_object); - ecore_timer_interval_set(sd->cursor_timer, 0.75); - } - - return 1; -} - -/* Called when the object is created */ -static void -_e_editable_text_smart_add(Evas_Object *object) +static void _e_entry_smart_add(Evas_Object *object) { Evas *evas; - E_Editable_Text_Smart_Data *sd; - Evas_Textblock_Cursor *cursor; - + E_Entry_Smart_Data *sd; + Evas_Object *o; + int cw, ch; + if ((!object) || !(evas = evas_object_evas_get(object))) return; - if (!e_editable_text_style) - { - e_editable_text_style = evas_textblock_style_new(); - evas_textblock_style_set(e_editable_text_style, "DEFAULT='font=Vera font_size=10 align=left color=#000000 wrap=word'"); - e_editable_text_style_use_count = 0; - } - - sd = malloc(sizeof(E_Editable_Text_Smart_Data)); - if (!sd) return; - sd->show_cursor = 0; - sd->cursor_at_the_end = 1; - sd->cursor_timer = NULL; - - sd->text_object = evas_object_textblock_add(evas); - evas_object_textblock_style_set(sd->text_object, e_editable_text_style); - e_editable_text_style_use_count++; - evas_object_smart_member_add(sd->text_object, object); - - // FIXME: cursor should not be a rect - shoudl be an edje. - sd->clip = evas_object_rectangle_add(evas); - evas_object_clip_set(sd->text_object, sd->clip); - evas_object_smart_member_add(sd->clip, object); - - sd->cursor_object = evas_object_rectangle_add(evas); - evas_object_color_set(sd->cursor_object, 0, 0, 0, 255); - evas_object_smart_member_add(sd->cursor_object, object); - - evas_object_smart_data_set(object, sd); - - cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(sd->text_object); - evas_textblock_cursor_node_first(cursor); - - evas_font_path_append (evas, PACKAGE_DATA_DIR"/data/fonts"); -} - -/* Called when the object is deleted */ -static void -_e_editable_text_smart_del(Evas_Object *object) -{ - E_Editable_Text_Smart_Data *sd; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - - if (sd->cursor_timer) - ecore_timer_del(sd->cursor_timer); - evas_object_del(sd->text_object); - - evas_object_del(sd->clip); - evas_object_del(sd->cursor_object); - free(sd); - - e_editable_text_style_use_count--; - if ((e_editable_text_style_use_count <= 0) && (e_editable_text_style)) - { - evas_textblock_style_free(e_editable_text_style); - e_editable_text_style = NULL; - } -} - -/* Called when the object is moved */ -static void -_e_editable_text_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y) -{ - E_Editable_Text_Smart_Data *sd; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - - evas_object_move(sd->clip, x, y); - evas_object_move(sd->text_object, x, y); - _e_editable_text_cursor_position_update(object); -} - -/* Called when the object is resized */ -static void -_e_editable_text_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h) -{ - E_Editable_Text_Smart_Data *sd; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - - evas_object_resize(sd->clip, w, h); -} - -/* Called when the object is shown */ -static void -_e_editable_text_smart_show(Evas_Object *object) -{ - E_Editable_Text_Smart_Data *sd; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) + sd = malloc(sizeof(E_Entry_Smart_Data)); + if (!sd) return; - - evas_object_show(sd->text_object); - evas_object_show(sd->clip); - _e_editable_text_cursor_visibility_update(object); + + evas_object_smart_data_set(object, sd); + + sd->enabled = 1; + sd->focused = 0; + sd->valign = 0.5; + + o = edje_object_add(evas); + sd->entry_object = o; + e_theme_edje_object_set(o, "base/theme/widgets", "widgets/entry"); + evas_object_smart_member_add(o, object); + + o = e_editable_add(evas); + sd->editable_object = o; + e_editable_cursor_hide(o); + e_editable_char_size_get(o, &cw, &ch); + edje_extern_object_min_size_set(o, cw, ch); + edje_object_part_swallow(sd->entry_object, "text_area", o); + edje_object_size_min_calc(sd->entry_object, &sd->min_width, &sd->height); + evas_object_show(o); + + evas_object_event_callback_add(object, EVAS_CALLBACK_KEY_DOWN, + _e_entry_key_down_cb, NULL); } -/* Called when the object is hidden */ -static void -_e_editable_text_smart_hide(Evas_Object *object) +static void _e_entry_smart_del(Evas_Object *object) { - E_Editable_Text_Smart_Data *sd; - + E_Entry_Smart_Data *sd; + if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - - evas_object_hide(sd->cursor_object); - evas_object_hide(sd->text_object); - evas_object_hide(sd->clip); + + evas_object_del(sd->editable_object); + evas_object_del(sd->entry_object); } -/* Called when the user presses a key */ -static void -_e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event) +static void _e_entry_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y) { E_Entry_Smart_Data *sd; - Evas_Event_Key_Down *key_event = event; - - if ((!obj) || !(sd = evas_object_smart_data_get(obj))) - return; - - obj = sd->entry_object; - - if ((!strcmp(key_event->keyname, "BackSpace")) || - ((key_event->string) && (strlen(key_event->string) == 1) && - (key_event->string[0] == 0x8))) - { - e_editable_text_delete_char_before(obj); - if (sd->change_func) - sd->change_func(sd->change_data, obj, ""); - } - else if ((!strcmp(key_event->keyname, "Delete")) || - ((key_event->string) && (strlen(key_event->string) == 1) && - (key_event->string[0] == 0x4))) - { - e_editable_text_delete_char_after(obj); - if (sd->change_func) - sd->change_func(sd->change_data, obj, ""); - } - else if (!strcmp(key_event->keyname, "Left")) - e_editable_text_cursor_move_left(obj); - else if (!strcmp(key_event->keyname, "Right")) - e_editable_text_cursor_move_right(obj); - else if ((!strcmp(key_event->keyname, "Home")) || - ((key_event->string) && (strlen(key_event->string) == 1) && - (key_event->string[0] == 0x1))) - e_editable_text_cursor_move_at_start(obj); - else if ((!strcmp(key_event->keyname, "End")) || - ((key_event->string) && (strlen(key_event->string) == 1) && - (key_event->string[0] == 0x5))) - e_editable_text_cursor_move_at_end(obj); - else - { - e_editable_text_insert(obj, key_event->string); - if ((key_event->string) && (strcmp(key_event->keyname, "Escape"))) - { - if (*(key_event->string) >= 0x20) - { - if (sd->change_func) - sd->change_func(sd->change_data, obj, - (char *)key_event->string); - } - } - } -} - -/* Called when the entry is focused */ -/* we need to make this work, move then to e_entry_...? fuck it, am too sleepy */ -static void -_e_editable_text_focus_cb(Evas_Object *object) -{ - if (!object) - return; - - e_editable_text_cursor_show(object); -} - -/* Called when the entry is unfocused */ -/* we need to make this work */ -static void -_e_editable_text_unfocus_cb(Evas_Object *object) -{ - if (!object) + Evas_Coord prev_x, prev_y; + Evas_Coord ox, oy; + + if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - - //e_editable_text_object_cursor_hide(object); - //e_editable_text_object_cursor_move_at_start(object); + + evas_object_geometry_get(object, &prev_x, &prev_y, NULL, NULL); + evas_object_geometry_get(sd->entry_object, &ox, &oy, NULL, NULL); + evas_object_move(sd->entry_object, ox + (x - prev_x), oy + (y - prev_y)); } -static void -_e_entry_smart_add(Evas_Object *object) +static void _e_entry_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h) { - Evas *evas; E_Entry_Smart_Data *sd; - Evas_Coord w = 0, h = 0; + Evas_Coord x, y; - if ((!object) || !(evas = evas_object_evas_get(object))) + if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - - sd = malloc(sizeof(E_Entry_Smart_Data)); - if (!sd) return; - - sd->change_func = NULL; - sd->change_data = NULL; - - evas_object_smart_data_set(object, sd); - - sd->edje_object = edje_object_add(evas); - e_theme_edje_object_set(sd->edje_object, "base/theme/widgets", - "widgets/entry"); - evas_object_smart_member_add(sd->edje_object, object); - - sd->entry_object = e_editable_text_add(evas); - e_editable_text_text_set(sd->entry_object, " "); - evas_object_geometry_get(sd->entry_object, NULL, NULL, &w, &h); - e_editable_text_text_set(sd->entry_object, NULL); - edje_extern_object_min_size_set(sd->entry_object, w, h); - edje_object_part_swallow(sd->edje_object, "text_area", sd->entry_object); - edje_object_size_min_calc(sd->edje_object, &w, &h); - sd->minw = w; - sd->minh = h; - evas_object_event_callback_add(object, EVAS_CALLBACK_KEY_DOWN, _e_entry_key_down_cb, NULL); + evas_object_geometry_get(object, &x, &y, NULL, NULL); + evas_object_move(sd->entry_object, x, y + ((h - sd->height) * sd->valign)); + evas_object_resize(sd->entry_object, w, sd->height); } -static void -_e_entry_smart_del(Evas_Object *object) +static void _e_entry_smart_show(Evas_Object *object) { E_Entry_Smart_Data *sd; - + if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - - evas_object_del(sd->entry_object); - evas_object_del(sd->edje_object); - E_FREE(sd); + evas_object_show(sd->entry_object); } -static void -_e_entry_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y) +static void _e_entry_smart_hide(Evas_Object *object) { E_Entry_Smart_Data *sd; - + if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - - evas_object_move(sd->edje_object, x, y); - e_entry_cursor_move_at_start(object); + evas_object_hide(sd->entry_object); } -static void -_e_entry_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h) +static void _e_entry_color_set(Evas_Object *object, int r, int g, int b, int a) { E_Entry_Smart_Data *sd; - Evas_Coord x, y; - + if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - - evas_object_geometry_get(object, &x, &y, NULL, NULL); - evas_object_move(sd->edje_object, x, y + ((h - sd->minh) / 2)); - evas_object_resize(sd->edje_object, w, sd->minh); + evas_object_color_set(sd->entry_object, r, g, b, a); } -static void -_e_entry_smart_show(Evas_Object *object) +static void _e_entry_clip_set(Evas_Object *object, Evas_Object *clip) { E_Entry_Smart_Data *sd; - + if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - - evas_object_show(sd->edje_object); + evas_object_clip_set(sd->entry_object, clip); } -static void -_e_entry_smart_hide(Evas_Object *object) +static void _e_entry_clip_unset(Evas_Object *object) { E_Entry_Smart_Data *sd; - + if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - - evas_object_hide(sd->edje_object); + evas_object_clip_unset(sd->entry_object); } =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- e_entry.h 23 Jul 2006 10:24:30 -0000 1.10 +++ e_entry.h 11 Aug 2006 21:48:18 -0000 1.11 @@ -2,52 +2,20 @@ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #ifdef E_TYPEDEFS - -typedef struct _E_Event_Entry_Change E_Event_Entry_Change; - #else #ifndef E_ENTRY_H #define E_ENTRY_H -struct _E_Event_Entry_Change -{ - Evas_Object *object; - char *keyname; - char *key; - char *string; -}; - -EAPI Evas_Object *e_editable_text_add(Evas *evas); -EAPI void e_editable_text_text_set(Evas_Object *object, const char *text); -EAPI const char *e_entry_text_get(Evas_Object *object); -EAPI void e_editable_text_insert(Evas_Object *object, const char *text); -EAPI void e_editable_text_delete_char_before(Evas_Object *object); -EAPI void e_editable_text_delete_char_after(Evas_Object *object); -EAPI void e_editable_text_cursor_move_at_start(Evas_Object *object); -EAPI void e_editable_text_cursor_move_at_end(Evas_Object *object); -EAPI void e_editable_text_cursor_move_left(Evas_Object *object); -EAPI void e_editable_text_cursor_move_right(Evas_Object *object); -EAPI void e_editable_text_cursor_show(Evas_Object *object); -EAPI void e_editable_text_cursor_hide(Evas_Object *object); +EAPI Evas_Object *e_entry_add (Evas *evas); +EAPI void e_entry_text_set (Evas_Object *entry, const char *text); +EAPI const char *e_entry_text_get (Evas_Object *entry); +EAPI void e_entry_clear (Evas_Object *entry); -EAPI int e_entry_init(void); -EAPI int e_entry_shutdown(void); -EAPI Evas_Object *e_entry_add(Evas *evas); -EAPI void e_entry_text_set (Evas_Object *entry, const char *text); -EAPI const char *e_editable_text_text_get(Evas_Object *object); -EAPI void e_entry_text_insert (Evas_Object *entry, const char *text); -EAPI void e_entry_delete_char_before(Evas_Object *object); -EAPI void e_entry_delete_char_after(Evas_Object *object); -EAPI void e_entry_cursor_move_at_start(Evas_Object *object); -EAPI void e_entry_cursor_move_at_end(Evas_Object *object); -EAPI void e_entry_cursor_move_left(Evas_Object *object); -EAPI void e_entry_cursor_move_right(Evas_Object *object); -EAPI void e_entry_cursor_show(Evas_Object *object); -EAPI void e_entry_cursor_hide(Evas_Object *object); -EAPI void e_entry_change_handler_set(Evas_Object *object, void (*func)(void *data, Evas_Object *entry, char *key), void *data); -EAPI void e_entry_focus(Evas_Object *object); -EAPI void e_entry_unfocus(Evas_Object *object); -EAPI void e_entry_min_size_get(Evas_Object *object, Evas_Coord *mw, Evas_Coord *mh); +EAPI void e_entry_min_size_get (Evas_Object *entry, Evas_Coord *minw, Evas_Coord *minh); +EAPI void e_entry_focus (Evas_Object *entry); +EAPI void e_entry_unfocus (Evas_Object *entry); +EAPI void e_entry_enable (Evas_Object *entry); +EAPI void e_entry_disable (Evas_Object *entry); #endif #endif =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_fileman_smart.c,v retrieving revision 1.138 retrieving revision 1.139 diff -u -3 -r1.138 -r1.139 --- e_fileman_smart.c 8 Jul 2006 09:18:03 -0000 1.138 +++ e_fileman_smart.c 11 Aug 2006 21:48:18 -0000 1.139 @@ -970,9 +970,7 @@ { icon->sd->state = E_FILEMAN_STATE_RENAME; icon->sd->entry_obj = e_entry_add(icon->sd->evas); - evas_object_focus_set(icon->sd->entry_obj, 1); - evas_object_show(icon->sd->entry_obj); - e_entry_cursor_show(icon->sd->entry_obj); + e_entry_focus(icon->sd->entry_obj); e_fm_icon_edit_entry_set(icon->icon_obj, icon->sd->entry_obj); e_fm_icon_title_set(icon->icon_obj, ""); @@ -980,7 +978,6 @@ // e_fm_mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, // _e_fm_win_mouse_up_cb, icon); //e_grabinput_get(icon->sd->win->evas_win, 1, icon->sd->win->evas_win); - e_entry_cursor_move_at_start(icon->sd->entry_obj); e_entry_text_set(icon->sd->entry_obj, icon->file->name); // e_fm_grab_time = ecore_time_get(); =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_includes.h,v retrieving revision 1.112 retrieving revision 1.113 diff -u -3 -r1.112 -r1.113 --- e_includes.h 8 Aug 2006 20:41:46 -0000 1.112 +++ e_includes.h 11 Aug 2006 21:48:18 -0000 1.113 @@ -17,6 +17,7 @@ #include "e_menu.h" #include "e_icon.h" #include "e_box.h" +#include "e_editable.h" #include "e_entry.h" #include "e_init.h" #include "e_int_menus.h" =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_int_config_desklock.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -3 -r1.24 -r1.25 --- e_int_config_desklock.c 8 Jul 2006 09:18:03 -0000 1.24 +++ e_int_config_desklock.c 11 Aug 2006 21:48:18 -0000 1.25 @@ -237,7 +237,7 @@ if (cfdata->auth_method == 0) e_widget_disabled_set(ob, 1); #endif _e_desklock_passwd_cb_change(cfdata, ob); - e_widget_entry_on_change_callback_set(ob, _e_desklock_passwd_cb_change, cfdata); + e_widget_on_change_hook_set(ob, _e_desklock_passwd_cb_change, cfdata); e_widget_min_size_set(ob, 200, 25); e_widget_framelist_object_append(of, ob); @@ -424,7 +424,7 @@ #endif _e_desklock_passwd_cb_change(cfdata, ob); - e_widget_entry_on_change_callback_set(ob, _e_desklock_passwd_cb_change, cfdata); + e_widget_on_change_hook_set(ob, _e_desklock_passwd_cb_change, cfdata); e_widget_min_size_set(ob, 200, 25); e_widget_framelist_object_append(of, ob); =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_widget_entry.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- e_widget_entry.c 23 Jul 2006 10:24:30 -0000 1.13 +++ e_widget_entry.c 11 Aug 2006 21:48:18 -0000 1.14 @@ -2,168 +2,165 @@ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #include "e.h" - typedef struct _E_Widget_Data E_Widget_Data; struct _E_Widget_Data { Evas_Object *o_entry; - Evas_Object *obj; - char **valptr; - void (*on_change_func) (void *data, Evas_Object *obj); - void *on_change_data; + char **text_location; }; +/* local subsystem functions */ static void _e_wid_del_hook(Evas_Object *obj); static void _e_wid_focus_hook(Evas_Object *obj); static void _e_wid_disable_hook(Evas_Object *obj); -static void _e_wid_on_change_hook(void *data, Evas_Object *obj); -//static void _e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source); static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _e_wid_text_change(void *data, Evas_Object *entry, char *key); - -/* local subsystem functions */ +static void _e_wid_changed_cb(void *data, Evas_Object *obj, void *event_info); -static void -_e_wid_del_hook(Evas_Object *obj) -{ +/* externally accessible functions */ + +/** + * Creates a new entry widget + * + * @param evas the evas where to add the new entry widget + * @param text_location the location where to store the text of the entry. + * The current value will be used to initialize the entry + * @return Returns the new entry widget + */ +EAPI Evas_Object * +e_widget_entry_add(Evas *evas, char **text_location) +{ + Evas_Object *obj, *o; E_Widget_Data *wd; + Evas_Coord minw, minh; - wd = e_widget_data_get(obj); - free(wd); + obj = e_widget_add(evas); + + e_widget_del_hook_set(obj, _e_wid_del_hook); + e_widget_focus_hook_set(obj, _e_wid_focus_hook); + e_widget_disable_hook_set(obj, _e_wid_disable_hook); + + wd = calloc(1, sizeof(E_Widget_Data)); + e_widget_data_set(obj, wd); + wd->text_location = text_location; + + o = e_entry_add(evas); + wd->o_entry = o; + evas_object_show(o); + e_widget_sub_object_add(obj, o); + e_widget_resize_object_set(obj, o); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj); + + if ((text_location) && (*text_location)) + e_entry_text_set(o, *text_location); + + e_entry_min_size_get(o, &minw, &minh); + e_widget_min_size_set(obj, minw, minh); + + evas_object_smart_callback_add(o, "changed", _e_wid_changed_cb, obj); + + return obj; } -static void -_e_wid_focus_hook(Evas_Object *obj) +/** + * Sets the text of the entry widget + * + * @param entry an entry widget + * @param text the text to set + */ +EAPI void +e_widget_entry_text_set(Evas_Object *entry, const char *text) { E_Widget_Data *wd; - - wd = e_widget_data_get(obj); - if (e_widget_focus_get(obj)) - { - e_entry_focus(wd->o_entry); - evas_object_focus_set(wd->o_entry, 1); - e_entry_cursor_move_at_end(wd->o_entry); - e_entry_cursor_show(wd->o_entry); - } - else - { - e_entry_unfocus(wd->o_entry); - evas_object_focus_set(wd->o_entry, 0); - e_entry_cursor_hide(wd->o_entry); - } + + if (!(entry) || (!(wd = e_widget_data_get(entry)))) + return; + e_entry_text_set(wd->o_entry, text); } -static void -_e_wid_disable_hook(Evas_Object *obj) +/** + * Gets the text of the entry widget + * + * @param entry an entry widget + * @return Returns the text of the entry widget + */ +EAPI const char * +e_widget_entry_text_get(Evas_Object *entry) { E_Widget_Data *wd; - - wd = e_widget_data_get(obj); - if (e_widget_disabled_get(obj)) - edje_object_signal_emit(wd->o_entry, "disabled", ""); - else - edje_object_signal_emit(wd->o_entry, "enabled", ""); + + if (!(entry) || (!(wd = e_widget_data_get(entry)))) + return NULL; + return e_entry_text_get(wd->o_entry); } -static void -_e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info) +/* TODO, TODOC */ +EAPI void +e_widget_entry_password_set(Evas_Object *obj, int password) { - e_widget_focus_steal(data); } +/* Private functions */ static void -_e_wid_on_change_hook(void *data, Evas_Object *obj) +_e_wid_del_hook(Evas_Object *obj) { E_Widget_Data *wd; - - wd = e_widget_data_get(obj); - if(wd->on_change_func) - wd->on_change_func(wd->on_change_data, obj); + + if (!(obj) || (!(wd = e_widget_data_get(obj)))) + return; + free(wd); } static void -_e_wid_text_change(void *data, Evas_Object *entry, char *key) +_e_wid_focus_hook(Evas_Object *obj) { E_Widget_Data *wd; - const char *text; + + if (!(obj) || (!(wd = e_widget_data_get(obj)))) + return; - wd = data; - E_FREE(*(wd->valptr)); - text = e_entry_text_get(wd->o_entry); - if (!text) - *(wd->valptr) = strdup(""); + if (e_widget_focus_get(obj)) + e_entry_focus(wd->o_entry); else - *(wd->valptr) = strdup(text); - e_widget_change(wd->obj); + e_entry_unfocus(wd->o_entry); } -/* externally accessible functions */ -EAPI Evas_Object * -e_widget_entry_add(Evas *evas, char **val) -{ - Evas_Object *obj, *o; +static void +_e_wid_disable_hook(Evas_Object *obj) +{ E_Widget_Data *wd; - Evas_Coord mw, mh; - - obj = e_widget_add(evas); - e_widget_on_change_hook_set(obj, _e_wid_on_change_hook, NULL); - e_widget_del_hook_set(obj, _e_wid_del_hook); - e_widget_focus_hook_set(obj, _e_wid_focus_hook); - e_widget_disable_hook_set(obj, _e_wid_disable_hook); - wd = calloc(1, sizeof(E_Widget_Data)); - wd->valptr = val; - wd->obj = obj; - wd->on_change_func = NULL; - wd->on_change_data = NULL; - e_widget_data_set(obj, wd); - - o = e_entry_add(evas); - wd->o_entry = o; - evas_object_show(o); - e_entry_min_size_get(o, &mw, &mh); - e_widget_min_size_set(obj, mw, mh); + if (!(obj) || (!(wd = e_widget_data_get(obj)))) + return; - if (*(wd->valptr)) - e_entry_text_set(wd->o_entry, *(wd->valptr)); - - e_widget_sub_object_add(obj, o); - evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj); - e_widget_resize_object_set(obj, o); - - e_entry_change_handler_set(wd->o_entry, _e_wid_text_change, wd); - - return obj; + if (e_widget_disabled_get(obj)) + e_entry_disable(wd->o_entry); + else + e_entry_enable(wd->o_entry); } -void -e_widget_entry_text_set(Evas_Object *entry, const char *text) +static void +_e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info) { - E_Widget_Data *wd; - - wd = e_widget_data_get(entry); - e_entry_text_set(wd->o_entry, text); - E_FREE(*(wd->valptr)); - *(wd->valptr) = strdup(text); + e_widget_focus_steal(data); } -EAPI void -e_widget_entry_on_change_callback_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data) +static void +_e_wid_changed_cb(void *data, Evas_Object *obj, void *event_info) { + Evas_Object *entry; E_Widget_Data *wd; - - wd = e_widget_data_get(obj); - wd->on_change_func = func; - wd->on_change_data = data; -} + const char *text; -EAPI void -e_widget_entry_password_set(Evas_Object *obj, int pw) -{ - E_Widget_Data *wd; + if (!(entry = data) || (!(wd = e_widget_data_get(entry)))) + return; + + if (wd->text_location) + { + text = e_widget_entry_text_get(entry); + free(*wd->text_location); + *wd->text_location = text ? strdup(text) : NULL; + } - wd = e_widget_data_get(obj); -// FIXME: need password mode for entry. -// e_entry_password_set(wd->o_entry, pw); + e_widget_change(data); } =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_widget_entry.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- e_widget_entry.h 1 Jun 2006 04:09:33 -0000 1.4 +++ e_widget_entry.h 11 Aug 2006 21:48:18 -0000 1.5 @@ -6,10 +6,11 @@ #ifndef E_WIDGET_ENTRY_H #define E_WIDGET_ENTRY_H -EAPI Evas_Object *e_widget_entry_add(Evas *evas, char **val); -EAPI void e_widget_entry_text_set(Evas_Object *entry, const char *text); -EAPI void e_widget_entry_text_insert (Evas_Object *entry, const char *text); -EAPI void e_widget_entry_on_change_callback_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); -EAPI void e_widget_entry_password_set(Evas_Object *obj, int pw); +EAPI Evas_Object *e_widget_entry_add (Evas *evas, char **text_location); +EAPI void e_widget_entry_text_set (Evas_Object *entry, const char *text); +EAPI const char *e_widget_entry_text_get (Evas_Object *entry); +EAPI void e_widget_entry_clear (Evas_Object *entry); +EAPI void e_widget_entry_password_set (Evas_Object *entry, int password); + #endif #endif |
From: Enlightenment C. <no...@cv...> - 2006-08-11 21:48:50
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/data/themes/images Modified Files: Makefile.am Removed Files: entry_focus.png Log Message: * Rewrite the entry widget It is now splitted in 3 files: - e_editable.c that implements a generic single-line editable object that could be used later by other widgets such as the slider or a spinner. - e_entry.c that implements an entry smart object using an editable object. - e_widget_entry.c that embeds an entry smart object in a widget. So far, text insertion and deletion have been implemented. It also supports cursor movement and mouse selection. The text also no longer gets out of the bounds of the entry. Things to come: - Password mode - Copy/Paste - Make it actually themable, for now, the colors/font/style are hardcoded =================================================================== RCS file: /cvs/e/e17/apps/e/data/themes/images/Makefile.am,v retrieving revision 1.65 retrieving revision 1.66 diff -u -3 -r1.65 -r1.66 --- Makefile.am 8 Aug 2006 20:41:45 -0000 1.65 +++ Makefile.am 11 Aug 2006 21:48:18 -0000 1.66 @@ -326,7 +326,6 @@ e17_about_sky_overlay.png \ focus.png \ entry.png \ -entry_focus.png \ e17_scrollbar_hdrag_thumb.png \ e17_scrollbar_vdrag_thumb.png \ e17_fileman_bg.png \ |
From: Enlightenment C. <no...@cv...> - 2006-08-12 12:23:24
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_editable.c e_editable.h e_entry.c e_entry.h e_int_config_desklock.c e_widget_entry.c e_widget_entry.h Log Message: * Add password mode to the entry =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_editable.c 11 Aug 2006 21:48:18 -0000 1.1 +++ e_editable.c 12 Aug 2006 12:21:32 -0000 1.2 @@ -28,6 +28,7 @@ int selection_dragging; int selection_visible; int selectable; + int password_mode; char *text; int char_length; @@ -46,6 +47,7 @@ static int _e_editable_text_delete(Evas_Object *editable, int start, int end); static void _e_editable_cursor_update(Evas_Object *editable); static void _e_editable_selection_update(Evas_Object *editable); +static void _e_editable_text_update(Evas_Object *editable); static void _e_editable_text_position_update(Evas_Object *editable); static int _e_editable_cursor_pos_get_from_coords(Evas_Object *editable, Evas_Coord canvas_x, Evas_Coord canvas_y); @@ -103,6 +105,45 @@ } /** + * Sets whether or not the editable object is in password mode. In password + * mode, the editable object displays '*' instead of the characters + * + * @param editable an editable object + * @param password_mode 1 to turn on the password mode of the editable object, + * 0 to turn it off + */ +EAPI void +e_editable_password_set(Evas_Object *editable, int password_mode) +{ + E_Editable_Smart_Data *sd; + + if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) + return; + if (sd->password_mode == password_mode) + return; + + sd->password_mode = password_mode; + _e_editable_text_update(editable); + _e_editable_cursor_update(editable); +} + +/** + * Gets whether or not the editable is in password mode + * + * @param editable an editable object + * @return Returns 1 if the editable object is in the password mode, 0 otherwise + */ +EAPI int +e_editable_password_get(Evas_Object *editable) +{ + E_Editable_Smart_Data *sd; + + if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) + return 0; + return sd->password_mode; +} + +/** * Sets the text of the editable object * * @param editable an editable object @@ -197,12 +238,12 @@ } /** - * Gets the unicode length of the text of the entry. The unicode length is not - * always the length returned by strlen() since a UTF-8 char can take several - * bytes + * Gets the unicode length of the text of the editable object. The unicode + * length is not always the length returned by strlen() since a UTF-8 char can + * take several bytes * * @param editable an editable object - * @return Returns the unicode length of the text of the entry + * @return Returns the unicode length of the text of the editable object */ EAPI int e_editable_text_length_get(Evas_Object *editable) @@ -693,8 +734,7 @@ /* Private functions */ /* A utility function to insert some text inside the editable object. - * It doesn't update the position of the cursor, nor the selection... - */ + * It doesn't update the position of the cursor, nor the selection... */ static int _e_editable_text_insert(Evas_Object *editable, int pos, const char *text) { @@ -745,14 +785,13 @@ strncpy(&sd->text[index], text, char_length); sd->text[sd->char_length] = '\0'; - evas_object_text_text_set(sd->text_object, sd->text); + _e_editable_text_update(editable); return unicode_length; } /* A utility function to delete a range of text from the editable object. - * It doesn't update the position of the cursor, nor the selection... - */ + * It doesn't update the position of the cursor, nor the selection... */ static int _e_editable_text_delete(Evas_Object *editable, int start, int end) { @@ -785,14 +824,13 @@ sd->unicode_length -= (end - start); sd->text[sd->char_length] = '\0'; - evas_object_text_text_set(sd->text_object, sd->text); + _e_editable_text_update(editable); return end - start; } /* Updates the position of the cursor - * It also updates automatically the text position and the selection - */ + * It also updates automatically the text position and the selection */ static void _e_editable_cursor_update(Evas_Object *editable) { @@ -895,7 +933,34 @@ } } -/* Updates the position of the text according to the position of the cursor */ +/* Updates the text of the text object of the editable object + * (it fills it with '*' if the editable is in password mode) + * It does not update the position of the text */ +static void +_e_editable_text_update(Evas_Object *editable) +{ + E_Editable_Smart_Data *sd; + + if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) + return; + + if (sd->password_mode) + { + char *text; + + text = malloc((sd->unicode_length + 1) * sizeof(char)); + memset(text, '*', sd->unicode_length * sizeof(char)); + text[sd->unicode_length] = '\0'; + evas_object_text_text_set(sd->text_object, text); + free(text); + } + else + evas_object_text_text_set(sd->text_object, sd->text ? sd->text : ""); + +} + +/* Updates the position of the text object according to the position of the + * cursor (we make sure the cursor is visible) */ static void _e_editable_text_position_update(Evas_Object *editable) { @@ -938,8 +1003,7 @@ } /* Returns the position where to place the cursor according to the given coords - * Returns -1 on failure - */ + * Returns -1 on failure */ static int _e_editable_cursor_pos_get_from_coords(Evas_Object *editable, Evas_Coord canvas_x, Evas_Coord canvas_y) { @@ -1103,6 +1167,7 @@ sd->selection_dragging = 0; sd->selection_visible = 1; sd->selectable = 1; + sd->password_mode = 0; sd->clip_object = evas_object_rectangle_add(evas); evas_object_smart_member_add(sd->clip_object, object); =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_editable.h 11 Aug 2006 21:48:18 -0000 1.1 +++ e_editable.h 12 Aug 2006 12:21:32 -0000 1.2 @@ -7,6 +7,8 @@ #define E_EDITABLE_H EAPI Evas_Object *e_editable_add (Evas *evas); +EAPI void e_editable_password_set (Evas_Object *editable, int password_mode); +EAPI int e_editable_password_get (Evas_Object *editable); EAPI void e_editable_text_set (Evas_Object *editable, const char *text); EAPI const char *e_editable_text_get (Evas_Object *editable); EAPI char *e_editable_text_range_get (Evas_Object *editable, int start, int end); =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -3 -r1.21 -r1.22 --- e_entry.c 11 Aug 2006 21:48:18 -0000 1.21 +++ e_entry.c 12 Aug 2006 12:21:32 -0000 1.22 @@ -116,6 +116,41 @@ } /** + * Gets the editable object used by the entry object. It will allow you to have + * better control on the text, the cursor or the selection of the entry with + * the e_editable_*() functions. + * + * @param entry an entry object + * @return Returns the editable object used by the entry object + */ +EAPI Evas_Object * +e_entry_editable_object_get(Evas_Object *entry) +{ + E_Entry_Smart_Data *sd; + + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) + return NULL; + return sd->editable_object; +} + +/** + * Sets whether or not the entry object is in password mode. In password mode, + * the entry displays '*' instead of the characters + * + * @param entry an entry object + * @param password_mode 1 to turn on password mode, 0 to turn it off + */ +EAPI void +e_entry_password_set(Evas_Object *entry, int password_mode) +{ + E_Entry_Smart_Data *sd; + + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) + return; + e_editable_password_set(sd->editable_object, password_mode); +} + +/** * Gets the minimum size of the entry object * * @param entry an entry object =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- e_entry.h 11 Aug 2006 21:48:18 -0000 1.11 +++ e_entry.h 12 Aug 2006 12:21:32 -0000 1.12 @@ -6,16 +6,18 @@ #ifndef E_ENTRY_H #define E_ENTRY_H -EAPI Evas_Object *e_entry_add (Evas *evas); -EAPI void e_entry_text_set (Evas_Object *entry, const char *text); -EAPI const char *e_entry_text_get (Evas_Object *entry); -EAPI void e_entry_clear (Evas_Object *entry); +EAPI Evas_Object *e_entry_add (Evas *evas); +EAPI void e_entry_text_set (Evas_Object *entry, const char *text); +EAPI const char *e_entry_text_get (Evas_Object *entry); +EAPI void e_entry_clear (Evas_Object *entry); +EAPI Evas_Object *e_entry_editable_object_get (Evas_Object *entry); -EAPI void e_entry_min_size_get (Evas_Object *entry, Evas_Coord *minw, Evas_Coord *minh); -EAPI void e_entry_focus (Evas_Object *entry); -EAPI void e_entry_unfocus (Evas_Object *entry); -EAPI void e_entry_enable (Evas_Object *entry); -EAPI void e_entry_disable (Evas_Object *entry); +EAPI void e_entry_password_set (Evas_Object *entry, int password_mode); +EAPI void e_entry_min_size_get (Evas_Object *entry, Evas_Coord *minw, Evas_Coord *minh); +EAPI void e_entry_focus (Evas_Object *entry); +EAPI void e_entry_unfocus (Evas_Object *entry); +EAPI void e_entry_enable (Evas_Object *entry); +EAPI void e_entry_disable (Evas_Object *entry); #endif #endif =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_int_config_desklock.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -3 -r1.25 -r1.26 --- e_int_config_desklock.c 11 Aug 2006 21:48:18 -0000 1.25 +++ e_int_config_desklock.c 12 Aug 2006 12:21:32 -0000 1.26 @@ -32,7 +32,6 @@ static void _load_bgs(E_Config_Dialog_Data *cfdata); static void _ibg_list_cb_bg_selected(void *data); -static void _e_desklock_passwd_cb_change(void *data, Evas_Object *obj); static void _e_desklock_cb_show_passwd(void *data, Evas_Object *obj); static void _e_desklock_cb_lb_show_change(void *data, Evas_Object *obj); #ifdef HAVE_PAM @@ -236,8 +235,8 @@ #ifdef HAVE_PAM if (cfdata->auth_method == 0) e_widget_disabled_set(ob, 1); #endif - _e_desklock_passwd_cb_change(cfdata, ob); - e_widget_on_change_hook_set(ob, _e_desklock_passwd_cb_change, cfdata); + + e_widget_entry_password_set(ob, !cfdata->show_password); e_widget_min_size_set(ob, 200, 25); e_widget_framelist_object_append(of, ob); @@ -423,8 +422,7 @@ if (cfdata->auth_method == 0) e_widget_disabled_set(ob, 1); #endif - _e_desklock_passwd_cb_change(cfdata, ob); - e_widget_on_change_hook_set(ob, _e_desklock_passwd_cb_change, cfdata); + e_widget_entry_password_set(ob, !cfdata->show_password); e_widget_min_size_set(ob, 200, 25); e_widget_framelist_object_append(of, ob); @@ -481,7 +479,7 @@ E_Config_Dialog_Data *cfdata; cfdata = data; - _e_desklock_passwd_cb_change(cfdata, cfdata->gui.passwd_field); + e_widget_entry_password_set(cfdata->gui.passwd_field, !cfdata->show_password); } static int @@ -672,55 +670,6 @@ theme = e_theme_edje_file_get("base/theme/desklock", "desklock/background"); e_widget_preview_edje_set(cfdata->preview_image, theme, "desklock/background"); } -} - -static void -_e_desklock_passwd_cb_change(void *data, Evas_Object *obj) -{ - E_Config_Dialog_Data *cfdata; - int i; - - cfdata = data; - - // here goes the hack to have e_widget_entry look like - // password entry. However, I think, this should be implemented - // at least on the e_widget_entry level. The best would be - // e_entry. - if (!cfdata->desklock_passwd[0]) - { - E_FREE(cfdata->desklock_passwd_cp); - cfdata->desklock_passwd_cp = strdup(""); - return; - } - - if (strlen(cfdata->desklock_passwd) > strlen(cfdata->desklock_passwd_cp)) - { - for (i = 0; i < strlen(cfdata->desklock_passwd_cp); i++) - cfdata->desklock_passwd[i] = cfdata->desklock_passwd_cp[i]; - E_FREE(cfdata->desklock_passwd_cp); - cfdata->desklock_passwd_cp = strdup(cfdata->desklock_passwd); - } - else if (strlen(cfdata->desklock_passwd) < strlen(cfdata->desklock_passwd_cp)) - { - cfdata->desklock_passwd_cp[strlen(cfdata->desklock_passwd)] = 0; - E_FREE(cfdata->desklock_passwd); - cfdata->desklock_passwd = strdup(cfdata->desklock_passwd_cp); - } - else - { - E_FREE(cfdata->desklock_passwd); - cfdata->desklock_passwd = strdup(cfdata->desklock_passwd_cp); - } - - if (cfdata->show_password) - { - e_widget_entry_text_set(obj, cfdata->desklock_passwd); - return; - } - -// FIXME: this is a hack. disable. see e_widget_entry.c for doing this right. -// for (ptr = cfdata->desklock_passwd; *ptr; ptr++) *ptr = '*'; -// e_widget_entry_text_set(obj, cfdata->desklock_passwd); } static void =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_widget_entry.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- e_widget_entry.c 11 Aug 2006 21:48:18 -0000 1.14 +++ e_widget_entry.c 12 Aug 2006 12:21:32 -0000 1.15 @@ -17,6 +17,7 @@ static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_wid_changed_cb(void *data, Evas_Object *obj, void *event_info); + /* externally accessible functions */ /** @@ -94,13 +95,44 @@ return e_entry_text_get(wd->o_entry); } -/* TODO, TODOC */ +/** + * Sets whether or not the entry widget is in password mode. In password mode, + * the entry displays '*' instead of the characters + * + * @param entry an entry widget + * @param password_mode 1 to turn on password mode, 0 to turn it off + */ EAPI void -e_widget_entry_password_set(Evas_Object *obj, int password) +e_widget_entry_password_set(Evas_Object *entry, int password_mode) { + E_Widget_Data *wd; + + if (!(entry) || (!(wd = e_widget_data_get(entry)))) + return; + e_entry_password_set(wd->o_entry, password_mode); } +/** + * Gets the editable object of the entry widget. It will allow you to have + * better control on the text, the cursor or the selection of the entry with + * the e_editable_*() functions. + * + * @param entry an entry widget + * @return Returns the editable object of the entry widget + */ +EAPI Evas_Object * +e_widget_entry_editable_object_get(Evas_Object *entry) +{ + E_Widget_Data *wd; + + if (!(entry) || (!(wd = e_widget_data_get(entry)))) + return NULL; + return e_entry_editable_object_get(wd->o_entry); +} + + /* Private functions */ + static void _e_wid_del_hook(Evas_Object *obj) { =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_widget_entry.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- e_widget_entry.h 11 Aug 2006 21:48:18 -0000 1.5 +++ e_widget_entry.h 12 Aug 2006 12:21:32 -0000 1.6 @@ -6,11 +6,12 @@ #ifndef E_WIDGET_ENTRY_H #define E_WIDGET_ENTRY_H -EAPI Evas_Object *e_widget_entry_add (Evas *evas, char **text_location); -EAPI void e_widget_entry_text_set (Evas_Object *entry, const char *text); -EAPI const char *e_widget_entry_text_get (Evas_Object *entry); -EAPI void e_widget_entry_clear (Evas_Object *entry); -EAPI void e_widget_entry_password_set (Evas_Object *entry, int password); +EAPI Evas_Object *e_widget_entry_add (Evas *evas, char **text_location); +EAPI void e_widget_entry_text_set (Evas_Object *entry, const char *text); +EAPI const char *e_widget_entry_text_get (Evas_Object *entry); +EAPI void e_widget_entry_clear (Evas_Object *entry); +EAPI void e_widget_entry_password_set (Evas_Object *entry, int password_mode); +EAPI Evas_Object *e_widget_entry_editable_object_get (Evas_Object *entry); #endif #endif |
From: Enlightenment C. <no...@cv...> - 2006-08-12 20:51:32
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_editable.c e_editable.h e_entry.c Log Message: * [Entry] The selection and the cursor are now themable. The text is still hardcoded though * [Entry] Fix some behaviour bugs =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- e_editable.c 12 Aug 2006 12:21:32 -0000 1.2 +++ e_editable.c 12 Aug 2006 20:51:29 -0000 1.3 @@ -25,7 +25,6 @@ int cursor_pos; int cursor_visible; int selection_pos; - int selection_dragging; int selection_visible; int selectable; int password_mode; @@ -38,6 +37,9 @@ char *font; int font_size; Evas_Text_Style_Type font_style; + int cursor_width; + int selection_on_fg; + int average_char_w; int average_char_h; }; @@ -48,13 +50,8 @@ static void _e_editable_cursor_update(Evas_Object *editable); static void _e_editable_selection_update(Evas_Object *editable); static void _e_editable_text_update(Evas_Object *editable); -static void _e_editable_text_position_update(Evas_Object *editable); -static int _e_editable_cursor_pos_get_from_coords(Evas_Object *editable, Evas_Coord canvas_x, Evas_Coord canvas_y); - +static void _e_editable_text_position_update(Evas_Object *editable, Evas_Coord real_w); static int _e_editable_cursor_timer_cb(void *data); -static void _e_editable_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _e_editable_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _e_editable_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_editable_smart_add(Evas_Object *object); static void _e_editable_smart_del(Evas_Object *object); @@ -105,6 +102,61 @@ } /** + * Sets the theme group to be used by the editable object. + * This function has to be called, or the cursor and the selection won't be + * visible. + * + * @param editable an editable object + * @param category the theme category to use for the editable object + * @param group the theme group to use for the editable object + */ +EAPI void +e_editable_theme_set(Evas_Object *editable, const char *category, const char *group) +{ + E_Editable_Smart_Data *sd; + char *obj_group; + const char *data; + + if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) + return; + if ((!category) || (!group)) + return; + + /* Gets the theme for the cursor */ + obj_group = malloc(strlen(group) + strlen("/cursor") + 1); + sprintf(obj_group, "%s/cursor", group); + e_theme_edje_object_set(sd->cursor_object, category, obj_group); + free(obj_group); + + edje_object_size_min_get(sd->cursor_object, &sd->cursor_width, NULL); + if (sd->cursor_width < 1) + sd->cursor_width = 1; + + + /* Gets the theme for the selection */ + obj_group = malloc(strlen(group) + strlen("/selection") + 1); + sprintf(obj_group, "%s/selection", group); + e_theme_edje_object_set(sd->selection_object, category, obj_group); + free(obj_group); + + data = edje_object_data_get(sd->selection_object, "on_foreground"); + if ((data) && (strcmp(data, "1") == 0)) + { + sd->selection_on_fg = 1; + evas_object_stack_above(sd->selection_object, sd->text_object); + } + else + { + sd->selection_on_fg = 0; + evas_object_stack_below(sd->selection_object, sd->text_object); + } + + /* TODO: font */ + + _e_editable_cursor_update(editable); +} + +/** * Sets whether or not the editable object is in password mode. In password * mode, the editable object displays '*' instead of the characters * @@ -172,8 +224,8 @@ sd->allocated_length = E_EDITABLE_BLOCK_SIZE; } - sd->cursor_pos = 0; - sd->selection_pos = 0; + sd->cursor_pos = sd->unicode_length; + sd->selection_pos = sd->unicode_length; _e_editable_cursor_update(editable); } @@ -281,7 +333,7 @@ if (sd->selection_pos >= pos) e_editable_selection_pos_set(editable, sd->selection_pos + unicode_length); - _e_editable_text_position_update(editable); + _e_editable_text_position_update(editable, -1); return 1; } @@ -317,7 +369,7 @@ else if (sd->selection_pos > start) e_editable_selection_pos_set(editable, start); - _e_editable_text_position_update(editable); + _e_editable_text_position_update(editable, -1); return 1; } @@ -689,6 +741,57 @@ } /** + * Gets the cursor position at the coords ( @a x, @a y ). It's used to know + * where to place the cursor or the selection bound on mouse evevents. + * + * @param editable an editable object + * @param x the x coord, relative to the editable object + * @param y the y coord, relative to the editable object + * @return Returns the position where to place the cursor according to the + * given coords, or -1 on failure + */ +EAPI int +e_editable_pos_get_from_coords(Evas_Object *editable, Evas_Coord x, Evas_Coord y) +{ + E_Editable_Smart_Data *sd; + Evas_Coord ox, oy; + Evas_Coord tx, ty, tw, th; + Evas_Coord cx, cw; + Evas_Coord canvas_x, canvas_y; + int pos; + + if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) + return -1; + + evas_object_geometry_get(editable, &ox, &oy, NULL, NULL); + evas_object_geometry_get(sd->text_object, &tx, &ty, &tw, &th); + canvas_x = ox + x; + canvas_y = oy + y; + + if ((canvas_y < ty) || (canvas_x < tx)) + pos = 0; + else if ((canvas_y > (ty + th)) || (canvas_x > (tx + tw))) + pos = sd->unicode_length; + else + { + pos = evas_object_text_char_coords_get(sd->text_object, + canvas_x - tx, canvas_y - ty, + &cx, NULL, &cw, NULL); + if (pos >= 0) + { + if ((canvas_x - tx) > (cx + (cw / 2))) + pos++; + if (pos > sd->unicode_length) + pos = sd->unicode_length; + } + else + pos = -1; + } + + return pos; +} + +/** * A utility function to get the average size of a character written inside * the editable object * @@ -874,7 +977,7 @@ } _e_editable_selection_update(editable); - _e_editable_text_position_update(editable); + _e_editable_text_position_update(editable, -1); } /* Updates the selection of the editable object */ @@ -962,7 +1065,7 @@ /* Updates the position of the text object according to the position of the * cursor (we make sure the cursor is visible) */ static void -_e_editable_text_position_update(Evas_Object *editable) +_e_editable_text_position_update(Evas_Object *editable, Evas_Coord real_w) { E_Editable_Smart_Data *sd; Evas_Coord ox, oy, ow; @@ -975,6 +1078,8 @@ return; evas_object_geometry_get(editable, &ox, &oy, &ow, NULL); + if (real_w >= 0) + ow = real_w; evas_object_geometry_get(sd->text_object, &tx, &ty, &tw, NULL); evas_object_geometry_get(sd->cursor_object, &cx, &cy, &cw, NULL); evas_object_geometry_get(sd->selection_object, &sx, &sy, NULL, NULL); @@ -1002,44 +1107,6 @@ } } -/* Returns the position where to place the cursor according to the given coords - * Returns -1 on failure */ -static int -_e_editable_cursor_pos_get_from_coords(Evas_Object *editable, Evas_Coord canvas_x, Evas_Coord canvas_y) -{ - E_Editable_Smart_Data *sd; - Evas_Coord tx, ty, tw, th; - Evas_Coord cx, cw; - int pos; - - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return -1; - - evas_object_geometry_get(sd->text_object, &tx, &ty, &tw, &th); - - if ((canvas_y < ty) || (canvas_x < tx)) - pos = 0; - else if ((canvas_y > (ty + th)) || (canvas_x > (tx + tw))) - pos = sd->unicode_length; - else - { - pos = evas_object_text_char_coords_get(sd->text_object, - canvas_x - tx, canvas_y - ty, - &cx, NULL, &cw, NULL); - if (pos >= 0) - { - if ((canvas_x - tx) > (cx + (cw / 2))) - pos++; - if (pos > sd->unicode_length) - pos = sd->unicode_length; - } - else - pos = -1; - } - - return pos; -} - /* Shows/hides the cursor on regular interval */ static int _e_editable_cursor_timer_cb(void *data) @@ -1064,72 +1131,6 @@ return 1; } -/* Called when the editable object is pressed by the mouse */ -static void -_e_editable_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Object *editable; - E_Editable_Smart_Data *sd; - Evas_Event_Mouse_Down *event; - Evas_Coord ty, th; - int pos; - - if ((!(editable = obj)) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if (!(event = event_info)) - return; - - evas_object_geometry_get(sd->text_object, NULL, &ty, NULL, &th); - if ((event->canvas.y < ty) || (event->canvas.y > (ty + th))) - return; - - pos = _e_editable_cursor_pos_get_from_coords(editable, event->canvas.x, - event->canvas.y); - if (pos >= 0) - { - e_editable_cursor_pos_set(editable, pos); - if (!evas_key_modifier_is_set(event->modifiers, "Shift")) - e_editable_selection_pos_set(editable, pos); - - sd->selection_dragging = 1; - } -} - -/* Called when the editable object is released by the mouse */ -static void -_e_editable_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - E_Editable_Smart_Data *sd; - - if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) - return; - sd->selection_dragging = 0; -} - -/* Called when the mouse moves over the editable object */ -static void -_e_editable_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Object *editable; - E_Editable_Smart_Data *sd; - Evas_Event_Mouse_Move *event; - int pos; - - if ((!(editable = obj)) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if (!(event = event_info)) - return; - - if (sd->selection_dragging) - { - pos = _e_editable_cursor_pos_get_from_coords(editable, - event->cur.canvas.x, - event->cur.canvas.y); - if (pos >= 0) - e_editable_cursor_pos_set(editable, pos); - } -} - /* Editable object's smart methods */ static void @@ -1157,6 +1158,8 @@ sd->font = strdup("Vera"); sd->font_size = 10; sd->font_style = EVAS_TEXT_STYLE_PLAIN; + sd->cursor_width = 1; + sd->selection_on_fg = 0; sd->average_char_w = 0; sd->average_char_h = 0; @@ -1164,7 +1167,6 @@ sd->cursor_pos = 0; sd->cursor_visible = 1; sd->selection_pos = 0; - sd->selection_dragging = 0; sd->selection_visible = 1; sd->selectable = 1; sd->password_mode = 0; @@ -1184,26 +1186,15 @@ evas_object_clip_set(sd->text_object, sd->clip_object); evas_object_smart_member_add(sd->text_object, object); - sd->cursor_object = evas_object_rectangle_add(evas); - /* TODO: themability (and use edje for this?) ! */ - evas_object_color_set(sd->cursor_object, 0, 0, 0, 255); - evas_object_clip_set(sd->cursor_object, sd->clip_object); - evas_object_smart_member_add(sd->cursor_object, object); - - sd->selection_object = evas_object_rectangle_add(evas); - /* TODO: themability (stackint too) ! */ - evas_object_color_set(sd->selection_object, 245, 205, 109, 102); + sd->selection_object = edje_object_add(evas); evas_object_clip_set(sd->selection_object, sd->clip_object); evas_object_smart_member_add(sd->selection_object, object); - _e_editable_cursor_update(object); + sd->cursor_object = edje_object_add(evas); + evas_object_clip_set(sd->cursor_object, sd->clip_object); + evas_object_smart_member_add(sd->cursor_object, object); - evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_DOWN, - _e_editable_mouse_down_cb, NULL); - evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_UP, - _e_editable_mouse_up_cb, NULL); - evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_MOVE, - _e_editable_mouse_move_cb, NULL); + _e_editable_cursor_update(object); } /* Deletes the editable */ @@ -1272,6 +1263,7 @@ evas_object_resize(sd->clip_object, w, h); evas_object_resize(sd->event_object, w, h); + _e_editable_text_position_update(object, w); } /* Shows the editable object */ =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- e_editable.h 12 Aug 2006 12:21:32 -0000 1.2 +++ e_editable.h 12 Aug 2006 20:51:29 -0000 1.3 @@ -7,8 +7,10 @@ #define E_EDITABLE_H EAPI Evas_Object *e_editable_add (Evas *evas); +EAPI void e_editable_theme_set (Evas_Object *editable, const char *category, const char *group); EAPI void e_editable_password_set (Evas_Object *editable, int password_mode); EAPI int e_editable_password_get (Evas_Object *editable); + EAPI void e_editable_text_set (Evas_Object *editable, const char *text); EAPI const char *e_editable_text_get (Evas_Object *editable); EAPI char *e_editable_text_range_get (Evas_Object *editable, int start, int end); @@ -38,6 +40,7 @@ EAPI void e_editable_selectable_set (Evas_Object *editable, int selectable); EAPI int e_editable_selectable_get (Evas_Object *editable); +EAPI int e_editable_pos_get_from_coords (Evas_Object *editable, Evas_Coord x, Evas_Coord y); EAPI void e_editable_char_size_get (Evas_Object *editable, int *w, int *h); #endif =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -3 -r1.22 -r1.23 --- e_entry.c 12 Aug 2006 12:21:32 -0000 1.22 +++ e_entry.c 12 Aug 2006 20:51:29 -0000 1.23 @@ -12,6 +12,7 @@ int enabled; int focused; + int selection_dragging; float valign; int min_width; int height; @@ -19,6 +20,9 @@ /* local subsystem functions */ static void _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _e_entry_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _e_entry_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _e_entry_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_entry_smart_add(Evas_Object *object); static void _e_entry_smart_del(Evas_Object *object); @@ -191,8 +195,6 @@ if (sd->enabled) e_editable_cursor_show(sd->editable_object); e_editable_selection_show(sd->editable_object); - e_editable_cursor_move_to_end(sd->editable_object); - e_editable_selection_move_to_end(sd->editable_object); sd->focused = 1; } @@ -215,6 +217,8 @@ evas_object_focus_set(entry, 0); edje_object_signal_emit(sd->entry_object, "focus_out", ""); + e_editable_cursor_move_to_end(sd->editable_object); + e_editable_selection_move_to_end(sd->editable_object); e_editable_cursor_hide(sd->editable_object); e_editable_selection_hide(sd->editable_object); sd->focused = 0; @@ -387,6 +391,70 @@ evas_object_smart_callback_call(obj, "changed", NULL); } +/* Called when the entry object is pressed by the mouse */ +static void +_e_entry_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + E_Entry_Smart_Data *sd; + Evas_Event_Mouse_Down *event; + Evas_Coord ox, oy; + int pos; + + if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) + return; + if (!(event = event_info)) + return; + + evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); + pos = e_editable_pos_get_from_coords(sd->editable_object, + event->canvas.x - ox, + event->canvas.y - oy); + if (pos >= 0) + { + e_editable_cursor_pos_set(sd->editable_object, pos); + if (!evas_key_modifier_is_set(event->modifiers, "Shift")) + e_editable_selection_pos_set(sd->editable_object, pos); + + sd->selection_dragging = 1; + } +} + +/* Called when the entry object is released by the mouse */ +static void +_e_entry_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + E_Entry_Smart_Data *sd; + + if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) + return; + sd->selection_dragging = 0; +} + +/* Called when the mouse moves over the entry object */ +static void +_e_entry_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + E_Entry_Smart_Data *sd; + Evas_Event_Mouse_Move *event; + Evas_Coord ox, oy; + int pos; + + if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) + return; + if (!(event = event_info)) + return; + + if (sd->selection_dragging) + { + evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); + pos = e_editable_pos_get_from_coords(sd->editable_object, + event->cur.canvas.x - ox, + event->cur.canvas.y - oy); + if (pos >= 0) + e_editable_cursor_pos_set(sd->editable_object, pos); + } +} + /* Editable object's smart methods */ static void _e_entry_smart_add(Evas_Object *object) @@ -407,6 +475,7 @@ sd->enabled = 1; sd->focused = 0; + sd->selection_dragging = 0; sd->valign = 0.5; o = edje_object_add(evas); @@ -416,6 +485,7 @@ o = e_editable_add(evas); sd->editable_object = o; + e_editable_theme_set(o, "base/theme/widgets", "widgets/entry"); e_editable_cursor_hide(o); e_editable_char_size_get(o, &cw, &ch); edje_extern_object_min_size_set(o, cw, ch); @@ -425,6 +495,12 @@ evas_object_event_callback_add(object, EVAS_CALLBACK_KEY_DOWN, _e_entry_key_down_cb, NULL); + evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_DOWN, + _e_entry_mouse_down_cb, NULL); + evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_UP, + _e_entry_mouse_up_cb, NULL); + evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_MOVE, + _e_entry_mouse_move_cb, NULL); } static void _e_entry_smart_del(Evas_Object *object) |
From: Enlightenment C. <no...@cv...> - 2006-08-12 20:52:17
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/data/themes Modified Files: default_entry.edc Log Message: * Theme for the cursor and the selection of the entry =================================================================== RCS file: /cvs/e/e17/apps/e/data/themes/default_entry.edc,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- default_entry.edc 11 Aug 2006 21:48:18 -0000 1.6 +++ default_entry.edc 12 Aug 2006 20:52:15 -0000 1.7 @@ -75,3 +75,33 @@ } } } +group { + name: "widgets/entry/cursor"; + min: 1 0; + parts { + part { + name: "cursor"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 255; + } + } + } +} +group { + name: "widgets/entry/selection"; + data { + item: "on_foreground" "1"; + } + parts { + part { + name: "selection"; + type: RECT; + description { + state: "default" 0.0; + color: 245 205 109 102; + } + } + } +} |
From: Enlightenment C. <no...@cv...> - 2006-08-19 13:53:34
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_editable.c e_editable.h Log Message: * [Editable] remove e_entry_selectable_get/set() because it's useless * [Editable] small fixes =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- e_editable.c 12 Aug 2006 20:51:29 -0000 1.3 +++ e_editable.c 19 Aug 2006 13:53:32 -0000 1.4 @@ -26,7 +26,6 @@ int cursor_visible; int selection_pos; int selection_visible; - int selectable; int password_mode; char *text; @@ -97,7 +96,6 @@ _e_editable_smart_use = 0; } - _e_editable_smart_use++; return evas_object_smart_add(evas, _e_editable_smart); } @@ -152,6 +150,8 @@ } /* TODO: font */ + sd->average_char_w = -1; + sd->average_char_h = -1; _e_editable_cursor_update(editable); } @@ -512,9 +512,9 @@ return; sd->cursor_visible = 0; - if (evas_object_visible_get(editable)) + evas_object_hide(sd->cursor_object); + if (sd->cursor_timer) { - evas_object_hide(sd->cursor_object); ecore_timer_del(sd->cursor_timer); sd->cursor_timer = NULL; } @@ -543,9 +543,7 @@ } /** - * Gets the position of the selection bound of the editable object. If the - * editable object is not selectable, this function returns the position of the - * cursor instead. + * Gets the position of the selection bound of the editable object * * @param editable an editable object * @return Returns the position of the selection bound of the editable object @@ -557,7 +555,7 @@ if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) return 0; - return sd->selectable ? sd->selection_pos : sd->cursor_pos; + return sd->selection_pos; } /** @@ -653,8 +651,7 @@ } /** - * Shows the selection of the editable object. The editable object need to be - * selectable (see e_editable_selectable_set()) + * Shows the selection of the editable object * * @param editable an editable object */ @@ -669,7 +666,7 @@ return; sd->selection_visible = 1; - if ((sd->selectable) && (evas_object_visible_get(editable)) && + if ((evas_object_visible_get(editable)) && (sd->cursor_pos != sd->selection_pos)) evas_object_show(sd->selection_object); } @@ -694,53 +691,6 @@ } /** - * Sets whether or not the editable object is selectable. If the editable object - * is not selectable, the selection rectangle won't be shown, and - * e_editable_selection_pos_get() will then return the position of the cursor - * - * @param editable an editable object - * @param selection 1 to make the editable object selectable, 0 otherwise - */ -EAPI void -e_editable_selectable_set(Evas_Object *editable, int selectable) -{ - E_Editable_Smart_Data *sd; - - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if (sd->selectable == selectable) - return; - - sd->selectable = selectable; - - if (sd->selectable) - e_editable_unselect_all(editable); - - if ((sd->selectable) && (sd->selection_visible) && - (evas_object_visible_get(editable)) && - (sd->cursor_pos != sd->selection_pos)) - evas_object_show(sd->selection_object); - else - evas_object_hide(sd->selection_object); -} - -/** - * Gets whether or not the editable object is selectable - * - * @param editable an editable object - * @return Returns 1 if the editable object is selectable, 0 otherwise - */ -EAPI int -e_editable_selectable_get(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return 0; - return sd->selectable; -} - -/** * Gets the cursor position at the coords ( @a x, @a y ). It's used to know * where to place the cursor or the selection bound on mouse evevents. * @@ -869,7 +819,6 @@ index = evas_string_char_next_get(sd->text, index, NULL); if ((unicode_length <= 0) || (char_length <= 0)) - if ((unicode_length <= 0) || (char_length <= 0)) return 0; prev_length = sd->char_length; @@ -993,8 +942,7 @@ if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) return; - if ((sd->cursor_pos == sd->selection_pos) || - (!sd->selection_visible) || (!sd->selectable)) + if ((sd->cursor_pos == sd->selection_pos) || (!sd->selection_visible)) evas_object_hide(sd->selection_object); else { @@ -1146,6 +1094,7 @@ if (!sd) return; + _e_editable_smart_use++; evas_object_smart_data_set(object, sd); sd->text = malloc((E_EDITABLE_BLOCK_SIZE + 1) * sizeof(char)); @@ -1160,15 +1109,14 @@ sd->font_style = EVAS_TEXT_STYLE_PLAIN; sd->cursor_width = 1; sd->selection_on_fg = 0; - sd->average_char_w = 0; - sd->average_char_h = 0; + sd->average_char_w = -1; + sd->average_char_h = -1; sd->cursor_timer = NULL; sd->cursor_pos = 0; sd->cursor_visible = 1; sd->selection_pos = 0; sd->selection_visible = 1; - sd->selectable = 1; sd->password_mode = 0; sd->clip_object = evas_object_rectangle_add(evas); @@ -1292,8 +1240,7 @@ } } - if ((sd->selectable) && (sd->selection_visible) && - (sd->cursor_pos != sd->selection_pos)) + if ((sd->selection_visible) && (sd->cursor_pos != sd->selection_pos)) evas_object_show(sd->selection_object); } =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- e_editable.h 12 Aug 2006 20:51:29 -0000 1.3 +++ e_editable.h 19 Aug 2006 13:53:32 -0000 1.4 @@ -37,8 +37,6 @@ EAPI void e_editable_unselect_all (Evas_Object *editable); EAPI void e_editable_selection_show (Evas_Object *editable); EAPI void e_editable_selection_hide (Evas_Object *editable); -EAPI void e_editable_selectable_set (Evas_Object *editable, int selectable); -EAPI int e_editable_selectable_get (Evas_Object *editable); EAPI int e_editable_pos_get_from_coords (Evas_Object *editable, Evas_Coord x, Evas_Coord y); EAPI void e_editable_char_size_get (Evas_Object *editable, int *w, int *h); |
From: Enlightenment C. <no...@cv...> - 2006-08-19 18:25:36
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_editable.c Log Message: * Make the text of the entry themable =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- e_editable.c 19 Aug 2006 13:53:32 -0000 1.4 +++ e_editable.c 19 Aug 2006 18:25:34 -0000 1.5 @@ -33,12 +33,8 @@ int unicode_length; int allocated_length; - char *font; - int font_size; - Evas_Text_Style_Type font_style; int cursor_width; int selection_on_fg; - int average_char_w; int average_char_h; }; @@ -120,6 +116,15 @@ if ((!category) || (!group)) return; + /* Gets the theme for the text object */ + obj_group = malloc(strlen(group) + strlen("/text") + 1); + sprintf(obj_group, "%s/text", group); + e_theme_edje_object_set(sd->text_object, category, obj_group); + free(obj_group); + sd->average_char_w = -1; + sd->average_char_h = -1; + + /* Gets the theme for the cursor */ obj_group = malloc(strlen(group) + strlen("/cursor") + 1); sprintf(obj_group, "%s/cursor", group); @@ -149,10 +154,7 @@ evas_object_stack_below(sd->selection_object, sd->text_object); } - /* TODO: font */ - sd->average_char_w = -1; - sd->average_char_h = -1; - + _e_editable_text_update(editable); _e_editable_cursor_update(editable); } @@ -704,6 +706,7 @@ e_editable_pos_get_from_coords(Evas_Object *editable, Evas_Coord x, Evas_Coord y) { E_Editable_Smart_Data *sd; + Evas_Object *text_obj; Evas_Coord ox, oy; Evas_Coord tx, ty, tw, th; Evas_Coord cx, cw; @@ -712,9 +715,11 @@ if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) return -1; + if (!(text_obj = edje_object_part_object_get(sd->text_object, "text"))) + return -1; evas_object_geometry_get(editable, &ox, &oy, NULL, NULL); - evas_object_geometry_get(sd->text_object, &tx, &ty, &tw, &th); + evas_object_geometry_get(text_obj, &tx, &ty, &tw, &th); canvas_x = ox + x; canvas_y = oy + y; @@ -724,7 +729,7 @@ pos = sd->unicode_length; else { - pos = evas_object_text_char_coords_get(sd->text_object, + pos = evas_object_text_char_coords_get(text_obj, canvas_x - tx, canvas_y - ty, &cx, NULL, &cw, NULL); if (pos >= 0) @@ -755,7 +760,6 @@ int tw = 0, th = 0; Evas *evas; E_Editable_Smart_Data *sd; - Evas_Object *text_object; char *text = "Tout est bon dans l'abricot sauf le noyau!" "Wakey wakey! Eggs and Bakey!"; @@ -764,17 +768,15 @@ if ((!editable) || (!(evas = evas_object_evas_get(editable)))) return; - if ((!(sd = evas_object_smart_data_get(editable))) || (!sd->font)) + if ((!(sd = evas_object_smart_data_get(editable)))) return; if ((sd->average_char_w <= 0) || (sd->average_char_h <= 0)) { - text_object = evas_object_text_add(evas); - evas_object_text_font_set(text_object, sd->font, sd->font_size); - evas_object_text_style_set(text_object, sd->font_style); - evas_object_text_text_set(text_object, text); - evas_object_geometry_get(text_object, NULL, NULL, &tw, &th); - evas_object_del(text_object); + /* TODO: 1st method */ + edje_object_part_text_set(sd->text_object, "text", text); + edje_object_size_min_calc(sd->text_object, &tw, &th); + edje_object_part_text_set(sd->text_object, "text", sd->text ? sd->text : "NULL"); sd->average_char_w = tw / strlen(text); sd->average_char_h = th; @@ -887,13 +889,16 @@ _e_editable_cursor_update(Evas_Object *editable) { E_Editable_Smart_Data *sd; + Evas_Object *text_obj; Evas_Coord tx, ty; Evas_Coord cx, cy, cw, ch; if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) return; - - evas_object_geometry_get(sd->text_object, &tx, &ty, NULL, NULL); + if (!(text_obj = edje_object_part_object_get(sd->text_object, "text"))) + return; + + evas_object_geometry_get(text_obj, &tx, &ty, NULL, NULL); if ((sd->unicode_length <= 0) || (sd->cursor_pos <= 0)) { @@ -905,14 +910,14 @@ { if (sd->cursor_pos >= sd->unicode_length) { - evas_object_text_char_pos_get(sd->text_object, sd->unicode_length - 1, + evas_object_text_char_pos_get(text_obj, sd->unicode_length - 1, &cx, &cy, &cw, &ch); evas_object_move(sd->cursor_object, tx + cx + cw - 1, ty + cy); evas_object_resize(sd->cursor_object, 1, ch); } else { - evas_object_text_char_pos_get(sd->text_object, sd->cursor_pos, + evas_object_text_char_pos_get(text_obj, sd->cursor_pos, &cx, &cy, &cw, &ch); evas_object_move(sd->cursor_object, tx + cx - 1, ty + cy); evas_object_resize(sd->cursor_object, 1, ch); @@ -934,6 +939,7 @@ _e_editable_selection_update(Evas_Object *editable) { E_Editable_Smart_Data *sd; + Evas_Object *text_obj; Evas_Coord tx, ty; Evas_Coord cx, cy, cw, ch; Evas_Coord sx, sy, sw, sh; @@ -941,12 +947,14 @@ if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) return; + if (!(text_obj = edje_object_part_object_get(sd->text_object, "text"))) + return; if ((sd->cursor_pos == sd->selection_pos) || (!sd->selection_visible)) evas_object_hide(sd->selection_object); else { - evas_object_geometry_get(sd->text_object, &tx, &ty, NULL, NULL); + evas_object_geometry_get(text_obj, &tx, &ty, NULL, NULL); start_pos = (sd->cursor_pos <= sd->selection_pos) ? sd->cursor_pos : sd->selection_pos; @@ -956,8 +964,7 @@ /* Position of the start cursor (note, the start cursor can not be at * the end of the editable object, and the editable object can not be * empty, or it would have returned before)*/ - evas_object_text_char_pos_get(sd->text_object, start_pos, - &cx, &cy, &cw, &ch); + evas_object_text_char_pos_get(text_obj, start_pos, &cx, &cy, &cw, &ch); sx = tx + cx - 1; sy = ty + cy; @@ -965,15 +972,14 @@ * empty, or it would have returned before)*/ if (end_pos >= sd->unicode_length) { - evas_object_text_char_pos_get(sd->text_object, sd->unicode_length - 1, + evas_object_text_char_pos_get(text_obj, sd->unicode_length - 1, &cx, &cy, &cw, &ch); sw = (tx + cx + cw - 1) - sx; sh = ch; } else { - evas_object_text_char_pos_get(sd->text_object, end_pos, - &cx, &cy, &cw, &ch); + evas_object_text_char_pos_get(text_obj, end_pos, &cx, &cy, &cw, &ch); sw = (tx + cx - 1) - sx; sh = ch; } @@ -991,6 +997,7 @@ _e_editable_text_update(Evas_Object *editable) { E_Editable_Smart_Data *sd; + Evas_Coord minw, minh; if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) return; @@ -1002,12 +1009,17 @@ text = malloc((sd->unicode_length + 1) * sizeof(char)); memset(text, '*', sd->unicode_length * sizeof(char)); text[sd->unicode_length] = '\0'; - evas_object_text_text_set(sd->text_object, text); + edje_object_part_text_set(sd->text_object, "text", text); free(text); } else - evas_object_text_text_set(sd->text_object, sd->text ? sd->text : ""); + { + edje_object_part_text_set(sd->text_object, "text", + sd->text ? sd->text : ""); + } + edje_object_size_min_calc(sd->text_object, &minw, &minh); + evas_object_resize(sd->text_object, minw, minh); } /* Updates the position of the text object according to the position of the @@ -1103,10 +1115,6 @@ sd->unicode_length = 0; sd->allocated_length = E_EDITABLE_BLOCK_SIZE; - /* TODO: themability! */ - sd->font = strdup("Vera"); - sd->font_size = 10; - sd->font_style = EVAS_TEXT_STYLE_PLAIN; sd->cursor_width = 1; sd->selection_on_fg = 0; sd->average_char_w = -1; @@ -1127,10 +1135,7 @@ evas_object_clip_set(sd->event_object, sd->clip_object); evas_object_smart_member_add(sd->event_object, object); - sd->text_object = evas_object_text_add(evas); - evas_object_text_font_set(sd->text_object, sd->font, sd->font_size); - evas_object_text_style_set(sd->text_object, sd->font_style); - evas_object_color_set(sd->text_object, 0, 0, 0, 255); + sd->text_object = edje_object_add(evas); evas_object_clip_set(sd->text_object, sd->clip_object); evas_object_smart_member_add(sd->text_object, object); @@ -1153,8 +1158,6 @@ if ((!object) || (!(sd = evas_object_smart_data_get(object)))) return; - - free(sd->font); evas_object_del(sd->clip_object); evas_object_del(sd->event_object); |
From: Enlightenment C. <no...@cv...> - 2006-08-19 18:25:36
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/data/themes Modified Files: default.edc default_entry.edc Log Message: * Make the text of the entry themable =================================================================== RCS file: /cvs/e/e17/apps/e/data/themes/default.edc,v retrieving revision 1.66 retrieving revision 1.67 diff -u -3 -r1.66 -r1.67 --- default.edc 15 Aug 2006 00:54:32 -0000 1.66 +++ default.edc 19 Aug 2006 18:25:34 -0000 1.67 @@ -22,6 +22,7 @@ } collections { +#include "default_entry.edc" #include "default_background.edc" #include "default_battery.edc" #include "default_border.edc" @@ -45,7 +46,6 @@ #include "default_pointer.edc" #include "default_about.edc" #include "default_theme_about.edc" -#include "default_entry.edc" #include "default_fileman.edc" #include "default_filesel.edc" #include "default_check.edc" =================================================================== RCS file: /cvs/e/e17/apps/e/data/themes/default_entry.edc,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- default_entry.edc 12 Aug 2006 20:52:15 -0000 1.7 +++ default_entry.edc 19 Aug 2006 18:25:34 -0000 1.8 @@ -75,6 +75,30 @@ } } } + +group { + name: "widgets/entry/text"; + parts { + part { + name: "text"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 0 0 0 255; + text { + text: "Entry"; + font: "Edje-Vera"; + size: 10; + min: 1 1; + align: 0.0 0.0; + text_class: "entry"; + } + } + } + } +} + group { name: "widgets/entry/cursor"; min: 1 0; @@ -89,6 +113,7 @@ } } } + group { name: "widgets/entry/selection"; data { |
From: Enlightenment C. <no...@cv...> - 2006-08-19 18:26:12
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/data/themes Modified Files: default.edc Log Message: * Make the text of the entry themable =================================================================== RCS file: /cvs/e/e17/apps/e/data/themes/default.edc,v retrieving revision 1.67 retrieving revision 1.68 diff -u -3 -r1.67 -r1.68 --- default.edc 19 Aug 2006 18:25:34 -0000 1.67 +++ default.edc 19 Aug 2006 18:26:07 -0000 1.68 @@ -22,7 +22,6 @@ } collections { -#include "default_entry.edc" #include "default_background.edc" #include "default_battery.edc" #include "default_border.edc" @@ -46,6 +45,7 @@ #include "default_pointer.edc" #include "default_about.edc" #include "default_theme_about.edc" +#include "default_entry.edc" #include "default_fileman.edc" #include "default_filesel.edc" #include "default_check.edc" |
From: Enlightenment C. <no...@cv...> - 2006-08-19 19:08:17
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/data/themes Modified Files: default.edc default_entry.edc Log Message: [Entry] Make the cursor blink in the theme, not in the code =================================================================== RCS file: /cvs/e/e17/apps/e/data/themes/default.edc,v retrieving revision 1.68 retrieving revision 1.69 diff -u -3 -r1.68 -r1.69 --- default.edc 19 Aug 2006 18:26:07 -0000 1.68 +++ default.edc 19 Aug 2006 19:08:09 -0000 1.69 @@ -22,6 +22,7 @@ } collections { +#include "default_entry.edc" #include "default_background.edc" #include "default_battery.edc" #include "default_border.edc" @@ -45,7 +46,6 @@ #include "default_pointer.edc" #include "default_about.edc" #include "default_theme_about.edc" -#include "default_entry.edc" #include "default_fileman.edc" #include "default_filesel.edc" #include "default_check.edc" =================================================================== RCS file: /cvs/e/e17/apps/e/data/themes/default_entry.edc,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- default_entry.edc 19 Aug 2006 18:25:34 -0000 1.8 +++ default_entry.edc 19 Aug 2006 19:08:09 -0000 1.9 @@ -109,7 +109,39 @@ description { state: "default" 0.0; color: 0 0 0 255; + visible: 0; } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { + name: "cursor_show"; + signal: "show"; + source: ""; + action: STATE_SET "visible" 0.0; + target: "cursor"; + after: "cursor_show_timer"; + } + program { + name: "cursor_hide"; + action: STATE_SET "default" 0.0; + target: "cursor"; + after: "cursor_hide_timer"; + } + program { + name: "cursor_show_timer"; + in: 1.25 0.0; + after: "cursor_hide"; + } + program { + name: "cursor_hide_timer"; + in: 0.25 0.0; + after: "cursor_show"; } } } |
From: Enlightenment C. <no...@cv...> - 2006-08-19 19:08:17
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_editable.c Log Message: [Entry] Make the cursor blink in the theme, not in the code =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- e_editable.c 19 Aug 2006 18:25:34 -0000 1.5 +++ e_editable.c 19 Aug 2006 19:08:09 -0000 1.6 @@ -3,8 +3,6 @@ */ #include "e.h" -#define E_EDITABLE_CURSOR_SHOW_DELAY 1.25 -#define E_EDITABLE_CURSOR_HIDE_DELAY 0.25 #define E_EDITABLE_CURSOR_MARGIN 5 #define E_EDITABLE_BLOCK_SIZE 128 @@ -21,7 +19,6 @@ Evas_Object *cursor_object; Evas_Object *selection_object; - Ecore_Timer *cursor_timer; int cursor_pos; int cursor_visible; int selection_pos; @@ -46,7 +43,6 @@ static void _e_editable_selection_update(Evas_Object *editable); static void _e_editable_text_update(Evas_Object *editable); static void _e_editable_text_position_update(Evas_Object *editable, Evas_Coord real_w); -static int _e_editable_cursor_timer_cb(void *data); static void _e_editable_smart_add(Evas_Object *object); static void _e_editable_smart_del(Evas_Object *object); @@ -489,13 +485,7 @@ return; sd->cursor_visible = 1; - if (evas_object_visible_get(editable)) - { - evas_object_show(sd->cursor_object); - sd->cursor_timer = ecore_timer_add(E_EDITABLE_CURSOR_SHOW_DELAY, - _e_editable_cursor_timer_cb, - editable); - } + evas_object_show(sd->cursor_object); } /** @@ -515,11 +505,6 @@ sd->cursor_visible = 0; evas_object_hide(sd->cursor_object); - if (sd->cursor_timer) - { - ecore_timer_del(sd->cursor_timer); - sd->cursor_timer = NULL; - } } /** @@ -924,11 +909,8 @@ } } - if (sd->cursor_timer) - { - evas_object_show(sd->cursor_object); - ecore_timer_interval_set(sd->cursor_timer, E_EDITABLE_CURSOR_SHOW_DELAY); - } + if (sd->cursor_visible) + evas_object_show(sd->cursor_object); _e_editable_selection_update(editable); _e_editable_text_position_update(editable, -1); @@ -1067,29 +1049,6 @@ } } -/* Shows/hides the cursor on regular interval */ -static int -_e_editable_cursor_timer_cb(void *data) -{ - Evas_Object *editable; - E_Editable_Smart_Data *sd; - - if ((!(editable = data)) || (!(sd = evas_object_smart_data_get(editable)))) - return 1; - - if (evas_object_visible_get(sd->cursor_object)) - { - evas_object_hide(sd->cursor_object); - ecore_timer_interval_set(sd->cursor_timer, E_EDITABLE_CURSOR_HIDE_DELAY); - } - else - { - evas_object_show(sd->cursor_object); - ecore_timer_interval_set(sd->cursor_timer, E_EDITABLE_CURSOR_SHOW_DELAY); - } - - return 1; -} /* Editable object's smart methods */ @@ -1120,7 +1079,6 @@ sd->average_char_w = -1; sd->average_char_h = -1; - sd->cursor_timer = NULL; sd->cursor_pos = 0; sd->cursor_visible = 1; sd->selection_pos = 0; @@ -1164,8 +1122,6 @@ evas_object_del(sd->text_object); evas_object_del(sd->cursor_object); evas_object_del(sd->selection_object); - if (sd->cursor_timer) - ecore_timer_del(sd->cursor_timer); free(sd); @@ -1231,17 +1187,7 @@ evas_object_show(sd->text_object); if (sd->cursor_visible) - { - evas_object_show(sd->cursor_object); - if (sd->cursor_timer) - ecore_timer_interval_set(sd->cursor_timer, E_EDITABLE_CURSOR_SHOW_DELAY); - else - { - sd->cursor_timer = ecore_timer_add(E_EDITABLE_CURSOR_SHOW_DELAY, - _e_editable_cursor_timer_cb, - object); - } - } + evas_object_show(sd->cursor_object); if ((sd->selection_visible) && (sd->cursor_pos != sd->selection_pos)) evas_object_show(sd->selection_object); @@ -1261,12 +1207,6 @@ evas_object_hide(sd->text_object); evas_object_hide(sd->cursor_object); evas_object_hide(sd->selection_object); - - if (sd->cursor_timer) - { - ecore_timer_del(sd->cursor_timer); - sd->cursor_timer = NULL; - } } /* Changes the color of the editable object */ |
From: Enlightenment C. <no...@cv...> - 2006-08-19 19:09:13
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/data/themes Modified Files: default.edc Log Message: * [Entry] Make the cursor blink in the theme, not in the code =================================================================== RCS file: /cvs/e/e17/apps/e/data/themes/default.edc,v retrieving revision 1.69 retrieving revision 1.70 diff -u -3 -r1.69 -r1.70 --- default.edc 19 Aug 2006 19:08:09 -0000 1.69 +++ default.edc 19 Aug 2006 19:09:05 -0000 1.70 @@ -22,7 +22,6 @@ } collections { -#include "default_entry.edc" #include "default_background.edc" #include "default_battery.edc" #include "default_border.edc" @@ -46,6 +45,7 @@ #include "default_pointer.edc" #include "default_about.edc" #include "default_theme_about.edc" +#include "default_entry.edc" #include "default_fileman.edc" #include "default_filesel.edc" #include "default_check.edc" |
From: Enlightenment C. <no...@cv...> - 2006-08-19 20:29:07
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_editable.c e_entry.c Log Message: * [Editable] Improve e_editable_char_size_get() * [Entry] Prepares the entry for copy/paste support but it's just not possible for now =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- e_editable.c 19 Aug 2006 19:08:09 -0000 1.6 +++ e_editable.c 19 Aug 2006 20:29:02 -0000 1.7 @@ -744,24 +744,37 @@ { int tw = 0, th = 0; Evas *evas; + Evas_Object *text_obj; E_Editable_Smart_Data *sd; char *text = "Tout est bon dans l'abricot sauf le noyau!" "Wakey wakey! Eggs and Bakey!"; + const char *font, *font_source; + Evas_Text_Style_Type style; + int font_size; if (w) *w = 0; if (h) *h = 0; if ((!editable) || (!(evas = evas_object_evas_get(editable)))) return; - if ((!(sd = evas_object_smart_data_get(editable)))) + if (!(sd = evas_object_smart_data_get(editable))) + return; + if (!(text_obj = edje_object_part_object_get(sd->text_object, "text"))) return; if ((sd->average_char_w <= 0) || (sd->average_char_h <= 0)) { - /* TODO: 1st method */ - edje_object_part_text_set(sd->text_object, "text", text); - edje_object_size_min_calc(sd->text_object, &tw, &th); - edje_object_part_text_set(sd->text_object, "text", sd->text ? sd->text : "NULL"); + font_source = evas_object_text_font_source_get(text_obj); + evas_object_text_font_get(text_obj, &font, &font_size); + style = evas_object_text_style_get(text_obj); + + text_obj = evas_object_text_add(evas); + evas_object_text_font_source_set(text_obj, font_source); + evas_object_text_font_set(text_obj, font, font_size); + evas_object_text_style_set(text_obj, style); + evas_object_text_text_set(text_obj, text); + evas_object_geometry_get(text_obj, NULL, NULL, &tw, &th); + evas_object_del(text_obj); sd->average_char_w = tw / strlen(text); sd->average_char_h = th; =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -3 -r1.23 -r1.24 --- e_entry.c 12 Aug 2006 20:51:29 -0000 1.23 +++ e_entry.c 19 Aug 2006 20:29:02 -0000 1.24 @@ -282,6 +282,7 @@ int start_pos, end_pos; int selecting; int changed = 0; + char *range; if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) return; @@ -295,11 +296,6 @@ end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; selecting = (start_pos != end_pos); - /* TODO: CTRL + A, X, C, V */ - - if (!sd->enabled) - return; - /* Move the cursor/selection to the left */ if (strcmp(event->key, "Left") == 0) { @@ -339,9 +335,7 @@ } } /* Move the cursor/selection to the start of the entry */ - else if ((strcmp(event->keyname, "Home") == 0) || - ((event->string) && (strlen(event->string) == 1) && - (event->string[0] == 0x1))) + else if (strcmp(event->keyname, "Home") == 0) { e_editable_cursor_move_to_start(editable); if (!evas_key_modifier_is_set(event->modifiers, "Shift")) @@ -349,9 +343,7 @@ e_editable_cursor_pos_get(editable)); } /* Move the cursor/selection to the end of the entry */ - else if ((strcmp(event->keyname, "End") == 0) || - ((event->string) && (strlen(event->string) == 1) && - (event->string[0] == 0x5))) + else if (strcmp(event->keyname, "End") == 0) { e_editable_cursor_move_to_end(editable); if (!evas_key_modifier_is_set(event->modifiers, "Shift")) @@ -359,9 +351,7 @@ e_editable_cursor_pos_get(editable)); } /* Remove the previous character */ - else if ((strcmp(event->keyname, "BackSpace") == 0) || - ((event->string) && (strlen(event->string) == 1) && - (event->string[0] == 0x8))) + else if ((sd->enabled) && (strcmp(event->keyname, "BackSpace") == 0)) { if (selecting) changed = e_editable_delete(editable, start_pos, end_pos); @@ -369,14 +359,37 @@ changed = e_editable_delete(editable, cursor_pos - 1, cursor_pos); } /* Remove the next character */ - else if ((!strcmp(event->keyname, "Delete")) || - ((event->string) && (strlen(event->string) == 1) && - (event->string[0] == 0x4))) + else if ((sd->enabled) && (strcmp(event->keyname, "Delete") == 0)) { if (selecting) changed = e_editable_delete(editable, start_pos, end_pos); else changed = e_editable_delete(editable, cursor_pos, cursor_pos + 1); + } + /* Ctrl + A,C,X,V */ + else if (evas_key_modifier_is_set(event->modifiers, "Control")) + { + if (strcmp(event->keyname, "a") == 0) + e_editable_select_all(editable); + else if ((strcmp(event->keyname, "x") == 0) || + (strcmp(event->keyname, "c") == 0)) + { + if (selecting) + { + range = e_editable_text_range_get(editable, start_pos, end_pos); + if (range) + { + //ecore_x_selection_clipboard_set(); + free(range); + } + if ((sd->enabled) && (strcmp(event->keyname, "x") == 0)) + changed = e_editable_delete(editable, start_pos, end_pos); + } + } + else if (strcmp(event->keyname, "v") == 0) + { + //ecore_x_selection_clipboard_request(); + } } /* Otherwise, we insert the corresponding character */ else if ((event->string) && |
From: Enlightenment C. <no...@cv...> - 2006-08-20 09:48:14
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_editable.c e_entry.c Log Message: * [Entry] Fix the blinking of the cursor * [Entry] Support Copy/Cut. Paste will come later =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- e_editable.c 19 Aug 2006 20:29:02 -0000 1.7 +++ e_editable.c 20 Aug 2006 09:48:13 -0000 1.8 @@ -485,7 +485,11 @@ return; sd->cursor_visible = 1; - evas_object_show(sd->cursor_object); + if (evas_object_visible_get(editable)) + { + evas_object_show(sd->cursor_object); + edje_object_signal_emit(sd->cursor_object, "cursor_show", ""); + } } /** @@ -922,8 +926,11 @@ } } - if (sd->cursor_visible) - evas_object_show(sd->cursor_object); + if (sd->cursor_visible && evas_object_visible_get(editable)) + { + evas_object_show(sd->cursor_object); + edje_object_signal_emit(sd->cursor_object, "cursor_show", ""); + } _e_editable_selection_update(editable); _e_editable_text_position_update(editable, -1); @@ -1107,14 +1114,17 @@ evas_object_smart_member_add(sd->event_object, object); sd->text_object = edje_object_add(evas); + evas_object_pass_events_set(sd->text_object, 1); evas_object_clip_set(sd->text_object, sd->clip_object); evas_object_smart_member_add(sd->text_object, object); sd->selection_object = edje_object_add(evas); + evas_object_pass_events_set(sd->selection_object, 1); evas_object_clip_set(sd->selection_object, sd->clip_object); evas_object_smart_member_add(sd->selection_object, object); sd->cursor_object = edje_object_add(evas); + evas_object_pass_events_set(sd->cursor_object, 1); evas_object_clip_set(sd->cursor_object, sd->clip_object); evas_object_smart_member_add(sd->cursor_object, object); @@ -1200,7 +1210,10 @@ evas_object_show(sd->text_object); if (sd->cursor_visible) - evas_object_show(sd->cursor_object); + { + evas_object_show(sd->cursor_object); + edje_object_signal_emit(sd->cursor_object, "cursor_show", ""); + } if ((sd->selection_visible) && (sd->cursor_pos != sd->selection_pos)) evas_object_show(sd->selection_object); =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -3 -r1.24 -r1.25 --- e_entry.c 19 Aug 2006 20:29:02 -0000 1.24 +++ e_entry.c 20 Aug 2006 09:48:13 -0000 1.25 @@ -283,6 +283,7 @@ int selecting; int changed = 0; char *range; + E_Win *win; if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) return; @@ -379,7 +380,10 @@ range = e_editable_text_range_get(editable, start_pos, end_pos); if (range) { - //ecore_x_selection_clipboard_set(); + if ((win = e_win_evas_object_win_get(obj))) + ecore_x_selection_clipboard_set(win->evas_win, + range, + strlen(range) + 1); free(range); } if ((sd->enabled) && (strcmp(event->keyname, "x") == 0)) |
From: Enlightenment C. <no...@cv...> - 2006-08-20 09:48:46
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/data/themes Modified Files: default_entry.edc Log Message: * [Entry] Fix the blinking of the cursor * [Entry] Support Copy/Cut. Paste will come later =================================================================== RCS file: /cvs/e/e17/apps/e/data/themes/default_entry.edc,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- default_entry.edc 19 Aug 2006 19:08:09 -0000 1.9 +++ default_entry.edc 20 Aug 2006 09:48:13 -0000 1.10 @@ -120,9 +120,18 @@ } programs { program { - name: "cursor_show"; - signal: "show"; + name: "on_cursor_show"; + signal: "cursor_show"; source: ""; + action: ACTION_STOP; + target: "cursor_show"; + target: "cursor_hide"; + target: "cursor_show_timer"; + target: "cursor_hide_timer"; + after: "cursor_show"; + } + program { + name: "cursor_show"; action: STATE_SET "visible" 0.0; target: "cursor"; after: "cursor_show_timer"; @@ -135,7 +144,7 @@ } program { name: "cursor_show_timer"; - in: 1.25 0.0; + in: 1.0 0.0; after: "cursor_hide"; } program { |
From: Enlightenment C. <no...@cv...> - 2006-08-20 12:27:36
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_entry.c Log Message: * [Entry] You can now paste some text in the entry =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -3 -r1.25 -r1.26 --- e_entry.c 20 Aug 2006 09:48:13 -0000 1.25 +++ e_entry.c 20 Aug 2006 12:27:33 -0000 1.26 @@ -9,6 +9,7 @@ { Evas_Object *entry_object; Evas_Object *editable_object; + Ecore_Event_Handler *selection_handler; int enabled; int focused; @@ -23,6 +24,7 @@ static void _e_entry_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_entry_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_entry_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static int _e_entry_selection_notify_handler(void *data, int type, void *event); static void _e_entry_smart_add(Evas_Object *object); static void _e_entry_smart_del(Evas_Object *object); @@ -391,9 +393,11 @@ } } else if (strcmp(event->keyname, "v") == 0) - { - //ecore_x_selection_clipboard_request(); - } + { + if ((win = e_win_evas_object_win_get(obj))) + ecore_x_selection_clipboard_request(win->evas_win, + ECORE_X_SELECTION_TARGET_UTF8_STRING); + } } /* Otherwise, we insert the corresponding character */ else if ((event->string) && @@ -472,6 +476,52 @@ } } +/* Called when the the "selection_notify" event is emitted */ +static int +_e_entry_selection_notify_handler(void *data, int type, void *event) +{ + Evas_Object *entry; + E_Entry_Smart_Data *sd; + Ecore_X_Event_Selection_Notify *ev; + Ecore_X_Selection_Data *selection_data; + Evas_Object *editable; + int cursor_pos, selection_pos; + int start_pos, end_pos; + int selecting; + int changed = 0; + + if ((!(entry = data)) || (!(sd = evas_object_smart_data_get(entry)))) + return 1; + if (!sd->focused) + return 1; + + editable = sd->editable_object; + cursor_pos = e_editable_cursor_pos_get(editable); + selection_pos = e_editable_selection_pos_get(editable); + start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; + end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; + selecting = (start_pos != end_pos); + + ev = event; + if (ev->selection == ECORE_X_SELECTION_CLIPBOARD) + { + if (strcmp(ev->target, ECORE_X_SELECTION_TARGET_UTF8_STRING) == 0) + { + Ecore_X_Selection_Data_Text *text_data; + + text_data = ev->data; + if (selecting) + changed = e_editable_delete(editable, start_pos, end_pos); + changed |= e_editable_insert(editable, start_pos, text_data->text); + } + } + + if (changed) + evas_object_smart_callback_call(entry, "changed", NULL); + + return 1; +} + /* Editable object's smart methods */ static void _e_entry_smart_add(Evas_Object *object) @@ -518,6 +568,10 @@ _e_entry_mouse_up_cb, NULL); evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_MOVE, _e_entry_mouse_move_cb, NULL); + sd->selection_handler = ecore_event_handler_add( + ECORE_X_EVENT_SELECTION_NOTIFY, + _e_entry_selection_notify_handler, + object); } static void _e_entry_smart_del(Evas_Object *object) @@ -527,8 +581,10 @@ if ((!object) || !(sd = evas_object_smart_data_get(object))) return; + ecore_event_handler_del(sd->selection_handler); evas_object_del(sd->editable_object); evas_object_del(sd->entry_object); + free(sd); } static void _e_entry_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y) |
From: Enlightenment C. <no...@cv...> - 2006-08-20 12:51:57
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_entry.c Log Message: * [Entry] Double click on the entry selects all the text of the entry =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -3 -r1.26 -r1.27 --- e_entry.c 20 Aug 2006 12:27:33 -0000 1.26 +++ e_entry.c 20 Aug 2006 12:51:56 -0000 1.27 @@ -392,7 +392,7 @@ changed = e_editable_delete(editable, start_pos, end_pos); } } - else if (strcmp(event->keyname, "v") == 0) + else if ((sd->enabled) && (strcmp(event->keyname, "v") == 0)) { if ((win = e_win_evas_object_win_get(obj))) ecore_x_selection_clipboard_request(win->evas_win, @@ -426,17 +426,25 @@ if (!(event = event_info)) return; - evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); - pos = e_editable_pos_get_from_coords(sd->editable_object, - event->canvas.x - ox, - event->canvas.y - oy); - if (pos >= 0) + if (event->button == 1) { - e_editable_cursor_pos_set(sd->editable_object, pos); - if (!evas_key_modifier_is_set(event->modifiers, "Shift")) - e_editable_selection_pos_set(sd->editable_object, pos); - - sd->selection_dragging = 1; + if (event->flags & EVAS_BUTTON_DOUBLE_CLICK) + e_editable_select_all(sd->editable_object); + else + { + evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); + pos = e_editable_pos_get_from_coords(sd->editable_object, + event->canvas.x - ox, + event->canvas.y - oy); + if (pos >= 0) + { + e_editable_cursor_pos_set(sd->editable_object, pos); + if (!evas_key_modifier_is_set(event->modifiers, "Shift")) + e_editable_selection_pos_set(sd->editable_object, pos); + + sd->selection_dragging = 1; + } + } } } |
From: Enlightenment C. <no...@cv...> - 2006-08-20 22:24:18
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_editable.c Log Message: * [E_Editable] Fix valgrind warnings and mem leak =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- e_editable.c 20 Aug 2006 09:48:13 -0000 1.8 +++ e_editable.c 20 Aug 2006 22:24:16 -0000 1.9 @@ -966,22 +966,32 @@ /* Position of the start cursor (note, the start cursor can not be at * the end of the editable object, and the editable object can not be * empty, or it would have returned before)*/ - evas_object_text_char_pos_get(text_obj, start_pos, &cx, &cy, &cw, &ch); + if (!evas_object_text_char_pos_get(text_obj, start_pos, + &cx, &cy, &cw, &ch)) + return; + sx = tx + cx - 1; sy = ty + cy; + /* Position of the end cursor (note, the editable object can not be * empty, or it would have returned before)*/ if (end_pos >= sd->unicode_length) { - evas_object_text_char_pos_get(text_obj, sd->unicode_length - 1, - &cx, &cy, &cw, &ch); + if (!evas_object_text_char_pos_get(text_obj, + sd->unicode_length - 1, + &cx, &cy, &cw, &ch)) + return; + sw = (tx + cx + cw - 1) - sx; sh = ch; } else { - evas_object_text_char_pos_get(text_obj, end_pos, &cx, &cy, &cw, &ch); + if (!evas_object_text_char_pos_get(text_obj, end_pos, + &cx, &cy, &cw, &ch)) + return; + sw = (tx + cx - 1) - sx; sh = ch; } @@ -1077,6 +1087,7 @@ { Evas *evas; E_Editable_Smart_Data *sd; + Evas_Coord ox, oy; if ((!object) || !(evas = evas_object_evas_get(object))) return; @@ -1087,6 +1098,7 @@ _e_editable_smart_use++; evas_object_smart_data_set(object, sd); + evas_object_geometry_get(object, &ox, &oy, NULL, NULL); sd->text = malloc((E_EDITABLE_BLOCK_SIZE + 1) * sizeof(char)); sd->text[0] = '\0'; @@ -1106,26 +1118,31 @@ sd->password_mode = 0; sd->clip_object = evas_object_rectangle_add(evas); + evas_object_move(sd->clip_object, ox, oy); evas_object_smart_member_add(sd->clip_object, object); sd->event_object = evas_object_rectangle_add(evas); evas_object_color_set(sd->event_object, 255, 255, 255, 0); evas_object_clip_set(sd->event_object, sd->clip_object); + evas_object_move(sd->event_object, ox, oy); evas_object_smart_member_add(sd->event_object, object); sd->text_object = edje_object_add(evas); evas_object_pass_events_set(sd->text_object, 1); evas_object_clip_set(sd->text_object, sd->clip_object); + evas_object_move(sd->text_object, ox, oy); evas_object_smart_member_add(sd->text_object, object); sd->selection_object = edje_object_add(evas); evas_object_pass_events_set(sd->selection_object, 1); evas_object_clip_set(sd->selection_object, sd->clip_object); + evas_object_move(sd->selection_object, ox, oy); evas_object_smart_member_add(sd->selection_object, object); sd->cursor_object = edje_object_add(evas); evas_object_pass_events_set(sd->cursor_object, 1); evas_object_clip_set(sd->cursor_object, sd->clip_object); + evas_object_move(sd->cursor_object, ox, oy); evas_object_smart_member_add(sd->cursor_object, object); _e_editable_cursor_update(object); @@ -1145,7 +1162,7 @@ evas_object_del(sd->text_object); evas_object_del(sd->cursor_object); evas_object_del(sd->selection_object); - + free(sd->text); free(sd); _e_editable_smart_use--; |
From: Enlightenment C. <no...@cv...> - 2006-08-23 08:53:32
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/data/themes Modified Files: default_entry.edc Log Message: * Fix entry focus =================================================================== RCS file: /cvs/e/e17/apps/e/data/themes/default_entry.edc,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- default_entry.edc 23 Aug 2006 03:39:01 -0000 1.12 +++ default_entry.edc 23 Aug 2006 08:53:25 -0000 1.13 @@ -59,16 +59,16 @@ programs { program { name: "entry_focus"; - signal: "focus_in"; - source: ""; + signal: "e,state,focused"; + source: "e"; action: STATE_SET "focus" 0.0; transition: DECELERATE 0.2; target: "entry_focus"; } program { name: "entry_unfocus"; - signal: "focus_out"; - source: ""; + signal: "e,state,unfocused"; + source: "e"; action: STATE_SET "default" 0.0; transition: ACCELERATE 0.5; target: "entry_focus"; |
From: Enlightenment C. <no...@cv...> - 2006-08-23 09:41:23
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_editable.c Log Message: * [Entry] The entry now works with UTF-8 char =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- e_editable.c 22 Aug 2006 07:39:10 -0000 1.10 +++ e_editable.c 23 Aug 2006 09:41:19 -0000 1.11 @@ -43,6 +43,7 @@ static void _e_editable_selection_update(Evas_Object *editable); static void _e_editable_text_update(Evas_Object *editable); static void _e_editable_text_position_update(Evas_Object *editable, Evas_Coord real_w); +static int _e_editable_char_geometry_get_from_pos(Evas_Object *editable, int utf_pos, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch); static void _e_editable_smart_add(Evas_Object *object); static void _e_editable_smart_del(Evas_Object *object); @@ -689,7 +690,7 @@ * @param x the x coord, relative to the editable object * @param y the y coord, relative to the editable object * @return Returns the position where to place the cursor according to the - * given coords, or -1 on failure + * given coords */ EAPI int e_editable_pos_get_from_coords(Evas_Object *editable, Evas_Coord x, Evas_Coord y) @@ -700,12 +701,13 @@ Evas_Coord tx, ty, tw, th; Evas_Coord cx, cw; Evas_Coord canvas_x, canvas_y; - int pos; + int index, pos, i, j; + const char *text; if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return -1; + return 0; if (!(text_obj = edje_object_part_object_get(sd->text_object, "e.text.text"))) - return -1; + return 0; evas_object_geometry_get(editable, &ox, &oy, NULL, NULL); evas_object_geometry_get(text_obj, &tx, &ty, &tw, &th); @@ -718,18 +720,30 @@ pos = sd->unicode_length; else { - pos = evas_object_text_char_coords_get(text_obj, + index = evas_object_text_char_coords_get(text_obj, canvas_x - tx, canvas_y - ty, &cx, NULL, &cw, NULL); - if (pos >= 0) + text = evas_object_text_text_get(text_obj); + if ((index >= 0) && (text)) { if ((canvas_x - tx) > (cx + (cw / 2))) - pos++; + index++; + + i = 0; + j = -1; + pos = 0; + while ((i < index) && (j != i)) + { + pos++; + j = i; + i = evas_string_char_next_get(text, i, NULL); + } + if (pos > sd->unicode_length) pos = sd->unicode_length; } else - pos = -1; + pos = 0; } return pos; @@ -901,30 +915,12 @@ return; evas_object_geometry_get(text_obj, &tx, &ty, NULL, NULL); + _e_editable_char_geometry_get_from_pos(editable, sd->cursor_pos, + &cx, &cy, NULL, &ch); - if ((sd->unicode_length <= 0) || (sd->cursor_pos <= 0)) - { - e_editable_char_size_get(editable, &cw, &ch); - evas_object_move(sd->cursor_object, tx, ty); - evas_object_resize(sd->cursor_object, 1, ch); - } - else - { - if (sd->cursor_pos >= sd->unicode_length) - { - evas_object_text_char_pos_get(text_obj, sd->unicode_length - 1, - &cx, &cy, &cw, &ch); - evas_object_move(sd->cursor_object, tx + cx + cw - 1, ty + cy); - evas_object_resize(sd->cursor_object, 1, ch); - } - else - { - evas_object_text_char_pos_get(text_obj, sd->cursor_pos, - &cx, &cy, &cw, &ch); - evas_object_move(sd->cursor_object, tx + cx - 1, ty + cy); - evas_object_resize(sd->cursor_object, 1, ch); - } - } + evas_object_move(sd->cursor_object, tx + cx, ty + cy); + /* TODO: cursor_width */ + evas_object_resize(sd->cursor_object, 1, ch); if (sd->cursor_visible && evas_object_visible_get(editable)) { @@ -963,38 +959,14 @@ end_pos = (sd->cursor_pos >= sd->selection_pos) ? sd->cursor_pos : sd->selection_pos; - /* Position of the start cursor (note, the start cursor can not be at - * the end of the editable object, and the editable object can not be - * empty, or it would have returned before)*/ - if (!evas_object_text_char_pos_get(text_obj, start_pos, - &cx, &cy, &cw, &ch)) - return; - - sx = tx + cx - 1; + _e_editable_char_geometry_get_from_pos(editable, start_pos, + &cx, &cy, NULL, NULL); + sx = tx + cx; sy = ty + cy; - - /* Position of the end cursor (note, the editable object can not be - * empty, or it would have returned before)*/ - if (end_pos >= sd->unicode_length) - { - if (!evas_object_text_char_pos_get(text_obj, - sd->unicode_length - 1, - &cx, &cy, &cw, &ch)) - return; - - sw = (tx + cx + cw - 1) - sx; - sh = ch; - } - else - { - if (!evas_object_text_char_pos_get(text_obj, end_pos, - &cx, &cy, &cw, &ch)) - return; - - sw = (tx + cx - 1) - sx; - sh = ch; - } + _e_editable_char_geometry_get_from_pos(editable, end_pos, + &cx, NULL, NULL, &sh); + sw = tx + cx - sx; evas_object_move(sd->selection_object, sx, sy); evas_object_resize(sd->selection_object, sw, sh); @@ -1026,8 +998,7 @@ } else { - edje_object_part_text_set(sd->text_object, "e.text.text", - sd->text ? sd->text : ""); + edje_object_part_text_set(sd->text_object, "e.text.text", sd->text); } edje_object_size_min_calc(sd->text_object, &minw, &minh); @@ -1079,6 +1050,57 @@ } } +/* Gets the geometry of the char according to its utf-8 pos */ +static int +_e_editable_char_geometry_get_from_pos(Evas_Object *editable, int utf_pos, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +{ + E_Editable_Smart_Data *sd; + Evas_Object *text_obj; + const char *text; + Evas_Coord x, w; + int index, i; + int last_pos; + int ret; + + if (cx) *cx = 0; + if (cy) *cy = 0; + if (cw) *cw = 0; + if (ch) *ch = 0; + + if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) + return 0; + if (!(text_obj = edje_object_part_object_get(sd->text_object, "e.text.text"))) + return 0; + + text = evas_object_text_text_get(text_obj); + if ((!text) || (sd->unicode_length <= 0) || (utf_pos <= 0)) + { + if (cx) *cx = 0; + if (cy) *cy = 0; + e_editable_char_size_get(editable, cw, ch); + return 1; + } + else + { + if (utf_pos >= sd->unicode_length) + { + utf_pos = sd->unicode_length - 1; + last_pos = 1; + } + else + last_pos = 0; + + + index = 0; + for (i = 0; i < utf_pos; i++) + index = evas_string_char_next_get(text, index, NULL); + + ret = evas_object_text_char_pos_get(text_obj, index, &x, cy, &w, ch); + if (cx) *cx = x - 1 + (last_pos ? w : 0); + if (cw) *cw = last_pos ? 1 : w; + return ret; + } +} /* Editable object's smart methods */ |
From: Enlightenment C. <no...@cv...> - 2006-08-23 10:14:20
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_editable.c e_entry.c Log Message: * [Entry] X selection support =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- e_editable.c 23 Aug 2006 09:41:19 -0000 1.11 +++ e_editable.c 23 Aug 2006 10:14:17 -0000 1.12 @@ -919,8 +919,7 @@ &cx, &cy, NULL, &ch); evas_object_move(sd->cursor_object, tx + cx, ty + cy); - /* TODO: cursor_width */ - evas_object_resize(sd->cursor_object, 1, ch); + evas_object_resize(sd->cursor_object, sd->cursor_width, ch); if (sd->cursor_visible && evas_object_visible_get(editable)) { =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -3 -r1.29 -r1.30 --- e_entry.c 23 Aug 2006 03:39:01 -0000 1.29 +++ e_entry.c 23 Aug 2006 10:14:17 -0000 1.30 @@ -24,7 +24,8 @@ static void _e_entry_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_entry_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_entry_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static int _e_entry_selection_notify_handler(void *data, int type, void *event); +static int _e_entry_x_selection_notify_handler(void *data, int type, void *event); +static void _e_entry_x_selection_update(Evas_Object *entry); static void _e_entry_smart_add(Evas_Object *object); static void _e_entry_smart_del(Evas_Object *object); @@ -248,7 +249,6 @@ } - /** * Disables the entry object: the user won't be able to type anymore. Selection * will still be possible (to copy the text) @@ -284,6 +284,7 @@ int start_pos, end_pos; int selecting; int changed = 0; + int selection_changed = 0; char *range; E_Win *win; @@ -303,7 +304,10 @@ if (strcmp(event->key, "Left") == 0) { if (evas_key_modifier_is_set(event->modifiers, "Shift")) - e_editable_cursor_move_left(editable); + { + e_editable_cursor_move_left(editable); + selection_changed = 1; + } else if (selecting) { if (cursor_pos < selection_pos) @@ -322,7 +326,10 @@ else if (strcmp(event->key, "Right") == 0) { if (evas_key_modifier_is_set(event->modifiers, "Shift")) - e_editable_cursor_move_right(editable); + { + e_editable_cursor_move_right(editable); + selection_changed = 1; + } else if (selecting) { if (cursor_pos > selection_pos) @@ -344,6 +351,8 @@ if (!evas_key_modifier_is_set(event->modifiers, "Shift")) e_editable_selection_pos_set(editable, e_editable_cursor_pos_get(editable)); + else + selection_changed = 1; } /* Move the cursor/selection to the end of the entry */ else if (strcmp(event->keyname, "End") == 0) @@ -352,6 +361,8 @@ if (!evas_key_modifier_is_set(event->modifiers, "Shift")) e_editable_selection_pos_set(editable, e_editable_cursor_pos_get(editable)); + else + selection_changed = 1; } /* Remove the previous character */ else if ((sd->enabled) && (strcmp(event->keyname, "BackSpace") == 0)) @@ -373,7 +384,10 @@ else if (evas_key_modifier_is_set(event->modifiers, "Control")) { if (strcmp(event->keyname, "a") == 0) - e_editable_select_all(editable); + { + e_editable_select_all(editable); + selection_changed = 1; + } else if ((strcmp(event->keyname, "x") == 0) || (strcmp(event->keyname, "c") == 0)) { @@ -410,6 +424,8 @@ if (changed) evas_object_smart_callback_call(obj, "changed", NULL); + if (selection_changed) + _e_entry_x_selection_update(obj); } /* Called when the entry object is pressed by the mouse */ @@ -426,26 +442,35 @@ if (!(event = event_info)) return; + evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); + pos = e_editable_pos_get_from_coords(sd->editable_object, + event->canvas.x - ox, + event->canvas.y - oy); + if (event->button == 1) { if (event->flags & EVAS_BUTTON_DOUBLE_CLICK) e_editable_select_all(sd->editable_object); else { - evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); - pos = e_editable_pos_get_from_coords(sd->editable_object, - event->canvas.x - ox, - event->canvas.y - oy); - if (pos >= 0) - { - e_editable_cursor_pos_set(sd->editable_object, pos); - if (!evas_key_modifier_is_set(event->modifiers, "Shift")) - e_editable_selection_pos_set(sd->editable_object, pos); - - sd->selection_dragging = 1; - } + e_editable_cursor_pos_set(sd->editable_object, pos); + if (!evas_key_modifier_is_set(event->modifiers, "Shift")) + e_editable_selection_pos_set(sd->editable_object, pos); + + sd->selection_dragging = 1; } } + else if (event->button == 2) + { + E_Win *win; + + e_editable_cursor_pos_set(sd->editable_object, pos); + e_editable_selection_pos_set(sd->editable_object, pos); + + if ((win = e_win_evas_object_win_get(obj))) + ecore_x_selection_primary_request(win->evas_win, + ECORE_X_SELECTION_TARGET_UTF8_STRING); + } } /* Called when the entry object is released by the mouse */ @@ -456,7 +481,12 @@ if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) return; - sd->selection_dragging = 0; + + if (sd->selection_dragging) + { + sd->selection_dragging = 0; + _e_entry_x_selection_update(obj); + } } /* Called when the mouse moves over the entry object */ @@ -479,14 +509,13 @@ pos = e_editable_pos_get_from_coords(sd->editable_object, event->cur.canvas.x - ox, event->cur.canvas.y - oy); - if (pos >= 0) - e_editable_cursor_pos_set(sd->editable_object, pos); + e_editable_cursor_pos_set(sd->editable_object, pos); } } /* Called when the the "selection_notify" event is emitted */ static int -_e_entry_selection_notify_handler(void *data, int type, void *event) +_e_entry_x_selection_notify_handler(void *data, int type, void *event) { Evas_Object *entry; E_Entry_Smart_Data *sd; @@ -511,7 +540,8 @@ selecting = (start_pos != end_pos); ev = event; - if (ev->selection == ECORE_X_SELECTION_CLIPBOARD) + if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) || + (ev->selection == ECORE_X_SELECTION_PRIMARY)) { if (strcmp(ev->target, ECORE_X_SELECTION_TARGET_UTF8_STRING) == 0) { @@ -530,6 +560,38 @@ return 1; } +/* Updates the X selection with the selected text of the entry */ +static void +_e_entry_x_selection_update(Evas_Object *entry) +{ + E_Entry_Smart_Data *sd; + Evas_Object *editable; + E_Win *win; + int cursor_pos, selection_pos; + int start_pos, end_pos; + int selecting; + char *text; + + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) + return; + if (!(win = e_win_evas_object_win_get(entry))) + return; + + editable = sd->editable_object; + cursor_pos = e_editable_cursor_pos_get(editable); + selection_pos = e_editable_selection_pos_get(editable); + start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; + end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; + selecting = (start_pos != end_pos); + + if ((!selecting) || + (!(text = e_editable_text_range_get(editable, start_pos, end_pos)))) + return; + + ecore_x_selection_primary_set(win->evas_win, text, strlen(text) + 1); + free(text); +} + /* Editable object's smart methods */ static void _e_entry_smart_add(Evas_Object *object) @@ -578,7 +640,7 @@ _e_entry_mouse_move_cb, NULL); sd->selection_handler = ecore_event_handler_add( ECORE_X_EVENT_SELECTION_NOTIFY, - _e_entry_selection_notify_handler, + _e_entry_x_selection_notify_handler, object); } |
From: Enlightenment C. <no...@cv...> - 2006-08-23 10:51:37
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_widget_entry.c Log Message: * [Entry] Add e_widget_entry_clear() =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_widget_entry.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- e_widget_entry.c 20 Aug 2006 06:42:20 -0000 1.16 +++ e_widget_entry.c 23 Aug 2006 10:51:35 -0000 1.17 @@ -73,7 +73,7 @@ * @param entry an entry widget * @param text the text to set */ -EAPI void +EAPI void e_widget_entry_text_set(Evas_Object *entry, const char *text) { E_Widget_Data *wd; @@ -89,7 +89,7 @@ * @param entry an entry widget * @return Returns the text of the entry widget */ -EAPI const char * +EAPI const char * e_widget_entry_text_get(Evas_Object *entry) { E_Widget_Data *wd; @@ -97,6 +97,21 @@ if (!(entry) || (!(wd = e_widget_data_get(entry)))) return NULL; return e_entry_text_get(wd->o_entry); +} + +/** + * Clears the entry widget + * + * @param entry an entry widget + */ +EAPI void +e_widget_entry_clear(Evas_Object *entry) +{ + E_Widget_Data *wd; + + if (!(entry) || (!(wd = e_widget_data_get(entry)))) + return; + e_entry_clear(wd->o_entry); } /** |
From: Enlightenment C. <no...@cv...> - 2006-08-23 13:39:49
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_entry.c Log Message: * [Entry] The entry now supports the keybindings of Emacs. It's disabled by default. Since I'm not an Emacs/Jed user, I may have forgotten or miscoded some important keybindings. I'd be glad if some Emacs/Jed users could tell me what is wrong. For this, you need to enable the keybindings by changing the line 47 of e_entry.c: "static int _e_entry_emacs_keybindings = 0;" --> "static int _e_entry_emacs_keybindings = 1;" =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -3 -r1.30 -r1.31 --- e_entry.c 23 Aug 2006 10:14:17 -0000 1.30 +++ e_entry.c 23 Aug 2006 13:39:46 -0000 1.31 @@ -14,6 +14,7 @@ int enabled; int focused; int selection_dragging; + int selection_mode; float valign; int min_width; int height; @@ -25,7 +26,10 @@ static void _e_entry_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_entry_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static int _e_entry_x_selection_notify_handler(void *data, int type, void *event); + static void _e_entry_x_selection_update(Evas_Object *entry); +static void _e_entry_key_down_windows(Evas_Object *entry, Evas_Event_Key_Down *event); +static void _e_entry_key_down_emacs(Evas_Object *entry, Evas_Event_Key_Down *event); static void _e_entry_smart_add(Evas_Object *object); static void _e_entry_smart_del(Evas_Object *object); @@ -40,6 +44,7 @@ /* local subsystem globals */ static Evas_Smart *_e_entry_smart = NULL; static int _e_entry_smart_use = 0; +static int _e_entry_emacs_keybindings = 0; /* externally accessible functions */ @@ -195,6 +200,11 @@ evas_object_focus_set(entry, 1); edje_object_signal_emit(sd->entry_object, "e,state,focused", "e"); + if (!sd->selection_dragging) + { + e_editable_cursor_move_to_end(sd->editable_object); + e_editable_selection_move_to_end(sd->editable_object); + } if (sd->enabled) e_editable_cursor_show(sd->editable_object); e_editable_selection_show(sd->editable_object); @@ -220,8 +230,6 @@ evas_object_focus_set(entry, 0); edje_object_signal_emit(sd->entry_object, "e,state,unfocused", "e"); - e_editable_cursor_move_to_end(sd->editable_object); - e_editable_selection_move_to_end(sd->editable_object); e_editable_cursor_hide(sd->editable_object); e_editable_selection_hide(sd->editable_object); sd->focused = 0; @@ -277,9 +285,181 @@ static void _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { + if (_e_entry_emacs_keybindings) + _e_entry_key_down_emacs(obj, event_info); + else + _e_entry_key_down_windows(obj, event_info); +} + +/* Called when the entry object is pressed by the mouse */ +static void +_e_entry_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + E_Entry_Smart_Data *sd; + Evas_Event_Mouse_Down *event; + Evas_Coord ox, oy; + int pos; + + if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) + return; + if (!(event = event_info)) + return; + + evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); + pos = e_editable_pos_get_from_coords(sd->editable_object, + event->canvas.x - ox, + event->canvas.y - oy); + + if (event->button == 1) + { + if (event->flags & EVAS_BUTTON_DOUBLE_CLICK) + e_editable_select_all(sd->editable_object); + else + { + e_editable_cursor_pos_set(sd->editable_object, pos); + if (!evas_key_modifier_is_set(event->modifiers, "Shift")) + e_editable_selection_pos_set(sd->editable_object, pos); + + sd->selection_dragging = 1; + } + } + else if (event->button == 2) + { + E_Win *win; + + e_editable_cursor_pos_set(sd->editable_object, pos); + e_editable_selection_pos_set(sd->editable_object, pos); + + if ((win = e_win_evas_object_win_get(obj))) + ecore_x_selection_primary_request(win->evas_win, + ECORE_X_SELECTION_TARGET_UTF8_STRING); + } +} + +/* Called when the entry object is released by the mouse */ +static void +_e_entry_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + E_Entry_Smart_Data *sd; + + if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) + return; + + if (sd->selection_dragging) + { + sd->selection_dragging = 0; + _e_entry_x_selection_update(obj); + } +} + +/* Called when the mouse moves over the entry object */ +static void +_e_entry_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + E_Entry_Smart_Data *sd; + Evas_Event_Mouse_Move *event; + Evas_Coord ox, oy; + int pos; + + if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) + return; + if (!(event = event_info)) + return; + + if (sd->selection_dragging) + { + evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); + pos = e_editable_pos_get_from_coords(sd->editable_object, + event->cur.canvas.x - ox, + event->cur.canvas.y - oy); + e_editable_cursor_pos_set(sd->editable_object, pos); + } +} + +/* Called when the the "selection_notify" event is emitted */ +static int +_e_entry_x_selection_notify_handler(void *data, int type, void *event) +{ + Evas_Object *entry; + E_Entry_Smart_Data *sd; + Ecore_X_Event_Selection_Notify *ev; + Ecore_X_Selection_Data *selection_data; + Evas_Object *editable; + int cursor_pos, selection_pos; + int start_pos, end_pos; + int selecting; + int changed = 0; + + if ((!(entry = data)) || (!(sd = evas_object_smart_data_get(entry)))) + return 1; + if (!sd->focused) + return 1; + + editable = sd->editable_object; + cursor_pos = e_editable_cursor_pos_get(editable); + selection_pos = e_editable_selection_pos_get(editable); + start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; + end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; + selecting = (start_pos != end_pos); + + ev = event; + if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) || + (ev->selection == ECORE_X_SELECTION_PRIMARY)) + { + if (strcmp(ev->target, ECORE_X_SELECTION_TARGET_UTF8_STRING) == 0) + { + Ecore_X_Selection_Data_Text *text_data; + + text_data = ev->data; + if (selecting && !_e_entry_emacs_keybindings) + changed |= e_editable_delete(editable, start_pos, end_pos); + changed |= e_editable_insert(editable, start_pos, text_data->text); + } + } + + if (changed) + evas_object_smart_callback_call(entry, "changed", NULL); + + return 1; +} + +/* Updates the X selection with the selected text of the entry */ +static void +_e_entry_x_selection_update(Evas_Object *entry) +{ + E_Entry_Smart_Data *sd; + Evas_Object *editable; + E_Win *win; + int cursor_pos, selection_pos; + int start_pos, end_pos; + int selecting; + char *text; + + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) + return; + if (!(win = e_win_evas_object_win_get(entry))) + return; + + editable = sd->editable_object; + cursor_pos = e_editable_cursor_pos_get(editable); + selection_pos = e_editable_selection_pos_get(editable); + start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; + end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; + selecting = (start_pos != end_pos); + + if ((!selecting) || + (!(text = e_editable_text_range_get(editable, start_pos, end_pos)))) + return; + + ecore_x_selection_primary_set(win->evas_win, text, strlen(text) + 1); + free(text); +} + +/* Treats the "key down" event to mimick the behavior of Windows/Gtk2/Qt */ +static void _e_entry_key_down_windows(Evas_Object *entry, Evas_Event_Key_Down *event) +{ E_Entry_Smart_Data *sd; Evas_Object *editable; - Evas_Event_Key_Down *event; int cursor_pos, selection_pos; int start_pos, end_pos; int selecting; @@ -288,9 +468,9 @@ char *range; E_Win *win; - if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return; - if (!(event = event_info) || !(event->keyname)) + if ((!event) || (!event->keyname)) return; editable = sd->editable_object; @@ -300,6 +480,7 @@ end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; selecting = (start_pos != end_pos); + /* Move the cursor/selection to the left */ if (strcmp(event->key, "Left") == 0) { @@ -364,7 +545,7 @@ else selection_changed = 1; } - /* Remove the previous character */ + /* Delete the previous character */ else if ((sd->enabled) && (strcmp(event->keyname, "BackSpace") == 0)) { if (selecting) @@ -372,7 +553,7 @@ else changed = e_editable_delete(editable, cursor_pos - 1, cursor_pos); } - /* Remove the next character */ + /* Delete the next character */ else if ((sd->enabled) && (strcmp(event->keyname, "Delete") == 0)) { if (selecting) @@ -396,7 +577,7 @@ range = e_editable_text_range_get(editable, start_pos, end_pos); if (range) { - if ((win = e_win_evas_object_win_get(obj))) + if ((win = e_win_evas_object_win_get(entry))) ecore_x_selection_clipboard_set(win->evas_win, range, strlen(range) + 1); @@ -408,7 +589,7 @@ } else if ((sd->enabled) && (strcmp(event->keyname, "v") == 0)) { - if ((win = e_win_evas_object_win_get(obj))) + if ((win = e_win_evas_object_win_get(entry))) ecore_x_selection_clipboard_request(win->evas_win, ECORE_X_SELECTION_TARGET_UTF8_STRING); } @@ -418,120 +599,35 @@ ((strlen(event->string) != 1) || (event->string[0] >= 0x20))) { if (selecting) - changed = e_editable_delete(editable, start_pos, end_pos); + changed |= e_editable_delete(editable, start_pos, end_pos); changed |= e_editable_insert(editable, start_pos, event->string); } + if (changed) - evas_object_smart_callback_call(obj, "changed", NULL); + evas_object_smart_callback_call(entry, "changed", NULL); if (selection_changed) - _e_entry_x_selection_update(obj); + _e_entry_x_selection_update(entry); } -/* Called when the entry object is pressed by the mouse */ -static void -_e_entry_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +/* Treats the "key down" event to mimick the behavior of Emacs */ +static void _e_entry_key_down_emacs(Evas_Object *entry, Evas_Event_Key_Down *event) { E_Entry_Smart_Data *sd; - Evas_Event_Mouse_Down *event; - Evas_Coord ox, oy; - int pos; - - if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) - return; - if (!(event = event_info)) - return; - - evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); - pos = e_editable_pos_get_from_coords(sd->editable_object, - event->canvas.x - ox, - event->canvas.y - oy); - - if (event->button == 1) - { - if (event->flags & EVAS_BUTTON_DOUBLE_CLICK) - e_editable_select_all(sd->editable_object); - else - { - e_editable_cursor_pos_set(sd->editable_object, pos); - if (!evas_key_modifier_is_set(event->modifiers, "Shift")) - e_editable_selection_pos_set(sd->editable_object, pos); - - sd->selection_dragging = 1; - } - } - else if (event->button == 2) - { - E_Win *win; - - e_editable_cursor_pos_set(sd->editable_object, pos); - e_editable_selection_pos_set(sd->editable_object, pos); - - if ((win = e_win_evas_object_win_get(obj))) - ecore_x_selection_primary_request(win->evas_win, - ECORE_X_SELECTION_TARGET_UTF8_STRING); - } -} - -/* Called when the entry object is released by the mouse */ -static void -_e_entry_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - E_Entry_Smart_Data *sd; - - if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) - return; - - if (sd->selection_dragging) - { - sd->selection_dragging = 0; - _e_entry_x_selection_update(obj); - } -} - -/* Called when the mouse moves over the entry object */ -static void -_e_entry_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - E_Entry_Smart_Data *sd; - Evas_Event_Mouse_Move *event; - Evas_Coord ox, oy; - int pos; - - if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) - return; - if (!(event = event_info)) - return; - - if (sd->selection_dragging) - { - evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); - pos = e_editable_pos_get_from_coords(sd->editable_object, - event->cur.canvas.x - ox, - event->cur.canvas.y - oy); - e_editable_cursor_pos_set(sd->editable_object, pos); - } -} - -/* Called when the the "selection_notify" event is emitted */ -static int -_e_entry_x_selection_notify_handler(void *data, int type, void *event) -{ - Evas_Object *entry; - E_Entry_Smart_Data *sd; - Ecore_X_Event_Selection_Notify *ev; - Ecore_X_Selection_Data *selection_data; Evas_Object *editable; int cursor_pos, selection_pos; int start_pos, end_pos; int selecting; int changed = 0; + int selection_changed = 0; + char *range; + E_Win *win; - if ((!(entry = data)) || (!(sd = evas_object_smart_data_get(entry)))) - return 1; - if (!sd->focused) - return 1; - + if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) + return; + if ((!event) || (!event->keyname)) + return; + editable = sd->editable_object; cursor_pos = e_editable_cursor_pos_get(editable); selection_pos = e_editable_selection_pos_get(editable); @@ -539,57 +635,124 @@ end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; selecting = (start_pos != end_pos); - ev = event; - if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) || - (ev->selection == ECORE_X_SELECTION_PRIMARY)) + + /* Move the cursor/selection to the left */ + if ((strcmp(event->key, "Left") == 0) || + ((evas_key_modifier_is_set(event->modifiers, "Control")) && + (strcmp(event->key, "b") == 0))) { - if (strcmp(ev->target, ECORE_X_SELECTION_TARGET_UTF8_STRING) == 0) + e_editable_cursor_move_left(editable); + if (sd->selection_mode) + selection_changed = 1; + else + e_editable_selection_pos_set(editable, + e_editable_cursor_pos_get(editable)); + } + /* Move the cursor/selection to the right */ + else if ((strcmp(event->key, "Right") == 0) || + ((evas_key_modifier_is_set(event->modifiers, "Control")) && + (strcmp(event->key, "f") == 0))) + { + e_editable_cursor_move_right(editable); + if (sd->selection_mode) + selection_changed = 1; + else + e_editable_selection_pos_set(editable, + e_editable_cursor_pos_get(editable)); + } + /* Move the cursor/selection to the start of the entry */ + else if ((strcmp(event->keyname, "Home") == 0) || + ((evas_key_modifier_is_set(event->modifiers, "Control")) && + (strcmp(event->key, "a") == 0))) + { + e_editable_cursor_move_to_start(editable); + if (sd->selection_mode) + selection_changed = 1; + else + e_editable_selection_pos_set(editable, + e_editable_cursor_pos_get(editable)); + } + /* Move the cursor/selection to the end of the entry */ + else if ((strcmp(event->keyname, "End") == 0) || + ((evas_key_modifier_is_set(event->modifiers, "Control")) && + (strcmp(event->key, "e") == 0))) + { + e_editable_cursor_move_to_end(editable); + if (sd->selection_mode) + selection_changed = 1; + else + e_editable_selection_pos_set(editable, + e_editable_cursor_pos_get(editable)); + } + /* Delete the previous character */ + else if ((sd->enabled) && (strcmp(event->keyname, "BackSpace") == 0)) + changed = e_editable_delete(editable, cursor_pos - 1, cursor_pos); + /* Delete the next character */ + else if ((sd->enabled) && + ((evas_key_modifier_is_set(event->modifiers, "Control")) && + (strcmp(event->key, "d") == 0))) + changed = e_editable_delete(editable, cursor_pos, cursor_pos + 1); + /* Delete until end of line */ + else if ((sd->enabled) && + ((evas_key_modifier_is_set(event->modifiers, "Control")) && + (strcmp(event->key, "k") == 0))) + changed = e_editable_delete(editable, cursor_pos, + e_editable_text_length_get(editable)); + /* Toggle the selection mode */ + else if ((evas_key_modifier_is_set(event->modifiers, "Control")) && + (strcmp(event->key, "space") == 0)) + { + if (sd->selection_mode) { - Ecore_X_Selection_Data_Text *text_data; - - text_data = ev->data; - if (selecting) - changed = e_editable_delete(editable, start_pos, end_pos); - changed |= e_editable_insert(editable, start_pos, text_data->text); + e_editable_selection_pos_set(editable, cursor_pos); + sd->selection_mode = 0; } + else + sd->selection_mode = 1; } + /* Cut/Copy */ + else if ((evas_key_modifier_is_set(event->modifiers, "Control") || + evas_key_modifier_is_set(event->modifiers, "Shift")) && + (strcmp(event->key, "w") == 0)) + { + if (selecting) + { + range = e_editable_text_range_get(editable, start_pos, end_pos); + if (range) + { + if ((win = e_win_evas_object_win_get(entry))) + ecore_x_selection_clipboard_set(win->evas_win, + range, + strlen(range) + 1); + free(range); + } + if ((sd->enabled) && (evas_key_modifier_is_set(event->modifiers, "Control"))) + { + changed = e_editable_delete(editable, start_pos, end_pos); + sd->selection_mode = 0; + } + } + } + /* Paste */ + else if ((sd->enabled) && + ((evas_key_modifier_is_set(event->modifiers, "Control")) && + (strcmp(event->key, "y") == 0))) + { + if ((win = e_win_evas_object_win_get(entry))) + ecore_x_selection_clipboard_request(win->evas_win, + ECORE_X_SELECTION_TARGET_UTF8_STRING); + } + /* Otherwise, we insert the corresponding character */ + else if ((event->string) && + ((strlen(event->string) != 1) || + (event->string[0] >= 0x20 && event->string[0] != 0x7f))) + changed = e_editable_insert(editable, cursor_pos, event->string); + if (changed) evas_object_smart_callback_call(entry, "changed", NULL); - - return 1; -} - -/* Updates the X selection with the selected text of the entry */ -static void -_e_entry_x_selection_update(Evas_Object *entry) -{ - E_Entry_Smart_Data *sd; - Evas_Object *editable; - E_Win *win; - int cursor_pos, selection_pos; - int start_pos, end_pos; - int selecting; - char *text; - - if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) - return; - if (!(win = e_win_evas_object_win_get(entry))) - return; - - editable = sd->editable_object; - cursor_pos = e_editable_cursor_pos_get(editable); - selection_pos = e_editable_selection_pos_get(editable); - start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; - end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; - selecting = (start_pos != end_pos); - - if ((!selecting) || - (!(text = e_editable_text_range_get(editable, start_pos, end_pos)))) - return; - - ecore_x_selection_primary_set(win->evas_win, text, strlen(text) + 1); - free(text); + if (selection_changed) + _e_entry_x_selection_update(entry); } /* Editable object's smart methods */ @@ -613,6 +776,7 @@ sd->enabled = 1; sd->focused = 0; sd->selection_dragging = 0; + sd->selection_mode = 0; sd->valign = 0.5; o = edje_object_add(evas); |
From: Enlightenment C. <no...@cv...> - 2006-08-30 20:44:20
|
Enlightenment CVS committal Author : moom Project : e17 Module : apps/e Dir : e17/apps/e/src/bin Modified Files: e_editable.c Log Message: * [Entry] It should fix e_widget_entry_clear() =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- e_editable.c 23 Aug 2006 10:14:17 -0000 1.12 +++ e_editable.c 30 Aug 2006 20:44:10 -0000 1.13 @@ -222,6 +222,8 @@ sd->unicode_length = 0; sd->allocated_length = E_EDITABLE_BLOCK_SIZE; } + else + _e_editable_text_update(editable); sd->cursor_pos = sd->unicode_length; sd->selection_pos = sd->unicode_length; |