TizenRefApp-9548 [Gallery] Implement RTL mode support 85/154585/1
authorIgor Nazarov <i.nazarov@samsung.com>
Tue, 10 Oct 2017 13:24:46 +0000 (16:24 +0300)
committerIgor Nazarov <i.nazarov@samsung.com>
Tue, 10 Oct 2017 13:37:08 +0000 (16:37 +0300)
Change-Id: Ife5c1673344ea23ee41b873ad33c9b15930e4804

gallery/presenters/Instance.cpp
gallery/presenters/misc/ProcessingPresenter.cpp
gallery/presenters/pages/PreviewPage.cpp
gallery/presenters/pages/ThumbnailPage.cpp
gallery/presenters/pages/VideoPlayerPage.cpp
gallery/view/ImageGrid.cpp
gallery/view/ImageGrid.h
gallery/view/ImageViewer.cpp
gallery/view/helpers.cpp
gallery/view/helpers.h

index 39c7112bf27245342c488d00a019812a09d6cce6..15daa2d176ca04604ddbbb42fcb58ad61e18ac8f 100644 (file)
@@ -16,8 +16,6 @@
 
 #include "Instance.h"
 
-#include <system_settings.h>
-
 #include "ucl/appfw/helpers.h"
 
 #include "gallery/model/helpers.h"
