44 #include <QGridLayout>
50 #include <QToolButton>
59 void init(QWidget* parent);
103 void insertRow(QGridLayout* layout,
int row)
const;
104 void removeRow(QGridLayout* layout,
int row)
const;
107 void setExpanded(
WidgetItem* item,
bool expanded);
108 QToolButton* createButton(QWidget* panret = 0)
const;
110 QMap<QtBrowserItem*, WidgetItem*> m_indexToItem;
111 QMap<WidgetItem*, QtBrowserItem*> m_itemToIndex;
112 QMap<QWidget*, WidgetItem*> m_widgetToItem;
113 QMap<QObject*, WidgetItem*> m_buttonToItem;
114 QGridLayout* m_mainLayout;
115 QList<WidgetItem*> m_children;
116 QList<WidgetItem*> m_recreateQueue;
120 QtButtonPropertyBrowserPrivate::createButton(QWidget* parent)
const
122 QToolButton* button =
new QToolButton(parent);
123 button->setCheckable(
true);
124 button->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed));
125 button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
126 button->setArrowType(Qt::DownArrow);
127 button->setIconSize(QSize(3, 16));
138 QtButtonPropertyBrowserPrivate::gridRow(
WidgetItem* item)
const
140 QList<WidgetItem*> siblings;
148 siblings = m_children;
152 QListIterator<WidgetItem*> it(siblings);
156 WidgetItem* sibling = it.next();
163 row += gridSpan(sibling);
170 QtButtonPropertyBrowserPrivate::gridSpan(WidgetItem* item)
const
172 if (item->container && item->expanded)
183 m_mainLayout =
new QGridLayout();
184 parent->setLayout(m_mainLayout);
185 QLayoutItem* item =
new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
186 m_mainLayout->addItem(item, 0, 0);
192 QWidget* editor = qobject_cast<QWidget*>(q_ptr->sender());
199 if (!m_widgetToItem.contains(editor))
204 m_widgetToItem[editor]->widget = 0;
205 m_widgetToItem.remove(editor);
211 QListIterator<WidgetItem*> itItem(m_recreateQueue);
213 while (itItem.hasNext())
220 const int oldRow = gridRow(item);
240 item->
label =
new QLabel(w);
241 item->
label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
242 l->addWidget(item->
label, oldRow, 0, 1, span);
247 m_recreateQueue.clear();
251 QtButtonPropertyBrowserPrivate::setExpanded(WidgetItem* item,
bool expanded)
253 if (item->expanded == expanded)
258 if (!item->container)
263 item->expanded = expanded;
264 const int row = gridRow(item);
265 WidgetItem* parent = item->parent;
279 insertRow(l, row + 1);
280 l->addWidget(item->container, row + 1, 0, 1, 2);
281 item->container->show();
285 l->removeWidget(item->container);
286 item->container->hide();
287 removeRow(l, row + 1);
290 item->button->setChecked(expanded);
291 item->button->setArrowType(expanded ? Qt::UpArrow : Qt::DownArrow);
297 WidgetItem* item = m_buttonToItem.value(q_ptr->sender());
304 setExpanded(item, checked);
308 emit q_ptr->
expanded(m_itemToIndex.value(item));
312 emit q_ptr->
collapsed(m_itemToIndex.value(item));
317 QtButtonPropertyBrowserPrivate::updateLater()
319 QTimer::singleShot(0, q_ptr, SLOT(
slotUpdate()));
325 WidgetItem* afterItem = m_indexToItem.value(afterIndex);
329 newItem->
parent = parentItem;
331 QGridLayout* layout = 0;
332 QWidget* parentWidget = 0;
341 parentItem->
children.insert(0, newItem);
345 m_children.insert(0, newItem);
350 row = gridRow(afterItem) + gridSpan(afterItem);
354 parentItem->
children.insert(parentItem->
children.indexOf(afterItem) + 1, newItem);
358 m_children.insert(m_children.indexOf(afterItem) + 1, newItem);
364 layout = m_mainLayout;
365 parentWidget = q_ptr;
371 m_recreateQueue.removeAll(parentItem);
374 const int oldRow = gridRow(parentItem);
385 QFrame* container =
new QFrame();
386 container->setFrameShape(QFrame::Panel);
387 container->setFrameShadow(QFrame::Raised);
389 parentItem->
button = createButton();
390 m_buttonToItem[parentItem->
button] = parentItem;
393 parentItem->
layout =
new QGridLayout();
394 container->setLayout(parentItem->
layout);
396 if (parentItem->
label)
398 l->removeWidget(parentItem->
label);
399 delete parentItem->
label;
400 parentItem->
label = 0;
410 l->addWidget(parentItem->
button, oldRow, 0, 1, span);
411 updateItem(parentItem);
414 layout = parentItem->
layout;
418 newItem->
label =
new QLabel(parentWidget);
419 newItem->
label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
425 m_widgetToItem[newItem->
widget] = newItem;
427 else if (
index->property()->hasValue())
430 newItem->
widgetLabel->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed));
433 insertRow(layout, row);
438 layout->addWidget(newItem->
widget, row, 1);
449 layout->addWidget(newItem->
label, row, 0, span, 1);
451 m_itemToIndex[newItem] =
index;
452 m_indexToItem[
index] = newItem;
462 m_indexToItem.remove(
index);
463 m_itemToIndex.remove(item);
467 const int row = gridRow(item);
475 m_children.removeAt(m_children.indexOf(item));
478 const int colSpan = gridSpan(item);
480 m_buttonToItem.remove(item->
button);
509 removeRow(m_mainLayout, row);
513 removeRow(m_mainLayout, row);
516 else if (parentItem->
children.count() != 0)
518 removeRow(parentItem->
layout, row);
522 removeRow(parentItem->
layout, row);
539 const int parentRow = gridRow(parentItem);
540 const int parentSpan = gridSpan(parentItem);
542 l->removeWidget(parentItem->
button);
544 delete parentItem->
button;
550 if (!m_recreateQueue.contains(parentItem))
552 m_recreateQueue.append(parentItem);
557 removeRow(l, parentRow + 1);
563 m_recreateQueue.removeAll(item);
569 QtButtonPropertyBrowserPrivate::insertRow(QGridLayout* layout,
int row)
const
571 QMap<QLayoutItem*, QRect> itemToPos;
574 while (idx < layout->count())
577 layout->getItemPosition(idx, &r, &
c, &rs, &cs);
581 itemToPos[layout->takeAt(idx)] = QRect(r + 1,
c, rs, cs);
589 const QMap<QLayoutItem*, QRect>::ConstIterator icend = itemToPos.constEnd();
591 for (QMap<QLayoutItem*, QRect>::ConstIterator it = itemToPos.constBegin(); it != icend; ++it)
593 const QRect r = it.value();
594 layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
599 QtButtonPropertyBrowserPrivate::removeRow(QGridLayout* layout,
int row)
const
601 QMap<QLayoutItem*, QRect> itemToPos;
604 while (idx < layout->count())
607 layout->getItemPosition(idx, &r, &
c, &rs, &cs);
611 itemToPos[layout->takeAt(idx)] = QRect(r - 1,
c, rs, cs);
619 const QMap<QLayoutItem*, QRect>::ConstIterator icend = itemToPos.constEnd();
621 for (QMap<QLayoutItem*, QRect>::ConstIterator it = itemToPos.constBegin(); it != icend; ++it)
623 const QRect r = it.value();
624 layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
637 QtButtonPropertyBrowserPrivate::updateItem(WidgetItem* item)
639 QtProperty*
property = m_itemToIndex[item]->property();
643 QFont font = item->button->font();
644 font.setUnderline(property->isModified());
645 item->button->setFont(font);
646 item->button->setText(property->propertyName());
647 item->button->setToolTip(property->toolTip());
648 item->button->setStatusTip(property->statusTip());
649 item->button->setWhatsThis(property->whatsThis());
650 item->button->setEnabled(property->isEnabled());
655 QFont font = item->label->font();
656 font.setUnderline(property->isModified());
657 item->label->setFont(font);
658 item->label->setText(property->propertyName());
659 item->label->setToolTip(property->toolTip());
660 item->label->setStatusTip(property->statusTip());
661 item->label->setWhatsThis(property->whatsThis());
662 item->label->setEnabled(property->isEnabled());
665 if (item->widgetLabel)
667 QFont font = item->widgetLabel->font();
668 font.setUnderline(
false);
669 item->widgetLabel->setFont(font);
670 item->widgetLabel->setText(property->valueText());
671 item->widgetLabel->setToolTip(property->valueText());
672 item->widgetLabel->setEnabled(property->isEnabled());
677 QFont font = item->widget->font();
678 font.setUnderline(
false);
679 item->widget->setFont(font);
680 item->widget->setEnabled(property->isEnabled());
681 item->widget->setToolTip(property->valueText());
751 const QMap<QtButtonPropertyBrowserPrivate::WidgetItem*, QtBrowserItem*>::ConstIterator icend =
752 d_ptr->m_itemToIndex.constEnd();
754 for (QMap<QtButtonPropertyBrowserPrivate::WidgetItem*, QtBrowserItem*>::ConstIterator it =
755 d_ptr->m_itemToIndex.constBegin();
830 #include "moc_qtbuttonpropertybrowser.cpp"