UI Customizations

This commit is contained in:
Jordan Sherer 2018-07-06 02:36:40 -04:00
parent 130b749dfe
commit 2605fb1a8f
4 changed files with 106 additions and 21 deletions

View File

@ -183,6 +183,36 @@ namespace
auto second = time.second (); auto second = time.second ();
return now.msecsTo (now.addSecs (second > 30 ? 60 - second : -second)) - time.msec (); return now.msecsTo (now.addSecs (second > 30 ? 60 - second : -second)) - time.msec ();
} }
QString since(QDateTime time){
int delta = time.toUTC().secsTo(QDateTime::currentDateTimeUtc());
if(delta < 30){
return QString("now");
}
int seconds = delta % 60;
delta = delta / 60;
int minutes = delta % 60;
delta = delta / 60;
int hours = delta % 24;
delta = delta / 24;
int days = delta;
if(days){
return QString("%1 d").arg(days);
}
if(hours){
return QString("%1 h").arg(hours);
}
if(minutes){
return QString("%1 m").arg(minutes);
}
if(seconds){
return QString("%1 s").arg(seconds - seconds%15);
}
return QString {};
}
} }
//--------------------------------------------------- MainWindow constructor //--------------------------------------------------- MainWindow constructor
@ -1110,6 +1140,15 @@ void MainWindow::writeSettings()
m_settings->setValue("pwrBandTuneMemory",m_pwrBandTuneMemory); m_settings->setValue("pwrBandTuneMemory",m_pwrBandTuneMemory);
m_settings->setValue ("FT8AP", ui->actionEnable_AP_FT8->isChecked ()); m_settings->setValue ("FT8AP", ui->actionEnable_AP_FT8->isChecked ());
m_settings->setValue ("JT65AP", ui->actionEnable_AP_JT65->isChecked ()); m_settings->setValue ("JT65AP", ui->actionEnable_AP_JT65->isChecked ());
// TODO: jsherer - need any other customizations?
/*m_settings->setValue("PanelLeftGeometry", ui->tableWidgetRXAll->geometry());
m_settings->setValue("PanelRightGeometry", ui->tableWidgetCalls->geometry());
m_settings->setValue("PanelTopGeometry", ui->extFreeTextMsg->geometry());
m_settings->setValue("PanelBottomGeometry", ui->extFreeTextMsgEdit->geometry());
m_settings->setValue("PanelWaterfallGeometry", ui->bandHorizontalWidget->geometry());*/
//m_settings->setValue("MainSplitter", QVariant::fromValue(ui->mainSplitter->sizes()));
{ {
QList<QVariant> coeffs; // suitable for QSettings QList<QVariant> coeffs; // suitable for QSettings
for (auto const& coeff : m_phaseEqCoefficients) for (auto const& coeff : m_phaseEqCoefficients)
@ -1198,6 +1237,17 @@ void MainWindow::readSettings()
m_pwrBandTuneMemory=m_settings->value("pwrBandTuneMemory").toHash(); m_pwrBandTuneMemory=m_settings->value("pwrBandTuneMemory").toHash();
ui->actionEnable_AP_FT8->setChecked (m_settings->value ("FT8AP", false).toBool()); ui->actionEnable_AP_FT8->setChecked (m_settings->value ("FT8AP", false).toBool());
ui->actionEnable_AP_JT65->setChecked (m_settings->value ("JT65AP", false).toBool()); ui->actionEnable_AP_JT65->setChecked (m_settings->value ("JT65AP", false).toBool());
// TODO: jsherer - any other customizations?
//ui->mainSplitter->setSizes(m_settings->value("MainSplitter", QVariant::fromValue(ui->mainSplitter->sizes())).value<QList<int> >());
//ui->tableWidgetRXAll->restoreGeometry(m_settings->value("PanelLeftGeometry", ui->tableWidgetRXAll->saveGeometry()).toByteArray());
//ui->tableWidgetCalls->restoreGeometry(m_settings->value("PanelRightGeometry", ui->tableWidgetCalls->saveGeometry()).toByteArray());
//ui->extFreeTextMsg->setGeometry( m_settings->value("PanelTopGeometry", ui->extFreeTextMsg->geometry()).toRect());
//ui->extFreeTextMsgEdit->setGeometry( m_settings->value("PanelBottomGeometry", ui->extFreeTextMsgEdit->geometry()).toRect());
//ui->bandHorizontalWidget->setGeometry( m_settings->value("PanelWaterfallGeometry", ui->bandHorizontalWidget->geometry()).toRect());
//qDebug() << m_settings->value("PanelTopGeometry") << ui->extFreeTextMsg;
{ {
auto const& coeffs = m_settings->value ("PhaseEqualizationCoefficients" auto const& coeffs = m_settings->value ("PhaseEqualizationCoefficients"
, QList<QVariant> {0., 0., 0., 0., 0.}).toList (); , QList<QVariant> {0., 0., 0., 0., 0.}).toList ();
@ -3018,7 +3068,7 @@ void MainWindow::readFromStdout() //readFromStdout
d.freq = offset; d.freq = offset;
d.text = decodedtext.messageWords().first().trimmed(); d.text = decodedtext.messageWords().first().trimmed();
d.timestamp = QDateTime::currentDateTimeUtc().toMSecsSinceEpoch(); d.timestamp = QDateTime::currentDateTimeUtc().toSecsSinceEpoch();
d.snr = decodedtext.snr(); d.snr = decodedtext.snr();
m_bandActivity[offset].append(d); m_bandActivity[offset].append(d);
while(m_bandActivity[offset].count() > 10){ while(m_bandActivity[offset].count() > 10){
@ -3037,7 +3087,7 @@ void MainWindow::readFromStdout() //readFromStdout
d.grid = theirgrid; d.grid = theirgrid;
d.snr = decodedtext.snr(); d.snr = decodedtext.snr();
d.freq = decodedtext.frequencyOffset(); d.freq = decodedtext.frequencyOffset();
d.timestamp = QDateTime::currentDateTimeUtc().toMSecsSinceEpoch(); d.timestamp = QDateTime::currentDateTimeUtc().toSecsSinceEpoch();
m_callActivity[cqCall] = d; m_callActivity[cqCall] = d;
} }
} }
@ -3822,12 +3872,20 @@ void MainWindow::guiUpdate()
m_sec0=nsec; m_sec0=nsec;
displayDialFrequency (); displayDialFrequency ();
} }
m_iptt0=g_iptt;
m_btxok0=m_btxok;
// TODO: jsherer - is this the right place? // TODO: jsherer - is this the right place?
update_dynamic_property (ui->startTxButton, "transmitting", m_transmitting); update_dynamic_property (ui->startTxButton, "transmitting", m_transmitting);
if(ui->tableWidgetCalls->selectedItems().isEmpty() && ui->tableWidgetRXAll->selectedItems().isEmpty()){
ui->replyMacroButton->setDisabled(true);
ui->snrMacroButton->setDisabled(true);
} else {
ui->replyMacroButton->setDisabled(false);
ui->snrMacroButton->setDisabled(false);
}
m_iptt0=g_iptt;
m_btxok0=m_btxok;
} //End of guiUpdate } //End of guiUpdate
@ -4987,7 +5045,7 @@ void MainWindow::on_tx6_editingFinished() //tx6 edited
msgtype(t, ui->tx6); msgtype(t, ui->tx6);
} }
int MainWindow::logRxTxMessageText(QDateTime date, QString text, bool tx, int block){ int MainWindow::logRxTxMessageText(QDateTime date, QString text, int freq, bool tx, int block){
auto c = ui->textEditRX->textCursor(); auto c = ui->textEditRX->textCursor();
bool found = false; bool found = false;
@ -5010,7 +5068,7 @@ int MainWindow::logRxTxMessageText(QDateTime date, QString text, bool tx, int bl
if(found){ if(found){
c.insertHtml(text); c.insertHtml(text);
} else { } else {
c.insertHtml(QString("<strong>%1</strong> - %2").arg(date.time().toString()).arg(text)); c.insertHtml(QString("<strong>%1 - (%2)</strong> - %3").arg(date.time().toString()).arg(freq).arg(text));
} }
return c.blockNumber(); // ui->textEditRX->document()->lineCount(); return c.blockNumber(); // ui->textEditRX->document()->lineCount();
@ -5057,7 +5115,10 @@ void MainWindow::resetMessageUI(){
void MainWindow::createMessage(QString const& text){ void MainWindow::createMessage(QString const& text){
resetMessageTransmitQueue(); resetMessageTransmitQueue();
createMessageTransmitQueue(text); createMessageTransmitQueue(text);
logRxTxMessageText(QDateTime::currentDateTimeUtc(), text, true);
// TODO: jsherer - ew
int freq = ui->TxFreqSpinBox->value();
logRxTxMessageText(QDateTime::currentDateTimeUtc(), text, freq, true);
} }
void MainWindow::createMessageTransmitQueue(QString const& text){ void MainWindow::createMessageTransmitQueue(QString const& text){
@ -5229,14 +5290,14 @@ bool MainWindow::prepareNextMessageFrame()
tc.setPosition(m_extFreeTxtPos, QTextCursor::KeepAnchor); tc.setPosition(m_extFreeTxtPos, QTextCursor::KeepAnchor);
QTextCharFormat cf = tc.charFormat(); QTextCharFormat cf = tc.charFormat();
cf.setFontStrikeOut(true); cf.setFontStrikeOut(true);
tc.mergeCharFormat(cf); tc.mergeCharFormat(cf);call
} }
*/ */
} }
void MainWindow::scheduleBeacon(){ void MainWindow::scheduleBeacon(bool first){
int timestamp = QDateTime::currentDateTimeUtc().addSecs(300).toSecsSinceEpoch(); int timestamp = QDateTime::currentDateTimeUtc().addSecs(first ? 15 : 300).toSecsSinceEpoch();
m_nextBeacon = QDateTime::fromSecsSinceEpoch(roundUp(timestamp, 15) + 1, QTimeZone::utc()); m_nextBeacon = QDateTime::fromSecsSinceEpoch(roundUp(timestamp, 15) + 1, QTimeZone::utc());
beaconTimer.start(QDateTime::currentDateTimeUtc().msecsTo(m_nextBeacon) - 2*1000); beaconTimer.start(QDateTime::currentDateTimeUtc().msecsTo(m_nextBeacon) - 2*1000);
} }
@ -5256,6 +5317,10 @@ void MainWindow::prepareBeacon(){
} }
QString message = QString("DE %1 %2\nDE %1 %2").arg(m_config.my_callsign()).arg(m_config.my_grid().mid(0, 4)); QString message = QString("DE %1 %2\nDE %1 %2").arg(m_config.my_callsign()).arg(m_config.my_grid().mid(0, 4));
// TODO: jsherer - there's probably a better way...
int f = (qrand() % 900) + 100;
setFreq4(f, f);
ui->extFreeTextMsgEdit->setPlainText(message); ui->extFreeTextMsgEdit->setPlainText(message);
ui->startTxButton->setChecked(true); ui->startTxButton->setChecked(true);
@ -6615,7 +6680,7 @@ void MainWindow::on_pbT2R_clicked()
void MainWindow::on_beaconButton_clicked() void MainWindow::on_beaconButton_clicked()
{ {
if(ui->beaconButton->isChecked()){ if(ui->beaconButton->isChecked()){
scheduleBeacon(); scheduleBeacon(true);
} }
} }
@ -6681,6 +6746,9 @@ void MainWindow::setXIT(int n, Frequency base)
void MainWindow::setFreq4(int rxFreq, int txFreq) void MainWindow::setFreq4(int rxFreq, int txFreq)
{ {
if(rxFreq != txFreq){
txFreq = rxFreq;
}
if (ui->RxFreqSpinBox->isEnabled ()) ui->RxFreqSpinBox->setValue(rxFreq); if (ui->RxFreqSpinBox->isEnabled ()) ui->RxFreqSpinBox->setValue(rxFreq);
ui->labDialFreqOffset->setText(QString("%1 Hz").arg(rxFreq)); ui->labDialFreqOffset->setText(QString("%1 Hz").arg(rxFreq));
if(m_mode.startsWith ("WSPR")) { if(m_mode.startsWith ("WSPR")) {
@ -7374,7 +7442,7 @@ void MainWindow::postDecode (bool is_new, QString const& message)
if(!selectedItems.isEmpty()){ if(!selectedItems.isEmpty()){
selectedOffset = selectedItems.first()->text().toInt(); selectedOffset = selectedItems.first()->text().toInt();
} }
int now = QDateTime::currentDateTimeUtc().toMSecsSinceEpoch(); int now = QDateTime::currentDateTimeUtc().toSecsSinceEpoch();
for(int i = ui->tableWidgetRXAll->rowCount(); i >= 0; i--){ for(int i = ui->tableWidgetRXAll->rowCount(); i >= 0; i--){
ui->tableWidgetRXAll->removeRow(i); ui->tableWidgetRXAll->removeRow(i);
} }
@ -7386,7 +7454,7 @@ void MainWindow::postDecode (bool is_new, QString const& message)
QStringList text; QStringList text;
int snr = 0; int snr = 0;
foreach(auto item, items){ foreach(auto item, items){
if(now - item.timestamp > 90000){ if(now - item.timestamp > 90){
continue; continue;
} }
if(item.text.isEmpty()){ if(item.text.isEmpty()){
@ -7438,7 +7506,8 @@ void MainWindow::postDecode (bool is_new, QString const& message)
} }
} }
} }
ui->tableWidgetRXAll->resizeColumnsToContents(); ui->tableWidgetRXAll->resizeColumnToContents(0);
ui->tableWidgetRXAll->resizeColumnToContents(1); //resizeColumnsToContents();
// TODO: jsherer - keep track of selection // TODO: jsherer - keep track of selection
QString selectedCall; QString selectedCall;
@ -7459,22 +7528,24 @@ void MainWindow::postDecode (bool is_new, QString const& message)
CallDetail d = m_callActivity[call]; CallDetail d = m_callActivity[call];
ui->tableWidgetCalls->insertRow(ui->tableWidgetCalls->rowCount()); ui->tableWidgetCalls->insertRow(ui->tableWidgetCalls->rowCount());
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 0, new QTableWidgetItem(call)); ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 0, new QTableWidgetItem(call));
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 1, new QTableWidgetItem(QString("(%1)").arg(since(QDateTime::fromSecsSinceEpoch(d.timestamp, QTimeZone::utc())))));
//ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 1, new QTableWidgetItem(d.grid)); //ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, 1, new QTableWidgetItem(d.grid));
if(call == selectedCall){ if(call == selectedCall){
ui->tableWidgetCalls->selectRow(ui->tableWidgetCalls->rowCount() - 1); ui->tableWidgetCalls->selectRow(ui->tableWidgetCalls->rowCount() - 1);
} }
} }
ui->tableWidgetCalls->resizeColumnToContents(1);
// RX Activity // RX Activity
while(!m_rxFrameQueue.isEmpty()){ while(!m_rxFrameQueue.isEmpty()){
RXDetail d = m_rxFrameQueue.first(); RXDetail d = m_rxFrameQueue.first();
m_rxFrameQueue.removeFirst(); m_rxFrameQueue.removeFirst();
auto date = QDateTime::fromSecsSinceEpoch(d.timestamp).toUTC(); auto date = QDateTime::fromSecsSinceEpoch(d.timestamp, QTimeZone::utc());
int freq = d.freq/10*10; int freq = d.freq/10*10;
int block = m_rxFrameBlockNumbers.contains(freq) ? m_rxFrameBlockNumbers[freq] : -1; int block = m_rxFrameBlockNumbers.contains(freq) ? m_rxFrameBlockNumbers[freq] : -1;
block = logRxTxMessageText(date, d.text, false, block=block); block = logRxTxMessageText(date, d.text, d.freq, false, block=block);
m_rxFrameBlockNumbers[freq] = block; m_rxFrameBlockNumbers[freq] = block;
} }
} }

