Added the property-cycle command.
This commit is contained in:
parent
7d3c375df2
commit
013c322dd3
1 changed files with 59 additions and 0 deletions
|
@ -116,6 +116,25 @@ limit_value (double * value, const SGPropertyNode * arg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
compare_values (SGPropertyNode * value1, SGPropertyNode * value2)
|
||||||
|
{
|
||||||
|
switch (value1->getType()) {
|
||||||
|
case SGPropertyNode::BOOL:
|
||||||
|
return (value1->getBoolValue() == value2->getBoolValue());
|
||||||
|
case SGPropertyNode::INT:
|
||||||
|
return (value1->getIntValue() == value2->getIntValue());
|
||||||
|
case SGPropertyNode::LONG:
|
||||||
|
return (value1->getLongValue() == value2->getLongValue());
|
||||||
|
case SGPropertyNode::FLOAT:
|
||||||
|
return (value1->getFloatValue() == value2->getFloatValue());
|
||||||
|
case SGPropertyNode::DOUBLE:
|
||||||
|
return (value1->getDoubleValue() == value2->getDoubleValue());
|
||||||
|
default:
|
||||||
|
return !strcmp(value1->getStringValue(), value2->getStringValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -530,6 +549,45 @@ do_property_scale (const SGPropertyNode * arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Built-in command: cycle a property through a set of values.
|
||||||
|
*
|
||||||
|
* If the current value isn't in the list, the cycle will
|
||||||
|
* (re)start from the beginning.
|
||||||
|
*
|
||||||
|
* property: the name of the property to cycle.
|
||||||
|
* value[*]: the list of values to cycle through.
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
do_property_cycle (const SGPropertyNode * arg)
|
||||||
|
{
|
||||||
|
SGPropertyNode * prop = get_prop(arg);
|
||||||
|
vector<SGPropertyNode_ptr> values = arg->getChildren("value");
|
||||||
|
int selection = -1;
|
||||||
|
int nSelections = values.size();
|
||||||
|
|
||||||
|
if (nSelections < 1) {
|
||||||
|
SG_LOG(SG_GENERAL, SG_ALERT, "No values for property-cycle");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to find the current selection
|
||||||
|
for (int i = 0; i < nSelections; i++) {
|
||||||
|
if (compare_values(prop, values[i])) {
|
||||||
|
selection = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default or wrap to the first selection
|
||||||
|
if (selection < 0 || selection >= nSelections)
|
||||||
|
selection = 0;
|
||||||
|
|
||||||
|
prop->setUnspecifiedValue(values[selection]->getStringValue());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Built-in command: Show an XML-configured dialog.
|
* Built-in command: Show an XML-configured dialog.
|
||||||
*
|
*
|
||||||
|
@ -678,6 +736,7 @@ static struct {
|
||||||
{ "property-multiply", do_property_multiply },
|
{ "property-multiply", do_property_multiply },
|
||||||
{ "property-swap", do_property_swap },
|
{ "property-swap", do_property_swap },
|
||||||
{ "property-scale", do_property_scale },
|
{ "property-scale", do_property_scale },
|
||||||
|
{ "property-cycle", do_property_cycle },
|
||||||
{ "dialog-show", do_dialog_show },
|
{ "dialog-show", do_dialog_show },
|
||||||
{ "dialog-close", do_dialog_close },
|
{ "dialog-close", do_dialog_close },
|
||||||
{ "dialog-show", do_dialog_show },
|
{ "dialog-show", do_dialog_show },
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue