shift-shell/kcms/mobileshell/ui/main.qml
Marco Allegretti 8d59ce6153 Add Convergence section to shell KCM
Group convergence controls in one place by adding Convergence Mode, Dynamic Tiling, and Auto Hide Panels to the Shell settings page. Move Auto Hide Panels out of General and keep Dynamic Tiling disabled when convergence is off or gaming mode is active.
2026-05-06 10:02:43 +02:00

286 lines
11 KiB
QML

/*
* SPDX-FileCopyrightText: 2022 Devin Lin <devin@kde.org>
* SPDX-License-Identifier: LGPL-2.0-or-later
*/
import QtQuick 2.15
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15 as QQC2
import org.kde.kirigami as Kirigami
import org.kde.kcmutils as KCM
import org.kde.kirigamiaddons.formcard 1.0 as FormCard
import org.kde.plasma.private.mobileshell.shellsettingsplugin as ShellSettings
KCM.SimpleKCM {
id: root
title: i18n("Shell")
topPadding: 0
bottomPadding: 0
leftPadding: 0
rightPadding: 0
ColumnLayout {
FormCard.FormHeader {
title: i18n("General")
}
FormCard.FormCard {
FormCard.FormButtonDelegate {
id: shellVibrationsButton
text: i18n("Shell Vibrations")
onClicked: kcm.push("VibrationForm.qml")
}
FormCard.FormDelegateSeparator { above: shellVibrationsButton; below: animationsSwitch }
FormCard.FormSwitchDelegate {
id: animationsSwitch
text: i18n("Animations")
description: i18n("If this is off, animations will be reduced as much as possible.")
checked: ShellSettings.Settings.animationsEnabled
onCheckedChanged: {
if (checked != ShellSettings.Settings.animationsEnabled) {
ShellSettings.Settings.animationsEnabled = checked;
}
}
}
FormCard.FormDelegateSeparator { above: animationsSwitch; below: doubleTapWakeup }
FormCard.FormSwitchDelegate {
id: doubleTapWakeup
text: i18n("Double Tap to Wakeup")
description: i18n("When the screen is off, double tap to wakeup the device.")
checked: ShellSettings.KWinSettings.doubleTapWakeup
onCheckedChanged: {
if (checked != ShellSettings.KWinSettings.doubleTapWakeup) {
ShellSettings.KWinSettings.doubleTapWakeup = checked;
}
}
}
}
FormCard.FormHeader {
title: i18n("Convergence")
}
FormCard.FormCard {
FormCard.FormSwitchDelegate {
id: convergenceModeSwitch
text: i18n("Convergence Mode")
description: i18n("Use desktop-style window placement, titlebar controls, Overview, and the dock.")
checked: ShellSettings.Settings.convergenceModeEnabled
onCheckedChanged: {
if (checked != ShellSettings.Settings.convergenceModeEnabled) {
ShellSettings.Settings.convergenceModeEnabled = checked;
}
}
}
FormCard.FormDelegateSeparator { above: convergenceModeSwitch; below: dynamicTilingSwitch }
FormCard.FormSwitchDelegate {
id: dynamicTilingSwitch
text: i18n("Dynamic Tiling")
description: i18n("Automatically arrange windows in convergence mode. Disabled while convergence mode is off or gaming mode is active.")
enabled: ShellSettings.Settings.convergenceModeEnabled && !ShellSettings.Settings.gamingModeEnabled
checked: ShellSettings.Settings.dynamicTilingEnabled
onCheckedChanged: {
if (checked != ShellSettings.Settings.dynamicTilingEnabled) {
ShellSettings.Settings.dynamicTilingEnabled = checked;
}
}
}
FormCard.FormDelegateSeparator { above: dynamicTilingSwitch; below: autoHidePanels }
FormCard.FormSwitchDelegate {
id: autoHidePanels
text: i18n("Auto Hide Panels")
description: i18n("Allow maximized or fullscreen applications to reclaim panel and dock space.")
checked: ShellSettings.Settings.autoHidePanelsEnabled
onCheckedChanged: {
if (checked != ShellSettings.Settings.autoHidePanelsEnabled) {
ShellSettings.Settings.autoHidePanelsEnabled = checked;
}
}
}
}
FormCard.FormHeader {
title: i18n("Status Bar")
}
FormCard.FormCard {
FormCard.FormSwitchDelegate {
id: dateInStatusBar
text: i18n("Date in status bar")
description: i18n("If on, date will be shown next to the clock in the status bar.")
checked: ShellSettings.Settings.dateInStatusBar
onCheckedChanged: {
if (checked != ShellSettings.Settings.dateInStatusBar) {
ShellSettings.Settings.dateInStatusBar = checked;
}
}
}
FormCard.FormDelegateSeparator { above: quickSettingsButton; below: topLeftActionDrawerModeDelegate }
FormCard.FormSwitchDelegate {
id: showBatteryPercentage
text: i18n("Battery Percentage")
description: i18n("Show battery percentage in the status bar.")
checked: ShellSettings.Settings.showBatteryPercentage
onCheckedChanged: {
if (checked != ShellSettings.Settings.showBatteryPercentage) {
ShellSettings.Settings.showBatteryPercentage = checked;
}
}
}
FormCard.FormDelegateSeparator { above: quickSettingsButton; below: topLeftActionDrawerModeDelegate }
FormCard.FormComboBoxDelegate {
id: statusBarScaleFactorDelegate
text: i18n("Status Bar Size")
description: i18n("Size of the top panel (needs restart).")
model: [
{"name": i18nc("Status bar height", "Tiny"), "value": 1.0},
{"name": i18nc("Status bar height", "Small"), "value": 1.15},
{"name": i18nc("Status bar height", "Normal"), "value": 1.25},
{"name": i18nc("Status bar height", "Large"), "value": 1.5},
{"name": i18nc("Status bar height", "Very Large"), "value": 2.0}
]
textRole: "name"
valueRole: "value"
Component.onCompleted: {
currentIndex = indexOfValue(ShellSettings.Settings.statusBarScaleFactor);
dialog.parent = root;
}
onCurrentValueChanged: ShellSettings.Settings.statusBarScaleFactor = currentValue
}
}
FormCard.FormHeader {
title: i18n("Action Drawer")
}
FormCard.FormCard {
id: quickSettings
property string pinnedString: i18nc("Pinned action drawer mode", "Pinned Mode")
property string expandedString: i18nc("Expanded action drawer mode", "Expanded Mode")
FormCard.FormButtonDelegate {
id: quickSettingsButton
text: i18n("Quick Settings")
onClicked: kcm.push("QuickSettingsForm.qml")
}
FormCard.FormDelegateSeparator { above: quickSettingsButton; below: topLeftActionDrawerModeDelegate }
FormCard.FormComboBoxDelegate {
id: topLeftActionDrawerModeDelegate
text: i18n("Top Left Drawer Mode")
description: i18n("Mode when opening from the top left.")
model: [
{"name": quickSettings.pinnedString, "value": ShellSettings.Settings.Pinned},
{"name": quickSettings.expandedString, "value": ShellSettings.Settings.Expanded}
]
textRole: "name"
valueRole: "value"
Component.onCompleted: {
currentIndex = indexOfValue(ShellSettings.Settings.actionDrawerTopLeftMode);
dialog.parent = root;
}
onCurrentValueChanged: ShellSettings.Settings.actionDrawerTopLeftMode = currentValue
}
FormCard.FormDelegateSeparator { above: topLeftActionDrawerModeDelegate; below: topRightActionDrawerModeDelegate }
FormCard.FormComboBoxDelegate {
id: topRightActionDrawerModeDelegate
text: i18n("Top Right Drawer Mode")
description: i18n("Mode when opening from the top right.")
model: [
{"name": quickSettings.pinnedString, "value": ShellSettings.Settings.Pinned},
{"name": quickSettings.expandedString, "value": ShellSettings.Settings.Expanded}
]
textRole: "name"
valueRole: "value"
Component.onCompleted: {
currentIndex = indexOfValue(ShellSettings.Settings.actionDrawerTopRightMode);
dialog.parent = root
}
onCurrentValueChanged: ShellSettings.Settings.actionDrawerTopRightMode = currentValue
}
}
FormCard.FormHeader {
title: i18nc("@title:group, shortcuts available from lock screen", "Lock Screen Shortcuts")
}
FormCard.FormCard {
id: quickActionButtons
property string noneString: i18nc("@item:inlistbox", "None")
property string flashlightString: i18nc("@item:inlistbox", "Flashlight")
property string cameraString: i18nc("@item:inlistbox", "Camera")
FormCard.FormComboBoxDelegate {
id: lockscreenLeftButtonDelegate
text: i18nc("@label:listbox", "Left button")
model: [
{"name": quickActionButtons.noneString, "value": ShellSettings.Settings.None},
{"name": quickActionButtons.flashlightString, "value": ShellSettings.Settings.Flashlight}
// {"name": quickActionButtons.cameraString, "value": ShellSettings.Settings.Camera}
]
textRole: "name"
valueRole: "value"
Component.onCompleted: {
currentIndex = indexOfValue(ShellSettings.Settings.lockscreenLeftButtonAction);
dialog.parent = root;
}
onCurrentValueChanged: ShellSettings.Settings.lockscreenLeftButtonAction = currentValue
}
FormCard.FormDelegateSeparator { above: lockscreenRightButtonDelegate; below: lockscreenLeftButtonDelegate }
FormCard.FormComboBoxDelegate {
id: lockscreenRightButtonDelegate
text: i18nc("@label:listbox", "Right button")
model: [
{"name": quickActionButtons.noneString, "value": ShellSettings.Settings.None},
{"name": quickActionButtons.flashlightString, "value": ShellSettings.Settings.Flashlight}
// {"name": quickActionButtons.cameraString, "value": ShellSettings.Settings.Camera}
]
textRole: "name"
valueRole: "value"
Component.onCompleted: {
currentIndex = indexOfValue(ShellSettings.Settings.lockscreenRightButtonAction);
dialog.parent = root;
}
onCurrentValueChanged: ShellSettings.Settings.lockscreenRightButtonAction = currentValue
}
}
}
}