// preset_dlg.cxx -- Preset dialogs and funcitons // // Written by Curtis Olson, started November 2002. // // Copyright (C) 2002 Curtis L. Olson - curt@flightgear.org // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as // published by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // $Id$ #ifdef HAVE_CONFIG_H # include #endif #include #ifdef HAVE_WINDOWS_H # include #endif // #include // #include // #include #include // #include // #include // #include #include #include #include
#include
#include #include "gui.h" #include "preset_dlg.hxx" static puDialogBox *PresetDialog = 0; static puFrame *PresetDialogFrame = 0; static puText *PresetDialogMessage = 0; static puInput *PresetDialogInput = 0; static const int MAX_VALUE = 16; static char PresetValue[MAX_VALUE]; static char PresetSavedValue[MAX_VALUE]; static char PresetLabel[] = "Enter New Airport ID"; static string PresetProperty = ""; static puOneShot *PresetDialogOkButton = 0; static puOneShot *PresetDialogCancelButton = 0; static puOneShot *PresetDialogResetButton = 0; static void PresetDialog_OK(puObject *) { char *value; PresetDialogInput->getValue(&value); cout << "setting " << PresetProperty << " = " << value << endl; fgSetString( PresetProperty.c_str(), value ); FG_POP_PUI_DIALOG( PresetDialog ); // consistancy handling for some specialized cases if ( PresetProperty == "/sim/presets/airport-id" ) { fgSetDouble("/sim/presets/longitude-deg", -9999.0 ); fgSetDouble("/sim/presets/latitude-deg", -9999.0 ); } else if ( PresetProperty == "/sim/presets/runway" ) { fgSetDouble("/sim/presets/longitude-deg", -9999.0 ); fgSetDouble("/sim/presets/latitude-deg", -9999.0 ); } else if ( PresetProperty == "/sim/presets/offset-distance" ) { if ( fabs(fgGetDouble("/sim/presets/altitude-ft")) > 0.000001 && fabs(fgGetDouble("/sim/presets/glideslope-deg")) > 0.000001 ) { fgSetDouble("/sim/presets/altitude-ft", -9999.0); cout << "nuking altitude" << endl; } } else if ( PresetProperty == "/sim/presets/altitude-ft" ) { if ( fabs(fgGetDouble("/sim/presets/offset-distance")) > 0.000001 && fabs(fgGetDouble("/sim/presets/glideslope-deg")) > 0.000001 ) { fgSetDouble("/sim/presets/offset-distance", 0.0); cout << "nuking offset distance" << endl; } } else if ( PresetProperty == "/sim/presets/glideslope-deg" ) { if ( fabs(fgGetDouble("/sim/presets/offset-distance")) > 0.000001 && fabs(fgGetDouble("/sim/presets/altitude-ft")) > 0.000001 ) { fgSetDouble("/sim/presets/altitude-ft", -9999.0); cout << "nuking altitude" << endl; } } } static void PresetDialog_Cancel(puObject *) { FG_POP_PUI_DIALOG( PresetDialog ); } static void PresetDialog_Reset(puObject *) { PresetDialogInput->setValue( PresetSavedValue ); PresetDialogInput->setCursor( 0 ) ; } // Initialize the preset dialog box void fgPresetInit() { sprintf( PresetValue, "%s", fgGetString("/sim/presets/airport-id") ); int len = 150 - puGetDefaultLabelFont().getStringWidth( PresetLabel ) / 2; PresetDialog = new puDialogBox (150, 50); { PresetDialogFrame = new puFrame (0,0,350, 150); PresetDialogMessage = new puText (len, 110); PresetDialogMessage -> setLabel (""); PresetDialogInput = new puInput (50, 70, 300, 100); PresetDialogInput -> setValue (""); PresetDialogInput -> acceptInput(); PresetDialogOkButton = new puOneShot (50, 10, 110, 50); PresetDialogOkButton -> setLegend(gui_msg_OK); PresetDialogOkButton -> setCallback (PresetDialog_OK); PresetDialogOkButton -> makeReturnDefault(TRUE); PresetDialogCancelButton = new puOneShot (140, 10, 210, 50); PresetDialogCancelButton -> setLegend (gui_msg_CANCEL); PresetDialogCancelButton -> setCallback (PresetDialog_Cancel); PresetDialogResetButton = new puOneShot (240, 10, 300, 50); PresetDialogResetButton -> setLegend (gui_msg_RESET); PresetDialogResetButton -> setCallback (PresetDialog_Reset); } cout << "PresetInit " << PresetValue << endl; FG_FINALIZE_PUI_DIALOG( PresetDialog ); } void fgPresetAirport(puObject *cb) { PresetDialogMessage -> setLabel( "Enter Airport ID:" ); PresetProperty = "/sim/presets/airport-id"; snprintf( PresetValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); snprintf( PresetSavedValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); PresetDialogInput->setValue( PresetValue ); FG_PUSH_PUI_DIALOG( PresetDialog ); } void fgPresetRunway(puObject *cb) { PresetDialogMessage -> setLabel( "Enter Runway Number:" ); PresetProperty = "/sim/presets/runway"; snprintf( PresetValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); snprintf( PresetSavedValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); PresetDialogInput->setValue( PresetValue ); FG_PUSH_PUI_DIALOG( PresetDialog ); } void fgPresetOffsetDistance(puObject *cb) { PresetDialogMessage -> setLabel( "Enter Offset Distance (miles):" ); PresetProperty = "/sim/presets/offset-distance"; snprintf( PresetValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); snprintf( PresetSavedValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); PresetDialogInput->setValue( PresetValue ); FG_PUSH_PUI_DIALOG( PresetDialog ); } void fgPresetAltitude(puObject *cb) { PresetDialogMessage -> setLabel( "Enter Altitude (feet):" ); PresetProperty = "/sim/presets/altitude-ft"; snprintf( PresetValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); snprintf( PresetSavedValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); PresetDialogInput->setValue( PresetValue ); FG_PUSH_PUI_DIALOG( PresetDialog ); } void fgPresetGlideslope(puObject *cb) { PresetDialogMessage -> setLabel( "Enter Glideslope (deg):" ); PresetProperty = "/sim/presets/glideslope-deg"; snprintf( PresetValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); snprintf( PresetSavedValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); PresetDialogInput->setValue( PresetValue ); FG_PUSH_PUI_DIALOG( PresetDialog ); } void fgPresetAirspeed(puObject *cb) { PresetDialogMessage -> setLabel( "Enter Airspeed (kts):" ); PresetProperty = "/sim/presets/airspeed-kt"; snprintf( PresetValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); snprintf( PresetSavedValue, MAX_VALUE, "%s", fgGetString(PresetProperty.c_str()) ); PresetDialogInput->setValue( PresetValue ); FG_PUSH_PUI_DIALOG( PresetDialog ); } void fgPresetCommit(puObject *) { static const SGPropertyNode *longitude = fgGetNode("/sim/presets/longitude-deg"); static const SGPropertyNode *latitude = fgGetNode("/sim/presets/latitude-deg"); static const SGPropertyNode *master_freeze = fgGetNode("/sim/freeze/master"); SGPath path( globals->get_fg_root() ); path.append( "Airports" ); path.append( "simple.mk4" ); FGAirports airports( path.c_str() ); FGAirport a; bool freeze = master_freeze->getBoolValue(); if ( !freeze ) { fgSetBool("/sim/freeze/master", true); } // unbind the current fdm state so property changes // don't get lost when we subsequently delete this fdm // and create a new one. cur_fdm_state->unbind(); // invalidate lon/lat if an airport is specified in the presets string apt = fgGetString("/sim/presets/airport-id"); if ( !apt.empty() ) { fgSetDouble("/sim/presets/longitude-deg", -9999.0 ); fgSetDouble("/sim/presets/latitude-deg", -9999.0 ); } // set position from presets fgInitPosition(); // BusyCursor(0); fgReInitSubsystems(); cout << "before tile_mgr init " << longitude->getDoubleValue() << " " << latitude->getDoubleValue() << endl; double visibility_meters = fgGetDouble("/environment/visibility-m"); global_tile_mgr.update( visibility_meters ); // BusyCursor(1); if ( !freeze ) { fgSetBool("/sim/freeze/master", false); } }