Navigation in Screen Zoom 08/49708/18
authorAlbert Malewski <a.malewski@samsung.com>
Tue, 20 Oct 2015 12:06:28 +0000 (14:06 +0200)
committerJanusz Majnert <j.majnert@samsung.com>
Wed, 21 Oct 2015 09:34:17 +0000 (02:34 -0700)
[Issue]    https://bugs.tizen.org/jira/browse/TT-213
[Problem]  User cannot control screen zoom by D-Pad navigation.
[Cause]    Lack of implementation.
[Solution] Refactored screen zoom. Added focus on slider.
[Verify]   Launch browser > Open web page > More Menu > Screen zoom
           Select zoom ratio by left/right arrows > Press OK (enter)
           to confirm.

Change-Id: I4b8bed8bf9f00e76140d9ee020d8d9838e38cbcd

services/SimpleUI/SimpleUI.cpp
services/SimpleUI/SimpleUI.h
services/WebPageUI/WebPageUI.h
services/ZoomUI/ZoomUI.cpp
services/ZoomUI/ZoomUI.h
services/ZoomUI/edc/ZoomUI.edc

index eb15d85..1113a3c 100644 (file)
@@ -241,16 +241,20 @@ void SimpleUI::connectUISignals()
     m_webPageUI->getURIEntry().uriEntryEditingChanged.connect(boost::bind(&SimpleUI::onURLEntryEdited, this));
     m_webPageUI->backPage.connect(boost::bind(&SimpleUI::switchViewToWebPage, this));
     m_webPageUI->backPage.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine<Evas_Object>::back, m_webEngine.get()));
+    m_webPageUI->backPage.connect(boost::bind(&ZoomUI::showNavigation, m_zoomUI.get()));
     m_webPageUI->reloadPage.connect(boost::bind(&SimpleUI::switchViewToWebPage, this));
     m_webPageUI->showTabUI.connect(boost::bind(&SimpleUI::showTabUI, this));
     m_webPageUI->showMoreMenu.connect(boost::bind(&SimpleUI::showMoreMenu, this));
     m_webPageUI->forwardPage.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine<Evas_Object>::forward, m_webEngine.get()));
+    m_webPageUI->forwardPage.connect(boost::bind(&ZoomUI::showNavigation, m_zoomUI.get()));
     m_webPageUI->stopLoadingPage.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine<Evas_Object>::stopLoading, m_webEngine.get()));
+    m_webPageUI->stopLoadingPage.connect(boost::bind(&ZoomUI::showNavigation, m_zoomUI.get()));
     m_webPageUI->reloadPage.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine<Evas_Object>::reload, m_webEngine.get()));
+    m_webPageUI->reloadPage.connect(boost::bind(&ZoomUI::showNavigation, m_zoomUI.get()));
     m_webPageUI->showQuickAccess.connect(boost::bind(&SimpleUI::showQuickAccess, this));
     m_webPageUI->hideQuickAccess.connect(boost::bind(&QuickAccess::hideUI, m_quickAccess));
     m_webPageUI->bookmarkManagerClicked.connect(boost::bind(&SimpleUI::showBookmarkManagerUI, this));
-
+    m_webPageUI->showZoomNavigation.connect(boost::bind(&ZoomUI::showNavigation, m_zoomUI.get()));
 
     M_ASSERT(m_quickAccess.get());
     m_quickAccess->getDetailPopup().openURLInNewTab.connect(boost::bind(&SimpleUI::onOpenURLInNewTab, this, _1, _2));
@@ -263,6 +267,7 @@ void SimpleUI::connectUISignals()
 
     M_ASSERT(m_tabUI.get());
     m_tabUI->closeTabUIClicked.connect(boost::bind(&SimpleUI::closeTabUI, this));
+    m_tabUI->closeTabUIClicked.connect(boost::bind(&ZoomUI::showNavigation, m_zoomUI.get()));
     m_tabUI->newTabClicked.connect(boost::bind(&SimpleUI::newTabClicked, this));
     m_tabUI->newTabClicked.connect(boost::bind(&SimpleUI::settingsPrivateModeSwitch, this, false));
     m_tabUI->tabClicked.connect(boost::bind(&SimpleUI::tabClicked, this,_1));
