Mercurial > hg > easaier-soundaccess
changeset 164:635b837e2801
add FlowLayout.h
author | lbajardsilogic |
---|---|
date | Thu, 15 Nov 2007 16:58:36 +0000 |
parents | 77f4ef621c54 |
children | 1416cdbe79b6 |
files | widgets/FlowLayout.cpp widgets/FlowLayout.h |
diffstat | 2 files changed, 211 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgets/FlowLayout.cpp Thu Nov 15 16:58:36 2007 +0000 @@ -0,0 +1,156 @@ +/**************************************************************************** +** +** Copyright (C) 2004-2007 Trolltech ASA. All rights reserved. +** +** This file is part of the example classes of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include <QtGui> + +#include "FlowLayout.h" + +FlowLayout::FlowLayout(QWidget *parent, int margin, int spacing) + : QLayout(parent) +{ + setMargin(margin); + setSpacing(spacing); +} + +FlowLayout::FlowLayout(int spacing) +{ + setSpacing(spacing); +} + +FlowLayout::~FlowLayout() +{ + QLayoutItem *item; + while ((item = takeAt(0))) + delete item; +} + +void FlowLayout::addItem(QLayoutItem *item) +{ + m_itemList.append(item); +} + +int FlowLayout::count() const +{ + return m_itemList.size(); +} + +QLayoutItem *FlowLayout::itemAt(int index) const +{ + return m_itemList.value(index); +} + +QLayoutItem *FlowLayout::takeAt(int index) +{ + if (index >= 0 && index < m_itemList.size()) + return m_itemList.takeAt(index); + else + return 0; +} + +Qt::Orientations FlowLayout::expandingDirections() const +{ + return 0; +} + +bool FlowLayout::hasHeightForWidth() const +{ + return true; +} + +int FlowLayout::heightForWidth(int width) const +{ + int height = doLayout(QRect(0, 0, width, 0), true); + return height; +} + +void FlowLayout::setGeometry(const QRect &rect) +{ + QLayout::setGeometry(rect); + doLayout(rect, false); +} + +QSize FlowLayout::sizeHint() const +{ + return minimumSize(); +} + +QSize FlowLayout::minimumSize() const +{ + QSize size; + QLayoutItem *item; + QLayoutItem *itemXMax = 0; + QLayoutItem *itemYMax = 0; + foreach (item, m_itemList) + { + //init itemXMax and itemYMax + if ((itemXMax == 0) && (itemYMax == 0)) + { + itemXMax = item; + itemYMax = item; + } + + //find XMax + if (itemXMax->geometry().x() < item->geometry().x()) + { + itemXMax = item; + } + + //find YMax + if (itemYMax->geometry().y() < item->geometry().y()) + { + itemYMax = item; + } + } + + if ((itemXMax != 0) && (itemYMax != 0)) + size = QSize(itemXMax->geometry().x() + itemXMax->minimumSize().width(), itemYMax->geometry().y() + itemYMax->minimumSize().height()); + + size += QSize(2*margin(), 2*margin()); + return size; +} + +int FlowLayout::doLayout(const QRect &rect, bool testOnly) const +{ + int x = rect.x(); + int y = rect.y(); + int lineHeight = 0; + + QLayoutItem *item; + foreach (item, m_itemList) { + int nextX = x + item->sizeHint().width() + spacing(); + if (nextX - spacing() > rect.right() && lineHeight > 0) { + x = rect.x(); + y = y + lineHeight + spacing(); + nextX = x + item->sizeHint().width() + spacing(); + lineHeight = 0; + } + + if (!testOnly) + item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); + + x = nextX; + lineHeight = qMax(lineHeight, item->sizeHint().height()); + } + + return y + lineHeight - rect.y(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgets/FlowLayout.h Thu Nov 15 16:58:36 2007 +0000 @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2004-2007 Trolltech ASA. All rights reserved. +** +** This file is part of the example classes of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef FLOWLAYOUT_H +#define FLOWLAYOUT_H + +#include <QLayout> +#include <QRect> +#include <QWidgetItem> + +class FlowLayout : public QLayout +{ +public: + FlowLayout(QWidget *parent, int margin = 0, int spacing = -1); + FlowLayout(int spacing = -1); + ~FlowLayout(); + + void addItem(QLayoutItem *item); + Qt::Orientations expandingDirections() const; + bool hasHeightForWidth() const; + int heightForWidth(int) const; + int count() const; + QLayoutItem *itemAt(int index) const; + QSize minimumSize() const; + void setGeometry(const QRect &rect); + QSize sizeHint() const; + QLayoutItem *takeAt(int index); + +private: + int doLayout(const QRect &rect, bool testOnly) const; + + QList<QLayoutItem *> m_itemList; +}; + +#endif