jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=8a40c063cebb68e53ca32a0470a17f180821afb2
commit 8a40c063cebb68e53ca32a0470a17f180821afb2 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Wed Nov 30 13:55:54 2016 +0900 win: Implement max size hint support evas_object_size_hint_max() would not work on a window, unless it somehow managed to not size itself (which would be another issue). This patch allows apps to call size_hint_max_set() on a window. A test case is provided in elm_test (Dialog). @feature --- src/bin/elementary/test_win_dialog.c | 57 ++++++++++++++++++++++++++++++++-- src/lib/elementary/efl_ui_win.c | 59 +++++++++++++++++++++++++++--------- src/lib/elementary/efl_ui_win.eo | 1 + 3 files changed, 101 insertions(+), 16 deletions(-) diff --git a/src/bin/elementary/test_win_dialog.c b/src/bin/elementary/test_win_dialog.c index a0924fd..a7c3bf3 100644 --- a/src/bin/elementary/test_win_dialog.c +++ b/src/bin/elementary/test_win_dialog.c @@ -3,8 +3,6 @@ #endif #include <Elementary.h> - - static void _bt_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -52,6 +50,55 @@ _bt2_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_ efl_gfx_visible_set(dia, EINA_TRUE); } +static void +_size_update(void *data, const Efl_Event *ev) +{ + int w, h, W, H, wc, hc, ww, hh; + char buf[2048]; + Eo *dia = ev->object; + Eo *lbl = data; + + efl_gfx_size_hint_combined_min_get(dia, &wc, &hc); + efl_gfx_size_hint_min_get(dia, &w, &h); + efl_gfx_size_hint_max_get(dia, &W, &H); + efl_gfx_size_get(dia, &ww, &hh); + + sprintf(buf, "This is a dialog with min/max size<br>" + "Min size: %dx%d (requested) %dx%d (effective)<br>" + "Max size: %dx%d<br>" + "Current size: %dx%d", w, h, wc, hc, W, H, ww, hh); + //efl_text_set(lbl, buf); + elm_object_text_set(lbl, buf); +} + +static void +_bt3_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Efl_Canvas_Object *dia, *lb, *parent = data; + + dia = efl_add(EFL_UI_WIN_STANDARD_CLASS, parent, + efl_ui_win_type_set(efl_added, EFL_UI_WIN_DIALOG_BASIC), + efl_ui_win_name_set(efl_added, "window-dia-3"), + efl_ui_win_autodel_set(efl_added, EINA_TRUE), + efl_text_set(efl_added, "Min/Max Size Dialog")); + + //lb = efl_add(EFL_UI_TEXT_CLASS, dia);, + lb = elm_label_add(dia); + efl_event_callback_add(dia, EFL_GFX_EVENT_CHANGE_SIZE_HINTS, _size_update, lb); + efl_event_callback_add(dia, EFL_GFX_EVENT_RESIZE, _size_update, lb); + elm_object_text_set(lb, "This is a Dialog Window"); + efl_gfx_size_hint_weight_set(lb, 1.0, 1.0); + + // Swallow in the label as the default content, this will make it visible. + efl_content_set(dia, lb); + + // Set min & max size (app-side) + efl_gfx_size_hint_min_set(dia, ELM_SCALE_SIZE(0), ELM_SCALE_SIZE(100)); + efl_gfx_size_hint_max_set(dia, ELM_SCALE_SIZE(800), ELM_SCALE_SIZE(600)); + + efl_gfx_visible_set(dia, EINA_TRUE); +} + void test_win_dialog(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -77,6 +124,12 @@ test_win_dialog(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *even elm_box_pack_end(box, bt); evas_object_show(bt); + bt = elm_button_add(win); + elm_object_text_set(bt, "Create a new dialog with min/max sizes"); + evas_object_smart_callback_add(bt, "clicked", _bt3_clicked_cb, win); + elm_box_pack_end(box, bt); + evas_object_show(bt); + evas_object_resize(win, 400, 400); evas_object_show(win); } diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index d667bef..7b4799a 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -5,6 +5,7 @@ #define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED #define ELM_INTERFACE_ATSPI_WIDGET_ACTION_PROTECTED #define EFL_INPUT_EVENT_PROTECTED +#define EFL_GFX_SIZE_HINT_PROTECTED #include <Elementary.h> #include <Elementary_Cursor.h> @@ -180,6 +181,7 @@ struct _Efl_Ui_Win_Data int aspect_w, aspect_h; /* used for the get API */ int size_base_w, size_base_h; int size_step_w, size_step_h; + int max_w, max_h; int norender; int modal_count; int response; @@ -248,6 +250,7 @@ struct _Efl_Ui_Win_Data Eina_Bool noblank : 1; Eina_Bool theme_alpha : 1; /**< alpha value fetched by a theme. this has higher priority than application_alpha */ Eina_Bool application_alpha : 1; /**< alpha value set by an elm_win_alpha_set() api. this has lower priority than theme_alpha */ + Eina_Bool tmp_updating_hints : 1; }; struct _Input_Pointer_Iterator @@ -1534,8 +1537,8 @@ _elm_win_state_change(Ecore_Evas *ee) } if (ch_wm_rotation) { - evas_object_size_hint_min_set(obj, -1, -1); - evas_object_size_hint_max_set(obj, -1, -1); + efl_gfx_size_hint_restricted_min_set(obj, -1, -1); + efl_gfx_size_hint_max_set(obj, -1, -1); #ifdef HAVE_ELEMENTARY_X _elm_win_xwin_update(sd); #endif @@ -3276,7 +3279,7 @@ static void _elm_win_resize_objects_eval(Evas_Object *obj) { ELM_WIN_DATA_GET(obj, sd); - Evas_Coord w, h, minw, minh, maxw, maxh; + Evas_Coord w, h, minw, minh, maxw, maxh, ow, oh; Eina_Bool unresizable; double wx, wy; @@ -3284,11 +3287,17 @@ _elm_win_resize_objects_eval(Evas_Object *obj) if (minw < 1) minw = 1; if (minh < 1) minh = 1; - evas_object_size_hint_weight_get(sd->legacy.edje, &wx, &wy); + efl_gfx_size_hint_weight_get(sd->legacy.edje, &wx, &wy); + maxw = sd->max_w; + maxh = sd->max_h; if (!wx) maxw = minw; - else maxw = 32767; + else if (maxw < 1) maxw = 32767; if (!wy) maxh = minh; - else maxh = 32767; + else if (maxh < 1) maxh = 32767; + if (maxw < minw) maxw = minw; + if (maxh < minh) maxh = minh; + if (maxw > 32767) maxw = 32767; + if (maxh > 32767) maxh = 32767; unresizable = ((minw == maxw) && (minh == maxh)); if (sd->csd.need_unresizable != unresizable) @@ -3308,14 +3317,19 @@ _elm_win_resize_objects_eval(Evas_Object *obj) maxh += fh; } - evas_object_size_hint_min_set(obj, minw, minh); - evas_object_size_hint_max_set(obj, maxw, maxh); + sd->tmp_updating_hints = 1; + efl_gfx_size_hint_restricted_min_set(obj, minw, minh); + efl_gfx_size_hint_max_set(obj, maxw, maxh); + sd->tmp_updating_hints = 0; - evas_object_geometry_get(obj, NULL, NULL, &w, &h); + evas_object_geometry_get(obj, NULL, NULL, &ow, &oh); + w = ow; + h = oh; if (w < minw) w = minw; if (h < minh) h = minh; if (w > maxw) w = maxw; if (h > maxh) h = maxh; + if ((w == ow) && (h == oh)) return; if (sd->img_obj) evas_object_resize(obj, w, h); else { @@ -5592,6 +5606,23 @@ _efl_ui_win_efl_gfx_size_hint_hint_step_set(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data } EOLIAN static void +_efl_ui_win_efl_gfx_size_hint_hint_max_set(Eo *obj, Efl_Ui_Win_Data *sd, int w, int h) +{ + if (sd->tmp_updating_hints) + { + efl_gfx_size_hint_max_set(efl_super(obj, MY_CLASS), w, h); + } + else + { + if (w < 1) w = -1; + if (h < 1) h = -1; + sd->max_w = w; + sd->max_h = h; + _elm_win_resize_objects_eval(obj); + } +} + +EOLIAN static void _efl_ui_win_efl_gfx_size_hint_hint_step_get(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd, int *w, int *h) { if (w) *w = sd->size_step_w; @@ -5659,8 +5690,8 @@ _win_rotate(Evas_Object *obj, Efl_Ui_Win_Data *sd, int rotation, Eina_Bool resiz sd->rot = rotation; if (resize) TRAP(sd, rotation_with_resize_set, rotation); else TRAP(sd, rotation_set, rotation); - evas_object_size_hint_min_set(obj, -1, -1); - evas_object_size_hint_max_set(obj, -1, -1); + efl_gfx_size_hint_restricted_min_set(obj, -1, -1); + efl_gfx_size_hint_max_set(obj, -1, -1); _elm_win_resize_objects_eval(obj); #ifdef HAVE_ELEMENTARY_X _elm_win_xwin_update(sd); @@ -7592,7 +7623,7 @@ _window_layout_stack(Evas_Object *o, Evas_Object_Box_Data *p, void *data) EINA_LIST_FOREACH(p->children, l, opt) { child = opt->obj; - evas_object_size_hint_weight_get(child, &wx, &wy); + efl_gfx_size_hint_weight_get(child, &wx, &wy); if (wx == 0.0) weight_x = 0; if (wy == 0.0) weight_y = 0; @@ -7601,7 +7632,7 @@ _window_layout_stack(Evas_Object *o, Evas_Object_Box_Data *p, void *data) if (h > minh) minh = h; } - evas_object_size_hint_min_set(o, minw, minh); + efl_gfx_size_hint_restricted_min_set(o, minw, minh); evas_object_geometry_get(o, &x, &y, &w, &h); if (w < minw) w = minw; if (h < minh) h = minh; @@ -7615,7 +7646,7 @@ _window_layout_stack(Evas_Object *o, Evas_Object_Box_Data *p, void *data) } ELM_WIN_DATA_GET(data, sd); - evas_object_size_hint_weight_set(sd->legacy.edje, weight_x, weight_y); + efl_gfx_size_hint_weight_set(sd->legacy.edje, weight_x, weight_y); evas_object_smart_changed(sd->legacy.edje); } diff --git a/src/lib/elementary/efl_ui_win.eo b/src/lib/elementary/efl_ui_win.eo index 7af31b9..2623067 100644 --- a/src/lib/elementary/efl_ui_win.eo +++ b/src/lib/elementary/efl_ui_win.eo @@ -920,6 +920,7 @@ class Efl.Ui.Win (Elm.Widget, Efl.Canvas, Elm.Interface.Atspi.Window, Efl.Gfx.Size.Hint.hint_step.get; Efl.Gfx.Size.Hint.hint_aspect.set; Efl.Gfx.Size.Hint.hint_aspect.get; + Efl.Gfx.Size.Hint.hint_max.set; Efl.Text.text.set; Efl.Text.text.get; Efl.Input.Interface.pointer_xy.get; --