#include "view/IImageGridListener.h"
#include "IMoreOptionsListener.h"
+#include "ISelectModeListener.h"
namespace gallery {
class PreviewPage final : public Page,
private IImageGridListener,
- private IMoreOptionsListener {
+ private IMoreOptionsListener,
+ private ISelectModeListener {
public:
class Builder {
public:
private:
friend class ucl::RefCountObj<PreviewPage>;
PreviewPage(ucl::RefCountObjBase &rc, const ucl::NaviframeSRef &navi,
- ExitRequestHandler onExitRequest, const IMediaAlbumSRef &album);
+ ExitRequestHandler onExitRequest, const IMediaAlbumSRef &album,
+ bool selectModeStartup);
virtual ~PreviewPage();
- ucl::Result prepare(bool enableSelectMode);
+ ucl::Result prepare();
void showItem(int itemIndex);
void selectItem(int itemIndex);
int getSafeItemIndex(int itemIndex) const;
bool onEachMedia(MediaItemSRef &&media);
void closeTempViews();
- void switchToSelectMode(int itemIndex);
+ void switchToSelectMode();
void switchToNormalMode();
void toggleItemSelected(int itemIndex);
+ void confirmItemsDelete();
void openViewer(int itemIndex, int x, int y);
void onPageExitRequest(Page &page);
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;
// IMoreOptionsListener //
virtual void onMoreOptionClicked(MoreOptionsPresenter &sender,
const MoreOption &option) final override;
+ // ISelectModeListener //
+
+ virtual void onSelectModeEvent(int event) final override;
+
private:
class Item;
using ItemUPtr = std::unique_ptr<Item>;
private:
const IMediaAlbumSRef m_album;
+ const bool m_selectModeStartup;
ImageGridSRef m_imageGrid;
std::vector<ItemUPtr> m_items;
IJobSRef m_job;
PageContentSRef m_content;
MoreOptionsPresenterSRef m_more;
+ SelectModePresenterSRef m_smp;
AlertDialogWRef m_alert;
ProcessingPresenterSRef m_processing;
PageWRef m_page;
+ int m_selectCount;
+ bool m_isInSelectMode;
+ bool m_needReload;
};
}
#include "view/ImageGrid.h"
#include "presenters/MoreOptionsPresenter.h"
+#include "presenters/SelectModePresenter.h"
#include "presenters/AlertDialog.h"
#include "presenters/ProcessingPresenter.h"
#include "presenters/ViewerPage.h"
}
auto result = makeShared<PreviewPage>(
- m_navi, onExitRequest, m_album);
+ m_navi, onExitRequest, m_album, m_selectModeStartup);
- FAIL_RETURN_VALUE(result->prepare(m_selectModeStartup), {},
- "result->prepare() failed!");
+ FAIL_RETURN_VALUE(result->prepare(), {}, "result->prepare() failed!");
if (m_startItemIndex > 0) {
result->showItem(m_startItemIndex);
- if (m_selectModeStartup) {
- result->selectItem(m_startItemIndex);
- }
+ }
+ if (m_selectModeStartup) {
+ result->selectItem(m_startItemIndex);
}
return result;
PreviewPage::PreviewPage(RefCountObjBase &rc,
const NaviframeSRef &navi,
const ExitRequestHandler onExitRequest,
- const IMediaAlbumSRef &album) :
+ const IMediaAlbumSRef &album,
+ const bool selectModeStartup) :
Page(rc, navi, onExitRequest),
- m_album(album)
+ m_album(album),
+ m_selectModeStartup(selectModeStartup),
+ m_selectCount(0),
+ m_isInSelectMode(false),
+ m_needReload(false)
{
}
void PreviewPage::reload()
{
- // TODO Temp solution.
- // Need to add synchronization with curent state in the future.
- switchToNormalMode();
+ if (m_imageGrid->isInTransition()) {
+ m_needReload = true;
+ return;
+ }
- ImageGrid::Unrealizer u(*m_imageGrid);
+ {
+ ImageGrid::Unrealizer u(*m_imageGrid);
- m_items.clear();
+ m_items.clear();
- FAIL_LOG(m_album->forEachMedia(
- DELEGATE(PreviewPage::onEachMedia, this)),
- "m_album->forEachMedia() failed!");
+ FAIL_LOG(m_album->forEachMedia(
+ DELEGATE(PreviewPage::onEachMedia, this)),
+ "m_album->forEachMedia() failed!");
- m_imageGrid->setItemCount(m_items.size());
+ m_imageGrid->setItemCount(m_items.size());
+ }
+
+ // TODO Temp solution.
+ // Need to add synchronization with curent state in the future.
+ closeTempViews();
+ switchToNormalMode();
checkViewerPage();
}
int PreviewPage::getCurrentItemIndex() const
{
- return m_imageGrid->getScrolledToItemIndex();
+ return getSafeItemIndex(m_imageGrid->getScrolledToItemIndex());
}
- Result PreviewPage::prepare(const bool enableSelectMode)
+ Result PreviewPage::prepare()
{
m_content = PageContent::Builder().
- setFlags(PageContent::FLAG_MORE_OPTIONS).
+ setFlags(PageContent::FLAG_BOTTOM_BUTTON |
+ PageContent::FLAG_SELECT_BUTTON |
+ 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::LINEAR).
- setSelectModeStartup(enableSelectMode).
+ setSelectModeStartup(m_selectModeStartup).
build(*m_content);
if (!m_imageGrid) {
LOG_RETURN(RES_FAIL, "ImageGrid::build() failed!");
m_content->set(m_more->getWidget(), PageContent::Part::MORE_OPTIONS);
addDeactivatorSource(m_more->getWidget());
+ m_smp = SelectModePresenter::Builder().
+ setFlags(SelectModePresenter::FLAG_NO_MORE_OPTIONS).
+ build(*m_content);
+ if (!m_smp) {
+ LOG_RETURN(RES_FAIL, "SelectModePresenter::build() failed!");
+ }
+
FAIL_RETURN(m_album->forEachMedia(
DELEGATE(PreviewPage::onEachMedia, this)),
"m_album->forEachMedia() failed!");
PreviewPage::onAlbumChanged, asWeak(*this)));
m_more->setListener(asWeakThis<IMoreOptionsListener>(this));
+ m_smp->setListener(asWeakThis<ISelectModeListener>(this));
+
+ if (m_selectModeStartup) {
+ switchToSelectMode();
+ }
return RES_OK;
}
void PreviewPage::selectItem(const int itemIndex)
{
+ if (!m_isInSelectMode) {
+ LOG_RETURN_VOID(RES_INVALID_ARGUMENTS, "Not in select mode!");
+ }
if (getSafeItemIndex(itemIndex) != itemIndex) {
LOG_RETURN_VOID(RES_INVALID_ARGUMENTS, "itemIndex out of range!");
}
- m_items[itemIndex]->setSelected(true);
+ if (!m_items[itemIndex]->isSelected()) {
+ toggleItemSelected(itemIndex);
+ }
}
int PreviewPage::getSafeItemIndex(const int itemIndex) const
m_more->activateBy(info.deactivator);
}
- if (isActive()) {
+ m_smp->activateBy(info.deactivator);
+
+ if (isActive() || m_smp->isActive()) {
m_imageGrid->activateRotary();
}
}
m_more->deactivateBy(info.deactivator);
}
- m_imageGrid->deactivateRotary();
+ m_smp->deactivateBy(info.deactivator);
+
+ if (!m_smp->isActive()) {
+ m_imageGrid->deactivateRotary();
+ }
}
void PreviewPage::onBackKey()
{
- if (m_imageGrid->isInTransition()) {
- return;
- }
- if (m_imageGrid->isInSelectMode()) {
+ if (m_isInSelectMode) {
switchToNormalMode();
return;
}
return;
}
- if (m_imageGrid->isInSelectMode()) {
+ if (m_isInSelectMode) {
if (event == ImageGrid::ITEM_EVENT_CLICK) {
toggleItemSelected(itemIndex);
m_imageGrid->bringInItem(itemIndex);
}
switch (event) {
+ case ImageGrid::ITEM_EVENT_TAP_AND_HOLD:
+ switchToSelectMode();
+ toggleItemSelected(itemIndex);
+ break;
case ImageGrid::ITEM_EVENT_DOUBLE_TAP:
openViewer(itemIndex, x, y);
break;
}
}
+ void PreviewPage::onTransitionFinished()
+ {
+ if (m_needReload) {
+ m_needReload = false;
+ reload();
+ } else {
+ m_imageGrid->update();
+ }
+ activateBy(m_imageGrid.get());
+ }
+
void PreviewPage::onMoreOptionClicked(MoreOptionsPresenter &sender,
const MoreOption &option)
{
switch (option.id) {
case impl::MORE_OPTION_ID_DELETE:
- m_alert = AlertDialog::Builder().
- setType(AlertDialog::Type::OK_CANCEL).
- setText(STR_DELETE_1_PHOTO).
- setHandler(WEAK_DELEGATE(
- PreviewPage::onAlertEvent, asWeak(*this))).
- build(getNaviframe());
+ confirmItemsDelete();
break;
default:
WLOG("Unknown option id: %d;", option.id);
}
}
+ void PreviewPage::onSelectModeEvent(const int event)
+ {
+ if (m_more->isOpened()) {
+ return;
+ }
+
+ switch (event) {
+ case SelectModePresenter::EVENT_SELECT_ALL:
+ case SelectModePresenter::EVENT_DESELECT_ALL:
+ {
+ const bool isSelect =
+ (event == SelectModePresenter::EVENT_SELECT_ALL);
+ for (auto &item: m_items) {
+ item->setSelected(isSelect);
+ }
+ m_selectCount = (isSelect * m_items.size());
+ m_smp->update(m_selectCount);
+ }
+ break;
+
+ case SelectModePresenter::EVENT_BOTTOM_BUTTON_CLICK:
+ confirmItemsDelete();
+ break;
+ }
+ }
+
+ void PreviewPage::confirmItemsDelete()
+ {
+ const int itemCount = (m_isInSelectMode ? m_selectCount : 1);
+ if (itemCount == 0) {
+ WLOG("itemCount == 0");
+ return;
+ }
+
+ m_alert = AlertDialog::Builder().
+ setType(AlertDialog::Type::OK_CANCEL).
+ setText((itemCount == 1) ?
+ STR_DELETE_1_PHOTO :
+ TString(STR_DELETE_N_PHOTO.format(itemCount))).
+ setHandler(WEAK_DELEGATE(
+ PreviewPage::onAlertEvent, asWeak(*this))).
+ build(getNaviframe());
+ }
+
bool PreviewPage::onAlertEvent(AlertDialog &dialog, int event)
{
if (event != AlertDialog::EVENT_OK) {
return true;
}
- const int itemIndex = getCurrentItemIndex();
- if (itemIndex < 0) {
- ELOG("Invalid item index!");
- return true;
+ MediaItems items;
+
+ if (m_isInSelectMode) {
+ for (auto &item: m_items) {
+ if (item->isSelected()) {
+ items.emplace_back(item->getMedia());
+ }
+ }
+ } else {
+ const int itemIndex = getCurrentItemIndex();
+ if (itemIndex < 0) {
+ ELOG("Invalid item index!");
+ return true;
+ }
+ items.emplace_back(m_items[itemIndex]->getMedia());
}
m_job = MediaItem::RemoverBuilder().
- setItems({m_items[itemIndex]->getMedia()}).
+ setItems(items).
build(WEAK_DELEGATE(
PreviewPage::onJobComplete, asWeak(*this)));
if (!m_job) {
void PreviewPage::closeTempViews()
{
if (m_alert) {
- m_alert->dismiss();
+ m_alert->dispose();
}
if (m_more) {
m_more->setOpened(false);
}
}
- void PreviewPage::switchToSelectMode(const int itemIndex)
+ void PreviewPage::switchToSelectMode()
{
- closeTempViews();
+ if (m_isInSelectMode) {
+ return;
+ }
+ m_isInSelectMode = true;
+ m_selectCount = 0;
for (auto &item: m_items) {
item->setSelected(false);
}
- m_items[itemIndex]->setSelected(true);
+ m_content->setMoreOptionsVisible(false);
+
+ m_smp->setBottomButtonText(STR_DELETE_CAPS);
+ m_smp->update(m_selectCount, m_items.size());
+ m_smp->setVisible(true);
m_imageGrid->setSelectModeEnabled(true);
+ if (m_imageGrid->isInTransition()) {
+ deactivateBy(m_imageGrid.get());
+ }
}
void PreviewPage::switchToNormalMode()
{
- closeTempViews();
+ if (!m_isInSelectMode) {
+ return;
+ }
+ m_isInSelectMode = false;
+
+ m_content->setMoreOptionsVisible(true);
+
+ m_smp->setVisible(false);
m_imageGrid->setSelectModeEnabled(false);
+ if (m_imageGrid->isInTransition()) {
+ deactivateBy(m_imageGrid.get());
+ }
}
void PreviewPage::toggleItemSelected(const int itemIndex)
{
m_items[itemIndex]->toggleSelected();
+
+ m_selectCount = 0;
+ for (auto &item: m_items) {
+ m_selectCount += item->isSelected();
+ }
+
+ m_smp->update(m_selectCount);
+
+ if (m_selectCount == 0) {
+ m_more->setOpened(false);
+ }
}
void PreviewPage::openViewer(const int itemIndex, const int x, const int y)