mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-06-11 00:47:22 +00:00
Restore dock hover tracking
Replace the fullscreen convergence pointer tracker with edge-local hover areas so dock buttons keep receiving hover, tooltip, and cursor events.
This commit is contained in:
parent
97abf33597
commit
495f76900f
3 changed files with 59 additions and 64 deletions
|
|
@ -415,6 +415,8 @@ ContainmentItem {
|
|||
function refreshLeftLauncherVisibility() {
|
||||
if (!leftLauncherEnabled) {
|
||||
leftLauncherCloseTimer.stop()
|
||||
leftEdgeHovered = false
|
||||
leftLauncherHovered = false
|
||||
leftLauncherOpen = false
|
||||
inputRegionTimer.restart()
|
||||
return
|
||||
|
|
@ -448,54 +450,6 @@ ContainmentItem {
|
|||
inputRegionTimer.restart()
|
||||
}
|
||||
|
||||
function updateLeftLauncherHoverState(pointerX, pointerY, withinWindow) {
|
||||
const insideEdge = withinWindow
|
||||
&& pointerX >= 0
|
||||
&& pointerX <= leftEdgeHotzoneWidth
|
||||
&& pointerY >= topBarHitHeight
|
||||
&& pointerY <= (height - dockHeight)
|
||||
|
||||
const launcherTop = height - dockHeight - leftLauncherHeight
|
||||
const insideLauncher = withinWindow
|
||||
&& leftLauncherOpen
|
||||
&& pointerX >= 0
|
||||
&& pointerX <= leftLauncherWidth
|
||||
&& pointerY >= launcherTop
|
||||
&& pointerY <= (launcherTop + leftLauncherHeight)
|
||||
|
||||
if (leftEdgeHovered !== insideEdge) {
|
||||
leftEdgeHovered = insideEdge
|
||||
}
|
||||
if (leftLauncherHovered !== insideLauncher) {
|
||||
leftLauncherHovered = insideLauncher
|
||||
}
|
||||
refreshLeftLauncherVisibility()
|
||||
}
|
||||
|
||||
function updateLayoutMenuHoverState(pointerX, pointerY, withinWindow) {
|
||||
const insideEdge = layoutMenuEnabled
|
||||
&& withinWindow
|
||||
&& pointerX >= (width - rightEdgeHotzoneWidth)
|
||||
&& pointerX <= width
|
||||
&& pointerY >= topBarHitHeight
|
||||
&& pointerY <= (height - dockHeight)
|
||||
|
||||
const insideMenu = withinWindow
|
||||
&& layoutMenuOpen
|
||||
&& pointerX >= rightLayoutMenu.x
|
||||
&& pointerX <= width
|
||||
&& pointerY >= rightLayoutMenu.y
|
||||
&& pointerY <= (rightLayoutMenu.y + rightLayoutMenu.height)
|
||||
|
||||
if (rightEdgeHovered !== insideEdge) {
|
||||
rightEdgeHovered = insideEdge
|
||||
}
|
||||
if (layoutMenuHovered !== insideMenu) {
|
||||
layoutMenuHovered = insideMenu
|
||||
}
|
||||
refreshLayoutMenuVisibility()
|
||||
}
|
||||
|
||||
onActiveChanged: {
|
||||
hoverRevealTimer.stop()
|
||||
hoverRevealing = false
|
||||
|
|
@ -801,6 +755,20 @@ ContainmentItem {
|
|||
anchors.top: topBarSurface.bottom
|
||||
anchors.bottom: dockSurface.top
|
||||
width: convergenceChrome.leftEdgeHotzoneWidth
|
||||
|
||||
MouseArea {
|
||||
id: leftEdgeHoverArea
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
enabled: convergenceChrome.leftLauncherEnabled
|
||||
hoverEnabled: enabled
|
||||
cursorShape: enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
|
||||
onContainsMouseChanged: {
|
||||
convergenceChrome.leftEdgeHovered = containsMouse
|
||||
convergenceChrome.refreshLeftLauncherVisibility()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
|
|
@ -810,23 +778,19 @@ ContainmentItem {
|
|||
anchors.top: topBarSurface.bottom
|
||||
anchors.bottom: dockSurface.top
|
||||
width: convergenceChrome.layoutMenuEnabled ? convergenceChrome.rightEdgeHotzoneWidth : 0
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: leftLauncherPointerTracker
|
||||
|
||||
id: rightEdgeHoverArea
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
hoverEnabled: true
|
||||
z: 10
|
||||
enabled: convergenceChrome.layoutMenuEnabled
|
||||
hoverEnabled: enabled
|
||||
cursorShape: enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
|
||||
onPositionChanged: (mouse) => {
|
||||
convergenceChrome.updateLeftLauncherHoverState(mouse.x, mouse.y, true)
|
||||
convergenceChrome.updateLayoutMenuHoverState(mouse.x, mouse.y, true)
|
||||
onContainsMouseChanged: {
|
||||
convergenceChrome.rightEdgeHovered = containsMouse
|
||||
convergenceChrome.refreshLayoutMenuVisibility()
|
||||
}
|
||||
onExited: {
|
||||
convergenceChrome.updateLeftLauncherHoverState(-1, -1, false)
|
||||
convergenceChrome.updateLayoutMenuHoverState(-1, -1, false)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -845,6 +809,15 @@ ContainmentItem {
|
|||
surfaceColor: convergenceChrome.chromeColor
|
||||
animationDuration: root.shortAnimationDuration
|
||||
|
||||
HoverHandler {
|
||||
enabled: convergenceChrome.layoutMenuOpen
|
||||
|
||||
onHoveredChanged: {
|
||||
convergenceChrome.layoutMenuHovered = hovered
|
||||
convergenceChrome.refreshLayoutMenuVisibility()
|
||||
}
|
||||
}
|
||||
|
||||
transform: Translate {
|
||||
y: convergenceChrome.layoutMenuOpen ? 0 : Kirigami.Units.gridUnit
|
||||
x: convergenceChrome.layoutMenuOpen ? 0 : rightLayoutMenu.width - convergenceChrome.rightEdgeHotzoneWidth
|
||||
|
|
@ -887,6 +860,15 @@ ContainmentItem {
|
|||
|
||||
readonly property real cornerRadius: Math.min(MobileShell.Constants.convergenceWorkspaceFrameRadius, height * 0.24)
|
||||
|
||||
HoverHandler {
|
||||
enabled: convergenceChrome.leftLauncherOpen
|
||||
|
||||
onHoveredChanged: {
|
||||
convergenceChrome.leftLauncherHovered = hovered
|
||||
convergenceChrome.refreshLeftLauncherVisibility()
|
||||
}
|
||||
}
|
||||
|
||||
Shape {
|
||||
id: leftLauncherSurface
|
||||
anchors.fill: parent
|
||||
|
|
|
|||
|
|
@ -119,12 +119,24 @@ require_line "$folio_main" "readonly property real workAreaY: topBarHitHeight"
|
|||
require_line "$folio_main" "readonly property real workAreaWidth: Math.max(0, width - frameThickness * 2)"
|
||||
require_line "$folio_main" "readonly property real workAreaHeight: Math.max(0, height - topBarHeight - dockHeight - frameThickness * 2)"
|
||||
require_line "$folio_main" "fillRule: ShapePath.OddEvenFill"
|
||||
require_line "$folio_main" "id: leftEdgeHoverArea"
|
||||
require_line "$folio_main" "id: rightEdgeHoverArea"
|
||||
require_line "$folio_main" "cursorShape: enabled ? Qt.PointingHandCursor : Qt.ArrowCursor"
|
||||
require_line "$folio_main" "convergenceChrome.leftEdgeHovered = containsMouse"
|
||||
require_line "$folio_main" "convergenceChrome.rightEdgeHovered = containsMouse"
|
||||
require_line "$folio_main" "convergenceChrome.leftLauncherHovered = hovered"
|
||||
require_line "$folio_main" "convergenceChrome.layoutMenuHovered = hovered"
|
||||
|
||||
if grep -Fq "root.panel.visibilityMode = (!ShellSettings.Settings.convergenceModeEnabled && ShellSettings.Settings.autoHidePanelsEnabled) ? 3 : 0" "$panel"; then
|
||||
echo "Convergence panel hit area must not reserve extra top space" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if grep -Fq "id: leftLauncherPointerTracker" "$folio_main"; then
|
||||
echo "Folio convergence chrome must not cover the dock with a fullscreen hover tracker" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
require_line "$folio_main" "PathLine { x: convergenceChrome.width; y: convergenceChrome.height - convergenceChrome.dockHeight }"
|
||||
require_line "$folio_main" "PathLine { x: 0; y: convergenceChrome.height - convergenceChrome.dockHeight }"
|
||||
require_line "$folio_main" "PathArc { x: convergenceChrome.workAreaX + convergenceChrome.workAreaWidth - convergenceChrome.frameRadius; y: convergenceChrome.workAreaY + convergenceChrome.workAreaHeight; radiusX: convergenceChrome.frameRadius; radiusY: convergenceChrome.frameRadius }"
|
||||
|
|
|
|||
|
|
@ -138,7 +138,8 @@ require_line "$folio_main" "regions.push(rightEdgeRegion)"
|
|||
require_line "$folio_main" "if (layoutMenuEnabled && layoutMenuOpen)"
|
||||
require_line "$folio_main" "rightEdgeHovered = false"
|
||||
require_line "$folio_main" "layoutMenuHovered = false"
|
||||
require_line "$folio_main" "const insideEdge = layoutMenuEnabled"
|
||||
require_line "$folio_main" "id: rightEdgeHoverArea"
|
||||
require_line "$folio_main" "convergenceChrome.rightEdgeHovered = containsMouse"
|
||||
require_line "$folio_main" "width: convergenceChrome.layoutMenuEnabled ? convergenceChrome.rightEdgeHotzoneWidth : 0"
|
||||
|
||||
running_panel_group_disabled_count="$(grep -F "groupMode: TaskManager.TasksModel.GroupDisabled" "$running_apps_panel" | wc -l)"
|
||||
|
|
|
|||
Loading…
Reference in a new issue