Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
tablewidgeteditor.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3// Qt-Security score:significant reason:default
4
6#include <abstractformbuilder.h>
7#include <iconloader_p.h>
8#include <qdesigner_command_p.h>
11#include <designerpropertymanager.h>
12#include <qttreepropertybrowser_p.h>
13
14#include <QtDesigner/abstractformwindow.h>
15#include <QtDesigner/abstractformeditor.h>
16
17#include <QtCore/qdir.h>
18#include <QtCore/qqueue.h>
19#include <QtCore/qtextstream.h>
20
22
23using namespace Qt::StringLiterals;
24
25namespace qdesigner_internal {
26
27TableWidgetEditor::TableWidgetEditor(QDesignerFormWindowInterface *form, QDialog *dialog)
28 : AbstractItemEditor(form, nullptr), m_updatingBrowser(false)
29{
30 m_columnEditor = new ItemListEditor(form, this);
31 m_columnEditor->setObjectName(u"columnEditor"_s);
32 m_columnEditor->setAlignDefault(Qt::AlignCenter);
33 m_columnEditor->setNewItemText(tr("New Column"));
34 m_rowEditor = new ItemListEditor(form, this);
35 m_rowEditor->setObjectName(u"rowEditor"_s);
36 m_rowEditor->setNewItemText(tr("New Row"));
37 ui.setupUi(dialog);
38
39 injectPropertyBrowser(ui.itemsTab, ui.widget);
40 connect(ui.showPropertiesButton, &QAbstractButton::clicked,
41 this, &TableWidgetEditor::togglePropertyBrowser);
42 setPropertyBrowserVisible(false);
43
44 ui.tabWidget->insertTab(0, m_columnEditor, tr("&Columns"));
45 ui.tabWidget->insertTab(1, m_rowEditor, tr("&Rows"));
46 ui.tabWidget->setCurrentIndex(0);
47
48 ui.tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
49
50 connect(iconCache(), &DesignerIconCache::reloaded, this, &TableWidgetEditor::cacheReloaded);
51
52 connect(ui.tableWidget, &QTableWidget::currentCellChanged,
53 this, &TableWidgetEditor::tableWidgetCurrentCellChanged);
54 connect(ui.tableWidget, &QTableWidget::itemChanged,
55 this, &TableWidgetEditor::tableWidgetItemChanged);
56 connect(m_columnEditor, &ItemListEditor::indexChanged,
57 this, &TableWidgetEditor::columnEditorIndexChanged);
58 connect(m_columnEditor, &ItemListEditor::itemChanged,
59 this, &TableWidgetEditor::columnEditorItemChanged);
60 connect(m_columnEditor, &ItemListEditor::itemInserted,
61 this, &TableWidgetEditor::columnEditorItemInserted);
62 connect(m_columnEditor, &ItemListEditor::itemDeleted,
63 this, &TableWidgetEditor::columnEditorItemDeleted);
64 connect(m_columnEditor, &ItemListEditor::itemMovedUp,
65 this, &TableWidgetEditor::columnEditorItemMovedUp);
66 connect(m_columnEditor, &ItemListEditor::itemMovedDown,
67 this, &TableWidgetEditor::columnEditorItemMovedDown);
68
69 connect(m_rowEditor, &ItemListEditor::indexChanged,
70 this, &TableWidgetEditor::rowEditorIndexChanged);
71 connect(m_rowEditor, &ItemListEditor::itemChanged,
72 this, &TableWidgetEditor::rowEditorItemChanged);
73 connect(m_rowEditor, &ItemListEditor::itemInserted,
74 this, &TableWidgetEditor::rowEditorItemInserted);
75 connect(m_rowEditor, &ItemListEditor::itemDeleted,
76 this, &TableWidgetEditor::rowEditorItemDeleted);
77 connect(m_rowEditor, &ItemListEditor::itemMovedUp,
78 this, &TableWidgetEditor::rowEditorItemMovedUp);
79 connect(m_rowEditor, &ItemListEditor::itemMovedDown,
80 this, &TableWidgetEditor::rowEditorItemMovedDown);
81}
82
87// { Qt::StatusTipPropertyRole, 0, DesignerPropertyManager::designerStringTypeId, "statusTip" },
89 { Qt::FontRole, QMetaType::QFont, nullptr, "font" },
91 { Qt::BackgroundRole, QMetaType::QColor, nullptr, "background" },
92 { Qt::ForegroundRole, QMetaType::QBrush, nullptr, "foreground" },
93 { 0, 0, nullptr, nullptr }
94};
95
100// { Qt::StatusTipPropertyRole, 0, DesignerPropertyManager::designerStringTypeId, "statusTip" },
102 { Qt::FontRole, QMetaType::QFont, nullptr, "font" },
104 { Qt::BackgroundRole, QMetaType::QBrush, nullptr, "background" },
105 { Qt::ForegroundRole, QMetaType::QBrush, nullptr, "foreground" },
108 { 0, 0, nullptr, nullptr }
109};
110
112{
113 TableWidgetContents tblCont;
114 tblCont.fromTableWidget(tableWidget, false);
115 tblCont.applyToTableWidget(ui.tableWidget, iconCache(), true);
116
117 auto *header = tableWidget->verticalHeader();
118 auto headerAlignment = header != nullptr
119 ? header->defaultAlignment() : Qt::Alignment(Qt::AlignLeading | Qt::AlignVCenter);
120 tblCont.m_verticalHeader.applyToListWidget(m_rowEditor->listWidget(), iconCache(),
121 true, headerAlignment);
122 m_rowEditor->setupEditor(tableWidget, tableHeaderPropList, headerAlignment);
123
124 header = tableWidget->horizontalHeader();
125 headerAlignment = header != nullptr
126 ? header->defaultAlignment() : Qt::Alignment(Qt::AlignCenter);
127 tblCont.m_horizontalHeader.applyToListWidget(m_columnEditor->listWidget(), iconCache(),
128 true, headerAlignment);
129 m_columnEditor->setupEditor(tableWidget, tableHeaderPropList, headerAlignment);
130
131 setupEditor(tableWidget, tableItemPropList);
132 if (ui.tableWidget->columnCount() > 0 && ui.tableWidget->rowCount() > 0)
133 ui.tableWidget->setCurrentCell(0, 0);
134
135 updateEditor();
136
137 return tblCont;
138}
139
141{
142 TableWidgetContents retVal;
143 retVal.fromTableWidget(ui.tableWidget, true);
144 return retVal;
145}
146
147void TableWidgetEditor::setItemData(int role, const QVariant &v)
148{
149 QTableWidgetItem *item = ui.tableWidget->currentItem();
150 BoolBlocker block(m_updatingBrowser);
151 if (!item) {
152 item = new QTableWidgetItem;
153 ui.tableWidget->setItem(ui.tableWidget->currentRow(), ui.tableWidget->currentColumn(), item);
154 }
155 QVariant newValue = v;
156 if (role == Qt::FontRole && newValue.metaType().id() == QMetaType::QFont) {
157 QFont oldFont = ui.tableWidget->font();
158 QFont newFont = qvariant_cast<QFont>(newValue).resolve(oldFont);
159 newValue = QVariant::fromValue(newFont);
160 item->setData(role, QVariant()); // force the right font with the current resolve mask is set (item view bug)
161 }
162 item->setData(role, newValue);
163}
164
165QVariant TableWidgetEditor::getItemData(int role) const
166{
167 QTableWidgetItem *item = ui.tableWidget->currentItem();
168 if (!item)
169 return QVariant();
170 return item->data(role);
171}
172
174{
175 static const int flags = QTableWidgetItem().flags();
176 return flags;
177}
178
179void TableWidgetEditor::tableWidgetCurrentCellChanged(int currentRow, int currentCol)
180{
181 m_rowEditor->setCurrentIndex(currentRow);
182 m_columnEditor->setCurrentIndex(currentCol);
184}
185
186void TableWidgetEditor::tableWidgetItemChanged(QTableWidgetItem *item)
187{
188 if (m_updatingBrowser)
189 return;
190
191 PropertySheetStringValue val = qvariant_cast<PropertySheetStringValue>(item->data(Qt::DisplayPropertyRole));
192 val.setValue(item->text());
193 BoolBlocker block(m_updatingBrowser);
194 item->setData(Qt::DisplayPropertyRole, QVariant::fromValue(val));
195
197}
198
199void TableWidgetEditor::columnEditorIndexChanged(int col)
200{
201 ui.tableWidget->setCurrentCell(ui.tableWidget->currentRow(), col);
202}
203
204void TableWidgetEditor::columnEditorItemChanged(int idx, int role, const QVariant &v)
205{
206 ui.tableWidget->horizontalHeaderItem(idx)->setData(role, v);
207}
208
209void TableWidgetEditor::rowEditorIndexChanged(int col)
210{
211 ui.tableWidget->setCurrentCell(col, ui.tableWidget->currentColumn());
212}
213
214void TableWidgetEditor::rowEditorItemChanged(int idx, int role, const QVariant &v)
215{
216 ui.tableWidget->verticalHeaderItem(idx)->setData(role, v);
217}
218
219void TableWidgetEditor::setPropertyBrowserVisible(bool v)
220{
221 ui.showPropertiesButton->setText(v ? tr("Properties &>>") : tr("Properties &<<"));
222 m_propertyBrowser->setVisible(v);
223}
224
225void TableWidgetEditor::togglePropertyBrowser()
226{
227 setPropertyBrowserVisible(!m_propertyBrowser->isVisible());
228}
229
230void TableWidgetEditor::updateEditor()
231{
232 const bool wasEnabled = ui.tabWidget->isTabEnabled(2);
233 const bool isEnabled = ui.tableWidget->columnCount() && ui.tableWidget->rowCount();
234 ui.tabWidget->setTabEnabled(2, isEnabled);
235 if (!wasEnabled && isEnabled)
236 ui.tableWidget->setCurrentCell(0, 0);
237
238 QMetaObject::invokeMethod(ui.tableWidget, "updateGeometries");
239 ui.tableWidget->viewport()->update();
240}
241
242void TableWidgetEditor::moveColumnsLeft(int fromColumn, int toColumn)
243{
244 if (fromColumn >= toColumn)
245 return;
246
247 QTableWidgetItem *lastItem = ui.tableWidget->takeHorizontalHeaderItem(toColumn);
248 for (int i = toColumn; i > fromColumn; i--) {
249 ui.tableWidget->setHorizontalHeaderItem(i,
250 ui.tableWidget->takeHorizontalHeaderItem(i - 1));
251 }
252 ui.tableWidget->setHorizontalHeaderItem(fromColumn, lastItem);
253
254 for (int i = 0; i < ui.tableWidget->rowCount(); i++) {
255 QTableWidgetItem *lastItem = ui.tableWidget->takeItem(i, toColumn);
256 for (int j = toColumn; j > fromColumn; j--)
257 ui.tableWidget->setItem(i, j, ui.tableWidget->takeItem(i, j - 1));
258 ui.tableWidget->setItem(i, fromColumn, lastItem);
259 }
260}
261
262void TableWidgetEditor::moveColumnsRight(int fromColumn, int toColumn)
263{
264 if (fromColumn >= toColumn)
265 return;
266
267 QTableWidgetItem *lastItem = ui.tableWidget->takeHorizontalHeaderItem(fromColumn);
268 for (int i = fromColumn; i < toColumn; i++) {
269 ui.tableWidget->setHorizontalHeaderItem(i,
270 ui.tableWidget->takeHorizontalHeaderItem(i + 1));
271 }
272 ui.tableWidget->setHorizontalHeaderItem(toColumn, lastItem);
273
274 for (int i = 0; i < ui.tableWidget->rowCount(); i++) {
275 QTableWidgetItem *lastItem = ui.tableWidget->takeItem(i, fromColumn);
276 for (int j = fromColumn; j < toColumn; j++)
277 ui.tableWidget->setItem(i, j, ui.tableWidget->takeItem(i, j + 1));
278 ui.tableWidget->setItem(i, toColumn, lastItem);
279 }
280}
281
282void TableWidgetEditor::moveRowsDown(int fromRow, int toRow)
283{
284 if (fromRow >= toRow)
285 return;
286
287 QTableWidgetItem *lastItem = ui.tableWidget->takeVerticalHeaderItem(toRow);
288 for (int i = toRow; i > fromRow; i--) {
289 ui.tableWidget->setVerticalHeaderItem(i,
290 ui.tableWidget->takeVerticalHeaderItem(i - 1));
291 }
292 ui.tableWidget->setVerticalHeaderItem(fromRow, lastItem);
293
294 for (int i = 0; i < ui.tableWidget->columnCount(); i++) {
295 QTableWidgetItem *lastItem = ui.tableWidget->takeItem(toRow, i);
296 for (int j = toRow; j > fromRow; j--)
297 ui.tableWidget->setItem(j, i, ui.tableWidget->takeItem(j - 1, i));
298 ui.tableWidget->setItem(fromRow, i, lastItem);
299 }
300}
301
302void TableWidgetEditor::moveRowsUp(int fromRow, int toRow)
303{
304 if (fromRow >= toRow)
305 return;
306
307 QTableWidgetItem *lastItem = ui.tableWidget->takeVerticalHeaderItem(fromRow);
308 for (int i = fromRow; i < toRow; i++) {
309 ui.tableWidget->setVerticalHeaderItem(i,
310 ui.tableWidget->takeVerticalHeaderItem(i + 1));
311 }
312 ui.tableWidget->setVerticalHeaderItem(toRow, lastItem);
313
314 for (int i = 0; i < ui.tableWidget->columnCount(); i++) {
315 QTableWidgetItem *lastItem = ui.tableWidget->takeItem(fromRow, i);
316 for (int j = fromRow; j < toRow; j++)
317 ui.tableWidget->setItem(j, i, ui.tableWidget->takeItem(j + 1, i));
318 ui.tableWidget->setItem(toRow, i, lastItem);
319 }
320}
321
322void TableWidgetEditor::columnEditorItemInserted(int idx)
323{
324 const int columnCount = ui.tableWidget->columnCount();
325 ui.tableWidget->setColumnCount(columnCount + 1);
326
327 QTableWidgetItem *newItem = new QTableWidgetItem(m_columnEditor->newItemText());
328 newItem->setData(Qt::DisplayPropertyRole, QVariant::fromValue(PropertySheetStringValue(m_columnEditor->newItemText())));
329 ui.tableWidget->setHorizontalHeaderItem(columnCount, newItem);
330
331 moveColumnsLeft(idx, columnCount);
332
333 int row = ui.tableWidget->currentRow();
334 if (row >= 0)
335 ui.tableWidget->setCurrentCell(row, idx);
336
337 updateEditor();
338}
339
340void TableWidgetEditor::columnEditorItemDeleted(int idx)
341{
342 const int columnCount = ui.tableWidget->columnCount();
343
344 moveColumnsRight(idx, columnCount - 1);
345 ui.tableWidget->setColumnCount(columnCount - 1);
346
347 updateEditor();
348}
349
350void TableWidgetEditor::columnEditorItemMovedUp(int idx)
351{
352 moveColumnsRight(idx - 1, idx);
353
354 ui.tableWidget->setCurrentCell(ui.tableWidget->currentRow(), idx - 1);
355}
356
357void TableWidgetEditor::columnEditorItemMovedDown(int idx)
358{
359 moveColumnsLeft(idx, idx + 1);
360
361 ui.tableWidget->setCurrentCell(ui.tableWidget->currentRow(), idx + 1);
362}
363
364void TableWidgetEditor::rowEditorItemInserted(int idx)
365{
366 const int rowCount = ui.tableWidget->rowCount();
367 ui.tableWidget->setRowCount(rowCount + 1);
368
369 QTableWidgetItem *newItem = new QTableWidgetItem(m_rowEditor->newItemText());
370 newItem->setData(Qt::DisplayPropertyRole, QVariant::fromValue(PropertySheetStringValue(m_rowEditor->newItemText())));
371 ui.tableWidget->setVerticalHeaderItem(rowCount, newItem);
372
373 moveRowsDown(idx, rowCount);
374
375 int col = ui.tableWidget->currentColumn();
376 if (col >= 0)
377 ui.tableWidget->setCurrentCell(idx, col);
378
379 updateEditor();
380}
381
382void TableWidgetEditor::rowEditorItemDeleted(int idx)
383{
384 const int rowCount = ui.tableWidget->rowCount();
385
386 moveRowsUp(idx, rowCount - 1);
387 ui.tableWidget->setRowCount(rowCount - 1);
388
389 updateEditor();
390}
391
392void TableWidgetEditor::rowEditorItemMovedUp(int idx)
393{
394 moveRowsUp(idx - 1, idx);
395
396 ui.tableWidget->setCurrentCell(idx - 1, ui.tableWidget->currentColumn());
397}
398
399void TableWidgetEditor::rowEditorItemMovedDown(int idx)
400{
401 moveRowsDown(idx, idx + 1);
402
403 ui.tableWidget->setCurrentCell(idx + 1, ui.tableWidget->currentColumn());
404}
405
406void TableWidgetEditor::cacheReloaded()
407{
408 reloadIconResources(iconCache(), ui.tableWidget);
409}
410
411TableWidgetEditorDialog::TableWidgetEditorDialog(QDesignerFormWindowInterface *form, QWidget *parent) :
412 QDialog(parent), m_editor(form, this)
413{
414}
415
417{
418 return m_editor.fillContentsFromTableWidget(tableWidget);
419}
420
422{
423 return m_editor.contents();
424}
425
426} // namespace qdesigner_internal
427
428QT_END_NAMESPACE
friend class QWidget
Definition qpainter.h:432
DesignerIconCache * iconCache() const
TableWidgetContents fillContentsFromTableWidget(QTableWidget *tableWidget)
TableWidgetContents fillContentsFromTableWidget(QTableWidget *tableWidget)
QVariant getItemData(int role) const override
Combined button and popup list for selecting options.
Auxiliary methods to store/retrieve settings.
static AbstractItemEditor::PropertyDefinition tableHeaderPropList[]
static AbstractItemEditor::PropertyDefinition tableItemPropList[]