constexpr auto PAGE_SCROLL_IN_FRICTION = 0.25;
enum {
- MORE_OPTION_ID_DELETE
+ MORE_OPTION_ID_DELETE,
+ MORE_OPTION_ID_SAVE
};
}}}
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()
{
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);
DLOG("Viewed media item was removed.");
deleteTo();
} else {
- m_imageGrid->scrollToItem(it - m_items.begin());
+ m_imageGrid->scrollToItem(std::distance(m_items.begin(), it));
}
}
}
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!");
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();
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();
}
}
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);
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);
}
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);
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)
{
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;
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);
}
m_job.reset();
-
- m_album->defragment();
- }
-
- void PreviewPage::closeTempViews()
- {
- util::dispose(m_alert);
- if (m_more) {
- m_more->setOpened(false);
- }
}
void PreviewPage::switchToSelectMode()
}
}
+ 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;
listener->onItemRealized(itemIndex);
}
}
-
- if (!m_wasUpdated) {
- makeTransparent(m_btn);
- }
}
void unrealize()
updateImage(params);
updateBgImage(params);
- makeWhite(m_btn);
-
m_wasUpdated = true;
return true;
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();
return;
}
+ setImageLoadSize(newLoadSize);
+ }
+
+ void setImageLoadSize(const int newLoadSize)
+ {
m_imageLoadSize = newLoadSize;
evas_object_image_load_size_set(m_image,
newLoadSize, newLoadSize);
minVisibleOffset = (maxVisibleOffset + extraPadding -
((m_scrollerSize / m_slotSize) - 1) * m_slotSize);
+ if (minVisibleOffset > maxVisibleOffset) {
+ minVisibleOffset = maxVisibleOffset;
+ }
+
if ((m_scrollOffset >= minVisibleOffset) &&
(m_scrollOffset <= maxVisibleOffset)) {
return true;
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 +