From eacebe5e27a830145213be192bf8d089e8076e04 Mon Sep 17 00:00:00 2001 From: Jihoon Chung Date: Sat, 28 Sep 2013 14:19:01 +0900 Subject: [PATCH] Implement flexible popup depend on text length [Issue#] P130927-03499 [Problem] Layout of permission popup is broken [Cause] Current WRT doesn't set padding area to popup layout. Before it is working fine with default padding supported by elementary, the latest version has no padding area is supported. [Solution] Change popup layout to use padding area. - Add padding(SPACER type) between contents and four sides of a popup. - Contents area(body text) removes minimum size. (Automatically set by elementary) Add scroller if text is overflown screen height. - Register "resize" callback to popup. - When callback is called, calculate screen height and popup height. - In case of popup height is over screen height, add scroller to popup. [SCMRequest] N/A Change-Id: Ic07a3209ebeebad0ac35bbab92aea1d5250b31f4 --- data/Wrt.edc | 113 +++++++++++++++++---- src/view/common/view_logic_certificate_support.cpp | 98 ++++++++++++++---- .../common/view_logic_security_origin_support.cpp | 89 +++++++++++----- 3 files changed, 237 insertions(+), 63 deletions(-) diff --git a/data/Wrt.edc b/data/Wrt.edc index 280223a..f5e8244 100644 --- a/data/Wrt.edc +++ b/data/Wrt.edc @@ -63,45 +63,114 @@ collections { name: "popupWithCheck"; parts { part { - name: "bg"; - type: RECT; - scale : 1; + name: "pad_t"; + type: SPACER; + scale: 1; description { state: "default" 0.0; + align: 0.5 0.0; + min: 0 32; + fixed: 0 1; + rel1 { relative: 1.0 0.0;to_x: "pad_l"; } + rel2 { relative: 0.0 0.0;to_x: "pad_r"; } + } + } + part { + name: "pad_l"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 26 0; + max: 26 0; + fixed: 1 0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 0.0 1.0; } align: 0.0 0.0; - min: 0 230; - visible: 0; + } + } + part { + name: "pad_r"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 26 0; + max: 26 0; + fixed: 1 0; + rel1 { relative: 1.0 0.0; } + rel2 { relative: 1.0 1.0; } + align: 1.0 0.0; + } + } + part { + name:"elm.swallow.label"; + type: SWALLOW; + scale : 1; + description { + state: "default" 0.0; + fixed: 1 0; rel1 { - relative: 0.0 0.0; + relative: 1.0 1.0; + to_x: "pad_l"; + to_y: "pad_t"; } rel2 { - relative: 1.0 1.0; + relative: 0.0 0.0; + to_x: "pad_r"; + to_y: "pad_b"; } } } - part{ - name:"elm.swallow.label"; - type: SWALLOW; - scale : 1; + part { + name: "bottom_pad"; + type: SPACER; + scale: 1; description { state: "default" 0.0; - align: 0.0 0.0; - fixed: 1 1; - rel1 { relative: 0.05 0.05; to: "bg"; } - rel2 { relative: 0.95 0.8; to: "bg"; } + align: 0.0 1.0; + min: 0 32; + fixed: 0 1; + rel1 { relative: 1.0 1.0; to_x: "pad_l"; } + rel2 { relative: 0.0 1.0; to_x: "pad_r"; } } } - part{ - name:"elm.swallow.checkbox"; + part { + name: "pad_b"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 0 84; + fixed: 0 1; + rel1 { relative: 0.0 0.0; to: "bottom_pad"; } + rel2 { relative: 1.0 0.0; to: "bottom_pad"; } + } + } + part { + name: "end_field"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 0 63; + fixed: 0 1; + rel1 { relative: 0.0 1.0; to: "pad_b"; } + rel2 { relative: 0.0 1.0; to: "pad_b"; } + } + } + part { + name: "elm.swallow.checkbox"; type: SWALLOW; - scale : 1; + scale: 1; description { state: "default" 0.0; - visible: 1; - align: 0.0 0.0; fixed: 1 1; - rel1 { relative: 0.1 0.8; to: "bg"; } - rel2 { relative: 0.1 0.8; to: "bg"; } + align: 0.0 0.5; + rel1.to: "end_field"; + rel2.to: "end_field"; } } } //end of parts diff --git a/src/view/common/view_logic_certificate_support.cpp b/src/view/common/view_logic_certificate_support.cpp index 96a8a09..a375f19 100644 --- a/src/view/common/view_logic_certificate_support.cpp +++ b/src/view/common/view_logic_certificate_support.cpp @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include #include #include @@ -34,6 +36,70 @@ #include namespace ViewModule { +namespace { +const double MAX_POPUP_HEIGHT = 0.80; +const double MAX_SCROLLER_HEIGHT = 0.5; + +struct CallbackData { + Evas_Smart_Cb eaKeyCallback; +}; + +static void deleteCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo); +static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo); + +static void deleteCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo) +{ + _D("called"); + + DPL_UNUSED_PARAM(data); + DPL_UNUSED_PARAM(e); + DPL_UNUSED_PARAM(eventInfo); + + Assert(obj); + evas_object_event_callback_del(obj, EVAS_CALLBACK_RESIZE, resizeCallback); +} +static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo) +{ + _D("called"); + + DPL_UNUSED_PARAM(data); + DPL_UNUSED_PARAM(e); + DPL_UNUSED_PARAM(eventInfo); + + Assert(obj); + Evas_Object* popup = obj; + int popupH; + evas_object_geometry_get(popup, 0, 0, 0, &popupH); + + Evas_Object* parent = PopupUtil::getParentWindow(popup); + int parentW, parentH; + evas_object_geometry_get(parent, 0, 0, &parentW, &parentH); + + // compare current popup height with screen height. + // To avoid popup is filled full screen, used magic number to be filled 80% of screen height. + // TODO: Automatically add scroller feature should implement in the elementary + double threshold = parentH * MAX_POPUP_HEIGHT; + double currentH = popupH; + if (threshold < currentH) { + _D("text is overflow popup height. add scroller"); + Evas_Object* layout = elm_object_content_get(obj); + Evas_Object* label = elm_object_part_content_get(layout, "elm.swallow.label"); + + Evas_Object* scroller = elm_scroller_add(layout); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_AUTO); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_content_min_limit(scroller, EINA_TRUE, EINA_TRUE); + int scrollerHeight = parentW > parentH ? parentH : parentW; + evas_object_size_hint_max_set(scroller, -1, scrollerHeight * MAX_SCROLLER_HEIGHT); + + elm_object_part_content_unset(layout, "elm.swallow.label"); + elm_object_content_set(scroller, label); + elm_object_part_content_set(layout, "elm.swallow.label", scroller); + evas_object_show(layout); + } +} +} class CertificateSupportImplementation { @@ -96,34 +162,30 @@ Evas_Object* CertificateSupportUtil::createPopup( Evas_Object* parentWindow = PopupUtil::getParentWindow(window); Evas_Object* popup = elm_popup_add(parentWindow); + + evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, deleteCallback, NULL); + evas_object_event_callback_add(popup, EVAS_CALLBACK_RESIZE, resizeCallback, NULL); + elm_object_style_set(popup, "popup/default"); - evas_object_size_hint_weight_set(popup, - EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(popup, EVAS_HINT_FILL, EVAS_HINT_FILL); Evas_Object* layout = elm_layout_add(popup); elm_layout_file_set(layout, WRT_EDJ_PATH, "popupWithCheck"); - evas_object_size_hint_weight_set(layout, - EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - - Evas_Object* scroller = elm_scroller_add(layout); - elm_scroller_policy_set(scroller, - ELM_SCROLLER_POLICY_OFF, - ELM_SCROLLER_POLICY_AUTO); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); - Evas_Object* label = elm_label_add(scroller); + Evas_Object* label = elm_label_add(popup); elm_label_line_wrap_set(label, ELM_WRAP_WORD); elm_object_text_set(label, bodyText); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); - Evas_Object* check = elm_check_add(scroller); + Evas_Object* check = elm_check_add(layout); elm_object_text_set(check, checkText); - evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_part_content_set(layout, "elm.swallow.checkbox", check); - elm_object_content_set(scroller, label); - elm_object_part_content_set(layout, "elm.swallow.label", scroller); + elm_object_part_content_set(layout, "elm.swallow.label", label); + elm_object_part_content_set(layout, "elm.swallow.checkbox", check); elm_object_content_set(popup, layout); Evas_Object* btn1 = elm_button_add(popup); diff --git a/src/view/common/view_logic_security_origin_support.cpp b/src/view/common/view_logic_security_origin_support.cpp index db7e90a..dcebefc 100644 --- a/src/view/common/view_logic_security_origin_support.cpp +++ b/src/view/common/view_logic_security_origin_support.cpp @@ -38,21 +38,71 @@ namespace ViewModule { namespace { +const double MAX_POPUP_HEIGHT = 0.80; +const double MAX_SCROLLER_HEIGHT = 0.5; + struct CallbackData { Evas_Smart_Cb eaKeyCallback; }; static void deleteCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo); +static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo); + static void deleteCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo) { + _D("called"); + DPL_UNUSED_PARAM(e); DPL_UNUSED_PARAM(eventInfo); - Assert(data); CallbackData* callbackData = static_cast(data); Assert(obj); - ea_object_event_callback_del(obj, EA_CALLBACK_BACK, callbackData->eaKeyCallback); - delete callbackData; + if (callbackData) { + ea_object_event_callback_del(obj, EA_CALLBACK_BACK, callbackData->eaKeyCallback); + delete callbackData; + } + evas_object_event_callback_del(obj, EVAS_CALLBACK_RESIZE, resizeCallback); +} +static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo) +{ + _D("called"); + + DPL_UNUSED_PARAM(data); + DPL_UNUSED_PARAM(e); + DPL_UNUSED_PARAM(eventInfo); + + Assert(obj); + Evas_Object* popup = obj; + int popupH; + evas_object_geometry_get(popup, 0, 0, 0, &popupH); + + Evas_Object* parent = PopupUtil::getParentWindow(popup); + int parentW, parentH; + evas_object_geometry_get(parent, 0, 0, &parentW, &parentH); + + // compare current popup height with screen height. + // To avoid popup is filled full screen, used magic number to be filled 80% of screen height. + // TODO: Automatically add scroller feature should implement in the elementary + double threshold = parentH * MAX_POPUP_HEIGHT; + double currentH = popupH; + if (threshold < currentH) { + _D("text is overflow popup height. add scroller"); + Evas_Object* layout = elm_object_content_get(obj); + Evas_Object* label = elm_object_part_content_get(layout, "elm.swallow.label"); + + Evas_Object* scroller = elm_scroller_add(layout); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_AUTO); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_content_min_limit(scroller, EINA_TRUE, EINA_TRUE); + int scrollerHeight = parentW > parentH ? parentH : parentW; + evas_object_size_hint_max_set(scroller, -1, scrollerHeight * MAX_SCROLLER_HEIGHT); + + elm_object_part_content_unset(layout, "elm.swallow.label"); + elm_object_content_set(scroller, label); + elm_object_part_content_set(layout, "elm.swallow.label", scroller); + evas_object_show(layout); + } } } @@ -117,42 +167,35 @@ Evas_Object* SecurityOriginSupportUtil::createPopup( Evas_Object* parentWindow = PopupUtil::getParentWindow(window); Evas_Object* popup = elm_popup_add(parentWindow); + CallbackData* callbackData = NULL; if (keyCallback) { CallbackData* callbackData = new CallbackData; callbackData->eaKeyCallback = keyCallback; - ea_object_event_callback_add(popup, EA_CALLBACK_BACK, keyCallback, data); - evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, deleteCallback, static_cast(callbackData)); } + evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, deleteCallback, static_cast(callbackData)); + evas_object_event_callback_add(popup, EVAS_CALLBACK_RESIZE, resizeCallback, NULL); elm_object_style_set(popup, "popup/default"); - evas_object_size_hint_weight_set(popup, - EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(popup, EVAS_HINT_FILL, EVAS_HINT_FILL); Evas_Object* layout = elm_layout_add(popup); elm_layout_file_set(layout, WRT_EDJ_PATH, "popupWithCheck"); - evas_object_size_hint_weight_set(layout, - EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - - Evas_Object* scroller = elm_scroller_add(layout); - elm_scroller_policy_set(scroller, - ELM_SCROLLER_POLICY_OFF, - ELM_SCROLLER_POLICY_AUTO); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); - Evas_Object* label = elm_label_add(scroller); + Evas_Object* label = elm_label_add(popup); elm_label_line_wrap_set(label, ELM_WRAP_WORD); elm_object_text_set(label, bodyText); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); - Evas_Object* check = elm_check_add(scroller); + Evas_Object* check = elm_check_add(layout); elm_object_text_set(check, checkText); - evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_part_content_set(layout, "elm.swallow.checkbox", check); - elm_object_content_set(scroller, label); - elm_object_part_content_set(layout, "elm.swallow.label", scroller); + elm_object_part_content_set(layout, "elm.swallow.label", label); + elm_object_part_content_set(layout, "elm.swallow.checkbox", check); elm_object_content_set(popup, layout); Evas_Object* btn1 = elm_button_add(popup); -- 2.7.4