1
0
Fork 0

Sep 8, 2000 panel updates from David Megginson.

This commit is contained in:
curt 2000-09-08 20:47:18 +00:00
parent b4b46df9a8
commit a2cd367ab5
5 changed files with 554 additions and 393 deletions

View file

@ -86,12 +86,11 @@ FGPanel::FGPanel (int x, int y, int w, int h)
FGPanel::~FGPanel ()
{
instrument_list_type::iterator current = _instruments.begin();
instrument_list_type::iterator last = _instruments.end();
for ( ; current != last; ++current) {
delete *current;
*current = 0;
for (instrument_list_type::iterator it = _instruments.begin();
it != _instruments.end();
it++) {
delete *it;
*it = 0;
}
}
@ -208,7 +207,6 @@ FGPanel::doMouseAction (int button, int updown, int x, int y)
int iw = inst->getWidth() / 2;
int ih = inst->getHeight() / 2;
if (x >= ix - iw && x < ix + iw && y >= iy - ih && y < iy + ih) {
// cout << "Do mouse action for component " << i << '\n';
_mouseDown = true;
_mouseDelay = 20;
_mouseInstrument = inst;
@ -220,19 +218,39 @@ FGPanel::doMouseAction (int button, int updown, int x, int y)
return true;
}
}
// cout << "Did not click on an instrument\n";
return false;
}
////////////////////////////////////////////////////////////////////////.
// Implementation of FGPanelAction.
////////////////////////////////////////////////////////////////////////
FGPanelAction::FGPanelAction ()
{
}
FGPanelAction::FGPanelAction (int button, int x, int y, int w, int h)
: _button(button), _x(x), _y(y), _w(w), _h(h)
{
}
FGPanelAction::~FGPanelAction ()
{
}
////////////////////////////////////////////////////////////////////////
// Implementation of FGAdjustAction.
////////////////////////////////////////////////////////////////////////
FGAdjustAction::FGAdjustAction (SGValue * value, float increment,
FGAdjustAction::FGAdjustAction (int button, int x, int y, int w, int h,
SGValue * value, float increment,
float min, float max, bool wrap=false)
: _value(value), _increment(increment), _min(min), _max(max), _wrap(wrap)
: FGPanelAction(button, x, y, w, h),
_value(value), _increment(increment), _min(min), _max(max), _wrap(wrap)
{
}
@ -244,14 +262,12 @@ void
FGAdjustAction::doAction ()
{
float val = _value->getFloatValue();
// cout << "Do action; value=" << value << '\n';
val += _increment;
if (val < _min) {
val = (_wrap ? _max : _min);
} else if (val > _max) {
val = (_wrap ? _min : _max);
}
// cout << "New value is " << value << '\n';
_value->setDoubleValue(val);
}
@ -261,8 +277,9 @@ FGAdjustAction::doAction ()
// Implementation of FGSwapAction.
////////////////////////////////////////////////////////////////////////
FGSwapAction::FGSwapAction (SGValue * value1, SGValue * value2)
: _value1(value1), _value2(value2)
FGSwapAction::FGSwapAction (int button, int x, int y, int w, int h,
SGValue * value1, SGValue * value2)
: FGPanelAction(button, x, y, w, h), _value1(value1), _value2(value2)
{
}
@ -284,8 +301,9 @@ FGSwapAction::doAction ()
// Implementation of FGToggleAction.
////////////////////////////////////////////////////////////////////////
FGToggleAction::FGToggleAction (SGValue * value)
: _value(value)
FGToggleAction::FGToggleAction (int button, int x, int y, int w, int h,
SGValue * value)
: FGPanelAction(button, x, y, w, h), _value(value)
{
}
@ -300,6 +318,29 @@ FGToggleAction::doAction ()
}
////////////////////////////////////////////////////////////////////////
// Implementation of FGPanelTransformation.
////////////////////////////////////////////////////////////////////////
FGPanelTransformation::FGPanelTransformation ()
{
}
FGPanelTransformation::FGPanelTransformation (Type _type,
const SGValue * _value,
float _min, float _max,
float _factor, float _offset)
: type(_type), value(_value), min(_min), max(_max),
factor(_factor), offset(_offset)
{
}
FGPanelTransformation::~FGPanelTransformation ()
{
}
////////////////////////////////////////////////////////////////////////
// Implementation of FGPanelInstrument.
@ -320,10 +361,11 @@ FGPanelInstrument::FGPanelInstrument (int x, int y, int w, int h)
FGPanelInstrument::~FGPanelInstrument ()
{
action_list_type::iterator it = _actions.begin();
action_list_type::iterator last = _actions.end();
for ( ; it != last; it++) {
delete it->action;
for (action_list_type::iterator it = _actions.begin();
it != _actions.end();
it++) {
delete *it;
*it = 0;
}
}
@ -366,17 +408,9 @@ FGPanelInstrument::getHeight () const
}
void
FGPanelInstrument::addAction (int button, int x, int y, int w, int h,
FGPanelAction * action)
FGPanelInstrument::addAction (FGPanelAction * action)
{
FGPanelInstrument::inst_action act;
act.button = button;
act.x = x;
act.y = y;
act.w = w;
act.h = h;
act.action = action;
_actions.push_back(act);
_actions.push_back(action);
}
// Coordinates relative to centre.
@ -385,13 +419,9 @@ FGPanelInstrument::doMouseAction (int button, int x, int y)
{
action_list_type::iterator it = _actions.begin();
action_list_type::iterator last = _actions.end();
// cout << "Mouse action at " << x << ',' << y << '\n';
for ( ; it != last; it++) {
// cout << "Trying action at " << it->x << ',' << it->y << ','
// << it->w <<',' << it->h << '\n';
if (button == it->button &&
x >= it->x && x < it->x + it->w && y >= it->y && y < it->y + it->h) {
it->action->doAction();
if ((*it)->inArea(button, x, y)) {
(*it)->doAction();
return true;
}
}
@ -411,7 +441,10 @@ FGLayeredInstrument::FGLayeredInstrument (int x, int y, int w, int h)
FGLayeredInstrument::~FGLayeredInstrument ()
{
// FIXME: free layers
for (layer_list::iterator it = _layers.begin(); it != _layers.end(); it++) {
delete *it;
*it = 0;
}
}
void
@ -447,20 +480,10 @@ FGLayeredInstrument::addLayer (CroppedTexture &texture,
}
void
FGLayeredInstrument::addTransformation (FGInstrumentLayer::transform_type type,
const SGValue * value,
float min, float max,
float factor, float offset)
FGLayeredInstrument::addTransformation (FGPanelTransformation * transformation)
{
int layer = _layers.size() - 1;
_layers[layer]->addTransformation(type, value, min, max, factor, offset);
}
void
FGLayeredInstrument::addTransformation (FGInstrumentLayer::transform_type type,
float offset)
{
addTransformation(type, 0, 0.0, 0.0, 1.0, offset);
_layers[layer]->addTransformation(transformation);
}
@ -477,11 +500,11 @@ FGInstrumentLayer::FGInstrumentLayer (int w, int h)
FGInstrumentLayer::~FGInstrumentLayer ()
{
transformation_list::iterator it = _transformations.begin();
transformation_list::iterator end = _transformations.end();
while (it != end) {
for (transformation_list::iterator it = _transformations.begin();
it != _transformations.end();
it++) {
delete *it;
it++;
*it = 0;
}
}
@ -491,7 +514,7 @@ FGInstrumentLayer::transform () const
transformation_list::const_iterator it = _transformations.begin();
transformation_list::const_iterator last = _transformations.end();
while (it != last) {
transformation *t = *it;
FGPanelTransformation *t = *it;
float val = (t->value == 0 ? 0.0 : t->value->getFloatValue());
if (val < t->min) {
val = t->min;
@ -501,13 +524,13 @@ FGInstrumentLayer::transform () const
val = val * t->factor + t->offset;
switch (t->type) {
case XSHIFT:
case FGPanelTransformation::XSHIFT:
glTranslatef(val, 0.0, 0.0);
break;
case YSHIFT:
case FGPanelTransformation::YSHIFT:
glTranslatef(0.0, val, 0.0);
break;
case ROTATION:
case FGPanelTransformation::ROTATION:
glRotatef(-val, 0.0, 0.0, 1.0);
break;
}
@ -516,19 +539,9 @@ FGInstrumentLayer::transform () const
}
void
FGInstrumentLayer::addTransformation (transform_type type,
const SGValue * value,
float min, float max,
float factor, float offset)
FGInstrumentLayer::addTransformation (FGPanelTransformation * transformation)
{
transformation *t = new transformation;
t->type = type;
t->value = value;
t->min = min;
t->max = max;
t->factor = factor;
t->offset = offset;
_transformations.push_back(t);
_transformations.push_back(transformation);
}
@ -557,17 +570,17 @@ FGTexturedLayer::draw ()
int h2 = _h / 2;
transform();
glBindTexture(GL_TEXTURE_2D, _texture->texture->getHandle());
glBindTexture(GL_TEXTURE_2D, _texture.texture->getHandle());
glBegin(GL_POLYGON);
if ( cur_light_params.sun_angle * RAD_TO_DEG < 95.0 ) {
glColor4fv( cur_light_params.scene_diffuse );
} else {
glColor4f(0.7, 0.2, 0.2, 1.0);
}
glTexCoord2f(_texture->minX, _texture->minY); glVertex2f(-w2, -h2);
glTexCoord2f(_texture->maxX, _texture->minY); glVertex2f(w2, -h2);
glTexCoord2f(_texture->maxX, _texture->maxY); glVertex2f(w2, h2);
glTexCoord2f(_texture->minX, _texture->maxY); glVertex2f(-w2, h2);
glTexCoord2f(_texture.minX, _texture.minY); glVertex2f(-w2, -h2);
glTexCoord2f(_texture.maxX, _texture.minY); glVertex2f(w2, -h2);
glTexCoord2f(_texture.maxX, _texture.maxY); glVertex2f(w2, h2);
glTexCoord2f(_texture.minX, _texture.maxY); glVertex2f(-w2, h2);
glEnd();
}

View file

@ -120,11 +120,11 @@ public:
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<FGPanelInstrument *> instrument_list_type;
int _x, _y, _w, _h;
int _panel_h;
@ -139,14 +139,46 @@ 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 ();
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; }
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; }
virtual bool inArea (int button, int x, int y)
{
return (button == _button &&
x >= _x &&
x < _x + _w &&
y >= _y &&
y < _y + _h);
}
virtual void doAction () = 0;
private:
int _button;
int _x;
int _y;
int _w;
int _h;
};
@ -163,7 +195,8 @@ public:
class FGAdjustAction : public FGPanelAction
{
public:
FGAdjustAction (SGValue * value, 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 ();
@ -188,7 +221,8 @@ private:
class FGSwapAction : public FGPanelAction
{
public:
FGSwapAction (SGValue * value1, SGValue * value2);
FGSwapAction (int button, int x, int y, int w, int h,
SGValue * value1, SGValue * value2);
virtual ~FGSwapAction ();
virtual void doAction ();
@ -208,7 +242,8 @@ private:
class FGToggleAction : public FGPanelAction
{
public:
FGToggleAction (SGValue * value);
FGToggleAction (int button, int x, int y, int w, int h,
SGValue * value);
virtual ~FGToggleAction ();
virtual void doAction ();
@ -247,23 +282,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<inst_action> action_list_type;
typedef vector<FGPanelAction *> action_list_type;
action_list_type _actions;
};
@ -278,6 +304,35 @@ protected:
// rotate to show the altitude or airspeed.
////////////////////////////////////////////////////////////////////////
/**
* A transformation for a layer.
*/
class FGPanelTransformation {
public:
enum Type {
XSHIFT,
YSHIFT,
ROTATION
};
FGPanelTransformation ();
FGPanelTransformation (Type type, const SGValue * value,
float min, float max,
float factor, float offset);
virtual ~FGPanelTransformation ();
Type type;
const SGValue * value;
float min;
float max;
float factor;
float offset;
};
/**
* A single layer of a multi-layered instrument.
*
@ -288,11 +343,6 @@ protected:
class FGInstrumentLayer
{
public:
typedef enum {
XSHIFT,
YSHIFT,
ROTATION
} transform_type;
FGInstrumentLayer (int w = -1, int h = -1);
virtual ~FGInstrumentLayer ();
@ -305,22 +355,14 @@ public:
virtual void setWidth (int w) { _w = w; }
virtual void setHeight (int h) { _h = h; }
virtual void addTransformation (transform_type type, const SGValue * value,
float min, float max,
float factor = 1.0, float offset = 0.0);
// Transfer pointer ownership!!
// DEPRECATED
virtual void addTransformation (FGPanelTransformation * transformation);
protected:
int _w, _h;
typedef struct {
transform_type type;
const SGValue * value;
float min;
float max;
float factor;
float offset;
} transformation;
typedef vector<transformation *> transformation_list;
typedef vector<FGPanelTransformation *> transformation_list;
transformation_list _transformations;
};
@ -354,14 +396,10 @@ public:
// Transfer pointer ownership!!
virtual int addLayer (FGInstrumentLayer *layer);
virtual int addLayer (CroppedTexture &texture,
int w = -1, int h = -1);
virtual void addTransformation (FGInstrumentLayer::transform_type type,
const SGValue * value,
float min, float max,
float factor = 1.0, float offset = 0.0);
virtual void addTransformation (FGInstrumentLayer::transform_type type,
float offset);
virtual int addLayer (CroppedTexture &texture, int w = -1, int h = -1);
// Transfer pointer ownership!!
virtual void addTransformation (FGPanelTransformation * transformation);
protected:
layer_list _layers;
@ -386,11 +424,11 @@ public:
virtual void draw ();
virtual void setTexture (CroppedTexture &texture) { _texture = &texture; }
virtual CroppedTexture &getTexture () { return *_texture; }
virtual void setTexture (CroppedTexture &texture) { _texture = texture; }
virtual CroppedTexture &getTexture () { return _texture; }
private:
mutable CroppedTexture * _texture;
mutable CroppedTexture _texture;
};

View file

@ -32,60 +32,227 @@
#include <iostream>
#include <string>
#include <map>
#include "panel.hxx"
using std::istream;
using std::hash_map;
using std::string;
////////////////////////////////////////////////////////////////////////
// Instruments.
////////////////////////////////////////////////////////////////////////
struct ActionData
{
FGPanelAction * action;
int button, x, y, w, h;
};
struct TransData
{
enum Type {
End = 0,
Rotation,
XShift,
YShift
};
Type type;
const char * propName;
float min, max, factor, offset;
};
struct LayerData
{
FGInstrumentLayer * layer;
TransData transformations[16];
};
struct InstrumentData
{
const char * name;
int x, y, w, h;
ActionData actions[16];
LayerData layers[16];
};
////////////////////////////////////////////////////////////////////////
// Read and construct a panel.
////////////////////////////////////////////////////////////////////////
/**
* Read a cropped texture.
*/
static CroppedTexture
readTexture (SGPropertyNode node)
{
CroppedTexture texture(node.getStringValue("path"),
node.getFloatValue("x1"),
node.getFloatValue("y1"),
node.getFloatValue("x2", 1.0),
node.getFloatValue("y2", 1.0));
FG_LOG(FG_INPUT, FG_INFO, "Read texture " << node.getName());
return texture;
}
/**
* Read an action.
*/
static FGPanelAction *
readAction (SGPropertyNode node)
{
FGPanelAction * action = 0;
cerr << "Reading action\n";
string type = node.getStringValue("type");
int button = node.getIntValue("button");
int x = node.getIntValue("x");
int y = node.getIntValue("y");
int w = node.getIntValue("w");
int h = node.getIntValue("h");
// Adjust a property value
if (type == "adjust") {
string propName = node.getStringValue("property");
SGValue * value = current_properties.getValue(propName, true);
float increment = node.getFloatValue("increment", 1.0);
float min = node.getFloatValue("min", 0.0);
float max = node.getFloatValue("max", 0.0);
bool wrap = node.getBoolValue("wrap", false);
if (min == max)
FG_LOG(FG_INPUT, FG_ALERT, "Action " << node.getName()
<< " has same min and max value");
action = new FGAdjustAction(button, x, y, w, h, value,
increment, min, max, wrap);
}
// Swap two property values
else if (type == "swap") {
string propName1 = node.getStringValue("property1");
string propName2 = node.getStringValue("property2");
SGValue * value1 = current_properties.getValue(propName1, true);
SGValue * value2 = current_properties.getValue(propName2, true);
action = new FGSwapAction(button, x, y, w, h, value1, value2);
}
// Toggle a boolean value
else if (type == "toggle") {
string propName = node.getStringValue("property");
SGValue * value = current_properties.getValue(propName, true);
action = new FGToggleAction(button, x, y, w, h, value);
}
// No type supplied
else if (type == "") {
FG_LOG(FG_INPUT, FG_ALERT, "No type specified for action "
<< node.getName());
return 0;
}
// Unrecognized type
else {
FG_LOG(FG_INPUT, FG_ALERT, "Unrecognized action type " << node.getName());
return 0;
}
return action;
}
/**
* Read a single transformation.
*/
static FGPanelTransformation *
readTransformation (SGPropertyNode node)
{
FGPanelTransformation * t = new FGPanelTransformation;
string name = node.getName();
string type = node.getStringValue("type");
string propName = node.getStringValue("property", "");
SGValue * value = 0;
if (propName != "") {
value = current_properties.getValue(propName, true);
}
t->value = value;
t->min = node.getFloatValue("min", 0.0);
t->max = node.getFloatValue("max", 1.0);
t->factor = node.getFloatValue("factor", 1.0);
t->offset = node.getFloatValue("offset", 0.0);
if (type == "x-shift") {
t->type = FGPanelTransformation::XSHIFT;
} else if (type == "y-shift") {
t->type = FGPanelTransformation::YSHIFT;
} else if (type == "rotation") {
t->type = FGPanelTransformation::ROTATION;
} else if (type == "") {
FG_LOG(FG_INPUT, FG_ALERT,
"'type' must be specified for transformation");
delete t;
return 0;
} else {
FG_LOG(FG_INPUT, FG_ALERT, "Unrecognized transformation: " << type);
delete t;
return 0;
}
FG_LOG(FG_INPUT, FG_INFO, "Read transformation " << name);
return t;
}
/**
* Read a single layer of an instrument.
*/
static FGInstrumentLayer *
readLayer (SGPropertyNode node)
{
FGInstrumentLayer * l;
string name = node.getName();
CroppedTexture texture = readTexture(node.getSubNode("texture"));
l = new FGTexturedLayer(texture,
node.getIntValue("w", -1),
node.getIntValue("h", -1));
//
// Get the transformations for each layer.
//
SGPropertyNode trans_group = node.getSubNode("transformations");
int nTransformations = trans_group.size();
for (int k = 0; k < nTransformations; k++) {
FGPanelTransformation * t = readTransformation(trans_group.getChild(k));
if (t == 0) {
delete l;
return 0;
}
l->addTransformation(t);
}
FG_LOG(FG_INPUT, FG_INFO, "Read layer " << name);
return l;
}
/**
* Read an instrument.
*/
static FGPanelInstrument *
readInstrument (SGPropertyNode node)
{
const string &name = node.getStringValue("name");
FG_LOG(FG_INPUT, FG_INFO, "Reading instrument " << name);
FGLayeredInstrument * instrument =
new FGLayeredInstrument(0, 0,
node.getIntValue("w"),
node.getIntValue("h"));
//
// Get the actions for the instrument.
//
SGPropertyNode action_group = node.getSubNode("actions");
int nActions = action_group.size();
cerr << "There are " << nActions << " actions\n";
for (int j = 0; j < nActions; j++) {
FGPanelAction * action = readAction(action_group.getChild(j));
if (action == 0) {
delete instrument;
return 0;
}
instrument->addAction(action);
}
//
// Get the layers for the instrument.
//
SGPropertyNode layer_group = node.getSubNode("layers");
int nLayers = layer_group.size();
for (int j = 0; j < nLayers; j++) {
FGInstrumentLayer * layer = readLayer(layer_group.getChild(j));
if (layer == 0) {
delete instrument;
return 0;
}
instrument->addLayer(layer);
}
FG_LOG(FG_INPUT, FG_INFO, "Done reading instrument " << name);
return instrument;
}
/**
* Read a property list defining an instrument panel.
*
@ -95,7 +262,6 @@ FGPanel *
fgReadPanel (istream &input)
{
SGPropertyList props;
map<string,CroppedTexture> textures;
//
@ -108,39 +274,18 @@ fgReadPanel (istream &input)
FG_LOG(FG_INPUT, FG_INFO, "Read properties for panel " <<
props.getStringValue("/name"));
//
// Read the cropped textures from the property list.
//
SGPropertyNode texture_group("/textures", &props);
int nTextures = texture_group.size();
cout << "There are " << nTextures << " textures" << endl;
for (int i = 0; i < nTextures; i++) {
SGPropertyNode tex = texture_group.getChild(i);
const string &name = tex.getName();
textures[name] = CroppedTexture(tex.getStringValue("path"),
tex.getFloatValue("x1"),
tex.getFloatValue("y1"),
tex.getFloatValue("x2", 1.0),
tex.getFloatValue("y2", 1.0));
FG_LOG(FG_INPUT, FG_INFO, "Read texture " << name);
}
//
// Construct a new, empty panel.
//
FGPanel * panel = new FGPanel(0, 0, 1024, 768);// FIXME: use variable size
//
// Assign the background texture, if any, or a bogus chequerboard.
//
string bgTexture = props.getStringValue("/background");
if (bgTexture == "") {
panel->setBackground(FGTextureManager::createTexture("FOO"));
} else {
panel->setBackground(textures[bgTexture].texture);
}
if (bgTexture == "")
bgTexture = "FOO";
panel->setBackground(FGTextureManager::createTexture(bgTexture.c_str()));
FG_LOG(FG_INPUT, FG_INFO, "Set background texture to " << bgTexture);
@ -150,95 +295,37 @@ fgReadPanel (istream &input)
FG_LOG(FG_INPUT, FG_INFO, "Reading panel instruments");
SGPropertyNode instrument_group("/instruments", &props);
int nInstruments = instrument_group.size();
cout << "There are " << nInstruments << " instruments" << endl;
for (int i = 0; i < nInstruments; i++) {
SGPropertyNode inst = instrument_group.getChild(i);
const string &name = inst.getName();
FGLayeredInstrument * instrument =
new FGLayeredInstrument(inst.getIntValue("x"),
inst.getIntValue("y"),
inst.getIntValue("w"),
inst.getIntValue("h"));
SGPropertyList props2;
SGPropertyNode node = instrument_group.getChild(i);
string path = node.getStringValue("path");
int x = node.getIntValue("x");
int y = node.getIntValue("y");
int w = node.getIntValue("w");
int h = node.getIntValue("h");
//
// Get the layers for each instrument.
//
SGPropertyNode layer_group = inst.getSubNode("layers");
SGPropertyNode layer;
int nLayers = layer_group.size();
cout << "There are " << nLayers << " layers" << endl;
for (int j = 0; j < nLayers; j++) {
layer = layer_group.getChild(j);
FGInstrumentLayer * l;
string name = layer.getName();
FG_LOG(FG_INPUT, FG_INFO, "Reading instrument "
<< node.getName()
<< " from "
<< path);
string tex = layer.getStringValue("texture");
if (tex != "") {
l = new FGTexturedLayer(textures[tex],
layer.getIntValue("w", -1),
layer.getIntValue("h", -1));
} else {
FG_LOG(FG_INPUT, FG_ALERT, "No texture for layer " << name);
return 0;
}
//
// Get the transformations for each layer.
//
SGPropertyNode trans_group = layer.getSubNode("transformations");
SGPropertyNode trans;
int nTransformations = trans_group.size();
cout << "There are " << nTransformations << " transformations" << endl;
for (int k = 0; k < nTransformations; k++) {
trans = trans_group.getChild(k);
string name = trans.getName();
string type = trans.getStringValue("type");
string propName = trans.getStringValue("property", "");
SGValue * value = 0;
cout << "Type is " << type << endl;
if (propName != "") {
value = current_properties.getValue(propName, true);
}
if (type == "x-shift") {
l->addTransformation(FGInstrumentLayer::XSHIFT,
value,
trans.getFloatValue("min", 0.0),
trans.getFloatValue("max", 1.0),
trans.getFloatValue("factor", 1.0),
trans.getFloatValue("offset", 0.0));
} else if (type == "y-shift") {
l->addTransformation(FGInstrumentLayer::YSHIFT,
value,
trans.getFloatValue("min", 0.0),
trans.getFloatValue("max", 1.0),
trans.getFloatValue("factor", 1.0),
trans.getFloatValue("offset", 0.0));
} else if (type == "rotation") {
l->addTransformation(FGInstrumentLayer::ROTATION,
value,
trans.getFloatValue("min", -360.0),
trans.getFloatValue("max", 360.0),
trans.getFloatValue("factor", 1.0),
trans.getFloatValue("offset", 0.0));
} else if (type == "") {
FG_LOG(FG_INPUT, FG_ALERT,
"'type' must be specified for transformation");
return 0;
} else {
FG_LOG(FG_INPUT, FG_ALERT, "Unrecognized transformation: " << type);
return 0;
}
FG_LOG(FG_INPUT, FG_INFO, "Read transformation " << name);
}
instrument->addLayer(l);
FG_LOG(FG_INPUT, FG_INFO, "Read layer " << name);
if (!readPropertyList(path, &props2)) {
delete panel;
return 0;
}
FGPanelInstrument * instrument =
readInstrument(SGPropertyNode("/", &props2));
if (instrument == 0) {
delete instrument;
delete panel;
return 0;
}
instrument->setPosition(x, y);
panel->addInstrument(instrument);
FG_LOG(FG_INPUT, FG_INFO, "Read instrument " << name);
}
FG_LOG(FG_INPUT, FG_INFO, "Done reading panel instruments");
//
@ -246,3 +333,6 @@ fgReadPanel (istream &input)
//
return panel;
}
// end of panel_io.cxx

View file

@ -383,12 +383,6 @@ MagRibbon::draw ()
// Instruments.
////////////////////////////////////////////////////////////////////////
struct ActionData
{
FGPanelAction * action;
int button, x, y, w, h;
};
struct TransData
{
enum Type {
@ -412,7 +406,7 @@ struct InstrumentData
{
const char * name;
int x, y, w, h;
ActionData actions[16];
FGPanelAction * actions[16];
LayerData layers[16];
};
@ -546,31 +540,31 @@ InstrumentData instruments[] =
}},
{"gyro", SIX_X+SIX_SPACING, SIX_Y-SIX_SPACING, SIX_W, SIX_W, {
{new FGAdjustAction(V("/autopilot/settings/heading-magnetic"),
-1.0, -360.0, 360.0, true),
0, SIX_W/2-SIX_W/5, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/autopilot/settings/heading-magnetic"),
1.0, -360.0, 360.0, true),
0, SIX_W/2 - SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/autopilot/settings/heading-magnetic"),
-5.0, -360.0, 360.0, true),
1, SIX_W/2 - SIX_W/5, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/autopilot/settings/heading-magnetic"),
5.0, -360.0, 360.0, true),
1, SIX_W/2 - SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/steam/gyro-compass-error"),
-1.0, -360.0, 360.0, true),
0, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/steam/gyro-compass-error"),
1.0, -360.0, 360.0, true),
0, -SIX_W/2+SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/steam/gyro-compass-error"),
-5.0, -360.0, 360.0, true),
1, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/steam/gyro-compass-error"),
5.0, -360.0, 360.0, true),
1, -SIX_W/2+SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5}
}, {
new FGAdjustAction(0, SIX_W/2-SIX_W/5, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/autopilot/settings/heading-magnetic"),
-1.0, -360.0, 360.0, true),
new FGAdjustAction(0, SIX_W/2 - SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/autopilot/settings/heading-magnetic"),
1.0, -360.0, 360.0, true),
new FGAdjustAction(1, SIX_W/2 - SIX_W/5, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/autopilot/settings/heading-magnetic"),
-5.0, -360.0, 360.0, true),
new FGAdjustAction(1, SIX_W/2 - SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/autopilot/settings/heading-magnetic"),
5.0, -360.0, 360.0, true),
new FGAdjustAction(0, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/steam/gyro-compass-error"),
-1.0, -360.0, 360.0, true),
new FGAdjustAction(0, -SIX_W/2+SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/steam/gyro-compass-error"),
1.0, -360.0, 360.0, true),
new FGAdjustAction(1, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/steam/gyro-compass-error"),
-5.0, -360.0, 360.0, true),
new FGAdjustAction(1, -SIX_W/2+SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/steam/gyro-compass-error"),
5.0, -360.0, 360.0, true)
}, {
{new MyTexturedLayer("compassBG", -1, -1), {
{TransData::Rotation, "/steam/gyro-compass", -720.0, 720.0, -1.0, 0.0}
}},
@ -608,18 +602,18 @@ InstrumentData instruments[] =
}},
{"nav1", SIX_X+(SIX_SPACING*3)+20, SIX_Y, SIX_W, SIX_W, {
{new FGAdjustAction(V("/radios/nav1/radials/selected"),
1.0, 0.0, 360.0, true),
0, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/radios/nav1/radials/selected"),
-1.0, 0.0, 360.0, true),
0, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/radios/nav1/radials/selected"),
5.0, 0.0, 360.0, true),
1, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/radios/nav1/radials/selected"),
-5.0, 0.0, 360.0, true),
1, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5}
new FGAdjustAction(0, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/nav1/radials/selected"),
1.0, 0.0, 360.0, true),
new FGAdjustAction(0, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/nav1/radials/selected"),
-1.0, 0.0, 360.0, true),
new FGAdjustAction(1, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/nav1/radials/selected"),
5.0, 0.0, 360.0, true),
new FGAdjustAction(1, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/nav1/radials/selected"),
-5.0, 0.0, 360.0, true)
}, {
{new MyTexturedLayer("compassBG"), {
{TransData::Rotation, "/radios/nav1/radials/selected",
@ -656,18 +650,18 @@ InstrumentData instruments[] =
}},
{"nav2", SIX_X+(SIX_SPACING*3)+20, SIX_Y-SIX_SPACING, SIX_W, SIX_W, {
{new FGAdjustAction(V("/radios/nav2/radials/selected"),
1.0, 0.0, 360.0, true),
0, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/radios/nav2/radials/selected"),
-1.0, 0.0, 360.0, true),
0, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/radios/nav2/radials/selected"),
5.0, 0.0, 360.0, true),
1, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/radios/nav2/radials/selected"),
-5.0, 0.0, 360.0, true),
1, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5}
new FGAdjustAction(0, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/nav2/radials/selected"),
1.0, 0.0, 360.0, true),
new FGAdjustAction(0, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/nav2/radials/selected"),
-1.0, 0.0, 360.0, true),
new FGAdjustAction(1, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/nav2/radials/selected"),
5.0, 0.0, 360.0, true),
new FGAdjustAction(1, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/nav2/radials/selected"),
-5.0, 0.0, 360.0, true)
}, {
{new MyTexturedLayer("compassBG"), {
{TransData::Rotation, "/radios/nav2/radials/selected",
@ -700,18 +694,19 @@ InstrumentData instruments[] =
}},
{"adf", SIX_X+(SIX_SPACING*3)+20, SIX_Y-(SIX_SPACING*2), SIX_W, SIX_W, {
{new FGAdjustAction(V("/radios/adf/rotation"),
-1.0, 0.0, 360.0, true),
0, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/radios/adf/rotation"),
1.0, 0.0, 360.0, true),
0, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/radios/adf/rotation"),
-5.0, 0.0, 360.0, true),
1, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5},
{new FGAdjustAction(V("/radios/adf/rotation"),
5.0, 0.0, 360.0, true),
1, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5}
new FGAdjustAction(0, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/adf/rotation"),
-1.0, 0.0, 360.0, true),
new FGAdjustAction(0, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/adf/rotation"),
1.0, 0.0, 360.0, true),
new FGAdjustAction(1, -SIX_W/2, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/adf/rotation"),
-5.0, 0.0, 360.0, true),
new FGAdjustAction(1, -SIX_W/2 + SIX_W/10, -SIX_W/2, SIX_W/10, SIX_W/5,
V("/radios/adf/rotation"),
5.0, 0.0, 360.0, true)
},{
{new MyTexturedLayer("compassBG"), {
{TransData::Rotation, "/radios/adf/rotation", 0.0, 360.0, 1.0, 0.0}
@ -753,22 +748,27 @@ createNavCom1 (int x, int y)
// Use the button to swap standby and active
// NAV frequencies
inst->addAction(0, int(SIX_W * .375), -SIX_W/4, SIX_W/4, SIX_W/4,
new FGSwapAction(V("/radios/nav1/frequencies/selected"),
inst->addAction(new FGSwapAction(0, int(SIX_W * .375),
-SIX_W/4, SIX_W/4, SIX_W/4,
V("/radios/nav1/frequencies/selected"),
V("/radios/nav1/frequencies/standby")));
// Use the knob to tune the standby NAV
inst->addAction(0, SIX_W-SIX_W/4, -SIX_W/4, SIX_W/8, SIX_W/4,
new FGAdjustAction(V("/radios/nav1/frequencies/standby"),
inst->addAction(new FGAdjustAction(0, SIX_W-SIX_W/4, -SIX_W/4,
SIX_W/8, SIX_W/4,
V("/radios/nav1/frequencies/standby"),
-0.05, 108.0, 117.95, true));
inst->addAction(0, SIX_W-SIX_W/8, -SIX_W/4, SIX_W/8, SIX_W/4,
new FGAdjustAction(V("/radios/nav1/frequencies/standby"),
inst->addAction(new FGAdjustAction(0, SIX_W-SIX_W/8, -SIX_W/4,
SIX_W/8, SIX_W/4,
V("/radios/nav1/frequencies/standby"),
0.05, 108.0, 117.95, true));
inst->addAction(1, SIX_W-SIX_W/4, -SIX_W/4, SIX_W/8, SIX_W/4,
new FGAdjustAction(V("/radios/nav1/frequencies/standby"),
inst->addAction(new FGAdjustAction(1, SIX_W-SIX_W/4, -SIX_W/4,
SIX_W/8, SIX_W/4,
V("/radios/nav1/frequencies/standby"),
-0.5, 108.0, 117.95, true));
inst->addAction(1, SIX_W-SIX_W/8, -SIX_W/4, SIX_W/8, SIX_W/4,
new FGAdjustAction(V("/radios/nav1/frequencies/standby"),
inst->addAction(new FGAdjustAction(1, SIX_W-SIX_W/8, -SIX_W/4,
SIX_W/8, SIX_W/4,
V("/radios/nav1/frequencies/standby"),
0.5, 108.0, 117.95, true));
// Layer 0: background
@ -787,8 +787,12 @@ createNavCom1 (int x, int y)
text->setPointSize(14);
text->setColor(1.0, 0.5, 0.0);
inst->addLayer(text);
inst->addTransformation(FGInstrumentLayer::XSHIFT, 3);
inst->addTransformation(FGInstrumentLayer::YSHIFT, 5);
inst->addTransformation
(new FGPanelTransformation(FGPanelTransformation::XSHIFT, 0,
0.0, 0.0, 0.0, 3));
inst->addTransformation
(new FGPanelTransformation(FGPanelTransformation::YSHIFT, 0,
0.0, 0.0, 0.0, 5));
return inst;
}
@ -804,22 +808,22 @@ createNavCom2 (int x, int y)
// Use the button to swap standby and active
// NAV frequencies
inst->addAction(0, int(SIX_W * .375), -SIX_W/4, SIX_W/4, SIX_W/4,
new FGSwapAction(V("/radios/nav2/frequencies/selected"),
inst->addAction(new FGSwapAction(0, int(SIX_W * .375), -SIX_W/4, SIX_W/4, SIX_W/4,
V("/radios/nav2/frequencies/selected"),
V("/radios/nav2/frequencies/standby")));
// Use the knob to tune the standby NAV
inst->addAction(0, SIX_W-SIX_W/4, -SIX_W/4, SIX_W/8, SIX_W/4,
new FGAdjustAction(V("/radios/nav2/frequencies/standby"),
inst->addAction(new FGAdjustAction(0, SIX_W-SIX_W/4, -SIX_W/4, SIX_W/8, SIX_W/4,
V("/radios/nav2/frequencies/standby"),
-0.05, 108.0, 117.95, true));
inst->addAction(0, SIX_W-SIX_W/8, -SIX_W/4, SIX_W/8, SIX_W/4,
new FGAdjustAction(V("/radios/nav2/frequencies/standby"),
inst->addAction(new FGAdjustAction(0, SIX_W-SIX_W/8, -SIX_W/4, SIX_W/8, SIX_W/4,
V("/radios/nav2/frequencies/standby"),
0.05, 108.0, 117.95, true));
inst->addAction(1, SIX_W-SIX_W/4, -SIX_W/4, SIX_W/8, SIX_W/4,
new FGAdjustAction(V("/radios/nav2/frequencies/standby"),
inst->addAction(new FGAdjustAction(1, SIX_W-SIX_W/4, -SIX_W/4, SIX_W/8, SIX_W/4,
V("/radios/nav2/frequencies/standby"),
-0.5, 108.0, 117.95, true));
inst->addAction(1, SIX_W-SIX_W/8, -SIX_W/4, SIX_W/8, SIX_W/4,
new FGAdjustAction(V("/radios/nav2/frequencies/standby"),
inst->addAction(new FGAdjustAction(1, SIX_W-SIX_W/8, -SIX_W/4, SIX_W/8, SIX_W/4,
V("/radios/nav2/frequencies/standby"),
0.5, 108.0, 117.95, true));
// Layer 0: background
@ -838,8 +842,12 @@ createNavCom2 (int x, int y)
text->setPointSize(14);
text->setColor(1.0, 0.5, 0.0);
inst->addLayer(text);
inst->addTransformation(FGInstrumentLayer::XSHIFT, 3);
inst->addTransformation(FGInstrumentLayer::YSHIFT, 5);
inst->addTransformation
(new FGPanelTransformation(FGPanelTransformation::XSHIFT, 0,
0.0, 0.0, 1.0, 3));
inst->addTransformation
(new FGPanelTransformation(FGPanelTransformation::YSHIFT, 0,
0.0, 0.0, 1.0, 5));
return inst;
}
@ -854,21 +862,21 @@ createADFRadio (int x, int y)
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W*2, SIX_W/2);
// Use the knob to tune the standby NAV
inst->addAction(0, int(SIX_W * 0.7), int(-SIX_W * 0.07),
inst->addAction(new FGAdjustAction(0, int(SIX_W * 0.7), int(-SIX_W * 0.07),
int(SIX_W * 0.09), int(SIX_W * 0.14),
new FGAdjustAction(V("/radios/adf/frequencies/selected"),
V("/radios/adf/frequencies/selected"),
-1.0, 100.0, 1299, true));
inst->addAction(0, int(SIX_W * 0.79), int(-SIX_W * 0.07),
inst->addAction(new FGAdjustAction(0, int(SIX_W * 0.79), int(-SIX_W * 0.07),
int(SIX_W * 0.09), int(SIX_W * 0.14),
new FGAdjustAction(V("/radios/adf/frequencies/selected"),
V("/radios/adf/frequencies/selected"),
1.0, 100.0, 1299, true));
inst->addAction(1, int(SIX_W * 0.7), int(-SIX_W * 0.07),
inst->addAction(new FGAdjustAction(1, int(SIX_W * 0.7), int(-SIX_W * 0.07),
int(SIX_W * 0.09), int(SIX_W * 0.14),
new FGAdjustAction(V("/radios/adf/frequencies/selected"),
V("/radios/adf/frequencies/selected"),
-25.0, 100.0, 1299, true));
inst->addAction(1, int(SIX_W * 0.79), int(-SIX_W * 0.07),
inst->addAction(new FGAdjustAction(1, int(SIX_W * 0.79), int(-SIX_W * 0.07),
int(SIX_W * 0.09), int(SIX_W * 0.14),
new FGAdjustAction(V("/radios/adf/frequencies/selected"),
V("/radios/adf/frequencies/selected"),
25.0, 100.0, 1299, true));
// Layer 0: background
@ -883,7 +891,9 @@ createADFRadio (int x, int y)
text->setPointSize(14);
text->setColor(1.0, 0.5, 0.0);
inst->addLayer(text);
inst->addTransformation(FGInstrumentLayer::XSHIFT, -SIX_W + 18);
inst->addTransformation
(new FGPanelTransformation(FGPanelTransformation::XSHIFT, 0,
0.0, 0.0, 1.0, -SIX_W + 18));
return inst;
}
@ -899,16 +909,16 @@ createAP (int x, int y)
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W*2, SIX_W/4);
// Action: select HDG button
inst->addAction(0, int(-SIX_W*0.6125), -SIX_W/16, SIX_W/4, SIX_W/8,
new FGToggleAction(V("/autopilot/locks/heading")));
inst->addAction(new FGToggleAction(0, int(-SIX_W*0.6125), -SIX_W/16, SIX_W/4, SIX_W/8,
V("/autopilot/locks/heading")));
// Action: select NAV button
inst->addAction(0, int(-SIX_W*0.3625), -SIX_W/16, SIX_W/4, SIX_W/8,
new FGToggleAction(V("/autopilot/locks/nav1")));
inst->addAction(new FGToggleAction(0, int(-SIX_W*0.3625), -SIX_W/16, SIX_W/4, SIX_W/8,
V("/autopilot/locks/nav1")));
// Action: select ALT button
inst->addAction(0, int(-SIX_W*0.1125), -SIX_W/16, SIX_W/4, SIX_W/8,
new FGToggleAction(V("/autopilot/locks/altitude")));
inst->addAction(new FGToggleAction(0, int(-SIX_W*0.1125), -SIX_W/16, SIX_W/4, SIX_W/8,
V("/autopilot/locks/altitude")));
// Layer: AP background
inst->addLayer(tex["autopilotBG"], SIX_W*2, SIX_W/4);
@ -919,14 +929,18 @@ createAP (int x, int y)
new FGTexturedLayer(tex["hdgButtonOn"], SIX_W/4, SIX_W/8),
new FGTexturedLayer(tex["hdgButtonOff"], SIX_W/4, SIX_W/8));
inst->addLayer(sw);
inst->addTransformation(FGInstrumentLayer::XSHIFT, -SIX_W * 0.5);
inst->addTransformation
(new FGPanelTransformation(FGPanelTransformation::XSHIFT, 0,
0.0, 0.0, 1.0, -SIX_W * 0.5));
// Display NAV button
sw = new FGSwitchLayer(SIX_W/4, SIX_W/8, V("/autopilot/locks/nav1"),
new FGTexturedLayer(tex["navButtonOn"], SIX_W/4, SIX_W/8),
new FGTexturedLayer(tex["navButtonOff"], SIX_W/4, SIX_W/8));
inst->addLayer(sw);
inst->addTransformation(FGInstrumentLayer::XSHIFT, -SIX_W * 0.25);
inst->addTransformation
(new FGPanelTransformation(FGPanelTransformation::XSHIFT, 0,
0.0, 0.0, 1.0, -SIX_W * 0.25));
// Display ALT button
sw = new FGSwitchLayer(SIX_W/4, SIX_W/8, V("/autopilot/locks/altitude"),
@ -966,8 +980,12 @@ createDME (int x, int y)
text1, text2);
inst->addLayer(sw);
inst->addTransformation(FGInstrumentLayer::XSHIFT, -20);
inst->addTransformation(FGInstrumentLayer::YSHIFT, -6);
inst->addTransformation
(new FGPanelTransformation(FGPanelTransformation::XSHIFT, 0,
0.0, 0.0, 1.0, -20));
inst->addTransformation
(new FGPanelTransformation(FGPanelTransformation::YSHIFT, 0,
0.0, 0.0, 1.0, -6));
return inst;
}
@ -1002,10 +1020,8 @@ fgCreateSmallSinglePropPanel (int xpos, int ypos, int finx, int finy)
FGLayeredInstrument * inst =
new FGLayeredInstrument(gauge.x, gauge.y, gauge.w, gauge.h);
for (int j = 0; gauge.actions[j].action; j++) {
ActionData &action = gauge.actions[j];
inst->addAction(action.button, action.x, action.y, action.w, action.h,
action.action);
for (int j = 0; gauge.actions[j]; j++) {
inst->addAction(gauge.actions[j]);
}
for (int j = 0; gauge.layers[j].layer; j++) {
@ -1015,26 +1031,29 @@ fgCreateSmallSinglePropPanel (int xpos, int ypos, int finx, int finy)
for (int k = 0; layer.transformations[k].type; k++) {
TransData &trans = layer.transformations[k];
FGInstrumentLayer::transform_type type;
FGPanelTransformation::Type type;
switch (trans.type) {
case TransData::Rotation:
type = FGInstrumentLayer::ROTATION;
type = FGPanelTransformation::ROTATION;
break;
case TransData::XShift:
type = FGInstrumentLayer::XSHIFT;
type = FGPanelTransformation::XSHIFT;
break;
case TransData::YShift:
type = FGInstrumentLayer::YSHIFT;
type = FGPanelTransformation::YSHIFT;
break;
default:
break;
}
if (trans.propName != 0) {
inst->addTransformation(type, V(trans.propName),
trans.min, trans.max,
trans.factor, trans.offset);
inst->addTransformation
(new FGPanelTransformation(type, V(trans.propName),
trans.min, trans.max,
trans.factor, trans.offset));
} else {
inst->addTransformation(type, trans.offset);
inst->addTransformation
(new FGPanelTransformation(type, 0,
0.0, 0.0, 1.0, trans.offset));
}
}

View file

@ -44,5 +44,6 @@ libUIUCModel_a_SOURCES = \
uiuc_parsefile.cpp \
uiuc_recorder.cpp \
uiuc_warnings_errors.cpp \
uiuc_wrapper.cpp \
uiuc_wrapper.cpp
INCLUDES += -I$(top_builddir)