]> git.mxchange.org Git - flightgear.git/blobdiff - src/GUI/new_gui.cxx
Don't restore initial screen geometry because there is nothing in fg_os* to resize...
[flightgear.git] / src / GUI / new_gui.cxx
index a0885b845caad84022e1c7b4f96a098f62615c34..4cb0fe882967e714be275e458036a7afc64cb620 100644 (file)
@@ -26,7 +26,7 @@ extern puFont FONT_SANS_12B;
 
 
 NewGUI::NewGUI ()
-    : _font(FONT_HELVETICA_14),
+    : _fontcache(new FGFontCache),
       _menubar(new FGMenuBar),
       _active_dialog(0)
 {
@@ -34,7 +34,8 @@ NewGUI::NewGUI ()
 
 NewGUI::~NewGUI ()
 {
-    clear();
+    delete _menubar;
+    _dialog_props.clear();
 }
 
 void
@@ -51,25 +52,47 @@ NewGUI::init ()
 
 void
 NewGUI::reinit ()
+{
+    reset(true);
+}
+
+void
+NewGUI::redraw ()
+{
+    reset(false);
+}
+
+void
+NewGUI::reset (bool reload)
 {
     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++) {
+    for (iter = _active_dialogs.begin(); iter != _active_dialogs.end(); ++iter)
         dlg.push_back(iter->first);
-        closeDialog(iter->first);
-    }
 
-    unbind();
-    clear();
+    unsigned int i;
+    for (i = 0; i < dlg.size(); i++)
+        closeDialog(dlg[i]);
+
     setStyle();
+
+    unbind();
+    delete _menubar;
     _menubar = new FGMenuBar;
-    init();
+
+    if (reload) {
+        _dialog_props.clear();
+        init();
+    } else {
+        _menubar->init();
+    }
+
     bind();
 
-    // open remembered dialogs again (no nasal generated ones, unfortunately)
-//    for (unsigned int i = 0; i < dlg.size(); i++)
-//        showDialog(dlg[i]);
+    // open dialogs again
+    for (i = 0; i < dlg.size(); i++)
+        showDialog(dlg[i]);
 }
 
 void
@@ -147,8 +170,9 @@ NewGUI::getDialog (const string &name)
 {
     if(_dialog_props.find(name) != _dialog_props.end())
         return _dialog_props[name];
-    else
-        return 0;
+
+    SG_LOG(SG_GENERAL, SG_ALERT, "dialog '" << name << "' missing");
+    return 0;
 }
 
 void
@@ -184,18 +208,6 @@ NewGUI::setMenuBarVisible (bool visible)
         _menubar->hide();
 }
 
-void
-NewGUI::clear ()
-{
-    delete _menubar;
-    _menubar = 0;
-    _dialog_props.clear();
-    _itt_t it;
-    for (it = _colors.begin(); it != _colors.end(); ++it)
-      delete it->second;
-    _colors.clear();
-}
-
 static bool
 test_extension (const char * path, const char * ext)
 {
@@ -218,7 +230,7 @@ NewGUI::newDialog (SGPropertyNode* props)
         return;
     }
     string name = cname;
-    if(!_active_dialogs[name])
+    if(_active_dialogs.find(name) == _active_dialogs.end())
         _dialog_props[name] = props;
 }
 
@@ -289,16 +301,17 @@ NewGUI::setStyle (void)
     _colors["label"]      = new FGColor(0.0f, 0.0f, 0.0f, 1.0f);
     _colors["legend"]     = new FGColor(0.0f, 0.0f, 0.0f, 1.0f);
     _colors["misc"]       = new FGColor(0.0f, 0.0f, 0.0f, 1.0f);
+    _colors["inputfield"] = new FGColor(0.8f, 0.7f, 0.7f, 1.0f);
 
     //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++) {
@@ -333,38 +346,9 @@ static const struct {
 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 = _fontcache->get(node);
+    puSetDefaultFonts(*_font, *_font);
+    return;
 }
 
 
@@ -421,7 +405,7 @@ FGFontCache::FGFontCache()
     }
 
     for (int i=0; guifonts[i].name; i++)
-        _fonts[guifonts[i].name] = guifonts[i].font;
+        _fonts[guifonts[i].name] = new fnt(guifonts[i].font);
 }
 
 FGFontCache::~FGFontCache()
@@ -432,33 +416,26 @@ FGFontCache::~FGFontCache()
 puFont *
 FGFontCache::get(const char *name, float size, float slant)
 {
-    puFont *font;
     _itt_t it;
 
-    if ((it = _fonts.find(name)) == _fonts.end())
-    {
-        SGPath path(_path);
-        path.append(name);
-
-        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);
-        }
-    }
-    else
-    {
-        font = it->second;
+    if ((it = _fonts.find(name)) != _fonts.end())
+        return it->second->pufont;
+
+    SGPath path(_path);
+    path.append(name);
+
+    fnt *f = new fnt();
+    f->texfont = new fntTexFont;
+
+    if (f->texfont->load((char *)path.c_str())) {
+        f->pufont = new puFont;
+        f->pufont->initialize(static_cast<fntFont *>(f->texfont), size, slant);
+        _fonts[name] = f;
+        return f->pufont;
     }
 
-    return font;
+    delete f;
+    return _fonts["default"]->pufont;
 }
 
 puFont *