Warning, /plasma/plasma-workspace/kcms/users/src/ui/PicturesSheet.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2019 Nicolas Fella <nicolas.fella@gmx.de> 0003 SPDX-FileCopyrightText: 2020 Carson Black <uhhadd@gmail.com> 0004 0005 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0006 */ 0007 0008 import QtQuick 2.15 0009 import QtQuick.Controls 2.15 as QQC2 0010 import QtQuick.Dialogs 6.3 as Dialogs 0011 import QtQuick.Layouts 1.15 0012 0013 import org.kde.kirigami 2.20 as Kirigami 0014 0015 Kirigami.OverlaySheet { 0016 id: picturesSheet 0017 0018 title: i18nc("@title", "Change Avatar") 0019 required property Kirigami.Page usersDetailPage 0020 0021 readonly property var colorPalette: [ 0022 {"name": i18nc("@item:intable", "It's Nothing"), "color": "transparent", "dark": false}, 0023 {"name": i18nc("@item:intable", "Feisty Flamingo"), "color": "#E93A9A", "dark": true}, 0024 {"name": i18nc("@item:intable", "Dragon's Fruit"), "color": "#E93D58", "dark": true}, 0025 {"name": i18nc("@item:intable", "Sweet Potato"), "color": "#E9643A", "dark": true}, 0026 {"name": i18nc("@item:intable", "Ambient Amber"), "color": "#EF973C", "dark": false}, 0027 {"name": i18nc("@item:intable", "Sparkle Sunbeam"), "color": "#E8CB2D", "dark": false}, 0028 {"name": i18nc("@item:intable", "Lemon-Lime"), "color": "#B6E521", "dark": false}, 0029 {"name": i18nc("@item:intable", "Verdant Charm"), "color": "#3DD425", "dark": false}, 0030 {"name": i18nc("@item:intable", "Mellow Meadow"), "color": "#00D485", "dark": false}, 0031 {"name": i18nc("@item:intable", "Tepid Teal"), "color": "#00D3B8", "dark": false}, 0032 {"name": i18nc("@item:intable", "Plasma Blue"), "color": "#3DAEE9", "dark": true}, 0033 {"name": i18nc("@item:intable", "Pon Purple"), "color": "#B875DC", "dark": true}, 0034 {"name": i18nc("@item:intable", "Bajo Purple"), "color": "#926EE4", "dark": true}, 0035 {"name": i18nc("@item:intable", "Burnt Charcoal"), "color": "#232629", "dark": true}, 0036 {"name": i18nc("@item:intable", "Paper Perfection"), "color": "#EEF1F5", "dark": false}, 0037 {"name": i18nc("@item:intable", "Cafétera Brown"), "color": "#CB775A", "dark": false}, 0038 {"name": i18nc("@item:intable", "Rich Hardwood"), "color": "#6A250E", "dark": true} 0039 ] 0040 0041 component PicturesGridLayout: GridLayout { 0042 rowSpacing: Kirigami.Units.smallSpacing 0043 columns: Math.floor((stackSwitcher.implicitWidth - (Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing * 2)) / (Kirigami.Units.gridUnit * 6)) 0044 columnSpacing: Kirigami.Units.smallSpacing 0045 0046 Layout.fillWidth: true 0047 Layout.alignment: Qt.AlignHCenter 0048 Layout.leftMargin: Kirigami.Units.largeSpacing 0049 Layout.rightMargin: Kirigami.Units.largeSpacing 0050 } 0051 0052 component PictureButton: QQC2.Button { 0053 Layout.preferredHeight: Kirigami.Units.gridUnit * 6 0054 Layout.preferredWidth: Layout.preferredHeight 0055 display: QQC2.AbstractButton.IconOnly 0056 } 0057 0058 component HomeButton: PictureButton { 0059 focus: !stackSwitcher.busy 0060 text: i18nc("@action:button", "Go Back") 0061 0062 ColumnLayout { 0063 anchors.centerIn: parent 0064 0065 Kirigami.Icon { 0066 width: Kirigami.Units.gridUnit * 4 0067 height: Kirigami.Units.gridUnit * 4 0068 source: "go-previous" 0069 0070 Layout.alignment: Qt.AlignHCenter 0071 } 0072 } 0073 0074 onClicked: stackSwitcher.pop() 0075 } 0076 0077 component InitialsButton: PictureButton { 0078 text: i18nc("@action:button", "Initials") 0079 property alias color: colorRectangle.color 0080 property alias headingColor: heading.color 0081 0082 Rectangle { 0083 id: colorRectangle 0084 0085 color: "transparent" 0086 anchors.fill: parent 0087 anchors.margins: Kirigami.Units.smallSpacing 0088 0089 Kirigami.Heading { 0090 id: heading 0091 anchors.fill: parent 0092 anchors.margins: Kirigami.Units.smallSpacing 0093 font.pixelSize: Kirigami.Units.gridUnit * 4 0094 fontSizeMode: Text.Fit 0095 horizontalAlignment: Text.AlignHCenter 0096 verticalAlignment: Text.AlignVCenter 0097 text: kcm.initializeString(user.displayPrimaryName) 0098 textFormat: Text.PlainText 0099 Accessible.ignored: true 0100 } 0101 } 0102 } 0103 0104 component IconButton: PictureButton { 0105 property alias color: colorRectangle.color 0106 property alias iconColor: icon.color 0107 0108 Rectangle { 0109 id: colorRectangle 0110 0111 color: "transparent" 0112 anchors.fill: parent 0113 anchors.margins: Kirigami.Units.smallSpacing 0114 0115 Kirigami.Icon { 0116 id: icon 0117 source: "user-identity" 0118 width: Kirigami.Units.gridUnit * 4 0119 height: Kirigami.Units.gridUnit * 4 0120 anchors.centerIn: parent 0121 } 0122 } 0123 } 0124 0125 component MainPage: ColumnLayout { 0126 PicturesGridLayout { 0127 PictureButton { 0128 id: openButton 0129 0130 text: i18nc("@action:button", "Choose File…") 0131 0132 contentItem: Item { 0133 Dialogs.FileDialog { 0134 id: fileDialog 0135 title: i18nc("@title", "Choose a picture") 0136 onAccepted: { 0137 usersDetailPage.oldImage = usersDetailPage.user.face 0138 usersDetailPage.user.face = fileDialog.selectedFile 0139 usersDetailPage.overrideImage = true 0140 picturesSheet.close() 0141 } 0142 } 0143 0144 ColumnLayout { 0145 // Centering rather than filling is desired to keep the 0146 // entire layout nice and tight when the text is short 0147 anchors.centerIn: parent 0148 spacing: 0 // the icon should bring its own 0149 0150 Kirigami.Icon { 0151 id: openIcon 0152 0153 implicitWidth: Kirigami.Units.iconSizes.huge 0154 implicitHeight: Kirigami.Units.iconSizes.huge 0155 source: "document-open" 0156 0157 Layout.alignment: Qt.AlignHCenter 0158 } 0159 QQC2.Label { 0160 text: openButton.text 0161 textFormat: Text.PlainText 0162 0163 Layout.fillWidth: true 0164 Layout.maximumWidth: Kirigami.Units.gridUnit * 5 0165 Layout.maximumHeight: openButton.availableHeight - openIcon.height 0166 horizontalAlignment: Text.AlignHCenter 0167 verticalAlignment: Text.AlignBottom 0168 fontSizeMode: Text.HorizontalFit 0169 wrapMode: Text.Wrap 0170 elide: Text.ElideRight 0171 } 0172 } 0173 } 0174 0175 onClicked: fileDialog.open() 0176 } 0177 0178 InitialsButton { 0179 onClicked: stackSwitcher.push(initialsPage) 0180 } 0181 0182 IconButton { 0183 text: i18nc("@action:button", "Placeholder Icon") 0184 iconColor: "black" 0185 onClicked: stackSwitcher.push(iconsPage) 0186 } 0187 0188 Repeater { 0189 model: kcm.avatarFiles 0190 PictureButton { 0191 id: delegate 0192 0193 required property string modelData 0194 0195 readonly property url source: "file:" + modelData 0196 0197 hoverEnabled: true 0198 0199 QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay 0200 QQC2.ToolTip.text: modelData 0201 QQC2.ToolTip.visible: hovered || activeFocus 0202 text: modelData 0203 0204 Kirigami.ShadowedImage { 0205 id: imgDelegate 0206 radius: width 0207 anchors.centerIn: parent 0208 width: Kirigami.Units.gridUnit * 5 0209 height: Kirigami.Units.gridUnit * 5 0210 sourceSize.width: width 0211 sourceSize.height: height 0212 asynchronous: true 0213 mipmap: true 0214 source: delegate.source 0215 } 0216 0217 onClicked: { 0218 usersDetailPage.oldImage = usersDetailPage.user.face 0219 usersDetailPage.user.face = delegate.source 0220 usersDetailPage.overrideImage = true 0221 picturesSheet.close() 0222 } 0223 } 0224 } 0225 } 0226 } 0227 0228 component InitialsPage: ColumnLayout { 0229 PicturesGridLayout { 0230 HomeButton {} 0231 0232 Repeater { 0233 model: picturesSheet.colorPalette 0234 delegate: InitialsButton { 0235 color: modelData.color 0236 headingColor: modelData.dark ? "white" : "black" 0237 hoverEnabled: true 0238 0239 text: modelData.name 0240 QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay 0241 QQC2.ToolTip.text: modelData.name 0242 QQC2.ToolTip.visible: hovered || activeFocus 0243 0244 onClicked: { 0245 grabToImage(function(result) { 0246 const uri = kcm.plonkImageInTempfile(result.image) 0247 if (uri != "") { 0248 usersDetailPage.oldImage = usersDetailPage.user.face 0249 usersDetailPage.user.face = uri 0250 usersDetailPage.overrideImage = true 0251 } 0252 picturesSheet.close() 0253 }) 0254 } 0255 } 0256 } 0257 } 0258 } 0259 0260 component IconsPage: ColumnLayout { 0261 PicturesGridLayout { 0262 HomeButton {} 0263 0264 Repeater { 0265 model: picturesSheet.colorPalette 0266 delegate: IconButton { 0267 text: modelData.name 0268 color: modelData.color 0269 iconColor: modelData.dark ? "white" : "black" 0270 0271 Accessible.description: i18nc("@info:whatsthis", "User avatar placeholder icon") 0272 0273 onClicked: { 0274 grabToImage(function(result) { 0275 const uri = kcm.plonkImageInTempfile(result.image) 0276 if (uri != "") { 0277 usersDetailPage.oldImage = usersDetailPage.user.face 0278 usersDetailPage.user.face = uri 0279 usersDetailPage.overrideImage = true 0280 } 0281 picturesSheet.close() 0282 }) 0283 } 0284 } 0285 } 0286 } 0287 } 0288 0289 readonly property MainPage mainPage: MainPage {} 0290 readonly property InitialsPage initialsPage: InitialsPage {} 0291 readonly property IconsPage iconsPage: IconsPage {} 0292 0293 onClosed: { 0294 destroy(); 0295 } 0296 0297 QQC2.StackView { 0298 id: stackSwitcher 0299 0300 implicitWidth: usersDetailPage.width - Kirigami.Units.largeSpacing * 4 0301 implicitHeight: currentItem.implicitHeight 0302 0303 focus: true 0304 initialItem: mainPage 0305 0306 Keys.onEscapePressed: picturesSheet.close(); 0307 } 0308 0309 Component.onCompleted: open() 0310 }