summary refs log tree commit diff
path: root/resources/qml/delegates/Reply.qml
blob: f5556c8b8f29a021f8a6cf16d2102bd9399fd213 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

import Qt.labs.platform 1.1 as Platform
import QtQuick 2.12
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2
import QtQuick.Window 2.13
import im.nheko 1.0

Item {
    id: r

    property color userColor: "red"
    property double proportionalHeight
    property int type
    property string typeString
    property int originalWidth
    property string blurhash
    property string body
    property string formattedBody
    property string eventId
    property string filename
    property string filesize
    property string url
    property bool isOnlyEmoji
    property bool isStateEvent
    property string userId
    property string userName
    property string thumbnailUrl
    property string roomTopic
    property string roomName
    property string callType
    property int encryptionError
    property int relatedEventCacheBuster

    Layout.preferredHeight: replyContainer.height
    height: replyContainer.height

    CursorShape {
        anchors.fill: parent
        cursorShape: Qt.PointingHandCursor
    }

    Rectangle {
        id: colorLine

        anchors.top: replyContainer.top
        anchors.bottom: replyContainer.bottom
        width: 4
        color: TimelineManager.userColor(userId, Nheko.colors.base)
    }

    ColumnLayout {
        id: replyContainer

        anchors.left: colorLine.right
        width: parent.width - 4
        spacing: 0

        TapHandler {
            acceptedButtons: Qt.LeftButton
            onSingleTapped: {
                let link = reply.child.linkAt(eventPoint.position.x, eventPoint.position.y - userName_.implicitHeight);
                if (link) {
                    Nheko.openLink(link)
                } else {
                    room.showEvent(r.eventId)
                }
            }
            gesturePolicy: TapHandler.ReleaseWithinBounds
        }

        TapHandler {
            acceptedButtons: Qt.RightButton
            onLongPressed: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(eventPoint.position.x, eventPoint.position.y - userName_.implicitHeight))
            onSingleTapped: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(eventPoint.position.x, eventPoint.position.y - userName_.implicitHeight))
            gesturePolicy: TapHandler.ReleaseWithinBounds
        }

        Text {
            Layout.leftMargin: 4
            id: userName_

            text: TimelineManager.escapeEmoji(userName)
            color: r.userColor
            textFormat: Text.RichText

            TapHandler {
                onSingleTapped: room.openUserProfile(userId)
                gesturePolicy: TapHandler.ReleaseWithinBounds
            }

        }

        MessageDelegate {
            Layout.leftMargin: 4
            id: reply
            blurhash: r.blurhash
            body: r.body
            formattedBody: r.formattedBody
            eventId: r.eventId
            filename: r.filename
            filesize: r.filesize
            proportionalHeight: r.proportionalHeight
            type: r.type
            typeString: r.typeString ?? ""
            url: r.url
            thumbnailUrl: r.thumbnailUrl
            originalWidth: r.originalWidth
            isOnlyEmoji: r.isOnlyEmoji
            isStateEvent: r.isStateEvent
            userId: r.userId
            userName: r.userName
            roomTopic: r.roomTopic
            roomName: r.roomName
            callType: r.callType
            relatedEventCacheBuster: r.relatedEventCacheBuster
            encryptionError: r.encryptionError
            // This is disabled so that left clicking the reply goes to its location
            enabled: false
            Layout.fillWidth: true
            isReply: true
        }

    }

    Rectangle {
        id: backgroundItem

        z: -1
        anchors.fill: replyContainer
        property color userColor: TimelineManager.userColor(userId, Nheko.colors.base)
        property color bgColor: Nheko.colors.base
        color: Qt.rgba(userColor.r*0.1+bgColor.r*0.9,userColor.g*0.1+bgColor.g*0.9,userColor.b*0.1+bgColor.b*0.9,1) // alpha makes this mix with the bubble color
    }

}