Cockatrice 2026-10-19-Development-3.1.2-beta.2
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 <QSize>
16#include <QStyle>
17#include <QVector>
18#include <qlogging.h>
19#include <qnamespace.h>
20
21class QLayoutItem;
22class QWidget;
23
24inline Q_LOGGING_CATEGORY(FlowLayoutLog, "flow_layout", QtInfoMsg);
25
26class FlowLayout : public QLayout
27{
28public:
29 explicit FlowLayout(QWidget *parent = nullptr);
30 FlowLayout(QWidget *parent, Qt::Orientation flowDirection, int margin = 0, int hSpacing = 0, int vSpacing = 0);
31 ~FlowLayout() override;
32
33 void insertWidgetAtIndex(QWidget *toInsert, int index);
34
35 // QLayout interface
36 void addItem(QLayoutItem *item) override;
37 [[nodiscard]] int count() const override;
38 [[nodiscard]] QLayoutItem *itemAt(int index) const override;
39 QLayoutItem *takeAt(int index) override;
40 void setGeometry(const QRect &rect) override;
41
42 // Size negotiation
43 [[nodiscard]] Qt::Orientations expandingDirections() const override;
44 [[nodiscard]] bool hasHeightForWidth() const override;
45 [[nodiscard]] int heightForWidth(int width) const override;
46 [[nodiscard]] QSize sizeHint() const override;
47 [[nodiscard]] QSize minimumSize() const override;
48
49 // Spacing helpers
50 void setHorizontalMargin(int margin)
51 {
52 horizontalMargin = margin;
53 }
54 [[nodiscard]] int horizontalSpacing() const;
55 void setVerticalMargin(int margin)
56 {
57 verticalMargin = margin;
58 }
59 [[nodiscard]] int verticalSpacing() const;
60 [[nodiscard]] int smartSpacing(QStyle::PixelMetric pm) const;
61
62 // Layout passes (virtual so subclasses can override placement logic)
63 virtual int layoutAllRows(int originX, int originY, int availableWidth);
64 virtual void layoutSingleRow(const QVector<QLayoutItem *> &rowItems, int x, int y, int availableWidth);
65 int layoutAllColumns(int originX, int originY, int availableHeight);
66 void layoutSingleColumn(const QVector<QLayoutItem *> &colItems, int x, int y);
67
68protected:
69 // Size-hint helpers split by direction
70 [[nodiscard]] QSize calculateSizeHintHorizontal() const;
71 [[nodiscard]] QSize calculateMinimumSizeHorizontal() const;
72 [[nodiscard]] QSize calculateSizeHintVertical() const;
73 [[nodiscard]] QSize calculateMinimumSizeVertical() const;
74
76 Qt::Orientation flowDirection;
79};
80
81#endif // FLOW_LAYOUT_H
int horizontalSpacing() const
Gets the horizontal spacing between items.
Definition flow_layout.cpp:451
int verticalSpacing() const
Gets the vertical spacing between items.
Definition flow_layout.cpp:460
QSize calculateSizeHintHorizontal() const
Preferred size for horizontal flow: all items in a single row (unconstrained).
Definition flow_layout.cpp:323
int verticalMargin
Vertical spacing between items (-1 = use style default).
Definition flow_layout.h:78
QLayoutItem * itemAt(int index) const override
Returns the layout item at the specified index.
Definition flow_layout.cpp:432
QSize minimumSize() const override
Definition flow_layout.cpp:131
Qt::Orientation flowDirection
Definition flow_layout.h:76
bool hasHeightForWidth() const override
Height-for-width is only meaningful for horizontal (wrapping) flow.
Definition flow_layout.cpp:64
QList< QLayoutItem * > items
Definition flow_layout.h:75
int count() const override
Retrieves the count of items in the layout.
Definition flow_layout.cpp:422
QSize calculateMinimumSizeHorizontal() const
Minimum size for horizontal flow: the largest single item.
Definition flow_layout.cpp:347
QSize sizeHint() const override
Definition flow_layout.cpp:126
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:188
void setGeometry(const QRect &rect) override
Places all children within rect.
Definition flow_layout.cpp:115
void setVerticalMargin(int margin)
Definition flow_layout.h:55
int heightForWidth(int width) const override
Returns the height required to display all items within width.
Definition flow_layout.cpp:76
QLayoutItem * takeAt(int index) override
Removes and returns the item at the specified index.
Definition flow_layout.cpp:442
int horizontalMargin
Horizontal spacing between items (-1 = use style default).
Definition flow_layout.h:77
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:288
Qt::Orientations expandingDirections() const override
Reports which axis the layout can expand along.
Definition flow_layout.cpp:56
int smartSpacing(QStyle::PixelMetric pm) const
Calculates smart spacing based on the parent widget style.
Definition flow_layout.cpp:470
virtual int layoutAllRows(int originX, int originY, int availableWidth)
Places all items into wrapping rows within availableWidth.
Definition flow_layout.cpp:142
QSize calculateSizeHintVertical() const
Preferred size for vertical flow: all items in a single column (unconstrained).
Definition flow_layout.cpp:363
void addItem(QLayoutItem *item) override
Adds a new item to the layout.
Definition flow_layout.cpp:403
FlowLayout(QWidget *parent=nullptr)
void insertWidgetAtIndex(QWidget *toInsert, int index)
Definition flow_layout.cpp:410
void setHorizontalMargin(int margin)
Definition flow_layout.h:50
int layoutAllColumns(int originX, int originY, int availableHeight)
Places all items into wrapping columns within availableHeight.
Definition flow_layout.cpp:249
QSize calculateMinimumSizeVertical() const
Minimum size for vertical flow: the largest single item.
Definition flow_layout.cpp:386
Definition remote_connection_controller.h:20
Q_LOGGING_CATEGORY(CrashReportLog, "crash_report")