#include "property_list.hxx"
#include "layout.hxx"
#include "WaypointList.hxx"
+#include "MapWidget.hxx"
enum format_type { f_INVALID, f_INT, f_LONG, f_FLOAT, f_DOUBLE, f_STRING };
static const int FORMAT_BUFSIZE = 255;
void FGDialog::ConditionalObject::update(FGDialog* aDlg)
{
if (_name == "visible") {
- bool wasVis = _pu->isVisible();
+ bool wasVis = _pu->isVisible() != 0;
bool newVis = test();
if (newVis == wasVis) {
_pu->hide();
}
} else if (_name == "enable") {
- bool wasEnabled = _pu->isActive();
+ bool wasEnabled = _pu->isActive() != 0;
bool newEnable = test();
if (wasEnabled == newEnable) {
setupObject(obj, props);
setColor(obj, props);
return obj;
-
+ } else if (type == "map") {
+ MapWidget* mapWidget = new MapWidget(x, y, x + width, y + height);
+ setupObject(mapWidget, props);
+ return mapWidget;
} else if (type == "combo") {
fgComboBox *obj = new fgComboBox(x, y, x + width, y + height, props,
props->getBoolValue("editable", false));
name = "";
const char *propname = props->getStringValue("property");
SGPropertyNode_ptr node = fgGetNode(propname, true);
- copy_to_pui(node, object);
+ if (type == "map") {
+ // mapWidget binds to a sub-tree of properties, and
+ // ignroes the puValue mechanism, so special case things here
+ MapWidget* mw = static_cast<MapWidget*>(object);
+ mw->setProperty(node);
+ } else {
+ // normal widget, creating PropertyObject
+ copy_to_pui(node, object);
+ PropertyObject *po = new PropertyObject(name, object, node);
+ _propertyObjects.push_back(po);
+ if (props->getBoolValue("live"))
+ _liveObjects.push_back(po);
+ }
+
- PropertyObject *po = new PropertyObject(name, object, node);
- _propertyObjects.push_back(po);
- if (props->getBoolValue("live"))
- _liveObjects.push_back(po);
}
SGPropertyNode *dest = fgGetNode("/sim/bindings/gui", true);
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