Ui text: use 'wrap' and 'multiline' properties

This commit is contained in:
Daniel Hirt 2017-05-23 16:04:04 +03:00
parent 9289e082d8
commit e55b91aa91
5 changed files with 77 additions and 108 deletions

View File

@ -115,22 +115,31 @@ my_efl_ui_text_bt_4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info E
"size=32x32 href=emoticon");
}
const char *_wrap_modes[4] = { "none", "char", "word", "mixed" };
static void
my_efl_ui_text_bt_6(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
char style[128];
Evas_Object *en = data;
size_t idx = (size_t) efl_key_data_get(en, "wrap_idx");
idx = (idx + 1) % 4;
efl_key_data_set(en, "wrap_idx", (void *)idx);
Eo *text_obj = data;
sprintf(style, "DEFAULT='font=Sans font_size=12 color=#fff wrap=%s'",
_wrap_modes[idx]);
efl_canvas_text_style_set(en, NULL, style);
printf("wrap mode changed to '%s'\n", _wrap_modes[idx]);
Efl_Text_Format_Wrap wrap = efl_text_format_wrap_get(text_obj);
switch(wrap)
{
case EFL_TEXT_FORMAT_WRAP_NONE:
wrap = EFL_TEXT_FORMAT_WRAP_CHAR;
break;
case EFL_TEXT_FORMAT_WRAP_CHAR:
wrap = EFL_TEXT_FORMAT_WRAP_WORD;
break;
case EFL_TEXT_FORMAT_WRAP_WORD:
wrap = EFL_TEXT_FORMAT_WRAP_MIXED;
break;
case EFL_TEXT_FORMAT_WRAP_MIXED:
wrap = EFL_TEXT_FORMAT_WRAP_NONE;
break;
default:
break;
}
efl_text_format_wrap_set(text_obj, wrap);
}
static void
@ -154,7 +163,8 @@ test_efl_ui_text(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *eve
elm_win_resize_object_add(win, bx);
evas_object_show(bx);
en = efl_add(EFL_UI_TEXT_CLASS, win);
en = efl_add(EFL_UI_TEXT_CLASS, win,
efl_text_format_multiline_set(efl_added, EINA_TRUE));
printf("Added Efl.Ui.Text object\n");
efl_key_data_set(en, "wrap_idx", 0);

View File

@ -16,7 +16,6 @@ typedef struct _Efl_Ui_Internal_Text_Interactive_Data
Evas_Textblock_Cursor *preedit_start, *preedit_end;
Eina_List *seq;
char *selection;
Eina_Bool multiline : 1;
Eina_Bool composing : 1;
Eina_Bool selecting : 1;
Eina_Bool have_selection : 1;
@ -730,7 +729,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void
super = evas_key_modifier_is_set(ev->modifiers, "Super");
altgr = evas_key_modifier_is_set(ev->modifiers, "AltGr");
#endif
multiline = en->multiline;
multiline = efl_text_format_multiline_get(obj);
/* Translate some keys to strings. */
if (!strcmp(ev->key, "Tab"))
@ -1253,6 +1252,9 @@ _mouse_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, vo
Evas_Event_Mouse_Move *ev = event_info;
Evas_Coord x, y, w, h;
Evas_Textblock_Cursor *tc;
Eina_Bool multiline;
multiline = efl_text_format_multiline_get(obj);
#ifdef HAVE_ECORE_IMF
if (en->imf_context)
@ -1274,7 +1276,7 @@ _mouse_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, vo
cx = ev->cur.canvas.x - x;
cy = ev->cur.canvas.y - y;
if (en->multiline)
if (multiline)
{
efl_canvas_text_cursor_coord_set(cur, cx, cy);
}
@ -1301,7 +1303,6 @@ EOLIAN static Efl_Object *
_efl_ui_internal_text_interactive_efl_object_constructor(Eo *obj, Efl_Ui_Internal_Text_Interactive_Data *en)
{
en->select_allow = EINA_TRUE;
en->multiline = EINA_TRUE;
en->editable = EINA_TRUE;
return efl_constructor(efl_super(obj, MY_CLASS));
}
@ -1381,7 +1382,7 @@ _efl_ui_internal_text_interactive_efl_object_finalize(Eo *obj, Efl_Ui_Internal_T
ecore_imf_context_input_panel_language_set(en->imf_context, ECORE_IMF_INPUT_PANEL_LANG_ALPHABET);
#endif
if (en->multiline)
if (efl_text_format_multiline_get(obj))
ecore_imf_context_input_hint_set(en->imf_context,
ecore_imf_context_input_hint_get(en->imf_context) | ECORE_IMF_INPUT_HINT_MULTILINE);
}
@ -1410,18 +1411,6 @@ _efl_ui_internal_text_interactive_efl_ui_text_interactive_selection_cursors_get(
if (end) *end = pd->sel_end;
}
EOLIAN static void
_efl_ui_internal_text_interactive_efl_ui_text_interactive_multiline_set(Eo *obj EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *pd, Eina_Bool enabled)
{
pd->multiline = enabled;
}
EOLIAN static Eina_Bool
_efl_ui_internal_text_interactive_efl_ui_text_interactive_multiline_get(Eo *obj EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *pd)
{
return pd->multiline;
}
EOLIAN static void
_efl_ui_internal_text_interactive_efl_ui_text_interactive_editable_set(Eo *obj EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *sd, Eina_Bool editable)
{

View File

@ -9,7 +9,6 @@ class Efl.Ui.Internal.Text.Interactive (Efl.Canvas.Text, Efl.Ui.Text.Interactive
Efl.Object.finalize;
Efl.Ui.Text.Interactive.selection_allowed { get; set; }
Efl.Ui.Text.Interactive.selection_cursors { get; }
Efl.Ui.Text.Interactive.multiline { get; set; }
Efl.Ui.Text.Interactive.editable { get; set; }
}
}

View File

@ -56,7 +56,7 @@ struct _Efl_Ui_Text_Data
const char *text;
const char *file;
Elm_Text_Format format;
Evas_Coord last_w, ent_mw, ent_mh;
Evas_Coord ent_w, ent_h;
Evas_Coord downx, downy;
Evas_Coord ox, oy;
Eina_List *anchors;
@ -1070,91 +1070,60 @@ EOLIAN static void
_efl_ui_text_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Text_Data *sd)
{
Evas_Coord minw, minh, resw, resh;
Evas_Coord fw, fh;
Eo *sw;
Eina_Bool wrap;
evas_object_geometry_get(obj, NULL, NULL, &resw, &resh);
if (!sd->changed && (sd->last_w == resw))
{
if (sd->scroll)
{
if (sd->text_obj)
{
Evas_Coord vw = 0, vh = 0, h = 0;
sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text");
if (!sw) return;
// Called for line wrapping + scrolling; use the viewport
// width and the formatted height as proper constraints.
elm_interface_scrollable_content_viewport_geometry_get
(obj, NULL, NULL, &vw, &vh);
wrap = efl_text_format_wrap_get(sw);
efl_canvas_text_size_formatted_get(sd->text_obj, NULL, &h);
if (vh > h) h = vh;
if (!sd->changed && (resw == sd->ent_w) && (resh == sd->ent_h)) return;
sd->changed = EINA_FALSE;
sd->ent_w = resw;
sd->ent_h = resh;
evas_object_resize(sd->entry_edje, vw, h);
}
}
return;
}
evas_event_freeze(evas_object_evas_get(obj));
sd->changed = EINA_FALSE;
sd->last_w = resw;
if (sd->scroll)
{
Evas_Coord vw = 0, vh = 0, vmw = 0, vmh = 0, w = -1, h = -1;
Evas_Coord vw, vh;
Evas_Coord tw, th;
elm_interface_scrollable_content_viewport_geometry_get(obj, NULL, NULL, &vw, &vh);
efl_gfx_size_set(sd->entry_edje, vw, vh);
efl_gfx_size_get(sw, &tw, &th);
efl_canvas_text_size_formatted_get(sw, &fw, &fh);
evas_object_size_hint_min_set(sw, fw, fh);
edje_object_size_min_calc(sd->entry_edje, &minw, &minh);
evas_object_size_hint_min_set(sw, -1, -1);
// XXX: no need for the following line. It's been commented out.
// sd->scr_edje is the resize_object of this widget. It's already
// resized when gfx_size_set was called on this widget.
//evas_object_resize(sd->scr_edje, resw, resh);
if (vw > minw) minw = vw;
efl_gfx_size_set(sd->entry_edje, minw, minh);
edje_object_size_min_calc(sd->scr_edje, &vmw, &vmh);
elm_interface_scrollable_content_viewport_geometry_get
(obj, NULL, NULL, &vw, &vh);
edje_object_size_min_restricted_calc
(sd->entry_edje, &minw, &minh, vw, 0);
elm_coords_finger_size_adjust(1, &minw, 1, &minh);
/* This is a hack to workaround the way min size hints
* are treated. If the minimum width is smaller than the
* restricted width, it means the minimum doesn't
* matter. */
if (minw <= vw)
if (!efl_text_format_multiline_get(sw))
{
Evas_Coord ominw = -1;
efl_gfx_size_hint_combined_min_get(sd->entry_edje, &ominw, NULL);
minw = ominw;
evas_object_size_hint_min_set(obj, -1, minh);
}
sd->ent_mw = minw;
sd->ent_mh = minh;
if ((minw > 0) && (vw < minw)) vw = minw;
if (minh > vh) vh = minh;
if (sd->single_line) h = vmh + minh;
else h = vmh;
evas_object_resize(sd->entry_edje, vw, vh);
evas_object_size_hint_min_set(obj, w, h);
if (sd->single_line)
evas_object_size_hint_max_set(obj, -1, h);
else
evas_object_size_hint_max_set(obj, -1, -1);
}
else
{
Evas_Coord ominw, ominh;
Eo *sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text");
efl_canvas_text_size_native_get(sw, &resw, &resh);
evas_object_size_hint_min_set(sw, resw, resh);
edje_object_size_min_calc(sd->entry_edje, &ominw, &ominh);
evas_object_size_hint_min_set(obj, ominw, ominh);
efl_canvas_text_size_formatted_get(sw, &fw, &fh);
evas_object_size_hint_min_set(sw, fw, fh);
edje_object_size_min_calc(sd->entry_edje, &minw, &minh);
evas_object_size_hint_min_set(sw, -1, -1);
if (wrap == EFL_TEXT_FORMAT_WRAP_NONE)
{
evas_object_size_hint_min_set(obj, minw, minh);
}
}
_cursor_geometry_recalc(obj);
evas_event_thaw(evas_object_evas_get(obj));
evas_event_thaw_eval(evas_object_evas_get(obj));
_cursor_geometry_recalc(obj);
}
static void
@ -2105,9 +2074,13 @@ _entry_changed_handle(void *data,
{
Evas_Coord minh;
const char *text;
Eina_Bool single_line;
Eo *obj = data;
EFL_UI_TEXT_DATA_GET(data, sd);
single_line = !efl_text_format_multiline_get(obj);
evas_event_freeze(evas_object_evas_get(data));
sd->changed = EINA_TRUE;
/* Reset the size hints which are no more relevant. Keep the
@ -2116,6 +2089,12 @@ _entry_changed_handle(void *data,
evas_object_size_hint_min_get(data, NULL, &minh);
evas_object_size_hint_min_set(data, -1, minh);
if (sd->single_line != single_line)
{
sd->single_line = single_line;
elm_obj_widget_theme_apply(data);
}
elm_layout_sizing_eval(data);
ELM_SAFE_FREE(sd->text, eina_stringshare_del);
ELM_SAFE_FREE(sd->delay_write, ecore_timer_del);
@ -3023,8 +3002,6 @@ _efl_ui_text_resize_internal(Evas_Object *obj)
elm_interface_scrollable_content_viewport_geometry_get
(obj, NULL, NULL, &vw, &vh);
if (vw < sd->ent_mw) vw = sd->ent_mw;
if (vh < sd->ent_mh) vh = sd->ent_mh;
evas_object_resize(sd->entry_edje, vw, vh);
}
@ -3272,6 +3249,8 @@ _efl_ui_text_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Text_Data *priv)
priv->editable = EINA_TRUE;
priv->sel_allow = EINA_TRUE;
priv->single_line = !efl_text_format_multiline_get(text_obj);
priv->drop_format = ELM_SEL_FORMAT_MARKUP | ELM_SEL_FORMAT_IMAGE;
elm_drop_target_add(obj, priv->drop_format,
_dnd_enter_cb, NULL,
@ -4050,7 +4029,6 @@ _efl_ui_text_scrollable_set(Eo *obj, Efl_Ui_Text_Data *sd, Eina_Bool scroll)
elm_widget_on_show_region_hook_set(obj, NULL, NULL);
}
sd->last_w = -1;
_update_decorations(obj);
elm_obj_widget_theme_apply(obj);
}

View File

@ -10,7 +10,8 @@ struct Efl.Ui.Text.Interactive.Change_Info {
merge: bool; [[$true if can be merged with the previous one. Used for example with insertion when something is already selected]]
}
interface Efl.Ui.Text.Interactive ()
interface Efl.Ui.Text.Interactive (Efl.Text, Efl.Text.Font,
Efl.Text.Format, Efl.Text.Style)
{
[[This is an interface interactive text inputs should implement]]
methods {
@ -37,14 +38,6 @@ interface Efl.Ui.Text.Interactive ()
end: Efl.Canvas.Text.Cursor; [[The end of the selection]]
}
}
@property multiline {
[[Whether or not this textblock is allowed to be multiline]]
set {}
get {}
values {
enabled: bool; [[$true if enabled, $false otherwise]]
}
}
@property editable {
[[Whether the entry is editable.