mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-09-08 22:36:40 -04:00
External servers can clear either or both of the Band Activity and Rx Frequency decodes windows. This was requested by Dave, AA6YQ, so that DX Lab Suite applications can clear old decodes on band changes to ensure that decode highlighing is consistent.
154 lines
5.3 KiB
C++
154 lines
5.3 KiB
C++
#include "DecodesModel.hpp"
|
|
|
|
#include <QStandardItem>
|
|
#include <QModelIndex>
|
|
#include <QTime>
|
|
#include <QString>
|
|
#include <QFont>
|
|
#include <QList>
|
|
|
|
namespace
|
|
{
|
|
char const * const headings[] = {
|
|
QT_TRANSLATE_NOOP ("DecodesModel", "Client"),
|
|
QT_TRANSLATE_NOOP ("DecodesModel", "Time"),
|
|
QT_TRANSLATE_NOOP ("DecodesModel", "Snr"),
|
|
QT_TRANSLATE_NOOP ("DecodesModel", "DT"),
|
|
QT_TRANSLATE_NOOP ("DecodesModel", "DF"),
|
|
QT_TRANSLATE_NOOP ("DecodesModel", "Md"),
|
|
QT_TRANSLATE_NOOP ("DecodesModel", "Confidence"),
|
|
QT_TRANSLATE_NOOP ("DecodesModel", "Live"),
|
|
QT_TRANSLATE_NOOP ("DecodesModel", "Message"),
|
|
};
|
|
|
|
QString confidence_string (bool low_confidence)
|
|
{
|
|
return low_confidence ? QT_TRANSLATE_NOOP ("DecodesModel", "low") : QT_TRANSLATE_NOOP ("DecodesModel", "high");
|
|
}
|
|
|
|
QString live_string (bool off_air)
|
|
{
|
|
return off_air ? QT_TRANSLATE_NOOP ("DecodesModel", "no") : QT_TRANSLATE_NOOP ("DecodesModel", "yes");
|
|
}
|
|
|
|
QFont text_font {"Courier", 10};
|
|
|
|
QList<QStandardItem *> make_row (QString const& client_id, QTime time, qint32 snr, float delta_time
|
|
, quint32 delta_frequency, QString const& mode, QString const& message
|
|
, bool low_confidence, bool off_air, bool is_fast)
|
|
{
|
|
auto time_item = new QStandardItem {time.toString (is_fast || "~" == mode ? "hh:mm:ss" : "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 df = new QStandardItem {QString::number (delta_frequency)};
|
|
df->setData (delta_frequency);
|
|
df->setTextAlignment (Qt::AlignRight);
|
|
|
|
auto md = new QStandardItem {mode};
|
|
md->setTextAlignment (Qt::AlignHCenter);
|
|
|
|
auto confidence = new QStandardItem {confidence_string (low_confidence)};
|
|
confidence->setTextAlignment (Qt::AlignHCenter);
|
|
|
|
auto live = new QStandardItem {live_string (off_air)};
|
|
live->setTextAlignment (Qt::AlignHCenter);
|
|
|
|
QList<QStandardItem *> row {
|
|
new QStandardItem {client_id}, time_item, snr_item, dt, df, md, confidence, live, new QStandardItem {message}};
|
|
Q_FOREACH (auto& item, row)
|
|
{
|
|
item->setEditable (false);
|
|
item->setFont (text_font);
|
|
item->setTextAlignment (item->textAlignment () | Qt::AlignVCenter);
|
|
}
|
|
return row;
|
|
}
|
|
}
|
|
|
|
DecodesModel::DecodesModel (QObject * parent)
|
|
: QStandardItemModel {0, sizeof headings / sizeof headings[0], parent}
|
|
{
|
|
int column {0};
|
|
for (auto const& heading : headings)
|
|
{
|
|
setHeaderData (column++, Qt::Horizontal, tr (heading));
|
|
}
|
|
}
|
|
|
|
void DecodesModel::add_decode (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time
|
|
, quint32 delta_frequency, QString const& mode, QString const& message
|
|
, bool low_confidence, bool off_air, bool is_fast)
|
|
{
|
|
if (!is_new)
|
|
{
|
|
int target_row {-1};
|
|
for (auto row = 0; row < rowCount (); ++row)
|
|
{
|
|
if (data (index (row, 0)).toString () == client_id)
|
|
{
|
|
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 ().toUInt () == delta_frequency
|
|
&& data (index (row, 5)).toString () == mode
|
|
&& data (index (row, 7)).toString () == confidence_string (low_confidence)
|
|
&& data (index (row, 6)).toString () == live_string (off_air)
|
|
&& data (index (row, 8)).toString () == message)
|
|
{
|
|
return;
|
|
}
|
|
if (time <= row_time)
|
|
{
|
|
target_row = row; // last row with same time
|
|
}
|
|
}
|
|
}
|
|
if (target_row >= 0)
|
|
{
|
|
insertRow (target_row + 1, make_row (client_id, time, snr, delta_time, delta_frequency, mode
|
|
, message, low_confidence, off_air, is_fast));
|
|
return;
|
|
}
|
|
}
|
|
|
|
appendRow (make_row (client_id, time, snr, delta_time, delta_frequency, mode, message, low_confidence
|
|
, off_air, is_fast));
|
|
}
|
|
|
|
void DecodesModel::decodes_cleared (QString const& client_id)
|
|
{
|
|
for (auto row = rowCount () - 1; row >= 0; --row)
|
|
{
|
|
if (data (index (row, 0)).toString () == client_id)
|
|
{
|
|
removeRow (row);
|
|
}
|
|
}
|
|
}
|
|
|
|
void DecodesModel::do_reply (QModelIndex const& source, quint8 modifiers)
|
|
{
|
|
auto row = source.row ();
|
|
Q_EMIT reply (data (index (row, 0)).toString ()
|
|
, item (row, 1)->data ().toTime ()
|
|
, item (row, 2)->data ().toInt ()
|
|
, item (row, 3)->data ().toFloat ()
|
|
, item (row, 4)->data ().toInt ()
|
|
, data (index (row, 5)).toString ()
|
|
, data (index (row, 8)).toString ()
|
|
, confidence_string (true) == data (index (row, 7)).toString ()
|
|
, modifiers);
|
|
}
|
|
|
|
#include "moc_DecodesModel.cpp"
|