From: Denis Dolzhenko Date: Thu, 8 Jun 2017 08:22:23 +0000 (+0300) Subject: TizenRefApp-8642 Implement collapse animation X-Git-Tag: submit/tizen/20170608.101143^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b78f5b1c4694ee52e2438f0a68700d6d15b1633a;p=profile%2Fwearable%2Fapps%2Fnative%2Ftaskmanager.git TizenRefApp-8642 Implement collapse animation Change-Id: Ia9ca5ff19fb8e6a87d57eb3ea69be30bdd7c65cc Signed-off-by: Denis Dolzhenko --- diff --git a/res/edje/anim-item.edc b/res/edje/anim-item.edc index 7df58c4..495cb27 100644 --- a/res/edje/anim-item.edc +++ b/res/edje/anim-item.edc @@ -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) { diff --git a/src/App/inc/TaskListViewItem.h b/src/App/inc/TaskListViewItem.h index 85f31b6..a85982c 100644 --- a/src/App/inc/TaskListViewItem.h +++ b/src/App/inc/TaskListViewItem.h @@ -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; }; } diff --git a/src/App/src/App.cpp b/src/App/src/App.cpp index a0f5967..2cbd4e3 100644 --- a/src/App/src/App.cpp +++ b/src/App/src/App.cpp @@ -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(); diff --git a/src/App/src/TaskListView.cpp b/src/App/src/TaskListView.cpp index 494ee5b..e85e6a3 100644 --- a/src/App/src/TaskListView.cpp +++ b/src/App/src/TaskListView.cpp @@ -163,7 +163,7 @@ void TaskListView::killAll() { auto items = getItems(); for (TaskListViewItem *item : items) { - item->playKillAnim(); + item->playKillAllAnim(); } } diff --git a/src/App/src/TaskListViewItem.cpp b/src/App/src/TaskListViewItem.cpp index 233065a..3d590a9 100644 --- a/src/App/src/TaskListViewItem.cpp +++ b/src/App/src/TaskListViewItem.cpp @@ -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; +}