Added a "Presets" menu.
This commit is contained in:
parent
9a3f0c5c19
commit
df2356050d
10 changed files with 360 additions and 29 deletions
|
@ -13,6 +13,7 @@ libGUI_a_SOURCES = \
|
|||
gui_local.cxx gui_local.hxx \
|
||||
mouse.cxx \
|
||||
$(NETWORK_SRCS) \
|
||||
preset_dlg.cxx preset_dlg.hxx \
|
||||
prop_picker.cxx prop_picker.hxx \
|
||||
sgVec3Slider.cxx sgVec3Slider.hxx \
|
||||
trackball.c trackball.h
|
||||
|
|
|
@ -47,8 +47,8 @@
|
|||
|
||||
#include "gui.h"
|
||||
#include "gui_local.hxx"
|
||||
#include "apt_dlg.hxx"
|
||||
#include "net_dlg.hxx"
|
||||
#include "preset_dlg.hxx"
|
||||
|
||||
|
||||
// main.cxx hack, should come from an include someplace
|
||||
|
@ -229,7 +229,7 @@ void guiInit()
|
|||
|
||||
// Set up our Dialog Boxes
|
||||
ConfirmExitDialogInit();
|
||||
NewAirportInit();
|
||||
fgPresetInit();
|
||||
|
||||
#ifdef FG_NETWORK_OLK
|
||||
NewNetIdInit();
|
||||
|
|
|
@ -91,10 +91,10 @@
|
|||
|
||||
#include "gui.h"
|
||||
#include "gui_local.hxx"
|
||||
#include "apt_dlg.hxx"
|
||||
#include "net_dlg.hxx"
|
||||
#include "sgVec3Slider.hxx"
|
||||
#include "preset_dlg.hxx"
|
||||
#include "prop_picker.hxx"
|
||||
#include "sgVec3Slider.hxx"
|
||||
|
||||
SG_USING_STD(string);
|
||||
|
||||
|
@ -172,7 +172,13 @@ const __fg_gui_fn_t __fg_gui_fn[] = {
|
|||
{"prop_pickerView", prop_pickerView},
|
||||
|
||||
// Environment
|
||||
{"NewAirport", NewAirport},
|
||||
{"fgPresetAirport", fgPresetAirport},
|
||||
{"fgPresetRunway", fgPresetRunway},
|
||||
{"fgPresetOffsetDistance", fgPresetOffsetDistance},
|
||||
{"fgPresetAltitude", fgPresetAltitude},
|
||||
{"fgPresetGlideslope", fgPresetGlideslope},
|
||||
{"fgPresetAirspeed", fgPresetAirspeed},
|
||||
{"fgPresetCommit", fgPresetCommit},
|
||||
|
||||
// Network
|
||||
#ifdef FG_NETWORK_OLK
|
||||
|
|
|
@ -73,6 +73,9 @@ void reInit(puObject *cb)
|
|||
|
||||
globals->restoreInitialState();
|
||||
|
||||
// update our position based on current presets
|
||||
fgInitPosition();
|
||||
|
||||
SGTime *t = globals->get_time_params();
|
||||
delete t;
|
||||
t = fgInitTime();
|
||||
|
|
294
src/GUI/preset_dlg.cxx
Normal file
294
src/GUI/preset_dlg.cxx
Normal file
|
@ -0,0 +1,294 @@
|
|||
// 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 <config.h>
|
||||
#endif
|
||||
|
||||
#include <simgear/compiler.h>
|
||||
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
// #include <stdlib.h>
|
||||
|
||||
// #include <simgear/constants.h>
|
||||
// #include <simgear/debug/logstream.hxx>
|
||||
#include <simgear/misc/sg_path.hxx>
|
||||
|
||||
// #include <Include/general.hxx>
|
||||
|
||||
// #include <GL/glut.h>
|
||||
// #include <GL/gl.h>
|
||||
|
||||
#include <Airports/simple.hxx>
|
||||
#include <FDM/flight.hxx>
|
||||
#include <Main/fg_init.hxx>
|
||||
#include <Main/fg_props.hxx>
|
||||
#include <Scenery/tilemgr.hxx>
|
||||
|
||||
#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( longitude->getDoubleValue(),
|
||||
latitude->getDoubleValue(),
|
||||
visibility_meters );
|
||||
// BusyCursor(1);
|
||||
|
||||
if ( !freeze ) {
|
||||
fgSetBool("/sim/freeze/master", false);
|
||||
}
|
||||
}
|
||||
|
||||
|
10
src/GUI/preset_dlg.hxx
Normal file
10
src/GUI/preset_dlg.hxx
Normal file
|
@ -0,0 +1,10 @@
|
|||
#include <plib/pu.h>
|
||||
|
||||
extern void fgPresetAirport(puObject *cb);
|
||||
extern void fgPresetRunway(puObject *cb);
|
||||
extern void fgPresetOffsetDistance(puObject *cb);
|
||||
extern void fgPresetAltitude(puObject *cb);
|
||||
extern void fgPresetGlideslope(puObject *cb);
|
||||
extern void fgPresetAirspeed(puObject *cb);
|
||||
extern void fgPresetCommit(puObject *cb);
|
||||
extern void fgPresetInit();
|
|
@ -895,7 +895,8 @@ static bool fgSetPosFromAirportIDandRwy( const string& id, const string& rwy ) {
|
|||
|
||||
|
||||
static void fgSetDistOrAltFromGlideSlope() {
|
||||
double gs = fgGetDouble("/sim/presets/glideslope");
|
||||
double gs = fgGetDouble("/sim/presets/glideslope-deg")
|
||||
* SG_DEGREES_TO_RADIANS ;
|
||||
double od = fgGetDouble("/sim/presets/offset-distance");
|
||||
double alt = fgGetDouble("/sim/presets/altitude-ft");
|
||||
|
||||
|
@ -917,7 +918,7 @@ static void fgSetDistOrAltFromGlideSlope() {
|
|||
SG_LOG( SG_GENERAL, SG_ALERT,
|
||||
"Glideslope given but not altitude or offset-distance." );
|
||||
SG_LOG( SG_GENERAL, SG_ALERT, "Resetting glideslope to zero" );
|
||||
fgSetDouble("/sim/presets/glideslope", 0);
|
||||
fgSetDouble("/sim/presets/glideslope-deg", 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1196,7 +1197,7 @@ SGTime *fgInitTime() {
|
|||
// initialization routines. If you are adding a subsystem to flight
|
||||
// gear, its initialization call should located in this routine.
|
||||
// Returns non-zero if a problem encountered.
|
||||
bool fgInitSubsystems( void ) {
|
||||
bool fgInitSubsystems() {
|
||||
static const SGPropertyNode *longitude
|
||||
= fgGetNode("/sim/presets/longitude-deg");
|
||||
static const SGPropertyNode *latitude
|
||||
|
@ -1611,7 +1612,7 @@ bool fgInitSubsystems( void ) {
|
|||
}
|
||||
|
||||
|
||||
void fgReInitSubsystems( void )
|
||||
void fgReInitSubsystems()
|
||||
{
|
||||
static const SGPropertyNode *longitude
|
||||
= fgGetNode("/sim/presets/longitude-deg");
|
||||
|
@ -1630,12 +1631,8 @@ void fgReInitSubsystems( void )
|
|||
if ( !freeze ) {
|
||||
fgSetBool("/sim/freeze/master", true);
|
||||
}
|
||||
|
||||
// Initialize the Scenery Management subsystem
|
||||
// FIXME, what really needs to get initialized here, at the time
|
||||
// this was commented out, scenery.init() was a noop
|
||||
// scenery.init();
|
||||
|
||||
// Initialize the FDM
|
||||
fgInitFDM();
|
||||
|
||||
// allocates structures so must happen before any of the flight
|
||||
|
|
|
@ -63,17 +63,17 @@ SGPropertyNode *fgInitLocale(const char *language);
|
|||
|
||||
|
||||
// General house keeping initializations
|
||||
bool fgInitGeneral ( void );
|
||||
bool fgInitGeneral ();
|
||||
|
||||
|
||||
// This is the top level init routine which calls all the other
|
||||
// initialization routines. If you are adding a subsystem to flight
|
||||
// gear, its initialization call should located in this routine.
|
||||
bool fgInitSubsystems( void );
|
||||
bool fgInitSubsystems();
|
||||
|
||||
|
||||
// Reset
|
||||
void fgReInitSubsystems( void );
|
||||
void fgReInitSubsystems();
|
||||
|
||||
|
||||
// find basic airport location info from airport database
|
||||
|
|
|
@ -51,9 +51,9 @@ FGGlobals::FGGlobals() :
|
|||
warp_delta( 0 ),
|
||||
props(new SGPropertyNode),
|
||||
initial_state(0),
|
||||
locale(NULL),
|
||||
commands(new SGCommandMgr),
|
||||
io(new FGIO),
|
||||
locale(NULL)
|
||||
io(new FGIO)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -84,14 +84,34 @@ FGGlobals::saveInitialState ()
|
|||
void
|
||||
FGGlobals::restoreInitialState ()
|
||||
{
|
||||
if (initial_state == 0) {
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "No initial state available to restore!!!");
|
||||
} else if (!copyProperties(initial_state, props)) {
|
||||
SG_LOG(SG_GENERAL, SG_INFO,
|
||||
"Some errors restoring initial state (probably just read-only props)");
|
||||
} else {
|
||||
SG_LOG(SG_GENERAL, SG_INFO, "Initial state restored successfully");
|
||||
}
|
||||
if ( initial_state == 0 ) {
|
||||
SG_LOG(SG_GENERAL, SG_ALERT,
|
||||
"No initial state available to restore!!!");
|
||||
return;
|
||||
}
|
||||
|
||||
SGPropertyNode *currentPresets = new SGPropertyNode;
|
||||
SGPropertyNode *targetNode = fgGetNode( "/sim/presets" );
|
||||
|
||||
// stash the /sim/presets tree
|
||||
if ( !copyProperties(targetNode, currentPresets) ) {
|
||||
SG_LOG( SG_GENERAL, SG_ALERT, "Failed to save /sim/presets subtree" );
|
||||
}
|
||||
|
||||
if ( copyProperties(initial_state, props) ) {
|
||||
SG_LOG( SG_GENERAL, SG_INFO, "Initial state restored successfully" );
|
||||
} else {
|
||||
SG_LOG( SG_GENERAL, SG_INFO,
|
||||
"Some errors restoring initial state (read-only props?)" );
|
||||
}
|
||||
|
||||
// recover the /sim/presets tree
|
||||
if ( !copyProperties(currentPresets, targetNode) ) {
|
||||
SG_LOG( SG_GENERAL, SG_ALERT,
|
||||
"Failed to restore /sim/presets subtree" );
|
||||
}
|
||||
|
||||
delete currentPresets;
|
||||
}
|
||||
|
||||
FGViewer *
|
||||
|
|
|
@ -763,8 +763,8 @@ parse_option (const string& arg)
|
|||
} else if ( arg.find( "--pitch=" ) == 0 ) {
|
||||
fgSetDouble("/sim/presets/pitch-deg", atof(arg.substr(8)));
|
||||
} else if ( arg.find( "--glideslope=" ) == 0 ) {
|
||||
fgSetDouble("/sim/presets/glideslope",
|
||||
atof(arg.substr(13)) * SG_DEGREES_TO_RADIANS );
|
||||
fgSetDouble("/sim/presets/glideslope-deg",
|
||||
atof(arg.substr(13)));
|
||||
} else if ( arg.find( "--roc=" ) == 0 ) {
|
||||
fgSetDouble("/velocities/vertical-speed-fps", atof(arg.substr(6))/60);
|
||||
} else if ( arg.find( "--fg-root=" ) == 0 ) {
|
||||
|
|
Loading…
Reference in a new issue