Disable send message when there's nothing to actually send

Now there's a way to check if the message content model has any useful
data inside of it.

BUG: 516118
FIXED-IN: 26.04
This commit is contained in:
Joshua Goins
2026-02-16 14:15:30 -05:00
parent 2d2291fd78
commit 428a196f8d
3 changed files with 35 additions and 0 deletions

View File

@@ -208,6 +208,7 @@ RowLayout {
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
enabled: root.contentModel.hasAnyContent
onClicked: root.contentModel.postMessage(); onClicked: root.contentModel.postMessage();
QQC2.ToolTip.visible: hovered QQC2.ToolTip.visible: hovered

View File

@@ -60,6 +60,9 @@ ChatBarMessageContentModel::ChatBarMessageContentModel(QObject *parent)
initializeFromCache(); initializeFromCache();
}); });
connect(m_markdownHelper, &ChatMarkdownHelper::unhandledBlockFormat, this, &ChatBarMessageContentModel::insertStyleAtCursor); connect(m_markdownHelper, &ChatMarkdownHelper::unhandledBlockFormat, this, &ChatBarMessageContentModel::insertStyleAtCursor);
connect(this, &ChatBarMessageContentModel::modelReset, this, &ChatBarMessageContentModel::hasAnyContentChanged);
connect(this, &ChatBarMessageContentModel::rowsInserted, this, &ChatBarMessageContentModel::hasAnyContentChanged);
connect(this, &ChatBarMessageContentModel::rowsRemoved, this, &ChatBarMessageContentModel::hasAnyContentChanged);
connectCache(); connectCache();
connectKeyHelper(); connectKeyHelper();
@@ -302,6 +305,7 @@ void ChatBarMessageContentModel::connectTextItem(ChatTextItemHelper *chattextite
connect(chattextitemhelper, &ChatTextItemHelper::cleared, this, [this](ChatTextItemHelper *helper) { connect(chattextitemhelper, &ChatTextItemHelper::cleared, this, [this](ChatTextItemHelper *helper) {
removeComponent(helper); removeComponent(helper);
}); });
connect(chattextitemhelper, &ChatTextItemHelper::contentsChanged, this, &ChatBarMessageContentModel::hasAnyContentChanged);
} }
ChatTextItemHelper *ChatBarMessageContentModel::textItemForComponent(const MessageComponent &component) const ChatTextItemHelper *ChatBarMessageContentModel::textItemForComponent(const MessageComponent &component) const
@@ -664,6 +668,28 @@ void ChatBarMessageContentModel::postMessage()
refocusCurrentComponent(); refocusCurrentComponent();
} }
bool ChatBarMessageContentModel::hasAnyContent() const
{
// Shouldn't really be possible, but is true.
if (m_components.empty()) {
return false;
}
// If there's more than one component naturally there is content.
if (m_components.size() > 1) {
return true;
}
// There's usually at a minimum a TextComponent, we need to check if it's empty.
if (const auto textItem = textItemForComponent(m_components.constFirst())) {
if (textItem->isEmpty()) {
return false;
}
}
return true;
}
std::optional<QString> ChatBarMessageContentModel::getReplyEventId() std::optional<QString> ChatBarMessageContentModel::getReplyEventId()
{ {
if (!m_room) { if (!m_room) {

View File

@@ -77,6 +77,11 @@ class ChatBarMessageContentModel : public MessageContentModel
*/ */
Q_PROPERTY(bool sendMessageWithEnter READ sendMessageWithEnter WRITE setSendMessageWithEnter NOTIFY sendMessageWithEnterChanged) Q_PROPERTY(bool sendMessageWithEnter READ sendMessageWithEnter WRITE setSendMessageWithEnter NOTIFY sendMessageWithEnterChanged)
/**
* @brief Whether the model has any content, ideal for checking if there is anything to send.
*/
Q_PROPERTY(bool hasAnyContent READ hasAnyContent NOTIFY hasAnyContentChanged)
public: public:
explicit ChatBarMessageContentModel(QObject *parent = nullptr); explicit ChatBarMessageContentModel(QObject *parent = nullptr);
@@ -106,12 +111,15 @@ public:
Q_INVOKABLE void postMessage(); Q_INVOKABLE void postMessage();
bool hasAnyContent() const;
Q_SIGNALS: Q_SIGNALS:
void typeChanged(ChatBarType::Type oldType, ChatBarType::Type newType); void typeChanged(ChatBarType::Type oldType, ChatBarType::Type newType);
void focusRowChanged(); void focusRowChanged();
void hasRichFormattingChanged(); void hasRichFormattingChanged();
void hasAttachmentChanged(); void hasAttachmentChanged();
void sendMessageWithEnterChanged(); void sendMessageWithEnterChanged();
void hasAnyContentChanged();
private: private:
ChatBarType::Type m_type = ChatBarType::None; ChatBarType::Type m_type = ChatBarType::None;