- added optional min, max, and wrap parameters to property-adjust
This commit is contained in:
parent
921a1290f5
commit
f725b12de5
1 changed files with 89 additions and 13 deletions
|
@ -52,6 +52,10 @@ public:
|
||||||
{ return _value ? _value : &_dummy_0; }
|
{ return _value ? _value : &_dummy_0; }
|
||||||
virtual const SGPropertyNode * getStep () const
|
virtual const SGPropertyNode * getStep () const
|
||||||
{ return _step ? _step : &_dummy_0; }
|
{ return _step ? _step : &_dummy_0; }
|
||||||
|
virtual const SGPropertyNode * getMin () const { return _min; }
|
||||||
|
virtual const SGPropertyNode * getMax () const { return _max; }
|
||||||
|
virtual const SGPropertyNode * getWrap () const
|
||||||
|
{ return _wrap ? _wrap : &_dummy_0; }
|
||||||
virtual const SGPropertyNode * getFactor () const
|
virtual const SGPropertyNode * getFactor () const
|
||||||
{ return _factor ? _factor : &_dummy_1; }
|
{ return _factor ? _factor : &_dummy_1; }
|
||||||
virtual const SGPropertyNode * getSetting () const
|
virtual const SGPropertyNode * getSetting () const
|
||||||
|
@ -65,6 +69,9 @@ private:
|
||||||
mutable SGPropertyNode * _prop2;
|
mutable SGPropertyNode * _prop2;
|
||||||
const SGPropertyNode * _value;
|
const SGPropertyNode * _value;
|
||||||
const SGPropertyNode * _step;
|
const SGPropertyNode * _step;
|
||||||
|
const SGPropertyNode * _min;
|
||||||
|
const SGPropertyNode * _max;
|
||||||
|
const SGPropertyNode * _wrap;
|
||||||
const SGPropertyNode * _factor;
|
const SGPropertyNode * _factor;
|
||||||
const SGPropertyNode * _setting;
|
const SGPropertyNode * _setting;
|
||||||
const SGPropertyNode * _offset;
|
const SGPropertyNode * _offset;
|
||||||
|
@ -79,6 +86,9 @@ PropertyCommandState::PropertyCommandState (const SGPropertyNode * arg)
|
||||||
_prop2(fgGetNode(arg->getStringValue("property[1]", "/null"), true)),
|
_prop2(fgGetNode(arg->getStringValue("property[1]", "/null"), true)),
|
||||||
_value(arg->getNode("value")),
|
_value(arg->getNode("value")),
|
||||||
_step(arg->getNode("step")),
|
_step(arg->getNode("step")),
|
||||||
|
_min(arg->getNode("min")),
|
||||||
|
_max(arg->getNode("max")),
|
||||||
|
_wrap(arg->getNode("wrap")),
|
||||||
_factor(arg->getNode("factor")),
|
_factor(arg->getNode("factor")),
|
||||||
_setting(arg->getNode("setting")),
|
_setting(arg->getNode("setting")),
|
||||||
_offset(arg->getNode("offset"))
|
_offset(arg->getNode("offset"))
|
||||||
|
@ -336,7 +346,12 @@ do_property_assign (const SGPropertyNode * arg, SGCommandState ** state)
|
||||||
* Built-in command: increment or decrement a property value.
|
* Built-in command: increment or decrement a property value.
|
||||||
*
|
*
|
||||||
* property: the name of the property to increment or decrement.
|
* property: the name of the property to increment or decrement.
|
||||||
* step: the amount of the increment or decrement.
|
* step: the amount of the increment or decrement (default: 0).
|
||||||
|
* min: the minimum allowed value (default: no minimum).
|
||||||
|
* max: the maximum allowed value (default: no maximum).
|
||||||
|
* wrap: true if the value should be wrapped when it passes min or max;
|
||||||
|
* both min and max must be present for this to work (default:
|
||||||
|
* false).
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
do_property_adjust (const SGPropertyNode * arg, SGCommandState ** state)
|
do_property_adjust (const SGPropertyNode * arg, SGCommandState ** state)
|
||||||
|
@ -345,6 +360,9 @@ do_property_adjust (const SGPropertyNode * arg, SGCommandState ** state)
|
||||||
*state = new PropertyCommandState(arg);
|
*state = new PropertyCommandState(arg);
|
||||||
SGPropertyNode * prop = ((PropertyCommandState *)(*state))->getProp();
|
SGPropertyNode * prop = ((PropertyCommandState *)(*state))->getProp();
|
||||||
const SGPropertyNode * step = ((PropertyCommandState *)(*state))->getStep();
|
const SGPropertyNode * step = ((PropertyCommandState *)(*state))->getStep();
|
||||||
|
const SGPropertyNode * min = ((PropertyCommandState *)(*state))->getMin();
|
||||||
|
const SGPropertyNode * max = ((PropertyCommandState *)(*state))->getMax();
|
||||||
|
bool wrap = ((PropertyCommandState *)(*state))->getWrap()->getBoolValue();
|
||||||
|
|
||||||
switch (prop->getType()) {
|
switch (prop->getType()) {
|
||||||
case SGPropertyNode::BOOL:
|
case SGPropertyNode::BOOL:
|
||||||
|
@ -352,20 +370,77 @@ do_property_adjust (const SGPropertyNode * arg, SGCommandState ** state)
|
||||||
return prop->setBoolValue(!prop->getBoolValue());
|
return prop->setBoolValue(!prop->getBoolValue());
|
||||||
else
|
else
|
||||||
return true;
|
return true;
|
||||||
case SGPropertyNode::INT:
|
case SGPropertyNode::INT: {
|
||||||
return prop->setIntValue(prop->getIntValue()
|
int value = prop->getIntValue() + step->getIntValue();
|
||||||
+ step->getIntValue());
|
if (min && (value < min->getIntValue())) {
|
||||||
case SGPropertyNode::LONG:
|
if (wrap && max)
|
||||||
return prop->setLongValue(prop->getLongValue()
|
value = max->getIntValue();
|
||||||
+ step->getLongValue());
|
else
|
||||||
case SGPropertyNode::FLOAT:
|
value = min->getIntValue();
|
||||||
return prop->setFloatValue(prop->getFloatValue()
|
}
|
||||||
+ step->getFloatValue());
|
if (max && value > max->getIntValue()) {
|
||||||
|
if (wrap && min)
|
||||||
|
value = min->getIntValue();
|
||||||
|
else
|
||||||
|
value = max->getIntValue();
|
||||||
|
}
|
||||||
|
return prop->setIntValue(value);
|
||||||
|
}
|
||||||
|
case SGPropertyNode::LONG: {
|
||||||
|
long value = prop->getLongValue() + step->getLongValue();
|
||||||
|
if (min && (value < min->getLongValue())) {
|
||||||
|
if (wrap && max)
|
||||||
|
value = max->getLongValue();
|
||||||
|
else
|
||||||
|
value = min->getLongValue();
|
||||||
|
}
|
||||||
|
if (max && value > max->getLongValue()) {
|
||||||
|
if (wrap && min)
|
||||||
|
value = min->getLongValue();
|
||||||
|
else
|
||||||
|
value = max->getLongValue();
|
||||||
|
}
|
||||||
|
return prop->setLongValue(value);
|
||||||
|
}
|
||||||
|
case SGPropertyNode::FLOAT: {
|
||||||
|
float value = prop->getFloatValue() + step->getFloatValue();
|
||||||
|
if (min && (value < min->getFloatValue())) {
|
||||||
|
if (wrap && max)
|
||||||
|
value = max->getFloatValue();
|
||||||
|
else
|
||||||
|
value = min->getFloatValue();
|
||||||
|
}
|
||||||
|
if (max && value > max->getFloatValue()) {
|
||||||
|
if (wrap && min)
|
||||||
|
value = min->getFloatValue();
|
||||||
|
else
|
||||||
|
value = max->getFloatValue();
|
||||||
|
}
|
||||||
|
return prop->setFloatValue(value);
|
||||||
|
}
|
||||||
case SGPropertyNode::DOUBLE:
|
case SGPropertyNode::DOUBLE:
|
||||||
case SGPropertyNode::UNSPECIFIED:
|
case SGPropertyNode::UNSPECIFIED:
|
||||||
return prop->setDoubleValue(prop->getDoubleValue()
|
case SGPropertyNode::NONE: {
|
||||||
+ step->getDoubleValue());
|
double value = prop->getDoubleValue() + step->getDoubleValue();
|
||||||
default: // doesn't make sense with strings
|
if (min && (value < min->getDoubleValue())) {
|
||||||
|
if (wrap && max)
|
||||||
|
value = max->getDoubleValue();
|
||||||
|
else
|
||||||
|
value = min->getDoubleValue();
|
||||||
|
}
|
||||||
|
if (max && value > max->getDoubleValue()) {
|
||||||
|
if (wrap && min)
|
||||||
|
value = min->getDoubleValue();
|
||||||
|
else
|
||||||
|
value = max->getDoubleValue();
|
||||||
|
}
|
||||||
|
return prop->setDoubleValue(value);
|
||||||
|
}
|
||||||
|
case SGPropertyNode::STRING: // doesn't make sense with strings
|
||||||
|
SG_LOG(SG_INPUT, SG_ALERT, "Cannot adjust a string value");
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
SG_LOG(SG_INPUT, SG_ALERT, "Unknown value type");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -401,6 +476,7 @@ do_property_multiply (const SGPropertyNode * arg, SGCommandState ** state)
|
||||||
* factor->getDoubleValue()));
|
* factor->getDoubleValue()));
|
||||||
case SGPropertyNode::DOUBLE:
|
case SGPropertyNode::DOUBLE:
|
||||||
case SGPropertyNode::UNSPECIFIED:
|
case SGPropertyNode::UNSPECIFIED:
|
||||||
|
case SGPropertyNode::NONE:
|
||||||
return prop->setDoubleValue(prop->getDoubleValue()
|
return prop->setDoubleValue(prop->getDoubleValue()
|
||||||
* factor->getDoubleValue());
|
* factor->getDoubleValue());
|
||||||
default: // doesn't make sense with strings
|
default: // doesn't make sense with strings
|
||||||
|
|
Loading…
Reference in a new issue