Fold extra send icons when thin for mobile

This commit is contained in:
James Graham
2026-02-07 15:50:18 +00:00
parent 0d1f5c950d
commit 7afce01a23
3 changed files with 113 additions and 65 deletions

View File

@@ -110,6 +110,7 @@ QQC2.Control {
SendBar { SendBar {
room: root.room room: root.room
contentModel: root.model contentModel: root.model
maxAvailableWidth: root.maxAvailableWidth
} }
} }
} }

View File

@@ -414,14 +414,4 @@ RowLayout {
} }
} }
} }
Component {
id: locationChooser
LocationChooser {}
}
Component {
id: newPollDialog
NewPollDialog {}
}
} }

View File

@@ -11,6 +11,8 @@ import org.kde.kirigami as Kirigami
import org.kde.neochat.libneochat as LibNeoChat import org.kde.neochat.libneochat as LibNeoChat
import org.kde.neochat.messagecontent as MessageContent import org.kde.neochat.messagecontent as MessageContent
pragma ComponentBehavior: Bound
RowLayout { RowLayout {
id: root id: root
@@ -23,60 +25,128 @@ RowLayout {
required property MessageContent.ChatBarMessageContentModel contentModel required property MessageContent.ChatBarMessageContentModel contentModel
required property real maxAvailableWidth
readonly property real overflowWidth: Kirigami.Units.gridUnit * 30
function openLocationChooser(): void {
Qt.createComponent('org.kde.neochat.chatbar', 'LocationChooser').createObject(QQC2.ApplicationWindow.overlay, {
room: root.room
}).open();
}
function openNewPollDialog(): void {
Qt.createComponent('org.kde.neochat.chatbar', 'NewPollDialog').createObject(QQC2.Overlay.overlay, {
room: root.room
}).open();
}
function addAttachment(): void {
if (!root.contentModel.hasRichFormatting) {
if (LibNeoChat.Clipboard.hasImage) {
attachDialog();
} else {
fileDialog();
}
return;
}
let warningDialog = Qt.createComponent('org.kde.kirigami', 'PromptDialog').createObject(QQC2.Overlay.overlay, {
dialogType: Kirigami.PromptDialog.Warning,
title: attachmentButton.text,
subtitle: i18nc("@Warning: that any rich text in the chat bar will be switched for the plain text equivalent.", "Attachments can only have plain text captions, all rich formatting will be removed"),
standardButtons: Kirigami.Dialog.Ok | Kirigami.Dialog.Cancel
});
warningDialog.onAccepted.connect(() => {
if (LibNeoChat.Clipboard.hasImage) {
attachmentButton.attachDialog();
} else {
attachmentButton.fileDialog();
}
});
warningDialog.open();
}
function attachDialog(): void {
let dialog = Qt.createComponent('org.kde.neochat.chatbar', 'AttachDialog').createObject(QQC2.Overlay.overlay) as AttachDialog;
dialog.anchors.centerIn = QQC2.Overlay.overlay;
dialog.chosen.connect(path => root.contentModel.addAttachment(path));
dialog.open();
}
function fileDialog(): void {
let dialog = Qt.createComponent('org.kde.neochat.libneochat', 'OpenFileDialog').createObject(QQC2.Overlay.overlay, {
parentWindow: Window.window,
currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0]
});
dialog.chosen.connect(path => root.contentModel.addAttachment(path));
dialog.open();
}
Kirigami.Separator { Kirigami.Separator {
Layout.fillHeight: true Layout.fillHeight: true
} }
QQC2.ToolButton { QQC2.ToolButton {
id: attachmentButton id: compressedExtraSendButton
property QQC2.Menu overflowMenu
property bool isBusy: root.room && root.room.hasFileUploading visible: root.maxAvailableWidth < root.overflowWidth && (root.contentModel?.type ?? true) === LibNeoChat.ChatBarType.Room
icon.name: "overflow-menu"
visible: !root.contentModel.hasAttachment && (root.contentModel?.type ?? true) === LibNeoChat.ChatBarType.Room enabled: root.chatButtonHelper.richFormatEnabled
icon.name: "mail-attachment" text: i18nc("@action:button", "Format Text")
text: i18nc("@action:button", "Attach an image or file")
display: QQC2.AbstractButton.IconOnly display: QQC2.AbstractButton.IconOnly
checkable: true
onClicked: { onClicked: {
if (!root.contentModel.hasRichFormatting) { if (!checked) {
if (LibNeoChat.Clipboard.hasImage) { if (overflowMenu) {
attachDialog(); overflowMenu.close();
} else {
fileDialog();
} }
return; return;
} }
let warningDialog = Qt.createComponent('org.kde.kirigami', 'PromptDialog').createObject(QQC2.Overlay.overlay, { overflowMenu = compressedExtraSendMenu.createObject(compressedExtraSendButton)
dialogType: Kirigami.PromptDialog.Warning, overflowMenu.onClosed.connect(() => {
title: attachmentButton.text, overflowMenu = null;
subtitle: i18nc("@Warning: that any rich text in the chat bar will be switched for the plain text equivalent.", "Attachments can only have plain text captions, all rich formatting will be removed"),
standardButtons: Kirigami.Dialog.Ok | Kirigami.Dialog.Cancel
}); });
warningDialog.onAccepted.connect(() => { overflowMenu.open();
if (LibNeoChat.Clipboard.hasImage) { }
attachmentButton.attachDialog();
} else { Component {
attachmentButton.fileDialog(); id: compressedExtraSendMenu
QQC2.Menu {
y: -implicitHeight
QQC2.MenuItem {
visible: !root.contentModel.hasAttachment
icon.name: "mail-attachment"
text: i18nc("@action:button", "Attach an image or file")
onTriggered: root.addAttachment()
} }
}); QQC2.MenuItem {
warningDialog.open(); icon.name: "globe"
text: i18nc("@action:button", "Send a Location")
onTriggered: root.openLocationChooser()
}
QQC2.MenuItem {
icon.name: "amarok_playcount"
text: i18nc("@action:button", "Create a Poll")
onTriggered: root.openNewPollDialog();
}
}
} }
function attachDialog(): void { QQC2.ToolTip.text: text
let dialog = Qt.createComponent('org.kde.neochat.chatbar', 'AttachDialog').createObject(QQC2.Overlay.overlay) as AttachDialog; QQC2.ToolTip.visible: hovered
dialog.anchors.centerIn = QQC2.Overlay.overlay; QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
dialog.chosen.connect(path => root.contentModel.addAttachment(path)); }
dialog.open(); QQC2.ToolButton {
} id: attachmentButton
visible: !root.contentModel.hasAttachment && (root.contentModel?.type ?? true) === LibNeoChat.ChatBarType.Room && root.maxAvailableWidth >= root.overflowWidth
icon.name: "mail-attachment"
text: i18nc("@action:button", "Attach an image or file")
display: QQC2.AbstractButton.IconOnly
function fileDialog(): void { onClicked: root.addAttachment()
let dialog = Qt.createComponent('org.kde.neochat.libneochat', 'OpenFileDialog').createObject(QQC2.Overlay.overlay, {
parentWindow: Window.window,
currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0]
});
dialog.chosen.connect(path => root.contentModel.addAttachment(path));
dialog.open();
}
QQC2.ToolTip.visible: hovered QQC2.ToolTip.visible: hovered
QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
@@ -84,43 +154,30 @@ RowLayout {
} }
QQC2.ToolButton { QQC2.ToolButton {
id: mapButton id: mapButton
visible: (root.contentModel?.type ?? true) === LibNeoChat.ChatBarType.Room visible: (root.contentModel?.type ?? true) === LibNeoChat.ChatBarType.Room && root.maxAvailableWidth >= root.overflowWidth
icon.name: "globe" icon.name: "globe"
property bool isBusy: false
text: i18nc("@action:button", "Send a Location") text: i18nc("@action:button", "Send a Location")
display: QQC2.AbstractButton.IconOnly display: QQC2.AbstractButton.IconOnly
onClicked: { onClicked: root.openLocationChooser();
locationChooser.createObject(QQC2.ApplicationWindow.overlay, {
room: root.room
}).open();
}
QQC2.ToolTip.visible: hovered QQC2.ToolTip.visible: hovered
QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
QQC2.ToolTip.text: text QQC2.ToolTip.text: text
} }
QQC2.ToolButton { QQC2.ToolButton {
id: pollButton id: pollButton
visible: (root.contentModel?.type ?? true) === LibNeoChat.ChatBarType.Room visible: (root.contentModel?.type ?? true) === LibNeoChat.ChatBarType.Room && root.maxAvailableWidth >= root.overflowWidth
icon.name: "amarok_playcount" icon.name: "amarok_playcount"
property bool isBusy: false
text: i18nc("@action:button", "Create a Poll") text: i18nc("@action:button", "Create a Poll")
display: QQC2.AbstractButton.IconOnly display: QQC2.AbstractButton.IconOnly
onClicked: { onClicked: root.openNewPollDialog();
newPollDialog.createObject(QQC2.Overlay.overlay, {
room: root.room
}).open();
}
QQC2.ToolTip.visible: hovered QQC2.ToolTip.visible: hovered
QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
QQC2.ToolTip.text: text QQC2.ToolTip.text: text
} }
QQC2.ToolButton { QQC2.ToolButton {
id: sendButton id: sendButton
property bool isBusy: false
icon.name: "document-send" icon.name: "document-send"
text: i18nc("@action:button", "Send message") text: i18nc("@action:button", "Send message")
display: QQC2.AbstractButton.IconOnly display: QQC2.AbstractButton.IconOnly