QtCanpool 3.3.0
载入中...
搜索中...
未找到
dockoverlay.cpp
浏览该文件的文档.
1
6#include "dockoverlay.h"
7#include "dockpanel.h"
8#include "docktitlebar.h"
9#include "docktabbar.h"
10#include "dockcontainer.h"
11#include "docksidebar.h"
12#include "dockmanager.h"
13#include "dockutils.h"
14
15#include <QPainter>
16#include <QGridLayout>
17#include <QWindow>
18#include <QLabel>
19#include <QPointer>
20
22
23static const int s_invalidTabIndex = -2;
24static const int s_autoHideAreaWidth = 32;
25static const int s_autoHideAreaMouseZone = 8;
26
27class DockOverlayPrivate
28{
29public:
30 QX_DECLARE_PUBLIC(DockOverlay)
31public:
32 DockOverlayPrivate();
33
34 int sideBarOverlaySize(Qx::DockSideBarArea area);
35 int sideBarMouseZone(Qx::DockSideBarArea area);
36public:
37 DockOverlay::OverlayMode m_mode = DockOverlay::PanelOverlayMode;
38 Qx::DockWidgetAreas m_allowedAreas = Qx::InvalidDockWidgetArea;
40 QPointer<QWidget> m_targetWidget;
41 bool m_dropPreviewEnabled = true;
42 QRect m_dropAreaRect;
43 int m_tabIndex = s_invalidTabIndex;
44 DockOverlayCross *m_cross;
45};
46
47DockOverlayPrivate::DockOverlayPrivate()
48{
49}
50
51int DockOverlayPrivate::sideBarOverlaySize(Qx::DockSideBarArea area)
52{
53 auto container = qobject_cast<DockContainer *>(m_targetWidget.data());
54 auto sideBar = container->autoHideSideBar(area);
55 if (!sideBar || !sideBar->isVisibleTo(container)) {
56 return s_autoHideAreaWidth;
57 } else {
58 return (sideBar->orientation() == Qt::Horizontal) ? sideBar->height() : sideBar->width();
59 }
60}
61
62int DockOverlayPrivate::sideBarMouseZone(Qx::DockSideBarArea area)
63{
64 auto container = qobject_cast<DockContainer *>(m_targetWidget.data());
65 auto sideBar = container->autoHideSideBar(area);
66 if (!sideBar || !sideBar->isVisibleTo(container)) {
67 return s_autoHideAreaMouseZone;
68 } else {
69 return (sideBar->orientation() == Qt::Horizontal) ? sideBar->height() : sideBar->width();
70 }
71}
72
73DockOverlay::DockOverlay(QWidget *parent, OverlayMode mode)
74 : Super(parent)
75{
77 Q_D(DockOverlay);
78
79 d->m_mode = mode;
80 d->m_cross = new DockOverlayCross(this);
81
82#if QX_DOCK_X11
83 setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);
84#else
85 setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
86#endif
87 setWindowOpacity(1);
88 setWindowTitle("DockOverlay");
89 setAttribute(Qt::WA_NoSystemBackground);
90 setAttribute(Qt::WA_TranslucentBackground);
91
92 d->m_cross->setVisible(false);
93 setVisible(false);
94}
95
100
101void DockOverlay::setAllowedAreas(Qx::DockWidgetAreas areas)
102{
103 Q_D(DockOverlay);
104 if (areas == d->m_allowedAreas) {
105 return;
106 }
107 d->m_allowedAreas = areas;
108 d->m_cross->reset();
109}
110
112{
113 Q_D(DockOverlay);
114 auto areasOld = d->m_allowedAreas;
115 d->m_allowedAreas.setFlag(area, enable);
116 if (areasOld != d->m_allowedAreas) {
117 d->m_cross->reset();
118 }
119}
120
121Qx::DockWidgetAreas DockOverlay::allowedAreas() const
122{
123 Q_D(const DockOverlay);
124 return d->m_allowedAreas;
125}
126
128{
129 Q_D(DockOverlay);
130 d->m_tabIndex = s_invalidTabIndex;
131 if (!d->m_targetWidget) {
133 }
134
135 Qx::DockWidgetArea result = d->m_cross->cursorLocation();
136 if (result != Qx::InvalidDockWidgetArea) {
137 return result;
138 }
139
140 auto cursorPos = QCursor::pos();
141 auto panel = qobject_cast<DockPanel *>(d->m_targetWidget.data());
143 auto Rect = rect();
144 const QPoint pos = mapFromGlobal(QCursor::pos());
145 if ((pos.x() < d->sideBarMouseZone(Qx::DockSideBarLeft)) && d->m_allowedAreas.testFlag(Qx::LeftAutoHideArea)) {
146 result = Qx::LeftAutoHideArea;
147 } else if (pos.x() > (Rect.width() - d->sideBarMouseZone(Qx::DockSideBarRight)) &&
148 d->m_allowedAreas.testFlag(Qx::RightAutoHideArea)) {
149 result = Qx::RightAutoHideArea;
150 } else if (pos.y() < d->sideBarMouseZone(Qx::DockSideBarTop) &&
151 d->m_allowedAreas.testFlag(Qx::TopAutoHideArea)) {
152 result = Qx::TopAutoHideArea;
153 } else if (pos.y() > (Rect.height() - d->sideBarMouseZone(Qx::DockSideBarBottom)) &&
154 d->m_allowedAreas.testFlag(Qx::BottomAutoHideArea)) {
155 result = Qx::BottomAutoHideArea;
156 }
157
158 auto sideBarArea = internal::toSideBarArea(result);
159 if (sideBarArea != Qx::DockSideBarNone) {
160 auto container = qobject_cast<DockContainer *>(d->m_targetWidget.data());
161 auto sideBar = container->autoHideSideBar(sideBarArea);
162 if (sideBar->isVisible()) {
163 d->m_tabIndex = sideBar->tabInsertIndexAt(sideBar->mapFromGlobal(cursorPos));
164 }
165 }
166 return result;
167 } else if (!panel) {
168 return result;
169 }
170
171 if (panel->allowedAreas().testFlag(Qx::CenterDockWidgetArea) && !panel->titleBar()->isHidden() &&
172 panel->titleBarGeometry().contains(panel->mapFromGlobal(cursorPos))) {
173 auto tabBar = panel->titleBar()->tabBar();
174 d->m_tabIndex = tabBar->tabInsertIndexAt(tabBar->mapFromGlobal(cursorPos));
176 }
177
178 return result;
179}
180
191{
192 Q_D(const DockOverlay);
193 return d->m_tabIndex;
194}
195
197{
198 Q_D(const DockOverlay);
199 if (isHidden() || !d->m_dropPreviewEnabled) {
201 } else {
202 return dropAreaUnderCursor();
203 }
204}
205
207{
208 Q_D(DockOverlay);
209 if (d->m_targetWidget == target) {
210 // Hint: We could update geometry of overlay here.
212 if (da != d->m_lastLocation) {
213 repaint();
214 d->m_lastLocation = da;
215 }
216 return da;
217 }
218
219 d->m_targetWidget = target;
220 d->m_lastLocation = Qx::InvalidDockWidgetArea;
221
222 // Move it over the target.
223 hide();
224 resize(target->size());
225 QPoint TopLeft = target->mapToGlobal(target->rect().topLeft());
226 move(TopLeft);
227 show();
228 d->m_cross->updatePosition();
229 d->m_cross->updateOverlayIcons();
230
231 return dropAreaUnderCursor();
232}
233
235{
236 Q_D(DockOverlay);
237 hide();
238 d->m_targetWidget.clear();
239 d->m_lastLocation = Qx::InvalidDockWidgetArea;
240 d->m_dropAreaRect = QRect();
241}
242
244{
245 Q_D(DockOverlay);
246 d->m_dropPreviewEnabled = enable;
247 update();
248}
249
251{
252 Q_D(const DockOverlay);
253 return d->m_dropAreaRect;
254}
255
256bool DockOverlay::event(QEvent *e)
257{
258 Q_D(DockOverlay);
259 bool result = Super::event(e);
260 if (e->type() == QEvent::Polish) {
261 d->m_cross->setupOverlayCross(d->m_mode);
262 }
263 return result;
264}
265
266void DockOverlay::paintEvent(QPaintEvent *e)
267{
268 Q_UNUSED(e);
269 Q_D(DockOverlay);
270
271 // Draw rect based on location
272 if (!d->m_dropPreviewEnabled) {
273 d->m_dropAreaRect = QRect();
274 return;
275 }
276
277 QRect r = rect();
279 double factor = (DockOverlay::ContainerOverlayMode == d->m_mode) ? 3 : 2;
280
281 switch (da) {
283 r.setHeight(r.height() / factor);
284 break;
286 r.setX(r.width() * (1 - 1 / factor));
287 break;
289 r.setY(r.height() * (1 - 1 / factor));
290 break;
292 r.setWidth(r.width() / factor);
293 break;
295 r = rect();
296 break;
298 r.setWidth(d->sideBarOverlaySize(Qx::DockSideBarLeft));
299 break;
301 r.setX(r.width() - d->sideBarOverlaySize(Qx::DockSideBarRight));
302 break;
304 r.setHeight(d->sideBarOverlaySize(Qx::DockSideBarTop));
305 break;
307 r.setY(r.height() - d->sideBarOverlaySize(Qx::DockSideBarBottom));
308 break;
309 default:
310 return;
311 }
312
313 QPainter painter(this);
314 QColor color = palette().color(QPalette::Active, QPalette::Highlight);
315 QPen pen = painter.pen();
316 pen.setColor(color.darker(120));
317 pen.setStyle(Qt::SolidLine);
318 pen.setWidth(1);
319 pen.setCosmetic(true);
320 painter.setPen(pen);
321 color = color.lighter(130);
322 color.setAlpha(64);
323 painter.setBrush(color);
324 painter.drawRect(r.adjusted(0, 0, -1, -1));
325
326 d->m_dropAreaRect = r;
327}
328
329void DockOverlay::showEvent(QShowEvent *e)
330{
331 Q_D(DockOverlay);
332 d->m_cross->show();
333 Super::showEvent(e);
334}
335
336void DockOverlay::hideEvent(QHideEvent *e)
337{
338 Q_D(DockOverlay);
339 d->m_cross->hide();
340 Super::hideEvent(e);
341}
342
343/* DockOverlayCrossPrivate */
344class DockOverlayCrossPrivate
345{
346public:
348public:
349 DockOverlayCrossPrivate();
350
351 void init();
352
353 QPoint areaGridPosition(const Qx::DockWidgetArea area);
354 QColor defaultIconColor(DockOverlayCross::IconColor colorIndex);
355
356 QColor iconColor(DockOverlayCross::IconColor colorIndex);
357
358 qreal dropIndicatiorWidth(QLabel *l) const;
359
360 QWidget *createDropIndicatorWidget(Qx::DockWidgetArea dockWidgetArea, DockOverlay::OverlayMode mode);
361 void updateDropIndicatorIcon(QWidget *DropIndicatorWidget);
362 QPixmap createHighDpiDropIndicatorPixmap(const QSizeF &size, Qx::DockWidgetArea dockWidgetArea,
364public:
365 DockOverlay *m_dockOverlay = nullptr;
366 QGridLayout *m_gridLayout;
368 QHash<Qx::DockWidgetArea, QWidget *> m_dropIndicatorWidgets;
369 QColor m_iconColors[DockOverlayCross::NIconColors];
370 bool m_updateRequired = false;
371 double m_lastDevicePixelRatio = 0.1;
372};
373
374DockOverlayCrossPrivate::DockOverlayCrossPrivate()
375{
376}
377
378void DockOverlayCrossPrivate::init()
379{
380 Q_Q(DockOverlayCross);
381
382 m_gridLayout = new QGridLayout();
383 m_gridLayout->setSpacing(0);
384 q->setLayout(m_gridLayout);
385}
386
387static int areaAlignment(const Qx::DockWidgetArea area)
388{
389 switch (area) {
391 return (int)Qt::AlignHCenter | Qt::AlignBottom;
393 return (int)Qt::AlignLeft | Qt::AlignVCenter;
395 return (int)Qt::AlignHCenter | Qt::AlignTop;
397 return (int)Qt::AlignRight | Qt::AlignVCenter;
399 return (int)Qt::AlignCenter;
400 default:
401 return Qt::AlignCenter;
402 }
403}
404
405QPoint DockOverlayCrossPrivate::areaGridPosition(const Qx::DockWidgetArea area)
406{
407 if (DockOverlay::PanelOverlayMode == m_mode) {
408 switch (area) {
410 return QPoint(1, 2);
412 return QPoint(2, 3);
414 return QPoint(3, 2);
416 return QPoint(2, 1);
418 return QPoint(2, 2);
419 default:
420 return QPoint();
421 }
422 } else {
423 switch (area) {
425 return QPoint(0, 2);
427 return QPoint(2, 4);
429 return QPoint(4, 2);
431 return QPoint(2, 0);
433 return QPoint(2, 2);
434 default:
435 return QPoint();
436 }
437 }
438}
439
440QColor DockOverlayCrossPrivate::defaultIconColor(DockOverlayCross::IconColor colorIndex)
441{
442 Q_Q(DockOverlayCross);
443 QPalette pal = q->palette();
444 switch (colorIndex) {
446 return pal.color(QPalette::Active, QPalette::Highlight);
448 return pal.color(QPalette::Active, QPalette::Base);
450 QColor Color = pal.color(QPalette::Active, QPalette::Highlight);
451 Color.setAlpha(64);
452 return Color;
453 } break;
454
456 return pal.color(QPalette::Active, QPalette::Base);
458 return QColor(0, 0, 0, 64);
459 default:
460 return QColor();
461 }
462
463 return QColor();
464}
465
466QColor DockOverlayCrossPrivate::iconColor(DockOverlayCross::IconColor colorIndex)
467{
468 QColor color = m_iconColors[colorIndex];
469 if (!color.isValid()) {
470 color = defaultIconColor(colorIndex);
471 m_iconColors[colorIndex] = color;
472 }
473 return color;
474}
475
476qreal DockOverlayCrossPrivate::dropIndicatiorWidth(QLabel *l) const
477{
478#if QX_DOCK_X11
479 Q_UNUSED(l)
480 return 40;
481#else
482 return static_cast<qreal>(l->fontMetrics().height()) * 3.f;
483#endif
484}
485
486QWidget *DockOverlayCrossPrivate::createDropIndicatorWidget(Qx::DockWidgetArea dockWidgetArea,
488{
489 QLabel *l = new QLabel();
490 l->setObjectName("DockWidgetAreaLabel");
491
492 qreal metric = dropIndicatiorWidth(l);
493 QSizeF size(metric, metric);
494 if (internal::isSideBarArea(dockWidgetArea)) {
495 auto area = internal::toSideBarArea(dockWidgetArea);
497 size.setHeight(size.height() / 2);
498 } else {
499 size.setWidth(size.width() / 2);
500 }
501 }
502
503 l->setPixmap(createHighDpiDropIndicatorPixmap(size, dockWidgetArea, mode));
504 l->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
505 l->setAttribute(Qt::WA_TranslucentBackground);
506 l->setProperty("dockWidgetArea", dockWidgetArea);
507 return l;
508}
509
510void DockOverlayCrossPrivate::updateDropIndicatorIcon(QWidget *dropIndicatorWidget)
511{
512 QLabel *l = qobject_cast<QLabel *>(dropIndicatorWidget);
513 const qreal metric = dropIndicatiorWidth(l);
514 const QSizeF size(metric, metric);
515
516 int area = l->property("dockWidgetArea").toInt();
517 l->setPixmap(createHighDpiDropIndicatorPixmap(size, (Qx::DockWidgetArea)area, m_mode));
518}
519
520QPixmap DockOverlayCrossPrivate::createHighDpiDropIndicatorPixmap(const QSizeF &size, Qx::DockWidgetArea dockWidgetArea,
522{
523 Q_Q(DockOverlayCross);
524 QColor borderColor = iconColor(DockOverlayCross::FrameColor);
525 QColor backgroundColor = iconColor(DockOverlayCross::WindowBackgroundColor);
526 QColor overlayColor = iconColor(DockOverlayCross::OverlayColor);
527 if (overlayColor.alpha() == 255) {
528 overlayColor.setAlpha(64);
529 }
530
531#if QT_VERSION >= 0x050600
532 double devicePixelRatio = q->window()->devicePixelRatioF();
533#else
534 double devicePixelRatio = q->window()->devicePixelRatio();
535#endif
536 QSizeF pixmapSize = size * devicePixelRatio;
537 QPixmap pm(pixmapSize.toSize());
538 pm.fill(QColor(0, 0, 0, 0));
539
540 QPainter p(&pm);
541 QPen pen = p.pen();
542 QRectF shadowRect(pm.rect());
543 QRectF baseRect;
544 baseRect.setSize(shadowRect.size() * 0.7);
545 baseRect.moveCenter(shadowRect.center());
546
547 // Fill
548 QColor shadowColor = iconColor(DockOverlayCross::ShadowColor);
549 if (shadowColor.alpha() == 255) {
550 shadowColor.setAlpha(64);
551 }
552 p.fillRect(shadowRect, shadowColor);
553
554 // Drop area rect.
555 p.save();
556 QRectF areaRect;
557 QLineF areaLine;
558 QRectF nonAreaRect;
559 switch (dockWidgetArea) {
561 areaRect = QRectF(baseRect.x(), baseRect.y(), baseRect.width(), baseRect.height() * .5f);
562 nonAreaRect = QRectF(baseRect.x(), shadowRect.height() * .5f, baseRect.width(), baseRect.height() * .5f);
563 areaLine = QLineF(areaRect.bottomLeft(), areaRect.bottomRight());
564 break;
566 areaRect = QRectF(shadowRect.width() * .5f, baseRect.y(), baseRect.width() * .5f, baseRect.height());
567 nonAreaRect = QRectF(baseRect.x(), baseRect.y(), baseRect.width() * .5f, baseRect.height());
568 areaLine = QLineF(areaRect.topLeft(), areaRect.bottomLeft());
569 break;
571 areaRect = QRectF(baseRect.x(), shadowRect.height() * .5f, baseRect.width(), baseRect.height() * .5f);
572 nonAreaRect = QRectF(baseRect.x(), baseRect.y(), baseRect.width(), baseRect.height() * .5f);
573 areaLine = QLineF(areaRect.topLeft(), areaRect.topRight());
574 break;
576 areaRect = QRectF(baseRect.x(), baseRect.y(), baseRect.width() * .5f, baseRect.height());
577 nonAreaRect = QRectF(shadowRect.width() * .5f, baseRect.y(), baseRect.width() * .5f, baseRect.height());
578 areaLine = QLineF(areaRect.topRight(), areaRect.bottomRight());
579 break;
580 default:
581 break;
582 }
583
584 QSizeF baseSize = baseRect.size();
585 bool isOuterContainerArea =
586 (DockOverlay::ContainerOverlayMode == mode) && (dockWidgetArea != Qx::CenterDockWidgetArea);
587
588 if (isOuterContainerArea) {
589 baseRect = areaRect;
590 }
591
592 p.fillRect(baseRect, backgroundColor);
593
594 if (areaRect.isValid()) {
595 pen = p.pen();
596 pen.setColor(borderColor);
597 p.setBrush(overlayColor);
598 p.setPen(Qt::NoPen);
599 p.drawRect(areaRect);
600
601 pen = p.pen();
602 pen.setWidth(1);
603 pen.setColor(borderColor);
604 pen.setStyle(Qt::DashLine);
605 p.setPen(pen);
606 p.drawLine(areaLine);
607 }
608 p.restore();
609
610 p.save();
611 // Draw outer border
612 pen = p.pen();
613 pen.setColor(borderColor);
614 pen.setWidth(1);
615 p.setBrush(Qt::NoBrush);
616 p.setPen(pen);
617 p.drawRect(baseRect);
618
619 // draw window title bar
620 p.setBrush(borderColor);
621 QRectF frameRect(baseRect.topLeft(), QSizeF(baseRect.width(), baseSize.height() / 10));
622 p.drawRect(frameRect);
623 p.restore();
624
625 // Draw arrow for outer container drop indicators
626 if (isOuterContainerArea) {
627 QRectF arrowRect;
628 arrowRect.setSize(baseSize);
629 arrowRect.setWidth(arrowRect.width() / 4.6);
630 arrowRect.setHeight(arrowRect.height() / 2);
631 arrowRect.moveCenter(QPointF(0, 0));
632 QPolygonF arrow;
633 arrow << arrowRect.topLeft() << QPointF(arrowRect.right(), arrowRect.center().y()) << arrowRect.bottomLeft();
634 p.setPen(Qt::NoPen);
635 p.setBrush(iconColor(DockOverlayCross::ArrowColor));
636 p.setRenderHint(QPainter::Antialiasing, true);
637 p.translate(nonAreaRect.center().x(), nonAreaRect.center().y());
638
639 switch (dockWidgetArea) {
641 p.rotate(-90);
642 break;
644 break;
646 p.rotate(90);
647 break;
649 p.rotate(180);
650 break;
651 default:
652 break;
653 }
654
655 p.drawPolygon(arrow);
656 }
657
658 pm.setDevicePixelRatio(devicePixelRatio);
659 return pm;
660}
661
663 : QWidget(overlay->parentWidget())
664{
666 Q_D(DockOverlayCross);
667 d->m_dockOverlay = overlay;
668 d->init();
669#if QX_DOCK_X11
670 setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);
671#else
672 setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
673#endif
674 setWindowTitle("DockOverlayCross");
675 setAttribute(Qt::WA_TranslucentBackground);
676}
677
682
684{
685 Q_D(const DockOverlayCross);
686 return d->m_iconColors[colorIndex];
687}
688
689void DockOverlayCross::setIconColor(IconColor colorIndex, const QColor &color)
690{
691 Q_D(DockOverlayCross);
692 d->m_iconColors[colorIndex] = color;
693 d->m_updateRequired = true;
694}
695
702{
703 Q_D(const DockOverlayCross);
704 const QPoint pos = mapFromGlobal(QCursor::pos());
705 QHashIterator<Qx::DockWidgetArea, QWidget *> i(d->m_dropIndicatorWidgets);
706 while (i.hasNext()) {
707 i.next();
708 if (d->m_dockOverlay->allowedAreas().testFlag(i.key()) && i.value() && i.value()->isVisible() &&
709 i.value()->geometry().contains(pos)) {
710 return i.key();
711 }
712 }
714}
715
717{
718 Q_D(DockOverlayCross);
719 d->m_mode = mode;
720
721 QHash<Qx::DockWidgetArea, QWidget *> areaWidgets;
722 areaWidgets.insert(Qx::TopDockWidgetArea, d->createDropIndicatorWidget(Qx::TopDockWidgetArea, mode));
723 areaWidgets.insert(Qx::RightDockWidgetArea, d->createDropIndicatorWidget(Qx::RightDockWidgetArea, mode));
724 areaWidgets.insert(Qx::BottomDockWidgetArea, d->createDropIndicatorWidget(Qx::BottomDockWidgetArea, mode));
725 areaWidgets.insert(Qx::LeftDockWidgetArea, d->createDropIndicatorWidget(Qx::LeftDockWidgetArea, mode));
726 areaWidgets.insert(Qx::CenterDockWidgetArea, d->createDropIndicatorWidget(Qx::CenterDockWidgetArea, mode));
727
728#if QT_VERSION >= 0x050600
729 d->m_lastDevicePixelRatio = devicePixelRatioF();
730#else
731 d->m_lastDevicePixelRatio = devicePixelRatio();
732#endif
733 setAreaWidgets(areaWidgets);
734 d->m_updateRequired = false;
735}
736
738{
739 Q_D(DockOverlayCross);
740 if (windowHandle()->devicePixelRatio() == d->m_lastDevicePixelRatio) {
741 return;
742 }
743
744 for (auto Widget : d->m_dropIndicatorWidgets) {
745 d->updateDropIndicatorIcon(Widget);
746 }
747#if QT_VERSION >= 0x050600
748 d->m_lastDevicePixelRatio = devicePixelRatioF();
749#else
750 d->m_lastDevicePixelRatio = devicePixelRatio();
751#endif
752}
753
755{
756 Q_D(DockOverlayCross);
757 QList<Qx::DockWidgetArea> allAreas;
760 const Qx::DockWidgetAreas allowedAreas = d->m_dockOverlay->allowedAreas();
761
762 // Update visibility of area widgets based on allowedAreas.
763 for (int i = 0; i < allAreas.count(); ++i) {
764 QPoint p = d->areaGridPosition(allAreas.at(i));
765 QLayoutItem *item = d->m_gridLayout->itemAtPosition(p.x(), p.y());
766 QWidget *w = nullptr;
767 if (item && (w = item->widget()) != nullptr) {
768 w->setVisible(allowedAreas.testFlag(allAreas.at(i)));
769 }
770 }
771}
772
774{
775 Q_D(DockOverlayCross);
776 resize(d->m_dockOverlay->size());
777 QPoint topLeft = d->m_dockOverlay->pos();
778 QPoint offest((this->width() - d->m_dockOverlay->width()) / 2, (this->height() - d->m_dockOverlay->height()) / 2);
779 QPoint crossTopLeft = topLeft - offest;
780 move(crossTopLeft);
781}
782
795void DockOverlayCross::setIconColors(const QString &colors)
796{
797 Q_D(DockOverlayCross);
798 static const QMap<QString, int> ColorCompenentStringMap{{"Frame", DockOverlayCross::FrameColor},
803
804#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
805 auto skipEmptyParts = QString::SkipEmptyParts;
806#else
807 auto skipEmptyParts = Qt::SkipEmptyParts;
808#endif
809 auto colorList = colors.split(' ', skipEmptyParts);
810 for (const auto &colorListEntry : colorList) {
811 auto componentColor = colorListEntry.split('=', skipEmptyParts);
812 int component = ColorCompenentStringMap.value(componentColor[0], -1);
813 if (component < 0) {
814 continue;
815 }
816 d->m_iconColors[component] = QColor(componentColor[1]);
817 }
818
819 d->m_updateRequired = true;
820}
821
823{
824 return QString();
825}
826
827void DockOverlayCross::setAreaWidgets(const QHash<Qx::DockWidgetArea, QWidget *> &widgets)
828{
829 Q_D(DockOverlayCross);
830 // Delete old widgets.
831 QMutableHashIterator<Qx::DockWidgetArea, QWidget *> i(d->m_dropIndicatorWidgets);
832 while (i.hasNext()) {
833 i.next();
834 QWidget *widget = i.value();
835 d->m_gridLayout->removeWidget(widget);
836 delete widget;
837 i.remove();
838 }
839
840 // Insert new widgets into grid.
841 d->m_dropIndicatorWidgets = widgets;
842 QHashIterator<Qx::DockWidgetArea, QWidget *> i2(d->m_dropIndicatorWidgets);
843 while (i2.hasNext()) {
844 i2.next();
845 const Qx::DockWidgetArea area = i2.key();
846 QWidget *widget = i2.value();
847 QPoint p = d->areaGridPosition(area);
848 d->m_gridLayout->addWidget(widget, p.x(), p.y(), (Qt::Alignment)areaAlignment(area));
849 }
850
851 if (DockOverlay::PanelOverlayMode == d->m_mode) {
852 d->m_gridLayout->setContentsMargins(0, 0, 0, 0);
853 d->m_gridLayout->setRowStretch(0, 1);
854 d->m_gridLayout->setRowStretch(1, 0);
855 d->m_gridLayout->setRowStretch(2, 0);
856 d->m_gridLayout->setRowStretch(3, 0);
857 d->m_gridLayout->setRowStretch(4, 1);
858
859 d->m_gridLayout->setColumnStretch(0, 1);
860 d->m_gridLayout->setColumnStretch(1, 0);
861 d->m_gridLayout->setColumnStretch(2, 0);
862 d->m_gridLayout->setColumnStretch(3, 0);
863 d->m_gridLayout->setColumnStretch(4, 1);
864 } else {
865 d->m_gridLayout->setContentsMargins(4, 4, 4, 4);
866 d->m_gridLayout->setRowStretch(0, 0);
867 d->m_gridLayout->setRowStretch(1, 1);
868 d->m_gridLayout->setRowStretch(2, 1);
869 d->m_gridLayout->setRowStretch(3, 1);
870 d->m_gridLayout->setRowStretch(4, 0);
871
872 d->m_gridLayout->setColumnStretch(0, 0);
873 d->m_gridLayout->setColumnStretch(1, 1);
874 d->m_gridLayout->setColumnStretch(2, 1);
875 d->m_gridLayout->setColumnStretch(3, 1);
876 d->m_gridLayout->setColumnStretch(4, 0);
877 }
878 reset();
879}
880
882{
883 Q_UNUSED(e);
884 Q_D(DockOverlayCross);
885 if (d->m_updateRequired) {
886 setupOverlayCross(d->m_mode);
887 }
888 this->updatePosition();
889}
890
static AutoHideFlags autoHideConfigFlags()
DockOverlayCross shows a cross with 5 different drop area possibilities.
Definition dockoverlay.h:81
void setIconColor(IconColor colorIndex, const QColor &color)
void setupOverlayCross(DockOverlay::OverlayMode mode)
DockOverlayCross(DockOverlay *overlay)
@ WindowBackgroundColor
the background color of the small window in the icon
Definition dockoverlay.h:92
@ ShadowColor
the color of the shadow rectangle that is painted below the icons
Definition dockoverlay.h:95
@ FrameColor
the color of the frame of the small window icon
Definition dockoverlay.h:91
@ OverlayColor
the color that shows the overlay (the dock side) in the icon
Definition dockoverlay.h:93
@ ArrowColor
the arrow that points into the direction
Definition dockoverlay.h:94
QColor iconColor() const
void setAreaWidgets(const QHash< Qx::DockWidgetArea, QWidget * > &widgets)
void setIconColors(const QString &colors)
A string with all icon colors to set.
virtual void showEvent(QShowEvent *e) override
QString iconColors() const
Qx::DockWidgetArea cursorLocation() const
Returns the dock widget area depending on the current cursor location.
DockOverlay paints a translucent rectangle over another widget.
Definition dockoverlay.h:19
virtual void showEvent(QShowEvent *e) override
QRect dropOverlayRect() const
int tabIndexUnderCursor() const
If the drop area is the CenterDockWidgetArea or a sidebar area, then this function returns the index ...
Qx::DockWidgetArea dropAreaUnderCursor()
void setAllowedArea(Qx::DockWidgetArea area, bool enable)
Qx::DockWidgetAreas allowedAreas() const
virtual bool event(QEvent *e) override
Qx::DockWidgetArea showOverlay(QWidget *target)
Qx::DockWidgetArea visibleDropAreaUnderCursor()
virtual void paintEvent(QPaintEvent *e) override
void setAllowedAreas(Qx::DockWidgetAreas areas)
virtual void hideEvent(QHideEvent *e) override
void enableDropPreview(bool enable)
bool isHorizontalSideBarArea(Qx::DockSideBarArea area)
Qx::DockSideBarArea toSideBarArea(Qx::DockWidgetArea area)
bool isSideBarArea(Qx::DockWidgetArea area)
DockSideBarArea
@ DockSideBarTop
@ DockSideBarBottom
@ DockSideBarLeft
@ DockSideBarRight
@ DockSideBarNone
DockWidgetArea
@ LeftAutoHideArea
@ BottomDockWidgetArea
@ RightAutoHideArea
@ RightDockWidgetArea
@ LeftDockWidgetArea
@ TopDockWidgetArea
@ BottomAutoHideArea
@ InvalidDockWidgetArea
@ CenterDockWidgetArea
@ TopAutoHideArea
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE