From 4b3dac025fbf2b8aee2208c5f92f087bb3368dc5 Mon Sep 17 00:00:00 2001 From: James Graham Date: Sat, 5 Aug 2023 16:50:06 +0000 Subject: [PATCH] Declare currentRoom property Make sure `currentRoom` is a property for every qml component where it's used in `chatbar`. --- src/qml/Component/ChatBox/ChatBar.qml | 52 +++++++++++++------------ src/qml/Component/ChatBox/ChatBox.qml | 2 +- src/qml/Component/Emoji/EmojiPicker.qml | 9 ++++- src/qml/Component/HoverActions.qml | 7 ++++ src/qml/Component/TimelineView.qml | 1 + src/qml/Dialog/EmojiDialog.qml | 6 +++ src/qml/Page/RoomPage.qml | 12 +++--- 7 files changed, 55 insertions(+), 34 deletions(-) diff --git a/src/qml/Component/ChatBox/ChatBar.qml b/src/qml/Component/ChatBox/ChatBar.qml index fd7d407aa..fb7e29c48 100644 --- a/src/qml/Component/ChatBox/ChatBar.qml +++ b/src/qml/Component/ChatBox/ChatBar.qml @@ -36,7 +36,7 @@ QQC2.Control { /** * @brief The current room that user is viewing. */ - property NeoChatRoom currentRoom + required property NeoChatRoom currentRoom /** * @brief The QQC2.TextArea object. @@ -55,10 +55,10 @@ QQC2.Control { Kirigami.Action { id: attachmentAction - property bool isBusy: currentRoom && currentRoom.hasFileUploading + property bool isBusy: root.currentRoom && root.currentRoom.hasFileUploading // Matrix does not allow sending attachments in replies - visible: currentRoom.chatBoxReplyId.length === 0 && currentRoom.chatBoxAttachmentPath.length === 0 + visible: root.currentRoom.chatBoxReplyId.length === 0 && root.currentRoom.chatBoxAttachmentPath.length === 0 icon.name: "mail-attachment" text: i18n("Attach an image or file") displayHint: Kirigami.DisplayHint.IconOnly @@ -72,7 +72,7 @@ QQC2.Control { if (!path) { return; } - currentRoom.chatBoxAttachmentPath = path; + root.currentRoom.chatBoxAttachmentPath = path; }) fileDialog.open() } @@ -106,7 +106,7 @@ QQC2.Control { displayHint: QQC2.AbstractButton.IconOnly onTriggered: { - locationChooserComponent.createObject(QQC2.ApplicationWindow.overlay, {room: currentRoom}).open() + locationChooserComponent.createObject(QQC2.ApplicationWindow.overlay, {room: root.currentRoom}).open() } }, Kirigami.Action { @@ -162,10 +162,10 @@ QQC2.Control { leftPadding: LayoutMirroring.enabled ? actionsRow.width : Kirigami.Units.largeSpacing rightPadding: LayoutMirroring.enabled ? Kirigami.Units.largeSpacing : actionsRow.width + x * 2 + Kirigami.Units.largeSpacing * 2 - placeholderText: readOnly ? i18n("This room is encrypted. Build libQuotient with encryption enabled to send encrypted messages.") : currentRoom.usesEncryption ? i18n("Send an encrypted message…") : currentRoom.chatBoxAttachmentPath.length > 0 ? i18n("Set an attachment caption...") : i18n("Send a message…") + placeholderText: readOnly ? i18n("This room is encrypted. Build libQuotient with encryption enabled to send encrypted messages.") : root.currentRoom.usesEncryption ? i18n("Send an encrypted message…") : root.currentRoom.chatBoxAttachmentPath.length > 0 ? i18n("Set an attachment caption...") : i18n("Send a message…") verticalAlignment: TextEdit.AlignVCenter wrapMode: Text.Wrap - readOnly: (currentRoom.usesEncryption && !Controller.encryptionSupported) + readOnly: (root.currentRoom.usesEncryption && !Controller.encryptionSupported) Accessible.description: placeholderText @@ -177,10 +177,10 @@ QQC2.Control { onTextChanged: { if (!repeatTimer.running && Config.typingNotifications) { var textExists = text.length > 0 - currentRoom.sendTypingNotification(textExists) + root.currentRoom.sendTypingNotification(textExists) textExists ? repeatTimer.start() : repeatTimer.stop() } - currentRoom.chatBoxText = text + root.currentRoom.chatBoxText = text } onCursorRectangleChanged: chatBarScrollView.ensureVisible(cursorRectangle) onSelectedTextChanged: { @@ -207,7 +207,7 @@ QQC2.Control { remove(cursorPosition, cursorPosition + 1) } if (textField.text == selectedText || textField.text.length <= 1) { - currentRoom.sendTypingNotification(false) + root.currentRoom.sendTypingNotification(false) repeatTimer.stop() } if (quickFormatBar.visible) { @@ -241,16 +241,16 @@ QQC2.Control { if (event.key === Qt.Key_V && event.modifiers & Qt.ControlModifier) { root.pasteImage(); } else if (event.key === Qt.Key_Up && event.modifiers & Qt.ControlModifier) { - currentRoom.replyLastMessage(); + root.currentRoom.replyLastMessage(); } else if (event.key === Qt.Key_Up && textField.text.length === 0) { - currentRoom.editLastMessage(); + root.currentRoom.editLastMessage(); } else if (event.key === Qt.Key_Up && completionMenu.visible) { completionMenu.decrementIndex() } else if (event.key === Qt.Key_Down && completionMenu.visible) { completionMenu.incrementIndex() } else if (event.key === Qt.Key_Backspace) { if (textField.text == selectedText || textField.text.length <= 1) { - currentRoom.sendTypingNotification(false) + root.currentRoom.sendTypingNotification(false) repeatTimer.stop() } if (quickFormatBar.visible && selectedText.length > 0) { @@ -282,19 +282,19 @@ QQC2.Control { Component { id: replyPane ReplyPane { - userName: currentRoom.chatBoxReplyUser.displayName - userColor: currentRoom.chatBoxReplyUser.color - userAvatar: currentRoom.chatBoxReplyUser.avatarSource - text: currentRoom.chatBoxReplyMessage + userName: root.currentRoom.chatBoxReplyUser.displayName + userColor: root.currentRoom.chatBoxReplyUser.color + userAvatar: root.currentRoom.chatBoxReplyUser.avatarSource + text: root.currentRoom.chatBoxReplyMessage } } Component { id: attachmentPane AttachmentPane { - attachmentPath: currentRoom.chatBoxAttachmentPath + attachmentPath: root.currentRoom.chatBoxAttachmentPath onAttachmentCancelled: { - currentRoom.chatBoxAttachmentPath = ""; + root.currentRoom.chatBoxAttachmentPath = ""; root.forceActiveFocus() } } @@ -346,8 +346,8 @@ QQC2.Control { text: i18nc("@action:button", "Cancel reply") icon.name: "dialog-close" onTriggered: { - currentRoom.chatBoxReplyId = ""; - currentRoom.chatBoxAttachmentPath = ""; + root.currentRoom.chatBoxReplyId = ""; + root.currentRoom.chatBoxAttachmentPath = ""; root.forceActiveFocus() } } @@ -388,7 +388,7 @@ QQC2.Control { PieProgressBar { visible: modelData.isBusy - progress: currentRoom.fileUploadingProgress + progress: root.currentRoom.fileUploadingProgress } } } @@ -403,6 +403,8 @@ QQC2.Control { includeCustom: true closeOnChosen: false + currentRoom: root.currentRoom + onChosen: insertText(emoji) onClosed: if (emojiButton.checked) emojiButton.checked = false } @@ -468,15 +470,15 @@ QQC2.Control { if (localPath.length === 0) { return; } - currentRoom.chatBoxAttachmentPath = localPath + root.currentRoom.chatBoxAttachmentPath = localPath } function postMessage() { actionsHandler.handleNewMessage(); repeatTimer.stop() - currentRoom.markAllMessagesAsRead(); + root.currentRoom.markAllMessagesAsRead(); textField.clear(); - currentRoom.chatBoxReplyId = ""; + root.currentRoom.chatBoxReplyId = ""; messageSent() } diff --git a/src/qml/Component/ChatBox/ChatBox.qml b/src/qml/Component/ChatBox/ChatBox.qml index 2d889f32c..87983f9f9 100644 --- a/src/qml/Component/ChatBox/ChatBox.qml +++ b/src/qml/Component/ChatBox/ChatBox.qml @@ -35,7 +35,7 @@ ColumnLayout { /** * @brief The current room that user is viewing. */ - property NeoChatRoom currentRoom + required property NeoChatRoom currentRoom /** * @brief A message has been sent from the chat bar. diff --git a/src/qml/Component/Emoji/EmojiPicker.qml b/src/qml/Component/Emoji/EmojiPicker.qml index 419da680e..9f177096e 100644 --- a/src/qml/Component/Emoji/EmojiPicker.qml +++ b/src/qml/Component/Emoji/EmojiPicker.qml @@ -10,6 +10,11 @@ import org.kde.neochat 1.0 ColumnLayout { id: root + /** + * @brief The current room that user is viewing. + */ + property NeoChatRoom currentRoom + property bool includeCustom: false property bool showQuickReaction: false @@ -151,7 +156,7 @@ ColumnLayout { ImagePacksModel { id: stickerPackModel - room: currentRoom + room: root.currentRoom showStickers: true showEmoticons: false } @@ -160,7 +165,7 @@ ColumnLayout { id: stickerModel model: stickerPackModel packIndex: 0 - room: currentRoom + room: root.currentRoom } EmoticonFilterModel { diff --git a/src/qml/Component/HoverActions.qml b/src/qml/Component/HoverActions.qml index aebf5ce43..061e7241e 100644 --- a/src/qml/Component/HoverActions.qml +++ b/src/qml/Component/HoverActions.qml @@ -6,6 +6,7 @@ import QtQuick.Controls 2.15 as QQC2 import QtQuick.Layouts 1.15 import org.kde.kirigami 2.15 as Kirigami +import org.kde.neochat 1.0 /** * @brief A component that provides a set of actions when a message is hovered in the timeline. @@ -16,6 +17,11 @@ import org.kde.kirigami 2.15 as Kirigami QQC2.Control { id: root + /** + * @brief The current room that user is viewing. + */ + required property NeoChatRoom currentRoom + /** * @brief Whether the actions should be shown. */ @@ -108,6 +114,7 @@ QQC2.Control { EmojiDialog { id: emojiDialog + currentRoom: root.currentRoom showQuickReaction: true onChosen: (emoji) => root.reactClicked(emoji) } diff --git a/src/qml/Component/TimelineView.qml b/src/qml/Component/TimelineView.qml index fa3b54d4a..cc87d05aa 100644 --- a/src/qml/Component/TimelineView.qml +++ b/src/qml/Component/TimelineView.qml @@ -310,6 +310,7 @@ QQC2.ScrollView { y: delegate ? delegate.mapToItem(parent, 0, 0).y + delegate.bubbleY - height + Kirigami.Units.smallSpacing : 0 width: delegate ? delegate.bubbleWidth : Kirigami.Units.gridUnit * 4 + currentRoom: root.currentRoom showActions: delegate && delegate.hovered verified: delegate && delegate.verified editable: delegate && delegate.author.isLocalUser && (delegate.delegateType === MessageEventModel.Emote || delegate.delegateType === MessageEventModel.Message) diff --git a/src/qml/Dialog/EmojiDialog.qml b/src/qml/Dialog/EmojiDialog.qml index 593d79634..195d7bce4 100644 --- a/src/qml/Dialog/EmojiDialog.qml +++ b/src/qml/Dialog/EmojiDialog.qml @@ -11,6 +11,11 @@ import org.kde.neochat 1.0 QQC2.Popup { id: emojiPopup + /** + * @brief The current room that user is viewing. + */ + property NeoChatRoom currentRoom + property bool includeCustom: false property bool closeOnChosen: true property bool showQuickReaction: false @@ -52,6 +57,7 @@ QQC2.Popup { contentItem: EmojiPicker { id: emojiPicker height: 400 + currentRoom: root.currentRoom includeCustom: emojiPopup.includeCustom showQuickReaction: emojiPopup.showQuickReaction onChosen: { diff --git a/src/qml/Page/RoomPage.qml b/src/qml/Page/RoomPage.qml index 45f5fa1fa..4fafa3ba7 100644 --- a/src/qml/Page/RoomPage.qml +++ b/src/qml/Page/RoomPage.qml @@ -25,7 +25,7 @@ Kirigami.Page { /// Disable cancel shortcut. Used by the separate window since it provides its own cancel implementation. property bool disableCancelShortcut: false - title: currentRoom.displayName + title: root.currentRoom.displayName focus: true padding: 0 @@ -66,7 +66,7 @@ Kirigami.Page { Loader { id: timelineViewLoader anchors.fill: parent - active: currentRoom && !currentRoom.isInvite && !root.loading + active: root.currentRoom && !root.currentRoom.isInvite && !root.loading sourceComponent: TimelineView { id: timelineView currentRoom: root.currentRoom @@ -80,7 +80,7 @@ Kirigami.Page { Loader { id: invitationLoader - active: currentRoom && currentRoom.isInvite + active: root.currentRoom && root.currentRoom.isInvite anchors.centerIn: parent sourceComponent: InvitationView { currentRoom: root.currentRoom @@ -106,7 +106,7 @@ Kirigami.Page { sourceComponent: ChatBox { id: chatBox width: parent.width - currentRoom: currentRoom + currentRoom: root.currentRoom onMessageSent: { if (!timelineViewLoader.item.atYEnd) { timelineViewLoader.item.goToLastMessage(); @@ -140,9 +140,9 @@ Kirigami.Page { Shortcut { sequence: StandardKey.Cancel onActivated: { - if (!timelineViewLoader.item.atYEnd || currentRoom.hasUnreadMessages) { + if (!timelineViewLoader.item.atYEnd || root.currentRoom.hasUnreadMessages) { goToLastMessage(); - currentRoom.markAllMessagesAsRead(); + root.currentRoom.markAllMessagesAsRead(); } else { applicationWindow().pageStack.get(0).forceActiveFocus(); }