Krita Source Code Documentation
Loading...
Searching...
No Matches
KisWrappableHBoxLayout.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 * SPDX-FileCopyrightText: 2021 Agata Cacko <cacko.azh@gmail.com>
3 * SPDX-FileCopyrightText: 2021 L. E. Segovia <amy@amyspark.me>
4 *
5 * SPDX-License-Identifier: GPL-3.0-or-later
6 */
7
8#include <QtWidgets>
10
11
13 : QLayout(parent)
14{
15 // Remove extra floating space.
16 setContentsMargins(0, 0, 0, 0);
17}
18
20{
21 QLayoutItem *item;
22 while ((item = takeAt(0))) {
23 delete item;
24 }
25}
26
27void KisWrappableHBoxLayout::addItem(QLayoutItem *item)
28{
29 m_items.append(item);
30}
31
33{
34 const QMargins margins = contentsMargins();
35 if (!geometry().isEmpty()) {
36 return QSize(geometry().width(), heightForWidth(geometry().width()))
37 + QSize(margins.left() + margins.right(), margins.top() + margins.bottom());
38 }
39 return minimumSize();
40}
41
43{
44 const QMargins margins = contentsMargins();
45 const QSize marginsSize = QSize(margins.left() + margins.right(), margins.top() + margins.bottom());
46
47 QSize size;
48 for (const QLayoutItem *item : std::as_const(m_items))
49 size = size.expandedTo(item->minimumSize());
50
51 if (!geometry().isEmpty()) {
52 QSize optimal = QSize(geometry().width(), heightForWidth(geometry().width()));
53 int minimumWidth = size.width(); // cannot be smaller than the biggest item
54 int minimumHeight = qMax(size.height(), optimal.height());
55 QSize minimum = QSize(minimumWidth, minimumHeight);
56 return minimum;
57 }
58
59 size += marginsSize;
60 //size = QSize(size.width(), size.height()*5);
61 return size;
62}
63
65{
66 return m_items.size();
67}
68
69
70
71QLayoutItem *KisWrappableHBoxLayout::itemAt(int idx) const
72{
73 return m_items.value(idx);
74}
75
76QLayoutItem *KisWrappableHBoxLayout::takeAt(int idx)
77{
78 return idx >= 0 && idx < m_items.size() ? m_items.takeAt(idx) : 0;
79}
80
82{
83 QLayout::setGeometry(rect);
84 doLayout(rect, false);
85}
86
88{
89 return true;
90}
91
93{
94 int height = doLayout(QRect(0, 0, width, 0), true);
95 return height;
96}
97
98int KisWrappableHBoxLayout::doLayout(const QRect &rect, bool testOnly) const
99{
100 int left, top, right, bottom;
101 getContentsMargins(&left, &top, &right, &bottom);
102 QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom);
103 int x = effectiveRect.x();
104 int y = effectiveRect.y();
105 int lineHeight = 0;
106
107 for (QLayoutItem *item : std::as_const(m_items)) {
108 int nextX = x + item->sizeHint().width() + spacing();
109 if (nextX - spacing() > effectiveRect.right() && lineHeight > 0) {
110 x = effectiveRect.x();
111 y = y + lineHeight + spacing();
112 nextX = x + item->sizeHint().width() + spacing();
113 lineHeight = 0;
114 }
115
116 if (!testOnly) {
117 item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
118 }
119
120 x = nextX;
121 lineHeight = qMax(lineHeight, item->sizeHint().height());
122 }
123 return y + lineHeight - rect.y() + bottom;
124}
125
QLayoutItem * takeAt(int) override
int heightForWidth(int width) const override
void addItem(QLayoutItem *item) override
QSize minimumSize() const override
QVector< QLayoutItem * > m_items
void setGeometry(const QRect &rect) override
bool hasHeightForWidth() const override
QSize sizeHint() const override
KisWrappableHBoxLayout(QWidget *parent=nullptr)
QLayoutItem * itemAt(int) const override
int doLayout(const QRect &rect, bool testOnly) const