// SPDX-FileCopyrightText: Nheko Contributors // // SPDX-License-Identifier: GPL-3.0-or-later import "./components" import "./delegates" import "./emoji" import "./ui" import "./dialogs" import Qt.labs.platform 1.1 as Platform import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.2 import QtQuick.Window 2.13 import im.nheko 1.0 EventDelegateChooser { id: wrapper required property bool isStateEvent EventDelegateChoice { roleValues: [MtxEvent.TextMessage, MtxEvent.NoticeMessage, MtxEvent.ElementEffectMessage, MtxEvent.UnknownMessage,] TextMessage { required property string formattedBody required property int type required property string userId required property string userName Layout.fillWidth: true //Layout.maximumWidth: implicitWidth color: type == MtxEvent.NoticeMessage ? palette.buttonText : palette.text font.italic: type == MtxEvent.NoticeMessage formatted: formattedBody keepFullText: true } } EventDelegateChoice { roleValues: [MtxEvent.EmoteMessage,] TextMessage { required property string formattedBody required property string userId required property string userName Layout.fillWidth: true //Layout.maximumWidth: implicitWidth color: TimelineManager.userColor(userId, palette.base) font.italic: true formatted: TimelineManager.escapeEmoji(userName) + " " + formattedBody keepFullText: true } } EventDelegateChoice { roleValues: [MtxEvent.CanonicalAlias, MtxEvent.ServerAcl, MtxEvent.Name, MtxEvent.Topic, MtxEvent.Avatar, MtxEvent.PinnedEvents, MtxEvent.ImagePackInRoom, MtxEvent.SpaceParent, MtxEvent.RoomCreate, MtxEvent.PowerLevels, MtxEvent.PolicyRuleUser, MtxEvent.PolicyRuleRoom, MtxEvent.PolicyRuleServer, MtxEvent.RoomJoinRules, MtxEvent.RoomHistoryVisibility, MtxEvent.RoomGuestAccess,] TextMessage { required property string formattedStateEvent required property string userId required property string userName Layout.fillWidth: true //Layout.maximumWidth: implicitWidth body: '' color: palette.buttonText font.italic: true formatted: '' horizontalAlignment: Text.AlignHCenter isOnlyEmoji: false keepFullText: true text: formattedStateEvent } } EventDelegateChoice { roleValues: [MtxEvent.CallInvite,] TextMessage { required property string callType required property string userId required property string userName Layout.fillWidth: true body: formatted color: palette.buttonText font.italic: true formatted: { switch (callType) { case "voice": return qsTr("%1 placed a voice call.").arg(TimelineManager.escapeEmoji(userName)); case "video": return qsTr("%1 placed a video call.").arg(TimelineManager.escapeEmoji(userName)); default: return qsTr("%1 placed a call.").arg(TimelineManager.escapeEmoji(userName)); } } isOnlyEmoji: false keepFullText: true } } EventDelegateChoice { roleValues: [MtxEvent.CallAnswer, MtxEvent.CallReject, MtxEvent.CallSelectAnswer, MtxEvent.CallHangUp, MtxEvent.CallCandidates, MtxEvent.CallNegotiate,] TextMessage { required property int type required property string userId required property string userName Layout.fillWidth: true body: formatted color: palette.buttonText font.italic: true formatted: { switch (type) { case MtxEvent.CallAnswer: return qsTr("%1 answered the call.").arg(TimelineManager.escapeEmoji(userName)); case MtxEvent.CallReject: return qsTr("%1 rejected the call.").arg(TimelineManager.escapeEmoji(userName)); case MtxEvent.CallSelectAnswer: return qsTr("%1 selected answer.").arg(TimelineManager.escapeEmoji(userName)); case MtxEvent.CallHangUp: return qsTr("%1 ended the call.").arg(TimelineManager.escapeEmoji(userName)); case MtxEvent.CallCandidates: return qsTr("%1 is negotiating the call...").arg(TimelineManager.escapeEmoji(userName)); case MtxEvent.CallNegotiate: return qsTr("%1 is negotiating the call...").arg(TimelineManager.escapeEmoji(userName)); } } isOnlyEmoji: false keepFullText: true } } EventDelegateChoice { roleValues: [MtxEvent.ImageMessage, MtxEvent.Sticker,] ImageMessage { Layout.fillWidth: true Layout.maximumWidth: tempWidth containerHeight: timelineView.height } } EventDelegateChoice { roleValues: [MtxEvent.FileMessage,] FileMessage { Layout.fillWidth: true } } EventDelegateChoice { roleValues: [MtxEvent.VideoMessage, MtxEvent.AudioMessage,] PlayableMediaMessage { Layout.fillWidth: true } } EventDelegateChoice { roleValues: [MtxEvent.Encrypted,] Encrypted { Layout.fillWidth: true } } EventDelegateChoice { roleValues: [MtxEvent.Encryption,] EncryptionEnabled { Layout.fillWidth: true } } EventDelegateChoice { roleValues: [MtxEvent.Redacted] Redacted { required property string userId required property string userName Layout.fillWidth: true } } EventDelegateChoice { roleValues: [MtxEvent.Member] ColumnLayout { id: member required property string formattedStateEvent required property bool isReply required property Room room required property string userId required property string userName NoticeMessage { Layout.fillWidth: true body: formatted formatted: member.formattedStateEvent isOnlyEmoji: false isReply: member.isReply isStateEvent: true keepFullText: true } Button { Layout.alignment: Qt.AlignHCenter text: qsTr("Allow them in") visible: room.showAcceptKnockButton(eventId) onClicked: room.acceptKnock(member.eventId) } } } EventDelegateChoice { roleValues: [MtxEvent.Tombstone] ColumnLayout { id: tombstone required property string body required property string eventId required property bool isReply required property Room room required property string userId required property string userName NoticeMessage { Layout.fillWidth: true body: formatted formatted: qsTr("This room was replaced for the following reason: %1").arg(tombstone.body) isOnlyEmoji: false isReply: tombstone.isReply isStateEvent: true keepFullText: true } Button { Layout.alignment: Qt.AlignHCenter text: qsTr("Go to replacement room") onClicked: tombstone.room.joinReplacementRoom(tombstone.eventId) } } } EventDelegateChoice { roleValues: [] MatrixText { required property string typeString required property string userId required property string userName Layout.fillWidth: true text: "Unsupported: " + typeString } } }