Warning, /plasma/kscreen/kcm/ui/Panel.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2019 Roman Gilg <subdiff@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 import QtQuick 2.15
0007 import QtQuick.Layouts 1.15
0008 import QtQuick.Controls 2.15 as QQC2
0009 import org.kde.kirigami 2.20 as Kirigami
0010 import org.kde.kitemmodels 1.0
0011 
0012 import org.kde.kcmutils as KCM
0013 
0014 ColumnLayout {
0015     id: root
0016 
0017     property KSortFilterProxyModel enabledOutputs
0018     property int selectedOutput
0019 
0020     signal reorder()
0021 
0022     Kirigami.FormLayout {
0023         twinFormLayouts: globalSettingsLayout
0024         visible: kcm.multipleScreensAvailable
0025 
0026         RowLayout {
0027             Kirigami.FormData.label: i18n("Device:")
0028 
0029             QQC2.ComboBox {
0030                 Layout.maximumWidth: Kirigami.Units.gridUnit * 16
0031                 model: kcm.outputModel
0032                 textRole: "display"
0033                 Component.onCompleted: currentIndex = Qt.binding(() => root.selectedOutput);
0034                 onActivated: index => {
0035                     root.selectedOutput = index;
0036                     currentIndex = Qt.binding(() => root.selectedOutput);
0037                 }
0038             }
0039         }
0040     }
0041 
0042     StackLayout {
0043         id: panelView
0044         currentIndex: root.selectedOutput
0045 
0046         Layout.fillWidth: true
0047 
0048         Repeater {
0049             model: kcm.outputModel
0050             OutputPanel {
0051                 twinFormLayouts: globalSettingsLayout
0052                 enabledOutputs: root.enabledOutputs
0053                 onReorder: root.reorder()
0054             }
0055         }
0056     }
0057 
0058     Kirigami.FormLayout {
0059         id: globalSettingsLayout
0060         Layout.fillWidth: true
0061 
0062         Kirigami.Separator {
0063             Layout.fillWidth: true
0064             Kirigami.FormData.isSection: true
0065         }
0066 
0067         RowLayout {
0068             Layout.fillWidth: true
0069             Kirigami.FormData.label: i18n("Global scale:")
0070 
0071             visible: !kcm.perOutputScaling
0072 
0073             QQC2.Slider {
0074                 id: globalScaleSlider
0075 
0076                 Layout.fillWidth: true
0077                 from: 1
0078                 to: 3
0079                 stepSize: 0.25
0080                 live: true
0081                 value: kcm.globalScale
0082                 onMoved: kcm.globalScale = value;
0083             }
0084             QQC2.SpinBox {
0085                 id: spinbox
0086                 Layout.minimumWidth: Kirigami.Units.gridUnit * 6
0087 
0088                 // Because QQC2 SpinBox doesn't natively support decimal step
0089                 // sizes: https://bugreports.qt.io/browse/QTBUG-67349
0090                 readonly property real factor: 16.0
0091                 readonly property real realValue: value / factor
0092 
0093                 from: 1.0 * factor
0094                 to: 3.0 * factor
0095                 // On X11 We set the increment to this weird value to compensate
0096                 // for inherent difficulties with floating-point math and this
0097                 // Qt bug: https://bugreports.qt.io/browse/QTBUG-66036
0098                 stepSize: 1
0099                 value: kcm.globalScale * factor
0100                 validator: DoubleValidator {
0101                     bottom: Math.min(spinbox.from, spinbox.to) * spinbox.factor
0102                     top:  Math.max(spinbox.from, spinbox.to) * spinbox.factor
0103                 }
0104                 textFromValue: (value, locale) =>
0105                     i18nc("Global scale factor expressed in percentage form", "%1%",
0106                         parseFloat(value * 1.0 / factor * 100.0))
0107                 valueFromText: (text, locale) =>
0108                     Number.fromLocaleString(locale, text.replace("%", "")) * factor / 100.0
0109 
0110                 onValueModified: {
0111                     kcm.globalScale = realValue;
0112                     if (kcm.globalScale % 0.25) {
0113                         weirdScaleFactorMsg.visible = true;
0114                     } else {
0115                         weirdScaleFactorMsg.visible = false;
0116                     }
0117                 }
0118             }
0119         }
0120 
0121         QQC2.ButtonGroup {
0122             id: x11AppsScaling
0123             onClicked: kcm.xwaylandClientsScale = (button === x11ScalingApps)
0124         }
0125 
0126         RowLayout {
0127             visible: kcm.xwaylandClientsScaleSupported
0128 
0129             Kirigami.FormData.label: i18n("Legacy applications (X11):")
0130             spacing: Kirigami.Units.smallSpacing
0131 
0132             QQC2.RadioButton {
0133                 id: x11ScalingApps
0134                 text: i18nc("The apps themselves should scale to fit the displays", "Apply scaling themselves")
0135                 checked: kcm.xwaylandClientsScale
0136                 QQC2.ButtonGroup.group: x11AppsScaling
0137             }
0138             KCM.ContextualHelpButton {
0139                 toolTipText: i18n("Legacy applications that support scaling will use it and look crisp, however those that don't will not be scaled at all.")
0140             }
0141         }
0142 
0143         RowLayout {
0144             visible: kcm.xwaylandClientsScaleSupported
0145 
0146             spacing: Kirigami.Units.smallSpacing
0147 
0148             QQC2.RadioButton {
0149                 Kirigami.FormData.label: i18n("Legacy applications (X11):")
0150                 text: i18nc("The system will perform the x11 apps scaling", "Scaled by the system")
0151                 checked: !kcm.xwaylandClientsScale
0152                 QQC2.ButtonGroup.group: x11AppsScaling
0153             }
0154             KCM.ContextualHelpButton {
0155                 toolTipText: i18n("All legacy applications will be scaled by the system to the correct size, however they will always look slightly blurry.")
0156             }
0157         }
0158 
0159         RowLayout {
0160             Kirigami.FormData.label: i18nc("@label", "Screen tearing:")
0161             visible: kcm.tearingSupported
0162             QQC2.CheckBox {
0163                 text: i18nc("@option:check The thing being allowed in fullscreen windows is screen tearing", "Allow in fullscreen windows")
0164                 checked: kcm.tearingAllowed
0165                 onToggled: kcm.tearingAllowed = checked
0166             }
0167             KCM.ContextualHelpButton {
0168                 toolTipText: i18nc("@info:tooltip", "Screen tearing reduces latency with most displays. Note that not all graphics drivers support this setting.")
0169             }
0170         }
0171 
0172         Item {
0173             Kirigami.FormData.isSection: false
0174             visible: kcm.xwaylandClientsScaleSupported
0175         }
0176 
0177         Kirigami.InlineMessage {
0178             id: weirdScaleFactorMsg
0179             Kirigami.FormData.isSection: true
0180             Layout.fillWidth: true
0181             type: Kirigami.MessageType.Information
0182             text: i18n("The global scale factor is limited to multiples of 6.25% to minimize visual glitches in applications using the X11 windowing system.")
0183             visible: false
0184             showCloseButton: true
0185         }
0186     }
0187 }