Add scroller in viewmgr. 10/64910/8
authorWoochan Lee <wc0917.lee@samsung.com>
Wed, 6 Apr 2016 06:52:57 +0000 (15:52 +0900)
committerwoochan lee <wc0917.lee@samsung.com>
Fri, 8 Apr 2016 05:40:55 +0000 (22:40 -0700)
Change-Id: I5a5015cb38d35ba72c59f1e1feab2fdcd683e486

src/include/efl/ui_base_viewmgr.h
src/lib/efl/ui_base_viewmgr.cpp

index 06e67a6..4ec4b35 100644 (file)
@@ -51,6 +51,7 @@ class ui_base_viewmgr: public viewmgr::ui_iface_viewmgr<Evas_Object *, ui_base_v
 private:
        Elm_Win *win;                                      //This is acting like a base object of viewmgr.
        Elm_Conformant *conform;                   //Conformant for viewmgr.
+       Elm_Scroller *scroller;                    //Scroller for viewmgr.
        Elm_Layout *layout;                        //Viewmgr's base layout.
        ui_base_key_listener *key_listener;        //HW Key Handler such as "BACK" key...
        ui_view_indicator indicator;               //Mode of indicator.
@@ -69,14 +70,29 @@ private:
        bool create_conformant(Elm_Win *win);
 
        /**
-        *  @brief Create a base layout.
+        *  @brief Create a Scroller.
         *
         *  @param conform viewmgr's conformant object. this will be parent of layout object.
+        *
+        *  @note We add a scroller for an exceptional case. If user view content is larger than window,
+        *        then the content will be automatically scrollable by this scroller.
+        *        For instance, if the virtual keypad is enabled in the landscape mode,
+        *        the content area would be smaller than content minimum size.
+        *        We could avoid clipping the content by scroller.
+        *
+        *  @return @c true success or @c false not.
+        */
+
+       bool create_scroller(Elm_Conformant *conform);
+       /**
+        *  @brief Create a base layout.
+        *
+        *  @param scroller viewmgr's scroller object. this will be parent of layout object.
         *  @param style view's transition effect style.
         *
         *  @return @c true success or @c false not.
         */
-       bool create_base_layout(Elm_Conformant *conform, const char *style);
+       bool create_base_layout(Elm_Scroller *scroller, const char *style);
 
        /** @brief Set the indicator mode.
         *
index f50289f..539cf0c 100644 (file)
 using namespace efl_viewmgr;
 using namespace viewmgr;
 
-bool ui_base_viewmgr::create_base_layout(Elm_Conformant *conform, const char *style)
+bool ui_base_viewmgr::create_base_layout(Elm_Scroller *scroller, const char *style)
 {
        char edj_path[PATH_MAX];
        char group_name[128];
 
-       Elm_Layout *layout = elm_layout_add(conform);
+       Elm_Layout *layout = elm_layout_add(scroller);
        if (!layout) return false;
 
        snprintf(group_name, sizeof(group_name), "transition/%s", style);
        snprintf(edj_path, sizeof(edj_path), "%s/ui-viewmgr.edj", EDJ_PATH);
        elm_layout_file_set(layout, edj_path, group_name);
-       elm_object_content_set(conform, layout);
+       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);
+       elm_object_content_set(scroller, layout);
 
        //Push Finished Event
        elm_layout_signal_callback_add(layout, "push,finished", "viewmgr",
@@ -72,8 +74,8 @@ Elm_Layout *ui_base_viewmgr::set_transition_layout(string transition_style)
 
        if (effect_map.size()) effect_layout = effect_map.find(transition_style)->second;
 
-       //Conformant content change to current effect layout and change to hide prev layout.
-       Elm_Layout *playout = elm_object_part_content_unset(this->conform, "elm.swallow.content");
+       //Scroller content change to current effect layout and change to hide prev layout.
+       Elm_Layout *playout = elm_object_part_content_unset(this->scroller, NULL);
        evas_object_hide(playout);
 
        if (!effect_layout)
@@ -81,12 +83,12 @@ Elm_Layout *ui_base_viewmgr::set_transition_layout(string transition_style)
                //Create and add effect_layouts in map here.
                //FIXME: If we have to support many effects, this logic should be changed.
                effect_map.insert(pair<string, Elm_Layout *>("default", this->layout));
-               this->create_base_layout(this->get_conformant(), transition_style.c_str());
+               this->create_base_layout(this->scroller, transition_style.c_str());
                effect_map.insert(pair<string, Elm_Layout *>(transition_style, this->layout));
        }
        else
        {
-               elm_object_part_content_set(this->conform, "elm.swallow.content", effect_layout);
+               elm_object_content_set(this->scroller, effect_layout);
 
                this->layout = effect_layout;
        }
@@ -168,6 +170,22 @@ bool ui_base_viewmgr::create_conformant(Elm_Win *win)
        return true;
 }
 
+bool ui_base_viewmgr::create_scroller(Elm_Conformant *conform)
+{
+       Elm_Scroller *scroller = elm_scroller_add(conform);
+       if (!scroller) return false;
+
+       elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_AUTO, 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_object_content_set(conform, scroller);
+
+       this->scroller = scroller;
+
+       return true;
+}
+
 ui_base_viewmgr::ui_base_viewmgr(const char *pkg, ui_base_key_listener *key_listener)
                : ui_iface_viewmgr(), key_listener(key_listener), transition_style("default")
 {
@@ -226,7 +244,13 @@ ui_base_viewmgr::ui_base_viewmgr(const char *pkg, ui_base_key_listener *key_list
                return;
        }
 
-       if (!this->create_base_layout(this->conform, "default"))
+       if (!this->create_scroller(this->conform))
+       {
+               LOGE("Failed to create a scroller (%s)", pkg);
+               return;
+       }
+
+       if (!this->create_base_layout(this->scroller, "default"))
        {
                LOGE("Failed to create a base layout (%s)", pkg);
                return;