@@ -274,6 +279,7 @@ void SimpleUI::connectUISignals()
     M_ASSERT(m_historyUI.get());
     m_historyUI->clearHistoryClicked.connect(boost::bind(&SimpleUI::onClearHistoryClicked, this));
     m_historyUI->closeHistoryUIClicked.connect(boost::bind(&SimpleUI::closeHistoryUI, this));
+    m_historyUI->closeHistoryUIClicked.connect(boost::bind(&ZoomUI::showNavigation, m_zoomUI.get()));
     // desktop mode as default
     m_historyUI->historyItemClicked.connect(boost::bind(&SimpleUI::onOpenURLInNewTab, this, _1, true));
 
@@ -288,6 +294,7 @@ void SimpleUI::connectUISignals()
     m_moreMenuUI->historyUIClicked.connect(boost::bind(&SimpleUI::showHistoryUI, this));
     m_moreMenuUI->settingsClicked.connect(boost::bind(&SimpleUI::showSettingsUI, this));
     m_moreMenuUI->closeMoreMenuClicked.connect(boost::bind(&SimpleUI::closeMoreMenu, this));
+    m_moreMenuUI->closeMoreMenuClicked.connect(boost::bind(&ZoomUI::showNavigation, m_zoomUI.get()));
     m_moreMenuUI->switchToMobileMode.connect(boost::bind(&SimpleUI::switchToMobileMode, this));
     m_moreMenuUI->switchToDesktopMode.connect(boost::bind(&SimpleUI::switchToDesktopMode, this));
     m_moreMenuUI->addToBookmarkClicked.connect(boost::bind(&SimpleUI::addToBookmarks, this, _1));
@@ -297,10 +304,12 @@ void SimpleUI::connectUISignals()
 
     M_ASSERT(m_bookmarkManagerUI.get());
     m_bookmarkManagerUI->closeBookmarkManagerClicked.connect(boost::bind(&SimpleUI::closeBookmarkManagerUI, this));
+    m_bookmarkManagerUI->closeBookmarkManagerClicked.connect(boost::bind(&ZoomUI::showNavigation, m_zoomUI.get()));
     m_bookmarkManagerUI->bookmarkItemClicked.connect(boost::bind(&SimpleUI::onBookmarkClicked, this, _1));
 
     M_ASSERT(m_zoomUI.get());
     m_zoomUI->setZoom.connect(boost::bind(&SimpleUI::setZoomFactor, this, _1));
+    m_zoomUI->getZoom.connect(boost::bind(&SimpleUI::getZoomFactor, this));
     m_zoomUI->scrollView.connect(boost::bind(&SimpleUI::scrollView, this, _1, _2));
 }
 
@@ -388,7 +397,6 @@ void SimpleUI::connectModelSignals()
     m_webEngine->uriChanged.connect(boost::bind(&URIEntry::changeUri, &m_webPageUI->getURIEntry(), _1));
     m_webEngine->uriChanged.connect(boost::bind(&MoreMenuUI::setURL, m_moreMenuUI.get(), _1));
     m_webEngine->uriOnTabChanged.connect(boost::bind(&SimpleUI::checkTabId,this,_1));
-    m_webEngine->uriOnTabChanged.connect(boost::bind(&SimpleUI::closeZoomUI, this));
     m_webEngine->webViewClicked.connect(boost::bind(&URIEntry::clearFocus, &m_webPageUI->getURIEntry()));
     m_webEngine->backwardEnableChanged.connect(boost::bind(&WebPageUI::setBackButtonEnabled, m_webPageUI.get(), _1));
     m_webEngine->forwardEnableChanged.connect(boost::bind(&WebPageUI::setForwardButtonEnabled, m_webPageUI.get(), _1));
@@ -459,6 +467,7 @@ void SimpleUI::switchToTab(const tizen_browser::basic_webengine::TabId& tabId)
     }
     BROWSER_LOGD("[%s:%d] swiching to web_view ", __PRETTY_FUNCTION__, __LINE__);
     switchViewToWebPage();
+    m_zoomUI->showNavigation();
 }
 
 bool SimpleUI::isErrorPageActive()
@@ -741,16 +750,21 @@ void SimpleUI::closeZoomUI()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     M_ASSERT(m_zoomUI);
-    m_webPageUI->showTabUI.disconnect(boost::bind(&SimpleUI::closeZoomUI, this));
-    m_webPageUI->showMoreMenu.disconnect(boost::bind(&SimpleUI::closeZoomUI, this));
     m_zoomUI->hideUI();
 }
 
 void SimpleUI::setZoomFactor(int level)
 {
+    BROWSER_LOGD("[%s:%d]", __PRETTY_FUNCTION__, __LINE__);
     m_webEngine->setZoomFactor(level);
 }
 
