TizenRefApp-8642 Implement collapse animation 03/132903/1 submit/tizen/20170608.101143 submit/tizen_4.0/20170811.094300
authorDenis Dolzhenko <d.dolzhenko@samsung.com>
Thu, 8 Jun 2017 08:22:23 +0000 (11:22 +0300)
committerDenis Dolzhenko <d.dolzhenko@samsung.com>
Thu, 8 Jun 2017 08:22:23 +0000 (11:22 +0300)
Change-Id: Ia9ca5ff19fb8e6a87d57eb3ea69be30bdd7c65cc
Signed-off-by: Denis Dolzhenko <d.dolzhenko@samsung.com>
res/edje/anim-item.edc
src/App/inc/TaskListViewItem.h
src/App/src/App.cpp
src/App/src/TaskListView.cpp
src/App/src/TaskListViewItem.cpp

index 7df58c4..495cb27 100644 (file)
@@ -2,7 +2,8 @@
 
 #define FOCAL_RATIO 1.5
 #define OFFSET_FIX_RATIO 1.2
-#define TRANS_TIME 0.4
+#define TRANS_TIME 0.3
+#define COLLAPSE_TIME 0.15
 #define OPACITY_RATIO 1.3
 
 collections {
@@ -68,11 +69,12 @@ collections {
             clip_to : "clipper_panel";
             description {
                state: "default" 0.0;
+               min: ITEM_W WIN_H;
                map {
-                  on: 1;
-                  smooth: 1;
-                  perspective_on: 1;
-                  perspective: "focal.point";
+                   on: 1;
+                   smooth: 1;
+                   perspective_on: 1;
+                   perspective: "focal.point";
                }
             }
             description {
@@ -96,11 +98,16 @@ collections {
                state: "visible" 0.0;
                inherit: "default" 0.0;
             }
+            description {
+               state: "collapse" 0.0;
+               min: 0 WIN_H;
+               max: 0 -1;
+               visible: 0;
+            }
          }
       }
       programs {
-         program
-         {
+         program {
             name : "set_to_default";
             signal : "default_state";
             source : "";
@@ -110,8 +117,7 @@ collections {
             target : "clipper_panel";
             transition: BOUNCE 1.0 4.5 5.0;
          }
-         program
-         {
+         program {
             name : "move_up";
             signal : "move_up";
             source : "";
@@ -121,8 +127,7 @@ collections {
             action : STATE_SET "up" 0.0;
             after: "move_finished";
          }
-         program
-         {
+         program {
             name : "move_down";
             signal : "move_down";
             source : "";
@@ -131,8 +136,7 @@ collections {
             transition: LINEAR TRANS_TIME;
             after: "move_finished";
          }
-         program
-         {
+         program {
             name : "zoom_out";
             signal : "zoom_out";
             source : "";
@@ -141,8 +145,7 @@ collections {
             transition: LINEAR TRANS_TIME;
             after: "zoom_finished";
          }
-         program
-         {
+         program {
             name : "opacity_hidden";
             signal : "opacity_hidden";
             source : "";
@@ -151,6 +154,15 @@ collections {
             transition: LINEAR TRANS_TIME;
          }
          program {
+            name : "collapse";
+            signal : "collapse";
+            source : "";
+            action : STATE_SET "collapse" 0.0;
+            target : "swallow.content";
+            transition: LINEAR COLLAPSE_TIME;
+            after: "collapse_finished";
+         }
+         program {
             name : "zoom_finished";
             action : SIGNAL_EMIT "zoom_finished" "";
          }
@@ -158,6 +170,10 @@ collections {
             name : "move_finished";
             action : SIGNAL_EMIT "move_finished" "";
          }
+         program {
+            name : "collapse_finished";
+            action : SIGNAL_EMIT "collapse_finished" "";
+         }
       }
       script {
          set_offset(Float:ratio) {
index 85f31b6..a85982c 100644 (file)
@@ -34,6 +34,7 @@ namespace TaskMngr
             static int getHeight();
 
             void playKillAnim();
+            void playKillAllAnim();
             void playKillUpAnim();
             void playKillDownAnim();
             const AppInfo &getAppInfo() const;
@@ -45,7 +46,8 @@ namespace TaskMngr
             void onUp(Evas *e, Evas_Object *obj, void *event_info);
 
             void onKillAnimFinished(Evas_Object *obj, const char *emission, const char *source);
-
+            void onCollapseAnimFinished(Evas_Object *obj, const char *emission, const char *source);
+            Eina_Bool onAnimator();
             void onDelButtonClicked(Evas_Object *obj, void *event_info);
             void onAppClicked(Evas_Object *obj, const char *emission, const char *source);
             Eina_Bool onScreenReaderAppClicked(Evas_Object *obj, Elm_Access_Action_Info *action_info);
@@ -62,6 +64,12 @@ namespace TaskMngr
             void setOffsetUpState();
             void setOffsetDownState();
             void setOpacityState();
+            void setCollapseState();
+
+            void playCollapseAnim();
+            void stopAnimator();
+            void startAnimator();
+            bool isAnimPlaying() const;
 
         private:
             TaskListView &m_Parent;
@@ -75,9 +83,12 @@ namespace TaskMngr
             DelButton *m_pDelButton;
             double m_MoveDistance; // 0..1;
             bool m_IsKillAnimPlaying;
+            bool m_IsCollapseAnimPlaying;
             bool m_IgnoreAppClick;
             Atspi m_AoIcon;
             Atspi m_AoDelButton;
+            Ecore_Animator *m_pAnimator;
+            bool m_ReqCollapseAnim;
     };
 }
 
index a0f5967..2cbd4e3 100644 (file)
@@ -90,7 +90,7 @@ bool App::onCreate()
 {
     TRACE;
 
-    const int maxFps = 60;
+    const double maxFps = 60;
 
     std::string localePath(PathUtils::getLocalePath());
     if (!localePath.empty())
@@ -98,7 +98,7 @@ bool App::onCreate()
 
     elm_app_base_scale_set(1.3);
     elm_config_accel_preference_set("3d");
-    ecore_animator_frametime_set(1 / (double)maxFps);
+    ecore_animator_frametime_set(1 / maxFps);
 
     m_pWindow = new Window;
     m_pWindow->show();
index 494ee5b..e85e6a3 100644 (file)
@@ -163,7 +163,7 @@ void TaskListView::killAll()
 {
     auto items = getItems();
     for (TaskListViewItem *item : items) {
-        item->playKillAnim();
+        item->playKillAllAnim();
     }
 }
 
index 233065a..3d590a9 100644 (file)
@@ -41,7 +41,10 @@ TaskListViewItem::TaskListViewItem(TaskListView &parent, const AppInfo &appInfo)
     , m_pDelButton(nullptr)
     , m_MoveDistance(0)
     , m_IsKillAnimPlaying(false)
+    , m_IsCollapseAnimPlaying(false)
     , m_IgnoreAppClick(false)
+    , m_pAnimator(nullptr)
+    , m_ReqCollapseAnim(false)
 {
     setEo(addLayout(parent, ANIM_ITEM_EDJ, "anim_item"));
     addEventCb(EVAS_CALLBACK_MOUSE_MOVE, makeCbFirst(&TaskListViewItem::onMove), this);
@@ -49,6 +52,8 @@ TaskListViewItem::TaskListViewItem(TaskListView &parent, const AppInfo &appInfo)
     addEventCb(EVAS_CALLBACK_MOUSE_UP, makeCbFirst(&TaskListViewItem::onUp), this);
     addSignalCb("zoom_finished", "", makeCbFirst(&TaskListViewItem::onKillAnimFinished), this);
     addSignalCb("move_finished", "", makeCbFirst(&TaskListViewItem::onKillAnimFinished), this);
+    addSignalCb("move_finished", "", makeCbFirst(&TaskListViewItem::onKillAnimFinished), this);
+    addSignalCb("collapse_finished", "", makeCbFirst(&TaskListViewItem::onCollapseAnimFinished), this);
     expand();
 
     m_pTaskLayout = View::addLayout(getEo(), TASK_ITEM_EDJ, "task_item");
@@ -67,7 +72,21 @@ TaskListViewItem::TaskListViewItem(TaskListView &parent, const AppInfo &appInfo)
 
 TaskListViewItem::~TaskListViewItem()
 {
+    stopAnimator();
+}
+
+void TaskListViewItem::stopAnimator()
+{
+    if (m_pAnimator) {
+        ecore_animator_del(m_pAnimator);
+        m_pAnimator = nullptr;
+    }
+}
 
+void TaskListViewItem::startAnimator()
+{
+    if (!m_pAnimator)
+        m_pAnimator = ecore_animator_add(makeCbFirst(&TaskListViewItem::onAnimator), this);
 }
 
 const AppInfo &TaskListViewItem::getAppInfo() const
@@ -139,8 +158,19 @@ int TaskListViewItem::getHeight()
     return HEIGHT;
 }
 
+bool TaskListViewItem::isAnimPlaying() const
+{
+    return m_IsKillAnimPlaying || m_IsCollapseAnimPlaying;
+}
+
 void TaskListViewItem::playKillAnim()
 {
+    playKillAllAnim();
+    m_ReqCollapseAnim = true;
+}
+
+void TaskListViewItem::playKillAllAnim()
+{
     if (!m_IsKillAnimPlaying) {
         m_IsKillAnimPlaying = true;
         setZoomOutState();
@@ -152,6 +182,7 @@ void TaskListViewItem::playKillUpAnim()
 {
     if (!m_IsKillAnimPlaying) {
         m_IsKillAnimPlaying = true;
+        m_ReqCollapseAnim = true;
         setZoomOutState();
         setOpacityState();
         setOffsetUpState();
@@ -162,12 +193,25 @@ void TaskListViewItem::playKillDownAnim()
 {
     if (!m_IsKillAnimPlaying) {
         m_IsKillAnimPlaying = true;
+        m_ReqCollapseAnim = true;
         setZoomOutState();
         setOpacityState();
         setOffsetDownState();
     }
 }
 
+void TaskListViewItem::playCollapseAnim()
+{
+    if (m_ReqCollapseAnim && !m_IsCollapseAnimPlaying) {
+        m_IsCollapseAnimPlaying = true;
+        m_ReqCollapseAnim = false;
+        evas_object_del(m_pTaskLayout);
+        m_pTaskLayout = nullptr;
+        setCollapseState();
+        startAnimator();
+    }
+}
+
 void TaskListViewItem::setDefaultState()
 {
     m_IsKillAnimPlaying = false;
@@ -194,11 +238,16 @@ void TaskListViewItem::setOpacityState()
     emitSignal("opacity_hidden", "", true);
 }
 
+void TaskListViewItem::setCollapseState()
+{
+    emitSignal("collapse", "", true);
+}
+
 void TaskListViewItem::onMove(Evas *e, Evas_Object *obj, void *event_info)
 {
     auto *event = (Evas_Event_Mouse_Move*)event_info;
 
-    if (m_IsKillAnimPlaying ||
+    if (isAnimPlaying() ||
         !m_IsMouseDown ||
         (event->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
         return;
@@ -225,7 +274,7 @@ void TaskListViewItem::onMove(Evas *e, Evas_Object *obj, void *event_info)
 
 void TaskListViewItem::onDown(Evas *e, Evas_Object *obj, void *event_info)
 {
-    if (m_IsKillAnimPlaying)
+    if (isAnimPlaying())
         return;
 
     m_IgnoreAppClick = false;
@@ -237,7 +286,7 @@ void TaskListViewItem::onDown(Evas *e, Evas_Object *obj, void *event_info)
 
 void TaskListViewItem::onUp(Evas *e, Evas_Object *obj, void *event_info)
 {
-    if (m_IsKillAnimPlaying)
+    if (isAnimPlaying())
         return;
 
     static const double killThreshold = 0.25;
@@ -291,7 +340,23 @@ char *TaskListViewItem::onChangeDescription(Evas_Object *obj)
 void TaskListViewItem::onKillAnimFinished(Evas_Object *obj, const char *emission, const char *source)
 {
     LOG("");
+    if (!m_IsKillAnimPlaying)
+        return;
+
     m_IsKillAnimPlaying = false;
+    m_ReqCollapseAnim ? playCollapseAnim() : m_Parent.onDelRequest(*this);
+}
+
+void TaskListViewItem::onCollapseAnimFinished(Evas_Object *obj, const char *emission, const char *source)
+{
+    LOG("");
+    stopAnimator();
+    m_IsCollapseAnimPlaying = false;
     m_Parent.onDelRequest(*this);
 }
 
+Eina_Bool TaskListViewItem::onAnimator()
+{
+    elm_layout_sizing_eval(getEo());
+    return true;
+}