2016-05-24 06:08:35 -04:00
|
|
|
#include "BeaconsModel.hpp"
|
|
|
|
|
|
|
|
#include <QStandardItem>
|
|
|
|
#include <QFont>
|
|
|
|
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
char const * const headings[] = {
|
|
|
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Client"),
|
|
|
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Time"),
|
|
|
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Snr"),
|
|
|
|
QT_TRANSLATE_NOOP ("BeaconsModel", "DT"),
|
|
|
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Frequency"),
|
|
|
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Drift"),
|
|
|
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Grid"),
|
|
|
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Power"),
|
2017-09-16 18:20:59 -04:00
|
|
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Live"),
|
2017-09-22 18:08:41 -04:00
|
|
|
QT_TRANSLATE_NOOP ("BeaconsModel", "Callsign"),
|
2016-05-24 06:08:35 -04:00
|
|
|
};
|
|
|
|
|
2017-09-16 18:20:59 -04:00
|
|
|
QString live_string (bool off_air)
|
|
|
|
{
|
|
|
|
return off_air ? QT_TRANSLATE_NOOP ("BeaconsModel", "no") : QT_TRANSLATE_NOOP ("BeaconsModel", "yes");
|
|
|
|
}
|
|
|
|
|
2016-05-24 06:08:35 -04:00
|
|
|
QFont text_font {"Courier", 10};
|
|
|
|
|
2020-11-02 16:35:48 -05:00
|
|
|
QList<QStandardItem *> make_row (MessageServer::ClientKey const& key, QTime time, qint32 snr, float delta_time
|
2016-05-24 06:08:35 -04:00
|
|
|
, Frequency frequency, qint32 drift, QString const& callsign
|
2017-09-16 18:20:59 -04:00
|
|
|
, QString const& grid, qint32 power, bool off_air)
|
2016-05-24 06:08:35 -04:00
|
|
|
{
|
2020-11-02 16:35:48 -05:00
|
|
|
auto client_item = new QStandardItem {QString {"%1(%2)"}.arg (key.second).arg (key.first.toString ())};
|
|
|
|
client_item->setData (QVariant::fromValue (key));
|
|
|
|
|
2016-05-24 06:08:35 -04:00
|
|
|
auto time_item = new QStandardItem {time.toString ("hh:mm")};
|
|
|
|
time_item->setData (time);
|
|
|
|
time_item->setTextAlignment (Qt::AlignRight);
|
|
|
|
|
|
|
|
auto snr_item = new QStandardItem {QString::number (snr)};
|
|
|
|
snr_item->setData (snr);
|
|
|
|
snr_item->setTextAlignment (Qt::AlignRight);
|
|
|
|
|
|
|
|
auto dt = new QStandardItem {QString::number (delta_time)};
|
|
|
|
dt->setData (delta_time);
|
|
|
|
dt->setTextAlignment (Qt::AlignRight);
|
|
|
|
|
|
|
|
auto freq = new QStandardItem {Radio::pretty_frequency_MHz_string (frequency)};
|
|
|
|
freq->setData (frequency);
|
|
|
|
freq->setTextAlignment (Qt::AlignRight);
|
|
|
|
|
|
|
|
auto dri = new QStandardItem {QString::number (drift)};
|
|
|
|
dri->setData (drift);
|
|
|
|
dri->setTextAlignment (Qt::AlignRight);
|
|
|
|
|
|
|
|
auto gd = new QStandardItem {grid};
|
|
|
|
gd->setTextAlignment (Qt::AlignRight);
|
|
|
|
|
|
|
|
auto pwr = new QStandardItem {QString::number (power)};
|
|
|
|
pwr->setData (power);
|
|
|
|
pwr->setTextAlignment (Qt::AlignRight);
|
|
|
|
|
2017-09-16 18:20:59 -04:00
|
|
|
auto live = new QStandardItem {live_string (off_air)};
|
|
|
|
live->setTextAlignment (Qt::AlignHCenter);
|
|
|
|
|
2016-05-24 06:08:35 -04:00
|
|
|
QList<QStandardItem *> row {
|
2020-11-02 16:35:48 -05:00
|
|
|
client_item, time_item, snr_item, dt, freq, dri, gd, pwr, live, new QStandardItem {callsign}};
|
2016-05-24 06:08:35 -04:00
|
|
|
Q_FOREACH (auto& item, row)
|
|
|
|
{
|
|
|
|
item->setEditable (false);
|
|
|
|
item->setFont (text_font);
|
|
|
|
item->setTextAlignment (item->textAlignment () | Qt::AlignVCenter);
|
|
|
|
}
|
|
|
|
return row;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BeaconsModel::BeaconsModel (QObject * parent)
|
2018-12-02 10:09:37 -05:00
|
|
|
: QStandardItemModel {0, sizeof headings / sizeof headings[0], parent}
|
2016-05-24 06:08:35 -04:00
|
|
|
{
|
|
|
|
int column {0};
|
|
|
|
for (auto const& heading : headings)
|
|
|
|
{
|
|
|
|
setHeaderData (column++, Qt::Horizontal, tr (heading));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-02 16:35:48 -05:00
|
|
|
void BeaconsModel::add_beacon_spot (bool is_new, ClientKey const& key, QTime time, qint32 snr, float delta_time
|
2016-05-24 06:08:35 -04:00
|
|
|
, Frequency frequency, qint32 drift, QString const& callsign
|
2017-09-16 18:20:59 -04:00
|
|
|
, QString const& grid, qint32 power, bool off_air)
|
2016-05-24 06:08:35 -04:00
|
|
|
{
|
|
|
|
if (!is_new)
|
|
|
|
{
|
|
|
|
int target_row {-1};
|
|
|
|
for (auto row = 0; row < rowCount (); ++row)
|
|
|
|
{
|
2020-11-02 16:35:48 -05:00
|
|
|
if (item (row, 0)->data ().value<ClientKey> () == key)
|
2016-05-24 06:08:35 -04:00
|
|
|
{
|
|
|
|
auto row_time = item (row, 1)->data ().toTime ();
|
|
|
|
if (row_time == time
|
|
|
|
&& item (row, 2)->data ().toInt () == snr
|
|
|
|
&& item (row, 3)->data ().toFloat () == delta_time
|
|
|
|
&& item (row, 4)->data ().value<Frequency> () == frequency
|
|
|
|
&& data (index (row, 5)).toInt () == drift
|
|
|
|
&& data (index (row, 7)).toString () == grid
|
2017-09-16 18:20:59 -04:00
|
|
|
&& data (index (row, 8)).toInt () == power
|
2017-09-22 18:08:41 -04:00
|
|
|
&& data (index (row, 6)).toString () == live_string (off_air)
|
|
|
|
&& data (index (row, 9)).toString () == callsign)
|
2016-05-24 06:08:35 -04:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (time <= row_time)
|
|
|
|
{
|
|
|
|
target_row = row; // last row with same time
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (target_row >= 0)
|
|
|
|
{
|
2020-11-02 16:35:48 -05:00
|
|
|
insertRow (target_row + 1, make_row (key, time, snr, delta_time, frequency, drift, callsign, grid, power, off_air));
|
2016-05-24 06:08:35 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-02 16:35:48 -05:00
|
|
|
appendRow (make_row (key, time, snr, delta_time, frequency, drift, callsign, grid, power, off_air));
|
2016-05-24 06:08:35 -04:00
|
|
|
}
|
|
|
|
|
2020-11-02 16:35:48 -05:00
|
|
|
void BeaconsModel::decodes_cleared (ClientKey const& key)
|
2016-05-24 06:08:35 -04:00
|
|
|
{
|
|
|
|
for (auto row = rowCount () - 1; row >= 0; --row)
|
|
|
|
{
|
2020-11-02 16:35:48 -05:00
|
|
|
if (item (row, 0)->data ().value<ClientKey> () == key)
|
2016-05-24 06:08:35 -04:00
|
|
|
{
|
|
|
|
removeRow (row);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "moc_BeaconsModel.cpp"
|