namespace gallery {
- class Instance final :
+ class Instance final : public ucl::RefCountAware,
public ucl::IInstance,
public ucl::IInstanceAppControlExt {
public:
- Instance(ucl::SysEventProvider &sysEventProvider);
+ Instance(ucl::RefCountObjBase &rc,
+ ucl::SysEventProvider &sysEventProvider);
virtual ~Instance();
// IInstance //
void createNoContentPage();
void createThumbnailPage();
+ void onAlbumChanged();
void onPageExitRequest(Page &page);
void onSysEvent(const ucl::SysEvent sysEvent);
};
public:
- void reload();
+ int getCurrentItemIndex() const;
private:
friend class ucl::RefCountObj<PreviewPage>;
void selectItem(int itemIndex);
int getSafeItemIndex(int itemIndex) const;
+ void reload();
+ void checkViewerPage();
+
+ void onAlbumChanged();
bool onEachMedia(MediaItemSRef &&media);
void switchToSelectMode(int itemIndex);
IMediaAlbumSRef m_album;
};
- public:
- void reload();
-
private:
friend class ucl::RefCountObj<ThumbnailPage>;
ThumbnailPage(ucl::RefCountObjBase &rc, const ucl::NaviframeSRef &navi,
ucl::Result prepare();
+ void reload();
+
+ void onAlbumChanged();
bool onEachMedia(MediaItemSRef &&media);
void onPageExitRequest(Page &page);
ucl::Result isItemRealized(int itemIndex) const;
+ int getScrolledToItemIndex() const;
ucl::Result scrollToItem(int itemIndex);
ucl::Result bringInItem(int itemIndex);
using namespace ucl;
- Instance::Instance(SysEventProvider &sysEventProvider) :
+ Instance::Instance(RefCountObjBase &rc,
+ SysEventProvider &sysEventProvider) :
+ RefCountAware(&rc),
m_sysEventProvider(sysEventProvider),
m_isScanInProgress(false)
{
m_sysEventProvider.addEventHandler(
DELEGATE(Instance::onSysEvent, this));
+ m_gallery->getAlbum()->addChangeHandler(WEAK_DELEGATE(
+ Instance::onAlbumChanged, asWeak(*this)));
+
return RES_OK;
}
m_isScanInProgress = false;
m_gallery->updateAlbum();
-
- const auto thumbPage = dynamicRefCast<ThumbnailPage>(m_page);
-
- if (isNotEmpty(m_gallery->getAlbum())) {
- if (thumbPage) {
- DLOG("Reloading the ThumbnailPage...");
- thumbPage->reload();
- } else {
- if (m_page) {
- m_page->exitNoTransition();
- }
- createThumbnailPage();
- }
- } else if (thumbPage) {
- DLOG("Exit from ThumbnailPage witout transition...");
- thumbPage->exitNoTransition();
- createNoContentPage();
- }
}
void Instance::onAppControl(app_control_h appControl)
build(DELEGATE(Instance::onPageExitRequest, this));
}
+ void Instance::onAlbumChanged()
+ {
+ if (isEmpty(m_gallery->getAlbum())) {
+ if (dynamic_cast<ThumbnailPage *>(m_page.get())) {
+ m_page->exitNoTransition();
+ createNoContentPage();
+ }
+ } else {
+ if (dynamic_cast<NoContentPage *>(m_page.get())) {
+ m_page->exitNoTransition();
+ createThumbnailPage();
+ }
+ }
+ }
+
void Instance::onPageExitRequest(Page &page)
{
if (page.isAtBottom()) {
void PreviewPage::reload()
{
+ // TODO Temp solution.
+ // Need to add synchronization with curent state in the future.
+ switchToNormalMode();
+
ImageGrid::Unrealizer u(*m_imageGrid);
m_items.clear();
m_imageGrid->setItemCount(m_items.size());
- const auto viewerPage = dynamicRefCast<ViewerPage>(m_page);
- if (viewerPage) {
+ checkViewerPage();
+ }
+
+ void PreviewPage::checkViewerPage()
+ {
+ if (const ViewerPageSRef viewerPage =
+ dynamicRefCast<ViewerPage>(m_page)) {
const auto mediaId = viewerPage->getMediaId();
const auto it = std::find_if(m_items.begin(), m_items.end(),
[&mediaId](const ItemUPtr &item)
}
}
+ int PreviewPage::getCurrentItemIndex() const
+ {
+ return m_imageGrid->getScrolledToItemIndex();
+ }
+
Result PreviewPage::prepare(const bool enableSelectMode)
{
m_imageGrid = ImageGrid::Builder().
m_imageGrid->setItemCount(m_items.size());
+ m_album->addChangeHandler(WEAK_DELEGATE(
+ PreviewPage::onAlbumChanged, asWeak(*this)));
+
return RES_OK;
}
return itemIndex;
}
+ void PreviewPage::onAlbumChanged()
+ {
+ if (!isEmpty(m_album)) {
+ reload();
+ }
+ }
+
bool PreviewPage::onEachMedia(MediaItemSRef &&media)
{
m_items.emplace_back(
void PreviewPage::onPageExitRequest(Page &page)
{
+ m_page.reset();
deleteTo();
}
}
"m_album->forEachMedia() failed!");
m_imageGrid->setItemCount(m_mediaItems.size());
-
- if (const auto vp = dynamic_cast<PreviewPage *>(m_page.get())) {
- vp->reload();
- }
}
Result ThumbnailPage::prepare()
m_imageGrid->setItemCount(m_mediaItems.size());
+ m_album->addChangeHandler(WEAK_DELEGATE(
+ ThumbnailPage::onAlbumChanged, asWeak(*this)));
+
return RES_OK;
}
+ void ThumbnailPage::onAlbumChanged()
+ {
+ if (!isEmpty(m_album)) {
+ reload();
+ }
+ }
+
bool ThumbnailPage::onEachMedia(MediaItemSRef &&media)
{
m_mediaItems.emplace_back(std::move(media));
void ThumbnailPage::onPageExitRequest(Page &page)
{
+ if (const PreviewPageSRef previewPage =
+ dynamicRefCast<PreviewPage>(m_page)) {
+ m_imageGrid->scrollToItem(previewPage->getCurrentItemIndex());
+ }
+ m_page.reset();
popTo();
}
}
return func(slotIndex, itemOffset);
}
+ int ImageGrid::getScrolledToItemIndex() const
+ {
+ return std::min(static_cast<long>(m_itemCount - 1),
+ std::lround(1.0 * m_scrollOffset / m_slotSize));
+ }
+
Result ImageGrid::scrollToItem(const int itemIndex)
{
if (m_animator) {