Warning, /graphics/colord-kde/colord-kcm/ui/main.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightLabel: 2022 Han Young <hanyoung@protonmail.com> 0003 0004 SPDX-License-Identifier: LGPL-3.0-or-later 0005 */ 0006 import QtQuick 0007 import QtCore 0008 import QtQuick.Controls as QQC2 0009 import QtQuick.Layouts 1.15 0010 import org.kde.kitemmodels 1.0 0011 import org.kde.kirigami 2.15 as Kirigami 0012 import org.kde.kirigami.delegates as KD 0013 import org.kde.kcmutils as KCM 0014 import QtQuick.Dialogs as QtDialogs 0015 import kcmcolord 1 0016 0017 KCM.AbstractKCM { 0018 id: root 0019 implicitHeight: Kirigami.Units.gridUnit * 40 0020 implicitWidth: Kirigami.Units.gridUnit * 20 0021 property bool isDeviceView: true 0022 property bool isDeviceDescription: true 0023 0024 onIsDeviceViewChanged: { 0025 if (isDeviceView) { 0026 kcm.deviceDescription.setDevice(deviceView.currentDevicePath); 0027 kcm.profileDescription.setProfile(deviceView.currentProfilePath, deviceView.canRemoveCurrentProfile); 0028 } else { 0029 kcm.profileDescription.setProfile(profileView.currentProfilePath, profileView.canRemoveCurrentProfile); 0030 } 0031 } 0032 0033 header: QQC2.ToolBar { 0034 Row { 0035 spacing: Kirigami.Units.largeSpacing 0036 anchors.fill: parent 0037 0038 QQC2.ButtonGroup { 0039 id: headerGroup 0040 } 0041 0042 QQC2.ToolButton { 0043 text: i18nd("colord-kde", "Devices") 0044 icon.name: "video-display" 0045 checkable: true 0046 checked: true 0047 display: QQC2.AbstractButton.TextUnderIcon 0048 onClicked: isDeviceView = true 0049 QQC2.ButtonGroup.group: headerGroup 0050 } 0051 QQC2.ToolButton { 0052 text: i18nd("colord-kde", "Profiles") 0053 icon.name: "color-management" 0054 checkable: true 0055 display: QQC2.AbstractButton.TextUnderIcon 0056 onClicked: isDeviceView = false 0057 QQC2.ButtonGroup.group: headerGroup 0058 } 0059 0060 QQC2.ToolSeparator { 0061 implicitHeight: parent.height 0062 } 0063 0064 QQC2.ToolButton { 0065 text: i18nd("colord-kde", "Import Profile") 0066 icon.name: "document-single" 0067 display: QQC2.AbstractButton.TextUnderIcon 0068 onClicked: fileDialog.open() 0069 } 0070 0071 QQC2.ToolButton { 0072 text: i18nd("colord-kde", "Assign Profile") 0073 icon.name: "list-add" 0074 display: QQC2.AbstractButton.TextUnderIcon 0075 onClicked: assignProfileMenu.open() 0076 enabled: isDeviceDescription && assignProfileMenu.count > 0 0077 QQC2.Menu { 0078 id: assignProfileMenu 0079 } 0080 0081 Connections { 0082 target: deviceView 0083 function onCurrentDevicePathChanged() { 0084 let oldActionsCount = assignProfileMenu.count; 0085 while (oldActionsCount--) { 0086 assignProfileMenu.takeItem(0); 0087 } 0088 0089 let items = kcm.getComboBoxItemsForDevice(deviceView.currentDevicePath); 0090 for (let i = 0; i < items.length; i++) { 0091 let action = Qt.createQmlObject(` 0092 import QtQuick.Controls 2.15 0093 Action { 0094 } 0095 `, 0096 assignProfileMenu, 0097 "main.qml" 0098 ); 0099 action.text = items[i].profileName; 0100 action.triggered.connect((a) => { 0101 kcm.assignProfileToDevice(items[i].objectPath, deviceView.currentDevicePath); 0102 }); 0103 assignProfileMenu.addAction(action); 0104 } 0105 } 0106 } 0107 } 0108 0109 QQC2.ToolButton { 0110 enabled: (isDeviceView && deviceView.canRemoveCurrentProfile) || (!isDeviceView && profileView.canRemoveCurrentProfile) 0111 text: i18nd("colord-kde", "Remove Profile") 0112 icon.name: "list-remove-symbolic" 0113 display: QQC2.AbstractButton.TextUnderIcon 0114 onClicked: removeProfileDialog.open() 0115 } 0116 } 0117 } 0118 0119 QtDialogs.FileDialog { 0120 id: fileDialog 0121 title: i18ndc("colord-kde", "ICC Profile is a tech term", "Import ICC Profile") 0122 currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0] 0123 onAccepted: { 0124 kcm.importProfile(selectedFile); 0125 } 0126 nameFilters: [i18ndc("colord-kde", "ICC Profile is a tech term", "ICC Profile") + "(*.icc)"] 0127 } 0128 0129 QtDialogs.MessageDialog { 0130 id: removeProfileDialog 0131 title: i18nd("colord-kde", "Remove Profile") 0132 0133 text: i18nd("colord-kde", "Are you sure you want to remove this profile?") 0134 buttons: QtDialogs.StandardButton.Yes | QtDialogs.StandardButton.No 0135 onAccepted: { 0136 if (isDeviceView) { 0137 kcm.deviceModel.removeProfile(deviceView.currentProfilePath, deviceView.currentDevicePath); 0138 } else { 0139 kcm.removeProfile(profileView.currentProfilePath); 0140 } 0141 } 0142 } 0143 0144 RowLayout { 0145 anchors.fill: parent 0146 QQC2.Frame { 0147 clip: true 0148 id: profileDeviceViewFrame 0149 Layout.fillWidth: true 0150 Layout.fillHeight: true 0151 0152 QQC2.ScrollView { 0153 0154 anchors.fill: parent 0155 0156 TreeView { 0157 property variant currentProfilePath: null 0158 property variant currentDevicePath: null 0159 property bool canRemoveCurrentProfile: false 0160 0161 id: deviceView 0162 visible: isDeviceView 0163 anchors.fill: parent 0164 0165 selectionModel: ItemSelectionModel { 0166 id: selectionModel 0167 model: kcm.deviceModel 0168 } 0169 0170 model: kcm.deviceModel 0171 delegate: QQC2.TreeViewDelegate { 0172 id: listItem 0173 implicitWidth: TableView.view.width 0174 contentItem: RowLayout { 0175 id: layout 0176 spacing: Kirigami.Units.smallSpacing 0177 0178 QQC2.CheckBox { 0179 visible: itemType === "profile" 0180 checkState: model.profileCheckState // from model data 0181 checkable: !checked 0182 onCheckedChanged: { 0183 if (checked) { 0184 kcm.makeProfileDefault(model.objectPath, model.parentObjectPath); 0185 } 0186 } 0187 } 0188 0189 KD.IconTitleSubtitle { 0190 title: model.title 0191 icon.name: model.iconName 0192 0193 Layout.fillWidth: true 0194 } 0195 } 0196 0197 onCurrentChanged: { 0198 if (current) { 0199 if (itemType === "device") { 0200 // is device 0201 kcm.deviceDescription.setDevice(objectPath); 0202 isDeviceDescription = true; 0203 0204 deviceView.currentDevicePath = model.objectPath; 0205 deviceView.currentProfilePath = null; 0206 deviceView.canRemoveCurrentProfile = false; 0207 } else { 0208 // is profile 0209 kcm.profileDescription.setProfile(objectPath, model.canRemoveProfile); 0210 isDeviceDescription = false; 0211 deviceView.currentDevicePath = model.parentObjectPath; 0212 deviceView.currentProfilePath = model.objectPath; 0213 deviceView.canRemoveCurrentProfile = model.canRemoveProfile; 0214 } 0215 } 0216 } 0217 } 0218 } 0219 } 0220 0221 QQC2.ScrollView { 0222 visible: !isDeviceView 0223 anchors.fill: parent 0224 0225 Component.onCompleted: background.visible = true 0226 0227 ListView { 0228 id: profileView 0229 0230 property variant currentProfilePath: null 0231 property bool canRemoveCurrentProfile: false 0232 0233 clip: true 0234 0235 model: profileSortModel 0236 delegate: QQC2.ItemDelegate { 0237 id: delegate 0238 0239 text: title 0240 icon.name: iconName 0241 0242 width: ListView.view.width 0243 highlighted: ListView.isCurrentItem 0244 0245 contentItem: KD.IconTitleSubtitle { 0246 title: delegate.text 0247 subtitle: fileName 0248 icon: icon.fromControlsIcon(delegate.icon) 0249 } 0250 0251 onClicked: ListView.view.currentIndex = index 0252 0253 ListView.onIsCurrentItemChanged: { 0254 kcm.profileDescription.setProfile(model.objectPath, model.canRemove); 0255 profileView.currentProfilePath = model.objectPath; 0256 profileView.canRemoveCurrentProfile = model.canRemove; 0257 } 0258 } 0259 KSortFilterProxyModel { 0260 id: profileSortModel 0261 sourceModel: kcm.profileModel 0262 sortRoleName: "sortString" 0263 } 0264 } 0265 } 0266 } 0267 0268 QQC2.Frame { 0269 Layout.fillHeight: true 0270 Layout.maximumWidth: parent.width * 0.4 0271 Layout.alignment: Qt.AlignLeft | Qt.AlignTop 0272 clip: true 0273 ColumnLayout { 0274 anchors.fill: parent 0275 ColumnLayout { 0276 id: deviceDescriptionView 0277 visible: isDeviceDescription && isDeviceView 0278 Layout.alignment: Qt.AlignLeft | Qt.AlignTop 0279 Layout.fillHeight: true 0280 Layout.fillWidth: true 0281 QQC2.Label { 0282 text: kcm.deviceDescription.deviceTitle 0283 font.pointSize: Kirigami.Theme.defaultFont.pointSize * 1.5 0284 } 0285 QQC2.Label { 0286 text: kcm.deviceDescription.deviceKind 0287 Layout.alignment: Qt.AlignLeft 0288 } 0289 RowLayout { 0290 QQC2.Label { 0291 text: i18nd("colord-kde", "Id: ") 0292 } 0293 QQC2.Label { 0294 text: kcm.deviceDescription.deviceID 0295 } 0296 } 0297 RowLayout { 0298 QQC2.Label { 0299 text: i18nd("colord-kde", "Scope: ") 0300 } 0301 QQC2.Label { 0302 text: kcm.deviceDescription.deviceScope 0303 } 0304 } 0305 RowLayout { 0306 QQC2.Label { 0307 text: i18nd("colord-kde", "Mode: ") 0308 } 0309 QQC2.Label { 0310 text: kcm.deviceDescription.colorSpace 0311 } 0312 } 0313 RowLayout { 0314 QQC2.Label { 0315 text: i18nd("colord-kde", "Current Profile: ") 0316 } 0317 QQC2.Label { 0318 text: kcm.deviceDescription.currentProfileTitle 0319 } 0320 } 0321 0322 Kirigami.InlineMessage { 0323 text: kcm.deviceDescription.calibrateTipMessage 0324 Layout.fillWidth: true 0325 visible: true 0326 } 0327 } 0328 ProfileMetaDataView { 0329 id: profileDescriptionView 0330 visible: !isDeviceView || !isDeviceDescription 0331 Layout.alignment: Qt.AlignLeft | Qt.AlignTop 0332 Layout.fillHeight: true 0333 Layout.fillWidth: true 0334 } 0335 } 0336 } 0337 } 0338 }