std::set<std::string> CGUIDialogSettingsBase::CreateSettings() { FreeSettingsControls(); std::set<std::string> settingMap; if (m_categories.size() <= 0) return settingMap; if (m_iCategory < 0 || m_iCategory >= (int)m_categories.size()) m_iCategory = 0; CGUIControlGroupList *group = dynamic_cast<CGUIControlGroupList *>(GetControl(SETTINGS_GROUP_ID)); if (group == NULL) return settingMap; const CSettingCategory* category = m_categories.at(m_iCategory); if (category == NULL) return settingMap; // set the description of the current category SetDescription(category->GetHelp()); const SettingGroupList& groups = category->GetGroups((SettingLevel)GetSettingLevel()); int iControlID = CONTROL_SETTINGS_START_CONTROL; bool first = true; for (SettingGroupList::const_iterator groupIt = groups.begin(); groupIt != groups.end(); groupIt++) { if (*groupIt == NULL) continue; const SettingList& settings = (*groupIt)->GetSettings((SettingLevel)GetSettingLevel()); if (settings.size() <= 0) continue; if (first) first = false; else AddSeparator(group->GetWidth(), iControlID); for (SettingList::const_iterator settingIt = settings.begin(); settingIt != settings.end(); settingIt++) { CSetting *pSetting = *settingIt; settingMap.insert(pSetting->GetId()); AddSetting(pSetting, group->GetWidth(), iControlID); } } if (AllowResettingSettings() && !settingMap.empty()) { // add "Reset" control AddSeparator(group->GetWidth(), iControlID); AddSetting(m_resetSetting, group->GetWidth(), iControlID); } // update our settings (turns controls on/off as appropriate) UpdateSettings(); return settingMap; }
void CGUIWindowSettingsCategory::CreateSettings() { FreeSettingsControls(); if (m_categories.size() <= 0) return; if (m_iCategory < 0 || m_iCategory >= (int)m_categories.size()) m_iCategory = 0; CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(SETTINGS_GROUP_ID); if (group == NULL) return; const CSettingCategory* category = m_categories.at(m_iCategory); if (category == NULL) return; // set the description of the current category SetDescription(category->GetHelp()); std::set<std::string> settingMap; const SettingGroupList& groups = category->GetGroups(CViewStateSettings::Get().GetSettingLevel()); int iControlID = CONTROL_START_CONTROL; bool first = true; for (SettingGroupList::const_iterator groupIt = groups.begin(); groupIt != groups.end(); groupIt++) { if (*groupIt == NULL) continue; const SettingList& settings = (*groupIt)->GetSettings(CViewStateSettings::Get().GetSettingLevel()); if (settings.size() <= 0) continue; if (first) first = false; else AddSeparator(group->GetWidth(), iControlID); for (SettingList::const_iterator settingIt = settings.begin(); settingIt != settings.end(); settingIt++) { CSetting *pSetting = *settingIt; settingMap.insert(pSetting->GetId()); AddSetting(pSetting, group->GetWidth(), iControlID); } } if (settingMap.size() > 0) m_settings.RegisterCallback(this, settingMap); // update our settings (turns controls on/off as appropriate) UpdateSettings(); }
void CGUIDialogVisualisationSettings::SetupPage() { // cleanup first, if necessary FreeControls(); m_pOriginalSpin = (CGUISpinControlEx*)GetControl(CONTROL_DEFAULT_SPIN); m_pOriginalRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_DEFAULT_RADIOBUTTON); m_pOriginalSettingsButton = (CGUIButtonControl *)GetControl(CONTROL_DEFAULT_BUTTON); if (!m_pOriginalSpin || !m_pOriginalRadioButton || !m_pOriginalSettingsButton) return; m_pOriginalSpin->SetVisible(false); m_pOriginalRadioButton->SetVisible(false); m_pOriginalSettingsButton->SetVisible(false); // update our settings label CStdString strSettings; strSettings.Format("%s %s", g_infoManager.GetLabel(402).c_str(), g_localizeStrings.Get(5)); SET_CONTROL_LABEL(CONTROL_SETTINGS_LABEL, strSettings); CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(CONTROL_GROUP_LIST); #ifdef PRE_SKIN_VERSION_2_1_COMPATIBILITY if (!group || group->GetControlType() != CGUIControl::GUICONTROL_GROUPLIST) { // our controls for layout... CGUIControl *pArea = (CGUIControl *)GetControl(CONTROL_AREA); const CGUIControl *pGap = GetControl(CONTROL_GAP); if (!pArea || !pGap) return; Remove(CONTROL_AREA); group = new CGUIControlGroupList(GetID(), CONTROL_GROUP_LIST, pArea->GetXPosition(), pArea->GetYPosition(), pArea->GetWidth(), pArea->GetHeight(), pGap->GetHeight() - m_pOriginalSettingsButton->GetHeight(), 0, VERTICAL, false); group->SetNavigation(CONTROL_GROUP_LIST, CONTROL_GROUP_LIST, CONTROL_GROUP_LIST, CONTROL_GROUP_LIST); Insert(group, pGap); pArea->FreeResources(); delete pArea; SET_CONTROL_HIDDEN(CONTROL_PAGE); } #endif if (!group) return; if (!m_pSettings || !m_pSettings->size()) { // no settings available SET_CONTROL_VISIBLE(CONTROL_NONE_AVAILABLE); return; } else { SET_CONTROL_HIDDEN(CONTROL_NONE_AVAILABLE); } // run through and create our controls for (unsigned int i = 0; i < m_pSettings->size(); i++) { VisSetting &setting = m_pSettings->at(i); AddSetting(setting, group->GetWidth(), CONTROL_START + i); } UpdateSettings(); }
void CGUIDialogSettings::SetupPage() { // cleanup first, if necessary FreeControls(); m_pOriginalEdit = (CGUIEditControl*)GetControl(CONTROL_DEFAULT_EDIT); m_pOriginalEditNum = (CGUIEditControl*)GetControl(CONTROL_DEFAULT_EDIT_NUM); m_pOriginalSpin = (CGUISpinControlEx*)GetControl(CONTROL_DEFAULT_SPIN); m_pOriginalRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_DEFAULT_RADIOBUTTON); m_pOriginalSettingsButton = (CGUIButtonControl *)GetControl(CONTROL_DEFAULT_BUTTON); m_pOriginalSlider = (CGUISettingsSliderControl *)GetControl(CONTROL_DEFAULT_SLIDER); m_pOriginalSeparator = (CGUIImage *)GetControl(CONTROL_DEFAULT_SEPARATOR); if (m_pOriginalEdit) m_pOriginalEdit->SetVisible(false); if (m_pOriginalEditNum) m_pOriginalEditNum->SetVisible(false); if (m_pOriginalSpin) m_pOriginalSpin->SetVisible(false); if (m_pOriginalRadioButton) m_pOriginalRadioButton->SetVisible(false); if (m_pOriginalSettingsButton) m_pOriginalSettingsButton->SetVisible(false); if (m_pOriginalSlider) m_pOriginalSlider->SetVisible(false); if (m_pOriginalSeparator) m_pOriginalSeparator->SetVisible(false); // update our settings label if (GetID() == WINDOW_DIALOG_PVR_TIMER_SETTING) { SET_CONTROL_LABEL(CONTROL_SETTINGS_LABEL, g_localizeStrings.Get(19057)); } else { SET_CONTROL_LABEL(CONTROL_SETTINGS_LABEL, g_localizeStrings.Get(13395 + GetID() - WINDOW_DIALOG_VIDEO_OSD_SETTINGS)); } CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(CONTROL_GROUP_LIST); if (!group) return; if (!m_settings.size()) { // no settings available SET_CONTROL_VISIBLE(CONTROL_NONE_AVAILABLE); return; } else { SET_CONTROL_HIDDEN(CONTROL_NONE_AVAILABLE); } // create our controls for (unsigned int i = 0; i < m_settings.size(); i++) { SettingInfo &setting = m_settings.at(i); AddSetting(setting, group->GetWidth(), CONTROL_START + i); } }
void CGUIDialogContextMenu::SetupButtons() { if (!m_buttons.size()) return; // disable the template button control CGUIButtonControl *pButtonTemplate = (CGUIButtonControl *)GetFirstFocusableControl(BUTTON_TEMPLATE); if (!pButtonTemplate) pButtonTemplate = (CGUIButtonControl *)GetControl(BUTTON_TEMPLATE); if (!pButtonTemplate) return; pButtonTemplate->SetVisible(false); CGUIControlGroupList* pGroupList = NULL; { const CGUIControl* pControl = GetControl(GROUP_LIST); if (pControl && pControl->GetControlType() == GUICONTROL_GROUPLIST) pGroupList = (CGUIControlGroupList*)pControl; } // add our buttons for (unsigned int i = 0; i < m_buttons.size(); i++) { CGUIButtonControl *pButton = new CGUIButtonControl(*pButtonTemplate); if (pButton) { // set the button's ID and position int id = BUTTON_START + i; pButton->SetID(id); pButton->SetVisible(true); pButton->SetLabel(m_buttons[i].second); if (pGroupList) { pButton->SetPosition(pButtonTemplate->GetXPosition(), pButtonTemplate->GetYPosition()); pGroupList->AddControl(pButton); } #if PRE_SKIN_VERSION_11_COMPATIBILITY else { pButton->SetPosition(pButtonTemplate->GetXPosition(), i*(pButtonTemplate->GetHeight() + SPACE_BETWEEN_BUTTONS)); pButton->SetNavigation(id - 1, id + 1, id, id); AddControl(pButton); } #endif } } CGUIControl *pControl = NULL; #if PRE_SKIN_VERSION_11_COMPATIBILITY if (!pGroupList) { // if we don't have grouplist update the navigation of the first and last buttons pControl = (CGUIControl *)GetControl(BUTTON_START); if (pControl) pControl->SetNavigation(BUTTON_END, pControl->GetControlIdDown(), pControl->GetControlIdLeft(), pControl->GetControlIdRight()); pControl = (CGUIControl *)GetControl(BUTTON_END); if (pControl) pControl->SetNavigation(pControl->GetControlIdUp(), BUTTON_START, pControl->GetControlIdLeft(), pControl->GetControlIdRight()); } #endif // fix up background images placement and size pControl = (CGUIControl *)GetControl(BACKGROUND_IMAGE); if (pControl) { // first set size of background image if (pGroupList) { if (pGroupList->GetOrientation() == VERTICAL) { // keep gap between bottom edges of grouplist and background image pControl->SetHeight(pControl->GetHeight() - pGroupList->Size() + pGroupList->GetHeight()); } else { // keep gap between right edges of grouplist and background image pControl->SetWidth(pControl->GetWidth() - pGroupList->Size() + pGroupList->GetWidth()); } } #if PRE_SKIN_VERSION_11_COMPATIBILITY else pControl->SetHeight(m_buttons.size() * (pButtonTemplate->GetHeight() + SPACE_BETWEEN_BUTTONS)); if (pGroupList && pGroupList->GetOrientation() == HORIZONTAL) { // if there is grouplist control with horizontal orientation - adjust width of top and bottom background CGUIControl* pControl2 = (CGUIControl *)GetControl(BACKGROUND_TOP); if (pControl2) pControl2->SetWidth(pControl->GetWidth()); pControl2 = (CGUIControl *)GetControl(BACKGROUND_BOTTOM); if (pControl2) pControl2->SetWidth(pControl->GetWidth()); } else { // adjust position of bottom background CGUIControl* pControl2 = (CGUIControl *)GetControl(BACKGROUND_BOTTOM); if (pControl2) pControl2->SetPosition(pControl2->GetXPosition(), pControl->GetYPosition() + pControl->GetHeight()); } #endif } // update our default control if (m_defaultControl < BUTTON_START || m_defaultControl > BUTTON_END) m_defaultControl = BUTTON_START; while (m_defaultControl <= BUTTON_END && !(GetControl(m_defaultControl)->CanFocus())) m_defaultControl++; }
void CGUIDialogContextMenu::SetupButtons() { if (!m_buttons.size()) return; // disable the template button control CGUIButtonControl *pButtonTemplate = dynamic_cast<CGUIButtonControl *>(GetFirstFocusableControl(BUTTON_TEMPLATE)); if (!pButtonTemplate) pButtonTemplate = dynamic_cast<CGUIButtonControl *>(GetControl(BUTTON_TEMPLATE)); if (!pButtonTemplate) return; pButtonTemplate->SetVisible(false); CGUIControlGroupList* pGroupList = dynamic_cast<CGUIControlGroupList *>(GetControl(GROUP_LIST)); // add our buttons for (unsigned int i = 0; i < m_buttons.size(); i++) { CGUIButtonControl *pButton = new CGUIButtonControl(*pButtonTemplate); if (pButton) { // set the button's ID and position int id = BUTTON_START + i; pButton->SetID(id); pButton->SetVisible(true); pButton->SetLabel(m_buttons[i].second); if (pGroupList) { pButton->SetPosition(pButtonTemplate->GetXPosition(), pButtonTemplate->GetYPosition()); // try inserting context buttons at position specified by template // button, if template button is not in grouplist fallback to adding // new buttons at the end of grouplist if (!pGroupList->InsertControl(pButton, pButtonTemplate)) pGroupList->AddControl(pButton); } } } // fix up background images placement and size CGUIControl *pControl = (CGUIControl *)GetControl(BACKGROUND_IMAGE); if (pControl) { // first set size of background image if (pGroupList) { if (pGroupList->GetOrientation() == VERTICAL) { // keep gap between bottom edges of grouplist and background image pControl->SetHeight(m_backgroundImageSize - pGroupList->Size() + pGroupList->GetHeight()); } else { // keep gap between right edges of grouplist and background image pControl->SetWidth(m_backgroundImageSize - pGroupList->Size() + pGroupList->GetWidth()); } } } // update our default control if (pGroupList) m_defaultControl = pGroupList->GetID(); }
void CGUIDialogPluginSettings::CreateControls() { CGUISpinControlEx *pOriginalSpin = (CGUISpinControlEx*)GetControl(CONTROL_DEFAULT_SPIN); CGUIRadioButtonControl *pOriginalRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_DEFAULT_RADIOBUTTON); CGUIButtonControl *pOriginalButton = (CGUIButtonControl *)GetControl(CONTROL_DEFAULT_BUTTON); CGUIImage *pOriginalImage = (CGUIImage *)GetControl(CONTROL_DEFAULT_SEPARATOR); CGUILabelControl *pOriginalLabel = (CGUILabelControl *)GetControl(CONTROL_DEFAULT_LABEL_SEPARATOR); if (!pOriginalSpin || !pOriginalRadioButton || !pOriginalButton || !pOriginalImage) return; pOriginalSpin->SetVisible(false); pOriginalRadioButton->SetVisible(false); pOriginalButton->SetVisible(false); pOriginalImage->SetVisible(false); if (pOriginalLabel) pOriginalLabel->SetVisible(false); // clear the category group CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(CONTROL_AREA); if (!group) return; // set our dialog heading SET_CONTROL_LABEL(CONTROL_HEADING_LABEL, m_strHeading); // Create our base path, used for type "fileenum" settings CStdString basepath = "Q:\\plugins\\"; CUtil::AddFileToFolder(basepath, m_url.GetHostName(), basepath); CUtil::AddFileToFolder(basepath, m_url.GetFileName(), basepath); CGUIControl* pControl = NULL; int controlId = CONTROL_START_CONTROL; TiXmlElement *setting = m_settings.GetPluginRoot()->FirstChildElement("setting"); while (setting) { const char *type = setting->Attribute("type"); const char *option = setting->Attribute("option"); const char *id = setting->Attribute("id"); CStdString values; if (setting->Attribute("values")) values = setting->Attribute("values"); CStdString lvalues; if (setting->Attribute("lvalues")) lvalues = setting->Attribute("lvalues"); CStdString entries; if (setting->Attribute("entries")) entries = setting->Attribute("entries"); CStdString label; if (setting->Attribute("label") && atoi(setting->Attribute("label")) > 0) label.Format("$LOCALIZE[%s]", setting->Attribute("label")); else label = setting->Attribute("label"); if (type) { if (strcmpi(type, "text") == 0 || strcmpi(type, "ipaddress") == 0 || strcmpi(type, "integer") == 0 || strcmpi(type, "video") == 0 || strcmpi(type, "music") == 0 || strcmpi(type, "pictures") == 0 || strcmpi(type, "folder") == 0 || strcmpi(type, "programs") == 0 || strcmpi(type, "files") == 0 || strcmpi(type, "action") == 0) { pControl = new CGUIButtonControl(*pOriginalButton); if (!pControl) return; ((CGUIButtonControl *)pControl)->SettingsCategorySetTextAlign(XBFONT_CENTER_Y); ((CGUIButtonControl *)pControl)->SetLabel(label); if (id) ((CGUIButtonControl *)pControl)->SetLabel2(m_settings.Get(id)); if (option && strcmpi(option, "hidden") == 0) ((CGUIButtonControl *)pControl)->SetHidden(true); } else if (strcmpi(type, "bool") == 0) { pControl = new CGUIRadioButtonControl(*pOriginalRadioButton); if (!pControl) return; ((CGUIRadioButtonControl *)pControl)->SetLabel(label); ((CGUIRadioButtonControl *)pControl)->SetSelected(m_settings.Get(id) == "true"); } else if (strcmpi(type, "enum") == 0 || strcmpi(type, "labelenum") == 0) { vector<CStdString> valuesVec; vector<CStdString> entryVec; pControl = new CGUISpinControlEx(*pOriginalSpin); if (!pControl) return; ((CGUISpinControlEx *)pControl)->SetText(label); if (!lvalues.IsEmpty()) CUtil::Tokenize(lvalues, valuesVec, "|"); else CUtil::Tokenize(values, valuesVec, "|"); if (!entries.IsEmpty()) CUtil::Tokenize(entries, entryVec, "|"); for (unsigned int i = 0; i < valuesVec.size(); i++) { int iAdd = i; if (entryVec.size() > i) iAdd = atoi(entryVec[i]); if (!lvalues.IsEmpty()) { CStdString replace = g_localizeStringsTemp.Get(atoi(valuesVec[i])); if (replace.IsEmpty()) replace = g_localizeStrings.Get(atoi(valuesVec[i])); ((CGUISpinControlEx *)pControl)->AddLabel(replace, iAdd); } else ((CGUISpinControlEx *)pControl)->AddLabel(valuesVec[i], iAdd); } if (strcmpi(type, "labelenum") == 0) { // need to run through all our settings and find the one that matches ((CGUISpinControlEx*) pControl)->SetValueFromLabel(m_settings.Get(id)); } else ((CGUISpinControlEx*) pControl)->SetValue(atoi(m_settings.Get(id))); } else if (strcmpi(type, "fileenum") == 0) { pControl = new CGUISpinControlEx(*pOriginalSpin); if (!pControl) return; ((CGUISpinControlEx *)pControl)->SetText(label); //find Folders... CFileItemList items; CStdString enumpath; CUtil::AddFileToFolder(basepath, values, enumpath); CStdString mask; if (setting->Attribute("mask")) mask = setting->Attribute("mask"); if (!mask.IsEmpty()) CDirectory::GetDirectory(enumpath, items, mask); else CDirectory::GetDirectory(enumpath, items); int iItem = 0; for (int i = 0; i < items.Size(); ++i) { CFileItemPtr pItem = items[i]; if ((mask.Equals("/") && pItem->m_bIsFolder) || !pItem->m_bIsFolder) { ((CGUISpinControlEx *)pControl)->AddLabel(pItem->GetLabel(), iItem); if (pItem->GetLabel().Equals(m_settings.Get(id))) ((CGUISpinControlEx *)pControl)->SetValue(iItem); iItem++; } } } else if (strcmpi(type, "lsep") == 0 && pOriginalLabel) { pControl = new CGUILabelControl(*pOriginalLabel); if (pControl) ((CGUILabelControl *)pControl)->SetLabel(label); } else if ((strcmpi(type, "sep") == 0 || strcmpi(type, "lsep") == 0) && pOriginalImage) pControl = new CGUIImage(*pOriginalImage); } if (pControl) { pControl->SetWidth(group->GetWidth()); pControl->SetVisible(true); pControl->SetID(controlId); pControl->AllocResources(); group->AddControl(pControl); pControl = NULL; } setting = setting->NextSiblingElement("setting"); controlId++; } EnableControls(); }
void CGUIDialogAddonSettings::CreateControls() { FreeControls(); CGUISpinControlEx *pOriginalSpin = dynamic_cast<CGUISpinControlEx*>(GetControl(CONTROL_DEFAULT_SPIN)); CGUIRadioButtonControl *pOriginalRadioButton = dynamic_cast<CGUIRadioButtonControl *>(GetControl(CONTROL_DEFAULT_RADIOBUTTON)); CGUIButtonControl *pOriginalButton = dynamic_cast<CGUIButtonControl *>(GetControl(CONTROL_DEFAULT_BUTTON)); CGUIImage *pOriginalImage = dynamic_cast<CGUIImage *>(GetControl(CONTROL_DEFAULT_SEPARATOR)); CGUILabelControl *pOriginalLabel = dynamic_cast<CGUILabelControl *>(GetControl(CONTROL_DEFAULT_LABEL_SEPARATOR)); CGUISettingsSliderControl *pOriginalSlider = dynamic_cast<CGUISettingsSliderControl *>(GetControl(CONTROL_DEFAULT_SLIDER)); if (!m_addon || !pOriginalSpin || !pOriginalRadioButton || !pOriginalButton || !pOriginalImage || !pOriginalLabel || !pOriginalSlider) return; pOriginalSpin->SetVisible(false); pOriginalRadioButton->SetVisible(false); pOriginalButton->SetVisible(false); pOriginalImage->SetVisible(false); pOriginalLabel->SetVisible(false); pOriginalSlider->SetVisible(false); CGUIControlGroupList *group = dynamic_cast<CGUIControlGroupList *>(GetControl(CONTROL_SETTINGS_AREA)); if (!group) return; // set our dialog heading SET_CONTROL_LABEL(CONTROL_HEADING_LABEL, m_strHeading); CGUIControl* pControl = NULL; int controlId = CONTROL_START_SETTING; const TiXmlElement *setting = GetFirstSetting(); while (setting) { const std::string type = XMLUtils::GetAttribute(setting, "type"); const std::string id = XMLUtils::GetAttribute(setting, "id"); const std::string values = XMLUtils::GetAttribute(setting, "values"); const std::string lvalues = XMLUtils::GetAttribute(setting, "lvalues"); const std::string entries = XMLUtils::GetAttribute(setting, "entries"); const std::string defaultVal = XMLUtils::GetAttribute(setting, "default"); const std::string subsetting = XMLUtils::GetAttribute(setting, "subsetting"); const std::string label = GetString(setting->Attribute("label"), subsetting == "true"); bool bSort = XMLUtils::GetAttribute(setting, "sort") == "yes"; if (!type.empty()) { bool isAddonSetting = false; if (type == "text" || type == "ipaddress" || type == "number" || type == "video" || type == "audio" || type == "image" || type == "folder" || type == "executable" || type == "file" || type == "action" || type == "date" || type == "time" || type == "select" || (isAddonSetting = type == "addon")) { pControl = new CGUIButtonControl(*pOriginalButton); if (!pControl) return; ((CGUIButtonControl *)pControl)->SetLabel(label); if (!id.empty()) { std::string value = m_settings[id]; m_buttonValues[id] = value; // get any option to test for hidden const std::string option = XMLUtils::GetAttribute(setting, "option"); if (option == "urlencoded") value = CURL::Decode(value); else if (option == "hidden") { std::string hiddenText; hiddenText.append(value.size(), L'*'); ((CGUIButtonControl *)pControl)->SetLabel2(hiddenText); } else { if (isAddonSetting) ((CGUIButtonControl *)pControl)->SetLabel2(GetAddonNames(value)); else if (type == "select" && !lvalues.empty()) { vector<string> valuesVec = StringUtils::Split(lvalues, '|'); int selected = atoi(value.c_str()); if (selected >= 0 && selected < (int)valuesVec.size()) { std::string label = m_addon->GetString(atoi(valuesVec[selected].c_str())); if (label.empty()) label = g_localizeStrings.Get(atoi(valuesVec[selected].c_str())); ((CGUIButtonControl *)pControl)->SetLabel2(label); } } else ((CGUIButtonControl *)pControl)->SetLabel2(value); } } else ((CGUIButtonControl *)pControl)->SetLabel2(defaultVal); } else if (type == "bool" && !id.empty()) { pControl = new CGUIRadioButtonControl(*pOriginalRadioButton); if (!pControl) return; ((CGUIRadioButtonControl *)pControl)->SetLabel(label); ((CGUIRadioButtonControl *)pControl)->SetSelected(m_settings[id] == "true"); } else if ((type == "enum" || type == "labelenum") && !id.empty()) { vector<std::string> valuesVec; vector<std::string> entryVec; pControl = new CGUISpinControlEx(*pOriginalSpin); if (!pControl) return; ((CGUISpinControlEx *)pControl)->SetText(label); if (!lvalues.empty()) StringUtils::Tokenize(lvalues, valuesVec, "|"); else if (values == "$HOURS") { for (unsigned int i = 0; i < 24; i++) { CDateTime time(2000, 1, 1, i, 0, 0); valuesVec.push_back(g_infoManager.LocalizeTime(time, TIME_FORMAT_HH_MM_XX)); } } else StringUtils::Tokenize(values, valuesVec, "|"); if (!entries.empty()) StringUtils::Tokenize(entries, entryVec, "|"); if(bSort && type == "labelenum") std::sort(valuesVec.begin(), valuesVec.end(), sortstringbyname()); for (unsigned int i = 0; i < valuesVec.size(); i++) { int iAdd = i; if (entryVec.size() > i) iAdd = atoi(entryVec[i].c_str()); if (!lvalues.empty()) { std::string replace = m_addon->GetString(atoi(valuesVec[i].c_str())); if (replace.empty()) replace = g_localizeStrings.Get(atoi(valuesVec[i].c_str())); ((CGUISpinControlEx *)pControl)->AddLabel(replace, iAdd); } else ((CGUISpinControlEx *)pControl)->AddLabel(valuesVec[i], iAdd); } if (type == "labelenum") { // need to run through all our settings and find the one that matches ((CGUISpinControlEx*) pControl)->SetValueFromLabel(m_settings[id]); } else ((CGUISpinControlEx*) pControl)->SetValue(atoi(m_settings[id].c_str())); } else if (type == "fileenum" && !id.empty()) { pControl = new CGUISpinControlEx(*pOriginalSpin); if (!pControl) return; ((CGUISpinControlEx *)pControl)->SetText(label); ((CGUISpinControlEx *)pControl)->SetFloatValue(1.0f); vector<std::string> items = GetFileEnumValues(values, XMLUtils::GetAttribute(setting, "mask"), XMLUtils::GetAttribute(setting, "option")); for (unsigned int i = 0; i < items.size(); ++i) { ((CGUISpinControlEx *)pControl)->AddLabel(items[i], i); if (StringUtils::EqualsNoCase(items[i], m_settings[id])) ((CGUISpinControlEx *)pControl)->SetValue(i); } } // Sample: <setting id="mysettingname" type="rangeofnum" label="30000" rangestart="0" rangeend="100" elements="11" valueformat="30001" default="0" /> // in strings.xml: <string id="30001">%2.0f mp</string> // creates 11 piece, text formated number labels from 0 to 100 else if (type == "rangeofnum" && !id.empty()) { pControl = new CGUISpinControlEx(*pOriginalSpin); if (!pControl) return; ((CGUISpinControlEx *)pControl)->SetText(label); ((CGUISpinControlEx *)pControl)->SetFloatValue(1.0f); double rangestart = 0, rangeend = 1; setting->Attribute("rangestart", &rangestart); setting->Attribute("rangeend", &rangeend); int elements = 2; setting->Attribute("elements", &elements); std::string valueformat; if (setting->Attribute("valueformat")) valueformat = m_addon->GetString(atoi(setting->Attribute("valueformat"))); for (int i = 0; i < elements; i++) { std::string valuestring; if (elements < 2) valuestring = StringUtils::Format(valueformat.c_str(), rangestart); else valuestring = StringUtils::Format(valueformat.c_str(), rangestart+(rangeend-rangestart)/(elements-1)*i); ((CGUISpinControlEx *)pControl)->AddLabel(valuestring, i); } ((CGUISpinControlEx *)pControl)->SetValue(atoi(m_settings[id].c_str())); } // Sample: <setting id="mysettingname" type="slider" label="30000" range="5,5,60" option="int" default="5"/> // to make ints from 5-60 with 5 steps else if (type == "slider" && !id.empty()) { pControl = new CGUISettingsSliderControl(*pOriginalSlider); if (!pControl) return; ((CGUISettingsSliderControl *)pControl)->SetText(label); float fMin = 0.0f; float fMax = 100.0f; float fInc = 1.0f; vector<std::string> range = StringUtils::Split(XMLUtils::GetAttribute(setting, "range"), ','); if (range.size() > 1) { fMin = (float)atof(range[0].c_str()); if (range.size() > 2) { fMax = (float)atof(range[2].c_str()); fInc = (float)atof(range[1].c_str()); } else fMax = (float)atof(range[1].c_str()); } std::string option = XMLUtils::GetAttribute(setting, "option"); int iType=0; if (option.empty() || StringUtils::EqualsNoCase(option, "float")) iType = SLIDER_CONTROL_TYPE_FLOAT; else if (StringUtils::EqualsNoCase(option, "int")) iType = SLIDER_CONTROL_TYPE_INT; else if (StringUtils::EqualsNoCase(option, "percent")) iType = SLIDER_CONTROL_TYPE_PERCENTAGE; ((CGUISettingsSliderControl *)pControl)->SetType(iType); ((CGUISettingsSliderControl *)pControl)->SetFloatRange(fMin, fMax); ((CGUISettingsSliderControl *)pControl)->SetFloatInterval(fInc); ((CGUISettingsSliderControl *)pControl)->SetFloatValue((float)atof(m_settings[id].c_str())); } else if (type == "lsep") { pControl = new CGUILabelControl(*pOriginalLabel); if (pControl) ((CGUILabelControl *)pControl)->SetLabel(label); } else if (type == "sep") pControl = new CGUIImage(*pOriginalImage); } if (pControl) { pControl->SetWidth(group->GetWidth()); pControl->SetVisible(true); pControl->SetID(controlId); pControl->AllocResources(); group->AddControl(pControl); pControl = NULL; } setting = setting->NextSiblingElement("setting"); controlId++; } EnableControls(); }
std::set<std::string> CGUIDialogSettingsBase::CreateSettings() { FreeSettingsControls(); std::set<std::string> settingMap; if (m_categories.size() <= 0) return settingMap; if (m_iCategory < 0 || m_iCategory >= (int)m_categories.size()) m_iCategory = 0; CGUIControlGroupList *group = dynamic_cast<CGUIControlGroupList *>(GetControl(SETTINGS_GROUP_ID)); if (group == NULL) return settingMap; const CSettingCategory* category = m_categories.at(m_iCategory); if (category == NULL) return settingMap; // set the description of the current category SetDescription(category->GetHelp()); const SettingGroupList& groups = category->GetGroups((SettingLevel)GetSettingLevel()); int iControlID = CONTROL_SETTINGS_START_CONTROL; bool first = true; for (SettingGroupList::const_iterator groupIt = groups.begin(); groupIt != groups.end(); ++groupIt) { if (*groupIt == NULL) continue; const SettingList& settings = (*groupIt)->GetSettings((SettingLevel)GetSettingLevel()); if (settings.size() <= 0) continue; const CSettingControlTitle *title = dynamic_cast<CSettingControlTitle *>((*groupIt)->GetControl()); bool hideSeparator = title ? title->IsSeparatorHidden() : false; bool separatorBelowGroupLabel = title ? title->IsSeparatorBelowLabel() : false; int groupLabel = (*groupIt)->GetLabel(); // hide the separator for the first settings grouplist if it // is the very first item in the list (also above the label) if (first) { first = false; if (groupLabel <= 0) hideSeparator = true; } else if (!separatorBelowGroupLabel && !hideSeparator) AddSeparator(group->GetWidth(), iControlID); if (groupLabel > 0) AddLabel(group->GetWidth(), iControlID, groupLabel); if (separatorBelowGroupLabel && !hideSeparator) AddSeparator(group->GetWidth(), iControlID); for (SettingList::const_iterator settingIt = settings.begin(); settingIt != settings.end(); ++settingIt) { CSetting *pSetting = *settingIt; settingMap.insert(pSetting->GetId()); AddSetting(pSetting, group->GetWidth(), iControlID); } } if (AllowResettingSettings() && !settingMap.empty()) { // add "Reset" control AddSeparator(group->GetWidth(), iControlID); AddSetting(m_resetSetting, group->GetWidth(), iControlID); } // update our settings (turns controls on/off as appropriate) UpdateSettings(); return settingMap; }