Warning, /plasma/plasma-systemmonitor/src/page/PageEditor.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl>
0003 *
0004 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006
0007 import QtQuick
0008 import QtQuick.Controls
0009 import QtQuick.Layouts
0010
0011 import org.kde.kirigami as Kirigami
0012
0013 import org.kde.ksysguard.page
0014
0015 Column {
0016 id: root
0017
0018 property Page parentPage
0019 property PageDataObject pageData
0020 property Item activeItem
0021 property var actionsFace
0022
0023 property var missingSensors: []
0024 signal showMissingSensors()
0025
0026 spacing: rowSpacing // From parent loader
0027
0028 move: Transition {
0029 NumberAnimation { properties: "x,y"; duration: Kirigami.Units.shortDuration }
0030 }
0031
0032 function relayout() {
0033 let reservedHeight = missingMessage.visible ? missingMessage.height : 0;
0034 let minimumHeight = 0;
0035 let balancedCount = 0;
0036 let maximumCount = 0;
0037
0038 for (let i = 0; i < repeater.count; ++i) {
0039 let child = repeater.itemAt(i)
0040 if (!child || !child.hasOwnProperty("heightMode")) {
0041 // Apparently not a RowControl, ignore it.
0042 continue;
0043 }
0044
0045 switch(child.heightMode) {
0046 case "minimum":
0047 reservedHeight += child.minimumHeight
0048 break;
0049 case "balanced":
0050 minimumHeight = Math.max(child.minimumHeight, minimumHeight)
0051 balancedCount += 1
0052 break;
0053 case "maximum":
0054 maximumCount += 1
0055 break;
0056 }
0057 }
0058
0059 let layoutHeight = availableHeight - reservedHeight - root.spacing * (repeater.count - 1)
0060
0061 let balancedHeight = balancedCount > 0 ? layoutHeight / balancedCount : 0
0062 let maximumHeight = maximumCount > 0 ? (layoutHeight - minimumHeight * balancedCount) / maximumCount : 0
0063
0064 let minimumTotalHeight = 0
0065
0066 for (let i = 0; i < repeater.count; ++i) {
0067 let child = repeater.itemAt(i)
0068 if (!child || !child.hasOwnProperty("heightMode")) {
0069 continue;
0070 }
0071
0072 minimumTotalHeight += root.spacing;
0073
0074 switch (child.heightMode) {
0075 case "minimum":
0076 child.height = child.minimumHeight
0077 break
0078 case "balanced":
0079 if (maximumCount > 0) {
0080 child.height = child.minimumHeight
0081 } else {
0082 child.height = Math.max(minimumHeight, balancedHeight)
0083 }
0084 break
0085 case "maximum":
0086 // The last "balanced" here is to make sure if the user
0087 // selects "maximum" it is visually distinct from "balanced".
0088 child.height = Math.max(child.minimumHeight, maximumHeight, balancedHeight * 1.25)
0089 break
0090 }
0091
0092 minimumTotalHeight += child.height
0093 }
0094
0095 Layout.minimumHeight = minimumTotalHeight
0096 }
0097
0098 function updateMissingSensors(id, title, sensors) {
0099 for (let sensor of sensors) {
0100 missingSensors.push({
0101 "face": id,
0102 "title": title,
0103 "sensor": sensor
0104 })
0105 }
0106 missingSensorsChanged()
0107 }
0108
0109 function replaceSensors(replacement) {
0110 if (!replacement) {
0111 return
0112 }
0113
0114 missingSensors = []
0115
0116 for (let i = 0; i < repeater.count; ++i) {
0117 repeater.itemAt(i).replaceSensors(replacement)
0118 }
0119 }
0120
0121 onWidthChanged: Qt.callLater(relayout)
0122 onHeightChanged: Qt.callLater(relayout)
0123
0124 Kirigami.InlineMessage {
0125 id: missingMessage
0126
0127 width: parent.width
0128
0129 visible: root.missingSensors.length > 0
0130 type: Kirigami.MessageType.Error
0131 text: i18n("This page is missing some sensors and will not display correctly.");
0132
0133 actions: Kirigami.Action {
0134 icon.name: "document-edit"
0135 text: i18nc("@action:button", "Fix…")
0136 onTriggered: root.showMissingSensors()
0137 }
0138 }
0139
0140 Repeater {
0141 id: repeater
0142 model: PageDataModel { data: root.pageData }
0143
0144 onItemAdded: Qt.callLater(root.relayout)
0145 onItemRemoved: Qt.callLater(root.relayout)
0146
0147 RowControl {
0148 width: parent.width
0149
0150 onHeightChanged: Qt.callLater(root.relayout)
0151 onMinimumContentHeightChanged: Qt.callLater(root.relayout)
0152 onMinimumHeightChanged: Qt.callLater(root.relayout)
0153 onHeightModeChanged: Qt.callLater(root.relayout)
0154
0155 rowData: model.data
0156
0157 activeItem: root.activeItem
0158 single: root.pageData.children.length == 1
0159
0160 index: model.index
0161
0162 page: root.parentPage
0163
0164 onSelect: item => root.activeItem = item
0165
0166 onRemove: pageData.removeChild(index)
0167 onMove: (from, to) => pageData.moveChild(from, to)
0168
0169 onMissingSensorsChanged: (id, title, sensors) => root.updateMissingSensors(id, title, sensors)
0170 }
0171 }
0172
0173 function addTitle(index) {
0174 if (index < 0) {
0175 index = pageData.children.length
0176 }
0177
0178 pageData.insertChild(index, {
0179 name: "row-" + index,
0180 isTitle: true,
0181 title: i18n("New Title"),
0182 heightMode: "minimum"
0183 })
0184 }
0185
0186 function addRow(index) {
0187 if (index < 0) {
0188 index = pageData.children.length
0189 }
0190
0191 pageData.insertChild(index, {
0192 name: "row-" + index,
0193 isTitle: false,
0194 title: "",
0195 heightMode: "balanced"
0196 })
0197 }
0198
0199 Component.onCompleted: {
0200 if (pageData.children.length == 0) {
0201 addRow(0)
0202 }
0203 }
0204 }