Warning, /plasma/plasma-mobile/components/mobileshell/qml/actiondrawer/quicksettings/QuickSettings.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * SPDX-FileCopyrightText: 2014 Marco Martin <notmart@gmail.com>
0003 * SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
0004 *
0005 * SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007
0008 import QtQuick 2.15
0009 import QtQuick.Controls 2.15
0010 import QtQuick.Layouts 1.1
0011 import QtQuick.Window 2.2
0012
0013 import org.kde.plasma.private.mobileshell as MobileShell
0014 import org.kde.plasma.components 3.0 as PlasmaComponents
0015 import org.kde.plasma.private.mobileshell.quicksettingsplugin as QS
0016 import org.kde.kirigami 2.20 as Kirigami
0017
0018 /**
0019 * Quick settings elements layout, change the height to clip.
0020 */
0021 Item {
0022 id: root
0023 clip: true
0024
0025 required property var actionDrawer
0026 required property int mode
0027
0028 enum Mode {
0029 Pages,
0030 ScrollView
0031 }
0032
0033 readonly property real columns: Math.round(Math.min(6, Math.max(3, width / intendedColumnWidth)))
0034 readonly property real columnWidth: Math.floor(width / columns)
0035 readonly property int minimizedColumns: Math.round(Math.min(8, Math.max(5, width / intendedMinimizedColumnWidth)))
0036 readonly property real minimizedColumnWidth: Math.floor(width / minimizedColumns)
0037
0038 readonly property real rowHeight: columnWidth * 0.7
0039 readonly property real fullHeight: fullView.implicitHeight
0040
0041 readonly property real intendedColumnWidth: Kirigami.Units.gridUnit * 7
0042 readonly property real intendedMinimizedColumnWidth: Kirigami.Units.gridUnit * 4 + Kirigami.Units.smallSpacing
0043 readonly property real minimizedRowHeight: Kirigami.Units.gridUnit * 4 + Kirigami.Units.smallSpacing
0044
0045 property real minimizedViewProgress: 0
0046 property real fullViewProgress: 1
0047
0048 readonly property QS.QuickSettingsModel quickSettingsModel: QS.QuickSettingsModel {}
0049
0050 readonly property int columnCount: Math.floor(width/columnWidth)
0051 readonly property int rowCount: {
0052 let totalRows = Math.ceil(quickSettingsCount / columnCount);
0053
0054 if (root.mode === QuickSettings.Pages) {
0055 // portrait orientation
0056 let maxRows = 5; // more than 5 is just disorienting
0057 let targetRows = Math.floor(Window.height * 0.65 / rowHeight);
0058 return Math.min(maxRows, Math.min(totalRows, targetRows));
0059
0060 } else if (root.mode === QuickSettings.ScrollView) {
0061 // horizontal orientation
0062 let targetRows = Math.floor(Window.height * 0.8 / rowHeight);
0063 return Math.min(totalRows, targetRows);
0064 }
0065 }
0066
0067 readonly property int pageSize: rowCount * columnCount
0068 readonly property int quickSettingsCount: quickSettingsModel.count
0069
0070 function resetSwipeView() {
0071 if (root.mode === QuickSettings.Pages) {
0072 pageLoader.item.view.currentIndex = 0;
0073 }
0074 }
0075
0076 // return to the first page when the action drawer is closed
0077 Connections {
0078 target: actionDrawer
0079
0080 function onOpenedChanged() {
0081 if (!actionDrawer.opened) {
0082 resetSwipeView();
0083 }
0084 }
0085 }
0086
0087 // view when fully open
0088 ColumnLayout {
0089 id: fullView
0090 opacity: root.fullViewProgress
0091 visible: opacity !== 0
0092 transform: Translate { y: (1 - fullView.opacity) * root.rowHeight }
0093
0094 anchors.top: parent.top
0095 anchors.left: parent.left
0096 anchors.right: parent.right
0097
0098 // Dynamically loads the appropriate view
0099 Loader {
0100 id: pageLoader
0101
0102 Layout.fillWidth: true
0103 Layout.minimumHeight: rowCount * rowHeight
0104
0105 asynchronous: true
0106 sourceComponent: root.mode === QuickSettings.Pages ? swipeViewComponent : scrollViewComponent
0107 }
0108
0109 BrightnessItem {
0110 id: brightnessItem
0111 Layout.bottomMargin: Kirigami.Units.smallSpacing * 2
0112 Layout.leftMargin: Kirigami.Units.smallSpacing
0113 Layout.rightMargin: Kirigami.Units.smallSpacing
0114 Layout.fillWidth: true
0115 }
0116 }
0117
0118 // view when in minimized mode
0119 RowLayout {
0120 id: minimizedView
0121 spacing: 0
0122 opacity: root.minimizedViewProgress
0123 visible: opacity !== 0
0124 transform: Translate { y: (1 - minimizedView.opacity) * -root.rowHeight }
0125
0126 anchors.top: parent.top
0127 anchors.left: parent.left
0128 anchors.right: parent.right
0129
0130 Repeater {
0131 model: QS.PaginateModel {
0132 sourceModel: quickSettingsModel
0133 pageSize: minimizedColumns
0134 }
0135 delegate: MobileShell.BaseItem {
0136 required property var modelData
0137
0138 implicitHeight: root.minimizedRowHeight
0139 implicitWidth: root.minimizedColumnWidth
0140 horizontalPadding: (width - Kirigami.Units.gridUnit * 3) / 2
0141 verticalPadding: (height - Kirigami.Units.gridUnit * 3) / 2
0142
0143 contentItem: QuickSettingsMinimizedDelegate {
0144 restrictedPermissions: actionDrawer.restrictedPermissions
0145
0146 text: modelData.text
0147 status: modelData.status
0148 icon: modelData.icon
0149 enabled: modelData.enabled
0150 settingsCommand: modelData.settingsCommand
0151 toggleFunction: modelData.toggle
0152
0153 onCloseRequested: {
0154 actionDrawer.close();
0155 }
0156 }
0157 }
0158 }
0159 }
0160
0161 // Loads portrait quick settings view
0162 Component {
0163 id: swipeViewComponent
0164
0165 ColumnLayout {
0166 readonly property var view: swipeView
0167
0168 SwipeView {
0169 id: swipeView
0170
0171 Layout.fillWidth: true
0172 Layout.preferredHeight: rowCount * rowHeight
0173
0174 Repeater {
0175 model: Math.ceil(quickSettingsCount / pageSize)
0176 delegate: Flow {
0177 id: flow
0178 spacing: 0
0179
0180 required property int index
0181
0182 Repeater {
0183 model: QS.PaginateModel {
0184 sourceModel: quickSettingsModel
0185 pageSize: root.pageSize
0186 firstItem: pageSize * flow.index
0187 }
0188 delegate: Loader {
0189 required property var modelData
0190
0191 asynchronous: true
0192
0193 sourceComponent: quickSettingComponent
0194 }
0195 }
0196 }
0197 }
0198 }
0199
0200 Loader {
0201 id: indicatorLoader
0202
0203 Layout.alignment: Qt.AlignCenter
0204 Layout.topMargin: Kirigami.Units.smallSpacing
0205 Layout.leftMargin: Kirigami.Units.smallSpacing
0206 Layout.rightMargin: Kirigami.Units.smallSpacing
0207
0208 // Avoid wasting space when not loaded
0209 Layout.maximumHeight: active ? item.implicitHeight : 0
0210
0211 active: swipeView.count > 1 ? true: false
0212 asynchronous: true
0213
0214 sourceComponent: PageIndicator {
0215 count: swipeView.count
0216 currentIndex: swipeView.currentIndex
0217
0218 delegate: Rectangle {
0219 implicitWidth: 8
0220 implicitHeight: count > 1 ? 8 : 0
0221
0222 radius: parent.width / 2
0223 color: Kirigami.Theme.disabledTextColor
0224
0225 opacity: index === currentIndex ? 0.95 : 0.45
0226 }
0227 }
0228 }
0229 }
0230 }
0231
0232 // Loads landscape quick settings view
0233 Component {
0234 id: scrollViewComponent
0235
0236 Item {
0237 width: parent.width
0238 height: rowCount * rowHeight
0239
0240 Flickable {
0241 id: flickable
0242 anchors.fill: parent
0243 contentWidth: width
0244 contentHeight: flow.height
0245
0246 clip: true
0247
0248 ScrollIndicator.vertical: ScrollIndicator {
0249 id: scrollIndicator
0250 visible: quickSettingsCount > pageSize ? true : false
0251 position: 0.1
0252
0253 contentItem: Item {
0254 implicitWidth: Kirigami.Units.smallSpacing / 4
0255 Rectangle {
0256 // shift over the indicator a bit to the right
0257 anchors.fill: parent
0258 anchors.leftMargin: 2
0259 anchors.rightMargin: -2
0260
0261 color: Kirigami.Theme.textColor
0262 opacity: scrollIndicator.active ? 0.5 : 0
0263
0264 Behavior on opacity { NumberAnimation {} }
0265 }
0266 }
0267 }
0268
0269 Flow {
0270 id: flow
0271 width: parent.width
0272 height: Math.ceil(quickSettingsCount / columnCount) * rowHeight
0273 spacing: 0
0274
0275 Repeater {
0276 model: quickSettingsModel
0277 delegate: Loader {
0278 required property var modelData
0279
0280 asynchronous: true
0281
0282 sourceComponent: quickSettingComponent
0283 }
0284 }
0285 }
0286 }
0287 }
0288 }
0289
0290 // Quick setting component
0291 Component {
0292 id: quickSettingComponent
0293
0294 MobileShell.BaseItem {
0295 height: root.rowHeight
0296 width: root.columnWidth
0297 padding: Kirigami.Units.smallSpacing
0298
0299 contentItem: QuickSettingsFullDelegate {
0300 restrictedPermissions: actionDrawer.restrictedPermissions
0301
0302 text: modelData.text
0303 status: modelData.status
0304 icon: modelData.icon
0305 enabled: modelData.enabled
0306 settingsCommand: modelData.settingsCommand
0307 toggleFunction: modelData.toggle
0308
0309 onCloseRequested: {
0310 actionDrawer.close();
0311 }
0312 }
0313 }
0314 }
0315 }