12 #include "ClassicIndicators_p.h"
15 #include "ClassicIndicatorsWindow_p.h"
17 #include "private/DropArea_p.h"
18 #include "private/DragController_p.h"
19 #include "private/Frame_p.h"
20 #include "private/Logging_p.h"
21 #include "private/DockRegistry_p.h"
22 #include "private/Utils_p.h"
30 auto window =
new IndicatorWindow(classicIndicators);
31 window->setObjectName(QStringLiteral(
"_docks_IndicatorWindow_Overlay"));
36 ClassicIndicators::ClassicIndicators(DropArea *dropArea)
37 : DropIndicatorOverlayInterface(dropArea)
38 , m_rubberBand(
Config::self().frameworkWidgetFactory()->createRubberBand(rubberBandIsTopLevel() ? nullptr : dropArea))
41 if (rubberBandIsTopLevel())
42 m_rubberBand->setWindowOpacity(0.5);
45 ClassicIndicators::~ClassicIndicators()
47 delete m_indicatorWindow;
50 DropIndicatorOverlayInterface::DropLocation ClassicIndicators::hover_impl(
QPoint globalPos)
52 return m_indicatorWindow->hover(globalPos);
55 QPoint ClassicIndicators::posForIndicator(DropIndicatorOverlayInterface::DropLocation loc)
const
57 return m_indicatorWindow->posForIndicator(loc);
60 bool ClassicIndicators::innerIndicatorsVisible()
const
62 return m_innerIndicatorsVisible;
65 bool ClassicIndicators::outterIndicatorsVisible()
const
67 return m_outterIndicatorsVisible;
70 bool ClassicIndicators::tabIndicatorVisible()
const
72 return m_tabIndicatorVisible;
75 bool ClassicIndicators::onResize(
QSize)
77 m_indicatorWindow->resize(window()->size());
81 void ClassicIndicators::updateVisibility()
84 m_indicatorWindow->updatePositions();
85 m_indicatorWindow->setVisible(
true);
86 updateWindowPosition();
87 updateIndicatorsVisibility(
true);
90 m_rubberBand->setVisible(
false);
91 m_indicatorWindow->setVisible(
false);
92 updateIndicatorsVisibility(
false);
96 void ClassicIndicators::updateIndicatorsVisibility(
bool visible)
98 const bool isTheOnlyFrame = m_hoveredFrame && m_hoveredFrame->isTheOnlyFrame();
100 m_innerIndicatorsVisible = visible && m_hoveredFrame;
102 WindowBeingDragged *windowBeingDragged = DragController::instance()->windowBeingDragged();
106 m_outterIndicatorsVisible = visible && (!isTheOnlyFrame || DockRegistry::self()->isProbablyObscured(m_hoveredFrame->window()->windowHandle(), windowBeingDragged));
110 auto tabbingAllowedFunc = Config::self().tabbingAllowedFunc();
111 m_tabIndicatorVisible = m_innerIndicatorsVisible && windowBeingDragged && DockRegistry::self()->affinitiesMatch(m_hoveredFrame->affinities(), windowBeingDragged->affinities());
112 if (m_tabIndicatorVisible && tabbingAllowedFunc) {
115 m_tabIndicatorVisible = tabbingAllowedFunc(source, target);
118 Q_EMIT innerIndicatorsVisibleChanged();
119 Q_EMIT outterIndicatorsVisibleChanged();
120 Q_EMIT tabIndicatorVisibleChanged();
123 void ClassicIndicators::raiseIndicators()
125 m_indicatorWindow->raise();
131 case DropIndicatorOverlayInterface::DropLocation_Left:
133 case DropIndicatorOverlayInterface::DropLocation_Top:
135 case DropIndicatorOverlayInterface::DropLocation_Right:
137 case DropIndicatorOverlayInterface::DropLocation_Bottom:
139 case DropIndicatorOverlayInterface::DropLocation_OutterLeft:
141 case DropIndicatorOverlayInterface::DropLocation_OutterTop:
143 case DropIndicatorOverlayInterface::DropLocation_OutterRight:
145 case DropIndicatorOverlayInterface::DropLocation_OutterBottom:
152 void ClassicIndicators::setDropLocation(ClassicIndicators::DropLocation location)
154 setCurrentDropLocation(location);
156 if (location == DropLocation_None) {
157 m_rubberBand->setVisible(
false);
161 if (location == DropLocation_Center) {
162 m_rubberBand->setGeometry(geometryForRubberband(m_hoveredFrame ? m_hoveredFrame->QWidgetAdapter::geometry() : rect()));
163 m_rubberBand->setVisible(
true);
164 if (rubberBandIsTopLevel()) {
165 m_rubberBand->raise();
173 Frame *relativeToFrame =
nullptr;
176 case DropLocation_Left:
177 case DropLocation_Top:
178 case DropLocation_Right:
179 case DropLocation_Bottom:
180 if (!m_hoveredFrame) {
181 qWarning() <<
"ClassicIndicators::setCurrentDropLocation: frame is null. location=" << location
182 <<
"; isHovered=" << isHovered()
183 <<
"; dropArea->widgets=" << m_dropArea->items();
187 relativeToFrame = m_hoveredFrame;
189 case DropLocation_OutterLeft:
190 case DropLocation_OutterTop:
191 case DropLocation_OutterRight:
192 case DropLocation_OutterBottom:
198 auto windowBeingDragged = DragController::instance()->windowBeingDragged();
200 QRect rect = m_dropArea->rectForDrop(windowBeingDragged, multisplitterLocation,
201 m_dropArea->itemForFrame(relativeToFrame));
203 m_rubberBand->setGeometry(geometryForRubberband(rect));
204 m_rubberBand->setVisible(
true);
205 if (rubberBandIsTopLevel()) {
206 m_rubberBand->raise();
211 void ClassicIndicators::updateWindowPosition()
213 QRect rect = this->rect();
214 if (KDDockWidgets::isWindow(m_indicatorWindow)) {
219 m_indicatorWindow->setGeometry(rect);
222 bool ClassicIndicators::rubberBandIsTopLevel()
const
224 #ifdef KDDOCKWIDGETS_RUBBERBAND_IS_TOPLEVEL
231 QRect ClassicIndicators::geometryForRubberband(
QRect localRect)
const
233 if (!rubberBandIsTopLevel())
237 QPoint topLeftGlobal = m_dropArea->QWidgetAdapter::mapToGlobal(topLeftLocal);