From 9a1699bc413d63a6cd0f1a574c0364376cfb60aa Mon Sep 17 00:00:00 2001 From: montellese Date: Tue, 24 Jul 2012 16:02:27 +0200 Subject: [PATCH] media library: adjust the paths and the history to be able to return to a filtered list --- xbmc/music/windows/GUIWindowMusicBase.cpp | 29 ++++++++++++++++++++- xbmc/video/windows/GUIWindowVideoBase.cpp | 31 +++++++++++++++++++++-- xbmc/windows/GUIMediaWindow.cpp | 29 ++++++++++++++++----- 3 files changed, 80 insertions(+), 9 deletions(-) diff --git a/xbmc/music/windows/GUIWindowMusicBase.cpp b/xbmc/music/windows/GUIWindowMusicBase.cpp index f0b2d7929e3c2..9e6fcf8054e0f 100644 --- a/xbmc/music/windows/GUIWindowMusicBase.cpp +++ b/xbmc/music/windows/GUIWindowMusicBase.cpp @@ -1314,11 +1314,38 @@ void CGUIWindowMusicBase::OnRetrieveMusicInfo(CFileItemList& items) bool CGUIWindowMusicBase::GetDirectory(const CStdString &strDirectory, CFileItemList &items) { + CStdString directory = strDirectory; + + // check if the path contains a filter and if so load it and + // remove it from the path to get proper GUI view states etc + CSmartPlaylist filterXsp; + CMusicDbUrl musicUrl; + if (musicUrl.FromString(strDirectory)) + { + CVariant filter; + if (musicUrl.GetOption("filter", filter)) + { + // load the filter and if it's type does not match the + // path's item type reset it + if (filterXsp.LoadFromJson(filter.asString()) && !filterXsp.GetType().Equals(musicUrl.GetType().c_str())) + filterXsp.Reset(); + + // remove the "filter" option from the path + musicUrl.AddOption("filter", ""); + } + directory = musicUrl.ToString(); + } + items.SetThumbnailImage(""); - bool bResult = CGUIMediaWindow::GetDirectory(strDirectory,items); + bool bResult = CGUIMediaWindow::GetDirectory(directory, items); if (bResult) CMusicThumbLoader::FillThumb(items); + // (re-)apply the previously retrieved filter + // because it was reset in CGUIMediaWindow::GetDirectory() + if (!filterXsp.IsEmpty()) + m_filter = filterXsp; + // add in the "New Playlist" item if we're in the playlists folder if ((items.GetPath() == "special://musicplaylists/") && !items.Contains("newplaylist://")) { diff --git a/xbmc/video/windows/GUIWindowVideoBase.cpp b/xbmc/video/windows/GUIWindowVideoBase.cpp index 0e305dd3a0625..e9b1a42ddd3f1 100644 --- a/xbmc/video/windows/GUIWindowVideoBase.cpp +++ b/xbmc/video/windows/GUIWindowVideoBase.cpp @@ -1783,7 +1783,34 @@ bool CGUIWindowVideoBase::Update(const CStdString &strDirectory) bool CGUIWindowVideoBase::GetDirectory(const CStdString &strDirectory, CFileItemList &items) { - bool bResult = CGUIMediaWindow::GetDirectory(strDirectory,items); + CStdString directory = strDirectory; + + // check if the path contains a filter and if so load it and + // remove it from the path to get proper GUI view states etc + CSmartPlaylist filterXsp; + CVideoDbUrl videoUrl; + if (videoUrl.FromString(strDirectory)) + { + CVariant filter; + if (videoUrl.GetOption("filter", filter)) + { + // load the filter and if it's type does not match the + // path's item type reset it + if (filterXsp.LoadFromJson(filter.asString()) && !filterXsp.GetType().Equals(videoUrl.GetItemType().c_str())) + filterXsp.Reset(); + + // remove the "filter" option from the path + videoUrl.AddOption("filter", ""); + } + directory = videoUrl.ToString(); + } + + bool bResult = CGUIMediaWindow::GetDirectory(directory, items); + + // (re-)apply the previously retrieved filter + // because it was reset in CGUIMediaWindow::GetDirectory() + if (!filterXsp.IsEmpty()) + m_filter = filterXsp; // add in the "New Playlist" item if we're in the playlists folder if ((items.GetPath() == "special://videoplaylists/") && !items.Contains("newplaylist://")) @@ -1809,7 +1836,7 @@ bool CGUIWindowVideoBase::GetDirectory(const CStdString &strDirectory, CFileItem // we may also be in a tvshow files listing // (ideally this should be removed, and our stack regexps tidied up if necessary // No "normal" episodes should stack, and multi-parts should be supported) - ADDON::ScraperPtr info = m_database.GetScraperForPath(strDirectory); + ADDON::ScraperPtr info = m_database.GetScraperForPath(directory); if (info && info->Content() == CONTENT_TVSHOWS) m_stackingAvailable = false; diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp index 7948d48e8e3cd..5288f58c947ff 100644 --- a/xbmc/windows/GUIMediaWindow.cpp +++ b/xbmc/windows/GUIMediaWindow.cpp @@ -232,6 +232,13 @@ bool CGUIMediaWindow::OnMessage(CGUIMessage& message) CGUIDialogContextMenu* pDlg = (CGUIDialogContextMenu*)g_windowManager.GetWindow(WINDOW_DIALOG_CONTEXT_MENU); if (pDlg && pDlg->IsActive()) pDlg->Close(); + + // get rid of any active filtering + if (m_canFilterAdvanced) + { + m_canFilterAdvanced = false; + m_filter.Reset(); + } // Call ClearFileItems() after our window has finished doing any WindowClose // animations @@ -634,7 +641,7 @@ bool CGUIMediaWindow::GetDirectory(const CStdString &strDirectory, CFileItemList if (items.Size()) items.Clear(); - CStdString strParentPath=m_history.GetParentPath(); + CStdString strParentPath = m_history.GetParentPath(); CLog::Log(LOGDEBUG,"CGUIMediaWindow::GetDirectory (%s)", strDirectory.c_str()); CLog::Log(LOGDEBUG," ParentPath = [%s]", strParentPath.c_str()); @@ -697,6 +704,7 @@ bool CGUIMediaWindow::GetDirectory(const CStdString &strDirectory, CFileItemList // clear the filter SetProperty("filter", ""); + m_canFilterAdvanced = false; m_filter.Reset(); return true; } @@ -721,10 +729,10 @@ bool CGUIMediaWindow::Update(const CStdString &strDirectory) GetDirectoryHistoryString(pItem.get(), strSelectedItem); } } + + CStdString strCurrentDirectory = m_vecItems->GetPath(); - CStdString strOldDirectory = m_vecItems->GetPath(); - - m_history.SetSelectedItem(strSelectedItem, strOldDirectory); + m_history.SetSelectedItem(strSelectedItem, strCurrentDirectory); CFileItemList items; if (!GetDirectory(strDirectory, items)) @@ -732,7 +740,7 @@ bool CGUIMediaWindow::Update(const CStdString &strDirectory) CLog::Log(LOGERROR,"CGUIMediaWindow::GetDirectory(%s) failed", strDirectory.c_str()); // if the directory is the same as the old directory, then we'll return // false. Else, we assume we can get the previous directory - if (strDirectory.Equals(strOldDirectory)) + if (strDirectory.Equals(strCurrentDirectory)) return false; // We assume, we can get the parent @@ -946,6 +954,13 @@ bool CGUIMediaWindow::OnClick(int iItem) if (!items.AlwaysCache()) items.RemoveDiscCache(GetID()); + // if we have a filtered list, we need to add the filtered + // path to be able to come back to the filtered view + CStdString strCurrentDirectory = m_vecItems->GetPath(); + if (m_canFilterAdvanced && !m_filter.IsEmpty() && + !m_unfilteredItems->GetPath().Equals(strCurrentDirectory)) + m_history.AddPath(strCurrentDirectory); + CFileItem directory(*pItem); if (!Update(directory.GetPath())) ShowShareErrorMessage(&directory); @@ -1098,7 +1113,6 @@ void CGUIMediaWindow::GoParentFolder() // if vector is not empty, pop parent // if vector is empty, parent is root source listing - CStdString strOldPath(m_vecItems->GetPath()); strParent = m_history.RemoveParentPath(); Update(strParent); } @@ -1549,6 +1563,8 @@ void CGUIMediaWindow::OnFilterItems(const CStdString &filter) if (!m_canFilterAdvanced) SetProperty("filter", filter); + else + m_vecItems->SetPath(items.GetPath()); } // and update our view control + buttons @@ -1676,6 +1692,7 @@ bool CGUIMediaWindow::GetAdvanceFilteredItems(CFileItemList &items, bool &hasNew items.ClearItems(); items.Append(filteredItems); + items.SetPath(resultItems.GetPath()); return true; }