1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
// *************************************************************************************************
//
// QPropertyEditor v 0.1
//
// --------------------------------------
// Copyright (C) 2007 Volker Wiendl
//
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or any later version.
//
// This library 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
// *************************************************************************************************
#include "QVariantDelegate.h"
#include "Property.h"
#include <Qt/qabstractitemview.h>
QVariantDelegate::QVariantDelegate(QObject* parent) : QItemDelegate(parent) {}
QVariantDelegate::~QVariantDelegate() {}
QWidget *QVariantDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& option , const QModelIndex & index ) const {
QWidget* editor = 0;
Property* p = static_cast<Property*>(index.internalPointer());
switch (p->value().type()) {
case QVariant::Color:
case QVariant::Int:
case QMetaType::Float:
case QVariant::Double:
case QVariant::UserType:
editor = p->createEditor(parent, option);
if (editor) break; // if no editor could be created take default case
default:
editor = QItemDelegate::createEditor(parent, option, index);
}
parseEditorHints(editor, p->editorHints());
return editor;
}
void QVariantDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {
QVariant data = index.model()->data(index, Qt::EditRole);
switch (data.type()) {
case QVariant::Color:
case QMetaType::Double:
case QMetaType::Float:
case QVariant::UserType:
if (static_cast<Property*>(index.internalPointer())->setEditorData(editor, data)) // if editor couldn't be recognized use default
break;
default:
QItemDelegate::setEditorData(editor, index);
break;
}
}
void QVariantDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {
QVariant data = index.model()->data(index, Qt::EditRole);
switch (data.type()) {
case QVariant::Color:
case QMetaType::Double:
case QMetaType::Float:
case QVariant::UserType: {
QVariant data = static_cast<Property*>(index.internalPointer())->editorData(editor);
if (data.isValid()) {
model->setData(index, data , Qt::EditRole);
break;
}
}
default:
QItemDelegate::setModelData(editor, model, index);
break;
}
}
void QVariantDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex& index ) const {
return QItemDelegate::updateEditorGeometry(editor, option, index);
}
void QVariantDelegate::parseEditorHints(QWidget* editor, const QString& editorHints) const {
if (editor && !editorHints.isEmpty()) {
// Parse for property values
QRegExp rx("(.*)(=\\s*)(.*)(;{1})");
rx.setMinimal(true);
int pos = 0;
while ((pos = rx.indexIn(editorHints, pos)) != -1) {
qDebug("Setting %s to %s", qPrintable(rx.cap(1)), qPrintable(rx.cap(3)));
editor->setProperty(qPrintable(rx.cap(1).trimmed()), rx.cap(3).trimmed());
pos += rx.matchedLength();
}
}
}
|