]> git.mxchange.org Git - flightgear.git/blobdiff - src/GUI/dialog.cxx
fix #416: reciprocal filter broken
[flightgear.git] / src / GUI / dialog.cxx
index fbf758b2979e9ed9f6f94775b7e9b6074094fa24..364cf5d1399d7acfa20d9232fe652d2f9c852dfc 100644 (file)
@@ -5,6 +5,8 @@
 #endif
 
 #include <simgear/structure/SGBinding.hxx>
+#include <simgear/props/props_io.hxx>
+
 #include <Scripting/NasalSys.hxx>
 #include <Main/fg_os.hxx>
 
@@ -369,7 +371,7 @@ void fgPopup::applySize(puObject *object)
 void FGDialog::ConditionalObject::update(FGDialog* aDlg)
 {
   if (_name == "visible") {
-    bool wasVis = _pu->isVisible();
+    bool wasVis = _pu->isVisible() != 0;
     bool newVis = test();
     
     if (newVis == wasVis) {
@@ -382,7 +384,7 @@ void FGDialog::ConditionalObject::update(FGDialog* aDlg)
       _pu->hide();
     }
   } else if (_name == "enable") {
-    bool wasEnabled = _pu->isActive();
+    bool wasEnabled = _pu->isActive() != 0;
     bool newEnable = test();
     
     if (wasEnabled == newEnable) {
@@ -1339,8 +1341,73 @@ fgList::update()
 
 void fgComboBox::update()
 {
+  if (_inHit) {
+    return;
+  }
+  
+  std::string curValue(getStringValue());
   fgValueList::update();
   newList(_list);
+  int currentItem = puaComboBox::getCurrentItem();
+
+  
+// look for the previous value, in the new list
+  for (int i = 0; _list[i] != 0; i++) {
+    if (_list[i] == curValue) {
+    // don't set the current item again; this is important to avoid
+    // recursion here if the combo callback ultimately causes another dialog-update
+      if (i != currentItem) {
+        puaComboBox::setCurrentItem(i);
+      }
+      
+      return;
+    }
+  } // of list values iteration
+  
+// cound't find current item, default to first
+  if (currentItem != 0) {
+    puaComboBox::setCurrentItem(0);
+  }
+}
+
+int fgComboBox::checkHit(int b, int up, int x, int y)
+{
+  _inHit = true;
+  int r = puaComboBox::checkHit(b, up, x, y);
+  _inHit = false;
+  return r;
+}
+
+void fgComboBox::setSize(int w, int h)
+{
+  puaComboBox::setSize(w, h);
+  recalc_bbox();
+}
+
+void fgComboBox::recalc_bbox()
+{
+// bug-fix for issue #192
+// http://code.google.com/p/flightgear-bugs/issues/detail?id=192
+// puaComboBox is including the height of its popupMenu in the height
+// computation, which breaks layout computations.
+// this implementation skips popup-menus
+  
+  puBox contents;
+  contents.empty();
+  
+  for (puObject *bo = dlist; bo != NULL; bo = bo -> getNextObject()) {
+    if (bo->getType() & PUCLASS_POPUPMENU) {
+      continue;
+    }
+    
+    contents.extend (bo -> getBBox()) ;
+  }
+  
+  abox.max[0] = abox.min[0] + contents.max[0] ;
+  abox.max[1] = abox.min[1] + contents.max[1] ;
+
+  puObject::recalc_bbox () ;
+
 }
 
 // end of dialog.cxx