mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-05-05 09:45:44 +08:00
refs #319, added column formatters
* Specialized formatters (e.g. for bool, for PQs etc.) allow specialized look and feel for each column * Fixed isValidComFrequency used for formatters * Changed models to use formatters * Outdated propertyByIndexAsString methods removed * During the above tasks: fixed override keyword in some places * Column tooltips * refs #323, wrong column name fix
This commit is contained in:
@@ -24,16 +24,16 @@ namespace BlackGui
|
|||||||
*/
|
*/
|
||||||
CAircraftListModel::CAircraftListModel(QObject *parent) : CListModelBase("ViewAircraftList", parent)
|
CAircraftListModel::CAircraftListModel(QObject *parent) : CListModelBase("ViewAircraftList", parent)
|
||||||
{
|
{
|
||||||
this->m_columns.addColumn(CColumn("callsign", CAircraft::IndexCallsign));
|
this->m_columns.addColumn(CColumn::standardValueObject("callsign", CAircraft::IndexCallsign));
|
||||||
this->m_columns.addColumn(CColumn("pilotrealname", { CAircraft::IndexPilot, CUser::IndexRealName }));
|
this->m_columns.addColumn(CColumn::standardString("pilotrealname", { CAircraft::IndexPilot, CUser::IndexRealName }));
|
||||||
this->m_columns.addColumn(CColumn("distance", CAircraft::IndexDistance, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("distance", CAircraft::IndexDistance, new CAirspaceDistanceFormatter()));
|
||||||
this->m_columns.addColumn(CColumn("frequency", { CAircraft::IndexCom1System, CComSystem::IndexActiveFrequency }, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("frequency", { CAircraft::IndexCom1System, CComSystem::IndexActiveFrequency }, new CComFrequencyFormatter()));
|
||||||
this->m_columns.addColumn(CColumn("model", { CAircraft::IndexIcao, CAircraftIcao::IndexAsString}));
|
this->m_columns.addColumn(CColumn::standardString("icao", { CAircraft::IndexIcao, CAircraftIcao::IndexAsString}));
|
||||||
this->m_columns.addColumn(CColumn("transponder", { CAircraft::IndexTransponder, CTransponder::IndexTransponderCodeAndModeFormatted }));
|
this->m_columns.addColumn(CColumn::standardString("transponder", { CAircraft::IndexTransponder, CTransponder::IndexTransponderCodeAndModeFormatted }));
|
||||||
this->m_columns.addColumn(CColumn("latitude", { CAircraft::IndexSituation, CAircraftSituation::IndexLatitude }, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("latitude", { CAircraft::IndexSituation, CAircraftSituation::IndexLatitude }, new CLatLonFormatter()));
|
||||||
this->m_columns.addColumn(CColumn("longitude", { CAircraft::IndexSituation, CAircraftSituation::IndexLongitude }, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("longitude", { CAircraft::IndexSituation, CAircraftSituation::IndexLongitude }, new CLatLonFormatter()));
|
||||||
this->m_columns.addColumn(CColumn("altitude", { CAircraft::IndexSituation, CAircraftSituation::IndexAltitude }, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn::standardValueObject("altitude", { CAircraft::IndexSituation, CAircraftSituation::IndexAltitude }, CDefaultFormatter::alignRightVCenter()));
|
||||||
this->m_columns.addColumn(CColumn("groundspeed", { CAircraft::IndexSituation, CAircraftSituation::IndexGroundspeed }, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("gs", { CAircraft::IndexSituation, CAircraftSituation::IndexGroundspeed }, new CAircraftSpeedFormatter()));
|
||||||
|
|
||||||
// default sort order
|
// default sort order
|
||||||
this->setSortColumnByPropertyIndex(CAircraft::IndexDistance);
|
this->setSortColumnByPropertyIndex(CAircraft::IndexDistance);
|
||||||
@@ -49,7 +49,7 @@ namespace BlackGui
|
|||||||
(void)QT_TRANSLATE_NOOP("ViewAircraftList", "height");
|
(void)QT_TRANSLATE_NOOP("ViewAircraftList", "height");
|
||||||
(void)QT_TRANSLATE_NOOP("ViewAircraftList", "transponder");
|
(void)QT_TRANSLATE_NOOP("ViewAircraftList", "transponder");
|
||||||
(void)QT_TRANSLATE_NOOP("ViewAircraftList", "groundspeed");
|
(void)QT_TRANSLATE_NOOP("ViewAircraftList", "groundspeed");
|
||||||
(void)QT_TRANSLATE_NOOP("ViewAircraftList", "model");
|
(void)QT_TRANSLATE_NOOP("ViewAircraftList", "icao");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
using namespace BlackMisc::Aviation;
|
using namespace BlackMisc::Aviation;
|
||||||
using namespace BlackMisc::Geo;
|
using namespace BlackMisc::Geo;
|
||||||
|
using namespace BlackMisc::PhysicalQuantities;
|
||||||
|
|
||||||
namespace BlackGui
|
namespace BlackGui
|
||||||
{
|
{
|
||||||
@@ -25,13 +26,13 @@ namespace BlackGui
|
|||||||
CAirportListModel::CAirportListModel(QObject *parent) :
|
CAirportListModel::CAirportListModel(QObject *parent) :
|
||||||
CListModelBase<BlackMisc::Aviation::CAirport, BlackMisc::Aviation::CAirportList>("ViewAirportList", parent)
|
CListModelBase<BlackMisc::Aviation::CAirport, BlackMisc::Aviation::CAirportList>("ViewAirportList", parent)
|
||||||
{
|
{
|
||||||
this->m_columns.addColumn(CColumn("ICAO", CAirport::IndexIcao));
|
this->m_columns.addColumn(CColumn::standardValueObject("ICAO", CAirport::IndexIcao));
|
||||||
this->m_columns.addColumn(CColumn("distance", CAirport::IndexDistance, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("distance", CAirport::IndexDistance, new CAirspaceDistanceFormatter()));
|
||||||
this->m_columns.addColumn(CColumn("bearing", CAirport::IndexBearing, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("bearing", CAirport::IndexBearing, new CAngleDegreeFormatter()));
|
||||||
this->m_columns.addColumn(CColumn("name", CAirport::IndexDescriptiveName));
|
this->m_columns.addColumn(CColumn::standardString("name", CAirport::IndexDescriptiveName));
|
||||||
this->m_columns.addColumn(CColumn("elevation", CAirport::IndexElevation, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("elevation", CAirport::IndexElevation, new CPhysiqalQuantiyFormatter<CLengthUnit, CLength>(CLengthUnit::ft(), 0)));
|
||||||
this->m_columns.addColumn(CColumn("latitude", CCoordinateGeodetic::IndexLatitude, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("latitude", CAirport::IndexLatitude, new CLatLonFormatter()));
|
||||||
this->m_columns.addColumn(CColumn("longitude", CCoordinateGeodetic::IndexLongitude, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("longitude", CAirport::IndexLatitude, new CLatLonFormatter()));
|
||||||
|
|
||||||
// default sort order
|
// default sort order
|
||||||
this->setSortColumnByPropertyIndex(CAirport::IndexDistance);
|
this->setSortColumnByPropertyIndex(CAirport::IndexDistance);
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include "blackmisc/nwuser.h"
|
#include "blackmisc/nwuser.h"
|
||||||
#include "blackmisc/blackmiscfreefunctions.h"
|
#include "blackmisc/blackmiscfreefunctions.h"
|
||||||
|
|
||||||
|
using namespace BlackMisc::PhysicalQuantities;
|
||||||
using namespace BlackMisc::Audio;
|
using namespace BlackMisc::Audio;
|
||||||
using namespace BlackMisc::Aviation;
|
using namespace BlackMisc::Aviation;
|
||||||
using namespace BlackMisc::Network;
|
using namespace BlackMisc::Network;
|
||||||
@@ -27,6 +28,7 @@ namespace BlackGui
|
|||||||
CListModelBase("ViewAtcList", parent), m_stationMode(NotSet)
|
CListModelBase("ViewAtcList", parent), m_stationMode(NotSet)
|
||||||
{
|
{
|
||||||
this->setStationMode(stationMode);
|
this->setStationMode(stationMode);
|
||||||
|
|
||||||
// force strings for translation in resource files
|
// force strings for translation in resource files
|
||||||
(void)QT_TRANSLATE_NOOP("ViewAtcList", "callsign");
|
(void)QT_TRANSLATE_NOOP("ViewAtcList", "callsign");
|
||||||
(void)QT_TRANSLATE_NOOP("ViewAtcList", "distance");
|
(void)QT_TRANSLATE_NOOP("ViewAtcList", "distance");
|
||||||
@@ -47,14 +49,16 @@ namespace BlackGui
|
|||||||
{
|
{
|
||||||
case NotSet:
|
case NotSet:
|
||||||
case StationsOnline:
|
case StationsOnline:
|
||||||
this->m_columns.addColumn(CColumn("callsign", { CAtcStation::IndexCallsign, CCallsign::IndexCallsignStringAsSet }));
|
this->m_columns.addColumn(CColumn::standardString("callsign", { CAtcStation::IndexCallsign, CCallsign::IndexCallsignStringAsSet }));
|
||||||
this->m_columns.addColumn(CColumn(CAtcStation::IndexPixmap, true));
|
this->m_columns.addColumn(CColumn("type", CAtcStation::IndexIcon));
|
||||||
this->m_columns.addColumn(CColumn("distance", CAtcStation::IndexDistance, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("distance", CAtcStation::IndexDistance, new CAirspaceDistanceFormatter()));
|
||||||
this->m_columns.addColumn(CColumn("frequency", CAtcStation::IndexFrequency, Qt::AlignRight | Qt::AlignVCenter));
|
this->m_columns.addColumn(CColumn("frequency", CAtcStation::IndexFrequency, new CComFrequencyFormatter()));
|
||||||
this->m_columns.addColumn(CColumn("controllername", { CAtcStation::IndexController, CUser::IndexRealName }));
|
this->m_columns.addColumn(CColumn::standardString("controllername", { CAtcStation::IndexController, CUser::IndexRealName }));
|
||||||
this->m_columns.addColumn(CColumn("bookedfrom", CAtcStation::IndexBookedFrom));
|
this->m_columns.addColumn(CColumn("bookedfrom", CAtcStation::IndexBookedFrom,
|
||||||
this->m_columns.addColumn(CColumn("bookeduntil", CAtcStation::IndexBookedUntil));
|
new CDateTimeFormatter(CDateTimeFormatter::formatHm())));
|
||||||
this->m_columns.addColumn(CColumn("voiceroomurl", { CAtcStation::IndexVoiceRoom, CVoiceRoom::IndexUrl }));
|
this->m_columns.addColumn(CColumn("bookeduntil", CAtcStation::IndexBookedUntil,
|
||||||
|
new CDateTimeFormatter(CDateTimeFormatter::formatHm())));
|
||||||
|
this->m_columns.addColumn(CColumn::standardString("voiceroomurl", { CAtcStation::IndexVoiceRoom, CVoiceRoom::IndexUrl }));
|
||||||
|
|
||||||
// default sort order
|
// default sort order
|
||||||
this->setSortColumnByPropertyIndex(CAtcStation::IndexDistance);
|
this->setSortColumnByPropertyIndex(CAtcStation::IndexDistance);
|
||||||
@@ -62,13 +66,15 @@ namespace BlackGui
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case StationsBooked:
|
case StationsBooked:
|
||||||
this->m_columns.addColumn(CColumn("callsign", { CAtcStation::IndexCallsign, CCallsign::IndexCallsignStringAsSet}));
|
this->m_columns.addColumn(CColumn::standardString("callsign", { CAtcStation::IndexCallsign, CCallsign::IndexCallsignStringAsSet }));
|
||||||
this->m_columns.addColumn(CColumn(CAtcStation::IndexPixmap, true));
|
this->m_columns.addColumn(CColumn(CAtcStation::IndexIcon));
|
||||||
this->m_columns.addColumn(CColumn("controllername", {CAtcStation::IndexController, CUser::IndexRealName }));
|
this->m_columns.addColumn(CColumn("", CAtcStation::IndexIsOnline, new CBoolLedFormatter("online", "offline")));
|
||||||
this->m_columns.addColumn(CColumn("bookedfrom", CAtcStation::IndexBookedFrom));
|
this->m_columns.addColumn(CColumn::standardString("controllername", { CAtcStation::IndexController, CUser::IndexRealName }));
|
||||||
this->m_columns.addColumn(CColumn("bookeduntil", CAtcStation::IndexBookedUntil));
|
this->m_columns.addColumn(CColumn("bookedfrom", CAtcStation::IndexBookedFrom,
|
||||||
this->m_columns.addColumn(CColumn("frequency", CAtcStation::IndexFrequency, Qt::AlignRight | Qt::AlignVCenter));
|
new CDateTimeFormatter(CDateTimeFormatter::formatYmdhm())));
|
||||||
this->m_columns.addColumn(CColumn("online", CAtcStation::IndexIsOnline));
|
this->m_columns.addColumn(CColumn("bookeduntil", CAtcStation::IndexBookedUntil,
|
||||||
|
new CDateTimeFormatter(CDateTimeFormatter::formatYmdhm())));
|
||||||
|
this->m_columns.addColumn(CColumn("frequency", CAtcStation::IndexFrequency, new CComFrequencyFormatter()));
|
||||||
|
|
||||||
// default sort order
|
// default sort order
|
||||||
this->setSortColumnByPropertyIndex(CAtcStation::IndexBookedFrom);
|
this->setSortColumnByPropertyIndex(CAtcStation::IndexBookedFrom);
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ namespace BlackGui
|
|||||||
//! Set station mode
|
//! Set station mode
|
||||||
void setStationMode(AtcStationMode stationMode);
|
void setStationMode(AtcStationMode stationMode);
|
||||||
|
|
||||||
|
//! Station mode
|
||||||
|
AtcStationMode getStationMode() const { return this->m_stationMode; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
//! Used to quickly update single station (better response for the user)
|
//! Used to quickly update single station (better response for the user)
|
||||||
void changedAtcStationConnectionStatus(const BlackMisc::Aviation::CAtcStation &station, bool added);
|
void changedAtcStationConnectionStatus(const BlackMisc::Aviation::CAtcStation &station, bool added);
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
#include "clientlistmodel.h"
|
#include "clientlistmodel.h"
|
||||||
#include "blackmisc/blackmiscfreefunctions.h"
|
#include "blackmisc/blackmiscfreefunctions.h"
|
||||||
#include "blackmisc/icon.h"
|
#include "blackmisc/icons.h"
|
||||||
#include <QMetaProperty>
|
#include <QMetaProperty>
|
||||||
#include <QBrush>
|
#include <QBrush>
|
||||||
|
|
||||||
@@ -26,14 +26,15 @@ namespace BlackGui
|
|||||||
CClientListModel::CClientListModel(QObject *parent) :
|
CClientListModel::CClientListModel(QObject *parent) :
|
||||||
CListModelBase<BlackMisc::Network::CClient, BlackMisc::Network::CClientList>("ViewClientList", parent)
|
CListModelBase<BlackMisc::Network::CClient, BlackMisc::Network::CClientList>("ViewClientList", parent)
|
||||||
{
|
{
|
||||||
this->m_columns.addColumn(CColumn(CClient::IndexPixmap, true));
|
this->m_columns.addColumn(CColumn("client", CClient::IndexIcon));
|
||||||
this->m_columns.addColumn(CColumn("callsign", CClient::IndexCallsign));
|
this->m_columns.addColumn(CColumn::standardValueObject("callsign", CClient::IndexCallsign));
|
||||||
this->m_columns.addColumn(CColumn("realname", { CClient::IndexUser, CUser::IndexRealName }));
|
this->m_columns.addColumn(CColumn::standardString("realname", { CClient::IndexUser, CUser::IndexRealName }));
|
||||||
this->m_columns.addColumn(CColumn(CClient::IndexVoiceCapabilitiesPixmap, true));
|
this->m_columns.addColumn(CColumn("capabilities", CClient::IndexVoiceCapabilitiesIcon));
|
||||||
this->m_columns.addColumn(CColumn("capabilities", CClient::IndexCapabilitiesString));
|
this->m_columns.addColumn(CColumn::standardString("capabilities", CClient::IndexCapabilitiesString));
|
||||||
this->m_columns.addColumn(CColumn("model", {CClient::IndexModel, CAircraftModel::IndexModelString}));
|
this->m_columns.addColumn(CColumn::standardString("model", {CClient::IndexModel, CAircraftModel::IndexModelString}));
|
||||||
this->m_columns.addColumn(CColumn("queried?", {CClient::IndexModel, CAircraftModel::IndexIsQueriedModelString}));
|
this->m_columns.addColumn(CColumn("q.?", "queried", {CClient::IndexModel, CAircraftModel::IndexIsQueriedModelString},
|
||||||
this->m_columns.addColumn(CColumn("server", CClient::IndexServer));
|
new CBoolIconFormatter(CIcons::StandardIconTick, CIcons::StandardIconCross, "queried", "not queried")));
|
||||||
|
this->m_columns.addColumn(CColumn::standardString("server", CClient::IndexServer));
|
||||||
|
|
||||||
// force strings for translation in resource files
|
// force strings for translation in resource files
|
||||||
// force strings for translation in resource files
|
// force strings for translation in resource files
|
||||||
|
|||||||
302
src/blackgui/models/columnformatters.cpp
Normal file
302
src/blackgui/models/columnformatters.cpp
Normal file
@@ -0,0 +1,302 @@
|
|||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "columnformatters.h"
|
||||||
|
#include "blackmisc/geolatitude.h"
|
||||||
|
#include "blackmisc/variant.h"
|
||||||
|
#include "blackmisc/iconlist.h"
|
||||||
|
#include "blackmisc/icons.h"
|
||||||
|
|
||||||
|
using namespace BlackMisc;
|
||||||
|
|
||||||
|
namespace BlackGui
|
||||||
|
{
|
||||||
|
namespace Models
|
||||||
|
{
|
||||||
|
|
||||||
|
QVariant CDefaultFormatter::displayRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
// seems to be absurd, but calls the correct methods on CValueObjects
|
||||||
|
// so QVariant -> QString -> QVariant is correct
|
||||||
|
if (static_cast<QMetaType::Type>(dataQVariant.type()) == QMetaType::QString) return dataQVariant; // shortcut
|
||||||
|
return BlackMisc::qVariantToString(dataQVariant, m_useI18n);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CDefaultFormatter::decorationRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
// direct return if type is already correct
|
||||||
|
if (static_cast<QMetaType::Type>(dataQVariant.type()) == QMetaType::QPixmap)
|
||||||
|
{
|
||||||
|
return dataQVariant;
|
||||||
|
}
|
||||||
|
else if (static_cast<QMetaType::Type>(dataQVariant.type()) == QMetaType::QIcon)
|
||||||
|
{
|
||||||
|
return dataQVariant;
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert to pixmap
|
||||||
|
if (static_cast<QMetaType::Type>(dataQVariant.type()) == QMetaType::QImage)
|
||||||
|
{
|
||||||
|
QImage img = dataQVariant.value<QImage>();
|
||||||
|
return QPixmap::fromImage(img);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Our CIcon class
|
||||||
|
if (dataQVariant.canConvert<BlackMisc::CIcon>())
|
||||||
|
{
|
||||||
|
BlackMisc::CIcon i = dataQVariant.value<BlackMisc::CIcon>();
|
||||||
|
return i.toPixmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
// nope
|
||||||
|
return QPixmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CDefaultFormatter::alignmentRole() const
|
||||||
|
{
|
||||||
|
if (!this->hasAlignment())
|
||||||
|
{
|
||||||
|
return QVariant(alignDefault()); // default
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return QVariant(m_alignment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CDefaultFormatter::data(int role, const QVariant &inputData) const
|
||||||
|
{
|
||||||
|
Qt::ItemDataRole roleEnum = static_cast<Qt::ItemDataRole>(role);
|
||||||
|
|
||||||
|
// always supported
|
||||||
|
if (roleEnum == Qt::TextAlignmentRole) return { alignmentRole() };
|
||||||
|
|
||||||
|
// checked
|
||||||
|
if (this->m_supportedRoles.isEmpty()) return QVariant();
|
||||||
|
if (!this->m_supportedRoles.contains(role)) return QVariant();
|
||||||
|
switch (roleEnum)
|
||||||
|
{
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
// formatted to string
|
||||||
|
return displayRole(inputData);
|
||||||
|
case Qt::ToolTipRole:
|
||||||
|
// formatted to string
|
||||||
|
return tooltipRole(inputData);
|
||||||
|
case Qt::DecorationRole:
|
||||||
|
// formatted as pixmap, icon, or color
|
||||||
|
return decorationRole(inputData);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CPixmapFormatter::displayRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(dataQVariant);
|
||||||
|
Q_ASSERT_X(false, "CPixmapFormatter", "this role should be disabled with pixmaps");
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CPixmapFormatter::tooltipRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
if (dataQVariant.isNull()) return "";
|
||||||
|
if (dataQVariant.canConvert<BlackMisc::CIcon>())
|
||||||
|
{
|
||||||
|
BlackMisc::CIcon icon = dataQVariant.value<BlackMisc::CIcon>();
|
||||||
|
return icon.getDescriptiveText();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CValueObjectFormatter::displayRole(const QVariant &valueObject) const
|
||||||
|
{
|
||||||
|
if (valueObject.isNull()) return QVariant();
|
||||||
|
const BlackMisc::CValueObject *cvo = BlackMisc::CValueObject::fromQVariant(valueObject);
|
||||||
|
Q_ASSERT(cvo);
|
||||||
|
if (!cvo) return QVariant();
|
||||||
|
return QVariant(cvo->toQString(m_useI18n));
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CValueObjectFormatter::decorationRole(const QVariant &valueObject) const
|
||||||
|
{
|
||||||
|
if (valueObject.isNull()) return "";
|
||||||
|
const BlackMisc::CValueObject *cvo = BlackMisc::CValueObject::fromQVariant(valueObject);
|
||||||
|
Q_ASSERT(cvo);
|
||||||
|
if (!cvo) return QPixmap();
|
||||||
|
return QVariant(cvo->toPixmap());
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CDateTimeFormatter::displayRole(const QVariant &dateTime) const
|
||||||
|
{
|
||||||
|
if (dateTime.isNull()) return "";
|
||||||
|
if (dateTime.type() == QMetaType::QDateTime)
|
||||||
|
{
|
||||||
|
QDateTime dt = dateTime.value<QDateTime>();
|
||||||
|
return dt.toString(m_formatString);
|
||||||
|
}
|
||||||
|
else if (dateTime.type() == QMetaType::QDate)
|
||||||
|
{
|
||||||
|
QDate d = dateTime.value<QDate>();
|
||||||
|
return d.toString(m_formatString);
|
||||||
|
}
|
||||||
|
else if (dateTime.type() == QMetaType::QTime)
|
||||||
|
{
|
||||||
|
QTime t = dateTime.value<QTime>();
|
||||||
|
return t.toString(m_formatString);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Q_ASSERT_X(false, "formatQVariant", "No QDate, QTime or QDateTime");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CAirspaceDistanceFormatter::displayRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
if (dataQVariant.canConvert<BlackMisc::PhysicalQuantities::CLength>())
|
||||||
|
{
|
||||||
|
// special treatment for some cases
|
||||||
|
BlackMisc::PhysicalQuantities::CLength l = dataQVariant.value<BlackMisc::PhysicalQuantities::CLength>();
|
||||||
|
if (!l.isNull() && (l.isPositiveWithEpsilonConsidered() || l.isZeroEpsilonConsidered()))
|
||||||
|
{
|
||||||
|
return CPhysiqalQuantiyFormatter::displayRole(dataQVariant);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Q_ASSERT_X(false, "CAirspaceDistanceFormatter::formatQVariant", "No CLength class");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CComFrequencyFormatter::displayRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
if (dataQVariant.canConvert<BlackMisc::PhysicalQuantities::CFrequency>())
|
||||||
|
{
|
||||||
|
// speical treatment for some cases
|
||||||
|
BlackMisc::PhysicalQuantities::CFrequency f = dataQVariant.value<BlackMisc::PhysicalQuantities::CFrequency>();
|
||||||
|
if (BlackMisc::Aviation::CComSystem::isValidComFrequency(f))
|
||||||
|
{
|
||||||
|
return CPhysiqalQuantiyFormatter::displayRole(dataQVariant);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Q_ASSERT_X(false, "CAviationComFrequencyFormatter::formatQVariant", "No CFrequency class");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CAircraftSpeedFormatter::displayRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
// special treatment for some cases
|
||||||
|
BlackMisc::PhysicalQuantities::CSpeed s = dataQVariant.value<BlackMisc::PhysicalQuantities::CSpeed>();
|
||||||
|
if (!s.isNull() && (s.isPositiveWithEpsilonConsidered() || s.isZeroEpsilonConsidered()))
|
||||||
|
{
|
||||||
|
return CPhysiqalQuantiyFormatter::displayRole(dataQVariant);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CStringFormatter::displayRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
if (dataQVariant.canConvert<QString>()) { return dataQVariant; }
|
||||||
|
Q_ASSERT_X(false, "CStringFormatter", "no string value");
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CBoolTextFormatter::displayRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
if (dataQVariant.canConvert<bool>())
|
||||||
|
{
|
||||||
|
bool v = dataQVariant.toBool();
|
||||||
|
return v ? QVariant(m_trueName) : QVariant(m_falseName);
|
||||||
|
}
|
||||||
|
Q_ASSERT_X(false, "CBoolTextFormatter", "no boolean value");
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
CBoolLedFormatter::CBoolLedFormatter(int alignment) : CBoolLedFormatter("on", "off", alignment)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
CBoolLedFormatter::CBoolLedFormatter(const QString &onName, const QString &offName, int alignment) :
|
||||||
|
CBoolTextFormatter(alignment, onName, offName, roleDecorationAndToolTip())
|
||||||
|
{
|
||||||
|
CLedWidget *led = ledDefault();
|
||||||
|
led->setOn(true);
|
||||||
|
this->m_pixmapOnLed = led->asPixmap();
|
||||||
|
led->setOn(false);
|
||||||
|
this->m_pixmapOffLed = led->asPixmap();
|
||||||
|
delete led;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CBoolLedFormatter::displayRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(dataQVariant);
|
||||||
|
Q_ASSERT_X(false, "CBoolLedFormatter", "this role should be disabled with led boolean");
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CBoolLedFormatter::decorationRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
if (dataQVariant.canConvert<bool>())
|
||||||
|
{
|
||||||
|
bool v = dataQVariant.toBool();
|
||||||
|
return v ? m_pixmapOnLed : m_pixmapOffLed;
|
||||||
|
}
|
||||||
|
Q_ASSERT_X(false, "CBoolLedFormatter", "no boolean value");
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
CBoolIconFormatter::CBoolIconFormatter(int alignment) :
|
||||||
|
CBoolIconFormatter(CIcons::StandardIconTick, CIcons::StandardIconEmpty16, "on", "off", alignment)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
CBoolIconFormatter::CBoolIconFormatter(CIcons::IconIndex onIcon, CIcons::IconIndex offIcon, const QString &onName, const QString &offName, int alignment) :
|
||||||
|
CBoolIconFormatter(CIconList::iconForIndex(onIcon), CIconList::iconForIndex(offIcon), onName, offName, alignment)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
CBoolIconFormatter::CBoolIconFormatter(const CIcon &onIcon, const CIcon &offIcon, const QString &onName, const QString &offName, int alignment) :
|
||||||
|
CBoolTextFormatter(alignment, onName, offName, roleDecorationAndToolTip()), m_iconOn(onIcon), m_iconOff(offIcon)
|
||||||
|
{
|
||||||
|
this->m_iconOn.setDescriptiveText(onName);
|
||||||
|
this->m_iconOff.setDescriptiveText(offName);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CBoolIconFormatter::displayRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(dataQVariant);
|
||||||
|
Q_ASSERT_X(false, "CBoolIconFormatter", "this role should be disabled with icon boolean");
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CBoolIconFormatter::decorationRole(const QVariant &dataQVariant) const
|
||||||
|
{
|
||||||
|
if (dataQVariant.canConvert<bool>())
|
||||||
|
{
|
||||||
|
bool v = dataQVariant.toBool();
|
||||||
|
return v ? m_iconOn.toPixmap() : m_iconOff.toPixmap();
|
||||||
|
}
|
||||||
|
Q_ASSERT_X(false, "CBoolIconFormatter", "no boolean value");
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
327
src/blackgui/models/columnformatters.h
Normal file
327
src/blackgui/models/columnformatters.h
Normal file
@@ -0,0 +1,327 @@
|
|||||||
|
/* 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
|
||||||
|
|
||||||
|
#ifndef BLACKGUI_COLUMNFORMATTERS_H
|
||||||
|
#define BLACKGUI_COLUMNFORMATTERS_H
|
||||||
|
|
||||||
|
#include "blackgui/led.h"
|
||||||
|
#include "blackmisc/pqallquantities.h"
|
||||||
|
#include "blackmisc/aviocomsystem.h"
|
||||||
|
#include "blackmisc/blackmiscfreefunctions.h"
|
||||||
|
#include "blackmisc/icon.h"
|
||||||
|
#include <QDateTime>
|
||||||
|
#include <QDate>
|
||||||
|
#include <QTime>
|
||||||
|
|
||||||
|
namespace BlackGui
|
||||||
|
{
|
||||||
|
namespace Models
|
||||||
|
{
|
||||||
|
//! Column formatter default implementation, also serving as interface
|
||||||
|
class CDefaultFormatter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CDefaultFormatter(int alignment = alignDefault(), bool i18n = true, const QList<int> &supportedRoles = { Qt::DisplayRole }) :
|
||||||
|
m_supportedRoles(supportedRoles), m_alignment(alignment), m_useI18n(i18n) {}
|
||||||
|
|
||||||
|
//! Virtual destructor
|
||||||
|
virtual ~CDefaultFormatter() {}
|
||||||
|
|
||||||
|
//! Value provided as QVariant, formatter converts to QString.
|
||||||
|
//! Used with Qt::DisplayRole displaying a text.
|
||||||
|
virtual QVariant displayRole(const QVariant &dataQVariant) const;
|
||||||
|
|
||||||
|
//! Value provided as QVariant, formatter converts to QString.
|
||||||
|
//! Used with Qt::ToolTipRole displaying a text.
|
||||||
|
virtual QVariant tooltipRole(const QVariant &value) const
|
||||||
|
{
|
||||||
|
return displayRole(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Value provided as QVariant, formatted as icon (Qt docu: "The data to be rendered as a decoration in the form of an icon").
|
||||||
|
//! Used with Qt::DecorationRole displaying an icon, method returns pixmap, icon, or color (see docu)
|
||||||
|
virtual QVariant decorationRole(const QVariant &dataQVariant) const;
|
||||||
|
|
||||||
|
//! Qt::Alignment (as QVariant)
|
||||||
|
virtual QVariant alignmentRole() const;
|
||||||
|
|
||||||
|
//! Alignment available?
|
||||||
|
virtual bool hasAlignment() const { return m_alignment >= 0; }
|
||||||
|
|
||||||
|
//! Receives QVariant of column data, and returns QVariant wrapping string, pixmap, or other values depending on role
|
||||||
|
virtual QVariant data(int role, const QVariant &inputData) const;
|
||||||
|
|
||||||
|
//! Default value
|
||||||
|
static int alignDefault() { return alignLeftVCenter(); }
|
||||||
|
|
||||||
|
//! Align left/vertically centered
|
||||||
|
static int alignLeftVCenter() { return Qt::AlignVCenter | Qt::AlignLeft; }
|
||||||
|
|
||||||
|
//! Align centered
|
||||||
|
static int alignCentered() { return Qt::AlignVCenter | Qt::AlignHCenter; }
|
||||||
|
|
||||||
|
//! Align right/vertically centered
|
||||||
|
static int alignRightVCenter() { return Qt::AlignVCenter | Qt::AlignRight; }
|
||||||
|
|
||||||
|
//! Display on role
|
||||||
|
static const QList<int> &roleDisplay() { static const QList<int> r({ Qt::DisplayRole}); return r; }
|
||||||
|
|
||||||
|
//! Display on role
|
||||||
|
static const QList<int> &roleDecorationAndToolTip() { static const QList<int> r({ Qt::DecorationRole, Qt::ToolTipRole}); return r; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QList<int> m_supportedRoles = QList<int>({ Qt::DisplayRole}); //!< supports decoration role
|
||||||
|
int m_alignment = -1; //!< alignment horizontal/vertically / Qt::Alignment
|
||||||
|
bool m_useI18n = true; //!< i18n?
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Pixmap formatter
|
||||||
|
class CPixmapFormatter : public CDefaultFormatter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CPixmapFormatter(int alignment = alignDefault(), const QList<int> &supportedRoles = roleDecorationAndToolTip()) : CDefaultFormatter(alignment, false, supportedRoles) {}
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::displayRole
|
||||||
|
virtual QVariant displayRole(const QVariant &dataQVariant) const override;
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::tooltipRole
|
||||||
|
virtual QVariant tooltipRole(const QVariant &dataQVariant) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
//! String formatter, if known the variant already contains the appropriate string
|
||||||
|
class CStringFormatter : public CDefaultFormatter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CStringFormatter(int alignment = alignDefault()) : CDefaultFormatter(alignment, false, roleDisplay()) {}
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::displayRole
|
||||||
|
virtual QVariant displayRole(const QVariant &dataQVariant) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Bool value, format as text
|
||||||
|
class CBoolTextFormatter : public CDefaultFormatter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CBoolTextFormatter(int alignment = alignDefault(), const QString &trueName = "true", const QString &falseName = "false", const QList<int> &supportedRoles = roleDisplay()) :
|
||||||
|
CDefaultFormatter(alignment, false, supportedRoles), m_trueName(trueName), m_falseName(falseName) {}
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::displayRole
|
||||||
|
virtual QVariant displayRole(const QVariant &dataQVariant) const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QString m_trueName = "true"; //!< displayed when true
|
||||||
|
QString m_falseName = "false"; //!< displayed when false
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Format as bool LED value
|
||||||
|
class CBoolLedFormatter : public CBoolTextFormatter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
//! Constructor
|
||||||
|
CBoolLedFormatter(int alignment = alignDefault());
|
||||||
|
|
||||||
|
//! Constructor
|
||||||
|
CBoolLedFormatter(const QString &onName, const QString &offName, int alignment = alignDefault());
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::displayRole
|
||||||
|
virtual QVariant displayRole(const QVariant &dataQVariant) const override;
|
||||||
|
|
||||||
|
//! Display the LED
|
||||||
|
virtual QVariant decorationRole(const QVariant &dataQVariant) const override;
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::tooltipRole
|
||||||
|
virtual QVariant tooltipRole(const QVariant &dataQVariant) const override
|
||||||
|
{
|
||||||
|
return CBoolTextFormatter::displayRole(dataQVariant);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Default LED
|
||||||
|
static BlackGui::CLedWidget *ledDefault()
|
||||||
|
{
|
||||||
|
return new BlackGui::CLedWidget(false, BlackGui::CLedWidget::Yellow, BlackGui::CLedWidget::Black, BlackGui::CLedWidget::Rounded);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QPixmap m_pixmapOnLed; //!< Pixmap used when on
|
||||||
|
QPixmap m_pixmapOffLed; //!< Pixmap used when off
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Format as bool pixmap
|
||||||
|
class CBoolIconFormatter : public CBoolTextFormatter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
//! Constructor
|
||||||
|
CBoolIconFormatter(int alignment = alignDefault());
|
||||||
|
|
||||||
|
//! Constructor
|
||||||
|
CBoolIconFormatter(const BlackMisc::CIcon &onIcon, const BlackMisc::CIcon &offIcon, const QString &onName, const QString &offName, int alignment = alignDefault());
|
||||||
|
|
||||||
|
//! Constructor
|
||||||
|
CBoolIconFormatter(BlackMisc::CIcons::IconIndex onIcon, BlackMisc::CIcons::IconIndex offIcon, const QString &onName, const QString &offName, int alignment = alignDefault());
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::displayRole
|
||||||
|
virtual QVariant displayRole(const QVariant &dataQVariant) const override;
|
||||||
|
|
||||||
|
//! Display the icon
|
||||||
|
virtual QVariant decorationRole(const QVariant &dataQVariant) const override;
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::tooltipRole
|
||||||
|
virtual QVariant tooltipRole(const QVariant &dataQVariant) const override
|
||||||
|
{
|
||||||
|
return CBoolTextFormatter::displayRole(dataQVariant);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
BlackMisc::CIcon m_iconOn; //!< Used when on
|
||||||
|
BlackMisc::CIcon m_iconOff; //!< Used when off
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Default formatter when column contains CValueObject
|
||||||
|
class CValueObjectFormatter : public CDefaultFormatter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CValueObjectFormatter(int alignment = alignDefault(), bool i18n = true, QList<int> supportedRoles = {Qt::DisplayRole}) : CDefaultFormatter(alignment, i18n, supportedRoles) {}
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::displayRole
|
||||||
|
virtual QVariant displayRole(const QVariant &valueObject) const override;
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::asPixmap
|
||||||
|
virtual QVariant decorationRole(const QVariant &valueObject) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Formatter when column contains QDateTime, QDate or QTime
|
||||||
|
class CDateTimeFormatter : public CDefaultFormatter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CDateTimeFormatter(const QString formatString = formatYmd(), int alignment = alignDefault(), bool i18n = true) :
|
||||||
|
CDefaultFormatter(alignment, i18n, { Qt::DisplayRole }), m_formatString(formatString) {}
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::displayRole
|
||||||
|
virtual QVariant displayRole(const QVariant &dateTime) const override;
|
||||||
|
|
||||||
|
//! Year month day
|
||||||
|
static const QString &formatYmd() { static const QString f = "yyyy-MM-dd"; return f; }
|
||||||
|
|
||||||
|
//! Year month day hour minute
|
||||||
|
static const QString &formatYmdhm() { static const QString f = "yyyy-MM-dd HH:mm"; return f; }
|
||||||
|
|
||||||
|
//! Hour minute
|
||||||
|
static const QString &formatHm() { static const QString f = "HH:mm"; return f; }
|
||||||
|
|
||||||
|
//! Hour minute second
|
||||||
|
static const QString &formatHms() { static const QString f = "HH:mm:ss"; return f; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_formatString = "yyyy-MM-dd HH:mm"; //!< how the value is displayed
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Formatter for physical quantities
|
||||||
|
template<class MU, class PQ> class CPhysiqalQuantiyFormatter : public CValueObjectFormatter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CPhysiqalQuantiyFormatter(MU unit = MU::defaultUnit(), int digits = 2, int alignment = alignRightVCenter(), bool withUnit = true, bool i18n = true, QList<int> supportedRoles = { Qt::DisplayRole }) : CValueObjectFormatter(alignment, i18n, supportedRoles), m_unit(unit), m_digits(digits), m_withUnit(withUnit) {}
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::displayRole
|
||||||
|
virtual QVariant displayRole(const QVariant &physicalQuantity) const override
|
||||||
|
{
|
||||||
|
if (physicalQuantity.canConvert<PQ>())
|
||||||
|
{
|
||||||
|
PQ pq = physicalQuantity.value<PQ>();
|
||||||
|
if (!m_unit.isNull())
|
||||||
|
{
|
||||||
|
pq.switchUnit(m_unit);
|
||||||
|
}
|
||||||
|
return pq.valueRoundedWithUnit(m_digits, m_useI18n);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Q_ASSERT_X(false, "CPhysiqalQuantiyFormatter::displayRole", "No CPhysicalQuantity class");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Set unit
|
||||||
|
virtual void setUnit(const MU &unit) { m_unit = unit; }
|
||||||
|
|
||||||
|
//! Enable unit display
|
||||||
|
virtual void enableUnit(bool enable) { m_withUnit = enable; }
|
||||||
|
|
||||||
|
//! Digits
|
||||||
|
virtual void setDigits(int digits) { m_digits = digits; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
MU m_unit; //!< unit
|
||||||
|
int m_digits = 2; //!< digits
|
||||||
|
bool m_withUnit = true; //!< format with unit?
|
||||||
|
};
|
||||||
|
|
||||||
|
//! COM frequencies
|
||||||
|
class CComFrequencyFormatter : public CPhysiqalQuantiyFormatter<BlackMisc::PhysicalQuantities::CFrequencyUnit, BlackMisc::PhysicalQuantities::CFrequency>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CComFrequencyFormatter(int alignment = alignRightVCenter(), bool withUnit = true, bool i18n = true) : CPhysiqalQuantiyFormatter(BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz(), 3, alignment, withUnit, i18n) {}
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::displayRole
|
||||||
|
virtual QVariant displayRole(const QVariant &dataQVariant) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Angle in degrees
|
||||||
|
class CAngleDegreeFormatter : public CPhysiqalQuantiyFormatter<BlackMisc::PhysicalQuantities::CAngleUnit, BlackMisc::PhysicalQuantities::CAngle>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CAngleDegreeFormatter(int alignment = alignRightVCenter(), bool withUnit = true, bool i18n = true) : CPhysiqalQuantiyFormatter(BlackMisc::PhysicalQuantities::CAngleUnit::deg(), 0, alignment, withUnit, i18n) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Latitude or Longitude formatter
|
||||||
|
class CLatLonFormatter : public CValueObjectFormatter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CLatLonFormatter(int alignment = alignRightVCenter()) : CValueObjectFormatter(alignment) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Airspace distance
|
||||||
|
class CAirspaceDistanceFormatter : public CPhysiqalQuantiyFormatter<BlackMisc::PhysicalQuantities::CLengthUnit, BlackMisc::PhysicalQuantities::CLength>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CAirspaceDistanceFormatter(int alignment = alignRightVCenter(), bool withUnit = true, bool i18n = true) : CPhysiqalQuantiyFormatter(BlackMisc::PhysicalQuantities::CLengthUnit::NM(), 1, alignment, withUnit, i18n) {}
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::displayRole
|
||||||
|
virtual QVariant displayRole(const QVariant &dataQVariant) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Airspace distance
|
||||||
|
class CAircraftSpeedFormatter : public CPhysiqalQuantiyFormatter<BlackMisc::PhysicalQuantities::CSpeedUnit, BlackMisc::PhysicalQuantities::CSpeed>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructor
|
||||||
|
CAircraftSpeedFormatter(int alignment = alignRightVCenter(), bool withUnit = true, bool i18n = true) : CPhysiqalQuantiyFormatter(BlackMisc::PhysicalQuantities::CSpeedUnit::kts(), 0, alignment, withUnit, i18n) {}
|
||||||
|
|
||||||
|
//! \copydoc CDefaultFormatter::displayRole
|
||||||
|
virtual QVariant displayRole(const QVariant &dataQVariant) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
#endif // guard
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/* Copyright (C) 2013
|
/* Copyright (C) 2013
|
||||||
* Swift Project Community / Contributors
|
* 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
|
* 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,
|
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||||
@@ -8,26 +8,24 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "columns.h"
|
#include "columns.h"
|
||||||
#include <QModelIndex>
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
|
|
||||||
namespace BlackGui
|
namespace BlackGui
|
||||||
{
|
{
|
||||||
namespace Models
|
namespace Models
|
||||||
{
|
{
|
||||||
CColumn::CColumn(const QString &headerName, const BlackMisc::CPropertyIndex &propertyIndex, int alignment, bool editable) :
|
|
||||||
m_columnName(headerName), m_alignment(alignment), m_propertyIndex(propertyIndex),
|
CColumn::CColumn(const QString &headerName, const QString &toolTip, const BlackMisc::CPropertyIndex &propertyIndex, CDefaultFormatter *formatter, bool editable) :
|
||||||
m_editable(editable), m_icon(false)
|
m_columnName(headerName), m_columnToolTip(toolTip), m_formatter(formatter ? formatter : new CDefaultFormatter()), m_propertyIndex(propertyIndex),
|
||||||
|
m_editable(editable)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
CColumn::CColumn(const QString &headerName, const BlackMisc::CPropertyIndex &propertyIndex, bool editable) :
|
CColumn::CColumn(const BlackMisc::CPropertyIndex &propertyIndex) :
|
||||||
m_columnName(headerName), m_alignment(-1), m_propertyIndex(propertyIndex),
|
m_formatter(new CPixmapFormatter()), m_propertyIndex(propertyIndex), m_editable(false)
|
||||||
m_editable(editable), m_icon(false)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
CColumn::CColumn(const BlackMisc::CPropertyIndex &propertyIndex, bool isIcon) :
|
CColumn::CColumn(const QString &toolTip, const BlackMisc::CPropertyIndex &propertyIndex) :
|
||||||
m_alignment(-1), m_propertyIndex(propertyIndex),
|
m_columnToolTip(toolTip), m_formatter(new CPixmapFormatter()), m_propertyIndex(propertyIndex), m_editable(false)
|
||||||
m_editable(false), m_icon(isIcon)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
const char *CColumn::getTranslationContextChar() const
|
const char *CColumn::getTranslationContextChar() const
|
||||||
@@ -40,10 +38,9 @@ namespace BlackGui
|
|||||||
return this->m_columnName.toUtf8().constData();
|
return this->m_columnName.toUtf8().constData();
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant CColumn::aligmentAsQVariant() const
|
const char *CColumn::getColumnToolTipChar() const
|
||||||
{
|
{
|
||||||
if (this->hasAlignment()) return QVariant(this->m_alignment);
|
return this->m_columnToolTip.toUtf8().constData();
|
||||||
return QVariant(Qt::AlignVCenter | Qt::AlignLeft); // default
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString CColumn::getColumnName(bool i18n) const
|
QString CColumn::getColumnName(bool i18n) const
|
||||||
@@ -52,18 +49,30 @@ namespace BlackGui
|
|||||||
return QCoreApplication::translate(this->getTranslationContextChar(), this->getColumnNameChar());
|
return QCoreApplication::translate(this->getTranslationContextChar(), this->getColumnNameChar());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
QString CColumn::getColumnToolTip(bool i18n) const
|
||||||
* Header
|
{
|
||||||
*/
|
if (!i18n || this->m_columnToolTip.isEmpty()) return this->m_columnToolTip;
|
||||||
|
return QCoreApplication::translate(this->getTranslationContextChar(), this->getColumnToolTipChar());
|
||||||
|
}
|
||||||
|
|
||||||
|
CColumn CColumn::standardValueObject(const QString &headerName, const BlackMisc::CPropertyIndex &propertyIndex, int alignment)
|
||||||
|
{
|
||||||
|
return CColumn(headerName, propertyIndex, new CValueObjectFormatter(alignment));
|
||||||
|
}
|
||||||
|
|
||||||
|
CColumn CColumn::standardString(const QString &headerName, const BlackMisc::CPropertyIndex &propertyIndex, int alignment)
|
||||||
|
{
|
||||||
|
return CColumn(headerName, propertyIndex, new CStringFormatter(alignment));
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------- columns ----------------------------------------------
|
||||||
|
|
||||||
CColumns::CColumns(const QString &translationContext, QObject *parent) :
|
CColumns::CColumns(const QString &translationContext, QObject *parent) :
|
||||||
QObject(parent), m_translationContext(translationContext)
|
QObject(parent), m_translationContext(translationContext)
|
||||||
{
|
{
|
||||||
// void
|
// void
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Add column
|
|
||||||
*/
|
|
||||||
void CColumns::addColumn(CColumn column)
|
void CColumns::addColumn(CColumn column)
|
||||||
{
|
{
|
||||||
Q_ASSERT(!this->m_translationContext.isEmpty());
|
Q_ASSERT(!this->m_translationContext.isEmpty());
|
||||||
@@ -71,36 +80,24 @@ namespace BlackGui
|
|||||||
this->m_columns.push_back(column);
|
this->m_columns.push_back(column);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Property index to name
|
|
||||||
*/
|
|
||||||
QString CColumns::propertyIndexToColumnName(const BlackMisc::CPropertyIndex &propertyIndex, bool i18n) const
|
QString CColumns::propertyIndexToColumnName(const BlackMisc::CPropertyIndex &propertyIndex, bool i18n) const
|
||||||
{
|
{
|
||||||
int column = this->propertyIndexToColumn(propertyIndex);
|
int column = this->propertyIndexToColumn(propertyIndex);
|
||||||
return this->m_columns.at(column).getColumnName(i18n);
|
return this->m_columns.at(column).getColumnName(i18n);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Index to name
|
|
||||||
*/
|
|
||||||
QString CColumns::columnToName(int column, bool i18n) const
|
QString CColumns::columnToName(int column, bool i18n) const
|
||||||
{
|
{
|
||||||
Q_ASSERT(column >= 0 && column < this->m_columns.size());
|
Q_ASSERT(isValidColumn(column));
|
||||||
return this->m_columns.at(column).getColumnName(i18n);
|
return this->m_columns.at(column).getColumnName(i18n);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Get property index
|
|
||||||
*/
|
|
||||||
BlackMisc::CPropertyIndex CColumns::columnToPropertyIndex(int column) const
|
BlackMisc::CPropertyIndex CColumns::columnToPropertyIndex(int column) const
|
||||||
{
|
{
|
||||||
Q_ASSERT(column >= 0 && column < this->m_columns.size());
|
Q_ASSERT(isValidColumn(column));
|
||||||
return this->m_columns.at(column).getPropertyIndex();
|
return this->m_columns.at(column).getPropertyIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Property index to column
|
|
||||||
*/
|
|
||||||
int CColumns::propertyIndexToColumn(const BlackMisc::CPropertyIndex &propertyIndex) const
|
int CColumns::propertyIndexToColumn(const BlackMisc::CPropertyIndex &propertyIndex) const
|
||||||
{
|
{
|
||||||
for (int i = 0; i < this->m_columns.size(); i++)
|
for (int i = 0; i < this->m_columns.size(); i++)
|
||||||
@@ -113,9 +110,6 @@ namespace BlackGui
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Name to property index
|
|
||||||
*/
|
|
||||||
int CColumns::nameToPropertyIndex(const QString &name) const
|
int CColumns::nameToPropertyIndex(const QString &name) const
|
||||||
{
|
{
|
||||||
for (int i = 0; i < this->m_columns.size(); i++)
|
for (int i = 0; i < this->m_columns.size(); i++)
|
||||||
@@ -126,53 +120,29 @@ namespace BlackGui
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Size
|
|
||||||
*/
|
|
||||||
int CColumns::size() const
|
int CColumns::size() const
|
||||||
{
|
{
|
||||||
return this->m_columns.size();
|
return this->m_columns.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Alignment?
|
|
||||||
*/
|
|
||||||
bool CColumns::hasAlignment(const QModelIndex &index) const
|
bool CColumns::hasAlignment(const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
if (index.column() < 0 || index.column() >= this->m_columns.size()) return false;
|
if (!isValidColumn(index)) return false;
|
||||||
return this->m_columns.at(index.column()).hasAlignment();
|
return this->m_columns.at(index.column()).hasAlignment();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Editable?
|
|
||||||
*/
|
|
||||||
bool CColumns::isEditable(const QModelIndex &index) const
|
bool CColumns::isEditable(const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
if (index.column() < 0 || index.column() >= this->m_columns.size()) return false;
|
if (!isValidColumn(index)) return false;
|
||||||
return this->m_columns.at(index.column()).isEditable();
|
return this->m_columns.at(index.column()).isEditable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
const CDefaultFormatter *CColumns::getFormatter(const QModelIndex &index) const
|
||||||
* Is icon?
|
|
||||||
*/
|
|
||||||
bool CColumns::isIcon(const QModelIndex &index) const
|
|
||||||
{
|
{
|
||||||
if (index.column() < 0 || index.column() >= this->m_columns.size()) return false;
|
if (!isValidColumn(index)) return nullptr;
|
||||||
return this->m_columns.at(index.column()).isIcon();
|
return this->m_columns.at(index.column()).getFormatter();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Aligment as QVariant
|
|
||||||
*/
|
|
||||||
QVariant CColumns::aligmentAsQVariant(const QModelIndex &index) const
|
|
||||||
{
|
|
||||||
if (index.column() < 0 || index.column() >= this->m_columns.size()) return QVariant();
|
|
||||||
return this->m_columns.at(index.column()).aligmentAsQVariant();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Context
|
|
||||||
*/
|
|
||||||
const char *CColumns::getTranslationContextChar() const
|
const char *CColumns::getTranslationContextChar() const
|
||||||
{
|
{
|
||||||
return this->m_translationContext.toUtf8().constData();
|
return this->m_translationContext.toUtf8().constData();
|
||||||
|
|||||||
@@ -15,8 +15,11 @@
|
|||||||
#include "blackmisc/valueobject.h" // for qHash overload, include before Qt stuff due GCC issue
|
#include "blackmisc/valueobject.h" // for qHash overload, include before Qt stuff due GCC issue
|
||||||
#include "blackmisc/collection.h"
|
#include "blackmisc/collection.h"
|
||||||
#include "blackmisc/propertyindex.h"
|
#include "blackmisc/propertyindex.h"
|
||||||
|
#include "columnformatters.h"
|
||||||
|
#include <QModelIndex>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
#include <QScopedPointer>
|
||||||
|
|
||||||
namespace BlackGui
|
namespace BlackGui
|
||||||
{
|
{
|
||||||
@@ -26,64 +29,63 @@ namespace BlackGui
|
|||||||
class CColumn
|
class CColumn
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/*!
|
//! Constructor
|
||||||
* Constructor
|
CColumn(const QString &headerName, const BlackMisc::CPropertyIndex &propertyIndex, CDefaultFormatter *formatter, bool editable = false) :
|
||||||
* \param headerName
|
CColumn(headerName, "", propertyIndex, formatter, editable)
|
||||||
* \param propertyIndex as in CValueObject::propertyByIndex
|
{ }
|
||||||
* \param alignment Qt::Alignment
|
|
||||||
* \param editable
|
|
||||||
*/
|
|
||||||
CColumn(const QString &headerName, const BlackMisc::CPropertyIndex &propertyIndex, int alignment = -1, bool editable = false);
|
|
||||||
|
|
||||||
/*!
|
//! Constructor
|
||||||
* Constructor
|
CColumn(const QString &headerName, const QString &toolTip, const BlackMisc::CPropertyIndex &propertyIndex, CDefaultFormatter *formatter, bool editable = false);
|
||||||
* \param headerName
|
|
||||||
* \param propertyIndex as in CValueObject::propertyByIndex
|
|
||||||
* \param editable
|
|
||||||
*/
|
|
||||||
CColumn(const QString &headerName, const BlackMisc::CPropertyIndex &propertyIndex, bool editable);
|
|
||||||
|
|
||||||
/*!
|
//! Constructor, icon with tool tip
|
||||||
* Constructor column is icon
|
CColumn(const QString &toolTip, const BlackMisc::CPropertyIndex &propertyIndex);
|
||||||
* \remarks only make sense with isIcon as true
|
|
||||||
* \param propertyIndex as in CValueObject::propertyByIndex
|
//! Constructor used for icons
|
||||||
* \param isIcon icon, should be used with true only
|
CColumn(const BlackMisc::CPropertyIndex &propertyIndex);
|
||||||
*/
|
|
||||||
CColumn(const BlackMisc::CPropertyIndex &propertyIndex, bool isIcon);
|
|
||||||
|
|
||||||
//! Alignment for this column?
|
//! Alignment for this column?
|
||||||
bool hasAlignment() const { return this->m_alignment >= 0; }
|
bool hasAlignment() const { return (!this->m_formatter.isNull() && this->m_formatter->hasAlignment()); }
|
||||||
|
|
||||||
//! Editable?
|
//! Editable?
|
||||||
bool isEditable() const { return this->m_editable; }
|
bool isEditable() const { return this->m_editable; }
|
||||||
|
|
||||||
//! Icon?
|
//! Formatter
|
||||||
bool isIcon() const { return this->m_icon; }
|
void setFormatter(CDefaultFormatter *formatter) { Q_ASSERT(formatter); m_formatter.reset(formatter); }
|
||||||
|
|
||||||
|
//! Formatter
|
||||||
|
const CDefaultFormatter *getFormatter() const { return this->m_formatter.data(); }
|
||||||
|
|
||||||
//! Aligment as QVariant
|
//! Aligment as QVariant
|
||||||
QVariant aligmentAsQVariant() const;
|
QVariant getAlignment() const;
|
||||||
|
|
||||||
//! Column name
|
//! Column name
|
||||||
QString getColumnName(bool i18n = false) const;
|
QString getColumnName(bool i18n = false) const;
|
||||||
|
|
||||||
|
//! Column tooltip
|
||||||
|
QString getColumnToolTip(bool i18n = false) const;
|
||||||
|
|
||||||
//! Property index
|
//! Property index
|
||||||
const BlackMisc::CPropertyIndex &getPropertyIndex() const { return this->m_propertyIndex;}
|
const BlackMisc::CPropertyIndex &getPropertyIndex() const { return this->m_propertyIndex;}
|
||||||
|
|
||||||
//! Translation context
|
//! Translation context
|
||||||
void setTranslationContext(const QString &translationContext)
|
void setTranslationContext(const QString &translationContext) { this->m_translationContext = translationContext; }
|
||||||
{
|
|
||||||
this->m_translationContext = translationContext;
|
//! Get a standard value object formatted column
|
||||||
}
|
static CColumn standardValueObject(const QString &headerName, const BlackMisc::CPropertyIndex &propertyIndex, int alignment = CDefaultFormatter::alignDefault());
|
||||||
|
|
||||||
|
//! Get a standard string object formatted column
|
||||||
|
static CColumn standardString(const QString &headerName, const BlackMisc::CPropertyIndex &propertyIndex, int alignment = CDefaultFormatter::alignDefault());
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_translationContext;
|
QString m_translationContext;
|
||||||
QString m_columnName;
|
QString m_columnName;
|
||||||
int m_alignment;
|
QString m_columnToolTip;
|
||||||
|
QSharedPointer<CDefaultFormatter> m_formatter;
|
||||||
BlackMisc::CPropertyIndex m_propertyIndex;
|
BlackMisc::CPropertyIndex m_propertyIndex;
|
||||||
bool m_editable;
|
bool m_editable;
|
||||||
bool m_icon;
|
|
||||||
const char *getTranslationContextChar() const;
|
const char *getTranslationContextChar() const;
|
||||||
const char *getColumnNameChar() const;
|
const char *getColumnNameChar() const;
|
||||||
|
const char *getColumnToolTipChar() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -129,11 +131,26 @@ namespace BlackGui
|
|||||||
//! Is this column editable?
|
//! Is this column editable?
|
||||||
bool isEditable(const QModelIndex &index) const;
|
bool isEditable(const QModelIndex &index) const;
|
||||||
|
|
||||||
//! Is icon?
|
//! Valid column?
|
||||||
bool isIcon(const QModelIndex &index) const;
|
bool isValidColumn(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
return (index.column() >= 0 && index.column() < this->m_columns.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Valid column?
|
||||||
|
bool isValidColumn(int column) const
|
||||||
|
{
|
||||||
|
return column >= 0 && column < this->m_columns.size();
|
||||||
|
}
|
||||||
|
|
||||||
//! Aligment as QVariant
|
//! Aligment as QVariant
|
||||||
QVariant aligmentAsQVariant(const QModelIndex &index) const;
|
QVariant getAlignment(const QModelIndex &index) const;
|
||||||
|
|
||||||
|
//! Translation context
|
||||||
|
const QString &getTranslationContext() const { return m_translationContext; }
|
||||||
|
|
||||||
|
//! Formatter
|
||||||
|
const CDefaultFormatter *getFormatter(const QModelIndex &index) const;
|
||||||
|
|
||||||
//! Column at position
|
//! Column at position
|
||||||
const CColumn &at(int columnNumber) const { return this->m_columns.at(columnNumber); }
|
const CColumn &at(int columnNumber) const { return this->m_columns.at(columnNumber); }
|
||||||
|
|||||||
@@ -28,10 +28,11 @@ namespace BlackGui
|
|||||||
CKeyboardKeyListModel::CKeyboardKeyListModel(QObject *parent) :
|
CKeyboardKeyListModel::CKeyboardKeyListModel(QObject *parent) :
|
||||||
CListModelBase<CSettingKeyboardHotkey, CSettingKeyboardHotkeyList>("ViewKeyboardKeyList", parent)
|
CListModelBase<CSettingKeyboardHotkey, CSettingKeyboardHotkeyList>("ViewKeyboardKeyList", parent)
|
||||||
{
|
{
|
||||||
this->m_columns.addColumn(CColumn("key", CSettingKeyboardHotkey::IndexKeyAsStringRepresentation, true));
|
const bool editable = true;
|
||||||
this->m_columns.addColumn(CColumn("modifier 1", CSettingKeyboardHotkey::IndexModifier1AsString, true));
|
this->m_columns.addColumn(CColumn("key", CSettingKeyboardHotkey::IndexKeyAsStringRepresentation, new CStringFormatter(), editable));
|
||||||
this->m_columns.addColumn(CColumn("modifier 2", CSettingKeyboardHotkey::IndexModifier2AsString, true));
|
this->m_columns.addColumn(CColumn("modifier 1", CSettingKeyboardHotkey::IndexModifier1AsString, new CStringFormatter(), editable));
|
||||||
this->m_columns.addColumn(CColumn("function", CSettingKeyboardHotkey::IndexFunctionAsString));
|
this->m_columns.addColumn(CColumn("modifier 2", CSettingKeyboardHotkey::IndexModifier2AsString, new CStringFormatter(), editable));
|
||||||
|
this->m_columns.addColumn(CColumn::standardString("function", CSettingKeyboardHotkey::IndexFunctionAsString));
|
||||||
|
|
||||||
this->setSortColumnByPropertyIndex(CSettingKeyboardHotkey::IndexFunctionAsString);
|
this->setSortColumnByPropertyIndex(CSettingKeyboardHotkey::IndexFunctionAsString);
|
||||||
this->m_sortOrder = Qt::AscendingOrder;
|
this->m_sortOrder = Qt::AscendingOrder;
|
||||||
|
|||||||
@@ -57,11 +57,20 @@ namespace BlackGui
|
|||||||
template <typename ObjectType, typename ContainerType> QVariant
|
template <typename ObjectType, typename ContainerType> QVariant
|
||||||
CListModelBase<ObjectType, ContainerType>::headerData(int section, Qt::Orientation orientation, int role) const
|
CListModelBase<ObjectType, ContainerType>::headerData(int section, Qt::Orientation orientation, int role) const
|
||||||
{
|
{
|
||||||
if (role == Qt::DisplayRole && orientation == Qt::Horizontal)
|
if (orientation == Qt::Horizontal)
|
||||||
{
|
{
|
||||||
if (section < 0 || section >= this->m_columns.size()) return QVariant();
|
if (role == Qt::DisplayRole)
|
||||||
QString header = this->m_columns.at(section).getColumnName(false);
|
{
|
||||||
return QVariant(header);
|
if (section < 0 || section >= this->m_columns.size()) { return QVariant(); }
|
||||||
|
QString header = this->m_columns.at(section).getColumnName(false);
|
||||||
|
return QVariant(header);
|
||||||
|
}
|
||||||
|
else if (role == Qt::ToolTipRole)
|
||||||
|
{
|
||||||
|
if (section < 0 || section >= this->m_columns.size()) { return QVariant(); }
|
||||||
|
QString header = this->m_columns.at(section).getColumnToolTip(false);
|
||||||
|
return header.isEmpty() ? QVariant() : QVariant(header);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
@@ -72,33 +81,16 @@ namespace BlackGui
|
|||||||
template <typename ObjectType, typename ContainerType>
|
template <typename ObjectType, typename ContainerType>
|
||||||
QVariant CListModelBase<ObjectType, ContainerType>::data(const QModelIndex &index, int role) const
|
QVariant CListModelBase<ObjectType, ContainerType>::data(const QModelIndex &index, int role) const
|
||||||
{
|
{
|
||||||
// checks
|
// check / init
|
||||||
if (index.row() < 0 || index.row() >= this->m_container.size() ||
|
if (!this->isValidIndex(index)) { return QVariant(); }
|
||||||
index.column() < 0 || index.column() >= this->columnCount(index))
|
const CDefaultFormatter *formatter = this->m_columns.getFormatter(index);
|
||||||
{
|
Q_ASSERT(formatter);
|
||||||
return QVariant();
|
if (!formatter) { return QVariant(); }
|
||||||
}
|
|
||||||
|
|
||||||
if (role == Qt::DisplayRole)
|
//! Formatted data
|
||||||
{
|
ObjectType obj = this->m_container[index.row()];
|
||||||
if (this->m_columns.isIcon(index)) return QVariant();
|
BlackMisc::CPropertyIndex propertyIndex = this->columnToPropertyIndex(index.column());
|
||||||
ObjectType obj = this->m_container[index.row()];
|
return formatter->data(role, obj.propertyByIndex(propertyIndex));
|
||||||
BlackMisc::CPropertyIndex propertyIndex = this->columnToPropertyIndex(index.column());
|
|
||||||
QString propertyString = obj.propertyByIndexAsString(propertyIndex, true);
|
|
||||||
return QVariant::fromValue(propertyString);
|
|
||||||
}
|
|
||||||
else if (role == Qt::DecorationRole)
|
|
||||||
{
|
|
||||||
if (!this->m_columns.isIcon(index)) return QVariant();
|
|
||||||
ObjectType obj = this->m_container[index.row()];
|
|
||||||
BlackMisc::CPropertyIndex propertyIndex = this->columnToPropertyIndex(index.column());
|
|
||||||
return obj.propertyByIndex(propertyIndex);
|
|
||||||
}
|
|
||||||
else if (role == Qt::TextAlignmentRole)
|
|
||||||
{
|
|
||||||
return this->m_columns.aligmentAsQVariant(index);
|
|
||||||
}
|
|
||||||
return QVariant();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -107,15 +99,11 @@ namespace BlackGui
|
|||||||
template <typename ObjectType, typename ContainerType>
|
template <typename ObjectType, typename ContainerType>
|
||||||
int CListModelBase<ObjectType, ContainerType>::update(const ContainerType &container)
|
int CListModelBase<ObjectType, ContainerType>::update(const ContainerType &container)
|
||||||
{
|
{
|
||||||
ContainerType copyList = (container.size() > 1 && this->hasValidSortColumn() ?
|
qDebug() << "update" << this->objectName() << "size" << container.size();
|
||||||
this->sortListByColumn(container, this->getSortColumn(), this->m_sortOrder) :
|
|
||||||
container);
|
|
||||||
this->beginResetModel();
|
this->beginResetModel();
|
||||||
this->m_container.clear();
|
this->m_container = (container.size() > 1 && this->hasValidSortColumn() ?
|
||||||
foreach(ObjectType object, copyList)
|
this->sortListByColumn(container, this->getSortColumn(), this->m_sortOrder) :
|
||||||
{
|
container);
|
||||||
this->m_container.push_back(object);
|
|
||||||
}
|
|
||||||
this->endResetModel();
|
this->endResetModel();
|
||||||
return this->m_container.size();
|
return this->m_container.size();
|
||||||
}
|
}
|
||||||
@@ -202,6 +190,7 @@ namespace BlackGui
|
|||||||
BlackMisc::CPropertyIndex propertyIndex = this->m_columns.columnToPropertyIndex(column);
|
BlackMisc::CPropertyIndex propertyIndex = this->m_columns.columnToPropertyIndex(column);
|
||||||
Q_ASSERT(!propertyIndex.isEmpty());
|
Q_ASSERT(!propertyIndex.isEmpty());
|
||||||
if (propertyIndex.isEmpty()) return list; // at release build do nothing
|
if (propertyIndex.isEmpty()) return list; // at release build do nothing
|
||||||
|
qDebug() << "sort" << this->objectName() << "column" << column << propertyIndex.toQString();
|
||||||
|
|
||||||
// sort the values
|
// sort the values
|
||||||
return list.sorted
|
return list.sorted
|
||||||
|
|||||||
@@ -27,32 +27,6 @@ namespace BlackGui
|
|||||||
template <typename ObjectType, typename ContainerType> class CListModelBase : public QAbstractListModel
|
template <typename ObjectType, typename ContainerType> class CListModelBase : public QAbstractListModel
|
||||||
{
|
{
|
||||||
|
|
||||||
protected:
|
|
||||||
ContainerType m_container; //!< used container
|
|
||||||
CColumns m_columns; //!< columns metadata
|
|
||||||
int m_sortedColumn; //!< current sort column
|
|
||||||
Qt::SortOrder m_sortOrder; //!< sort order (asc/desc)
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Constructor
|
|
||||||
* \param translationContext I18N context
|
|
||||||
* \param parent
|
|
||||||
*/
|
|
||||||
CListModelBase(const QString &translationContext, QObject *parent = nullptr)
|
|
||||||
: QAbstractListModel(parent), m_columns(translationContext), m_sortedColumn(-1), m_sortOrder(Qt::AscendingOrder)
|
|
||||||
{
|
|
||||||
// void
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Sort list by given order
|
|
||||||
* \param list used list
|
|
||||||
* \param column column inder
|
|
||||||
* \param order sort order (asccending / descending)
|
|
||||||
* \return
|
|
||||||
*/
|
|
||||||
ContainerType sortListByColumn(const ContainerType &list, int column, Qt::SortOrder order);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//! Destructor
|
//! Destructor
|
||||||
@@ -73,12 +47,17 @@ namespace BlackGui
|
|||||||
return this->columnToPropertyIndex(index.column());
|
return this->columnToPropertyIndex(index.column());
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Set sort column
|
//! Valid index (in range)
|
||||||
virtual void setSortColumn(int column)
|
virtual bool isValidIndex(const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
this->m_sortedColumn = column;
|
if (!index.isValid()) return false;
|
||||||
|
return (index.row() >= 0 && index.row() < this->m_container.size() &&
|
||||||
|
index.column() >= 0 && index.column() < this->columnCount(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Set sort column
|
||||||
|
virtual void setSortColumn(int column) { this->m_sortedColumn = column; }
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Set column for sorting
|
* Set column for sorting
|
||||||
* \param propertyIndex index of column to be sorted by
|
* \param propertyIndex index of column to be sorted by
|
||||||
@@ -89,28 +68,19 @@ namespace BlackGui
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Get sort column property index
|
//! Get sort column property index
|
||||||
virtual int getSortColumn() const
|
virtual int getSortColumn() const { return this->m_sortedColumn; }
|
||||||
{
|
|
||||||
return this->m_sortedColumn;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Has valid sort column?
|
//! Has valid sort column?
|
||||||
virtual bool hasValidSortColumn() const
|
virtual bool hasValidSortColumn() const
|
||||||
{
|
{
|
||||||
return this->m_sortedColumn >=0 && this->m_sortedColumn < this->m_columns.size();
|
return this->m_sortedColumn >= 0 && this->m_sortedColumn < this->m_columns.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get sort order
|
//! Get sort order
|
||||||
virtual Qt::SortOrder getSortOrder() const
|
virtual Qt::SortOrder getSortOrder() const { return this->m_sortOrder; }
|
||||||
{
|
|
||||||
return this->m_sortOrder;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Used container data
|
//! Used container data
|
||||||
virtual const ContainerType &getContainer() const
|
virtual const ContainerType &getContainer() const { return this->m_container; }
|
||||||
{
|
|
||||||
return this->m_container;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! \copydoc QAbstractListModel::data()
|
//! \copydoc QAbstractListModel::data()
|
||||||
virtual QVariant data(const QModelIndex &index, int role) const override;
|
virtual QVariant data(const QModelIndex &index, int role) const override;
|
||||||
@@ -122,6 +92,7 @@ namespace BlackGui
|
|||||||
Qt::ItemFlags flags(const QModelIndex &index) const override;
|
Qt::ItemFlags flags(const QModelIndex &index) const override;
|
||||||
|
|
||||||
//! Update by new container
|
//! Update by new container
|
||||||
|
//! \remarks a sorting is performed if a valid sort column is set
|
||||||
virtual int update(const ContainerType &container);
|
virtual int update(const ContainerType &container);
|
||||||
|
|
||||||
//! Update single element
|
//! Update single element
|
||||||
@@ -138,7 +109,7 @@ namespace BlackGui
|
|||||||
{
|
{
|
||||||
if (index.row() < 0 || index.row() >= this->m_container.size())
|
if (index.row() < 0 || index.row() >= this->m_container.size())
|
||||||
{
|
{
|
||||||
const static ObjectType def;
|
const static ObjectType def; // default object
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -148,7 +119,7 @@ namespace BlackGui
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! \copydoc QAbstractListModel::sort()
|
//! \copydoc QAbstractListModel::sort()
|
||||||
virtual void sort(int column, Qt::SortOrder order);
|
virtual void sort(int column, Qt::SortOrder order) override;
|
||||||
|
|
||||||
//! Similar to ContainerType::push_back
|
//! Similar to ContainerType::push_back
|
||||||
virtual void push_back(const ObjectType &object);
|
virtual void push_back(const ObjectType &object);
|
||||||
@@ -161,6 +132,40 @@ namespace BlackGui
|
|||||||
|
|
||||||
//! Clear the list
|
//! Clear the list
|
||||||
virtual void clear();
|
virtual void clear();
|
||||||
|
|
||||||
|
//! Translation context
|
||||||
|
virtual const QString &getTranslationContext() const
|
||||||
|
{
|
||||||
|
return m_columns.getTranslationContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ContainerType m_container; //!< used container
|
||||||
|
CColumns m_columns; //!< columns metadata
|
||||||
|
int m_sortedColumn; //!< current sort column
|
||||||
|
Qt::SortOrder m_sortOrder; //!< sort order (asc/desc)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Constructor
|
||||||
|
* \param translationContext I18N context
|
||||||
|
* \param parent
|
||||||
|
*/
|
||||||
|
CListModelBase(const QString &translationContext, QObject *parent = nullptr)
|
||||||
|
: QAbstractListModel(parent), m_columns(translationContext), m_sortedColumn(-1), m_sortOrder(Qt::AscendingOrder)
|
||||||
|
{
|
||||||
|
// non unique default name, set translation context as default
|
||||||
|
this->setObjectName(translationContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Sort container by given column / order. This is used by sort().
|
||||||
|
* \param list used list
|
||||||
|
* \param column column inder
|
||||||
|
* \param order sort order (ascending / descending)
|
||||||
|
* \return
|
||||||
|
*/
|
||||||
|
ContainerType sortListByColumn(const ContainerType &list, int column, Qt::SortOrder order);
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,10 +30,10 @@ namespace BlackGui
|
|||||||
this->m_columns.clear();
|
this->m_columns.clear();
|
||||||
if (withIcon)
|
if (withIcon)
|
||||||
{
|
{
|
||||||
this->m_columns.addColumn(CColumn(CNameVariantPair::IndexPixmap, true));
|
this->m_columns.addColumn(CColumn(CNameVariantPair::IndexPixmap));
|
||||||
}
|
}
|
||||||
this->m_columns.addColumn(CColumn("name", CNameVariantPair::IndexName));
|
this->m_columns.addColumn(CColumn::standardString("name", CNameVariantPair::IndexName));
|
||||||
this->m_columns.addColumn(CColumn("value", CNameVariantPair::IndexVariant));
|
this->m_columns.addColumn(CColumn("value", CNameVariantPair::IndexVariant, new CDefaultFormatter()));
|
||||||
|
|
||||||
// default sort order
|
// default sort order
|
||||||
this->setSortColumnByPropertyIndex(CNameVariantPair::IndexName);
|
this->setSortColumnByPropertyIndex(CNameVariantPair::IndexName);
|
||||||
|
|||||||
@@ -21,12 +21,12 @@ namespace BlackGui
|
|||||||
CServerListModel::CServerListModel(QObject *parent) :
|
CServerListModel::CServerListModel(QObject *parent) :
|
||||||
CListModelBase("ViewServerList", parent)
|
CListModelBase("ViewServerList", parent)
|
||||||
{
|
{
|
||||||
this->m_columns.addColumn(CColumn("name", CServer::IndexName));
|
this->m_columns.addColumn(CColumn::standardString("name", CServer::IndexName));
|
||||||
this->m_columns.addColumn(CColumn("description", CServer::IndexDescription));
|
this->m_columns.addColumn(CColumn::standardString("description", CServer::IndexDescription));
|
||||||
this->m_columns.addColumn(CColumn("address", CServer::IndexAddress));
|
this->m_columns.addColumn(CColumn::standardString("address", CServer::IndexAddress));
|
||||||
this->m_columns.addColumn(CColumn("port", CServer::IndexPort));
|
this->m_columns.addColumn(CColumn::standardString("port", CServer::IndexPort));
|
||||||
this->m_columns.addColumn(CColumn("realname", { CServer::IndexUser, CUser::IndexRealName}));
|
this->m_columns.addColumn(CColumn::standardString("realname", { CServer::IndexUser, CUser::IndexRealName}));
|
||||||
this->m_columns.addColumn(CColumn("userid", { CServer::IndexUser, CUser::IndexId}));
|
this->m_columns.addColumn(CColumn::standardString("userid", { CServer::IndexUser, CUser::IndexId}));
|
||||||
|
|
||||||
// force strings for translation in resource files
|
// force strings for translation in resource files
|
||||||
(void)QT_TRANSLATE_NOOP("ViewServerList", "name");
|
(void)QT_TRANSLATE_NOOP("ViewServerList", "name");
|
||||||
@@ -61,5 +61,5 @@ namespace BlackGui
|
|||||||
return CListModelBase::data(index, role);
|
return CListModelBase::data(index, role);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} // class
|
||||||
}
|
} // namespace
|
||||||
|
|||||||
@@ -54,8 +54,7 @@ namespace BlackGui
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! \copydoc CListModelBase::data
|
//! \copydoc CListModelBase::data
|
||||||
virtual QVariant data(const QModelIndex &index, int role) const;
|
virtual QVariant data(const QModelIndex &index, int role) const override;
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ namespace BlackGui
|
|||||||
CStatusMessageListModel::CStatusMessageListModel(QObject *parent) :
|
CStatusMessageListModel::CStatusMessageListModel(QObject *parent) :
|
||||||
CListModelBase<BlackMisc::CStatusMessage, BlackMisc::CStatusMessageList>("ViewStatusMessageList", parent)
|
CListModelBase<BlackMisc::CStatusMessage, BlackMisc::CStatusMessageList>("ViewStatusMessageList", parent)
|
||||||
{
|
{
|
||||||
this->m_columns.addColumn(CColumn("time", CStatusMessage::IndexTimestamp));
|
this->m_columns.addColumn(CColumn("time", CStatusMessage::IndexTimestamp, new CDateTimeFormatter(CDateTimeFormatter::formatHms())));
|
||||||
this->m_columns.addColumn(CColumn("", CStatusMessage::IndexSeverity, Qt::AlignCenter));
|
this->m_columns.addColumn(CColumn("severity", CStatusMessage::IndexSeverity));
|
||||||
this->m_columns.addColumn(CColumn("message", CStatusMessage::IndexMessage));
|
this->m_columns.addColumn(CColumn::standardString("message", CStatusMessage::IndexMessage));
|
||||||
this->m_columns.addColumn(CColumn("type", CStatusMessage::IndexTypeAsString));
|
this->m_columns.addColumn(CColumn::standardString("type", CStatusMessage::IndexTypeAsString));
|
||||||
|
|
||||||
this->m_sortedColumn = CStatusMessage::IndexTimestamp;
|
this->m_sortedColumn = CStatusMessage::IndexTimestamp;
|
||||||
this->m_sortOrder = Qt::DescendingOrder;
|
this->m_sortOrder = Qt::DescendingOrder;
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ namespace BlackGui
|
|||||||
virtual ~CStatusMessageListModel() {}
|
virtual ~CStatusMessageListModel() {}
|
||||||
|
|
||||||
//! \copydoc CListModelBase::data
|
//! \copydoc CListModelBase::data
|
||||||
QVariant data(const QModelIndex &modelIndex, int role = Qt::DisplayRole) const;
|
QVariant data(const QModelIndex &modelIndex, int role = Qt::DisplayRole) const override;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ namespace BlackGui
|
|||||||
CListModelBase<BlackMisc::Network::CUser, BlackMisc::Network::CUserList>("ViewUserList", parent), m_userMode(NotSet)
|
CListModelBase<BlackMisc::Network::CUser, BlackMisc::Network::CUserList>("ViewUserList", parent), m_userMode(NotSet)
|
||||||
{
|
{
|
||||||
this->setUserMode(userMode);
|
this->setUserMode(userMode);
|
||||||
|
|
||||||
// force strings for translation in resource files
|
// force strings for translation in resource files
|
||||||
(void)QT_TRANSLATE_NOOP("ViewUserList", "callsign");
|
(void)QT_TRANSLATE_NOOP("ViewUserList", "callsign");
|
||||||
(void)QT_TRANSLATE_NOOP("ViewUserList", "realname");
|
(void)QT_TRANSLATE_NOOP("ViewUserList", "realname");
|
||||||
@@ -44,17 +45,24 @@ namespace BlackGui
|
|||||||
{
|
{
|
||||||
case NotSet:
|
case NotSet:
|
||||||
case UserDetailed:
|
case UserDetailed:
|
||||||
this->m_columns.addColumn(CColumn(CUser::IndexPixmap, true));
|
this->m_columns.addColumn(CColumn(CUser::IndexIcon));
|
||||||
this->m_columns.addColumn(CColumn("realname", CUser::IndexRealName));
|
this->m_columns.addColumn(CColumn::standardString("realname", CUser::IndexRealName));
|
||||||
this->m_columns.addColumn(CColumn("callsign", CUser::IndexCallsign));
|
this->m_columns.addColumn(CColumn::standardValueObject("callsign", CUser::IndexCallsign));
|
||||||
this->m_columns.addColumn(CColumn("userid", CUser::IndexId));
|
this->m_columns.addColumn(CColumn::standardString("userid", CUser::IndexId));
|
||||||
// this->m_columns.addColumn(CUser::IndexEmail, "email");
|
|
||||||
|
// default sort order
|
||||||
|
this->setSortColumnByPropertyIndex(CUser::IndexRealName);
|
||||||
|
this->m_sortOrder = Qt::AscendingOrder;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UserShort:
|
case UserShort:
|
||||||
this->m_columns.addColumn(CColumn(CUser::IndexPixmap, true));
|
this->m_columns.addColumn(CColumn(CUser::IndexIcon));
|
||||||
this->m_columns.addColumn(CColumn("realname", CUser::IndexRealName));
|
this->m_columns.addColumn(CColumn::standardString("realname", CUser::IndexRealName));
|
||||||
this->m_columns.addColumn(CColumn("callsign", CUser::IndexCallsign));
|
this->m_columns.addColumn(CColumn::standardValueObject("callsign", CUser::IndexCallsign));
|
||||||
|
|
||||||
|
// default sort order
|
||||||
|
this->setSortColumnByPropertyIndex(CUser::IndexCallsign);
|
||||||
|
this->m_sortOrder = Qt::AscendingOrder;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -351,10 +351,7 @@ namespace BlackMisc
|
|||||||
case IndexVoiceRoom:
|
case IndexVoiceRoom:
|
||||||
return QVariant(this->m_voiceRoom.propertyByIndex(index.copyFrontRemoved()));
|
return QVariant(this->m_voiceRoom.propertyByIndex(index.copyFrontRemoved()));
|
||||||
default:
|
default:
|
||||||
if (ICoordinateGeodetic::canHandleIndex(index))
|
if (ICoordinateGeodetic::canHandleIndex(index)) { return ICoordinateGeodetic::propertyByIndex(index); }
|
||||||
{
|
|
||||||
return ICoordinateGeodetic::propertyByIndex(index);
|
|
||||||
}
|
|
||||||
return CValueObject::propertyByIndex(index);
|
return CValueObject::propertyByIndex(index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -424,49 +421,8 @@ namespace BlackMisc
|
|||||||
bool CAtcStation::isA(int metaTypeId) const
|
bool CAtcStation::isA(int metaTypeId) const
|
||||||
{
|
{
|
||||||
if (metaTypeId == qMetaTypeId<CAtcStation>()) { return true; }
|
if (metaTypeId == qMetaTypeId<CAtcStation>()) { return true; }
|
||||||
|
|
||||||
return this->CValueObject::isA(metaTypeId);
|
return this->CValueObject::isA(metaTypeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Property as string by index
|
|
||||||
*/
|
|
||||||
QString CAtcStation::propertyByIndexAsString(const BlackMisc::CPropertyIndex &index, bool i18n) const
|
|
||||||
{
|
|
||||||
QVariant qv = this->propertyByIndex(index);
|
|
||||||
ColumnIndex i = index.frontCasted<ColumnIndex>();
|
|
||||||
|
|
||||||
// special treatment
|
|
||||||
// this is required as it is possible an ATC station is not containing all
|
|
||||||
// properties
|
|
||||||
switch (i)
|
|
||||||
{
|
|
||||||
case IndexFrequency:
|
|
||||||
if (!CComSystem::isValidCivilAviationFrequency(qv.value<CFrequency>()))
|
|
||||||
return "";
|
|
||||||
else
|
|
||||||
return qv.value<CFrequency>().valueRoundedWithUnit(3, i18n);
|
|
||||||
break;
|
|
||||||
case IndexDistance:
|
|
||||||
{
|
|
||||||
CLength distance = qv.value<CLength>();
|
|
||||||
if (distance.isNegativeWithEpsilonConsidered()) return "";
|
|
||||||
return distance.toQString(i18n);
|
|
||||||
}
|
|
||||||
|
|
||||||
case IndexBookedFrom:
|
|
||||||
case IndexBookedUntil:
|
|
||||||
{
|
|
||||||
QDateTime dt = qv.value<QDateTime>();
|
|
||||||
if (dt.isNull() || !dt.isValid()) return "";
|
|
||||||
return dt.toString("yyyy-MM-dd HH:mm");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return BlackMisc::qVariantToString(qv, i18n);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -278,9 +278,6 @@ namespace BlackMisc
|
|||||||
//! \copydoc CValueObject::setPropertyByIndex(variant, index)
|
//! \copydoc CValueObject::setPropertyByIndex(variant, index)
|
||||||
virtual void setPropertyByIndex(const QVariant &variant, const CPropertyIndex &index) override;
|
virtual void setPropertyByIndex(const QVariant &variant, const CPropertyIndex &index) override;
|
||||||
|
|
||||||
//! \copydoc CValueObject::propertyByIndexAsString()
|
|
||||||
virtual QString propertyByIndexAsString(const BlackMisc::CPropertyIndex &index, bool i18n = false) const override;
|
|
||||||
|
|
||||||
//! \copydoc CValueObject::toJson
|
//! \copydoc CValueObject::toJson
|
||||||
virtual QJsonObject toJson() const override;
|
virtual QJsonObject toJson() const override;
|
||||||
|
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ namespace BlackMisc
|
|||||||
//! Valid civil aviation frequency?
|
//! Valid civil aviation frequency?
|
||||||
static bool isValidCivilAviationFrequency(const BlackMisc::PhysicalQuantities::CFrequency &f)
|
static bool isValidCivilAviationFrequency(const BlackMisc::PhysicalQuantities::CFrequency &f)
|
||||||
{
|
{
|
||||||
|
if (f.isNull()) return false;
|
||||||
double fr = f.valueRounded(BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz(), 3);
|
double fr = f.valueRounded(BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz(), 3);
|
||||||
return fr >= 118.0 && fr <= 136.975;
|
return fr >= 118.0 && fr <= 136.975;
|
||||||
}
|
}
|
||||||
@@ -137,10 +138,17 @@ namespace BlackMisc
|
|||||||
//! Valid military aviation frequency?
|
//! Valid military aviation frequency?
|
||||||
static bool isValidMilitaryFrequency(const BlackMisc::PhysicalQuantities::CFrequency &f)
|
static bool isValidMilitaryFrequency(const BlackMisc::PhysicalQuantities::CFrequency &f)
|
||||||
{
|
{
|
||||||
|
if (f.isNull()) return false;
|
||||||
double fr = f.valueRounded(BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz(), 3);
|
double fr = f.valueRounded(BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz(), 3);
|
||||||
return fr >= 220.0 && fr <= 399.95;
|
return fr >= 220.0 && fr <= 399.95;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Valid COM frequency (either civil or military)
|
||||||
|
static bool isValidComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &f)
|
||||||
|
{
|
||||||
|
return isValidCivilAviationFrequency(f) || isValidMilitaryFrequency(f);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Round to channel spacing, set MHz as unit
|
* Round to channel spacing, set MHz as unit
|
||||||
* \see ChannelSpacing
|
* \see ChannelSpacing
|
||||||
|
|||||||
Reference in New Issue
Block a user