6#include <formwindowbase_p.h>
7#include <iconloader_p.h>
8#include <qdesigner_command_p.h>
9#include <qdesigner_utils_p.h>
10#include <abstractformbuilder.h>
11#include <designerpropertymanager.h>
12#include <qttreepropertybrowser_p.h>
14#include <QtDesigner/abstractformwindow.h>
15#include <QtDesigner/abstractformeditor.h>
17#include <QtCore/qdir.h>
18#include <QtCore/qqueue.h>
19#include <QtWidgets/qheaderview.h>
20#include <QtWidgets/qtreewidgetitemiterator.h>
24using namespace Qt::StringLiterals;
31 m_columnEditor =
new ItemListEditor(form,
this);
32 m_columnEditor->setObjectName(u"columnEditor"_s);
33 m_columnEditor->setNewItemText(tr(
"New Column"));
36 injectPropertyBrowser(ui.itemsTab, ui.widget);
37 connect(ui.showPropertiesButton, &QAbstractButton::clicked,
39 setPropertyBrowserVisible(
false);
41 ui.tabWidget->insertTab(0, m_columnEditor, tr(
"&Columns"));
42 ui.tabWidget->setCurrentIndex(0);
44 ui.newItemButton->setIcon(createIconSet(
"plus.png"_L1));
45 ui.newSubItemButton->setIcon(createIconSet(
"downplus.png"_L1));
46 ui.deleteItemButton->setIcon(createIconSet(
"minus.png"_L1));
47 ui.moveItemUpButton->setIcon(createIconSet(
"up.png"_L1));
48 ui.moveItemDownButton->setIcon(createIconSet(
"down.png"_L1));
49 ui.moveItemRightButton->setIcon(createIconSet(
"leveldown.png"_L1));
50 ui.moveItemLeftButton->setIcon(createIconSet(
"levelup.png"_L1));
52 ui.treeWidget->header()->setSectionsMovable(
false);
54 connect(ui.newItemButton, &QAbstractButton::clicked,
55 this, &TreeWidgetEditor::newItemButtonClicked);
56 connect(ui.newSubItemButton, &QAbstractButton::clicked,
58 connect(ui.moveItemUpButton, &QAbstractButton::clicked,
60 connect(ui.moveItemDownButton, &QAbstractButton::clicked,
62 connect(ui.moveItemRightButton, &QAbstractButton::clicked,
64 connect(ui.moveItemLeftButton, &QAbstractButton::clicked,
66 connect(ui.deleteItemButton, &QAbstractButton::clicked,
68 connect(ui.treeWidget, &QTreeWidget::currentItemChanged,
70 connect(ui.treeWidget, &QTreeWidget::itemChanged,
73 connect(m_columnEditor, &ItemListEditor::indexChanged,
75 connect(m_columnEditor, &ItemListEditor::itemChanged,
76 this, &TreeWidgetEditor::columnEditorItemChanged);
99 { 0, 0,
nullptr,
nullptr }
113 { 0, 0,
nullptr,
nullptr }
118 { 0, 0,
nullptr,
nullptr }
123 setupProperties(propDefs);
124 QtVariantProperty *groupProp = m_propertyManager->addProperty(QtVariantPropertyManager::groupTypeId(), title);
125 for (QtVariantProperty *prop : std::as_const(m_rootProperties))
126 groupProp->addSubProperty(prop);
127 m_rootProperties.clear();
134 treeCont.fromTreeWidget(treeWidget,
false);
135 treeCont.applyToTreeWidget(ui.treeWidget, iconCache(),
true);
137 treeCont.m_headerItem.applyToListWidget(m_columnEditor->listWidget(), iconCache(),
true);
140 QList<QtVariantProperty*> rootProperties;
143 m_rootProperties = rootProperties;
144 m_propertyBrowser->setPropertiesWithoutValueMarked(
true);
145 m_propertyBrowser->setRootIsDecorated(
false);
146 setupObject(treeWidget);
148 if (ui.treeWidget->topLevelItemCount() > 0)
149 ui.treeWidget->setCurrentItem(ui.treeWidget->topLevelItem(0));
159 retVal.fromTreeWidget(ui.treeWidget,
true);
165 const int col = (role == ItemFlagsShadowRole) ? 0 : ui.treeWidget->currentColumn();
166 QVariant newValue = v;
168 if (role == Qt::FontRole && newValue.metaType().id() == QMetaType::QFont) {
169 QFont oldFont = ui.treeWidget->font();
170 QFont newFont = qvariant_cast<QFont>(newValue).resolve(oldFont);
171 newValue = QVariant::fromValue(newFont);
172 ui.treeWidget->currentItem()->setData(col, role, QVariant());
174 ui.treeWidget->currentItem()->setData(col, role, newValue);
179 const int col = (role == ItemFlagsShadowRole) ? 0 : ui.treeWidget->currentColumn();
180 return ui.treeWidget->currentItem()->data(col, role);
185 static const int flags = QTreeWidgetItem().flags();
191 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
192 QTreeWidgetItem *newItem =
nullptr;
193 ui.treeWidget->blockSignals(
true);
195 if (curItem->parent())
196 newItem =
new QTreeWidgetItem(curItem->parent(), curItem);
198 newItem =
new QTreeWidgetItem(ui.treeWidget, curItem);
200 newItem =
new QTreeWidgetItem(ui.treeWidget);
201 const QString newItemText = tr(
"New Item");
202 newItem->setText(0, newItemText);
203 newItem->setData(0, Qt::DisplayPropertyRole, QVariant::fromValue(PropertySheetStringValue(newItemText)));
204 newItem->setFlags(newItem->flags() | Qt::ItemIsEditable);
205 ui.treeWidget->blockSignals(
false);
207 ui.treeWidget->setCurrentItem(newItem, qMax(ui.treeWidget->currentColumn(), 0));
209 ui.treeWidget->editItem(newItem, ui.treeWidget->currentColumn());
214 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
218 ui.treeWidget->blockSignals(
true);
219 QTreeWidgetItem *newItem =
new QTreeWidgetItem(curItem);
220 const QString newItemText = tr(
"New Subitem");
221 newItem->setText(0, newItemText);
222 newItem->setData(0, Qt::DisplayPropertyRole, QVariant::fromValue(PropertySheetStringValue(newItemText)));
223 newItem->setFlags(newItem->flags() | Qt::ItemIsEditable);
224 ui.treeWidget->blockSignals(
false);
226 ui.treeWidget->setCurrentItem(newItem, ui.treeWidget->currentColumn());
228 ui.treeWidget->editItem(newItem, ui.treeWidget->currentColumn());
233 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
237 QTreeWidgetItem *nextCurrent =
nullptr;
238 if (curItem->parent()) {
239 int idx = curItem->parent()->indexOfChild(curItem);
240 if (idx == curItem->parent()->childCount() - 1)
245 nextCurrent = curItem->parent();
247 nextCurrent = curItem->parent()->child(idx);
249 int idx = ui.treeWidget->indexOfTopLevelItem(curItem);
250 if (idx == ui.treeWidget->topLevelItemCount() - 1)
255 nextCurrent = ui.treeWidget->topLevelItem(idx);
258 ui.treeWidget->blockSignals(
true);
260 ui.treeWidget->blockSignals(
false);
263 ui.treeWidget->setCurrentItem(nextCurrent, ui.treeWidget->currentColumn());
269 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
274 if (curItem->parent())
275 idx = curItem->parent()->indexOfChild(curItem);
277 idx = ui.treeWidget->indexOfTopLevelItem(curItem);
281 QTreeWidgetItem *takenItem;
282 ui.treeWidget->blockSignals(
true);
283 if (curItem->parent()) {
284 QTreeWidgetItem *parentItem = curItem->parent();
285 takenItem = parentItem->takeChild(idx);
286 parentItem->insertChild(idx - 1, takenItem);
288 takenItem = ui.treeWidget->takeTopLevelItem(idx);
289 ui.treeWidget->insertTopLevelItem(idx - 1, takenItem);
291 ui.treeWidget->blockSignals(
false);
293 ui.treeWidget->setCurrentItem(takenItem, ui.treeWidget->currentColumn());
299 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
304 if (curItem->parent()) {
305 idx = curItem->parent()->indexOfChild(curItem);
306 idxCount = curItem->parent()->childCount();
308 idx = ui.treeWidget->indexOfTopLevelItem(curItem);
309 idxCount = ui.treeWidget->topLevelItemCount();
311 if (idx == idxCount - 1)
314 QTreeWidgetItem *takenItem;
315 ui.treeWidget->blockSignals(
true);
316 if (curItem->parent()) {
317 QTreeWidgetItem *parentItem = curItem->parent();
318 takenItem = parentItem->takeChild(idx);
319 parentItem->insertChild(idx + 1, takenItem);
321 takenItem = ui.treeWidget->takeTopLevelItem(idx);
322 ui.treeWidget->insertTopLevelItem(idx + 1, takenItem);
324 ui.treeWidget->blockSignals(
false);
326 ui.treeWidget->setCurrentItem(takenItem, ui.treeWidget->currentColumn());
332 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
336 QTreeWidgetItem *parentItem = curItem->parent();
340 ui.treeWidget->blockSignals(
true);
341 QTreeWidgetItem *takenItem = parentItem->takeChild(parentItem->indexOfChild(curItem));
342 if (parentItem->parent()) {
343 int idx = parentItem->parent()->indexOfChild(parentItem);
344 parentItem->parent()->insertChild(idx, takenItem);
346 int idx = ui.treeWidget->indexOfTopLevelItem(parentItem);
347 ui.treeWidget->insertTopLevelItem(idx, takenItem);
349 ui.treeWidget->blockSignals(
false);
351 ui.treeWidget->setCurrentItem(takenItem, ui.treeWidget->currentColumn());
357 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
362 if (curItem->parent()) {
363 idx = curItem->parent()->indexOfChild(curItem);
364 idxCount = curItem->parent()->childCount();
366 idx = ui.treeWidget->indexOfTopLevelItem(curItem);
367 idxCount = ui.treeWidget->topLevelItemCount();
369 if (idx == idxCount - 1)
372 QTreeWidgetItem *takenItem;
373 ui.treeWidget->blockSignals(
true);
374 if (curItem->parent()) {
375 QTreeWidgetItem *parentItem = curItem->parent()->child(idx + 1);
376 takenItem = curItem->parent()->takeChild(idx);
377 parentItem->insertChild(0, takenItem);
379 QTreeWidgetItem *parentItem = ui.treeWidget->topLevelItem(idx + 1);
380 takenItem = ui.treeWidget->takeTopLevelItem(idx);
381 parentItem->insertChild(0, takenItem);
383 ui.treeWidget->blockSignals(
false);
385 ui.treeWidget->setCurrentItem(takenItem, ui.treeWidget->currentColumn());
391 setPropertyBrowserVisible(!m_propertyBrowser->isVisible());
396 ui.showPropertiesButton->setText(v ? tr(
"Properties &>>") : tr(
"Properties &<<"));
397 m_propertyBrowser->setVisible(v);
406void TreeWidgetEditor::treeWidgetItemChanged(QTreeWidgetItem *item,
int column)
408 if (m_updatingBrowser)
411 PropertySheetStringValue val = qvariant_cast<PropertySheetStringValue>(item->data(column, Qt::DisplayPropertyRole));
412 val.setValue(item->text(column));
414 item->setData(column, Qt::DisplayPropertyRole, QVariant::fromValue(val));
421 if (QTreeWidgetItem *item = ui.treeWidget->currentItem())
422 ui.treeWidget->setCurrentItem(item, idx);
425void TreeWidgetEditor::columnEditorItemChanged(
int idx,
int role,
const QVariant &v)
427 if (role == Qt::DisplayPropertyRole)
428 ui.treeWidget->headerItem()->setData(idx, Qt::EditRole, qvariant_cast<PropertySheetStringValue>(v).value());
429 ui.treeWidget->headerItem()->setData(idx, role, v);
434 QTreeWidgetItem *current = ui.treeWidget->currentItem();
436 bool itemsEnabled =
false;
437 bool currentItemEnabled =
false;
438 bool moveItemUpEnabled =
false;
439 bool moveItemDownEnabled =
false;
440 bool moveItemRightEnabled =
false;
441 bool moveItemLeftEnabled =
false;
443 if (ui.treeWidget->columnCount() > 0) {
448 currentItemEnabled =
true;
449 if (current->parent()) {
450 moveItemLeftEnabled =
true;
451 idx = current->parent()->indexOfChild(current);
452 idxCount = current->parent()->childCount();
454 idx = ui.treeWidget->indexOfTopLevelItem(current);
455 idxCount = ui.treeWidget->topLevelItemCount();
458 moveItemUpEnabled =
true;
459 if (idx < idxCount - 1) {
460 moveItemDownEnabled =
true;
461 moveItemRightEnabled =
true;
465 ui.tabWidget->setTabEnabled(1, itemsEnabled);
466 ui.newSubItemButton->setEnabled(currentItemEnabled);
467 ui.deleteItemButton->setEnabled(currentItemEnabled);
469 ui.moveItemUpButton->setEnabled(moveItemUpEnabled);
470 ui.moveItemDownButton->setEnabled(moveItemDownEnabled);
471 ui.moveItemRightButton->setEnabled(moveItemRightEnabled);
472 ui.moveItemLeftButton->setEnabled(moveItemLeftEnabled);
477 m_propertyBrowser->clear();
481 QTreeWidgetItem *item,
int fromColumn,
int toColumn,
int step)
485 QList<QVariant> saveCol;
486 for (
int j = 0; propList[j]
.name; j++)
487 saveCol.append(item->data(toColumn, propList[j]
.role));
488 QVariant editVariant = item->data(toColumn, Qt::EditRole);
489 QVariant toolTipVariant = item->data(toColumn, Qt::ToolTipRole);
490 QVariant statusTipVariant = item->data(toColumn, Qt::StatusTipRole);
491 QVariant whatsThisVariant = item->data(toColumn, Qt::WhatsThisRole);
492 QVariant decorationVariant = item->data(toColumn, Qt::DecorationRole);
493 for (
int i = toColumn; i != fromColumn; i += step) {
494 for (
int j = 0; propList[j]
.name; j++)
495 item->setData(i, propList[j]
.role, item->data(i + step, propList[j]
.role));
496 item->setData(i, Qt::EditRole, item->data(i + step, Qt::EditRole));
497 item->setData(i, Qt::ToolTipRole, item->data(i + step, Qt::ToolTipRole));
498 item->setData(i, Qt::StatusTipRole, item->data(i + step, Qt::StatusTipRole));
499 item->setData(i, Qt::WhatsThisRole, item->data(i + step, Qt::WhatsThisRole));
500 item->setData(i, Qt::DecorationRole, item->data(i + step, Qt::DecorationRole));
502 for (
int j = 0; propList[j]
.name; j++)
503 item->setData(fromColumn, propList[j]
.role, saveCol[j]);
504 item->setData(fromColumn, Qt::EditRole, editVariant);
505 item->setData(fromColumn, Qt::ToolTipRole, toolTipVariant);
506 item->setData(fromColumn, Qt::StatusTipRole, statusTipVariant);
507 item->setData(fromColumn, Qt::WhatsThisRole, whatsThisVariant);
508 item->setData(fromColumn, Qt::DecorationRole, decorationVariant);
513 ui.treeWidget->blockSignals(
true);
515 moveColumnItems(
treeHeaderPropList, ui.treeWidget->headerItem(), fromColumn, toColumn, step);
517 QQueue<QTreeWidgetItem *> pendingQueue;
518 for (
int i = 0; i < ui.treeWidget->topLevelItemCount(); i++)
519 pendingQueue.enqueue(ui.treeWidget->topLevelItem(i));
521 while (!pendingQueue.isEmpty()) {
522 QTreeWidgetItem *item = pendingQueue.dequeue();
523 for (
int i = 0; i < item->childCount(); i++)
524 pendingQueue.enqueue(item->child(i));
529 ui.treeWidget->blockSignals(
false);
534 if (fromColumn >= toColumn)
537 moveColumns(fromColumn, toColumn, -1);
542 if (fromColumn >= toColumn)
545 moveColumns(toColumn, fromColumn, 1);
550 int columnCount = ui.treeWidget->columnCount();
551 ui.treeWidget->setColumnCount(columnCount + 1);
552 ui.treeWidget->headerItem()->setText(columnCount, m_columnEditor->newItemText());
553 moveColumnsLeft(idx, columnCount);
562 int columnCount = ui.treeWidget->columnCount() - 1;
564 ui.treeWidget->clear();
566 moveColumnsRight(idx, columnCount);
567 ui.treeWidget->setColumnCount(columnCount);
574 moveColumnsRight(idx - 1, idx);
576 ui.treeWidget->setCurrentItem(ui.treeWidget->currentItem(), idx - 1);
582 moveColumnsLeft(idx, idx + 1);
584 ui.treeWidget->setCurrentItem(ui.treeWidget->currentItem(), idx + 1);
590 if (QTreeWidgetItem *cur = ui.treeWidget->currentItem() ) {
591 const int numCols = cur->columnCount ();
592 for (
int i = 0; i < numCols; i++)
593 ui.treeWidget->closePersistentEditor (cur, i);
599 reloadIconResources(
iconCache(), ui.treeWidget);
603 QDialog(parent), m_editor(form,
this)
609 return m_editor.fillContentsFromTreeWidget(treeWidget);
614 return m_editor.contents();
The QtVariantPropertyManager class provides and manages QVariant based properties.
static int flagTypeId()
Returns the type id for a flag property.
The QtVariantProperty class is a convenience class handling QVariant based properties.
DesignerIconCache * iconCache() const
BoolBlocker(bool &b) noexcept
void itemMovedDown(int idx)
void itemInserted(int idx)
void setCurrentIndex(int idx)
void itemMovedUp(int idx)
void itemDeleted(int idx)
Combined button and popup list for selecting options.
Auxiliary methods to store/retrieve settings.
static AbstractItemEditor::PropertyDefinition treeHeaderPropList[]
static AbstractItemEditor::PropertyDefinition treeItemCommonPropList[]
static AbstractItemEditor::PropertyDefinition treeItemColumnPropList[]