diff --git a/src/bin/elementary/test_win_dialog.c b/src/bin/elementary/test_win_dialog.c index a7c3bf31eb..b90dfc61da 100644 --- a/src/bin/elementary/test_win_dialog.c +++ b/src/bin/elementary/test_win_dialog.c @@ -99,6 +99,36 @@ _bt3_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_ efl_gfx_visible_set(dia, EINA_TRUE); } +static void +_bt4_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, NULL, + efl_ui_win_type_set(efl_added, EFL_UI_WIN_DIALOG_BASIC), + efl_ui_win_name_set(efl_added, "window-dia-4"), + 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 Centered 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_ui_win_center(dia, EINA_TRUE, EINA_TRUE); + 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) { @@ -130,6 +160,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 centered dialog"); + evas_object_smart_callback_add(bt, "clicked", _bt4_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 0d9907e7bf..0feb119eb6 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -187,10 +187,13 @@ 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 req_x, req_y, req_w, req_h; int max_w, max_h; int norender; int modal_count; int response; + Eina_Bool req_wh : 1; + Eina_Bool req_xy : 1; struct { short pointer_move; @@ -874,6 +877,7 @@ _elm_win_move(Ecore_Evas *ee) efl_event_callback_legacy_call(sd->obj, EFL_GFX_EVENT_MOVE, NULL); evas_nochange_push(evas_object_evas_get(sd->obj)); sd->response++; + sd->req_xy = EINA_FALSE; evas_object_move(sd->obj, x, y); sd->response--; evas_nochange_pop(evas_object_evas_get(sd->obj)); @@ -915,6 +919,7 @@ _elm_win_resize_job(void *data) } sd->response++; + sd->req_wh = EINA_FALSE; evas_object_resize(sd->obj, w, h); evas_object_resize(sd->legacy.edje, w, h); sd->response--; @@ -2899,7 +2904,13 @@ _efl_ui_win_efl_gfx_position_set(Eo *obj, Efl_Ui_Win_Data *sd, Evas_Coord x, Eva } else { - if (!sd->response) TRAP(sd, move, x, y); + if (!sd->response) + { + sd->req_xy = EINA_TRUE; + sd->req_x = x; + sd->req_y = y; + TRAP(sd, move, x, y); + } if (!ecore_evas_override_get(sd->ee)) goto super_skip; } @@ -2959,7 +2970,13 @@ _efl_ui_win_efl_gfx_size_set(Eo *obj, Efl_Ui_Win_Data *sd, Evas_Coord w, Evas_Co } _elm_win_frame_geometry_adjust(sd); - if (!sd->response) TRAP(sd, resize, w, h); + if (!sd->response) + { + sd->req_wh = EINA_TRUE; + sd->req_w = w; + sd->req_h = h; + TRAP(sd, resize, w, h); + } efl_gfx_size_set(efl_super(obj, MY_CLASS), w, h); } @@ -3444,11 +3461,18 @@ _elm_win_resize_objects_eval(Evas_Object *obj) if (w > maxw) w = maxw; if (h > maxh) h = maxh; //if ((w == ow) && (h == oh)) return; + sd->req_wh = EINA_FALSE; if (sd->img_obj) evas_object_resize(obj, w, h); else { _elm_win_frame_geometry_adjust(sd); - if (!sd->response) TRAP(sd, resize, w, h); + if (!sd->response) + { + sd->req_wh = EINA_TRUE; + sd->req_w = w; + sd->req_h = h; + TRAP(sd, resize, w, h); + } } } @@ -5416,6 +5440,10 @@ _efl_ui_win_center(Eo *obj, Efl_Ui_Win_Data *sd, Eina_Bool h, Eina_Bool v) { int win_w, win_h, screen_x, screen_y, screen_w, screen_h, nx, ny; + if (sd->deferred_resize_job) _elm_win_resize_job(sd->obj); + if (sd->frame_obj) edje_object_message_signal_process(sd->frame_obj); + evas_smart_objects_calculate(evas_object_evas_get(obj)); + _elm_win_resize_objects_eval(obj); if ((trap) && (trap->center) && (!trap->center(sd->trap_data, obj, h, v))) return; @@ -5424,12 +5452,27 @@ _efl_ui_win_center(Eo *obj, Efl_Ui_Win_Data *sd, Eina_Bool h, Eina_Bool v) &screen_w, &screen_h); if ((!screen_w) || (!screen_h)) return; - evas_object_geometry_get(obj, &nx, &ny, &win_w, &win_h); + if (sd->req_wh) + { + win_w = sd->req_w; + win_h = sd->req_h; + } + else evas_object_geometry_get(obj, NULL, NULL, &win_w, &win_h); + if (sd->req_xy) + { + nx = sd->req_x; + ny = sd->req_y; + } + else evas_object_geometry_get(obj, &nx, &ny, NULL, NULL); + if ((!win_w) || (!win_h)) return; if (h) nx = win_w >= screen_w ? 0 : (screen_w / 2) - (win_w / 2); if (v) ny = win_h >= screen_h ? 0 : (screen_h / 2) - (win_h / 2); + sd->req_xy = EINA_TRUE; + sd->req_x = screen_x + nx; + sd->req_y = screen_y + ny; evas_object_move(obj, screen_x + nx, screen_y + ny); }