diff --git a/autotests/chatkeyhelpertest.qml b/autotests/chatkeyhelpertest.qml index 92043a47c..1f6531128 100644 --- a/autotests/chatkeyhelpertest.qml +++ b/autotests/chatkeyhelpertest.qml @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2024 Carl Schwan -// SPDX-License-Identifier: LGPL-2.0-or-later +// SPDX-FileCopyrightText: 2026 James Graham +// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL import QtQuick import QtTest diff --git a/autotests/chatmarkdownhelpertest.qml b/autotests/chatmarkdownhelpertest.qml index 5f26e4d8f..8602033dd 100644 --- a/autotests/chatmarkdownhelpertest.qml +++ b/autotests/chatmarkdownhelpertest.qml @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2024 Carl Schwan -// SPDX-License-Identifier: LGPL-2.0-or-later +// SPDX-FileCopyrightText: 2026 James Graham +// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL import QtQuick import QtTest diff --git a/autotests/chattextitemhelpertest.qml b/autotests/chattextitemhelpertest.qml index 97de07d24..4ca69ca2c 100644 --- a/autotests/chattextitemhelpertest.qml +++ b/autotests/chattextitemhelpertest.qml @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2024 Carl Schwan -// SPDX-License-Identifier: LGPL-2.0-or-later +// SPDX-FileCopyrightText: 2026 James Graham +// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL import QtQuick import QtTest diff --git a/src/chatbar/ChatBar.qml b/src/chatbar/ChatBar.qml index bdf9dcbf7..0796e0f70 100644 --- a/src/chatbar/ChatBar.qml +++ b/src/chatbar/ChatBar.qml @@ -1,5 +1,6 @@ // SPDX-FileCopyrightText: 2020 Carl Schwan // SPDX-FileCopyrightText: 2020 Noah Davis +// SPDX-FileCopyrightText: 2026 James Graham // SPDX-License-Identifier: GPL-2.0-or-later pragma ComponentBehavior: Bound @@ -118,7 +119,9 @@ Item { sendMessageWithEnter: NeoChatConfig.sendMessageWith === 0 } - delegate: MessageComponentChooser {} + delegate: MessageComponentChooser { + rightAnchorMargin: chatScrollView.QQC2.ScrollBar.vertical.visible ? chatScrollView.QQC2.ScrollBar.vertical.width : 0 + } } } } diff --git a/src/chatbar/chatbuttonhelper.h b/src/chatbar/chatbuttonhelper.h index dd1aafc8b..8231b50bf 100644 --- a/src/chatbar/chatbuttonhelper.h +++ b/src/chatbar/chatbuttonhelper.h @@ -24,7 +24,7 @@ class ChatButtonHelper : public QObject Q_PROPERTY(ChatTextItemHelper *textItem READ textItem WRITE setTextItem NOTIFY textItemChanged) /** - * @brief Whether the text format at the current cursor is bold. + * @brief Whether rich formating is enabled at the current cursor location. */ Q_PROPERTY(bool richFormatEnabled READ richFormatEnabled NOTIFY richFormatEnabledChanged) diff --git a/src/messagecontent/BaseMessageComponentChooser.qml b/src/messagecontent/BaseMessageComponentChooser.qml index 0aacb1d3f..6bbe88335 100644 --- a/src/messagecontent/BaseMessageComponentChooser.qml +++ b/src/messagecontent/BaseMessageComponentChooser.qml @@ -17,6 +17,13 @@ import org.kde.neochat DelegateChooser { id: root + /** + * @brief Extra margin required when anchoring an item on the right. + * + * Normally used for scrollbars. + */ + property int rightAnchorMargin: 0 + /** * @brief The user selected text has changed. */ @@ -119,7 +126,9 @@ DelegateChooser { DelegateChoice { roleValue: MessageComponentType.Reply - delegate: ReplyComponent {} + delegate: ReplyComponent { + rightAnchorMargin: root.rightAnchorMargin + } } DelegateChoice { diff --git a/src/messagecontent/ReplyComponent.qml b/src/messagecontent/ReplyComponent.qml index 0bfd74789..515133e79 100644 --- a/src/messagecontent/ReplyComponent.qml +++ b/src/messagecontent/ReplyComponent.qml @@ -21,7 +21,7 @@ import org.kde.neochat * show in their original form and are instead visualised with a MIME type delegate * e.g. Videos. */ -RowLayout { +QQC2.Control { id: root /** @@ -34,59 +34,69 @@ RowLayout { */ required property bool editable + /** + * @brief Extra margin required when anchoring an item on the right. + * + * Normally used for scrollbars. + */ + property int rightAnchorMargin: 0 + Layout.fillWidth: true + padding: 0 - spacing: Kirigami.Units.largeSpacing + contentItem: RowLayout { + spacing: Kirigami.Units.largeSpacing - Rectangle { - id: verticalBorder - Layout.fillHeight: true + Rectangle { + id: verticalBorder + Layout.fillHeight: true - implicitWidth: Kirigami.Units.smallSpacing - color: root.replyContentModel.author?.color ?? Kirigami.Theme.highlightColor - radius: Kirigami.Units.cornerRadius - } - ColumnLayout { - id: contentColumn - spacing: Kirigami.Units.smallSpacing + implicitWidth: Kirigami.Units.smallSpacing + color: root.replyContentModel.author?.color ?? Kirigami.Theme.highlightColor + radius: Kirigami.Units.cornerRadius + } + ColumnLayout { + id: contentColumn + spacing: Kirigami.Units.smallSpacing - Message.maxContentWidth: _private.availableContentWidth + Message.maxContentWidth: _private.availableContentWidth - Repeater { - id: contentRepeater - model: root.replyContentModel - delegate: ReplyMessageComponentChooser { - onReplyClicked: RoomManager.goToEvent(root.replyContentModel.eventId) + Repeater { + id: contentRepeater + model: root.replyContentModel + delegate: ReplyMessageComponentChooser { + onReplyClicked: RoomManager.goToEvent(root.replyContentModel.eventId) + } } } - } - HoverHandler { - cursorShape: Qt.PointingHandCursor - } - TapHandler { - acceptedButtons: Qt.LeftButton - onTapped: RoomManager.goToEvent(root.replyContentModel.eventId) - } - QtObject { - id: _private - // The space available for the component after taking away the border - readonly property real availableContentWidth: root.Message.maxContentWidth - verticalBorder.implicitWidth - root.spacing - - readonly property QQC2.Button cancelButton: QQC2.Button { - id: cancelButton - - parent: root - anchors.top: root.top - anchors.right: root.right - - visible: root.editable - display: QQC2.AbstractButton.IconOnly - text: i18nc("@action:button", "Cancel reply") - icon.name: "dialog-close" - onClicked: root.Message.room.mainCache.replyId = "" - QQC2.ToolTip.text: text - QQC2.ToolTip.visible: hovered - QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay + HoverHandler { + cursorShape: Qt.PointingHandCursor + } + TapHandler { + acceptedButtons: Qt.LeftButton + onTapped: RoomManager.goToEvent(root.replyContentModel.eventId) + } + QtObject { + id: _private + // The space available for the component after taking away the border + readonly property real availableContentWidth: root.Message.maxContentWidth - verticalBorder.implicitWidth - root.spacing } } + + QQC2.Button { + id: cancelButton + anchors.top: root.top + anchors.topMargin: Kirigami.Units.smallSpacing + anchors.right: root.right + anchors.rightMargin: root.rightAnchorMargin + Kirigami.Units.smallSpacing + + visible: root.editable + display: QQC2.AbstractButton.IconOnly + text: i18nc("@action:button", "Cancel reply") + icon.name: "dialog-close" + onClicked: root.Message.room.mainCache.replyId = "" + QQC2.ToolTip.text: text + QQC2.ToolTip.visible: hovered + QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay + } }