5#include <formwindowbase_p.h>
6#include <iconloader_p.h>
7#include <qdesigner_command_p.h>
8#include <qdesigner_utils_p.h>
9#include <abstractformbuilder.h>
10#include <designerpropertymanager.h>
11#include <qttreepropertybrowser_p.h>
13#include <QtDesigner/abstractformwindow.h>
14#include <QtDesigner/abstractformeditor.h>
16#include <QtCore/qdir.h>
17#include <QtCore/qqueue.h>
18#include <QtWidgets/qheaderview.h>
19#include <QtWidgets/qtreewidgetitemiterator.h>
23using namespace Qt::StringLiterals;
30 m_columnEditor =
new ItemListEditor(form,
this);
31 m_columnEditor->setObjectName(u"columnEditor"_s);
32 m_columnEditor->setNewItemText(tr(
"New Column"));
35 injectPropertyBrowser(ui.itemsTab, ui.widget);
36 connect(ui.showPropertiesButton, &QAbstractButton::clicked,
38 setPropertyBrowserVisible(
false);
40 ui.tabWidget->insertTab(0, m_columnEditor, tr(
"&Columns"));
41 ui.tabWidget->setCurrentIndex(0);
43 ui.newItemButton->setIcon(createIconSet(
"plus.png"_L1));
44 ui.newSubItemButton->setIcon(createIconSet(
"downplus.png"_L1));
45 ui.deleteItemButton->setIcon(createIconSet(
"minus.png"_L1));
46 ui.moveItemUpButton->setIcon(createIconSet(
"up.png"_L1));
47 ui.moveItemDownButton->setIcon(createIconSet(
"down.png"_L1));
48 ui.moveItemRightButton->setIcon(createIconSet(
"leveldown.png"_L1));
49 ui.moveItemLeftButton->setIcon(createIconSet(
"levelup.png"_L1));
51 ui.treeWidget->header()->setSectionsMovable(
false);
53 connect(ui.newItemButton, &QAbstractButton::clicked,
54 this, &TreeWidgetEditor::newItemButtonClicked);
55 connect(ui.newSubItemButton, &QAbstractButton::clicked,
57 connect(ui.moveItemUpButton, &QAbstractButton::clicked,
59 connect(ui.moveItemDownButton, &QAbstractButton::clicked,
61 connect(ui.moveItemRightButton, &QAbstractButton::clicked,
63 connect(ui.moveItemLeftButton, &QAbstractButton::clicked,
65 connect(ui.deleteItemButton, &QAbstractButton::clicked,
67 connect(ui.treeWidget, &QTreeWidget::currentItemChanged,
69 connect(ui.treeWidget, &QTreeWidget::itemChanged,
72 connect(m_columnEditor, &ItemListEditor::indexChanged,
74 connect(m_columnEditor, &ItemListEditor::itemChanged,
75 this, &TreeWidgetEditor::columnEditorItemChanged);
98 { 0, 0,
nullptr,
nullptr }
112 { 0, 0,
nullptr,
nullptr }
117 { 0, 0,
nullptr,
nullptr }
122 setupProperties(propDefs);
123 QtVariantProperty *groupProp = m_propertyManager->addProperty(QtVariantPropertyManager::groupTypeId(), title);
124 for (QtVariantProperty *prop : std::as_const(m_rootProperties))
125 groupProp->addSubProperty(prop);
126 m_rootProperties.clear();
133 treeCont.fromTreeWidget(treeWidget,
false);
134 treeCont.applyToTreeWidget(ui.treeWidget, iconCache(),
true);
136 treeCont.m_headerItem.applyToListWidget(m_columnEditor->listWidget(), iconCache(),
true);
139 QList<QtVariantProperty*> rootProperties;
142 m_rootProperties = rootProperties;
143 m_propertyBrowser->setPropertiesWithoutValueMarked(
true);
144 m_propertyBrowser->setRootIsDecorated(
false);
145 setupObject(treeWidget);
147 if (ui.treeWidget->topLevelItemCount() > 0)
148 ui.treeWidget->setCurrentItem(ui.treeWidget->topLevelItem(0));
158 retVal.fromTreeWidget(ui.treeWidget,
true);
164 const int col = (role == ItemFlagsShadowRole) ? 0 : ui.treeWidget->currentColumn();
165 QVariant newValue = v;
167 if (role == Qt::FontRole && newValue.metaType().id() == QMetaType::QFont) {
168 QFont oldFont = ui.treeWidget->font();
169 QFont newFont = qvariant_cast<QFont>(newValue).resolve(oldFont);
170 newValue = QVariant::fromValue(newFont);
171 ui.treeWidget->currentItem()->setData(col, role, QVariant());
173 ui.treeWidget->currentItem()->setData(col, role, newValue);
178 const int col = (role == ItemFlagsShadowRole) ? 0 : ui.treeWidget->currentColumn();
179 return ui.treeWidget->currentItem()->data(col, role);
184 static const int flags = QTreeWidgetItem().flags();
190 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
191 QTreeWidgetItem *newItem =
nullptr;
192 ui.treeWidget->blockSignals(
true);
194 if (curItem->parent())
195 newItem =
new QTreeWidgetItem(curItem->parent(), curItem);
197 newItem =
new QTreeWidgetItem(ui.treeWidget, curItem);
199 newItem =
new QTreeWidgetItem(ui.treeWidget);
200 const QString newItemText = tr(
"New Item");
201 newItem->setText(0, newItemText);
202 newItem->setData(0, Qt::DisplayPropertyRole, QVariant::fromValue(PropertySheetStringValue(newItemText)));
203 newItem->setFlags(newItem->flags() | Qt::ItemIsEditable);
204 ui.treeWidget->blockSignals(
false);
206 ui.treeWidget->setCurrentItem(newItem, qMax(ui.treeWidget->currentColumn(), 0));
208 ui.treeWidget->editItem(newItem, ui.treeWidget->currentColumn());
213 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
217 ui.treeWidget->blockSignals(
true);
218 QTreeWidgetItem *newItem =
new QTreeWidgetItem(curItem);
219 const QString newItemText = tr(
"New Subitem");
220 newItem->setText(0, newItemText);
221 newItem->setData(0, Qt::DisplayPropertyRole, QVariant::fromValue(PropertySheetStringValue(newItemText)));
222 newItem->setFlags(newItem->flags() | Qt::ItemIsEditable);
223 ui.treeWidget->blockSignals(
false);
225 ui.treeWidget->setCurrentItem(newItem, ui.treeWidget->currentColumn());
227 ui.treeWidget->editItem(newItem, ui.treeWidget->currentColumn());
232 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
236 QTreeWidgetItem *nextCurrent =
nullptr;
237 if (curItem->parent()) {
238 int idx = curItem->parent()->indexOfChild(curItem);
239 if (idx == curItem->parent()->childCount() - 1)
244 nextCurrent = curItem->parent();
246 nextCurrent = curItem->parent()->child(idx);
248 int idx = ui.treeWidget->indexOfTopLevelItem(curItem);
249 if (idx == ui.treeWidget->topLevelItemCount() - 1)
254 nextCurrent = ui.treeWidget->topLevelItem(idx);
257 ui.treeWidget->blockSignals(
true);
259 ui.treeWidget->blockSignals(
false);
262 ui.treeWidget->setCurrentItem(nextCurrent, ui.treeWidget->currentColumn());
268 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
273 if (curItem->parent())
274 idx = curItem->parent()->indexOfChild(curItem);
276 idx = ui.treeWidget->indexOfTopLevelItem(curItem);
280 QTreeWidgetItem *takenItem;
281 ui.treeWidget->blockSignals(
true);
282 if (curItem->parent()) {
283 QTreeWidgetItem *parentItem = curItem->parent();
284 takenItem = parentItem->takeChild(idx);
285 parentItem->insertChild(idx - 1, takenItem);
287 takenItem = ui.treeWidget->takeTopLevelItem(idx);
288 ui.treeWidget->insertTopLevelItem(idx - 1, takenItem);
290 ui.treeWidget->blockSignals(
false);
292 ui.treeWidget->setCurrentItem(takenItem, ui.treeWidget->currentColumn());
298 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
303 if (curItem->parent()) {
304 idx = curItem->parent()->indexOfChild(curItem);
305 idxCount = curItem->parent()->childCount();
307 idx = ui.treeWidget->indexOfTopLevelItem(curItem);
308 idxCount = ui.treeWidget->topLevelItemCount();
310 if (idx == idxCount - 1)
313 QTreeWidgetItem *takenItem;
314 ui.treeWidget->blockSignals(
true);
315 if (curItem->parent()) {
316 QTreeWidgetItem *parentItem = curItem->parent();
317 takenItem = parentItem->takeChild(idx);
318 parentItem->insertChild(idx + 1, takenItem);
320 takenItem = ui.treeWidget->takeTopLevelItem(idx);
321 ui.treeWidget->insertTopLevelItem(idx + 1, takenItem);
323 ui.treeWidget->blockSignals(
false);
325 ui.treeWidget->setCurrentItem(takenItem, ui.treeWidget->currentColumn());
331 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
335 QTreeWidgetItem *parentItem = curItem->parent();
339 ui.treeWidget->blockSignals(
true);
340 QTreeWidgetItem *takenItem = parentItem->takeChild(parentItem->indexOfChild(curItem));
341 if (parentItem->parent()) {
342 int idx = parentItem->parent()->indexOfChild(parentItem);
343 parentItem->parent()->insertChild(idx, takenItem);
345 int idx = ui.treeWidget->indexOfTopLevelItem(parentItem);
346 ui.treeWidget->insertTopLevelItem(idx, takenItem);
348 ui.treeWidget->blockSignals(
false);
350 ui.treeWidget->setCurrentItem(takenItem, ui.treeWidget->currentColumn());
356 QTreeWidgetItem *curItem = ui.treeWidget->currentItem();
361 if (curItem->parent()) {
362 idx = curItem->parent()->indexOfChild(curItem);
363 idxCount = curItem->parent()->childCount();
365 idx = ui.treeWidget->indexOfTopLevelItem(curItem);
366 idxCount = ui.treeWidget->topLevelItemCount();
368 if (idx == idxCount - 1)
371 QTreeWidgetItem *takenItem;
372 ui.treeWidget->blockSignals(
true);
373 if (curItem->parent()) {
374 QTreeWidgetItem *parentItem = curItem->parent()->child(idx + 1);
375 takenItem = curItem->parent()->takeChild(idx);
376 parentItem->insertChild(0, takenItem);
378 QTreeWidgetItem *parentItem = ui.treeWidget->topLevelItem(idx + 1);
379 takenItem = ui.treeWidget->takeTopLevelItem(idx);
380 parentItem->insertChild(0, takenItem);
382 ui.treeWidget->blockSignals(
false);
384 ui.treeWidget->setCurrentItem(takenItem, ui.treeWidget->currentColumn());
390 setPropertyBrowserVisible(!m_propertyBrowser->isVisible());
395 ui.showPropertiesButton->setText(v ? tr(
"Properties &>>") : tr(
"Properties &<<"));
396 m_propertyBrowser->setVisible(v);
405void TreeWidgetEditor::treeWidgetItemChanged(QTreeWidgetItem *item,
int column)
407 if (m_updatingBrowser)
410 PropertySheetStringValue val = qvariant_cast<PropertySheetStringValue>(item->data(column, Qt::DisplayPropertyRole));
411 val.setValue(item->text(column));
413 item->setData(column, Qt::DisplayPropertyRole, QVariant::fromValue(val));
420 if (QTreeWidgetItem *item = ui.treeWidget->currentItem())
421 ui.treeWidget->setCurrentItem(item, idx);
424void TreeWidgetEditor::columnEditorItemChanged(
int idx,
int role,
const QVariant &v)
426 if (role == Qt::DisplayPropertyRole)
427 ui.treeWidget->headerItem()->setData(idx, Qt::EditRole, qvariant_cast<PropertySheetStringValue>(v).value());
428 ui.treeWidget->headerItem()->setData(idx, role, v);
433 QTreeWidgetItem *current = ui.treeWidget->currentItem();
435 bool itemsEnabled =
false;
436 bool currentItemEnabled =
false;
437 bool moveItemUpEnabled =
false;
438 bool moveItemDownEnabled =
false;
439 bool moveItemRightEnabled =
false;
440 bool moveItemLeftEnabled =
false;
442 if (ui.treeWidget->columnCount() > 0) {
447 currentItemEnabled =
true;
448 if (current->parent()) {
449 moveItemLeftEnabled =
true;
450 idx = current->parent()->indexOfChild(current);
451 idxCount = current->parent()->childCount();
453 idx = ui.treeWidget->indexOfTopLevelItem(current);
454 idxCount = ui.treeWidget->topLevelItemCount();
457 moveItemUpEnabled =
true;
458 if (idx < idxCount - 1) {
459 moveItemDownEnabled =
true;
460 moveItemRightEnabled =
true;
464 ui.tabWidget->setTabEnabled(1, itemsEnabled);
465 ui.newSubItemButton->setEnabled(currentItemEnabled);
466 ui.deleteItemButton->setEnabled(currentItemEnabled);
468 ui.moveItemUpButton->setEnabled(moveItemUpEnabled);
469 ui.moveItemDownButton->setEnabled(moveItemDownEnabled);
470 ui.moveItemRightButton->setEnabled(moveItemRightEnabled);
471 ui.moveItemLeftButton->setEnabled(moveItemLeftEnabled);
476 m_propertyBrowser->clear();
480 QTreeWidgetItem *item,
int fromColumn,
int toColumn,
int step)
484 QList<QVariant> saveCol;
485 for (
int j = 0; propList[j]
.name; j++)
486 saveCol.append(item->data(toColumn, propList[j]
.role));
487 QVariant editVariant = item->data(toColumn, Qt::EditRole);
488 QVariant toolTipVariant = item->data(toColumn, Qt::ToolTipRole);
489 QVariant statusTipVariant = item->data(toColumn, Qt::StatusTipRole);
490 QVariant whatsThisVariant = item->data(toColumn, Qt::WhatsThisRole);
491 QVariant decorationVariant = item->data(toColumn, Qt::DecorationRole);
492 for (
int i = toColumn; i != fromColumn; i += step) {
493 for (
int j = 0; propList[j]
.name; j++)
494 item->setData(i, propList[j]
.role, item->data(i + step, propList[j]
.role));
495 item->setData(i, Qt::EditRole, item->data(i + step, Qt::EditRole));
496 item->setData(i, Qt::ToolTipRole, item->data(i + step, Qt::ToolTipRole));
497 item->setData(i, Qt::StatusTipRole, item->data(i + step, Qt::StatusTipRole));
498 item->setData(i, Qt::WhatsThisRole, item->data(i + step, Qt::WhatsThisRole));
499 item->setData(i, Qt::DecorationRole, item->data(i + step, Qt::DecorationRole));
501 for (
int j = 0; propList[j]
.name; j++)
502 item->setData(fromColumn, propList[j]
.role, saveCol[j]);
503 item->setData(fromColumn, Qt::EditRole, editVariant);
504 item->setData(fromColumn, Qt::ToolTipRole, toolTipVariant);
505 item->setData(fromColumn, Qt::StatusTipRole, statusTipVariant);
506 item->setData(fromColumn, Qt::WhatsThisRole, whatsThisVariant);
507 item->setData(fromColumn, Qt::DecorationRole, decorationVariant);
512 ui.treeWidget->blockSignals(
true);
514 moveColumnItems(
treeHeaderPropList, ui.treeWidget->headerItem(), fromColumn, toColumn, step);
516 QQueue<QTreeWidgetItem *> pendingQueue;
517 for (
int i = 0; i < ui.treeWidget->topLevelItemCount(); i++)
518 pendingQueue.enqueue(ui.treeWidget->topLevelItem(i));
520 while (!pendingQueue.isEmpty()) {
521 QTreeWidgetItem *item = pendingQueue.dequeue();
522 for (
int i = 0; i < item->childCount(); i++)
523 pendingQueue.enqueue(item->child(i));
528 ui.treeWidget->blockSignals(
false);
533 if (fromColumn >= toColumn)
536 moveColumns(fromColumn, toColumn, -1);
541 if (fromColumn >= toColumn)
544 moveColumns(toColumn, fromColumn, 1);
549 int columnCount = ui.treeWidget->columnCount();
550 ui.treeWidget->setColumnCount(columnCount + 1);
551 ui.treeWidget->headerItem()->setText(columnCount, m_columnEditor->newItemText());
552 moveColumnsLeft(idx, columnCount);
561 int columnCount = ui.treeWidget->columnCount() - 1;
563 ui.treeWidget->clear();
565 moveColumnsRight(idx, columnCount);
566 ui.treeWidget->setColumnCount(columnCount);
573 moveColumnsRight(idx - 1, idx);
575 ui.treeWidget->setCurrentItem(ui.treeWidget->currentItem(), idx - 1);
581 moveColumnsLeft(idx, idx + 1);
583 ui.treeWidget->setCurrentItem(ui.treeWidget->currentItem(), idx + 1);
589 if (QTreeWidgetItem *cur = ui.treeWidget->currentItem() ) {
590 const int numCols = cur->columnCount ();
591 for (
int i = 0; i < numCols; i++)
592 ui.treeWidget->closePersistentEditor (cur, i);
598 reloadIconResources(
iconCache(), ui.treeWidget);
602 QDialog(parent), m_editor(form,
this)
608 return m_editor.fillContentsFromTreeWidget(treeWidget);
613 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[]