bool CSettings::SetList(const std::string &id, const std::vector<CVariant> &value) { CSetting *setting = m_settingsManager->GetSetting(id); if (setting == NULL || setting->GetType() != SettingTypeList) return false; CSettingList *listSetting = static_cast<CSettingList*>(setting); SettingPtrList newValues; bool ret = true; int index = 0; for (std::vector<CVariant>::const_iterator itValue = value.begin(); itValue != value.end(); ++itValue) { CSetting *settingValue = listSetting->GetDefinition()->Clone(StringUtils::Format("%s.%d", listSetting->GetId().c_str(), index++)); if (settingValue == NULL) return false; switch (listSetting->GetElementType()) { case SettingTypeBool: if (!itValue->isBoolean()) return false; ret = static_cast<CSettingBool*>(settingValue)->SetValue(itValue->asBoolean()); break; case SettingTypeInteger: if (!itValue->isInteger()) return false; ret = static_cast<CSettingInt*>(settingValue)->SetValue((int)itValue->asInteger()); break; case SettingTypeNumber: if (!itValue->isDouble()) return false; ret = static_cast<CSettingNumber*>(settingValue)->SetValue(itValue->asDouble()); break; case SettingTypeString: if (!itValue->isString()) return false; ret = static_cast<CSettingString*>(settingValue)->SetValue(itValue->asString()); break; default: ret = false; break; } if (!ret) { delete settingValue; return false; } newValues.push_back(SettingPtr(settingValue)); } return listSetting->SetValue(newValues); }
CGUIControlRangeSetting::CGUIControlRangeSetting(CGUISettingsSliderControl *pSlider, int id, CSetting *pSetting) : CGUIControlBaseSetting(id, pSetting) { m_pSlider = pSlider; if (m_pSlider == NULL) return; m_pSlider->SetID(id); m_pSlider->SetRangeSelection(true); if (m_pSetting->GetType() == SettingTypeList) { CSettingList *settingList = static_cast<CSettingList*>(m_pSetting); const CSetting *listDefintion = settingList->GetDefinition(); switch (listDefintion->GetType()) { case SettingTypeInteger: { const CSettingInt *listDefintionInt = static_cast<const CSettingInt*>(listDefintion); if (m_pSetting->GetControl()->GetFormat() == "percentage") m_pSlider->SetType(SLIDER_CONTROL_TYPE_PERCENTAGE); else { m_pSlider->SetType(SLIDER_CONTROL_TYPE_INT); m_pSlider->SetRange(listDefintionInt->GetMinimum(), listDefintionInt->GetMaximum()); } m_pSlider->SetIntInterval(listDefintionInt->GetStep()); break; } case SettingTypeNumber: { const CSettingNumber *listDefinitionNumber = static_cast<const CSettingNumber*>(listDefintion); m_pSlider->SetType(SLIDER_CONTROL_TYPE_FLOAT); m_pSlider->SetFloatRange((float)listDefinitionNumber->GetMinimum(), (float)listDefinitionNumber->GetMaximum()); m_pSlider->SetFloatInterval((float)listDefinitionNumber->GetStep()); break; } default: break; } } Update(); }
void CGUIControlRangeSetting::Update(bool updateDisplayOnly /* = false */) { if (m_pSlider == NULL || m_pSetting->GetType() != SettingTypeList) return; CGUIControlBaseSetting::Update(); CSettingList *settingList = static_cast<CSettingList*>(m_pSetting); const SettingPtrList &settingListValues = settingList->GetValue(); if (settingListValues.size() != 2) return; const CSetting *listDefintion = settingList->GetDefinition(); const CSettingControlRange *controlRange = static_cast<const CSettingControlRange*>(m_pSetting->GetControl()); const std::string &controlFormat = controlRange->GetFormat(); std::string strText; std::string strTextLower, strTextUpper; std::string formatString = g_localizeStrings.Get(controlRange->GetFormatLabel() > -1 ? controlRange->GetFormatLabel() : 21469); std::string valueFormat = controlRange->GetValueFormat(); if (controlRange->GetValueFormatLabel() > -1) valueFormat = g_localizeStrings.Get(controlRange->GetValueFormatLabel()); switch (listDefintion->GetType()) { case SettingTypeInteger: { int valueLower, valueUpper; if (updateDisplayOnly) { valueLower = m_pSlider->GetIntValue(CGUISliderControl::RangeSelectorLower); valueUpper = m_pSlider->GetIntValue(CGUISliderControl::RangeSelectorUpper); } else { valueLower = static_cast<CSettingInt*>(settingListValues[0].get())->GetValue(); valueUpper = static_cast<CSettingInt*>(settingListValues[1].get())->GetValue(); m_pSlider->SetIntValue(valueLower, CGUISliderControl::RangeSelectorLower); m_pSlider->SetIntValue(valueUpper, CGUISliderControl::RangeSelectorUpper); } if (controlFormat == "date" || controlFormat == "time") { CDateTime dateLower = (time_t)valueLower; CDateTime dateUpper = (time_t)valueUpper; if (controlFormat == "date") { if (valueFormat.empty()) { strTextLower = dateLower.GetAsLocalizedDate(); strTextUpper = dateUpper.GetAsLocalizedDate(); } else { strTextLower = dateLower.GetAsLocalizedDate(valueFormat); strTextUpper = dateUpper.GetAsLocalizedDate(valueFormat); } } else { if (valueFormat.empty()) valueFormat = "mm:ss"; strTextLower = dateLower.GetAsLocalizedTime(valueFormat); strTextUpper = dateUpper.GetAsLocalizedTime(valueFormat); } } else { strTextLower = StringUtils::Format(valueFormat.c_str(), valueLower); strTextUpper = StringUtils::Format(valueFormat.c_str(), valueUpper); } if (valueLower != valueUpper) strText = StringUtils::Format(formatString.c_str(), strTextLower.c_str(), strTextUpper.c_str()); else strText = strTextLower; break; } case SettingTypeNumber: { double valueLower, valueUpper; if (updateDisplayOnly) { valueLower = static_cast<double>(m_pSlider->GetFloatValue(CGUISliderControl::RangeSelectorLower)); valueUpper = static_cast<double>(m_pSlider->GetFloatValue(CGUISliderControl::RangeSelectorUpper)); } else { valueLower = static_cast<CSettingNumber*>(settingListValues[0].get())->GetValue(); valueUpper = static_cast<CSettingNumber*>(settingListValues[1].get())->GetValue(); m_pSlider->SetFloatValue((float)valueLower, CGUISliderControl::RangeSelectorLower); m_pSlider->SetFloatValue((float)valueUpper, CGUISliderControl::RangeSelectorUpper); } strTextLower = StringUtils::Format(valueFormat.c_str(), valueLower); if (valueLower != valueUpper) { strTextUpper = StringUtils::Format(valueFormat.c_str(), valueUpper); strText = StringUtils::Format(formatString.c_str(), strTextLower.c_str(), strTextUpper.c_str()); } else strText = strTextLower; break; } default: strText.clear(); break; } if (!strText.empty()) m_pSlider->SetTextValue(strText); }