mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 00:30:05 +00:00 
			
		
		
		
	Creating flow layout
This commit is contained in:
		
							parent
							
								
									9ee52e7a6b
								
							
						
					
					
						commit
						cd5d60bc0b
					
				
					 3 changed files with 346 additions and 0 deletions
				
			
		
							
								
								
									
										240
									
								
								scwx-qt/source/scwx/qt/ui/flow_layout.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										240
									
								
								scwx-qt/source/scwx/qt/ui/flow_layout.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,240 @@ | |||
| /****************************************************************************
 | ||||
| ** | ||||
| ** Copyright (C) 2016 The Qt Company Ltd. | ||||
| ** Contact: https://www.qt.io/licensing/
 | ||||
| ** | ||||
| ** This file is part of the examples of the Qt Toolkit. | ||||
| ** | ||||
| ** $QT_BEGIN_LICENSE:BSD$ | ||||
| ** Commercial License Usage | ||||
| ** Licensees holding valid commercial Qt licenses may use this file in | ||||
| ** accordance with the commercial license agreement provided with the | ||||
| ** Software or, alternatively, in accordance with the terms contained in | ||||
| ** a written agreement between you and The Qt Company. For licensing terms | ||||
| ** and conditions see https://www.qt.io/terms-conditions. For further
 | ||||
| ** information use the contact form at https://www.qt.io/contact-us.
 | ||||
| ** | ||||
| ** BSD License Usage | ||||
| ** Alternatively, you may use this file under the terms of the BSD license | ||||
| ** as follows: | ||||
| ** | ||||
| ** "Redistribution and use in source and binary forms, with or without | ||||
| ** modification, are permitted provided that the following conditions are | ||||
| ** met: | ||||
| **   * Redistributions of source code must retain the above copyright | ||||
| **     notice, this list of conditions and the following disclaimer. | ||||
| **   * Redistributions in binary form must reproduce the above copyright | ||||
| **     notice, this list of conditions and the following disclaimer in | ||||
| **     the documentation and/or other materials provided with the | ||||
| **     distribution. | ||||
| **   * Neither the name of The Qt Company Ltd nor the names of its | ||||
| **     contributors may be used to endorse or promote products derived | ||||
| **     from this software without specific prior written permission. | ||||
| ** | ||||
| ** | ||||
| ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." | ||||
| ** | ||||
| ** $QT_END_LICENSE$ | ||||
| ** | ||||
| ****************************************************************************/ | ||||
| 
 | ||||
| #include <scwx/qt/ui/flow_layout.hpp> | ||||
| 
 | ||||
| #include <QWidget> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
| namespace qt | ||||
| { | ||||
| namespace ui | ||||
| { | ||||
| 
 | ||||
| FlowLayout::FlowLayout(QWidget* parent, | ||||
|                        int      margin, | ||||
|                        int      hSpacing, | ||||
|                        int      vSpacing) : | ||||
|     QLayout(parent), hSpace_(hSpacing), vSpace_(vSpacing) | ||||
| { | ||||
|    setContentsMargins(margin, margin, margin, margin); | ||||
| } | ||||
| 
 | ||||
| FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing) : | ||||
|     hSpace_(hSpacing), vSpace_(vSpacing) | ||||
| { | ||||
|    setContentsMargins(margin, margin, margin, margin); | ||||
| } | ||||
| 
 | ||||
| FlowLayout::~FlowLayout() | ||||
| { | ||||
|    QLayoutItem* item; | ||||
|    while ((item = takeAt(0))) | ||||
|    { | ||||
|       delete item; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void FlowLayout::addItem(QLayoutItem* item) | ||||
| { | ||||
|    itemList_.append(item); | ||||
| } | ||||
| 
 | ||||
| int FlowLayout::horizontalSpacing() const | ||||
| { | ||||
|    if (hSpace_ >= 0) | ||||
|    { | ||||
|       return hSpace_; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       return smartSpacing(QStyle::PM_LayoutHorizontalSpacing); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| int FlowLayout::verticalSpacing() const | ||||
| { | ||||
|    if (vSpace_ >= 0) | ||||
|    { | ||||
|       return vSpace_; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       return smartSpacing(QStyle::PM_LayoutVerticalSpacing); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| int FlowLayout::count() const | ||||
| { | ||||
|    return itemList_.size(); | ||||
| } | ||||
| 
 | ||||
| QLayoutItem* FlowLayout::itemAt(int index) const | ||||
| { | ||||
|    return itemList_.value(index); | ||||
| } | ||||
| 
 | ||||
| QLayoutItem* FlowLayout::takeAt(int index) | ||||
| { | ||||
|    if (index >= 0 && index < itemList_.size()) | ||||
|    { | ||||
|       return itemList_.takeAt(index); | ||||
|    } | ||||
|    return nullptr; | ||||
| } | ||||
| 
 | ||||
| Qt::Orientations FlowLayout::expandingDirections() const | ||||
| { | ||||
|    return {}; | ||||
| } | ||||
| 
 | ||||
| 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; | ||||
|    for (const QLayoutItem* item : qAsConst(itemList_)) | ||||
|    { | ||||
|       size = size.expandedTo(item->minimumSize()); | ||||
|    } | ||||
| 
 | ||||
|    const QMargins margins = contentsMargins(); | ||||
|    size += | ||||
|       QSize(margins.left() + margins.right(), margins.top() + margins.bottom()); | ||||
|    return size; | ||||
| } | ||||
| 
 | ||||
| int FlowLayout::doLayout(const QRect& rect, bool testOnly) const | ||||
| { | ||||
|    int left, top, right, bottom; | ||||
|    getContentsMargins(&left, &top, &right, &bottom); | ||||
|    QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom); | ||||
|    int   x             = effectiveRect.x(); | ||||
|    int   y             = effectiveRect.y(); | ||||
|    int   lineHeight    = 0; | ||||
| 
 | ||||
|    for (QLayoutItem* item : qAsConst(itemList_)) | ||||
|    { | ||||
|       const QWidget* wid    = item->widget(); | ||||
|       int            spaceX = horizontalSpacing(); | ||||
|       if (spaceX == -1) | ||||
|       { | ||||
|          spaceX = wid->style()->layoutSpacing( | ||||
|             QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal); | ||||
|       } | ||||
|       int spaceY = verticalSpacing(); | ||||
|       if (spaceY == -1) | ||||
|       { | ||||
|          spaceY = wid->style()->layoutSpacing( | ||||
|             QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical); | ||||
|       } | ||||
| 
 | ||||
|       int nextX = x + item->sizeHint().width() + spaceX; | ||||
|       if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) | ||||
|       { | ||||
|          x          = effectiveRect.x(); | ||||
|          y          = y + lineHeight + spaceY; | ||||
|          nextX      = x + item->sizeHint().width() + spaceX; | ||||
|          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() + bottom; | ||||
| } | ||||
| 
 | ||||
| int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const | ||||
| { | ||||
|    QObject* parent = this->parent(); | ||||
|    if (!parent) | ||||
|    { | ||||
|       return -1; | ||||
|    } | ||||
|    else if (parent->isWidgetType()) | ||||
|    { | ||||
|       QWidget* pw = static_cast<QWidget*>(parent); | ||||
|       return pw->style()->pixelMetric(pm, nullptr, pw); | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       return static_cast<QLayout*>(parent)->spacing(); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| } // namespace ui
 | ||||
| } // namespace qt
 | ||||
| } // namespace scwx
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat