1 /*
2 * This file Copyright (C) 2015 Mnemosyne LLC
3 *
4 * It may be used under the GNU GPL versions 2 or 3
5 * or any future license endorsed by Mnemosyne LLC.
6 *
7 */
8
9 #include <QEvent>
10 #include <QGridLayout>
11 #include <QTimer>
12
13 #include "ColumnResizer.h"
14
15 namespace
16 {
17
itemColumnSpan(QGridLayout * layout,QLayoutItem const * item)18 int itemColumnSpan(QGridLayout* layout, QLayoutItem const* item)
19 {
20 for (int i = 0, count = layout->count(); i < count; ++i)
21 {
22 if (layout->itemAt(i) != item)
23 {
24 continue;
25 }
26
27 int row, column, rowSpan, columnSpan;
28 layout->getItemPosition(i, &row, &column, &rowSpan, &columnSpan);
29 return columnSpan;
30 }
31
32 return 0;
33 }
34
35 } // namespace
36
ColumnResizer(QObject * parent)37 ColumnResizer::ColumnResizer(QObject* parent) :
38 QObject(parent),
39 myTimer(new QTimer(this)),
40 myLayouts()
41 {
42 myTimer->setSingleShot(true);
43 connect(myTimer, SIGNAL(timeout()), SLOT(update()));
44 }
45
addLayout(QGridLayout * layout)46 void ColumnResizer::addLayout(QGridLayout* layout)
47 {
48 myLayouts << layout;
49 scheduleUpdate();
50 }
51
eventFilter(QObject * object,QEvent * event)52 bool ColumnResizer::eventFilter(QObject* object, QEvent* event)
53 {
54 if (event->type() == QEvent::Resize)
55 {
56 scheduleUpdate();
57 }
58
59 return QObject::eventFilter(object, event);
60 }
61
update()62 void ColumnResizer::update()
63 {
64 int maxWidth = 0;
65
66 for (QGridLayout* const layout : myLayouts)
67 {
68 for (int i = 0, count = layout->rowCount(); i < count; ++i)
69 {
70 QLayoutItem* item = layout->itemAtPosition(i, 0);
71
72 if (item == nullptr || itemColumnSpan(layout, item) > 1)
73 {
74 continue;
75 }
76
77 maxWidth = qMax(maxWidth, item->sizeHint().width());
78 }
79 }
80
81 for (QGridLayout* const layout : myLayouts)
82 {
83 layout->setColumnMinimumWidth(0, maxWidth);
84 }
85 }
86
scheduleUpdate()87 void ColumnResizer::scheduleUpdate()
88 {
89 myTimer->start(0);
90 }
91