shift-shell/components/mobileshell/qml/popups/actionbuttons/RotationButton.qml
Micah Stanley 9bd4f0b747 GestureNavigation: Screen Rotation Popup Button
Implementation of a popup button to rotate the screen while using gesture navigation.

The button is set to appear when the device rotates while auto rotation is off. Then the button will be visible for a short period of time before disappearing.
2025-04-21 22:09:14 +00:00

63 lines
2 KiB
QML

/*
* SPDX-FileCopyrightText: 2025 Micah Stanley <stanleymicah@proton.me>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick
import QtQuick.Layouts
import org.kde.plasma.private.mobileshell.rotationplugin as RotationPlugin
import org.kde.plasma.private.mobileshell.shellsettingsplugin as ShellSettings
ActionButton {
id: root
readonly property int deviceRotation: RotationPlugin.RotationUtil.deviceRotation
readonly property int currentRotation: RotationPlugin.RotationUtil.currentRotation
iconSource: "rotation-allowed-symbolic"
// Update button position and timeout when device rotation changes.
onDeviceRotationChanged: {
if (ShellSettings.Settings.navigationPanelEnabled) return;
// reset button if visible
if (root.visible) {
root.active = false;
timeout.stop();
}
if (!RotationPlugin.RotationUtil.showRotationButton) return;
// Position at the bottom left edge of actual device, regardless of current rotation.
root.screenCorner = (currentRotation + 1) % 4;
// match angle to physical device rotation.
root.angle = ((4 + currentRotation - deviceRotation) % 4) * 90;
root.active = true;
}
// Rotate to suggested rotation if button is pressed.
onTriggered: {
root.visible = false;
root.active = false;
timeout.stop();
rotate.restart();
}
// rotate on timeout to give time to hide the button before rotation happens
Timer {
id: rotate
interval: 0
repeat: false
onTriggered: RotationPlugin.RotationUtil.rotateToSuggestedRotation();
}
// When the button is active, hide it after a certain amount of time has passed.
// This is to prevent the button form bothering the user when they do not wish to rotate.
onActiveChanged: if (active) timeout.restart();
Timer {
id: timeout
interval: 10000
repeat: false
onTriggered: active = false;
}
}