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

U.S. Department of the Interior | U.S. Geological Survey
ISIS | Privacy & Disclaimers | Astrogeology Research Program
To contact us, please post comments and questions on the ISIS Support Center
File Modified: 07/12/2023 23:31:08