summaryrefslogtreecommitdiffstats
path: root/xbmc/filesystem/DirectoryHistory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/filesystem/DirectoryHistory.cpp')
-rw-r--r--xbmc/filesystem/DirectoryHistory.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/xbmc/filesystem/DirectoryHistory.cpp b/xbmc/filesystem/DirectoryHistory.cpp
new file mode 100644
index 0000000..aecf285
--- /dev/null
+++ b/xbmc/filesystem/DirectoryHistory.cpp
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "DirectoryHistory.h"
+
+#include "utils/StringUtils.h"
+#include "utils/URIUtils.h"
+#include "utils/log.h"
+
+#include <algorithm>
+
+const std::string& CDirectoryHistory::CPathHistoryItem::GetPath(bool filter /* = false */) const
+{
+ if (filter && !m_strFilterPath.empty())
+ return m_strFilterPath;
+
+ return m_strPath;
+}
+
+CDirectoryHistory::~CDirectoryHistory()
+{
+ m_vecHistory.clear();
+ m_vecPathHistory.clear();
+}
+
+void CDirectoryHistory::RemoveSelectedItem(const std::string& strDirectory)
+{
+ HistoryMap::iterator iter = m_vecHistory.find(preparePath(strDirectory));
+ if (iter != m_vecHistory.end())
+ m_vecHistory.erase(iter);
+}
+
+void CDirectoryHistory::SetSelectedItem(const std::string& strSelectedItem, const std::string& strDirectory)
+{
+ if (strSelectedItem.empty())
+ return;
+
+ std::string strDir = preparePath(strDirectory);
+ std::string strItem = preparePath(strSelectedItem, false);
+
+ HistoryMap::iterator iter = m_vecHistory.find(strDir);
+ if (iter != m_vecHistory.end())
+ {
+ iter->second.m_strItem = strItem;
+ return;
+ }
+
+ CHistoryItem item;
+ item.m_strItem = strItem;
+ item.m_strDirectory = strDir;
+ m_vecHistory[strDir] = item;
+}
+
+const std::string& CDirectoryHistory::GetSelectedItem(const std::string& strDirectory) const
+{
+ HistoryMap::const_iterator iter = m_vecHistory.find(preparePath(strDirectory));
+ if (iter != m_vecHistory.end())
+ return iter->second.m_strItem;
+
+ return StringUtils::Empty;
+}
+
+void CDirectoryHistory::AddPath(const std::string& strPath, const std::string &strFilterPath /* = "" */)
+{
+ if (!m_vecPathHistory.empty() && m_vecPathHistory.back().m_strPath == strPath)
+ {
+ if (!strFilterPath.empty())
+ m_vecPathHistory.back().m_strFilterPath = strFilterPath;
+ return;
+ }
+
+ CPathHistoryItem item;
+ item.m_strPath = strPath;
+ item.m_strFilterPath = strFilterPath;
+ m_vecPathHistory.push_back(item);
+}
+
+void CDirectoryHistory::AddPathFront(const std::string& strPath, const std::string &strFilterPath /* = "" */)
+{
+ CPathHistoryItem item;
+ item.m_strPath = strPath;
+ item.m_strFilterPath = strFilterPath;
+ m_vecPathHistory.insert(m_vecPathHistory.begin(), item);
+}
+
+std::string CDirectoryHistory::GetParentPath(bool filter /* = false */)
+{
+ if (m_vecPathHistory.empty())
+ return "";
+
+ return m_vecPathHistory.back().GetPath(filter);
+}
+
+bool CDirectoryHistory::IsInHistory(const std::string &path) const
+{
+ std::string slashEnded(path);
+ URIUtils::AddSlashAtEnd(slashEnded);
+ for (std::vector<CPathHistoryItem>::const_iterator i = m_vecPathHistory.begin(); i != m_vecPathHistory.end(); ++i)
+ {
+ std::string testPath(i->GetPath());
+ URIUtils::AddSlashAtEnd(testPath);
+ if (slashEnded == testPath)
+ return true;
+ }
+ return false;
+}
+
+std::string CDirectoryHistory::RemoveParentPath(bool filter /* = false */)
+{
+ if (m_vecPathHistory.empty())
+ return "";
+
+ std::string strParent = GetParentPath(filter);
+ m_vecPathHistory.pop_back();
+ return strParent;
+}
+
+void CDirectoryHistory::ClearPathHistory()
+{
+ m_vecPathHistory.clear();
+}
+
+bool CDirectoryHistory::IsMusicSearchUrl(CPathHistoryItem &i)
+{
+ return StringUtils::StartsWith(i.GetPath(), "musicsearch://");
+}
+
+void CDirectoryHistory::ClearSearchHistory()
+{
+ m_vecPathHistory.erase(remove_if(m_vecPathHistory.begin(), m_vecPathHistory.end(), IsMusicSearchUrl), m_vecPathHistory.end());
+}
+
+void CDirectoryHistory::DumpPathHistory()
+{
+ // debug log
+ CLog::Log(LOGDEBUG,"Current m_vecPathHistory:");
+ for (int i = 0; i < (int)m_vecPathHistory.size(); ++i)
+ CLog::Log(LOGDEBUG, " {:02}.[{}; {}]", i, m_vecPathHistory[i].m_strPath,
+ m_vecPathHistory[i].m_strFilterPath);
+}
+
+std::string CDirectoryHistory::preparePath(const std::string &strDirectory, bool tolower /* = true */)
+{
+ std::string strDir = strDirectory;
+ if (tolower)
+ StringUtils::ToLower(strDir);
+
+ URIUtils::RemoveSlashAtEnd(strDir);
+
+ return strDir;
+}