telephant/qml/MessageView.qml

373 lines
14 KiB
QML
Raw Normal View History

import QtQuick 2.5
2017-08-29 14:28:33 +00:00
import QtQuick.Controls 2.1
import QtQuick.Controls.Material 2.1
2017-08-29 05:02:56 +00:00
import QtQuick.Layouts 1.3
import QtGraphicalEffects 1.0
import "componentCreator.js" as ComponentCreator
ColumnLayout {
property bool fadeMedia
property bool showActionButtons: true
property var message: model
2017-08-29 05:02:56 +00:00
2019-05-13 12:51:47 +00:00
property bool following: message.following
property bool liked: message.liked
property bool shared: message.shared
clip: true
RowLayout {
visible: message.forward && !message.like
Item {
width: 32
}
Image {
smooth: true
source: "images/share.png"
sourceSize.height: 14
opacity: 0.5
}
Label {
font.pointSize: 10
text: qsTr("%1 shared").arg(message.actorname)
opacity: (accountBridge.username == message.author && (message.like || message.forward)) ? 0.8 : 0.3
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
uiBridge.loadAccount(message.actorid)
ComponentCreator.createAccountPopup(this).open();
}
}
}
}
RowLayout {
visible: message.like
Item {
width: 32
}
Image {
smooth: true
source: "images/like.png"
sourceSize.height: 14
opacity: 0.5
}
Label {
font.pointSize: 10
text: qsTr("%1 liked").arg(message.actorname)
opacity: (accountBridge.username == message.author && (message.like || message.forward)) ? 0.8 : 0.3
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
uiBridge.loadAccount(message.actorid)
ComponentCreator.createAccountPopup(this).open();
}
}
}
}
2017-08-29 05:02:56 +00:00
RowLayout {
spacing: 8
Layout.fillWidth: true
2017-08-29 05:02:56 +00:00
ImageButton {
id: image
2019-05-05 13:17:46 +00:00
Layout.alignment: Qt.AlignTop
source: message.avatar
2017-08-29 05:02:56 +00:00
sourceSize.width: 48
width: 48
2017-08-29 05:02:56 +00:00
fillMode: Image.PreserveAspectCrop
2019-05-05 13:57:12 +00:00
roundness: 4
opacity: 1.0
onClicked: function() {
uiBridge.loadAccount(message.authorid)
ComponentCreator.createAccountPopup(this).open();
}
2017-08-29 05:02:56 +00:00
}
RowLayout {
visible: message.followed
Layout.fillWidth: true
spacing: 4
ColumnLayout {
Layout.fillWidth: true
Label {
font.pointSize: 11
font.bold: true
text: qsTr("%1 followed you").arg(message.actorname)
textFormat: Text.PlainText
Layout.fillWidth: true
elide: Text.ElideRight
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
uiBridge.loadAccount(message.authorid)
ComponentCreator.createAccountPopup(this).open();
}
}
}
Label {
font.pointSize: 11
text: message.actor
textFormat: Text.PlainText
Layout.fillWidth: true
elide: Text.ElideRight
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
uiBridge.loadAccount(message.authorid)
ComponentCreator.createAccountPopup(this).open();
}
}
}
}
Button {
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
highlighted: true
2019-05-13 12:51:47 +00:00
text: following ? qsTr("Unfollow") : qsTr("Follow")
onClicked: {
2019-05-13 12:51:47 +00:00
uiBridge.followButton(message.authorid, !following)
following = !following
}
}
}
2017-08-29 05:02:56 +00:00
ColumnLayout {
visible: !message.followed
Layout.fillWidth: true
2017-08-29 05:02:56 +00:00
spacing: 4
RowLayout {
width: parent.width
2017-08-29 05:02:56 +00:00
Label {
id: namelabel
font.pointSize: 11
2017-08-29 05:02:56 +00:00
font.bold: true
text: message.name
2017-08-29 07:55:28 +00:00
textFormat: Text.PlainText
elide: Text.ElideRight
opacity: (accountBridge.username == message.author && (message.like || message.forward)) ? 0.4 : 1.0
Layout.fillWidth: true
Layout.maximumWidth: implicitWidth + 1
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
uiBridge.loadAccount(message.authorid)
ComponentCreator.createAccountPopup(this).open();
}
}
2017-08-29 05:02:56 +00:00
}
Label {
// anchors.bottom: parent.bottom
font.pointSize: 9
opacity: 0.4
text: "@" + message.author
textFormat: Text.PlainText
elide: Text.ElideRight
Layout.fillWidth: true
Layout.maximumWidth: implicitWidth + 1
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
uiBridge.loadAccount(message.authorid)
ComponentCreator.createAccountPopup(this).open();
}
}
2017-08-29 05:02:56 +00:00
}
Label {
font.pointSize: 9
opacity: 0.4
text: message.createdat
2019-05-15 03:27:48 +00:00
width: implicitWidth + 1
horizontalAlignment: Text.AlignRight
2017-08-29 05:02:56 +00:00
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
2017-08-29 05:02:56 +00:00
onClicked: {
Qt.openUrlExternally(message.posturl)
2017-08-29 05:02:56 +00:00
}
}
}
}
ColumnLayout {
Layout.fillWidth: true
visible: !message.followed
// width: parent.width
// anchors.bottom: parent.bottom
2017-08-29 05:02:56 +00:00
spacing: 4
Label {
visible: message.body.length > 0
text: "<style>a:link { visibility: hidden; text-decoration: none; color: " + Material.accent + "; }</style>" + message.body
2017-08-29 05:02:56 +00:00
textFormat: Text.RichText
font.pointSize: 11
2017-08-29 05:02:56 +00:00
Layout.fillWidth: true
2019-05-12 01:00:34 +00:00
wrapMode: Text.WordWrap
opacity: (accountBridge.username == message.author && (message.like || message.forward)) ? 0.4 : 1.0
2019-05-09 23:42:42 +00:00
onLinkActivated: function(link) {
if (link.startsWith("telephant://")) {
var us = link.substr(12, link.length).split("/")
if (us[1] == "user") {
uiBridge.loadAccount(us[us.length-1])
ComponentCreator.createAccountPopup(this).open();
}
if (us[1] == "tag") {
uiBridge.tag(us[us.length-1])
}
2019-05-09 23:42:42 +00:00
} else
Qt.openUrlExternally(link)
}
MouseArea {
anchors.fill: parent
// we don't want to eat clicks on the Label
acceptedButtons: parent.hoveredLink ? Qt.NoButton : Qt.LeftButton
cursorShape: Qt.PointingHandCursor
onClicked: function() {
uiBridge.loadConversation(message.messageid)
ComponentCreator.createConversationPopup(this).open();
}
}
2017-08-29 05:02:56 +00:00
}
2019-05-20 02:44:03 +00:00
Flow {
id: flowgrid
visible: message.mediapreview.length > 0
Layout.fillWidth: true
2019-05-20 02:44:03 +00:00
Layout.topMargin: 4
property int cols: message.mediapreview.length >= 2 ? Math.min(message.mediapreview.length, width / 140) : 1
spacing: 4
Repeater {
model: message.mediapreview
2019-05-20 02:44:03 +00:00
ImageButton {
source: modelData
height: Math.min(sourceSize.height, flowgrid.width / 2)
width: Math.min(sourceSize.width, flowgrid.width / flowgrid.cols - flowgrid.spacing)
fillMode: Image.PreserveAspectCrop
2019-05-20 05:03:51 +00:00
verticalAlignment: Image.AlignVCenter
horizontalAlignment: Image.AlignHCenter
2019-05-20 02:44:03 +00:00
autoTransform: true
opacity: fadeMedia ? 0.2 : 1.0
roundness: 4
2019-05-20 02:44:03 +00:00
onClicked: function() {
Qt.openUrlExternally(message.mediaurl[index])
}
}
}
}
2017-08-29 05:02:56 +00:00
RowLayout {
Layout.fillWidth: true
2017-08-29 05:02:56 +00:00
RowLayout {
visible: message.reply
2017-08-29 05:02:56 +00:00
Label {
font.pointSize: 10
2017-08-29 05:02:56 +00:00
text: qsTr("Replying to %1").arg(
"@" + message.replytoauthor)
opacity: 0.4
2017-08-29 05:02:56 +00:00
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
2017-08-29 05:02:56 +00:00
onClicked: {
Qt.openUrlExternally(message.posturl)
2017-08-29 05:02:56 +00:00
}
}
}
}
RowLayout {
width: parent.width
visible: showActionButtons && !(accountBridge.username == message.author && (message.like || message.forward))
2019-05-05 13:19:40 +00:00
Layout.topMargin: 4
Item {
// spacer item
Layout.fillWidth: true
}
2017-08-29 05:02:56 +00:00
ImageButton {
source: "images/reply.png"
animationDuration: 200
sourceSize.height: 20
2017-08-29 05:02:56 +00:00
onClicked: function () {
ComponentCreator.createMessagePopup(this, message).open();
2017-08-29 05:02:56 +00:00
}
}
ImageButton {
source: "images/share.png"
animationDuration: 200
sourceSize.height: 20
2019-05-13 12:51:47 +00:00
opacity: shared ? 1.0 : 0.3
2017-08-29 05:02:56 +00:00
onClicked: function () {
2019-05-13 12:51:47 +00:00
if (shared) {
uiBridge.unshareButton(message.messageid)
2019-05-13 12:51:47 +00:00
shared = false
2019-05-06 20:51:31 +00:00
} else {
ComponentCreator.createSharePopup(this, message).open();
2019-05-06 20:51:31 +00:00
}
2017-08-29 05:02:56 +00:00
}
}
ImageButton {
2019-05-13 12:51:47 +00:00
source: liked ? "images/liked.png" : "images/like.png"
animationDuration: 200
sourceSize.height: 20
2019-05-13 12:51:47 +00:00
opacity: liked ? 1.0 : 0.3
2017-08-29 05:02:56 +00:00
onClicked: function () {
2019-05-13 12:51:47 +00:00
if (liked) {
uiBridge.unlikeButton(message.messageid)
2019-05-13 12:51:47 +00:00
liked = false
2019-05-06 20:51:31 +00:00
} else {
uiBridge.likeButton(message.messageid)
2019-05-13 12:51:47 +00:00
liked = true
2019-05-06 20:51:31 +00:00
}
2017-08-29 05:02:56 +00:00
}
}
ImageButton {
source: "images/menu.png"
visible: accountBridge.username == message.author
animationDuration: 200
sourceSize.height: 20
opacity: liked ? 1.0 : 0.3
onClicked: function() {
postMenu.open()
}
Menu {
id: postMenu
x: -width + parent.width
y: parent.height
transformOrigin: Menu.TopRight
MenuItem {
text: qsTr("Delete")
onTriggered: function() {
ComponentCreator.createDeletePopup(this, message).open();
}
}
}
}
2017-08-29 05:02:56 +00:00
}
}
}
}
}
}