Cockatrice 2026-06-01-Development-3.1.0-beta.3
A virtual tabletop for multiplayer card games
Loading...
Searching...
No Matches
flow_layout.h
Go to the documentation of this file.
1
8
9#ifndef FLOW_LAYOUT_H
10#define FLOW_LAYOUT_H
11
12#include <QLayout>
13#include <QList>
14#include <QLoggingCategory>
15#include <QStyle>
16#include <QWidget>
17
18inline Q_LOGGING_CATEGORY(FlowLayoutLog, "flow_layout", QtInfoMsg);
19
20class FlowLayout : public QLayout
21{
22public:
23 explicit FlowLayout(QWidget *parent = nullptr);
24 FlowLayout(QWidget *parent, Qt::Orientation flowDirection, int margin = 0, int hSpacing = 0, int vSpacing = 0);
25 ~FlowLayout() override;
26
27 void insertWidgetAtIndex(QWidget *toInsert, int index);
28
29 // QLayout interface
30 void addItem(QLayoutItem *item) override;
31 [[nodiscard]] int count() const override;
32 [[nodiscard]] QLayoutItem *itemAt(int index) const override;
33 QLayoutItem *takeAt(int index) override;
34 void setGeometry(const QRect &rect) override;
35
36 // Size negotiation
37 [[nodiscard]] Qt::Orientations expandingDirections() const override;
38 [[nodiscard]] bool hasHeightForWidth() const override;
39 [[nodiscard]] int heightForWidth(int width) const override;
40 [[nodiscard]] QSize sizeHint() const override;
41 [[nodiscard]] QSize minimumSize() const override;
42
43 // Spacing helpers
44 void setHorizontalMargin(int margin)
45 {
46 horizontalMargin = margin;
47 }
48 [[nodiscard]] int horizontalSpacing() const;
49 void setVerticalMargin(int margin)
50 {
51 verticalMargin = margin;
52 }
53 [[nodiscard]] int verticalSpacing() const;
54 [[nodiscard]] int smartSpacing(QStyle::PixelMetric pm) const;
55
56 // Layout passes (virtual so subclasses can override placement logic)
57 virtual int layoutAllRows(int originX, int originY, int availableWidth);
58 virtual void layoutSingleRow(const QVector<QLayoutItem *> &rowItems, int x, int y, int availableWidth);
59 int layoutAllColumns(int originX, int originY, int availableHeight);
60 void layoutSingleColumn(const QVector<QLayoutItem *> &colItems, int x, int y);
61
62protected:
63 // Size-hint helpers split by direction
64 [[nodiscard]] QSize calculateSizeHintHorizontal() const;
65 [[nodiscard]] QSize calculateMinimumSizeHorizontal() const;
66 [[nodiscard]] QSize calculateSizeHintVertical() const;
67 [[nodiscard]] QSize calculateMinimumSizeVertical() const;
68
69 QList<QLayoutItem *> items;
70 Qt::Orientation flowDirection;
73};
74
75#endif // FLOW_LAYOUT_H
int horizontalSpacing() const
Gets the horizontal spacing between items.
Definition flow_layout.cpp:446
int verticalSpacing() const
Gets the vertical spacing between items.
Definition flow_layout.cpp:455
QSize calculateSizeHintHorizontal() const
Preferred size for horizontal flow: all items in a single row (unconstrained).
Definition flow_layout.cpp:318
int verticalMargin
Vertical spacing between items (-1 = use style default).
Definition flow_layout.h:72
QLayoutItem * itemAt(int index) const override
Returns the layout item at the specified index.
Definition flow_layout.cpp:427
QSize minimumSize() const override
Definition flow_layout.cpp:126
Qt::Orientation flowDirection
Definition flow_layout.h:70
bool hasHeightForWidth() const override
Height-for-width is only meaningful for horizontal (wrapping) flow.
Definition flow_layout.cpp:59
QList< QLayoutItem * > items
Definition flow_layout.h:69
int count() const override
Retrieves the count of items in the layout.
Definition flow_layout.cpp:417
QSize calculateMinimumSizeHorizontal() const
Minimum size for horizontal flow: the largest single item.
Definition flow_layout.cpp:342
QSize sizeHint() const override
Definition flow_layout.cpp:121
virtual void layoutSingleRow(const QVector< QLayoutItem * > &rowItems, int x, int y, int availableWidth)
Sets the geometry for every item in rowItems, starting at (x, y).
Definition flow_layout.cpp:183
~FlowLayout() override
Definition flow_layout.cpp:36
void setGeometry(const QRect &rect) override
Places all children within rect.
Definition flow_layout.cpp:110
void setVerticalMargin(int margin)
Definition flow_layout.h:49
int heightForWidth(int width) const override
Returns the height required to display all items within width.
Definition flow_layout.cpp:71
QLayoutItem * takeAt(int index) override
Removes and returns the item at the specified index.
Definition flow_layout.cpp:437
int horizontalMargin
Horizontal spacing between items (-1 = use style default).
Definition flow_layout.h:71
void layoutSingleColumn(const QVector< QLayoutItem * > &colItems, int x, int y)
Sets the geometry for every item in colItems, starting at (x, y).
Definition flow_layout.cpp:283
Qt::Orientations expandingDirections() const override
Reports which axis the layout can expand along.
Definition flow_layout.cpp:51
int smartSpacing(QStyle::PixelMetric pm) const
Calculates smart spacing based on the parent widget style.
Definition flow_layout.cpp:465
virtual int layoutAllRows(int originX, int originY, int availableWidth)
Places all items into wrapping rows within availableWidth.
Definition flow_layout.cpp:137
QSize calculateSizeHintVertical() const
Preferred size for vertical flow: all items in a single column (unconstrained).
Definition flow_layout.cpp:358
void addItem(QLayoutItem *item) override
Adds a new item to the layout.
Definition flow_layout.cpp:398
FlowLayout(QWidget *parent=nullptr)
void insertWidgetAtIndex(QWidget *toInsert, int index)
Definition flow_layout.cpp:405
void setHorizontalMargin(int margin)
Definition flow_layout.h:44
int layoutAllColumns(int originX, int originY, int availableHeight)
Places all items into wrapping columns within availableHeight.
Definition flow_layout.cpp:244
QSize calculateMinimumSizeVertical() const
Minimum size for vertical flow: the largest single item.
Definition flow_layout.cpp:381
Q_LOGGING_CATEGORY(FlowLayoutLog, "flow_layout", QtInfoMsg)