/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage ** This file contains pre-release code and may not be distributed. ** You may use this file in accordance with the terms and conditions ** contained in the Technology Preview License Agreement accompanying ** this package. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** ** ** ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qglobal.h" #ifndef QT_NO_GRAPHICSVIEW #include "qgraphicslayout_p.h" #include "qgraphicslayout.h" #include "qgraphicswidget.h" #include "qapplication.h" QT_BEGIN_NAMESPACE /*! \internal \a mw is the new parent. all items in the layout will be a child of \a mw. */ void QGraphicsLayoutPrivate::reparentChildItems(QGraphicsItem *newParent) { Q_Q(QGraphicsLayout); int n = q->count(); //bool mwVisible = mw && mw->isVisible(); for (int i = 0; i < n; ++i) { QGraphicsLayoutItem *layoutChild = q->itemAt(i); if (!layoutChild) { // Skip stretch items continue; } if (layoutChild->isLayout()) { QGraphicsLayout *l = static_cast(layoutChild); l->d_func()->reparentChildItems(newParent); } else if (QGraphicsItem *itemChild = layoutChild->graphicsItem()){ QGraphicsItem *childParent = itemChild->parentItem(); #ifdef QT_DEBUG if (childParent && childParent != newParent && itemChild->isWidget() && qt_graphicsLayoutDebug()) { QGraphicsWidget *w = static_cast(layoutChild); qWarning("QGraphicsLayout::addChildLayout: widget %s \"%s\" in wrong parent; moved to correct parent", w->metaObject()->className(), w->objectName().toLocal8Bit().constData()); } #endif if (childParent != newParent) itemChild->setParentItem(newParent); } } } void QGraphicsLayoutPrivate::getMargin(qreal *result, qreal userMargin, QStyle::PixelMetric pm) const { if (!result) return; Q_Q(const QGraphicsLayout); QGraphicsLayoutItem *parent = q->parentLayoutItem(); if (userMargin >= 0.0) { *result = userMargin; } else if (!parent) { *result = 0.0; } else if (parent->isLayout()) { // sublayouts have 0 margin by default *result = 0.0; } else { *result = 0.0; if (QGraphicsItem *layoutParentItem = parentItem()) { if (layoutParentItem->isWidget()) *result = (qreal)static_cast(layoutParentItem)->style()->pixelMetric(pm, 0); } } } Qt::LayoutDirection QGraphicsLayoutPrivate::visualDirection() const { if (QGraphicsItem *maybeWidget = parentItem()) { if (maybeWidget->isWidget()) return static_cast(maybeWidget)->layoutDirection(); } return QApplication::layoutDirection(); } static bool removeLayoutItemFromLayout(QGraphicsLayout *lay, QGraphicsLayoutItem *layoutItem) { if (!lay) return false; QGraphicsLayoutItem *child; for (int i = 0; (child = lay->itemAt(i)); ++i) { if (child && child->isLayout()) { if (removeLayoutItemFromLayout(static_cast(child), layoutItem)) return true; } else if (child == layoutItem) { lay->removeAt(i); return true; } } return false; } /*! \internal This function is called from subclasses to add a layout item \a layoutItem to a layout. It takes care of automatically reparenting graphics items, if needed. If \a layoutItem is a is already in a layout, it will remove it from that layout. */ void QGraphicsLayoutPrivate::addChildLayoutItem(QGraphicsLayoutItem *layoutItem) { Q_Q(QGraphicsLayout); if (QGraphicsLayoutItem *maybeLayout = layoutItem->parentLayoutItem()) { if (maybeLayout->isLayout()) removeLayoutItemFromLayout(static_cast(maybeLayout), layoutItem); } layoutItem->setParentLayoutItem(q); if (layoutItem->isLayout()) { if (QGraphicsItem *parItem = parentItem()) { static_cast(layoutItem)->d_func()->reparentChildItems(parItem); } } else { if (QGraphicsItem *item = layoutItem->graphicsItem()) { QGraphicsItem *newParent = parentItem(); QGraphicsItem *oldParent = item->parentItem(); if (oldParent == newParent || !newParent) return; #ifdef QT_DEBUG if (oldParent && item->isWidget()) { QGraphicsWidget *w = static_cast(item); qWarning("QGraphicsLayout::addChildLayoutItem: %s \"%s\" in wrong parent; moved to correct parent", w->metaObject()->className(), w->objectName().toLocal8Bit().constData()); } #endif item->setParentItem(newParent); } } } void QGraphicsLayoutPrivate::activateRecursive(QGraphicsLayoutItem *item) { if (item->isLayout()) { QGraphicsLayout *layout = static_cast(item); if (layout->d_func()->activated) layout->invalidate(); for (int i = layout->count() - 1; i >= 0; --i) { QGraphicsLayoutItem *childItem = layout->itemAt(i); if (childItem) activateRecursive(childItem); } layout->d_func()->activated = true; } } QT_END_NAMESPACE #endif //QT_NO_GRAPHICSVIEW