X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fpanel.hxx;h=9c110d0722d7a8e898782f76aec23a840b7f7e2a;hb=4bfd1722df24f5be89459b25010e5d7352720a7b;hp=7b68b6d40a0c5e7cb5bb930721bb82a5759395f1;hpb=d13b46b8f1efc36057c98fd396c306cbfd7a3612;p=flightgear.git diff --git a/src/Cockpit/panel.hxx b/src/Cockpit/panel.hxx index 7b68b6d40..9c110d072 100644 --- a/src/Cockpit/panel.hxx +++ b/src/Cockpit/panel.hxx @@ -30,31 +30,31 @@ # include #endif -#include - -#ifdef HAVE_WINDOWS_H +#ifdef HAVE_WINDOWS_H # include #endif -#include -#include +#include +#include +#include +#include #include -#include #include +#include #include #include -#include -#include
#include
- #include +#include SG_USING_STD(vector); SG_USING_STD(map); + +class ssgTexture; class FGPanelInstrument; @@ -130,7 +130,7 @@ private: * redraw themselves when necessary, and will pass mouse clicks on to * the appropriate instruments for processing. */ -class FGPanel : public FGSubsystem +class FGPanel : public SGSubsystem { public: @@ -141,9 +141,12 @@ public: virtual void init (); virtual void bind (); virtual void unbind (); - virtual void update (int dt); + virtual void draw (); + virtual void update (double dt); virtual void update (GLfloat winx, GLfloat winw, GLfloat winy, GLfloat winh); + virtual void updateMouseDelay(); + // transfer pointer ownership!!! virtual void addInstrument (FGPanelInstrument * instrument); @@ -167,11 +170,11 @@ public: // X-offset virtual void setXOffset (int offset); - virtual int getXOffset () const { return _x_offset; } + virtual int getXOffset () const { return _x_offset->getIntValue(); } // Y-offset. virtual void setYOffset (int offset); - virtual int getYOffset () const { return _y_offset; } + virtual int getYOffset () const { return _y_offset->getIntValue(); } // View height. virtual void setViewHeight (int height) { _view_height = height; } @@ -179,9 +182,14 @@ public: // Handle a mouse click. virtual bool doMouseAction (int button, int updown, int x, int y); + virtual bool doLocalMouseAction(int button, int updown, int x, int y); + + virtual void setDepthTest (bool enable); private: - mutable bool _visibility; + void setupVirtualCockpit(); + void cleanupVirtualCockpit(); + mutable bool _mouseDown; mutable int _mouseButton, _mouseX, _mouseY; mutable int _mouseDelay; @@ -189,11 +197,13 @@ private: typedef vector instrument_list_type; int _width; int _height; - int _x_offset; - int _y_offset; int _view_height; - bool _bound; - float _jitter; + + SGPropertyNode * _visibility; + SGPropertyNode * _x_offset; + SGPropertyNode * _y_offset; + SGPropertyNode * _jitter; + SGPropertyNode * _flipx; const SGPropertyNode * _xsize_node; const SGPropertyNode * _ysize_node; @@ -202,6 +212,7 @@ private: ssgTexture * _mbg[8]; // List of instruments in panel. instrument_list_type _instruments; + bool _enable_depth_test; }; @@ -218,11 +229,11 @@ private: * or joystick, but they are tied to specific mouse actions in * rectangular areas of the panel. */ -class FGPanelAction : public FGConditional +class FGPanelAction : public SGConditional { public: FGPanelAction (); - FGPanelAction (int button, int x, int y, int w, int h); + FGPanelAction (int button, int x, int y, int w, int h, bool repeatable); virtual ~FGPanelAction (); // Getters. @@ -235,7 +246,7 @@ public: // Setters. // transfer pointer ownership - virtual void addBinding (FGBinding * binding); + virtual void addBinding (FGBinding * binding, int updown); virtual void setButton (int button) { _button = button; } virtual void setX (int x) { _x = x; } virtual void setY (int y) { _y = y; } @@ -253,7 +264,7 @@ public: } // Perform the action. - virtual void doAction (); + virtual bool doAction (int updown); private: typedef vector binding_list_t; @@ -263,7 +274,9 @@ private: int _y; int _w; int _h; - binding_list_t _bindings; + bool _repeatable; + int _last_state; + binding_list_t _bindings[2]; }; @@ -276,7 +289,7 @@ private: /** * A transformation for a layer. */ -class FGPanelTransformation : public FGConditional +class FGPanelTransformation : public SGConditional { public: @@ -293,6 +306,8 @@ public: const SGPropertyNode * node; float min; float max; + bool has_mod; + float mod; float factor; float offset; SGInterpTable * table; @@ -313,7 +328,7 @@ public: * on current FGFS instrument readings: for example, a texture * representing a needle can rotate to show the airspeed. */ -class FGInstrumentLayer : public FGConditional +class FGInstrumentLayer : public SGConditional { public: @@ -355,7 +370,7 @@ protected: * may show up in the future (some complex instruments could be * entirely hand-coded, for example). */ -class FGPanelInstrument : public FGConditional +class FGPanelInstrument : public SGConditional { public: FGPanelInstrument (); @@ -363,6 +378,7 @@ public: virtual ~FGPanelInstrument (); virtual void draw () = 0; + virtual void drawHotspots(); virtual void setPosition(int x, int y); virtual void setSize(int w, int h); @@ -377,7 +393,7 @@ public: virtual void addAction (FGPanelAction * action); // Coordinates relative to centre. - virtual bool doMouseAction (int button, int x, int y); + virtual bool doMouseAction (int button, int updown, int x, int y); protected: int _x, _y, _w, _h; @@ -402,7 +418,7 @@ public: // Transfer pointer ownership!! virtual int addLayer (FGInstrumentLayer *layer); - virtual int addLayer (FGCroppedTexture &texture, int w = -1, int h = -1); + virtual int addLayer (const FGCroppedTexture &texture, int w = -1, int h = -1); // Transfer pointer ownership!! virtual void addTransformation (FGPanelTransformation * transformation); @@ -413,6 +429,28 @@ protected: }; +/** + * An empty-shell instrument that exists soley in + * order to redirect commands from the panel to a + * complex instrument inherited from SGSubsystem. + * + * Currently the only complex instrument is the KLN89, + * which we've hardwired this to for now. + */ +class FGSpecialInstrument : public FGPanelInstrument +{ +public: + FGSpecialInstrument(DCLGPS* sb); + //FGSpecialInstrument (int x, int y, int w, int h); + virtual ~FGSpecialInstrument (); + + virtual void draw (); + +protected: + DCLGPS* complex; +}; + + /** * An instrument layer containing a group of sublayers. * @@ -428,7 +466,7 @@ public: virtual void draw (); // transfer pointer ownership virtual void addLayer (FGInstrumentLayer * layer); -private: +protected: vector _layers; }; @@ -452,11 +490,11 @@ public: virtual void setTexture (const FGCroppedTexture &texture) { _texture = texture; } - virtual FGCroppedTexture &getTexture () { return _texture; } virtual const FGCroppedTexture &getTexture () const { return _texture; } + virtual FGCroppedTexture *getTexture() { return &_texture; } private: - mutable FGCroppedTexture _texture; + FGCroppedTexture _texture; }; @@ -470,18 +508,19 @@ private: class FGTextLayer : public FGInstrumentLayer { public: - typedef enum ChunkType { + enum ChunkType { TEXT, TEXT_VALUE, DOUBLE_VALUE }; - class Chunk : public FGConditional + class Chunk : public SGConditional { public: Chunk (const string &text, const string &fmt = "%s"); Chunk (ChunkType type, const SGPropertyNode * node, - const string &fmt = "", float mult = 1.0); + const string &fmt = "", float mult = 1.0, float offs = 0.0, + bool truncation = false); const char * getValue () const; private: @@ -490,6 +529,8 @@ public: const SGPropertyNode * _node; string _fmt; float _mult; + float _offs; + bool _trunc; mutable char _buf[1024]; }; @@ -502,6 +543,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: @@ -513,7 +555,7 @@ private: float _color[4]; float _pointSize; - + mutable string _font_name; mutable string _value; mutable SGTimeStamp _then; mutable SGTimeStamp _now; @@ -521,25 +563,18 @@ private: /** - * A layer that switches between two other layers. + * A group layer that switches among its children. * - * The usefulness of this layer is questionable now that all layers - * can have conditions, and it may be deprecated soon. + * The first layer that passes its condition will be drawn, and + * any following layers will be ignored. */ -class FGSwitchLayer : public FGInstrumentLayer +class FGSwitchLayer : public FGGroupLayer { public: // Transfer pointers!! - FGSwitchLayer (int w, int h, const SGPropertyNode * node, - FGInstrumentLayer * layer1, - FGInstrumentLayer * layer2); - virtual ~FGSwitchLayer (); - + FGSwitchLayer (); virtual void draw (); -private: - const SGPropertyNode * _node; - FGInstrumentLayer * _layer1, * _layer2; }; @@ -555,14 +590,6 @@ private: bool fgPanelVisible (); - -//////////////////////////////////////////////////////////////////////// -// The current panel, if any. -//////////////////////////////////////////////////////////////////////// - -extern FGPanel * current_panel; // TODO: move to globals - - #endif // __PANEL_HXX