void LLControlVariable::setValue(const LLSD& new_value, bool saved_value) { if ((*mValidateSignal)(this, new_value) == false) { // can not set new value, exit return; } LLSD storable_value = getComparableValue(new_value); bool value_changed = llsd_compare(getValue(), storable_value) == FALSE; if(saved_value) { // If we're going to save this value, return to default but don't fire resetToDefault(false); if (llsd_compare(mValues.back(), storable_value) == FALSE) { mValues.push_back(storable_value); } } else { // This is a unsaved value. Its needs to reside at // mValues[2] (or greater). It must not affect // the result of getSaveValue() if (llsd_compare(mValues.back(), storable_value) == FALSE) { while(mValues.size() > 2) { // Remove any unsaved values. mValues.pop_back(); } if(mValues.size() < 2) { // Add the default to the 'save' value. mValues.push_back(mValues[0]); } // Add the 'un-save' value. mValues.push_back(storable_value); } } if(value_changed) { if(getCOAActive() == this) (*mCommitSignal)(this,storable_value); } }
bool LLControlVariable::isSane() { if (mSanityType <= 0) { return true; } // it's the default value, or we can't check sanity, assume it's sane if (mValues.size() < 2 || !mValues[1] || mValues[1].isUndefined()) { return true; } bool sanity = false; switch (mSanityType) { case SANITY_TYPE_EQUALS: sanity = llsd_compare(mValues[1], mSanityValues[0]); break; case SANITY_TYPE_NOT_EQUALS: sanity = !llsd_compare(mValues[1], mSanityValues[0]); break; case SANITY_TYPE_LESS_THAN: sanity = (mValues[1].asReal() < mSanityValues[0].asReal()); break; case SANITY_TYPE_GREATER_THAN: sanity = (mValues[1].asReal() > mSanityValues[0].asReal()); break; case SANITY_TYPE_LESS_THAN_EQUALS: sanity = (mValues[1].asReal() <= mSanityValues[0].asReal()); break; case SANITY_TYPE_GREATER_THAN_EQUALS: sanity = (mValues[1].asReal() >= mSanityValues[0].asReal()); break; case SANITY_TYPE_BETWEEN: sanity = (mValues[1].asReal() >= mSanityValues[0].asReal() && mValues[1].asReal() <= mSanityValues[1].asReal()); break; case SANITY_TYPE_NOT_BETWEEN: sanity = (mValues[1].asReal() <= mSanityValues[0].asReal() || mValues[1].asReal() >= mSanityValues[1].asReal()); break; case SANITY_TYPE_NONE: sanity = true; break; default: sanity = false; } return sanity; }
void LLControlVariable::setDefaultValue(const LLSD& value) { // Set the control variables value and make it // the default value. If the active value is changed, // send the signal. // *NOTE: Default values are not saved, only read. LLSD comparable_value = getComparableValue(value); bool value_changed = (llsd_compare(getValue(), comparable_value) == FALSE); resetToDefault(false); mValues[0] = comparable_value; if(value_changed) { firePropertyChanged(); } }
bool LLControlVariable::shouldSave(bool nondefault_only) { // This method is used to decide whether we should save a given // variable. Two of the three values of mPersist are easy. if (mPersist == PERSIST_NO) return false; if (mPersist == PERSIST_ALWAYS) return true; // PERSIST_NONDFT // If caller doesn't need us to filter, just save. if (! nondefault_only) return true; // PERSIST_NONDFT: caller only wants us to save this variable if its value // differs from default. if (isDefault()) // never been altered return false; // We've set at least one other value: compare it to default. Save only if // they differ. return ! llsd_compare(getSaveValue(), getDefault()); }
bool LLControlVariable::isSaveValueDefault() { return (mValues.size() == 1) || ((mValues.size() > 1) && llsd_compare(mValues[1], mValues[0])); }