+int SimpleUI::getZoomFactor()
+{
+    BROWSER_LOGD("[%s:%d] %d", __PRETTY_FUNCTION__, __LINE__, m_webEngine->getZoomFactor());
+    return m_webEngine->getZoomFactor();
+}
+
 void SimpleUI::scrollView(const int& dx, const int& dy)
 {
     m_webEngine->scrollView(dx, dy);
index 5f59329..91d03fe 100644 (file)
@@ -200,6 +200,7 @@ private:
     void showZoomUI();
     void closeZoomUI();
     void setZoomFactor(int level);
+    int getZoomFactor();
     void scrollView(const int& dx, const int& dy);
 
     void showTabUI();
index 07a3672..34b3717 100644 (file)
@@ -67,6 +67,7 @@ public:
     boost::signals2::signal<void ()> hideQuickAccess;
     boost::signals2::signal<void ()> showQuickAccess;
     boost::signals2::signal<void ()> bookmarkManagerClicked;
+    boost::signals2::signal<void ()> showZoomNavigation;
 
     static void faviconClicked(void* data, Evas_Object* obj, const char* emission, const char* source);
 
index dcbe068..b5e9596 100644 (file)
@@ -66,23 +66,41 @@ Evas_Object* ZoomUI::getContent()
 void ZoomUI::showUI()
 {
     evas_object_show(m_layout);
-    evas_object_show(m_nav_layout);
+    evas_object_show(m_zoom_menu);
     evas_object_show(m_zoom_slider);
+    m_keyDownHandler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, this);
+    m_keyUpHandler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_up_cb, this);
+    int zoomFactor = *(getZoom());
+    elm_slider_value_set(m_zoom_slider, calculateSliderValue(zoomFactor));
 }
 
 void ZoomUI::hideUI()
 {
     evas_object_hide(m_zoom_slider);
     evas_object_hide(m_nav_layout);
+    evas_object_hide(m_zoom_menu);
     evas_object_hide(m_layout);
+    ecore_event_handler_del(m_keyDownHandler);
+    ecore_event_handler_del(m_keyUpHandler);
 }
 
 void ZoomUI::show(Evas_Object* parent)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     init(parent);
-    createLayout(parent);
+    if (!m_layout)
+        createLayout(parent);
     showUI();
+    elm_object_focus_set(m_zoom_slider, EINA_TRUE);
+}
+
+void ZoomUI::showNavigation()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    M_ASSERT(m_nav_layout);
+    int zoomFactor = *(getZoom());
+    if (zoomFactor > ZOOM_DEFAULT)
+        evas_object_show(m_nav_layout);
 }
 
 void ZoomUI::createLayout(Evas_Object *parent)
