aboutsummaryrefslogtreecommitdiffstats
path: root/AutoSizingList.cpp
blob: c9ea14c7d0c33aea87ef56fd31871805dd828273 (plain) (blame)
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();
}