[Gallery] Implemented More Options in ThumbnailPage 83/128283/3
authorIgor Nazarov <i.nazarov@samsung.com>
Mon, 8 May 2017 10:18:20 +0000 (13:18 +0300)
committerIgor Nazarov <i.nazarov@samsung.com>
Mon, 8 May 2017 10:34:30 +0000 (13:34 +0300)
- Implemented More Options in ThumbnailPage;
- setAutoSelectStartItem() added to PreviewPage::Builder;
- MoreOptionsPresenter added auto close logic if opened when not active;
- ImageGrid HcombInfo slot per page changed to 1;
- ImageGrid fixed getScrolledToItemIndex() calculations;
- fixed std::nullptr_t LLVM build.

Change-Id: I3e66e016391c34344405dd20b2b95fc051a772d6

24 files changed:
inc/presenters/PreviewPage.h
inc/presenters/ThumbnailPage.h
src/presenters/MoreOptionsPresenter.cpp
src/presenters/PreviewPage.cpp
src/presenters/ThumbnailPage.cpp
src/view/ImageGrid.cpp
ucl/inc/ucl/gui/Theme.h
ucl/inc/ucl/gui/Theme.hpp
ucl/inc/ucl/gui/WidgetItem.h
ucl/inc/ucl/gui/WidgetItem.hpp
ucl/inc/ucl/gui/types.h
ucl/inc/ucl/gui/types.hpp
ucl/inc/ucl/misc/Aspect.h
ucl/inc/ucl/misc/Aspect.hpp
ucl/inc/ucl/misc/Variant.h
ucl/inc/ucl/misc/Variant.hpp
ucl/inc/ucl/util/delegation/BaseDelegate.h
ucl/inc/ucl/util/delegation/BaseDelegate.hpp
ucl/inc/ucl/util/memory/SharedRef.h
ucl/inc/ucl/util/memory/SharedRef.hpp
ucl/inc/ucl/util/memory/WeakRef.h
ucl/inc/ucl/util/memory/WeakRef.hpp
ucl/inc/ucl/util/memory/helpers.h
ucl/src/misc/Variant.cpp

index 7a3cc8b13785e643bbefe766322d1fd32ddd1a14..286fa80d4cb26357cc28a396d605dab2823f36cf 100644 (file)
@@ -39,12 +39,14 @@ namespace gallery {
                        Builder &setAlbum(const IMediaAlbumSRef &album);
                        Builder &setStartItemIndex(int index);
                        Builder &setSelectModeStartup(bool value);
+                       Builder &setAutoSelectStartItem(bool value);
                        PreviewPageWRef build(ExitRequestHandler onExitRequest) const;
                private:
                        ucl::NaviframeSRef m_navi;
                        IMediaAlbumSRef m_album;
                        int m_startItemIndex;
                        bool m_selectModeStartup;
+                       bool m_autoSelectStartItem;
                };
 
        public:
index cbf889e9aed636e453d5606af246ba5736ea92cc..ca5431c40679bc1bd5e806edf3afa641e736e649 100644 (file)
 
 #include "view/IImageGridListener.h"
 
