moment/src/gui/MainPane/Room.qml

183 lines
5.5 KiB
QML
Raw Normal View History

2019-12-19 22:46:16 +11:00
// SPDX-License-Identifier: LGPL-3.0-or-later
2019-07-13 07:06:37 +10:00
import QtQuick 2.12
import QtQuick.Layouts 1.12
2019-12-28 00:06:42 +11:00
import Clipboard 0.1
import ".."
import "../Base"
2019-03-22 14:28:14 +11:00
HTileDelegate {
spacing: theme.spacing
2019-12-11 06:17:41 +11:00
backgroundColor: theme.mainPane.room.background
opacity: model.left ? theme.mainPane.room.leftRoomOpacity : 1
image: HRoomAvatar {
displayName: model.display_name
mxc: model.avatar_url
}
2019-12-11 06:17:41 +11:00
title.color: theme.mainPane.room.name
title.text: model.display_name || qsTr("Empty room")
additionalInfo.children: HIcon {
svgName: "invite-received"
2019-08-29 08:21:13 +10:00
colorize: theme.colors.alertBackground
Layout.maximumWidth: invited ? implicitWidth : 0
Behavior on Layout.maximumWidth { HNumberAnimation {} }
}
2019-12-11 06:17:41 +11:00
subtitle.color: theme.mainPane.room.subtitle
subtitle.textFormat: Text.StyledText
subtitle.font.italic:
lastEvent && lastEvent.event_type === "RoomMessageEmote"
subtitle.text: {
if (! lastEvent) return ""
const isEmote = lastEvent.event_type === "RoomMessageEmote"
const isMsg = lastEvent.event_type.startsWith("RoomMessage")
const isUnknownMsg = lastEvent.event_type === "RoomMessageUnknown"
const isCryptMedia = lastEvent.event_type.startsWith("RoomEncrypted")
// If it's a general event
if (isEmote || isUnknownMsg || (! isMsg && ! isCryptMedia))
return utils.processedEventText(lastEvent)
const text = utils.coloredNameHtml(
lastEvent.sender_name, lastEvent.sender_id
) + ": " + lastEvent.inline_content
return text.replace(
/< *span +class=['"]?quote['"]? *>(.+?)<\/ *span *>/g,
2019-12-11 06:17:41 +11:00
`<font color="${theme.mainPane.room.subtitleQuote}">$1</font>`,
)
2019-03-22 14:28:14 +11:00
}
rightInfo.color: theme.mainPane.room.lastEventDate
rightInfo.text: {
model.last_event_date < new Date(1) ?
"" :
utils.dateIsToday(model.last_event_date) ?
utils.formatTime(model.last_event_date, false) : // no seconds
model.last_event_date.getFullYear() === new Date().getFullYear() ?
Qt.formatDate(model.last_event_date, "d MMM") : // e.g. "5 Dec"
// model.last_event_date.getFullYear() ?
Qt.formatDate(model.last_event_date, "MMM yyyy") // e.g. "Jan 2020"
}
contextMenu: HMenu {
HMenuItemPopupSpawner {
visible: joined
enabled: model.can_invite
icon.name: "room-send-invite"
text: qsTr("Invite members")
popup: "Popups/InviteToRoomPopup.qml"
properties: ({
userId: userId,
roomId: model.id,
roomName: model.display_name,
invitingAllowed: Qt.binding(() => model.can_invite)
})
}
2019-12-12 23:32:50 +11:00
HMenuItem {
icon.name: "copy-room-id"
text: qsTr("Copy room ID")
onTriggered: Clipboard.text = model.id
2019-12-12 23:32:50 +11:00
}
2019-08-22 06:38:34 +10:00
HMenuItem {
visible: invited
icon.name: "invite-accept"
2019-08-29 08:21:13 +10:00
icon.color: theme.colors.positiveBackground
text: qsTr("Accept %1's invite").arg(utils.coloredNameHtml(
model.inviter_name, model.inviter_id
2019-08-22 06:38:34 +10:00
))
label.textFormat: Text.StyledText
onTriggered: py.callClientCoro(
userId, "join", [model.id]
2019-08-22 06:38:34 +10:00
)
}
HMenuItemPopupSpawner {
visible: invited || joined
2019-08-22 06:23:22 +10:00
icon.name: invited ? "invite-decline" : "room-leave"
2019-08-29 08:21:13 +10:00
icon.color: theme.colors.negativeBackground
2019-08-22 06:23:22 +10:00
text: invited ? qsTr("Decline invite") : qsTr("Leave")
2019-08-22 06:38:34 +10:00
popup: "Popups/LeaveRoomPopup.qml"
properties: ({
userId: userId,
roomId: model.id,
roomName: model.display_name,
})
}
HMenuItemPopupSpawner {
icon.name: "room-forget"
2019-08-29 08:21:13 +10:00
icon.color: theme.colors.negativeBackground
text: qsTr("Forget")
2019-08-22 06:38:34 +10:00
popup: "Popups/ForgetRoomPopup.qml"
autoDestruct: false
properties: ({
userId: userId,
roomId: model.id,
roomName: model.display_name,
})
}
}
onActivated: {
becomeSelected()
pageLoader.showRoom(userId, model.id)
}
property string userId
readonly property bool joined: ! invited && ! parted
readonly property bool invited: model.inviter_id && ! parted
readonly property bool parted: model.left
readonly property ListModel eventModel:
ModelStore.get(userId, model.id, "events")
readonly property QtObject lastEvent:
eventModel.count > 0 ? eventModel.get(0) : null
readonly property bool shouldBeSelected:
window.uiState.page === "Pages/Chat/Chat.qml" &&
window.uiState.pageProperties.userId === userId &&
window.uiState.pageProperties.roomId === model.id
function becomeSelected() {
mainPaneList.currentIndex = accountRooms.listIndex
roomList.currentIndex = index
}
Behavior on opacity { HNumberAnimation {} }
// Trying to set the current item to ourself usually won't work from the
// first time, when this delegate is being initialized
Timer {
interval: 100
repeat: true
running:
shouldBeSelected &&
mainPaneList.currentIndex === -1 &&
roomList.currentIndex === -1
triggeredOnStart: true
onTriggered: becomeSelected()
}
2019-03-22 14:28:14 +11:00
}