TizenRefApp-8456 [Gallery] Implement Page synchronization logic 34/127734/1
authorIgor Nazarov <i.nazarov@samsung.com>
Fri, 28 Apr 2017 12:01:30 +0000 (15:01 +0300)
committerIgor Nazarov <i.nazarov@samsung.com>
Fri, 28 Apr 2017 12:01:30 +0000 (15:01 +0300)
- Implemented page synchronization logic;
- Added ImageGrid::getScrolledToItemIndex() method.

Change-Id: Idc8ad947b49ea6651a4c883c8521533020d409be

inc/presenters/Instance.h
inc/presenters/PreviewPage.h
inc/presenters/ThumbnailPage.h
inc/view/ImageGrid.h
src/presenters/Instance.cpp
src/presenters/PreviewPage.cpp
src/presenters/ThumbnailPage.cpp
src/view/ImageGrid.cpp

index be20bd5e1b0a631556d768ccc8b05fd24968da64..4ea05fd1b4573e4baad4f28d368f79a8852cf145 100644 (file)
 
 namespace gallery {
 
-       class Instance final :
+       class Instance final : public ucl::RefCountAware,
                        public ucl::IInstance,
                        public ucl::IInstanceAppControlExt {
        public:
-               Instance(ucl::SysEventProvider &sysEventProvider);
+               Instance(ucl::RefCountObjBase &rc,
+                               ucl::SysEventProvider &sysEventProvider);
                virtual ~Instance();
 
                // IInstance //
@@ -56,6 +57,7 @@ namespace gallery {
                void createNoContentPage();
                void createThumbnailPage();
 
+               void onAlbumChanged();
                void onPageExitRequest(Page &page);
 
                void onSysEvent(const ucl::SysEvent sysEvent);
index 64a0a8cfb0bb804bb58e30adff01b7162a46389a..fe48a8dc2ace50c1af9f524827bca19615b95f2e 100644 (file)
@@ -43,7 +43,7 @@ namespace gallery {
                };
 
        public:
-               void reload();
+               int getCurrentItemIndex() const;
 
        private:
                friend class ucl::RefCountObj<PreviewPage>;
@@ -56,6 +56,10 @@ namespace gallery {
                void selectItem(int itemIndex);
                int getSafeItemIndex(int itemIndex) const;
 
+               void reload();
+               void checkViewerPage();
+
+               void onAlbumChanged();
                bool onEachMedia(MediaItemSRef &&media);
 
                void switchToSelectMode(int itemIndex);
index 07ade6e4aa0f5eb352f08ef7ffca9b438c8f2dd0..d2842296ab9c32ae6afe1ebfc4d61a63b09bcba5 100644 (file)
@@ -38,9 +38,6 @@ namespace gallery {
                        IMediaAlbumSRef m_album;
                };
 
-       public:
-               void reload();
-
        private:
                friend class ucl::RefCountObj<ThumbnailPage>;
                ThumbnailPage(ucl::RefCountObjBase &rc, const ucl::NaviframeSRef &navi,
@@ -49,6 +46,9 @@ namespace gallery {
 
                ucl::Result prepare();
 
+               void reload();
+
+               void onAlbumChanged();
                bool onEachMedia(MediaItemSRef &&media);
 
                void onPageExitRequest(Page &page);
index 3f1c3853a28c70a5d91ace56c7bc6835ee16c910..e6434598e566c8d730840bde6b9bdee81112e5e4 100644 (file)
@@ -89,6 +89,7 @@ namespace gallery {
 
                ucl::Result isItemRealized(int itemIndex) const;
 
+               int getScrolledToItemIndex() const;
                ucl::Result scrollToItem(int itemIndex);
                ucl::Result bringInItem(int itemIndex);
 
index a9f2d953e8b678d2d44e305164fc9523c89e8e1d..e3c8946b0e6711176232993d8aa798acfb8cd7d5 100644 (file)
@@ -40,7 +40,9 @@ namespace gallery {
 
        using namespace ucl;
 
-       Instance::Instance(SysEventProvider &sysEventProvider) :
+       Instance::Instance(RefCountObjBase &rc,
+                       SysEventProvider &sysEventProvider) :
+               RefCountAware(&rc),
                m_sysEventProvider(sysEventProvider),
                m_isScanInProgress(false)
        {
@@ -81,6 +83,9 @@ namespace gallery {
                m_sysEventProvider.addEventHandler(
                                DELEGATE(Instance::onSysEvent, this));
 
+               m_gallery->getAlbum()->addChangeHandler(WEAK_DELEGATE(
+                               Instance::onAlbumChanged, asWeak(*this)));
+
                return RES_OK;
        }
 
@@ -154,24 +159,6 @@ namespace gallery {
                m_isScanInProgress = false;
 
                m_gallery->updateAlbum();
-
-               const auto thumbPage = dynamicRefCast<ThumbnailPage>(m_page);
-
-               if (isNotEmpty(m_gallery->getAlbum())) {
-                       if (thumbPage) {
-                               DLOG("Reloading the ThumbnailPage...");
-                               thumbPage->reload();
-                       } else {
-                               if (m_page) {
-                                       m_page->exitNoTransition();
-                               }
-                               createThumbnailPage();
-                       }
-               } else if (thumbPage) {
-                       DLOG("Exit from ThumbnailPage witout transition...");
-                       thumbPage->exitNoTransition();
-                       createNoContentPage();
-               }
        }
 
        void Instance::onAppControl(app_control_h appControl)
@@ -207,6 +194,21 @@ namespace gallery {
                                build(DELEGATE(Instance::onPageExitRequest, this));
        }
 
+       void Instance::onAlbumChanged()
+       {
+               if (isEmpty(m_gallery->getAlbum())) {
+                       if (dynamic_cast<ThumbnailPage *>(m_page.get())) {
+                               m_page->exitNoTransition();
+                               createNoContentPage();
+                       }
+               } else {
+                       if (dynamic_cast<NoContentPage *>(m_page.get())) {
+                               m_page->exitNoTransition();
+                               createThumbnailPage();
+                       }
+               }
+       }
+
        void Instance::onPageExitRequest(Page &page)
        {
                if (page.isAtBottom()) {
index 0354a0f02bf12d538973e135bd70ea39f52ab915..8cd7fd43d95b0405dba38bcd81d8c9deefd6ca29 100644 (file)
@@ -207,6 +207,10 @@ namespace gallery {
 
        void PreviewPage::reload()
        {
+               // TODO Temp solution.
+               // Need to add synchronization with curent state in the future.
+               switchToNormalMode();
+
                ImageGrid::Unrealizer u(*m_imageGrid);
 
                m_items.clear();
@@ -217,8 +221,13 @@ namespace gallery {
 
                m_imageGrid->setItemCount(m_items.size());
 
-               const auto viewerPage = dynamicRefCast<ViewerPage>(m_page);
-               if (viewerPage) {
+               checkViewerPage();
+       }
+
+       void PreviewPage::checkViewerPage()
+       {
+               if (const ViewerPageSRef viewerPage =
+                               dynamicRefCast<ViewerPage>(m_page)) {
                        const auto mediaId = viewerPage->getMediaId();
                        const auto it = std::find_if(m_items.begin(), m_items.end(),
                                [&mediaId](const ItemUPtr &item)
@@ -234,6 +243,11 @@ namespace gallery {
                }
        }
 
+       int PreviewPage::getCurrentItemIndex() const
+       {
+               return m_imageGrid->getScrolledToItemIndex();
+       }
+
        Result PreviewPage::prepare(const bool enableSelectMode)
        {
                m_imageGrid = ImageGrid::Builder().
@@ -258,6 +272,9 @@ namespace gallery {
 
                m_imageGrid->setItemCount(m_items.size());
 
+               m_album->addChangeHandler(WEAK_DELEGATE(
+                               PreviewPage::onAlbumChanged, asWeak(*this)));
+
                return RES_OK;
        }
 
@@ -285,6 +302,13 @@ namespace gallery {
                return itemIndex;
        }
 
+       void PreviewPage::onAlbumChanged()
+       {
+               if (!isEmpty(m_album)) {
+                       reload();
+               }
+       }
+
        bool PreviewPage::onEachMedia(MediaItemSRef &&media)
        {
                m_items.emplace_back(
@@ -391,6 +415,7 @@ namespace gallery {
 
        void PreviewPage::onPageExitRequest(Page &page)
        {
+               m_page.reset();
                deleteTo();
        }
 }
index e2bb389a31269995f8a3921bca8a1d71e935115a..72c5334051a3e6592cc08fbc50e9df62fca9a6a0 100644 (file)
@@ -150,10 +150,6 @@ namespace gallery {
                                "m_album->forEachMedia() failed!");
 
                m_imageGrid->setItemCount(m_mediaItems.size());
-
-               if (const auto vp = dynamic_cast<PreviewPage *>(m_page.get())) {
-                       vp->reload();
-               }
        }
 
        Result ThumbnailPage::prepare()
@@ -179,9 +175,19 @@ namespace gallery {
 
                m_imageGrid->setItemCount(m_mediaItems.size());
 
+               m_album->addChangeHandler(WEAK_DELEGATE(
+                               ThumbnailPage::onAlbumChanged, asWeak(*this)));
+
                return RES_OK;
        }
 
+       void ThumbnailPage::onAlbumChanged()
+       {
+               if (!isEmpty(m_album)) {
+                       reload();
+               }
+       }
+
        bool ThumbnailPage::onEachMedia(MediaItemSRef &&media)
        {
                m_mediaItems.emplace_back(std::move(media));
@@ -239,6 +245,11 @@ namespace gallery {
 
        void ThumbnailPage::onPageExitRequest(Page &page)
        {
+               if (const PreviewPageSRef previewPage =
+                               dynamicRefCast<PreviewPage>(m_page)) {
+                       m_imageGrid->scrollToItem(previewPage->getCurrentItemIndex());
+               }
+               m_page.reset();
                popTo();
        }
 }
index dc8a55e2ce0851acaef169faaa99939a7d6dc96c..b60d5b9d95c094d094f4bdb1b929e0e1e65b5e35 100644 (file)
@@ -913,6 +913,12 @@ namespace gallery {
                return func(slotIndex, itemOffset);
        }
 
+       int ImageGrid::getScrolledToItemIndex() const
+       {
+               return std::min(static_cast<long>(m_itemCount - 1),
+                       std::lround(1.0 * m_scrollOffset / m_slotSize));
+       }
+
        Result ImageGrid::scrollToItem(const int itemIndex)
        {
                if (m_animator) {