TizenRefApp-9008 [Gallery] Add Mode::OPERATION_VIEW into PreviewPage 66/142366/3
authorIgor Nazarov <i.nazarov@samsung.com>
Thu, 3 Aug 2017 14:05:55 +0000 (17:05 +0300)
committerIgor Nazarov <i.nazarov@samsung.com>
Thu, 3 Aug 2017 17:26:33 +0000 (20:26 +0300)
- Implemented Mode::OPERATION_VIEW support in PreviewPage;
- ImageGrid updated to work with simple file Media Items;
- ImageGrid bug fixes.

Change-Id: I2ba42f29e488902111fe3a0dd62c92510175086c

gallery/presenters/pages/PreviewPage.cpp
gallery/presenters/pages/PreviewPage.h
gallery/view/ImageGrid.cpp

index 6f92c21ef9d58eb95a5548802926cbcc3791b601..0406e13bba64eac0d93544812cd0551078f3ed66 100644 (file)
@@ -30,7 +30,8 @@ namespace gallery { namespace { namespace impl {
        constexpr auto PAGE_SCROLL_IN_FRICTION = 0.25;
 
        enum {
-               MORE_OPTION_ID_DELETE
+               MORE_OPTION_ID_DELETE,
+               MORE_OPTION_ID_SAVE
        };
 }}}
 
