2021-12-22 23:29:00 +00:00
|
|
|
/*
|
|
|
|
|
* SPDX-FileCopyrightText: 2014 Marco Martin <notmart@gmail.com>
|
|
|
|
|
* SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: LGPL-2.0-or-later
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import QtQuick 2.15
|
|
|
|
|
import QtQuick.Controls 2.15
|
|
|
|
|
import QtQuick.Layouts 1.1
|
|
|
|
|
import QtQuick.Window 2.2
|
|
|
|
|
|
2023-11-02 11:08:17 +00:00
|
|
|
import org.kde.plasma.private.mobileshell as MobileShell
|
2025-08-19 15:54:55 +00:00
|
|
|
import org.kde.plasma.private.mobileshell.shellsettingsplugin as ShellSettings
|
2022-05-12 13:20:39 +00:00
|
|
|
import org.kde.plasma.components 3.0 as PlasmaComponents
|
2023-03-17 02:44:36 +00:00
|
|
|
import org.kde.plasma.private.mobileshell.quicksettingsplugin as QS
|
2026-03-07 03:08:07 +00:00
|
|
|
import org.kde.kirigami as Kirigami
|
2021-12-22 23:29:00 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Quick settings elements layout, change the height to clip.
|
|
|
|
|
*/
|
|
|
|
|
Item {
|
|
|
|
|
id: root
|
2025-06-23 00:16:16 +00:00
|
|
|
// to prevent clipping off the shadows form the BrightnessItem when the rest of the action panel view
|
|
|
|
|
// is transparent, we stop clipping the base view when fullViewProgress is not less then 1
|
|
|
|
|
clip: fullViewProgress < 1
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2021-12-22 23:29:00 +00:00
|
|
|
required property var actionDrawer
|
2022-12-11 02:05:13 +00:00
|
|
|
|
2024-10-31 05:05:44 +00:00
|
|
|
required property QS.QuickSettingsModel quickSettingsModel
|
2024-07-27 15:02:48 +00:00
|
|
|
|
2025-08-19 15:54:55 +00:00
|
|
|
readonly property real columns: Math.round(Math.min(6, Math.max(ShellSettings.Settings.quickSettingsColumns, width / intendedColumnWidth)))
|
2021-12-22 23:29:00 +00:00
|
|
|
readonly property real columnWidth: Math.floor(width / columns)
|
2023-11-02 11:08:17 +00:00
|
|
|
readonly property int minimizedColumns: Math.round(Math.min(8, Math.max(5, width / intendedMinimizedColumnWidth)))
|
2021-12-22 23:29:00 +00:00
|
|
|
readonly property real minimizedColumnWidth: Math.floor(width / minimizedColumns)
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2021-12-22 23:29:00 +00:00
|
|
|
readonly property real rowHeight: columnWidth * 0.7
|
|
|
|
|
readonly property real fullHeight: fullView.implicitHeight
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2023-07-25 02:46:50 +00:00
|
|
|
readonly property real intendedColumnWidth: Kirigami.Units.gridUnit * 7
|
|
|
|
|
readonly property real intendedMinimizedColumnWidth: Kirigami.Units.gridUnit * 4 + Kirigami.Units.smallSpacing
|
|
|
|
|
readonly property real minimizedRowHeight: Kirigami.Units.gridUnit * 4 + Kirigami.Units.smallSpacing
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2021-12-22 23:29:00 +00:00
|
|
|
property real fullViewProgress: 1
|
2022-05-07 17:10:02 +00:00
|
|
|
|
2022-05-07 21:19:56 +00:00
|
|
|
readonly property int columnCount: Math.floor(width/columnWidth)
|
2022-06-28 03:47:51 +00:00
|
|
|
readonly property int rowCount: {
|
2022-07-11 03:18:34 +00:00
|
|
|
let totalRows = Math.ceil(quickSettingsCount / columnCount);
|
2026-05-09 08:00:58 +00:00
|
|
|
let maxRows = root.isConvergence ? 3 : 5; // more than 5 is just disorienting
|
|
|
|
|
let targetRows = Math.floor(Window.height * (root.isConvergence ? 0.42 : 0.65) / rowHeight);
|
|
|
|
|
return Math.max(1, Math.min(maxRows, Math.min(totalRows, targetRows)));
|
2022-06-28 03:47:51 +00:00
|
|
|
}
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2022-05-07 21:19:56 +00:00
|
|
|
readonly property int pageSize: rowCount * columnCount
|
|
|
|
|
readonly property int quickSettingsCount: quickSettingsModel.count
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2026-04-16 11:41:24 +00:00
|
|
|
// Management tiles — promoted to full-width status rows in convergence.
|
|
|
|
|
readonly property var __managementCommands: ({
|
|
|
|
|
"plasma-open-settings kcm_mobile_wifi": "org.kde.plasma.networkmanagement",
|
|
|
|
|
"plasma-open-settings kcm_bluetooth": "org.kde.plasma.bluetooth",
|
|
|
|
|
"plasma-open-settings kcm_pulseaudio": "org.kde.plasma.volume",
|
|
|
|
|
"plasma-open-settings kcm_mobile_power": "org.kde.plasma.battery",
|
|
|
|
|
})
|
|
|
|
|
readonly property bool isConvergence: ShellSettings.Settings.convergenceModeEnabled
|
|
|
|
|
function isManagementTile(cmd) { return cmd in __managementCommands; }
|
2026-05-09 08:00:58 +00:00
|
|
|
readonly property int promotedColumns: isConvergence && width >= Kirigami.Units.gridUnit * 18 ? 2 : 1
|
|
|
|
|
readonly property real promotedSpacing: Kirigami.Units.smallSpacing
|
|
|
|
|
readonly property real promotedHorizontalMargin: Kirigami.Units.smallSpacing
|
|
|
|
|
readonly property real promotedCellWidth: Math.floor((width - 2 * promotedHorizontalMargin - (promotedColumns - 1) * promotedSpacing) / promotedColumns)
|
2026-04-16 11:41:24 +00:00
|
|
|
|
2024-11-14 03:34:01 +00:00
|
|
|
readonly property alias brightnessPressedValue: brightnessItem.brightnessPressedValue
|
|
|
|
|
|
2022-05-07 17:10:02 +00:00
|
|
|
function resetSwipeView() {
|
2026-02-15 03:54:52 +00:00
|
|
|
swipeView.currentIndex = 0;
|
2022-05-07 17:10:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// return to the first page when the action drawer is closed
|
|
|
|
|
Connections {
|
|
|
|
|
target: actionDrawer
|
|
|
|
|
|
2022-06-28 16:31:18 +00:00
|
|
|
function onOpenedChanged() {
|
|
|
|
|
if (!actionDrawer.opened) {
|
2022-05-07 17:10:02 +00:00
|
|
|
resetSwipeView();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2021-12-22 23:29:00 +00:00
|
|
|
// view when in minimized mode
|
|
|
|
|
RowLayout {
|
|
|
|
|
id: minimizedView
|
|
|
|
|
spacing: 0
|
2024-10-30 03:30:09 +00:00
|
|
|
opacity: 1 - root.fullViewProgress
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2024-10-30 03:30:09 +00:00
|
|
|
anchors.topMargin: root.fullViewProgress * -height
|
2021-12-22 23:29:00 +00:00
|
|
|
anchors.top: parent.top
|
|
|
|
|
anchors.left: parent.left
|
|
|
|
|
anchors.right: parent.right
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2021-12-22 23:29:00 +00:00
|
|
|
Repeater {
|
2024-10-31 05:05:44 +00:00
|
|
|
id: repeater
|
2023-03-17 02:44:36 +00:00
|
|
|
model: QS.PaginateModel {
|
2024-10-31 05:05:44 +00:00
|
|
|
sourceModel: root.quickSettingsModel
|
|
|
|
|
pageSize: Math.min(root.pageSize, root.minimizedColumns) // HACK: just root.minimizedColumns appears to end up with an empty model?
|
2022-05-07 17:10:02 +00:00
|
|
|
}
|
2026-02-18 22:01:06 +00:00
|
|
|
delegate: MobileShell.BaseItem {
|
2021-12-22 23:29:00 +00:00
|
|
|
required property var modelData
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2026-02-18 22:01:06 +00:00
|
|
|
implicitHeight: root.minimizedRowHeight
|
|
|
|
|
implicitWidth: root.minimizedColumnWidth
|
|
|
|
|
horizontalPadding: (width - Kirigami.Units.gridUnit * 3) / 2
|
|
|
|
|
verticalPadding: (height - Kirigami.Units.gridUnit * 3) / 2
|
|
|
|
|
|
|
|
|
|
contentItem: QuickSettingsMinimizedDelegate {
|
|
|
|
|
restrictedPermissions: actionDrawer.restrictedPermissions
|
|
|
|
|
|
|
|
|
|
text: modelData.text
|
|
|
|
|
status: modelData.status
|
|
|
|
|
icon: modelData.icon
|
|
|
|
|
enabled: modelData.enabled
|
|
|
|
|
settingsCommand: modelData.settingsCommand
|
|
|
|
|
toggleFunction: modelData.toggle
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2026-02-18 22:01:06 +00:00
|
|
|
onCloseRequested: {
|
|
|
|
|
actionDrawer.close();
|
|
|
|
|
}
|
2026-04-15 12:58:25 +00:00
|
|
|
onDetailRequested: (pluginId) => {
|
|
|
|
|
detailPopup.show(pluginId);
|
|
|
|
|
}
|
2026-02-18 22:01:06 +00:00
|
|
|
}
|
2021-12-22 23:29:00 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2024-10-30 03:30:09 +00:00
|
|
|
// view when fully open
|
|
|
|
|
ColumnLayout {
|
|
|
|
|
id: fullView
|
|
|
|
|
opacity: root.fullViewProgress
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2024-10-30 03:30:09 +00:00
|
|
|
anchors.top: minimizedView.bottom
|
|
|
|
|
anchors.left: parent.left
|
|
|
|
|
anchors.right: parent.right
|
|
|
|
|
|
2026-05-09 08:00:58 +00:00
|
|
|
// Promoted desktop controls (convergence mode only)
|
|
|
|
|
GridLayout {
|
|
|
|
|
id: promotedGrid
|
2026-04-16 11:41:24 +00:00
|
|
|
Layout.fillWidth: true
|
2026-05-09 08:00:58 +00:00
|
|
|
Layout.leftMargin: root.promotedHorizontalMargin
|
|
|
|
|
Layout.rightMargin: root.promotedHorizontalMargin
|
2026-04-16 11:41:24 +00:00
|
|
|
Layout.bottomMargin: Kirigami.Units.smallSpacing
|
2026-05-09 08:00:58 +00:00
|
|
|
columns: root.promotedColumns
|
|
|
|
|
rowSpacing: root.promotedSpacing
|
|
|
|
|
columnSpacing: root.promotedSpacing
|
2026-04-16 11:41:24 +00:00
|
|
|
visible: root.isConvergence
|
|
|
|
|
|
2026-05-09 08:00:58 +00:00
|
|
|
Repeater {
|
|
|
|
|
model: [
|
|
|
|
|
{
|
|
|
|
|
text: i18n("Clipboard"),
|
|
|
|
|
status: i18n("History"),
|
|
|
|
|
icon: "klipper-symbolic",
|
|
|
|
|
pluginId: "org.kde.plasma.clipboard"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
text: i18n("Disks & Devices"),
|
|
|
|
|
status: i18n("Removable media"),
|
|
|
|
|
icon: "device-notifier-symbolic",
|
|
|
|
|
pluginId: "org.kde.plasma.devicenotifier"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
text: i18n("System Tray"),
|
|
|
|
|
status: systemTrayPopup.trayItemCount > 0 ? i18np("%1 status item", "%1 status items", systemTrayPopup.trayItemCount) : i18n("No status items"),
|
|
|
|
|
icon: "preferences-desktop-notification-symbolic",
|
|
|
|
|
trayPopup: true
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
delegate: QuickSettingsStatusRow {
|
|
|
|
|
required property var modelData
|
|
|
|
|
Layout.preferredWidth: root.promotedCellWidth
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
compact: true
|
|
|
|
|
text: modelData.text
|
|
|
|
|
status: modelData.status
|
|
|
|
|
icon: modelData.icon
|
|
|
|
|
enabled: false
|
|
|
|
|
toggleFunction: null
|
|
|
|
|
onDetailClicked: {
|
|
|
|
|
if (modelData.trayPopup) {
|
|
|
|
|
systemTrayPopup.show();
|
|
|
|
|
} else {
|
|
|
|
|
detailPopup.show(modelData.pluginId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-16 11:41:24 +00:00
|
|
|
Repeater {
|
|
|
|
|
model: root.quickSettingsModel
|
|
|
|
|
delegate: QuickSettingsStatusRow {
|
|
|
|
|
required property var modelData
|
2026-05-09 08:00:58 +00:00
|
|
|
readonly property bool isPromoted: root.isManagementTile(modelData.settingsCommand)
|
|
|
|
|
Layout.preferredWidth: isPromoted ? root.promotedCellWidth : 0
|
|
|
|
|
Layout.preferredHeight: isPromoted ? implicitHeight : 0
|
|
|
|
|
Layout.maximumWidth: isPromoted ? root.promotedCellWidth : 0
|
|
|
|
|
Layout.maximumHeight: isPromoted ? implicitHeight : 0
|
2026-04-16 11:41:24 +00:00
|
|
|
Layout.fillWidth: true
|
2026-05-09 08:00:58 +00:00
|
|
|
visible: isPromoted
|
|
|
|
|
compact: true
|
2026-04-16 11:41:24 +00:00
|
|
|
text: modelData.text
|
|
|
|
|
status: modelData.status
|
|
|
|
|
icon: modelData.icon
|
|
|
|
|
enabled: modelData.enabled
|
|
|
|
|
toggleFunction: modelData.toggle
|
|
|
|
|
onDetailClicked: {
|
|
|
|
|
let pluginId = root.__managementCommands[modelData.settingsCommand];
|
|
|
|
|
if (pluginId) detailPopup.show(pluginId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-30 03:30:09 +00:00
|
|
|
// Quick settings view
|
2022-05-09 22:12:25 +00:00
|
|
|
ColumnLayout {
|
2024-10-30 03:30:09 +00:00
|
|
|
Layout.fillWidth: true
|
2026-05-19 07:13:14 +00:00
|
|
|
Layout.minimumHeight: root.isConvergence ? convergenceFlow.implicitHeight : rowCount * rowHeight
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2024-11-14 03:34:01 +00:00
|
|
|
opacity: brightnessPressedValue
|
|
|
|
|
|
2026-05-19 07:13:14 +00:00
|
|
|
Flow {
|
|
|
|
|
id: convergenceFlow
|
|
|
|
|
visible: root.isConvergence
|
|
|
|
|
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
Layout.preferredHeight: implicitHeight
|
|
|
|
|
|
|
|
|
|
spacing: 0
|
|
|
|
|
|
|
|
|
|
Repeater {
|
|
|
|
|
model: root.quickSettingsModel
|
|
|
|
|
delegate: MobileShell.BaseItem {
|
|
|
|
|
required property var modelData
|
|
|
|
|
|
|
|
|
|
readonly property bool __hidden: root.isManagementTile(modelData.settingsCommand)
|
|
|
|
|
height: __hidden ? 0 : root.rowHeight
|
|
|
|
|
width: __hidden ? 0 : root.columnWidth
|
|
|
|
|
visible: !__hidden
|
|
|
|
|
padding: Kirigami.Units.smallSpacing
|
|
|
|
|
|
|
|
|
|
contentItem: QuickSettingsFullDelegate {
|
|
|
|
|
restrictedPermissions: actionDrawer.restrictedPermissions
|
|
|
|
|
|
|
|
|
|
text: modelData.text
|
|
|
|
|
status: modelData.status
|
|
|
|
|
icon: modelData.icon
|
|
|
|
|
enabled: modelData.enabled
|
|
|
|
|
settingsCommand: modelData.settingsCommand
|
|
|
|
|
toggleFunction: modelData.toggle
|
|
|
|
|
|
|
|
|
|
onCloseRequested: {
|
|
|
|
|
actionDrawer.close();
|
|
|
|
|
}
|
|
|
|
|
onDetailRequested: (pluginId) => {
|
|
|
|
|
detailPopup.show(pluginId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-09 22:12:25 +00:00
|
|
|
SwipeView {
|
|
|
|
|
id: swipeView
|
Fix various typos
Fixes typos in various source comments.
Found via `codespell -S "*.po,*.svg,*.pgm,*.xml,./po,*.desktop,*.json,*.actions" -L aline,aparent,childs,distroname,indexin,indx,logicaly,lokal,nd,splitted,te`
2025-09-05 12:21:15 +00:00
|
|
|
// we need to clip this view here to prevent the other quick settings pages from being visible
|
2025-06-23 00:16:16 +00:00
|
|
|
// when fullViewProgress is not less then 1 and the base view is no longer being clipped
|
|
|
|
|
clip: true
|
2026-05-19 07:13:14 +00:00
|
|
|
visible: !root.isConvergence
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2022-05-09 22:12:25 +00:00
|
|
|
Layout.fillWidth: true
|
2026-05-19 07:13:14 +00:00
|
|
|
Layout.preferredHeight: visible ? rowCount * rowHeight : 0
|
|
|
|
|
Layout.maximumHeight: visible ? rowCount * rowHeight : 0
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2022-05-09 22:12:25 +00:00
|
|
|
Repeater {
|
|
|
|
|
model: Math.ceil(quickSettingsCount / pageSize)
|
|
|
|
|
delegate: Flow {
|
|
|
|
|
id: flow
|
|
|
|
|
spacing: 0
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2022-05-09 22:12:25 +00:00
|
|
|
required property int index
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2022-05-09 22:12:25 +00:00
|
|
|
Repeater {
|
2023-03-17 02:44:36 +00:00
|
|
|
model: QS.PaginateModel {
|
2022-05-09 22:12:25 +00:00
|
|
|
sourceModel: quickSettingsModel
|
|
|
|
|
pageSize: root.pageSize
|
|
|
|
|
firstItem: pageSize * flow.index
|
|
|
|
|
}
|
2026-02-18 22:01:06 +00:00
|
|
|
delegate: MobileShell.BaseItem {
|
2022-05-09 22:12:25 +00:00
|
|
|
required property var modelData
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2026-04-16 11:41:24 +00:00
|
|
|
readonly property bool __hidden: root.isConvergence && root.isManagementTile(modelData.settingsCommand)
|
|
|
|
|
height: __hidden ? 0 : root.rowHeight
|
|
|
|
|
width: __hidden ? 0 : root.columnWidth
|
|
|
|
|
visible: !__hidden
|
2026-02-18 22:01:06 +00:00
|
|
|
padding: Kirigami.Units.smallSpacing
|
|
|
|
|
|
|
|
|
|
contentItem: QuickSettingsFullDelegate {
|
|
|
|
|
restrictedPermissions: actionDrawer.restrictedPermissions
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2026-02-18 22:01:06 +00:00
|
|
|
text: modelData.text
|
|
|
|
|
status: modelData.status
|
|
|
|
|
icon: modelData.icon
|
|
|
|
|
enabled: modelData.enabled
|
|
|
|
|
settingsCommand: modelData.settingsCommand
|
|
|
|
|
toggleFunction: modelData.toggle
|
|
|
|
|
|
|
|
|
|
onCloseRequested: {
|
|
|
|
|
actionDrawer.close();
|
|
|
|
|
}
|
2026-04-15 12:58:25 +00:00
|
|
|
onDetailRequested: (pluginId) => {
|
|
|
|
|
detailPopup.show(pluginId);
|
|
|
|
|
}
|
2026-02-18 22:01:06 +00:00
|
|
|
}
|
2022-05-09 22:12:25 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2022-05-09 22:12:25 +00:00
|
|
|
Loader {
|
|
|
|
|
id: indicatorLoader
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2022-05-09 22:12:25 +00:00
|
|
|
Layout.alignment: Qt.AlignCenter
|
2023-07-25 01:13:52 +00:00
|
|
|
Layout.topMargin: Kirigami.Units.smallSpacing
|
|
|
|
|
Layout.leftMargin: Kirigami.Units.smallSpacing
|
|
|
|
|
Layout.rightMargin: Kirigami.Units.smallSpacing
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2022-05-09 22:12:25 +00:00
|
|
|
// Avoid wasting space when not loaded
|
|
|
|
|
Layout.maximumHeight: active ? item.implicitHeight : 0
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2026-05-19 07:13:14 +00:00
|
|
|
active: !root.isConvergence && swipeView.count > 1 ? true: false
|
2022-05-09 22:12:25 +00:00
|
|
|
asynchronous: true
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2022-05-09 22:12:25 +00:00
|
|
|
sourceComponent: PageIndicator {
|
2026-04-18 17:04:49 +00:00
|
|
|
id: pageIndicatorItem
|
2022-05-09 22:12:25 +00:00
|
|
|
count: swipeView.count
|
|
|
|
|
currentIndex: swipeView.currentIndex
|
2026-04-09 09:43:59 +00:00
|
|
|
interactive: true
|
2026-04-18 17:04:49 +00:00
|
|
|
onCurrentIndexChanged: {
|
|
|
|
|
if (swipeView.currentIndex !== currentIndex)
|
|
|
|
|
swipeView.currentIndex = currentIndex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Connections {
|
|
|
|
|
target: swipeView
|
|
|
|
|
function onCurrentIndexChanged() {
|
|
|
|
|
if (pageIndicatorItem.currentIndex !== swipeView.currentIndex)
|
|
|
|
|
pageIndicatorItem.currentIndex = swipeView.currentIndex;
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2022-05-09 22:12:25 +00:00
|
|
|
delegate: Rectangle {
|
|
|
|
|
implicitWidth: 8
|
|
|
|
|
implicitHeight: count > 1 ? 8 : 0
|
|
|
|
|
|
|
|
|
|
radius: parent.width / 2
|
2023-07-25 01:13:52 +00:00
|
|
|
color: Kirigami.Theme.disabledTextColor
|
2022-05-09 22:12:25 +00:00
|
|
|
|
|
|
|
|
opacity: index === currentIndex ? 0.95 : 0.45
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-10-30 03:30:09 +00:00
|
|
|
|
|
|
|
|
// Brightness slider
|
|
|
|
|
BrightnessItem {
|
2024-11-14 03:34:01 +00:00
|
|
|
id: brightnessItem
|
2024-10-30 03:30:09 +00:00
|
|
|
Layout.bottomMargin: Kirigami.Units.smallSpacing * 2
|
|
|
|
|
Layout.leftMargin: Kirigami.Units.smallSpacing
|
|
|
|
|
Layout.rightMargin: Kirigami.Units.smallSpacing
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
}
|
2022-05-09 22:12:25 +00:00
|
|
|
}
|
2024-07-27 03:47:44 +00:00
|
|
|
|
2026-04-15 12:58:25 +00:00
|
|
|
DetailPopup {
|
|
|
|
|
id: detailPopup
|
|
|
|
|
parent: root.Window.window ? root.Window.window.contentItem : root
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-09 08:00:58 +00:00
|
|
|
SystemTrayPopup {
|
|
|
|
|
id: systemTrayPopup
|
|
|
|
|
parent: root.Window.window ? root.Window.window.contentItem : root
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-22 23:29:00 +00:00
|
|
|
}
|