X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Ffg_props.hxx;h=ef6ed69d906430a274ac073ee26afc0c5ece7179;hb=18d1593c42c2df60d7fb44ace722ca3e8a7fd82c;hp=e53cc3bf46c5fdfb7bec42ac49a181b0abc46d8a;hpb=d0eaafb1e1c1260a4a2549d63d439dc9407162da;p=flightgear.git diff --git a/src/Main/fg_props.hxx b/src/Main/fg_props.hxx index e53cc3bf4..ef6ed69d9 100644 --- a/src/Main/fg_props.hxx +++ b/src/Main/fg_props.hxx @@ -6,36 +6,27 @@ #ifndef __FG_PROPS_HXX #define __FG_PROPS_HXX 1 -#include -#include -#include +#include -#include "globals.hxx" +#include +#include
//////////////////////////////////////////////////////////////////////// // Property management. //////////////////////////////////////////////////////////////////////// +class FGProperties : public SGSubsystem +{ +public: + FGProperties (); + virtual ~FGProperties (); -/** - * Initialize the default FlightGear properties. - * - * These are mostly properties that haven't been claimed by a - * specific module yet. This function should be invoked once, - * while the program is starting (and after the global property - * tree has been created). - */ -extern void fgInitProps (); // fixme: how are they untied? - - -/** - * Update the default FlightGear properties. - * - * This function should be invoked once in each loop to update all - * of the default properties. - */ -extern void fgUpdateProps (); + void init (); + void bind (); + void unbind (); + void update (double dt); +}; /** @@ -49,7 +40,7 @@ extern void fgUpdateProps (); * just the ones flagged as archivable. * @return true if the flight was saved successfully. */ -extern bool fgSaveFlight (ostream &output, bool write_all = false); +extern bool fgSaveFlight (std::ostream &output, bool write_all = false); /** @@ -61,7 +52,22 @@ extern bool fgSaveFlight (ostream &output, bool write_all = false); * @param input The input stream to read the XML from. * @return true if the flight was restored successfully. */ -extern bool fgLoadFlight (istream &input); +extern bool fgLoadFlight (std::istream &input); + + +/** + * Load properties from a file. + * + * @param file The relative or absolute filename. + * @param props The property node to load the properties into. + * @param in_fg_root If true, look for the file relative to + * $FG_ROOT; otherwise, look for the file relative to the + * current working directory. + * @return true if the properties loaded successfully, false + * otherwise. + */ +extern bool fgLoadProps (const char * path, SGPropertyNode * props, + bool in_fg_root = true, int default_mode = 0); @@ -69,7 +75,6 @@ extern bool fgLoadFlight (istream &input); // Convenience functions for getting property values. //////////////////////////////////////////////////////////////////////// - /** * Get a property node. * @@ -77,11 +82,7 @@ extern bool fgLoadFlight (istream &input); * @param create true to create the node if it doesn't exist. * @return The node, or 0 if none exists and none was created. */ -inline SGPropertyNode * -fgGetNode (const string &path, bool create = false) -{ - return globals->get_props()->getNode(path, create); -} +extern SGPropertyNode * fgGetNode (const char * path, bool create = false); /** @@ -98,11 +99,8 @@ fgGetNode (const string &path, bool create = false) * @param create true to create the node if it doesn't exist. * @return The node, or 0 if none exists and none was created. */ -inline SGPropertyNode * -fgGetNode (const string &path, int index, bool create = false) -{ - return globals->get_props()->getNode(path, index, create); -} +extern SGPropertyNode * fgGetNode (const char * path, + int index, bool create = false); /** @@ -111,11 +109,31 @@ fgGetNode (const string &path, int index, bool create = false) * @param path The path of the node, relative to root. * @return true if the node exists, false otherwise. */ -inline bool -fgHasNode (const string &path) -{ - return (fgGetNode(path, false) != 0); -} +extern bool fgHasNode (const char * path); + + +/** + * Add a listener to a node. + * + * @param listener The listener to add to the node. + * @param path The path of the node, relative to root. + * @param index The index for the last member of the path (overrides + * any given in the string). + */ +extern void fgAddChangeListener (SGPropertyChangeListener * listener, + const char * path); + + +/** + * Add a listener to a node. + * + * @param listener The listener to add to the node. + * @param path The path of the node, relative to root. + * @param index The index for the last member of the path (overrides + * any given in the string). + */ +extern void fgAddChangeListener (SGPropertyChangeListener * listener, + const char * path, int index); /** @@ -132,10 +150,7 @@ fgHasNode (const string &path) * does not exist. * @return The property's value as a bool, or the default value provided. */ -inline bool fgGetBool (const string &name, bool defaultValue = false) -{ - return globals->get_props()->getBoolValue(name, defaultValue); -} +extern bool fgGetBool (const char * name, bool defaultValue = false); /** @@ -152,10 +167,7 @@ inline bool fgGetBool (const string &name, bool defaultValue = false) * does not exist. * @return The property's value as an int, or the default value provided. */ -inline int fgGetInt (const string &name, int defaultValue = 0) -{ - return globals->get_props()->getIntValue(name, defaultValue); -} +extern int fgGetInt (const char * name, int defaultValue = 0); /** @@ -172,10 +184,7 @@ inline int fgGetInt (const string &name, int defaultValue = 0) * does not exist. * @return The property's value as a long, or the default value provided. */ -inline int fgGetLong (const string &name, long defaultValue = 0L) -{ - return globals->get_props()->getLongValue(name, defaultValue); -} +extern int fgGetLong (const char * name, long defaultValue = 0L); /** @@ -192,10 +201,7 @@ inline int fgGetLong (const string &name, long defaultValue = 0L) * does not exist. * @return The property's value as a float, or the default value provided. */ -inline float fgGetFloat (const string &name, float defaultValue = 0.0) -{ - return globals->get_props()->getFloatValue(name, defaultValue); -} +extern float fgGetFloat (const char * name, float defaultValue = 0.0); /** @@ -212,10 +218,7 @@ inline float fgGetFloat (const string &name, float defaultValue = 0.0) * does not exist. * @return The property's value as a double, or the default value provided. */ -inline double fgGetDouble (const string &name, double defaultValue = 0.0) -{ - return globals->get_props()->getDoubleValue(name, defaultValue); -} +extern double fgGetDouble (const char * name, double defaultValue = 0.0); /** @@ -232,10 +235,8 @@ inline double fgGetDouble (const string &name, double defaultValue = 0.0) * does not exist. * @return The property's value as a string, or the default value provided. */ -inline string fgGetString (const string &name, string defaultValue = "") -{ - return globals->get_props()->getStringValue(name, defaultValue); -} +extern const char * fgGetString (const char * name, + const char * defaultValue = ""); /** @@ -251,10 +252,7 @@ inline string fgGetString (const string &name, string defaultValue = "") * @param val The new value for the property. * @return true if the assignment succeeded, false otherwise. */ -inline bool fgSetBool (const string &name, bool val) -{ - return globals->get_props()->setBoolValue(name, val); -} +extern bool fgSetBool (const char * name, bool val); /** @@ -270,10 +268,7 @@ inline bool fgSetBool (const string &name, bool val) * @param val The new value for the property. * @return true if the assignment succeeded, false otherwise. */ -inline bool fgSetInt (const string &name, int val) -{ - return globals->get_props()->setIntValue(name, val); -} +extern bool fgSetInt (const char * name, int val); /** @@ -289,10 +284,7 @@ inline bool fgSetInt (const string &name, int val) * @param val The new value for the property. * @return true if the assignment succeeded, false otherwise. */ -inline bool fgSetLong (const string &name, long val) -{ - return globals->get_props()->setLongValue(name, val); -} +extern bool fgSetLong (const char * name, long val); /** @@ -308,10 +300,7 @@ inline bool fgSetLong (const string &name, long val) * @param val The new value for the property. * @return true if the assignment succeeded, false otherwise. */ -inline bool fgSetFloat (const string &name, float val) -{ - return globals->get_props()->setFloatValue(name, val); -} +extern bool fgSetFloat (const char * name, float val); /** @@ -327,10 +316,7 @@ inline bool fgSetFloat (const string &name, float val) * @param val The new value for the property. * @return true if the assignment succeeded, false otherwise. */ -inline bool fgSetDouble (const string &name, double val) -{ - return globals->get_props()->setDoubleValue(name, val); -} +extern bool fgSetDouble (const char * name, double val); /** @@ -346,10 +332,7 @@ inline bool fgSetDouble (const string &name, double val) * @param val The new value for the property. * @return true if the assignment succeeded, false otherwise. */ -inline bool fgSetString (const string &name, const string &val) -{ - return globals->get_props()->setStringValue(name, val); -} +extern bool fgSetString (const char * name, const char * val); @@ -370,17 +353,7 @@ inline bool fgSetString (const string &name, const string &val) * @param name The property name. * @param state The state of the archive attribute (defaults to true). */ -inline void -fgSetArchivable (const string &name, bool state = true) -{ - SGPropertyNode * node = globals->get_props()->getNode(name); - if (node == 0) - SG_LOG(SG_GENERAL, SG_ALERT, - "Attempt to set archive flag for non-existant property " - << name); - else - node->setAttribute(SGPropertyNode::ARCHIVE, state); -} +extern void fgSetArchivable (const char * name, bool state = true); /** @@ -395,17 +368,7 @@ fgSetArchivable (const string &name, bool state = true) * @param name The property name. * @param state The state of the read attribute (defaults to true). */ -inline void -fgSetReadable (const string &name, bool state = true) -{ - SGPropertyNode * node = globals->get_props()->getNode(name); - if (node == 0) - SG_LOG(SG_GENERAL, SG_ALERT, - "Attempt to set read flag for non-existant property " - << name); - else - node->setAttribute(SGPropertyNode::READ, state); -} +extern void fgSetReadable (const char * name, bool state = true); /** @@ -420,17 +383,7 @@ fgSetReadable (const string &name, bool state = true) * @param name The property name. * @param state The state of the write attribute (defaults to true). */ -inline void -fgSetWritable (const string &name, bool state = true) -{ - SGPropertyNode * node = globals->get_props()->getNode(name); - if (node == 0) - SG_LOG(SG_GENERAL, SG_ALERT, - "Attempt to set write flag for non-existant property " - << name); - else - node->setAttribute(SGPropertyNode::WRITE, state); -} +extern void fgSetWritable (const char * name, bool state = true); @@ -445,12 +398,7 @@ fgSetWritable (const string &name, bool state = true) * Classes should use this function to release control of any * properties they are managing. */ -inline void -fgUntie (const string &name) -{ - if (!globals->get_props()->untie(name)) - SG_LOG(SG_GENERAL, SG_WARN, "Failed to untie property " << name); -} +extern void fgUntie (const char * name); /** @@ -471,7 +419,7 @@ fgUntie (const string &name) */ template inline void -fgTie (const string &name, V (*getter)(), void (*setter)(V) = 0, +fgTie (const char * name, V (*getter)(), void (*setter)(V) = 0, bool useDefault = true) { if (!globals->get_props()->tie(name, SGRawValueFunctions(getter, setter), @@ -501,7 +449,7 @@ fgTie (const string &name, V (*getter)(), void (*setter)(V) = 0, */ template inline void -fgTie (const string &name, int index, V (*getter)(int), +fgTie (const char * name, int index, V (*getter)(int), void (*setter)(int, V) = 0, bool useDefault = true) { if (!globals->get_props()->tie(name, @@ -535,7 +483,7 @@ fgTie (const string &name, int index, V (*getter)(int), */ template inline void -fgTie (const string &name, T * obj, V (T::*getter)() const, +fgTie (const char * name, T * obj, V (T::*getter)() const, void (T::*setter)(V) = 0, bool useDefault = true) { if (!globals->get_props()->tie(name, @@ -567,7 +515,7 @@ fgTie (const string &name, T * obj, V (T::*getter)() const, */ template inline void -fgTie (const string &name, T * obj, int index, +fgTie (const char * name, T * obj, int index, V (T::*getter)(int) const, void (T::*setter)(int, V) = 0, bool useDefault = true) { @@ -582,162 +530,18 @@ fgTie (const string &name, T * obj, int index, } - -//////////////////////////////////////////////////////////////////////// -// Conditions. -//////////////////////////////////////////////////////////////////////// - - -/** - * An encoded condition. - * - * This class encodes a single condition of some sort, possibly - * connected with properties. - * - * This class should migrate to somewhere more general. - */ -class FGCondition -{ +class FGMakeUpperCase : public SGPropertyChangeListener { public: - FGCondition (); - virtual ~FGCondition (); - virtual bool test () const = 0; + void valueChanged(SGPropertyNode *node) { + if (node->getType() != SGPropertyNode::STRING) + return; + + char *s = const_cast(node->getStringValue()); + for (; *s; s++) + *s = toupper(*s); + } }; -/** - * Condition for a single property. - * - * This condition is true only if the property returns a boolean - * true value. - */ -class FGPropertyCondition : public FGCondition -{ -public: - FGPropertyCondition (const string &propname); - virtual ~FGPropertyCondition (); - virtual bool test () const { return _node->getBoolValue(); } -private: - const SGPropertyNode * _node; -}; - - -/** - * Condition for a 'not' operator. - * - * This condition is true only if the child condition is false. - */ -class FGNotCondition : public FGCondition -{ -public: - // transfer pointer ownership - FGNotCondition (FGCondition * condition); - virtual ~FGNotCondition (); - virtual bool test () const; -private: - FGCondition * _condition; -}; - - -/** - * Condition for an 'and' group. - * - * This condition is true only if all of the conditions - * in the group are true. - */ -class FGAndCondition : public FGCondition -{ -public: - FGAndCondition (); - virtual ~FGAndCondition (); - virtual bool test () const; - // transfer pointer ownership - virtual void addCondition (FGCondition * condition); -private: - vector _conditions; -}; - - -/** - * Condition for an 'or' group. - * - * This condition is true if at least one of the conditions in the - * group is true. - */ -class FGOrCondition : public FGCondition -{ -public: - FGOrCondition (); - virtual ~FGOrCondition (); - virtual bool test () const; - // transfer pointer ownership - virtual void addCondition (FGCondition * condition); -private: - vector _conditions; -}; - - -/** - * Abstract base class for property comparison conditions. - */ -class FGComparisonCondition : public FGCondition -{ -public: - enum Type { - LESS_THAN, - GREATER_THAN, - EQUALS - }; - FGComparisonCondition (Type type, bool reverse = false); - virtual ~FGComparisonCondition (); - virtual bool test () const; - virtual void setLeftProperty (const string &propname); - virtual void setRightProperty (const string &propname); - // will make a local copy - virtual void setRightValue (const SGPropertyNode * value); -private: - Type _type; - bool _reverse; - const SGPropertyNode * _left_property; - const SGPropertyNode * _right_property; - const SGPropertyNode * _right_value; -}; - - -/** - * Base class for a conditional components. - * - * This class manages the conditions and tests; the component should - * invoke the test() method whenever it needs to decide whether to - * active itself, draw itself, and so on. - */ -class FGConditional -{ -public: - FGConditional (); - virtual ~FGConditional (); - // transfer pointer ownership - virtual void setCondition (FGCondition * condition); - virtual const FGCondition * getCondition () const { return _condition; } - virtual bool test () const; -private: - FGCondition * _condition; -}; - - -/** - * Global function to make a condition out of properties. - * - * The top-level is always an implicit 'and' group, whatever the - * node's name (it should usually be "condition"). - * - * @param node The top-level condition node (usually named "condition"). - * @return A pointer to a newly-allocated condition; it is the - * responsibility of the caller to delete the condition when - * it is no longer needed. - */ -FGCondition * fgReadCondition (const SGPropertyNode * node); - - #endif // __FG_PROPS_HXX