UCL_DECLARE_REF_ALIASES(Page);
- class Page : public ucl::GuiPresenter {
+ class Page : public ucl::GuiPresenter,
+ public ucl::IDisposable {
public:
using ExitRequestHandler = ucl::WeakDelegate<void(Page &page)>;
bool isAtBottom() const;
void exit();
- void exitNoTransition();
void popTo();
void deleteTo();
template <class ...ARGS>
ucl::NaviItem insertBefore(ARGS &&...args);
+ // ucl::IDisposable //
+
+ virtual void dispose() override;
+ virtual bool isDisposed() const final override;
+
protected:
Page(ucl::IRefCountObj &rc, const ucl::NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest);
namespace util {
using ucl::util::makeUnique;
+ using ucl::util::dispose;
}
}
Instance::~Instance()
{
stopMediaContentScan();
- if (const auto page = m_page.lock()) {
- page->exitNoTransition();
- }
+ util::dispose(m_page);
}
Result Instance::onCreate(IInstanceContext *const context)
{
if (isEmpty(m_gallery->getAlbum())) {
if (auto page = dynamicRefCast<ThumbnailPage>(m_page).lock()) {
- page->exitNoTransition();
+ util::dispose(page);
createNoContentPage();
}
} else {
if (auto page = dynamicRefCast<NoContentPage>(m_page).lock()) {
- page->exitNoTransition();
+ util::dispose(page);
createThumbnailPage();
}
}
m_navi->pop();
m_item = nullptr;
} else {
- exitNoTransition();
+ dispose();
}
}
- void Page::exitNoTransition()
+ void Page::dispose()
{
- if (isAtTop()) {
- m_item.del();
- dispatchTopPageChanged();
- } else if (m_item) {
- m_item.del();
+ if (m_item) {
+ if (isAtTop()) {
+ m_item.del();
+ dispatchTopPageChanged();
+ } else {
+ m_item.del();
+ }
}
}
+ bool Page::isDisposed() const
+ {
+ return m_item;
+ }
+
void Page::popTo()
{
if (m_item && !isAtTop()) {
PreviewPage::onAlbumChanged, asWeak(*this)));
}
closeTempViews();
- if (const auto page = m_page.lock()) {
- page->exitNoTransition();
- }
+ util::dispose(m_page);
if (m_imageGrid) {
m_imageGrid->setListener(nullptr);
}
void PreviewPage::closeTempViews()
{
- if (const auto alert = m_alert.lock()) {
- alert->dispose();
- }
+ util::dispose(m_alert);
if (m_more) {
m_more->setOpened(false);
}
if (m_more) {
m_more->setOpened(false);
}
- if (const auto page = m_page.lock()) {
- page->exitNoTransition();
- }
+ util::dispose(m_page);
if (m_imageGrid) {
m_imageGrid->setListener(nullptr);
}
VideoPlayerPage::~VideoPlayerPage()
{
- if (const auto alert = m_alert.lock()) {
- alert->dispose();
- }
+ util::dispose(m_alert);
if (m_soundMgr) {
m_soundMgr->delMediaDeviceStateChangeHandler(WEAK_DELEGATE(
#define __UCL_UTIL_HELPERS_H__
#include "types/baseTypes.h"
+#include "types/classTypes.h"
namespace ucl {
template <class T>
std::unique_ptr<T> makeUnique(T *p);
+
+ template <class T, class = typename std::enable_if<
+ std::is_convertible<T *, IDisposable *>::value>::type>
+ inline void dispose(T *&p) noexcept
+ {
+ if (p) {
+ p->dispose();
+ p = nullptr;
+ }
+ }
}}
#include "helpers.hpp"
namespace ucl {
+ // Misc //
+
+ namespace util {
+
+ template <class T, class = typename std::enable_if<
+ std::is_convertible<T *, IDisposable *>::value>::type>
+ inline void dispose(SharedRef<T> &r) noexcept
+ {
+ if (r) {
+ r->dispose();
+ r.reset();
+ }
+ }
+
+ template <class T, class = typename std::enable_if<
+ std::is_convertible<T *, IDisposable *>::value>::type>
+ inline void dispose(WeakRef<T> &r) noexcept
+ {
+ if (const auto shared = r.lock()) {
+ shared->dispose();
+ r.reset();
+ }
+ }
+ }
+
// Generic casting functions //
template <class T, class U>