From f99a2f0dcac35b2b6e1b6b6393326d20997ccbf0 Mon Sep 17 00:00:00 2001 From: Igor Nazarov Date: Mon, 22 May 2017 19:31:39 +0300 Subject: [PATCH] TizenRefApp-8534 [Gallery] Change using elm_image on evas_image in imageGrid - elm_image was replaced with evas_object_image; - Added MoreOptionsPresenter::setOpenedDelayed() method. Change-Id: I2b07226fae125acfc671f056bdf4b34e88b6986e --- inc/presenters/MoreOptionsPresenter.h | 9 +++ src/presenters/MoreOptionsPresenter.cpp | 48 +++++++++++++- src/presenters/PreviewPage.cpp | 6 +- src/presenters/ThumbnailPage.cpp | 6 +- src/view/ImageGrid.cpp | 88 ++++++++++++++++--------- 5 files changed, 121 insertions(+), 36 deletions(-) diff --git a/inc/presenters/MoreOptionsPresenter.h b/inc/presenters/MoreOptionsPresenter.h index b765dd1..8b34e68 100644 --- a/inc/presenters/MoreOptionsPresenter.h +++ b/inc/presenters/MoreOptionsPresenter.h @@ -45,6 +45,8 @@ namespace gallery { void setOpened(bool isOpened); bool isOpened() const; + void setOpenedDelayed(bool isOpened, double timeout); + private: using MoreOptionsCSRef = ucl::SharedRef; @@ -57,6 +59,11 @@ namespace gallery { ucl::Result prepare(ucl::ElmWidget &parent); ucl::Result addItem(const MoreOption &option); + bool resetTimer(double timeout); + void stopTimer(); + + Eina_Bool onTimer(); + void onOpened(ucl::Widget &widget, void *eventInfo); void onClosed(ucl::Widget &widget, void *eventInfo); void onItemClicked(ucl::Widget &widget, void *eventInfo); @@ -67,6 +74,8 @@ namespace gallery { ucl::HashMap m_map; ucl::ElmWidgetSRef m_widget; IMoreOptionsListenerWRef m_listener; + Ecore_Timer *m_timer; + bool m_newOpenedState; }; } diff --git a/src/presenters/MoreOptionsPresenter.cpp b/src/presenters/MoreOptionsPresenter.cpp index ad0f74d..4e7379f 100644 --- a/src/presenters/MoreOptionsPresenter.cpp +++ b/src/presenters/MoreOptionsPresenter.cpp @@ -106,12 +106,15 @@ namespace gallery { MoreOptionsPresenter::MoreOptionsPresenter(RefCountObjBase &rc, const MoreOptionsCSRef &options) : Presenter(rc), - m_options(options) + m_options(options), + m_timer(nullptr), + m_newOpenedState(false) { } MoreOptionsPresenter::~MoreOptionsPresenter() { + stopTimer(); if (m_widget) { sendActivateBy(*m_widget, this); } @@ -174,8 +177,39 @@ namespace gallery { return RES_OK; } + bool MoreOptionsPresenter::resetTimer(const double timeout) + { + stopTimer(); + + m_timer = ecore_timer_add(timeout, CALLBACK_A( + MoreOptionsPresenter::onTimer), this); + if (!m_timer) { + LOG_RETURN_VALUE(RES_FAIL, false, "ecore_timer_add() failed!"); + } + + return true; + } + + void MoreOptionsPresenter::stopTimer() + { + if (m_timer) { + ecore_timer_del(m_timer); + m_timer = nullptr; + } + } + + Eina_Bool MoreOptionsPresenter::onTimer() + { + m_timer = nullptr; + + setOpened(m_newOpenedState); + + return ECORE_CALLBACK_CANCEL; + } + void MoreOptionsPresenter::onOpened(Widget &widget, void *eventInfo) { + stopTimer(); const auto keepAliver = asShared(*this); sendDeactivateBy(*m_widget, this); activateBy(m_widget.get()); @@ -189,6 +223,7 @@ namespace gallery { void MoreOptionsPresenter::onClosed(Widget &widget, void *eventInfo) { + stopTimer(); const auto keepAliver = asShared(*this); deactivateBy(m_widget.get()); sendActivateBy(*m_widget, this); @@ -234,6 +269,7 @@ namespace gallery { void MoreOptionsPresenter::setOpened(const bool isOpened) { + stopTimer(); eext_more_option_opened_set(*m_widget, toEina(isOpened)); } @@ -241,4 +277,14 @@ namespace gallery { { return eext_more_option_opened_get(*m_widget); } + + void MoreOptionsPresenter::setOpenedDelayed( + const bool isOpened, const double timeout) + { + if (!resetTimer(timeout)) { + setOpened(isOpened); + } else { + m_newOpenedState = isOpened; + } + } } diff --git a/src/presenters/PreviewPage.cpp b/src/presenters/PreviewPage.cpp index f0a0b65..cc92357 100644 --- a/src/presenters/PreviewPage.cpp +++ b/src/presenters/PreviewPage.cpp @@ -34,6 +34,8 @@ namespace gallery { namespace { namespace impl { + constexpr auto POPUP_SHOW_TIME_SEC = 0.3; + constexpr auto BRING_IN_SCROLL_FRICTION = 0.25; constexpr auto PAGE_SCROLL_IN_FRICTION = 0.25; @@ -485,13 +487,13 @@ namespace gallery { void PreviewPage::onMoreOptionClicked(MoreOptionsPresenter &sender, const MoreOption &option) { - sender.setOpened(false); - switch (option.id) { case impl::MORE_OPTION_ID_DELETE: + sender.setOpenedDelayed(false, impl::POPUP_SHOW_TIME_SEC); confirmItemsDelete(); break; default: + sender.setOpened(false); WLOG("Unknown option id: %d;", option.id); break; } diff --git a/src/presenters/ThumbnailPage.cpp b/src/presenters/ThumbnailPage.cpp index a097aaa..2828c13 100644 --- a/src/presenters/ThumbnailPage.cpp +++ b/src/presenters/ThumbnailPage.cpp @@ -30,6 +30,8 @@ namespace gallery { namespace { namespace impl { + constexpr auto NAVIFRAME_TRANSITION_TIME_SEC = 0.3; + constexpr auto BRING_IN_SCROLL_FRICTION = 0.5; constexpr auto PAGE_SCROLL_IN_FRICTION = 0.5; @@ -305,10 +307,9 @@ namespace gallery { void ThumbnailPage::onMoreOptionClicked(MoreOptionsPresenter &sender, const MoreOption &option) { - sender.setOpened(false); - switch (option.id) { case impl::MORE_OPTION_ID_DELETE: + sender.setOpenedDelayed(false, impl::NAVIFRAME_TRANSITION_TIME_SEC); m_page = PreviewPage::Builder(). setNaviframe(asShared(getNaviframe())). setAlbum(m_album). @@ -317,6 +318,7 @@ namespace gallery { build(DELEGATE(ThumbnailPage::onPageExitRequest, this)); break; default: + sender.setOpened(false); WLOG("Unknown option id: %d;", option.id); break; } diff --git a/src/view/ImageGrid.cpp b/src/view/ImageGrid.cpp index 2cbcb7f..864056d 100644 --- a/src/view/ImageGrid.cpp +++ b/src/view/ImageGrid.cpp @@ -53,6 +53,23 @@ namespace gallery { namespace { namespace impl { // Other // constexpr auto HCOMB_SCROLL_LIMIT = 1000; + + bool getImageSize(const Widget &image, int &w, int &h) + { + int tmpW = 0; + int tmpH = 0; + + evas_object_image_size_get(image, &tmpW, &tmpH); + + if ((tmpW <= 0) || (tmpH <= 0)) { + return false; + } + + w = tmpW; + h = tmpH; + + return true; + } }}} namespace gallery { @@ -220,10 +237,11 @@ namespace gallery { RefCountAware(&rc), m_imageGrid(imageGrid), m_btn(elm_button_add(parent)), - m_image(elm_image_add(m_btn)), + m_image(evas_object_image_filled_add(m_btn.getEvas())), m_realizeIndex(-1), m_imageLoadSize(0), m_wasUpdated(false), + m_isImageEmpty(false), m_isClicksBlocked(false), m_isSelected(false) { @@ -231,12 +249,12 @@ namespace gallery { m_btn.setStyle(impl::ITEM_BTN_STYLE); show(m_btn); - elm_image_preload_disabled_set(m_image, EINA_FALSE); - elm_image_aspect_fixed_set(m_image, EINA_TRUE); - elm_image_fill_outside_set(m_image, EINA_TRUE); m_btn.setContent(m_image); show(m_image); + m_image.addEventHandler(WidgetEvent::IMAGE_PRELOADED, + WEAK_DELEGATE(Item::onImagePreloaded, asWeak(*this))); + m_btn.addEventHandler(BTN_CLICKED, WEAK_DELEGATE( Item::onClicked, asWeak(*this))); @@ -255,7 +273,8 @@ namespace gallery { void setImageLoadSize(const int value) { m_imageLoadSize = value; - elm_image_prescale_set(m_image, m_imageLoadSize); + evas_object_image_load_size_set(m_image, + m_imageLoadSize, m_imageLoadSize); } bool isRealized() const @@ -346,11 +365,32 @@ namespace gallery { if (isEmpty(params.imagePath)) { if (!m_wasUpdated || (params.flags & UF_LOSE_IMAGE)) { makeTransparent(m_image); + m_isImageEmpty = true; } return; } - elm_image_file_set(m_image, params.imagePath.c_str(), NULL); + makeTransparent(m_image); + m_isImageEmpty = false; + + evas_object_image_file_set(m_image, + params.imagePath.c_str(), NULL); + + evas_object_image_preload(m_image, EINA_FALSE); + } + + void onImagePreloaded(Widget &widget, void *eventInfo) + { + if (m_isImageEmpty) { + return; + } + + int w = 1; + int h = 1; + if (!impl::getImageSize(m_image, w, h)) { + WLOG("Invalid image size!"); + } + m_image.setARHint(WidgetARHint::NEITHER, w, h); makeWhite(m_image); } @@ -377,24 +417,18 @@ namespace gallery { evas_object_image_file_set(*m_bgImage, params.bgImagePath.c_str(), NULL); - int w = 0; - int h = 0; - elm_image_object_size_get(m_image, &w, &h); - if ((w == 0) || (h == 0)) { + int w = 1; + int h = 1; + if (!impl::getImageSize(m_image, w, h) && + !impl::getImageSize(*m_bgImage, w, h)) { WLOG("Invalid image size!"); - evas_object_image_size_get(*m_bgImage, &w, &h); - if ((w == 0) || (h == 0)) { - WLOG("Invalid image size!"); - w = 1; - h = 1; - } } m_bgImage->setARHint(WidgetARHint::NEITHER, w, h); makeWhite(*m_bgImage); } - void onClicked(Widget &wifget, void *eventInfo) + void onClicked(Widget &widget, void *eventInfo) { if (isRealized()) { m_imageGrid.handleItemEvent(m_realizeIndex, @@ -427,6 +461,7 @@ namespace gallery { int m_realizeIndex; int m_imageLoadSize; bool m_wasUpdated; + bool m_isImageEmpty; bool m_isClicksBlocked; bool m_isSelected; }; @@ -1282,21 +1317,12 @@ namespace gallery { int ImageGrid::calcScrollOffset() { - int scrollerX = 0; - int scrollerY = 0; - getPosition(*m_scroller, &scrollerX, &scrollerY); - - int boxX = 0; - int boxY = 0; - getPosition(m_box, &boxX, &boxY); - - int scrollOffset = (m_info.isHorizontal ? - (scrollerX - boxX) : (scrollerY - boxY)); - if (scrollOffset < 0) { - scrollOffset = 0; - } + int scrollOffsetX = 0; + int scrollOffsetY = 0; + elm_scroller_region_get(*m_scroller, &scrollOffsetX, &scrollOffsetY, + nullptr, nullptr); - return scrollOffset; + return (m_info.isHorizontal ? scrollOffsetX : scrollOffsetY); } bool ImageGrid::updateScrollOffset() -- 2.34.1