Files
cbh/ElaWidgetTools/ElaFlowLayout.cpp
2025-09-19 22:40:52 +08:00

136 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;
}