fix(MessageContextMenuView): Message context menu displaying incorrectly

- restore previous context menu item spacing (ColumnLayout has an
implicit spacing of 5)
- don't wrap the MessageReactionsRow into an extra Item container; fixes
the emoji reactions row being garbled
- enhance the SB page so that the above can be seen/tested there and
rename it to match the component name
- some smaller cleanups

Fixes #16409
This commit is contained in:
Lukáš Tinkl 2024-10-01 17:10:46 +02:00 committed by Lukáš Tinkl
parent 3025ac9208
commit e3512938f6
5 changed files with 149 additions and 187 deletions

View File

@ -1,157 +0,0 @@
import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.14
import StatusQ.Controls 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Components 0.1
import Storybook 1.0
import Models 1.0
import utils 1.0
import shared.views.chat 1.0
import shared.status 1.0
SplitView {
QtObject {
id: d
}
Logs { id: logs }
SplitView {
orientation: Qt.Vertical
SplitView.fillWidth: true
Rectangle {
SplitView.fillWidth: true
SplitView.fillHeight: true
color: Theme.palette.statusAppLayout.rightPanelBackgroundColor
clip: true
ColumnLayout {
anchors.centerIn: parent
spacing: 10
RowLayout {
Button {
text: "Message context menu"
onClicked: {
menu1.createObject(this).popup()
}
}
Button {
text: "Message context menu (hide disabled items)"
onClicked: {
menu2.createObject(this).popup()
}
}
}
}
Component {
id: menu1
MessageContextMenuView {
id: messageContextMenuView
anchors.centerIn: parent
hideDisabledItems: false
isDebugEnabled: isDebugEnabledCheckBox.checked
onClosed: {
destroy()
}
onPinMessage: () => {
logs.logEvent("Pin message:", messageContextMenuView.messageId)
}
onUnpinMessage: () => {
logs.logEvent("Unpin message:", messageContextMenuView.messageId)
}
onPinnedMessagesLimitReached: () => {
logs.logEvent("Pinned messages limit reached:", messageContextMenuView.messageId)
}
onMarkMessageAsUnread: () => {
logs.logEvent("Mark message as unread:", messageContextMenuView.messageId)
}
onToggleReaction: (emojiId) => {
logs.logEvent("Toggle reaction:", messageContextMenuView.messageId, emojiId)
}
onDeleteMessage: () => {
logs.logEvent("Delete message:", messageContextMenuView.messageId)
}
onEditClicked: () => {
logs.logEvent("Edit message:", messageContextMenuView.messageId)
}
onShowReplyArea: (senderId) => {
logs.logEvent("Show reply area:", messageContextMenuView.messageId, senderId)
}
onCopyToClipboard: (text) => {
logs.logEvent("Copy to clipboard:", text)
}
}
}
Component {
id: menu2
MessageContextMenuView {
id: messageContextMenuView
anchors.centerIn: parent
hideDisabledItems: true
isDebugEnabled: isDebugEnabledCheckBox.checked
onClosed: {
destroy()
}
onPinMessage: () => {
logs.logEvent("Pin message:", messageContextMenuView.messageId)
}
onUnpinMessage: () => {
logs.logEvent("Unpin message:", messageContextMenuView.messageId)
}
onPinnedMessagesLimitReached: () => {
logs.logEvent("Pinned messages limit reached:", messageContextMenuView.messageId)
}
onMarkMessageAsUnread: () => {
logs.logEvent("Mark message as unread:", messageContextMenuView.messageId)
}
onToggleReaction: (emojiId) => {
logs.logEvent("Toggle reaction:", messageContextMenuView.messageId, emojiId)
}
onDeleteMessage: () => {
logs.logEvent("Delete message:", messageContextMenuView.messageId)
}
onEditClicked: () => {
logs.logEvent("Edit message:", messageContextMenuView.messageId)
}
onShowReplyArea: (senderId) => {
logs.logEvent("Show reply area:", messageContextMenuView.messageId, senderId)
}
onCopyToClipboard: (text) => {
logs.logEvent("Copy to clipboard:", text)
}
}
}
}
}
LogsAndControlsPanel {
id: logsAndControlsPanel
SplitView.minimumWidth: 150
SplitView.preferredWidth: 250
logsView.logText: logs.logText
controls: ColumnLayout {
spacing: 16
CheckBox {
id: isDebugEnabledCheckBox
text: "Enable Debug"
checked: false
}
}
}
}
// category: Views

View File

