Ui text: use 'wrap' and 'multiline' properties
authorDaniel Hirt <hirt.danny@gmail.com>
Tue, 23 May 2017 13:04:04 +0000 (16:04 +0300)
committerDaniel Hirt <hirt.danny@gmail.com>
Sun, 28 May 2017 12:34:26 +0000 (15:34 +0300)
src/bin/elementary/test_efl_ui_text.c
src/lib/elementary/efl_ui_internal_text_interactive.c
src/lib/elementary/efl_ui_internal_text_interactive.eo
src/lib/elementary/efl_ui_text.c
src/lib/elementary/efl_ui_text_interactive.eo

index a8e05b9..15c4a2b 100644 (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);
-
-   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]);
-
+   Eo *text_obj = data;
+
+   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);
index b5ef29b..0281353 100644 (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);
      }
@@ -1411,18 +1412,6 @@ _efl_ui_internal_text_interactive_efl_ui_text_interactive_selection_cursors_get(
 }
 
 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)
 {
    sd->editable = editable;
index a79cc70..034576f 100644 (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; }
    }
 }
index df169d5..4c2274e 100644 (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);
 }
index 19873e4..de0017e 100644 (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.