summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Hirt <daniel.hirt@samsung.com>2016-11-28 13:22:40 +0200
committerDaniel Hirt <daniel.hirt@samsung.com>2016-12-07 14:04:32 +0200
commitecbe0bd8c9a66f03adf3bdfba73506b9b6de86cb (patch)
tree923edf03e9a8716cdb3600843a9aec4247410c59
parent4ff330856d4cb1992b1cba2aa6a8c70e51dad276 (diff)
downloadefl-ecbe0bd8c9a66f03adf3bdfba73506b9b6de86cb.tar.gz
Ui text: implement scrolling with line wrap
-rw-r--r--src/lib/elementary/efl_ui_text.c79
1 files changed, 66 insertions, 13 deletions
diff --git a/src/lib/elementary/efl_ui_text.c b/src/lib/elementary/efl_ui_text.c
index 2cf59ab005..2410e8c03e 100644
--- a/src/lib/elementary/efl_ui_text.c
+++ b/src/lib/elementary/efl_ui_text.c
@@ -1062,25 +1062,78 @@ _cursor_geometry_recalc(Evas_Object *obj)
EOLIAN static void
_efl_ui_text_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Text_Data *sd)
{
- Evas_Coord vw = 0, vh = 0;
- Evas_Coord minw, minh;
- Eo *sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text");
+ Evas_Coord minw, minh, resw, resh;
+
+ evas_object_geometry_get(obj, NULL, NULL, &resw, &resh);
+
+
+ if (!sd->changed && (sd->last_w == resw))
+ {
+ if (sd->scroll)
+ {
+ Evas_Coord vw = 0, vh = 0, h = 0;
+
+ // 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);
+
+ efl_canvas_text_size_formatted_get(obj, NULL, &h);
+ if (vh > h) h = vh;
+
+ evas_object_resize(sd->entry_edje, vw, h);
+ }
+ return;
+ }
evas_event_freeze(evas_object_evas_get(obj));
- /* Only implement single-line */
- if (sd->scr_edje)
+ 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;
+
+ // 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);
+
+ edje_object_size_min_calc(sd->scr_edje, &vmw, &vmh);
elm_interface_scrollable_content_viewport_geometry_get
- (obj, NULL, NULL, &vw, &vh);
- //evas_object_geometry_get(sd->scr_edje, NULL, NULL, &resw, &resh);
- //evas_object_resize(sd->entry_edje, resw, resh);
- evas_object_resize(sw, vw, vh);
- efl_canvas_text_size_formatted_get(sw, &minw, &minh);
- evas_object_size_hint_min_set(sw, minw, vh);
- edje_object_size_min_restricted_calc(sd->entry_edje, &minw, &minh, vw, 0);
+ (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)
+ {
+ Evas_Coord ominw = -1;
+
+ efl_gfx_size_hint_combined_min_get(sd->entry_edje, &ominw, NULL);
+ minw = ominw;
+ }
+ sd->ent_mw = minw;
+ sd->ent_mh = minh;
+
+ if ((minw > 0) && (vw < minw)) vw = minw;
+ if (minh > vh) vh = minh;
- evas_object_resize(sd->entry_edje, minw, 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);
}
+
_cursor_geometry_recalc(obj);
evas_event_thaw(evas_object_evas_get(obj));
evas_event_thaw_eval(evas_object_evas_get(obj));