2 * Copyright (C) 2013 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
23 #include "ViewStateSettings.h"
24 #include "threads/SingleLock.h"
25 #include "utils/log.h"
26 #include "utils/StringUtils.h"
27 #include "utils/XBMCTinyXML.h"
28 #include "utils/XMLUtils.h"
30 #define XML_VIEWSTATESETTINGS "viewstates"
31 #define XML_VIEWMODE "viewmode"
32 #define XML_SORTMETHOD "sortmethod"
33 #define XML_SORTORDER "sortorder"
34 #define XML_GENERAL "general"
35 #define XML_SETTINGLEVEL "settinglevel"
39 CViewStateSettings::CViewStateSettings()
41 AddViewState("musicnavartists");
42 AddViewState("musicnavalbums");
43 AddViewState("musicnavsongs");
44 AddViewState("musiclastfm");
45 AddViewState("videonavactors");
46 AddViewState("videonavyears");
47 AddViewState("videonavgenres");
48 AddViewState("videonavtitles");
49 AddViewState("videonavepisodes", DEFAULT_VIEW_AUTO, SORT_METHOD_EPISODE);
50 AddViewState("videonavtvshows");
51 AddViewState("videonavseasons");
52 AddViewState("videonavmusicvideos");
54 AddViewState("programs", DEFAULT_VIEW_AUTO);
55 AddViewState("pictures", DEFAULT_VIEW_AUTO);
56 AddViewState("videofiles", DEFAULT_VIEW_AUTO);
57 AddViewState("musicfiles", DEFAULT_VIEW_AUTO);
62 CViewStateSettings::~CViewStateSettings()
64 for (map<string, CViewState*>::const_iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); viewState++)
65 delete viewState->second;
69 CViewStateSettings& CViewStateSettings::Get()
71 static CViewStateSettings sViewStateSettings;
72 return sViewStateSettings;
75 bool CViewStateSettings::Load(const TiXmlNode *settings)
80 CSingleLock lock(m_critical);
81 const TiXmlNode *pElement = settings->FirstChildElement(XML_VIEWSTATESETTINGS);
84 CLog::Log(LOGWARNING, "CViewStateSettings: no <viewstates> tag found");
88 for (map<string, CViewState*>::iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); viewState++)
90 const TiXmlNode* pViewState = pElement->FirstChildElement(viewState->first);
91 if (pViewState == NULL)
94 XMLUtils::GetInt(pViewState, XML_VIEWMODE, viewState->second->m_viewMode, DEFAULT_VIEW_LIST, DEFAULT_VIEW_MAX);
97 if (XMLUtils::GetInt(pViewState, XML_SORTMETHOD, sortMethod, SORT_METHOD_NONE, SORT_METHOD_MAX))
98 viewState->second->m_sortMethod = (SORT_METHOD)sortMethod;
101 if (XMLUtils::GetInt(pViewState, XML_SORTORDER, sortOrder, SortOrderNone, SortOrderDescending))
102 viewState->second->m_sortOrder = (SortOrder)sortOrder;
105 pElement = settings->FirstChild(XML_GENERAL);
106 if (pElement != NULL)
109 if (XMLUtils::GetInt(pElement, XML_SETTINGLEVEL, settingLevel, (const int)SettingLevelBasic, (const int)SettingLevelExpert))
110 m_settingLevel = (SettingLevel)settingLevel;
112 m_settingLevel = SettingLevelStandard;
118 bool CViewStateSettings::Save(TiXmlNode *settings) const
120 if (settings == NULL)
123 CSingleLock lock(m_critical);
124 // add the <viewstates> tag
125 TiXmlElement xmlViewStateElement(XML_VIEWSTATESETTINGS);
126 TiXmlNode *pViewStateNode = settings->InsertEndChild(xmlViewStateElement);
127 if (pViewStateNode == NULL)
129 CLog::Log(LOGWARNING, "CViewStateSettings: could not create <viewstates> tag");
133 for (map<string, CViewState*>::const_iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); viewState++)
135 TiXmlElement newElement(viewState->first);
136 TiXmlNode *pNewNode = pViewStateNode->InsertEndChild(newElement);
137 if (pNewNode == NULL)
140 XMLUtils::SetInt(pNewNode, XML_VIEWMODE, viewState->second->m_viewMode);
141 XMLUtils::SetInt(pNewNode, XML_SORTMETHOD, (int)viewState->second->m_sortMethod);
142 XMLUtils::SetInt(pNewNode, XML_SORTORDER, (int)viewState->second->m_sortOrder);
145 TiXmlNode *generalNode = settings->FirstChild(XML_GENERAL);
146 if (generalNode == NULL)
148 TiXmlElement generalElement(XML_GENERAL);
149 generalNode = settings->InsertEndChild(generalElement);
150 if (generalNode == NULL)
154 XMLUtils::SetInt(generalNode, XML_SETTINGLEVEL, (int)m_settingLevel);
159 void CViewStateSettings::Clear()
161 m_settingLevel = SettingLevelStandard;
164 const CViewState* CViewStateSettings::Get(const std::string &viewState) const
166 CSingleLock lock(m_critical);
167 map<string, CViewState*>::const_iterator view = m_viewStates.find(viewState);
168 if (view != m_viewStates.end())
174 CViewState* CViewStateSettings::Get(const std::string &viewState)
176 CSingleLock lock(m_critical);
177 map<string, CViewState*>::iterator view = m_viewStates.find(viewState);
178 if (view != m_viewStates.end())
184 void CViewStateSettings::SetSettingLevel(SettingLevel settingLevel)
186 if (settingLevel < SettingLevelBasic)
187 m_settingLevel = SettingLevelBasic;
188 if (settingLevel > SettingLevelExpert)
189 m_settingLevel = SettingLevelExpert;
191 m_settingLevel = settingLevel;
194 void CViewStateSettings::CycleSettingLevel()
196 m_settingLevel = (SettingLevel)((int)m_settingLevel + 1);
197 if (m_settingLevel > SettingLevelExpert)
198 m_settingLevel = SettingLevelBasic;
201 void CViewStateSettings::AddViewState(const std::string& strTagName, int defaultView /* = DEFAULT_VIEW_LIST */, SORT_METHOD defaultSort /* = SORT_METHOD_LABEL */)
203 if (strTagName.empty() || m_viewStates.find(strTagName) != m_viewStates.end())
206 CViewState *viewState = new CViewState(defaultView, defaultSort, SortOrderAscending);
207 if (viewState == NULL)
210 m_viewStates.insert(make_pair(strTagName, viewState));