@@ -134,9 +135,17 @@ namespace gallery {
 
                void realize()
                {
-                       FAIL_LOG(m_media->getThumbnailPath(
-                                       WEAK_DELEGATE(Item::onThumbnail, asWeak(*this))),
-                                       "getThumbnailPath() failed!");
+                       Result result = RES_FALSE;
+
+                       if (m_media->getFlags() & MediaItem::FLAG_THUMBNAIL) {
+                               FAIL_LOG(result = m_media->getThumbnailPath(
+                                               WEAK_DELEGATE(Item::onThumbnail, asWeak(*this))),
+                                               "getThumbnailPath() failed!");
+                       }
+
+                       if (result != RES_OK) {
+                               updateItem();
+                       }
                }
 
                void unrealize()
@@ -178,10 +187,20 @@ namespace gallery {
                {
                        FAIL_LOG(result, "Failed to get thumbnail!");
 
+                       updateItem(path);
+               }
+
+               void updateItem(std::string thumbnailPath = {})
+               {
                        ImageGrid::ItemParams params = {};
+
                        params.imagePath = m_media->getFilePath();
-                       params.bgImagePath = path;
-                       m_media->getResolution(params.imageWidth, params.imageHeight);
+                       params.bgImagePath = std::move(thumbnailPath);
+
+                       if (m_media->getFlags() & MediaItem::FLAG_RESOLUTION) {
+                               m_media->getResolution(params.imageWidth, params.imageHeight);
+                       }
+
                        addFlags(params);
 
                        m_imageGrid.updateItem(m_index, params);
@@ -270,7 +289,7 @@ namespace gallery {
                                DLOG("Viewed media item was removed.");
                                deleteTo();
                        } else {
-                               m_imageGrid->scrollToItem(it - m_items.begin());
+                               m_imageGrid->scrollToItem(std::distance(m_items.begin(), it));
                        }
                }
        }
@@ -303,30 +322,48 @@ namespace gallery {
                m_content->set(*m_imageGrid);
                ImageGrid::Unrealizer u(*m_imageGrid);
 
-               m_more = MoreOptionsPresenter::Builder().
-                               setParentWidget(m_content).
-                               addOption({impl::MORE_OPTION_ID_DELETE,
+               MoreOptionsPresenter::Builder moreBuilder;
+               moreBuilder.setParentWidget(m_content);
+
+               if (m_startupMode != Mode::OPERATION_VIEW) {
+                       moreBuilder.addOption({impl::MORE_OPTION_ID_DELETE,
                                        STR_DELETE, nullptr,
-                                       getImageTheme(ICON_MORE_OPT_DELETE)}).
-                               build(*this);
+                                       getImageTheme(ICON_MORE_OPT_DELETE)});
+               } else {
+                       moreBuilder.addOption({impl::MORE_OPTION_ID_SAVE,
+                                       STR_SAVE_TO_GEAR, nullptr,
+                                       getImageTheme(ICON_MORE_OPT_SAVE)});
+               }
+
+               m_more = moreBuilder.build(*this);
                if (!m_more) {
                        LOG_RETURN(RES_FAIL, "MoreOptionsPresenter::build() failed!");
                }
                m_content->set(m_more->getWidget(), PageContent::Part::MORE_OPTIONS);
 
-               m_smp = SelectModePresenter::Builder().
-                               setPageContent(m_content).
-                               setFlags(SelectModePresenter::FLAG_NO_MORE_OPTIONS).
-                               build(*this);
-               if (!m_smp) {
-                       LOG_RETURN(RES_FAIL, "SelectModePresenter::build() failed!");
-               }
+               m_more->setListener(asWeakThis<MoreOptionsPresenter::IListener>(this));
 
                m_atspiHelper = AtspiHighlightHelper::newInstance(*this, getWindow());
                if (!m_atspiHelper) {
                        LOG_RETURN(RES_FAIL, "AtspiHighlightHelper::newInstance() failed!");
                }
 
+               if (m_startupMode != Mode::OPERATION_VIEW) {
+                       m_smp = SelectModePresenter::Builder().
+                                       setPageContent(m_content).
+                                       setFlags(SelectModePresenter::FLAG_NO_MORE_OPTIONS).
+                                       build(*this);
+                       if (!m_smp) {
+                               LOG_RETURN(RES_FAIL, "SelectModePresenter::build() failed!");
+                       }
+
+                       m_smp->setListener(asWeakThis<
+                                       SelectModePresenter::IListener>(this));
+
+                       m_atspiHelper->registerWidget(m_smp->getSelectButton());
+                       m_atspiHelper->registerWidget(m_smp->getBottomButton());
+               }
+
                FAIL_RETURN(m_album->forEachMedia(
                                DELEGATE(PreviewPage::onEachMedia, this)),
                                "m_album->forEachMedia() failed!");
@@ -341,13 +378,8 @@ namespace gallery {
                m_album->addChangeHandler(WEAK_DELEGATE(
                                PreviewPage::onAlbumChanged, asWeak(*this)));
 
-               m_more->setListener(asWeakThis<MoreOptionsPresenter::IListener>(this));
-               m_smp->setListener(asWeakThis<SelectModePresenter::IListener>(this));
-
                m_atspiHelper->setEventHandler(WEAK_DELEGATE(
                                PreviewPage::onAtspiHighlight, asWeak(*this)));
-               m_atspiHelper->registerWidget(m_smp->getSelectButton());
-               m_atspiHelper->registerWidget(m_smp->getBottomButton());
 
                if (m_startupMode == Mode::SELECT) {
                        switchToSelectMode();
@@ -413,14 +445,14 @@ namespace gallery {
                                        impl::BRING_IN_SCROLL_FRICTION);
                }
 
-               if (isActive() || m_smp->isActive()) {
+               if (isActive() || (m_smp && m_smp->isActive())) {
                        m_imageGrid->activateRotary();
                }
        }
 
        void PreviewPage::onDeactivateBy(const DeactivatorInfo &info)
        {
-               if (!m_smp->isActive()) {
+               if (!m_smp || !m_smp->isActive()) {
                        m_imageGrid->deactivateRotary();
                }
        }
@@ -461,8 +493,10 @@ namespace gallery {
 
                switch (event) {
                case ImageGrid::ItemEvent::TAP_AND_HOLD:
-                       switchToSelectMode();
-                       toggleItemSelected(itemIndex);
+                       if (m_startupMode != Mode::OPERATION_VIEW) {
+                               switchToSelectMode();
+                               toggleItemSelected(itemIndex);
+                       }
                        break;
                case ImageGrid::ItemEvent::DOUBLE_TAP:
                        openViewer(itemIndex, x, y);
@@ -497,11 +531,11 @@ namespace gallery {
        Elm_Interface_Atspi_Accessible *PreviewPage::onAtspiHighlight(
                                Widget &widget, Elm_Atspi_Relation_Type flowRelation)
        {
-               if (widget == m_smp->getSelectButton()) {
+               if (m_smp && (widget == m_smp->getSelectButton())) {
                        if (flowRelation == ELM_ATSPI_RELATION_FLOWS_TO) {
                                return m_imageGrid->getAccessObject(true);
                        }
-               } else if (widget == m_smp->getBottomButton()) {
+               } else if (m_smp && (widget == m_smp->getBottomButton())) {
                        if (flowRelation == ELM_ATSPI_RELATION_FLOWS_FROM) {
                                return m_imageGrid->getAccessObject(false);
                        }
@@ -523,6 +557,10 @@ namespace gallery {
                        sender.setOpenedDelayed(false, impl::POPUP_SHOW_TIME_SEC);
                        confirmItemsDelete();
                        break;
+               case impl::MORE_OPTION_ID_SAVE:
+                       sender.setOpened(false);
+                       saveCurrentItem();
+                       break;
                default:
                        sender.setOpened(false);
                        WLOG("Unknown option id: %d;", option.id);
@@ -574,6 +612,31 @@ namespace gallery {
                                build(getNaviframe());
        }
 
+       void PreviewPage::saveCurrentItem()
+       {
+               if (m_job) {
+                       LOG_RETURN_VOID(RES_ILLEGAL_STATE, "m_job is not NULL");
+               }
+
+               const int itemIndex = getCurrentItemIndex();
+               if (itemIndex < 0) {
+                       LOG_RETURN_VOID(RES_FAIL, "Invalid item index!");
+               }
+
+               m_job = MediaItem::SaverBuilder().
+                               setItem(m_items[itemIndex]->getMedia()).
+                               build(WEAK_DELEGATE(
+                                               PreviewPage::onSaveJobComplete, asWeak(*this)));
+               if (!m_job) {
+                       LOG_RETURN_VOID(RES_FAIL,
+                                       "MediaItem::SaverBuilder::build() failed!");
+               }
+
+               m_processing = ProcessingPresenter::Builder().
+                               setProcessingText(STR_SAVING).
+                               build(*m_content);
+       }
+
        bool PreviewPage::onAlertEvent(AlertDialog &dialog,
                        AlertDialog::Event event)
        {
@@ -601,7 +664,7 @@ namespace gallery {
                m_job = MediaItem::RemoverBuilder().
                                setItems(items).
                                build(WEAK_DELEGATE(
-                                       PreviewPage::onJobComplete, asWeak(*this)));
+                                               PreviewPage::onRemoveJobComplete, asWeak(*this)));
                if (!m_job) {
                        ELOG("MediaItem::RemoverBuilder::build() failed!");
                        return true;
@@ -614,11 +677,23 @@ namespace gallery {
                return true;
        }
 
-       void PreviewPage::onJobComplete()
+       void PreviewPage::onRemoveJobComplete()
+       {
+               handleJobComplete(STR_DELETED);
+
+               m_album->defragment();
+       }
+
+       void PreviewPage::onSaveJobComplete()
+       {
+               handleJobComplete(STR_SAVED);
+       }
+
+       void PreviewPage::handleJobComplete(TString successText)
        {
                if (m_processing) {
                        if (isGood(m_job->getResult())) {
-                               m_processing->complete(STR_DELETED,
+                               m_processing->complete(std::move(successText),
                                                ProcessingPresenter::IconType::CHECK);
                        } else {
                                m_processing->complete(STR_FAILED);
@@ -627,16 +702,6 @@ namespace gallery {
                }
 
                m_job.reset();
-
-               m_album->defragment();
-       }
-
-       void PreviewPage::closeTempViews()
-       {
-               util::dispose(m_alert);
-               if (m_more) {
-                       m_more->setOpened(false);
-               }
        }
 
        void PreviewPage::switchToSelectMode()
@@ -696,6 +761,14 @@ namespace gallery {
                }
        }
 
+       void PreviewPage::closeTempViews()
+       {
+               util::dispose(m_alert);
+               if (m_more) {
+                       m_more->setOpened(false);
+               }
+       }
+
        void PreviewPage::openViewer(const int itemIndex, const int x, const int y)
        {
                ViewerPage::Builder builder;
index a8f4048be9d4a4ebe7890f5a1f895fc490db43c7..21a639105c4a465dce6d73182adc382e8af0fc81 100644 (file)
@@ -42,7 +42,8 @@ namespace gallery {
        public:
                enum class Mode {
                        NORMAL,
-                       SELECT
+                       SELECT,
+                       OPERATION_VIEW
                };
 
                class Builder final {
@@ -85,18 +86,24 @@ namespace gallery {
                void onAlbumChanged();
                bool onEachMedia(MediaItemSRef media);
 
-               void closeTempViews();
+               void confirmItemsDelete();
+               void saveCurrentItem();
+
+               bool onAlertEvent(AlertDialog &dialog, AlertDialog::Event event);
+               void onRemoveJobComplete();
+               void onSaveJobComplete();
+
+               void handleJobComplete(ucl::TString successText);
+
                void switchToSelectMode();
                void switchToNormalMode();
                void toggleItemSelected(int itemIndex);
-               void confirmItemsDelete();
+
+               void closeTempViews();
                void openViewer(int itemIndex, int x, int y);
 
                void onPageExitRequest(Page &page);
 
-               bool onAlertEvent(AlertDialog &dialog, AlertDialog::Event event);
-               void onJobComplete();
-
                Elm_Interface_Atspi_Accessible *onAtspiHighlight(
                                ucl::Widget &widget, Elm_Atspi_Relation_Type flowRelation);
 
index 7cae9b2759835bbbf0d954e1608c113af44185bb..ef28f5fcb5483fe8643a87dfcaddcc2d0a05f233 100644 (file)
@@ -334,10 +334,6 @@ namespace gallery {
                                                listener->onItemRealized(itemIndex);
                                        }
                                }
-
-                               if (!m_wasUpdated) {
-                                       makeTransparent(m_btn);
-                               }
                        }
 
                        void unrealize()
@@ -382,8 +378,6 @@ namespace gallery {
                                updateImage(params);
                                updateBgImage(params);
 
-                               makeWhite(m_btn);
-
                                m_wasUpdated = true;
 
                                return true;
@@ -418,11 +412,27 @@ namespace gallery {
                                m_isImageEmpty = false;
                                m_isImageLoaded = false;
 
-                               m_imageWidth = std::max(params.imageWidth, 1);
-                               m_imageHeight = std::max(params.imageHeight, 1);
+                               m_imageWidth = params.imageWidth;
+                               m_imageHeight = params.imageHeight;
+
+                               if ((m_imageWidth <= 0) || (m_imageHeight <= 0)) {
+
+                                       setImageLoadSize(0);
+
+                                       evas_object_image_file_set(m_image,
+                                               params.imagePath.c_str(), NULL);
+
+                                       if (!impl::getImageSize(m_image,
+                                                       m_imageWidth, m_imageHeight)) {
+                                               WLOG("Invalid image size!");
+                                               m_imageWidth = 1;
+                                               m_imageHeight = 1;
+                                       }
 
-                               evas_object_image_file_set(m_image,
+                               } else {
+                                       evas_object_image_file_set(m_image,
                                                params.imagePath.c_str(), NULL);
+                               }
 
                                updateImageLoadSize();
 
@@ -449,6 +459,11 @@ namespace gallery {
                                        return;
                                }
 
+                               setImageLoadSize(newLoadSize);
+                       }
+
+                       void setImageLoadSize(const int newLoadSize)
+                       {
                                m_imageLoadSize = newLoadSize;
                                evas_object_image_load_size_set(m_image,
                                                newLoadSize, newLoadSize);
@@ -1224,6 +1239,10 @@ namespace gallery {
                minVisibleOffset = (maxVisibleOffset + extraPadding -
                                ((m_scrollerSize / m_slotSize) - 1) * m_slotSize);
 
+               if (minVisibleOffset > maxVisibleOffset) {
+                       minVisibleOffset = maxVisibleOffset;
+               }
+
                if ((m_scrollOffset >= minVisibleOffset) &&
                                (m_scrollOffset <= maxVisibleOffset)) {
                        return true;
@@ -1584,7 +1603,7 @@ namespace gallery {
        void ImageGrid::updatePadSizes()
        {
                const int spaceSize = (m_scrollerSize -
-                               (std::max((m_scrollerSize / m_slotSize), 1) * m_slotSize));
+                               std::max((m_scrollerSize / m_slotSize) * m_slotSize, 1));
 
                m_padSize1 = std::lround(spaceSize / 2.0);
                m_padSize2 = (spaceSize - m_padSize1 +