From 97431d815435c8dca88ec313a50c49ad67795734 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 12 Nov 2018 02:00:35 +0000 Subject: [PATCH] Add some item delagate classes useful for database fields --- CMakeLists.txt | 2 + item_delegates/CallsignDelegate.cpp | 30 ++++++++++ item_delegates/CallsignDelegate.hpp | 30 ++++++++++ .../DateTimeAsSecsSinceEpochDelegate.hpp | 60 +++++++++++++++++++ item_delegates/MaidenheadLocatorDelegate.cpp | 30 ++++++++++ item_delegates/MaidenheadLocatorDelegate.hpp | 30 ++++++++++ item_delegates/item_delegates.pri | 9 ++- 7 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 item_delegates/CallsignDelegate.cpp create mode 100644 item_delegates/CallsignDelegate.hpp create mode 100644 item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp create mode 100644 item_delegates/MaidenheadLocatorDelegate.cpp create mode 100644 item_delegates/MaidenheadLocatorDelegate.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 371ae5760..24de4aebc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -266,6 +266,8 @@ set (wsjt_qt_CXXSRCS widgets/DecodeHighlightingListView.cpp models/FoxLog.cpp widgets/FoxLogWindow.cpp + item_delegates/CallsignDelegate.cpp + item_delegates/MaidenheadLocatorDelegate.cpp ) set (wsjt_qtmm_CXXSRCS diff --git a/item_delegates/CallsignDelegate.cpp b/item_delegates/CallsignDelegate.cpp new file mode 100644 index 000000000..017389458 --- /dev/null +++ b/item_delegates/CallsignDelegate.cpp @@ -0,0 +1,30 @@ +#include "CallsignDelegate.hpp" + +#include + +#include "validators/CallsignValidator.hpp" + +CallsignDelegate::CallsignDelegate (QObject * parent) + : QStyledItemDelegate {parent} + , validator_ {new CallsignValidator} +{ +} + +QWidget * CallsignDelegate::createEditor (QWidget * parent, QStyleOptionViewItem const& + , QModelIndex const&) const +{ + auto * editor = new QLineEdit {parent}; + editor->setFrame (false); + editor->setValidator (validator_.data ()); + return editor; +} + +void CallsignDelegate::setEditorData (QWidget * editor, QModelIndex const& index) const +{ + static_cast (editor)->setText (index.model ()->data (index, Qt::EditRole).toString ()); +} + +void CallsignDelegate::setModelData (QWidget * editor, QAbstractItemModel * model, QModelIndex const& index) const +{ + model->setData (index, static_cast (editor)->text (), Qt::EditRole); +} diff --git a/item_delegates/CallsignDelegate.hpp b/item_delegates/CallsignDelegate.hpp new file mode 100644 index 000000000..b5bdce1c2 --- /dev/null +++ b/item_delegates/CallsignDelegate.hpp @@ -0,0 +1,30 @@ +#ifndef CALLSIGN_DELEGATE_HPP_ +#define CALLSIGN_DELEGATE_HPP_ + +#include + +class QValidator; + +// +// Class CallsignDelegate +// +// Item delegate for editing a callsign +// +class CallsignDelegate final + : public QStyledItemDelegate +{ +public: + explicit CallsignDelegate (QObject * parent = nullptr); + QWidget * createEditor (QWidget * parent, QStyleOptionViewItem const&, QModelIndex const&) const override; + void setEditorData (QWidget * editor, QModelIndex const&) const override; + void setModelData (QWidget * editor, QAbstractItemModel *, QModelIndex const&) const override; + void updateEditorGeometry (QWidget * editor, QStyleOptionViewItem const& option, QModelIndex const&) const override + { + editor->setGeometry (option.rect); + } + +private: + QScopedPointer validator_; +}; + +#endif diff --git a/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp b/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp new file mode 100644 index 000000000..d01e04d18 --- /dev/null +++ b/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp @@ -0,0 +1,60 @@ +#ifndef DATE_TIME_AS_SECS_SINCE_EPOCH_ITEM_DELEGATE_HPP_ +#define DATE_TIME_AS_SECS_SINCE_EPOCH_ITEM_DELEGATE_HPP_ + +#include +#include +#include +#include +#include + +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 () / 1000ull; + } + + 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 () * 1000ull); + } + + 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); + } +}; + +#endif diff --git a/item_delegates/MaidenheadLocatorDelegate.cpp b/item_delegates/MaidenheadLocatorDelegate.cpp new file mode 100644 index 000000000..7768f2a84 --- /dev/null +++ b/item_delegates/MaidenheadLocatorDelegate.cpp @@ -0,0 +1,30 @@ +#include "MaidenheadLocatorDelegate.hpp" + +#include + +#include "validators/MaidenheadLocatorValidator.hpp" + +MaidenheadLocatorDelegate::MaidenheadLocatorDelegate (QObject * parent) + : QStyledItemDelegate {parent} + , validator_ {new MaidenheadLocatorValidator} +{ +} + +QWidget * MaidenheadLocatorDelegate::createEditor (QWidget * parent, QStyleOptionViewItem const& + , QModelIndex const&) const +{ + auto * editor = new QLineEdit {parent}; + editor->setFrame (false); + editor->setValidator (validator_.data ()); + return editor; +} + +void MaidenheadLocatorDelegate::setEditorData (QWidget * editor, QModelIndex const& index) const +{ + static_cast (editor)->setText (index.model ()->data (index, Qt::EditRole).toString ()); +} + +void MaidenheadLocatorDelegate::setModelData (QWidget * editor, QAbstractItemModel * model, QModelIndex const& index) const +{ + model->setData (index, static_cast (editor)->text (), Qt::EditRole); +} diff --git a/item_delegates/MaidenheadLocatorDelegate.hpp b/item_delegates/MaidenheadLocatorDelegate.hpp new file mode 100644 index 000000000..39627523d --- /dev/null +++ b/item_delegates/MaidenheadLocatorDelegate.hpp @@ -0,0 +1,30 @@ +#ifndef MAIDENHEAD_LOCATOR_DELEGATE_HPP_ +#define MAIDENHEAD_LOCATOR_DELEGATE_HPP_ + +#include + +class QValidator; + +// +// Class MaidenheadLocatorDelegate +// +// Item delegate for editing a Maidenhead locator +// +class MaidenheadLocatorDelegate final + : public QStyledItemDelegate +{ +public: + explicit MaidenheadLocatorDelegate (QObject * parent = nullptr); + QWidget * createEditor (QWidget * parent, QStyleOptionViewItem const&, QModelIndex const&) const override; + void setEditorData (QWidget * editor, QModelIndex const&) const override; + void setModelData (QWidget * editor, QAbstractItemModel *, QModelIndex const&) const override; + void updateEditorGeometry (QWidget * editor, QStyleOptionViewItem const& option, QModelIndex const&) const override + { + editor->setGeometry (option.rect); + } + +private: + QScopedPointer validator_; +}; + +#endif diff --git a/item_delegates/item_delegates.pri b/item_delegates/item_delegates.pri index d1d2c3ccc..153ad4271 100644 --- a/item_delegates/item_delegates.pri +++ b/item_delegates/item_delegates.pri @@ -1,7 +1,12 @@ SOURCES += \ item_delegates/ForeignKeyDelegate.cpp \ - item_delegates/FrequencyItemDelegate.cpp + item_delegates/FrequencyItemDelegate.cpp \ + item_delegates/CallsignDelegate.cpp \ + item_delegates/MaidenheadLocatorItemDelegate.cpp HEADERS += \ item_delegates/ForeignKeyDelegate.hpp \ - item_delegates/FrequencyItemDelegate.hpp + item_delegates/FrequencyItemDelegate.hpp \ + item_delegates/CallsignDelegate.hpp \ + item_delegates/MaidenheadLocatorDelegate.hpp \ + item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp