NewGUI::NewGUI ()
: _menubar(new FGMenuBar),
- _current_widget(0)
+ _active_dialog(0)
{
}
NewGUI::~NewGUI ()
{
- delete _menubar;
+ clear();
}
void
{
char path1[1024];
char path2[1024];
- ulMakePath(path1, getenv("FG_ROOT"), "gui");
+ ulMakePath(path1, globals->get_fg_root().c_str(), "gui");
ulMakePath(path2, path1, "dialogs");
readDir(path2);
#if !defined(FG_OLD_MENUBAR)
#endif
}
+void
+NewGUI::reinit ()
+{
+ unbind();
+ clear();
+ _menubar = new FGMenuBar;
+ init();
+ bind();
+}
+
+void
+NewGUI::bind ()
+{
+ fgTie("/sim/menubar/visibility", this,
+ &NewGUI::getMenuBarVisible, &NewGUI::setMenuBarVisible);
+}
+
+void
+NewGUI::unbind ()
+{
+ fgUntie("/sim/menubar/visibility");
+}
+
void
NewGUI::update (double delta_time_sec)
{
// NO OP
}
-void
-NewGUI::display (const string &name)
+bool
+NewGUI::showDialog (const string &name)
{
- if (_widgets.find(name) == _widgets.end())
+ if (_dialog_props.find(name) == _dialog_props.end()) {
SG_LOG(SG_GENERAL, SG_ALERT, "Dialog " << name << " not defined");
- else
- new FGDialog(_widgets[name]);
+ return false;
+ } else {
+ new FGDialog(_dialog_props[name]); // it will be deleted by a callback
+ return true;
+ }
+}
+
+bool
+NewGUI::closeActiveDialog ()
+{
+ if (_active_dialog == 0) {
+ return false;
+ } else {
+ delete _active_dialog;
+ _active_dialog = 0;
+ return true;
+ }
}
void
-NewGUI::setCurrentWidget (FGDialog * widget)
+NewGUI::setActiveDialog (FGDialog * dialog)
{
- _current_widget = widget;
+ _active_dialog = dialog;
}
FGDialog *
-NewGUI::getCurrentWidget ()
+NewGUI::getActiveDialog ()
{
- return _current_widget;
+ return _active_dialog;
}
FGMenuBar *
return _menubar;
}
+bool
+NewGUI::getMenuBarVisible () const
+{
+ return _menubar->isVisible();
+}
+
+void
+NewGUI::setMenuBarVisible (bool visible)
+{
+ if (visible)
+ _menubar->show();
+ else
+ _menubar->hide();
+}
+
+void
+NewGUI::clear ()
+{
+ delete _menubar;
+ _menubar = 0;
+
+ map<string,SGPropertyNode *>::iterator it;
+ for (it = _dialog_props.begin(); it != _dialog_props.end(); it++)
+ delete it->second;
+ _dialog_props.clear();
+}
+
+static bool
+test_extension (const char * path, const char * ext)
+{
+ int pathlen = strlen(path);
+ int extlen = strlen(ext);
+
+ for (int i = 1; i <= pathlen && i <= extlen; i++) {
+ if (path[pathlen-i] != ext[extlen-i])
+ return false;
+ }
+ return true;
+}
+
void
NewGUI::readDir (const char * path)
{
return;
}
- ulDirEnt * dirEnt = ulReadDir(dir);
- while (dirEnt != 0) {
+ for (ulDirEnt * dirEnt = ulReadDir(dir);
+ dirEnt != 0;
+ dirEnt = ulReadDir(dir)) {
+
char subpath[1024];
ulMakePath(subpath, path, dirEnt->d_name);
- if (dirEnt->d_isdir && dirEnt->d_name[0] != '.') {
- readDir(subpath);
- } else {
- SGPropertyNode_ptr props = new SGPropertyNode;
+ if (!dirEnt->d_isdir && test_extension(subpath, ".xml")) {
+ SGPropertyNode * props = new SGPropertyNode;
try {
readProperties(subpath, props);
} catch (const sg_exception &ex) {
- SG_LOG(SG_INPUT, SG_ALERT, "Error parsing GUI file "
+ SG_LOG(SG_INPUT, SG_ALERT, "Error parsing dialog "
<< subpath);
+ delete props;
+ continue;
}
if (!props->hasValue("name")) {
- SG_LOG(SG_INPUT, SG_WARN, "GUI file " << subpath
+ SG_LOG(SG_INPUT, SG_WARN, "dialog " << subpath
<< " has no name; skipping.");
- } else {
- string name = props->getStringValue("name");
- SG_LOG(SG_INPUT, SG_BULK, "Saving GUI node " << name);
- _widgets[name] = props;
+ delete props;
+ continue;
}
+ string name = props->getStringValue("name");
+ SG_LOG(SG_INPUT, SG_BULK, "Saving dialog " << name);
+ if (_dialog_props[name] != 0)
+ delete _dialog_props[name];
+ _dialog_props[name] = props;
}
- dirEnt = ulReadDir(dir);
}
ulCloseDir(dir);
}