Rev 202 | Rev 219 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 202 | Rev 205 | ||
---|---|---|---|
1 | 1 | ||
2 | 2 | ||
3 | /****************************************************************************
|
3 | /****************************************************************************
|
4 | **
|
4 | **
|
5 | ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
5 | ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
6 | ** All rights reserved.
|
6 | ** All rights reserved.
|
7 | ** Contact: Nokia Corporation (qt-info@nokia.com)
|
7 | ** Contact: Nokia Corporation (qt-info@nokia.com)
|
8 | **
|
8 | **
|
9 | ** This file is part of the examples of the Qt Toolkit.
|
9 | ** This file is part of the examples of the Qt Toolkit.
|
10 | **
|
10 | **
|
11 | ** $QT_BEGIN_LICENSE:LGPL$
|
11 | ** $QT_BEGIN_LICENSE:LGPL$
|
12 | ** Commercial Usage
|
12 | ** Commercial Usage
|
13 | ** Licensees holding valid Qt Commercial licenses may use this file in
|
13 | ** Licensees holding valid Qt Commercial licenses may use this file in
|
14 | ** accordance with the Qt Commercial License Agreement provided with the
|
14 | ** accordance with the Qt Commercial License Agreement provided with the
|
15 | ** Software or, alternatively, in accordance with the terms contained in
|
15 | ** Software or, alternatively, in accordance with the terms contained in
|
16 | ** a written agreement between you and Nokia.
|
16 | ** a written agreement between you and Nokia.
|
17 | **
|
17 | **
|
18 | ** GNU Lesser General Public License Usage
|
18 | ** GNU Lesser General Public License Usage
|
19 | ** Alternatively, this file may be used under the terms of the GNU Lesser
|
19 | ** Alternatively, this file may be used under the terms of the GNU Lesser
|
20 | ** General Public License version 2.1 as published by the Free Software
|
20 | ** General Public License version 2.1 as published by the Free Software
|
21 | ** Foundation and appearing in the file LICENSE.LGPL included in the
|
21 | ** Foundation and appearing in the file LICENSE.LGPL included in the
|
22 | ** packaging of this file. Please review the following information to
|
22 | ** packaging of this file. Please review the following information to
|
23 | ** ensure the GNU Lesser General Public License version 2.1 requirements
|
23 | ** ensure the GNU Lesser General Public License version 2.1 requirements
|
24 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
24 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
25 | **
|
25 | **
|
26 | ** In addition, as a special exception, Nokia gives you certain additional
|
26 | ** In addition, as a special exception, Nokia gives you certain additional
|
27 | ** rights. These rights are described in the Nokia Qt LGPL Exception
|
27 | ** rights. These rights are described in the Nokia Qt LGPL Exception
|
28 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
28 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
29 | **
|
29 | **
|
30 | ** GNU General Public License Usage
|
30 | ** GNU General Public License Usage
|
31 | ** Alternatively, this file may be used under the terms of the GNU
|
31 | ** Alternatively, this file may be used under the terms of the GNU
|
32 | ** General Public License version 3.0 as published by the Free Software
|
32 | ** General Public License version 3.0 as published by the Free Software
|
33 | ** Foundation and appearing in the file LICENSE.GPL included in the
|
33 | ** Foundation and appearing in the file LICENSE.GPL included in the
|
34 | ** packaging of this file. Please review the following information to
|
34 | ** packaging of this file. Please review the following information to
|
35 | ** ensure the GNU General Public License version 3.0 requirements will be
|
35 | ** ensure the GNU General Public License version 3.0 requirements will be
|
36 | ** met: http://www.gnu.org/copyleft/gpl.html.
|
36 | ** met: http://www.gnu.org/copyleft/gpl.html.
|
37 | **
|
37 | **
|
38 | ** If you have questions regarding the use of this file, please contact
|
38 | ** If you have questions regarding the use of this file, please contact
|
39 | ** Nokia at qt-info@nokia.com.
|
39 | ** Nokia at qt-info@nokia.com.
|
40 | ** $QT_END_LICENSE$
|
40 | ** $QT_END_LICENSE$
|
41 | **
|
41 | **
|
42 | ****************************************************************************/
|
42 | ****************************************************************************/
|
43 | 43 | ||
44 | /*
|
44 | /*
|
45 | delegate.cpp
|
45 | delegate.cpp
|
46 | 46 | ||
47 | A delegate that allows the user to change integer values from the model
|
47 | A delegate that allows the user to change integer values from the model
|
48 | using a spin box widget.
|
48 | using a spin box widget.
|
49 | */
|
49 | */
|
50 | 50 | ||
51 | #include <QtGui>
|
51 | #include <QtGui>
|
52 | 52 | ||
53 | #include "delegate.h"
|
53 | #include "delegate.h"
|
54 | 54 | ||
55 | 55 | ||
56 | //! [0]
|
56 | //! [0]
|
57 | SpinBoxDelegate::SpinBoxDelegate(QObject *parent) |
57 | SpinBoxDelegate::SpinBoxDelegate(QObject *parent) |
58 | : QItemDelegate(parent) |
58 | : QItemDelegate(parent) |
59 | {
|
59 | {
|
60 | }
|
60 | }
|
61 | //! [0]
|
61 | //! [0]
|
62 | 62 | ||
63 | void SpinBoxDelegate::setInctance(QString newInctance){ |
63 | void SpinBoxDelegate::setInctance(QString newInctance){ |
64 | inctance = newInctance; |
64 | inctance = newInctance; |
65 | }
|
65 | }
|
66 | 66 | ||
67 | void SpinBoxDelegate::getItems(){ |
67 | void SpinBoxDelegate::getItems(){ |
68 | QMap <QString, QString> result_map; |
68 | QMap <QString, QString> result_map; |
69 | QSqlQuery q;
|
69 | QSqlQuery q;
|
70 | QString query_str;
|
70 | QString query_str;
|
71 | bool ok; |
71 | bool ok; |
72 | 72 | ||
73 | if (SpinBoxDelegate::inctance.isEmpty()) |
73 | if (SpinBoxDelegate::inctance.isEmpty()) |
74 | {
|
74 | {
|
75 | items.clear(); |
75 | items.clear(); |
76 | return; |
76 | return; |
77 | }
|
77 | }
|
78 | 78 | ||
79 | query_str = tr("select * from `"); |
79 | query_str = tr("select * from `"); |
80 | query_str.append(inctance); |
80 | query_str.append(inctance); |
81 | query_str.append( tr("`")); |
81 | query_str.append( tr("`")); |
82 | 82 | ||
83 | q.prepare(query_str); |
83 | q.prepare(query_str); |
84 | 84 | ||
85 | 85 | ||
86 | ok = q.exec(); |
86 | ok = q.exec(); |
87 | 87 | ||
88 | 88 | ||
89 | 89 | ||
90 | 90 | ||
91 | if (!ok) { |
91 | if (!ok) { |
92 | /*
|
92 | /*
|
93 | QString error_str;
|
93 | QString error_str;
|
94 | error_str = tr("íå óäàëîñü ïîëó÷èòü ñïèñîê îáúåêòîâ èç òàáëèöû ");
|
94 | error_str = tr("íå óäàëîñü ïîëó÷èòü ñïèñîê îáúåêòîâ èç òàáëèöû ");
|
95 | error_str.append(inctance);
|
95 | error_str.append(inctance);
|
96 | QMessageBox::critical( // Äèàëîã ñ ñîîáùåíèåì îá îøèáêå.
|
96 | QMessageBox::critical( // Äèàëîã ñ ñîîáùåíèåì îá îøèáêå.
|
97 | this, // Ðîäèòåëüñêèé âèäæåò.
|
97 | this, // Ðîäèòåëüñêèé âèäæåò.
|
98 | QObject::tr("Database Error"), // Çàãîëîâîê.
|
98 | QObject::tr("Database Error"), // Çàãîëîâîê.
|
99 | q.lastError().text()); // Òåêñò ñîîáùåíèÿ.
|
99 | q.lastError().text()); // Òåêñò ñîîáùåíèÿ.
|
100 | // tr("íå óäàëîñü ïîëó÷èòü ñïèñîê îáúåêòîâ èç òàáëèöû ")); // Òåêñò ñîîáùåíèÿ.
|
100 | // tr("íå óäàëîñü ïîëó÷èòü ñïèñîê îáúåêòîâ èç òàáëèöû ")); // Òåêñò ñîîáùåíèÿ.
|
101 | 101 | ||
102 | */
|
102 | */
|
103 | items.clear(); |
103 | items.clear(); |
104 | return; |
104 | return; |
105 | }
|
105 | }
|
106 | 106 | ||
107 | 107 | ||
108 | // field_inctance = q.record().indexOf(tr("TableWhithInstance"));
|
108 | // field_inctance = q.record().indexOf(tr("TableWhithInstance"));
|
109 | items.clear(); |
109 | items.clear(); |
110 | while(q.next()){ |
110 | while(q.next()){ |
111 | 111 | ||
112 | QString ID;
|
112 | QString ID;
|
113 | QString Name;
|
113 | QString Name;
|
114 | ID = q.value(0).toString(); // îïðåäåëÿåì ID |
114 | ID = q.value(0).toString(); // îïðåäåëÿåì ID |
115 | Name = q.value(1).toString(); // îïðåäåëÿåì Name |
115 | Name = q.value(1).toString(); // îïðåäåëÿåì Name |
116 | items.insert(ID, Name); |
116 | items.insert(ID, Name); |
117 | }
|
117 | }
|
118 | 118 | ||
119 | 119 | ||
120 | // return result_map;
|
120 | // return result_map;
|
121 | }
|
121 | }
|
122 | 122 | ||
123 | 123 | ||
124 | //! [1]
|
124 | //! [1]
|
125 | QWidget *SpinBoxDelegate::createEditor(QWidget *parent, |
125 | QWidget *SpinBoxDelegate::createEditor(QWidget *parent, |
126 | const QStyleOptionViewItem &/* option */, |
126 | const QStyleOptionViewItem &/* option */, |
127 | const QModelIndex &/* index */) const |
127 | const QModelIndex &/* index */) const |
128 | {
|
128 | {
|
129 | //QSpinBox *editor = new QSpinBox(parent);
|
129 | //QSpinBox *editor = new QSpinBox(parent);
|
130 | //editor->setMinimum(0);
|
130 | //editor->setMinimum(0);
|
131 | //editor->setMaximum(100);
|
131 | //editor->setMaximum(100);
|
132 | QStringList ID_list;
|
132 | QStringList ID_list;
|
133 | QStringList Name_list;
|
133 | QStringList Name_list;
|
134 | 134 | ||
135 | // getItems();
|
135 | // getItems();
|
136 | 136 | ||
137 | 137 | ||
138 | 138 | ||
139 | 139 | ||
140 | 140 | ||
141 | ID_list = items.keys(); |
141 | ID_list = items.keys(); |
142 | Name_list = items.values(); |
142 | Name_list = items.values(); |
143 | 143 | ||
144 | QComboBox *editor = new QComboBox(parent); |
144 | QComboBox *editor = new QComboBox(parent); |
145 | 145 | ||
146 | /*
|
146 | /*
|
147 | editor->addItem("0");
|
147 | editor->addItem("0");
|
148 | editor->addItem("1");
|
148 | editor->addItem("1");
|
149 | editor->addItem("2");
|
149 | editor->addItem("2");
|
150 | editor->addItem("3");
|
150 | editor->addItem("3");
|
151 | editor->addItem("4");
|
151 | editor->addItem("4");
|
152 | editor->addItem("5");
|
152 | editor->addItem("5");
|
153 | editor->addItem("6");
|
153 | editor->addItem("6");
|
154 | editor->addItem("7");
|
154 | editor->addItem("7");
|
155 | editor->addItem("8");
|
155 | editor->addItem("8");
|
156 | editor->addItem("9");
|
156 | editor->addItem("9");
|
157 | */
|
157 | */
|
158 | 158 | ||
159 | // editor->addItem("0");
|
159 | // editor->addItem("0");
|
160 | 160 | ||
161 | editor->addItems(Name_list); |
161 | editor->addItems(Name_list); |
162 | // editor->setEditable(false);
|
162 | // editor->setEditable(false);
|
163 | return editor; |
163 | return editor; |
164 | }
|
164 | }
|
165 | //! [1]
|
165 | //! [1]
|
166 | 166 | ||
167 | //! [2]
|
167 | //! [2]
|
168 | void SpinBoxDelegate::setEditorData(QWidget *editor, |
168 | void SpinBoxDelegate::setEditorData(QWidget *editor, |
169 | const QModelIndex &index) const |
169 | const QModelIndex &index) const |
170 | {
|
170 | {
|
171 | // int value = index.model()->data(index, Qt::EditRole).toInt();
|
171 | // int value = index.model()->data(index, Qt::EditRole).toInt();
|
172 | 172 | ||
173 | // QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
|
173 | // QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
|
174 | // spinBox->setValue(value);
|
174 | // spinBox->setValue(value);
|
175 | QString value = index.model()->data(index, Qt::EditRole).toString(); |
175 | QString value = index.model()->data(index, Qt::EditRole).toString(); |
176 | 176 | ||
177 | QComboBox *comboBox = static_cast<QComboBox*>(editor); |
177 | QComboBox *comboBox = static_cast<QComboBox*>(editor); |
178 | 178 | ||
179 | QStringList ID_list;
|
179 | QStringList ID_list;
|
180 | QStringList Name_list;
|
180 | QStringList Name_list;
|
181 | int curr_index; |
181 | int curr_index; |
182 | 182 | ||
183 | ID_list = items.keys(); |
183 | ID_list = items.keys(); |
184 | Name_list = items.values(); |
184 | Name_list = items.values(); |
185 | 185 | ||
186 | curr_index = ID_list.indexOf(value); |
186 | curr_index = ID_list.indexOf(value); |
187 | if (curr_index==-1) return; |
187 | if (curr_index==-1) return; |
188 | comboBox->setCurrentIndex(curr_index); |
188 | comboBox->setCurrentIndex(curr_index); |
189 | /****************************************************
|
189 | /****************************************************
|
190 | if (value == "0") comboBox->setCurrentIndex(0);
|
190 | if (value == "0") comboBox->setCurrentIndex(0);
|
191 | if (value == "1") comboBox->setCurrentIndex(1);
|
191 | if (value == "1") comboBox->setCurrentIndex(1);
|
192 | if (value == "2") comboBox->setCurrentIndex(2);
|
192 | if (value == "2") comboBox->setCurrentIndex(2);
|
193 | if (value == "3") comboBox->setCurrentIndex(3);
|
193 | if (value == "3") comboBox->setCurrentIndex(3);
|
194 | if (value == "4") comboBox->setCurrentIndex(4);
|
194 | if (value == "4") comboBox->setCurrentIndex(4);
|
195 | if (value == "5") comboBox->setCurrentIndex(5);
|
195 | if (value == "5") comboBox->setCurrentIndex(5);
|
196 | if (value == "6") comboBox->setCurrentIndex(6);
|
196 | if (value == "6") comboBox->setCurrentIndex(6);
|
197 | if (value == "7") comboBox->setCurrentIndex(7);
|
197 | if (value == "7") comboBox->setCurrentIndex(7);
|
198 | if (value == "8") comboBox->setCurrentIndex(8);
|
198 | if (value == "8") comboBox->setCurrentIndex(8);
|
199 | if (value == "9") comboBox->setCurrentIndex(9);
|
199 | if (value == "9") comboBox->setCurrentIndex(9);
|
200 | ******************************************************/
|
200 | ******************************************************/
|
201 | comboBox->setEditable(false); |
201 | comboBox->setEditable(false); |
202 | 202 | ||
203 | 203 | ||
204 | //comboBox->setItemText(0, value);
|
204 | //comboBox->setItemText(0, value);
|
205 | 205 | ||
206 | }
|
206 | }
|
207 | //! [2]
|
207 | //! [2]
|
208 | 208 | ||
209 | //! [3]
|
209 | //! [3]
|
210 | void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, |
210 | void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, |
211 | const QModelIndex &index) const |
211 | const QModelIndex &index) const |
212 | {
|
212 | {
|
213 | // QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
|
213 | // QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
|
214 | // spinBox->interpretText();
|
214 | // spinBox->interpretText();
|
215 | // int value = spinBox->value();
|
215 | // int value = spinBox->value();
|
216 | 216 | ||
217 | // model->setData(index, value, Qt::EditRole);
|
217 | // model->setData(index, value, Qt::EditRole);
|
218 | QStringList ID_list;
|
218 | QStringList ID_list;
|
219 | QStringList Name_list;
|
219 | QStringList Name_list;
|
220 | 220 | ||
221 | QComboBox *comboBox = static_cast<QComboBox*>(editor); |
221 | QComboBox *comboBox = static_cast<QComboBox*>(editor); |
222 | int currIndex; |
222 | int currIndex; |
223 | currIndex = comboBox->currentIndex(); |
223 | currIndex = comboBox->currentIndex(); |
224 | if (currIndex==-1) return; |
224 | if (currIndex==-1) return; |
225 | // QString value = comboBox->itemText(currIndex);
|
225 | // QString value = comboBox->itemText(currIndex);
|
226 | 226 | ||
227 | ID_list = items.keys(); |
227 | ID_list = items.keys(); |
228 | Name_list = items.values(); |
228 | Name_list = items.values(); |
229 | 229 | ||
230 | QString value = ID_list.at(currIndex); |
230 | QString value = ID_list.at(currIndex); |
231 | model->setData(index, value, Qt::EditRole); |
231 | model->setData(index, value, Qt::EditRole); |
232 | }
|
232 | }
|
233 | //! [3]
|
233 | //! [3]
|
234 | 234 | ||
235 | //! [4]
|
235 | //! [4]
|
236 | void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, |
236 | void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, |
237 | const QStyleOptionViewItem &option, const QModelIndex &/* index */) const |
237 | const QStyleOptionViewItem &option, const QModelIndex &/* index */) const |
238 | {
|
238 | {
|
239 | editor->setGeometry(option.rect); |
239 | editor->setGeometry(option.rect); |
240 | }
|
240 | }
|
241 | //! [4]
|
241 | //! [4]
|
242 | MyDEDelegate::MyDEDelegate( |
242 | MyDEDelegate::MyDEDelegate( |
243 | bool calpopup,
|
243 | bool calpopup,
|
244 | QObject *parent) |
244 | QObject *parent) |
245 | : QItemDelegate(parent), |
245 | : QItemDelegate(parent), |
246 | m_calpopup(calpopup) { |
246 | m_calpopup(calpopup) { |
247 | }
|
247 | }
|
248 | 248 | ||
249 | QWidget *MyDEDelegate::createEditor( |
249 | QWidget *MyDEDelegate::createEditor( |
250 | QWidget *parent,
|
250 | QWidget *parent,
|
251 | const QStyleOptionViewItem& /* option */, |
251 | const QStyleOptionViewItem& /* option */, |
252 | const QModelIndex& /* index */) const { |
252 | const QModelIndex& /* index */) const { |
253 | QDateEdit *editor = new QDateEdit(parent); |
253 | QDateEdit *editor = new QDateEdit(parent); |
254 | editor->setCalendarPopup(m_calpopup); |
254 | editor->setCalendarPopup(m_calpopup); |
255 | editor->installEventFilter(const_cast<MyDEDelegate*>(this)); |
255 | editor->installEventFilter(const_cast<MyDEDelegate*>(this)); |
256 | return editor; |
256 | return editor; |
257 | }
|
257 | }
|
258 | 258 | ||
259 | void MyDEDelegate::setEditorData( |
259 | void MyDEDelegate::setEditorData( |
260 | QWidget *editor,
|
260 | QWidget *editor,
|
261 | const QModelIndex &index) const { |
261 | const QModelIndex &index) const { |
262 | QDate value = index.model()->data( |
262 | QDate value = index.model()->data( |
263 | index, Qt::EditRole).toDate(); |
263 | index, Qt::EditRole).toDate(); |
264 | QDateEdit *de = static_cast<QDateEdit*>(editor); |
264 | QDateEdit *de = static_cast<QDateEdit*>(editor); |
265 | de->setDate(value); |
265 | de->setDate(value); |
266 | }
|
266 | }
|
267 | 267 | ||
268 | void MyDEDelegate::setModelData( |
268 | void MyDEDelegate::setModelData( |
269 | QWidget *editor,
|
269 | QWidget *editor,
|
270 | QAbstractItemModel *model,
|
270 | QAbstractItemModel *model,
|
271 | const QModelIndex& index) const { |
271 | const QModelIndex& index) const { |
272 | QDateEdit *de = static_cast<QDateEdit*>(editor); |
272 | QDateEdit *de = static_cast<QDateEdit*>(editor); |
273 | de->interpretText(); |
273 | de->interpretText(); |
274 | QDate value = de->date(); |
274 | QDate value = de->date(); |
275 | model->setData(index, value); |
275 | model->setData(index, value); |
276 | }
|
276 | }
|
277 | 277 | ||
278 | void MyDEDelegate::updateEditorGeometry( |
278 | void MyDEDelegate::updateEditorGeometry( |
279 | QWidget *editor,
|
279 | QWidget *editor,
|
280 | const QStyleOptionViewItem &option, |
280 | const QStyleOptionViewItem &option, |
281 | const QModelIndex& /* index */) const { |
281 | const QModelIndex& /* index */) const { |
282 | 282 | ||
283 | 283 | ||
284 | 284 | ||
285 | editor->setGeometry(option.rect); |
285 | editor->setGeometry(option.rect); |
286 | }
|
286 | }
|
287 | 287 | ||
288 | 288 | ||
289 | 289 | ||
290 | 290 | ||
291 | 291 | ||
292 | CPictureDelegate::CPictureDelegate( QObject * parent ) : QItemDelegate(parent) |
292 | CPictureDelegate::CPictureDelegate( QObject * parent ) : QItemDelegate(parent) |
293 | {
|
293 | {
|
294 | }
|
294 | }
|
295 | 295 | ||
296 | void CPictureDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const |
296 | void CPictureDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const |
297 | {
|
297 | {
|
298 | m_pxPicture.fill( QColor(Qt::white) ); |
298 | m_pxPicture.fill( QColor(Qt::white) ); |
299 | 299 | ||
300 | const QAbstractItemModel * model = index.model(); |
300 | const QAbstractItemModel * model = index.model(); |
301 | QString sFileName = model->data( index, Qt::DisplayRole ).toString(); |
301 | QString sFileName = model->data( index, Qt::DisplayRole ).toString(); |
302 | 302 | ||
303 | if ( !sFileName.isEmpty() ) |
303 | if ( !sFileName.isEmpty() ) |
304 | m_pxPicture.load( sFileName ); |
304 | m_pxPicture.load( sFileName ); |
305 | else { |
305 | else { |
306 | //QItemDelegate::paint(painter, option, index);
|
306 | //QItemDelegate::paint(painter, option, index);
|
307 | return; |
307 | return; |
308 | }
|
308 | }
|
309 | 309 | ||
310 | QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) ? |
310 | QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) ? |
311 | ((option.state & QStyle::State_Active) ? QPalette::Normal : QPalette::Inactive ) : |
311 | ((option.state & QStyle::State_Active) ? QPalette::Normal : QPalette::Inactive ) : |
312 | QPalette::Disabled; |
312 | QPalette::Disabled; |
313 | 313 | ||
314 | if (option.state & QStyle::State_Selected) |
314 | if (option.state & QStyle::State_Selected) |
315 | painter->fillRect(option.rect, option.palette.color(cg, QPalette::Highlight)); |
315 | painter->fillRect(option.rect, option.palette.color(cg, QPalette::Highlight)); |
316 | 316 | ||
317 | int nX = option.rect.x() + ( ( option.rect.width() - m_pxPicture.rect().width() ) / 2 ); |
317 | int nX = option.rect.x() + ( ( option.rect.width() - m_pxPicture.rect().width() ) / 2 ); |
318 | int nY = option.rect.y() + ( ( option.rect.height() - m_pxPicture.rect().height() ) / 2 ); |
318 | int nY = option.rect.y() + ( ( option.rect.height() - m_pxPicture.rect().height() ) / 2 ); |
319 | painter->drawPixmap( nX, nY, m_pxPicture ); |
319 | painter->drawPixmap( nX, nY, m_pxPicture ); |
320 | 320 | ||
321 | 321 | ||
322 | //// drawFocus(painter, option, option.rect.adjusted(0, 0, -1, -1)); // since we draw the grid ourselves
|
322 | //// drawFocus(painter, option, option.rect.adjusted(0, 0, -1, -1)); // since we draw the grid ourselves
|
323 | 323 | ||
324 | /*
|
324 | /*
|
325 | QPen pen = painter->pen();
|
325 | QPen pen = painter->pen();
|
326 | painter->setPen(option.palette.color(QPalette::Mid));
|
326 | painter->setPen(option.palette.color(QPalette::Mid));
|
327 | painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
|
327 | painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
|
328 | painter->drawLine(option.rect.topRight(), option.rect.bottomRight());
|
328 | painter->drawLine(option.rect.topRight(), option.rect.bottomRight());
|
329 | painter->setPen(pen);
|
329 | painter->setPen(pen);
|
330 | */
|
330 | */
|
331 | }
|
331 | }
|
332 | 332 | ||
333 | 333 | ||
334 | 334 | ||
335 | 335 | ||
336 | void TimeEditDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, |
336 | void TimeEditDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, |
337 | const QModelIndex &index) const |
337 | const QModelIndex &index) const |
338 | {
|
338 | {
|
339 | int datetime = index.model()->data(index, Qt::DisplayRole).toInt(); |
339 | int datetime = index.model()->data(index, Qt::DisplayRole).toInt(); |
340 | 340 | ||
341 | QString indexvalue = ""; |
341 | QString indexvalue = ""; |
342 | 342 | ||
343 | if (datetime > 0) |
343 | if (datetime > 0) |
344 | {
|
344 | {
|
345 | QDateTime dateTime2 = QDateTime(); |
345 | QDateTime dateTime2 = QDateTime(); |
346 | dateTime2.setTime_t(datetime); |
346 | dateTime2.setTime_t(datetime); |
347 | indexvalue = dateTime2.toString(this->timeformat); |
347 | indexvalue = dateTime2.toString(this->timeformat); |
348 | }
|
348 | }
|
349 | else
|
349 | else
|
350 | {
|
350 | {
|
351 | indexvalue = tr("Date not set"); |
351 | indexvalue = tr("Date not set"); |
352 | }
|
352 | }
|
353 | 353 | ||
354 | Q_ASSERT(index.isValid()); |
354 | Q_ASSERT(index.isValid()); |
355 | 355 | ||
356 | QStyleOptionViewItemV3 opt = setOptions(index, option); |
356 | QStyleOptionViewItemV3 opt = setOptions(index, option); |
357 | 357 | ||
358 | const QStyleOptionViewItemV2 *v2 = qstyleoption_cast<const QStyleOptionViewItemV2 *>(&option); |
358 | const QStyleOptionViewItemV2 *v2 = qstyleoption_cast<const QStyleOptionViewItemV2 *>(&option); |
359 | opt.features = v2 ? v2->features |
359 | opt.features = v2 ? v2->features |
360 | : QStyleOptionViewItemV2::ViewItemFeatures(QStyleOptionViewItemV2::None); |
360 | : QStyleOptionViewItemV2::ViewItemFeatures(QStyleOptionViewItemV2::None); |
361 | const QStyleOptionViewItemV3 *v3 = qstyleoption_cast<const QStyleOptionViewItemV3 *>(&option); |
361 | const QStyleOptionViewItemV3 *v3 = qstyleoption_cast<const QStyleOptionViewItemV3 *>(&option); |
362 | opt.locale = v3 ? v3->locale : QLocale(); |
362 | opt.locale = v3 ? v3->locale : QLocale(); |
363 | opt.widget = v3 ? v3->widget : 0; |
363 | opt.widget = v3 ? v3->widget : 0; |
364 | 364 | ||
365 | // prepare
|
365 | // prepare
|
366 | painter->save(); |
366 | painter->save(); |
367 | 367 | ||
368 | painter->setClipRect(opt.rect); |
368 | painter->setClipRect(opt.rect); |
369 | 369 | ||
370 | // get the data and the rectangles
|
370 | // get the data and the rectangles
|
371 | QVariant value;
|
371 | QVariant value;
|
372 | 372 | ||
373 | QPixmap pixmap;
|
373 | QPixmap pixmap;
|
374 | QRect decorationRect;
|
374 | QRect decorationRect;
|
375 | value = index.data(Qt::DecorationRole); |
375 | value = index.data(Qt::DecorationRole); |
376 | 376 | ||
377 | QString text;
|
377 | QString text;
|
378 | QRect displayRect;
|
378 | QRect displayRect;
|
379 | value = index.data(Qt::DisplayRole); |
379 | value = index.data(Qt::DisplayRole); |
380 | if (value.isValid()) { |
380 | if (value.isValid()) { |
381 | text = indexvalue; |
381 | text = indexvalue; |
382 | displayRect = textRectangle(painter, option.rect, opt.font, text); |
382 | displayRect = textRectangle(painter, option.rect, opt.font, text); |
383 | }
|
383 | }
|
384 | 384 | ||
385 | QRect checkRect;
|
385 | QRect checkRect;
|
386 | Qt::CheckState checkState = Qt::Unchecked; |
386 | Qt::CheckState checkState = Qt::Unchecked; |
387 | value = index.data(Qt::CheckStateRole); |
387 | value = index.data(Qt::CheckStateRole); |
388 | if (value.isValid()) { |
388 | if (value.isValid()) { |
389 | checkState = static_cast<Qt::CheckState>(value.toInt()); |
389 | checkState = static_cast<Qt::CheckState>(value.toInt()); |
390 | checkRect = check(opt, opt.rect, value); |
390 | checkRect = check(opt, opt.rect, value); |
391 | }
|
391 | }
|
392 | 392 | ||
393 | // do the layout
|
393 | // do the layout
|
394 | doLayout(opt, &checkRect, &decorationRect, &displayRect, false); |
394 | doLayout(opt, &checkRect, &decorationRect, &displayRect, false); |
395 | // draw the item
|
395 | // draw the item
|
396 | 396 | ||
397 | drawBackground(painter, opt, index); |
397 | drawBackground(painter, opt, index); |
398 | drawCheck(painter, opt, checkRect, checkState); |
398 | drawCheck(painter, opt, checkRect, checkState); |
399 | drawDecoration(painter, opt, decorationRect, pixmap); |
399 | drawDecoration(painter, opt, decorationRect, pixmap); |
400 | drawDisplay(painter, opt, displayRect, text); |
400 | drawDisplay(painter, opt, displayRect, text); |
401 | drawFocus(painter, opt, displayRect); |
401 | drawFocus(painter, opt, displayRect); |
402 | 402 | ||
403 | // done
|
403 | // done
|
404 | painter->restore(); |
404 | painter->restore(); |
405 | }
|
405 | }
|
406 | 406 | ||
407 | 407 | ||
408 | 408 | ||
409 | 409 | ||
410 | 410 | ||
411 | 411 | ||
412 | IconDelegate::IconDelegate( QObject * parent ) : QItemDelegate(parent) |
412 | IconDelegate::IconDelegate( QObject * parent ) : QItemDelegate(parent) |
413 | {
|
413 | {
|
414 | }
|
414 | }
|
415 | 415 | ||
416 | 416 | ||
417 | 417 | ||
418 | 418 | ||
419 | 419 | ||
420 | QWidget *IconDelegate::createEditor(QWidget *parent, |
420 | QWidget *IconDelegate::createEditor(QWidget *parent, |
421 | const QStyleOptionViewItem &/* option */, |
421 | const QStyleOptionViewItem &/* option */, |
422 | const QModelIndex & /* index */) const |
422 | const QModelIndex & /* index */) const |
423 | {
|
423 | {
|
424 | 424 | ||
425 | IconForm *editor = new IconForm(parent); |
425 | IconForm *editor = new IconForm(parent); |
426 | 426 | ||
427 | return editor; |
427 | return editor; |
428 | 428 | ||
429 | }
|
429 | }
|
430 | 430 | ||
431 | 431 | ||
432 | 432 | ||
433 | 433 | ||
434 | void IconDelegate::setEditorData(QWidget *editor, |
434 | void IconDelegate::setEditorData(QWidget *editor, |
435 | const QModelIndex &index) const |
435 | const QModelIndex &index) const |
436 | {
|
436 | {
|
437 | 437 | ||
438 | 438 | ||
439 | const QAbstractItemModel * model = index.model(); |
439 | const QAbstractItemModel * model = index.model(); |
440 | IconForm *icnFrm = static_cast<IconForm*>(editor); |
440 | IconForm *icnFrm = static_cast<IconForm*>(editor); |
441 | QVariant currentImage = model->data(index,0); |
441 | QVariant currentImage = model->data(index,0); |
442 | QByteArray bytes = currentImage.toByteArray(); |
442 | QByteArray bytes = currentImage.toByteArray(); |
443 | if (currentImage.isValid()) { |
443 | if (currentImage.isValid()) { |
444 | m_pxPicture.loadFromData(bytes); |
444 | m_pxPicture.loadFromData(bytes); |
445 | }
|
445 | }
|
446 | else { |
446 | else { |
447 | //QItemDelegate::paint(painter, option, index);
|
447 | //QItemDelegate::paint(painter, option, index);
|
448 | 448 | ||
449 | 449 | ||
450 | return; |
450 | return; |
451 | }
|
451 | }
|
452 | icnFrm->setPixmap(m_pxPicture); |
452 | icnFrm->setPixmap(m_pxPicture); |
453 | // tblView->setRowHeight(index.row(), icnFrm->geometry().height());
|
453 | // tblView->setRowHeight(index.row(), icnFrm->geometry().height());
|
454 | }
|
454 | }
|
455 | 455 | ||
456 | 456 | ||
457 | 457 | ||
458 | 458 | ||
459 | void IconDelegate::setModelData( |
459 | void IconDelegate::setModelData( |
460 | QWidget *editor,
|
460 | QWidget *editor,
|
461 | QAbstractItemModel *model,
|
461 | QAbstractItemModel *model,
|
462 | const QModelIndex& index) const { |
462 | const QModelIndex& index) const { |
463 | IconForm *icnFrm = static_cast<IconForm*>(editor); |
463 | IconForm *icnFrm = static_cast<IconForm*>(editor); |
464 | if (!(icnFrm->dataIsChanged())) return; |
464 | if (!(icnFrm->dataIsChanged())) return; |
465 | 465 | ||
466 | m_pxPicture = icnFrm->pixmap(); |
466 | m_pxPicture = icnFrm->pixmap(); |
467 | QImage currentImage = m_pxPicture.toImage(); |
467 | QImage currentImage = m_pxPicture.toImage(); |
468 | QByteArray bytes;
|
468 | QByteArray bytes;
|
469 | QBuffer buffer(&bytes); |
469 | QBuffer buffer(&bytes); |
470 | buffer.open(QIODevice::WriteOnly); |
470 | buffer.open(QIODevice::WriteOnly); |
471 | currentImage.save(&buffer, "PNG"); |
471 | currentImage.save(&buffer, "PNG"); |
472 | 472 | ||
473 | 473 | ||
474 | 474 | ||
475 | 475 | ||
476 | model->setData(index, QVariant (bytes), Qt::EditRole); |
476 | model->setData(index, QVariant (bytes), Qt::EditRole); |
477 | 477 | ||
478 | // int widht = m_pxPicture.width();
|
478 | // int widht = m_pxPicture.width();
|
479 | // int heigh = m_pxPicture.height();
|
479 | // int heigh = m_pxPicture.height();
|
480 | // tblView->setRowHeight(index.row(), heigh + 10);
|
480 | // tblView->setRowHeight(index.row(), heigh + 10);
|
481 | // model->submitAll();
|
481 | // model->submitAll();
|
482 | 482 | ||
483 | 483 | ||
484 | 484 | ||
485 | 485 | ||
486 | // model->setData(index, value);
|
486 | // model->setData(index, value);
|
487 | }
|
487 | }
|
488 | 488 | ||
489 | 489 | ||
490 | 490 | ||
491 | void IconDelegate::updateEditorGeometry( |
491 | void IconDelegate::updateEditorGeometry( |
492 | QWidget *editor,
|
492 | QWidget *editor,
|
493 | const QStyleOptionViewItem &option, |
493 | const QStyleOptionViewItem &option, |
494 | const QModelIndex& /* index */) const { |
494 | const QModelIndex& /* index */) const { |
495 | 495 | ||
496 | 496 | ||
497 | // QRect r(option.rect.x() + option.rect.width()/2 - 7, option.rect.y() + option.rect.height()/2 - 7, 150, 100);
|
497 | // QRect r(option.rect.x() + option.rect.width()/2 - 7, option.rect.y() + option.rect.height()/2 - 7, 150, 100);
|
498 | // editor->setGeometry(r);
|
498 | // editor->setGeometry(r);
|
499 | 499 | ||
500 | editor->setGeometry(option.rect); |
500 | editor->setGeometry(option.rect); |
501 | }
|
501 | }
|
502 | 502 | ||
503 | 503 | ||
504 | 504 | ||
505 | 505 | ||
506 | void IconDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const |
506 | void IconDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const |
507 | {
|
507 | {
|
508 | 508 | ||
509 | 509 | ||
510 | m_pxPicture.fill( QColor(Qt::white) ); |
510 | m_pxPicture.fill( QColor(Qt::white) ); |
511 | 511 | ||
512 | const QAbstractItemModel * model = index.model(); |
512 | const QAbstractItemModel * model = index.model(); |
513 | QString sFileName = model->data( index, Qt::DisplayRole ).toString(); |
513 | QString sFileName = model->data( index, Qt::DisplayRole ).toString(); |
514 | 514 | ||
515 | QVariant currentImage = model->data(index,0); |
515 | QVariant currentImage = model->data(index,0); |
516 | 516 | ||
517 | 517 | ||
518 | QByteArray bytes = currentImage.toByteArray(); |
518 | QByteArray bytes = currentImage.toByteArray(); |
519 | // QImage image;
|
519 | // QImage image;
|
520 | // image.loadFromData(bytes);
|
520 | // image.loadFromData(bytes);
|
521 | 521 | ||
522 | 522 | ||
523 | if (currentImage.isValid()) { |
523 | if (currentImage.isValid()) { |
524 | m_pxPicture.loadFromData(bytes); |
524 | m_pxPicture.loadFromData(bytes); |
525 | 525 | ||
526 | }
|
526 | }
|
527 | else { |
527 | else { |
528 | //QItemDelegate::paint(painter, option, index);
|
528 | //QItemDelegate::paint(painter, option, index);
|
529 | return; |
529 | return; |
530 | }
|
530 | }
|
531 | 531 | ||
532 | 532 | ||
533 | 533 | ||
534 | 534 | ||
535 | 535 | ||
536 | /*
|
536 | /*
|
537 | 537 | ||
538 | if ( !sFileName.isEmpty() )
|
538 | if ( !sFileName.isEmpty() )
|
539 | m_pxPicture.load( sFileName );
|
539 | m_pxPicture.load( sFileName );
|
540 | else {
|
540 | else {
|
541 | //QItemDelegate::paint(painter, option, index);
|
541 | //QItemDelegate::paint(painter, option, index);
|
542 | return;
|
542 | return;
|
543 | }
|
543 | }
|
544 | */
|
544 | */
|
545 | 545 | ||
546 | 546 | ||
- | 547 | ||
- | 548 | ||
- | 549 | ||
547 | QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) ? |
550 | QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) ? |
548 | ((option.state & QStyle::State_Active) ? QPalette::Normal : QPalette::Inactive ) : |
551 | ((option.state & QStyle::State_Active) ? QPalette::Normal : QPalette::Inactive ) : |
549 | QPalette::Disabled; |
552 | QPalette::Disabled; |
550 | 553 | ||
551 | if (option.state & QStyle::State_Selected) |
554 | if (option.state & QStyle::State_Selected) |
552 | 555 | ||
553 | 556 | ||
554 | painter->fillRect(option.rect, option.palette.color(cg, QPalette::Highlight)); |
557 | painter->fillRect(option.rect, option.palette.color(cg, QPalette::Highlight)); |
555 | 558 | ||
- | 559 | ||
- | 560 | ||
556 | int nX = option.rect.x() + ( ( option.rect.width() - m_pxPicture.rect().width() ) / 2 ); |
561 | int nX = option.rect.x() + ( ( option.rect.width() - m_pxPicture.rect().width() ) / 2 ); |
557 | int nY = option.rect.y() + ( ( option.rect.height() - m_pxPicture.rect().height() ) / 2 ); |
562 | int nY = option.rect.y() + ( ( option.rect.height() - m_pxPicture.rect().height() ) / 2 ); |
- | 563 | // painter->setRenderHint(QPainter::Antialiasing);
|
|
558 | painter->drawPixmap( nX, nY, m_pxPicture ); |
564 | painter->drawPixmap( nX, nY, m_pxPicture ); |
559 | 565 | ||
560 | - | ||
561 | // drawFocus(painter, option, option.rect.adjusted(0, 0, -1, -1)); // since we draw the grid ourselves
|
566 | // drawFocus(painter, option, option.rect.adjusted(0, 0, -1, -1)); // since we draw the grid ourselves
|
562 | 567 | ||
563 | /*
|
568 | /*
|
564 | QPen pen = painter->pen();
|
569 | QPen pen = painter->pen();
|
565 | painter->setPen(option.palette.color(QPalette::Mid));
|
570 | painter->setPen(option.palette.color(QPalette::Mid));
|
566 | painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
|
571 | painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
|
567 | painter->drawLine(option.rect.topRight(), option.rect.bottomRight());
|
572 | painter->drawLine(option.rect.topRight(), option.rect.bottomRight());
|
568 | painter->setPen(pen);
|
573 | painter->setPen(pen);
|
569 | */
|
574 | */
|
570 | }
|
575 | }
|
571 | 576 | ||
572 | 577 | ||
573 | void IconDelegate::setTableView(QTableView* table){ |
578 | void IconDelegate::setTableView(QTableView* table){ |
574 | tblView = table; |
579 | tblView = table; |
575 | }
|
580 | }
|
576 | 581 | ||
577 | 582 | ||
578 | 583 | ||
579 | 584 | ||
580 | 585 | ||
581 | 586 | ||
582 | 587 | ||
583 | 588 | ||
584 | FileDelegate::FileDelegate( QObject * parent ) : QItemDelegate(parent) |
589 | FileDelegate::FileDelegate( QObject * parent ) : QItemDelegate(parent) |
585 | {
|
590 | {
|
586 | }
|
591 | }
|
587 | 592 | ||
588 | 593 | ||
589 | 594 | ||
590 | 595 | ||
591 | 596 | ||
592 | QWidget *FileDelegate::createEditor(QWidget *parent, |
597 | QWidget *FileDelegate::createEditor(QWidget *parent, |
593 | const QStyleOptionViewItem &/* option */, |
598 | const QStyleOptionViewItem &/* option */, |
594 | const QModelIndex & /* index */) const |
599 | const QModelIndex & /* index */) const |
595 | {
|
600 | {
|
596 | 601 | ||
597 | FileForm *editor = new FileForm(parent); |
602 | FileForm *editor = new FileForm(parent); |
598 | 603 | ||
599 | return editor; |
604 | return editor; |
600 | 605 | ||
601 | }
|
606 | }
|
602 | 607 | ||
603 | 608 | ||
604 | 609 | ||
605 | 610 | ||
606 | void FileDelegate::setEditorData(QWidget *editor, |
611 | void FileDelegate::setEditorData(QWidget *editor, |
607 | const QModelIndex &index) const |
612 | const QModelIndex &index) const |
608 | {
|
613 | {
|
609 | 614 | ||
610 | 615 | ||
611 | const QAbstractItemModel * model = index.model(); |
616 | const QAbstractItemModel * model = index.model(); |
612 | FileForm *flFrm = static_cast<FileForm*>(editor); |
617 | FileForm *flFrm = static_cast<FileForm*>(editor); |
613 | QVariant currentData = model->data(index,Qt::EditRole); |
618 | QVariant currentData = model->data(index,Qt::EditRole); |
614 | 619 | ||
615 | // QVariant currentData = QSqlTableModel::data(index, 0);
|
620 | // QVariant currentData = QSqlTableModel::data(index, 0);
|
616 | QByteArray bytes = currentData.toByteArray(); |
621 | QByteArray bytes = currentData.toByteArray(); |
617 | if (currentData.isValid()) flFrm->setData(bytes); |
622 | if (currentData.isValid()) flFrm->setData(bytes); |
618 | else return; |
623 | else return; |
619 | 624 | ||
620 | }
|
625 | }
|
621 | 626 | ||
622 | 627 | ||
623 | 628 | ||
624 | 629 | ||
625 | void FileDelegate::setModelData( |
630 | void FileDelegate::setModelData( |
626 | QWidget *editor,
|
631 | QWidget *editor,
|
627 | QAbstractItemModel *model,
|
632 | QAbstractItemModel *model,
|
628 | const QModelIndex& index) const { |
633 | const QModelIndex& index) const { |
629 | FileForm *flFrm = static_cast<FileForm*>(editor); |
634 | FileForm *flFrm = static_cast<FileForm*>(editor); |
630 | if (!(flFrm->dataIsChanged())) return; |
635 | if (!(flFrm->dataIsChanged())) return; |
631 | 636 | ||
632 | m_Data = flFrm->data(); |
637 | m_Data = flFrm->data(); |
633 | if (!m_Data.isEmpty()) { // åñëè ìàññèâ íå ïóñòîé |
638 | if (!m_Data.isEmpty()) { // åñëè ìàññèâ íå ïóñòîé |
634 | model->setData(index, QVariant (m_Data), Qt::EditRole); |
639 | model->setData(index, QVariant (m_Data), Qt::EditRole); |
635 | 640 | ||
636 | }
|
641 | }
|
637 | else { // åñëè ìàññèâ ïóñòîé (ôàéë óäàëèëè) |
642 | else { // åñëè ìàññèâ ïóñòîé (ôàéë óäàëèëè) |
638 | QVariant val_null;
|
643 | QVariant val_null;
|
639 | model->setData(index, val_null, Qt::EditRole); |
644 | model->setData(index, val_null, Qt::EditRole); |
640 | 645 | ||
641 | }
|
646 | }
|
642 | 647 | ||
643 | 648 | ||
644 | 649 | ||
645 | }
|
650 | }
|
646 | 651 | ||
647 | 652 | ||
648 | 653 | ||
649 | void FileDelegate::updateEditorGeometry( |
654 | void FileDelegate::updateEditorGeometry( |
650 | QWidget *editor,
|
655 | QWidget *editor,
|
651 | const QStyleOptionViewItem &option, |
656 | const QStyleOptionViewItem &option, |
652 | const QModelIndex& /* index */) const { |
657 | const QModelIndex& /* index */) const { |
653 | 658 | ||
654 | 659 | ||
655 | // QRect r(option.rect.x() + option.rect.width()/2 - 7, option.rect.y() + option.rect.height()/2 - 7, 150, 100);
|
660 | // QRect r(option.rect.x() + option.rect.width()/2 - 7, option.rect.y() + option.rect.height()/2 - 7, 150, 100);
|
656 | // editor->setGeometry(r);
|
661 | // editor->setGeometry(r);
|
657 | 662 | ||
658 | editor->setGeometry(option.rect); |
663 | editor->setGeometry(option.rect); |
659 | }
|
664 | }
|
660 | 665 | ||
661 | 666 | ||
662 | 667 | ||
663 | 668 | ||
664 | 669 |