diff --git a/xbmc/video/dialogs/GUIDialogVideoBookmarks.cpp b/xbmc/video/dialogs/GUIDialogVideoBookmarks.cpp index 4406804e9421e..7e44000745490 100644 --- a/xbmc/video/dialogs/GUIDialogVideoBookmarks.cpp +++ b/xbmc/video/dialogs/GUIDialogVideoBookmarks.cpp @@ -68,7 +68,8 @@ CGUIDialogVideoBookmarks::CGUIDialogVideoBookmarks() : CGUIDialog(WINDOW_DIALOG_VIDEO_BOOKMARKS, "VideoOSDBookmarks.xml") { m_vecItems = new CFileItemList; - m_loadType = KEEP_IN_MEMORY; + m_loadType = LOAD_EVERY_TIME; + m_jobsStarted = 0; } CGUIDialogVideoBookmarks::~CGUIDialogVideoBookmarks() @@ -143,7 +144,7 @@ bool CGUIDialogVideoBookmarks::OnMessage(CGUIMessage& message) case 0: OnRefreshList(); break; - case 2: + case 1: UpdateItem(message.GetParam2()); break; default: @@ -213,29 +214,22 @@ void CGUIDialogVideoBookmarks::Delete(int item) Update(); } -void CGUIDialogVideoBookmarks::UpdateItem(unsigned int id) +void CGUIDialogVideoBookmarks::UpdateItem(unsigned int itemIdx) { CSingleLock lock(m_refreshSection); - std::map::iterator iter = m_mapJobsChapter.find(id); - if (iter != m_mapJobsChapter.end()) + + if ((int) itemIdx < m_vecItems->Size()) { - unsigned int itemId = (*iter).second; - if (itemId + m_bookmarks.size() < m_vecItems->Size()) + std::string time = StringUtils::Format("chapter://%s/%i", m_filePath.c_str(), itemIdx); + std::string cachefile = CTextureCache::Get().GetCachedPath(CTextureCache::Get().GetCacheFile(time) + ".jpg"); + if (XFILE::CFile::Exists(cachefile)) { - std::string time = StringUtils::Format("chapter://%s/%i", m_filePath.c_str(), itemId); - std::string cachefile = CTextureCache::Get().GetCachedPath(CTextureCache::Get().GetCacheFile(time) + ".jpg"); - if (XFILE::CFile::Exists(cachefile)) - { - //m_vecItems->UpdateItem ->get[itemId]->SetArt("thumb", cachefile); - CFileItemPtr item = (*m_vecItems)[itemId]; - item->SetArt("thumb", cachefile); - //m_viewControl.SetItems(*m_vecItems); - } + (*m_vecItems)[itemIdx]->SetArt("thumb", cachefile); } } } -void CGUIDialogVideoBookmarks::OnRefreshList(bool createThumbJob) +void CGUIDialogVideoBookmarks::OnRefreshList() { m_bookmarks.clear(); CBookmark resumemark; @@ -289,11 +283,12 @@ void CGUIDialogVideoBookmarks::OnRefreshList(bool createThumbJob) std::string cachefile = CTextureCache::Get().GetCachedPath(CTextureCache::Get().GetCacheFile(time)+".jpg"); if (XFILE::CFile::Exists(cachefile)) item->SetArt("thumb", cachefile); - else if (createThumbJob) + else if (i > m_jobsStarted) { CFileItem item(m_filePath, false); unsigned int jobId = CJobManager::GetInstance().AddJob(new CThumbExtractor(item, m_filePath, true, time, pos*1000, false), this, CJob::PRIORITY_NORMAL); - m_mapJobsChapter[jobId] = i; + m_mapJobsChapter[jobId] = m_vecItems->Size(); + m_jobsStarted++; } m_vecItems->Add(item); } @@ -454,10 +449,20 @@ void CGUIDialogVideoBookmarks::OnWindowLoaded() m_viewControl.Reset(); m_viewControl.SetParentWindow(GetID()); m_viewControl.AddView(GetControl(CONTROL_THUMBS)); + m_jobsStarted = 0; + m_mapJobsChapter.clear(); + m_vecItems->Clear(); } void CGUIDialogVideoBookmarks::OnWindowUnload() { + //stop running thumb extraction jobs + for (MAPJOBSCHAPS::iterator it = m_mapJobsChapter.begin(); it != m_mapJobsChapter.end(); ++it) + { + CJobManager::GetInstance().CancelJob(it->first); + } + m_mapJobsChapter.clear(); + m_vecItems->Clear(); CGUIDialog::OnWindowUnload(); m_viewControl.Reset(); } @@ -546,7 +551,13 @@ void CGUIDialogVideoBookmarks::OnJobComplete(unsigned int jobID, { if (success && IsActive()) { - CGUIMessage m(GUI_MSG_REFRESH_LIST, GetID(), 0, 2, jobID); - CApplicationMessenger::Get().SendGUIMessage(m); + MAPJOBSCHAPS::iterator iter = m_mapJobsChapter.find(jobID); + if (iter != m_mapJobsChapter.end()) + { + unsigned int itemIdx = (*iter).second; + CGUIMessage m(GUI_MSG_REFRESH_LIST, GetID(), 0, 1, itemIdx); + CApplicationMessenger::Get().SendGUIMessage(m); + m_mapJobsChapter.erase(iter); + } } } diff --git a/xbmc/video/dialogs/GUIDialogVideoBookmarks.h b/xbmc/video/dialogs/GUIDialogVideoBookmarks.h index 12a56376676dd..d45cf19983493 100644 --- a/xbmc/video/dialogs/GUIDialogVideoBookmarks.h +++ b/xbmc/video/dialogs/GUIDialogVideoBookmarks.h @@ -29,6 +29,8 @@ class CFileItemList; class CGUIDialogVideoBookmarks : public CGUIDialog, public IJobCallback { + typedef std::map MAPJOBSCHAPS; + public: CGUIDialogVideoBookmarks(void); virtual ~CGUIDialogVideoBookmarks(void); @@ -66,7 +68,7 @@ class CGUIDialogVideoBookmarks : public CGUIDialog, public IJobCallback static bool AddBookmark(CVideoInfoTag *tag=NULL); void Delete(int item); void Clear(); - void OnRefreshList(bool createThumbJob = true); + void OnRefreshList(); void OnPopupMenu(int item); CGUIControl *GetFirstFocusableControl(int id); @@ -77,9 +79,10 @@ class CGUIDialogVideoBookmarks : public CGUIDialog, public IJobCallback VECBOOKMARKS m_bookmarks; private: - void UpdateItem(unsigned int id); + void UpdateItem(unsigned int itemIdx); + int m_jobsStarted; std::string m_filePath; CCriticalSection m_refreshSection; - std::map m_mapJobsChapter; + MAPJOBSCHAPS m_mapJobsChapter; };