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,
37 this, &TreeWidgetEditor::togglePropertyBrowser);
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,
56 this, &TreeWidgetEditor::newSubItemButtonClicked);
57 connect(ui.moveItemUpButton, &QAbstractButton::clicked,
58 this, &TreeWidgetEditor::moveItemUpButtonClicked);
59 connect(ui.moveItemDownButton, &QAbstractButton::clicked,
60 this, &TreeWidgetEditor::moveItemDownButtonClicked);
61 connect(ui.moveItemRightButton, &QAbstractButton::clicked,
62 this, &TreeWidgetEditor::moveItemRightButtonClicked);
63 connect(ui.moveItemLeftButton, &QAbstractButton::clicked,
64 this, &TreeWidgetEditor::moveItemLeftButtonClicked);
65 connect(ui.deleteItemButton, &QAbstractButton::clicked,
66 this, &TreeWidgetEditor::deleteItemButtonClicked);
67 connect(ui.treeWidget, &QTreeWidget::currentItemChanged,
68 this, &TreeWidgetEditor::treeWidgetCurrentItemChanged);
69 connect(ui.treeWidget, &QTreeWidget::itemChanged,
70 this, &TreeWidgetEditor::treeWidgetItemChanged);
72 connect(m_columnEditor, &ItemListEditor::indexChanged,
73 this, &TreeWidgetEditor::columnEditorIndexChanged);
74 connect(m_columnEditor, &ItemListEditor::itemChanged,
75 this, &TreeWidgetEditor::columnEditorItemChanged);
85 connect(iconCache(), &DesignerIconCache::reloaded,
this, &TreeWidgetEditor::cacheReloaded);
98 { 0, 0,
nullptr,
nullptr }
112 { 0, 0,
nullptr,
nullptr }
117 { 0, 0,
nullptr,
nullptr }
122 setupProperties(propDefs);
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;
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());
395 ui.showPropertiesButton->setText(v ? tr(
"Properties &>>") : tr(
"Properties &<<"));
401 m_columnEditor->setCurrentIndex(ui.treeWidget->currentColumn());
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);
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();
void clear()
Removes all the properties from the editor, but does not delete them since they can still be used in ...
void setRootIsDecorated(bool show)
void setPropertiesWithoutValueMarked(bool mark)
The QtVariantPropertyManager class provides and manages QVariant based properties.
static int groupTypeId()
Returns the type id for a group property.
static int flagTypeId()
Returns the type id for a flag property.
The QtVariantProperty class is a convenience class handling QVariant based properties.
QtTreePropertyBrowser * m_propertyBrowser
DesignerPropertyManager * m_propertyManager
BoolBlocker(bool &b) noexcept
void itemMovedDown(int idx)
void itemInserted(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[]