Files
cbh/ElaWidgetTools/ElaFlowLayout.cpp
2025-09-20 01:41:33 +08:00

99 lines
2.8 KiB
C++

#include "ElaFlowLayout.h"
#include <QPropertyAnimation>
#include <QWidget>
#include "private/ElaFlowLayoutPrivate.h"
ElaFlowLayout::ElaFlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing) : QLayout(parent), d_ptr(new ElaFlowLayoutPrivate()) {
Q_D(ElaFlowLayout);
d->q_ptr = this;
d->_hSpacing = hSpacing;
d->_vSpacing = vSpacing;
setContentsMargins(margin, margin, margin, margin);
d->_lastHeightMap.insert(this, 0);
}
ElaFlowLayout::ElaFlowLayout(int margin, int hSpacing, int vSpacing) : d_ptr(new ElaFlowLayoutPrivate()) {
Q_D(ElaFlowLayout);
d->q_ptr = this;
d->_hSpacing = hSpacing;
d->_vSpacing = vSpacing;
setContentsMargins(margin, margin, margin, margin);
d->_lastHeightMap.insert(this, 0);
}
ElaFlowLayout::~ElaFlowLayout() {
QLayoutItem *item;
while ((item = ElaFlowLayout::takeAt(0))) {
delete item;
}
}
void ElaFlowLayout::addItem(QLayoutItem *item) {
Q_D(ElaFlowLayout);
d->_itemList.append(item);
}
int ElaFlowLayout::horizontalSpacing() const {
Q_D(const ElaFlowLayout);
if (d->_hSpacing >= 0) {
return d->_hSpacing;
} else {
return d->_smartSpacing(QStyle::PM_LayoutHorizontalSpacing);
}
}
int ElaFlowLayout::verticalSpacing() const {
Q_D(const ElaFlowLayout);
if (d->_vSpacing >= 0) {
return d->_vSpacing;
} else {
return d->_smartSpacing(QStyle::PM_LayoutVerticalSpacing);
}
}
int ElaFlowLayout::count() const { return d_ptr->_itemList.size(); }
QLayoutItem *ElaFlowLayout::itemAt(int index) const { return d_ptr->_itemList.value(index); }
QLayoutItem *ElaFlowLayout::takeAt(int index) {
Q_D(ElaFlowLayout);
if (index >= 0 && index < d->_itemList.size()) {
return d->_itemList.takeAt(index);
}
return nullptr;
}
void ElaFlowLayout::setIsAnimation(bool isAnimation) {
Q_D(ElaFlowLayout);
d->_isAnimation = isAnimation;
}
Qt::Orientations ElaFlowLayout::expandingDirections() const { return {}; }
bool ElaFlowLayout::hasHeightForWidth() const { return true; }
int ElaFlowLayout::heightForWidth(int width) const {
int height = d_ptr->_doLayout(QRect(0, 0, width, 0), true);
d_ptr->_lastHeightMap[const_cast<ElaFlowLayout *>(this)] = height;
return height;
}
void ElaFlowLayout::setGeometry(const QRect &rect) {
Q_D(ElaFlowLayout);
QLayout::setGeometry(rect);
d->_doLayout(rect, false);
}
QSize ElaFlowLayout::sizeHint() const { return minimumSize(); }
QSize ElaFlowLayout::minimumSize() const {
QSize size;
for (const QLayoutItem *item : std::as_const(d_ptr->_itemList)) {
size = size.expandedTo(item->minimumSize());
}
const QMargins margins = contentsMargins();
size += QSize(margins.left() + margins.right(), margins.top() + margins.bottom());
return size;
}