tools/shared/qtpropertybrowser/qtbuttonpropertybrowser.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the tools applications of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qtbuttonpropertybrowser.h"
       
    43 #include <QtCore/QSet>
       
    44 #include <QtGui/QGridLayout>
       
    45 #include <QtGui/QLabel>
       
    46 #include <QtCore/QTimer>
       
    47 #include <QtCore/QMap>
       
    48 #include <QtGui/QToolButton>
       
    49 #include <QtGui/QStyle>
       
    50 
       
    51 QT_BEGIN_NAMESPACE
       
    52 
       
    53 class QtButtonPropertyBrowserPrivate
       
    54 {
       
    55     QtButtonPropertyBrowser *q_ptr;
       
    56     Q_DECLARE_PUBLIC(QtButtonPropertyBrowser)
       
    57 public:
       
    58 
       
    59     void init(QWidget *parent);
       
    60 
       
    61     void propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex);
       
    62     void propertyRemoved(QtBrowserItem *index);
       
    63     void propertyChanged(QtBrowserItem *index);
       
    64     QWidget *createEditor(QtProperty *property, QWidget *parent) const
       
    65         { return q_ptr->createEditor(property, parent); }
       
    66 
       
    67     void slotEditorDestroyed();
       
    68     void slotUpdate();
       
    69     void slotToggled(bool checked);
       
    70 
       
    71     struct WidgetItem
       
    72     {
       
    73         WidgetItem() : widget(0), label(0), widgetLabel(0),
       
    74                 button(0), container(0), layout(0), /*line(0), */parent(0), expanded(false) { }
       
    75         QWidget *widget; // can be null
       
    76         QLabel *label; // main label with property name
       
    77         QLabel *widgetLabel; // label substitute showing the current value if there is no widget
       
    78         QToolButton *button; // expandable button for items with children
       
    79         QWidget *container; // container which is expanded when the button is clicked
       
    80         QGridLayout *layout; // layout in container
       
    81         WidgetItem *parent;
       
    82         QList<WidgetItem *> children;
       
    83         bool expanded;
       
    84     };
       
    85 private:
       
    86     void updateLater();
       
    87     void updateItem(WidgetItem *item);
       
    88     void insertRow(QGridLayout *layout, int row) const;
       
    89     void removeRow(QGridLayout *layout, int row) const;
       
    90     int gridRow(WidgetItem *item) const;
       
    91     int gridSpan(WidgetItem *item) const;
       
    92     void setExpanded(WidgetItem *item, bool expanded);
       
    93     QToolButton *createButton(QWidget *panret = 0) const;
       
    94 
       
    95     QMap<QtBrowserItem *, WidgetItem *> m_indexToItem;
       
    96     QMap<WidgetItem *, QtBrowserItem *> m_itemToIndex;
       
    97     QMap<QWidget *, WidgetItem *> m_widgetToItem;
       
    98     QMap<QObject *, WidgetItem *> m_buttonToItem;
       
    99     QGridLayout *m_mainLayout;
       
   100     QList<WidgetItem *> m_children;
       
   101     QList<WidgetItem *> m_recreateQueue;
       
   102 };
       
   103 
       
   104 QToolButton *QtButtonPropertyBrowserPrivate::createButton(QWidget *parent) const
       
   105 {
       
   106     QToolButton *button = new QToolButton(parent);
       
   107     button->setCheckable(true);
       
   108     button->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed));
       
   109     button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
       
   110     button->setArrowType(Qt::DownArrow);
       
   111     button->setIconSize(QSize(3, 16));
       
   112     /*
       
   113     QIcon icon;
       
   114     icon.addPixmap(q_ptr->style()->standardPixmap(QStyle::SP_ArrowDown), QIcon::Normal, QIcon::Off);
       
   115     icon.addPixmap(q_ptr->style()->standardPixmap(QStyle::SP_ArrowUp), QIcon::Normal, QIcon::On);
       
   116     button->setIcon(icon);
       
   117     */
       
   118     return button;
       
   119 }
       
   120 
       
   121 int QtButtonPropertyBrowserPrivate::gridRow(WidgetItem *item) const
       
   122 {
       
   123     QList<WidgetItem *> siblings;
       
   124     if (item->parent)
       
   125         siblings = item->parent->children;
       
   126     else
       
   127         siblings = m_children;
       
   128 
       
   129     int row = 0;
       
   130     QListIterator<WidgetItem *> it(siblings);
       
   131     while (it.hasNext()) {
       
   132         WidgetItem *sibling = it.next();
       
   133         if (sibling == item)
       
   134             return row;
       
   135         row += gridSpan(sibling);
       
   136     }
       
   137     return -1;
       
   138 }
       
   139 
       
   140 int QtButtonPropertyBrowserPrivate::gridSpan(WidgetItem *item) const
       
   141 {
       
   142     if (item->container && item->expanded)
       
   143         return 2;
       
   144     return 1;
       
   145 }
       
   146 
       
   147 void QtButtonPropertyBrowserPrivate::init(QWidget *parent)
       
   148 {
       
   149     m_mainLayout = new QGridLayout();
       
   150     parent->setLayout(m_mainLayout);
       
   151     QLayoutItem *item = new QSpacerItem(0, 0,
       
   152                 QSizePolicy::Fixed, QSizePolicy::Expanding);
       
   153     m_mainLayout->addItem(item, 0, 0);
       
   154 }
       
   155 
       
   156 void QtButtonPropertyBrowserPrivate::slotEditorDestroyed()
       
   157 {
       
   158     QWidget *editor = qobject_cast<QWidget *>(q_ptr->sender());
       
   159     if (!editor)
       
   160         return;
       
   161     if (!m_widgetToItem.contains(editor))
       
   162         return;
       
   163     m_widgetToItem[editor]->widget = 0;
       
   164     m_widgetToItem.remove(editor);
       
   165 }
       
   166 
       
   167 void QtButtonPropertyBrowserPrivate::slotUpdate()
       
   168 {
       
   169     QListIterator<WidgetItem *> itItem(m_recreateQueue);
       
   170     while (itItem.hasNext()) {
       
   171         WidgetItem *item = itItem.next();
       
   172 
       
   173         WidgetItem *parent = item->parent;
       
   174         QWidget *w = 0;
       
   175         QGridLayout *l = 0;
       
   176         const int oldRow = gridRow(item);
       
   177         if (parent) {
       
   178             w = parent->container;
       
   179             l = parent->layout;
       
   180         } else {
       
   181             w = q_ptr;
       
   182             l = m_mainLayout;
       
   183         }
       
   184 
       
   185         int span = 1;
       
   186         if (!item->widget && !item->widgetLabel)
       
   187             span = 2;
       
   188         item->label = new QLabel(w);
       
   189         item->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
       
   190         l->addWidget(item->label, oldRow, 0, 1, span);
       
   191 
       
   192         updateItem(item);
       
   193     }
       
   194     m_recreateQueue.clear();
       
   195 }
       
   196 
       
   197 void QtButtonPropertyBrowserPrivate::setExpanded(WidgetItem *item, bool expanded)
       
   198 {
       
   199     if (item->expanded == expanded)
       
   200         return;
       
   201 
       
   202     if (!item->container)
       
   203         return;
       
   204 
       
   205     item->expanded = expanded;
       
   206     const int row = gridRow(item);
       
   207     WidgetItem *parent = item->parent;
       
   208     QGridLayout *l = 0;
       
   209     if (parent)
       
   210         l = parent->layout;
       
   211     else
       
   212         l = m_mainLayout;
       
   213 
       
   214     if (expanded) {
       
   215         insertRow(l, row + 1);
       
   216         l->addWidget(item->container, row + 1, 0, 1, 2);
       
   217         item->container->show();
       
   218     } else {
       
   219         l->removeWidget(item->container);
       
   220         item->container->hide();
       
   221         removeRow(l, row + 1);
       
   222     }
       
   223 
       
   224     item->button->setChecked(expanded);
       
   225     item->button->setArrowType(expanded ? Qt::UpArrow : Qt::DownArrow);
       
   226 }
       
   227 
       
   228 void QtButtonPropertyBrowserPrivate::slotToggled(bool checked)
       
   229 {
       
   230     WidgetItem *item = m_buttonToItem.value(q_ptr->sender());
       
   231     if (!item)
       
   232         return;
       
   233 
       
   234     setExpanded(item, checked);
       
   235 
       
   236     if (checked)
       
   237         emit q_ptr->expanded(m_itemToIndex.value(item));
       
   238     else
       
   239         emit q_ptr->collapsed(m_itemToIndex.value(item));
       
   240 }
       
   241 
       
   242 void QtButtonPropertyBrowserPrivate::updateLater()
       
   243 {
       
   244     QTimer::singleShot(0, q_ptr, SLOT(slotUpdate()));
       
   245 }
       
   246 
       
   247 void QtButtonPropertyBrowserPrivate::propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex)
       
   248 {
       
   249     WidgetItem *afterItem = m_indexToItem.value(afterIndex);
       
   250     WidgetItem *parentItem = m_indexToItem.value(index->parent());
       
   251 
       
   252     WidgetItem *newItem = new WidgetItem();
       
   253     newItem->parent = parentItem;
       
   254 
       
   255     QGridLayout *layout = 0;
       
   256     QWidget *parentWidget = 0;
       
   257     int row = -1;
       
   258     if (!afterItem) {
       
   259         row = 0;
       
   260         if (parentItem)
       
   261             parentItem->children.insert(0, newItem);
       
   262         else
       
   263             m_children.insert(0, newItem);
       
   264     } else {
       
   265         row = gridRow(afterItem) + gridSpan(afterItem);
       
   266         if (parentItem)
       
   267             parentItem->children.insert(parentItem->children.indexOf(afterItem) + 1, newItem);
       
   268         else
       
   269             m_children.insert(m_children.indexOf(afterItem) + 1, newItem);
       
   270     }
       
   271 
       
   272     if (!parentItem) {
       
   273         layout = m_mainLayout;
       
   274         parentWidget = q_ptr;
       
   275     } else {
       
   276         if (!parentItem->container) {
       
   277             m_recreateQueue.removeAll(parentItem);
       
   278             WidgetItem *grandParent = parentItem->parent;
       
   279             QWidget *w = 0;
       
   280             QGridLayout *l = 0;
       
   281             const int oldRow = gridRow(parentItem);
       
   282             if (grandParent) {
       
   283                 w = grandParent->container;
       
   284                 l = grandParent->layout;
       
   285             } else {
       
   286                 w = q_ptr;
       
   287                 l = m_mainLayout;
       
   288             }
       
   289             QFrame *container = new QFrame();
       
   290             container->setFrameShape(QFrame::Panel);
       
   291             container->setFrameShadow(QFrame::Raised);
       
   292             parentItem->container = container;
       
   293             parentItem->button = createButton();
       
   294             m_buttonToItem[parentItem->button] = parentItem;
       
   295             q_ptr->connect(parentItem->button, SIGNAL(toggled(bool)), q_ptr, SLOT(slotToggled(bool)));
       
   296             parentItem->layout = new QGridLayout();
       
   297             container->setLayout(parentItem->layout);
       
   298             if (parentItem->label) {
       
   299                 l->removeWidget(parentItem->label);
       
   300                 delete parentItem->label;
       
   301                 parentItem->label = 0;
       
   302             }
       
   303             int span = 1;
       
   304             if (!parentItem->widget && !parentItem->widgetLabel)
       
   305                 span = 2;
       
   306             l->addWidget(parentItem->button, oldRow, 0, 1, span);
       
   307             updateItem(parentItem);
       
   308         }
       
   309         layout = parentItem->layout;
       
   310         parentWidget = parentItem->container;
       
   311     }
       
   312 
       
   313     newItem->label = new QLabel(parentWidget);
       
   314     newItem->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
       
   315     newItem->widget = createEditor(index->property(), parentWidget);
       
   316     if (newItem->widget) {
       
   317         QObject::connect(newItem->widget, SIGNAL(destroyed()), q_ptr, SLOT(slotEditorDestroyed()));
       
   318         m_widgetToItem[newItem->widget] = newItem;
       
   319     } else if (index->property()->hasValue()) {
       
   320         newItem->widgetLabel = new QLabel(parentWidget);
       
   321         newItem->widgetLabel->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed));
       
   322     }
       
   323 
       
   324     insertRow(layout, row);
       
   325     int span = 1;
       
   326     if (newItem->widget)
       
   327         layout->addWidget(newItem->widget, row, 1);
       
   328     else if (newItem->widgetLabel)
       
   329         layout->addWidget(newItem->widgetLabel, row, 1);
       
   330     else
       
   331         span = 2;
       
   332     layout->addWidget(newItem->label, row, 0, span, 1);
       
   333 
       
   334     m_itemToIndex[newItem] = index;
       
   335     m_indexToItem[index] = newItem;
       
   336 
       
   337     updateItem(newItem);
       
   338 }
       
   339 
       
   340 void QtButtonPropertyBrowserPrivate::propertyRemoved(QtBrowserItem *index)
       
   341 {
       
   342     WidgetItem *item = m_indexToItem.value(index);
       
   343 
       
   344     m_indexToItem.remove(index);
       
   345     m_itemToIndex.remove(item);
       
   346 
       
   347     WidgetItem *parentItem = item->parent;
       
   348 
       
   349     const int row = gridRow(item);
       
   350 
       
   351     if (parentItem)
       
   352         parentItem->children.removeAt(parentItem->children.indexOf(item));
       
   353     else
       
   354         m_children.removeAt(m_children.indexOf(item));
       
   355 
       
   356     const int colSpan = gridSpan(item);
       
   357 
       
   358     m_buttonToItem.remove(item->button);
       
   359 
       
   360     if (item->widget)
       
   361         delete item->widget;
       
   362     if (item->label)
       
   363         delete item->label;
       
   364     if (item->widgetLabel)
       
   365         delete item->widgetLabel;
       
   366     if (item->button)
       
   367         delete item->button;
       
   368     if (item->container)
       
   369         delete item->container;
       
   370 
       
   371     if (!parentItem) {
       
   372         removeRow(m_mainLayout, row);
       
   373         if (colSpan > 1)
       
   374             removeRow(m_mainLayout, row);
       
   375     } else if (parentItem->children.count() != 0) {
       
   376         removeRow(parentItem->layout, row);
       
   377         if (colSpan > 1)
       
   378             removeRow(parentItem->layout, row);
       
   379     } else {
       
   380         const WidgetItem *grandParent = parentItem->parent;
       
   381         QGridLayout *l = 0;
       
   382         if (grandParent) {
       
   383             l = grandParent->layout;
       
   384         } else {
       
   385             l = m_mainLayout;
       
   386         }
       
   387 
       
   388         const int parentRow = gridRow(parentItem);
       
   389         const int parentSpan = gridSpan(parentItem);
       
   390 
       
   391         l->removeWidget(parentItem->button);
       
   392         l->removeWidget(parentItem->container);
       
   393         delete parentItem->button;
       
   394         delete parentItem->container;
       
   395         parentItem->button = 0;
       
   396         parentItem->container = 0;
       
   397         parentItem->layout = 0;
       
   398         if (!m_recreateQueue.contains(parentItem))
       
   399             m_recreateQueue.append(parentItem);
       
   400         if (parentSpan > 1)
       
   401             removeRow(l, parentRow + 1);
       
   402 
       
   403         updateLater();
       
   404     }
       
   405     m_recreateQueue.removeAll(item);
       
   406 
       
   407     delete item;
       
   408 }
       
   409 
       
   410 void QtButtonPropertyBrowserPrivate::insertRow(QGridLayout *layout, int row) const
       
   411 {
       
   412     QMap<QLayoutItem *, QRect> itemToPos;
       
   413     int idx = 0;
       
   414     while (idx < layout->count()) {
       
   415         int r, c, rs, cs;
       
   416         layout->getItemPosition(idx, &r, &c, &rs, &cs);
       
   417         if (r >= row) {
       
   418             itemToPos[layout->takeAt(idx)] = QRect(r + 1, c, rs, cs);
       
   419         } else {
       
   420             idx++;
       
   421         }
       
   422     }
       
   423 
       
   424     const QMap<QLayoutItem *, QRect>::ConstIterator icend =  itemToPos.constEnd();
       
   425     for(QMap<QLayoutItem *, QRect>::ConstIterator it = itemToPos.constBegin(); it != icend; ++it) {
       
   426         const QRect r = it.value();
       
   427         layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
       
   428     }
       
   429 }
       
   430 
       
   431 void QtButtonPropertyBrowserPrivate::removeRow(QGridLayout *layout, int row) const
       
   432 {
       
   433     QMap<QLayoutItem *, QRect> itemToPos;
       
   434     int idx = 0;
       
   435     while (idx < layout->count()) {
       
   436         int r, c, rs, cs;
       
   437         layout->getItemPosition(idx, &r, &c, &rs, &cs);
       
   438         if (r > row) {
       
   439             itemToPos[layout->takeAt(idx)] = QRect(r - 1, c, rs, cs);
       
   440         } else {
       
   441             idx++;
       
   442         }
       
   443     }
       
   444 
       
   445     const QMap<QLayoutItem *, QRect>::ConstIterator icend =  itemToPos.constEnd();
       
   446     for(QMap<QLayoutItem *, QRect>::ConstIterator it = itemToPos.constBegin(); it != icend; ++it) {
       
   447         const QRect r = it.value();
       
   448         layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
       
   449     }
       
   450 }
       
   451 
       
   452 void QtButtonPropertyBrowserPrivate::propertyChanged(QtBrowserItem *index)
       
   453 {
       
   454     WidgetItem *item = m_indexToItem.value(index);
       
   455 
       
   456     updateItem(item);
       
   457 }
       
   458 
       
   459 void QtButtonPropertyBrowserPrivate::updateItem(WidgetItem *item)
       
   460 {
       
   461     QtProperty *property = m_itemToIndex[item]->property();
       
   462     if (item->button) {
       
   463         QFont font = item->button->font();
       
   464         font.setUnderline(property->isModified());
       
   465         item->button->setFont(font);
       
   466         item->button->setText(property->propertyName());
       
   467         item->button->setToolTip(property->toolTip());
       
   468         item->button->setStatusTip(property->statusTip());
       
   469         item->button->setWhatsThis(property->whatsThis());
       
   470         item->button->setEnabled(property->isEnabled());
       
   471     }
       
   472     if (item->label) {
       
   473         QFont font = item->label->font();
       
   474         font.setUnderline(property->isModified());
       
   475         item->label->setFont(font);
       
   476         item->label->setText(property->propertyName());
       
   477         item->label->setToolTip(property->toolTip());
       
   478         item->label->setStatusTip(property->statusTip());
       
   479         item->label->setWhatsThis(property->whatsThis());
       
   480         item->label->setEnabled(property->isEnabled());
       
   481     }
       
   482     if (item->widgetLabel) {
       
   483         QFont font = item->widgetLabel->font();
       
   484         font.setUnderline(false);
       
   485         item->widgetLabel->setFont(font);
       
   486         item->widgetLabel->setText(property->valueText());
       
   487         item->widgetLabel->setToolTip(property->valueText());
       
   488         item->widgetLabel->setEnabled(property->isEnabled());
       
   489     }
       
   490     if (item->widget) {
       
   491         QFont font = item->widget->font();
       
   492         font.setUnderline(false);
       
   493         item->widget->setFont(font);
       
   494         item->widget->setEnabled(property->isEnabled());
       
   495         item->widget->setToolTip(property->valueText());
       
   496     }
       
   497 }
       
   498 
       
   499 
       
   500 
       
   501 /*!
       
   502     \class QtButtonPropertyBrowser
       
   503     \internal
       
   504     \inmodule QtDesigner
       
   505     \since 4.4
       
   506 
       
   507     \brief The QtButtonPropertyBrowser class provides a drop down QToolButton
       
   508     based property browser.
       
   509 
       
   510     A property browser is a widget that enables the user to edit a
       
   511     given set of properties. Each property is represented by a label
       
   512     specifying the property's name, and an editing widget (e.g. a line
       
   513     edit or a combobox) holding its value. A property can have zero or
       
   514     more subproperties.
       
   515 
       
   516     QtButtonPropertyBrowser provides drop down button for all nested
       
   517     properties, i.e. subproperties are enclosed by a container associated with
       
   518     the drop down button. The parent property's name is displayed as button text. For example:
       
   519 
       
   520     \image qtbuttonpropertybrowser.png
       
   521 
       
   522     Use the QtAbstractPropertyBrowser API to add, insert and remove
       
   523     properties from an instance of the QtButtonPropertyBrowser
       
   524     class. The properties themselves are created and managed by
       
   525     implementations of the QtAbstractPropertyManager class.
       
   526 
       
   527     \sa QtTreePropertyBrowser, QtAbstractPropertyBrowser
       
   528 */
       
   529 
       
   530 /*!
       
   531     \fn void QtButtonPropertyBrowser::collapsed(QtBrowserItem *item)
       
   532 
       
   533     This signal is emitted when the \a item is collapsed.
       
   534 
       
   535     \sa expanded(), setExpanded()
       
   536 */
       
   537 
       
   538 /*!
       
   539     \fn void QtButtonPropertyBrowser::expanded(QtBrowserItem *item)
       
   540 
       
   541     This signal is emitted when the \a item is expanded.
       
   542 
       
   543     \sa collapsed(), setExpanded()
       
   544 */
       
   545 
       
   546 /*!
       
   547     Creates a property browser with the given \a parent.
       
   548 */
       
   549 QtButtonPropertyBrowser::QtButtonPropertyBrowser(QWidget *parent)
       
   550     : QtAbstractPropertyBrowser(parent), d_ptr(new QtButtonPropertyBrowserPrivate)
       
   551 {
       
   552     d_ptr->q_ptr = this;
       
   553 
       
   554     d_ptr->init(this);
       
   555 }
       
   556 
       
   557 /*!
       
   558     Destroys this property browser.
       
   559 
       
   560     Note that the properties that were inserted into this browser are
       
   561     \e not destroyed since they may still be used in other
       
   562     browsers. The properties are owned by the manager that created
       
   563     them.
       
   564 
       
   565     \sa QtProperty, QtAbstractPropertyManager
       
   566 */
       
   567 QtButtonPropertyBrowser::~QtButtonPropertyBrowser()
       
   568 {
       
   569     const QMap<QtButtonPropertyBrowserPrivate::WidgetItem *, QtBrowserItem *>::ConstIterator icend = d_ptr->m_itemToIndex.constEnd();
       
   570     for (QMap<QtButtonPropertyBrowserPrivate::WidgetItem *, QtBrowserItem *>::ConstIterator  it =  d_ptr->m_itemToIndex.constBegin(); it != icend; ++it)
       
   571         delete it.key();
       
   572 }
       
   573 
       
   574 /*!
       
   575     \reimp
       
   576 */
       
   577 void QtButtonPropertyBrowser::itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem)
       
   578 {
       
   579     d_ptr->propertyInserted(item, afterItem);
       
   580 }
       
   581 
       
   582 /*!
       
   583     \reimp
       
   584 */
       
   585 void QtButtonPropertyBrowser::itemRemoved(QtBrowserItem *item)
       
   586 {
       
   587     d_ptr->propertyRemoved(item);
       
   588 }
       
   589 
       
   590 /*!
       
   591     \reimp
       
   592 */
       
   593 void QtButtonPropertyBrowser::itemChanged(QtBrowserItem *item)
       
   594 {
       
   595     d_ptr->propertyChanged(item);
       
   596 }
       
   597 
       
   598 /*!
       
   599     Sets the \a item to either collapse or expanded, depending on the value of \a expanded.
       
   600 
       
   601     \sa isExpanded(), expanded(), collapsed()
       
   602 */
       
   603 
       
   604 void QtButtonPropertyBrowser::setExpanded(QtBrowserItem *item, bool expanded)
       
   605 {
       
   606     QtButtonPropertyBrowserPrivate::WidgetItem *itm = d_ptr->m_indexToItem.value(item);
       
   607     if (itm)
       
   608         d_ptr->setExpanded(itm, expanded);
       
   609 }
       
   610 
       
   611 /*!
       
   612     Returns true if the \a item is expanded; otherwise returns false.
       
   613 
       
   614     \sa setExpanded()
       
   615 */
       
   616 
       
   617 bool QtButtonPropertyBrowser::isExpanded(QtBrowserItem *item) const
       
   618 {
       
   619     QtButtonPropertyBrowserPrivate::WidgetItem *itm = d_ptr->m_indexToItem.value(item);
       
   620     if (itm)
       
   621         return itm->expanded;
       
   622     return false;
       
   623 }
       
   624 
       
   625 QT_END_NAMESPACE
       
   626 
       
   627 #include "moc_qtbuttonpropertybrowser.cpp"