X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fpanel.hxx;h=bde2930a6d47b957db7af1d46f20e44561f0b732;hb=938d006188e70e891bc04e91610c7b8caaca87b6;hp=d0a3820b9d147f154e023b4eac75748d67550002;hpb=59583890262247d73f48f4f1af21303ea41fda47;p=flightgear.git diff --git a/src/Cockpit/panel.hxx b/src/Cockpit/panel.hxx index d0a3820b9..bde2930a6 100644 --- a/src/Cockpit/panel.hxx +++ b/src/Cockpit/panel.hxx @@ -39,6 +39,7 @@ #include #include +#include #include #include @@ -47,7 +48,9 @@ #include #include
+#include
+#include SG_USING_STD(vector); SG_USING_STD(map); @@ -57,11 +60,15 @@ class FGPanelInstrument; //////////////////////////////////////////////////////////////////////// -// Texture manager (should migrate out into FGFS). -// -// This class ensures that no texture is loaded more than once. +// Texture management. //////////////////////////////////////////////////////////////////////// + +/** + * Texture manager (should migrate out into FGFS). + * + * This class ensures that no texture is loaded more than once. + */ class FGTextureManager { public: @@ -71,13 +78,11 @@ private: }; - -//////////////////////////////////////////////////////////////////////// -// Cropped texture (should migrate out into FGFS). -// -// This structure wraps an SSG texture with cropping information. -//////////////////////////////////////////////////////////////////////// - +/** + * Cropped texture (should migrate out into FGFS). + * + * This structure wraps an SSG texture with cropping information. + */ class FGCroppedTexture { public: @@ -113,26 +118,31 @@ private: //////////////////////////////////////////////////////////////////////// -// Instrument panel class. -// -// The panel is a container that has a background texture and holds -// zero or more instruments. The panel will order the instruments to -// redraw themselves when necessary, and will pass mouse clicks on to -// the appropriate instruments for processing. +// Top-level panel. //////////////////////////////////////////////////////////////////////// + +/** + * Instrument panel class. + * + * The panel is a container that has a background texture and holds + * zero or more instruments. The panel will order the instruments to + * redraw themselves when necessary, and will pass mouse clicks on to + * the appropriate instruments for processing. + */ class FGPanel : public FGSubsystem { public: - FGPanel (int window_x, int window_y, int window_w, int window_h); + FGPanel (); virtual ~FGPanel (); // Update the panel (every frame). virtual void init (); virtual void bind (); virtual void unbind (); - virtual void update (); + virtual void update (int dt); + virtual void update (GLfloat winx, GLfloat winw, GLfloat winy, GLfloat winh); // transfer pointer ownership!!! virtual void addInstrument (FGPanelInstrument * instrument); @@ -140,6 +150,9 @@ public: // Background texture. virtual void setBackground (ssgTexture * texture); + // Background multiple textures. + virtual void setMultiBackground (ssgTexture * texture, int idx); + // Make the panel visible or invisible. virtual bool getVisibility () const; virtual void setVisibility (bool visibility); @@ -168,20 +181,28 @@ public: virtual bool doMouseAction (int button, int updown, int x, int y); private: + void setupVirtualCockpit(); + void cleanupVirtualCockpit(); + mutable bool _visibility; mutable bool _mouseDown; mutable int _mouseButton, _mouseX, _mouseY; mutable int _mouseDelay; mutable FGPanelInstrument * _mouseInstrument; typedef vector instrument_list_type; - int _winx, _winy, _winw, _winh; int _width; int _height; int _x_offset; int _y_offset; int _view_height; + bool _bound; + float _jitter; + + const SGPropertyNode * _xsize_node; + const SGPropertyNode * _ysize_node; ssgTexture * _bg; + ssgTexture * _mbg[8]; // List of instruments in panel. instrument_list_type _instruments; }; @@ -189,14 +210,18 @@ private: //////////////////////////////////////////////////////////////////////// -// Base class for user action types. -// -// Individual instruments can have actions associated with a mouse -// click in a rectangular area. Current concrete classes include -// FGAdjustAction, FGSwapAction, and FGToggleAction. +// Actions //////////////////////////////////////////////////////////////////////// -class FGPanelAction + +/** + * Class for user actions. + * + * The actions are command bindings, like bindings for the keyboard + * or joystick, but they are tied to specific mouse actions in + * rectangular areas of the panel. + */ +class FGPanelAction : public FGConditional { public: FGPanelAction (); @@ -211,6 +236,9 @@ public: virtual int getHeight () const { return _h; } // Setters. + + // transfer pointer ownership + virtual void addBinding (FGBinding * binding); virtual void setButton (int button) { _button = button; } virtual void setX (int x) { _x = x; } virtual void setY (int y) { _y = y; } @@ -228,144 +256,31 @@ public: } // Perform the action. - virtual void doAction () = 0; + virtual void doAction (); private: + typedef vector binding_list_t; + int _button; int _x; int _y; int _w; int _h; + binding_list_t _bindings; }; //////////////////////////////////////////////////////////////////////// -// Adjustment action. -// -// This is an action to increase or decrease an FGFS value by a certain -// increment within a certain range. If the wrap flag is true, the -// value will wrap around if it goes below min or above max; otherwise, -// it will simply stop at min or max. -//////////////////////////////////////////////////////////////////////// - -class FGAdjustAction : public FGPanelAction -{ -public: - FGAdjustAction (int button, int x, int y, int w, int h, - SGValue * value, float increment, - float min, float max, bool wrap=false); - virtual ~FGAdjustAction (); - virtual void doAction (); - -private: - SGValue * _value; - float _increment; - float _min; - float _max; - bool _wrap; -}; - - - -//////////////////////////////////////////////////////////////////////// -// Swap action. -// -// This is an action to swap two values. It's currently used in the -// navigation radios. -//////////////////////////////////////////////////////////////////////// - -class FGSwapAction : public FGPanelAction -{ -public: - FGSwapAction (int button, int x, int y, int w, int h, - SGValue * value1, SGValue * value2); - virtual ~FGSwapAction (); - virtual void doAction (); - -private: - SGValue * _value1; - SGValue * _value2; -}; - - - -//////////////////////////////////////////////////////////////////////// -// Toggle action. -// -// This is an action to toggle a boolean value. -//////////////////////////////////////////////////////////////////////// - -class FGToggleAction : public FGPanelAction -{ -public: - FGToggleAction (int button, int x, int y, int w, int h, - SGValue * value); - virtual ~FGToggleAction (); - virtual void doAction (); - -private: - SGValue * _value; -}; - - - -//////////////////////////////////////////////////////////////////////// -// Abstract base class for a panel instrument. -// -// A panel instrument consists of zero or more actions, associated -// with mouse clicks in rectangular areas. Currently, the only -// concrete class derived from this is FGLayeredInstrument, but others -// may show up in the future (some complex instruments could be -// entirely hand-coded, for example). -//////////////////////////////////////////////////////////////////////// - -class FGPanelInstrument -{ -public: - FGPanelInstrument (); - FGPanelInstrument (int x, int y, int w, int h); - virtual ~FGPanelInstrument (); - - virtual void draw () = 0; - - virtual void setPosition(int x, int y); - virtual void setSize(int w, int h); - - virtual int getXPos () const; - virtual int getYPos () const; - virtual int getWidth () const; - virtual int getHeight () const; - - // Coordinates relative to centre. - // Transfer pointer ownership!! - virtual void addAction (FGPanelAction * action); - - // Coordinates relative to centre. - virtual bool doMouseAction (int button, int x, int y); - -protected: - int _x, _y, _w, _h; - typedef vector action_list_type; - action_list_type _actions; -}; - - - -//////////////////////////////////////////////////////////////////////// -// Abstract base class for an instrument layer. -// -// The FGLayeredInstrument class builds up instruments by using layers -// of textures or text. Each layer can have zero or more -// transformations applied to it: for example, a needle layer can -// rotate to show the altitude or airspeed. +// Transformations. //////////////////////////////////////////////////////////////////////// /** * A transformation for a layer. */ -class FGPanelTransformation { +class FGPanelTransformation : public FGConditional +{ public: enum Type { @@ -378,15 +293,22 @@ public: virtual ~FGPanelTransformation (); Type type; - const SGValue * value; + const SGPropertyNode * node; float min; float max; float factor; float offset; + SGInterpTable * table; }; + +//////////////////////////////////////////////////////////////////////// +// Layers +//////////////////////////////////////////////////////////////////////// + + /** * A single layer of a multi-layered instrument. * @@ -394,7 +316,7 @@ public: * on current FGFS instrument readings: for example, a texture * representing a needle can rotate to show the airspeed. */ -class FGInstrumentLayer +class FGInstrumentLayer : public FGConditional { public: @@ -423,16 +345,50 @@ protected: //////////////////////////////////////////////////////////////////////// -// An instrument composed of layers. -// -// This class represents an instrument which is simply a series of -// layers piled one on top of the other, each one undergoing its own -// set of transformations. For example, one layer can represent -// the instrument's face (which doesn't move), while the next layer -// can represent a needle that rotates depending on an FGFS variable. +// Instruments. //////////////////////////////////////////////////////////////////////// +/** + * Abstract base class for a panel instrument. + * + * A panel instrument consists of zero or more actions, associated + * with mouse clicks in rectangular areas. Currently, the only + * concrete class derived from this is FGLayeredInstrument, but others + * may show up in the future (some complex instruments could be + * entirely hand-coded, for example). + */ +class FGPanelInstrument : public FGConditional +{ +public: + FGPanelInstrument (); + FGPanelInstrument (int x, int y, int w, int h); + virtual ~FGPanelInstrument (); + + virtual void draw () = 0; + + virtual void setPosition(int x, int y); + virtual void setSize(int w, int h); + + virtual int getXPos () const; + virtual int getYPos () const; + virtual int getWidth () const; + virtual int getHeight () const; + + // Coordinates relative to centre. + // Transfer pointer ownership!! + virtual void addAction (FGPanelAction * action); + + // Coordinates relative to centre. + virtual bool doMouseAction (int button, int x, int y); + +protected: + int _x, _y, _w, _h; + typedef vector action_list_type; + action_list_type _actions; +}; + + /** * An instrument constructed of multiple layers. * @@ -460,15 +416,33 @@ protected: }; - -//////////////////////////////////////////////////////////////////////// -// A textured layer of an instrument. -// -// This is a layer holding a single texture. Normally, the texture's -// backgound should be transparent so that lower layers and the panel -// background can show through. -//////////////////////////////////////////////////////////////////////// +/** + * An instrument layer containing a group of sublayers. + * + * This class is useful for gathering together a group of related + * layers, either to hold in an external file or to work under + * the same condition. + */ +class FGGroupLayer : public FGInstrumentLayer +{ +public: + FGGroupLayer (); + virtual ~FGGroupLayer (); + virtual void draw (); + // transfer pointer ownership + virtual void addLayer (FGInstrumentLayer * layer); +private: + vector _layers; +}; + +/** + * A textured layer of an instrument. + * + * This is a layer holding a single texture. Normally, the texture's + * backgound should be transparent so that lower layers and the panel + * background can show through. + */ class FGTexturedLayer : public FGInstrumentLayer { public: @@ -489,15 +463,13 @@ private: }; - -//////////////////////////////////////////////////////////////////////// -// A text layer of an instrument. -// -// This is a layer holding a string of static and/or generated text. -// It is useful for instruments that have text displays, such as -// a chronometer, GPS, or NavCom radio. -//////////////////////////////////////////////////////////////////////// - +/** + * A text layer of an instrument. + * + * This is a layer holding a string of static and/or generated text. + * It is useful for instruments that have text displays, such as + * a chronometer, GPS, or NavCom radio. + */ class FGTextLayer : public FGInstrumentLayer { public: @@ -507,17 +479,18 @@ public: DOUBLE_VALUE }; - class Chunk { + class Chunk : public FGConditional + { public: Chunk (const string &text, const string &fmt = "%s"); - Chunk (ChunkType type, const SGValue * value, + Chunk (ChunkType type, const SGPropertyNode * node, const string &fmt = "", float mult = 1.0); const char * getValue () const; private: ChunkType _type; string _text; - const SGValue * _value; + const SGPropertyNode * _node; string _fmt; float _mult; mutable char _buf[1024]; @@ -532,6 +505,7 @@ public: virtual void addChunk (Chunk * chunk); virtual void setColor (float r, float g, float b); virtual void setPointSize (float size); + virtual void setFontName ( const string &name ); virtual void setFont (fntFont * font); private: @@ -543,23 +517,24 @@ private: float _color[4]; float _pointSize; - + mutable string _font_name; mutable string _value; mutable SGTimeStamp _then; mutable SGTimeStamp _now; }; - -//////////////////////////////////////////////////////////////////////// -// A layer that switches between two other layers. -//////////////////////////////////////////////////////////////////////// - +/** + * A layer that switches between two other layers. + * + * The usefulness of this layer is questionable now that all layers + * can have conditions, and it may be deprecated soon. + */ class FGSwitchLayer : public FGInstrumentLayer { public: // Transfer pointers!! - FGSwitchLayer (int w, int h, const SGValue * value, + FGSwitchLayer (int w, int h, const SGPropertyNode * node, FGInstrumentLayer * layer1, FGInstrumentLayer * layer2); virtual ~FGSwitchLayer (); @@ -567,16 +542,20 @@ public: virtual void draw (); private: - const SGValue * _value; + const SGPropertyNode * _node; FGInstrumentLayer * _layer1, * _layer2; }; + //////////////////////////////////////////////////////////////////////// // Functions. //////////////////////////////////////////////////////////////////////// +/** + * Test whether the panel should be visible. + */ bool fgPanelVisible (); @@ -585,7 +564,7 @@ bool fgPanelVisible (); // The current panel, if any. //////////////////////////////////////////////////////////////////////// -extern FGPanel * current_panel; +extern FGPanel * current_panel; // TODO: move to globals @@ -594,3 +573,4 @@ extern FGPanel * current_panel; // end of panel.hxx +