mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-25 21:58:38 -05:00
c81b3c8e65
Basic validation, must have non-empty exchange sent and received. Abstracted log view window widget behaviour into a base class. Turned on auto resize to row height in log view windows and enabled alternating colours. Convert empty fields to NULL when inserting new log table rows to signify missing data. Trap insert row errors when adding to contest log table so that logging can be held back if constraints are not met. Re-factored log QSO processing to try insert row into log table first and pop up a message box if constraints are not met, this pops up the Log QSO window in case it was initiated by an auto log event.
214 lines
7.5 KiB
C++
214 lines
7.5 KiB
C++
#include "logqso.h"
|
|
|
|
#include <QString>
|
|
#include <QSettings>
|
|
#include <QStandardPaths>
|
|
#include <QDir>
|
|
#include <QDebug>
|
|
|
|
#include "logbook/logbook.h"
|
|
#include "MessageBox.hpp"
|
|
#include "Configuration.hpp"
|
|
#include "models/Bands.hpp"
|
|
#include "models/CabrilloLog.hpp"
|
|
#include "validators/MaidenheadLocatorValidator.hpp"
|
|
|
|
#include "ui_logqso.h"
|
|
#include "moc_logqso.cpp"
|
|
|
|
LogQSO::LogQSO(QString const& programTitle, QSettings * settings
|
|
, Configuration const * config, QWidget *parent)
|
|
: QDialog {parent, Qt::WindowStaysOnTopHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint}
|
|
, ui(new Ui::LogQSO)
|
|
, m_settings (settings)
|
|
, m_config {config}
|
|
{
|
|
ui->setupUi(this);
|
|
setWindowTitle(programTitle + " - Log QSO");
|
|
loadSettings ();
|
|
ui->grid->setValidator (new MaidenheadLocatorValidator {this});
|
|
}
|
|
|
|
LogQSO::~LogQSO ()
|
|
{
|
|
}
|
|
|
|
void LogQSO::loadSettings ()
|
|
{
|
|
m_settings->beginGroup ("LogQSO");
|
|
restoreGeometry (m_settings->value ("geometry", saveGeometry ()).toByteArray ());
|
|
ui->cbTxPower->setChecked (m_settings->value ("SaveTxPower", false).toBool ());
|
|
ui->cbComments->setChecked (m_settings->value ("SaveComments", false).toBool ());
|
|
m_txPower = m_settings->value ("TxPower", "").toString ();
|
|
m_comments = m_settings->value ("LogComments", "").toString();
|
|
m_settings->endGroup ();
|
|
}
|
|
|
|
void LogQSO::storeSettings () const
|
|
{
|
|
m_settings->beginGroup ("LogQSO");
|
|
m_settings->setValue ("geometry", saveGeometry ());
|
|
m_settings->setValue ("SaveTxPower", ui->cbTxPower->isChecked ());
|
|
m_settings->setValue ("SaveComments", ui->cbComments->isChecked ());
|
|
m_settings->setValue ("TxPower", m_txPower);
|
|
m_settings->setValue ("LogComments", m_comments);
|
|
m_settings->endGroup ();
|
|
}
|
|
|
|
void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString mode,
|
|
QString const& rptSent, QString const& rptRcvd,
|
|
QDateTime const& dateTimeOn, QDateTime const& dateTimeOff,
|
|
Radio::Frequency dialFreq, bool noSuffix, QString xSent, QString xRcvd,
|
|
CabrilloLog * cabrillo_log)
|
|
{
|
|
if(!isHidden()) return;
|
|
ui->call->setText(hisCall);
|
|
ui->grid->setText(hisGrid);
|
|
ui->name->setText("");
|
|
ui->txPower->setText("");
|
|
ui->comments->setText("");
|
|
if (ui->cbTxPower->isChecked ()) ui->txPower->setText(m_txPower);
|
|
if (ui->cbComments->isChecked ()) ui->comments->setText(m_comments);
|
|
if (m_config->report_in_comments()) {
|
|
QString t=mode;
|
|
if(rptSent!="") t+=" Sent: " + rptSent;
|
|
if(rptRcvd!="") t+=" Rcvd: " + rptRcvd;
|
|
ui->comments->setText(t);
|
|
}
|
|
if(noSuffix and mode.mid(0,3)=="JT9") mode="JT9";
|
|
if(m_config->log_as_RTTY() and mode.mid(0,3)=="JT9") mode="RTTY";
|
|
ui->mode->setText(mode);
|
|
ui->sent->setText(rptSent);
|
|
ui->rcvd->setText(rptRcvd);
|
|
ui->start_date_time->setDateTime (dateTimeOn);
|
|
ui->end_date_time->setDateTime (dateTimeOff);
|
|
m_dialFreq=dialFreq;
|
|
m_myCall=m_config->my_callsign();
|
|
m_myGrid=m_config->my_grid();
|
|
ui->band->setText (m_config->bands ()->find (dialFreq));
|
|
ui->loggedOperator->setText(m_config->opCall());
|
|
ui->exchSent->setText (xSent);
|
|
ui->exchRcvd->setText (xRcvd);
|
|
m_cabrilloLog = cabrillo_log;
|
|
|
|
using SpOp = Configuration::SpecialOperatingActivity;
|
|
auto special_op = m_config->special_op_id ();
|
|
if (SpOp::FOX == special_op
|
|
|| (m_config->autoLog ()
|
|
&& SpOp::NONE < special_op && special_op < SpOp::FOX))
|
|
{
|
|
// allow auto logging in Fox mode and contests
|
|
accept();
|
|
}
|
|
else
|
|
{
|
|
show();
|
|
}
|
|
}
|
|
|
|
void LogQSO::accept()
|
|
{
|
|
QString hisCall,hisGrid,mode,rptSent,rptRcvd,dateOn,dateOff,timeOn,timeOff,band,operator_call;
|
|
QString comments,name;
|
|
|
|
hisCall=ui->call->text();
|
|
hisGrid=ui->grid->text();
|
|
mode=ui->mode->text();
|
|
rptSent=ui->sent->text();
|
|
rptRcvd=ui->rcvd->text();
|
|
m_dateTimeOn = ui->start_date_time->dateTime ();
|
|
m_dateTimeOff = ui->end_date_time->dateTime ();
|
|
band=ui->band->text();
|
|
name=ui->name->text();
|
|
m_txPower=ui->txPower->text();
|
|
comments=ui->comments->text();
|
|
m_comments=comments;
|
|
QString strDialFreq(QString::number(m_dialFreq / 1.e6,'f',6));
|
|
operator_call = ui->loggedOperator->text();
|
|
|
|
// validate
|
|
using SpOp = Configuration::SpecialOperatingActivity;
|
|
auto special_op = m_config->special_op_id ();
|
|
if (SpOp::NONE < special_op && special_op < SpOp::FOX)
|
|
{
|
|
if (ui->exchSent->text ().isEmpty () || ui->exchRcvd->text ().isEmpty ())
|
|
{
|
|
show ();
|
|
MessageBox::warning_message (this, tr ("Invalid QSO Data"),
|
|
tr ("Check exchange sent and received"));
|
|
return; // without accepting
|
|
}
|
|
|
|
if (!m_cabrilloLog->add_QSO (m_dialFreq, QDateTime::currentDateTimeUtc (), hisCall,
|
|
ui->exchSent->text (), ui->exchRcvd->text ()))
|
|
{
|
|
show ();
|
|
MessageBox::warning_message (this, tr ("Invalid QSO Data"),
|
|
tr ("Check all fields"));
|
|
return; // without accepting
|
|
}
|
|
}
|
|
|
|
//Log this QSO to file "wsjtx.log"
|
|
static QFile f {QDir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}.absoluteFilePath ("wsjtx.log")};
|
|
if(!f.open(QIODevice::Text | QIODevice::Append)) {
|
|
MessageBox::warning_message (this, tr ("Log file error"),
|
|
tr ("Cannot open \"%1\" for append").arg (f.fileName ()),
|
|
tr ("Error: %1").arg (f.errorString ()));
|
|
} else {
|
|
QString logEntry=m_dateTimeOn.date().toString("yyyy-MM-dd,") +
|
|
m_dateTimeOn.time().toString("hh:mm:ss,") +
|
|
m_dateTimeOff.date().toString("yyyy-MM-dd,") +
|
|
m_dateTimeOff.time().toString("hh:mm:ss,") + hisCall + "," +
|
|
hisGrid + "," + strDialFreq + "," + mode +
|
|
"," + rptSent + "," + rptRcvd + "," + m_txPower +
|
|
"," + comments + "," + name;
|
|
QTextStream out(&f);
|
|
out << logEntry << endl;
|
|
f.close();
|
|
}
|
|
|
|
//Clean up and finish logging
|
|
Q_EMIT acceptQSO (m_dateTimeOff
|
|
, hisCall
|
|
, hisGrid
|
|
, m_dialFreq
|
|
, mode
|
|
, rptSent
|
|
, rptRcvd
|
|
, m_txPower
|
|
, comments
|
|
, name
|
|
, m_dateTimeOn
|
|
, operator_call
|
|
, m_myCall
|
|
, m_myGrid
|
|
, LogBook::QSOToADIF (hisCall
|
|
, hisGrid
|
|
, mode
|
|
, rptSent
|
|
, rptRcvd
|
|
, m_dateTimeOn
|
|
, m_dateTimeOff
|
|
, band
|
|
, comments
|
|
, name
|
|
, strDialFreq
|
|
, m_myCall
|
|
, m_myGrid
|
|
, m_txPower
|
|
, operator_call
|
|
, ui->exchSent->text ()
|
|
, ui->exchRcvd->text ()));
|
|
QDialog::accept();
|
|
}
|
|
|
|
// closeEvent is only called from the system menu close widget for a
|
|
// modeless dialog so we use the hideEvent override to store the
|
|
// window settings
|
|
void LogQSO::hideEvent (QHideEvent * e)
|
|
{
|
|
storeSettings ();
|
|
QDialog::hideEvent (e);
|
|
}
|