diff --git a/src/blackgui/clientlistmodel.cpp b/src/blackgui/clientlistmodel.cpp index e6580d0cc..afdebe931 100644 --- a/src/blackgui/clientlistmodel.cpp +++ b/src/blackgui/clientlistmodel.cpp @@ -16,6 +16,7 @@ namespace BlackGui this->m_columns.addColumn(CColumn("", CClient::IndexCallsignIcon)); this->m_columns.addColumn(CColumn("callsign", CClient::IndexCallsign)); this->m_columns.addColumn(CColumn("realname", CClient::IndexRealName)); + this->m_columns.addColumn(CColumn("", CClient::IndexVoiceCapabilitiesIcon)); this->m_columns.addColumn(CColumn("capabilities", CClient::IndexCapabilitiesString)); this->m_columns.addColumn(CColumn("model", CClient::IndexQueriedModelString)); this->m_columns.addColumn(CColumn("host", CClient::IndexHost)); diff --git a/src/blackmisc/blackmisc.qrc b/src/blackmisc/blackmisc.qrc index 38aeb20b8..56001e4b8 100644 --- a/src/blackmisc/blackmisc.qrc +++ b/src/blackmisc/blackmisc.qrc @@ -26,5 +26,9 @@ icons/sky.jpg icons/tower_framed.jpg icons/gnd_framed.jpg + icons/captextonly.png + icons/capunknown.png + icons/capvoice.png + icons/capvoicereceive.png diff --git a/src/blackmisc/blackmiscfreefunctions.cpp b/src/blackmisc/blackmiscfreefunctions.cpp index c6c620197..07b2a108c 100644 --- a/src/blackmisc/blackmiscfreefunctions.cpp +++ b/src/blackmisc/blackmiscfreefunctions.cpp @@ -96,6 +96,7 @@ void BlackMisc::Network::registerMetadata() CClient::registerMetadata(); CClientList::registerMetadata(); CAircraftModel::registerMetadata(); + CVoiceCapabilities::registerMetadata(); } /* diff --git a/src/blackmisc/icons/captextonly.png b/src/blackmisc/icons/captextonly.png new file mode 100644 index 000000000..51ad2dc27 Binary files /dev/null and b/src/blackmisc/icons/captextonly.png differ diff --git a/src/blackmisc/icons/capunknown.png b/src/blackmisc/icons/capunknown.png new file mode 100644 index 000000000..b482da2f9 Binary files /dev/null and b/src/blackmisc/icons/capunknown.png differ diff --git a/src/blackmisc/icons/capvoice.png b/src/blackmisc/icons/capvoice.png new file mode 100644 index 000000000..64531c84e Binary files /dev/null and b/src/blackmisc/icons/capvoice.png differ diff --git a/src/blackmisc/icons/capvoicereceive.png b/src/blackmisc/icons/capvoicereceive.png new file mode 100644 index 000000000..8bc4448d6 Binary files /dev/null and b/src/blackmisc/icons/capvoicereceive.png differ diff --git a/src/blackmisc/networkallclasses.h b/src/blackmisc/networkallclasses.h index 4fe9bc817..b48bf52de 100644 --- a/src/blackmisc/networkallclasses.h +++ b/src/blackmisc/networkallclasses.h @@ -13,5 +13,6 @@ #include "blackmisc/nwclient.h" #include "blackmisc/nwclientlist.h" #include "blackmisc/nwaircraftmodel.h" +#include "blackmisc/nwvoicecapabilities.h" #endif // guard diff --git a/src/blackmisc/nwclient.cpp b/src/blackmisc/nwclient.cpp index 349cfb3a7..64b43ea0f 100644 --- a/src/blackmisc/nwclient.cpp +++ b/src/blackmisc/nwclient.cpp @@ -182,6 +182,15 @@ namespace BlackMisc case IndexHost: return QVariant(this->m_host); break; + case IndexVoiceCapabilities: + return this->m_voiceCapabilities.toQVariant(); + break; + case IndexVoiceCapabilitiesString: + return QVariant(this->m_voiceCapabilities.toQString(false)); + break; + case IndexVoiceCapabilitiesIcon: + return QVariant(this->m_voiceCapabilities.toIcon()); + break; default: break; } @@ -217,6 +226,12 @@ namespace BlackMisc case IndexHost: this->m_host = variant.toString(); break; + case IndexVoiceCapabilities: + this->m_voiceCapabilities = variant.value(); + break; + case IndexVoiceCapabilitiesString: + this->m_voiceCapabilities = CVoiceCapabilities(variant.toString()); + break; default: Q_ASSERT_X(false, "CClient", "index unknown"); break; diff --git a/src/blackmisc/nwclient.h b/src/blackmisc/nwclient.h index 5ffb87b09..72b3383bf 100644 --- a/src/blackmisc/nwclient.h +++ b/src/blackmisc/nwclient.h @@ -3,6 +3,7 @@ #include "nwuser.h" #include "nwaircraftmodel.h" +#include "nwvoicecapabilities.h" #include "valueobject.h" #include "indexvariantmap.h" @@ -22,17 +23,23 @@ namespace BlackMisc */ enum ColumnIndex : uint { + // user IndexEmail = 0, IndexId, IndexPassword, IndexRealName, IndexCallsign, IndexCallsignIcon, + // model IndexQueriedModelString = 100, + // own indexes IndexCapabilities = 1000, IndexCapabilitiesString, - IndexModel, // own indexes - IndexHost + IndexModel, + IndexHost, + IndexVoiceCapabilities, + IndexVoiceCapabilitiesString, + IndexVoiceCapabilitiesIcon }; /*! @@ -75,7 +82,6 @@ namespace BlackMisc //! \copydoc CValueObject::fromJson void fromJson(const QJsonObject &json) override; - //! Get capabilities CIndexVariantMap getCapabilities() const { return this->m_capabilities; } @@ -91,6 +97,15 @@ namespace BlackMisc //! Has capability? bool hasCapability(Capabilities capability) const; + //! Get voice capabilities + const CVoiceCapabilities &getVoiceCapabilities() const { return m_voiceCapabilities;} + + //! Set voice capabilities + void setVoiceCapabilities(const CVoiceCapabilities &voiceCapabilities) { m_voiceCapabilities = voiceCapabilities;} + + //! Set voice capabilities + void setVoiceCapabilities(const QString &flightPlanRemarks) { m_voiceCapabilities = CVoiceCapabilities(flightPlanRemarks);} + //! Host const QString &getHost() const { return this->m_host; } @@ -143,6 +158,8 @@ namespace BlackMisc CAircraftModel m_model; CIndexVariantMap m_capabilities; QString m_host; + CVoiceCapabilities m_voiceCapabilities; + }; } // namespace } // namespace diff --git a/src/blackmisc/nwvoicecapabilites.cpp b/src/blackmisc/nwvoicecapabilites.cpp new file mode 100644 index 000000000..93f7d7032 --- /dev/null +++ b/src/blackmisc/nwvoicecapabilites.cpp @@ -0,0 +1,190 @@ +#include "blackmisc/nwvoicecapabilities.h" +#include "blackmisc/blackmiscfreefunctions.h" +#include + +namespace BlackMisc +{ + namespace Network + { + + /* + * Constructor + */ + CVoiceCapabilities::CVoiceCapabilities(const QString &flightPlanRemarks) + { + this->fromFlightPlanRemarks(flightPlanRemarks); + } + + /* + * Convert to string + */ + QString CVoiceCapabilities::convertToQString(bool /** i18n **/) const + { + switch (this->m_voiceCapabilities) + { + case Voice: + { + static const QString v("voice"); + return v; + } + case TextOnly: + { + static const QString t("text only"); + return t; + } + case VoiceReceivingOnly: + { + static const QString r("voice listening only"); + return r; + } + default: + case Unknown: + { + static const QString u("unknown"); + return u; + } + } + Q_ASSERT("Wrong index"); + return QString(""); // never reached + } + + void CVoiceCapabilities::fromFlightPlanRemarks(const QString &flightPlanRemarks) + { + if (flightPlanRemarks.isEmpty()) + { + this->m_voiceCapabilities = Unknown; + return; + } + + QString r = flightPlanRemarks.toLower(); + if (r.contains("/v/") || r.contains("/voice/")) + { + this->setCapabilities(Voice); + return; + } + } + + /* + * metaTypeId + */ + int CVoiceCapabilities::getMetaTypeId() const + { + return qMetaTypeId(); + } + + /* + * is a + */ + bool CVoiceCapabilities::isA(int metaTypeId) const + { + if (metaTypeId == qMetaTypeId()) { return true; } + return this->CValueObject::isA(metaTypeId); + } + + /* + * Compare + */ + int CVoiceCapabilities::compareImpl(const CValueObject &otherBase) const + { + const auto &other = static_cast(otherBase); + return compare(TupleConverter::toTuple(*this), TupleConverter::toTuple(other)); + } + + /* + * Marshall to DBus + */ + void CVoiceCapabilities::marshallToDbus(QDBusArgument &argument) const + { + argument << TupleConverter::toTuple(*this); + } + + /* + * Unmarshall from DBus + */ + void CVoiceCapabilities::unmarshallFromDbus(const QDBusArgument &argument) + { + argument >> TupleConverter::toTuple(*this); + } + + /* + * Equal? + */ + const QPixmap &CVoiceCapabilities::toIcon() const + { + static const QPixmap v(QPixmap(":/blackmisc/icons/capvoice.png").scaledToWidth(16, Qt::SmoothTransformation)); + static const QPixmap t(QPixmap(":/blackmisc/icons/captextonly.png").scaledToWidth(16, Qt::SmoothTransformation)); + static const QPixmap u(QPixmap(":/blackmisc/icons/capunknown.png").scaledToWidth(16, Qt::SmoothTransformation)); + static const QPixmap r(QPixmap(":/blackmisc/icons/capvoicereceive.png").scaledToWidth(16, Qt::SmoothTransformation)); + + switch (this->m_voiceCapabilities) + { + case Voice: + return v; + case TextOnly: + return t; + case Unknown: + return u; + case VoiceReceivingOnly: + return r; + } + Q_ASSERT("Wrong index"); + return u; // never reached + } + + bool CVoiceCapabilities::operator ==(const CVoiceCapabilities &other) const + { + if (this == &other) return true; + return TupleConverter::toTuple(*this) == TupleConverter::toTuple(other); + } + + /* + * Unequal? + */ + bool CVoiceCapabilities::operator !=(const CVoiceCapabilities &other) const + { + return !((*this) == other); + } + + /* + * Hash + */ + uint CVoiceCapabilities::getValueHash() const + { + return qHash(TupleConverter::toTuple(*this)); + } + + /* + * To JSON + */ + QJsonObject CVoiceCapabilities::toJson() const + { + return BlackMisc::serializeJson(CVoiceCapabilities::jsonMembers(), TupleConverter::toTuple(*this)); + } + + /* + * To JSON + */ + void CVoiceCapabilities::fromJson(const QJsonObject &json) + { + BlackMisc::deserializeJson(json, CVoiceCapabilities::jsonMembers(), TupleConverter::toTuple(*this)); + } + + /* + * Members + */ + const QStringList &CVoiceCapabilities::jsonMembers() + { + return TupleConverter::jsonMembers(); + } + + /* + * Register metadata + */ + void CVoiceCapabilities::registerMetadata() + { + qRegisterMetaType(); + qDBusRegisterMetaType(); + } + + } // namespace +} // namespace diff --git a/src/blackmisc/nwvoicecapabilities.h b/src/blackmisc/nwvoicecapabilities.h new file mode 100644 index 000000000..3915ec66b --- /dev/null +++ b/src/blackmisc/nwvoicecapabilities.h @@ -0,0 +1,108 @@ +/* Copyright (C) 2013 VATSIM Community / authors + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BLACKMISC_VOICECAPABILITIES_H +#define BLACKMISC_VOICECAPABILITIES_H + +#include "valueobject.h" + +namespace BlackMisc +{ + namespace Network + { + + /*! + * Value object encapsulating information for voice capabilities. + */ + class CVoiceCapabilities : public BlackMisc::CValueObject + { + public: + + //!< Voice capabilities + enum VoiceCapabilities + { + Unknown, + Voice, + VoiceReceivingOnly, + TextOnly, + }; + + //! Default constructor. + CVoiceCapabilities() {} + + //! Constructor by callsign + CVoiceCapabilities(VoiceCapabilities capabilities) : m_voiceCapabilities(static_cast(capabilities)) {} + + //! Constructor. + CVoiceCapabilities(const QString &flightPlanRemarks); + + //! \copydoc CValueObject::toQVariant() + virtual QVariant toQVariant() const override { return QVariant::fromValue(*this); } + + //! Get capabilities + VoiceCapabilities getCapabilities() const { return static_cast(m_voiceCapabilities); } + + //! Set capabilites + void setCapabilities(VoiceCapabilities capabilites) { m_voiceCapabilities = static_cast(capabilites); } + + //! \copydoc CValueObject::toIcon() + virtual const QPixmap &toIcon() const override; + + //! \brief Equal operator == + bool operator ==(const CVoiceCapabilities &other) const; + + //! \brief Unequal operator != + bool operator !=(const CVoiceCapabilities &other) const; + + //! \copydoc CValueObject::getValueHash() + virtual uint getValueHash() const override; + + //! \copydoc CValueObject::toJson + virtual QJsonObject toJson() const override; + + //! \copydoc CValueObject::fromJson + void fromJson(const QJsonObject &json) override; + + //! \brief Register metadata + static void registerMetadata(); + + //! \brief Members + static const QStringList &jsonMembers(); + + protected: + //! \copydoc CValueObject::convertToQString + virtual QString convertToQString(bool i18n = false) const override; + + //! \copydoc CValueObject::getMetaTypeId + virtual int getMetaTypeId() const override; + + //! \copydoc CValueObject::isA + virtual bool isA(int metaTypeId) const override; + + //! \copydoc CValueObject::compareImpl + virtual int compareImpl(const CValueObject &other) const override; + + //! \copydoc CValueObject::marshallToDbus + virtual void marshallToDbus(QDBusArgument &argument) const override; + + //! \copydoc CValueObject::unmarshallFromDbus + virtual void unmarshallFromDbus(const QDBusArgument &argument) override; + + private: + BLACK_ENABLE_TUPLE_CONVERSION(CVoiceCapabilities) + uint m_voiceCapabilities; + + //! Capabilites from flight plans remarks such as "/V/" + void fromFlightPlanRemarks(const QString &flightPlanRemarks); + }; + + } // namespace + +} // namespace + +BLACK_DECLARE_TUPLE_CONVERSION(BlackMisc::Network::CVoiceCapabilities, (o.m_voiceCapabilities)) +Q_DECLARE_METATYPE(BlackMisc::Network::CVoiceCapabilities) + +#endif // guard