Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
tree: bd9b6c6b87
Fetching contributors…

Cannot retrieve contributors at this time

2839 lines (2639 sloc) 104.534 kB
/*
* Copyright (C) 2005-2008 Team XBMC
* http://www.xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XBMC; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
* http://www.gnu.org/copyleft/gpl.html
*
*/
#include "system.h"
#include "GUIUserMessages.h"
#include "GUIWindowSettingsCategory.h"
#include "Application.h"
#include "interfaces/Builtins.h"
#include "input/KeyboardLayoutConfiguration.h"
#include "filesystem/Directory.h"
#include "Util.h"
#include "guilib/GUISpinControlEx.h"
#include "guilib/GUIRadioButtonControl.h"
#include "guilib/GUIEditControl.h"
#include "guilib/GUIImage.h"
#include "utils/Weather.h"
#include "music/MusicDatabase.h"
#include "video/VideoDatabase.h"
#include "ViewDatabase.h"
#ifdef HAS_LCD
#include "utils/LCDFactory.h"
#endif
#include "PlayListPlayer.h"
#include "addons/Skin.h"
#include "guilib/GUIAudioManager.h"
#include "network/libscrobbler/lastfmscrobbler.h"
#include "network/libscrobbler/librefmscrobbler.h"
#include "GUIPassword.h"
#include "dialogs/GUIDialogGamepad.h"
#include "dialogs/GUIDialogNumeric.h"
#include "dialogs/GUIDialogFileBrowser.h"
#include "addons/GUIDialogAddonSettings.h"
#include "addons/GUIWindowAddonBrowser.h"
#include "dialogs/GUIDialogContextMenu.h"
#include "dialogs/GUIDialogKeyboard.h"
#include "dialogs/GUIDialogYesNo.h"
#include "dialogs/GUIDialogOK.h"
#include "dialogs/GUIDialogProgress.h"
#include "dialogs/GUIDialogKaiToast.h"
#include "addons/Visualisation.h"
#include "addons/AddonManager.h"
#include "addons/AddonInstaller.h"
#include "storage/MediaManager.h"
#include "network/Network.h"
#include "guilib/GUIControlGroupList.h"
#include "guilib/GUIWindowManager.h"
#include "guilib/GUIFontManager.h"
#include "cores/AudioEngine/AEFactory.h"
#ifdef _LINUX
#include "LinuxTimezone.h"
#include <dlfcn.h>
#ifdef HAS_HAL
#include "HALManager.h"
#endif
#endif
#if defined(TARGET_DARWIN_OSX)
#include "XBMCHelper.h"
#endif
#include "network/GUIDialogAccessPoints.h"
#include "filesystem/Directory.h"
#include "FileItem.h"
#include "guilib/GUIToggleButtonControl.h"
#include "filesystem/SpecialProtocol.h"
#include "network/Zeroconf.h"
#include "peripherals/Peripherals.h"
#include "peripherals/dialogs/GUIDialogPeripheralManager.h"
#ifdef _WIN32
#include "WIN32Util.h"
#endif
#include <map>
#include "Settings.h"
#include "AdvancedSettings.h"
#include "input/MouseStat.h"
#if defined(TARGET_WINDOWS)
#include "input/windows/WINJoystick.h"
#elif defined(HAS_SDL_JOYSTICK)
#include "input/SDLJoystick.h"
#endif
#include "guilib/LocalizeStrings.h"
#include "LangInfo.h"
#include "utils/StringUtils.h"
#include "utils/URIUtils.h"
#include "utils/SystemInfo.h"
#include "windowing/WindowingFactory.h"
#if defined(HAVE_LIBCRYSTALHD)
#include "cores/dvdplayer/DVDCodecs/Video/CrystalHD.h"
#endif
#if defined(HAS_AIRPLAY)
#include "network/AirPlayServer.h"
#endif
#if defined(HAS_WEB_SERVER)
#include "network/WebServer.h"
#endif
using namespace std;
using namespace XFILE;
using namespace ADDON;
using namespace PERIPHERALS;
#define CONTROL_GROUP_BUTTONS 0
#define CONTROL_GROUP_SETTINGS 1
#define CONTROL_SETTINGS_LABEL 2
#define CATEGORY_GROUP_ID 3
#define SETTINGS_GROUP_ID 5
#define CONTROL_DEFAULT_BUTTON 7
#define CONTROL_DEFAULT_RADIOBUTTON 8
#define CONTROL_DEFAULT_SPIN 9
#define CONTROL_DEFAULT_CATEGORY_BUTTON 10
#define CONTROL_DEFAULT_SEPARATOR 11
#define CONTROL_DEFAULT_EDIT 12
#define CONTROL_START_BUTTONS -100
#define CONTROL_START_CONTROL -80
CGUIWindowSettingsCategory::CGUIWindowSettingsCategory(void)
: CGUIWindow(WINDOW_SETTINGS_MYPICTURES, "SettingsCategory.xml")
{
m_pOriginalSpin = NULL;
m_pOriginalRadioButton = NULL;
m_pOriginalButton = NULL;
m_pOriginalCategoryButton = NULL;
m_pOriginalImage = NULL;
m_pOriginalEdit = NULL;
// set the correct ID range...
m_idRange = 8;
m_iScreen = 0;
m_strOldTrackFormat = "";
m_strOldTrackFormatRight = "";
m_returningFromSkinLoad = false;
m_delayedSetting = NULL;
}
CGUIWindowSettingsCategory::~CGUIWindowSettingsCategory(void)
{
FreeControls();
delete m_pOriginalEdit;
}
bool CGUIWindowSettingsCategory::OnBack(int actionID)
{
g_settings.Save();
m_lastControlID = 0; // don't save the control as we go to a different window each time
return CGUIWindow::OnBack(actionID);
}
bool CGUIWindowSettingsCategory::OnMessage(CGUIMessage &message)
{
switch (message.GetMessage())
{
case GUI_MSG_CLICKED:
{
unsigned int iControl = message.GetSenderId();
for (unsigned int i = 0; i < m_vecSettings.size(); i++)
{
if (m_vecSettings[i]->GetID() == (int)iControl)
OnClick(m_vecSettings[i]);
}
}
break;
case GUI_MSG_FOCUSED:
{
CGUIWindow::OnMessage(message);
int focusedControl = GetFocusedControlID();
if (focusedControl >= CONTROL_START_BUTTONS && focusedControl < (int)(CONTROL_START_BUTTONS + m_vecSections.size()) &&
focusedControl - CONTROL_START_BUTTONS != m_iSection && !m_returningFromSkinLoad)
{
// changing section, check for updates and cancel any delayed changes
m_delayedSetting = NULL;
CheckForUpdates();
if (m_vecSections[focusedControl-CONTROL_START_BUTTONS]->m_strCategory == "masterlock")
{
if (!g_passwordManager.IsMasterLockUnlocked(true))
{ // unable to go to this category - focus the previous one
SET_CONTROL_FOCUS(CONTROL_START_BUTTONS + m_iSection, 0);
return false;
}
}
m_iSection = focusedControl - CONTROL_START_BUTTONS;
CreateSettings();
}
return true;
}
case GUI_MSG_LOAD_SKIN:
{
if (IsActive())
m_returningFromSkinLoad = true;
}
break;
case GUI_MSG_WINDOW_INIT:
{
m_delayedSetting = NULL;
if (message.GetParam1() != WINDOW_INVALID && !m_returningFromSkinLoad)
{ // coming to this window first time (ie not returning back from some other window)
// so we reset our section and control states
m_iSection = 0;
ResetControlStates();
}
m_iScreen = (int)message.GetParam2() - (int)CGUIWindow::GetID();
CGUIWindow::OnMessage(message);
m_returningFromSkinLoad = false;
return true;
}
break;
case GUI_MSG_UPDATE_ITEM:
if (m_delayedSetting)
{
OnSettingChanged(m_delayedSetting);
m_delayedSetting = NULL;
return true;
}
break;
case GUI_MSG_NOTIFY_ALL:
{
if (message.GetParam1() == GUI_MSG_WINDOW_RESIZE)
{
// Cancel delayed setting - it's only used for res changing anyway
m_delayedSetting = NULL;
if (IsActive() && g_guiSettings.GetResolution() != g_graphicsContext.GetVideoResolution())
{
g_guiSettings.SetResolution(g_graphicsContext.GetVideoResolution());
CreateSettings();
}
}
}
break;
case GUI_MSG_WINDOW_DEINIT:
{
m_delayedSetting = NULL;
CheckForUpdates();
CGUIWindow::OnMessage(message);
FreeControls();
return true;
}
break;
}
return CGUIWindow::OnMessage(message);
}
void CGUIWindowSettingsCategory::SetupControls()
{
// cleanup first, if necessary
FreeControls();
m_pOriginalSpin = (CGUISpinControlEx*)GetControl(CONTROL_DEFAULT_SPIN);
m_pOriginalRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_DEFAULT_RADIOBUTTON);
m_pOriginalCategoryButton = (CGUIButtonControl *)GetControl(CONTROL_DEFAULT_CATEGORY_BUTTON);
m_pOriginalButton = (CGUIButtonControl *)GetControl(CONTROL_DEFAULT_BUTTON);
m_pOriginalImage = (CGUIImage *)GetControl(CONTROL_DEFAULT_SEPARATOR);
if (!m_pOriginalCategoryButton || !m_pOriginalSpin || !m_pOriginalRadioButton || !m_pOriginalButton)
return ;
m_pOriginalEdit = (CGUIEditControl *)GetControl(CONTROL_DEFAULT_EDIT);
if (!m_pOriginalEdit || m_pOriginalEdit->GetControlType() != CGUIControl::GUICONTROL_EDIT)
{
delete m_pOriginalEdit;
m_pOriginalEdit = new CGUIEditControl(*m_pOriginalButton);
}
m_pOriginalSpin->SetVisible(false);
m_pOriginalRadioButton->SetVisible(false);
m_pOriginalButton->SetVisible(false);
m_pOriginalCategoryButton->SetVisible(false);
m_pOriginalEdit->SetVisible(false);
if (m_pOriginalImage) m_pOriginalImage->SetVisible(false);
// setup our control groups...
CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(CATEGORY_GROUP_ID);
if (!group)
return;
// get a list of different sections
CSettingsGroup *pSettingsGroup = g_guiSettings.GetGroup(m_iScreen);
if (!pSettingsGroup) return ;
// update the screen string
SET_CONTROL_LABEL(CONTROL_SETTINGS_LABEL, pSettingsGroup->GetLabelID());
// get the categories we need
pSettingsGroup->GetCategories(m_vecSections);
// run through and create our buttons...
int j=0;
for (unsigned int i = 0; i < m_vecSections.size(); i++)
{
if (m_vecSections[i]->m_labelID == 12360 && !g_settings.IsMasterUser())
continue;
CGUIButtonControl *pButton = NULL;
if (m_pOriginalCategoryButton->GetControlType() == CGUIControl::GUICONTROL_TOGGLEBUTTON)
pButton = new CGUIToggleButtonControl(*(CGUIToggleButtonControl *)m_pOriginalCategoryButton);
else
pButton = new CGUIButtonControl(*m_pOriginalCategoryButton);
pButton->SetLabel(g_localizeStrings.Get(m_vecSections[i]->m_labelID));
pButton->SetID(CONTROL_START_BUTTONS + j);
pButton->SetVisible(true);
pButton->AllocResources();
group->AddControl(pButton);
j++;
}
if (m_iSection < 0 || m_iSection >= (int)m_vecSections.size())
m_iSection = 0;
CreateSettings();
// set focus correctly
m_defaultControl = CONTROL_START_BUTTONS;
}
CGUIControl* CGUIWindowSettingsCategory::AddIntBasedSpinControl(CSetting *pSetting, float groupWidth, int &iControlID)
{
CSettingInt *pSettingInt = (CSettingInt*)pSetting;
CGUISpinControlEx *pControl = (CGUISpinControlEx *)AddSetting(pSetting, groupWidth, iControlID);
if (!pSettingInt->m_entries.empty())
{
for (map<int,int>::iterator it=pSettingInt->m_entries.begin(); it != pSettingInt->m_entries.end();++it)
pControl->AddLabel(g_localizeStrings.Get(it->first), it->second);
pControl->SetValue(pSettingInt->GetData());
}
return pControl;
}
void CGUIWindowSettingsCategory::CreateSettings()
{
FreeSettingsControls();
CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(SETTINGS_GROUP_ID);
if (!group)
return;
vecSettings settings;
g_guiSettings.GetSettingsGroup(m_vecSections[m_iSection], settings);
int iControlID = CONTROL_START_CONTROL;
for (unsigned int i = 0; i < settings.size(); i++)
{
CSetting *pSetting = settings[i];
CStdString strSetting = pSetting->GetSetting();
if (pSetting->GetType() == SETTINGS_TYPE_INT)
{
CGUISpinControlEx *pControl = (CGUISpinControlEx *)AddIntBasedSpinControl(pSetting, group->GetWidth(), iControlID);
CSettingInt *pSettingInt = (CSettingInt*)pSetting;
if (strSetting.Equals("videoplayer.pauseafterrefreshchange"))
{
pControl->AddLabel(g_localizeStrings.Get(13551), 0);
for (int i = 1; i <= MAXREFRESHCHANGEDELAY; i++)
{
CStdString delayText;
delayText.Format(g_localizeStrings.Get(13553).c_str(), (double)i / 10.0);
pControl->AddLabel(delayText, i);
}
pControl->SetValue(pSettingInt->GetData());
}
else if (strSetting.Equals("subtitles.color"))
{
for (int i = SUBTITLE_COLOR_START; i <= SUBTITLE_COLOR_END; i++)
pControl->AddLabel(g_localizeStrings.Get(760 + i), i);
pControl->SetValue(pSettingInt->GetData());
}
else if (strSetting.Equals("lookandfeel.startupwindow"))
FillInStartupWindow(pSetting);
else if (strSetting.Equals("subtitles.height") || strSetting.Equals("karaoke.fontheight") )
FillInSubtitleHeights(pSetting, pControl);
else if (strSetting.Equals("videoscreen.screen"))
FillInScreens(strSetting, g_guiSettings.GetResolution());
else if (strSetting.Equals("videoscreen.resolution"))
FillInResolutions(strSetting, g_guiSettings.GetInt("videoscreen.screen"), g_guiSettings.GetResolution(), false);
continue;
}
#ifdef HAS_WEB_SERVER
else if (strSetting.Equals("services.webserverport"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
CBaseSettingControl *control = GetSetting(pSetting->GetSetting());
control->SetDelayed();
continue;
}
#endif
else if (strSetting.Equals("services.esport"))
{
#ifdef HAS_EVENT_SERVER
AddSetting(pSetting, group->GetWidth(), iControlID);
CBaseSettingControl *control = GetSetting(pSetting->GetSetting());
control->SetDelayed();
continue;
#endif
}
else if (strSetting.Equals("network.httpproxyport"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
CBaseSettingControl *control = GetSetting(pSetting->GetSetting());
control->SetDelayed();
continue;
}
else if (strSetting.Equals("subtitles.font") || strSetting.Equals("karaoke.font") )
{
AddSetting(pSetting, group->GetWidth(), iControlID);
FillInSubtitleFonts(pSetting);
continue;
}
else if (strSetting.Equals("subtitles.charset") || strSetting.Equals("locale.charset") || strSetting.Equals("karaoke.charset"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
FillInCharSets(pSetting);
continue;
}
else if (strSetting.Equals("lookandfeel.font"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
FillInSkinFonts(pSetting);
continue;
}
else if (strSetting.Equals("lookandfeel.soundskin"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
FillInSoundSkins(pSetting);
continue;
}
else if (strSetting.Equals("locale.language"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
GetSetting(pSetting->GetSetting())->SetDelayed();
FillInLanguages(pSetting);
continue;
}
else if (strSetting.Equals("locale.audiolanguage") || strSetting.Equals("locale.subtitlelanguage"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
vector<CStdString> languages;
languages.push_back(g_localizeStrings.Get(308));
languages.push_back(g_localizeStrings.Get(309));
vector<CStdString> languageKeys;
languageKeys.push_back("original");
languageKeys.push_back("default");
FillInLanguages(pSetting, languages, languageKeys);
continue;
}
#ifdef _LINUX
else if (strSetting.Equals("locale.timezonecountry"))
{
CStdString myTimezoneCountry = g_guiSettings.GetString("locale.timezonecountry");
int myTimezeoneCountryIndex = 0;
CGUISpinControlEx *pControl = (CGUISpinControlEx *)AddSetting(pSetting, group->GetWidth(), iControlID);
vector<CStdString> countries = g_timezone.GetCounties();
for (unsigned int i=0; i < countries.size(); i++)
{
if (countries[i] == myTimezoneCountry)
myTimezeoneCountryIndex = i;
pControl->AddLabel(countries[i], i);
}
pControl->SetValue(myTimezeoneCountryIndex);
continue;
}
else if (strSetting.Equals("locale.timezone"))
{
CStdString myTimezoneCountry = g_guiSettings.GetString("locale.timezonecountry");
CStdString myTimezone = g_guiSettings.GetString("locale.timezone");
int myTimezoneIndex = 0;
CGUISpinControlEx *pControl = (CGUISpinControlEx *)AddSetting(pSetting, group->GetWidth(), iControlID);
pControl->Clear();
vector<CStdString> timezones = g_timezone.GetTimezonesByCountry(myTimezoneCountry);
for (unsigned int i=0; i < timezones.size(); i++)
{
if (timezones[i] == myTimezone)
myTimezoneIndex = i;
pControl->AddLabel(timezones[i], i);
}
pControl->SetValue(myTimezoneIndex);
continue;
}
#endif
else if (strSetting.Equals("videoscreen.screenmode"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
FillInRefreshRates(strSetting, g_guiSettings.GetResolution(), false);
continue;
}
else if (strSetting.Equals("lookandfeel.skintheme"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
FillInSkinThemes(pSetting);
continue;
}
else if (strSetting.Equals("lookandfeel.skincolors"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
FillInSkinColors(pSetting);
continue;
}
/*
FIXME: setting is hidden in GUI because not supported properly.
else if (strSetting.Equals("videoplayer.displayresolution") || strSetting.Equals("pictures.displayresolution"))
{
FillInResolutions(pSetting);
}
*/
else if (strSetting.Equals("locale.country"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
FillInRegions(pSetting);
continue;
}
else if (strSetting.Equals("network.interface"))
{
FillInNetworkInterfaces(pSetting, group->GetWidth(), iControlID);
continue;
}
else if (strSetting.Equals("audiooutput.audiodevice"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
FillInAudioDevices(pSetting);
continue;
}
else if (strSetting.Equals("audiooutput.passthroughdevice"))
{
AddSetting(pSetting, group->GetWidth(), iControlID);
FillInAudioDevices(pSetting,true);
continue;
}
AddSetting(pSetting, group->GetWidth(), iControlID);
}
if (m_vecSections[m_iSection]->m_strCategory == "network")
NetworkInterfaceChanged();
// update our settings (turns controls on/off as appropriate)
UpdateSettings();
}
void CGUIWindowSettingsCategory::UpdateSettings()
{
for (unsigned int i = 0; i < m_vecSettings.size(); i++)
{
CBaseSettingControl *pSettingControl = m_vecSettings[i];
pSettingControl->Update();
CStdString strSetting = pSettingControl->GetSetting()->GetSetting();
#ifdef HAVE_LIBVDPAU
if (strSetting.Equals("videoplayer.vdpauUpscalingLevel"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
{
pControl->SetEnabled(true);
}
}
else
#endif
if (strSetting.Equals("videoscreen.resolution"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
pControl->SetEnabled(g_guiSettings.GetInt("videoscreen.screen") != DM_WINDOWED);
}
else if (strSetting.Equals("videoscreen.screenmode"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
pControl->SetEnabled(g_guiSettings.GetInt("videoscreen.screen") != DM_WINDOWED);
}
else if (strSetting.Equals("videoscreen.fakefullscreen"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
pControl->SetEnabled(g_guiSettings.GetInt("videoscreen.screen") != DM_WINDOWED);
}
#if defined(TARGET_DARWIN_OSX) || defined(_WIN32)
else if (strSetting.Equals("videoscreen.blankdisplays"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
{
if (g_Windowing.IsFullScreen())
pControl->SetEnabled(true);
else
pControl->SetEnabled(false);
}
}
#endif
#if defined(TARGET_DARWIN_OSX)
else if (strSetting.Equals("input.appleremotemode"))
{
int remoteMode = g_guiSettings.GetInt("input.appleremotemode");
// if it's not disabled, start the event server or else apple remote won't work
if ( remoteMode != APPLE_REMOTE_DISABLED )
{
g_guiSettings.SetBool("services.esenabled", true);
if (!g_application.StartEventServer())
CGUIDialogKaiToast::QueueNotification("DefaultIconWarning.png", g_localizeStrings.Get(33102), g_localizeStrings.Get(33100));
}
// if XBMC helper is running, prompt user before effecting change
if ( XBMCHelper::GetInstance().IsRunning() && XBMCHelper::GetInstance().GetMode()!=remoteMode )
{
bool cancelled;
if (!CGUIDialogYesNo::ShowAndGetInput(13144, 13145, 13146, 13147, -1, -1, cancelled, 10000))
{
// user declined, restore previous spinner state and appleremote mode
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
g_guiSettings.SetInt("input.appleremotemode", XBMCHelper::GetInstance().GetMode());
pControl->SetValue(XBMCHelper::GetInstance().GetMode());
}
else
{
// reload configuration
XBMCHelper::GetInstance().Configure();
}
}
else
{
// set new configuration.
XBMCHelper::GetInstance().Configure();
}
if (XBMCHelper::GetInstance().ErrorStarting() == true)
{
// inform user about error
CGUIDialogOK::ShowAndGetInput(13620, 13621, 20022, 20022);
// reset spinner to disabled state
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
pControl->SetValue(APPLE_REMOTE_DISABLED);
}
}
else if (strSetting.Equals("input.appleremotealwayson"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
{
int value = g_guiSettings.GetInt("input.appleremotemode");
if (value != APPLE_REMOTE_DISABLED)
pControl->SetEnabled(true);
else
pControl->SetEnabled(false);
}
}
else if (strSetting.Equals("input.appleremotesequencetime"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
{
int value = g_guiSettings.GetInt("input.appleremotemode");
if (value == APPLE_REMOTE_UNIVERSAL)
pControl->SetEnabled(true);
else
pControl->SetEnabled(false);
}
}
#endif
else if (strSetting.Equals("filelists.allowfiledeletion"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(!g_settings.GetCurrentProfile().filesLocked() || g_passwordManager.bMasterUser);
}
else if (strSetting.Equals("filelists.showaddsourcebuttons"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_settings.GetCurrentProfile().canWriteSources() || g_passwordManager.bMasterUser);
}
else if (strSetting.Equals("masterlock.startuplock"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_settings.GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE);
}
else if (!strSetting.Equals("services.esenabled")
&& strSetting.Left(11).Equals("services.es"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_guiSettings.GetBool("services.esenabled"));
}
else if (strSetting.Equals("audiocds.quality"))
{ // only visible if we are doing non-WAV ripping
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_guiSettings.GetInt("audiocds.encoder") != CDDARIP_ENCODER_WAV &&
g_guiSettings.GetInt("audiocds.encoder") != CDDARIP_ENCODER_FLAC);
}
else if (strSetting.Equals("audiocds.bitrate"))
{ // only visible if we are ripping to CBR
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_guiSettings.GetInt("audiocds.encoder") != CDDARIP_ENCODER_WAV &&
g_guiSettings.GetInt("audiocds.encoder") != CDDARIP_ENCODER_FLAC &&
g_guiSettings.GetInt("audiocds.quality") == CDDARIP_QUALITY_CBR);
}
else if (strSetting.Equals("audiocds.compressionlevel"))
{ // only visible if we are doing FLAC ripping
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_guiSettings.GetInt("audiocds.encoder") == CDDARIP_ENCODER_FLAC);
}
else if (
strSetting.Equals("audiooutput.passthroughdevice") ||
strSetting.Equals("audiooutput.ac3passthrough") ||
strSetting.Equals("audiooutput.dtspassthrough") ||
strSetting.Equals("audiooutput.passthroughaac"))
{ // only visible if we are in digital mode
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(AUDIO_IS_BITSTREAM(g_guiSettings.GetInt("audiooutput.mode")));
}
else if (
strSetting.Equals("audiooutput.multichannellpcm" ) ||
strSetting.Equals("audiooutput.truehdpassthrough") ||
strSetting.Equals("audiooutput.dtshdpassthrough" ))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
{
if (strSetting.Equals("audiooutput.dtshdpassthrough") && !g_guiSettings.GetBool("audiooutput.dtspassthrough"))
pControl->SetEnabled(false);
else
pControl->SetEnabled(g_guiSettings.GetInt("audiooutput.mode") == AUDIO_HDMI);
}
}
else if (strSetting.Equals("audiooutput.guisoundmode"))
{
CAEFactory::SetSoundMode(g_guiSettings.GetInt("audiooutput.guisoundmode"));
}
else if (strSetting.Equals("musicplayer.crossfade"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_guiSettings.GetString("audiooutput.audiodevice").find("wasapi:") == CStdString::npos);
}
else if (strSetting.Equals("musicplayer.crossfadealbumtracks"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_guiSettings.GetInt("musicplayer.crossfade") > 0 &&
g_guiSettings.GetString("audiooutput.audiodevice").find("wasapi:") == CStdString::npos);
}
#ifdef HAS_WEB_SERVER
else if (strSetting.Equals("services.webserverusername") ||
strSetting.Equals("services.webserverpassword"))
{
CGUIEditControl *pControl = (CGUIEditControl *)GetControl(pSettingControl->GetID());
if (pControl)
pControl->SetEnabled(g_guiSettings.GetBool("services.webserver"));
}
#endif
#ifdef HAS_AIRPLAY
else if ( strSetting.Equals("services.airplaypassword") ||
strSetting.Equals("services.useairplaypassword"))
{
if (strSetting.Equals("services.airplaypassword"))
{
CGUIEditControl *pControl = (CGUIEditControl *)GetControl(pSettingControl->GetID());
if (pControl)
pControl->SetEnabled(g_guiSettings.GetBool("services.useairplaypassword"));
}
else//useairplaypassword
{
CGUIRadioButtonControl *pControl = (CGUIRadioButtonControl *)GetControl(pSettingControl->GetID());
if (pControl)
pControl->SetEnabled(g_guiSettings.GetBool("services.airplay"));
}
//set credentials to airplay server
if (g_guiSettings.GetBool("services.airplay"))
{
CStdString password = g_guiSettings.GetString("services.airplaypassword");
CAirPlayServer::SetCredentials(g_guiSettings.GetBool("services.useairplaypassword"),
password);
}
}
#endif//HAS_AIRPLAY
else if (strSetting.Equals("network.ipaddress") || strSetting.Equals("network.subnet") || strSetting.Equals("network.gateway") || strSetting.Equals("network.dns"))
{
#ifdef _LINUX
bool enabled = (geteuid() == 0);
#else
bool enabled = false;
#endif
CGUISpinControlEx* pControl1 = (CGUISpinControlEx *)GetControl(GetSetting("network.assignment")->GetID());
if (pControl1)
enabled = (pControl1->GetValue() == NETWORK_STATIC);
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(enabled);
}
else if (strSetting.Equals("network.assignment"))
{
CGUISpinControlEx* pControl1 = (CGUISpinControlEx *)GetControl(GetSetting("network.assignment")->GetID());
#ifdef HAS_LINUX_NETWORK
if (pControl1)
pControl1->SetEnabled(geteuid() == 0);
#endif
}
else if (strSetting.Equals("network.essid") || strSetting.Equals("network.enc") || strSetting.Equals("network.key"))
{
// Get network information
CGUISpinControlEx *ifaceControl = (CGUISpinControlEx *)GetControl(GetSetting("network.interface")->GetID());
CStdString ifaceName = ifaceControl->GetLabel();
CNetworkInterface* iface = g_application.getNetwork().GetInterfaceByName(ifaceName);
bool bIsWireless = iface->IsWireless();
#ifdef HAS_LINUX_NETWORK
bool enabled = bIsWireless && (geteuid() == 0);
#else
bool enabled = bIsWireless;
#endif
CGUISpinControlEx* pControl1 = (CGUISpinControlEx *)GetControl(GetSetting("network.assignment")->GetID());
if (pControl1)
enabled &= (pControl1->GetValue() != NETWORK_DISABLED);
if (strSetting.Equals("network.key"))
{
pControl1 = (CGUISpinControlEx *)GetControl(GetSetting("network.enc")->GetID());
if (pControl1) enabled &= (pControl1->GetValue() != ENC_NONE);
}
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(enabled);
}
else if (strSetting.Equals("network.httpproxyserver") || strSetting.Equals("network.httpproxyport") ||
strSetting.Equals("network.httpproxyusername") || strSetting.Equals("network.httpproxypassword"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_guiSettings.GetBool("network.usehttpproxy"));
}
#ifdef HAS_LINUX_NETWORK
else if (strSetting.Equals("network.key"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
CGUISpinControlEx* pControl1 = (CGUISpinControlEx *)GetControl(GetSetting("network.enc")->GetID());
if (pControl && pControl1)
pControl->SetEnabled(!pControl1->IsDisabled() && pControl1->GetValue() > 0);
}
else if (strSetting.Equals("network.save"))
{
CGUIButtonControl *pControl = (CGUIButtonControl *)GetControl(pSettingControl->GetID());
pControl->SetEnabled(geteuid() == 0);
}
#endif
else if (strSetting.Equals("scrobbler.lastfmusername") || strSetting.Equals("scrobbler.lastfmpass"))
{
CGUIButtonControl *pControl = (CGUIButtonControl *)GetControl(pSettingControl->GetID());
if (pControl)
pControl->SetEnabled(g_guiSettings.GetBool("scrobbler.lastfmsubmit") | g_guiSettings.GetBool("scrobbler.lastfmsubmitradio"));
}
else if (strSetting.Equals("scrobbler.librefmusername") || strSetting.Equals("scrobbler.librefmpass"))
{
CGUIButtonControl *pControl = (CGUIButtonControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_guiSettings.GetBool("scrobbler.librefmsubmit"));
}
else if (strSetting.Equals("subtitles.color") || strSetting.Equals("subtitles.style") || strSetting.Equals("subtitles.charset"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(GetSetting(strSetting)->GetID());
pControl->SetEnabled(CUtil::IsUsingTTFSubtitles());
}
else if (strSetting.Equals("locale.charset"))
{ // TODO: Determine whether we are using a TTF font or not.
// CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
// if (pControl) pControl->SetEnabled(g_guiSettings.GetString("lookandfeel.font").Right(4) == ".ttf");
}
else if (strSetting.Equals("screensaver.settings"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
AddonPtr addon;
if (CAddonMgr::Get().GetAddon(g_guiSettings.GetString("screensaver.mode"), addon, ADDON_SCREENSAVER))
pControl->SetEnabled(addon->HasSettings());
else
pControl->SetEnabled(false);
}
else if (strSetting.Equals("screensaver.preview") ||
strSetting.Equals("screensaver.usedimonpause") ||
strSetting.Equals("screensaver.usemusicvisinstead"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(GetSetting(strSetting)->GetID());
pControl->SetEnabled(!g_guiSettings.GetString("screensaver.mode").IsEmpty());
if (strSetting.Equals("screensaver.usedimonpause") && g_guiSettings.GetString("screensaver.mode").Equals("screensaver.xbmc.builtin.dim"))
pControl->SetEnabled(false);
}
else if (strSetting.Equals("musicfiles.trackformat"))
{
if (m_strOldTrackFormat != g_guiSettings.GetString("musicfiles.trackformat"))
{
CUtil::DeleteMusicDatabaseDirectoryCache();
m_strOldTrackFormat = g_guiSettings.GetString("musicfiles.trackformat");
}
}
else if (strSetting.Equals("musicfiles.trackformatright"))
{
if (m_strOldTrackFormatRight != g_guiSettings.GetString("musicfiles.trackformatright"))
{
CUtil::DeleteMusicDatabaseDirectoryCache();
m_strOldTrackFormatRight = g_guiSettings.GetString("musicfiles.trackformatright");
}
}
#ifdef HAS_TIME_SERVER
else if (strSetting.Equals("locale.timeserveraddress"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_guiSettings.GetBool("locale.timeserver"));
}
#endif
else if (strSetting.Equals("audiocds.recordingpath") || strSetting.Equals("debug.screenshotpath"))
{
CGUIButtonControl *pControl = (CGUIButtonControl *)GetControl(pSettingControl->GetID());
if (pControl && g_guiSettings.GetString(strSetting, false).IsEmpty())
pControl->SetLabel2("");
}
else if (strSetting.Equals("lookandfeel.rssedit"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
pControl->SetEnabled(g_guiSettings.GetBool("lookandfeel.enablerssfeeds"));
}
else if (strSetting.Equals("videoplayer.pauseafterrefreshchange"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_guiSettings.GetBool("videoplayer.adjustrefreshrate"));
}
else if (strSetting.Equals("videoplayer.synctype"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(g_guiSettings.GetBool("videoplayer.usedisplayasclock"));
}
else if (strSetting.Equals("videoplayer.maxspeedadjust"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
{
bool enabled = (g_guiSettings.GetBool("videoplayer.usedisplayasclock")) &&
(g_guiSettings.GetInt("videoplayer.synctype") == SYNC_RESAMPLE);
pControl->SetEnabled(enabled);
}
}
else if (strSetting.Equals("videoplayer.resamplequality"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
{
bool enabled = (g_guiSettings.GetBool("videoplayer.usedisplayasclock")) &&
(g_guiSettings.GetInt("videoplayer.synctype") == SYNC_RESAMPLE);
pControl->SetEnabled(enabled);
}
}
else if (strSetting.Equals("weather.addonsettings"))
{
AddonPtr addon;
if (CAddonMgr::Get().GetAddon(g_guiSettings.GetString("weather.addon"), addon, ADDON_SCRIPT_WEATHER))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
pControl->SetEnabled(addon->HasSettings());
}
}
else if (strSetting.Equals("input.peripherals"))
{
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl)
pControl->SetEnabled(g_peripherals.GetNumberOfPeripherals() > 0);
}
}
}
void CGUIWindowSettingsCategory::OnClick(CBaseSettingControl *pSettingControl)
{
CStdString strSetting = pSettingControl->GetSetting()->GetSetting();
if (strSetting.Equals("weather.addonsettings"))
{
CStdString name = g_guiSettings.GetString("weather.addon");
AddonPtr addon;
if (CAddonMgr::Get().GetAddon(name, addon, ADDON_SCRIPT_WEATHER))
{ // TODO: maybe have ShowAndGetInput return a bool if settings changed, then only reset weather if true.
CGUIDialogAddonSettings::ShowAndGetInput(addon);
g_weatherManager.Refresh();
}
}
else if (strSetting.Equals("lookandfeel.rssedit"))
{
AddonPtr addon;
CAddonMgr::Get().GetAddon("script.rss.editor",addon);
if (!addon)
{
if (!CGUIDialogYesNo::ShowAndGetInput(g_localizeStrings.Get(24076), g_localizeStrings.Get(24100),"RSS Editor",g_localizeStrings.Get(24101)))
return;
CAddonInstaller::Get().Install("script.rss.editor", true, "", false);
}
CBuiltins::Execute("RunScript(script.rss.editor)");
}
else if (pSettingControl->GetSetting()->GetType() == SETTINGS_TYPE_ADDON)
{ // prompt for the addon
CSettingAddon *setting = (CSettingAddon *)pSettingControl->GetSetting();
CStdString addonID = setting->GetData();
if (CGUIWindowAddonBrowser::SelectAddonID(setting->m_type, addonID, setting->m_type == ADDON_SCREENSAVER || setting->m_type == ADDON_VIZ || setting->m_type == ADDON_SCRIPT_WEATHER) == 1)
setting->SetData(addonID);
else
return;
}
else if (strSetting.Equals("input.peripherals"))
{
CGUIDialogPeripheralManager *dialog = (CGUIDialogPeripheralManager *)g_windowManager.GetWindow(WINDOW_DIALOG_PERIPHERAL_MANAGER);
if (dialog)
dialog->DoModal();
return;
}
// if OnClick() returns false, the setting hasn't changed or doesn't
// require immediate update
if (!pSettingControl->OnClick())
{
UpdateSettings();
if (!pSettingControl->IsDelayed())
return;
}
if (pSettingControl->IsDelayed())
{ // delayed setting
m_delayedSetting = pSettingControl;
m_delayedTimer.StartZero();
}
else
OnSettingChanged(pSettingControl);
}
void CGUIWindowSettingsCategory::CheckForUpdates()
{
for (unsigned int i = 0; i < m_vecSettings.size(); i++)
{
CBaseSettingControl *pSettingControl = m_vecSettings[i];
if (pSettingControl->NeedsUpdate())
{
OnSettingChanged(pSettingControl);
pSettingControl->Reset();
}
}
}
void CGUIWindowSettingsCategory::OnSettingChanged(CBaseSettingControl *pSettingControl)
{
CStdString strSetting = pSettingControl->GetSetting()->GetSetting();
// ok, now check the various special things we need to do
if (pSettingControl->GetSetting()->GetType() == SETTINGS_TYPE_ADDON)
{
CSettingAddon *pSettingAddon = (CSettingAddon*)pSettingControl->GetSetting();
if (pSettingAddon->m_type == ADDON_SKIN)
{
g_application.ReloadSkin();
}
else if (pSettingAddon->m_type == ADDON_SCRIPT_WEATHER)
{
g_weatherManager.Refresh();
}
}
else if (strSetting.Equals("musicplayer.visualisation"))
{ // new visualisation choosen...
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
if (pControl->GetValue() == 0)
pSettingString->SetData("None");
else
pSettingString->SetData(pControl->GetCurrentLabel());
}
else if (strSetting.Equals("debug.showloginfo"))
{
if (g_guiSettings.GetBool("debug.showloginfo"))
{
int level = std::max(g_advancedSettings.m_logLevelHint, LOG_LEVEL_DEBUG_FREEMEM);
g_advancedSettings.m_logLevel = level;
CLog::SetLogLevel(level);
CLog::Log(LOGNOTICE, "Enabled debug logging due to GUI setting. Level %d.", level);
}
else
{
int level = std::min(g_advancedSettings.m_logLevelHint, LOG_LEVEL_DEBUG/*LOG_LEVEL_NORMAL*/);
CLog::Log(LOGNOTICE, "Disabled debug logging due to GUI setting. Level %d.", level);
g_advancedSettings.m_logLevel = level;
CLog::SetLogLevel(level);
}
}
/*else if (strSetting.Equals("musicfiles.repeat"))
{
g_playlistPlayer.SetRepeat(PLAYLIST_MUSIC_TEMP, g_guiSettings.GetBool("musicfiles.repeat") ? PLAYLIST::REPEAT_ALL : PLAYLIST::REPEAT_NONE);
}*/
else if (strSetting.Equals("musiclibrary.cleanup"))
{
CMusicDatabase musicdatabase;
musicdatabase.Clean();
CUtil::DeleteMusicDatabaseDirectoryCache();
}
else if (strSetting.Equals("videolibrary.cleanup"))
{
if (CGUIDialogYesNo::ShowAndGetInput(313, 333, 0, 0))
g_application.StartVideoCleanup();
}
else if (strSetting.Equals("videolibrary.export"))
CBuiltins::Execute("exportlibrary(video)");
else if (strSetting.Equals("musiclibrary.export"))
CBuiltins::Execute("exportlibrary(music)");
else if (strSetting.Equals("karaoke.export") )
{
CContextButtons choices;
choices.Add(1, g_localizeStrings.Get(22034));
choices.Add(2, g_localizeStrings.Get(22035));
int retVal = CGUIDialogContextMenu::ShowAndGetChoice(choices);
if ( retVal > 0 )
{
CStdString path(g_settings.GetDatabaseFolder());
VECSOURCES shares;
g_mediaManager.GetLocalDrives(shares);
if (CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(661), path, true))
{
CMusicDatabase musicdatabase;
musicdatabase.Open();
if ( retVal == 1 )
{
URIUtils::AddFileToFolder(path, "karaoke.html", path);
musicdatabase.ExportKaraokeInfo( path, true );
}
else
{
URIUtils::AddFileToFolder(path, "karaoke.csv", path);
musicdatabase.ExportKaraokeInfo( path, false );
}
musicdatabase.Close();
}
}
}
else if (strSetting.Equals("videolibrary.import"))
{
CStdString path;
VECSOURCES shares;
g_mediaManager.GetLocalDrives(shares);
if (CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(651) , path))
{
CVideoDatabase videodatabase;
videodatabase.Open();
videodatabase.ImportFromXML(path);
videodatabase.Close();
}
}
else if (strSetting.Equals("musiclibrary.import"))
{
CStdString path;
VECSOURCES shares;
g_mediaManager.GetLocalDrives(shares);
if (CGUIDialogFileBrowser::ShowAndGetFile(shares, "musicdb.xml", g_localizeStrings.Get(651) , path))
{
CMusicDatabase musicdatabase;
musicdatabase.Open();
musicdatabase.ImportFromXML(path);
musicdatabase.Close();
}
}
else if (strSetting.Equals("karaoke.importcsv"))
{
CStdString path(g_settings.GetDatabaseFolder());
VECSOURCES shares;
g_mediaManager.GetLocalDrives(shares);
if (CGUIDialogFileBrowser::ShowAndGetFile(shares, "karaoke.csv", g_localizeStrings.Get(651) , path))
{
CMusicDatabase musicdatabase;
musicdatabase.Open();
musicdatabase.ImportKaraokeInfo(path);
musicdatabase.Close();
}
}
else if (strSetting.Equals("scrobbler.lastfmsubmit") || strSetting.Equals("scrobbler.lastfmsubmitradio") || strSetting.Equals("scrobbler.lastfmusername") || strSetting.Equals("scrobbler.lastfmpass"))
{
CStdString strPassword=g_guiSettings.GetString("scrobbler.lastfmpass");
CStdString strUserName=g_guiSettings.GetString("scrobbler.lastfmusername");
if ((g_guiSettings.GetBool("scrobbler.lastfmsubmit") ||
g_guiSettings.GetBool("scrobbler.lastfmsubmitradio")) &&
!strUserName.IsEmpty() && !strPassword.IsEmpty())
{
CLastfmScrobbler::GetInstance()->Init();
}
else
{
CLastfmScrobbler::GetInstance()->Term();
}
}
else if (strSetting.Equals("scrobbler.librefmsubmit") || strSetting.Equals("scrobbler.librefmsubmitradio") || strSetting.Equals("scrobbler.librefmusername") || strSetting.Equals("scrobbler.librefmpass"))
{
CStdString strPassword=g_guiSettings.GetString("scrobbler.librefmpass");
CStdString strUserName=g_guiSettings.GetString("scrobbler.librefmusername");
if ((g_guiSettings.GetBool("scrobbler.librefmsubmit") ||
g_guiSettings.GetBool("scrobbler.librefmsubmitradio")) &&
!strUserName.IsEmpty() && !strPassword.IsEmpty())
{
CLibrefmScrobbler::GetInstance()->Init();
}
else
{
CLibrefmScrobbler::GetInstance()->Term();
}
}
else if (strSetting.Left(22).Equals("MusicPlayer.ReplayGain"))
{ // Update our replaygain settings
g_guiSettings.m_replayGain.iType = g_guiSettings.GetInt("musicplayer.replaygaintype");
g_guiSettings.m_replayGain.iPreAmp = g_guiSettings.GetInt("musicplayer.replaygainpreamp");
g_guiSettings.m_replayGain.iNoGainPreAmp = g_guiSettings.GetInt("musicplayer.replaygainnogainpreamp");
g_guiSettings.m_replayGain.bAvoidClipping = g_guiSettings.GetBool("musicplayer.replaygainavoidclipping");
}
#ifdef HAS_LCD
else if (strSetting.Equals("videoscreen.haslcd"))
{
g_lcd->Stop();
CLCDFactory factory;
delete g_lcd;
g_lcd = factory.Create();
g_lcd->Initialize();
}
#endif
#ifdef HAS_WEB_SERVER
else if ( strSetting.Equals("services.webserver") || strSetting.Equals("services.webserverport"))
{
if (strSetting.Equals("services.webserverport"))
ValidatePortNumber(pSettingControl, "8080", "80");
g_application.StopWebServer();
if (g_guiSettings.GetBool("services.webserver"))
if (!g_application.StartWebServer())
{
CGUIDialogOK::ShowAndGetInput(g_localizeStrings.Get(33101), "", g_localizeStrings.Get(33100), "");
g_guiSettings.SetBool("services.webserver", false);
}
}
else if (strSetting.Equals("services.webserverusername") || strSetting.Equals("services.webserverpassword"))
{
g_application.m_WebServer.SetCredentials(g_guiSettings.GetString("services.webserverusername"), g_guiSettings.GetString("services.webserverpassword"));
}
#endif
else if (strSetting.Equals("services.zeroconf"))
{
#ifdef HAS_ZEROCONF
//ifdef zeroconf here because it's only found in guisettings if defined
if(g_guiSettings.GetBool("services.zeroconf"))
{
CZeroconf::GetInstance()->Stop();
CZeroconf::GetInstance()->Start();
}
#ifdef HAS_AIRPLAY
else
{
g_application.StopAirplayServer(true);
g_guiSettings.SetBool("services.airplay", false);
CZeroconf::GetInstance()->Stop();
}
#endif
#endif
}
else if (strSetting.Equals("services.airplay"))
{
#ifdef HAS_AIRPLAY
if (g_guiSettings.GetBool("services.airplay"))
{
#ifdef HAS_ZEROCONF
// AirPlay needs zeroconf
if(!g_guiSettings.GetBool("services.zeroconf"))
{
g_guiSettings.SetBool("services.zeroconf", true);
CZeroconf::GetInstance()->Stop();
CZeroconf::GetInstance()->Start();
}
#endif //HAS_ZEROCONF
g_application.StartAirplayServer();//will stop the server before internal
}
else
g_application.StopAirplayServer(true);//will stop the server before internal
#endif//HAS_AIRPLAY
}
else if (strSetting.Equals("network.ipaddress"))
{
if (g_guiSettings.GetInt("network.assignment") == NETWORK_STATIC)
{
CStdString strDefault = g_guiSettings.GetString("network.ipaddress").Left(g_guiSettings.GetString("network.ipaddress").ReverseFind('.'))+".1";
if (g_guiSettings.GetString("network.gateway").Equals("0.0.0.0"))
g_guiSettings.SetString("network.gateway",strDefault);
if (g_guiSettings.GetString("network.dns").Equals("0.0.0.0"))
g_guiSettings.SetString("network.dns",strDefault);
}
}
else if (strSetting.Equals("network.httpproxyport"))
{
ValidatePortNumber(pSettingControl, "8080", "8080", false);
}
else if (strSetting.Equals("videoplayer.calibrate") || strSetting.Equals("videoscreen.guicalibration"))
{ // activate the video calibration screen
g_windowManager.ActivateWindow(WINDOW_SCREEN_CALIBRATION);
}
else if (strSetting.Equals("videoscreen.testpattern"))
{ // activate the test pattern
g_windowManager.ActivateWindow(WINDOW_TEST_PATTERN);
}
else if (strSetting.Equals("subtitles.height"))
{
if (!CUtil::IsUsingTTFSubtitles())
{
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
((CSettingInt *)pSettingControl->GetSetting())->FromString(pControl->GetCurrentLabel());
}
}
else if (strSetting.Equals("subtitles.font"))
{
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
pSettingString->SetData(pControl->GetCurrentLabel());
CSetting *pSetting = (CSetting *)g_guiSettings.GetSetting("subtitles.height");
FillInSubtitleHeights(pSetting, (CGUISpinControlEx *)GetControl(GetSetting(pSetting->GetSetting())->GetID()));
}
else if (strSetting.Equals("subtitles.charset"))
{
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
CStdString newCharset="DEFAULT";
if (pControl->GetValue()!=0)
newCharset = g_charsetConverter.getCharsetNameByLabel(pControl->GetCurrentLabel());
if (newCharset != "" && (newCharset != pSettingString->GetData() || newCharset=="DEFAULT"))
{
pSettingString->SetData(newCharset);
g_charsetConverter.reset();
}
}
else if (strSetting.Equals("karaoke.fontheight"))
{
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
((CSettingInt *)pSettingControl->GetSetting())->FromString(pControl->GetCurrentLabel());
}
else if (strSetting.Equals("karaoke.font"))
{
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
pSettingString->SetData(pControl->GetCurrentLabel());
CSetting *pSetting = (CSetting *)g_guiSettings.GetSetting("karaoke.fontheight");
FillInSubtitleHeights(pSetting, (CGUISpinControlEx *)GetControl(GetSetting(pSetting->GetSetting())->GetID()));
}
else if (strSetting.Equals("karaoke.charset"))
{
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
CStdString newCharset="DEFAULT";
if (pControl->GetValue()!=0)
newCharset = g_charsetConverter.getCharsetNameByLabel(pControl->GetCurrentLabel());
if (newCharset != "" && (newCharset != pSettingString->GetData() || newCharset=="DEFAULT"))
{
pSettingString->SetData(newCharset);
g_charsetConverter.reset();
}
}
else if (strSetting.Equals("locale.charset"))
{
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
CStdString newCharset="DEFAULT";
if (pControl->GetValue()!=0)
newCharset = g_charsetConverter.getCharsetNameByLabel(pControl->GetCurrentLabel());
if (newCharset != "" && (newCharset != pSettingString->GetData() || newCharset=="DEFAULT"))
{
pSettingString->SetData(newCharset);
g_charsetConverter.reset();
}
}
else if (strSetting.Equals("lookandfeel.font"))
{ // new font choosen...
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
CStdString strSkinFontSet = m_SkinFontSetIDs[pControl->GetCurrentLabel()];
if (strSkinFontSet != ".svn" && strSkinFontSet != g_guiSettings.GetString("lookandfeel.font"))
{
g_guiSettings.SetString("lookandfeel.font", strSkinFontSet);
g_application.ReloadSkin();
}
}
else if (strSetting.Equals("lookandfeel.soundskin"))
{ // new sound skin choosen...
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
if (pControl->GetValue()==0)
g_guiSettings.SetString("lookandfeel.soundskin", "OFF");
else if (pControl->GetValue()==1)
g_guiSettings.SetString("lookandfeel.soundskin", "SKINDEFAULT");
else
g_guiSettings.SetString("lookandfeel.soundskin", pControl->GetCurrentLabel());
g_audioManager.Enable(true);
g_audioManager.Load();
}
else if (strSetting.Equals("input.enablemouse"))
{
g_Mouse.SetEnabled(g_guiSettings.GetBool("input.enablemouse"));
}
else if (strSetting.Equals("input.enablejoystick"))
{
#if defined(HAS_SDL_JOYSTICK)
g_Joystick.SetEnabled(g_guiSettings.GetBool("input.enablejoystick"));
#endif
}
else if (strSetting.Equals("videoscreen.screen"))
{
DisplayMode mode = g_guiSettings.GetInt("videoscreen.screen");
// Cascade
FillInResolutions("videoscreen.resolution", mode, RES_DESKTOP, true);
}
else if (strSetting.Equals("videoscreen.resolution"))
{
RESOLUTION nextRes = (RESOLUTION) g_guiSettings.GetInt("videoscreen.resolution");
// Cascade
FillInRefreshRates("videoscreen.screenmode", nextRes, true);
}
else if (strSetting.Equals("videoscreen.screenmode"))
{
int iControlID = pSettingControl->GetID();
CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), iControlID);
g_windowManager.SendMessage(msg);
RESOLUTION nextRes = (RESOLUTION)msg.GetParam1();
OnRefreshRateChanged(nextRes);
}
else if (strSetting.Equals("videoscreen.vsync"))
{
int iControlID = pSettingControl->GetID();
CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), iControlID);
g_windowManager.SendMessage(msg);
// DXMERGE: This may be useful
// g_videoConfig.SetVSyncMode((VSYNC)msg.GetParam1());
}
else if (strSetting.Equals("videoscreen.fakefullscreen"))
{
if (g_graphicsContext.IsFullScreenRoot())
g_graphicsContext.SetVideoResolution(g_graphicsContext.GetVideoResolution(), true);
}
else if (strSetting.Equals("locale.audiolanguage"))
{ // new audio language chosen...
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
int iLanguage = pControl->GetValue();
if (iLanguage < 2)
{
if (iLanguage < 1)
g_guiSettings.SetString(strSetting, "original");
else
g_guiSettings.SetString(strSetting, "default");
g_langInfo.SetAudioLanguage("");
}
else
{
CStdString strLanguage = pControl->GetCurrentLabel();
if (strLanguage != pSettingString->GetData())
{
g_guiSettings.SetString(strSetting, strLanguage);
g_langInfo.SetAudioLanguage(strLanguage);
}
}
}
else if (strSetting.Equals("locale.subtitlelanguage"))
{ // new subtitle language chosen...
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
int iLanguage = pControl->GetValue();
if (iLanguage < 2)
{
if (iLanguage < 1)
g_guiSettings.SetString(strSetting, "original");
else
g_guiSettings.SetString(strSetting, "default");
g_langInfo.SetSubtitleLanguage("");
}
else
{
CStdString strLanguage = pControl->GetCurrentLabel();
if (strLanguage != pSettingString->GetData())
{
g_guiSettings.SetString(strSetting, strLanguage);
g_langInfo.SetSubtitleLanguage(strLanguage);
}
}
}
else if (strSetting.Equals("locale.language"))
{ // new language chosen...
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
CStdString strLanguage = pControl->GetCurrentLabel();
if (strLanguage != ".svn" && strLanguage != pSettingString->GetData())
g_guiSettings.SetLanguage(strLanguage);
}
else if (strSetting.Equals("lookandfeel.skintheme"))
{ //a new Theme was chosen
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
CStdString strSkinTheme;
if (pControl->GetValue() == 0) // Use default theme
strSkinTheme = "SKINDEFAULT";
else
strSkinTheme = pControl->GetCurrentLabel();
if (strSkinTheme != pSettingString->GetData())
{
g_guiSettings.SetString("lookandfeel.skintheme", strSkinTheme);
// also set the default color theme
CStdString colorTheme(URIUtils::ReplaceExtension(strSkinTheme, ".xml"));
if (colorTheme.Equals("Textures.xml"))
colorTheme = "defaults.xml";
g_guiSettings.SetString("lookandfeel.skincolors", colorTheme);
g_application.ReloadSkin();
}
}
else if (strSetting.Equals("lookandfeel.skincolors"))
{ //a new color was chosen
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
CStdString strSkinColor;
if (pControl->GetValue() == 0) // Use default colors
strSkinColor = "SKINDEFAULT";
else
strSkinColor = pControl->GetCurrentLabel() + ".xml";
if (strSkinColor != pSettingString->GetData())
{
g_guiSettings.SetString("lookandfeel.skincolors", strSkinColor);
g_application.ReloadSkin();
}
}
else if (strSetting.Equals("videoplayer.displayresolution"))
{
CSettingInt *pSettingInt = (CSettingInt *)pSettingControl->GetSetting();
int iControlID = pSettingControl->GetID();
CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), iControlID);
g_windowManager.SendMessage(msg);
pSettingInt->SetData(msg.GetParam1());
}
else if (strSetting.Equals("videoscreen.flickerfilter") || strSetting.Equals("videoscreen.soften"))
{ // reset display
g_graphicsContext.SetVideoResolution(g_guiSettings.m_LookAndFeelResolution);
}
else if (strSetting.Equals("screensaver.preview"))
{
g_application.ActivateScreenSaver(true);
}
else if (strSetting.Equals("screensaver.settings"))
{
AddonPtr addon;
if (CAddonMgr::Get().GetAddon(g_guiSettings.GetString("screensaver.mode"), addon, ADDON_SCREENSAVER))
CGUIDialogAddonSettings::ShowAndGetInput(addon);
}
else if (strSetting.Equals("debug.screenshotpath") || strSetting.Equals("audiocds.recordingpath") || strSetting.Equals("subtitles.custompath"))
{
CSettingString *pSettingString = (CSettingString *)pSettingControl->GetSetting();
CStdString path = g_guiSettings.GetString(strSetting,false);
VECSOURCES shares;
bool bWriteOnly = true;
if (strSetting.Equals("subtitles.custompath"))
{
bWriteOnly = false;
shares = g_settings.m_videoSources;
}
g_mediaManager.GetNetworkLocations(shares);
g_mediaManager.GetLocalDrives(shares);
UpdateSettings();
if (CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(pSettingString->m_iHeadingString), path, bWriteOnly))
{
pSettingString->SetData(path);
}
}
else if (strSetting.Left(22).Equals("MusicPlayer.ReplayGain"))
{ // Update our replaygain settings
g_guiSettings.m_replayGain.iType = g_guiSettings.GetInt("musicplayer.replaygaintype");
g_guiSettings.m_replayGain.iPreAmp = g_guiSettings.GetInt("musicplayer.replaygainpreamp");
g_guiSettings.m_replayGain.iNoGainPreAmp = g_guiSettings.GetInt("musicplayer.replaygainnogainpreamp");
g_guiSettings.m_replayGain.bAvoidClipping = g_guiSettings.GetBool("musicplayer.replaygainavoidclipping");
}
else if (strSetting.Equals("locale.country"))
{
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
const CStdString& strRegion=pControl->GetCurrentLabel();
g_langInfo.SetCurrentRegion(strRegion);
g_guiSettings.SetString("locale.country", strRegion);
g_weatherManager.Refresh(); // need to reset our weather, as temperatures need re-translating.
}
#ifdef HAS_TIME_SERVER
else if (strSetting.Equals("locale.timeserver") || strSetting.Equals("locale.timeserveraddress"))
{
g_application.StopTimeServer();
if (g_guiSettings.GetBool("locale.timeserver"))
g_application.StartTimeServer();
}
#endif
else if (strSetting.Equals("smb.winsserver") || strSetting.Equals("smb.workgroup") )
{
if (g_guiSettings.GetString("smb.winsserver") == "0.0.0.0")
g_guiSettings.SetString("smb.winsserver", "");
/* okey we really don't need to restarat, only deinit samba, but that could be damn hard if something is playing*/
//TODO - General way of handling setting changes that require restart
if (CGUIDialogYesNo::ShowAndGetInput(14038, 14039, 14040, -1, -1))
{
g_settings.Save();
g_application.getApplicationMessenger().RestartApp();
}
}
else if (strSetting.Equals("services.upnpserver"))
{
#ifdef HAS_UPNP
if (g_guiSettings.GetBool("services.upnpserver"))
g_application.StartUPnPServer();
else
g_application.StopUPnPServer();
#endif
}
else if (strSetting.Equals("services.upnprenderer"))
{
#ifdef HAS_UPNP
if (g_guiSettings.GetBool("services.upnprenderer"))
g_application.StartUPnPRenderer();
else
g_application.StopUPnPRenderer();
#endif
}
else if (strSetting.Equals("services.esenabled"))
{
#ifdef HAS_EVENT_SERVER
if (g_guiSettings.GetBool("services.esenabled"))
{
if (!g_application.StartEventServer())
{
CGUIDialogOK::ShowAndGetInput(g_localizeStrings.Get(33102), "", g_localizeStrings.Get(33100), "");
g_guiSettings.SetBool("services.esenabled", false);
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(false);
}
}
else
{
if (!g_application.StopEventServer(true, true))
{
g_guiSettings.SetBool("services.esenabled", true);
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(true);
}
}
#endif
#ifdef HAS_JSONRPC
if (g_guiSettings.GetBool("services.esenabled"))
{
if (!g_application.StartJSONRPCServer())
CGUIDialogOK::ShowAndGetInput(g_localizeStrings.Get(33103), "", g_localizeStrings.Get(33100), "");
}
else
g_application.StopJSONRPCServer(false);
#endif
}
else if (strSetting.Equals("services.esport"))
{
#ifdef HAS_EVENT_SERVER
ValidatePortNumber(pSettingControl, "9777", "9777");
//restart eventserver without asking user
if (g_application.StopEventServer(true, false))
{
if (!g_application.StartEventServer())
CGUIDialogOK::ShowAndGetInput(g_localizeStrings.Get(33102), "", g_localizeStrings.Get(33100), "");
}
#if defined(TARGET_DARWIN_OSX)
//reconfigure XBMCHelper for port changes
XBMCHelper::GetInstance().Configure();
#endif
#endif
}
else if (strSetting.Equals("services.esallinterfaces"))
{
#ifdef HAS_EVENT_SERVER
if (g_guiSettings.GetBool("services.esenabled"))
{
if (g_application.StopEventServer(true, true))
{
if (!g_application.StartEventServer())
CGUIDialogOK::ShowAndGetInput(g_localizeStrings.Get(33102), "", g_localizeStrings.Get(33100), "");
}
else
{
g_guiSettings.SetBool("services.esenabled", true);
CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
if (pControl) pControl->SetEnabled(true);
}
}
#endif
#ifdef HAS_JSONRPC
if (g_guiSettings.GetBool("services.esenabled"))
{
if (!g_application.StartJSONRPCServer())
CGUIDialogOK::ShowAndGetInput(g_localizeStrings.Get(33103), "", g_localizeStrings.Get(33100), "");
}
else
g_application.StopJSONRPCServer(false);
#endif
}
else if (strSetting.Equals("services.esinitialdelay") ||
strSetting.Equals("services.escontinuousdelay"))
{
#ifdef HAS_EVENT_SERVER
if (g_guiSettings.GetBool("services.esenabled"))
{
g_application.RefreshEventServer();
}
#endif
}
else if (strSetting.Equals("masterlock.lockcode"))
{
// Now Prompt User to enter the old and then the new MasterCode!
if(g_passwordManager.SetMasterLockMode())
{
// We asked for the master password and saved the new one!
// Nothing todo here
}
}
else if (strSetting.Equals("network.interface"))
{
NetworkInterfaceChanged();
}
#ifdef HAS_LINUX_NETWORK
else if (strSetting.Equals("network.save"))
{
NetworkAssignment iAssignment;
CStdString sIPAddress;
CStdString sNetworkMask;
CStdString sDefaultGateway;
CStdString sWirelessNetwork;
CStdString sWirelessKey;
CStdString sDns;
EncMode iWirelessEnc;
CStdString ifaceName;
CGUISpinControlEx *ifaceControl = (CGUISpinControlEx *)GetControl(GetSetting("network.interface")->GetID());
ifaceName = ifaceControl->GetLabel();
CNetworkInterface* iface = g_application.getNetwork().GetInterfaceByName(ifaceName);
// Update controls with information
CGUISpinControlEx* pControl1 = (CGUISpinControlEx *)GetControl(GetSetting("network.assignment")->GetID());
if (pControl1) iAssignment = (NetworkAssignment) pControl1->GetValue();
CGUIButtonControl* pControl2 = (CGUIButtonControl *)GetControl(GetSetting("network.ipaddress")->GetID());
if (pControl2) sIPAddress = pControl2->GetLabel2();
pControl2 = (CGUIButtonControl *)GetControl(GetSetting("network.subnet")->GetID());
if (pControl2) sNetworkMask = pControl2->GetLabel2();
pControl2 = (CGUIButtonControl *)GetControl(GetSetting("network.gateway")->GetID());
if (pControl2) sDefaultGateway = pControl2->GetLabel2();
pControl2 = (CGUIButtonControl *)GetControl(GetSetting("network.dns")->GetID());
if (pControl2) sDns = pControl2->GetLabel2();
pControl1 = (CGUISpinControlEx *)GetControl(GetSetting("network.enc")->GetID());
if (pControl1) iWirelessEnc = (EncMode) pControl1->GetValue();
pControl2 = (CGUIButtonControl *)GetControl(GetSetting("network.essid")->GetID());
if (pControl2) sWirelessNetwork = pControl2->GetLabel2();
pControl2 = (CGUIButtonControl *)GetControl(GetSetting("network.key")->GetID());
if (pControl2) sWirelessKey = pControl2->GetLabel2();
CGUIDialogProgress* pDlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS);
pDlgProgress->SetLine(0, "");
pDlgProgress->SetLine(1, g_localizeStrings.Get(784));
pDlgProgress->SetLine(2, "");
pDlgProgress->StartModal();
pDlgProgress->Progress();
std::vector<CStdString> nameServers;
nameServers.push_back(sDns);
g_application.getNetwork().SetNameServers(nameServers);
iface->SetSettings(iAssignment, sIPAddress, sNetworkMask, sDefaultGateway, sWirelessNetwork, sWirelessKey, iWirelessEnc);
pDlgProgress->Close();
if (iAssignment == NETWORK_DISABLED)
CGUIDialogOK::ShowAndGetInput(0, 788, 0, 0);
else if (iface->IsConnected())
CGUIDialogOK::ShowAndGetInput(0, 785, 0, 0);
else
CGUIDialogOK::ShowAndGetInput(0, 786, 0, 0);
}
else if (strSetting.Equals("network.essid"))
{
CGUIDialogAccessPoints *dialog = (CGUIDialogAccessPoints *)g_windowManager.GetWindow(WINDOW_DIALOG_ACCESS_POINTS);
if (dialog)
{
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(GetSetting("network.interface")->GetID());
dialog->SetInterfaceName(pControl->GetLabel());
dialog->DoModal();
if (dialog->WasItemSelected())
{
CGUIButtonControl* pControl2 = (CGUIButtonControl *)GetControl(GetSetting("network.essid")->GetID());
if (pControl2) pControl2->SetLabel2(dialog->GetSelectedAccessPointEssId());
pControl = (CGUISpinControlEx *)GetControl(GetSetting("network.enc")->GetID());
if (pControl) pControl->SetValue(dialog->GetSelectedAccessPointEncMode());
}
}
}
#endif
#ifdef _LINUX
else if (strSetting.Equals("locale.timezonecountry"))
{
CGUISpinControlEx *pControlCountry = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
CStdString country = pControlCountry->GetCurrentLabel();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(GetSetting("locale.timezone")->GetID());
pControl->Clear();
vector<CStdString> timezones = g_timezone.GetTimezonesByCountry(country);
for (unsigned int i=0; i < timezones.size(); i++)
{
pControl->AddLabel(timezones[i], i);
}
g_timezone.SetTimezone(pControl->GetLabel());
g_guiSettings.SetString("locale.timezonecountry",pControlCountry->GetLabel().c_str());
CGUISpinControlEx *tzControl = (CGUISpinControlEx *)GetControl(GetSetting("locale.timezone")->GetID());
g_guiSettings.SetString("locale.timezone", tzControl->GetLabel().c_str());
}
else if (strSetting.Equals("locale.timezone"))
{
CGUISpinControlEx *tzControl = (CGUISpinControlEx *)GetControl(GetSetting("locale.timezone")->GetID());
g_timezone.SetTimezone(tzControl->GetLabel());
g_guiSettings.SetString("locale.timezone", tzControl->GetLabel().c_str());
tzControl = (CGUISpinControlEx *)GetControl(GetSetting("locale.timezonecountry")->GetID());
g_guiSettings.SetString("locale.timezonecountry", tzControl->GetLabel().c_str());
}
#endif
else if (strSetting.Equals("lookandfeel.skinzoom"))
{
g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_WINDOW_RESIZE);
}
else if (strSetting.Equals("videolibrary.flattentvshows") ||
strSetting.Equals("videolibrary.removeduplicates"))
{
CUtil::DeleteVideoDatabaseDirectoryCache();
}
else if (strSetting.compare(0, 12, "audiooutput.") == 0)
{
if (strSetting.Equals("audiooutput.audiodevice"))
{
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
#if defined(TARGET_DARWIN)
g_guiSettings.SetString("audiooutput.audiodevice", pControl->GetCurrentLabel());
#else
g_guiSettings.SetString("audiooutput.audiodevice", m_AnalogAudioSinkMap[pControl->GetCurrentLabel()]);
#endif
}
#if !defined(TARGET_DARWIN)
else if (strSetting.Equals("audiooutput.passthroughdevice"))
{
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID());
g_guiSettings.SetString("audiooutput.passthroughdevice", m_DigitalAudioSinkMap[pControl->GetCurrentLabel()]);
}
#endif
CAEFactory::OnSettingsChange(strSetting);
}
UpdateSettings();
}
void CGUIWindowSettingsCategory::FreeControls()
{
// clear the category group
CGUIControlGroupList *control = (CGUIControlGroupList *)GetControl(CATEGORY_GROUP_ID);
if (control)
{
control->FreeResources();
control->ClearAll();
}
m_vecSections.clear();
FreeSettingsControls();
}
void CGUIWindowSettingsCategory::FreeSettingsControls()
{
// clear the settings group
CGUIControlGroupList *control = (CGUIControlGroupList *)GetControl(SETTINGS_GROUP_ID);
if (control)
{
control->FreeResources();
control->ClearAll();
}
for(int i = 0; (size_t)i < m_vecSettings.size(); i++)
{
delete m_vecSettings[i];
}
m_vecSettings.clear();
}
CGUIControl* CGUIWindowSettingsCategory::AddSetting(CSetting *pSetting, float width, int &iControlID)
{
if (!pSetting->IsVisible()) return NULL; // not displayed in current session
CBaseSettingControl *pSettingControl = NULL;
CGUIControl *pControl = NULL;
if (pSetting->GetControlType() == CHECKMARK_CONTROL)
{
pControl = new CGUIRadioButtonControl(*m_pOriginalRadioButton);
if (!pControl) return NULL;
((CGUIRadioButtonControl *)pControl)->SetLabel(g_localizeStrings.Get(pSetting->GetLabel()));
pControl->SetWidth(width);
pSettingControl = new CRadioButtonSettingControl((CGUIRadioButtonControl *)pControl, iControlID, pSetting);
}
else if (pSetting->GetControlType() == SPIN_CONTROL_FLOAT || pSetting->GetControlType() == SPIN_CONTROL_INT_PLUS || pSetting->GetControlType() == SPIN_CONTROL_TEXT || pSetting->GetControlType() == SPIN_CONTROL_INT)
{
pControl = new CGUISpinControlEx(*m_pOriginalSpin);
if (!pControl) return NULL;
pControl->SetWidth(width);
((CGUISpinControlEx *)pControl)->SetText(g_localizeStrings.Get(pSetting->GetLabel()));
pSettingControl = new CSpinExSettingControl((CGUISpinControlEx *)pControl, iControlID, pSetting);
}
else if (pSetting->GetControlType() == SEPARATOR_CONTROL && m_pOriginalImage)
{
pControl = new CGUIImage(*m_pOriginalImage);
if (!pControl) return NULL;
pControl->SetWidth(width);
pSettingControl = new CSeparatorSettingControl((CGUIImage *)pControl, iControlID, pSetting);
}
else if (pSetting->GetControlType() == EDIT_CONTROL_INPUT ||
pSetting->GetControlType() == EDIT_CONTROL_HIDDEN_INPUT ||
pSetting->GetControlType() == EDIT_CONTROL_MD5_INPUT ||
pSetting->GetControlType() == EDIT_CONTROL_NUMBER_INPUT ||
pSetting->GetControlType() == EDIT_CONTROL_IP_INPUT)
{
pControl = new CGUIEditControl(*m_pOriginalEdit);
if (!pControl) return NULL;
((CGUIEditControl *)pControl)->SettingsCategorySetTextAlign(XBFONT_CENTER_Y);
((CGUIEditControl *)pControl)->SetLabel(g_localizeStrings.Get(pSetting->GetLabel()));
pControl->SetWidth(width);
pSettingControl = new CEditSettingControl((CGUIEditControl *)pControl, iControlID, pSetting);
}
else if (pSetting->GetControlType() != SEPARATOR_CONTROL) // button control
{
pControl = new CGUIButtonControl(*m_pOriginalButton);
if (!pControl) return NULL;
((CGUIButtonControl *)pControl)->SettingsCategorySetTextAlign(XBFONT_CENTER_Y);
((CGUIButtonControl *)pControl)->SetLabel(g_localizeStrings.Get(pSetting->GetLabel()));
pControl->SetWidth(width);
pSettingControl = new CButtonSettingControl((CGUIButtonControl *)pControl, iControlID, pSetting);
}
if (!pControl)
{
delete pSettingControl;
return NULL;
}
pControl->SetID(iControlID++);
pControl->SetVisible(true);
CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(SETTINGS_GROUP_ID);
if (group)
{
pControl->AllocResources();
group->AddControl(pControl);
m_vecSettings.push_back(pSettingControl);
}
return pControl;
}
void CGUIWindowSettingsCategory::FrameMove()
{
if (m_delayedSetting && m_delayedTimer.GetElapsedMilliseconds() > 3000)
{ // we send a thread message so that it's processed the following frame (some settings won't
// like being changed during Render())
CGUIMessage message(GUI_MSG_UPDATE_ITEM, GetID(), GetID());
g_windowManager.SendThreadMessage(message, GetID());
m_delayedTimer.Stop();
}
CGUIWindow::FrameMove();
}
void CGUIWindowSettingsCategory::DoProcess(unsigned int currentTime, CDirtyRegionList &dirtyregions)
{
// update alpha status of current button
bool bAlphaFaded = false;
CGUIControl *control = GetFirstFocusableControl(CONTROL_START_BUTTONS + m_iSection);
if (control && !control->HasFocus())
{
if (control->GetControlType() == CGUIControl::GUICONTROL_BUTTON)
{
control->SetFocus(true);
((CGUIButtonControl *)control)->SetAlpha(0x80);
bAlphaFaded = true;
}
else if (control->GetControlType() == CGUIControl::GUICONTROL_TOGGLEBUTTON)
{
control->SetFocus(true);
((CGUIButtonControl *)control)->SetSelected(true);
bAlphaFaded = true;
}
}
CGUIWindow::DoProcess(currentTime, dirtyregions);
if (bAlphaFaded)
{
control->SetFocus(false);
if (control->GetControlType() == CGUIControl::GUICONTROL_BUTTON)
((CGUIButtonControl *)control)->SetAlpha(0xFF);
else
((CGUIButtonControl *)control)->SetSelected(false);
}
}
void CGUIWindowSettingsCategory::Render()
{
CGUIWindow::Render();
}
void CGUIWindowSettingsCategory::FillInSubtitleHeights(CSetting *pSetting, CGUISpinControlEx *pControl)
{
CSettingInt *pSettingInt = (CSettingInt*)pSetting;
pControl->SetType(SPIN_CONTROL_TYPE_TEXT);
pControl->Clear();
if (CUtil::IsUsingTTFSubtitles())
{ // easy - just fill as per usual
CStdString strLabel;
for (int i = pSettingInt->m_iMin; i <= pSettingInt->m_iMax; i += pSettingInt->m_iStep)
{
if (pSettingInt->m_iFormat > -1)
{
CStdString strFormat = g_localizeStrings.Get(pSettingInt->m_iFormat);
strLabel.Format(strFormat, i);
}
else
strLabel.Format(pSettingInt->m_strFormat, i);
pControl->AddLabel(strLabel, i);
}
pControl->SetValue(pSettingInt->GetData());
}
}
void CGUIWindowSettingsCategory::FillInSubtitleFonts(CSetting *pSetting)
{
CSettingString *pSettingString = (CSettingString*)pSetting;
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(GetSetting(pSetting->GetSetting())->GetID());
pControl->SetType(SPIN_CONTROL_TYPE_TEXT);
pControl->Clear();
int iCurrentFont = 0;
int iFont = 0;
// find TTF fonts
{
CFileItemList items;
CFileItemList items2;
CDirectory::GetDirectory("special://home/media/Fonts/", items2);
if (CDirectory::GetDirectory("special://xbmc/media/Fonts/", items))
{
items.Append(items2);
for (int i = 0; i < items.Size(); ++i)
{
CFileItemPtr pItem = items[i];
if (!pItem->m_bIsFolder)
{
if ( !URIUtils::GetExtension(pItem->GetLabel()).Equals(".ttf") ) continue;
if (pItem->GetLabel().Equals(pSettingString->GetData(), false))
iCurrentFont = iFont;
pControl->AddLabel(pItem->GetLabel(), iFont++);
}
}
}
}
pControl->SetValue(iCurrentFont);
}
void CGUIWindowSettingsCategory::FillInSkinFonts(CSetting *pSetting)
{
CBaseSettingControl *setting = GetSetting(pSetting->GetSetting());
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(setting->GetID());
pControl->SetType(SPIN_CONTROL_TYPE_TEXT);
pControl->Clear();
setting->SetDelayed();
m_SkinFontSetIDs.clear();
int iSkinFontSet = 0;
CStdString strPath = g_SkinInfo->GetSkinPath("Font.xml");
CXBMCTinyXML xmlDoc;
if (!xmlDoc.LoadFile(strPath))
{
CLog::Log(LOGERROR, "Couldn't load %s", strPath.c_str());
return ;
}
TiXmlElement* pRootElement = xmlDoc.RootElement();
CStdString strValue = pRootElement->Value();
if (strValue != CStdString("fonts"))
{
CLog::Log(LOGERROR, "file %s doesnt start with <fonts>", strPath.c_str());
return ;
}
const TiXmlNode *pChild = pRootElement->FirstChild();
strValue = pChild->Value();
if (strValue == "fontset")
{
while (pChild)
{
strValue = pChild->Value();
if (strValue == "fontset")
{
const char* idAttr = ((TiXmlElement*) pChild)->Attribute("id");
const char* idLocAttr = ((TiXmlElement*) pChild)->Attribute("idloc");
const char* unicodeAttr = ((TiXmlElement*) pChild)->Attribute("unicode");
bool isUnicode=(unicodeAttr && stricmp(unicodeAttr, "true") == 0);
bool isAllowed=true;
if (g_langInfo.ForceUnicodeFont() && !isUnicode)
isAllowed=false;
if (idAttr != NULL && isAllowed)
{
if (idLocAttr)
{
pControl->AddLabel(g_localizeStrings.Get(atoi(idLocAttr)), iSkinFontSet);
m_SkinFontSetIDs[g_localizeStrings.Get(atoi(idLocAttr))] = idAttr;
}
else
{
pControl->AddLabel(idAttr, iSkinFontSet);
m_SkinFontSetIDs[idAttr] = idAttr;
}
if (strcmpi(idAttr, g_guiSettings.GetString("lookandfeel.font").c_str()) == 0)
pControl->SetValue(iSkinFontSet);
iSkinFontSet++;
}
}
pChild = pChild->NextSibling();
}
}
else
{
// Since no fontset is defined, there is no selection of a fontset, so disable the component
pControl->AddLabel(g_localizeStrings.Get(13278), 1);
pControl->SetValue(1);
pControl->SetEnabled(false);
}
}
void CGUIWindowSettingsCategory::FillInSoundSkins(CSetting *pSetting)
{
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(GetSetting(pSetting->GetSetting())->GetID());
pControl->SetType(SPIN_CONTROL_TYPE_TEXT);
pControl->Clear();
pControl->SetShowRange(true);
//find skins...
CFileItemList items;
CDirectory::GetDirectory("special://xbmc/sounds/", items);
CDirectory::GetDirectory("special://home/sounds/", items);
int iCurrentSoundSkin = 0;
int iSoundSkin = 0;
vector<CStdString> vecSoundSkins;
int i;
for (i = 0; i < items.Size(); ++i)
{
CFileItemPtr pItem = items[i];
if (pItem->m_bIsFolder)
{
if (strcmpi(pItem->GetLabel().c_str(), ".svn") == 0) continue;
if (strcmpi(pItem->GetLabel().c_str(), "fonts") == 0) continue;
if (strcmpi(pItem->GetLabel().c_str(), "media") == 0) continue;
vecSoundSkins.push_back(pItem->GetLabel());
}
}
pControl->AddLabel(g_localizeStrings.Get(474), iSoundSkin++); // Off
pControl->AddLabel(g_localizeStrings.Get(15109), iSoundSkin++); // Skin Default
if (g_guiSettings.GetString("lookandfeel.soundskin")=="SKINDEFAULT")
iCurrentSoundSkin=1;
sort(vecSoundSkins.begin(), vecSoundSkins.end(), sortstringbyname());
for (i = 0; i < (int) vecSoundSkins.size(); ++i)
{
CStdString strSkin = vecSoundSkins[i];
if (strcmpi(strSkin.c_str(), g_guiSettings.GetString("lookandfeel.soundskin").c_str()) == 0)
{
iCurrentSoundSkin = iSoundSkin;
}
pControl->AddLabel(strSkin, iSoundSkin++);
}
pControl->SetValue(iCurrentSoundSkin);
return ;
}
void CGUIWindowSettingsCategory::FillInCharSets(CSetting *pSetting)
{
CSettingString *pSettingString = (CSettingString*)pSetting;
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(GetSetting(pSetting->GetSetting())->GetID());
pControl->SetType(SPIN_CONTROL_TYPE_TEXT);
pControl->Clear();
int iCurrentCharset = 0;
vector<CStdString> vecCharsets = g_charsetConverter.getCharsetLabels();
CStdString strCurrentCharsetLabel="DEFAULT";
if (pSettingString->GetData()!="DEFAULT")
strCurrentCharsetLabel = g_charsetConverter.getCharsetLabelByName(pSettingString->GetData());
sort(vecCharsets.begin(), vecCharsets.end(), sortstringbyname());
vecCharsets.insert(vecCharsets.begin(), g_localizeStrings.Get(13278)); // "Default"
bool bIsAuto=(pSettingString->GetData()=="DEFAULT");
for (int i = 0; i < (int) vecCharsets.size(); ++i)
{
CStdString strCharsetLabel = vecCharsets[i];
if (!bIsAuto && strCharsetLabel == strCurrentCharsetLabel)
iCurrentCharset = i;
pControl->AddLabel(strCharsetLabel, i);
}
pControl->SetValue(iCurrentCharset);
}
DisplayMode CGUIWindowSettingsCategory::FillInScreens(CStdString strSetting, RESOLUTION res)
{
DisplayMode mode;
if (res == RES_WINDOW)
mode = DM_WINDOWED;
else
mode = g_settings.m_ResInfo[res].iScreen;
// we expect "videoscreen.screen" but it might be hidden on some platforms,
// so check that we actually have a visable control.
CBaseSettingControl *control = GetSetting(strSetting);
if (control)
{
control->SetDelayed();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(control->GetID());
pControl->Clear();
CStdString strScreen;
if (g_advancedSettings.m_canWindowed)
pControl->AddLabel(g_localizeStrings.Get(242), -1);
for (int idx = 0; idx < g_Windowing.GetNumScreens(); idx++)
{
strScreen.Format(g_localizeStrings.Get(241), g_settings.m_ResInfo[RES_DESKTOP + idx].iScreen + 1);
pControl->AddLabel(strScreen, g_settings.m_ResInfo[RES_DESKTOP + idx].iScreen);
}
pControl->SetValue(mode);
g_guiSettings.SetInt("videoscreen.screen", mode);
}
return mode;
}
void CGUIWindowSettingsCategory::FillInResolutions(CStdString strSetting, DisplayMode mode, RESOLUTION res, bool UserChange)
{
CBaseSettingControl *control = GetSetting(strSetting);
control->SetDelayed();
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(control->GetID());
pControl->Clear();
RESOLUTION spinres = RES_INVALID; // index of the resolution in the spinner that has same screen/width/height as res
if (mode == DM_WINDOWED)
{
pControl->AddLabel(g_localizeStrings.Get(242), RES_WINDOW);
spinres = RES_WINDOW;
}
else
{
vector<RESOLUTION_WHR> resolutions = g_Windowing.ScreenResolutions(mode);
for (unsigned int idx = 0; idx < resolutions.size(); idx++)
{
CStdString strRes;
strRes.Format("%dx%d", resolutions[idx].width, resolutions[idx].height);
pControl->AddLabel(strRes, resolutions[idx].ResInfo_Index);
RESOLUTION_INFO res1 = g_settings.m_ResInfo[res];
RESOLUTION_INFO res2 = g_settings.m_ResInfo[resolutions[idx].ResInfo_Index];
if (res1.iScreen == res2.iScreen && res1.iWidth == res2.iWidth && res1.iHeight == res2.iHeight)
spinres = (RESOLUTION) resolutions[idx].ResInfo_Index;
}
}
if (UserChange)
{
// Auto-select the windowed or desktop resolution of the screen
int autoresolution = RES_DESKTOP;
if (mode == DM_WINDOWED)
{
autoresolution = RES_WINDOW;
}
else
{
for (int idx=0; idx < g_Windowing.GetNumScreens(); idx++)
if (g_settings.m_ResInfo[RES_DESKTOP + idx].iScreen == mode)
{
autoresolution = RES_DESKTOP + idx;
break;
}
}
pControl->SetValue(autoresolution);
// Cascade
FillInRefreshRates("videoscreen.screenmode", (RESOLUTION) autoresolution, true);
}
else
{
// select the entry equivalent to the resolution passed by the res parameter
pControl->SetValue(spinres);
}
}
void CGUIWindowSettingsCategory::FillInRefreshRates(CStdString strSetting, RESOLUTION res, bool UserChange)
{
// The only meaningful parts of res here are iScreen, iWidth, iHeight
vector<REFRESHRATE> refreshrates;
if (res > RES_WINDOW)
refreshrates = g_Windowing.RefreshRates(g_settings.m_ResInfo[res].iScreen, g_settings.m_ResInfo[res].iWidth, g_settings.m_ResInfo[res].iHeight);
// The control setting doesn't exist when not in standalone mode, don't manipulate it
CBaseSettingControl *control = GetSetting(strSetting);
CGUISpinControlEx *pControl= NULL;
// Populate
if (control)
{
control->SetDelayed();
pControl = (CGUISpinControlEx *)GetControl(control->GetID());
pControl->Clear();
if (res == RES_WINDOW)
{
pControl->AddLabel(g_localizeStrings.Get(242), RES_WINDOW);
}
else
{
for (unsigned int idx = 0; idx < refreshrates.size(); idx++)
{
CStdString strRR;
strRR.Format("%.02f%s", refreshrates[idx].RefreshRate, refreshrates[idx].Interlaced ? "i" : "");
pControl->AddLabel(strRR, refreshrates[idx].ResInfo_Index);
}
}
}
// Select a rate
if (UserChange)
{
RESOLUTION newresolution;
if (res == RES_WINDOW)
newresolution = RES_WINDOW;
else
newresolution = (RESOLUTION) g_Windowing.DefaultRefreshRate(g_settings.m_ResInfo[res].iScreen, refreshrates).ResInfo_Index;
if (pControl)
pControl->SetValue(newresolution);
OnRefreshRateChanged(newresolution);
}
else
{
if (pControl)
pControl->SetValue(res);
}
}
void CGUIWindowSettingsCategory::OnRefreshRateChanged(RESOLUTION nextRes)
{
RESOLUTION lastRes = g_graphicsContext.GetVideoResolution();
bool cancelled = false;
g_guiSettings.SetResolution(nextRes);
g_graphicsContext.SetVideoResolution(nextRes);
if (!CGUIDialogYesNo::ShowAndGetInput(13110, 13111, 20022, 20022, -1, -1, cancelled, 10000))
{
g_guiSettings.SetResolution(lastRes);
g_graphicsContext.SetVideoResolution(lastRes);
DisplayMode mode = FillInScreens("videoscreen.screen", lastRes);
FillInResolutions("videoscreen.resolution", mode, lastRes, false);
FillInRefreshRates("videoscreen.screenmode", lastRes, false);
}
}
void CGUIWindowSettingsCategory::FillInLanguages(CSetting *pSetting, const std::vector<CStdString> &languages /* = std::vector<CStdString>() */, const std::vector<CStdString> &languageKeys /* = std::vector<CStdString>() */)
{
CSettingString *pSettingString = (CSettingString *)pSetting;
CBaseSettingControl *setting = GetSetting(pSetting->GetSetting());
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(setting->GetID());
pControl->Clear();
//find languages...
CFileItemList items;
CDirectory::GetDirectory("special://xbmc/language/", items);
int iCurrentLang = 0;
vector<CStdString> vecLanguage;
for (int i = 0; i < items.Size(); ++i)
{
CFileItemPtr pItem = items[i];
if (pItem->m_bIsFolder)
{
if (strcmpi(pItem->GetLabel().c_str(), ".svn") == 0) continue;
if (strcmpi(pItem->GetLabel().c_str(), "fonts") == 0) continue;
if (strcmpi(pItem->GetLabel().c_str(), "media") == 0) continue;
vecLanguage.push_back(pItem->GetLabel());
}
}
sort(vecLanguage.begin(), vecLanguage.end(), sortstringbyname());
// Add language options passed by parameter at the beginning
if (languages.size() > 0)
vecLanguage.insert(vecLanguage.begin(), languages.begin(), languages.begin() + languages.size());
for (unsigned int i = 0; i < vecLanguage.size(); ++i)
{
CStdString strLanguage = vecLanguage[i];
if ((i < languageKeys.size() && strcmpi(languageKeys[i].c_str(), pSettingString->GetData().c_str()) == 0) ||
strcmpi(strLanguage.c_str(), pSettingString->GetData().c_str()) == 0)
iCurrentLang = i;
pControl->AddLabel(strLanguage, i);
}
pControl->SetValue(iCurrentLang);
}
void CGUIWindowSettingsCategory::FillInRegions(CSetting *pSetting)
{
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(GetSetting(pSetting->GetSetting())->GetID());
pControl->SetType(SPIN_CONTROL_TYPE_TEXT);
pControl->Clear();
int iCurrentRegion=0;
CStdStringArray regions;
g_langInfo.GetRegionNames(regions);
CStdString strCurrentRegion=g_langInfo.GetCurrentRegion();
sort(regions.begin(), regions.end(), sortstringbyname());
for (int i = 0; i < (int) regions.size(); ++i)
{
const CStdString& strRegion = regions[i];
if (strRegion == strCurrentRegion)
iCurrentRegion = i;
pControl->AddLabel(strRegion, i);
}
pControl->SetValue(iCurrentRegion);
}
CBaseSettingControl *CGUIWindowSettingsCategory::GetSetting(const CStdString &strSetting)
{
for (unsigned int i = 0; i < m_vecSettings.size(); i++)
{
if (m_vecSettings[i]->GetSetting()->GetSetting() == strSetting)
return m_vecSettings[i];
}
return NULL;
}
void CGUIWindowSettingsCategory::FillInSkinThemes(CSetting *pSetting)
{
// There is a default theme (just Textures.xpr/xbt)
// any other *.xpr|*.xbt files are additional themes on top of this one.
CSettingString *pSettingString = (CSettingString *)pSetting;
CBaseSettingControl *setting = GetSetting(pSetting->GetSetting());
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(setting->GetID());
CStdString strSettingString = g_guiSettings.GetString("lookandfeel.skintheme");
setting->SetDelayed();
// Clear and add. the Default Label
pControl->Clear();
pControl->SetShowRange(true);
pControl->AddLabel(g_localizeStrings.Get(15109), 0); // "SKINDEFAULT" The standard Textures.xpr/xbt will be used
CStdString strDefaultTheme = pSettingString->GetData();
// Search for Themes in the Current skin!
vector<CStdString> vecTheme;
CUtil::GetSkinThemes(vecTheme);
// Remove the extension from the current Theme (backward compat)
URIUtils::RemoveExtension(strSettingString);
// Sort the Themes for GUI and list them
int iCurrentTheme = 0;
for (int i = 0; i < (int) vecTheme.size(); ++i)
{
CStdString strTheme = vecTheme[i];
// Is the Current Theme our Used Theme! If yes set the ID!
if (strTheme.CompareNoCase(strSettingString) == 0 )
iCurrentTheme = i + 1; // 1: #of Predefined Theme [Label]
pControl->AddLabel(strTheme, i + 1);
}
// Set the Choosen Theme
pControl->SetValue(iCurrentTheme);
}
void CGUIWindowSettingsCategory::FillInSkinColors(CSetting *pSetting)
{
// There is a default theme (just defaults.xml)
// any other *.xml files are additional color themes on top of this one.
CBaseSettingControl *setting = GetSetting(pSetting->GetSetting());
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(setting->GetID());
CStdString strSettingString = g_guiSettings.GetString("lookandfeel.skincolors");
setting->SetDelayed();
// Clear and add. the Default Label
pControl->Clear();
pControl->SetShowRange(true);
pControl->AddLabel(g_localizeStrings.Get(15109), 0); // "SKINDEFAULT"! The standard defaults.xml will be used!
// Search for colors in the Current skin!
vector<CStdString> vecColors;
CStdString strPath;
URIUtils::AddFileToFolder(g_SkinInfo->Path(),"colors",strPath);
CFileItemList items;
CDirectory::GetDirectory(CSpecialProtocol::TranslatePathConvertCase(strPath), items, ".xml");
// Search for Themes in the Current skin!
for (int i = 0; i < items.Size(); ++i)
{
CFileItemPtr pItem = items[i];
if (!pItem->m_bIsFolder && pItem->GetLabel().CompareNoCase("defaults.xml") != 0)
{ // not the default one
CStdString strLabel = pItem->GetLabel();
vecColors.push_back(strLabel.Mid(0, strLabel.size() - 4));
}
}
sort(vecColors.begin(), vecColors.end(), sortstringbyname());
// Remove the .xml extension from the Themes
if (URIUtils::GetExtension(strSettingString) == ".xml")
URIUtils::RemoveExtension(strSettingString);
int iCurrentColor = 0;
for (int i = 0; i < (int) vecColors.size(); ++i)
{
CStdString strColor = vecColors[i];
// Is the Current Theme our Used Theme! If yes set the ID!
if (strColor.CompareNoCase(strSettingString) == 0 )
iCurrentColor = i + 1; // 1: #of Predefined Theme [Label]
pControl->AddLabel(strColor, i + 1);
}
// Set the Choosen Theme
pControl->SetValue(iCurrentColor);
}
void CGUIWindowSettingsCategory::FillInStartupWindow(CSetting *pSetting)
{
CSettingInt *pSettingInt = (CSettingInt*)pSetting;
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(GetSetting(pSetting->GetSetting())->GetID());
pControl->Clear();
const vector<CSkinInfo::CStartupWindow> &startupWindows = g_SkinInfo->GetStartupWindows();
// TODO: How should we localize this?
// In the long run there is no way to do it really without the skin having some
// translation information built in to it, which isn't really feasible.
// Alternatively we could lookup the strings in the english strings file to get
// their id and then get the string from that
// easier would be to have the skinner use the "name" as the label number.
// eg <window id="0">513</window>
bool currentSettingFound(false);
for (vector<CSkinInfo::CStartupWindow>::const_iterator it = startupWindows.begin(); it != startupWindows.end(); it++)
{
CStdString windowName((*it).m_name);
if (StringUtils::IsNaturalNumber(windowName))
windowName = g_localizeStrings.Get(atoi(windowName.c_str()));
int windowID((*it).m_id);
pControl->AddLabel(windowName, windowID);
if (pSettingInt->GetData() == windowID)
currentSettingFound = true;
}
// ok, now check whether our current option is one of these
// and set it's value
if (!currentSettingFound)
{ // nope - set it to the "default" option - the first one
pSettingInt->SetData(startupWindows[0].m_id);
}
pControl->SetValue(pSettingInt->GetData());
}
void CGUIWindowSettingsCategory::OnInitWindow()
{
m_strOldTrackFormat = g_guiSettings.GetString("musicfiles.trackformat");
m_strOldTrackFormatRight = g_guiSettings.GetString("musicfiles.trackformatright");
SetupControls();
CGUIWindow::OnInitWindow();
}
void CGUIWindowSettingsCategory::FillInViewModes(CSetting *pSetting, int windowID)
{
CSettingInt *pSettingInt = (CSettingInt*)pSetting;
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(GetSetting(pSetting->GetSetting())->GetID());
pControl->AddLabel("Auto", DEFAULT_VIEW_AUTO);
bool found(false);
int foundType = 0;
CGUIWindow *window = g_windowManager.GetWindow(windowID);
if (window)
{
window->Initialize();
for (int i = 50; i < 60; i++)
{
CGUIBaseContainer *control = (CGUIBaseContainer *)window->GetControl(i);
if (control)
{
int type = (control->GetType() << 16) | i;
pControl->AddLabel(control->GetLabel(), type);
if (type == pSettingInt->GetData())
found = true;
else if ((type >> 16) == (pSettingInt->GetData() >> 16))
foundType = type;
}
}
window->ClearAll();
}
if (!found)
pSettingInt->SetData(foundType ? foundType : (DEFAULT_VIEW_AUTO));
pControl->SetValue(pSettingInt->GetData());
}
void CGUIWindowSettingsCategory::FillInSortMethods(CSetting *pSetting, int windowID)
{
CSettingInt *pSettingInt = (CSettingInt*)pSetting;
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(GetSetting(pSetting->GetSetting())->GetID());
CFileItemList items("C:");
CGUIViewState *state = CGUIViewState::GetViewState(windowID, items);
if (state)
{
bool found(false);
vector< pair<int,int> > sortMethods;
state->GetSortMethods(sortMethods);
for (unsigned int i = 0; i < sortMethods.size(); i++)
{
pControl->AddLabel(g_localizeStrings.Get(sortMethods[i].second), sortMethods[i].first);
if (sortMethods[i].first == pSettingInt->GetData())
found = true;
}
if (!found && sortMethods.size())
pSettingInt->SetData(sortMethods[0].first);
}
pControl->SetValue(pSettingInt->GetData());
delete state;
}
void CGUIWindowSettingsCategory::FillInNetworkInterfaces(CSetting *pSetting, float groupWidth, int &iControlID)
{
CGUISpinControlEx *pControl = (CGUISpinControlEx *)AddSetting(pSetting, groupWidth, iControlID);
pControl->Clear();
// query list of interfaces
vector<CStdString> vecInterfaces;
std::vector<CNetworkInterface*>& ifaces = g_application.getNetwork().GetInterfaceList();
std::vector<CNetworkInterface*>::const_iterator iter = ifaces.begin();
while (iter != ifaces.end())
{
CNetworkInterface* iface = *iter;
vecInterfaces.push_back(iface->GetName());
++iter;
}
sort(vecInterfaces.begin(), vecInterfaces.end(), sortstringbyname());
int iInterface = 0;
for (unsigned int i = 0; i < vecInterfaces.size(); ++i)
pControl->AddLabel(vecInterfaces[i], iInterface++);
}
void CGUIWindowSettingsCategory::FillInAudioDevices(CSetting* pSetting, bool Passthrough)
{
CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(GetSetting(pSetting->GetSetting())->GetID());
pControl->Clear();
CStdString currentDevice = Passthrough ? g_guiSettings.GetString("audiooutput.passthroughdevice") : g_guiSettings.GetString("audiooutput.audiodevice");
if (Passthrough)
{
m_DigitalAudioSinkMap.clear();
m_DigitalAudioSinkMap["Error - no devices found"] = "null:";
}
else
{
m_AnalogAudioSinkMap.clear();
m_AnalogAudioSinkMap["Error - no devices found"] = "null:";
}
int numberSinks = 0;
int selectedValue = -1;
AEDeviceList sinkList;
CAEFactory::EnumerateOutputDevices(sinkList, Passthrough);
#if !defined(TARGET_DARWIN)
if (sinkList.size()==0)
{
pControl->AddLabel("Error - no devices found", 0);
numberSinks = 1;
selectedValue = 0;
}
else
{
#endif
AEDeviceList::const_iterator iter = sinkList.begin();
for (int i=0; iter != sinkList.end(); iter++)
{
CStdString label = (*iter).first;
CStdString sink = (*iter).second;
pControl->AddLabel(label.c_str(), i);
if (currentDevice.Equals(sink))
selectedValue = i;
if (Passthrough)
m_DigitalAudioSinkMap[label] = sink;
else
m_AnalogAudioSinkMap[label] = sink;
i++;
}
numberSinks = sinkList.size();
#if !defined(TARGET_DARWIN)
}
#endif
if (selectedValue < 0)
{
CLog::Log(LOGWARNING, "Failed to find previously selected audio sink");
pControl->AddLabel(currentDevice, numberSinks);
pControl->SetValue(numberSinks);
}
else
pControl->SetValue(selectedValue);
}
void CGUIWindowSettingsCategory::NetworkInterfaceChanged(void)
{
return;
NetworkAssignment iAssignment;
CStdString sIPAddress;
CStdString sNetworkMask;
CStdString sDefaultGateway;
CStdString sWirelessNetwork;
CStdString sWirelessKey;
EncMode iWirelessEnc;
bool bIsWireless;
CStdString ifaceName;
// Get network information
CGUISpinControlEx *ifaceControl = (CGUISpinControlEx *)GetControl(GetSetting("network.interface")->GetID());
ifaceName = ifaceControl->GetLabel();
CNetworkInterface* iface = g_application.getNetwork().GetInterfaceByName(ifaceName);
iface->GetSettings(iAssignment, sIPAddress, sNetworkMask, sDefaultGateway, sWirelessNetwork, sWirelessKey, iWirelessEnc);
bIsWireless = iface->IsWireless();
CStdString dns;
std::vector<CStdString> dnss = g_application.getNetwork().GetNameServers();
if (dnss.size() >= 1)
dns = dnss[0];
// Update controls with information
CGUISpinControlEx* pControl1 = (CGUISpinControlEx *)GetControl(GetSetting("network.assignment")->GetID());
if (pControl1) pControl1->SetValue(iAssignment);
GetSetting("network.dns")->GetSetting()->FromString(dns);
if (iAssignment == NETWORK_STATIC || iAssignment == NETWORK_DISABLED)
{
GetSetting("network.ipaddress")->GetSetting()->FromString(sIPAddress);
GetSetting("network.subnet")->GetSetting()->FromString(sNetworkMask);
GetSetting("network.gateway")->GetSetting()->FromString(sDefaultGateway);
}
else
{
GetSetting("network.ipaddress")->GetSetting()->FromString(iface->GetCurrentIPAddress());
GetSetting("network.subnet")->GetSetting()->FromString(iface->GetCurrentNetmask());
GetSetting("network.gateway")->GetSetting()->FromString(iface->GetCurrentDefaultGateway());
}
pControl1 = (CGUISpinControlEx *)GetControl(GetSetting("network.enc")->GetID());
if (pControl1) pControl1->SetValue(iWirelessEnc);
if (bIsWireless)
{
GetSetting("network.essid")->GetSetting()->FromString(sWirelessNetwork);
GetSetting("network.key")->GetSetting()->FromString(sWirelessKey);
}
else
{
GetSetting("network.essid")->GetSetting()->FromString("");
GetSetting("network.key")->GetSetting()->FromString("");
}
}
void CGUIWindowSettingsCategory::ValidatePortNumber(CBaseSettingControl* pSettingControl, const CStdString& userPort, const CStdString& privPort, bool listening/*=true*/)
{
CSettingString *pSetting = (CSettingString *)pSettingControl->GetSetting();
// check that it's a valid port
int port = atoi(pSetting->GetData().c_str());
#ifdef _LINUX
if (listening && !CUtil::CanBindPrivileged() && (port < 1024 || port > 65535))
{
CGUIDialogOK::ShowAndGetInput(257, 850, 852, -1);
pSetting->SetData(userPort.c_str());
}
else
#endif
if (port <= 0 || port > 65535)
{
CGUIDialogOK::ShowAndGetInput(257, 850, 851, -1);
pSetting->SetData(privPort.c_str());
}
}
Jump to Line
Something went wrong with that request. Please try again.