diff --git a/src/GUI/FGPUIDialog.cxx b/src/GUI/FGPUIDialog.cxx index 23ee3ca78..54e661a89 100644 --- a/src/GUI/FGPUIDialog.cxx +++ b/src/GUI/FGPUIDialog.cxx @@ -101,8 +101,8 @@ validate_format(const char *f) // class fgPopup : public puPopup { public: - fgPopup(int x, int y, bool r = true, bool d = true) : - puPopup(x, y), _draggable(d), _resizable(r), _dragging(false) + fgPopup(FGPUIDialog *parent_dialog, int x, int y, bool r = true, bool d = true) : + puPopup(x, y), _draggable(d), _resizable(r), _dragging(false), parentDialog(parent_dialog) {} int checkHit(int b, int up, int x, int y); int checkKey(int key, int updown); @@ -114,6 +114,7 @@ public: private: enum { LEFT = 1, RIGHT = 2, TOP = 4, BOTTOM = 8 }; bool _draggable; + FGPUIDialog *parentDialog; bool _resizable; bool _dragging; int _resizing; @@ -310,9 +311,15 @@ puObject *fgPopup::getActiveInputField(puObject *object) int fgPopup::checkHit(int button, int updown, int x, int y) { int result = 0; - if (updown != PU_DRAG && !_dragging) + // still need to ensure that the hit is within this window. The code used to check _dragging + // as well, however that had the unfortunate side effect of allowing clicks to pass through to + // the underlying window. RJH-07-08-18. + if (updown == PU_UP || updown == PU_DOWN){ result = puPopup::checkHit(button, updown, x, y); - + if (result && parentDialog) { + fgSetString("/sim/gui/dialogs/current-dialog", parentDialog->getName()); + } + } if (!_draggable) return result; @@ -567,7 +574,6 @@ action_callback (puObject *object) gui->setActiveDialog(0); } - //////////////////////////////////////////////////////////////////////// // Static helper functions. //////////////////////////////////////////////////////////////////////// @@ -662,7 +668,7 @@ FGPUIDialog::FGPUIDialog (SGPropertyNode *props) : _needsRelayout(false) { _module = string("__dlg:") + props->getStringValue("name", "[unnamed]"); - + _name = props->getStringValue("name", "[unnamed]"); SGPropertyNode *nasal = props->getNode("nasal"); if (nasal) { _nasal_close = nasal->getNode("close"); @@ -710,6 +716,14 @@ FGPUIDialog::~FGPUIDialog () } } +void FGPUIDialog::bringToFront() { + puMoveToLast(_object); +} +std::string FGPUIDialog::getName() +{ + return _name; +} + void FGPUIDialog::updateValues(const std::string& objectName) { @@ -833,6 +847,9 @@ FGPUIDialog::display (SGPropertyNode *props) // configuration file or from the layout widget. _object = makeObject(props, screenw, screenh); + //if (_object->getParent()) + // _object->getParent()-> //setActiveCallback(FGPUIDialog_active_callback); + // Remove automatically generated properties, so the layout looks // the same next time around, or restore x and y to preserve negative coords. if (userx) @@ -880,7 +897,7 @@ FGPUIDialog::makeObject (SGPropertyNode *props, int parentWidth, int parentHeigh if (props->getBoolValue("modal", false)) obj = new puDialogBox(x, y); else - obj = new fgPopup(x, y, resizable, draggable); + obj = new fgPopup(this, x, y, resizable, draggable); setupGroup(obj, props, width, height, true); setColor(obj, props); return obj; @@ -1084,7 +1101,6 @@ FGPUIDialog::setupObject (puObject *object, SGPropertyNode *props) object->setLabelPlace(PUPLACE_CENTERED_RIGHT); object->makeReturnDefault(props->getBoolValue("default")); info->node = props; - if (props->hasValue("legend")) { info->legend = props->getStringValue("legend"); object->setLegend(info->legend.c_str()); diff --git a/src/GUI/FGPUIDialog.hxx b/src/GUI/FGPUIDialog.hxx index 104760cfa..c91070935 100644 --- a/src/GUI/FGPUIDialog.hxx +++ b/src/GUI/FGPUIDialog.hxx @@ -100,7 +100,9 @@ public: void setNeedsLayout() { _needsRelayout = true; } - + virtual std::string getName(); + virtual void bringToFront(); + class ActiveWidget { public: @@ -164,6 +166,7 @@ private: std::string _module; SGPropertyNode_ptr _nasal_close; + std::string _name; // PUI provides no way for userdata to be deleted automatically // with a GUI object, so we have to keep track of all the special // data we allocated and then free it manually when the dialog diff --git a/src/GUI/dialog.hxx b/src/GUI/dialog.hxx index e79d8ea3e..6bcb7e2c2 100644 --- a/src/GUI/dialog.hxx +++ b/src/GUI/dialog.hxx @@ -59,6 +59,8 @@ public: */ virtual void update () = 0; + virtual std::string getName() { return std::string(); } + virtual void bringToFront() {} protected: /** * Construct a new GUI widget configured by a property tree. diff --git a/src/GUI/new_gui.cxx b/src/GUI/new_gui.cxx index 58cd8dfa2..eb72646b9 100644 --- a/src/GUI/new_gui.cxx +++ b/src/GUI/new_gui.cxx @@ -201,16 +201,20 @@ bool NewGUI::showDialog (const string &name) { // first, check if it's already shown - if (_active_dialogs.find(name) != _active_dialogs.end()) - return true; + if (_active_dialogs.find(name) != _active_dialogs.end()){ + _active_dialogs[name]->bringToFront(); + return true; + } // check we know about the dialog by name if (_dialog_names.find(name) == _dialog_names.end()) { SG_LOG(SG_GENERAL, SG_ALERT, "Dialog " << name << " not defined"); return false; } - _active_dialogs[name] = new FGPUIDialog(getDialogProperties(name)); + fgSetString("/sim/gui/dialogs/current-dialog", name); + +// setActiveDialog(new FGPUIDialog(getDialogProperties(name))); return true; } @@ -289,6 +293,9 @@ NewGUI::getDialog (const string &name) void NewGUI::setActiveDialog (FGDialog * dialog) { + if (dialog){ + fgSetString("/sim/gui/dialogs/current-dialog", dialog->getName()); + } _active_dialog = dialog; }