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
119
120
121
122
|
/*
* 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;
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 remain;
#define MAX .42
do {
b = false;
if(m_suggestedRatio1 > MAX) {
remain = m_suggestedRatio1 + m_suggestedRatio2 + m_suggestedRatio3 - MAX;
m_suggestedRatio1 = MAX;
m_suggestedRatio2 = (m_suggestedRatio2 / (m_suggestedRatio2 + m_suggestedRatio3)) * remain;
m_suggestedRatio3 = (m_suggestedRatio3 / (m_suggestedRatio2 + m_suggestedRatio3)) * remain;
b = true;
}
if(m_suggestedRatio2 > MAX) {
remain = m_suggestedRatio1 + m_suggestedRatio2 + m_suggestedRatio3 - MAX;
m_suggestedRatio2 = MAX;
m_suggestedRatio1 = (m_suggestedRatio1 / (m_suggestedRatio1 + m_suggestedRatio3)) * remain;
m_suggestedRatio3 = (m_suggestedRatio3 / (m_suggestedRatio1 + m_suggestedRatio3)) * remain;
b = true;
}
if(m_suggestedRatio3 > MAX) {
remain = m_suggestedRatio1 + m_suggestedRatio2 + m_suggestedRatio3 - MAX;
m_suggestedRatio3 = MAX;
m_suggestedRatio2 = (m_suggestedRatio2 / (m_suggestedRatio2 + m_suggestedRatio1)) * remain;
m_suggestedRatio1 = (m_suggestedRatio1 / (m_suggestedRatio2 + m_suggestedRatio1)) * remain;
b = true;
}
} while(b);
#undef MAX
fixColumnSizes();
}
void AutoSizingList::fixColumnSizes()
{
if(m_suggestedRatio1 + m_suggestedRatio2 + m_suggestedRatio3) {
int width = viewport()->width() - 40; //HACK: Why not 0?
setColumnWidth(1, m_suggestedRatio1 * width);
setColumnWidth(2, m_suggestedRatio2 * width);
setColumnWidth(3, m_suggestedRatio3 * width);
}
QModelIndexList indexes = selectedIndexes();
if(indexes.count() > 0 && indexes[0].isValid())
scrollTo(indexes[0], QAbstractItemView::PositionAtCenter);
else {
CollectionFilter *filter = qobject_cast<CollectionFilter*>(model());
if(filter) {
QModelIndex index = filter->currentItem();
if(index.isValid())
scrollTo(filter->mapFromSource(index), QAbstractItemView::PositionAtCenter);
}
}
}
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();
}
|