From 13c023f35d18e43e212c5099910bf7ba00dd73cf Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 12 Nov 2018 04:06:26 +0000 Subject: [PATCH] Refinements to the FoxLogWindow widget --- models/FontOverrideModel.hpp | 29 ++++++++++++ models/models.pri | 3 +- widgets/FoxLogWindow.cpp | 86 +++++++----------------------------- widgets/FoxLogWindow.hpp | 25 +---------- widgets/FoxLogWindow.ui | 8 ---- 5 files changed, 49 insertions(+), 102 deletions(-) create mode 100644 models/FontOverrideModel.hpp diff --git a/models/FontOverrideModel.hpp b/models/FontOverrideModel.hpp new file mode 100644 index 000000000..2bff9aa8e --- /dev/null +++ b/models/FontOverrideModel.hpp @@ -0,0 +1,29 @@ +#ifndef FONT_OVERRIDE_MODEL_HPP_ +#define FONT_OVERRIDE_MODEL_HPP_ + +#include +#include + +// fix up font display as header font changes don't currently work +// from views (I think fixed in Qt 5.11.1) +class FontOverrideModel final + : public QIdentityProxyModel +{ +public: + FontOverrideModel (QObject * parent = nullptr) : QIdentityProxyModel {parent} {} + void set_font (QFont const& font) {font_ = font;} + QVariant data (QModelIndex const& index, int role) const override + { + if (Qt::FontRole == role) return font_; + return QIdentityProxyModel::data (index, role); + } + QVariant headerData (int section, Qt::Orientation orientation, int role) const override + { + if (Qt::FontRole == role) return font_; + return QIdentityProxyModel::headerData (section, orientation, role); + } +private: + QFont font_; +}; + +#endif diff --git a/models/models.pri b/models/models.pri index ae3ea4824..e0c69e81e 100644 --- a/models/models.pri +++ b/models/models.pri @@ -14,4 +14,5 @@ HEADERS += \ models/Modes.hpp \ models/IARURegions.hpp \ models/FoxLog.hpp \ - models/CabrilloLog.hpp + models/CabrilloLog.hpp \ + models/FontOverrideModel.hpp diff --git a/widgets/FoxLogWindow.cpp b/widgets/FoxLogWindow.cpp index 6dd557332..c68158d13 100644 --- a/widgets/FoxLogWindow.cpp +++ b/widgets/FoxLogWindow.cpp @@ -12,64 +12,14 @@ #include "Configuration.hpp" #include "models/Bands.hpp" #include "item_delegates/ForeignKeyDelegate.hpp" +#include "item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp" +#include "item_delegates/CallsignDelegate.hpp" +#include "item_delegates/MaidenheadLocatorDelegate.hpp" #include "widgets/MessageBox.hpp" #include "qt_helpers.hpp" #include "ui_FoxLogWindow.h" -namespace -{ - class DateTimeAsSecsSinceEpochItemDelegate final - : public QStyledItemDelegate - { - public: - DateTimeAsSecsSinceEpochItemDelegate (QObject * parent = nullptr) - : QStyledItemDelegate {parent} - { - } - - static QVariant to_secs_since_epoch (QDateTime const& date_time) - { - return date_time.toMSecsSinceEpoch () / 1000; - } - - static QDateTime to_date_time (QModelIndex const& index, int role = Qt::DisplayRole) - { - return to_date_time (index.model ()->data (index, role)); - } - - static QDateTime to_date_time (QVariant const& value) - { - return QDateTime::fromMSecsSinceEpoch (value.toULongLong () * 1000); - } - - QString displayText (QVariant const& value, QLocale const& locale) const override - { - return locale.toString (to_date_time (value), QLocale::ShortFormat); - } - - QWidget * createEditor (QWidget * parent, QStyleOptionViewItem const& /*option*/, QModelIndex const& /*index*/) const override - { - return new QDateTimeEdit {parent}; - } - - void setEditorData (QWidget * editor, QModelIndex const& index) const override - { - static_cast (editor)->setDateTime (to_date_time (index, Qt::EditRole)); - } - - void setModelData (QWidget * editor, QAbstractItemModel * model, QModelIndex const& index) const override - { - model->setData (index, to_secs_since_epoch (static_cast (editor)->dateTime ())); - } - - void updateEditorGeometry (QWidget * editor, QStyleOptionViewItem const& option, QModelIndex const& /*index*/) const override - { - editor->setGeometry (option.rect); - } - }; -} - FoxLogWindow::FoxLogWindow (QSettings * settings, Configuration const * configuration , QAbstractItemModel * fox_log_model, QWidget * parent) : QWidget {parent} @@ -84,32 +34,30 @@ FoxLogWindow::FoxLogWindow (QSettings * settings, Configuration const * configur change_font (configuration_->decoded_text_font ()); ui_->log_table_view->setModel (&fox_log_model_); ui_->log_table_view->setColumnHidden (0, true); - ui_->log_table_view->setItemDelegateForColumn (1, new DateTimeAsSecsSinceEpochItemDelegate {this}); - ui_->log_table_view->setItemDelegateForColumn (6, new ForeignKeyDelegate {configuration_->bands (), &fox_log_model_, 0, 6, this}); + ui_->log_table_view->setItemDelegateForColumn (1, new ForeignKeyDelegate {configuration_->bands (), &fox_log_model_, 0, 6, this}); + ui_->log_table_view->setItemDelegateForColumn (2, new DateTimeAsSecsSinceEpochDelegate {this}); + ui_->log_table_view->setItemDelegateForColumn (3, new CallsignDelegate {this}); + ui_->log_table_view->setItemDelegateForColumn (4, new MaidenheadLocatorDelegate {this}); ui_->log_table_view->setSelectionMode (QTableView::SingleSelection); - ui_->log_table_view->resizeColumnsToContents (); + auto horizontal_header = ui_->log_table_view->horizontalHeader (); + horizontal_header->setStretchLastSection (true); + horizontal_header->setSectionResizeMode (QHeaderView::ResizeToContents); + horizontal_header->setSectionsMovable (true); + horizontal_header->moveSection (6, 1); // move band to first column ui_->rate_label->setNum (0); ui_->queued_label->setNum (0); ui_->callers_label->setNum (0); - connect (&fox_log_model_, &QAbstractItemModel::rowsInserted, [this] (QModelIndex const& parent, int first, int /*last*/) { - ui_->log_table_view->scrollTo (fox_log_model_.index (first, 0, parent)); - ui_->log_table_view->resizeColumnsToContents (); - // ui_->log_table_view->scrollToBottom (); + ui_->log_table_view->scrollToBottom (); + + // ensure view scrolls to latest new row + connect (&fox_log_model_, &QAbstractItemModel::rowsInserted, [this] (QModelIndex const& /*parent*/, int /*first*/, int /*last*/) { + ui_->log_table_view->scrollToBottom (); }); } FoxLogWindow::~FoxLogWindow () -{ - if (isVisible ()) - { - write_settings (); - } -} - -void FoxLogWindow::closeEvent (QCloseEvent * e) { write_settings (); - QWidget::closeEvent (e); } void FoxLogWindow::read_settings () diff --git a/widgets/FoxLogWindow.hpp b/widgets/FoxLogWindow.hpp index 3b8fe6827..62895a763 100644 --- a/widgets/FoxLogWindow.hpp +++ b/widgets/FoxLogWindow.hpp @@ -4,6 +4,7 @@ #include #include #include +#include "models/FontOverrideModel.hpp" class QSettings; class Configuration; @@ -15,28 +16,6 @@ namespace Ui class FoxLogWindow; } -// fix up font display as header font changes don't currently work -// from views (I think fixed in Qt 5.11.1) -class FontOverrideModel final - : public QIdentityProxyModel -{ -public: - FontOverrideModel (QObject * parent = nullptr) : QIdentityProxyModel {parent} {} - void set_font (QFont const& font) {font_ = font;} - QVariant data (QModelIndex const& index, int role) const override - { - if (Qt::FontRole == role) return font_; - return QIdentityProxyModel::data (index, role); - } - QVariant headerData (int section, Qt::Orientation orientation, int role) const override - { - if (Qt::FontRole == role) return font_; - return QIdentityProxyModel::headerData (section, orientation, role); - } -private: - QFont font_; -}; - class FoxLogWindow final : public QWidget { @@ -51,8 +30,6 @@ public: void rate (int); private: - void closeEvent (QCloseEvent *) override; - void read_settings (); void write_settings () const; diff --git a/widgets/FoxLogWindow.ui b/widgets/FoxLogWindow.ui index 54edbbc52..2a3e84aba 100644 --- a/widgets/FoxLogWindow.ui +++ b/widgets/FoxLogWindow.ui @@ -2,14 +2,6 @@ FoxLogWindow - - - 0 - 0 - 400 - 300 - - Fox Log