X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fpanel.hxx;h=1adc9e811569859c14e7cdf5e909cea6bfed5f24;hb=29275ce1ecf9c4ea302aacca8c5ae5d4d3319a17;hp=db242d9fa88e487a0263fc5569b223b39dfe9380;hpb=9dc5c9ca226cdb0c370e2a06e425522ab23b98b6;p=flightgear.git diff --git a/src/Cockpit/panel.hxx b/src/Cockpit/panel.hxx index db242d9fa..1adc9e811 100644 --- a/src/Cockpit/panel.hxx +++ b/src/Cockpit/panel.hxx @@ -1,4 +1,4 @@ -// panel.hxx - default, 2D single-engine prop instrument panel +// panel.hxx - generic support classes for a 2D panel. // // Written by David Megginson, started January 2000. // @@ -30,6 +30,8 @@ # include #endif +#include + #ifdef HAVE_WINDOWS_H # include #endif @@ -37,10 +39,16 @@ #include #include +#include +#include + #include #include #include +#include
+ + FG_USING_STD(vector); FG_USING_STD(map); @@ -57,11 +65,52 @@ class FGPanelInstrument; class FGTextureManager { public: - static ssgTexture * createTexture(const char * relativePath); + static ssgTexture * createTexture(const string &relativePath); +private: + static map _textureMap; +}; + + + +//////////////////////////////////////////////////////////////////////// +// Cropped texture (should migrate out into FGFS). +// +// This structure wraps an SSG texture with cropping information. +//////////////////////////////////////////////////////////////////////// + +class FGCroppedTexture +{ +public: + + FGCroppedTexture (); + FGCroppedTexture (const string &path, + float _minX = 0.0, float _minY = 0.0, + float _maxX = 1.0, float _maxY = 1.0); + virtual ~FGCroppedTexture (); + + virtual void setPath (const string &path) { _path = path; } + + virtual const string &getPath () const { return _path; } + + virtual ssgTexture * getTexture (); + + virtual void setCrop (float minX, float minY, float maxX, float maxY) { + _minX = minX; _minY = minY; _maxX = maxX; _maxY = maxY; + } + + virtual float getMinX () const { return _minX; } + virtual float getMinY () const { return _minY; } + virtual float getMaxX () const { return _maxX; } + virtual float getMaxY () const { return _maxY; } + + private: - static map_textureMap; + string _path; + ssgTexture * _texture; + float _minX, _minY, _maxX, _maxY; }; + //////////////////////////////////////////////////////////////////////// // Instrument panel class. @@ -72,19 +121,22 @@ private: // the appropriate instruments for processing. //////////////////////////////////////////////////////////////////////// -class FGPanel +class FGPanel : public FGSubsystem { public: - FGPanel (int x, int y, int w, int h); + FGPanel (int window_x, int window_y, int window_w, int window_h); virtual ~FGPanel (); + // Update the panel (every frame). + virtual void init (); + virtual void bind (); + virtual void unbind (); + virtual void update (); + // transfer pointer ownership!!! virtual void addInstrument (FGPanelInstrument * instrument); - // Update the panel (every frame). - virtual void update () const; - // Background texture. virtual void setBackground (ssgTexture * texture); @@ -92,18 +144,43 @@ public: virtual bool getVisibility () const; virtual void setVisibility (bool visibility); + // Full width of panel. + virtual void setWidth (int width) { _width = width; } + virtual int getWidth () const { return _width; } + + // Full height of panel. + virtual void setHeight (int height) { _height = height; } + virtual int getHeight () const { return _height; } + + // X-offset + virtual void setXOffset (int offset); + virtual int getXOffset () const { return _x_offset; } + + // Y-offset. + virtual void setYOffset (int offset); + virtual int getYOffset () const { return _y_offset; } + + // View height. + virtual void setViewHeight (int height) { _view_height = height; } + virtual int getViewHeight () const { return _view_height; } + // Handle a mouse click. virtual bool doMouseAction (int button, int updown, int x, int y); private: - bool _visibility; - bool _mouseDown; - int _mouseButton, _mouseX, _mouseY; + mutable bool _visibility; + mutable bool _mouseDown; + mutable int _mouseButton, _mouseX, _mouseY; mutable int _mouseDelay; - FGPanelInstrument * _mouseInstrument; + mutable FGPanelInstrument * _mouseInstrument; typedef vector instrument_list_type; - int _x, _y, _w, _h; - int _panel_h; + int _winx, _winy, _winw, _winh; + int _width; + int _height; + int _x_offset; + int _y_offset; + int _view_height; + ssgTexture * _bg; // List of instruments in panel. instrument_list_type _instruments; @@ -115,14 +192,50 @@ private: // Base class for user action types. // // Individual instruments can have actions associated with a mouse -// click in a rectangular area. Current concrete classes are -// FGAdjustAction and FGSwapAction. +// click in a rectangular area. Current concrete classes include +// FGAdjustAction, FGSwapAction, and FGToggleAction. //////////////////////////////////////////////////////////////////////// class FGPanelAction { public: + FGPanelAction (); + FGPanelAction (int button, int x, int y, int w, int h); + virtual ~FGPanelAction (); + + // Getters. + virtual int getButton () const { return _button; } + virtual int getX () const { return _x; } + virtual int getY () const { return _y; } + virtual int getWidth () const { return _w; } + virtual int getHeight () const { return _h; } + + // Setters. + virtual void setButton (int button) { _button = button; } + virtual void setX (int x) { _x = x; } + virtual void setY (int y) { _y = y; } + virtual void setWidth (int w) { _w = w; } + virtual void setHeight (int h) { _h = h; } + + // Check whether we're in the area. + virtual bool inArea (int button, int x, int y) + { + return (button == _button && + x >= _x && + x < _x + _w && + y >= _y && + y < _y + _h); + } + + // Perform the action. virtual void doAction () = 0; + +private: + int _button; + int _x; + int _y; + int _w; + int _h; }; @@ -139,17 +252,14 @@ public: class FGAdjustAction : public FGPanelAction { public: - typedef double (*getter_type)(); - typedef void (*setter_type)(double); - - FGAdjustAction (getter_type getter, setter_type setter, float increment, + 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: - getter_type _getter; - setter_type _setter; + SGValue * _value; float _increment; float _min; float _max; @@ -168,17 +278,14 @@ private: class FGSwapAction : public FGPanelAction { public: - typedef double (*getter_type)(); - typedef void (*setter_type)(double); - - FGSwapAction (getter_type getter1, setter_type setter1, - getter_type getter2, setter_type setter2); + FGSwapAction (int button, int x, int y, int w, int h, + SGValue * value1, SGValue * value2); virtual ~FGSwapAction (); virtual void doAction (); private: - getter_type _getter1, _getter2; - setter_type _setter1, _setter2; + SGValue * _value1; + SGValue * _value2; }; @@ -192,16 +299,13 @@ private: class FGToggleAction : public FGPanelAction { public: - typedef bool (*getter_type)(); - typedef void (*setter_type)(bool); - - FGToggleAction (getter_type getter, setter_type setter); + FGToggleAction (int button, int x, int y, int w, int h, + SGValue * value); virtual ~FGToggleAction (); virtual void doAction (); private: - getter_type _getter; - setter_type _setter; + SGValue * _value; }; @@ -223,7 +327,7 @@ public: FGPanelInstrument (int x, int y, int w, int h); virtual ~FGPanelInstrument (); - virtual void draw () const = 0; + virtual void draw () = 0; virtual void setPosition(int x, int y); virtual void setSize(int w, int h); @@ -235,23 +339,14 @@ public: // Coordinates relative to centre. // Transfer pointer ownership!! - virtual void addAction (int button, int x, int y, int w, int h, - FGPanelAction * action); + 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 struct { - int button; - int x; - int y; - int w; - int h; - FGPanelAction * action; - } inst_action; - typedef vector action_list_type; + typedef vector action_list_type; action_list_type _actions; }; @@ -266,6 +361,32 @@ protected: // rotate to show the altitude or airspeed. //////////////////////////////////////////////////////////////////////// + +/** + * A transformation for a layer. + */ +class FGPanelTransformation { +public: + + enum Type { + XSHIFT, + YSHIFT, + ROTATION + }; + + FGPanelTransformation (); + virtual ~FGPanelTransformation (); + + Type type; + const SGValue * value; + float min; + float max; + float factor; + float offset; +}; + + + /** * A single layer of a multi-layered instrument. * @@ -276,38 +397,26 @@ protected: class FGInstrumentLayer { public: - typedef enum { - XSHIFT, - YSHIFT, - ROTATION - } transform_type; - - typedef double (*transform_func)(); - - FGInstrumentLayer (); - FGInstrumentLayer (int w, int h); + FGInstrumentLayer (int w = -1, int h = -1); virtual ~FGInstrumentLayer (); - virtual void draw () const = 0; + virtual void draw () = 0; virtual void transform () const; - virtual void addTransformation (transform_type type, transform_func func, - float min, float max, - float factor = 1.0, float offset = 0.0); + virtual int getWidth () const { return _w; } + virtual int getHeight () const { return _h; } + virtual void setWidth (int w) { _w = w; } + virtual void setHeight (int h) { _h = h; } + + // Transfer pointer ownership!! + // DEPRECATED + virtual void addTransformation (FGPanelTransformation * transformation); protected: int _w, _h; - typedef struct { - transform_type type; - transform_func func; - float min; - float max; - float factor; - float offset; - } transformation; - typedef vector transformation_list; + typedef vector transformation_list; transformation_list _transformations; }; @@ -333,26 +442,20 @@ protected: class FGLayeredInstrument : public FGPanelInstrument { public: - typedef vector layer_list; FGLayeredInstrument (int x, int y, int w, int h); virtual ~FGLayeredInstrument (); - virtual void draw () const; + virtual void draw (); // Transfer pointer ownership!! virtual int addLayer (FGInstrumentLayer *layer); - virtual int addLayer (ssgTexture * texture, - int w = -1, int h = -1, - float texX1 = 0.0, float texY1 = 0.0, - float texX2 = 1.0, float texY2 = 1.0); - virtual void addTransformation (FGInstrumentLayer::transform_type type, - FGInstrumentLayer::transform_func func, - float min, float max, - float factor = 1.0, float offset = 0.0); - virtual void addTransformation (FGInstrumentLayer::transform_type type, - float offset); + virtual int addLayer (FGCroppedTexture &texture, int w = -1, int h = -1); + + // Transfer pointer ownership!! + virtual void addTransformation (FGPanelTransformation * transformation); protected: + typedef vector layer_list; layer_list _layers; }; @@ -369,29 +472,20 @@ protected: class FGTexturedLayer : public FGInstrumentLayer { public: - FGTexturedLayer (ssgTexture * texture, int w, int h, - float texX1 = 0.0, float texY1 = 0.0, - float texX2 = 1.0, float texY2 = 1.0); + FGTexturedLayer (int w = -1, int h = -1) : FGInstrumentLayer(w, h) {} + FGTexturedLayer (const FGCroppedTexture &texture, int w = -1, int h = -1); virtual ~FGTexturedLayer (); - virtual void draw () const; + virtual void draw (); - virtual void setTexture (ssgTexture * texture) { _texture = texture; } - virtual void setTextureCoords (float x1, float y1, float x2, float y2) { - _texX1 = x1; _texY1 = y1; _texX2 = x2; _texY2 = y2; + virtual void setTexture (const FGCroppedTexture &texture) { + _texture = texture; } - -protected: - - virtual void setTextureCoords (float x1, float y1, - float x2, float y2) const { - _texX1 = x1; _texY1 = y1; _texX2 = x2; _texY2 = y2; - } - + virtual FGCroppedTexture &getTexture () { return _texture; } + virtual const FGCroppedTexture &getTexture () const { return _texture; } private: - ssgTexture * _texture; - mutable float _texX1, _texY1, _texX2, _texY2; + mutable FGCroppedTexture _texture; }; @@ -407,37 +501,32 @@ private: class FGTextLayer : public FGInstrumentLayer { public: - typedef char * (*text_func)(); - typedef double (*double_func)(); typedef enum ChunkType { TEXT, - TEXT_FUNC, - DOUBLE_FUNC + TEXT_VALUE, + DOUBLE_VALUE }; class Chunk { public: - Chunk (char * text, char * fmt = "%s"); - Chunk (text_func func, char * fmt = "%s"); - Chunk (double_func func, char * fmt = "%.2f", float mult = 1.0); + Chunk (const string &text, const string &fmt = "%s"); + Chunk (ChunkType type, const SGValue * value, + const string &fmt = "", float mult = 1.0); - char * getValue () const; + const char * getValue () const; private: ChunkType _type; - union { - char * _text; - text_func _tfunc; - double_func _dfunc; - } _value; - char * _fmt; + string _text; + const SGValue * _value; + string _fmt; float _mult; mutable char _buf[1024]; }; - FGTextLayer (int w, int h); + FGTextLayer (int w = -1, int h = -1); virtual ~FGTextLayer (); - virtual void draw () const; + virtual void draw (); // Transfer pointer!! virtual void addChunk (Chunk * chunk); @@ -446,11 +535,18 @@ public: virtual void setFont (fntFont * font); private: + + void recalc_value () const; + typedef vector chunk_list; chunk_list _chunks; float _color[4]; - // FIXME: need only one globally - mutable fntRenderer _renderer; + + float _pointSize; + + mutable string _value; + mutable SGTimeStamp _then; + mutable SGTimeStamp _now; }; @@ -462,22 +558,28 @@ private: class FGSwitchLayer : public FGInstrumentLayer { public: - typedef bool (*switch_func)(); - // Transfer pointers!! - FGSwitchLayer (int w, int h, switch_func func, + FGSwitchLayer (int w, int h, const SGValue * value, FGInstrumentLayer * layer1, FGInstrumentLayer * layer2); virtual ~FGSwitchLayer (); - virtual void draw () const; + virtual void draw (); private: - switch_func _func; + const SGValue * _value; FGInstrumentLayer * _layer1, * _layer2; }; + +//////////////////////////////////////////////////////////////////////// +// Functions. +//////////////////////////////////////////////////////////////////////// + +bool fgPanelVisible (); + + //////////////////////////////////////////////////////////////////////// // The current panel, if any.