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