From 00944d3e22073477ac0867e3ac01a51e3114c302 Mon Sep 17 00:00:00 2001 From: Eugene Kurzberg Date: Thu, 27 Oct 2016 13:48:29 +0300 Subject: [PATCH] Refactored ScrollNavigator to be derived from TabNavigator. Change-Id: I50c2b1b586d8bf6db88ff90c3b59c7817f5f6530 Signed-off-by: Eugene Kurzberg --- contacts-app/src/OperationDefaultController.cpp | 4 +- lib-apps-common/inc/Ui/ScrollNavigator.h | 22 ++--- lib-apps-common/inc/Ui/ScrollPage.h | 7 +- lib-apps-common/src/Ui/ScrollNavigator.cpp | 124 +++++++++--------------- lib-apps-common/src/Ui/ScrollPage.cpp | 4 +- lib-apps-common/src/Ui/TabNavigator.cpp | 11 +-- 6 files changed, 68 insertions(+), 104 deletions(-) diff --git a/contacts-app/src/OperationDefaultController.cpp b/contacts-app/src/OperationDefaultController.cpp index 41093cb..dfa51a8 100644 --- a/contacts-app/src/OperationDefaultController.cpp +++ b/contacts-app/src/OperationDefaultController.cpp @@ -21,6 +21,8 @@ #include "Contacts/List/ListView.h" #include "Logs/List/LogsView.h" #include "Phone/Dialer/DialerView.h" + +#include "Ui/Tabbar.h" #include "Ui/ScrollNavigator.h" #include @@ -52,7 +54,7 @@ OperationDefaultController::~OperationDefaultController() void OperationDefaultController::onCreate() { - m_Navigator = new Ui::ScrollNavigator(); + m_Navigator = new Ui::ScrollNavigator(new Ui::Tabbar()); getNavigator()->navigateTo(m_Navigator); m_Tabs[TabDialer] = new DialerView(); diff --git a/lib-apps-common/inc/Ui/ScrollNavigator.h b/lib-apps-common/inc/Ui/ScrollNavigator.h index bea7480..c9518aa 100644 --- a/lib-apps-common/inc/Ui/ScrollNavigator.h +++ b/lib-apps-common/inc/Ui/ScrollNavigator.h @@ -18,7 +18,7 @@ #ifndef UI_SCROLL_NAVIGATOR_H #define UI_SCROLL_NAVIGATOR_H -#include "Ui/Navigator.h" +#include "Ui/TabNavigator.h" #include "Ui/ScrollPage.h" #include @@ -27,10 +27,13 @@ namespace Ui /** * @brief Scrollable page navigator. */ - class EXPORT_API ScrollNavigator : public Navigator + class EXPORT_API ScrollNavigator : public TabNavigator { public: - ScrollNavigator(); + /** + * @see TabNavigator::TabNavigator() + */ + explicit ScrollNavigator(Selector *selector = nullptr); /** * @brief Set whether navigation is allowed either by user or by calling navigateTo(). @@ -40,27 +43,24 @@ namespace Ui protected: virtual Evas_Object *onCreate(Evas_Object *parent) override; - virtual void onPageAttached(NavigatorPage *page) override; - virtual ScrollPage *addPage(View *view) override; - virtual bool removePage(NavigatorPage *page) override; - virtual void navigateToPage(NavigatorPage *page) override; + virtual ScrollPage *createPage(View *view, Elm_Object_Item *item) override; + virtual void changePage(TabPage *page) override; private: - void onTabSelected(Evas_Object *obj, Elm_Object_Item *selectedItem); + size_t getPageIndex(TabPage *page) const; + TabPage *getPageByIndex(size_t index) const; + void onPageChanged(Evas_Object *obj, void *eventInfo); void onResize(Evas *e, Evas_Object *obj, void *eventInfo); - Evas_Object *m_Tabbar; Evas_Object *m_Scroller; Evas_Object *m_Box; Evas_Coord m_Width; Evas_Coord m_Height; - bool m_IsNavigating; bool m_IsNavigationEnabled; - std::vector m_Pages; }; } diff --git a/lib-apps-common/inc/Ui/ScrollPage.h b/lib-apps-common/inc/Ui/ScrollPage.h index d7c27f2..f61c17f 100644 --- a/lib-apps-common/inc/Ui/ScrollPage.h +++ b/lib-apps-common/inc/Ui/ScrollPage.h @@ -22,15 +22,17 @@ namespace Ui { + /** + * @brief ScrollNavigator page. + */ class EXPORT_API ScrollPage : public TabPage { public: /** * @brief Create page. * @param[in] tabItem Selector control item - * @param[in] index Page index */ - ScrollPage(Elm_Object_Item *tabItem, size_t index); + ScrollPage(Elm_Object_Item *tabItem); /** * @see NavigatorPage::setExpanded() @@ -41,7 +43,6 @@ namespace Ui friend class ScrollNavigator; virtual Evas_Object *onCreate(Evas_Object *parent) override; - size_t m_Index; Evas_Object *m_Sizer; }; } diff --git a/lib-apps-common/src/Ui/ScrollNavigator.cpp b/lib-apps-common/src/Ui/ScrollNavigator.cpp index acb7371..6a679c2 100644 --- a/lib-apps-common/src/Ui/ScrollNavigator.cpp +++ b/lib-apps-common/src/Ui/ScrollNavigator.cpp @@ -17,29 +17,25 @@ #include "Ui/ScrollNavigator.h" #include "Ui/ScrollPage.h" +#include "Ui/Selector.h" #include "Utils/Callback.h" -#include "Utils/Logger.h" using namespace Ui; -ScrollNavigator::ScrollNavigator() - : Navigator(TypeTabNavigator), - m_Tabbar(nullptr), m_Scroller(nullptr), m_Box(nullptr), +ScrollNavigator::ScrollNavigator(Selector *selector) + : TabNavigator(selector), + m_Scroller(nullptr), m_Box(nullptr), m_Width(0), m_Height(0), - m_IsNavigating(false), m_IsNavigationEnabled(true) + m_IsNavigationEnabled(true) { } void ScrollNavigator::setNavigationEnabled(bool isEnabled) { m_IsNavigationEnabled = isEnabled; - if (isEnabled) { - elm_toolbar_select_mode_set(m_Tabbar, ELM_OBJECT_SELECT_MODE_ALWAYS); - elm_scroller_movement_block_set(getEvasObject(), ELM_SCROLLER_MOVEMENT_NO_BLOCK); - } else { - elm_toolbar_select_mode_set(m_Tabbar, ELM_OBJECT_SELECT_MODE_NONE); - elm_scroller_movement_block_set(getEvasObject(), ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL); - } + getSelector()->setSelectEnabled(isEnabled); + elm_scroller_movement_block_set(getEvasObject(), + isEnabled ? ELM_SCROLLER_MOVEMENT_NO_BLOCK : ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL); } Evas_Object *ScrollNavigator::onCreate(Evas_Object *parent) @@ -63,103 +59,73 @@ Evas_Object *ScrollNavigator::onCreate(Evas_Object *parent) return m_Scroller; } -void ScrollNavigator::onPageAttached(NavigatorPage *page) -{ - m_Tabbar = elm_toolbar_add(getEvasObject()); - elm_toolbar_shrink_mode_set(m_Tabbar, ELM_TOOLBAR_SHRINK_EXPAND); - elm_toolbar_select_mode_set(m_Tabbar, ELM_OBJECT_SELECT_MODE_ALWAYS); - elm_toolbar_transverse_expanded_set(m_Tabbar, EINA_TRUE); - evas_object_smart_callback_add(m_Tabbar, "selected", - (Evas_Smart_Cb) makeCallback(&ScrollNavigator::onTabSelected), this); - - page->setStyle("tabbar/notitle"); - page->setContent("tabbar", m_Tabbar); -} - ScrollPage *ScrollNavigator::addPage(View *view) { - Elm_Object_Item *item = elm_toolbar_item_append(m_Tabbar, nullptr, nullptr, nullptr, nullptr); - ScrollPage *page = new ScrollPage(item, m_Pages.size()); - m_Pages.push_back(page); - - Evas_Object *layout = page->create(getEvasObject()); - page->setContent("elm.swallow.content", view->create(layout)); + auto page = static_cast(TabNavigator::addPage(view)); evas_object_size_hint_min_set(page->m_Sizer, m_Width, m_Height); - elm_box_pack_end(m_Box, layout); - evas_object_show(layout); - + elm_box_pack_end(m_Box, page->getEvasObject()); + evas_object_show(page->getEvasObject()); return page; } -bool ScrollNavigator::removePage(NavigatorPage *page) +ScrollPage *ScrollNavigator::createPage(View *view, Elm_Object_Item *item) { - if (m_Pages.size() == 1) { - return false; - } - - size_t index = static_cast(page)->m_Index; - m_Pages.erase(m_Pages.begin() + index); - - for (; index < m_Pages.size(); ++index) { - --(m_Pages[index]->m_Index); - } - - delete page; - return true; + return new ScrollPage(item); } -void ScrollNavigator::navigateToPage(NavigatorPage *page) +void ScrollNavigator::changePage(TabPage *page) { - if (!m_IsNavigationEnabled) { - return; - } - - m_IsNavigating = true; - + size_t pageIndex = getPageIndex(page); size_t currentIndex = 0; elm_scroller_current_page_get(m_Scroller, (int *) ¤tIndex, nullptr); - ScrollPage *tabPage = static_cast(page); - if (currentIndex != tabPage->m_Index) { - elm_scroller_page_show(m_Scroller, tabPage->m_Index, 0); - } - if (!elm_toolbar_item_selected_get(tabPage->getTabItem())) { - elm_toolbar_item_selected_set(tabPage->getTabItem(), EINA_TRUE); + if (currentIndex != pageIndex) { + elm_scroller_page_show(m_Scroller, pageIndex, 0); } - setCurrentPage(tabPage); +} - m_IsNavigating = false; +size_t ScrollNavigator::getPageIndex(TabPage *page) const +{ + Eina_List *list = elm_box_children_get(m_Box); + size_t index = eina_list_data_idx(list, page->getEvasObject()); + eina_list_free(list); + return index; } -void ScrollNavigator::onTabSelected(Evas_Object *obj, Elm_Object_Item *selectedItem) +TabPage *ScrollNavigator::getPageByIndex(size_t index) const { - if (!m_IsNavigating) { - ScrollPage *page = (ScrollPage *) elm_object_item_data_get(selectedItem); - if (page) { - navigateTo(page->getView()); - } - } + Eina_List *list = elm_box_children_get(m_Box); + Evas_Object *obj = (Evas_Object *) eina_list_nth(list, index); + eina_list_free(list); + return static_cast(Control::getControl(obj)); } void ScrollNavigator::onPageChanged(Evas_Object *obj, void *eventInfo) { - if (!m_IsNavigating) { - int index = 0; - elm_scroller_current_page_get(m_Scroller, &index, nullptr); - navigateTo(m_Pages[index]->getView()); + /* Page count might be invalid until scroller is properly resized, + so we cannot reliably use page index at that point */ + size_t count = 0; + elm_scroller_last_page_get(m_Scroller, (int *) &count, nullptr); + if (count + 1 != getPages().size()) { + return; + } + + size_t index = 0; + elm_scroller_current_page_get(m_Scroller, (int *) &index, nullptr); + if (auto page = getPageByIndex(index)) { + navigateTo(page->getView()); } } void ScrollNavigator::onResize(Evas *e, Evas_Object *obj, void *eventInfo) { evas_object_geometry_get(obj, nullptr, nullptr, &m_Width, &m_Height); - for (auto &&page : m_Pages) { - evas_object_size_hint_min_set(page->m_Sizer, m_Width, m_Height); + for (auto &&page : getPages()) { + auto scrollPage = static_cast(page); + evas_object_size_hint_min_set(scrollPage->m_Sizer, m_Width, m_Height); } if (auto page = static_cast(getCurrentPage())) { - m_IsNavigating = true; - elm_scroller_page_show(m_Scroller, page->m_Index, 0); - m_IsNavigating = false; + elm_scroller_page_show(m_Scroller, getPageIndex(page), 0); } } diff --git a/lib-apps-common/src/Ui/ScrollPage.cpp b/lib-apps-common/src/Ui/ScrollPage.cpp index e5838db..827b694 100644 --- a/lib-apps-common/src/Ui/ScrollPage.cpp +++ b/lib-apps-common/src/Ui/ScrollPage.cpp @@ -20,8 +20,8 @@ using namespace Ui; -ScrollPage::ScrollPage(Elm_Object_Item *tabItem, size_t index) - : TabPage(tabItem), m_Index(index), m_Sizer(nullptr) +ScrollPage::ScrollPage(Elm_Object_Item *tabItem) + : TabPage(tabItem), m_Sizer(nullptr) { } diff --git a/lib-apps-common/src/Ui/TabNavigator.cpp b/lib-apps-common/src/Ui/TabNavigator.cpp index e719171..777105a 100644 --- a/lib-apps-common/src/Ui/TabNavigator.cpp +++ b/lib-apps-common/src/Ui/TabNavigator.cpp @@ -93,13 +93,12 @@ bool TabNavigator::removePage(NavigatorPage *page) void TabNavigator::navigateToPage(NavigatorPage *page) { TabPage *tabPage = static_cast(page); + setCurrentPage(tabPage); changePage(tabPage); if (m_Selector) { m_Selector->setSelectedItem(tabPage->getTabItem()); } - - setCurrentPage(tabPage); } TabPage *TabNavigator::createPage(View *view, Elm_Object_Item *item) @@ -109,11 +108,7 @@ TabPage *TabNavigator::createPage(View *view, Elm_Object_Item *item) void TabNavigator::changePage(TabPage *page) { - if (auto page = static_cast(getCurrentPage())) { - elm_object_content_unset(getEvasObject()); - evas_object_hide(page->getEvasObject()); - } - + evas_object_hide(elm_object_content_unset(getEvasObject())); elm_object_content_set(getEvasObject(), page->getEvasObject()); } @@ -121,7 +116,7 @@ bool TabNavigator::onSelected(void *data) { TabPage *page = (TabPage *) data; if (page) { - navigateToPage(page); + navigateTo(page->getView()); } return true; -- 2.7.4