WSJT-X/widgets/FoxLogWindow.cpp
Bill Somerville b79cf0df99 Improvements to accessibiity
Where  tool  tips are  defined  in  rich  text, equivalent  pain  test
accessible descriptions have been added  so that screen readers do not
announce HTML tags.

Refactored date time  delegates to use a simpler default  editor via a
default  item editor  factory for  QDateTime values,  the editor  is a
standard QDateTimeEdit with a format that includes seconds and renders
assuming the time is UTC.

Modified the Cabrillo log and Fox log database table models to provide
QDateTime items  for the edit role  of date time fields,  and formated
date time strings including seconds and assumed as UTC for the display
role.
2019-05-03 10:21:50 +01:00

123 lines
4.0 KiB
C++

#include "FoxLogWindow.hpp"
#include <QApplication>
#include <QAction>
#include <QFile>
#include <QDir>
#include <QSqlTableModel>
#include <QFileDialog>
#include "SettingsGroup.hpp"
#include "Configuration.hpp"
#include "MessageBox.hpp"
#include "models/Bands.hpp"
#include "models/FoxLog.hpp"
#include "item_delegates/ForeignKeyDelegate.hpp"
#include "item_delegates/CallsignDelegate.hpp"
#include "item_delegates/MaidenheadLocatorDelegate.hpp"
#include "pimpl_impl.hpp"
#include "ui_FoxLogWindow.h"
#include "moc_FoxLogWindow.cpp"
class FoxLogWindow::impl final
{
public:
explicit impl (FoxLog * log)
: log_ {log}
{
}
FoxLog * log_;
Ui::FoxLogWindow ui_;
};
FoxLogWindow::FoxLogWindow (QSettings * settings, Configuration const * configuration
, FoxLog * fox_log, QWidget * parent)
: AbstractLogWindow {"Fox Log Window", settings, configuration, parent}
, m_ {fox_log}
{
setWindowTitle (QApplication::applicationName () + " - Fox Log");
m_->ui_.setupUi (this);
m_->ui_.log_table_view->setModel (m_->log_->model ());
set_log_view (m_->ui_.log_table_view);
m_->ui_.log_table_view->setItemDelegateForColumn (2, new CallsignDelegate {this});
m_->ui_.log_table_view->setItemDelegateForColumn (3, new MaidenheadLocatorDelegate {this});
m_->ui_.log_table_view->setItemDelegateForColumn (6, new ForeignKeyDelegate {configuration->bands (), 0, this});
m_->ui_.log_table_view->horizontalHeader ()->moveSection (6, 1); // move band to first column
m_->ui_.rate_label->setNum (0);
m_->ui_.queued_label->setNum (0);
m_->ui_.callers_label->setNum (0);
// actions
auto export_action = new QAction {tr ("&Export ADIF ..."), m_->ui_.log_table_view};
m_->ui_.log_table_view->insertAction (nullptr, export_action);
connect (export_action, &QAction::triggered, [this, configuration] (bool /*checked*/) {
auto file_name = QFileDialog::getSaveFileName (this
, tr ("Export ADIF Log File")
, configuration->writeable_data_dir ().absolutePath ()
, tr ("ADIF Log (*.adi)"));
if (file_name.size () && m_->log_)
{
QFile ADIF_file {file_name};
if (ADIF_file.open (QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream output_stream {&ADIF_file};
m_->log_->export_qsos (output_stream);
}
else
{
MessageBox::warning_message (this
, tr ("Export ADIF File Error")
, tr ("Cannot open \"%1\" for writing: %2")
.arg (ADIF_file.fileName ()).arg (ADIF_file.errorString ()));
}
}
});
auto reset_action = new QAction {tr ("&Reset ..."), m_->ui_.log_table_view};
m_->ui_.log_table_view->insertAction (nullptr, reset_action);
connect (reset_action, &QAction::triggered, [this, configuration] (bool /*checked*/) {
if (MessageBox::Yes == MessageBox::query_message( this
, tr ("Confirm Reset")
, tr ("Are you sure you want to erase file FoxQSO.txt "
"and start a new Fox log?")))
{
QFile f{configuration->writeable_data_dir ().absoluteFilePath ("FoxQSO.txt")};
f.remove ();
Q_EMIT reset_log_model ();
}
});
}
FoxLogWindow::~FoxLogWindow ()
{
}
void FoxLogWindow::callers (int n)
{
m_->ui_.callers_label->setNum (n);
}
void FoxLogWindow::queued (int n)
{
m_->ui_.queued_label->setNum (n);
}
void FoxLogWindow::rate (int n)
{
m_->ui_.rate_label->setNum (n);
}
void FoxLogWindow::log_model_changed (int row)
{
if (row >= 0)
{
m_->log_->model ()->selectRow (row);
}
else
{
m_->log_->model ()->select ();
}
}