summaryrefslogtreecommitdiffstats
path: root/xbmc/guilib/GUIListItem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/guilib/GUIListItem.cpp')
-rw-r--r--xbmc/guilib/GUIListItem.cpp441
1 files changed, 441 insertions, 0 deletions
diff --git a/xbmc/guilib/GUIListItem.cpp b/xbmc/guilib/GUIListItem.cpp
new file mode 100644
index 0000000..e815e4d
--- /dev/null
+++ b/xbmc/guilib/GUIListItem.cpp
@@ -0,0 +1,441 @@
+/*
+ * 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 "GUIListItem.h"
+
+#include "GUIListItemLayout.h"
+#include "utils/Archive.h"
+#include "utils/CharsetConverter.h"
+#include "utils/StringUtils.h"
+#include "utils/Variant.h"
+
+#include <utility>
+
+bool CGUIListItem::icompare::operator()(const std::string &s1, const std::string &s2) const
+{
+ return StringUtils::CompareNoCase(s1, s2) < 0;
+}
+
+CGUIListItem::CGUIListItem(const CGUIListItem& item)
+{
+ *this = item;
+ SetInvalid();
+}
+
+CGUIListItem::CGUIListItem(void)
+{
+ m_bIsFolder = false;
+ m_bSelected = false;
+ m_overlayIcon = ICON_OVERLAY_NONE;
+ m_currentItem = 1;
+}
+
+CGUIListItem::CGUIListItem(const std::string& strLabel):
+ m_strLabel(strLabel)
+{
+ m_bIsFolder = false;
+ SetSortLabel(strLabel);
+ m_bSelected = false;
+ m_overlayIcon = ICON_OVERLAY_NONE;
+ m_currentItem = 1;
+}
+
+CGUIListItem::~CGUIListItem(void)
+{
+ FreeMemory();
+}
+
+void CGUIListItem::SetLabel(const std::string& strLabel)
+{
+ if (m_strLabel == strLabel)
+ return;
+ m_strLabel = strLabel;
+ if (m_sortLabel.empty())
+ SetSortLabel(strLabel);
+ SetInvalid();
+}
+
+const std::string& CGUIListItem::GetLabel() const
+{
+ return m_strLabel;
+}
+
+
+void CGUIListItem::SetLabel2(const std::string& strLabel2)
+{
+ if (m_strLabel2 == strLabel2)
+ return;
+ m_strLabel2 = strLabel2;
+ SetInvalid();
+}
+
+const std::string& CGUIListItem::GetLabel2() const
+{
+ return m_strLabel2;
+}
+
+void CGUIListItem::SetSortLabel(const std::string &label)
+{
+ g_charsetConverter.utf8ToW(label, m_sortLabel, false);
+ // no need to invalidate - this is never shown in the UI
+}
+
+void CGUIListItem::SetSortLabel(const std::wstring &label)
+{
+ m_sortLabel = label;
+}
+
+const std::wstring& CGUIListItem::GetSortLabel() const
+{
+ return m_sortLabel;
+}
+
+void CGUIListItem::SetArt(const std::string &type, const std::string &url)
+{
+ ArtMap::iterator i = m_art.find(type);
+ if (i == m_art.end() || i->second != url)
+ {
+ m_art[type] = url;
+ SetInvalid();
+ }
+}
+
+void CGUIListItem::SetArt(const ArtMap &art)
+{
+ m_art = art;
+ SetInvalid();
+}
+
+void CGUIListItem::SetArtFallback(const std::string &from, const std::string &to)
+{
+ m_artFallbacks[from] = to;
+}
+
+void CGUIListItem::ClearArt()
+{
+ m_art.clear();
+ m_artFallbacks.clear();
+ SetProperty("libraryartfilled", false);
+}
+
+void CGUIListItem::AppendArt(const ArtMap &art, const std::string &prefix)
+{
+ for (const auto& i : art)
+ SetArt(prefix.empty() ? i.first : prefix + '.' + i.first, i.second);
+}
+
+std::string CGUIListItem::GetArt(const std::string &type) const
+{
+ ArtMap::const_iterator i = m_art.find(type);
+ if (i != m_art.end())
+ return i->second;
+ i = m_artFallbacks.find(type);
+ if (i != m_artFallbacks.end())
+ {
+ ArtMap::const_iterator j = m_art.find(i->second);
+ if (j != m_art.end())
+ return j->second;
+ }
+ return "";
+}
+
+const CGUIListItem::ArtMap &CGUIListItem::GetArt() const
+{
+ return m_art;
+}
+
+bool CGUIListItem::HasArt(const std::string &type) const
+{
+ return !GetArt(type).empty();
+}
+
+void CGUIListItem::SetOverlayImage(GUIIconOverlay icon, bool bOnOff)
+{
+ GUIIconOverlay newIcon = (bOnOff) ? GUIIconOverlay((int)(icon)+1) : icon;
+ if (m_overlayIcon == newIcon)
+ return;
+ m_overlayIcon = newIcon;
+ SetInvalid();
+}
+
+std::string CGUIListItem::GetOverlayImage() const
+{
+ switch (m_overlayIcon)
+ {
+ case ICON_OVERLAY_RAR:
+ return "OverlayRAR.png";
+ case ICON_OVERLAY_ZIP:
+ return "OverlayZIP.png";
+ case ICON_OVERLAY_LOCKED:
+ return "OverlayLocked.png";
+ case ICON_OVERLAY_UNWATCHED:
+ return "OverlayUnwatched.png";
+ case ICON_OVERLAY_WATCHED:
+ return "OverlayWatched.png";
+ case ICON_OVERLAY_HD:
+ return "OverlayHD.png";
+ default:
+ return "";
+ }
+}
+
+void CGUIListItem::Select(bool bOnOff)
+{
+ m_bSelected = bOnOff;
+}
+
+bool CGUIListItem::HasOverlay() const
+{
+ return (m_overlayIcon != CGUIListItem::ICON_OVERLAY_NONE);
+}
+
+bool CGUIListItem::IsSelected() const
+{
+ return m_bSelected;
+}
+
+CGUIListItem& CGUIListItem::operator =(const CGUIListItem& item)
+{
+ if (&item == this) return * this;
+ m_strLabel2 = item.m_strLabel2;
+ m_strLabel = item.m_strLabel;
+ m_sortLabel = item.m_sortLabel;
+ FreeMemory();
+ m_bSelected = item.m_bSelected;
+ m_overlayIcon = item.m_overlayIcon;
+ m_bIsFolder = item.m_bIsFolder;
+ m_mapProperties = item.m_mapProperties;
+ m_art = item.m_art;
+ m_artFallbacks = item.m_artFallbacks;
+ SetInvalid();
+ return *this;
+}
+
+void CGUIListItem::Archive(CArchive &ar)
+{
+ if (ar.IsStoring())
+ {
+ ar << m_bIsFolder;
+ ar << m_strLabel;
+ ar << m_strLabel2;
+ ar << m_sortLabel;
+ ar << m_bSelected;
+ ar << m_overlayIcon;
+ ar << (int)m_mapProperties.size();
+ for (const auto& it : m_mapProperties)
+ {
+ ar << it.first;
+ ar << it.second;
+ }
+ ar << (int)m_art.size();
+ for (const auto& i : m_art)
+ {
+ ar << i.first;
+ ar << i.second;
+ }
+ ar << (int)m_artFallbacks.size();
+ for (const auto& i : m_artFallbacks)
+ {
+ ar << i.first;
+ ar << i.second;
+ }
+ }
+ else
+ {
+ ar >> m_bIsFolder;
+ ar >> m_strLabel;
+ ar >> m_strLabel2;
+ ar >> m_sortLabel;
+ ar >> m_bSelected;
+
+ int overlayIcon;
+ ar >> overlayIcon;
+ m_overlayIcon = GUIIconOverlay(overlayIcon);
+
+ int mapSize;
+ ar >> mapSize;
+ for (int i = 0; i < mapSize; i++)
+ {
+ std::string key;
+ CVariant value;
+ ar >> key;
+ ar >> value;
+ SetProperty(key, value);
+ }
+ ar >> mapSize;
+ for (int i = 0; i < mapSize; i++)
+ {
+ std::string key, value;
+ ar >> key;
+ ar >> value;
+ m_art.insert(make_pair(key, value));
+ }
+ ar >> mapSize;
+ for (int i = 0; i < mapSize; i++)
+ {
+ std::string key, value;
+ ar >> key;
+ ar >> value;
+ m_artFallbacks.insert(make_pair(key, value));
+ }
+ SetInvalid();
+ }
+}
+void CGUIListItem::Serialize(CVariant &value)
+{
+ value["isFolder"] = m_bIsFolder;
+ value["strLabel"] = m_strLabel;
+ value["strLabel2"] = m_strLabel2;
+ value["sortLabel"] = m_sortLabel;
+ value["selected"] = m_bSelected;
+
+ for (const auto& it : m_mapProperties)
+ {
+ value["properties"][it.first] = it.second;
+ }
+ for (const auto& it : m_art)
+ value["art"][it.first] = it.second;
+}
+
+void CGUIListItem::FreeIcons()
+{
+ FreeMemory();
+ ClearArt();
+ SetInvalid();
+}
+
+void CGUIListItem::FreeMemory(bool immediately)
+{
+ if (m_layout)
+ {
+ m_layout->FreeResources(immediately);
+ m_layout.reset();
+ }
+ if (m_focusedLayout)
+ {
+ m_focusedLayout->FreeResources(immediately);
+ m_focusedLayout.reset();
+ }
+}
+
+void CGUIListItem::SetLayout(CGUIListItemLayoutPtr layout)
+{
+ m_layout = std::move(layout);
+}
+
+CGUIListItemLayout *CGUIListItem::GetLayout()
+{
+ return m_layout.get();
+}
+
+void CGUIListItem::SetFocusedLayout(CGUIListItemLayoutPtr layout)
+{
+ m_focusedLayout = std::move(layout);
+}
+
+CGUIListItemLayout *CGUIListItem::GetFocusedLayout()
+{
+ return m_focusedLayout.get();
+}
+
+void CGUIListItem::SetInvalid()
+{
+ if (m_layout) m_layout->SetInvalid();
+ if (m_focusedLayout) m_focusedLayout->SetInvalid();
+}
+
+void CGUIListItem::SetProperty(const std::string &strKey, const CVariant &value)
+{
+ PropertyMap::iterator iter = m_mapProperties.find(strKey);
+ if (iter == m_mapProperties.end())
+ {
+ m_mapProperties.insert(make_pair(strKey, value));
+ SetInvalid();
+ }
+ else if (iter->second != value)
+ {
+ iter->second = value;
+ SetInvalid();
+ }
+}
+
+const CVariant &CGUIListItem::GetProperty(const std::string &strKey) const
+{
+ PropertyMap::const_iterator iter = m_mapProperties.find(strKey);
+ static CVariant nullVariant = CVariant(CVariant::VariantTypeNull);
+
+ if (iter == m_mapProperties.end())
+ return nullVariant;
+
+ return iter->second;
+}
+
+bool CGUIListItem::HasProperty(const std::string &strKey) const
+{
+ PropertyMap::const_iterator iter = m_mapProperties.find(strKey);
+ if (iter == m_mapProperties.end())
+ return false;
+
+ return true;
+}
+
+void CGUIListItem::ClearProperty(const std::string &strKey)
+{
+ PropertyMap::iterator iter = m_mapProperties.find(strKey);
+ if (iter != m_mapProperties.end())
+ {
+ m_mapProperties.erase(iter);
+ SetInvalid();
+ }
+}
+
+void CGUIListItem::ClearProperties()
+{
+ if (!m_mapProperties.empty())
+ {
+ m_mapProperties.clear();
+ SetInvalid();
+ }
+}
+
+void CGUIListItem::IncrementProperty(const std::string &strKey, int nVal)
+{
+ int64_t i = GetProperty(strKey).asInteger();
+ i += nVal;
+ SetProperty(strKey, i);
+}
+
+void CGUIListItem::IncrementProperty(const std::string& strKey, int64_t nVal)
+{
+ int64_t i = GetProperty(strKey).asInteger();
+ i += nVal;
+ SetProperty(strKey, i);
+}
+
+void CGUIListItem::IncrementProperty(const std::string &strKey, double dVal)
+{
+ double d = GetProperty(strKey).asDouble();
+ d += dVal;
+ SetProperty(strKey, d);
+}
+
+void CGUIListItem::AppendProperties(const CGUIListItem &item)
+{
+ for (const auto& i : item.m_mapProperties)
+ SetProperty(i.first, i.second);
+}
+
+void CGUIListItem::SetCurrentItem(unsigned int position)
+{
+ m_currentItem = position;
+}
+
+unsigned int CGUIListItem::GetCurrentItem() const
+{
+ return m_currentItem;
+}