Isis 3 Programmer Reference
TreeViewHeader.cpp
1
7/* SPDX-License-Identifier: CC0-1.0 */
8
9#include "TreeViewHeader.h"
10
11#include <iostream>
12
13#include <QAbstractItemModel>
14#include <QFontMetrics>
15#include <QLabel>
16#include <QLinearGradient>
17#include <QLocale>
18#include <QPainter>
19#include <QPen>
20#include <QRect>
21#include <QString>
22#include <QVBoxLayout>
23
24#include "TreeView.h"
25#include "TreeViewContent.h"
26#include "AbstractTreeModel.h"
27
28
29namespace Isis {
30 TreeViewHeader::TreeViewHeader(TreeViewContent *someContent,
31 QWidget *parent) : QWidget(parent), m_content(someContent) {
32 nullify();
33
34 m_headerText = new QString("Header text");
35 m_filterProgress = 0;
36 m_filterProgressMin = 0;
37 m_filterProgressMax = 0;
38 m_rebuildProgress = 0;
39 m_rebuildProgressMin = 0;
40 m_rebuildProgressMax = 0;
41 m_active = false;
42 m_visibleCount = -1;
43 m_totalCount = -1;
44 }
45
46
47 TreeViewHeader::TreeViewHeader(const TreeViewHeader &other) {
48 nullify();
49
50 m_headerText = new QString(*other.m_headerText);
51 }
52
53
54 TreeViewHeader::~TreeViewHeader() {
55 if (m_headerText) {
56 delete m_headerText;
57 m_headerText = NULL;
58 }
59 }
60
61
62 QSize TreeViewHeader::minimumSizeHint() const {
63 return QSize(QFontMetrics(font()).width(*m_headerText) + 15,
64 QFontMetrics(font()).height() + 6);
65 }
66
67 QString TreeViewHeader::getText() {
68 return *m_headerText;
69 }
70
71
72 void TreeViewHeader::setText(QString text) {
73 *m_headerText = text;
74 updateGeometry();
75 update();
76 }
77
78
79 TreeViewHeader &TreeViewHeader::operator=(
80 const TreeViewHeader &other) {
81 if (this != &other) {
82 if (m_headerText) {
83 delete m_headerText;
84 m_headerText = NULL;
85 }
86 m_headerText = new QString;
87 *m_headerText = *other.m_headerText;
88 }
89
90 return *this;
91 }
92
93
94 void TreeViewHeader::setActive(bool newActiveState) {
95 m_active = newActiveState;
96 }
97
98
99 void TreeViewHeader::handleFilterCountsChanged(
100 int visibleTopLevelItemCount, int topLevelItemCount) {
101 m_visibleCount = visibleTopLevelItemCount;
102 m_totalCount = topLevelItemCount;
103 updateGeometry();
104 update();
105 }
106
107
108 void TreeViewHeader::mouseReleaseEvent(QMouseEvent *event) {
109 setActive(true);
110 emit(activated());
111 update();
112 }
113
114
115 void TreeViewHeader::paintEvent(QPaintEvent *event) {
116 QPainter painter(this);
117 painter.setRenderHints(QPainter::Antialiasing |
118 QPainter::TextAntialiasing);
119 paintHeader(&painter, height());
120 painter.drawRect(0, 0, width(), height());
121 painter.end();
122 }
123
124
125 void TreeViewHeader::nullify() {
126 m_headerText = NULL;
127 }
128
129
130 void TreeViewHeader::paintHeader(QPainter *painter, int rowHeight) {
131 QRect rect(0, 0, width(), rowHeight);
132
133 int x = rect.center().x();
134 QLinearGradient gradient(x, rect.top(), x, rect.bottom());
135
136 //FIXME: selected needs to be member variable
137 bool selected = false;
138 QColor color = selected ? palette().highlight().color() :
139 palette().button().color();
140
141 // create gradient and fill header area with it
142 int adjustment = 100;
143 m_active ? adjustment += 7 : adjustment -= 3;
144 gradient.setColorAt(0, color.darker(adjustment));
145 gradient.setColorAt(0.5, color.lighter(adjustment));
146 gradient.setColorAt(1, color.darker(adjustment));
147 painter->fillRect(rect, gradient);
148
149 // Save off composition mode and brush, which will need to be restored
150 // after the progress is painted.
151 QBrush brush = painter->brush();
152 QPainter::CompositionMode compMode = painter->compositionMode();
153 painter->setCompositionMode(QPainter::CompositionMode_SourceOver);
154
155 // draw filter progress (if not at 100%)
156 painter->setBrush(QBrush(QColor(0, 70, 100, 30)));
157 paintProgress(painter, rect, m_filterProgressMin, m_filterProgressMax,
158 m_filterProgress);
159
160 // draw rebuild progress (if not at 100%)
161 painter->setBrush(QBrush(QColor(100, 70, 0, 30)));
162 paintProgress(painter, rect, m_rebuildProgressMin, m_rebuildProgressMax,
163 m_rebuildProgress);
164
165 // draw the header's text
166 painter->setBrush(brush);
167 painter->setCompositionMode(compMode);
168 painter->setPen(selected ? palette().highlightedText().color() :
169 palette().buttonText().color());
170
171 QString title(*m_headerText);
172
173 if (m_visibleCount >= 0) {
174 title += " (";
175
176 title += QLocale().toString(m_visibleCount);
177
178 title += " / ";
179 title += QLocale().toString(m_totalCount);
180 title += ")";
181 }
182
183 painter->drawText(rect, title, QTextOption(Qt::AlignCenter));
184 }
185
186
187 void TreeViewHeader::paintProgress(QPainter *painter, const QRect &rect,
188 int min, int max, int value) {
189 // draw filter progress if not at 100%
190 double progressPercent = 1.0;
191 int progressRange = max - min;
192 if (progressRange > 0)
193 progressPercent = ((double)(value - min)) / progressRange;
194
195 if (progressPercent < 1.0) {
196 QRect progressRect(rect);
197 progressRect.setWidth((int)(progressRect.width() * progressPercent));
198 painter->fillRect(progressRect, painter->brush());
199 }
200 }
201
202
203 void TreeViewHeader::updateFilterProgress(int newProgress) {
204 m_filterProgress = newProgress;
205 update();
206 }
207
208
209 void TreeViewHeader::updateFilterProgressRange(int min, int max) {
210 m_filterProgressMin = min;
211 m_filterProgressMax = max;
212 update();
213 }
214
215
216 void TreeViewHeader::updateRebuildProgress(int newProgress) {
217 m_rebuildProgress = newProgress;
218 update();
219 }
220
221
222 void TreeViewHeader::updateRebuildProgressRange(int min, int max) {
223 m_rebuildProgressMin = min;
224 m_rebuildProgressMax = max;
225 update();
226 }
227}
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16