@@ -93,25 +111,31 @@ void ZoomUI::createLayout(Evas_Object *parent)
     elm_layout_file_set(m_layout, m_edjFilePath.c_str(), "zoom-layout");
     evas_object_size_hint_weight_set(m_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     evas_object_size_hint_align_set(m_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
-
     createZoomSlider();
     createNavigationButtons();
 }
 
 void ZoomUI::createZoomSlider()
 {
-    m_zoom_slider = elm_slider_add(m_layout);
+    m_zoom_menu = elm_layout_add(m_layout);
+    elm_layout_file_set(m_zoom_menu, m_edjFilePath.c_str(), "zoom-menu");
+    evas_object_size_hint_weight_set(m_zoom_menu, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(m_zoom_menu, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+    m_zoom_slider = elm_slider_add(m_zoom_menu);
     evas_object_size_hint_weight_set(m_zoom_slider, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     evas_object_size_hint_align_set(m_zoom_slider, EVAS_HINT_FILL, EVAS_HINT_FILL);
     evas_object_smart_callback_add(m_zoom_slider, "changed", _zoom_slider_changed, this);
     elm_object_style_set(m_zoom_slider, "default");
     elm_slider_horizontal_set(m_zoom_slider, EINA_TRUE);
     elm_slider_min_max_set(m_zoom_slider, 1, 6);
-    elm_slider_step_set(m_zoom_slider, 1);
-    elm_slider_value_set(m_zoom_slider, 3);
-    elm_slider_indicator_format_set(m_zoom_slider, "%1.0f");
+    elm_slider_step_set(m_zoom_slider, 0.2);
+    int zoomFactor = *(getZoom());
+    elm_slider_value_set(m_zoom_slider, calculateSliderValue(zoomFactor));
+    elm_slider_indicator_show_set(m_zoom_slider, EINA_FALSE);
 
-    elm_object_part_content_set(m_layout, "slider_swallow", m_zoom_slider);
+    elm_object_part_content_set(m_zoom_menu, "slider_swallow", m_zoom_slider);
+    evas_object_event_callback_add(m_zoom_slider, EVAS_CALLBACK_KEY_DOWN, _zoom_value_confirmed, this);
 }
 
 void ZoomUI::createNavigationButtons()
@@ -120,35 +144,34 @@ void ZoomUI::createNavigationButtons()
     elm_layout_file_set(m_nav_layout, m_edjFilePath.c_str(), "nav-layout");
     evas_object_size_hint_weight_set(m_nav_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     evas_object_size_hint_align_set(m_nav_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
-    elm_object_part_content_set(m_layout, "nav_buttons", m_nav_layout);
-
-    Evas_Object* icon = elm_icon_add(m_nav_layout);
-    setImageFile(icon, LEFT, false);
-    evas_object_smart_callback_add(icon, "clicked", _left_button_clicked, this);
-    evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_left_button, this);
-    evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_left_button, this);
-    elm_object_part_content_set(m_nav_layout, "left_button", icon);
-    
-    icon = elm_icon_add(m_nav_layout);
-    setImageFile(icon, RIGHT, false);
-    evas_object_smart_callback_add(icon, "clicked", _right_button_clicked, this);
-    evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_right_button, this);
-    evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_right_button, this);
-    elm_object_part_content_set(m_nav_layout, "right_button", icon);
-
-    icon = elm_icon_add(m_nav_layout);
-    setImageFile(icon, DOWN, false);
-    evas_object_smart_callback_add(icon, "clicked", _down_button_clicked, this);
-    evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_down_button, this);
-    evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_down_button, this);
-    elm_object_part_content_set(m_nav_layout, "down_button", icon);
-
-    icon = elm_icon_add(m_nav_layout);
-    setImageFile(icon, UP, false);
-    evas_object_smart_callback_add(icon, "clicked", _up_button_clicked, this);
-    evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_up_button, this);
-    evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_up_button, this);
-    elm_object_part_content_set(m_nav_layout, "up_button", icon);
+
+    m_leftArrow = elm_icon_add(m_nav_layout);
+    setImageFile(m_leftArrow, LEFT, false);
+    evas_object_smart_callback_add(m_leftArrow, "clicked", _left_button_clicked, this);
+    evas_object_event_callback_add(m_leftArrow, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_left_button, this);
+    evas_object_event_callback_add(m_leftArrow, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_left_button, this);
+    elm_object_part_content_set(m_nav_layout, "left_button", m_leftArrow);
+
+    m_rightArrow = elm_icon_add(m_nav_layout);
+    setImageFile(m_rightArrow, RIGHT, false);
+    evas_object_smart_callback_add(m_rightArrow, "clicked", _right_button_clicked, this);
+    evas_object_event_callback_add(m_rightArrow, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_right_button, this);
+    evas_object_event_callback_add(m_rightArrow, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_right_button, this);
+    elm_object_part_content_set(m_nav_layout, "right_button", m_rightArrow);
+
+    m_downArrow = elm_icon_add(m_nav_layout);
+    setImageFile(m_downArrow, DOWN, false);
+    evas_object_smart_callback_add(m_downArrow, "clicked", _down_button_clicked, this);
+    evas_object_event_callback_add(m_downArrow, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_down_button, this);
+    evas_object_event_callback_add(m_downArrow, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_down_button, this);
+    elm_object_part_content_set(m_nav_layout, "down_button", m_downArrow);
+
+    m_upArrow = elm_icon_add(m_nav_layout);
+    setImageFile(m_upArrow, UP, false);
+    evas_object_smart_callback_add(m_upArrow, "clicked", _up_button_clicked, this);
+    evas_object_event_callback_add(m_upArrow, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_up_button, this);
+    evas_object_event_callback_add(m_upArrow, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_up_button, this);
+    elm_object_part_content_set(m_nav_layout, "up_button", m_upArrow);
 }
 
 void ZoomUI::clearItems()
