MediaItem::~MediaItem()
{
- cancelThumbnailPathGet();
+ if (m_thumbCbProxy) {
+ cancelThumbnailPathGet();
+ }
}
MediaItemSRef MediaItem::newInstance(const media_info_h media)
}
if (m_thumbCbProxy) {
- m_thumbCbProxy->callback = cb;
+ m_thumbCbProxy->callbacks += cb;
return RES_FALSE;
}
- auto cbProxy = util::makeUnique(new ThumbCbProxy{this, cb});
+ auto cbProxy = util::makeUnique(new ThumbCbProxy{this});
+ cbProxy->callbacks += cb;
{
MutexLock lock(getMediaMutex());
return RES_FALSE;
}
- void MediaItem::cancelThumbnailPathGet() const
+ void MediaItem::cancelThumbnailPathGet(const ThumbnailPathGetCb &cb) const
{
if (!m_thumbCbProxy) {
return;
}
+ m_thumbCbProxy->callbacks -= cb;
+
+ if (isEmpty(m_thumbCbProxy->callbacks)) {
+ cancelThumbnailPathGet();
+ }
+ }
+
+ void MediaItem::cancelThumbnailPathGet() const
+ {
MutexLock lock(getMediaMutex());
const int ret = media_info_cancel_thumbnail(m_media);
item->m_media = nullptr;
}
- const auto proxy = std::move(*item->m_thumbCbProxy);
+ auto proxy = std::move(*item->m_thumbCbProxy);
item->m_thumbCbProxy.reset();
- proxy.callback(result, proxy.item->m_thumbPath);
+ proxy.callbacks.dispatch(result, proxy.item->m_thumbPath);
}
}
#include <media_content.h>
#include "ucl/misc/AutoHandle.h"
+#include "ucl/misc/Event.h"
#include "IJob.h"
const std::string &getFilePath() const;
ucl::Result getThumbnailPath(const ThumbnailPathGetCb &cb) const;
- void cancelThumbnailPathGet() const;
+ void cancelThumbnailPathGet(const ThumbnailPathGetCb &cb) const;
ucl::Result removeFile();
ucl::Result saveToDevice();
private:
ucl::Result initThumbPath(media_info_h media) const;
+ void cancelThumbnailPathGet() const;
private:
// XXX This proxy is needed to deal with cases when
// media_thumbnail_completed_cb can't be cancelled
struct ThumbCbProxy final {
const MediaItem *item;
- ThumbnailPathGetCb callback;
+ ucl::Event<ThumbnailPathGetCb> callbacks;
void completeCb(media_content_error_e error, const char *path);
};
void unrealize()
{
- m_media->cancelThumbnailPathGet();
+ m_media->cancelThumbnailPathGet(
+ WEAK_DELEGATE(Item::onThumbnail, asWeak(*this)));
}
MediaItemSRef getMedia()
virtual ~RealizedItem()
{
- m_parent.m_mediaItems[m_index]->cancelThumbnailPathGet();
+ m_parent.m_mediaItems[m_index]->cancelThumbnailPathGet(
+ WEAK_DELEGATE(RealizedItem::onThumbnail, asWeak(this)));
}
int getIndex() const
listener->onItemRealized(itemIndex);
}
+ if (!m_wasUpdated) {
+ update({"", "", 0, 0, 0});
+ }
+
makeWhite(m_btn);
} else {
makeTransparent(m_btn);