NS_IMETHODIMP StyleSheet::DeleteRule(uint32_t aIndex) { ErrorResult rv; DeleteRule(aIndex, *nsContentUtils::SubjectPrincipal(), rv); return rv.StealNSResult(); }
TBool CRuleManager::Delete(const TInt& aIndex) { if (aIndex >=0 && aIndex < iRules->Count()) { if (ShowConfirmationQueryL(R_TEXT_CONFIRM_DELETE_RULE)) return DeleteRule(aIndex); } return EFalse; }
void CGUIDialogMediaFilter::InitializeSettings() { CGUIDialogSettingsManualBase::InitializeSettings(); if (m_filter == NULL) return; Reset(true); int handledRules = 0; CSettingCategory *category = AddCategory("filter", -1); if (category == NULL) { CLog::Log(LOGERROR, "CGUIDialogMediaFilter: unable to setup filters"); return; } CSettingGroup *group = AddGroup(category); if (group == NULL) { CLog::Log(LOGERROR, "CGUIDialogMediaFilter: unable to setup filters"); return; } for (unsigned int index = 0; index < NUM_FILTERS; index++) { if (filterList[index].mediaType != m_mediaType) continue; Filter filter = filterList[index]; // check the smartplaylist if it contains a matching rule for (CDatabaseQueryRules::iterator rule = m_filter->m_ruleCombination.m_rules.begin(); rule != m_filter->m_ruleCombination.m_rules.end(); rule++) { if ((*rule)->m_field == filter.field) { filter.rule = (CSmartPlaylistRule *)rule->get(); handledRules++; break; } } std::string settingId = StringUtils::Format("filter.%s.%d", filter.mediaType.c_str(), filter.field); if (filter.controlType == "edit") { CVariant data; if (filter.rule != NULL && filter.rule->m_parameter.size() == 1) data = filter.rule->m_parameter.at(0); if (filter.settingType == SettingTypeString) filter.setting = AddEdit(group, settingId, filter.label, 0, data.asString(), true, false, filter.label, true); else if (filter.settingType == SettingTypeInteger) filter.setting = AddEdit(group, settingId, filter.label, 0, static_cast<int>(data.asInteger()), 0, 1, 0, false, static_cast<int>(filter.label), true); else if (filter.settingType == SettingTypeNumber) filter.setting = AddEdit(group, settingId, filter.label, 0, data.asFloat(), 0.0f, 1.0f, 0.0f, false, filter.label, true); } else if (filter.controlType == "toggle") { int value = CHECK_ALL; if (filter.rule != NULL) value = filter.rule->m_operator == CDatabaseQueryRule::OPERATOR_TRUE ? CHECK_YES : CHECK_NO; StaticIntegerSettingOptions entries; entries.push_back(std::pair<int, int>(CHECK_LABEL_ALL, CHECK_ALL)); entries.push_back(std::pair<int, int>(CHECK_LABEL_NO, CHECK_NO)); entries.push_back(std::pair<int, int>(CHECK_LABEL_YES, CHECK_YES)); filter.setting = AddSpinner(group, settingId, filter.label, 0, value, entries, true); } else if (filter.controlType == "list") { std::vector<std::string> values; if (filter.rule != NULL && !filter.rule->m_parameter.empty()) { values = StringUtils::Split(filter.rule->GetParameter(), DATABASEQUERY_RULE_VALUE_SEPARATOR); if (values.size() == 1 && values.at(0).empty()) values.erase(values.begin()); } filter.setting = AddList(group, settingId, filter.label, 0, values, GetStringListOptions, filter.label); } else if (filter.controlType == "range") { CVariant valueLower, valueUpper; if (filter.rule != NULL) { if (filter.rule->m_parameter.size() == 2) { valueLower = filter.rule->m_parameter.at(0); valueUpper = filter.rule->m_parameter.at(1); } else { DeleteRule(filter.field); filter.rule = NULL; } } if (filter.settingType == SettingTypeInteger) { int min, interval, max; GetRange(filter, min, interval, max); // don't create the filter if there's no real range if (min == max) continue; int iValueLower = valueLower.isNull() ? min : static_cast<int>(valueLower.asInteger()); int iValueUpper = valueUpper.isNull() ? max : static_cast<int>(valueUpper.asInteger()); if (filter.controlFormat == "integer") filter.setting = AddRange(group, settingId, filter.label, 0, iValueLower, iValueUpper, min, interval, max, -1, 21469, true); else if (filter.controlFormat == "percentage") filter.setting = AddPercentageRange(group, settingId, filter.label, 0, iValueLower, iValueUpper, -1, 1, 21469, true); else if (filter.controlFormat == "date") filter.setting = AddDateRange(group, settingId, filter.label, 0, iValueLower, iValueUpper, min, interval, max, -1, 21469, true); else if (filter.controlFormat == "time") filter.setting = AddTimeRange(group, settingId, filter.label, 0, iValueLower, iValueUpper, min, interval, max, -1, 21469, true); } else if (filter.settingType == SettingTypeNumber) { float min, interval, max; GetRange(filter, min, interval, max); // don't create the filter if there's no real range if (min == max) continue; float fValueLower = valueLower.isNull() ? min : valueLower.asFloat(); float fValueUpper = valueUpper.isNull() ? max : valueUpper.asFloat(); filter.setting = AddRange(group, settingId, filter.label, 0, fValueLower, fValueUpper, min, interval, max, -1, 21469, true); } } else { if (filter.rule != NULL) handledRules--; CLog::Log(LOGWARNING, "CGUIDialogMediaFilter: filter %d of media type %s with unknown control type '%s'", filter.field, filter.mediaType.c_str(), filter.controlType.c_str()); continue; } if (filter.setting == NULL) { if (filter.rule != NULL) handledRules--; CLog::Log(LOGWARNING, "CGUIDialogMediaFilter: failed to create filter %d of media type %s with control type '%s'", filter.field, filter.mediaType.c_str(), filter.controlType.c_str()); continue; } m_filters.insert(make_pair(settingId, filter)); } // make sure that no change in capacity size is needed when adding new rules // which would copy around the rules and our pointers in the Filter struct // wouldn't work anymore m_filter->m_ruleCombination.m_rules.reserve(m_filters.size() + (m_filter->m_ruleCombination.m_rules.size() - handledRules)); }
void CGUIDialogMediaFilter::OnSettingChanged(const CSetting *setting) { CGUIDialogSettingsManualBase::OnSettingChanged(setting); std::map<std::string, Filter>::iterator it = m_filters.find(setting->GetId()); if (it == m_filters.end()) return; bool remove = false; Filter& filter = it->second; if (filter.controlType == "edit") { std::string value = setting->ToString(); if (!value.empty()) { if (filter.rule == NULL) filter.rule = AddRule(filter.field, filter.ruleOperator); filter.rule->m_parameter.clear(); filter.rule->m_parameter.push_back(value); } else remove = true; } else if (filter.controlType == "toggle") { int choice = static_cast<const CSettingInt*>(setting)->GetValue(); if (choice > CHECK_ALL) { CDatabaseQueryRule::SEARCH_OPERATOR ruleOperator = choice == CHECK_YES ? CDatabaseQueryRule::OPERATOR_TRUE : CDatabaseQueryRule::OPERATOR_FALSE; if (filter.rule == NULL) filter.rule = AddRule(filter.field, ruleOperator); else filter.rule->m_operator = ruleOperator; } else remove = true; } else if (filter.controlType == "list") { std::vector<CVariant> values = CSettingUtils::GetList(static_cast<const CSettingList*>(setting)); if (!values.empty()) { if (filter.rule == NULL) filter.rule = AddRule(filter.field, filter.ruleOperator); filter.rule->m_parameter.clear(); for (std::vector<CVariant>::const_iterator itValue = values.begin(); itValue != values.end(); ++itValue) filter.rule->m_parameter.push_back(itValue->asString()); } else remove = true; } else if (filter.controlType == "range") { const CSettingList *settingList = static_cast<const CSettingList*>(setting); std::vector<CVariant> values = CSettingUtils::GetList(settingList); if (values.size() != 2) return; std::string strValueLower, strValueUpper; const CSetting *definition = settingList->GetDefinition(); if (definition->GetType() == SettingTypeInteger) { const CSettingInt *definitionInt = static_cast<const CSettingInt*>(definition); int valueLower = static_cast<int>(values.at(0).asInteger()); int valueUpper = static_cast<int>(values.at(1).asInteger()); if (valueLower > definitionInt->GetMinimum() || valueUpper < definitionInt->GetMaximum()) { if (filter.controlFormat == "date") { strValueLower = CDateTime(static_cast<time_t>(valueLower)).GetAsDBDate(); strValueUpper = CDateTime(static_cast<time_t>(valueUpper)).GetAsDBDate(); } else { strValueLower = values.at(0).asString(); strValueUpper = values.at(1).asString(); } } } else if (definition->GetType() == SettingTypeNumber) { const CSettingNumber *definitionNumber = static_cast<const CSettingNumber*>(definition); float valueLower = values.at(0).asFloat(); float valueUpper = values.at(1).asFloat(); if (valueLower > definitionNumber->GetMinimum() || valueUpper < definitionNumber->GetMaximum()) { strValueLower = values.at(0).asString(); strValueUpper = values.at(1).asString(); } } else return; if (!strValueLower.empty() && !strValueUpper.empty()) { // prepare the filter rule if (filter.rule == NULL) filter.rule = AddRule(filter.field, filter.ruleOperator); filter.rule->m_parameter.clear(); filter.rule->m_parameter.push_back(strValueLower); filter.rule->m_parameter.push_back(strValueUpper); } else remove = true; } else return; // we need to remove the existing rule for the title if (remove && filter.rule != NULL) { DeleteRule(filter.field); filter.rule = NULL; } CGUIMessage msg(GUI_MSG_REFRESH_LIST, GetID(), 0); g_windowManager.SendThreadMessage(msg, WINDOW_DIALOG_MEDIA_FILTER); }