diff options
Diffstat (limited to 'xbmc/listproviders/StaticProvider.cpp')
-rw-r--r-- | xbmc/listproviders/StaticProvider.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/xbmc/listproviders/StaticProvider.cpp b/xbmc/listproviders/StaticProvider.cpp new file mode 100644 index 0000000..a5750e6 --- /dev/null +++ b/xbmc/listproviders/StaticProvider.cpp @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2013-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 "StaticProvider.h" + +#include "utils/StringUtils.h" +#include "utils/TimeUtils.h" +#include "utils/XMLUtils.h" + +CStaticListProvider::CStaticListProvider(const TiXmlElement *element, int parentID) +: IListProvider(parentID), + m_defaultItem(-1), + m_defaultAlways(false), + m_updateTime(0) +{ + assert(element); + + const TiXmlElement *item = element->FirstChildElement("item"); + while (item) + { + if (item->FirstChild()) + { + CGUIStaticItemPtr newItem(new CGUIStaticItem(item, parentID)); + m_items.push_back(newItem); + } + item = item->NextSiblingElement("item"); + } + + if (XMLUtils::GetInt(element, "default", m_defaultItem)) + { + const char *always = element->FirstChildElement("default")->Attribute("always"); + if (always && StringUtils::CompareNoCase(always, "true", 4) == 0) + m_defaultAlways = true; + } +} + +CStaticListProvider::CStaticListProvider(const std::vector<CGUIStaticItemPtr> &items) +: IListProvider(0), + m_defaultItem(-1), + m_defaultAlways(false), + m_updateTime(0), + m_items(items) +{ +} + +CStaticListProvider::CStaticListProvider(const CStaticListProvider& other) + : IListProvider(other.m_parentID), + m_defaultItem(other.m_defaultItem), + m_defaultAlways(other.m_defaultAlways), + m_updateTime(other.m_updateTime) +{ + for (const auto& item : other.m_items) + { + std::shared_ptr<CGUIListItem> control(item->Clone()); + if (!control) + continue; + + std::shared_ptr<CGUIStaticItem> newItem = std::dynamic_pointer_cast<CGUIStaticItem>(control); + if (!newItem) + continue; + + m_items.emplace_back(std::move(newItem)); + } +} + +CStaticListProvider::~CStaticListProvider() = default; + +std::unique_ptr<IListProvider> CStaticListProvider::Clone() +{ + return std::make_unique<CStaticListProvider>(*this); +} + +bool CStaticListProvider::Update(bool forceRefresh) +{ + bool changed = forceRefresh; + if (!m_updateTime) + m_updateTime = CTimeUtils::GetFrameTime(); + else if (CTimeUtils::GetFrameTime() - m_updateTime > 1000) + { + m_updateTime = CTimeUtils::GetFrameTime(); + for (auto& i : m_items) + i->UpdateProperties(m_parentID); + } + for (auto& i : m_items) + changed |= i->UpdateVisibility(m_parentID); + return changed; //! @todo Also returned changed if properties are changed (if so, need to update scroll to letter). +} + +void CStaticListProvider::Fetch(std::vector<CGUIListItemPtr> &items) +{ + items.clear(); + for (const auto& i : m_items) + { + if (i->IsVisible()) + items.push_back(i); + } +} + +void CStaticListProvider::SetDefaultItem(int item, bool always) +{ + m_defaultItem = item; + m_defaultAlways = always; +} + +int CStaticListProvider::GetDefaultItem() const +{ + if (m_defaultItem >= 0) + { + unsigned int offset = 0; + for (const auto& i : m_items) + { + if (i->IsVisible()) + { + if (i->m_iprogramCount == m_defaultItem) + return offset; + offset++; + } + } + } + return -1; +} + +bool CStaticListProvider::AlwaysFocusDefaultItem() const +{ + return m_defaultAlways; +} + +bool CStaticListProvider::OnClick(const CGUIListItemPtr &item) +{ + CGUIStaticItem *staticItem = static_cast<CGUIStaticItem*>(item.get()); + return staticItem->GetClickActions().ExecuteActions(0, m_parentID); +} |