diff --git a/legacy/elementary/configure.in b/legacy/elementary/configure.in index afb183d809..e903e5a84b 100644 --- a/legacy/elementary/configure.in +++ b/legacy/elementary/configure.in @@ -31,6 +31,7 @@ AC_SUBST(version_info) PKG_PROG_PKG_CONFIG PKG_CHECK_MODULES([ELEMENTARY], [ + eina eet evas ecore diff --git a/legacy/elementary/data/themes/default.edc b/legacy/elementary/data/themes/default.edc index 40f0c9091b..a919887c21 100644 --- a/legacy/elementary/data/themes/default.edc +++ b/legacy/elementary/data/themes/default.edc @@ -2688,6 +2688,35 @@ collections { source4: "elm/entry/cursor/default"; // cursorover source5: "elm/entry/anchor/default"; // anchor under // source6: "X"; // anchor over + description { state: "default" 0.0; + text { + style: "entry_textblock_style"; + min: 0 1; + } + } + } + } + programs { + program { name: "focus"; + signal: "load"; + source: ""; + action: FOCUS_SET; + target: "elm.text"; + } + } + } + + group { name: "elm/entry/base-nowrap/default"; + parts { + part { name: "elm.text"; + type: TEXTBLOCK; + mouse_events: 1; + scale: 1; + entry_mode: EDITABLE; + multiline: 1; + source: "elm/entry/selection/default"; // selection under + source4: "elm/entry/cursor/default"; // cursorover + source5: "elm/entry/anchor/default"; // anchor under description { state: "default" 0.0; text { style: "entry_textblock_style"; diff --git a/legacy/elementary/src/bin/test.c b/legacy/elementary/src/bin/test.c index 64e903f28d..bbb7a04ca3 100644 --- a/legacy/elementary/src/bin/test.c +++ b/legacy/elementary/src/bin/test.c @@ -1,10 +1,5 @@ #include -// FIXME: add more explicit tests for: -// labels -// frames -// scroller - static void my_win_del(void *data, Evas_Object *obj, void *event_info); static void my_bt_1(void *data, Evas_Object *obj, void *event_info); static void my_win_main(void); @@ -682,6 +677,7 @@ my_bt_13(void *data, Evas_Object *obj, void *event_info) evas_object_show(bx); en = elm_entry_add(win); + elm_entry_line_wrap_set(en, 0); elm_entry_entry_set(en, "This is an entry widget in this window that
" "uses markup like this for styling and
" @@ -741,6 +737,96 @@ my_bt_13(void *data, Evas_Object *obj, void *event_info) evas_object_show(win); } +static void +my_bt_14(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *win, *bg, *bx, *bx2, *bt, *en, *sc; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "entry-scrolled", ELM_WIN_BASIC); + elm_win_title_set(win, "Entry Scrolled"); + elm_win_autodel_set(win, 1); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, 1.0, 1.0); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, 1.0, 1.0); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, 1.0, 1.0); + evas_object_size_hint_align_set(sc, -1.0, -1.0); + elm_box_pack_end(bx, sc); + + en = elm_entry_add(win); + evas_object_propagate_events_set(en, 0); + elm_entry_entry_set(en, + "This is an entry widget in this window that
" + "uses markup like this for styling and
" + "formatting like this, as well as
" + "links in the text, so enter text
" + "in here to edit it. By the way, links are
" + "called Anchors so you will need
" + "to refer to them this way. At the end here is a really long line to test line wrapping to see if it works. But just in case this line is not long enough I will add more here to really test it out, as Elementary really needs some good testing to see if entry widgets work as advertised."); + evas_object_size_hint_weight_set(en, 1.0, 0.0); + evas_object_size_hint_align_set(en, -1.0, -1.0); + elm_scroller_content_set(sc, en); + evas_object_show(en); + + evas_object_show(sc); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, 1); + evas_object_size_hint_weight_set(bx2, 1.0, 0.0); + evas_object_size_hint_align_set(bx2, -1.0, -1.0); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Clear"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_1, en); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + evas_object_size_hint_weight_set(bt, 1.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Print"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_2, en); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + evas_object_size_hint_weight_set(bt, 1.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Selection"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_3, en); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + evas_object_size_hint_weight_set(bt, 1.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Insert"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_4, en); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + evas_object_size_hint_weight_set(bt, 1.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + // HACK! not exposed! (should expose some later?) + elm_widget_focus_set(en, 1); + + evas_object_resize(win, 320, 300); + + evas_object_show(win); +} + static void my_win_main(void) { @@ -925,8 +1011,15 @@ my_win_main(void) elm_box_pack_end(bx, bt); evas_object_show(bt); + bt = elm_button_add(win); + elm_button_label_set(bt, "Entry Scrolled"); + evas_object_smart_callback_add(bt, "clicked", my_bt_14, NULL); + evas_object_size_hint_align_set(bt, -1.0, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + /* set an initial window size */ - evas_object_resize(win, 320, 320); + evas_object_resize(win, 320, 520); /* show the window */ evas_object_show(win); } diff --git a/legacy/elementary/src/lib/Elementary.h b/legacy/elementary/src/lib/Elementary.h index bc029c475f..f44bacb052 100644 --- a/legacy/elementary/src/lib/Elementary.h +++ b/legacy/elementary/src/lib/Elementary.h @@ -46,6 +46,8 @@ #endif /* EFL headers */ +#include +#include #include #include #include @@ -53,7 +55,6 @@ #include #include #include -#include #include /* allow usage from c++ */ @@ -185,6 +186,7 @@ extern "C" { EAPI const char *elm_entry_entry_get(Evas_Object *obj); EAPI const char *elm_entry_selection_get(Evas_Object *obj); EAPI void elm_entry_entry_insert(Evas_Object *obj, const char *entry); + EAPI void elm_entry_line_wrap_set(Evas_Object *obj, Evas_Bool wrap); /* smart callbacks called: */ diff --git a/legacy/elementary/src/lib/elm_entry.c b/legacy/elementary/src/lib/elm_entry.c index 871d4b704d..cb7d692d84 100644 --- a/legacy/elementary/src/lib/elm_entry.c +++ b/legacy/elementary/src/lib/elm_entry.c @@ -6,11 +6,13 @@ typedef struct _Widget_Data Widget_Data; struct _Widget_Data { Evas_Object *ent; + Evas_Bool linewrap; }; static void _del_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); static void _on_focus_hook(void *data, Evas_Object *obj); +static void _resize(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _signal_entry_changed(void *data, Evas_Object *obj, const char *emission, const char *source); static void _signal_selection_start(void *data, Evas_Object *obj, const char *emission, const char *source); static void _signal_selection_changed(void *data, Evas_Object *obj, const char *emission, const char *source); @@ -32,10 +34,25 @@ _sizing_eval(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; - - edje_object_size_min_calc(wd->ent, &minw, &minh); - evas_object_size_hint_min_set(obj, minw, minh); - evas_object_size_hint_max_set(obj, maxw, maxh); + Evas_Coord resw, resh, minminw; + + if (wd->linewrap) + { + evas_object_geometry_get(wd->ent, NULL, NULL, &resw, &resh); + resh = 0; + minminw = 0; + edje_object_size_min_restricted_calc(wd->ent, &minw, &minh, 0, 0); + minminw = minw; + edje_object_size_min_restricted_calc(wd->ent, &minw, &minh, resw, 0); + evas_object_size_hint_min_set(obj, minminw, minh); + evas_object_size_hint_max_set(obj, minminw, maxh); + } + else + { + edje_object_size_min_calc(wd->ent, &minw, &minh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, maxw, maxh); + } } static void @@ -45,6 +62,13 @@ _on_focus_hook(void *data, Evas_Object *obj) evas_object_focus_set(wd->ent, 1); } +static void +_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(data); + if (wd->linewrap) _sizing_eval(data); +} + static void _signal_entry_changed(void *data, Evas_Object *obj, const char *emission, const char *source) { @@ -111,6 +135,7 @@ _signal_cursor_changed(void *data, Evas_Object *obj, const char *emission, const // jump so it is) edje_object_part_text_cursor_geometry_get(wd->ent, "elm.text", &cx, &cy, &cw, &ch); printf("CURSOR: @%i+%i %ix%i\n", cx, cy, cw, ch); + elm_widget_show_region_set(data, cx, cy, cw, ch); } static void @@ -162,8 +187,12 @@ elm_entry_add(Evas_Object *parent) elm_widget_data_set(obj, wd); elm_widget_del_hook_set(obj, _del_hook); elm_widget_can_focus_set(obj, 1); + + wd->linewrap = 1; wd->ent = edje_object_add(e); + evas_object_event_callback_add(wd->ent, EVAS_CALLBACK_RESIZE, _resize, obj); + _elm_theme_set(wd->ent, "entry", "base", "default"); edje_object_signal_callback_add(wd->ent, "entry,changed", "elm.text", _signal_entry_changed, obj); edje_object_signal_callback_add(wd->ent, "selection,start", "elm.text", _signal_selection_start, obj); @@ -220,3 +249,18 @@ elm_entry_entry_insert(Evas_Object *obj, const char *entry) _sizing_eval(obj); } +EAPI void +elm_entry_line_wrap_set(Evas_Object *obj, Evas_Bool wrap) +{ + Widget_Data *wd = elm_widget_data_get(obj); + char *t; + if (wd->linewrap == wrap) return; + wd->linewrap = wrap; + t = elm_entry_entry_get(obj); + if (t) t = strdup(t); + if (wd->linewrap) _elm_theme_set(wd->ent, "entry", "base", "default"); + else _elm_theme_set(wd->ent, "entry", "base-nowrap", "default"); + elm_entry_entry_set(obj, t); + if (t) free(t); + _sizing_eval(obj); +} diff --git a/legacy/elementary/src/lib/elm_priv.h b/legacy/elementary/src/lib/elm_priv.h index cc023ef2ac..c492ade596 100644 --- a/legacy/elementary/src/lib/elm_priv.h +++ b/legacy/elementary/src/lib/elm_priv.h @@ -47,6 +47,7 @@ EAPI void elm_widget_activate_hook_set(Evas_Object *obj, void (*func) (E EAPI void elm_widget_disable_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); EAPI void elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); EAPI void elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); +EAPI void elm_widget_on_show_region_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); EAPI void elm_widget_data_set(Evas_Object *obj, void *data); EAPI void *elm_widget_data_get(Evas_Object *obj); EAPI void elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj); @@ -66,7 +67,10 @@ EAPI void elm_widget_activate(Evas_Object *obj); EAPI void elm_widget_change(Evas_Object *obj); EAPI void elm_widget_disabled_set(Evas_Object *obj, int disabled); EAPI int elm_widget_disabled_get(Evas_Object *obj); - +EAPI void elm_widget_show_region_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); +EAPI void elm_widget_show_region_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); + + extern char *_elm_appname; extern Elm_Config *_elm_config; diff --git a/legacy/elementary/src/lib/elm_scroller.c b/legacy/elementary/src/lib/elm_scroller.c index b06b0e1af1..39e24fd68b 100644 --- a/legacy/elementary/src/lib/elm_scroller.c +++ b/legacy/elementary/src/lib/elm_scroller.c @@ -10,6 +10,7 @@ struct _Widget_Data }; static void _del_hook(Evas_Object *obj); +static void _show_region_hook(void *data, Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); static void _sub_del(void *data, Evas_Object *obj, void *event_info); @@ -20,6 +21,15 @@ _del_hook(Evas_Object *obj) free(wd); } +static void +_show_region_hook(void *data, Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(data); + Evas_Coord x, y, w, h; + elm_widget_show_region_get(obj, &x, &y, &w, &h); + elm_smart_scroller_child_region_show(wd->scr, x, y, w, h); +} + static void _sizing_eval(Evas_Object *obj) { @@ -59,6 +69,7 @@ _sub_del(void *data, Evas_Object *obj, void *event_info) Evas_Object *sub = event_info; if (sub == wd->content) { + elm_widget_on_show_region_hook_set(wd->content, NULL, NULL); evas_object_event_callback_del (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints); wd->content = NULL; @@ -108,6 +119,7 @@ elm_scroller_content_set(Evas_Object *obj, Evas_Object *content) wd->content = content; if (content) { + elm_widget_on_show_region_hook_set(content, _show_region_hook, obj); elm_widget_sub_object_add(obj, content); elm_smart_scroller_child_set(wd->scr, content); evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, diff --git a/legacy/elementary/src/lib/elm_widget.c b/legacy/elementary/src/lib/elm_widget.c index 4c423f2d12..abc6799fd2 100644 --- a/legacy/elementary/src/lib/elm_widget.c +++ b/legacy/elementary/src/lib/elm_widget.c @@ -21,7 +21,10 @@ struct _Smart_Data void *on_focus_data; void (*on_change_func) (void *data, Evas_Object *obj); void *on_change_data; + void (*on_show_region_func) (void *data, Evas_Object *obj); + void *on_show_region_data; void *data; + Evas_Coord rx, ry, rw, rh; unsigned char can_focus : 1; unsigned char child_can_focus : 1; unsigned char focused : 1; @@ -105,6 +108,14 @@ elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_O sd->on_change_data = data; } +EAPI void +elm_widget_on_show_region_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data) +{ + API_ENTRY return; + sd->on_show_region_func = func; + sd->on_show_region_data = data; +} + EAPI void elm_widget_data_set(Evas_Object *obj, void *data) { @@ -464,6 +475,28 @@ elm_widget_disabled_get(Evas_Object *obj) return sd->disabled; } +EAPI void +elm_widget_show_region_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + API_ENTRY return; + if ((x == sd->rx) && (y == sd->ry) && (w == sd->rw) && (h == sd->rh)) return; + sd->rx = x; + sd->ry = y; + sd->rw = w; + sd->rh = h; + if (sd->on_show_region_func) sd->on_show_region_func(sd->on_show_region_data, obj); +} + +EAPI void +elm_widget_show_region_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) +{ + API_ENTRY return; + if (x) *x = sd->rx; + if (y) *y = sd->ry; + if (w) *w = sd->rw; + if (h) *h = sd->rh; +} + /* local subsystem functions */ static void _smart_reconfigure(Smart_Data *sd) diff --git a/legacy/elementary/src/lib/els_scroller.c b/legacy/elementary/src/lib/els_scroller.c index f7cafcc2c6..e298ab76fc 100644 --- a/legacy/elementary/src/lib/els_scroller.c +++ b/legacy/elementary/src/lib/els_scroller.c @@ -230,7 +230,7 @@ void elm_smart_scroller_child_region_show(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) { Evas_Coord mx = 0, my = 0, cw = 0, ch = 0, px = 0, py = 0, nx, ny; - + API_ENTRY return; sd->pan_func.max_get(sd->pan_obj, &mx, &my); sd->pan_func.child_size_get(sd->pan_obj, &cw, &ch);