diff options
Diffstat (limited to 'resources/qml/TimelineView.qml')
-rw-r--r-- | resources/qml/TimelineView.qml | 176 |
1 files changed, 34 insertions, 142 deletions
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml index 4782c1f1..0642b13a 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml @@ -3,9 +3,12 @@ import QtQuick.Controls 2.1 import QtQuick.Layouts 1.2 import QtGraphicalEffects 1.0 import QtQuick.Window 2.2 +import Qt.labs.qmlmodels 1.0 import com.github.nheko 1.0 +import "./delegates" + Rectangle { anchors.fill: parent @@ -77,158 +80,47 @@ Rectangle { onMovementEnded: updatePosition() spacing: 4 - delegate: RowLayout { - anchors.leftMargin: avatarSize + 4 - anchors.left: parent.left - anchors.right: parent.right - anchors.rightMargin: scrollbar.width - - function isFullyVisible() { - return (y - chat.contentY - 1) + height < chat.height + delegate: DelegateChooser { + role: "type" + DelegateChoice { + roleValue: MtxEvent.TextMessage + TimelineRow { view: chat; TextMessage { id: kid } } } - function getIndex() { - return index; + DelegateChoice { + roleValue: MtxEvent.NoticeMessage + TimelineRow { view: chat; NoticeMessage { id: kid } } } - - Loader { - id: loader - Layout.fillWidth: true - Layout.alignment: Qt.AlignTop - height: item.height - - source: switch(model.type) { - //case MtxEvent.Aliases: return "delegates/Aliases.qml" - //case MtxEvent.Avatar: return "delegates/Avatar.qml" - //case MtxEvent.CanonicalAlias: return "delegates/CanonicalAlias.qml" - //case MtxEvent.Create: return "delegates/Create.qml" - //case MtxEvent.GuestAccess: return "delegates/GuestAccess.qml" - //case MtxEvent.HistoryVisibility: return "delegates/HistoryVisibility.qml" - //case MtxEvent.JoinRules: return "delegates/JoinRules.qml" - //case MtxEvent.Member: return "delegates/Member.qml" - //case MtxEvent.Name: return "delegates/Name.qml" - //case MtxEvent.PowerLevels: return "delegates/PowerLevels.qml" - //case MtxEvent.Topic: return "delegates/Topic.qml" - case MtxEvent.NoticeMessage: return "delegates/NoticeMessage.qml" - case MtxEvent.TextMessage: return "delegates/TextMessage.qml" - case MtxEvent.EmoteMessage: return "delegates/TextMessage.qml" - case MtxEvent.ImageMessage: return "delegates/ImageMessage.qml" - case MtxEvent.Sticker: return "delegates/ImageMessage.qml" - case MtxEvent.FileMessage: return "delegates/FileMessage.qml" - case MtxEvent.VideoMessage: return "delegates/PlayableMediaMessage.qml" - case MtxEvent.AudioMessage: return "delegates/PlayableMediaMessage.qml" - case MtxEvent.Redacted: return "delegates/Redacted.qml" - default: return "delegates/placeholder.qml" - } - property variant eventData: model + DelegateChoice { + roleValue: MtxEvent.EmoteMessage + TimelineRow { view: chat; TextMessage { id: kid } } } - - StatusIndicator { - state: model.state - Layout.alignment: Qt.AlignRight | Qt.AlignTop - Layout.preferredHeight: 16 + DelegateChoice { + roleValue: MtxEvent.ImageMessage + TimelineRow { view: chat; ImageMessage { id: kid } } } - - EncryptionIndicator { - visible: model.isEncrypted - Layout.alignment: Qt.AlignRight | Qt.AlignTop - Layout.preferredHeight: 16 + DelegateChoice { + roleValue: MtxEvent.Sticker + TimelineRow { view: chat; ImageMessage { id: kid } } } - - Button { - Layout.alignment: Qt.AlignRight | Qt.AlignTop - id: replyButton - flat: true - Layout.preferredHeight: 16 - ToolTip.visible: hovered - ToolTip.text: qsTr("Reply") - - // disable background, because we don't want a border on hover - background: Item { - } - - Image { - id: replyButtonImg - // Workaround, can't get icon.source working for now... - anchors.fill: parent - source: "qrc:/icons/icons/ui/mail-reply.png" - } - ColorOverlay { - anchors.fill: replyButtonImg - source: replyButtonImg - color: replyButton.hovered ? colors.highlight : colors.buttonText - } - - onClicked: chat.model.replyAction(model.id) + DelegateChoice { + roleValue: MtxEvent.FileMessage + TimelineRow { view: chat; FileMessage { id: kid } } } - Button { - Layout.alignment: Qt.AlignRight | Qt.AlignTop - id: optionsButton - flat: true - Layout.preferredHeight: 16 - ToolTip.visible: hovered - ToolTip.text: qsTr("Options") - - // disable background, because we don't want a border on hover - background: Item { - } - - Image { - id: optionsButtonImg - // Workaround, can't get icon.source working for now... - anchors.fill: parent - source: "qrc:/icons/icons/ui/vertical-ellipsis.png" - } - ColorOverlay { - anchors.fill: optionsButtonImg - source: optionsButtonImg - color: optionsButton.hovered ? colors.highlight : colors.buttonText - } - - onClicked: contextMenu.open() - - Menu { - y: optionsButton.height - id: contextMenu - - MenuItem { - text: qsTr("Read receipts") - onTriggered: chat.model.readReceiptsAction(model.id) - } - MenuItem { - text: qsTr("Mark as read") - } - MenuItem { - text: qsTr("View raw message") - onTriggered: chat.model.viewRawMessage(model.id) - } - MenuItem { - text: qsTr("Redact message") - onTriggered: chat.model.redactEvent(model.id) - } - MenuItem { - visible: model.type == MtxEvent.ImageMessage || model.type == MtxEvent.VideoMessage || model.type == MtxEvent.AudioMessage || model.type == MtxEvent.FileMessage || model.type == MtxEvent.Sticker - text: qsTr("Save as") - onTriggered: timelineManager.saveMedia(model.url, model.filename, model.mimetype, model.type) - } - } + DelegateChoice { + roleValue: MtxEvent.VideoMessage + TimelineRow { view: chat; PlayableMediaMessage { id: kid } } } - - Text { - Layout.alignment: Qt.AlignRight | Qt.AlignTop - text: model.timestamp.toLocaleTimeString("HH:mm") - color: inactiveColors.text - - ToolTip.visible: ma.containsMouse - ToolTip.text: Qt.formatDateTime(model.timestamp, Qt.DefaultLocaleLongDate) - - MouseArea{ - id: ma - anchors.fill: parent - hoverEnabled: true - } + DelegateChoice { + roleValue: MtxEvent.AudioMessage + TimelineRow { view: chat; PlayableMediaMessage { id: kid } } + } + DelegateChoice { + roleValue: MtxEvent.Redacted + TimelineRow { view: chat; Redacted { id: kid } } } } + section { property: "section" delegate: Column { |