[cosmetics] update date in GPL header
[vuplus_xbmc] / xbmc / peripherals / dialogs / GUIDialogPeripheralSettings.cpp
1 /*
2  *      Copyright (C) 2005-2013 Team XBMC
3  *      http://www.xbmc.org
4  *
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)
8  *  any later version.
9  *
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.
14  *
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/>.
18  *
19  */
20
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"
27
28 using namespace std;
29 using namespace PERIPHERALS;
30
31 #define BUTTON_DEFAULTS 50
32
33 CGUIDialogPeripheralSettings::CGUIDialogPeripheralSettings(void) :
34     CGUIDialogSettings(WINDOW_DIALOG_PERIPHERAL_SETTINGS, "DialogPeripheralSettings.xml"),
35     m_item(NULL),
36     m_bIsInitialising(true)
37 {
38 }
39
40 CGUIDialogPeripheralSettings::~CGUIDialogPeripheralSettings(void)
41 {
42   if (m_item)
43     delete m_item;
44 }
45
46 void CGUIDialogPeripheralSettings::SetFileItem(CFileItemPtr item)
47 {
48   if (m_item)
49   {
50     delete m_item;
51     m_boolSettings.clear();
52     m_intSettings.clear();
53     m_intTextSettings.clear();
54     m_floatSettings.clear();
55     m_stringSettings.clear();
56     m_settings.clear();
57   }
58
59   m_item = new CFileItem(*item.get());
60 }
61
62 void CGUIDialogPeripheralSettings::CreateSettings()
63 {
64   m_bIsInitialising = true;
65   m_usePopupSliders = g_SkinInfo->HasSkinFile("DialogSlider.xml");
66
67   if (m_item)
68   {
69     CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath());
70     if (peripheral)
71     {
72       vector<CSetting *> settings = peripheral->GetSettings();
73       for (size_t iPtr = 0; iPtr < settings.size(); iPtr++)
74       {
75         CSetting *setting = settings[iPtr];
76         if (!setting->IsVisible())
77         {
78           CLog::Log(LOGDEBUG, "%s - invisible", __FUNCTION__);
79           continue;
80         }
81
82         switch(setting->GetType())
83         {
84         case SETTINGS_TYPE_BOOL:
85           {
86             CSettingBool *boolSetting = (CSettingBool *) setting;
87             if (boolSetting)
88             {
89               m_boolSettings.insert(make_pair(CStdString(boolSetting->GetSetting()), boolSetting->GetData()));
90               AddBool(boolSetting->GetOrder(), boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetSetting()], true);
91             }
92           }
93           break;
94         case SETTINGS_TYPE_INT:
95           {
96             CSettingInt *intSetting = (CSettingInt *) setting;
97             if (intSetting)
98             {
99               if (intSetting->GetControlType() == SPIN_CONTROL_INT)
100               {
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);
103               }
104               else if (intSetting->GetControlType() == SPIN_CONTROL_TEXT)
105               {
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())
110                 {
111                   entries.push_back(make_pair(entriesItr->first, entriesItr->second));
112                   ++entriesItr;
113                 }
114                 AddSpin(intSetting->GetOrder(), intSetting->GetLabel(), &m_intTextSettings[intSetting->GetSetting()], entries);
115               }
116             }
117           }
118           break;
119         case SETTINGS_TYPE_FLOAT:
120           {
121             CSettingFloat *floatSetting = (CSettingFloat *) setting;
122             if (floatSetting)
123             {
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);
126             }
127           }
128           break;
129         case SETTINGS_TYPE_STRING:
130           {
131             CSettingString *stringSetting = (CSettingString *) setting;
132             if (stringSetting)
133             {
134               m_stringSettings.insert(make_pair(CStdString(stringSetting->GetSetting()), stringSetting->GetData()));
135               AddString(stringSetting->GetOrder(), stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetSetting()]);
136             }
137           }
138           break;
139         default:
140           //TODO add more types if needed
141           CLog::Log(LOGDEBUG, "%s - unknown type", __FUNCTION__);
142           break;
143         }
144       }
145     }
146     else
147     {
148       CLog::Log(LOGDEBUG, "%s - no peripheral", __FUNCTION__);
149     }
150   }
151
152   m_bIsInitialising = false;
153 }
154
155 void CGUIDialogPeripheralSettings::UpdatePeripheralSettings(void)
156 {
157   if (!m_item || m_bIsInitialising)
158     return;
159
160   CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath());
161   if (!peripheral)
162     return;
163
164   map<CStdString, bool>::iterator boolItr = m_boolSettings.begin();
165   while (boolItr != m_boolSettings.end())
166   {
167     peripheral->SetSetting((*boolItr).first, (*boolItr).second);
168     ++boolItr;
169   }
170
171   map<CStdString, float>::iterator intItr = m_intSettings.begin();
172   while (intItr != m_intSettings.end())
173   {
174     peripheral->SetSetting((*intItr).first, (int) (*intItr).second);
175     ++intItr;
176   }
177
178   map<CStdString, int>::iterator intTextItr = m_intTextSettings.begin();
179   while (intTextItr != m_intTextSettings.end())
180   {
181     peripheral->SetSetting((*intTextItr).first, (*intTextItr).second);
182     ++intTextItr;
183   }
184
185   map<CStdString, float>::iterator floatItr = m_floatSettings.begin();
186   while (floatItr != m_floatSettings.end())
187   {
188     peripheral->SetSetting((*floatItr).first, (*floatItr).second);
189     ++floatItr;
190   }
191
192   map<CStdString, CStdString>::iterator stringItr = m_stringSettings.begin();
193   while (stringItr != m_stringSettings.end())
194   {
195     peripheral->SetSetting((*stringItr).first, (*stringItr).second);
196     ++stringItr;
197   }
198
199   peripheral->PersistSettings();
200 }
201
202 bool CGUIDialogPeripheralSettings::OnMessage(CGUIMessage &message)
203 {
204   if (message.GetMessage() == GUI_MSG_CLICKED &&
205       message.GetSenderId() == BUTTON_DEFAULTS)
206   {
207     ResetDefaultSettings();
208     return true;
209   }
210
211   return CGUIDialogSettings::OnMessage(message);
212 }
213
214 void CGUIDialogPeripheralSettings::OnOkay(void)
215 {
216   UpdatePeripheralSettings();
217 }
218
219 void CGUIDialogPeripheralSettings::ResetDefaultSettings(void)
220 {
221   if (m_item)
222   {
223     CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath());
224     if (!peripheral)
225       return;
226
227     /* reset the settings in the peripheral */
228     peripheral->ResetDefaultSettings();
229
230     CSingleLock lock(g_graphicsContext);
231
232     /* clear the settings */
233     m_boolSettings.clear();
234     m_intSettings.clear();
235     m_intTextSettings.clear();
236     m_floatSettings.clear();
237     m_stringSettings.clear();
238     m_settings.clear();
239
240     /* reinit the window */
241     CreateSettings();
242     SetupPage(); // will clear the previous controls first
243   }
244 }