#define UI_NAVIFRAME_H
#include "Ui/Navigator.h"
+#include "Ui/NaviframePage.h"
namespace Ui
{
Naviframe();
/**
- * @see Navigator::getCurrentView()
+ * @see Navigator::getCurrentPage()
*/
- virtual View *getCurrentView() const override;
+ virtual NaviframePage *getCurrentPage() const override;
protected:
virtual Evas_Object *onCreate(Evas_Object *parent) override;
- virtual NavigatorPage *attachView(View *view) override;
- virtual void navigateToView(View *view) override;
+ virtual NaviframePage *attachView(View *view) override;
+ virtual void navigateToPage(NavigatorPage *page) override;
Eina_Bool onItemPop(Elm_Object_Item *item);
void onTransition(Evas_Object *obj, void *eventInfo);
namespace Ui
{
class NavigatorPage;
+
+ /**
+ * @brief Navigator base class.
+ */
class EXPORT_API Navigator : public View
{
public:
/**
- * @return Currently displayed view
+ * @return Currently displayed page.
+ */
+ virtual NavigatorPage *getCurrentPage() const = 0;
+
+ /**
+ * @return Page count.
*/
- virtual View *getCurrentView() const = 0;
+ size_t getPageCount() const;
/**
- * @brief Navigate to existing or new View
+ * @brief Navigate to existing or new View.
* @param[in] view View to navigate to
*/
void navigateTo(View *view);
Navigator(NavigatorType type);
/**
- * @brief Notify specified View about navigation
- * @param[in] view View to notify
- * @param[in] isCurrentView Specifies the new state of the @a view
+ * @brief Notify specified Page about navigation.
+ * @param[in] page Page to notify
+ * @param[in] isCurrent The new state of the @a page
*/
- void notifyNavigation(View *view, bool isCurrentView);
+ void notifyNavigation(NavigatorPage *page, bool isCurrent);
/**
* @brief Called after navigateTo() is called for a new view
/**
* @brief Called after navigateTo() is called
- * @param[in] view View to navigate to
+ * @param[in] page Page to navigate to
*/
- virtual void navigateToView(View *view) = 0;
+ virtual void navigateToPage(NavigatorPage *page) = 0;
/**
* @see View::onNavigation()
*/
- virtual void onNavigation(bool isCurrentView) override;
+ virtual void onNavigation(bool isCurrent) override;
/**
* @see View::onBackPressed()
virtual void onMenuPressed() override;
private:
+ friend class NavigatorPage;
+ void onPageDestroy(NavigatorPage *page);
+
NavigatorType m_Type;
+ size_t m_PageCount;
};
}
namespace Ui
{
+ class Navigator;
+ class View;
+
/**
- * @brief Navigator page interface
+ * @brief Navigator page base class.
*/
class EXPORT_API NavigatorPage
{
public:
- virtual ~NavigatorPage() { }
+ NavigatorPage();
+ virtual ~NavigatorPage();
+
+ /**
+ * @return Parent navigator.
+ */
+ Navigator *getNavigator() const;
+
+ /**
+ * @return Contained view.
+ */
+ View *getView() const;
/**
* @brief Set page title.
* @param[in] content Content to set to page part
*/
virtual void setContent(const char *part, Evas_Object *content) = 0;
+
+ private:
+ friend class Navigator;
+ void onNavigatorAttached(Navigator *navigator, View *view);
+
+ Navigator *m_Navigator;
+ View *m_View;
};
}
class EXPORT_API TabPage : public Control, public NavigatorPage
{
public:
- TabPage(size_t index, Elm_Object_Item *tabItem);
+ TabPage(size_t index);
virtual ~TabPage() override;
/**
private:
friend class TabView;
virtual Evas_Object *onCreate(Evas_Object *parent) override;
+ void onTabAttached(Elm_Object_Item *tabItem);
size_t m_Index;
Elm_Object_Item *m_TabItem;
#define UI_TAB_VIEW_H
#include "Ui/Navigator.h"
+#include "Ui/TabPage.h"
#include <vector>
namespace Ui
TabView();
/**
- * @see Navigator::getCurrentView()
+ * @see Navigator::getCurrentPage()
*/
- virtual View *getCurrentView() const override;
+ virtual TabPage *getCurrentPage() const override;
protected:
virtual Evas_Object *onCreate(Evas_Object *parent) override;
virtual void onPageAttached() override;
- virtual NavigatorPage *attachView(View *view) override;
- virtual void navigateToView(View *view) override;
+ virtual TabPage *attachView(View *view) override;
+ virtual void navigateToPage(NavigatorPage *page) override;
private:
static void onTabDestroy(void *data, Evas_Object *obj, void *tabItem);
- void onTabSelect(Evas_Object *obj, void *tabItem);
+ void onTabSelected(Evas_Object *obj, Elm_Object_Item *selectedItem);
void onPageChanged(Evas_Object *obj, void *eventInfo);
void onResize(Evas *e, Evas_Object *obj, void *eventInfo);
Evas_Coord m_Height;
bool m_IsNavigating;
- size_t m_CurrentPage;
- std::vector<View *> m_Views;
+ TabPage *m_CurrentPage;
+ std::vector<TabPage *> m_Pages;
};
}
class EXPORT_API View : public Control
{
public:
+ View();
+ virtual ~View() override;
+
/**
* @brief Get parent Navigator
* @param[in] type Navigator type
NavigatorPage *getPage() const;
protected:
- View();
- virtual ~View() override;
-
/**
* @brief Called after Navigator has navigated to or from this View
- * @param[in] isCurrentView Specifies the new state of this View
+ * @param[in] isCurrent Specifies the new state of this View
*/
- virtual void onNavigation(bool isCurrentView) { }
+ virtual void onNavigation(bool isCurrent) { }
/**
* @brief Called when NavigatorPage is attached to this View
private:
friend class Window;
friend class Navigator;
-
- void onViewAttached(Navigator *stackNavi, Navigator *tabNavi);
- void onPageAttached(NavigatorPage *page);
+ void onNavigatorAttached(Navigator *stackNavi, Navigator *tabNavi, NavigatorPage *page);
Navigator *m_StackNavi;
Navigator *m_TabNavi;
- NavigatorPage *m_NaviPage;
+ NavigatorPage *m_Page;
};
}
{
}
-View *Naviframe::getCurrentView() const
+NaviframePage *Naviframe::getCurrentPage() const
{
Elm_Object_Item *item = elm_naviframe_top_item_get(getEvasObject());
- if (!item) {
- return nullptr;
- }
-
- return static_cast<View*>(elm_object_item_data_get(item));
+ return (NaviframePage *) elm_object_item_data_get(item);
}
Evas_Object *Naviframe::onCreate(Evas_Object *parent)
Evas_Object *naviframe = elm_naviframe_add(parent);
elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_TRUE);
+ evas_object_smart_callback_add(naviframe, "transition,finished",
+ makeCallback(&Naviframe::onTransition), this);
+
return naviframe;
}
-NavigatorPage *Naviframe::attachView(View *view)
+NaviframePage *Naviframe::attachView(View *view)
{
+ notifyNavigation(getCurrentPage(), false);
+
Elm_Object_Item *naviItem = elm_naviframe_item_push(getEvasObject(), nullptr,
- nullptr, nullptr, view->getEvasObject(), nullptr);
- elm_object_item_data_set(naviItem, view);
+ nullptr, nullptr, view->create(getEvasObject()), nullptr);
elm_naviframe_item_pop_cb_set(naviItem, makeCallback(&Naviframe::onItemPop), this);
+
return new NaviframePage(naviItem);
}
-void Naviframe::navigateToView(View *view)
+void Naviframe::navigateToPage(NavigatorPage *page)
{
- if (view != getCurrentView()) {
- NaviframePage *page = static_cast<NaviframePage*>(view->getPage());
- elm_naviframe_item_pop_to(page->m_NaviItem);
+ if (page != getCurrentPage()) {
+ Elm_Object_Item *naviItem = static_cast<NaviframePage *>(page)->m_NaviItem;
+ elm_naviframe_item_pop_to(naviItem);
}
}
Eina_Bool Naviframe::onItemPop(Elm_Object_Item *item)
{
- evas_object_smart_callback_add(getEvasObject(), "transition,finished",
- makeCallback(&Naviframe::onTransition), this);
-
- View *view = static_cast<View*>(elm_object_item_data_get(item));
- notifyNavigation(view, false);
+ NaviframePage *page = static_cast<NaviframePage *>(elm_object_item_data_get(item));
+ notifyNavigation(page, false);
return EINA_TRUE;
}
void Naviframe::onTransition(Evas_Object *obj, void *eventInfo)
{
- notifyNavigation(getCurrentView(), true);
-
- evas_object_smart_callback_del(getEvasObject(), "transition,finished",
- makeCallback(&Naviframe::onTransition));
+ notifyNavigation(getCurrentPage(), true);
}
bool Naviframe::onBackPressed()
*/
#include "Ui/NaviframePage.h"
+
using namespace Ui;
NaviframePage::NaviframePage(Elm_Object_Item *naviItem)
: m_NaviItem(naviItem)
{
+ elm_object_item_data_set(m_NaviItem, this);
}
NaviframePage::~NaviframePage()
void NaviframePage::setTitle(const char *title)
{
+ bool isEnabled = title && *title;
elm_object_item_translatable_part_text_set(m_NaviItem, "elm.text.title", title);
- elm_naviframe_item_title_enabled_set(m_NaviItem, title && *title, EINA_TRUE);
+ elm_naviframe_item_title_enabled_set(m_NaviItem, isEnabled, EINA_TRUE);
}
void NaviframePage::setStyle(const char *style)
*/
#include "Ui/Navigator.h"
+#include "Ui/NavigatorPage.h"
using namespace Ui;
Navigator::Navigator(NavigatorType type)
- : m_Type(type)
+ : m_Type(type), m_PageCount(0)
{
}
+size_t Navigator::getPageCount() const
+{
+ return m_PageCount;
+}
+
void Navigator::navigateTo(View *view)
{
- if (!view || view == getCurrentView()) {
+ if (!view) {
return;
}
- notifyNavigation(getCurrentView(), false);
+ NavigatorPage *page = view->getPage();
+ if (page && page == getCurrentPage()) {
+ return;
+ }
if (view->getNavigator(m_Type) != this) {
Navigator *stackNavi = m_StackNavi;
tabNavi = this;
}
- view->create(getEvasObject());
- view->onViewAttached(stackNavi, tabNavi);
- view->onPageAttached(attachView(view));
+ page = attachView(view);
+ page->onNavigatorAttached(this, view);
+ view->onNavigatorAttached(stackNavi, tabNavi, page);
+
+ ++m_PageCount;
}
- navigateToView(view);
- notifyNavigation(view, true);
+ navigateToPage(page);
}
-void Navigator::notifyNavigation(View *view, bool isCurrentView)
+void Navigator::notifyNavigation(NavigatorPage *page, bool isCurrent)
{
- if (view) {
- view->onNavigation(isCurrentView);
+ if (page) {
+ page->getView()->onNavigation(isCurrent);
}
}
-void Navigator::onNavigation(bool isCurrentView)
+void Navigator::onNavigation(bool isCurrent)
{
- notifyNavigation(getCurrentView(), isCurrentView);
+ notifyNavigation(getCurrentPage(), isCurrent);
}
bool Navigator::onBackPressed()
{
- View *view = getCurrentView();
- return view ? view->onBackPressed() : true;
+ NavigatorPage *page = getCurrentPage();
+ return page ? page->getView()->onBackPressed() : true;
}
void Navigator::onMenuPressed()
{
- View *view = getCurrentView();
- if (view) {
- view->onMenuPressed();
+ NavigatorPage *page = getCurrentPage();
+ if (page) {
+ page->getView()->onMenuPressed();
}
}
+
+void Navigator::onPageDestroy(NavigatorPage *page)
+{
+ --m_PageCount;
+}
--- /dev/null
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "Ui/NavigatorPage.h"
+#include "Ui/Navigator.h"
+
+using namespace Ui;
+
+NavigatorPage::NavigatorPage()
+ : m_Navigator(nullptr), m_View(nullptr)
+{
+}
+
+NavigatorPage::~NavigatorPage()
+{
+ if (m_Navigator) {
+ m_Navigator->onPageDestroy(this);
+ }
+}
+
+Navigator *NavigatorPage::getNavigator() const
+{
+ return m_Navigator;
+}
+
+View *NavigatorPage::getView() const
+{
+ return m_View;
+}
+
+void NavigatorPage::onNavigatorAttached(Navigator *navigator, View *view)
+{
+ m_Navigator = navigator;
+ m_View = view;
+}
*/
#include "Ui/TabPage.h"
-#include "Utils/Logger.h"
#define BUFFER_SIZE 64
using namespace Ui;
-TabPage::TabPage(size_t index, Elm_Object_Item *tabItem)
- : m_Index(index), m_TabItem(tabItem), m_Sizer(nullptr), m_Page(nullptr)
+TabPage::TabPage(size_t index)
+ : m_Index(index), m_TabItem(nullptr), m_Sizer(nullptr), m_Page(nullptr)
{
}
elm_layout_signal_emit(m_Page, buffer, "elm");
elm_object_part_content_set(m_Page, part, content);
}
+
+void TabPage::onTabAttached(Elm_Object_Item *tabItem)
+{
+ m_TabItem = tabItem;
+}
#include "Ui/TabView.h"
#include "Ui/TabPage.h"
#include "Utils/Callback.h"
+#include "Utils/Logger.h"
using namespace Ui;
TabView::TabView()
- : Navigator(TabNavigator), m_Tabbar(nullptr), m_Scroller(nullptr), m_Box(nullptr),
- m_Width(0), m_Height(0), m_IsNavigating(false), m_CurrentPage(0)
+ : Navigator(TabNavigator),
+ m_Tabbar(nullptr), m_Scroller(nullptr), m_Box(nullptr),
+ m_Width(0), m_Height(0), m_IsNavigating(false), m_CurrentPage(nullptr)
{
}
-View *TabView::getCurrentView() const
+TabPage *TabView::getCurrentPage() const
{
- return m_CurrentPage < m_Views.size() ? m_Views[m_CurrentPage] : nullptr;
+ return m_CurrentPage;
}
Evas_Object *TabView::onCreate(Evas_Object *parent)
elm_toolbar_transverse_expanded_set(m_Tabbar, EINA_TRUE);
evas_object_smart_data_set(m_Tabbar, this);
evas_object_smart_callback_add(m_Tabbar, "selected",
- makeCallback(&TabView::onTabSelect), this);
+ (Evas_Smart_Cb) makeCallback(&TabView::onTabSelected), this);
getPage()->setStyle("tabbar/notitle");
getPage()->setContent("tabbar", m_Tabbar);
}
-NavigatorPage *TabView::attachView(View *view)
+TabPage *TabView::attachView(View *view)
{
- Elm_Object_Item *item = elm_toolbar_item_append(m_Tabbar, nullptr, nullptr, nullptr, nullptr);
- elm_object_item_data_set(item, view);
- elm_object_item_del_cb_set(item, &TabView::onTabDestroy);
- m_Views.push_back(view);
+ TabPage *page = new TabPage(m_Pages.size());
+ m_Pages.push_back(page);
- size_t index = m_Views.size() - 1;
- TabPage *page = new TabPage(index, item);
+ Elm_Object_Item *item = elm_toolbar_item_append(m_Tabbar, nullptr, nullptr, nullptr, page);
+ elm_object_item_del_cb_set(item, &TabView::onTabDestroy);
+ page->onTabAttached(item);
Evas_Object *layout = page->create(getEvasObject());
page->setContent("elm.swallow.content", view->create(layout));
return page;
}
-void TabView::navigateToView(View *view)
+void TabView::navigateToPage(NavigatorPage *page)
{
m_IsNavigating = true;
+ notifyNavigation(getCurrentPage(), false);
- TabPage *page = static_cast<TabPage *>(view->getPage());
- elm_scroller_page_show(m_Scroller, page->m_Index, 0);
- elm_toolbar_item_selected_set(page->m_TabItem, EINA_TRUE);
- m_CurrentPage = page->m_Index;
+ TabPage *tabPage = static_cast<TabPage *>(page);
+ elm_scroller_page_show(m_Scroller, tabPage->m_Index, 0);
+ elm_toolbar_item_selected_set(tabPage->m_TabItem, EINA_TRUE);
+ m_CurrentPage = tabPage;
m_IsNavigating = false;
+ notifyNavigation(tabPage, true);
}
void TabView::onTabDestroy(void *data, Evas_Object *obj, void *tabItem)
{
TabView *tabView = (TabView *) evas_object_smart_data_get(obj);
- TabPage *page = static_cast<TabPage *>(((View *) data)->getPage());
+ TabPage *page = (TabPage *) data;
- auto it = tabView->m_Views.begin() + page->m_Index;
- it = tabView->m_Views.erase(it);
+ size_t index = page->m_Index;
+ tabView->m_Pages.erase(tabView->m_Pages.begin() + index);
- for (; it != tabView->m_Views.end(); ++it) {
- page = static_cast<TabPage *>((*it)->getPage());
- --page->m_Index;
+ for (; index < tabView->m_Pages.size(); ++index) {
+ --(tabView->m_Pages[index]->m_Index);
}
}
-void TabView::onTabSelect(Evas_Object *obj, void *tabItem)
+void TabView::onTabSelected(Evas_Object *obj, Elm_Object_Item *selectedItem)
{
- View *view = (View *) elm_object_item_data_get((Elm_Object_Item *) tabItem);
+ TabPage *page = (TabPage *) elm_object_item_data_get(selectedItem);
if (!m_IsNavigating) {
- navigateTo(view);
+ navigateTo(page->getView());
}
}
int index = 0;
elm_scroller_current_page_get(m_Scroller, &index, nullptr);
if (!m_IsNavigating) {
- navigateTo(m_Views[index]);
+ navigateTo(m_Pages[index]->getView());
}
}
void TabView::onResize(Evas *e, Evas_Object *obj, void *eventInfo)
{
evas_object_geometry_get(obj, nullptr, nullptr, &m_Width, &m_Height);
-
- for (auto &&view : m_Views) {
- TabPage *page = static_cast<TabPage *>(view->getPage());
+ for (auto &&page : m_Pages) {
evas_object_size_hint_min_set(page->m_Sizer, m_Width, m_Height);
}
- elm_scroller_page_size_set(m_Scroller, m_Width, m_Height);
- elm_scroller_page_show(m_Scroller, m_CurrentPage, 0);
+ /* FIXME: elm_scroller_page_show() changes page to 0 regardless what index was passed */
+ ecore_job_add([](void *data) {
+ TabView *tabView = (TabView *) data;
+ if (tabView->m_CurrentPage) {
+ elm_scroller_page_show(tabView->m_Scroller, tabView->m_CurrentPage->m_Index, 0);
+ }
+ }, this);
}
using namespace Ui;
View::View()
- : m_StackNavi(nullptr), m_TabNavi(nullptr),
- m_NaviPage(nullptr)
+ : m_StackNavi(nullptr), m_TabNavi(nullptr), m_Page(nullptr)
{
}
View::~View()
{
- delete m_NaviPage;
+ delete m_Page;
}
Navigator *View::getNavigator(NavigatorType type) const
NavigatorPage *View::getPage() const
{
- return m_NaviPage;
+ return m_Page;
}
-void View::onViewAttached(Navigator *stackNavi, Navigator *tabNavi)
+void View::onNavigatorAttached(Navigator *stackNavi, Navigator *tabNavi, NavigatorPage *page)
{
m_StackNavi = stackNavi;
m_TabNavi = tabNavi;
-}
-void View::onPageAttached(NavigatorPage *page)
-{
- if (page != m_NaviPage) {
- delete m_NaviPage;
- m_NaviPage = page;
+ if (page != m_Page) {
+ delete m_Page;
+ m_Page = page;
}
onPageAttached();
void OperationDefaultController::saveLastTab()
{
- Ui::View *currentTab = m_Navigator->getCurrentView();
+ Ui::View *currentTab = m_Navigator->getCurrentPage()->getView();
for (int tab = TabFirst; tab < TabMax; ++tab) {
if (currentTab == m_Tabs[tab]) {
if (tab != TabContacts) {