| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- import QtQml 2.15
- import QtQuick 2.15
- import QtQuick.Controls 2.15
- import QtQuick.Layouts 1.15
- import QtGraphicalEffects 1.15
- import Style 1.0
- import com.nextcloud.desktopclient 1.0
- RowLayout {
- id: root
- property variant activityData: {{}}
- property variant activity: {{}}
- property color activityTextTitleColor: Style.ncTextColor
- property bool showDismissButton: false
- property bool childHovered: fileDetailsButton.hovered || dismissActionButton.hovered
- property int iconSize: Style.trayListItemIconSize
- signal dismissButtonClicked()
- spacing: Style.standardSpacing
- Item {
- id: thumbnailItem
- readonly property int imageWidth: width * (1 - Style.thumbnailImageSizeReduction)
- readonly property int imageHeight: height * (1 - Style.thumbnailImageSizeReduction)
- readonly property int thumbnailRadius: model.thumbnail && model.thumbnail.isUserAvatar ? width / 2 : 3
- implicitWidth: root.iconSize
- implicitHeight: model.thumbnail && model.thumbnail.isMimeTypeIcon ? root.iconSize * 0.9 : root.iconSize
- Loader {
- id: thumbnailImageLoader
- anchors.fill: parent
- active: model.thumbnail !== undefined
- sourceComponent: Item {
- anchors.fill: parent
- readonly property int paintedWidth: model.thumbnail.isMimeTypeIcon ? thumbnailImage.paintedWidth * 0.8 : thumbnailImage.paintedWidth
- readonly property int paintedHeight: model.thumbnail.isMimeTypeIcon ? thumbnailImage.paintedHeight * 0.55 : thumbnailImage.paintedHeight
- Image {
- id: thumbnailImage
- width: thumbnailItem.imageWidth
- height: thumbnailItem.imageHeight
- anchors.verticalCenter: parent.verticalCenter
- anchors.left: parent.left
- cache: true
- fillMode: Image.PreserveAspectFit
- source: model.thumbnail.source
- visible: false
- sourceSize.height: 64
- sourceSize.width: 64
- }
- Rectangle {
- id: mask
- color: "white"
- radius: thumbnailItem.thumbnailRadius
- anchors.fill: thumbnailImage
- visible: false
- width: thumbnailImage.paintedWidth
- height: thumbnailImage.paintedHeight
- }
- OpacityMask {
- anchors.fill: thumbnailImage
- source: thumbnailImage
- maskSource: mask
- visible: model.thumbnail !== undefined
- }
- }
- }
- Image {
- id: activityIcon
- width: model.thumbnail !== undefined ? parent.width * 0.4 : thumbnailItem.imageWidth
- height: model.thumbnail !== undefined ? width : width * 0.9
- // Prevent bad access into unloaded item properties
- readonly property int thumbnailPaintedWidth: thumbnailImageLoader.item ? thumbnailImageLoader.item.paintedWidth : 0
- readonly property int thumbnailPaintedHeight: thumbnailImageLoader.item ? thumbnailImageLoader.item.paintedHeight : 0
- readonly property int negativeLeftMargin: -((width / 2) +
- ((width - paintedWidth) / 2) +
- ((thumbnailImageLoader.width - thumbnailItem.imageWidth) / 2) +
- ((thumbnailImageLoader.width - thumbnailPaintedWidth) / 2) +
- (thumbnailItem.thumbnailRadius / 4))
- readonly property int negativeTopMargin: -((height / 2) +
- ((height - paintedHeight) / 2) +
- ((thumbnailImageLoader.height - thumbnailItem.imageHeight) / 4) +
- ((thumbnailImageLoader.height - thumbnailPaintedHeight) / 4) +
- (thumbnailItem.thumbnailRadius / 4))
- anchors.verticalCenter: if(model.thumbnail === undefined) parent.verticalCenter
- anchors.left: model.thumbnail === undefined ? parent.left : thumbnailImageLoader.right
- anchors.leftMargin: if(model.thumbnail !== undefined) negativeLeftMargin
- anchors.top: if(model.thumbnail !== undefined) thumbnailImageLoader.bottom
- anchors.topMargin: if(model.thumbnail !== undefined) negativeTopMargin
- cache: true
- fillMode: Image.PreserveAspectFit
- source: Theme.darkMode ? model.darkIcon : model.lightIcon
- sourceSize.height: 64
- sourceSize.width: 64
- mipmap: true // Addresses grainy downscale
- }
- }
- ColumnLayout {
- id: activityContentLayout
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.maximumWidth: root.width - Style.standardSpacing - root.iconSize
- implicitWidth: root.width - Style.standardSpacing - root.iconSize
- spacing: Style.smallSpacing
- RowLayout {
- Layout.fillWidth: true
- spacing: Style.trayHorizontalMargin
- EnforcedPlainTextLabel {
- id: activityTextTitle
- text: (root.activityData.type === "Activity" || root.activityData.type === "Notification") ? root.activityData.subject : root.activityData.message
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
- elide: Text.ElideRight
- wrapMode: Text.Wrap
- maximumLineCount: 2
- font.pixelSize: Style.topLinePixelSize
- color: Style.ncTextColor
- visible: text !== ""
- NCToolTip {
- text: parent.text
- visible: parent.hovered
- }
- }
- Item {
- Layout.fillWidth: true
- Layout.leftMargin: -Style.trayHorizontalMargin
- }
- EnforcedPlainTextLabel {
- id: activityTextDateTime
- Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
- height: (text === "") ? 0 : implicitHeight
- text: root.activityData.dateTime
- font.pixelSize: Style.subLinePixelSize
- color: Style.ncSecondaryTextColor
- visible: text !== ""
- }
- CustomButton {
- id: fileDetailsButton
- Layout.preferredWidth: Style.dismissButtonSize
- Layout.preferredHeight: Style.dismissButtonSize
- Layout.alignment: Qt.AlignTop | Qt.AlignRight
- icon.source: "image://svgimage-custom-color/more.svg/" + Style.ncTextColor
- NCToolTip {
- text: qsTr("Open file details")
- visible: parent.hovered
- }
- display: Button.IconOnly
- leftPadding: 0
- rightPadding: 0
- bgColor: Style.lightHover
- bgNormalOpacity: 0
- visible: model.showFileDetails
- onClicked: Systray.presentShareViewInTray(model.openablePath)
- }
- CustomButton {
- id: dismissActionButton
- Layout.preferredWidth: Style.dismissButtonSize
- Layout.preferredHeight: Style.dismissButtonSize
- Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
- visible: root.showDismissButton && !fileDetailsButton.visible
- icon.source: "image://svgimage-custom-color/clear.svg/" + Style.ncTextColor
- display: Button.IconOnly
- leftPadding: 0
- rightPadding: 0
- bgColor: Style.lightHover
- bgNormalOpacity: 0
- NCToolTip {
- text: qsTr("Dismiss")
- visible: parent.hovered
- }
- onClicked: root.dismissButtonClicked()
- }
- }
- RowLayout {
- Layout.fillWidth: true
- Layout.fillHeight: true
- spacing: Style.trayHorizontalMargin
- visible: activityTextInfo.visible || talkReplyMessageSent.visible || activityActions.visible
- EnforcedPlainTextLabel {
- id: activityTextInfo
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.alignment: Qt.AlignTop | Qt.AlignLeft
- text: (root.activityData.type === "Sync") ? root.activityData.displayPath
- : (root.activityData.type === "File") ? root.activityData.subject
- : (root.activityData.type === "Notification") ? root.activityData.message
- : ""
- height: (text === "") ? 0 : implicitHeight
- elide: Text.ElideRight
- wrapMode: Text.Wrap
- maximumLineCount: 2
- font.pixelSize: Style.subLinePixelSize
- color: Style.ncTextColor
- visible: text !== ""
- }
- Item {
- Layout.fillWidth: true
- }
- EnforcedPlainTextLabel {
- id: talkReplyMessageSent
- height: (text === "") ? 0 : implicitHeight
- width: parent.width
- Layout.alignment: Qt.AlignTop | Qt.AlignRight
- text: root.activityData.messageSent
- elide: Text.ElideRight
- wrapMode: Text.Wrap
- maximumLineCount: 2
- font.pixelSize: Style.topLinePixelSize
- color: Style.ncSecondaryTextColor
- visible: text !== ""
- }
- ActivityItemActions {
- id: activityActions
- visible: !isFileActivityList && activityData.linksForActionButtons.length > 0 && !isTalkReplyOptionVisible
- Layout.fillWidth: true
- Layout.leftMargin: Style.trayListItemIconSize + Style.trayHorizontalMargin
- Layout.preferredHeight: Style.standardPrimaryButtonHeight
- Layout.alignment: Qt.AlignTop | Qt.AlignRight
- displayActions: activityData.displayActions
- objectType: activityData.objectType
- linksForActionButtons: activityData.linksForActionButtons
- linksContextMenu: activityData.linksContextMenu
- maxActionButtons: activityModel.maxActionButtons
- onTriggerAction: activityModel.slotTriggerAction(model.activityIndex, actionIndex)
- onShowReplyField: isTalkReplyOptionVisible = true
- }
- }
- }
- }
|