annotate widgets/FlowLayout.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents 0442224a9553
children
rev   line source
lbajardsilogic@164 1 /****************************************************************************
lbajardsilogic@164 2 **
lbajardsilogic@164 3 ** Copyright (C) 2004-2007 Trolltech ASA. All rights reserved.
lbajardsilogic@164 4 **
lbajardsilogic@164 5 ** This file is part of the example classes of the Qt Toolkit.
lbajardsilogic@164 6 **
lbajardsilogic@164 7 ** This file may be used under the terms of the GNU General Public
lbajardsilogic@164 8 ** License version 2.0 as published by the Free Software Foundation
lbajardsilogic@164 9 ** and appearing in the file LICENSE.GPL included in the packaging of
lbajardsilogic@164 10 ** this file. Please review the following information to ensure GNU
lbajardsilogic@164 11 ** General Public Licensing requirements will be met:
lbajardsilogic@164 12 ** http://www.trolltech.com/products/qt/opensource.html
lbajardsilogic@164 13 **
lbajardsilogic@164 14 ** If you are unsure which license is appropriate for your use, please
lbajardsilogic@164 15 ** review the following information:
lbajardsilogic@164 16 ** http://www.trolltech.com/products/qt/licensing.html or contact the
lbajardsilogic@164 17 ** sales department at sales@trolltech.com.
lbajardsilogic@164 18 **
lbajardsilogic@164 19 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
lbajardsilogic@164 20 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
lbajardsilogic@164 21 **
lbajardsilogic@164 22 ****************************************************************************/
lbajardsilogic@164 23
lbajardsilogic@164 24 #include <QtGui>
lbajardsilogic@164 25
lbajardsilogic@164 26 #include "FlowLayout.h"
lbajardsilogic@164 27
lbajardsilogic@164 28 FlowLayout::FlowLayout(QWidget *parent, int margin, int spacing)
lbajardsilogic@164 29 : QLayout(parent)
lbajardsilogic@164 30 {
lbajardsilogic@164 31 setMargin(margin);
lbajardsilogic@164 32 setSpacing(spacing);
lbajardsilogic@164 33 }
lbajardsilogic@164 34
lbajardsilogic@164 35 FlowLayout::FlowLayout(int spacing)
lbajardsilogic@164 36 {
lbajardsilogic@164 37 setSpacing(spacing);
lbajardsilogic@164 38 }
lbajardsilogic@164 39
lbajardsilogic@164 40 FlowLayout::~FlowLayout()
lbajardsilogic@164 41 {
lbajardsilogic@164 42 QLayoutItem *item;
lbajardsilogic@164 43 while ((item = takeAt(0)))
lbajardsilogic@164 44 delete item;
lbajardsilogic@164 45 }
lbajardsilogic@164 46
lbajardsilogic@164 47 void FlowLayout::addItem(QLayoutItem *item)
lbajardsilogic@164 48 {
lbajardsilogic@164 49 m_itemList.append(item);
lbajardsilogic@164 50 }
lbajardsilogic@164 51
lbajardsilogic@164 52 int FlowLayout::count() const
lbajardsilogic@164 53 {
lbajardsilogic@164 54 return m_itemList.size();
lbajardsilogic@164 55 }
lbajardsilogic@164 56
lbajardsilogic@164 57 QLayoutItem *FlowLayout::itemAt(int index) const
lbajardsilogic@164 58 {
lbajardsilogic@164 59 return m_itemList.value(index);
lbajardsilogic@164 60 }
lbajardsilogic@164 61
lbajardsilogic@164 62 QLayoutItem *FlowLayout::takeAt(int index)
lbajardsilogic@164 63 {
lbajardsilogic@164 64 if (index >= 0 && index < m_itemList.size())
lbajardsilogic@164 65 return m_itemList.takeAt(index);
lbajardsilogic@164 66 else
lbajardsilogic@164 67 return 0;
lbajardsilogic@164 68 }
lbajardsilogic@164 69
lbajardsilogic@164 70 Qt::Orientations FlowLayout::expandingDirections() const
lbajardsilogic@164 71 {
lbajardsilogic@164 72 return 0;
lbajardsilogic@164 73 }
lbajardsilogic@164 74
lbajardsilogic@164 75 bool FlowLayout::hasHeightForWidth() const
lbajardsilogic@164 76 {
lbajardsilogic@164 77 return true;
lbajardsilogic@164 78 }
lbajardsilogic@164 79
lbajardsilogic@164 80 int FlowLayout::heightForWidth(int width) const
lbajardsilogic@164 81 {
lbajardsilogic@164 82 int height = doLayout(QRect(0, 0, width, 0), true);
lbajardsilogic@164 83 return height;
lbajardsilogic@164 84 }
lbajardsilogic@164 85
lbajardsilogic@164 86 void FlowLayout::setGeometry(const QRect &rect)
lbajardsilogic@164 87 {
lbajardsilogic@164 88 QLayout::setGeometry(rect);
lbajardsilogic@164 89 doLayout(rect, false);
lbajardsilogic@164 90 }
lbajardsilogic@164 91
lbajardsilogic@164 92 QSize FlowLayout::sizeHint() const
lbajardsilogic@164 93 {
lbajardsilogic@166 94 return minimumSize();
lbajardsilogic@164 95 }
lbajardsilogic@164 96
lbajardsilogic@164 97 QSize FlowLayout::minimumSize() const
lbajardsilogic@164 98 {
lbajardsilogic@164 99 QSize size;
lbajardsilogic@164 100 QLayoutItem *item;
lbajardsilogic@164 101 QLayoutItem *itemXMax = 0;
lbajardsilogic@164 102 QLayoutItem *itemYMax = 0;
lbajardsilogic@164 103 foreach (item, m_itemList)
lbajardsilogic@164 104 {
lbajardsilogic@164 105 //init itemXMax and itemYMax
lbajardsilogic@164 106 if ((itemXMax == 0) && (itemYMax == 0))
lbajardsilogic@164 107 {
lbajardsilogic@164 108 itemXMax = item;
lbajardsilogic@164 109 itemYMax = item;
lbajardsilogic@164 110 }
lbajardsilogic@164 111
lbajardsilogic@164 112 //find XMax
lbajardsilogic@166 113 if ( (itemXMax->geometry().x() < item->geometry().x()) ||
lbajardsilogic@166 114 ( (itemXMax->geometry().x() == item->geometry().x()) && (itemXMax->geometry().width() < item->geometry().width()) ) )
lbajardsilogic@164 115 {
lbajardsilogic@164 116 itemXMax = item;
lbajardsilogic@164 117 }
lbajardsilogic@164 118
lbajardsilogic@164 119 //find YMax
lbajardsilogic@166 120 if ( (itemYMax->geometry().y() < item->geometry().y()) ||
lbajardsilogic@166 121 ( (itemYMax->geometry().y() == item->geometry().y()) && (itemYMax->geometry().height() < item->geometry().height()) ) )
lbajardsilogic@164 122 {
lbajardsilogic@164 123 itemYMax = item;
lbajardsilogic@164 124 }
lbajardsilogic@164 125 }
lbajardsilogic@164 126
lbajardsilogic@164 127 if ((itemXMax != 0) && (itemYMax != 0))
lbajardsilogic@164 128 size = QSize(itemXMax->geometry().x() + itemXMax->minimumSize().width(), itemYMax->geometry().y() + itemYMax->minimumSize().height());
lbajardsilogic@164 129
lbajardsilogic@164 130 size += QSize(2*margin(), 2*margin());
lbajardsilogic@164 131 return size;
lbajardsilogic@164 132 }
lbajardsilogic@164 133
lbajardsilogic@164 134 int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
lbajardsilogic@164 135 {
lbajardsilogic@164 136 int x = rect.x();
lbajardsilogic@164 137 int y = rect.y();
lbajardsilogic@164 138 int lineHeight = 0;
lbajardsilogic@164 139
lbajardsilogic@164 140 QLayoutItem *item;
lbajardsilogic@164 141 foreach (item, m_itemList) {
lbajardsilogic@164 142 int nextX = x + item->sizeHint().width() + spacing();
lbajardsilogic@164 143 if (nextX - spacing() > rect.right() && lineHeight > 0) {
lbajardsilogic@164 144 x = rect.x();
lbajardsilogic@164 145 y = y + lineHeight + spacing();
lbajardsilogic@164 146 nextX = x + item->sizeHint().width() + spacing();
lbajardsilogic@164 147 lineHeight = 0;
lbajardsilogic@164 148 }
lbajardsilogic@164 149
lbajardsilogic@164 150 if (!testOnly)
lbajardsilogic@164 151 item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
lbajardsilogic@164 152
lbajardsilogic@164 153 x = nextX;
lbajardsilogic@164 154 lineHeight = qMax(lineHeight, item->sizeHint().height());
lbajardsilogic@164 155 }
lbajardsilogic@164 156
lbajardsilogic@164 157 return y + lineHeight - rect.y();
lbajardsilogic@164 158 }