diff --git a/src/private/indicators/ClassicIndicators.cpp b/src/private/indicators/ClassicIndicators.cpp index fc747449..45f57740 100644 --- a/src/private/indicators/ClassicIndicators.cpp +++ b/src/private/indicators/ClassicIndicators.cpp @@ -55,6 +55,16 @@ QPoint ClassicIndicators::posForIndicator(DropIndicatorOverlayInterface::DropLoc return m_indicatorWindow->posForIndicator(loc); } +bool ClassicIndicators::innerIndicatorsVisible() const +{ + return m_innerIndicatorsVisible; +} + +bool ClassicIndicators::outterIndicatorsVisible() const +{ + return m_outterIndicatorsVisible; +} + bool ClassicIndicators::onResize(QSize) { m_indicatorWindow->resize(window()->size()); @@ -67,15 +77,27 @@ void ClassicIndicators::updateVisibility() m_indicatorWindow->updatePositions(); m_indicatorWindow->setVisible(true); updateWindowPosition(); - m_indicatorWindow->updateIndicatorVisibility(true); + updateIndicatorsVisibility(true); raiseIndicators(); } else { m_rubberBand->setVisible(false); m_indicatorWindow->setVisible(false); - m_indicatorWindow->updateIndicatorVisibility(false); + updateIndicatorsVisibility(false); } } +void ClassicIndicators::updateIndicatorsVisibility(bool visible) +{ + Frame *hoveredFrame = m_hoveredFrame; + const bool isTheOnlyFrame = hoveredFrame && hoveredFrame->isTheOnlyFrame(); + + m_innerIndicatorsVisible = visible && hoveredFrame; + m_outterIndicatorsVisible = visible && !isTheOnlyFrame; + + Q_EMIT innerIndicatorsVisibleChanged(); + Q_EMIT outterIndicatorsVisibleChanged(); +} + void ClassicIndicators::raiseIndicators() { m_indicatorWindow->raise(); diff --git a/src/private/indicators/ClassicIndicatorsWindow.cpp b/src/private/indicators/ClassicIndicatorsWindow.cpp index 8b67f5a3..e0e75655 100644 --- a/src/private/indicators/ClassicIndicatorsWindow.cpp +++ b/src/private/indicators/ClassicIndicatorsWindow.cpp @@ -117,6 +117,11 @@ IndicatorWindow::IndicatorWindow(ClassicIndicators *classicIndicators_) setWindowFlag(Qt::FramelessWindowHint, true); setAttribute(Qt::WA_TranslucentBackground); + connect(classicIndicators, &ClassicIndicators::innerIndicatorsVisibleChanged, + this, &IndicatorWindow::updateIndicatorVisibility); + connect(classicIndicators, &ClassicIndicators::outterIndicatorsVisibleChanged, + this, &IndicatorWindow::updateIndicatorVisibility); + m_indicators << m_center << m_left << m_right << m_top << m_bottom << m_outterBottom << m_outterTop << m_outterLeft << m_outterRight; } @@ -169,19 +174,13 @@ void IndicatorWindow::resizeEvent(QResizeEvent *ev) updatePositions(); } -void IndicatorWindow::updateIndicatorVisibility(bool visible) +void IndicatorWindow::updateIndicatorVisibility() { - Frame *hoveredFrame = classicIndicators->m_hoveredFrame; - const bool isTheOnlyFrame = hoveredFrame && hoveredFrame->isTheOnlyFrame(); - - const bool innerShouldBeVisible = visible && hoveredFrame; - const bool outterShouldBeVisible = visible && !isTheOnlyFrame; - for (Indicator *indicator : { m_center, m_left, m_right, m_bottom, m_top }) - indicator->setVisible(innerShouldBeVisible); + indicator->setVisible(classicIndicators->innerIndicatorsVisible()); for (Indicator *indicator : { m_outterTop, m_outterLeft, m_outterRight, m_outterBottom }) - indicator->setVisible(outterShouldBeVisible); + indicator->setVisible(classicIndicators->outterIndicatorsVisible()); updateMask(); } @@ -246,19 +245,14 @@ IndicatorWindow::IndicatorWindow(KDDockWidgets::ClassicIndicators *classicIndica setSource(QUrl(QStringLiteral("qrc:/kddockwidgets/private/quick/qml/ClassicIndicatorsOverlay.qml"))); } -void IndicatorWindow::hover(QPoint) +void IndicatorWindow::hover(QPoint pt) { - + qDebug() << "Hover" << pt; } void IndicatorWindow::updatePositions() { - -} - -void IndicatorWindow::updateIndicatorVisibility(bool) -{ - + qDebug() << "updatePositions"; } QPoint IndicatorWindow::posForIndicator(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation) const @@ -269,7 +263,7 @@ QPoint IndicatorWindow::posForIndicator(KDDockWidgets::DropIndicatorOverlayInter qDebug() << Q_FUNC_INFO << item; } - + qDebug() << Q_FUNC_INFO; return {}; } @@ -278,4 +272,9 @@ QString IndicatorWindow::iconName(int loc, bool active) const return KDDockWidgets::iconName(DropIndicatorOverlayInterface::DropLocation(loc), active); } +ClassicIndicators *IndicatorWindow::classicIndicators() const +{ + return m_classicIndicators; +} + #endif // QtQuick diff --git a/src/private/indicators/ClassicIndicatorsWindow_p.h b/src/private/indicators/ClassicIndicatorsWindow_p.h index 66b7c8d1..d4a2509b 100644 --- a/src/private/indicators/ClassicIndicatorsWindow_p.h +++ b/src/private/indicators/ClassicIndicatorsWindow_p.h @@ -32,9 +32,9 @@ public: explicit IndicatorWindow(ClassicIndicators *classicIndicators); void hover(QPoint globalPos); void updatePositions(); - void updateIndicatorVisibility(bool visible); QPoint posForIndicator(DropIndicatorOverlayInterface::DropLocation) const; private: + void updateIndicatorVisibility(); void resizeEvent(QResizeEvent *ev) override; // When the compositor doesn't support translucency, we use a mask instead @@ -88,13 +88,14 @@ class ClassicIndicators; class IndicatorWindow : public QQuickView { Q_OBJECT + Q_PROPERTY(KDDockWidgets::ClassicIndicators* classicIndicators READ classicIndicators CONSTANT) public: explicit IndicatorWindow(ClassicIndicators *); void hover(QPoint); void updatePositions(); - void updateIndicatorVisibility(bool); QPoint posForIndicator(DropIndicatorOverlayInterface::DropLocation) const; Q_INVOKABLE QString iconName(int loc, bool active) const; + KDDockWidgets::ClassicIndicators* classicIndicators() const; private: ClassicIndicators *const m_classicIndicators; }; diff --git a/src/private/indicators/ClassicIndicators_p.h b/src/private/indicators/ClassicIndicators_p.h index 3115d682..8f6f773b 100644 --- a/src/private/indicators/ClassicIndicators_p.h +++ b/src/private/indicators/ClassicIndicators_p.h @@ -22,24 +22,38 @@ class Indicator; class ClassicIndicators : public DropIndicatorOverlayInterface { Q_OBJECT + + Q_PROPERTY(bool innerIndicatorsVisible READ innerIndicatorsVisible NOTIFY innerIndicatorsVisibleChanged) + Q_PROPERTY(bool outterIndicatorsVisible READ outterIndicatorsVisible NOTIFY outterIndicatorsVisibleChanged) + public: explicit ClassicIndicators(DropArea *dropArea); ~ClassicIndicators() override; Type indicatorType() const override; void hover(QPoint globalPos) override; QPoint posForIndicator(DropLocation) const override; + + bool innerIndicatorsVisible() const; + bool outterIndicatorsVisible() const; + protected: bool onResize(QSize newSize) override; void updateVisibility() override; +Q_SIGNALS: + void innerIndicatorsVisibleChanged(); + void outterIndicatorsVisibleChanged(); private: friend class KDDockWidgets::Indicator; friend class KDDockWidgets::IndicatorWindow; + void updateIndicatorsVisibility(bool visible); void raiseIndicators(); void setDropLocation(DropLocation); void updateWindowPosition(); QWidgetOrQuick *const m_rubberBand; IndicatorWindow *const m_indicatorWindow; + bool m_innerIndicatorsVisible = false; + bool m_outterIndicatorsVisible = false; }; } diff --git a/src/private/quick/QmlTypes.cpp b/src/private/quick/QmlTypes.cpp index b8aa3a37..55cbafb9 100644 --- a/src/private/quick/QmlTypes.cpp +++ b/src/private/quick/QmlTypes.cpp @@ -14,6 +14,7 @@ #include "quick/MainWindowWrapper_p.h" #include "DropIndicatorOverlayInterface_p.h" #include "TitleBar_p.h" +#include "indicators/ClassicIndicators_p.h" #include #include @@ -28,4 +29,5 @@ void KDDockWidgets::registerQmlTypes() qmlRegisterUncreatableType("com.kdab.dockwidgets", 1, 0, "DropIndicatorOverlayInterface", QStringLiteral("Enum access only")); qRegisterMetaType(); + qRegisterMetaType(); } diff --git a/src/private/quick/qml/ClassicIndicatorsOverlay.qml b/src/private/quick/qml/ClassicIndicatorsOverlay.qml index 30b3669d..bb627eea 100644 --- a/src/private/quick/qml/ClassicIndicatorsOverlay.qml +++ b/src/private/quick/qml/ClassicIndicatorsOverlay.qml @@ -19,6 +19,7 @@ Item { readonly property int innerMargin: 10 ClassicIndicator { + visible: _window.classicIndicators.outterIndicatorsVisible indicatorType: DropIndicatorOverlayInterface.DropLocation_OutterLeft anchors { left: parent.left @@ -28,6 +29,7 @@ Item { } ClassicIndicator { + visible: _window.classicIndicators.outterIndicatorsVisible indicatorType: DropIndicatorOverlayInterface.DropLocation_OutterRight anchors { right: parent.right @@ -37,6 +39,7 @@ Item { } ClassicIndicator { + visible: _window.classicIndicators.outterIndicatorsVisible indicatorType: DropIndicatorOverlayInterface.DropLocation_OutterTop anchors { top: parent.top @@ -46,6 +49,7 @@ Item { } ClassicIndicator { + visible: _window.classicIndicators.outterIndicatorsVisible indicatorType: DropIndicatorOverlayInterface.DropLocation_OutterBottom anchors { bottom: parent.bottom @@ -59,6 +63,7 @@ Item { anchors.centerIn: parent width: (centerIndicator * 3) + (2 * innerMargin) height: width + visible: _window.classicIndicators.innerIndicatorsVisible ClassicIndicator { indicatorType: DropIndicatorOverlayInterface.DropLocation_Left