2 * Copyright (C) 2005-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/>.
21 #include "GUIDialogPeripheralSettings.h"
22 #include "addons/Skin.h"
23 #include "peripherals/Peripherals.h"
24 #include "settings/GUISettings.h"
25 #include "utils/log.h"
26 #include "video/dialogs/GUIDialogVideoSettings.h"
29 using namespace PERIPHERALS;
31 #define BUTTON_DEFAULTS 50
33 CGUIDialogPeripheralSettings::CGUIDialogPeripheralSettings(void) :
34 CGUIDialogSettings(WINDOW_DIALOG_PERIPHERAL_SETTINGS, "DialogPeripheralSettings.xml"),
36 m_bIsInitialising(true)
40 CGUIDialogPeripheralSettings::~CGUIDialogPeripheralSettings(void)
46 void CGUIDialogPeripheralSettings::SetFileItem(CFileItemPtr item)
51 m_boolSettings.clear();
52 m_intSettings.clear();
53 m_intTextSettings.clear();
54 m_floatSettings.clear();
55 m_stringSettings.clear();
59 m_item = new CFileItem(*item.get());
62 void CGUIDialogPeripheralSettings::CreateSettings()
64 m_bIsInitialising = true;
65 m_usePopupSliders = g_SkinInfo->HasSkinFile("DialogSlider.xml");
69 CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath());
72 vector<CSetting *> settings = peripheral->GetSettings();
73 for (size_t iPtr = 0; iPtr < settings.size(); iPtr++)
75 CSetting *setting = settings[iPtr];
76 if (!setting->IsVisible())
78 CLog::Log(LOGDEBUG, "%s - invisible", __FUNCTION__);
82 switch(setting->GetType())
84 case SETTINGS_TYPE_BOOL:
86 CSettingBool *boolSetting = (CSettingBool *) setting;
89 m_boolSettings.insert(make_pair(CStdString(boolSetting->GetSetting()), boolSetting->GetData()));
90 AddBool(boolSetting->GetOrder(), boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetSetting()], true);
94 case SETTINGS_TYPE_INT:
96 CSettingInt *intSetting = (CSettingInt *) setting;
99 if (intSetting->GetControlType() == SPIN_CONTROL_INT)
101 m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData()));
102 AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false);
104 else if (intSetting->GetControlType() == SPIN_CONTROL_TEXT)
106 m_intTextSettings.insert(make_pair(CStdString(intSetting->GetSetting()), intSetting->GetData()));
107 vector<pair<int, int> > entries;
108 map<int, int>::iterator entriesItr = intSetting->m_entries.begin();
109 while (entriesItr != intSetting->m_entries.end())
111 entries.push_back(make_pair(entriesItr->first, entriesItr->second));
114 AddSpin(intSetting->GetOrder(), intSetting->GetLabel(), &m_intTextSettings[intSetting->GetSetting()], entries);
119 case SETTINGS_TYPE_FLOAT:
121 CSettingFloat *floatSetting = (CSettingFloat *) setting;
124 m_floatSettings.insert(make_pair(CStdString(floatSetting->GetSetting()), floatSetting->GetData()));
125 AddSlider(floatSetting->GetOrder(), floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetSetting()], floatSetting->m_fMin, floatSetting->m_fStep, floatSetting->m_fMax, CGUIDialogVideoSettings::FormatFloat, false);
129 case SETTINGS_TYPE_STRING:
131 CSettingString *stringSetting = (CSettingString *) setting;
134 m_stringSettings.insert(make_pair(CStdString(stringSetting->GetSetting()), stringSetting->GetData()));
135 AddString(stringSetting->GetOrder(), stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetSetting()]);
140 //TODO add more types if needed
141 CLog::Log(LOGDEBUG, "%s - unknown type", __FUNCTION__);
148 CLog::Log(LOGDEBUG, "%s - no peripheral", __FUNCTION__);
152 m_bIsInitialising = false;
155 void CGUIDialogPeripheralSettings::UpdatePeripheralSettings(void)
157 if (!m_item || m_bIsInitialising)
160 CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath());
164 map<CStdString, bool>::iterator boolItr = m_boolSettings.begin();
165 while (boolItr != m_boolSettings.end())
167 peripheral->SetSetting((*boolItr).first, (*boolItr).second);
171 map<CStdString, float>::iterator intItr = m_intSettings.begin();
172 while (intItr != m_intSettings.end())
174 peripheral->SetSetting((*intItr).first, (int) (*intItr).second);
178 map<CStdString, int>::iterator intTextItr = m_intTextSettings.begin();
179 while (intTextItr != m_intTextSettings.end())
181 peripheral->SetSetting((*intTextItr).first, (*intTextItr).second);
185 map<CStdString, float>::iterator floatItr = m_floatSettings.begin();
186 while (floatItr != m_floatSettings.end())
188 peripheral->SetSetting((*floatItr).first, (*floatItr).second);
192 map<CStdString, CStdString>::iterator stringItr = m_stringSettings.begin();
193 while (stringItr != m_stringSettings.end())
195 peripheral->SetSetting((*stringItr).first, (*stringItr).second);
199 peripheral->PersistSettings();
202 bool CGUIDialogPeripheralSettings::OnMessage(CGUIMessage &message)
204 if (message.GetMessage() == GUI_MSG_CLICKED &&
205 message.GetSenderId() == BUTTON_DEFAULTS)
207 ResetDefaultSettings();
211 return CGUIDialogSettings::OnMessage(message);
214 void CGUIDialogPeripheralSettings::OnOkay(void)
216 UpdatePeripheralSettings();
219 void CGUIDialogPeripheralSettings::ResetDefaultSettings(void)
223 CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath());
227 /* reset the settings in the peripheral */
228 peripheral->ResetDefaultSettings();
230 CSingleLock lock(g_graphicsContext);
232 /* clear the settings */
233 m_boolSettings.clear();
234 m_intSettings.clear();
235 m_intTextSettings.clear();
236 m_floatSettings.clear();
237 m_stringSettings.clear();
240 /* reinit the window */
242 SetupPage(); // will clear the previous controls first