@@ -159,6 +182,7 @@ void ZoomUI::clearItems()
 
 void ZoomUI::setImageFile(Evas_Object* obj, int direction, bool focused)
 {
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     switch (direction) {
         case LEFT:  elm_image_file_set(obj, m_edjFilePath.c_str(), focused ? "ic_zoom_indicator_left_foc.png" : "ic_zoom_indicator_left_nor.png");
                     break;
@@ -201,6 +225,79 @@ void ZoomUI::_zoom_slider_changed(void *data, Evas_Object *obj, void *event_info
     }
 }
 
+void ZoomUI::_zoom_value_confirmed(void* data, Evas*, Evas_Object* obj, void* event_info)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    Evas_Event_Key_Down* ev = static_cast<Evas_Event_Key_Down*>(event_info);
+
+    if (!data || !ev || !ev->keyname)
+        return;
+
+    ZoomUI* self = static_cast<ZoomUI*>(data);
+    if (std::string(ev->keyname) == "Return") {
+        int val = (int)elm_slider_value_get(self->m_zoom_slider);
+        BROWSER_LOGD("[%s:%d] val: %d", __PRETTY_FUNCTION__, __LINE__, val);
+        if (val > 3) {
+            BROWSER_LOGD("[%s:%d] value is greater than 3", __PRETTY_FUNCTION__, __LINE__);
+            evas_object_show(self->m_nav_layout);
+        } else {
+            BROWSER_LOGD("[%s:%d] value is smaller or equal to 3", __PRETTY_FUNCTION__, __LINE__);
+            evas_object_hide(self->m_nav_layout);
+        }
+        evas_object_hide(self->m_zoom_menu);
+    }
+}
+
+Eina_Bool ZoomUI::_key_down_cb(void* data, int type, void* event_info)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    Ecore_Event_Key* ev = static_cast<Ecore_Event_Key*>(event_info);
+
+    if (!data || !ev || !ev->keyname)
+        return EINA_FALSE;
+
+    ZoomUI* self = static_cast<ZoomUI*>(data);
+    if (std::string(ev->keyname) == "Left") {
+        _left_button_clicked(data, self->m_leftArrow, event_info);
+        _cb_focus_in_left_button(data, nullptr, self->m_leftArrow, event_info);
+    } else if (std::string(ev->keyname) == "Right") {
+        _right_button_clicked(data, self->m_rightArrow, event_info);
+        _cb_focus_in_right_button(data, nullptr, self->m_rightArrow, event_info);
+    } else if (std::string(ev->keyname) == "Up") {
+        _up_button_clicked(data, self->m_upArrow, event_info);
+        _cb_focus_in_up_button(data, nullptr, self->m_upArrow, event_info);
+    } else if (std::string(ev->keyname) == "Down") {
+        _down_button_clicked(data, self->m_downArrow, event_info);
+        _cb_focus_in_down_button(data, nullptr, self->m_downArrow, event_info);
+    } else
+        return EINA_FALSE;
+
+    return EINA_TRUE;
+}
+
+Eina_Bool ZoomUI::_key_up_cb(void* data, int type, void* event_info)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    Ecore_Event_Key* ev = static_cast<Ecore_Event_Key*>(event_info);
+
+    if (!data || !ev || !ev->keyname)
+        return EINA_FALSE;
+
+    ZoomUI* self = static_cast<ZoomUI*>(data);
+    if (std::string(ev->keyname) == "Left") {
+        _cb_focus_out_left_button(data, nullptr, self->m_leftArrow, event_info);
+    } else if (std::string(ev->keyname) == "Right") {
+        _cb_focus_out_right_button(data, nullptr, self->m_rightArrow, event_info);
+    } else if (std::string(ev->keyname) == "Up") {
+        _cb_focus_out_up_button(data, nullptr, self->m_upArrow, event_info);
+    } else if (std::string(ev->keyname) == "Down") {
+        _cb_focus_out_down_button(data, nullptr, self->m_downArrow, event_info);
+    } else
+        return EINA_FALSE;
+
+    return EINA_TRUE;
+}
+
 void ZoomUI::_left_button_clicked(void * data, Evas_Object * obj, void * event_info)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