View File

@ -119,7 +119,7 @@ public slots:
void msgAvgDecode2(); void msgAvgDecode2();
void fastPick(int x0, int x1, int y); void fastPick(int x0, int x1, int y);
int logRxTxMessageText(QDateTime date, QString text, bool tx, int block=-1); int logRxTxMessageText(QDateTime date, QString text, int freq, bool tx, int block=-1);
void addMessageText(QString text); void addMessageText(QString text);
void resetMessage(); void resetMessage();
void resetMessageUI(); void resetMessageUI();
@ -249,7 +249,7 @@ private slots:
QString parseFT8Message(QString input); QString parseFT8Message(QString input);
int countFreeTextMsgs(QString input); int countFreeTextMsgs(QString input);
bool prepareNextMessageFrame(); bool prepareNextMessageFrame();
void scheduleBeacon(); void scheduleBeacon(bool first=false);
void prepareBeacon(); void prepareBeacon();
void on_rptSpinBox_valueChanged(int n); void on_rptSpinBox_valueChanged(int n);
void killFile(); void killFile();

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>960</width> <width>960</width>
<height>514</height> <height>534</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -759,6 +759,9 @@ background-color: yellow;
<property name="dragDropOverwriteMode"> <property name="dragDropOverwriteMode">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode"> <property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum> <enum>QAbstractItemView::SingleSelection</enum>
</property> </property>
@ -890,6 +893,9 @@ QTextEdit[readOnly=&quot;true&quot;] {
<property name="showDropIndicator" stdset="0"> <property name="showDropIndicator" stdset="0">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode"> <property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum> <enum>QAbstractItemView::SingleSelection</enum>
</property> </property>
@ -905,6 +911,9 @@ QTextEdit[readOnly=&quot;true&quot;] {
<attribute name="horizontalHeaderVisible"> <attribute name="horizontalHeaderVisible">
<bool>false</bool> <bool>false</bool>
</attribute> </attribute>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>30</number>
</attribute>
<attribute name="horizontalHeaderStretchLastSection"> <attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool> <bool>true</bool>
</attribute> </attribute>
@ -916,6 +925,11 @@ QTextEdit[readOnly=&quot;true&quot;] {
<string>Callsign</string> <string>Callsign</string>
</property> </property>
</column> </column>
<column>
<property name="text">
<string>Age</string>
</property>
</column>
</widget> </widget>
</widget> </widget>
<widget class="QWidget" name="macroHorizonalWidget" native="true"> <widget class="QWidget" name="macroHorizonalWidget" native="true">

View File

@ -83,6 +83,6 @@ QString version (bool include_patch)
QString program_title (QString const& revision) QString program_title (QString const& revision)
{ {
QString id {"FT8Call by KN4CRD a derivative of WSJT-X v" + QCoreApplication::applicationVersion ()}; QString id {"FT8Call by KN4CRD a derivative of WSJT-X"}; // v" + QCoreApplication::applicationVersion ()};
return id + " " + revision + " by K1JT"; return id /*+ " " + revision*/ + " by K1JT";
} }