X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2Fnew_gui.cxx;h=ff9c7ad3c337c370a9ed1d79f66e50589fb83778;hb=5cad5aa7da2476ca8323a61f81dea59676dca085;hp=2eedc1674457274b80ac3e57aa4f4a6efdbd409e;hpb=cff9e518403376c4b11d8fc9002a352b58d1a93b;p=flightgear.git diff --git a/src/GUI/new_gui.cxx b/src/GUI/new_gui.cxx index 2eedc1674..ff9c7ad3c 100644 --- a/src/GUI/new_gui.cxx +++ b/src/GUI/new_gui.cxx @@ -1,4 +1,9 @@ // new_gui.cxx: implementation of XML-configurable GUI support. +#include +#include +#include +#include +#include #include "new_gui.hxx" @@ -7,6 +12,7 @@ #include #include +#include #include
@@ -26,8 +32,7 @@ extern puFont FONT_SANS_12B; NewGUI::NewGUI () - : _font(FONT_HELVETICA_14), - _menubar(new FGMenuBar), + : _menubar(new FGMenuBar), _active_dialog(0) { } @@ -36,6 +41,8 @@ NewGUI::~NewGUI () { delete _menubar; _dialog_props.clear(); + for (_itt_t it = _colors.begin(); it != _colors.end(); ++it) + delete it->second; } void @@ -54,6 +61,7 @@ void NewGUI::reinit () { reset(true); + fgSetBool("/sim/signals/reinit-gui", true); } void @@ -166,12 +174,22 @@ NewGUI::closeDialog (const string& name) } SGPropertyNode_ptr -NewGUI::getDialog (const string &name) +NewGUI::getDialogProperties (const string &name) { if(_dialog_props.find(name) != _dialog_props.end()) return _dialog_props[name]; - SG_LOG(SG_GENERAL, SG_ALERT, "dialog '" << name << "' missing"); + SG_LOG(SG_GENERAL, SG_DEBUG, "dialog '" << name << "' missing"); + return 0; +} + +FGDialog * +NewGUI::getDialog (const string &name) +{ + if(_active_dialogs.find(name) != _active_dialogs.end()) + return _active_dialogs[name]; + + SG_LOG(SG_GENERAL, SG_DEBUG, "dialog '" << name << "' missing"); return 0; } @@ -305,13 +323,13 @@ NewGUI::setStyle (void) //puSetDefaultStyle(); - int which = fgGetInt("/sim/current-gui", 0); - SGPropertyNode *sim = globals->get_props()->getNode("sim"); - SGPropertyNode *n = sim->getChild("gui", which); + int which = fgGetInt("/sim/gui/current-style", 0); + SGPropertyNode *sim = globals->get_props()->getNode("sim/gui", true); + SGPropertyNode *n = sim->getChild("style", which); if (!n) - n = sim->getChild("gui", 0, true); + n = sim->getChild("style", 0, true); - setupFont(n->getNode("font", true)); + setupFont(n->getNode("fonts/gui", true)); n = n->getNode("colors", true); for (int i = 0; i < n->nChildren(); i++) { @@ -324,60 +342,12 @@ NewGUI::setStyle (void) } - - -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 }, - { "SANS_12B", &FONT_SANS_12B }, - { 0, 0 } -}; - void NewGUI::setupFont (SGPropertyNode *node) { - 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); - node->setStringValue("name", fontname.c_str()); + _font = globals->get_fontcache()->get(node); + puSetDefaultFonts(*_font, *_font); + return; } @@ -387,6 +357,12 @@ NewGUI::setupFont (SGPropertyNode *node) // FGColor class. //////////////////////////////////////////////////////////////////////// +void +FGColor::print() const { + std::cerr << "red=" << _red << ", green=" << _green + << ", blue=" << _blue << ", alpha=" << _alpha << std::endl; +} + bool FGColor::merge(const SGPropertyNode *node) { @@ -422,61 +398,126 @@ FGColor::merge(const FGColor *color) } -// -FGFontCache::FGFontCache() + + +//////////////////////////////////////////////////////////////////////// +// FGFontCache class. +//////////////////////////////////////////////////////////////////////// + +namespace { - char *envp = ::getenv("FG_FONTS"); - if (envp != NULL) { - _path.set(envp); - } else { - _path.set(globals->get_fg_root()); - _path.append("Fonts"); - } +struct GuiFont +{ + const char *name; + puFont *font; + struct Predicate + : public std::unary_function + { + Predicate(const char* name_) : name(name_) {} + bool operator() (const GuiFont& f1) const + { + return std::strcmp(f1.name, name) == 0; + } + const char* name; + }; +}; + +const GuiFont 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 }, + { "SANS_12B", &FONT_SANS_12B } +}; - for (int i=0; guifonts[i].name; i++) - _fonts[guifonts[i].name] = guifonts[i].font; +const GuiFont* guifontsEnd = &guifonts[sizeof(guifonts)/ sizeof(guifonts[0])]; } -FGFontCache::~FGFontCache() +FGFontCache::FGFontCache() : + _initialized(false) { - _fonts.clear(); } -puFont * -FGFontCache::get(const char *name, float size, float slant) +FGFontCache::~FGFontCache() { - puFont *font; - _itt_t it; + PuFontMap::iterator it, end = _puFonts.end(); + for (it = _puFonts.begin(); it != end; ++it) + delete it->second; +} - if ((it = _fonts.find(name)) == _fonts.end()) - { - SGPath path(_path); - path.append(name); +inline bool FGFontCache::FntParamsLess::operator()(const FntParams& f1, + const FntParams& f2) const +{ + int comp = f1.name.compare(f2.name); + if (comp < 0) + return true; + else if (comp > 0) + return false; + if (f1.size < f2.size) + return true; + else if (f1.size > f2.size) + return false; + return f1.slant < f2.slant; +} - fntTexFont tex_font; - if (tex_font.load((char *)path.c_str())) - { - font = new puFont; - font->initialize((fntFont *)&tex_font, size, slant); - _fonts[name] = font; - } - else - { - font = _fonts["default"]; - // puSetDefaultFonts(font, font); +struct FGFontCache::fnt * +FGFontCache::getfnt(const char *name, float size, float slant) +{ + string fontName(name); + FntParams fntParams(fontName, size, slant); + PuFontMap::iterator i = _puFonts.find(fntParams); + if (i != _puFonts.end()) + return i->second; + // fntTexFont s are all preloaded into the _texFonts map + TexFontMap::iterator texi = _texFonts.find(fontName); + fntTexFont* texfont = 0; + puFont* pufont = 0; + if (texi != _texFonts.end()) { + texfont = texi->second; + } else { + const GuiFont* guifont = std::find_if(&guifonts[0], guifontsEnd, + GuiFont::Predicate(name)); + if (guifont != guifontsEnd) { + pufont = guifont->font; } } - else - { - font = it->second; + fnt* f = new fnt; + if (pufont) { + f->pufont = pufont; + } else if (texfont) { + f->texfont = texfont; + f->pufont = new puFont; + f->pufont->initialize(static_cast(f->texfont), size, slant); + } else { + f->pufont = guifonts[0].font; } + _puFonts[fntParams] = f; + return f; +} - return font; +puFont * +FGFontCache::get(const char *name, float size, float slant) +{ + return getfnt(name, size, slant)->pufont; +} + +fntTexFont * +FGFontCache::getTexFont(const char *name, float size, float slant) +{ + return getfnt(name, size, slant)->texfont; } puFont * FGFontCache::get(SGPropertyNode *node) { + if (!node) + return get("Helvetica.txf", 15.0, 0.0); + const char *name = node->getStringValue("name", "Helvetica.txf"); float size = node->getFloatValue("size", 15.0); float slant = node->getFloatValue("slant", 0.0); @@ -484,4 +525,58 @@ FGFontCache::get(SGPropertyNode *node) return get(name, size, slant); } +void FGFontCache::init() +{ + if (!_initialized) { + char *envp = ::getenv("FG_FONTS"); + if (envp != NULL) { + _path.set(envp); + } else { + _path.set(globals->get_fg_root()); + _path.append("Fonts"); + } + _initialized = true; + } +} + +SGPath +FGFontCache::getfntpath(const char *name) +{ + init(); + SGPath path(_path); + if (name && std::string(name) != "") { + path.append(name); + if (path.exists()) + return path; + } + + path = SGPath(_path); + path.append("Helvetica.txf"); + + return path; +} + +bool FGFontCache::initializeFonts() +{ + static string fontext("txf"); + init(); + ulDir* fontdir = ulOpenDir(_path.c_str()); + if (!fontdir) + return false; + const ulDirEnt *dirEntry; + while ((dirEntry = ulReadDir(fontdir)) != 0) { + SGPath path(_path); + path.append(dirEntry->d_name); + if (path.extension() == fontext) { + fntTexFont* f = new fntTexFont; + if (f->load((char *)path.c_str())) + _texFonts[string(dirEntry->d_name)] = f; + else + delete f; + } + } + ulCloseDir(fontdir); + return true; +} + // end of new_gui.cxx