Fixed jumping of band activity and call activity tables on update
This commit is contained in:
parent
9815c4dde9
commit
5fad5497d2
302
mainwindow.cpp
302
mainwindow.cpp
@ -1275,14 +1275,17 @@ void MainWindow::not_GA_warning_message ()
|
||||
"and carry a responsiblity to report any problems to:\n"
|
||||
"Jordan Sherer (KN4CRD) kn4crd@gmail.com\n\n").arg(QApplication::applicationName()).arg(eol.toString()));
|
||||
|
||||
|
||||
#if 0
|
||||
for(int i = 0; i < 13; i++){
|
||||
CallDetail cd;
|
||||
cd.call = "KN4CRD";
|
||||
cd.call = QString("KN%1CRD").arg(i);
|
||||
cd.freq = 1200;
|
||||
cd.bits = Varicode::FT8CallLast;
|
||||
cd.utcTimestamp = QDateTime::currentDateTimeUtc();
|
||||
logCallActivity(cd, false);
|
||||
m_rxDirty = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void MainWindow::initialize_fonts ()
|
||||
@ -8965,119 +8968,131 @@ void MainWindow::displayBandActivity() {
|
||||
selectedOffset = selectedItems.first()->text().toInt();
|
||||
}
|
||||
|
||||
// Clear the table
|
||||
clearTableWidget(ui->tableWidgetRXAll);
|
||||
ui->tableWidgetRXAll->setUpdatesEnabled(false);
|
||||
{
|
||||
// Scroll Position
|
||||
auto currentScrollPos = ui->tableWidgetRXAll->verticalScrollBar()->value();
|
||||
|
||||
// Sort directed & recent messages first
|
||||
QList < int > keys = m_bandActivity.keys();
|
||||
qSort(keys.begin(), keys.end(), [this](const int left, int right) {
|
||||
if (m_rxDirectedCache.contains(left / 10 * 10)) {
|
||||
return true;
|
||||
}
|
||||
if (m_rxDirectedCache.contains(right / 10 * 10)) {
|
||||
return false;
|
||||
}
|
||||
if (m_rxRecentCache.contains(left / 10 * 10)) {
|
||||
return true;
|
||||
}
|
||||
if (m_rxRecentCache.contains(right / 10 * 10)) {
|
||||
return false;
|
||||
}
|
||||
return left < right;
|
||||
});
|
||||
// Clear the table
|
||||
clearTableWidget(ui->tableWidgetRXAll);
|
||||
|
||||
// Build the table
|
||||
foreach(int offset, keys) {
|
||||
QList < ActivityDetail > items = m_bandActivity[offset];
|
||||
if (items.length() > 0) {
|
||||
QStringList text;
|
||||
QString age;
|
||||
int snr = 0;
|
||||
int activityAging = m_config.activity_aging();
|
||||
foreach(ActivityDetail item, items) {
|
||||
if (activityAging && item.utcTimestamp.secsTo(now) / 60 >= activityAging) {
|
||||
continue;
|
||||
}
|
||||
if (item.text.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
// Sort directed & recent messages first
|
||||
QList < int > keys = m_bandActivity.keys();
|
||||
qSort(keys.begin(), keys.end(), [this](const int left, int right) {
|
||||
#if 0
|
||||
if (item.isCompound || (item.isDirected && item.text.contains("<....>"))){
|
||||
//continue;
|
||||
item.text = "[...]";
|
||||
}
|
||||
if (m_rxDirectedCache.contains(left / 10 * 10)) {
|
||||
return true;
|
||||
}
|
||||
if (m_rxDirectedCache.contains(right / 10 * 10)) {
|
||||
return false;
|
||||
}
|
||||
if (m_rxRecentCache.contains(left / 10 * 10)) {
|
||||
return true;
|
||||
}
|
||||
if (m_rxRecentCache.contains(right / 10 * 10)) {
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
if (item.isLowConfidence) {
|
||||
item.text = QString("[%1]").arg(item.text);
|
||||
return left < right;
|
||||
});
|
||||
|
||||
// Build the table
|
||||
foreach(int offset, keys) {
|
||||
QList < ActivityDetail > items = m_bandActivity[offset];
|
||||
if (items.length() > 0) {
|
||||
QStringList text;
|
||||
QString age;
|
||||
int snr = 0;
|
||||
int activityAging = m_config.activity_aging();
|
||||
foreach(ActivityDetail item, items) {
|
||||
if (activityAging && item.utcTimestamp.secsTo(now) / 60 >= activityAging) {
|
||||
continue;
|
||||
}
|
||||
if (item.text.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
#if 0
|
||||
if (item.isCompound || (item.isDirected && item.text.contains("<....>"))){
|
||||
//continue;
|
||||
item.text = "[...]";
|
||||
}
|
||||
#endif
|
||||
if (item.isLowConfidence) {
|
||||
item.text = QString("[%1]").arg(item.text);
|
||||
}
|
||||
if ((item.bits & Varicode::FT8CallLast) == Varicode::FT8CallLast) {
|
||||
// can also use \u0004 \u2666 \u2404
|
||||
item.text = QString("%1 \u2301 ").arg(item.text);
|
||||
}
|
||||
text.append(item.text);
|
||||
snr = item.snr;
|
||||
age = since(item.utcTimestamp);
|
||||
}
|
||||
if ((item.bits & Varicode::FT8CallLast) == Varicode::FT8CallLast) {
|
||||
// can also use \u0004 \u2666 \u2404
|
||||
item.text = QString("%1 \u2301 ").arg(item.text);
|
||||
|
||||
auto joined = text.join(" ");
|
||||
if (joined.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
text.append(item.text);
|
||||
snr = item.snr;
|
||||
age = since(item.utcTimestamp);
|
||||
}
|
||||
|
||||
auto joined = text.join(" ");
|
||||
if (joined.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
ui->tableWidgetRXAll->insertRow(ui->tableWidgetRXAll->rowCount());
|
||||
|
||||
ui->tableWidgetRXAll->insertRow(ui->tableWidgetRXAll->rowCount());
|
||||
auto offsetItem = new QTableWidgetItem(QString("%1").arg(offset));
|
||||
offsetItem->setData(Qt::UserRole, QVariant(offset));
|
||||
ui->tableWidgetRXAll->setItem(ui->tableWidgetRXAll->rowCount() - 1, 0, offsetItem);
|
||||
|
||||
auto offsetItem = new QTableWidgetItem(QString("%1").arg(offset));
|
||||
offsetItem->setData(Qt::UserRole, QVariant(offset));
|
||||
ui->tableWidgetRXAll->setItem(ui->tableWidgetRXAll->rowCount() - 1, 0, offsetItem);
|
||||
auto ageItem = new QTableWidgetItem(QString("(%1)").arg(age));
|
||||
ageItem->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
|
||||
ui->tableWidgetRXAll->setItem(ui->tableWidgetRXAll->rowCount() - 1, 1, ageItem);
|
||||
|
||||
auto ageItem = new QTableWidgetItem(QString("(%1)").arg(age));
|
||||
ageItem->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
|
||||
ui->tableWidgetRXAll->setItem(ui->tableWidgetRXAll->rowCount() - 1, 1, ageItem);
|
||||
auto snrItem = new QTableWidgetItem(QString("%1").arg(Varicode::formatSNR(snr)));
|
||||
snrItem->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
|
||||
ui->tableWidgetRXAll->setItem(ui->tableWidgetRXAll->rowCount() - 1, 2, snrItem);
|
||||
|
||||
auto snrItem = new QTableWidgetItem(QString("%1").arg(Varicode::formatSNR(snr)));
|
||||
snrItem->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
|
||||
ui->tableWidgetRXAll->setItem(ui->tableWidgetRXAll->rowCount() - 1, 2, snrItem);
|
||||
// align right if eliding...
|
||||
int colWidth = ui->tableWidgetRXAll->columnWidth(3);
|
||||
auto textItem = new QTableWidgetItem(joined);
|
||||
QFontMetrics fm(textItem->font());
|
||||
auto elidedText = fm.elidedText(joined, Qt::ElideLeft, colWidth);
|
||||
auto flag = Qt::AlignLeft | Qt::AlignVCenter;
|
||||
if (elidedText != joined) {
|
||||
flag = Qt::AlignRight | Qt::AlignVCenter;
|
||||
textItem->setText(joined);
|
||||
}
|
||||
textItem->setTextAlignment(flag);
|
||||
|
||||
// align right if eliding...
|
||||
int colWidth = ui->tableWidgetRXAll->columnWidth(3);
|
||||
auto textItem = new QTableWidgetItem(joined);
|
||||
QFontMetrics fm(textItem->font());
|
||||
auto elidedText = fm.elidedText(joined, Qt::ElideLeft, colWidth);
|
||||
auto flag = Qt::AlignLeft | Qt::AlignVCenter;
|
||||
if (elidedText != joined) {
|
||||
flag = Qt::AlignRight | Qt::AlignVCenter;
|
||||
textItem->setText(joined);
|
||||
}
|
||||
textItem->setTextAlignment(flag);
|
||||
if (text.last().contains(QRegularExpression {
|
||||
"\\b(CQCQCQ|BEACON)\\b"
|
||||
})) {
|
||||
offsetItem->setBackground(QBrush(m_config.color_CQ()));
|
||||
ageItem->setBackground(QBrush(m_config.color_CQ()));
|
||||
snrItem->setBackground(QBrush(m_config.color_CQ()));
|
||||
textItem->setBackground(QBrush(m_config.color_CQ()));
|
||||
}
|
||||
|
||||
if (text.last().contains(QRegularExpression {
|
||||
"\\b(CQCQCQ|BEACON)\\b"
|
||||
})) {
|
||||
offsetItem->setBackground(QBrush(m_config.color_CQ()));
|
||||
ageItem->setBackground(QBrush(m_config.color_CQ()));
|
||||
snrItem->setBackground(QBrush(m_config.color_CQ()));
|
||||
textItem->setBackground(QBrush(m_config.color_CQ()));
|
||||
}
|
||||
if (isDirectedOffset(offset)) {
|
||||
offsetItem->setBackground(QBrush(m_config.color_MyCall()));
|
||||
ageItem->setBackground(QBrush(m_config.color_MyCall()));
|
||||
snrItem->setBackground(QBrush(m_config.color_MyCall()));
|
||||
textItem->setBackground(QBrush(m_config.color_MyCall()));
|
||||
}
|
||||
|
||||
if (m_rxDirectedCache.contains(offset / 10 * 10)) {
|
||||
offsetItem->setBackground(QBrush(m_config.color_MyCall()));
|
||||
ageItem->setBackground(QBrush(m_config.color_MyCall()));
|
||||
snrItem->setBackground(QBrush(m_config.color_MyCall()));
|
||||
textItem->setBackground(QBrush(m_config.color_MyCall()));
|
||||
}
|
||||
ui->tableWidgetRXAll->setItem(ui->tableWidgetRXAll->rowCount() - 1, 3, textItem);
|
||||
|
||||
ui->tableWidgetRXAll->setItem(ui->tableWidgetRXAll->rowCount() - 1, 3, textItem);
|
||||
|
||||
if (offset == selectedOffset) {
|
||||
ui->tableWidgetRXAll->selectRow(ui->tableWidgetRXAll->rowCount() - 1);
|
||||
if (offset == selectedOffset) {
|
||||
ui->tableWidgetRXAll->selectRow(ui->tableWidgetRXAll->rowCount() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Resize the table columns
|
||||
ui->tableWidgetRXAll->resizeColumnToContents(0);
|
||||
ui->tableWidgetRXAll->resizeColumnToContents(1);
|
||||
ui->tableWidgetRXAll->resizeColumnToContents(2);
|
||||
// Resize the table columns
|
||||
ui->tableWidgetRXAll->resizeColumnToContents(0);
|
||||
ui->tableWidgetRXAll->resizeColumnToContents(1);
|
||||
ui->tableWidgetRXAll->resizeColumnToContents(2);
|
||||
|
||||
// Reset the scroll position
|
||||
ui->tableWidgetRXAll->verticalScrollBar()->setValue(currentScrollPos);
|
||||
}
|
||||
ui->tableWidgetRXAll->setUpdatesEnabled(true);
|
||||
}
|
||||
|
||||
void MainWindow::displayCallActivity() {
|
||||
@ -9086,54 +9101,63 @@ void MainWindow::displayCallActivity() {
|
||||
// Selected callsign
|
||||
QString selectedCall = callsignSelected();
|
||||
|
||||
// Clear the table
|
||||
clearTableWidget(ui->tableWidgetCalls);
|
||||
ui->tableWidgetCalls->setUpdatesEnabled(false);
|
||||
{
|
||||
auto currentScrollPos = ui->tableWidgetCalls->verticalScrollBar()->value();
|
||||
|
||||
// Create the ALLCALL item
|
||||
auto item = new QTableWidgetItem("ALLCALL");
|
||||
ui->tableWidgetCalls->insertRow(ui->tableWidgetCalls->rowCount());
|
||||
item->setData(Qt::UserRole, QVariant("ALLCALL"));
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 0, item);
|
||||
ui->tableWidgetCalls->setSpan(ui->tableWidgetCalls->rowCount() - 1, 0, 1, ui->tableWidgetCalls->columnCount());
|
||||
if (isAllCallIncluded(selectedCall)) {
|
||||
ui->tableWidgetCalls->selectRow(ui->tableWidgetCalls->rowCount() - 1);
|
||||
}
|
||||
|
||||
// Build the table
|
||||
QList < QString > calls = m_callActivity.keys();
|
||||
qSort(calls.begin(), calls.end());
|
||||
int callsignAging = m_config.callsign_aging();
|
||||
foreach(QString call, calls) {
|
||||
CallDetail d = m_callActivity[call];
|
||||
|
||||
if (callsignAging && d.utcTimestamp.secsTo(now) / 60 >= callsignAging) {
|
||||
continue;
|
||||
}
|
||||
// Clear the table
|
||||
clearTableWidget(ui->tableWidgetCalls);
|
||||
|
||||
// Create the ALLCALL item
|
||||
auto item = new QTableWidgetItem("ALLCALL");
|
||||
ui->tableWidgetCalls->insertRow(ui->tableWidgetCalls->rowCount());
|
||||
|
||||
QString displayCall = d.through.isEmpty() ? d.call : QString("%1 | %2").arg(d.through).arg(d.call);
|
||||
auto displayItem = new QTableWidgetItem(displayCall);
|
||||
displayItem->setData(Qt::UserRole, QVariant((d.call)));
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 0, displayItem);
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 1, new QTableWidgetItem(QString("(%1)").arg(since(d.utcTimestamp))));
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 2, new QTableWidgetItem(QString("%1").arg(Varicode::formatSNR(d.snr))));
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 3, new QTableWidgetItem(QString("%1").arg(d.grid)));
|
||||
|
||||
auto distanceItem = new QTableWidgetItem(calculateDistance(d.grid));
|
||||
distanceItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 4, distanceItem);
|
||||
|
||||
if (call == selectedCall) {
|
||||
item->setData(Qt::UserRole, QVariant("ALLCALL"));
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 0, item);
|
||||
ui->tableWidgetCalls->setSpan(ui->tableWidgetCalls->rowCount() - 1, 0, 1, ui->tableWidgetCalls->columnCount());
|
||||
if (isAllCallIncluded(selectedCall)) {
|
||||
ui->tableWidgetCalls->selectRow(ui->tableWidgetCalls->rowCount() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Resize the table columns
|
||||
ui->tableWidgetCalls->resizeColumnToContents(0);
|
||||
ui->tableWidgetCalls->resizeColumnToContents(1);
|
||||
ui->tableWidgetCalls->resizeColumnToContents(2);
|
||||
ui->tableWidgetCalls->resizeColumnToContents(3);
|
||||
// Build the table
|
||||
QList < QString > calls = m_callActivity.keys();
|
||||
qSort(calls.begin(), calls.end());
|
||||
int callsignAging = m_config.callsign_aging();
|
||||
foreach(QString call, calls) {
|
||||
CallDetail d = m_callActivity[call];
|
||||
|
||||
if (callsignAging && d.utcTimestamp.secsTo(now) / 60 >= callsignAging) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ui->tableWidgetCalls->insertRow(ui->tableWidgetCalls->rowCount());
|
||||
|
||||
QString displayCall = d.through.isEmpty() ? d.call : QString("%1 | %2").arg(d.through).arg(d.call);
|
||||
auto displayItem = new QTableWidgetItem(displayCall);
|
||||
displayItem->setData(Qt::UserRole, QVariant((d.call)));
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 0, displayItem);
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 1, new QTableWidgetItem(QString("(%1)").arg(since(d.utcTimestamp))));
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 2, new QTableWidgetItem(QString("%1").arg(Varicode::formatSNR(d.snr))));
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 3, new QTableWidgetItem(QString("%1").arg(d.grid)));
|
||||
|
||||
auto distanceItem = new QTableWidgetItem(calculateDistance(d.grid));
|
||||
distanceItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
||||
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 4, distanceItem);
|
||||
|
||||
if (call == selectedCall) {
|
||||
ui->tableWidgetCalls->selectRow(ui->tableWidgetCalls->rowCount() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Resize the table columns
|
||||
ui->tableWidgetCalls->resizeColumnToContents(0);
|
||||
ui->tableWidgetCalls->resizeColumnToContents(1);
|
||||
ui->tableWidgetCalls->resizeColumnToContents(2);
|
||||
ui->tableWidgetCalls->resizeColumnToContents(3);
|
||||
|
||||
// Reset the scroll position
|
||||
ui->tableWidgetCalls->verticalScrollBar()->setValue(currentScrollPos);
|
||||
}
|
||||
ui->tableWidgetCalls->setUpdatesEnabled(true);
|
||||
}
|
||||
|
||||
void MainWindow::postWSPRDecode (bool is_new, QStringList parts)
|
||||
|
Loading…
Reference in New Issue
Block a user