+#include "IMoreOptionsListener.h"
+
 namespace gallery {
 
        class ThumbnailPage final : public Page,
-                       private IImageGridListener {
+                       private IImageGridListener,
+                       private IMoreOptionsListener {
        public:
                class Builder {
                public:
@@ -57,8 +60,8 @@ namespace gallery {
 
                // Page //
 
-               virtual void onActivate() final override;
-               virtual void onDeactivate() final override;
+               virtual void onActivateBy(const DeactivatorInfo &info) final override;
+               virtual void onDeactivateBy(const DeactivatorInfo &info) final override;
 
                // IImageGridListener //
 
@@ -67,6 +70,11 @@ namespace gallery {
                virtual void onItemEvent(int itemIndex,
                                int event, int x, int y) final override;
 
+               // IMoreOptionsListener //
+
+               virtual void onMoreOptionClicked(MoreOptionsPresenter &sender,
+                               const MoreOption &option) final override;
+
        private:
                class RealizedItem;
                using RealizedItemUPtr = std::unique_ptr<RealizedItem>;
@@ -77,7 +85,9 @@ namespace gallery {
 
                std::vector<RealizedItemUPtr> m_realizedItems;
 
+               PageContentSRef m_content;
                ImageGridSRef m_imageGrid;
+               MoreOptionsPresenterSRef m_more;
 
                PageWRef m_page;
        };
index 012865c7150687d47619f7329012b597f586bab6..fa2d0597b0047accc3222248cc28c5d625b2461e 100644 (file)
@@ -174,15 +174,20 @@ namespace gallery {
 
        void MoreOptionsPresenter::onOpened(Widget &widget, void *eventInfo)
        {
+               const auto keepAliver = asShared(*this);
                sendDeactivateBy(*m_widget, this);
                activateBy(m_widget.get());
                if (m_listener) {
                        m_listener->onMoreOptionsOpened(*this);
                }
+               if (!isActive()) {
+                       setOpened(false);
+               }
        }
 
        void MoreOptionsPresenter::onClosed(Widget &widget, void *eventInfo)
        {
+               const auto keepAliver = asShared(*this);
                deactivateBy(m_widget.get());
                sendActivateBy(*m_widget, this);
                if (m_listener) {
index 5a25a595462627f84f82e3379443d497f14f70ac..70a5f7e9e9805200e704e500b8a8e0c75380605e 100644 (file)
@@ -50,7 +50,8 @@ namespace gallery {
 
        PreviewPage::Builder::Builder() :
                m_startItemIndex(0),
-               m_selectModeStartup(false)
+               m_selectModeStartup(false),
+               m_autoSelectStartItem(false)
        {
        }
 
@@ -86,6 +87,13 @@ namespace gallery {
                return *this;
        }
 
+       PreviewPage::Builder &PreviewPage::Builder::setAutoSelectStartItem(
+                       const bool value)
+       {
+               m_autoSelectStartItem = value;
+               return *this;
+       }
+
        PreviewPageWRef PreviewPage::Builder::build(
                        const ExitRequestHandler onExitRequest) const
        {
@@ -108,7 +116,7 @@ namespace gallery {
                if (m_startItemIndex > 0) {
                        result->showItem(m_startItemIndex);
                }
-               if (m_selectModeStartup) {
+               if (m_selectModeStartup && m_autoSelectStartItem) {
                        result->selectItem(m_startItemIndex);
                }
 
@@ -276,8 +284,6 @@ namespace gallery {
 
        Result PreviewPage::prepare()
        {
-               ILOG("m_selectModeStartup: %d", m_selectModeStartup);
-
                m_content = PageContent::Builder().
                                setFlags(PageContent::FLAG_BOTTOM_BUTTON |
                                                PageContent::FLAG_SELECT_BUTTON |
@@ -441,7 +447,7 @@ namespace gallery {
        void PreviewPage::onItemEvent(const int itemIndex,
                        const int event, const int x, const int y)
        {
-               if (m_more->isOpened()) {
+               if (!isActive() || m_more->isOpened()) {
                        return;
                }
 
index 20af9fbe2bdef6801aa2bd89ae3f138dfb452e96..76d5c0e54fe30f7c7503c26b12dd79d8de176699 100644 (file)
 #include "model/IMediaAlbum.h"
 #include "model/MediaItem.h"
 
+#include "view/PageContent.h"
 #include "view/ImageGrid.h"
 
+#include "presenters/MoreOptionsPresenter.h"
 #include "presenters/PreviewPage.h"
 
+#include "resources.h"
 #include "common.h"
 
 namespace gallery { namespace { namespace impl {
 
        constexpr auto BRING_IN_SCROLL_FRICTION = 0.5;
        constexpr auto PAGE_SCROLL_IN_FRICTION = 0.5;
+
+       enum {
+               MORE_OPTION_ID_DELETE
+       };
 }}}
 
 namespace gallery {
@@ -156,22 +163,43 @@ namespace gallery {
 
        Result ThumbnailPage::prepare()
        {
-               FAIL_RETURN(m_album->forEachMedia(
-                               DELEGATE(ThumbnailPage::onEachMedia, this)),
-                               "m_album->forEachMedia() failed!");
+               m_content = PageContent::Builder().
+                               setFlags(PageContent::FLAG_MORE_OPTIONS).
+                               build(getNaviframe());
+               if (!m_content) {
+                       LOG_RETURN(RES_FAIL, "PageContent::build() failed!");
+               }
 
                m_imageGrid = ImageGrid::Builder().
                                setListener(this).
                                setType(ImageGrid::Type::HCOMB_3X3).
-                               build(getNaviframe());
+                               build(*m_content);
                if (!m_imageGrid) {
                        LOG_RETURN(RES_FAIL, "ImageGrid::build() failed!");
                }
 
+               m_content->set(*m_imageGrid);
+
+               m_more = MoreOptionsPresenter::Builder().
+                               addOption({impl::MORE_OPTION_ID_DELETE,
+                                       STR_DELETE, nullptr,
+                                       getImageTheme(ICON_MORE_OPT_DELETE)}).
+                               build(*m_content);
+               if (!m_more) {
+                       LOG_RETURN(RES_FAIL, "MoreOptionsPresenter::build() failed!");
+               }
+
+               m_content->set(m_more->getWidget(), PageContent::Part::MORE_OPTIONS);
+               addDeactivatorSource(m_more->getWidget());
+
+               FAIL_RETURN(m_album->forEachMedia(
+                               DELEGATE(ThumbnailPage::onEachMedia, this)),
+                               "m_album->forEachMedia() failed!");
+
                FAIL_RETURN(Page::prepare(
                        [this]()
                        {
-                               return getNaviframe().push(*m_imageGrid, NAVIFRAME_EMPTY);
+                               return getNaviframe().push(*m_content, NAVIFRAME_EMPTY);
                        }),
                        "Page::prepare() failed!");
 
@@ -180,6 +208,8 @@ namespace gallery {
                m_album->addChangeHandler(WEAK_DELEGATE(
                                ThumbnailPage::onAlbumChanged, asWeak(*this)));
 
+               m_more->setListener(asWeakThis<IMoreOptionsListener>(this));
+
                return RES_OK;
        }
 
@@ -196,18 +226,28 @@ namespace gallery {
                return true;
        }
 
-       void ThumbnailPage::onActivate()
+       void ThumbnailPage::onActivateBy(const DeactivatorInfo &info)
        {
-               elm_config_scroll_page_scroll_friction_set(
-                               impl::PAGE_SCROLL_IN_FRICTION);
-               elm_config_scroll_bring_in_scroll_friction_set(
-                               impl::BRING_IN_SCROLL_FRICTION);
+               if (info.deactivator == &getNaviframe()) {
+                       elm_config_scroll_page_scroll_friction_set(
+                                       impl::PAGE_SCROLL_IN_FRICTION);
+                       elm_config_scroll_bring_in_scroll_friction_set(
+                                       impl::BRING_IN_SCROLL_FRICTION);
+
+                       m_more->activateBy(info.deactivator);
+               }
 
-               m_imageGrid->activateRotary();
+               if (isActive()) {
+                       m_imageGrid->activateRotary();
+               }
        }
 
-       void ThumbnailPage::onDeactivate()
+       void ThumbnailPage::onDeactivateBy(const DeactivatorInfo &info)
        {
+               if (info.deactivator == &getNaviframe()) {
+                       m_more->deactivateBy(info.deactivator);
+               }
+
                m_imageGrid->deactivateRotary();
        }
 
@@ -234,7 +274,7 @@ namespace gallery {
        void ThumbnailPage::onItemEvent(const int itemIndex,
                        const int event, const int x, const int y)
        {
-               if (!isActive()) {
+               if (!isActive() || m_more->isOpened()) {
                        return;
                }
 
@@ -253,11 +293,32 @@ namespace gallery {
                m_page = PreviewPage::Builder().
                                setNaviframe(asShared(getNaviframe())).
                                setAlbum(m_album).
-                               setSelectModeStartup(selectModeStartup).
                                setStartItemIndex(itemIndex).
+                               setSelectModeStartup(selectModeStartup).
+                               setAutoSelectStartItem(true).
                                build(DELEGATE(ThumbnailPage::onPageExitRequest, this));
        }
 
+       void ThumbnailPage::onMoreOptionClicked(MoreOptionsPresenter &sender,
+                       const MoreOption &option)
+       {
+               sender.setOpened(false);
+
+               switch (option.id) {
+               case impl::MORE_OPTION_ID_DELETE:
+                       m_page = PreviewPage::Builder().
+                                       setNaviframe(asShared(getNaviframe())).
+                                       setAlbum(m_album).
+                                       setStartItemIndex(m_imageGrid->getScrolledToItemIndex()).
+                                       setSelectModeStartup(true).
+                                       build(DELEGATE(ThumbnailPage::onPageExitRequest, this));
+                       break;
+               default:
+                       WLOG("Unknown option id: %d;", option.id);
+                       break;
+               }
+       }
+
        void ThumbnailPage::onPageExitRequest(Page &page)
        {
                if (const PreviewPageSRef previewPage =
index f1c0df4cdc48bf799e482641aa4e54051b11942b..96b161785ff526663c117ae12b954e656f68045c 100644 (file)
@@ -175,7 +175,7 @@ namespace gallery {
                HcombInfo(const int totalLength,
                                const std::array<LayoutTheme, 2> &slotThemes) :
                        Info(slotThemes, {{(totalLength / 2), ceilDiv<2>(totalLength)}},
-                               impl::HCOMB_SCROLL_LIMIT, (totalLength - 1), true),
+                               impl::HCOMB_SCROLL_LIMIT, 1, true),
                        totalLength(totalLength)
                {
                }
@@ -917,8 +917,11 @@ namespace gallery {
 
        int ImageGrid::getScrolledToItemIndex() const
        {
-               return std::min(static_cast<long>(m_itemCount - 1),
-                       std::lround(1.0 * m_scrollOffset / m_slotSize));
+               const int evenSlotIndex = (std::lround(1.0 * m_scrollOffset /
+                               m_slotSize) * 2);
+               return std::min((m_itemCount - 1), std::min(
+                       m_info.calcItemIndexFromCell(evenSlotIndex, 0),
+                       m_info.calcItemIndexFromCell((evenSlotIndex + 1), 0)));
        }
 
        Result ImageGrid::scrollToItem(const int itemIndex)
index f82d675f94d688e3de7c005a73c080fc8659e253..d8b5b315d217029a84f0f9dd93d562a55ab394f9 100644 (file)
@@ -29,7 +29,7 @@ namespace ucl {
 
        public:
                Theme();
-               Theme(nullptr_t);
+               Theme(std::nullptr_t);
                explicit Theme(Elm_Theme *th, bool isOwner = false);
                Theme(Theme &&tmp);
                Theme &operator=(Theme &&tmp);
index dac1d5763ff28a1ed2b7abc8e42bbdfb11d6d026..65910df3f8912092573f796dd39e35888f176177 100644 (file)
@@ -31,7 +31,7 @@ namespace ucl {
        {
        }
 
-       inline Theme::Theme(nullptr_t) :
+       inline Theme::Theme(std::nullptr_t) :
                Theme()
        {
        }
index edef5e935a446ef42eb250de563ec17e526ef74a..7794444163953b75751a1e35251b3039e759ee47 100644 (file)
@@ -24,7 +24,7 @@ namespace ucl {
        class WidgetItem {
        public:
                constexpr WidgetItem();
-               constexpr WidgetItem(nullptr_t);
+               constexpr WidgetItem(std::nullptr_t);
                explicit WidgetItem(Elm_Object_Item *it);
 
                Elm_Object_Item *getIt() const;
index 9880816cbb53751f00a999cb60b503a2a5f61d3d..26b6cbda19b5496d8985dcd41baefae9655d2887 100644 (file)
@@ -21,7 +21,7 @@ namespace ucl {
        {
        }
 
-       constexpr WidgetItem::WidgetItem(nullptr_t) :
+       constexpr WidgetItem::WidgetItem(std::nullptr_t) :
                WidgetItem()
        {
        }
index ed7d03f9f61f9fbf17c363b984bb1c16c516644c..f4deb132e40ff8f3a2d79aae22ce79857ed3077d 100644 (file)
@@ -105,7 +105,7 @@ namespace ucl {
                const char *style;
 
                constexpr LayoutTheme();
-               constexpr LayoutTheme(nullptr_t);
+               constexpr LayoutTheme(std::nullptr_t);
                constexpr LayoutTheme(const char *klass,
                                const char *group, const char *style);
        };
index 95521a239be4b6bde41adef12225b6b7c2bb8197..7f128c89ad8b8f55f5045948fcebad83713abeeb 100644 (file)
@@ -27,7 +27,7 @@ namespace ucl {
        {
        }
 
-       constexpr LayoutTheme::LayoutTheme(nullptr_t) :
+       constexpr LayoutTheme::LayoutTheme(std::nullptr_t) :
                LayoutTheme()
        {
        }
index 9b40f98f5de03720a2f033d9e8aedda89b42b9dd..082cd91164b46123776f9c1b4193de8c855a1028 100644 (file)
@@ -26,7 +26,7 @@ namespace ucl {
                const char *name;
 
                constexpr Aspect();
-               constexpr Aspect(nullptr_t);
+               constexpr Aspect(std::nullptr_t);
                explicit constexpr Aspect(const char *name);
 
                constexpr operator const char *() const;
index 03127ec39f0db70cba6c83e8e5cbecbca1d28b02..aac7ddb05b17d5c1363eedf3d95ad4a8fce4460f 100644 (file)
@@ -27,7 +27,7 @@ namespace ucl {
        }
 
        template <class CHILD>
-       constexpr Aspect<CHILD>::Aspect(nullptr_t) :
+       constexpr Aspect<CHILD>::Aspect(std::nullptr_t) :
                Aspect()
        {
        }
index a69866b1c755897a7a8ca83d438de3fded4e9d33..3bfa6d6ccb3abf23d19d37f7736938bd9714184c 100644 (file)
@@ -72,7 +72,7 @@ namespace ucl {
 
        public:
                Variant() noexcept;
-               Variant(nullptr_t) noexcept;
+               Variant(std::nullptr_t) noexcept;
 
                Variant(bool aBool) noexcept;
                Variant(int anInt) noexcept;
@@ -83,7 +83,7 @@ namespace ucl {
                Variant(const char *aString, int length);
                Variant(const std::string &aString);
 
-               Variant(nullptr_t, int arrayLength);
+               Variant(std::nullptr_t, int arrayLength);
                Variant(const Variant *anArray, int length);
                Variant(const VarVector &anArray);
                template <size_t N>
index 86ad92eb15b0046bdd1e0c417f12275b87c1ec99..04c66504eb7e98ab2dccc70769476c4188c460c7 100644 (file)
@@ -74,7 +74,7 @@ namespace ucl {
        {
        }
 
-       inline Variant::Variant(nullptr_t) noexcept :
+       inline Variant::Variant(std::nullptr_t) noexcept :
                Variant()
        {
        }
index e49ce22f55f89961da741dceba086a4381c10d2a..d5c518c530b4549eed623419424e8e8f98ea122a 100644 (file)
@@ -35,7 +35,7 @@ namespace ucl {
 
        public:
                constexpr BaseDelegate() noexcept;
-               constexpr BaseDelegate(nullptr_t) noexcept;
+               constexpr BaseDelegate(std::nullptr_t) noexcept;
 
                template <class FUNC_SIG>
                BaseDelegate(const BaseDelegate2<FUNC_SIG, DATA> &d) noexcept;
index 9fe436967c0268ec4cb51fb7fad7a0865d8063f3..4cb9741ffefd70116bc2f70f015fce77e6ee564a 100644 (file)
@@ -25,7 +25,7 @@ namespace ucl {
 
        template <class R, class ...ARGS, class DATA>
        constexpr BaseDelegate<R(ARGS...), DATA>::
-                       BaseDelegate(nullptr_t) noexcept :
+                       BaseDelegate(std::nullptr_t) noexcept :
                BaseDelegate()
        {
        }
index 9e4793fb18cd773cba6eb3a2b9b8fa5aa45e90ef..4bd7ca0bc3db70f9b1240b7975085c3e02533510 100644 (file)
@@ -34,7 +34,7 @@ namespace ucl {
 
        public:
                constexpr SharedRef() noexcept;
-               constexpr SharedRef(nullptr_t) noexcept;
+               constexpr SharedRef(std::nullptr_t) noexcept;
 
                SharedRef(RefCountObjBase *rc, T *ptr) noexcept;
 
index d6b4ee6de694b3f9d81ac9f1a656c3f159c6f327..5b5ad55c64c9b055322f3838857288ec488f3f76 100644 (file)
@@ -24,7 +24,7 @@ namespace ucl {
        }
 
        template <class T>
-       constexpr SharedRef<T>::SharedRef(nullptr_t) noexcept
+       constexpr SharedRef<T>::SharedRef(std::nullptr_t) noexcept
        {
        }
 
index c8edef45230f772b43c0b8bb66d427e0d080ad8e..78450a51f2ab78cebe7a0ffe764046b019ce362e 100644 (file)
@@ -34,7 +34,7 @@ namespace ucl {
 
        public:
                constexpr WeakRef() noexcept;
-               constexpr WeakRef(nullptr_t) noexcept;
+               constexpr WeakRef(std::nullptr_t) noexcept;
 
                WeakRef(RefCountObjBase *rc, T *ptr) noexcept;
 
index 750881576f869154c17d2cf7aadc6cba610376e7..b1681ed662ffbb93b6a3b4504e1755816e7db60a 100644 (file)
@@ -22,7 +22,7 @@ namespace ucl {
        }
 
        template <class T>
-       constexpr WeakRef<T>::WeakRef(nullptr_t) noexcept
+       constexpr WeakRef<T>::WeakRef(std::nullptr_t) noexcept
        {
        }
 
index ad785916119801ad9b77363873e20903c9c0ffd7..4e6c0e0ee7a6ebc77299d7860199e839ecce6754 100644 (file)
@@ -87,28 +87,28 @@ namespace ucl {
 
        template <class T, class = typename std::enable_if<
                std::is_base_of<BaseRef<typename T::Type>, T>::value>::type>
-       inline bool operator==(const T &lhs, nullptr_t rhs) noexcept
+       inline bool operator==(const T &lhs, std::nullptr_t rhs) noexcept
        {
                return !lhs;
        }
 
        template <class T, class = typename std::enable_if<
                std::is_base_of<BaseRef<typename T::Type>, T>::value>::type>
-       bool operator==(nullptr_t lhs, const T &rhs) noexcept
+       bool operator==(std::nullptr_t lhs, const T &rhs) noexcept
        {
                return !rhs;
        }
 
        template <class T, class = typename std::enable_if<
                std::is_base_of<BaseRef<typename T::Type>, T>::value>::type>
-       bool operator!=(const T &lhs, nullptr_t rhs) noexcept
+       bool operator!=(const T &lhs, std::nullptr_t rhs) noexcept
        {
                return lhs;
        }
 
        template <class T, class = typename std::enable_if<
                std::is_base_of<BaseRef<typename T::Type>, T>::value>::type>
-       bool operator!=(nullptr_t lhs, const T &rhs) noexcept
+       bool operator!=(std::nullptr_t lhs, const T &rhs) noexcept
        {
                return rhs;
        }
index 3859bc5f4e37edfed2a3372bd6aba65d086c3903..4509118fd27c2387c981d566215d4975fe3847f2 100644 (file)
@@ -38,7 +38,7 @@ namespace ucl {
                }
        }
 
-       Variant::Variant(nullptr_t, const int arrayLength) :
+       Variant::Variant(std::nullptr_t, const int arrayLength) :
                m_type(static_cast<int>((arrayLength > 0) ? TYPE_ARRAY : TYPE_NIL))
        {
                if (arrayLength > 0) {