[PATCH] Add a SpinBoxDelegate's for DivePlannerPointsModel

Tomaz Canabrava tcanabrava at kde.org
Fri Jul 11 14:56:37 PDT 2014


hold on :)
Glance, take a look on my answer to the trac and try to do that - saner code. :)

On Fri, Jul 11, 2014 at 6:51 PM, Anton Lundin <glance at acc.umu.se> wrote:
> This adds some delegates to fixup the editor SpinBox'es in the
> DivePlannerPointsModel, to prevent user from entering negative values.
>
> Fixes #609
>
> Signed-off-by: Anton Lundin <glance at acc.umu.se>
> ---
>  qt-ui/diveplanner.cpp    |  6 +++++
>  qt-ui/modeldelegates.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++++
>  qt-ui/modeldelegates.h   | 22 +++++++++++++++++
>  3 files changed, 92 insertions(+)
>
> diff --git a/qt-ui/diveplanner.cpp b/qt-ui/diveplanner.cpp
> index 5e07dcb..db02865 100644
> --- a/qt-ui/diveplanner.cpp
> +++ b/qt-ui/diveplanner.cpp
> @@ -253,6 +253,12 @@ DivePlannerWidget::DivePlannerWidget(QWidget *parent, Qt::WindowFlags f) : QWidg
>         ui.tableWidget->setModel(DivePlannerPointsModel::instance());
>         DivePlannerPointsModel::instance()->setRecalc(true);
>         ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::GAS, new AirTypesDelegate(this));
> +       // This makes shure the spinbox gets a setMinimum(0) on it so we can't have negative time or depth.
> +       ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::DEPTH, new SpinBoxDelegate(this));
> +       ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::RUNTIME, new SpinBoxDelegate(this));
> +       ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::DURATION, new SpinBoxDelegate(this));
> +       // This one is a Double, so its a bit special.
> +       ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::CCSETPOINT, new DoubleSpinBoxDelegate(this));
>         ui.cylinderTableWidget->setTitle(tr("Available gases"));
>         ui.cylinderTableWidget->setModel(CylindersModel::instance());
>         QTableView *view = ui.cylinderTableWidget->view();
> diff --git a/qt-ui/modeldelegates.cpp b/qt-ui/modeldelegates.cpp
> index dc6af56..c2335d5 100644
> --- a/qt-ui/modeldelegates.cpp
> +++ b/qt-ui/modeldelegates.cpp
> @@ -364,3 +364,67 @@ void ProfilePrintDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
>         }
>         QStyledItemDelegate::paint(painter, option, index);
>  }
> +
> +SpinBoxDelegate::SpinBoxDelegate(QObject *parent) : QStyledItemDelegate(parent) {}
> +
> +QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
> +               const QStyleOptionViewItem &/* option */,
> +               const QModelIndex &/* index */) const
> +{
> +       QSpinBox *editor = new QSpinBox(parent);
> +       editor->setMinimum(0);
> +
> +       return editor;
> +}
> +
> +void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
> +{
> +       QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
> +       spinBox->setValue(index.model()->data(index, Qt::EditRole).toInt());
> +}
> +
> +void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
> +{
> +       QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
> +       spinBox->interpretText();
> +
> +       model->setData(index, spinBox->value(), Qt::EditRole);
> +}
> +
> +void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
> +{
> +       editor->setGeometry(option.rect);
> +}
> +
> +DoubleSpinBoxDelegate::DoubleSpinBoxDelegate(QObject *parent) : QStyledItemDelegate(parent) {}
> +
> +QWidget *DoubleSpinBoxDelegate::createEditor(QWidget *parent,
> +               const QStyleOptionViewItem &/* option */,
> +               const QModelIndex &/* index */) const
> +{
> +       QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
> +       editor->setMinimum(0);
> +       editor->setSingleStep(0.1);
> +
> +       return editor;
> +}
> +
> +void DoubleSpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
> +{
> +       QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
> +
> +       spinBox->setValue(index.model()->data(index, Qt::EditRole).toDouble());
> +}
> +
> +void DoubleSpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
> +{
> +       QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
> +       spinBox->interpretText();
> +
> +       model->setData(index, spinBox->value(), Qt::EditRole);
> +}
> +
> +void DoubleSpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
> +{
> +       editor->setGeometry(option.rect);
> +}
> diff --git a/qt-ui/modeldelegates.h b/qt-ui/modeldelegates.h
> index e2b705e..b286347 100644
> --- a/qt-ui/modeldelegates.h
> +++ b/qt-ui/modeldelegates.h
> @@ -88,4 +88,26 @@ public:
>         void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
>  };
>
> +class SpinBoxDelegate : public QStyledItemDelegate {
> +       Q_OBJECT
> +public:
> +       explicit SpinBoxDelegate(QObject *parent = 0);
> +
> +       QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
> +       void setEditorData(QWidget *editor, const QModelIndex &index) const;
> +       void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
> +       void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
> +};
> +
> +class DoubleSpinBoxDelegate : public QStyledItemDelegate {
> +       Q_OBJECT
> +public:
> +       explicit DoubleSpinBoxDelegate(QObject *parent = 0);
> +
> +       QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
> +       void setEditorData(QWidget *editor, const QModelIndex &index) const;
> +       void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
> +       void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
> +};
> +
>  #endif // MODELDELEGATES_H
> --
> 1.9.1
>
> _______________________________________________
> subsurface mailing list
> subsurface at hohndel.org
> http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface


More information about the subsurface mailing list