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