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