mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-06 01:45:38 +08:00
refs #404, and discussion https://dev.vatsim-germany.org/issues/404#note-8 * Changed CSimulatorSetup to use CNameVariantPairList as data. The old version was an hack and had to go, CNameVariantPairList would allow complex types in the future and can be already shown in the GUI. * CNameVariantPairList was improved slightly in the same step * Functions to get CSimulatorSetup from driver / context * Removed CSimulatorSetup data from CSimulatorPluginInfo
150 lines
5.6 KiB
C++
150 lines
5.6 KiB
C++
/* Copyright (C) 2013
|
|
* swift project Community / Contributors
|
|
*
|
|
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
|
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
|
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
|
* contained in the LICENSE file.
|
|
*/
|
|
|
|
//! \file
|
|
|
|
#include "valueobject.h" // outside include guard due to cyclic dependency hack (MS)
|
|
|
|
#ifndef BLACKMISC_PROPERTYINDEX_H
|
|
#define BLACKMISC_PROPERTYINDEX_H
|
|
|
|
#include "blackmiscfreefunctions.h"
|
|
#include <initializer_list>
|
|
|
|
namespace BlackMisc
|
|
{
|
|
|
|
/*!
|
|
* Property index. The index can be nested, that's why it is a sequence
|
|
* (e.g. PropertyIndexPilot, PropertyIndexRealname).
|
|
*/
|
|
class CPropertyIndex : public CValueObject<CPropertyIndex>
|
|
{
|
|
// In the first trial I have used CSequence<int> as base class
|
|
// This has created too much circular dependencies of the headers
|
|
// CIndexVariantMap is used in CValueObject, CPropertyIndex in CIndexVariantMap
|
|
|
|
public:
|
|
//! Global index, make sure the indexes are unqiue (for using them in class hierarchy)
|
|
enum GlobalIndex
|
|
{
|
|
GlobalIndexCValueObject = 10, // GlobalIndexCValueObject needs to be set manually in CValueObject
|
|
GlobalIndexCPhysicalQuantity = 100,
|
|
GlobalIndexCStatusMessage = 200,
|
|
GlobalIndexCNameVariantPair = 300,
|
|
GlobalIndexTimestampBased = 400,
|
|
GlobalIndexCCallsign = 1000,
|
|
GlobalIndexCAircraftIcao = 1100,
|
|
GlobalIndexCAircraft = 1200,
|
|
GlobalIndexCAircraftSituation = 1300,
|
|
GlobalIndexCAtcStation = 1400,
|
|
GlobalIndexCAirport = 1500,
|
|
GlobalIndexCAircraftParts = 1600,
|
|
GlobalIndexCAircraftLights = 1700,
|
|
GlobalIndexCModulator = 2000,
|
|
GlobalIndexCTransponder = 2100,
|
|
GlobalIndexICoordinateGeodetic = 3000,
|
|
GlobalIndexCCoordinateGeodetic = 3100,
|
|
GlobalIndexCClient = 4000,
|
|
GlobalIndexCUser = 4100,
|
|
GlobalIndexCServer = 4200,
|
|
GlobalIndexCAircraftModel = 4300,
|
|
GlobalIndexCSimulatedAircraft = 4400,
|
|
GlobalIndexCAircraftMapping = 4500,
|
|
GlobalIndexCTextMessage = 4600,
|
|
GlobalIndexCSimulatorSetup = 4700,
|
|
GlobalIndexCAircraftCfgEntries = 4800,
|
|
GlobalIndexCVoiceRoom = 6000,
|
|
GlobalIndexCSettingKeyboardHotkey = 7000,
|
|
GlobalIndexAbuseMode = 20000 // property index abused as map key or otherwise, do be removed if no longer needed
|
|
};
|
|
|
|
//! Default constructor.
|
|
CPropertyIndex() = default;
|
|
|
|
//! Non nested index
|
|
CPropertyIndex(int singleProperty);
|
|
|
|
//! Initializer list constructor
|
|
CPropertyIndex(std::initializer_list<int> il);
|
|
|
|
//! Construct from a base class object.
|
|
CPropertyIndex(const QList<int> &indexes);
|
|
|
|
//! From string
|
|
CPropertyIndex(const QString &indexes);
|
|
|
|
//! Copy with first element removed
|
|
CPropertyIndex copyFrontRemoved() const;
|
|
|
|
//! Is nested index?
|
|
bool isNested() const;
|
|
|
|
//! Myself index, used with nesting
|
|
bool isMyself() const;
|
|
|
|
//! Empty?
|
|
bool isEmpty() const;
|
|
|
|
//! Index list
|
|
QList<int> indexList() const;
|
|
|
|
//! Shif existing indexes to right and insert given index at front
|
|
void prepend(int newLeftIndex);
|
|
|
|
//! Contains index?
|
|
bool contains(int index) const;
|
|
|
|
//! Compare with index given by enum
|
|
template<class EnumType> bool contains(EnumType ev) const
|
|
{
|
|
static_assert(std::is_enum<EnumType>::value, "Argument must be an enum");
|
|
return contains(static_cast<int>(ev));
|
|
}
|
|
|
|
//! First element casted to given type, usually then PropertIndex enum
|
|
template<class CastType> CastType frontCasted() const
|
|
{
|
|
QList<int> l = indexList();
|
|
Q_ASSERT(!l.isEmpty());
|
|
int f = l.isEmpty() ? 0 : l.first();
|
|
return static_cast<CastType>(f);
|
|
}
|
|
|
|
//! Compare with index given by enum
|
|
template<class EnumType> bool equalsPropertyIndexEnum(EnumType ev)
|
|
{
|
|
static_assert(std::is_enum<EnumType>::value, "Argument must be an enum");
|
|
QList<int> l = indexList();
|
|
if (l.size() != 1) { return false; }
|
|
return static_cast<int>(ev) == l.first();
|
|
}
|
|
|
|
protected:
|
|
//! \copydoc CValueObject::convertToQString
|
|
virtual QString convertToQString(bool i18n = false) const override;
|
|
|
|
//! \copydoc CValueObject::parseFromString
|
|
virtual void parseFromString(const QString &indexes) override;
|
|
|
|
private:
|
|
BLACK_ENABLE_TUPLE_CONVERSION(CPropertyIndex)
|
|
QString m_indexString; //! I use a little trick here, the string is used with the tupel system, as it provides all operators, hash ..
|
|
|
|
//! Convert list to string
|
|
void setIndexStringByList(const QList<int> &list);
|
|
|
|
};
|
|
} //namespace
|
|
|
|
BLACK_DECLARE_TUPLE_CONVERSION(BlackMisc::CPropertyIndex, (o.m_indexString))
|
|
Q_DECLARE_METATYPE(BlackMisc::CPropertyIndex)
|
|
|
|
#endif //guard
|