91 lines
1.8 KiB
C++
91 lines
1.8 KiB
C++
/*
|
|
* This file Copyright (C) 2015 Mnemosyne LLC
|
|
*
|
|
* It may be used under the GNU GPL versions 2 or 3
|
|
* or any future license endorsed by Mnemosyne LLC.
|
|
*
|
|
*/
|
|
|
|
#include <QEvent>
|
|
#include <QGridLayout>
|
|
|
|
#include "ColumnResizer.h"
|
|
|
|
namespace
|
|
{
|
|
|
|
int itemColumnSpan(QGridLayout const* layout, QLayoutItem const* item)
|
|
{
|
|
for (int i = 0, count = layout->count(); i < count; ++i)
|
|
{
|
|
if (layout->itemAt(i) != item)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
int row = {};
|
|
int column = {};
|
|
int row_span = {};
|
|
int column_span = {};
|
|
layout->getItemPosition(i, &row, &column, &row_span, &column_span);
|
|
return column_span;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
ColumnResizer::ColumnResizer(QObject* parent) :
|
|
QObject(parent)
|
|
{
|
|
timer_.setSingleShot(true);
|
|
connect(&timer_, &QTimer::timeout, this, &ColumnResizer::update);
|
|
}
|
|
|
|
void ColumnResizer::addLayout(QGridLayout* layout)
|
|
{
|
|
layouts_ << layout;
|
|
scheduleUpdate();
|
|
}
|
|
|
|
bool ColumnResizer::eventFilter(QObject* object, QEvent* event)
|
|
{
|
|
if (event->type() == QEvent::Resize)
|
|
{
|
|
scheduleUpdate();
|
|
}
|
|
|
|
return QObject::eventFilter(object, event);
|
|
}
|
|
|
|
void ColumnResizer::update() const
|
|
{
|
|
int max_width = 0;
|
|
|
|
for (QGridLayout const* const layout : layouts_)
|
|
{
|
|
for (int i = 0, count = layout->rowCount(); i < count; ++i)
|
|
{
|
|
QLayoutItem const* const item = layout->itemAtPosition(i, 0);
|
|
|
|
if (item == nullptr || itemColumnSpan(layout, item) > 1)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
max_width = qMax(max_width, item->sizeHint().width());
|
|
}
|
|
}
|
|
|
|
for (QGridLayout* const layout : layouts_)
|
|
{
|
|
layout->setColumnMinimumWidth(0, max_width);
|
|
}
|
|
}
|
|
|
|
void ColumnResizer::scheduleUpdate()
|
|
{
|
|
timer_.start(0);
|
|
}
|