Fix for flickering toolbar at the Update Accessories Switch Page 96/210196/1
authorOskar Chodowicz <o.chodowicz@samsung.com>
Tue, 16 Jul 2019 13:39:04 +0000 (15:39 +0200)
committerOskar Chodowicz <o.chodowicz@samsung.com>
Tue, 16 Jul 2019 13:42:43 +0000 (15:42 +0200)
Change-Id: I998a6d92ee8cff4dea0efe4575b0fa8dc5b03bae

src/ui/Naviframe.cpp
src/ui/Naviframe.hpp
src/view/ListView.cpp
src/view/ListView.hpp

index 24d431e..b384731 100644 (file)
@@ -51,7 +51,7 @@ NaviframeItem Naviframe::top()
        return {elm_naviframe_top_item_get(uniqueObj_.get())};
 }
 
-void Naviframe::onPopAnimationEnd()
+void Naviframe::onPopAnimationEnd(std::function<void()> 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)
index 81e287b..a3b51ad 100644 (file)
@@ -49,7 +49,7 @@ class Naviframe : public Layout
        void createEflObject(std::function<void()> onBackButtonPressed = {});
        void onPop(Elm_Object_Item *item);
        static Eina_Bool callbackMethod(void *data, Elm_Object_Item *it);
-       void onPopAnimationEnd();
+       void onPopAnimationEnd(std::function<void()> onPopAnimationEnd);
 
        std::stack<std::pair<Widget *, Widget *>> naviframeStack_;
        std::unordered_map<Elm_Object_Item *, std::function<void()>> naviframeCallbacks_;
index f7dfb80..0c3fc59 100644 (file)
@@ -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<Toolbar *>(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<Toolbar *> &ptr)
 {
        auto cancelAction = listPresenter_->getAction("cancelAction");
        auto saveAction = listPresenter_->getAction("saveAction");
        toolbar_ = Widget::make<Toolbar>(naviframe_);
+       *ptr = toolbar_;
        if (cancelAction) {
                toolbar_->addItem(cancelAction->title_.value(), [=]() {
                        cancelAction->onInvoke_(cancelAction);
index 88b7739..8a4e2b1 100644 (file)
@@ -18,7 +18,7 @@ class ListView : public NaviframeView
        private:
        void addItemsToGenlist();
        bool isToolbarNeeded();
-       void handleToolbarActions();
+       void handleToolbarActions(const std::shared_ptr<Toolbar *> &ptr);
        void handleNonToolbarActionsBeforeNaviframePush();
        void handleNonToolbarActionsAfterNaviframePush();
        GenlistItem::WidgetType translateType(ListItem::WidgetType t);