From b87c3103f367ee694b9ae1ff13664605964e2549 Mon Sep 17 00:00:00 2001 From: Oskar Chodowicz Date: Tue, 16 Jul 2019 15:39:04 +0200 Subject: [PATCH] Fix for flickering toolbar at the Update Accessories Switch Page Change-Id: I998a6d92ee8cff4dea0efe4575b0fa8dc5b03bae --- src/ui/Naviframe.cpp | 18 +++++++++--------- src/ui/Naviframe.hpp | 2 +- src/view/ListView.cpp | 19 ++++++++++++------- src/view/ListView.hpp | 2 +- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/ui/Naviframe.cpp b/src/ui/Naviframe.cpp index 24d431e..b384731 100644 --- a/src/ui/Naviframe.cpp +++ b/src/ui/Naviframe.cpp @@ -51,7 +51,7 @@ NaviframeItem Naviframe::top() return {elm_naviframe_top_item_get(uniqueObj_.get())}; } -void Naviframe::onPopAnimationEnd() +void Naviframe::onPopAnimationEnd(std::function onPopAnimationEnd) { if (naviframeStack_.size()) { auto children = naviframeStack_.top(); @@ -64,6 +64,7 @@ void Naviframe::onPopAnimationEnd() removeFromParent(children.first); removeFromParent(children.second); naviframeStack_.pop(); + onPopAnimationEnd(); } } @@ -77,16 +78,15 @@ void Naviframe::popBack(NaviframeItem naviItem) void Naviframe::onPop(Elm_Object_Item *item) { - setEvasSmartCallback("transition,finished", [this]() { + setEvasSmartCallback("transition,finished", [this, item]() { removeEvasSmartCallback("transition,finished"); - onPopAnimationEnd(); + auto cb = naviframeCallbacks_.find(item); + if (cb == naviframeCallbacks_.end()) { + ERROR("No callback registered for this frame"); + return; + } + onPopAnimationEnd(cb->second); }); - auto cb = naviframeCallbacks_.find(item); - if (cb == naviframeCallbacks_.end()) { - ERROR("No callback registered for this frame"); - return; - } - cb->second(); } Eina_Bool Naviframe::callbackMethod(void *data, Elm_Object_Item *it) diff --git a/src/ui/Naviframe.hpp b/src/ui/Naviframe.hpp index 81e287b..a3b51ad 100644 --- a/src/ui/Naviframe.hpp +++ b/src/ui/Naviframe.hpp @@ -49,7 +49,7 @@ class Naviframe : public Layout void createEflObject(std::function onBackButtonPressed = {}); void onPop(Elm_Object_Item *item); static Eina_Bool callbackMethod(void *data, Elm_Object_Item *it); - void onPopAnimationEnd(); + void onPopAnimationEnd(std::function onPopAnimationEnd); std::stack> naviframeStack_; std::unordered_map> naviframeCallbacks_; diff --git a/src/view/ListView.cpp b/src/view/ListView.cpp index f7dfb80..0c3fc59 100644 --- a/src/view/ListView.cpp +++ b/src/view/ListView.cpp @@ -29,10 +29,18 @@ ListView::ListView(const NavigationContext &context, Presenter *presenter) handleNonToolbarActionsBeforeNaviframePush(); auto style = isToolbarNeeded() ? "tabbar/notitle" : std::string{}; - naviframeItem_ = naviframe_->pushBack(listPresenter_->getTitle(), genlist_, {}, backItem_, style); + auto ptr = std::make_shared(nullptr); + naviframeItem_ = naviframe_->pushBack(listPresenter_->getTitle(), genlist_, [ptr]() { + if (*ptr) { + auto parent = (*ptr)->getParent(); + parent->removeChild(*ptr); + } + }, + backItem_, + style); if (isToolbarNeeded()) - handleToolbarActions(); + handleToolbarActions(ptr); else handleNonToolbarActionsAfterNaviframePush(); } @@ -43,10 +51,6 @@ ListView::~ListView() auto parent = titleRightButton_->getParent(); parent->removeChild(titleRightButton_); } - if (toolbar_) { - auto parent = toolbar_->getParent(); - parent->removeChild(toolbar_); - } } bool ListView::isToolbarNeeded() @@ -56,11 +60,12 @@ bool ListView::isToolbarNeeded() return cancelAction || saveAction; } -void ListView::handleToolbarActions() +void ListView::handleToolbarActions(const std::shared_ptr &ptr) { auto cancelAction = listPresenter_->getAction("cancelAction"); auto saveAction = listPresenter_->getAction("saveAction"); toolbar_ = Widget::make(naviframe_); + *ptr = toolbar_; if (cancelAction) { toolbar_->addItem(cancelAction->title_.value(), [=]() { cancelAction->onInvoke_(cancelAction); diff --git a/src/view/ListView.hpp b/src/view/ListView.hpp index 88b7739..8a4e2b1 100644 --- a/src/view/ListView.hpp +++ b/src/view/ListView.hpp @@ -18,7 +18,7 @@ class ListView : public NaviframeView private: void addItemsToGenlist(); bool isToolbarNeeded(); - void handleToolbarActions(); + void handleToolbarActions(const std::shared_ptr &ptr); void handleNonToolbarActionsBeforeNaviframePush(); void handleNonToolbarActionsAfterNaviframePush(); GenlistItem::WidgetType translateType(ListItem::WidgetType t); -- 2.7.4