@@ -317,6 +414,23 @@ void ZoomUI::_cb_focus_out_down_button(void * data, Evas *, Evas_Object *obj, vo
     }
 }
 
+int ZoomUI::calculateSliderValue(int zoom)
+{
+    BROWSER_LOGD("[%s:%d] zoom factor: %d", __PRETTY_FUNCTION__, __LINE__, zoom);
+    if (zoom >= ZOOM_300)
+        return 6;
+    else if (zoom >= ZOOM_200)
+        return 5;
+    else if (zoom >= ZOOM_150)
+        return 4;
+    else if (zoom >= ZOOM_100)
+        return 3;
+    else if (zoom >= ZOOM_75)
+        return 2;
+    else if (zoom < ZOOM_75)
+        return 1;
+}
+
 
 }
 }
index e6206a8..a2966f2 100644 (file)
@@ -44,16 +44,19 @@ public:
     std::string getName();
 
     void show(Evas_Object* parent);
+    void showNavigation();
     void clearItems();
 
     boost::signals2::signal<void ()> closeZoomUI;
     boost::signals2::signal<void (int)> setZoom;
+    boost::signals2::signal<int ()> getZoom;
     boost::signals2::signal<void (const int&, const int&)> scrollView;
 private:
     void createLayout(Evas_Object* parent);
     void createZoomSlider();
     void createNavigationButtons();
     void setImageFile(Evas_Object* obj, int direction, bool focused);
+    int calculateSliderValue(int zoom);
 
     static void _zoom_slider_changed(void * data, Evas_Object * obj, void * event_info);
     static void _left_button_clicked(void * data, Evas_Object * obj, void * event_info);
@@ -69,12 +72,22 @@ private:
     static void _cb_focus_out_up_button(void * data, Evas *, Evas_Object *obj, void *);
     static void _cb_focus_in_down_button(void * data, Evas *, Evas_Object *obj, void *);
     static void _cb_focus_out_down_button(void * data, Evas *, Evas_Object *obj, void *);
+    static Eina_Bool _key_down_cb(void* data, int type, void* event_info);
+    static Eina_Bool _key_up_cb(void* data, int type, void* event_info);
+    static void _zoom_value_confirmed(void* data, Evas* e, Evas_Object* obj, void* event_info);
 
     std::string m_edjFilePath;
     Evas_Object* m_layout;
     Evas_Object* m_zoom_slider;
+    Evas_Object* m_zoom_menu;
     Evas_Object* m_nav_layout;
     Evas_Object* m_parent;
+    Evas_Object* m_leftArrow;
+    Evas_Object* m_rightArrow;
+    Evas_Object* m_upArrow;
+    Evas_Object* m_downArrow;
+    Ecore_Event_Handler* m_keyDownHandler;
+    Ecore_Event_Handler* m_keyUpHandler;
 
     int m_current_translation_x;
     int m_current_translation_y;
index e3da119..07edd64 100644 (file)
@@ -31,7 +31,6 @@ RESOURCE_IMAGE_LOSSY("ic_zoom_indicator_up_nor.png");
 
     group {
         name: "zoom-layout";
-        data.item: "contents" "close_button";
 
         parts {
         
@@ -39,7 +38,61 @@ RESOURCE_IMAGE_LOSSY("ic_zoom_indicator_up_nor.png");
                 type: RECT;
                 mouse_events: 1;
                 description { state: "default" 0.0;
-                    color: 0 0 0 50;
+                    color: 0 0 0 0;
+                    visible: 0;
+                    min: WIDTH HEIGHT;
+                    max: WIDTH HEIGHT;
+                    align: 0.0 0.0;
+                    rel1 {relative: 0.0 0.0; offset: 0 104;}
+                    rel2 {relative: 1.0 1.0;}
+                }
+            }
+
+            part {
+                name: "zoom_menu";
+                type : SWALLOW;
+                scale: 1;
+                description {
+                    state: "default" 0.0;
+                    visible: 1;
+                    min: 700 300;
+                    max: 700 300;
+                    align: 0.0 0.0;
+                    fixed: 1 1;
+                    rel1 { relative: 0.0 0.0; to: "bg"; }
+                    rel2 { relative: 1.0 1.0; to: "bg"; }
+                }
+            }
+
+            part {
+                name: "nav_buttons";
+                type : SWALLOW;
+                scale: 1;
+                description {
+                    state: "default" 0.0;
+                    visible: 1;
+                    min: WIDTH HEIGHT;
+                    max: WIDTH HEIGHT;
+                    align: 0.0 0.0;
+                    fixed: 0 0;
+                    rel1 { relative: 0.0 0.0; to: "bg"; }
+                    rel2 { relative: 1.0 1.0; to: "bg"; }
+                }
+            }
+
+        }
+    }
+
+    group {
+        name: "zoom-menu";
+
+        parts {
+
+            part { name: "bg";
+                type: RECT;
+                mouse_events: 1;
+                description { state: "default" 0.0;
+                    color: 0 0 0 0;
                     visible: 1;
                     min: WIDTH HEIGHT;
                     max: WIDTH HEIGHT;
@@ -171,24 +224,6 @@ RESOURCE_IMAGE_LOSSY("ic_zoom_indicator_up_nor.png");
                     }
                 }
             }
-
-
-            part { 
-                name: "nav_buttons";
-                type : SWALLOW;
-                scale: 1;
-                description {
-                    state: "default" 0.0;
-                    visible: 1;
-                    min: WIDTH HEIGHT;
-                    max: WIDTH HEIGHT;
-                    align: 0.0 0.0;
-                    fixed: 0 0;
-                    rel1 { relative: 0.0 0.0; to: "bg"; }
-                    rel2 { relative: 1.0 1.0; to: "bg"; }
-                }
-            }
-            
         }
     }
 
