From 8336e894db60e5bd45a1de942e8e8ce9d948627b Mon Sep 17 00:00:00 2001 From: Jonathan Marshall Date: Sat, 14 Sep 2013 21:26:26 +1200 Subject: [PATCH 1/6] translate library:// folder paths on retrieval rather than when listing --- xbmc/filesystem/LibraryDirectory.cpp | 34 ++++++++++++---------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/xbmc/filesystem/LibraryDirectory.cpp b/xbmc/filesystem/LibraryDirectory.cpp index f0f30c5dad6e3..88e16bb6f9d09 100644 --- a/xbmc/filesystem/LibraryDirectory.cpp +++ b/xbmc/filesystem/LibraryDirectory.cpp @@ -52,7 +52,7 @@ bool CLibraryDirectory::GetDirectory(const CStdString& strPath, CFileItemList &i return false; if (URIUtils::HasExtension(libNode, ".xml")) - { // a filter node + { // a filter or folder node TiXmlElement *node = LoadXML(libNode); if (node) { @@ -78,6 +78,13 @@ bool CLibraryDirectory::GetDirectory(const CStdString& strPath, CFileItemList &i return true; } } + else if (type == "folder") + { + CStdString path; + XMLUtils::GetPath(node, "path", path); + if (!path.IsEmpty()) + return CDirectory::GetDirectory(path, items, m_strFileMask, m_flags); + } } return false; } @@ -112,27 +119,14 @@ bool CLibraryDirectory::GetDirectory(const CStdString& strPath, CFileItemList &i if (XMLUtils::GetString(node, "label", label)) label = CGUIControlFactory::FilterLabel(label); XMLUtils::GetString(node, "icon", icon); - CStdString type = node->Attribute("type"); int order = 0; node->Attribute("order", &order); - CFileItemPtr item; - if (type == "folder") - { // folder type - grab our path - CStdString path; - XMLUtils::GetPath(node, "path", path); - if (path.IsEmpty()) - { - CLog::Log(LOGERROR, " tag must be not be empty for type=\"folder\" node '%s'", xml.c_str()); - continue; - } - item.reset(new CFileItem(path, true)); - } - else - { // virtual folder or filter - URIUtils::RemoveSlashAtEnd(xml); - CStdString folder = URIUtils::GetFileName(xml); - item.reset(new CFileItem(URIUtils::AddFileToFolder(strPath, folder), true)); - } + + // create item + URIUtils::RemoveSlashAtEnd(xml); + CStdString folder = URIUtils::GetFileName(xml); + CFileItemPtr item(new CFileItem(URIUtils::AddFileToFolder(strPath, folder), true)); + item->SetLabel(label); if (!icon.IsEmpty() && g_TextureManager.HasTexture(icon)) item->SetIconImage(icon); From 4df943eddf6707ff5fd0c131118faadc61b5bbdc Mon Sep 17 00:00:00 2001 From: Jonathan Marshall Date: Fri, 27 Sep 2013 10:01:03 +1200 Subject: [PATCH 2/6] CStdString -> std::string for CLibraryDirectory --- xbmc/filesystem/LibraryDirectory.cpp | 17 ++++++++++------- xbmc/filesystem/LibraryDirectory.h | 4 ++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/xbmc/filesystem/LibraryDirectory.cpp b/xbmc/filesystem/LibraryDirectory.cpp index 88e16bb6f9d09..f7b2bd34822b6 100644 --- a/xbmc/filesystem/LibraryDirectory.cpp +++ b/xbmc/filesystem/LibraryDirectory.cpp @@ -47,8 +47,8 @@ CLibraryDirectory::~CLibraryDirectory(void) bool CLibraryDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items) { - CStdString libNode = GetNode(strPath); - if (libNode.IsEmpty()) + std::string libNode = GetNode(strPath); + if (libNode.empty()) return false; if (URIUtils::HasExtension(libNode, ".xml")) @@ -138,7 +138,7 @@ bool CLibraryDirectory::GetDirectory(const CStdString& strPath, CFileItemList &i return true; } -TiXmlElement *CLibraryDirectory::LoadXML(const CStdString &xmlFile) +TiXmlElement *CLibraryDirectory::LoadXML(const std::string &xmlFile) { if (!CFile::Exists(xmlFile)) return NULL; @@ -151,8 +151,9 @@ TiXmlElement *CLibraryDirectory::LoadXML(const CStdString &xmlFile) return NULL; // check the condition - CStdString condition = xml->Attribute("visible"); - if (condition.IsEmpty() || g_infoManager.EvaluateBool(condition)) + std::string condition; + xml->QueryStringAttribute("visible", &condition); + if (condition.empty() || g_infoManager.EvaluateBool(condition)) return xml; return NULL; @@ -160,10 +161,12 @@ TiXmlElement *CLibraryDirectory::LoadXML(const CStdString &xmlFile) bool CLibraryDirectory::Exists(const char* strPath) { - return !GetNode(strPath).IsEmpty(); + if (strPath) + return !GetNode(std::string(strPath)).empty(); + return false; } -CStdString CLibraryDirectory::GetNode(const CStdString &path) +std::string CLibraryDirectory::GetNode(const std::string &path) { CURL url(path); CStdString libDir = URIUtils::AddFileToFolder(CProfilesManager::Get().GetLibraryFolder(), url.GetHostName() + "/"); diff --git a/xbmc/filesystem/LibraryDirectory.h b/xbmc/filesystem/LibraryDirectory.h index 30637ff860007..b290a163c1882 100644 --- a/xbmc/filesystem/LibraryDirectory.h +++ b/xbmc/filesystem/LibraryDirectory.h @@ -37,14 +37,14 @@ namespace XFILE \param path the library:// path to parse \return path to the XML file or directory corresponding to this path */ - CStdString GetNode(const CStdString &path); + std::string GetNode(const std::string &path); /*! \brief load the XML file and return a pointer to the root element. Checks visible attribute and only returns non-NULL for valid nodes that should be visible. \param xmlFile the XML file to load and parse \return the TiXmlElement pointer to the node, if it should be visible. */ - TiXmlElement *LoadXML(const CStdString &xmlFile); + TiXmlElement *LoadXML(const std::string &xmlFile); CXBMCTinyXML m_doc; }; From 8ff2e3508521a28139b37577499e13607da025fe Mon Sep 17 00:00:00 2001 From: Jonathan Marshall Date: Mon, 16 Sep 2013 08:19:00 +1200 Subject: [PATCH 3/6] Set the item path to the db path for filters --- xbmc/filesystem/LibraryDirectory.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/xbmc/filesystem/LibraryDirectory.cpp b/xbmc/filesystem/LibraryDirectory.cpp index f7b2bd34822b6..79ee3a4d3c9ae 100644 --- a/xbmc/filesystem/LibraryDirectory.cpp +++ b/xbmc/filesystem/LibraryDirectory.cpp @@ -75,6 +75,7 @@ bool CLibraryDirectory::GetDirectory(const CStdString& strPath, CFileItemList &i CSmartPlaylistDirectory::GetDirectory(playlist, items)) { items.SetProperty("library.filter", "true"); + items.SetPath(items.GetProperty("path.db").asString()); return true; } } From a7dd5bb133f8e7baa1c561d9e9d746d9177f43cb Mon Sep 17 00:00:00 2001 From: Jonathan Marshall Date: Sat, 14 Sep 2013 21:33:51 +1200 Subject: [PATCH 4/6] start directory may change after fetch, so update it to the items directory so that navigation out of the window via BACK works as expected --- xbmc/windows/GUIMediaWindow.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp index fcaf300d43e36..ba7b41eed6774 100644 --- a/xbmc/windows/GUIMediaWindow.cpp +++ b/xbmc/windows/GUIMediaWindow.cpp @@ -1478,7 +1478,13 @@ void CGUIMediaWindow::OnInitWindow() { // initial fetch is done unthreaded to ensure the items are setup prior to skin animations kicking off m_rootDir.SetAllowThreads(false); + + // the start directory may change during Refresh + bool updateStartDirectory = (m_startDirectory == m_vecItems->GetPath()); Refresh(); + if (updateStartDirectory) + m_startDirectory = m_vecItems->GetPath(); + m_rootDir.SetAllowThreads(true); if (m_iSelectedItem > -1) From 7f989b18a60dde1db62acb9b3995d9d413dff44e Mon Sep 17 00:00:00 2001 From: Jonathan Marshall Date: Fri, 16 Aug 2013 08:21:40 +1200 Subject: [PATCH 5/6] use the path in the items for testing paths after directory fetch --- xbmc/windows/GUIMediaWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp index ba7b41eed6774..fe49ce21ce68c 100644 --- a/xbmc/windows/GUIMediaWindow.cpp +++ b/xbmc/windows/GUIMediaWindow.cpp @@ -829,7 +829,7 @@ bool CGUIMediaWindow::Update(const CStdString &strDirectory, bool updateFilterPa else if (iWindow == WINDOW_FILES || iWindow == WINDOW_PROGRAMS) showLabel = 1026; } - if (strDirectory.Equals("sources://video/")) + if (m_vecItems->GetPath().Equals("sources://video/")) showLabel = 999; if (showLabel && (m_vecItems->Size() == 0 || !m_guiState->DisableAddSourceButtons())) // add 'add source button' { From d6e3e5f7ac84498bf5e43dcc65777e1a14090665 Mon Sep 17 00:00:00 2001 From: Jonathan Marshall Date: Sun, 13 Oct 2013 18:02:45 +0200 Subject: [PATCH 6/6] support for sources:// URLs for context menu, add source etc. --- xbmc/dialogs/GUIDialogContextMenu.cpp | 2 +- xbmc/music/windows/GUIWindowMusicSongs.cpp | 15 ++++++--------- xbmc/pictures/GUIWindowPictures.cpp | 11 ++++------- xbmc/programs/GUIWindowPrograms.cpp | 11 ++++------- xbmc/windows/GUIMediaWindow.cpp | 7 +++++++ 5 files changed, 22 insertions(+), 24 deletions(-) diff --git a/xbmc/dialogs/GUIDialogContextMenu.cpp b/xbmc/dialogs/GUIDialogContextMenu.cpp index 531aed12e06b9..f2015c090fa13 100644 --- a/xbmc/dialogs/GUIDialogContextMenu.cpp +++ b/xbmc/dialogs/GUIDialogContextMenu.cpp @@ -645,7 +645,7 @@ bool CGUIDialogContextMenu::OnContextButton(const CStdString &type, const CFileI CMediaSource *CGUIDialogContextMenu::GetShare(const CStdString &type, const CFileItem *item) { VECSOURCES *shares = CMediaSourceSettings::Get().GetSources(type); - if (!shares) return NULL; + if (!shares || !item) return NULL; for (unsigned int i = 0; i < shares->size(); i++) { CMediaSource &testShare = shares->at(i); diff --git a/xbmc/music/windows/GUIWindowMusicSongs.cpp b/xbmc/music/windows/GUIWindowMusicSongs.cpp index c7920ce13d193..02ef9c265a9e8 100644 --- a/xbmc/music/windows/GUIWindowMusicSongs.cpp +++ b/xbmc/music/windows/GUIWindowMusicSongs.cpp @@ -294,7 +294,7 @@ void CGUIWindowMusicSongs::GetContextButtons(int itemNumber, CContextButtons &bu bool inPlaylists = m_vecItems->GetPath().Equals(CUtil::MusicPlaylistsLocation()) || m_vecItems->GetPath().Equals("special://musicplaylists/"); - if (m_vecItems->IsVirtualDirectoryRoot()) + if (m_vecItems->IsVirtualDirectoryRoot() || m_vecItems->GetPath() == "sources://music/") { // get the usual music shares, and anything for all media windows CGUIDialogContextMenu::GetContextButtons("music", item, buttons); @@ -387,16 +387,13 @@ bool CGUIWindowMusicSongs::OnContextButton(int itemNumber, CONTEXT_BUTTON button CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); - if ( m_vecItems->IsVirtualDirectoryRoot() && item) + if (CGUIDialogContextMenu::OnContextButton("music", item, button)) { - if (CGUIDialogContextMenu::OnContextButton("music", item, button)) - { - if (button == CONTEXT_BUTTON_REMOVE_SOURCE) - OnRemoveSource(itemNumber); + if (button == CONTEXT_BUTTON_REMOVE_SOURCE) + OnRemoveSource(itemNumber); - Update(""); - return true; - } + Update(""); + return true; } switch (button) diff --git a/xbmc/pictures/GUIWindowPictures.cpp b/xbmc/pictures/GUIWindowPictures.cpp index 5d631c712189b..cc9ee87a0b58a 100644 --- a/xbmc/pictures/GUIWindowPictures.cpp +++ b/xbmc/pictures/GUIWindowPictures.cpp @@ -470,7 +470,7 @@ void CGUIWindowPictures::GetContextButtons(int itemNumber, CContextButtons &butt if (item && !item->GetProperty("pluginreplacecontextitems").asBoolean()) { - if ( m_vecItems->IsVirtualDirectoryRoot() && item) + if ( m_vecItems->IsVirtualDirectoryRoot() || m_vecItems->GetPath() == "sources://pictures/" ) { CGUIDialogContextMenu::GetContextButtons("pictures", item, buttons); } @@ -514,13 +514,10 @@ void CGUIWindowPictures::GetContextButtons(int itemNumber, CContextButtons &butt bool CGUIWindowPictures::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item = (itemNumber >= 0 && itemNumber < m_vecItems->Size()) ? m_vecItems->Get(itemNumber) : CFileItemPtr(); - if (m_vecItems->IsVirtualDirectoryRoot() && item) + if (CGUIDialogContextMenu::OnContextButton("pictures", item, button)) { - if (CGUIDialogContextMenu::OnContextButton("pictures", item, button)) - { - Update(""); - return true; - } + Update(""); + return true; } switch (button) { diff --git a/xbmc/programs/GUIWindowPrograms.cpp b/xbmc/programs/GUIWindowPrograms.cpp index 73dc2b866cfa0..98cbe94559e42 100644 --- a/xbmc/programs/GUIWindowPrograms.cpp +++ b/xbmc/programs/GUIWindowPrograms.cpp @@ -103,7 +103,7 @@ void CGUIWindowPrograms::GetContextButtons(int itemNumber, CContextButtons &butt CFileItemPtr item = m_vecItems->Get(itemNumber); if (item && !item->GetProperty("pluginreplacecontextitems").asBoolean()) { - if ( m_vecItems->IsVirtualDirectoryRoot() ) + if ( m_vecItems->IsVirtualDirectoryRoot() || m_vecItems->GetPath() == "sources://programs/" ) { CGUIDialogContextMenu::GetContextButtons("programs", item, buttons); } @@ -124,13 +124,10 @@ bool CGUIWindowPrograms::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item = (itemNumber >= 0 && itemNumber < m_vecItems->Size()) ? m_vecItems->Get(itemNumber) : CFileItemPtr(); - if (item && m_vecItems->IsVirtualDirectoryRoot()) + if (CGUIDialogContextMenu::OnContextButton("programs", item, button)) { - if (CGUIDialogContextMenu::OnContextButton("programs", item, button)) - { - Update(""); - return true; - } + Update(""); + return true; } switch (button) { diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp index fe49ce21ce68c..1a8ce4f7c1dc4 100644 --- a/xbmc/windows/GUIMediaWindow.cpp +++ b/xbmc/windows/GUIMediaWindow.cpp @@ -831,6 +831,13 @@ bool CGUIMediaWindow::Update(const CStdString &strDirectory, bool updateFilterPa } if (m_vecItems->GetPath().Equals("sources://video/")) showLabel = 999; + else if (m_vecItems->GetPath().Equals("sources://music/")) + showLabel = 998; + else if (m_vecItems->GetPath().Equals("sources://pictures/")) + showLabel = 997; + else if (m_vecItems->GetPath().Equals("sources://programs/") || + m_vecItems->GetPath().Equals("sources://files/")) + showLabel = 1026; if (showLabel && (m_vecItems->Size() == 0 || !m_guiState->DisableAddSourceButtons())) // add 'add source button' { CStdString strLabel = g_localizeStrings.Get(showLabel);