1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
/*
* Copyright 2008 Jason A. Donenfeld <Jason@zx2c4.com>
*/
#include "AutoSizingList.h"
#include "CollectionModel.h"
#include "CollectionFilter.h"
#include <QHeaderView>
#include <QDebug>
AutoSizingList::AutoSizingList(QWidget *parent)
: QTreeView(parent)
, m_suggestedRatio1(0)
, m_suggestedRatio2(0)
, m_suggestedRatio3(0)
, m_childWidget(0)
{
setUniformRowHeights(true);
setDragEnabled(true);
setDragDropMode(QAbstractItemView::DragOnly);
setRootIsDecorated(false);
setAllColumnsShowFocus(true);
setSelectionBehavior(QAbstractItemView::SelectRows);
setSelectionMode(QAbstractItemView::ExtendedSelection);
header()->setResizeMode(QHeaderView::Fixed);
}
void AutoSizingList::rowChange()
{
CollectionFilter *filter = qobject_cast<CollectionFilter*>(model());
if(filter && filter->rowCount() == 0)
return;
setUpdatesEnabled(false);
header()->setStretchLastSection(false);
CollectionModel *collectionModel = 0;
if(filter)
collectionModel = qobject_cast<CollectionModel*>(filter->sourceModel());
if(collectionModel)
collectionModel->setFakeBoldState(true);
double suggestedWidth0 = qMin(sizeHintForColumn(0), 70);
setColumnWidth(0, suggestedWidth0);
double suggestedWidth1 = sizeHintForColumn(1);
double suggestedWidth2 = sizeHintForColumn(2);
double suggestedWidth3 = sizeHintForColumn(3);
if(collectionModel)
collectionModel->setFakeBoldState(false);
header()->setStretchLastSection(true);
double suggestedWidthTotal = suggestedWidth0 + suggestedWidth1 + suggestedWidth2 + suggestedWidth3;
m_suggestedRatio1 = (double)suggestedWidth1 / (double)suggestedWidthTotal;
m_suggestedRatio2 = (double)suggestedWidth2 / (double)suggestedWidthTotal;
m_suggestedRatio3 = (double)suggestedWidth3 / (double)suggestedWidthTotal;
bool b;
double diff;
do {
b = false;
if(m_suggestedRatio1 > .42) {
diff = m_suggestedRatio1 - .42;
m_suggestedRatio1 = .42;
m_suggestedRatio2 += diff / 2;
m_suggestedRatio3 += diff / 2;
b = true;
}
if(m_suggestedRatio2 > .42) {
diff = m_suggestedRatio2 - .42;
m_suggestedRatio2 = .42;
m_suggestedRatio1 += diff / 2;
m_suggestedRatio3 += diff / 2;
b = true;
}
if(m_suggestedRatio3 > .42) {
diff = m_suggestedRatio3 - .42;
m_suggestedRatio3 = .42;
m_suggestedRatio2 += diff / 2;
m_suggestedRatio1 += diff / 2;
b = true;
}
} while(b);
fixColumnSizes();
}
void AutoSizingList::fixColumnSizes()
{
setUpdatesEnabled(false);
if(m_suggestedRatio1 + m_suggestedRatio2 + m_suggestedRatio3 != 0) {
int width = viewport()->width() - 40; //HACK: Why not 0?
setColumnWidth(1, m_suggestedRatio1 * width);
setColumnWidth(2, m_suggestedRatio2 * width);
setColumnWidth(3, m_suggestedRatio3 * width);
}
CollectionFilter *filter = qobject_cast<CollectionFilter*>(model());
if(filter) {
QModelIndex index = filter->currentItem();
if(index.isValid())
scrollTo(filter->mapFromSource(index), QAbstractItemView::PositionAtCenter);
}
setUpdatesEnabled(true);
}
void AutoSizingList::resizeEvent(QResizeEvent *event)
{
QWidget::resizeEvent(event);
fixColumnSizes();
if(m_childWidget) {
QRect rect = viewport()->geometry();
rect.setHeight(rect.height() - (int)(m_childWidget->sizeHint().height() * .5));
m_childWidget->setGeometry(rect);
}
}
void AutoSizingList::setChildWidget(QWidget *child)
{
m_childWidget = child;
child->setParent(this);
}
void AutoSizingList::setModel(CollectionFilter *model)
{
connect(model, SIGNAL(filterChanged()), this, SLOT(rowChange()));
QTreeView::setModel(model);
rowChange();
}
|