1
0
Fork 0

Route-manager: is expose is-route property for UI

This commit is contained in:
James Turner 2022-12-02 12:21:39 +00:00
parent 78e6a209f1
commit e08eee587d
3 changed files with 91 additions and 45 deletions

View file

@ -0,0 +1,77 @@
# Strucutral Overview
## Foundation Components
There is a group os basic objects used widely throughout the codebase, which
are useful building blocks in all major simulation elements.
### Properties
Properties form a hierarchy of named, typed values. The hierarchy can be extended
and modified at runtime by aircraft, simulation components and external protocols.
### Listeners
Listeners are a callback interface `SGPropertyChangeListener` which can implemented
to receive notification when a property is modified, or its children added/removed.
Most commonly listeners are used to look for a user input or simulation event
changing some value (for example, a switch being turned from on to off), but it's
possible to monitor an entire sub-tree of properties.
It's important than listeners do not block or perform excessive amounts of work, since
the code modifying the property may not expect this. If non-trivial work needs to be
performed in response to a property changing, the listener should set a dirty flag
and a subsystem (etc) should check this in its `update()` method.
### Tied properties
Tied properties allow a property to be defined by a C++ memory location (such as a class
member variable) or by callback functions implementation the get/set operations. This
is very convenient for the implementating code. However, by default it has the
problematic side-effect that listeners do not correctly, since they have no way to be
notified thst the underlying value (or result of invoking the getter) has changed.
It is therefore critical, when using tied properties, to _manually_ invoke `fireValueChanged`
on dependent proeprties, when updating the internal state producing them. Care should be
taken to only fire the change, when the result of the getters would actually change; it is
_not_ acceptable to simply call `fireValueChanged` each iteration, since any connected
listener will be run at the simulation rate.
### Conditions
_Conditions_ are predicates which can be evaluated on demand. They can contain
logical operations such as 'and' and 'or', and comparisoms: for example checking that
a property is equal to a constant value, or that a property is less than another
property.
Conditions are widely used to drive other state from properties; for example
enabling or disabling user-interface in a dialog, or activating an autopilot
element.
### Bindings
_Bindings_ are a command invocation with associated arguments. In the simplest case
this might be invoking the `property-set` command with an argument of 42. At its
most complex, the command might invoke a Nasal script, supplied as part of the
binding, and substituing a runtime value into the Nasal logic.
Bindings are typically used in response to user actions, such as a menu item, key
press or interacting with a cockpit control, to update some part of the simulator
state.
## Structural Components
Most code within FlightGear is organized into subsystems. Subsystems are isolated from each other;
a well designed subsytem can be added, remove or restarting independently. Many subystems do not
full conform to these goals, especially regarding runtime adding and removal, but an increasing
number do support it.
=== Subsystems ===
=== Commands ===
## Finding data files
## Subsysterm Lifecycle

View file

@ -1,26 +1,8 @@
// route_mgr.cxx - manage a route (i.e. a collection of waypoints)
//
// Written by Curtis Olson, started January 2004.
// Norman Vine
// Melchior FRANZ
//
// Copyright (C) 2004 Curtis L. Olson - http://www.flightgear.org/~curt
//
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
/*
* SPDX-FileCopyrightText: (C) 2004 Curtis L. Olson http://www.flightgear.org/~curt
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <config.h>
@ -372,7 +354,8 @@ void FGRouteMgr::init() {
_edited = fgGetNode(RM "signals/edited", true);
_flightplanChanged = fgGetNode(RM "signals/flightplan-changed", true);
_isRoute = fgGetNode(RM "is-route", true);
_currentWpt = fgGetNode(RM "current-wp", true);
_currentWpt->setAttribute(SGPropertyNode::LISTENER_SAFE, true);
_currentWpt->tie(SGRawValueMethods<FGRouteMgr, int>
@ -411,6 +394,8 @@ void FGRouteMgr::postinit()
loadRoute(path);
}
_isRoute->setBoolValue(_plan->isRoute());
// this code only matters for the --wp option now - perhaps the option
// should be deprecated in favour of an explicit flight-plan file?
// then the global initial waypoint list could die.
@ -486,7 +471,7 @@ void FGRouteMgr::setFlightPlan(const FlightPlanRef& plan)
_plan = plan;
_plan->addDelegate(this);
_isRoute->setBoolValue(_plan->isRoute());
_flightplanChanged->fireValueChanged();
// fire all the callbacks!

View file

@ -1,24 +1,8 @@
// route_mgr.hxx - manage a route (i.e. a collection of waypoints)
//
// Written by Curtis Olson, started January 2004.
//
// Copyright (C) 2004 Curtis L. Olson - http://www.flightgear.org/~curt
//
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
/*
* SPDX-FileCopyrightText: (C) 2004 Curtis L. Olson http://www.flightgear.org/~curt
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
@ -144,7 +128,7 @@ private:
SGPropertyNode_ptr _pathNode;
SGPropertyNode_ptr _currentWpt;
SGPropertyNode_ptr _isRoute;
/**
* Signal property to notify people that the route was edited