Add new command to jump to next plane in follow plane view

ref T269
This commit is contained in:
Roland Winklmeier
2018-06-05 11:44:16 +02:00
committed by Klaus Basan
parent d41bd1d26c
commit 10b8cf5fea
2 changed files with 25 additions and 1 deletions

View File

@@ -44,7 +44,8 @@ namespace XSwiftBus
}
CTraffic::CTraffic(CDBusConnection *dbusConnection) :
CDBusObject(dbusConnection)
CDBusObject(dbusConnection),
m_planeViewNextCommand("org/swift-project/xswiftbus/follow_next_plane", "Changes plane view to follow next plane in sequence", [this] { followNextPlane(); })
{
registerDBusObjectPath(XSWIFTBUS_TRAFFIC_INTERFACENAME, XSWIFTBUS_TRAFFIC_OBJECTPATH);
XPLMRegisterDrawCallback(drawCallback, xplm_Phase_Airplanes, 1, this);
@@ -146,6 +147,19 @@ namespace XSwiftBus
XPLMControlCamera(xplm_ControlCameraUntilViewChanges, orbitPlaneFunc, this);
}
void CTraffic::followNextPlane()
{
if (m_planesByCallsign.empty() || m_planeViewCallsign.empty()) { return; }
auto callsignIt = std::find(m_followPlaneViewSequence.begin(), m_followPlaneViewSequence.end(), m_planeViewCallsign);
// If we are not at the end, increase by one
if (callsignIt != m_followPlaneViewSequence.end()) { callsignIt++; }
// If we were already at the end or reached it now, start from the beginning
if (callsignIt == m_followPlaneViewSequence.end()) { callsignIt = m_followPlaneViewSequence.begin(); }
m_planeViewCallsign = *callsignIt;
}
int g_maxPlanes = 100;
float g_drawDistance = 50.0f;
@@ -239,6 +253,7 @@ namespace XSwiftBus
// Create view menu item
CMenuItem planeViewMenuItem = m_planeViewSubMenu.item(callsign, [this, callsign] { switchToPlaneView(callsign); });
m_planeViewMenuItems[callsign] = planeViewMenuItem;
m_followPlaneViewSequence.push_back(callsign);
}
}
@@ -254,6 +269,9 @@ namespace XSwiftBus
auto planeIt = m_planesByCallsign.find(callsign);
if (planeIt == m_planesByCallsign.end()) { return; }
m_followPlaneViewSequence.erase(std::remove(m_followPlaneViewSequence.begin(), m_followPlaneViewSequence.end(), callsign),
m_followPlaneViewSequence.end());
Plane *plane = planeIt->second;
m_planesByCallsign.erase(callsign);
m_planesById.erase(plane->id);
@@ -280,6 +298,7 @@ namespace XSwiftBus
m_planesByCallsign.clear();
m_planesById.clear();
m_planeViewMenuItems.clear();
m_followPlaneViewSequence.clear();
}
void CTraffic::setPlanesPositions(const std::vector<std::string> &callsigns, std::vector<double> latitudes, std::vector<double> longitudes, std::vector<double> altitudes,

View File

@@ -13,6 +13,7 @@
//! \file
#include "dbusobject.h"
#include "command.h"
#include "datarefs.h"
#include "terrainprobe.h"
#include "menus.h"
@@ -132,6 +133,7 @@ namespace XSwiftBus
void emitPlaneAdded(const std::string &callsign);
void emitPlaneAddingFailed(const std::string &callsign);
void switchToPlaneView(const std::string &callsign);
void followNextPlane();
static int preferences(const char *section, const char *name, int def);
static float preferences(const char *section, const char *name, float def);
@@ -161,6 +163,7 @@ namespace XSwiftBus
std::unordered_map<std::string, Plane *> m_planesByCallsign;
std::unordered_map<void *, Plane *> m_planesById;
std::vector<std::string> m_followPlaneViewSequence;
std::chrono::system_clock::time_point m_timestampLastSimFrame = std::chrono::system_clock::now();
CMenu m_planeViewSubMenu;
@@ -170,6 +173,8 @@ namespace XSwiftBus
DataRef<xplane::data::sim::graphics::view::world_render_type> m_worldRenderType;
bool m_emitSimFrame = true;
CCommand m_planeViewNextCommand;
int getPlaneData(void *id, int dataType, void *io_data);
static int getPlaneData(void *id, int dataType, void *io_data, void *self)
{