90 lines
1.8 KiB
C++
90 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 <QTimer>
|
|
|
|
#include "ColumnResizer.h"
|
|
|
|
namespace
|
|
{
|
|
|
|
int itemColumnSpan(QGridLayout* layout, QLayoutItem const* item)
|
|
{
|
|
for (int i = 0, count = layout->count(); i < count; ++i)
|
|
{
|
|
if (layout->itemAt(i) != item)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
int row, column, rowSpan, columnSpan;
|
|
layout->getItemPosition(i, &row, &column, &rowSpan, &columnSpan);
|
|
return columnSpan;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
ColumnResizer::ColumnResizer(QObject* parent) :
|
|
QObject(parent),
|
|
myTimer(new QTimer(this))
|
|
{
|
|
myTimer->setSingleShot(true);
|
|
connect(myTimer, SIGNAL(timeout()), SLOT(update()));
|
|
}
|
|
|
|
void ColumnResizer::addLayout(QGridLayout* layout)
|
|
{
|
|
myLayouts << layout;
|
|
scheduleUpdate();
|
|
}
|
|
|
|
bool ColumnResizer::eventFilter(QObject* object, QEvent* event)
|
|
{
|
|
if (event->type() == QEvent::Resize)
|
|
{
|
|
scheduleUpdate();
|
|
}
|
|
|
|
return QObject::eventFilter(object, event);
|
|
}
|
|
|
|
void ColumnResizer::update()
|
|
{
|
|
int maxWidth = 0;
|
|
|
|
for (QGridLayout* const layout : myLayouts)
|
|
{
|
|
for (int i = 0, count = layout->rowCount(); i < count; ++i)
|
|
{
|
|
QLayoutItem* item = layout->itemAtPosition(i, 0);
|
|
|
|
if (item == nullptr || itemColumnSpan(layout, item) > 1)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
maxWidth = qMax(maxWidth, item->sizeHint().width());
|
|
}
|
|
}
|
|
|
|
for (QGridLayout* const layout : myLayouts)
|
|
{
|
|
layout->setColumnMinimumWidth(0, maxWidth);
|
|
}
|
|
}
|
|
|
|
void ColumnResizer::scheduleUpdate()
|
|
{
|
|
myTimer->start(0);
|
|
}
|