matrixion/resources/qml/RoomList.qml

791 lines
28 KiB
QML
Raw Normal View History

2021-05-15 00:35:34 +03:00
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
2021-05-15 00:35:34 +03:00
//
// SPDX-License-Identifier: GPL-3.0-or-later
2021-05-28 18:25:46 +03:00
import "./dialogs"
import "./ui"
2021-05-22 16:19:44 +03:00
import Qt.labs.platform 1.1 as Platform
2021-06-13 02:48:11 +03:00
import QtQml 2.12
import QtQuick 2.15
import QtQuick.Controls 2.15
2021-05-15 00:35:34 +03:00
import QtQuick.Layouts 1.3
import im.nheko 1.0
Page {
2021-06-06 00:36:08 +03:00
//leftPadding: Nheko.paddingSmall
//rightPadding: Nheko.paddingSmall
2021-06-08 23:18:51 +03:00
property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 2.3)
property bool collapsed: false
2021-06-06 00:36:08 +03:00
Component {
id: roomDirectoryComponent
RoomDirectory {
}
}
2022-03-26 00:30:19 +03:00
Component {
id: createRoomComponent
CreateRoom {
}
}
2022-03-26 19:28:44 +03:00
Component {
id: createDirectComponent
CreateDirect {
}
}
2021-05-19 20:34:10 +03:00
ListView {
2021-05-21 22:19:03 +03:00
id: roomlist
2021-05-19 20:34:10 +03:00
anchors.left: parent.left
anchors.right: parent.right
height: parent.height
model: Rooms
2021-12-14 06:07:59 +03:00
reuseItems: true
2021-05-19 20:34:10 +03:00
ScrollHelper {
flickable: parent
anchors.fill: parent
}
2021-05-21 22:19:03 +03:00
Connections {
function onCurrentRoomChanged() {
2021-08-11 05:16:27 +03:00
if (Rooms.currentRoom)
roomlist.positionViewAtIndex(Rooms.roomidToIndex(Rooms.currentRoom.roomId), ListView.Contain);
2021-05-21 22:19:03 +03:00
}
target: Rooms
2021-05-21 22:19:03 +03:00
}
2022-05-06 01:36:38 +03:00
Component {
id: roomWindowComponent
ApplicationWindow {
id: roomWindowW
property var room: null
property var roomPreview: null
onActiveChanged: if (active) {MainWindow.activeRoom = (room.roomId || roomPreview.roomid)}
height: 650
width: 420
minimumWidth: 150
minimumHeight: 150
palette: Nheko.colors
color: Nheko.colors.window
title: room.roomName
modality: Qt.NonModal
flags: Qt.Window | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
Shortcut {
sequence: StandardKey.Cancel
onActivated: roomWindowW.close()
}
TimelineView {
anchors.fill: parent
room: roomWindowW.room
roomPreview: roomWindowW.roomPreview.roomid ? roomWindowW.roomPreview : null
}
}
}
2021-05-28 18:25:46 +03:00
Platform.Menu {
id: roomContextMenu
property string roomid
property var tags
function show(roomid_, tags_) {
roomid = roomid_;
tags = tags_;
open();
}
InputDialog {
id: newTag
title: qsTr("New tag")
prompt: qsTr("Enter the tag you want to use:")
onAccepted: function(text) {
Rooms.toggleTag(roomContextMenu.roomid, "u." + text, true);
}
}
2022-05-06 01:36:38 +03:00
Platform.MenuItem {
text: qsTr("Open separately")
onTriggered: {
var roomWindow = roomWindowComponent.createObject(null, {
"room": Rooms.getRoomById(roomContextMenu.roomid),
"roomPreview": Rooms.getRoomPreviewById(roomContextMenu.roomid)
});
roomWindow.showNormal();
destroyOnClose(roomWindow);
}
}
Platform.MenuItem {
text: qsTr("Leave room")
onTriggered: TimelineManager.openLeaveRoomDialog(roomContextMenu.roomid)
2021-05-28 18:25:46 +03:00
}
Platform.MenuSeparator {
text: qsTr("Tag room as:")
2021-05-28 18:25:46 +03:00
}
Instantiator {
2021-06-15 00:40:06 +03:00
model: Communities.tagsWithDefault
2022-05-06 01:36:38 +03:00
onObjectAdded: roomContextMenu.insertItem(index + 3, object)
onObjectRemoved: roomContextMenu.removeItem(object)
2021-05-28 18:25:46 +03:00
delegate: Platform.MenuItem {
property string t: modelData
2021-05-28 18:25:46 +03:00
text: {
switch (t) {
case "m.favourite":
return qsTr("Favourite");
case "m.lowpriority":
return qsTr("Low priority");
case "m.server_notice":
return qsTr("Server notice");
default:
return t.substring(2);
}
}
checkable: true
2021-06-10 00:52:28 +03:00
checked: roomContextMenu.tags !== undefined && roomContextMenu.tags.includes(t)
2021-05-28 18:25:46 +03:00
onTriggered: Rooms.toggleTag(roomContextMenu.roomid, t, checked)
}
}
Platform.MenuItem {
text: qsTr("Create new tag...")
onTriggered: newTag.show()
2021-05-28 18:25:46 +03:00
}
}
delegate: ItemDelegate {
2021-05-21 22:19:03 +03:00
id: roomItem
property color backgroundColor: Nheko.colors.window
2021-05-21 22:19:03 +03:00
property color importantText: Nheko.colors.text
property color unimportantText: Nheko.colors.buttonText
property color bubbleBackground: Nheko.colors.highlight
property color bubbleText: Nheko.colors.highlightedText
required property string roomName
required property string roomId
required property string avatarUrl
required property string time
required property string lastMessage
required property var tags
required property bool isInvite
required property bool isSpace
required property int notificationCount
required property bool hasLoudNotification
required property bool hasUnreadMessages
2021-08-31 03:08:47 +03:00
required property bool isDirect
2021-09-05 03:53:33 +03:00
required property string directChatOtherUserId
2021-05-21 22:19:03 +03:00
Ripple {
color: Qt.rgba(Nheko.colors.dark.r, Nheko.colors.dark.g, Nheko.colors.dark.b, 0.5)
}
2021-06-08 23:18:51 +03:00
height: avatarSize + 2 * Nheko.paddingMedium
2021-05-19 20:34:10 +03:00
width: ListView.view.width
2021-05-21 22:19:03 +03:00
state: "normal"
2021-12-14 06:07:59 +03:00
ToolTip.visible: hovered && collapsed
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: roomName
onClicked: {
console.log("tapped " + roomId);
if (isSpace && Communities.currentTagId != "space:"+roomId)
Communities.currentTagId = "space:"+roomId;
if (!Rooms.currentRoom || Rooms.currentRoom.roomId !== roomId)
Rooms.setCurrentRoom(roomId);
else
Rooms.resetCurrentRoom();
}
onPressAndHold: {
if (!isInvite)
roomContextMenu.show(roomId, tags);
}
2021-05-21 22:19:03 +03:00
states: [
State {
name: "highlight"
when: roomItem.hovered && !((Rooms.currentRoom && roomId == Rooms.currentRoom.roomId) || Rooms.currentRoomPreview.roomid == roomId)
2021-05-21 22:19:03 +03:00
PropertyChanges {
target: roomItem
backgroundColor: Nheko.colors.dark
2021-05-21 22:19:03 +03:00
importantText: Nheko.colors.brightText
unimportantText: Nheko.colors.brightText
bubbleBackground: Nheko.colors.highlight
bubbleText: Nheko.colors.highlightedText
}
2021-05-19 20:34:10 +03:00
2021-05-21 22:19:03 +03:00
},
State {
name: "selected"
2021-07-17 23:16:02 +03:00
when: (Rooms.currentRoom && roomId == Rooms.currentRoom.roomId) || Rooms.currentRoomPreview.roomid == roomId
2021-05-21 22:19:03 +03:00
PropertyChanges {
target: roomItem
backgroundColor: Nheko.colors.highlight
2021-05-21 22:19:03 +03:00
importantText: Nheko.colors.highlightedText
unimportantText: Nheko.colors.highlightedText
bubbleBackground: Nheko.colors.highlightedText
bubbleText: Nheko.colors.highlight
}
}
]
2021-05-19 20:34:10 +03:00
// NOTE(Nico): We want to prevent the touch areas from overlapping. For some reason we need to add 1px of padding for that...
Item {
anchors.fill: parent
anchors.margins: 1
TapHandler {
acceptedButtons: Qt.RightButton
onSingleTapped: {
if (!TimelineManager.isInvite)
roomContextMenu.show(roomId, tags);
}
gesturePolicy: TapHandler.ReleaseWithinBounds
2021-07-31 16:59:19 +03:00
acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus | PointerDevice.TouchPad
}
2021-05-28 18:25:46 +03:00
2021-05-21 22:19:03 +03:00
}
RowLayout {
2021-05-19 20:34:10 +03:00
spacing: Nheko.paddingMedium
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
Avatar {
2021-05-21 22:19:03 +03:00
// In the future we could show an online indicator by setting the userid for the avatar
2021-05-19 20:34:10 +03:00
//userid: Nheko.currentUser.userid
id: avatar
2021-05-28 18:25:46 +03:00
enabled: false
2021-05-19 20:34:10 +03:00
Layout.alignment: Qt.AlignVCenter
2021-06-08 23:18:51 +03:00
height: avatarSize
width: avatarSize
url: avatarUrl.replace("mxc://", "image://MxcImage/")
displayName: roomName
2021-09-05 03:53:33 +03:00
userid: isDirect ? directChatOtherUserId : ""
2021-08-31 03:08:47 +03:00
roomid: roomId
2021-06-08 23:18:51 +03:00
Rectangle {
id: collapsedNotificationBubble
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.margins: -Nheko.paddingSmall
visible: collapsed && notificationCount > 0
2021-06-08 23:18:51 +03:00
enabled: false
Layout.alignment: Qt.AlignRight
height: fontMetrics.averageCharacterWidth * 3
width: Math.max(collapsedBubbleText.width, height)
2021-06-08 23:18:51 +03:00
radius: height / 2
color: hasLoudNotification ? Nheko.theme.red : roomItem.bubbleBackground
2021-06-08 23:18:51 +03:00
Label {
id: collapsedBubbleText
2021-06-08 23:18:51 +03:00
anchors.centerIn: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
width: Math.max(implicitWidth + Nheko.paddingMedium, parent.height)
2021-06-08 23:18:51 +03:00
font.bold: true
font.pixelSize: fontMetrics.font.pixelSize * 0.8
color: hasLoudNotification ? "white" : roomItem.bubbleText
text: notificationCount > 9999 ? "9999+" : notificationCount
}
2021-06-08 23:18:51 +03:00
}
2021-05-19 20:34:10 +03:00
}
ColumnLayout {
id: textContent
2021-06-08 23:18:51 +03:00
visible: !collapsed
2021-05-19 20:34:10 +03:00
Layout.alignment: Qt.AlignLeft
Layout.fillWidth: true
Layout.minimumWidth: 100
width: parent.width - avatar.width
Layout.preferredWidth: parent.width - avatar.width
2022-02-26 18:06:20 +03:00
height: avatar.height
spacing: Nheko.paddingSmall
2021-05-19 20:34:10 +03:00
RowLayout {
2022-02-26 18:06:20 +03:00
Layout.alignment: Qt.AlignTop
2021-05-19 20:34:10 +03:00
Layout.fillWidth: true
spacing: Nheko.paddingSmall
2021-05-19 20:34:10 +03:00
ElidedLabel {
id: rN
Layout.alignment: Qt.AlignBaseline
2021-05-21 22:19:03 +03:00
color: roomItem.importantText
elideWidth: width
fullText: roomName
2021-05-22 11:16:42 +03:00
textFormat: Text.RichText
2021-05-19 20:34:10 +03:00
Layout.fillWidth: true
}
Label {
id: timestamp
2021-06-18 17:22:06 +03:00
visible: !isInvite && !isSpace
2021-06-18 15:10:45 +03:00
width: visible ? 0 : undefined
Layout.alignment: Qt.AlignRight | Qt.AlignBaseline
2021-05-19 20:34:10 +03:00
font.pixelSize: fontMetrics.font.pixelSize * 0.9
2021-05-21 22:19:03 +03:00
color: roomItem.unimportantText
text: time
2021-05-19 20:34:10 +03:00
}
}
RowLayout {
Layout.fillWidth: true
spacing: 0
visible: !isSpace
2021-05-24 15:04:07 +03:00
height: visible ? 0 : undefined
2022-02-26 18:06:20 +03:00
Layout.alignment: Qt.AlignBottom
2021-05-19 20:34:10 +03:00
ElidedLabel {
2021-05-21 22:19:03 +03:00
color: roomItem.unimportantText
2021-05-19 20:34:10 +03:00
font.pixelSize: fontMetrics.font.pixelSize * 0.9
elideWidth: width
fullText: lastMessage
2021-05-22 11:16:42 +03:00
textFormat: Text.RichText
2021-05-19 20:34:10 +03:00
Layout.fillWidth: true
}
Rectangle {
id: notificationBubble
visible: notificationCount > 0
2021-05-19 20:34:10 +03:00
Layout.alignment: Qt.AlignRight
2022-02-26 18:06:20 +03:00
Layout.leftMargin: Nheko.paddingSmall
height: notificationBubbleText.height + Nheko.paddingMedium
Layout.preferredWidth: Math.max(notificationBubbleText.width, height)
2021-05-19 20:34:10 +03:00
radius: height / 2
color: hasLoudNotification ? Nheko.theme.red : roomItem.bubbleBackground
ToolTip.text: notificationCount
ToolTip.delay: Nheko.tooltipDelay
ToolTip.visible: notificationBubbleHover.hovered && (notificationCount > 9999)
2021-05-19 20:34:10 +03:00
Label {
id: notificationBubbleText
2021-05-21 22:19:03 +03:00
anchors.centerIn: parent
2021-05-19 20:34:10 +03:00
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
width: Math.max(implicitWidth + Nheko.paddingMedium, parent.height)
2021-05-21 22:19:03 +03:00
font.bold: true
font.pixelSize: fontMetrics.font.pixelSize * 0.8
color: hasLoudNotification ? "white" : roomItem.bubbleText
text: notificationCount > 9999 ? "9999+" : notificationCount
HoverHandler {
id: notificationBubbleHover
}
2021-05-19 20:34:10 +03:00
}
}
}
}
}
Rectangle {
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
height: parent.height - Nheko.paddingSmall * 2
width: 3
color: Nheko.colors.highlight
visible: hasUnreadMessages
2021-05-19 20:34:10 +03:00
}
background: Rectangle {
color: backgroundColor
}
2021-05-19 20:34:10 +03:00
}
}
2021-05-15 00:35:34 +03:00
background: Rectangle {
color: Nheko.theme.sidebarBackground
}
header: ColumnLayout {
spacing: 0
Pane {
2021-05-22 16:19:44 +03:00
id: userInfoPanel
function openUserProfile() {
Nheko.updateUserProfile();
var userProfile = userProfileComponent.createObject(timelineRoot, {
"profile": Nheko.currentUser
});
userProfile.show();
timelineRoot.destroyOnClose(userProfile);
2021-05-22 16:19:44 +03:00
}
2021-05-15 00:35:34 +03:00
Layout.fillWidth: true
Layout.alignment: Qt.AlignBottom
//Layout.preferredHeight: userInfoGrid.implicitHeight + 2 * Nheko.paddingMedium
padding: Nheko.paddingMedium
2021-05-15 00:35:34 +03:00
Layout.minimumHeight: 40
background: Rectangle {color: Nheko.colors.window}
2021-05-28 18:25:46 +03:00
InputDialog {
2021-05-22 16:19:44 +03:00
id: statusDialog
title: qsTr("Status Message")
2021-05-28 18:25:46 +03:00
prompt: qsTr("Enter your status message:")
onAccepted: function(text) {
Nheko.setStatusMessage(text);
2021-05-22 16:19:44 +03:00
}
}
Platform.Menu {
id: userInfoMenu
Platform.MenuItem {
text: qsTr("Profile settings")
onTriggered: userInfoPanel.openUserProfile()
}
Platform.MenuItem {
text: qsTr("Set status message")
onTriggered: statusDialog.show()
}
}
TapHandler {
2021-06-08 23:18:51 +03:00
margin: -Nheko.paddingSmall
2021-05-22 16:19:44 +03:00
acceptedButtons: Qt.LeftButton
onSingleTapped: userInfoPanel.openUserProfile()
onLongPressed: userInfoMenu.open()
gesturePolicy: TapHandler.ReleaseWithinBounds
}
TapHandler {
2021-06-08 23:18:51 +03:00
margin: -Nheko.paddingSmall
2021-05-22 16:19:44 +03:00
acceptedButtons: Qt.RightButton
onSingleTapped: userInfoMenu.open()
gesturePolicy: TapHandler.ReleaseWithinBounds
}
contentItem: RowLayout {
2021-05-15 00:35:34 +03:00
id: userInfoGrid
property var profile: Nheko.currentUser
2021-05-15 00:35:34 +03:00
spacing: Nheko.paddingMedium
Avatar {
id: avatar
Layout.alignment: Qt.AlignVCenter
2021-05-19 20:34:10 +03:00
Layout.preferredWidth: fontMetrics.lineSpacing * 2
Layout.preferredHeight: fontMetrics.lineSpacing * 2
url: (userInfoGrid.profile ? userInfoGrid.profile.avatarUrl : "").replace("mxc://", "image://MxcImage/")
displayName: userInfoGrid.profile ? userInfoGrid.profile.displayName : ""
userid: userInfoGrid.profile ? userInfoGrid.profile.userid : ""
2021-08-03 14:20:36 +03:00
enabled: false
2021-05-15 00:35:34 +03:00
}
ColumnLayout {
id: col
2021-06-08 23:18:51 +03:00
visible: !collapsed
2021-05-15 00:35:34 +03:00
Layout.alignment: Qt.AlignLeft
Layout.fillWidth: true
2021-05-19 20:34:10 +03:00
width: parent.width - avatar.width - logoutButton.width - Nheko.paddingMedium * 2
Layout.preferredWidth: parent.width - avatar.width - logoutButton.width - Nheko.paddingMedium * 2
2021-05-15 00:35:34 +03:00
spacing: 0
2021-05-19 20:34:10 +03:00
ElidedLabel {
2021-05-15 00:35:34 +03:00
Layout.alignment: Qt.AlignBottom
font.pointSize: fontMetrics.font.pointSize * 1.1
font.weight: Font.DemiBold
fullText: userInfoGrid.profile ? userInfoGrid.profile.displayName : ""
2021-05-19 20:34:10 +03:00
elideWidth: col.width
2021-05-15 00:35:34 +03:00
}
2021-05-19 20:34:10 +03:00
ElidedLabel {
2021-05-15 00:35:34 +03:00
Layout.alignment: Qt.AlignTop
color: Nheko.colors.buttonText
font.pointSize: fontMetrics.font.pointSize * 0.9
2021-05-19 20:34:10 +03:00
elideWidth: col.width
fullText: userInfoGrid.profile ? userInfoGrid.profile.userid : ""
2021-05-15 00:35:34 +03:00
}
}
Item {
}
ImageButton {
id: logoutButton
2021-06-08 23:18:51 +03:00
visible: !collapsed
2021-05-15 00:35:34 +03:00
Layout.alignment: Qt.AlignVCenter
Layout.preferredWidth: fontMetrics.lineSpacing * 2
Layout.preferredHeight: fontMetrics.lineSpacing * 2
2021-11-14 04:23:10 +03:00
image: ":/icons/icons/ui/power-off.svg"
2021-05-15 00:35:34 +03:00
ToolTip.visible: hovered
ToolTip.delay: Nheko.tooltipDelay
2021-05-15 00:35:34 +03:00
ToolTip.text: qsTr("Logout")
2021-05-30 13:41:44 +03:00
onClicked: Nheko.openLogoutDialog()
2021-05-15 00:35:34 +03:00
}
}
}
Rectangle {
color: Nheko.theme.separator
height: 2
Layout.fillWidth: true
}
Rectangle {
id: unverifiedStuffBubble
color: Qt.lighter(Nheko.theme.orange, verifyButtonHovered.hovered ? 1.2 : 1)
Layout.fillWidth: true
implicitHeight: explanation.height + Nheko.paddingMedium * 2
visible: SelfVerificationStatus.status != SelfVerificationStatus.AllVerified
RowLayout {
id: unverifiedStuffBubbleContainer
width: parent.width
height: explanation.height + Nheko.paddingMedium * 2
spacing: 0
Label {
id: explanation
Layout.margins: Nheko.paddingMedium
Layout.rightMargin: Nheko.paddingSmall
color: Nheko.colors.buttonText
Layout.fillWidth: true
text: {
switch (SelfVerificationStatus.status) {
case SelfVerificationStatus.NoMasterKey:
//: Cross-signing setup has not run yet.
return qsTr("Encryption not set up");
case SelfVerificationStatus.UnverifiedMasterKey:
//: The user just signed in with this device and hasn't verified their master key.
return qsTr("Unverified login");
case SelfVerificationStatus.UnverifiedDevices:
//: There are unverified devices signed in to this account.
return qsTr("Please verify your other devices");
default:
return "";
}
}
textFormat: Text.PlainText
wrapMode: Text.Wrap
}
ImageButton {
id: closeUnverifiedBubble
Layout.rightMargin: Nheko.paddingMedium
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
hoverEnabled: true
width: fontMetrics.font.pixelSize
height: fontMetrics.font.pixelSize
2021-11-14 04:23:10 +03:00
image: ":/icons/icons/ui/dismiss.svg"
ToolTip.visible: closeUnverifiedBubble.hovered
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: qsTr("Close")
onClicked: unverifiedStuffBubble.visible = false
}
}
HoverHandler {
id: verifyButtonHovered
enabled: !closeUnverifiedBubble.hovered
acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus | PointerDevice.TouchPad
}
TapHandler {
enabled: !closeUnverifiedBubble.hovered
acceptedButtons: Qt.LeftButton
onSingleTapped: {
if (SelfVerificationStatus.status == SelfVerificationStatus.UnverifiedDevices)
SelfVerificationStatus.verifyUnverifiedDevices();
else
SelfVerificationStatus.statusChanged();
}
}
}
Rectangle {
color: Nheko.theme.separator
height: 1
Layout.fillWidth: true
visible: unverifiedStuffBubble.visible
}
2021-05-15 00:35:34 +03:00
}
footer: ColumnLayout {
spacing: 0
Rectangle {
color: Nheko.theme.separator
height: 1
Layout.fillWidth: true
}
Pane {
2021-05-15 00:35:34 +03:00
Layout.fillWidth: true
Layout.alignment: Qt.AlignBottom
Layout.minimumHeight: 40
horizontalPadding: Nheko.paddingMedium
verticalPadding: 0
2021-05-15 00:35:34 +03:00
background: Rectangle {color: Nheko.colors.window}
contentItem: RowLayout {
id: buttonRow
2021-05-15 00:35:34 +03:00
ImageButton {
2021-06-13 04:18:31 +03:00
Layout.fillWidth: true
2021-05-15 00:35:34 +03:00
hoverEnabled: true
width: 22
height: 22
2021-11-14 04:23:10 +03:00
image: ":/icons/icons/ui/add-square-button.svg"
2021-05-15 00:35:34 +03:00
ToolTip.visible: hovered
ToolTip.delay: Nheko.tooltipDelay
2021-05-15 00:35:34 +03:00
ToolTip.text: qsTr("Start a new chat")
Layout.margins: Nheko.paddingMedium
2021-05-30 13:41:44 +03:00
onClicked: roomJoinCreateMenu.open(parent)
Platform.Menu {
id: roomJoinCreateMenu
Platform.MenuItem {
text: qsTr("Join a room")
onTriggered: Nheko.openJoinRoomDialog()
}
Platform.MenuItem {
text: qsTr("Create a new room")
2022-03-26 00:30:19 +03:00
onTriggered: {
var createRoom = createRoomComponent.createObject(timelineRoot);
createRoom.show();
timelineRoot.destroyOnClose(createRoom);
}
2021-05-30 13:41:44 +03:00
}
2022-03-26 19:28:44 +03:00
Platform.MenuItem {
text: qsTr("Start a direct chat")
onTriggered: {
var createDirect = createDirectComponent.createObject(timelineRoot);
createDirect.show();
timelineRoot.destroyOnClose(createDirect);
}
}
2021-05-30 13:41:44 +03:00
}
2021-05-15 00:35:34 +03:00
}
ImageButton {
2021-06-08 23:18:51 +03:00
visible: !collapsed
2021-06-13 04:18:31 +03:00
Layout.fillWidth: true
2021-05-15 00:35:34 +03:00
hoverEnabled: true
width: 22
height: 22
2021-11-14 04:23:10 +03:00
image: ":/icons/icons/ui/speech-bubbles.svg"
2021-05-15 00:35:34 +03:00
ToolTip.visible: hovered
ToolTip.delay: Nheko.tooltipDelay
2021-05-15 00:35:34 +03:00
ToolTip.text: qsTr("Room directory")
Layout.margins: Nheko.paddingMedium
onClicked: {
var win = roomDirectoryComponent.createObject(timelineRoot);
win.show();
timelineRoot.destroyOnClose(win);
}
2021-05-15 00:35:34 +03:00
}
2022-02-18 23:06:28 +03:00
ImageButton {
visible: !collapsed
Layout.fillWidth: true
hoverEnabled: true
ripple: false
width: 22
height: 22
image: ":/icons/icons/ui/search.svg"
ToolTip.visible: hovered
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: qsTr("Search rooms (Ctrl+K)")
Layout.margins: Nheko.paddingMedium
onClicked: {
var quickSwitch = quickSwitcherComponent.createObject(timelineRoot);
quickSwitch.open();
timelineRoot.destroyOnClose(quickSwitch);
2022-02-18 23:06:28 +03:00
}
}
2021-05-15 00:35:34 +03:00
ImageButton {
2021-06-08 23:18:51 +03:00
visible: !collapsed
2021-06-13 04:18:31 +03:00
Layout.fillWidth: true
2021-05-15 00:35:34 +03:00
hoverEnabled: true
2022-01-09 02:28:03 +03:00
ripple: false
2021-05-15 00:35:34 +03:00
width: 22
height: 22
2021-11-14 04:23:10 +03:00
image: ":/icons/icons/ui/settings.svg"
2021-05-15 00:35:34 +03:00
ToolTip.visible: hovered
ToolTip.delay: Nheko.tooltipDelay
2021-05-15 00:35:34 +03:00
ToolTip.text: qsTr("User settings")
Layout.margins: Nheko.paddingMedium
2022-01-09 02:28:03 +03:00
onClicked: mainWindow.push(userSettingsPage);
2021-05-15 00:35:34 +03:00
}
}
}
}
}