@@ -73,6 +71,8 @@ namespace gallery {
 
                FAIL_RETURN(setupTheme(), "setupTheme() failed!");
 
+               util::updateElmLanguage();
+
                m_navi = Naviframe::Builder().
                                build(m_win->getConformant());
                if (!m_navi) {
@@ -390,13 +390,7 @@ namespace gallery {
                switch(sysEvent) {
                case SysEvent::LANGUAGE_CHANGED:
                        DLOG("SysEvent::LANGUAGE_CHANGED");
-                       {
-                               char *locale = NULL;
-                               system_settings_get_value_string(
-                                               SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale);
-                               elm_language_set(locale);
-                               free(locale);
-                       }
+                       util::updateElmLanguage();
                        break;
                default:
                        DLOG("sysEvent: %d", sysEvent);
index 4a077e09c8514588cd8aee34ab43354d2548d7ec..bfaa1b66e80c02488a65973c8425ae9d0f9937da 100644 (file)
@@ -210,6 +210,9 @@ namespace gallery {
 
                m_popup->setContent(*icon, impl::PART_TOAST_ICON);
 
+               elm_object_mirrored_automatic_set(*icon, EINA_FALSE);
+               elm_object_mirrored_set(*icon, EINA_FALSE);
+
                m_icon = icon;
 
                return RES_OK;
index a406a4f8b83469dda7be2ab047b698eb9279d764..f38a7c8b5ce7c8b3a95375b84c56ee9754c14fe7 100644 (file)
@@ -266,6 +266,7 @@ namespace gallery {
                                        "m_album->forEachMedia() failed!");
 
                        m_imageGrid->setItemCount(m_items.size());
+                       m_imageGrid->scrollToItem(0);
                }
 
                // TODO Temp solution.
index f33effbd68ded624659202ebe57481a95c8d2586..38845cca82d8c17c8031ca8bd597726f6e2bc61e 100644 (file)
@@ -170,6 +170,7 @@ namespace gallery {
                                "m_album->forEachMedia() failed!");
 
                m_imageGrid->setItemCount(m_mediaItems.size());
+               m_imageGrid->scrollToItem(0);
        }
 
        Result ThumbnailPage::doPrepare(NaviItem &item)
index b2f695d86b0c2430d03b3a1c048200520e0d8ceb..24a76e3450c359241be1a8f599d70792abe5a550 100644 (file)
@@ -196,6 +196,9 @@ namespace gallery {
                        LOG_RETURN(RES_FAIL, "m_content is NULL");
                }
 
+               elm_object_mirrored_automatic_set(*m_content, EINA_FALSE);
+               elm_object_mirrored_set(*m_content, EINA_FALSE);
+
                item = getNaviframe().push(*m_content, NAVIFRAME_NO_CLIP);
                if (!item) {
                        LOG_RETURN(RES_FAIL, "Naviframe::push() failed!");
index f72f8d4fc45dcee352b5a2c15ff617384a40d578..9c14976f16945cec1f95f344b4428bef4e7fc11b 100644 (file)
@@ -818,6 +818,8 @@ namespace gallery {
                if (m_animator) {
                        finalizeTransition();
                }
+               evas_object_event_callback_del_full(m_box, EVAS_CALLBACK_RESIZE,
+                               CALLBACK_A(ImageGrid::onBoxResize), this);
        }
 
        const ImageGrid::Info &ImageGrid::getInfo(const Type type)
@@ -871,7 +873,10 @@ namespace gallery {
 
                createCircleScroller();
 
-               createHighlighKeeper();
+               createHighlightKeeper();
+
+               m_scroller->addEventHandler(SmartEvent{"language,changed"},
+                               WEAK_DELEGATE(ImageGrid::onLanguageChanged, asWeak(*this)));
 
                m_scroller->addEventHandler(WidgetEvent::RESIZE,
                                WEAK_DELEGATE(ImageGrid::onScrollerResize, asWeak(*this)));
@@ -881,6 +886,10 @@ namespace gallery {
 
                m_box.addEventHandler(WidgetEvent::MOVE,
                                WEAK_DELEGATE(ImageGrid::onBoxMove, asWeak(*this)));
+
+               evas_object_event_callback_priority_add(m_box,
+                               EVAS_CALLBACK_RESIZE, EO_CALLBACK_PRIORITY_AFTER,
+                               CALLBACK_A(ImageGrid::onBoxResize), this);
        }
 
        void ImageGrid::createCircleScroller()
@@ -905,12 +914,12 @@ namespace gallery {
                }
        }
 
-       void ImageGrid::createHighlighKeeper()
+       void ImageGrid::createHighlightKeeper()
        {
-               m_highlighKeeper = util::createFakeAccessObject(*m_box.getWindow());
-               UCL_ASSERT(m_highlighKeeper, "m_highlighKeeper is NULL");
+               m_highlightKeeper = util::createFakeAccessObject(*m_box.getWindow());
+               UCL_ASSERT(m_highlightKeeper, "m_highlightKeeper is NULL");
 
-               m_highlighKeeper->addEventHandler(ATSPI_UNHIGHLIGHTED,
+               m_highlightKeeper->addEventHandler(ATSPI_UNHIGHLIGHTED,
                                WEAK_DELEGATE(ImageGrid::onKeeperUnhighlighted, asWeak(*this)));
        }
 
@@ -936,6 +945,7 @@ namespace gallery {
                m_itemCount = count;
 
                if (updateMaxSlotCount()) {
+                       updatePadSizes();
                        updateSlotCount();
                        if (updateMaxBeginSlotIndex()) {
                                updateBeginSlotIndex();
@@ -988,10 +998,6 @@ namespace gallery {
                m_animator = ecore_animator_add(
                                CALLBACK_A(ImageGrid::onAnimationFrame), this);
 
-               evas_object_event_callback_priority_add(m_box,
-                                       EVAS_CALLBACK_RESIZE, EO_CALLBACK_PRIORITY_AFTER,
-                                       CALLBACK_A(ImageGrid::onBoxResize), this);
-
                auto &slotlayout = m_slots[m_beginSlotIndex & 1]->getLayout();
 
                slotlayout.addEventHandler(WidgetEvent::CHANGED_SIZE_HINTS,
@@ -999,7 +1005,7 @@ namespace gallery {
 
                elm_object_signal_callback_add(slotlayout,
                                impl::SIGNAL_TRANSITION_FINISHED.name, "",
-                               CALLBACK_A(ImageGrid::onTransitonFinished), this);
+                               CALLBACK_A(ImageGrid::onTransitionFinished), this);
 
                return RES_OK;
        }
@@ -1014,7 +1020,7 @@ namespace gallery {
                return !!m_animator;
        }
 
-       void ImageGrid::onTransitonFinished(Evas_Object *obj,
+       void ImageGrid::onTransitionFinished(Evas_Object *obj,
                        const char *emission, const char *source)
        {
                evalSlotSizes();
@@ -1039,9 +1045,6 @@ namespace gallery {
                        m_animator = nullptr;
                }
 
-               evas_object_event_callback_del_full(m_box, EVAS_CALLBACK_RESIZE,
-                               CALLBACK_A(ImageGrid::onBoxResize), this);
-
                auto &slotlayout = m_slots[m_beginSlotIndex & 1]->getLayout();
 
                slotlayout.delEventHandler(WidgetEvent::CHANGED_SIZE_HINTS,
@@ -1049,7 +1052,7 @@ namespace gallery {
 
                elm_object_signal_callback_del(slotlayout,
                                "gallery,transition,finished", "",
-                               CALLBACK_A(ImageGrid::onTransitonFinished));
+                               CALLBACK_A(ImageGrid::onTransitionFinished));
        }
 
        Eina_Bool ImageGrid::onAnimationFrame()
@@ -1074,18 +1077,6 @@ namespace gallery {
                }
        }
 
-       void ImageGrid::onBoxResize(Evas *e, Evas_Object *obj, void *eventInfo)
-       {
-               m_scrollOffset = (m_scrollLockIndex * m_slotSize);
-               if (m_info.isHorizontal) {
-                       elm_scroller_region_show(*m_scroller,
-                                       m_scrollOffset, 0, m_scrollerSize, 1);
-               } else {
-                       elm_scroller_region_show(*m_scroller,
-                                       0, m_scrollOffset, 1, m_scrollerSize);
-               }
-       }
-
        void ImageGrid::update()
        {
                Unrealizer(*this);
@@ -1181,14 +1172,15 @@ namespace gallery {
                if (m_animator) {
                        LOG_RETURN(RES_INVALID_OPERATION, "Transition is in progress.");
                }
+               forceBoxSizeCalculate();
                return showItem(itemIndex, elm_scroller_region_bring_in);
        }
 
-       template <class SHOW_FUNC>
-       Result ImageGrid::showItem(const int itemIndex, SHOW_FUNC &&showFunc)
+       template <class SCROLL_FUNC>
+       Result ImageGrid::showItem(const int itemIndex, SCROLL_FUNC &&scrollFunc)
        {
                return doWithCell(itemIndex,
-                       [this, &showFunc](const int slotIndex, const int itemOffset)
+                       [this, &scrollFunc](const int slotIndex, const int itemOffset)
                        {
                                int minVisibleOffset = 0;
                                int maxVisibleOffset = 0;
@@ -1199,16 +1191,33 @@ namespace gallery {
 
                                const int scrollOffset = ((m_scrollOffset > maxVisibleOffset) ?
                                                maxVisibleOffset : minVisibleOffset);
-                               if (m_info.isHorizontal) {
-                                       showFunc(*m_scroller, scrollOffset, 0, m_scrollerSize, 1);
-                               } else {
-                                       showFunc(*m_scroller, 0, scrollOffset, 1, m_scrollerSize);
-                               }
+                               scrollTo(scrollOffset, scrollFunc);
 
                                return RES_OK;
                        });
        }
 
+       template <class SCROLL_FUNC>
+       void ImageGrid::scrollTo(const int offset, SCROLL_FUNC &&scrollFunc)
+       {
+               int scrollOffset = offset;
+
+               if (elm_config_mirrored_get()) {
+                       int childSizeX = 0;
+                       int childSizeY = 0;
+                       elm_scroller_child_size_get(*m_scroller, &childSizeX, &childSizeY);
+
+                       scrollOffset = ((m_info.isHorizontal ? childSizeX : childSizeY) -
+                                       m_scrollerSize - offset);
+               }
+
+               if (m_info.isHorizontal) {
+                       scrollFunc(*m_scroller, scrollOffset, 0, m_scrollerSize, 1);
+               } else {
+                       scrollFunc(*m_scroller, 0, scrollOffset, 1, m_scrollerSize);
+               }
+       }
+
        bool ImageGrid::isItemFullyVisible(int itemIndex)
        {
                int minVisibleOffset = 0;
@@ -1321,7 +1330,7 @@ namespace gallery {
                if (m_highlightID == itemIndex) {
                        m_highlightID = (-1 - itemIndex);
                        if (m_isHighlightLocked) {
-                               elm_atspi_component_highlight_grab(*m_highlighKeeper);
+                               elm_atspi_component_highlight_grab(*m_highlightKeeper);
                        } else {
                                m_highlightTimeout.reset();
                        }
@@ -1609,8 +1618,10 @@ namespace gallery {
                                std::max((m_scrollerSize / m_slotSize) * m_slotSize, 1));
 
                m_padSize1 = std::lround(spaceSize / 2.0);
-               m_padSize2 = (spaceSize - m_padSize1 +
-                               m_info.calcExtraPaddingSize(m_slotSize));
+               m_padSize2 = std::max(spaceSize - m_padSize1 +
+                               m_info.calcExtraPaddingSize(m_slotSize),
+                               (m_scrollerSize - m_padSize1 -
+                                       m_maxSlotCount / 2 * m_slotSize));
        }
 
        void ImageGrid::updateScrollBias()
@@ -1689,8 +1700,20 @@ namespace gallery {
        {
                int scrollOffsetX = 0;
                int scrollOffsetY = 0;
+
+               int scrollerSizeX = 0;
+               int scrollerSizeY = 0;
                elm_scroller_region_get(*m_scroller, &scrollOffsetX, &scrollOffsetY,
-                               nullptr, nullptr);
+                               &scrollerSizeX, &scrollerSizeY);
+
+               if (elm_config_mirrored_get()) {
+                       int childSizeX = 0;
+                       int childSizeY = 0;
+                       elm_scroller_child_size_get(*m_scroller, &childSizeX, &childSizeY);
+
+                       scrollOffsetX = (childSizeX - scrollerSizeX - scrollOffsetX);
+                       scrollOffsetY = (childSizeY - scrollerSizeY - scrollOffsetY);
+               }
 
                return (m_info.isHorizontal ? scrollOffsetX : scrollOffsetY);
        }
@@ -1812,6 +1835,11 @@ namespace gallery {
                --m_eventsLock;
        }
 
+       void ImageGrid::onLanguageChanged(Widget &sender, void *eventInfo)
+       {
+               Unrealizer u(*this);
+       }
+
        void ImageGrid::onScrollerResize(Widget &sender, void *eventInfo)
        {
                handleResize();
@@ -1826,4 +1854,14 @@ namespace gallery {
        {
                handleScrolling();
        }
+
+       void ImageGrid::onBoxResize(Evas *e, Evas_Object *obj, void *eventInfo)
+       {
+               if (m_animator) {
+                       m_scrollOffset = (m_scrollLockIndex * m_slotSize);
+                       scrollTo(m_scrollOffset, elm_scroller_region_show);
+               } else {
+                       handleScrolling();
+               }
+       }
 }
index 2eff5f5793b574c26f68e194a6616b877e3a4f44..8ba129f85985d53f3c1b734d61dc231263fb4d9e 100644 (file)
@@ -143,8 +143,10 @@ namespace gallery {
                template <class FUNC>
                ucl::Result doWithCell(int itemIndex, FUNC &&func) const;
 
-               template <class SHOW_FUNC>
-               ucl::Result showItem(int itemIndex, SHOW_FUNC &&showFunc);
+               template <class SCROLL_FUNC>
+               ucl::Result showItem(int itemIndex, SCROLL_FUNC &&scrollFunc);
+               template <class SCROLL_FUNC>
+               void scrollTo(int offset, SCROLL_FUNC &&scrollFunc);
 
                bool isItemFullyVisible(int itemIndex);
                bool isItemFullyVisible(int itemIndex,
@@ -177,14 +179,13 @@ namespace gallery {
                void finalizeTransition();
                Eina_Bool onAnimationFrame();
                void onSlotResize(Widget &widget, void *eventInfo);
-               void onBoxResize(Evas *e, Evas_Object *obj, void *eventInfo);
-               void onTransitonFinished(Evas_Object *obj, const char *emission,
+               void onTransitionFinished(Evas_Object *obj, const char *emission,
                                const char *source);
 
                // Initialization
                void prepare();
                void createCircleScroller();
-               void createHighlighKeeper();
+               void createHighlightKeeper();
 
                // Actual slots count
                bool updateSlotCount();
@@ -238,9 +239,11 @@ namespace gallery {
                void handleResize();
 
                // Events
+               void onLanguageChanged(Widget &sender, void *eventInfo);
                void onScrollerResize(Widget &sender, void *eventInfo);
                void onScrollerMove(Widget &sender, void *eventInfo);
                void onBoxMove(Widget &sender, void *eventInfo);
+               void onBoxResize(Evas *e, Evas_Object *obj, void *eventInfo);
 
        private:
                const Info &m_info;
@@ -279,7 +282,7 @@ namespace gallery {
                bool m_isInSelectMode;
                bool m_isRotaryActive;
 
-               ucl::ElmWidgetSRef m_highlighKeeper;
+               ucl::ElmWidgetSRef m_highlightKeeper;
                ucl::TimeoutSRef m_highlightTimeout;
                int m_highlightID;
                bool m_isHighlightLocked;
index da3a0c2522447e6bc5375253075cd5b639b66137..33dbf660c76ad949c4b9f2160b42ff2155169cf7 100644 (file)
@@ -128,6 +128,8 @@ namespace gallery {
                                ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
                elm_scroller_single_direction_set(*m_scroller,
                                ELM_SCROLLER_SINGLE_DIRECTION_NONE);
+               elm_object_mirrored_automatic_set(*m_scroller, EINA_FALSE);
+               elm_object_mirrored_set(*m_scroller, EINA_FALSE);
                show(*m_scroller);
 
                expandAndFill(m_layout);
index 52d5e2341fc9efbd7e1cfa3ac30b120d0c4a8172..d2f466dc0653fd1999914d0d4d116dd11c799666 100644 (file)
@@ -18,6 +18,9 @@
 
 #include <vector>
 
+#include <system_settings.h>
+#include <utils_i18n_ulocale.h>
+
 #include "ucl/gui/Window.h"
 #include "ucl/gui/Layout.h"
 
@@ -101,6 +104,26 @@ namespace gallery { namespace util {
 
                return result;
        }
+
+       void updateElmLanguage()
+       {
+               std::string locale = "en_US.utf8";
+               i18n_ulocale_layout_type_e layout = I18N_ULOCALE_LAYOUT_LTR;
+
+               FAIL_LOG(util::getNz(system_settings_get_value_string,
+                               locale, SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE),
+                       "system_settings_get_value_string() failed!");
+
+               const int rc = i18n_ulocale_get_character_orientation(
+                               locale.c_str(), &layout);
+               if (rc != I18N_ERROR_NONE) {
+                       WLOG("i18n_ulocale_get_character_orientation() failed! %d", rc);
+                       layout = I18N_ULOCALE_LAYOUT_LTR;
+               }
+
+               elm_config_mirrored_set(layout == I18N_ULOCALE_LAYOUT_RTL);
+               elm_language_set(locale.c_str());
+       }
 }}
 
 namespace gallery {
index 5a13ab4f8cc76e929458478deb958eae49b27f33..aa0732b9f50ca077ce2c6529fd8ccb96c300c31e 100644 (file)
@@ -27,6 +27,8 @@ namespace gallery { namespace util {
        Eext_Circle_Surface *getCircleSurface(const ucl::ElmWidget &widget);
 
        ucl::ElmWidgetSRef createFakeAccessObject(ucl::ElmWidget &parent);
+
+       void updateElmLanguage();
 }}
 
 namespace gallery {