- add gui color support: maintain color map with default colors and all
colors from /sim/gui/colors/ into map; - set default color scheme - handle fonts - implement color class - close all dialogs on reinit, set up style again, and then reopen all (non-nasal generated) dialogs again
This commit is contained in:
parent
9b47b1b15b
commit
e1a5398e4f
2 changed files with 212 additions and 2 deletions
|
@ -15,16 +15,32 @@
|
||||||
|
|
||||||
SG_USING_STD(map);
|
SG_USING_STD(map);
|
||||||
|
|
||||||
|
extern puFont FONT_HELVETICA_14;
|
||||||
|
extern puFont FONT_VERA_12B;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
// Implementation of NewGUI.
|
// Implementation of NewGUI.
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NewGUI::NewGUI ()
|
NewGUI::NewGUI ()
|
||||||
: _menubar(new FGMenuBar),
|
: _font(FONT_HELVETICA_14),
|
||||||
|
_menubar(new FGMenuBar),
|
||||||
_active_dialog(0)
|
_active_dialog(0)
|
||||||
{
|
{
|
||||||
|
// set up the traditional colors as default
|
||||||
|
_colors["background"] = FGColor(0.8f, 0.8f, 0.9f, 0.85f);
|
||||||
|
_colors["foreground"] = FGColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
_colors["highlight"] = FGColor(0.7f, 0.7f, 0.7f, 1.0f);
|
||||||
|
_colors["label"] = FGColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
_colors["legend"] = FGColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
_colors["misc"] = FGColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
setStyle();
|
||||||
}
|
}
|
||||||
|
|
||||||
NewGUI::~NewGUI ()
|
NewGUI::~NewGUI ()
|
||||||
|
@ -46,11 +62,24 @@ NewGUI::init ()
|
||||||
void
|
void
|
||||||
NewGUI::reinit ()
|
NewGUI::reinit ()
|
||||||
{
|
{
|
||||||
|
map<string,FGDialog *>::iterator iter;
|
||||||
|
vector<string> dlg;
|
||||||
|
// close all open dialogs and remember them ...
|
||||||
|
for (iter = _active_dialogs.begin(); iter != _active_dialogs.end(); iter++) {
|
||||||
|
dlg.push_back(iter->first);
|
||||||
|
closeDialog(iter->first);
|
||||||
|
}
|
||||||
|
|
||||||
unbind();
|
unbind();
|
||||||
clear();
|
clear();
|
||||||
|
setStyle();
|
||||||
_menubar = new FGMenuBar;
|
_menubar = new FGMenuBar;
|
||||||
init();
|
init();
|
||||||
bind();
|
bind();
|
||||||
|
|
||||||
|
// open remembered dialogs again (no nasal generated ones, unfortunately)
|
||||||
|
for (unsigned int i = 0; i < dlg.size(); i++)
|
||||||
|
showDialog(dlg[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -236,4 +265,125 @@ NewGUI::readDir (const char * path)
|
||||||
ulCloseDir(dir);
|
ulCloseDir(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// Style handling.
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void
|
||||||
|
NewGUI::setStyle (void)
|
||||||
|
{
|
||||||
|
setupFont();
|
||||||
|
|
||||||
|
//puSetDefaultStyle();
|
||||||
|
|
||||||
|
SGPropertyNode *n = fgGetNode("/sim/gui/colors");
|
||||||
|
if (!n)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (int i = 0; i < n->nChildren(); i++) {
|
||||||
|
SGPropertyNode *child = n->getChild(i);
|
||||||
|
_colors[child->getName()] = FGColor(child);
|
||||||
|
}
|
||||||
|
|
||||||
|
FGColor c = _colors["background"];
|
||||||
|
puSetDefaultColourScheme(c.red(), c.green(), c.blue(), c.alpha());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
char *name;
|
||||||
|
puFont font;
|
||||||
|
} guifonts[] = {
|
||||||
|
"default", FONT_HELVETICA_14,
|
||||||
|
"FIXED_8x13", PUFONT_8_BY_13,
|
||||||
|
"FIXED_9x15", PUFONT_9_BY_15,
|
||||||
|
"TIMES_10", PUFONT_TIMES_ROMAN_10,
|
||||||
|
"TIMES_24", PUFONT_TIMES_ROMAN_24,
|
||||||
|
"HELVETICA_10", PUFONT_HELVETICA_10,
|
||||||
|
"HELVETICA_12", PUFONT_HELVETICA_12,
|
||||||
|
"HELVETICA_14", FONT_HELVETICA_14,
|
||||||
|
"HELVETICA_18", PUFONT_HELVETICA_18,
|
||||||
|
"VERA_12B", FONT_VERA_12B,
|
||||||
|
0, 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
NewGUI::setupFont ()
|
||||||
|
{
|
||||||
|
SGPropertyNode *node = fgGetNode("/sim/gui/font", true);
|
||||||
|
string fontname = node->getStringValue("name", "Helvetica.txf");
|
||||||
|
float size = node->getFloatValue("size", 15.0);
|
||||||
|
float slant = node->getFloatValue("slant", 0.0);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; guifonts[i].name; i++)
|
||||||
|
if (fontname == guifonts[i].name)
|
||||||
|
break;
|
||||||
|
if (guifonts[i].name)
|
||||||
|
_font = guifonts[i].font;
|
||||||
|
else {
|
||||||
|
SGPath fontpath;
|
||||||
|
char* envp = ::getenv("FG_FONTS");
|
||||||
|
if (envp != NULL) {
|
||||||
|
fontpath.set(envp);
|
||||||
|
} else {
|
||||||
|
fontpath.set(globals->get_fg_root());
|
||||||
|
fontpath.append("Fonts");
|
||||||
|
}
|
||||||
|
|
||||||
|
SGPath path(fontpath);
|
||||||
|
path.append(fontname);
|
||||||
|
|
||||||
|
if (_tex_font.load((char *)path.c_str())) {
|
||||||
|
_font.initialize((fntFont *)&_tex_font, size, slant);
|
||||||
|
} else {
|
||||||
|
_font = guifonts[0].font;
|
||||||
|
fontname = "default";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
puSetDefaultFonts(_font, _font);
|
||||||
|
fgSetString("/sim/gui/font", fontname.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// FGColor class.
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void
|
||||||
|
FGColor::merge(const SGPropertyNode *node)
|
||||||
|
{
|
||||||
|
if (!node)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const SGPropertyNode * n;
|
||||||
|
if ((n = node->getNode("red")))
|
||||||
|
_red = n->getFloatValue();
|
||||||
|
if ((n = node->getNode("green")))
|
||||||
|
_green = n->getFloatValue();
|
||||||
|
if ((n = node->getNode("blue")))
|
||||||
|
_blue = n->getFloatValue();
|
||||||
|
if ((n = node->getNode("alpha")))
|
||||||
|
_alpha = n->getFloatValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FGColor::merge(const FGColor& color)
|
||||||
|
{
|
||||||
|
if (color._red >= 0.0)
|
||||||
|
_red = color._red;
|
||||||
|
if (color._green >= 0.0)
|
||||||
|
_green = color._green;
|
||||||
|
if (color._blue >= 0.0)
|
||||||
|
_blue = color._blue;
|
||||||
|
if (color._alpha >= 0.0)
|
||||||
|
_alpha = color._alpha;
|
||||||
|
}
|
||||||
|
|
||||||
// end of new_gui.cxx
|
// end of new_gui.cxx
|
||||||
|
|
|
@ -28,6 +28,7 @@ SG_USING_STD(map);
|
||||||
class FGMenuBar;
|
class FGMenuBar;
|
||||||
class FGDialog;
|
class FGDialog;
|
||||||
class FGBinding;
|
class FGBinding;
|
||||||
|
class FGColor;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -150,6 +151,9 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual FGDialog * getActiveDialog ();
|
virtual FGDialog * getActiveDialog ();
|
||||||
|
|
||||||
|
const FGColor& getColor (const char * which) { return _colors[which]; }
|
||||||
|
const FGColor& getColor (string which) { return _colors[which.c_str()]; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -166,8 +170,13 @@ protected:
|
||||||
*/
|
*/
|
||||||
virtual void setMenuBarVisible (bool visible);
|
virtual void setMenuBarVisible (bool visible);
|
||||||
|
|
||||||
|
virtual void setStyle ();
|
||||||
|
virtual void setupFont ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
fntTexFont _tex_font;
|
||||||
|
puFont _font;
|
||||||
|
map<string,FGColor> _colors;
|
||||||
|
|
||||||
// Free all allocated memory.
|
// Free all allocated memory.
|
||||||
void clear ();
|
void clear ();
|
||||||
|
@ -183,5 +192,56 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class FGColor {
|
||||||
|
public:
|
||||||
|
FGColor() { clear(); }
|
||||||
|
FGColor(float r, float g, float b, float a = 1.0f) { set(r, g, b, a); }
|
||||||
|
FGColor(const SGPropertyNode *prop) { set(prop); }
|
||||||
|
|
||||||
|
FGColor& operator=(const FGColor& c) {
|
||||||
|
_red = c._red;
|
||||||
|
_green = c._green;
|
||||||
|
_blue = c._blue;
|
||||||
|
_alpha = c._alpha;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void clear() { _red = _green = _blue = -1.0f; _alpha = 1.0f; }
|
||||||
|
// merges in non-negative components from property with children <red> etc.
|
||||||
|
void merge(const SGPropertyNode *prop);
|
||||||
|
void merge(const FGColor& color);
|
||||||
|
|
||||||
|
void set(const SGPropertyNode *prop) { clear(); merge(prop); };
|
||||||
|
void set(const FGColor& color) { clear(); merge(color); }
|
||||||
|
void set(float r, float g, float b, float a = 1.0f) {
|
||||||
|
_red = clamp(r), _green = clamp(g), _blue = clamp(b), _alpha = clamp(a);
|
||||||
|
}
|
||||||
|
bool isValid() const {
|
||||||
|
return _red >= 0.0 && _green >= 0.0 && _blue >= 0.0
|
||||||
|
&& _alpha >= 0.0;
|
||||||
|
}
|
||||||
|
void print() const {
|
||||||
|
std::cerr << "red=" << _red << ", green=" << _green
|
||||||
|
<< ", blue=" << _blue << ", alpha=" << _alpha << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void setRed(float red) { _red = clamp(red); }
|
||||||
|
inline void setGreen(float green) { _green = clamp(green); }
|
||||||
|
inline void setBlue(float blue) { _blue = clamp(blue); }
|
||||||
|
inline void setAlpha(float alpha) { _alpha = clamp(alpha); }
|
||||||
|
|
||||||
|
inline float red() const { return _red; }
|
||||||
|
inline float green() const { return _green; }
|
||||||
|
inline float blue() const { return _blue; }
|
||||||
|
inline float alpha() const { return _alpha; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
float _red, _green, _blue, _alpha;
|
||||||
|
|
||||||
|
private:
|
||||||
|
float clamp(float f) { return f < 0.0 ? 0.0 : f > 1.0 ? 1.0 : f; }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // __NEW_GUI_HXX
|
#endif // __NEW_GUI_HXX
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue