From 9351277cd7f6a913d5760c3a248aef92ba021688 Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Wed, 29 Dec 2021 13:01:21 +0200 Subject: [PATCH] anchor thin tooltips on their visual parents BUG:447631 --- .../contents/ui/applet/ParabolicArea.qml | 8 +++--- .../contents/ui/applet/TitleTooltipParent.qml | 11 +++++++- .../abilities/host/ThinTooltip.qml | 3 ++- .../abilities/items/BasicItem.qml | 7 +++++ .../items/basicitem/TitleTooltipParent.qml | 11 +++++++- declarativeimports/core/dialog.cpp | 26 +++++++++++++++++++ declarativeimports/core/dialog.h | 4 +++ 7 files changed, 63 insertions(+), 7 deletions(-) diff --git a/containment/package/contents/ui/applet/ParabolicArea.qml b/containment/package/contents/ui/applet/ParabolicArea.qml index d5bf19a6a..b56e8443f 100644 --- a/containment/package/contents/ui/applet/ParabolicArea.qml +++ b/containment/package/contents/ui/applet/ParabolicArea.qml @@ -61,10 +61,10 @@ Item { if (isParabolicEnabled) { if (root.isHorizontal){ - appletItem.layouts.currentSpot = mouseX; + appletItem.layouts.currentSpot = Math.round(mouseX); calculateParabolicScales(mouseX); } else{ - appletItem.layouts.currentSpot = mouseY; + appletItem.layouts.currentSpot = Math.round(mouseY); calculateParabolicScales(mouseY); } } @@ -84,14 +84,14 @@ Item { if (root.isHorizontal){ var step = Math.abs(appletItem.layouts.currentSpot-mouseX); if (step >= appletItem.animations.hoverPixelSensitivity){ - appletItem.layouts.currentSpot = mouseX; + appletItem.layouts.currentSpot = Math.round(mouseX); calculateParabolicScales(mouseX); } } else{ var step = Math.abs(appletItem.layouts.currentSpot-mouseY); if (step >= appletItem.animations.hoverPixelSensitivity){ - appletItem.layouts.currentSpot = mouseY; + appletItem.layouts.currentSpot = Math.round(mouseY); calculateParabolicScales(mouseY); } } diff --git a/containment/package/contents/ui/applet/TitleTooltipParent.qml b/containment/package/contents/ui/applet/TitleTooltipParent.qml index 2b9f5650d..c1d0ddd29 100644 --- a/containment/package/contents/ui/applet/TitleTooltipParent.qml +++ b/containment/package/contents/ui/applet/TitleTooltipParent.qml @@ -4,13 +4,16 @@ SPDX-License-Identifier: GPL-2.0-or-later */ -import QtQuick 2.0 +import QtQuick 2.7 import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.core 2.0 as PlasmaCore Item{ id: visual + //used from LatteCore.Dialog Tooltips in order to be anchored properly to their visual parent + signal anchoredTooltipPositionChanged(); + width: root.isVertical ? thickness : size height: root.isVertical ? size : thickness @@ -26,6 +29,12 @@ Item{ //border.color: "green" //color: "transparent" + Connections { + target: appletItem.layouts + enabled: parabolic.isEnabled && appletItem.containsMouse + onCurrentSpotChanged: visual.anchoredTooltipPositionChanged(); + } + states:[ State{ name: "bottom" diff --git a/declarativeimports/abilities/host/ThinTooltip.qml b/declarativeimports/abilities/host/ThinTooltip.qml index c720d8e0f..0ad0ec4bd 100644 --- a/declarativeimports/abilities/host/ThinTooltip.qml +++ b/declarativeimports/abilities/host/ThinTooltip.qml @@ -11,6 +11,7 @@ import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.components 2.0 as PlasmaComponents import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.latte.core 0.2 as LatteCore import org.kde.latte.abilities.definition 0.1 as AbilityDefinition AbilityDefinition.ThinTooltip { @@ -108,7 +109,7 @@ AbilityDefinition.ThinTooltip { } } - PlasmaCore.Dialog{ + LatteCore.Dialog{ id: _tooltipDialog type: PlasmaCore.Dialog.Tooltip flags: Qt.WindowStaysOnTopHint | Qt.WindowDoesNotAcceptFocus | Qt.ToolTip diff --git a/declarativeimports/abilities/items/BasicItem.qml b/declarativeimports/abilities/items/BasicItem.qml index 005abf1b6..d9e80ca1b 100644 --- a/declarativeimports/abilities/items/BasicItem.qml +++ b/declarativeimports/abilities/items/BasicItem.qml @@ -100,6 +100,13 @@ Item{ readonly property bool isHorizontal: !isVertical readonly property bool isVertical: plasmoid.formFactor === PlasmaCore.Types.Vertical readonly property bool parabolicAreaContainsMouse: parabolicEventsAreaLoader.active && parabolicEventsAreaLoader.item.containsMouse + readonly property int parabolicAreaLastMousePos: { + if (parabolicEventsAreaLoader.active) { + return Math.round(plasmoid.formFactor === PlasmaCore.Types.Horizontal ? parabolicEventsAreaLoader.item.lastMouseX : parabolicEventsAreaLoader.lastMouseY); + } + + return 0; + } readonly property int location: { if (plasmoid.location === PlasmaCore.Types.LeftEdge diff --git a/declarativeimports/abilities/items/basicitem/TitleTooltipParent.qml b/declarativeimports/abilities/items/basicitem/TitleTooltipParent.qml index 01f9660a2..8269fd0ef 100644 --- a/declarativeimports/abilities/items/basicitem/TitleTooltipParent.qml +++ b/declarativeimports/abilities/items/basicitem/TitleTooltipParent.qml @@ -4,19 +4,28 @@ SPDX-License-Identifier: GPL-2.0-or-later */ -import QtQuick 2.0 +import QtQuick 2.7 import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.core 2.0 as PlasmaCore Item{ id: visual + //used from LatteCore.Dialog Tooltips in order to be anchored properly to their visual parent + signal anchoredTooltipPositionChanged(); + width: abilityItem.isVertical ? thickness : size height: abilityItem.isVertical ? size : thickness property int size: 1 property int thickness: 64 + Connections { + target: abilityItem + enabled: abilityItem.abilities.parabolic.isEnabled && abilityItem.containsMouse + onParabolicAreaLastMousePosChanged: visual.anchoredTooltipPositionChanged(); + } + states:[ State{ name: "bottom" diff --git a/declarativeimports/core/dialog.cpp b/declarativeimports/core/dialog.cpp index aed8a6cf9..9f2f80209 100644 --- a/declarativeimports/core/dialog.cpp +++ b/declarativeimports/core/dialog.cpp @@ -16,6 +16,7 @@ namespace Quick { Dialog::Dialog(QQuickItem *parent) : PlasmaQuick::Dialog(parent) { + connect(this, &PlasmaQuick::Dialog::visualParentChanged, this, &Dialog::onVisualParentChanged); } bool Dialog::containsMouse() const @@ -66,6 +67,31 @@ int Dialog::appletsPopUpMargin() const return margin.isValid() ? margin.toInt() : -1; } +void Dialog::onVisualParentChanged() +{ + // clear mode + for (auto &c : m_visualParentConnections) { + disconnect(c); + } + + if (!visualParent() || !flags().testFlag(Qt::ToolTip) || !visualParent()->metaObject()) { + return; + } + + bool hassignal = (visualParent()->metaObject()->indexOfSignal(QMetaObject::normalizedSignature("anchoredTooltipPositionChanged()")) != -1); + + if (hassignal) { + m_visualParentConnections[0] = connect(visualParent(), SIGNAL(anchoredTooltipPositionChanged()) , this, SLOT(updateGeometry())); + } +} + +void Dialog::updateGeometry() +{ + if (visualParent()) { + setPosition(popupPosition(visualParent(), size())); + } +} + void Dialog::updatePopUpEnabledBorders() { QRect appletslayoutgeometry = appletsLayoutGeometryFromContainment(); diff --git a/declarativeimports/core/dialog.h b/declarativeimports/core/dialog.h index e6dd5904e..22fb2a625 100644 --- a/declarativeimports/core/dialog.h +++ b/declarativeimports/core/dialog.h @@ -47,6 +47,9 @@ private slots: void setContainsMouse(bool contains); void updatePopUpEnabledBorders(); + void onVisualParentChanged(); + void updateGeometry(); + private: bool isRespectingAppletsLayoutGeometry() const; QRect appletsLayoutGeometryFromContainment() const; @@ -58,6 +61,7 @@ private: Plasma::Types::Location m_edge{Plasma::Types::BottomEdge}; + std::array m_visualParentConnections; };