Builder &setNaviframe(const ucl::NaviframeSRef &navi);
Builder &setAlbum(const IMediaAlbumSRef &album);
Builder &setStartItemIndex(int index);
+ Builder &setSelectModeStartup(bool value);
PreviewPageSRef build(ExitRequestHandler onExitRequest) const;
private:
ucl::NaviframeSRef m_navi;
IMediaAlbumSRef m_album;
int m_startItemIndex;
+ bool m_selectModeStartup;
};
public:
ExitRequestHandler onExitRequest, const IMediaAlbumSRef &album);
virtual ~PreviewPage();
- ucl::Result prepare();
+ ucl::Result prepare(bool enableSelectMode);
void showItem(int itemIndex);
+ void selectItem(int itemIndex);
+ int getSafeItemIndex(int itemIndex) const;
bool onEachMedia(MediaItemSRef &&media);
+ void switchToSelectMode(int itemIndex);
+ void switchToNormalMode();
+ void toggleItemSelected(int itemIndex);
+ void openViewer(int itemIndex, int x, int y);
+
void onPageExitRequest(Page &page);
// Page //
virtual void onActivate() final override;
virtual void onDeactivate() final override;
+ virtual void onBackKey() final override;
// IImageGridListener //
virtual void onItemUnrealized(int itemIndex) final override;
virtual void onItemEvent(int itemIndex,
int event, int x, int y) final override;
+ virtual void onTransitionFinished() final override;
private:
class Item;
#include "common.h"
+namespace gallery { namespace { namespace impl {
+
+ constexpr auto BRING_IN_SCROLL_FRICTION = 0.25;
+ constexpr auto PAGE_SCROLL_IN_FRICTION = 0.25;
+}}}
+
namespace gallery {
using namespace ucl;
// PreviewPage::Builder //
PreviewPage::Builder::Builder() :
- m_startItemIndex(0)
+ m_startItemIndex(0),
+ m_selectModeStartup(false)
{
}
return *this;
}
+ PreviewPage::Builder &PreviewPage::Builder::setSelectModeStartup(
+ const bool value)
+ {
+ m_selectModeStartup = value;
+ return *this;
+ }
+
PreviewPageSRef PreviewPage::Builder::build(
const ExitRequestHandler onExitRequest) const
{
auto result = makeShared<PreviewPage>(
m_navi, onExitRequest, m_album);
- FAIL_RETURN_VALUE(result->prepare(), {}, "result->prepare() failed!");
+ FAIL_RETURN_VALUE(result->prepare(m_selectModeStartup), {},
+ "result->prepare() failed!");
if (m_startItemIndex > 0) {
result->showItem(m_startItemIndex);
+ if (m_selectModeStartup) {
+ result->selectItem(m_startItemIndex);
+ }
}
return result;
Item(MediaItemSRef &&media, ImageGrid &imageGrid, const int itemIndex) :
m_media(std::move(media)),
m_imageGrid(imageGrid),
- m_index(itemIndex)
+ m_index(itemIndex),
+ m_isSelected(false)
{
}
return m_media;
}
+ void setSelected(const bool selected)
+ {
+ if (selected == m_isSelected) {
+ return;
+ }
+ m_isSelected = selected;
+
+ if (m_imageGrid.isInSelectMode()) {
+ ImageGrid::ItemParams params = {};
+ addFlags(params);
+ m_imageGrid.updateItem(m_index, params);
+ }
+ }
+
+ bool isSelected() const
+ {
+ return m_isSelected;
+ }
+
+ void toggleSelected()
+ {
+ setSelected(!m_isSelected);
+ }
+
private:
void onThumbnail(const Result result, const std::string &path)
{
m_media->getResolution(params.aspectX, params.aspectY);
params.imagePath = m_media->getFilePath();
params.bgImagePath = path;
- params.flags = ImageGrid::UF_BLOCK_CLICKS;
+ addFlags(params);
m_imageGrid.updateItem(m_index, params);
}
+ void addFlags(ImageGrid::ItemParams ¶ms) const
+ {
+ params.flags |= (m_imageGrid.isInSelectMode() ?
+ 0 : ImageGrid::UF_BLOCK_CLICKS);
+ params.flags |= (m_isSelected ? ImageGrid::UF_SELECTED : 0);
+ }
+
private:
const MediaItemSRef m_media;
ImageGrid &m_imageGrid;
const int m_index;
+ bool m_isSelected;
};
// PreviewPage //
}
}
- Result PreviewPage::prepare()
+ Result PreviewPage::prepare(const bool enableSelectMode)
{
m_imageGrid = ImageGrid::Builder().
setListener(this).
setType(ImageGrid::Type::LINEAR).
+ setSelectModeStartup(enableSelectMode).
build(getNaviframe());
if (!m_imageGrid) {
LOG_RETURN(RES_FAIL, "ImageGrid::build() failed!");
void PreviewPage::showItem(const int itemIndex)
{
- m_imageGrid->scrollToItem(itemIndex);
+ m_imageGrid->scrollToItem(getSafeItemIndex(itemIndex));
+ }
+
+ void PreviewPage::selectItem(const int itemIndex)
+ {
+ if (getSafeItemIndex(itemIndex) != itemIndex) {
+ LOG_RETURN_VOID(RES_INVALID_ARGUMENTS, "itemIndex out of range!");
+ }
+ m_items[itemIndex]->setSelected(true);
+ }
+
+ int PreviewPage::getSafeItemIndex(const int itemIndex) const
+ {
+ if (itemIndex < 0) {
+ return 0;
+ }
+ if (itemIndex >= static_cast<int>(m_items.size())) {
+ return (m_items.size() - 1);
+ }
+ return itemIndex;
}
bool PreviewPage::onEachMedia(MediaItemSRef &&media)
void PreviewPage::onActivate()
{
+ 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_imageGrid->activateRotary();
}
m_imageGrid->deactivateRotary();
}
+ void PreviewPage::onBackKey()
+ {
+ if (m_imageGrid->isInTransition()) {
+ return;
+ }
+ if (m_imageGrid->isInSelectMode()) {
+ switchToNormalMode();
+ return;
+ }
+ requestExit();
+ }
+
void PreviewPage::onItemRealized(const int itemIndex)
{
m_items[itemIndex]->realize();
void PreviewPage::onItemEvent(const int itemIndex,
const int event, const int x, const int y)
{
- if (!isActive() || (event != ImageGrid::ITEM_EVENT_DOUBLE_TAP)) {
+ if (!isActive()) {
return;
}
+ if (m_imageGrid->isInSelectMode()) {
+ if (event == ImageGrid::ITEM_EVENT_CLICK) {
+ toggleItemSelected(itemIndex);
+ }
+ return;
+ }
+
+ switch (event) {
+ case ImageGrid::ITEM_EVENT_TAP_AND_HOLD:
+ switchToSelectMode(itemIndex);
+ break;
+ case ImageGrid::ITEM_EVENT_DOUBLE_TAP:
+ openViewer(itemIndex, x, y);
+ break;
+ }
+ }
+
+ void PreviewPage::onTransitionFinished()
+ {
+ m_imageGrid->update();
+ }
+
+ void PreviewPage::switchToSelectMode(const int itemIndex)
+ {
+ for (auto &item: m_items) {
+ item->setSelected(false);
+ }
+
+ m_items[itemIndex]->setSelected(true);
+
+ m_imageGrid->setSelectModeEnabled(true);
+ }
+
+ void PreviewPage::switchToNormalMode()
+ {
+ m_imageGrid->setSelectModeEnabled(false);
+ }
+
+ void PreviewPage::toggleItemSelected(const int itemIndex)
+ {
+ m_items[itemIndex]->toggleSelected();
+ }
+
+ void PreviewPage::openViewer(const int itemIndex, const int x, const int y)
+ {
m_page = ViewerPage::Builder().
setNaviframe(asShared(getNaviframe())).
setZoomIn(x, y).