qstatusbar.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/widgets/widgets/qstatusbar.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8-
9-
10class QStatusBarPrivate : public QWidgetPrivate-
11{-
12 inline QStatusBar* q_func() { return static_cast<QStatusBar *>(q_ptr); } inline const QStatusBar* q_func() const { return static_cast<const QStatusBar *>(q_ptr); } friend class QStatusBar;-
13public:-
14 QStatusBarPrivate() {}-
15-
16 struct SBItem {-
17 SBItem(QWidget* widget, int stretch, bool permanent)-
18 : s(stretch), w(widget), p(permanent) {}-
19 int s;-
20 QWidget * w;-
21 bool p;-
22 };-
23-
24 QList<SBItem *> items;-
25 QString tempItem;-
26-
27 QBoxLayout * box;-
28 QTimer * timer;-
29-
30-
31 QSizeGrip * resizer;-
32 bool showSizeGrip;-
33-
34-
35 int savedStrut;-
36-
37-
38-
39-
40-
41 int indexToLastNonPermanentWidget() const-
42 {-
43 int i = items.size() - 1;-
44 for (; i >= 0; --i) {-
45 SBItem *item = items.at(i);-
46 if (!(item && item->p))-
47 break;-
48 }-
49 return i;-
50 }-
51-
52-
53 void tryToShowSizeGrip()-
54 {-
55 if (!showSizeGrip)-
56 return;-
57 showSizeGrip = false;-
58 if (!resizer || resizer->isVisible())-
59 return;-
60 resizer->setAttribute(Qt::WA_WState_ExplicitShowHide, false);-
61 QMetaObject::invokeMethod(resizer, "_q_showIfNotHidden", Qt::DirectConnection);-
62 resizer->setAttribute(Qt::WA_WState_ExplicitShowHide, false);-
63 }-
64-
65-
66 QRect messageRect() const;-
67};-
68-
69-
70QRect QStatusBarPrivate::messageRect() const-
71{-
72 const QStatusBar * const q = q_func();-
73 bool rtl = q->layoutDirection() == Qt::RightToLeft;-
74-
75 int left = 6;-
76 int right = q->width() - 12;-
77-
78-
79 if (resizer && resizer->isVisible()) {-
80 if (rtl)-
81 left = resizer->x() + resizer->width();-
82 else-
83 right = resizer->x();-
84 }-
85-
86-
87 for (int i=0; i<items.size(); ++i) {-
88 QStatusBarPrivate::SBItem* item = items.at(i);-
89 if (!item)-
90 break;-
91 if (item->p && item->w->isVisible()) {-
92 if (item->p) {-
93 if (rtl)-
94 left = qMax(left, item->w->x() + item->w->width() + 2);-
95 else-
96 right = qMin(right, item->w->x() - 2);-
97 }-
98 break;-
99 }-
100 }-
101 return QRect(left, 0, right-left, q->height());-
102}-
103QStatusBar::QStatusBar(QWidget * parent)-
104 : QWidget(*new QStatusBarPrivate, parent, 0)-
105{-
106 QStatusBarPrivate * const d = d_func();-
107 d->box = 0;-
108 d->timer = 0;-
109-
110-
111 d->resizer = 0;-
112 setSizeGripEnabled(true);-
113-
114-
115-
116}-
117-
118-
119-
120-
121-
122QStatusBar::~QStatusBar()-
123{-
124 QStatusBarPrivate * const d = d_func();-
125 while (!d->items.isEmpty())-
126 delete d->items.takeFirst();-
127}-
128void QStatusBar::addWidget(QWidget * widget, int stretch)-
129{-
130 if (!widget)-
131 return;-
132 insertWidget(d_func()->indexToLastNonPermanentWidget() + 1, widget, stretch);-
133}-
134int QStatusBar::insertWidget(int index, QWidget *widget, int stretch)-
135{-
136 if (!widget
!widgetDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
137 return
never executed: return -1;
-1;
never executed: return -1;
0
138-
139 QStatusBarPrivate * const d = d_func();-
140 QStatusBarPrivate::SBItem* item = new QStatusBarPrivate::SBItem(widget, stretch, false);-
141-
142 int idx = d->indexToLastNonPermanentWidget();-
143 if (__builtin_expect(!!(
__builtin_expe... + 1)), false)Description
TRUEnever evaluated
FALSEnever evaluated
index < 0 || index > d->items.size() || (idx >= 0 && index > idx + 1)), false)
__builtin_expe... + 1)), false)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
144 QMessageLogger(__FILE__, 300306, __PRETTY_FUNCTION__).warning("QStatusBar::insertWidget: Index out of range (%d), appending widget", index);-
145 index = idx + 1;-
146 }
never executed: end of block
0
147 d->items.insert(index, item);-
148-
149 if (!d->tempItem.isEmpty()
!d->tempItem.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
150 widget->hide();
never executed: widget->hide();
0
151-
152 reformat();-
153 if (!widget->isHidden()
!widget->isHidden()Description
TRUEnever evaluated
FALSEnever evaluated
|| !widget->testAttribute(Qt::WA_WState_ExplicitShowHide)
!widget->testA...licitShowHide)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
154 widget->show();
never executed: widget->show();
0
155-
156 return
never executed: return index;
index;
never executed: return index;
0
157}-
158void QStatusBar::addPermanentWidget(QWidget * widget, int stretch)-
159{-
160 if (!widget)-
161 return;-
162 insertPermanentWidget(d_func()->items.size(), widget, stretch);-
163}-
164int QStatusBar::insertPermanentWidget(int index, QWidget *widget, int stretch)-
165{-
166 if (!widget
!widgetDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
167 return
never executed: return -1;
-1;
never executed: return -1;
0
168-
169 QStatusBarPrivate * const d = d_func();-
170 QStatusBarPrivate::SBItem* item = new QStatusBarPrivate::SBItem(widget, stretch, true);-
171-
172 int idx = d->indexToLastNonPermanentWidget();-
173 if (__builtin_expect(!!(
__builtin_expe... idx)), false)Description
TRUEnever evaluated
FALSEnever evaluated
index < 0 || index > d->items.size() || (idx >= 0 && index <= idx)), false)
__builtin_expe... idx)), false)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
174 QMessageLogger(__FILE__, 365371, __PRETTY_FUNCTION__).warning("QStatusBar::insertPermanentWidget: Index out of range (%d), appending widget", index);-
175 index = d->items.size();-
176 }
never executed: end of block
0
177 d->items.insert(index, item);-
178-
179 reformat();-
180 if (!widget->isHidden()
!widget->isHidden()Description
TRUEnever evaluated
FALSEnever evaluated
|| !widget->testAttribute(Qt::WA_WState_ExplicitShowHide)
!widget->testA...licitShowHide)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
181 widget->show();
never executed: widget->show();
0
182-
183 return
never executed: return index;
index;
never executed: return index;
0
184}-
185void QStatusBar::removeWidget(QWidget *widget)-
186{-
187 if (!widget)-
188 return;-
189-
190 QStatusBarPrivate * const d = d_func();-
191 bool found = false;-
192 QStatusBarPrivate::SBItem* item;-
193 for (int i=0; i<d->items.size(); ++i) {-
194 item = d->items.at(i);-
195 if (!item)-
196 break;-
197 if (item->w == widget) {-
198 d->items.removeAt(i);-
199 item->w->hide();-
200 delete item;-
201 found = true;-
202 break;-
203 }-
204 }-
205-
206 if (found)-
207 reformat();-
208-
209 else-
210 QMessageLogger(__FILE__, 412418, __PRETTY_FUNCTION__).debug("QStatusBar::removeWidget(): Widget not found.");-
211-
212}-
213bool QStatusBar::isSizeGripEnabled() const-
214{-
215-
216-
217-
218 const QStatusBarPrivate * const d = d_func();-
219 return !!d->resizer;-
220-
221}-
222-
223void QStatusBar::setSizeGripEnabled(bool enabled)-
224{-
225-
226-
227-
228 QStatusBarPrivate * const d = d_func();-
229 if (!enabled != !d->resizer) {-
230 if (enabled) {-
231 d->resizer = new QSizeGrip(this);-
232 d->resizer->hide();-
233 d->resizer->installEventFilter(this);-
234 d->showSizeGrip = true;-
235 } else {-
236 delete d->resizer;-
237 d->resizer = 0;-
238 d->showSizeGrip = false;-
239 }-
240 reformat();-
241 if (d->resizer && isVisible())-
242 d->tryToShowSizeGrip();-
243 }-
244-
245}-
246void QStatusBar::reformat()-
247{-
248 QStatusBarPrivate * const d = d_func();-
249 if (d->box)-
250 delete d->box;-
251-
252 QBoxLayout *vbox;-
253-
254 if (d->resizer) {-
255 d->box = new QHBoxLayout(this);-
256 d->box->setMargin(0);-
257 vbox = new QVBoxLayout;-
258 d->box->addLayout(vbox);-
259 } else-
260-
261 {-
262 vbox = d->box = new QVBoxLayout(this);-
263 d->box->setMargin(0);-
264 }-
265 vbox->addSpacing(3);-
266 QBoxLayout* l = new QHBoxLayout;-
267 vbox->addLayout(l);-
268 l->addSpacing(2);-
269 l->setSpacing(6);-
270-
271 int maxH = fontMetrics().height();-
272-
273 int i;-
274 QStatusBarPrivate::SBItem* item;-
275 for (i=0,item=0; i<d->items.size(); ++i) {-
276 item = d->items.at(i);-
277 if (!item || item->p)-
278 break;-
279 l->addWidget(item->w, item->s);-
280 int itemH = qMin(qSmartMinSize(item->w).height(), item->w->maximumHeight());-
281 maxH = qMax(maxH, itemH);-
282 }-
283-
284 l->addStretch(0);-
285-
286 for (item=0; i<d->items.size(); ++i) {-
287 item = d->items.at(i);-
288 if (!item)-
289 break;-
290 l->addWidget(item->w, item->s);-
291 int itemH = qMin(qSmartMinSize(item->w).height(), item->w->maximumHeight());-
292 maxH = qMax(maxH, itemH);-
293 }-
294-
295 if (d->resizer) {-
296 maxH = qMax(maxH, d->resizer->sizeHint().height());-
297 d->box->addSpacing(1);-
298 d->box->addWidget(d->resizer, 0, Qt::AlignBottom);-
299 }-
300-
301 l->addStrut(maxH);-
302 d->savedStrut = maxH;-
303 vbox->addSpacing(2);-
304 d->box->activate();-
305 update();-
306}-
307void QStatusBar::showMessage(const QString &message, int timeout)-
308{-
309 QStatusBarPrivate * const d = d_func();-
310-
311 if (timeout > 0) {-
312 if (!d->timer) {-
313 d->timer = new QTimer(this);-
314 connect(d->timer, qFlagLocation("2""timeout()" "\0" __FILE__ ":" "549""555"), this, qFlagLocation("1""clearMessage()" "\0" __FILE__ ":" "549""555"));-
315 }-
316 d->timer->start(timeout);-
317 } else if (d->timer) {-
318 delete d->timer;-
319 d->timer = 0;-
320 }-
321 if (d->tempItem == message)-
322 return;-
323 d->tempItem = message;-
324-
325 hideOrShow();-
326}-
327-
328-
329-
330-
331-
332-
333-
334void QStatusBar::clearMessage()-
335{-
336 QStatusBarPrivate * const d = d_func();-
337 if (d->tempItem.isEmpty())-
338 return;-
339 if (d->timer) {-
340 qDeleteInEventHandler(d->timer);-
341 d->timer = 0;-
342 }-
343 d->tempItem.clear();-
344 hideOrShow();-
345}-
346-
347-
348-
349-
350-
351-
352-
353QString QStatusBar::currentMessage() const-
354{-
355 const QStatusBarPrivate * const d = d_func();-
356 return d->tempItem;-
357}-
358void QStatusBar::hideOrShow()-
359{-
360 QStatusBarPrivate * const d = d_func();-
361 bool haveMessage = !d->tempItem.isEmpty();-
362-
363 QStatusBarPrivate::SBItem* item = 0;-
364 for (int i=0; i<d->items.size(); ++i) {-
365 item = d->items.at(i);-
366 if (!item || item->p)-
367 break;-
368 if (haveMessage && item->w->isVisible()) {-
369 item->w->hide();-
370 item->w->setAttribute(Qt::WA_WState_ExplicitShowHide, false);-
371 } else if (!haveMessage && !item->w->testAttribute(Qt::WA_WState_ExplicitShowHide)) {-
372 item->w->show();-
373 }-
374 }-
375-
376 messageChanged(d->tempItem);-
377-
378-
379 if (QAccessible::isActive()) {-
380 QAccessibleEvent event(this, QAccessible::NameChanged);-
381 QAccessible::updateAccessibility(&event);-
382 }-
383-
384-
385 repaint(d->messageRect());-
386}-
387-
388-
389-
390-
391void QStatusBar::showEvent(QShowEvent *)-
392{-
393-
394 QStatusBarPrivate * const d = d_func();-
395 if (d->resizer && d->showSizeGrip)-
396 d->tryToShowSizeGrip();-
397-
398}-
399void QStatusBar::paintEvent(QPaintEvent *event)-
400{-
401 QStatusBarPrivate * const d = d_func();-
402 bool haveMessage = !d->tempItem.isEmpty();-
403-
404 QPainter p(this);-
405 QStyleOption opt;-
406 opt.initFrom(this);-
407 style()->drawPrimitive(QStyle::PE_PanelStatusBar, &opt, &p, this);-
408-
409 for (int i=0; i<d->items.size(); ++i) {-
410 QStatusBarPrivate::SBItem* item = d->items.at(i);-
411 if (item && item->w->isVisible() && (!haveMessage || item->p)) {-
412 QRect ir = item->w->geometry().adjusted(-2, -1, 2, 1);-
413 if (event->rect().intersects(ir)) {-
414 QStyleOption opt(0);-
415 opt.rect = ir;-
416 opt.palette = palette();-
417 opt.state = QStyle::State_None;-
418 style()->drawPrimitive(QStyle::PE_FrameStatusBarItem, &opt, &p, item->w);-
419 }-
420 }-
421 }-
422 if (haveMessage) {-
423 p.setPen(palette().foreground().color());-
424 p.drawText(d->messageRect(), Qt::AlignLeading | Qt::AlignVCenter | Qt::TextSingleLine, d->tempItem);-
425 }-
426}-
427-
428-
429-
430-
431void QStatusBar::resizeEvent(QResizeEvent * e)-
432{-
433 QWidget::resizeEvent(e);-
434}-
435-
436-
437-
438-
439-
440bool QStatusBar::event(QEvent *e)-
441{-
442 QStatusBarPrivate * const d = d_func();-
443-
444 if (e->type() == QEvent::LayoutRequest-
445 ) {-
446-
447 int maxH = fontMetrics().height();-
448-
449 QStatusBarPrivate::SBItem* item = 0;-
450 for (int i=0; i<d->items.size(); ++i) {-
451 item = d->items.at(i);-
452 if (!item)-
453 break;-
454 int itemH = qMin(qSmartMinSize(item->w).height(), item->w->maximumHeight());-
455 maxH = qMax(maxH, itemH);-
456 }-
457-
458-
459 if (d->resizer)-
460 maxH = qMax(maxH, d->resizer->sizeHint().height());-
461-
462-
463 if (maxH != d->savedStrut)-
464 reformat();-
465 else-
466 update();-
467 }-
468 if (e->type() == QEvent::ChildRemoved) {-
469 QStatusBarPrivate::SBItem* item = 0;-
470 for (int i=0; i<d->items.size(); ++i) {-
471 item = d->items.at(i);-
472 if (!item)-
473 break;-
474 if (item->w == ((QChildEvent*)e)->child()) {-
475 d->items.removeAt(i);-
476 delete item;-
477 }-
478 }-
479 }-
480-
481-
482-
483-
484 return QWidget::event(e);-
485}-
486-
487-
488-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9