8 import QtQuick.Window 2.15
9 import QtQuick.Controls 2.13 as QQC2
10 import QtGraphicalEffects 1.0 as GE
11 import org.kde.kirigami 2.14 as Kirigami
12 import org.kde.kirigami.private 2.14 as KP
13 import "templates/private" as TP
25 AdaptiveImageOrInitals,
47 property alias source: avatarImage.source
58 property alias iconSource: avatarIcon.source
69 property int initialsMode: Kirigami.Avatar.InitialsMode.UseInitials
84 property int imageMode: Kirigami.Avatar.ImageMode.AdaptiveImageOrInitals
91 property alias cache: avatarImage.cache
98 property alias sourceSize: avatarImage.sourceSize
105 property alias smooth: avatarImage.smooth
114 property var color: Kirigami.NameUtils.colorsFromString(name)
132 property KP.AvatarGroup actions: KP.AvatarGroup {}
143 property TP.BorderPropertiesGroup border: TP.BorderPropertiesGroup {
145 color:
Qt.rgba(0,0,0,0.2)
150 horizontalPadding: padding
151 verticalPadding: padding
152 leftPadding: horizontalPadding
153 rightPadding: horizontalPadding
154 topPadding: verticalPadding
155 bottomPadding: verticalPadding
157 implicitWidth: Kirigami.Units.iconSizes.large
158 implicitHeight: Kirigami.Units.iconSizes.large
160 activeFocusOnTab: !!actions.main
162 Accessible.role: !!actions.main ? Accessible.Button : Accessible.Graphic
163 Accessible.name: !!actions.main ? qsTr(
"%1 — %2").arg(name).arg(actions.main.text) : name
164 Accessible.focusable: !!actions.main
165 Accessible.onPressAction: __triggerMainAction()
166 Keys.onReturnPressed: event => __triggerMainAction()
167 Keys.onEnterPressed: event => __triggerMainAction()
168 Keys.onSpacePressed: event => __triggerMainAction()
170 function __triggerMainAction() {
172 actions.main.trigger();
176 background: Rectangle {
177 radius: parent.width / 2
179 color: __private.showImage ? Kirigami.Theme.backgroundColor : avatarRoot.color
183 anchors.margins: -border.width
188 border.width: Kirigami.Units.smallSpacing
189 border.color: Kirigami.Theme.focusColor
190 visible: avatarRoot.focus
198 property bool mouseInCircle: {
199 const x = avatarRoot.width / 2, y = avatarRoot.height / 2
200 const xPrime = mouseX, yPrime = mouseY
202 const distance = (x - xPrime) ** 2 + (y - yPrime) ** 2
203 const radiusSquared = (Math.min(avatarRoot.width, avatarRoot.height) / 2) ** 2
205 return distance < radiusSquared
209 if (mouseY > avatarRoot.height - secondaryRect.height && !!avatarRoot.actions.secondary) {
210 avatarRoot.actions.secondary.trigger()
213 avatarRoot.__triggerMainAction()
216 enabled: !!avatarRoot.actions.main || !!avatarRoot.actions.secondary
217 cursorShape: containsMouse && mouseInCircle && enabled ?
Qt.PointingHandCursor :
Qt.ArrowCursor
220 text: avatarRoot.actions.main && avatarRoot.actions.main.tooltip ? avatarRoot.actions.main.tooltip :
''
221 visible: primaryMouse.containsMouse && text
226 name:
"secondaryRevealed"
227 when: (!Kirigami.Settings.isMobile) && (!!avatarRoot.actions.secondary) && (primaryMouse.containsMouse && primaryMouse.mouseInCircle)
229 target: secondaryRect
239 property color textColor: Kirigami.ColorUtils.brightnessForColor(avatarRoot.color) === Kirigami.ColorUtils.Light
242 property bool showImage: {
243 return (avatarRoot.imageMode === Kirigami.Avatar.ImageMode.AlwaysShowImage) ||
244 (avatarImage.status ===
Image.Ready && avatarRoot.imageMode === Kirigami.Avatar.ImageMode.AdaptiveImageOrInitals)
251 fontSizeMode: Text.Fit
252 visible: avatarRoot.initialsMode === Kirigami.Avatar.InitialsMode.UseInitials &&
253 !__private.showImage &&
254 !Kirigami.NameUtils.isStringUnsuitableForInitials(avatarRoot.name) &&
255 avatarRoot.width > Kirigami.Units.gridUnit
257 text: Kirigami.NameUtils.initialsFromString(name)
258 color: __private.textColor
264 pixelSize: (avatarRoot.height - Kirigami.Units.largeSpacing) / 2
266 verticalAlignment: Text.AlignVCenter
267 horizontalAlignment: Text.AlignHCenter
271 visible: (avatarRoot.initialsMode === Kirigami.Avatar.InitialsMode.UseIcon && !__private.showImage) ||
272 (Kirigami.NameUtils.isStringUnsuitableForInitials(avatarRoot.name) && !__private.showImage)
277 anchors.margins: Kirigami.Units.largeSpacing
279 color: __private.textColor
283 visible: __private.showImage
288 width: avatarRoot.width * Screen.devicePixelRatio
289 height: avatarRoot.height * Screen.devicePixelRatio
292 fillMode:
Image.PreserveAspectCrop
303 width: avatarRoot.border.width
304 color: avatarRoot.border.color
313 bottom: parent.bottom
318 height: Kirigami.Units.iconSizes.small + Kirigami.Units.smallSpacing*2
320 color:
Qt.rgba(0, 0, 0, 0.6)
323 Kirigami.Theme.textColor:
"white"
324 source: (avatarRoot.actions.secondary || {iconName:
""}).iconName
326 width: Kirigami.Units.iconSizes.small
327 height: Kirigami.Units.iconSizes.small
329 x: Math.round((parent.width/2)-(this.width/2))
330 y: Math.round((parent.height/2)-(this.height/2))
335 layer.effect: GE.OpacityMask {
336 maskSource: Rectangle {
337 height: avatarRoot.height
338 width: avatarRoot.width