qgraphicswidget_p.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/widgets/graphicsview/qgraphicswidget_p.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8-
9-
10void QGraphicsWidgetPrivate::init(QGraphicsItem *parentItem, Qt::WindowFlags wFlags)-
11{-
12 QGraphicsWidget * const q = q_func();-
13-
14 attributes = 0;-
15 isWidget = 1;-
16 focusNext = focusPrev = q;-
17 focusPolicy = Qt::NoFocus;-
18-
19 adjustWindowFlags(&wFlags);-
20 windowFlags = wFlags;-
21-
22 q->setParentItem(parentItem);-
23 q->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred, QSizePolicy::DefaultType));-
24 q->setGraphicsItem(q);-
25-
26 resolveLayoutDirection();-
27 q->unsetWindowFrameMargins();-
28 flags |= QGraphicsItem::ItemUsesExtendedStyleOption;-
29 flags |= QGraphicsItem::ItemSendsGeometryChanges;-
30 if (windowFlags & Qt::Window)-
31 flags |= QGraphicsItem::ItemIsPanel;-
32}-
33-
34qreal QGraphicsWidgetPrivate::titleBarHeight(const QStyleOptionTitleBar &options) const-
35{-
36 const QGraphicsWidget * const q = q_func();-
37 int height = q->style()->pixelMetric(QStyle::PM_TitleBarHeight, &options);-
38 return (qreal)height;-
39}-
40-
41-
42-
43-
44QGraphicsWidgetPrivate::QGraphicsWidgetPrivate()-
45 : margins(nullptr),-
46 layout(nullptr),-
47 inheritedPaletteResolveMask(0),-
48 inheritedFontResolveMask(0),-
49 inSetGeometry(false),-
50 polished(false),-
51 inSetPos(false),-
52 autoFillBackground(false),-
53 focusPolicy(Qt::NoFocus),-
54 focusNext(nullptr),-
55 focusPrev(nullptr),-
56 windowFlags(),-
57 windowData(nullptr),-
58 setWindowFrameMargins(false),-
59 windowFrameMargins(nullptr)-
60{-
61}
never executed: end of block
0
62-
63QGraphicsWidgetPrivate::~QGraphicsWidgetPrivate()-
64{-
65-
66 delete[] margins;-
67 delete[] windowFrameMargins;-
68 delete windowData;-
69}-
70-
71-
72-
73-
74-
75-
76-
77void QGraphicsWidgetPrivate::ensureMargins() const-
78{-
79 if (!margins) {-
80 margins = new qreal[4];-
81 for (int i = 0; i < 4; ++i)-
82 margins[i] = 0;-
83 }-
84}-
85-
86-
87-
88-
89-
90-
91-
92void QGraphicsWidgetPrivate::ensureWindowFrameMargins() const-
93{-
94 if (!windowFrameMargins) {-
95 windowFrameMargins = new qreal[4];-
96 for (int i = 0; i < 4; ++i)-
97 windowFrameMargins[i] = 0;-
98 }-
99}-
100-
101-
102-
103-
104-
105-
106-
107void QGraphicsWidgetPrivate::ensureWindowData()-
108{-
109 if (!windowData)-
110 windowData = new WindowData;-
111}-
112-
113void QGraphicsWidgetPrivate::setPalette_helper(const QPalette &palette)-
114{-
115 if (this->palette == palette && this->palette.resolve() == palette.resolve())-
116 return;-
117 updatePalette(palette);-
118}-
119-
120void QGraphicsWidgetPrivate::resolvePalette(uint inheritedMask)-
121{-
122 inheritedPaletteResolveMask = inheritedMask;-
123 QPalette naturalPalette = naturalWidgetPalette();-
124 QPalette resolvedPalette = palette.resolve(naturalPalette);-
125 updatePalette(resolvedPalette);-
126}-
127-
128void QGraphicsWidgetPrivate::updatePalette(const QPalette &palette)-
129{-
130 QGraphicsWidget * const q = q_func();-
131-
132 this->palette = palette;-
133-
134-
135 if (q->isWindow() && !q->testAttribute(Qt::WA_WindowPropagation))-
136 inheritedPaletteResolveMask = 0;-
137 int mask = palette.resolve() | inheritedPaletteResolveMask;-
138-
139-
140 for (int i = 0; i < children.size(); ++i) {-
141 QGraphicsItem *item = children.at(i);-
142 if (item->isWidget()) {-
143 QGraphicsWidget *w = static_cast<QGraphicsWidget *>(item);-
144 if (!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))-
145 w->d_func()->resolvePalette(mask);-
146 } else {-
147 item->d_ptr->resolvePalette(mask);-
148 }-
149 }-
150-
151-
152 QEvent event(QEvent::PaletteChange);-
153 QApplication::sendEvent(q, &event);-
154}-
155-
156void QGraphicsWidgetPrivate::setLayoutDirection_helper(Qt::LayoutDirection direction)-
157{-
158 QGraphicsWidget * const q = q_func();-
159 if ((direction == Qt::RightToLeft) == (testAttribute(Qt::WA_RightToLeft)))-
160 return;-
161 q->setAttribute(Qt::WA_RightToLeft, (direction == Qt::RightToLeft));-
162-
163-
164 for (int i = 0; i < children.size(); ++i) {-
165 QGraphicsItem *item = children.at(i);-
166 if (item->isWidget()) {-
167 QGraphicsWidget *widget = static_cast<QGraphicsWidget *>(item);-
168 if (widget->parentWidget() && !widget->testAttribute(Qt::WA_SetLayoutDirection))-
169 widget->d_func()->setLayoutDirection_helper(direction);-
170 }-
171 }-
172-
173-
174 QEvent e(QEvent::LayoutDirectionChange);-
175 QApplication::sendEvent(q, &e);-
176}-
177-
178void QGraphicsWidgetPrivate::resolveLayoutDirection()-
179{-
180 QGraphicsWidget * const q = q_func();-
181 if (q->testAttribute(Qt::WA_SetLayoutDirection)) {-
182 return;-
183 }-
184 if (QGraphicsWidget *parentWidget = q->parentWidget()) {-
185 setLayoutDirection_helper(parentWidget->layoutDirection());-
186 } else if (scene) {-
187-
188-
189 setLayoutDirection_helper(QApplication::layoutDirection());-
190 } else {-
191 setLayoutDirection_helper(QApplication::layoutDirection());-
192 }-
193}-
194-
195QPalette QGraphicsWidgetPrivate::naturalWidgetPalette() const-
196{-
197 const QGraphicsWidget * const q = q_func();-
198 QPalette palette;-
199 if (QGraphicsWidget *parent = q->parentWidget()) {-
200 palette = parent->palette();-
201 } else if (scene) {-
202 palette = scene->palette();-
203 }-
204 palette.resolve(0);-
205 return palette;-
206}-
207-
208void QGraphicsWidgetPrivate::setFont_helper(const QFont &font)-
209{-
210 if (this->font == font && this->font.resolve() == font.resolve())-
211 return;-
212 updateFont(font);-
213}-
214-
215void QGraphicsWidgetPrivate::resolveFont(uint inheritedMask)-
216{-
217 QGraphicsWidget * const q = q_func();-
218 inheritedFontResolveMask = inheritedMask;-
219 if (QGraphicsWidget *p = q->parentWidget())-
220 inheritedFontResolveMask |= p->d_func()->inheritedFontResolveMask;-
221 QFont naturalFont = naturalWidgetFont();-
222 QFont resolvedFont = font.resolve(naturalFont);-
223 updateFont(resolvedFont);-
224}-
225-
226void QGraphicsWidgetPrivate::updateFont(const QFont &font)-
227{-
228 QGraphicsWidget * const q = q_func();-
229-
230 this->font = font;-
231-
232-
233 if (q->isWindow() && !q->testAttribute(Qt::WA_WindowPropagation))-
234 inheritedFontResolveMask = 0;-
235 int mask = font.resolve() | inheritedFontResolveMask;-
236-
237-
238 for (int i = 0; i < children.size(); ++i) {-
239 QGraphicsItem *item = children.at(i);-
240 if (item->isWidget()) {-
241 QGraphicsWidget *w = static_cast<QGraphicsWidget *>(item);-
242 if (!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))-
243 w->d_func()->resolveFont(mask);-
244 } else {-
245 item->d_ptr->resolveFont(mask);-
246 }-
247 }-
248-
249 if (!polished)-
250 return;-
251-
252 QEvent event(QEvent::FontChange);-
253 QApplication::sendEvent(q, &event);-
254}-
255-
256QFont QGraphicsWidgetPrivate::naturalWidgetFont() const-
257{-
258 const QGraphicsWidget * const q = q_func();-
259 QFont naturalFont;-
260 if (QGraphicsWidget *parent = q->parentWidget()) {-
261 naturalFont = parent->font();-
262 } else if (scene) {-
263 naturalFont = scene->font();-
264 }-
265 naturalFont.resolve(0);-
266 return naturalFont;-
267}-
268-
269void QGraphicsWidgetPrivate::initStyleOptionTitleBar(QStyleOptionTitleBar *option)-
270{-
271 QGraphicsWidget * const q = q_func();-
272 ensureWindowData();-
273 q->initStyleOption(option);-
274 option->rect.setHeight(titleBarHeight(*option));-
275 option->titleBarFlags = windowFlags;-
276 option->subControls = QStyle::SC_TitleBarCloseButton | QStyle::SC_TitleBarLabel | QStyle::SC_TitleBarSysMenu;-
277 option->activeSubControls = windowData->hoveredSubControl;-
278 bool isActive = q->isActiveWindow();-
279 if (isActive) {option->state|=.setFlag(QStyle::State_Active;, isActive);-
280 if (isActive
isActiveDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
281 option->titleBarState = Qt::WindowActive;-
282 option->titleBarState |= QStyle::State_Active;-
283 }
never executed: end of block
else {
0
284 option->state &= ~QStyle::State_Active;option->titleBarState = Qt::WindowNoState;-
285 }
never executed: end of block
0
286 QFont windowTitleFont = QApplication::font("QMdiSubWindowTitleBar");-
287 QRect textRect = q->style()->subControlRect(QStyle::CC_TitleBar, option, QStyle::SC_TitleBarLabel, 0);-
288 option->text = QFontMetrics(windowTitleFont).elidedText(-
289 windowData->windowTitle, Qt::ElideRight, textRect.width());-
290}
never executed: end of block
0
291-
292void QGraphicsWidgetPrivate::adjustWindowFlags(Qt::WindowFlags *flags)-
293{-
294 bool customize = (*flags & (Qt::CustomizeWindowHint-
295 | Qt::FramelessWindowHint-
296 | Qt::WindowTitleHint-
297 | Qt::WindowSystemMenuHint-
298 | Qt::WindowMinimizeButtonHint-
299 | Qt::WindowMaximizeButtonHint-
300 | Qt::WindowContextHelpButtonHint));-
301-
302 uint type = (*flags & Qt::WindowType_Mask);-
303 if (customize)-
304 ;-
305 else if (type == Qt::Dialog || type == Qt::Sheet)-
306 *flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowContextHelpButtonHint;-
307 else if (type == Qt::Tool)-
308 *flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint;-
309 else if (type == Qt::Window || type == Qt::SubWindow)-
310 *flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint-
311 | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint;-
312}-
313-
314void QGraphicsWidgetPrivate::windowFrameMouseReleaseEvent(QGraphicsSceneMouseEvent *event)-
315{-
316 QGraphicsWidget * const q = q_func();-
317 ensureWindowData();-
318 if (windowData->grabbedSection != Qt::NoSection) {-
319 if (windowData->grabbedSection == Qt::TitleBarArea) {-
320 windowData->buttonSunken = false;-
321 QStyleOptionTitleBar bar;-
322 initStyleOptionTitleBar(&bar);-
323-
324 bar.rect = q->windowFrameRect().toRect();-
325 bar.rect.moveTo(0,0);-
326 bar.rect.setHeight(q->style()->pixelMetric(QStyle::PM_TitleBarHeight, &bar));-
327 QPointF pos = event->pos();-
328 if (windowFrameMargins) {-
329 pos.rx() += windowFrameMargins[Left];-
330 pos.ry() += windowFrameMargins[Top];-
331 }-
332 bar.subControls = QStyle::SC_TitleBarCloseButton;-
333 if (q->style()->subControlRect(QStyle::CC_TitleBar, &bar,-
334 QStyle::SC_TitleBarCloseButton,-
335 event->widget()).contains(pos.toPoint())) {-
336 q->close();-
337 }-
338 }-
339 if (!(static_cast<QGraphicsSceneMouseEvent *>(event)->buttons()))-
340 windowData->grabbedSection = Qt::NoSection;-
341 event->accept();-
342 }-
343}-
344-
345void QGraphicsWidgetPrivate::windowFrameMousePressEvent(QGraphicsSceneMouseEvent *event)-
346{-
347 QGraphicsWidget * const q = q_func();-
348 if (event->button() != Qt::LeftButton)-
349 return;-
350-
351 ensureWindowData();-
352 windowData->startGeometry = q->geometry();-
353 windowData->grabbedSection = q->windowFrameSectionAt(event->pos());-
354 ensureWindowData();-
355 if (windowData->grabbedSection == Qt::TitleBarArea-
356 && windowData->hoveredSubControl == QStyle::SC_TitleBarCloseButton) {-
357 windowData->buttonSunken = true;-
358 q->update();-
359 }-
360 event->setAccepted(windowData->grabbedSection != Qt::NoSection);-
361}-
362static qreal minimumHeightForWidth(qreal width, qreal minh, qreal maxh,-
363 const QGraphicsWidget *widget,-
364 bool heightForWidth = true)-
365{-
366 qreal minimumHeightForWidth = -1;-
367 const bool hasHFW = QGraphicsLayoutItemPrivate::get(widget)->hasHeightForWidth();-
368 if (hasHFW == heightForWidth) {-
369 minimumHeightForWidth = hasHFW-
370 ? widget->effectiveSizeHint(Qt::MinimumSize, QSizeF(width, -1)).height()-
371 : widget->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, width)).width();-
372 } else {-
373-
374 const qreal constraint = width;-
375 while (maxh - minh > 0.1) {-
376 qreal middle = minh + (maxh - minh)/2;-
377-
378-
379-
380 qreal hfw = hasHFW-
381 ? widget->effectiveSizeHint(Qt::MinimumSize, QSizeF(middle, -1)).height()-
382 : widget->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, middle)).width();-
383 if (hfw > constraint) {-
384 minh = middle;-
385 } else if (hfw <= constraint) {-
386 maxh = middle;-
387 }-
388 }-
389 minimumHeightForWidth = maxh;-
390 }-
391 return minimumHeightForWidth;-
392}-
393-
394static qreal minimumWidthForHeight(qreal height, qreal minw, qreal maxw,-
395 const QGraphicsWidget *widget)-
396{-
397 return minimumHeightForWidth(height, minw, maxw, widget, false);-
398}-
399-
400static QSizeF closestAcceptableSize(const QSizeF &proposed,-
401 const QGraphicsWidget *widget)-
402{-
403 const QSizeF current = widget->size();-
404-
405 qreal minw = proposed.width();-
406 qreal maxw = current.width();-
407 qreal minh = proposed.height();-
408 qreal maxh = current.height();-
409-
410 qreal middlew = maxw;-
411 qreal middleh = maxh;-
412 qreal min_hfw;-
413 min_hfw = minimumHeightForWidth(maxw, minh, maxh, widget);-
414-
415 do {-
416 if (maxw - minw < 0.1) {-
417-
418 minw = maxw;-
419 minh = maxh;-
420 }-
421 middlew = minw + (maxw - minw)/2.0;-
422 middleh = minh + (maxh - minh)/2.0;-
423-
424 min_hfw = minimumHeightForWidth(middlew, minh, maxh, widget);-
425-
426 if (min_hfw > middleh) {-
427 minw = middlew;-
428 minh = middleh;-
429 } else if (min_hfw <= middleh) {-
430 maxw = middlew;-
431 maxh = middleh;-
432 }-
433 } while (maxw != minw);-
434-
435 min_hfw = minimumHeightForWidth(middlew, minh, maxh, widget);-
436-
437 QSizeF result;-
438 if (min_hfw < maxh) {-
439 result = QSizeF(middlew, min_hfw);-
440 } else {-
441-
442 result = QSizeF(minimumWidthForHeight(maxh, proposed.width(), current.width(), widget), maxh);-
443 }-
444 return result;-
445}-
446-
447static void _q_boundGeometryToSizeConstraints(const QRectF &startGeometry,-
448 QRectF *rect, Qt::WindowFrameSection section,-
449 const QSizeF &min, const QSizeF &max,-
450 const QGraphicsWidget *widget)-
451{-
452 const QRectF proposedRect = *rect;-
453 qreal width = qBound(min.width(), proposedRect.width(), max.width());-
454 qreal height = qBound(min.height(), proposedRect.height(), max.height());-
455-
456 const bool hasHFW = QGraphicsLayoutItemPrivate::get(widget)->hasHeightForWidth();-
457 const bool hasWFH = QGraphicsLayoutItemPrivate::get(widget)->hasWidthForHeight();-
458-
459 const bool widthChanged = proposedRect.width() != widget->size().width();-
460 const bool heightChanged = proposedRect.height() != widget->size().height();-
461-
462 if (hasHFW || hasWFH) {-
463 if (widthChanged || heightChanged) {-
464 qreal minExtent;-
465 qreal maxExtent;-
466 qreal constraint;-
467 qreal proposed;-
468 if (hasHFW) {-
469 minExtent = min.height();-
470 maxExtent = max.height();-
471 constraint = width;-
472 proposed = proposedRect.height();-
473 } else {-
474-
475 minExtent = min.width();-
476 maxExtent = max.width();-
477 constraint = height;-
478 proposed = proposedRect.width();-
479 }-
480 if (minimumHeightForWidth(constraint, minExtent, maxExtent, widget, hasHFW) > proposed) {-
481 QSizeF effectiveSize = closestAcceptableSize(QSizeF(width, height), widget);-
482 width = effectiveSize.width();-
483 height = effectiveSize.height();-
484 }-
485 }-
486 }-
487-
488 switch (section) {-
489 case Qt::LeftSection:-
490 rect->setRect(startGeometry.right() - qRound(width), startGeometry.top(),-
491 qRound(width), startGeometry.height());-
492 break;-
493 case Qt::TopLeftSection:-
494 rect->setRect(startGeometry.right() - qRound(width), startGeometry.bottom() - qRound(height),-
495 qRound(width), qRound(height));-
496 break;-
497 case Qt::TopSection:-
498 rect->setRect(startGeometry.left(), startGeometry.bottom() - qRound(height),-
499 startGeometry.width(), qRound(height));-
500 break;-
501 case Qt::TopRightSection:-
502 rect->setTop(rect->bottom() - qRound(height));-
503 rect->setWidth(qRound(width));-
504 break;-
505 case Qt::RightSection:-
506 rect->setWidth(qRound(width));-
507 break;-
508 case Qt::BottomRightSection:-
509 rect->setWidth(qRound(width));-
510 rect->setHeight(qRound(height));-
511 break;-
512 case Qt::BottomSection:-
513 rect->setHeight(qRound(height));-
514 break;-
515 case Qt::BottomLeftSection:-
516 rect->setRect(startGeometry.right() - qRound(width), startGeometry.top(),-
517 qRound(width), qRound(height));-
518 break;-
519 default:-
520 break;-
521 }-
522}-
523-
524void QGraphicsWidgetPrivate::windowFrameMouseMoveEvent(QGraphicsSceneMouseEvent *event)-
525{-
526 QGraphicsWidget * const q = q_func();-
527 ensureWindowData();-
528 if (!(event->buttons() & Qt::LeftButton) || windowData->hoveredSubControl != QStyle::SC_TitleBarLabel)-
529 return;-
530-
531 QLineF delta(q->mapFromScene(event->buttonDownScenePos(Qt::LeftButton)), event->pos());-
532 QLineF parentDelta(q->mapToParent(delta.p1()), q->mapToParent(delta.p2()));-
533 QLineF parentXDelta(q->mapToParent(QPointF(delta.p1().x(), 0)), q->mapToParent(QPointF(delta.p2().x(), 0)));-
534 QLineF parentYDelta(q->mapToParent(QPointF(0, delta.p1().y())), q->mapToParent(QPointF(0, delta.p2().y())));-
535-
536 QRectF newGeometry;-
537 switch (windowData->grabbedSection) {-
538 case Qt::LeftSection:-
539 newGeometry = QRectF(windowData->startGeometry.topLeft()-
540 + QPointF(parentXDelta.dx(), parentXDelta.dy()),-
541 windowData->startGeometry.size() - QSizeF(delta.dx(), delta.dy()));-
542 break;-
543 case Qt::TopLeftSection:-
544 newGeometry = QRectF(windowData->startGeometry.topLeft()-
545 + QPointF(parentDelta.dx(), parentDelta.dy()),-
546 windowData->startGeometry.size() - QSizeF(delta.dx(), delta.dy()));-
547 break;-
548 case Qt::TopSection:-
549 newGeometry = QRectF(windowData->startGeometry.topLeft()-
550 + QPointF(parentYDelta.dx(), parentYDelta.dy()),-
551 windowData->startGeometry.size() - QSizeF(0, delta.dy()));-
552 break;-
553 case Qt::TopRightSection:-
554 newGeometry = QRectF(windowData->startGeometry.topLeft()-
555 + QPointF(parentYDelta.dx(), parentYDelta.dy()),-
556 windowData->startGeometry.size() - QSizeF(-delta.dx(), delta.dy()));-
557 break;-
558 case Qt::RightSection:-
559 newGeometry = QRectF(windowData->startGeometry.topLeft(),-
560 windowData->startGeometry.size() + QSizeF(delta.dx(), 0));-
561 break;-
562 case Qt::BottomRightSection:-
563 newGeometry = QRectF(windowData->startGeometry.topLeft(),-
564 windowData->startGeometry.size() + QSizeF(delta.dx(), delta.dy()));-
565 break;-
566 case Qt::BottomSection:-
567 newGeometry = QRectF(windowData->startGeometry.topLeft(),-
568 windowData->startGeometry.size() + QSizeF(0, delta.dy()));-
569 break;-
570 case Qt::BottomLeftSection:-
571 newGeometry = QRectF(windowData->startGeometry.topLeft()-
572 + QPointF(parentXDelta.dx(), parentXDelta.dy()),-
573 windowData->startGeometry.size() - QSizeF(delta.dx(), -delta.dy()));-
574 break;-
575 case Qt::TitleBarArea:-
576 newGeometry = QRectF(windowData->startGeometry.topLeft()-
577 + QPointF(parentDelta.dx(), parentDelta.dy()),-
578 windowData->startGeometry.size());-
579 break;-
580 case Qt::NoSection:-
581 break;-
582 }-
583-
584 if (windowData->grabbedSection != Qt::NoSection) {-
585 _q_boundGeometryToSizeConstraints(windowData->startGeometry, &newGeometry,-
586 windowData->grabbedSection,-
587 q->effectiveSizeHint(Qt::MinimumSize),-
588 q->effectiveSizeHint(Qt::MaximumSize),-
589 q);-
590 q->setGeometry(newGeometry);-
591 }-
592}-
593-
594void QGraphicsWidgetPrivate::windowFrameHoverMoveEvent(QGraphicsSceneHoverEvent *event)-
595{-
596 QGraphicsWidget * const q = q_func();-
597 if (!hasDecoration())-
598 return;-
599-
600 ensureWindowData();-
601-
602 if (q->rect().contains(event->pos())) {-
603 if (windowData->buttonMouseOver || windowData->hoveredSubControl != QStyle::SC_None)-
604 windowFrameHoverLeaveEvent(event);-
605 return;-
606 }-
607-
608 bool wasMouseOver = windowData->buttonMouseOver;-
609 QRect oldButtonRect = windowData->buttonRect;-
610 windowData->buttonRect = QRect();-
611 windowData->buttonMouseOver = false;-
612 QPointF pos = event->pos();-
613 QStyleOptionTitleBar bar;-
614-
615 if (windowFrameMargins) {-
616 pos.rx() += windowFrameMargins[Left];-
617 pos.ry() += windowFrameMargins[Top];-
618 }-
619 initStyleOptionTitleBar(&bar);-
620 bar.rect = q->windowFrameRect().toRect();-
621 bar.rect.moveTo(0,0);-
622 bar.rect.setHeight(int(titleBarHeight(bar)));-
623-
624 Qt::CursorShape cursorShape = Qt::ArrowCursor;-
625 bool needsSetCursorCall = true;-
626 switch (q->windowFrameSectionAt(event->pos())) {-
627 case Qt::TopLeftSection:-
628 case Qt::BottomRightSection:-
629 cursorShape = Qt::SizeFDiagCursor;-
630 break;-
631 case Qt::TopRightSection:-
632 case Qt::BottomLeftSection:-
633 cursorShape = Qt::SizeBDiagCursor;-
634 break;-
635 case Qt::LeftSection:-
636 case Qt::RightSection:-
637 cursorShape = Qt::SizeHorCursor;-
638 break;-
639 case Qt::TopSection:-
640 case Qt::BottomSection:-
641 cursorShape = Qt::SizeVerCursor;-
642 break;-
643 case Qt::TitleBarArea:-
644 windowData->buttonRect = q->style()->subControlRect(-
645 QStyle::CC_TitleBar, &bar, QStyle::SC_TitleBarCloseButton, 0);-
646-
647-
648-
649-
650-
651-
652-
653 if (windowData->buttonRect.contains(pos.toPoint()))-
654 windowData->buttonMouseOver = true;-
655 event->ignore();-
656 break;-
657 default:-
658 needsSetCursorCall = false;-
659 event->ignore();-
660 }-
661-
662 if (needsSetCursorCall)-
663 q->setCursor(cursorShape);-
664-
665-
666 windowData->hoveredSubControl = q->style()->hitTestComplexControl(QStyle::CC_TitleBar, &bar, pos.toPoint(), 0);-
667 if (windowData->hoveredSubControl != QStyle::SC_TitleBarCloseButton)-
668 windowData->hoveredSubControl = QStyle::SC_TitleBarLabel;-
669-
670 if (windowData->buttonMouseOver != wasMouseOver) {-
671 if (!oldButtonRect.isNull())-
672 q->update(QRectF(oldButtonRect).translated(q->windowFrameRect().topLeft()));-
673 if (!windowData->buttonRect.isNull())-
674 q->update(QRectF(windowData->buttonRect).translated(q->windowFrameRect().topLeft()));-
675 }-
676}-
677-
678void QGraphicsWidgetPrivate::windowFrameHoverLeaveEvent(QGraphicsSceneHoverEvent *event)-
679{-
680 (void)event;;-
681 QGraphicsWidget * const q = q_func();-
682 if (hasDecoration()) {-
683-
684-
685 q->unsetCursor();-
686-
687-
688 ensureWindowData();-
689-
690 bool needsUpdate = false;-
691 if (windowData->hoveredSubControl == QStyle::SC_TitleBarCloseButton-
692 || windowData->buttonMouseOver)-
693 needsUpdate = true;-
694-
695-
696 windowData->hoveredSubControl = QStyle::SC_None;-
697 windowData->buttonMouseOver = false;-
698 windowData->buttonRect = QRect();-
699 if (needsUpdate)-
700 q->update(windowData->buttonRect);-
701 }-
702}-
703-
704bool QGraphicsWidgetPrivate::hasDecoration() const-
705{-
706 return (windowFlags & Qt::Window) && (windowFlags & Qt::WindowTitleHint);-
707}-
708-
709-
710-
711-
712void QGraphicsWidgetPrivate::fixFocusChainBeforeReparenting(QGraphicsWidget *newParent, QGraphicsScene *oldScene, QGraphicsScene *newScene)-
713{-
714 QGraphicsWidget * const q = q_func();-
715 ((!(focusNext && focusPrev)) ? qt_assert("focusNext && focusPrev",__FILE__,752776) : qt_noop());-
716-
717 if (q_ptr->isPanel()) {-
718-
719-
720-
721 return;-
722 }-
723-
724-
725-
726-
727-
728 QGraphicsWidget *focusFirst = q;-
729 QGraphicsWidget *focusBefore = focusPrev;-
730 QGraphicsWidget *focusLast = focusFirst;-
731 QGraphicsWidget *focusAfter = focusNext;-
732 do {-
733 if (!q->isAncestorOf(focusAfter))-
734 break;-
735 focusLast = focusAfter;-
736 } while ((focusAfter = focusAfter->d_func()->focusNext));-
737-
738 if (!parent && oldScene && oldScene != newScene && oldScene->d_func()->tabFocusFirst == q) {-
739-
740 oldScene->d_func()->tabFocusFirst = (focusAfter != q) ? focusAfter : 0;-
741 }-
742-
743-
744 focusBefore->d_func()->focusNext = focusAfter;-
745 focusAfter->d_func()->focusPrev = focusBefore;-
746-
747 if (newParent) {-
748-
749-
750 QGraphicsWidget *newFocusFirst = newParent;-
751 QGraphicsWidget *newFocusLast = newFocusFirst;-
752 QGraphicsWidget *newFocusAfter = newFocusFirst->d_func()->focusNext;-
753 do {-
754 if (!newParent->isAncestorOf(newFocusAfter))-
755 break;-
756 newFocusLast = newFocusAfter;-
757 } while ((newFocusAfter = newFocusAfter->d_func()->focusNext));-
758-
759 newFocusLast->d_func()->focusNext = q;-
760 focusLast->d_func()->focusNext = newFocusAfter;-
761 newFocusAfter->d_func()->focusPrev = focusLast;-
762 focusPrev = newFocusLast;-
763 } else {-
764-
765 focusPrev = focusLast;-
766 focusLast->d_func()->focusNext = q;-
767 }-
768}-
769-
770void QGraphicsWidgetPrivate::setLayout_helper(QGraphicsLayout *l)-
771{-
772 delete (this->layout);-
773 layout = l;-
774 if (!l) {-
775 QGraphicsWidget * const q = q_func();-
776 q->updateGeometry();-
777 }-
778}-
779-
780qreal QGraphicsWidgetPrivate::width() const-
781{-
782 const QGraphicsWidget * const q = q_func();-
783 return q->geometry().width();-
784}-
785-
786void QGraphicsWidgetPrivate::setWidth(qreal w)-
787{-
788 if (qIsNaN(w))-
789 return;-
790 QGraphicsWidget * const q = q_func();-
791 if (q->geometry().width() == w)-
792 return;-
793-
794 q->setGeometry(QRectF(q->x(), q->y(), w, height()));-
795}-
796-
797void QGraphicsWidgetPrivate::resetWidth()-
798{-
799 QGraphicsWidget * const q = q_func();-
800 q->setGeometry(QRectF(q->x(), q->y(), 0, height()));-
801}-
802-
803qreal QGraphicsWidgetPrivate::height() const-
804{-
805 const QGraphicsWidget * const q = q_func();-
806 return q->geometry().height();-
807}-
808-
809void QGraphicsWidgetPrivate::setHeight(qreal h)-
810{-
811 if (qIsNaN(h))-
812 return;-
813 QGraphicsWidget * const q = q_func();-
814 if (q->geometry().height() == h)-
815 return;-
816-
817 q->setGeometry(QRectF(q->x(), q->y(), width(), h));-
818}-
819-
820void QGraphicsWidgetPrivate::resetHeight()-
821{-
822 QGraphicsWidget * const q = q_func();-
823 q->setGeometry(QRectF(q->x(), q->y(), width(), 0));-
824}-
825-
826void QGraphicsWidgetPrivate::setGeometryFromSetPos()-
827{-
828 if (inSetGeometry)-
829 return;-
830 QGraphicsWidget * const q = q_func();-
831 inSetPos = 1;-
832-
833-
834 q->setGeometry(QRectF(pos, q->size()));-
835 inSetPos = 0 ;-
836}-
837-
838-
Switch to Source codePreprocessed file

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