Vivian pointed out that a redefined Ctrl-U key binding didn't work correctly. I found out that this is, because the definition in $FG_ROOT/keyboard.xml sets <value type="bool"> for binding[1], and ... [better sit down first!] ... and assigning <value type="double"> in a *-set.xml file doesn't *really* set "double" as new type!
Instead, the boolean is kept, and a double sqeezed into it. In other words: once tainted as bool, you can throw all doubles in the universe on a property node, and all it will accept is 0 and 1. Without warning! To fix that I added a clear() method to SGPropertyNode, which does first call private clear_node() and then sets the type to NONE. Only now a new type can get assigned. This new method is called from the XML handler's startElement() (which fixes the Ctrl-U bug), and while I was at it, from removeChild(), where it makes sense, too. setDoubleValue() alone, for instance, does of course still not change a node type to double. Patch attached. Does anyone have objections? Better solutions? (code preferred! :-) m. PS: is it just me or is sg/fgfs grossly over-commented?! It's not uncommon to see things like: // set node value to 0.0 node->setDoubleValue(0.0); I add these silly comments, too, if it's the style of the file, but it always costs me some nerves. (No need to tell me that this is better than too *few* comments, which is an entirely different story. :-}
Index: props.cxx =================================================================== RCS file: /var/cvs/SimGear-0.3/SimGear/simgear/props/props.cxx,v retrieving revision 1.7 diff -u -p -r1.7 props.cxx --- props.cxx 23 Dec 2004 13:32:01 -0000 1.7 +++ props.cxx 9 May 2005 12:08:55 -0000 @@ -923,6 +923,7 @@ SGPropertyNode::removeChild (const char vector<SGPropertyNode_ptr>::iterator it = _children.begin(); it += pos; SGPropertyNode_ptr node = _children[pos]; + node->clear(); _children.erase(it); if (keep) { _removedChildren.push_back(node); Index: props.hxx =================================================================== RCS file: /var/cvs/SimGear-0.3/SimGear/simgear/props/props.hxx,v retrieving revision 1.6 diff -u -p -r1.6 props.hxx --- props.hxx 23 Dec 2004 13:32:01 -0000 1.6 +++ props.hxx 9 May 2005 12:08:56 -0000 @@ -1172,6 +1172,12 @@ public: void fireChildRemoved (SGPropertyNode * child); + /** + * Clear node, so that a new type can get assigned. + */ + void clear () { if (!_tied) { clear_value(); _type = NONE; } } + + protected: void fireValueChanged (SGPropertyNode * node); Index: props_io.cxx =================================================================== RCS file: /var/cvs/SimGear-0.3/SimGear/simgear/props/props_io.cxx,v retrieving revision 1.7 diff -u -p -r1.7 props_io.cxx --- props_io.cxx 23 Dec 2004 13:32:01 -0000 1.7 +++ props_io.cxx 9 May 2005 12:08:56 -0000 @@ -173,6 +173,7 @@ PropsVisitor::startElement (const char * // Got the index, so grab the node. SGPropertyNode * node = st.node->getChild(name, index, true); + node->clear(); // Get the access-mode attributes, // but don't set yet (in case they
_______________________________________________ Flightgear-devel mailing list Flightgear-devel@flightgear.org http://mail.flightgear.org/mailman/listinfo/flightgear-devel 2f585eeea02e2c79d7b1d8c4963bae2d