@ -0,0 +1,131 @@
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import StatusQ.Core.Theme 0.1
import Storybook 1.0
import utils 1.0
import shared.views.chat 1.0
SplitView {
id: root
Logs { id: logs }
ListModel {
id: emojiReactionsModel
ListElement {
emojiId: 1
filename: "emojiReactions/heart"
didIReactWithThisEmoji: false
}
ListElement {
emojiId: 2
filename: "emojiReactions/thumbsUp"
didIReactWithThisEmoji: false
}
ListElement {
emojiId: 3
filename: "emojiReactions/thumbsDown"
didIReactWithThisEmoji: false
}
ListElement {
emojiId: 4
filename: "emojiReactions/laughing"
didIReactWithThisEmoji: false
}
ListElement {
emojiId: 5
filename: "emojiReactions/sad"
didIReactWithThisEmoji: false
}
ListElement {
emojiId: 6
filename: "emojiReactions/angry"
didIReactWithThisEmoji: false
}
}
SplitView {
orientation: Qt.Vertical
SplitView.fillWidth: true
Rectangle {
SplitView.fillWidth: true
SplitView.fillHeight: true
color: Theme.palette.statusAppLayout.rightPanelBackgroundColor
Button {
anchors.centerIn: parent
text: "Reopen"
onClicked: messageContextMenuView.open()
}
MessageContextMenuView {
id: messageContextMenuView
anchors.centerIn: parent
visible: true
closePolicy: Popup.NoAutoClose
messageId: "Oxdeadbeef"
reactionModel: emojiReactionsModel
messageContentType: Constants.messageContentType.messageType
chatType: Constants.chatType.oneToOne
isDebugEnabled: isDebugEnabledCheckBox.checked
hideDisabledItems: ctrlHideDisabled.checked
amIChatAdmin: ctrlChatAdmin.checked
canPin: true
pinnedMessage: ctrlPinned.checked
onPinMessage: logs.logEvent(`onPinMessage: ${messageContextMenuView.messageId}`)
onUnpinMessage: logs.logEvent(`onUnpinMessage: ${messageContextMenuView.messageId}`)
onPinnedMessagesLimitReached: logs.logEvent(`onPinnedMessagesLimitReached: ${messageContextMenuView.messageId}`)
onMarkMessageAsUnread: logs.logEvent(`onMarkMessageAsUnread: ${messageContextMenuView.messageId}`)
onToggleReaction: (emojiId) => logs.logEvent("onToggleReaction", ["emojiId"], arguments)
onDeleteMessage: logs.logEvent(`onDeleteMessage: ${messageContextMenuView.messageId}`)
onEditClicked: logs.logEvent(`onEditClicked: ${messageContextMenuView.messageId}`)
onShowReplyArea: (senderId) => logs.logEvent("onShowReplyArea", ["senderId"], arguments)
onCopyToClipboard: (text) => logs.logEvent("onCopyToClipboard", ["text"], arguments)
}
}
}
LogsAndControlsPanel {
id: logsAndControlsPanel
SplitView.minimumWidth: 150
SplitView.preferredWidth: 250
logsView.logText: logs.logText
controls: ColumnLayout {
spacing: 16
CheckBox {
id: isDebugEnabledCheckBox
text: "Enable Debug"
}
CheckBox {
id: ctrlHideDisabled
text: "Hide disabled items"
checked: true
}
CheckBox {
id: ctrlChatAdmin
text: "Chat Admin"
checked: false
}
CheckBox {
id: ctrlPinned
text: "Pinned message?"
}
}
}
}
// category: Views

View File

@ -95,6 +95,7 @@ Menu {
padding: 0 padding: 0
ColumnLayout { ColumnLayout {
spacing: 0
Repeater { Repeater {
model: root.contentModel model: root.contentModel

View File

@ -6,7 +6,7 @@ import shared 1.0
Row { Row {
id: root id: root
property var reactionsModel: [] property var reactionsModel
signal toggleReaction(int emojiId) signal toggleReaction(int emojiId)
@ -17,7 +17,7 @@ Row {
Repeater { Repeater {
model: root.reactionsModel model: root.reactionsModel
delegate: EmojiReaction { delegate: EmojiReaction {
source: Style.svg(filename) source: Style.svg(model.filename)
emojiId: model.emojiId emojiId: model.emojiId
reactedByUser: model.didIReactWithThisEmoji reactedByUser: model.didIReactWithThisEmoji
onCloseModal: { onCloseModal: {

View File

@ -1,24 +1,18 @@
import QtQuick 2.12 import QtQuick 2.15
import QtQuick.Controls 2.3 import QtQuick.Controls 2.15
import QtQuick.Layouts 1.3
import QtQml.Models 2.3
import StatusQ 0.1 import StatusQ 0.1
import StatusQ.Popups 0.1 import StatusQ.Popups 0.1
import StatusQ.Components 0.1 import StatusQ.Components 0.1
import utils 1.0 import utils 1.0
import shared 1.0
import shared.panels 1.0
import shared.popups 1.0
import shared.status 1.0
import shared.controls.chat 1.0 import shared.controls.chat 1.0
import shared.controls.chat.menuItems 1.0
StatusMenu { StatusMenu {
id: root id: root
property var reactionModel: [] // expected roles: emojiId:int, filename:string, didIReactWithThisEmoji:bool
property var reactionModel
property string myPublicKey: "" property string myPublicKey: ""
property bool amIChatAdmin: false property bool amIChatAdmin: false
@ -51,27 +45,19 @@ StatusMenu {
signal markMessageAsUnread() signal markMessageAsUnread()
signal copyToClipboard(string text) signal copyToClipboard(string text)
width: Math.max(emojiContainer.visible ? emojiContainer.width : 0, 230) MessageReactionsRow {
id: emojiRow
Item {
id: emojiContainer
width: emojiRow.width
height: visible ? emojiRow.height : 0
visible: !root.disabledForChat || root.forceEnableEmojiReactions visible: !root.disabledForChat || root.forceEnableEmojiReactions
reactionsModel: root.reactionModel
MessageReactionsRow { bottomPadding: Style.current.halfPadding
id: emojiRow onToggleReaction: {
reactionsModel: root.reactionModel root.toggleReaction(emojiId)
bottomPadding: Style.current.padding root.close()
onToggleReaction: {
root.toggleReaction(emojiId)
root.close()
}
} }
} }
StatusMenuSeparator { StatusMenuSeparator {
visible: emojiContainer.visible visible: emojiRow.visible
} }
StatusAction { StatusAction {
@ -148,9 +134,10 @@ StatusMenu {
visible: deleteMessageAction.enabled && visible: deleteMessageAction.enabled &&
(replyToMenuItem.enabled || (replyToMenuItem.enabled ||
copyMessageMenuItem.enabled || copyMessageMenuItem.enabled ||
copyMessageIdAction || copyMessageIdAction.enabled ||
editMessageAction.enabled || editMessageAction.enabled ||
pinAction.enabled) pinAction.enabled ||
markMessageAsUnreadAction.enabled)
} }
StatusAction { StatusAction {