summaryrefslogtreecommitdiff
path: root/eventsview-plugins/eventsview-plugin-mastodon/MastodonFeedItem.qml
diff options
context:
space:
mode:
Diffstat (limited to 'eventsview-plugins/eventsview-plugin-mastodon/MastodonFeedItem.qml')
-rw-r--r--eventsview-plugins/eventsview-plugin-mastodon/MastodonFeedItem.qml488
1 files changed, 0 insertions, 488 deletions
diff --git a/eventsview-plugins/eventsview-plugin-mastodon/MastodonFeedItem.qml b/eventsview-plugins/eventsview-plugin-mastodon/MastodonFeedItem.qml
deleted file mode 100644
index 63b9556..0000000
--- a/eventsview-plugins/eventsview-plugin-mastodon/MastodonFeedItem.qml
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2013 - 2026 Jolla Ltd.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-import QtQuick 2.0
-import Sailfish.Silica 1.0
-import Sailfish.Share 1.0
-import Sailfish.TextLinking 1.0
-import org.nemomobile.lipstick 0.1
-import "shared"
-
-SocialMediaFeedItem {
- id: item
-
- property variant imageList
- property string resolvedStatusUrl: item.stringValue("url", "link", "uri")
- property string postId
- property QtObject postActions
- property int likeCount: item.intValue("favouritesCount", "likeCount", "favoriteCount")
- property int commentCount: item.intValue("repliesCount", "commentCount")
- property int boostCount: item.intValue("reblogsCount", "boostCount", "repostsCount")
- property bool favourited: !!model.favourited
- property bool reblogged: !!model.reblogged
- property int _likeCountOverride: -1
- property int _boostCountOverride: -1
- property int _favouritedOverride: -1
- property int _rebloggedOverride: -1
- property bool isFavourited: _favouritedOverride >= 0 ? _favouritedOverride === 1 : favourited
- property bool isReblogged: _rebloggedOverride >= 0 ? _rebloggedOverride === 1 : reblogged
- readonly property bool housekeeping: Lipstick.compositor.eventsLayer.housekeeping
- readonly property bool lockScreenActive: Lipstick.compositor.lockScreenLayer.deviceIsLocked
- property bool _pendingOpenActionMenu: false
- property bool _contextMenuOpen: false
- property var _actionMenu
- property real _contextMenuHeight: (_contextMenuOpen && _actionMenu) ? _actionMenu.height : 0
-
- property string _booster: model && model.boostedBy ? model.boostedBy.toString() : ""
- property string _displayName: model && model.name ? model.name.toString() : ""
- property string _accountName: model && model.accountName ? model.accountName.toString() : ""
- property string _bodyText: model && model.body ? model.body.toString() : ""
- //: Action label shown in Mastodon interaction menu.
- //% "Share"
- readonly property string _shareActionText: qsTrId("lipstick-jolla-home-la-mastodon_share")
- //: Link title used when sharing a Mastodon post.
- //% "Post from Mastodon"
- readonly property string _shareLinkTitle: qsTrId("lipstick-jolla-home-la-mastodon_share_link_title")
- property var _shareAction: ShareAction {
- title: item._shareActionText
- }
-
- timestamp: model.timestamp
- onRefreshTimeCountChanged: formattedTime = Format.formatDate(model.timestamp, Format.TimeElapsed)
- onLockScreenActiveChanged: {
- if (lockScreenActive && _actionMenu) {
- _actionMenu.close()
- }
- }
- onPressAndHold: function(mouse) {
- if (mouse) {
- mouse.accepted = true
- }
- _pendingOpenActionMenu = !lockScreenActive
- && postActions
- && actionPostId().length > 0
- && actionAccountId() >= 0
- openActionMenuTimer.restart()
- }
- onHousekeepingChanged: {
- if (housekeeping && _pendingOpenActionMenu) {
- Lipstick.compositor.eventsLayer.setHousekeeping(false)
- }
- }
- Component.onDestruction: {
- if (_actionMenu) {
- _actionMenu.destroy()
- _actionMenu = null
- }
- }
-
- avatar.y: item._booster.length > 0
- ? topMargin + boosterIcon.height + Theme.paddingSmall
- : topMargin
- contentHeight: Math.max(content.y + content.height, avatar.y + avatar.height) + bottomMargin + _contextMenuHeight
- topMargin: item._booster.length > 0 ? Theme.paddingMedium : Theme.paddingLarge
- userRemovable: false
-
- Image {
- id: boosterIcon
-
- anchors {
- right: avatar.right
- top: parent.top
- topMargin: item.topMargin
- }
- visible: item._booster.length > 0
- source: "image://theme/icon-s-repost" + (item.highlighted ? "?" + Theme.highlightColor : "")
- }
-
- Text {
- anchors {
- left: content.left
- right: content.right
- verticalCenter: boosterIcon.verticalCenter
- }
- elide: Text.ElideRight
- font.pixelSize: Theme.fontSizeExtraSmall
- color: item.highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor
- textFormat: Text.PlainText
- visible: text.length > 0
-
- text: item._booster.length > 0
- ? //: Shown above a post that is boosted by another user. %1 = name of user who boosted
- //% "%1 boosted"
- qsTrId("lipstick-jolla-home-la-boosted_by").arg(item._booster)
- : ""
- }
-
- Column {
- id: content
-
- anchors {
- left: avatar.right
- leftMargin: Theme.paddingMedium
- top: avatar.top
- }
- width: parent.width - x
-
- Label {
- width: parent.width
- truncationMode: TruncationMode.Fade
- text: item._displayName
- color: item.highlighted ? Theme.highlightColor : Theme.primaryColor
- textFormat: Text.PlainText
- }
-
- Label {
- width: parent.width
- truncationMode: TruncationMode.Fade
- text: item._accountName.length > 0 && item._accountName.charAt(0) !== "@"
- ? "@" + item._accountName
- : item._accountName
- font.pixelSize: Theme.fontSizeSmall
- color: item.highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor
- textFormat: Text.PlainText
- }
-
- LinkedText {
- width: parent.width
- elide: Text.ElideRight
- wrapMode: Text.Wrap
- font.pixelSize: Theme.fontSizeSmall
- shortenUrl: true
- color: item.highlighted ? Theme.highlightColor : Theme.primaryColor
- linkColor: Theme.highlightColor
- plainText: item._bodyText
- }
-
- Row {
- id: metadataRow
-
- width: parent.width
- height: previewRow.visible ? implicitHeight + Theme.paddingMedium : implicitHeight // add padding below
- spacing: Theme.paddingSmall
-
- readonly property color passiveColor: item.highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor
- readonly property color activeColor: Theme.highlightColor
-
- Label {
- font.pixelSize: Theme.fontSizeExtraSmall
- text: "↩ " + item.commentCount
- color: metadataRow.passiveColor
- }
-
- Label {
- font.pixelSize: Theme.fontSizeExtraSmall
- text: "|"
- color: metadataRow.passiveColor
- }
-
- Label {
- font.pixelSize: Theme.fontSizeExtraSmall
- text: "★ " + (item._likeCountOverride >= 0 ? item._likeCountOverride : item.likeCount)
- color: item.isFavourited ? metadataRow.activeColor : metadataRow.passiveColor
- }
-
- Label {
- font.pixelSize: Theme.fontSizeExtraSmall
- text: "|"
- color: metadataRow.passiveColor
- }
-
- Label {
- font.pixelSize: Theme.fontSizeExtraSmall
- text: "↻ " + (item._boostCountOverride >= 0 ? item._boostCountOverride : item.boostCount)
- color: item.isReblogged ? metadataRow.activeColor : metadataRow.passiveColor
- }
-
- Label {
- visible: item.formattedTime.length > 0
- font.pixelSize: Theme.fontSizeExtraSmall
- text: "|"
- color: metadataRow.passiveColor
- }
-
- Label {
- visible: item.formattedTime.length > 0
- width: Math.max(0, metadataRow.width - x)
- truncationMode: TruncationMode.Fade
- font.pixelSize: Theme.fontSizeExtraSmall
- text: item.formattedTime
- color: metadataRow.passiveColor
- }
- }
-
- SocialMediaPreviewRow {
- id: previewRow
-
- width: parent.width + Theme.horizontalPageMargin // extend to right edge of notification area
- imageList: item.imageList
- downloader: item.downloader
- accountId: item.accountId
- connectedToNetwork: item.connectedToNetwork
- highlighted: item.highlighted
- eventsColumnMaxWidth: item.eventsColumnMaxWidth - item.avatar.width
- }
- }
-
- function stringValue() {
- for (var i = 0; i < arguments.length; ++i) {
- var value = model[arguments[i]]
- if (typeof value === "undefined" || value === null) {
- continue
- }
- value = String(value)
- if (value.length > 0) {
- return value
- }
- }
- return ""
- }
-
- function intValue() {
- for (var i = 0; i < arguments.length; ++i) {
- var value = model[arguments[i]]
- if (typeof value === "undefined" || value === null) {
- continue
- }
- var number = Number(value)
- if (!isNaN(number)) {
- return Math.max(0, Math.floor(number))
- }
- }
- return 0
- }
-
- function actionPostId() {
- if (item.postId.length > 0) {
- return item.postId
- }
- return item.stringValue("mastodonId", "statusId", "id", "twitterId")
- }
-
- function actionAccountId() {
- var parsed = Number(item.accountId)
- return isNaN(parsed) ? -1 : parsed
- }
-
- function shareStatusUrl() {
- return item.stringValue("url", "link", "uri")
- }
-
- function topLevelParent() {
- var p = item
- while (p && p.parent) {
- p = p.parent
- }
- return p
- }
-
- function openActionMenu() {
- if (_actionMenu) {
- _actionMenu.destroy()
- _actionMenu = null
- }
-
- var parentItem = topLevelParent()
- _actionMenu = actionMenuComponent.createObject(parentItem)
- if (_actionMenu) {
- _actionMenu.open(item)
- }
- }
-
- Connections {
- target: item.postActions ? item.postActions : null
-
- onActionSucceeded: {
- if (accountId !== item.actionAccountId() || statusId !== item.actionPostId()) {
- return
- }
-
- if (favouritesCount >= 0) {
- item._likeCountOverride = favouritesCount
- }
- if (reblogsCount >= 0) {
- item._boostCountOverride = reblogsCount
- }
- item._favouritedOverride = favourited ? 1 : 0
- item._rebloggedOverride = reblogged ? 1 : 0
- item._contextMenuOpen = false
-
- if (item._accountDelegate) {
- item._accountDelegate.sync()
- }
- }
-
- onActionFailed: {
- if (accountId !== item.actionAccountId() || statusId !== item.actionPostId()) {
- return
- }
- console.warn("Mastodon action failed:", action, errorMessage)
- item._contextMenuOpen = false
- }
- }
-
- Component {
- id: actionMenuComponent
-
- ContextMenu {
- id: actionMenu
- property bool menuOpen: height > 0
- property bool wasOpened: false
- z: 10000
-
- onPositionChanged: {
- horizontalActions.xPos = _contentColumn.mapFromItem(actionMenu, mouse.x, mouse.y).x
- }
-
- onMenuOpenChanged: {
- if (menuOpen) {
- wasOpened = true
- item._contextMenuOpen = true
- } else if (wasOpened) {
- item._contextMenuOpen = false
- destroy()
- item._actionMenu = null
- }
- }
-
- Item {
- id: horizontalActions
-
- // Makes Silica treat this custom row as a context-menu item.
- property int __silica_menuitem
- property bool down
- property bool highlighted
- signal clicked
-
- property real xPos: 0
- property int hoveredIndex: -1
- readonly property bool actionEnabled: item.postActions
- && item.actionPostId().length > 0
- && item.actionAccountId() >= 0
- && !item.lockScreenActive
- && !item.housekeeping
-
- width: parent.width
- height: Theme.itemSizeMedium
-
- onXPosChanged: hoveredIndex = Math.max(0, Math.min(2, Math.floor((xPos * 3) / Math.max(1, width))))
- onDownChanged: if (!down) hoveredIndex = -1
-
- onClicked: {
- xPos = _contentColumn.mapFromItem(actionMenu, actionMenu.mouseX, actionMenu.mouseY).x
- var index = hoveredIndex >= 0 ? hoveredIndex : Math.max(0, Math.min(2, Math.floor((xPos * 3) / Math.max(1, width))))
- if (!actionEnabled) {
- return
- }
- var postId = item.actionPostId()
- var accountId = item.actionAccountId()
- if (index === 0) {
- if (item.isFavourited) {
- item.postActions.unfavourite(accountId, postId)
- } else {
- item.postActions.favourite(accountId, postId)
- }
- } else if (index === 1) {
- if (item.isReblogged) {
- item.postActions.unboost(accountId, postId)
- } else {
- item.postActions.boost(accountId, postId)
- }
- } else {
- var shareUrl = item.shareStatusUrl()
- if (shareUrl.length === 0) {
- return
- }
- item._shareAction.resources = [{
- "data": shareUrl,
- "linkTitle": item._shareLinkTitle,
- "type": "text/x-url"
- }]
- item._shareAction.trigger()
- }
- }
-
- Rectangle {
- anchors.verticalCenter: parent.verticalCenter
- x: (horizontalActions.hoveredIndex >= 0 ? horizontalActions.hoveredIndex : 0) * (parent.width / 3)
- width: parent.width / 3
- height: parent.height
- visible: horizontalActions.down && horizontalActions.hoveredIndex >= 0
- color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity)
- }
-
- Row {
- anchors.fill: parent
-
- Label {
- width: parent.width / 3
- height: parent.height
- horizontalAlignment: Text.AlignHCenter
- verticalAlignment: Text.AlignVCenter
- font.pixelSize: Theme.fontSizeExtraLarge
- text: "★"
- color: horizontalActions.actionEnabled
- ? (item.isFavourited
- ? Theme.highlightColor
- : ((horizontalActions.down && horizontalActions.hoveredIndex === 0)
- || (horizontalActions.highlighted && horizontalActions.hoveredIndex === 0)
- ? Theme.secondaryHighlightColor : Theme.primaryColor))
- : Theme.rgba(Theme.secondaryColor, 0.4)
- }
-
- Label {
- width: parent.width / 3
- height: parent.height
- horizontalAlignment: Text.AlignHCenter
- verticalAlignment: Text.AlignVCenter
- font.pixelSize: Theme.fontSizeExtraLarge
- text: "↻"
- color: horizontalActions.actionEnabled
- ? (item.isReblogged
- ? Theme.highlightColor
- : ((horizontalActions.down && horizontalActions.hoveredIndex === 1)
- || (horizontalActions.highlighted && horizontalActions.hoveredIndex === 1)
- ? Theme.secondaryHighlightColor : Theme.primaryColor))
- : Theme.rgba(Theme.secondaryColor, 0.4)
- }
-
- Label {
- width: parent.width / 3
- height: parent.height
- horizontalAlignment: Text.AlignHCenter
- verticalAlignment: Text.AlignVCenter
- font.pixelSize: Theme.fontSizeExtraLarge
- text: "\u260D"
- color: horizontalActions.actionEnabled
- ? (((horizontalActions.down && horizontalActions.hoveredIndex === 2)
- || (horizontalActions.highlighted && horizontalActions.hoveredIndex === 2))
- ? Theme.secondaryHighlightColor : Theme.primaryColor)
- : Theme.rgba(Theme.secondaryColor, 0.4)
- }
- }
- }
- }
- }
-
- Timer {
- id: openActionMenuTimer
-
- interval: 0
- repeat: false
- onTriggered: {
- if (item.lockScreenActive) {
- item._pendingOpenActionMenu = false
- return
- }
- Lipstick.compositor.eventsLayer.setHousekeeping(false)
- if (item._pendingOpenActionMenu) {
- item._contextMenuOpen = false
- item.openActionMenu()
- }
- item._pendingOpenActionMenu = false
- }
- }
-}