# include <windows.h>
#endif
-#include <GL/glut.h>
#include <plib/ssg.h>
#include <simgear/math/interpolater.hxx>
-#include <simgear/misc/props.hxx>
+#include <simgear/props/props.hxx>
#include <simgear/timing/timestamp.hxx>
+#include <cmath>
#include <vector>
#include <map>
#include <plib/fnt.h>
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);
// 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; }
// 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);
private:
- mutable bool _visibility;
+ void setupVirtualCockpit();
+ void cleanupVirtualCockpit();
+
mutable bool _mouseDown;
mutable int _mouseButton, _mouseX, _mouseY;
mutable int _mouseDelay;
typedef vector<FGPanelInstrument *> 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;
* 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.
// 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; }
}
// Perform the action.
- virtual void doAction ();
+ virtual bool doAction (int updown);
private:
typedef vector<FGBinding *> binding_list_t;
int _y;
int _w;
int _h;
- binding_list_t _bindings;
+ bool _repeatable;
+ int _last_state;
+ binding_list_t _bindings[2];
};
/**
* A transformation for a layer.
*/
-class FGPanelTransformation : public FGConditional
+class FGPanelTransformation : public SGConditional
{
public:
const SGPropertyNode * node;
float min;
float max;
+ bool has_mod;
+ float mod;
float factor;
float offset;
SGInterpTable * table;
* 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:
* 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 ();
virtual ~FGPanelInstrument ();
virtual void draw () = 0;
+ virtual void drawHotspots();
virtual void setPosition(int x, int y);
virtual void setSize(int w, int h);
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;
virtual void draw ();
// transfer pointer ownership
virtual void addLayer (FGInstrumentLayer * layer);
-private:
+protected:
vector<FGInstrumentLayer *> _layers;
};
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");
/**
- * 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;
};
bool fgPanelVisible ();
-\f
-////////////////////////////////////////////////////////////////////////
-// The current panel, if any.
-////////////////////////////////////////////////////////////////////////
-
-extern FGPanel * current_panel; // TODO: move to globals
-
-
\f
#endif // __PANEL_HXX