Warning, /plasma/plasma-systemmonitor/src/page/RowControl.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 Container {
0016     id: control
0017 
0018     property PageDataObject rowData
0019     property Page page
0020 
0021     property string heightMode: {
0022         if (rowData.heightMode) {
0023             print("heightMode", rowData.heightMode)
0024             return rowData.heightMode
0025         }
0026 
0027         if (rowData.isTitle) {
0028             return "minimum"
0029         }
0030 
0031         return "balanced"
0032     }
0033 
0034     implicitHeight: heading.height + topPadding + bottomPadding
0035 
0036     alwaysShowBackground: true
0037 
0038     function updateMinimumHeight() {
0039         if (rowData.isTitle) {
0040             minimumContentHeight = heading.implicitHeight
0041             minimumHeight = implicitHeight
0042             return
0043         }
0044 
0045         let minHeight = 0;
0046         let minContentHeight = 0;
0047         for (let i = 0; i < repeater.count; ++i) {
0048             let item = repeater.itemAt(i)
0049             if (item) {
0050                 minContentHeight = Math.max(minContentHeight, item.minimumContentHeight)
0051                 minHeight = Math.max(minHeight, item.minimumHeight)
0052             }
0053         }
0054 
0055         minimumContentHeight = minContentHeight
0056         minimumHeight = minHeight + control.topPadding + control.bottomPadding
0057     }
0058 
0059     function replaceSensors(replacement) {
0060         for (let i = 0; i < repeater.count; ++i) {
0061             repeater.itemAt(i).replaceSensors(replacement)
0062         }
0063     }
0064 
0065     onTopPaddingChanged: Qt.callLater(updateMinimumHeight)
0066     onBottomPaddingChanged: Qt.callLater(updateMinimumHeight)
0067 
0068     contentItem: Row {
0069         anchors.fill: parent
0070         anchors.topMargin: control.topPadding
0071         anchors.leftMargin: control.leftPadding
0072         anchors.rightMargin: control.rightPadding
0073         anchors.bottomMargin: control.bottomPadding
0074 
0075         spacing: Kirigami.Units.largeSpacing
0076 
0077         move: Transition {
0078             NumberAnimation { properties: "x,y"; duration: Kirigami.Units.shortDuration }
0079         }
0080 
0081         Kirigami.Heading {
0082             id: heading
0083             width: parent.width
0084             text: control.rowData.title ? control.rowData.title : ""
0085             visible: control.rowData.isTitle && !control.active
0086             level: 2
0087 
0088             onHeightChanged: Qt.callLater(control.updateMinimumHeight)
0089         }
0090 
0091         TextField {
0092             width: parent.width
0093             text: control.rowData.title ? control.rowData.title : ""
0094             visible: control.rowData.isTitle && control.active
0095             onTextEdited: control.rowData.title = text
0096         }
0097 
0098         Repeater {
0099             id: repeater
0100             model: PageDataModel { data: control.rowData }
0101 
0102             onItemAdded: Qt.callLater(control.updateMinimumHeight)
0103             onItemRemoved: Qt.callLater(control.updateMinimumHeight)
0104 
0105             ColumnControl {
0106                 height: parent.height
0107                 width: (parent.width - parent.spacing * (repeater.count - 1)) / repeater.count
0108 
0109                 onMinimumContentHeightChanged: Qt.callLater(control.updateMinimumHeight)
0110                 onMinimumHeightChanged: Qt.callLater(control.updateMinimumHeight)
0111 
0112                 activeItem: control.activeItem
0113                 single: control.rowData.children.length == 1
0114                 columnData: model.data
0115                 index: model.index
0116 
0117                 onSelect: item => control.select(item)
0118                 onRemove: control.rowData.removeChild(index)
0119                 onMove: (from, to) => control.rowData.moveChild(from, to)
0120 
0121                 onMissingSensorsChanged: (id, title, sensors) => control.missingSensorsChanged(id, title, sensors)
0122             }
0123         }
0124     }
0125 
0126     toolbar.addActions: [
0127         Kirigami.Action {
0128             text: i18nc("@action", "Add Column")
0129             onTriggered: control.addColumn(control.rowData.children.length)
0130         }
0131     ]
0132     toolbar.addVisible: !control.rowData.isTitle
0133     toolbar.page: page
0134 
0135     toolbar.extraActions: [
0136         Kirigami.Action {
0137             text: i18nc("@action", "Height")
0138             visible: !control.rowData.isTitle
0139 
0140             Kirigami.Action {
0141                 text: i18nc("@action:inmenu", "Balanced")
0142                 tooltip: i18nc("@info:tooltip", "Try and use the same height across different rows.")
0143                 ActionGroup.group: heightGroup
0144                 checkable: true
0145                 checked: control.rowData.heightMode == "balanced"
0146                 onTriggered: control.rowData.heightMode = "balanced"
0147             }
0148 
0149             Kirigami.Action {
0150                 text: i18nc("@action:inmenu", "Minimum")
0151                 tooltip: i18nc("@info:tooltop", "Use the minimum amount of height needed to display contents correctly.")
0152                 ActionGroup.group: heightGroup
0153                 checkable: true
0154                 checked: control.rowData.heightMode == "minimum"
0155                 onTriggered: control.rowData.heightMode = "minimum"
0156             }
0157 
0158             Kirigami.Action {
0159                 text: i18nc("@action:inmenu", "Maximum")
0160                 tooltip: i18nc("@info:tooltip", "Try to use as much height as possible.")
0161                 ActionGroup.group: heightGroup
0162                 checkable: true
0163                 checked: control.rowData.heightMode == "maximum"
0164                 onTriggered: control.rowData.heightMode = "maximum"
0165             }
0166         }
0167     ]
0168 
0169     ActionGroup { id: heightGroup }
0170 
0171     function addColumn(index) {
0172         control.rowData.insertChild(index, {"name": "column-" + index, showBackground: true})
0173     }
0174 
0175     Component.onCompleted: {
0176         if (rowData.children.length == 0 && !rowData.isTitle) {
0177             addColumn(0)
0178         }
0179     }
0180 }