feat(Application Launcher): add option to ignore initial mouse position

This commit is contained in:
DuckySoLucky
2025-10-10 20:07:28 +02:00
parent 72b2b9e917
commit f0c44734bc
5 changed files with 66 additions and 5 deletions
+50 -2
View File
@@ -35,6 +35,7 @@ NPanel {
property var plugins: []
property var activePlugin: null
property bool resultsReady: false
property bool ignoreMouseHover: false
readonly property int badgeSize: Math.round(Style.baseWidgetSize * 1.6 * scaling)
readonly property int entryHeight: Math.round(badgeSize + Style.marginM * 2 * scaling)
@@ -94,6 +95,7 @@ NPanel {
// Lifecycle
onOpened: {
resultsReady = false
ignoreMouseHover = Settings.data.appLauncher.ignoreInitialMousePosition // Use setting value
// Notify plugins
for (let plugin of plugins) {
@@ -110,6 +112,7 @@ NPanel {
onClosed: {
// Reset search text
searchText = ""
ignoreMouseHover = Settings.data.appLauncher.ignoreInitialMousePosition // Use setting value
// Notify plugins
for (let plugin of plugins) {
@@ -154,6 +157,49 @@ NPanel {
color: Color.transparent
opacity: resultsReady ? 1.0 : 0.0
// Global MouseArea to detect mouse movement
MouseArea {
id: mouseMovementDetector
anchors.fill: parent
z: -999
hoverEnabled: true
propagateComposedEvents: true
acceptedButtons: Qt.NoButton
property real lastX: 0
property real lastY: 0
property bool initialized: false
onPositionChanged: mouse => {
// Store initial position
if (!initialized) {
lastX = mouse.x
lastY = mouse.y
initialized = true
return
}
// Check if mouse actually moved
const deltaX = Math.abs(mouse.x - lastX)
const deltaY = Math.abs(mouse.y - lastY)
if (deltaX > 1 || deltaY > 1) {
root.ignoreMouseHover = false
lastX = mouse.x
lastY = mouse.y
}
}
// Reset when launcher opens
Connections {
target: root
function onOpenedChanged() {
if (root.opened) {
mouseMovementDetector.initialized = false
}
}
}
}
Behavior on opacity {
NumberAnimation {
duration: Style.animationFast
@@ -321,7 +367,7 @@ NPanel {
delegate: Rectangle {
id: entry
property bool isSelected: mouseArea.containsMouse || (index === selectedIndex)
property bool isSelected: (!root.ignoreMouseHover && mouseArea.containsMouse) || (index === selectedIndex)
// Accessor for app id
property string appId: (modelData && modelData.appId) ? String(modelData.appId) : ""
@@ -523,7 +569,9 @@ NPanel {
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onEntered: {
selectedIndex = index
if (!root.ignoreMouseHover) {
selectedIndex = index
}
}
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
+7
View File
@@ -99,6 +99,13 @@ ColumnLayout {
onToggled: checked => Settings.data.appLauncher.useApp2Unit = checked
}
NToggle {
label: I18n.tr("settings.launcher.settings.ignore-initial-mouse.label")
description: I18n.tr("settings.launcher.settings.ignore-initial-mouse.description")
checked: Settings.data.appLauncher.ignoreInitialMousePosition
onToggled: checked => Settings.data.appLauncher.ignoreInitialMousePosition = checked
}
NTextInput {
label: I18n.tr("settings.launcher.settings.terminal-command.label")
description: I18n.tr("settings.launcher.settings.terminal-command.description")