mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-26 14:23:09 +00:00
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.
63 lines
2 KiB
QML
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;
|
|
}
|
|
}
|