Warning, /plasma/xdg-desktop-portal-kde/src/ScreenChooserDialog.qml is written in an unsupported language. File is not indexed.
0001 /* This file is part of the KDE project 0002 SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 pragma ComponentBehavior: Bound 0008 0009 import QtQuick 0010 import QtQuick.Layouts 0011 import QtQuick.Controls as QQC2 0012 import org.kde.kirigami as Kirigami 0013 import org.kde.plasma.workspace.dialogs as PWD 0014 import org.kde.taskmanager 0.1 as TaskManager 0015 0016 PWD.SystemDialog { 0017 id: root 0018 0019 property alias outputsModel: outputsView.model 0020 property alias windowsModel: windowsView.model 0021 property bool multiple: false 0022 property alias allowRestore: allowRestoreItem.checked 0023 0024 iconName: "video-display" 0025 acceptable: (outputsModel && outputsModel.hasSelection) || (windowsModel && windowsModel.hasSelection) 0026 0027 signal clearSelection() 0028 0029 ColumnLayout { 0030 spacing: 0 0031 0032 QQC2.TabBar { 0033 id: tabView 0034 Layout.fillWidth: true 0035 visible: root.outputsModel && root.windowsModel 0036 currentIndex: outputsView.count > 0 ? 0 : 1 0037 0038 QQC2.TabButton { 0039 text: i18n("Screens") 0040 } 0041 QQC2.TabButton { 0042 text: i18n("Windows") 0043 } 0044 } 0045 0046 QQC2.Frame { 0047 Layout.fillWidth: true 0048 Layout.fillHeight: true 0049 Layout.preferredHeight: Kirigami.Units.gridUnit * 20 0050 Layout.preferredWidth: Kirigami.Units.gridUnit * 30 0051 0052 Kirigami.Theme.inherit: false 0053 Kirigami.Theme.colorSet: Kirigami.Theme.View 0054 0055 background: Rectangle { 0056 color: Kirigami.Theme.backgroundColor 0057 border.color: Qt.alpha(Kirigami.Theme.textColor, 0.3) 0058 border.width: 1 0059 } 0060 0061 StackLayout { 0062 anchors.fill: parent 0063 currentIndex: tabView.currentIndex 0064 0065 QQC2.ScrollView { 0066 contentWidth: availableWidth 0067 contentHeight: outputsLayout.height 0068 Kirigami.CardsLayout { 0069 id: outputsLayout 0070 anchors { 0071 left: parent.left; 0072 right: parent.right; 0073 } 0074 Repeater { 0075 id: outputsView 0076 model: null 0077 PipeWireDelegate { 0078 id: delegate 0079 0080 required property int index 0081 required property var model 0082 0083 function selectAndAccept(): void { 0084 root.clearSelection() 0085 outputsView.model.setData(outputsView.model.index(model.row, 0), Qt.Checked, Qt.CheckStateRole) 0086 dialogButtonBox.accepted() 0087 } 0088 0089 banner { 0090 title: model.display 0091 titleIcon: model.decoration 0092 titleLevel: 3 0093 } 0094 checkable: root.multiple 0095 checked: model.checked === Qt.Checked 0096 nodeId: waylandItem.nodeId 0097 0098 TaskManager.ScreencastingRequest { 0099 id: waylandItem 0100 outputName: delegate.model.name 0101 } 0102 0103 // Only active if this is a multi-select dialog 0104 onToggled: { 0105 const to = model.checked !== Qt.Checked ? Qt.Checked : Qt.Unchecked; 0106 outputsView.model.setData(outputsView.model.index(model.row, 0), to, Qt.CheckStateRole) 0107 } 0108 0109 // If this is isn't a multi-select dialog, accept on click 0110 // since the cards are functioning as buttons 0111 onClicked: { 0112 if (!root.multiple) { 0113 selectAndAccept() 0114 } 0115 } 0116 0117 // If this is a multi-select dialog, let people choose just 0118 // one thing quickly by double-clicking 0119 onDoubleClicked: { 0120 if (root.multiple) { 0121 selectAndAccept() 0122 } 0123 } 0124 } 0125 } 0126 } 0127 } 0128 QQC2.ScrollView { 0129 contentWidth: availableWidth 0130 contentHeight: windowsLayout.height 0131 Kirigami.CardsLayout { 0132 id: windowsLayout 0133 anchors { 0134 left: parent.left; 0135 right: parent.right; 0136 } 0137 Repeater { 0138 id: windowsView 0139 model: null 0140 PipeWireDelegate { 0141 id: delegate 0142 0143 required property int index 0144 required property var model 0145 0146 function selectAndAccept(): void { 0147 root.clearSelection() 0148 windowsView.model.setData(windowsView.model.index(model.row, 0), Qt.Checked, Qt.CheckStateRole) 0149 dialogButtonBox.accepted() 0150 } 0151 0152 banner { 0153 title: model.display ?? "" 0154 titleIcon: model.decoration ?? "" 0155 titleLevel: 3 0156 } 0157 checkable: root.multiple 0158 checked: model.checked === Qt.Checked 0159 nodeId: waylandItem.nodeId 0160 0161 TaskManager.ScreencastingRequest { 0162 id: waylandItem 0163 uuid: delegate.model.Uuid 0164 } 0165 0166 // Only active if this is a multi-select dialog 0167 onToggled: { 0168 const to = model.checked !== Qt.Checked ? Qt.Checked : Qt.Unchecked; 0169 windowsView.model.setData(windowsView.model.index(model.row, 0), to, Qt.CheckStateRole) 0170 } 0171 0172 // If this is isn't a multi-select dialog, accept on click 0173 // since the cards are functioning as buttons 0174 onClicked: { 0175 if (!root.multiple) { 0176 selectAndAccept() 0177 } 0178 } 0179 0180 // If this is a multi-select dialog, let people choose just 0181 // one thing quickly by double-clicking 0182 onDoubleClicked: { 0183 if (root.multiple) { 0184 selectAndAccept() 0185 } 0186 } 0187 } 0188 } 0189 } 0190 } 0191 } 0192 } 0193 0194 QQC2.CheckBox { 0195 id: allowRestoreItem 0196 checked: true 0197 text: i18n("Allow restoring on future sessions") 0198 } 0199 } 0200 0201 standardButtons: root.multiple ? QQC2.DialogButtonBox.Ok | QQC2.DialogButtonBox.Cancel: null 0202 0203 Component.onCompleted: { 0204 if (root.multiple) { 0205 dialogButtonBox.standardButton(QQC2.DialogButtonBox.Ok).text = i18n("Share") 0206 } 0207 0208 // If there's only one thing in the list, pre-select it to save the user a click 0209 if (outputsView.count === 1 && windowsView.count === 0) { 0210 outputsView.model.setData(outputsView.model.index(0, 0), Qt.Checked, Qt.CheckStateRole); 0211 } else if (windowsView.count === 1 && outputsView.count === 0) { 0212 windowsView.model.setData(outputsView.model.index(0, 0), Qt.Checked, Qt.CheckStateRole); 0213 } 0214 } 0215 }