@@ -198,6 +233,20 @@ RESOURCE_IMAGE_LOSSY("ic_zoom_indicator_up_nor.png");
         max: WIDTH HEIGHT;
         data.item: "contents" "left_button right_button up_button down_button";
         parts {
+
+            part { name: "bg";
+                type: RECT;
+                mouse_events: 1;
+                description { state: "default" 0.0;
+                    visible: 0;
+                    min: WIDTH HEIGHT;
+                    max: WIDTH HEIGHT;
+                    align: 0.0 0.0;
+                    rel1 {relative: 0.0 0.0; offset: 0 104;}
+                    rel2 {relative: 1.0 1.0;}
+                }
+            }
+
             part {
                 name: "left_button";
                 type: SWALLOW;
@@ -210,8 +259,8 @@ RESOURCE_IMAGE_LOSSY("ic_zoom_indicator_up_nor.png");
                     fixed: 1 1;
                     min: 90 90;
                     max: 90 90;
-                    rel1 { relative: 0.0 0.0; offset: 38 0;}
-                    rel2 { relative: 1.0 1.0;}
+                    rel1 {to: "bg"; relative: 0.0 0.0; offset: 38 0;}
+                    rel2 {to: "bg"; relative: 1.0 1.0;}
                 }
             }
             part {
@@ -226,8 +275,8 @@ RESOURCE_IMAGE_LOSSY("ic_zoom_indicator_up_nor.png");
                     fixed: 1 1;
                     min: 90 90;
                     max: 90 90;
-                    rel1 { relative: 0.0 0.0; }
-                    rel2 { relative: 1.0 1.0; offset: -38 0; }
+                    rel1 {to: "bg"; relative: 0.0 0.0; }
+                    rel2 {to: "bg"; relative: 1.0 1.0; offset: -38 0; }
                 }
             }
             part {
@@ -242,8 +291,8 @@ RESOURCE_IMAGE_LOSSY("ic_zoom_indicator_up_nor.png");
                     fixed: 1 1;
                     min: 90 90;
                     max: 90 90;
-                    rel1 { relative: 0.0 0.0; offset: 0 38; }
-                    rel2 { relative: 1.0 1.0; }
+                    rel1 {to: "bg"; relative: 0.0 0.0; offset: 0 38; }
+                    rel2 {to: "bg"; relative: 1.0 1.0; }
                 }
             }
             part {
@@ -258,8 +307,8 @@ RESOURCE_IMAGE_LOSSY("ic_zoom_indicator_up_nor.png");
                     fixed: 1 1;
                     min: 90 90;
                     max: 90 90;
-                    rel1 { relative: 0.0 0.0; }
-                    rel2 { relative: 1.0 1.0; offset: 0 -38; }
+                    rel1 {to: "bg";  relative: 0.0 0.0; }
+                    rel2 {to: "bg";  relative: 1.0 1.0; offset: 0 -38; }
                 }
             }
         }