From d4db51c04cf8c00fdd0c9a4def40fbdd37a645d8 Mon Sep 17 00:00:00 2001 From: dismine Date: Thu, 30 Jan 2014 15:16:00 +0200 Subject: [PATCH] Fixed issue #50. --HG-- branch : develop --- src/dialogs/dialogincrements.cpp | 6 ++ src/widgets/doubledelegate.h | 4 +- src/widgets/textdelegate.cpp | 108 +++++++++++++++++++++++++++++++ src/widgets/textdelegate.h | 101 +++++++++++++++++++++++++++++ src/widgets/widgets.pri | 6 +- 5 files changed, 221 insertions(+), 4 deletions(-) create mode 100644 src/widgets/textdelegate.cpp create mode 100644 src/widgets/textdelegate.h diff --git a/src/dialogs/dialogincrements.cpp b/src/dialogs/dialogincrements.cpp index 9f668329d..85416e2bb 100644 --- a/src/dialogs/dialogincrements.cpp +++ b/src/dialogs/dialogincrements.cpp @@ -29,6 +29,7 @@ #include "dialogincrements.h" #include "ui_dialogincrements.h" #include "../widgets/doubledelegate.h" +#include "../widgets/textdelegate.h" #include "../exception/vexception.h" #include @@ -37,10 +38,15 @@ DialogIncrements::DialogIncrements(VContainer *data, VDomDocument *doc, QWidget :DialogTool(data, parent), ui(new Ui::DialogIncrements), data(data), doc(doc), row(0), column(0) { ui->setupUi(this); + TextDelegate *textDelegate = new TextDelegate(ui->tableWidgetIncrement); + Q_CHECK_PTR(textDelegate); + ui->tableWidgetIncrement->setItemDelegateForColumn(0, textDelegate); DoubleSpinBoxDelegate *doubleDelegate = new DoubleSpinBoxDelegate(ui->tableWidgetIncrement); + Q_CHECK_PTR(doubleDelegate); ui->tableWidgetIncrement->setItemDelegateForColumn(2, doubleDelegate); ui->tableWidgetIncrement->setItemDelegateForColumn(3, doubleDelegate); ui->tableWidgetIncrement->setItemDelegateForColumn(4, doubleDelegate); + FillStandardTable(); FillIncrementTable(); FillLengthLines(); diff --git a/src/widgets/doubledelegate.h b/src/widgets/doubledelegate.h index 6d241a00c..fde48b36b 100644 --- a/src/widgets/doubledelegate.h +++ b/src/widgets/doubledelegate.h @@ -32,8 +32,8 @@ #include /** - * @brief The DoubleSpinBoxDelegate class a delegate that allows the user to change integer values from the model - * using a spin box widget. + * @brief The DoubleSpinBoxDelegate class a delegate that allows the user to change double values from the model + * using a double spin box widget. */ class DoubleSpinBoxDelegate : public QItemDelegate { diff --git a/src/widgets/textdelegate.cpp b/src/widgets/textdelegate.cpp new file mode 100644 index 000000000..54050cb06 --- /dev/null +++ b/src/widgets/textdelegate.cpp @@ -0,0 +1,108 @@ +/************************************************************************ + ** + ** @file textdelegate.cpp + ** @author Roman Telezhinsky + ** @date 29 1, 2014 + ** + ** @brief + ** @copyright + ** This source code is part of the Valentine project, a pattern making + ** program, whose allow create and modeling patterns of clothing. + ** Copyright (C) 2013 Valentina project + ** All Rights Reserved. + ** + ** Valentina is free software: you can redistribute it and/or modify + ** it under the terms of the GNU General Public License as published by + ** the Free Software Foundation, either version 3 of the License, or + ** (at your option) any later version. + ** + ** Valentina is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ** GNU General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with Valentina. If not, see . + ** + *************************************************************************/ + +#include "textdelegate.h" + +#include + +TextDelegate::TextDelegate(QObject *parent): QItemDelegate(parent), lastText(QString("Name_")) +{ + //Little hack. Help save lineedit text in const method. + connect(this, &TextDelegate::SaveText, this, &TextDelegate::InitText); +} + +QWidget *TextDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(option); + Q_UNUSED(index); + QLineEdit *editor = new QLineEdit(parent); + Q_CHECK_PTR(editor); + QRegExp re("^(([^+ -/()\\^*%:;\"\'=.,><0-9]){1,1}[^+ -/()\\^*%:;\"\'=><]([0-9]){0,}){0,}$"); + QRegExpValidator *v = new QRegExpValidator(re); + Q_CHECK_PTR(v); + editor->setValidator( v ); + connect(editor, &QLineEdit::editingFinished, this, &TextDelegate::commitAndCloseEditor); + return editor; +} + +void TextDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + QString text = index.model()->data(index, Qt::EditRole).toString(); + + QLineEdit *lineEdit = qobject_cast(editor); + Q_CHECK_PTR(lineEdit); + if ( lastText != text && text.isEmpty() == false) + { + //Here need save text, but method is const, so, we use signal instead. + emit SaveText(text); + } + lineEdit->setText(text); +} + +void TextDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const +{ + QLineEdit *lineEdit = qobject_cast(editor); + Q_CHECK_PTR(lineEdit); + QString text = lineEdit->text(); + if(text.isEmpty()) + { + text = lastText; + } + + model->setData(index, text, Qt::EditRole); +} + +void TextDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + Q_UNUSED(index) + editor->setGeometry(option.rect); +} + +void TextDelegate::commitAndCloseEditor() +{ + QLineEdit *lineEdit = qobject_cast(sender()); + Q_CHECK_PTR(lineEdit); + QString text = lineEdit->text(); + if ( lastText != text && text.isEmpty() == false) + { + lastText = text; + emit commitData(lineEdit); + } + else if(text.isEmpty() == false) + { + lineEdit->setText(lastText); + emit commitData(lineEdit); + } + emit closeEditor(lineEdit); +} + +void TextDelegate::InitText(const QString &text) +{ + lastText = text; +} diff --git a/src/widgets/textdelegate.h b/src/widgets/textdelegate.h new file mode 100644 index 000000000..5bdac8a6e --- /dev/null +++ b/src/widgets/textdelegate.h @@ -0,0 +1,101 @@ +/************************************************************************ + ** + ** @file textdelegate.h + ** @author Roman Telezhinsky + ** @date 29 1, 2014 + ** + ** @brief + ** @copyright + ** This source code is part of the Valentine project, a pattern making + ** program, whose allow create and modeling patterns of clothing. + ** Copyright (C) 2013 Valentina project + ** All Rights Reserved. + ** + ** Valentina is free software: you can redistribute it and/or modify + ** it under the terms of the GNU General Public License as published by + ** the Free Software Foundation, either version 3 of the License, or + ** (at your option) any later version. + ** + ** Valentina is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ** GNU General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with Valentina. If not, see . + ** + *************************************************************************/ + +#ifndef TEXTDELEGATE_H +#define TEXTDELEGATE_H + +#include + +/** + * @brief The TextDelegate class a delegate that allows the user to change text values from the model + * using a edit line widget. + */ +class TextDelegate : public QItemDelegate +{ + Q_OBJECT +public: + /** + * @brief TextDelegate constructor. + * @param parent parent widget. + */ + explicit TextDelegate(QObject *parent = 0); + /** + * @brief createEditorReturns the widget used to edit the item specified by index for editing. The parent widget and + * style option are used to control how the editor widget appears. + * @param parent parent widget. + * @param option item options. + * @param index index of data item. + * @return editor to be used for editing the data item. + */ + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; + /** + * @brief setEditorData sets the data to be displayed and edited by the editor from the data model item specified by + * the model index. + * @param editor editor. + * @param index index of data item. + */ + void setEditorData(QWidget *editor, const QModelIndex &index) const; + /** + * @brief setModelData gets data from the editor widget and stores it in the specified model at the item index. + * @param editor editor. + * @param model model. + * @param index index of data item. + */ + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; + /** + * @brief updateEditorGeometry updates the editor for the item specified by index according to the style option + * given. + * @param editor editor. + * @param option item options. + * @param index index of data item. + */ + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; +signals: + /** + * @brief SaveText help save text value of lineedit. + * @param text text. + */ + void SaveText(const QString &text) const; +public slots: + /** + * @brief commitAndCloseEditor commit value if changed. + */ + void commitAndCloseEditor(); + /** + * @brief InitText initialize text. + * @param text text. + */ + void InitText(const QString &text); +private: + /** + * @brief lastValue last saved value. + */ + QString lastText; +}; + +#endif // TEXTDELEGATE_H diff --git a/src/widgets/widgets.pri b/src/widgets/widgets.pri index 3de616910..afb5dceab 100644 --- a/src/widgets/widgets.pri +++ b/src/widgets/widgets.pri @@ -9,7 +9,8 @@ HEADERS += \ src/widgets/doubledelegate.h \ src/widgets/vsimplespline.h \ src/widgets/vsimplesplinepath.h \ - src/widgets/vsimplearc.h + src/widgets/vsimplearc.h \ + src/widgets/textdelegate.h SOURCES += \ src/widgets/vtablegraphicsview.cpp \ @@ -22,4 +23,5 @@ SOURCES += \ src/widgets/doubledelegate.cpp \ src/widgets/vsimplespline.cpp \ src/widgets/vsimplesplinepath.cpp \ - src/widgets/vsimplearc.cpp + src/widgets/vsimplearc.cpp \ + src/widgets/textdelegate.cpp