Comment updates
This commit is contained in:
@@ -8,7 +8,6 @@
|
|||||||
#include <QQuickTextDocument>
|
#include <QQuickTextDocument>
|
||||||
#include <QTextCursor>
|
#include <QTextCursor>
|
||||||
#include <QTextDocumentFragment>
|
#include <QTextDocumentFragment>
|
||||||
#include <qquickitem.h>
|
|
||||||
|
|
||||||
#include "chatkeyhelper.h"
|
#include "chatkeyhelper.h"
|
||||||
#include "chattextitemhelper.h"
|
#include "chattextitemhelper.h"
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QQuickItem>
|
#include <QQuickItem>
|
||||||
#include <QTextCursor>
|
#include <QTextCursor>
|
||||||
#include <qtextcursor.h>
|
|
||||||
|
|
||||||
#include "chatmarkdownhelper.h"
|
#include "chatmarkdownhelper.h"
|
||||||
#include "chattextitemhelper.h"
|
#include "chattextitemhelper.h"
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
#include <QQuickTextDocument>
|
#include <QQuickTextDocument>
|
||||||
#include <QTextCursor>
|
#include <QTextCursor>
|
||||||
#include <QTextDocumentFragment>
|
#include <QTextDocumentFragment>
|
||||||
#include <qquickitem.h>
|
|
||||||
|
|
||||||
#include "chattextitemhelper.h"
|
#include "chattextitemhelper.h"
|
||||||
|
|
||||||
|
|||||||
@@ -103,8 +103,14 @@ Item {
|
|||||||
height: Kirigami.Units.iconSizes.smallMedium
|
height: Kirigami.Units.iconSizes.smallMedium
|
||||||
|
|
||||||
icon.name: NeoChatConfig.sendMessageWith === 0 ? "arrow-up" : "arrow-down"
|
icon.name: NeoChatConfig.sendMessageWith === 0 ? "arrow-up" : "arrow-down"
|
||||||
|
text: NeoChatConfig.sendMessageWith === 0 ? i18nc("@action:button", "Enter rich text mode") : i18nc("@action:button", "Exit rich text mode")
|
||||||
|
display: QQC2.AbstractButton.IconOnly
|
||||||
|
|
||||||
onClicked: NeoChatConfig.sendMessageWith = NeoChatConfig.sendMessageWith === 0 ? 1 : 0
|
onClicked: NeoChatConfig.sendMessageWith = NeoChatConfig.sendMessageWith === 0 ? 1 : 0
|
||||||
|
|
||||||
|
QQC2.ToolTip.visible: hovered
|
||||||
|
QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
|
||||||
|
QQC2.ToolTip.text: text
|
||||||
}
|
}
|
||||||
|
|
||||||
LibNeoChat.DelegateSizeHelper {
|
LibNeoChat.DelegateSizeHelper {
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2024 Carl Schwan <carl@carlschwan.eu>
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
|
||||||
|
|
||||||
import QtQuick
|
|
||||||
import QtCore
|
|
||||||
import org.kde.kirigami as Kirigami
|
|
||||||
import org.kde.kirigamiaddons.formcard as FormCard
|
|
||||||
import QtQuick.Controls as QQC2
|
|
||||||
import QtQuick.Layouts
|
|
||||||
import QtQuick.Dialogs
|
|
||||||
|
|
||||||
FormCard.FormCardDialog {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
readonly property alias imagePath: imageField.path
|
|
||||||
|
|
||||||
title: i18nc("@title:window", "Insert Image")
|
|
||||||
standardButtons: QQC2.Dialog.Ok | QQC2.Dialog.Cancel
|
|
||||||
|
|
||||||
FileDialog {
|
|
||||||
id: fileDialog
|
|
||||||
|
|
||||||
title: i18nc("@title:window", "Select an image")
|
|
||||||
currentFolder: StandardPaths.writableLocation(StandardPaths.PicturesLocation)
|
|
||||||
fileMode: FileDialog.OpenFile
|
|
||||||
nameFilters: [i18n("Image files (*.jpg *.jpeg *.png *.svg *.webp)"), i18n("All files (*)")]
|
|
||||||
onAccepted: imageField.path = selectedFile
|
|
||||||
}
|
|
||||||
|
|
||||||
FormCard.FormButtonDelegate {
|
|
||||||
id: imageField
|
|
||||||
|
|
||||||
property url path
|
|
||||||
|
|
||||||
text: i18nc("@label:textbox", "Image Location:")
|
|
||||||
description: path.toString().length > 0 ? path.toString().split('/').slice(-1)[0] : ''
|
|
||||||
|
|
||||||
onClicked: fileDialog.open()
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
visible: imageField.path.toString().length > 0
|
|
||||||
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.preferredHeight: 200
|
|
||||||
Layout.topMargin: Kirigami.Units.largeSpacing
|
|
||||||
|
|
||||||
Image {
|
|
||||||
anchors.fill: parent
|
|
||||||
source: imageField.path
|
|
||||||
fillMode: Image.PreserveAspectFit
|
|
||||||
horizontalAlignment: Image.AlignHCenter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -33,7 +33,7 @@ RowLayout {
|
|||||||
|
|
||||||
visible: !root.contentModel.hasAttachment && (root.contentModel?.type ?? true) === LibNeoChat.ChatBarType.Room
|
visible: !root.contentModel.hasAttachment && (root.contentModel?.type ?? true) === LibNeoChat.ChatBarType.Room
|
||||||
icon.name: "mail-attachment"
|
icon.name: "mail-attachment"
|
||||||
text: i18n("Attach an image or file")
|
text: i18nc("@action:button", "Attach an image or file")
|
||||||
display: QQC2.AbstractButton.IconOnly
|
display: QQC2.AbstractButton.IconOnly
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
@@ -48,8 +48,8 @@ RowLayout {
|
|||||||
|
|
||||||
let warningDialog = Qt.createComponent('org.kde.kirigami', 'PromptDialog').createObject(QQC2.Overlay.overlay, {
|
let warningDialog = Qt.createComponent('org.kde.kirigami', 'PromptDialog').createObject(QQC2.Overlay.overlay, {
|
||||||
dialogType: Kirigami.PromptDialog.Warning,
|
dialogType: Kirigami.PromptDialog.Warning,
|
||||||
title: i18n("Attach an image or file?"),
|
title: attachmentButton.text,
|
||||||
subtitle: i18n("Attachments can only have plain text captions, all rich formatting will be removed"),
|
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
|
standardButtons: Kirigami.Dialog.Ok | Kirigami.Dialog.Cancel
|
||||||
});
|
});
|
||||||
warningDialog.onAccepted.connect(() => {
|
warningDialog.onAccepted.connect(() => {
|
||||||
@@ -87,7 +87,7 @@ RowLayout {
|
|||||||
visible: (root.contentModel?.type ?? true) === LibNeoChat.ChatBarType.Room
|
visible: (root.contentModel?.type ?? true) === LibNeoChat.ChatBarType.Room
|
||||||
icon.name: "globe"
|
icon.name: "globe"
|
||||||
property bool isBusy: false
|
property bool isBusy: false
|
||||||
text: i18n("Send a Location")
|
text: i18nc("@action:button", "Send a Location")
|
||||||
display: QQC2.AbstractButton.IconOnly
|
display: QQC2.AbstractButton.IconOnly
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
@@ -122,7 +122,7 @@ RowLayout {
|
|||||||
property bool isBusy: false
|
property bool isBusy: false
|
||||||
|
|
||||||
icon.name: "document-send"
|
icon.name: "document-send"
|
||||||
text: i18n("Send message")
|
text: i18nc("@action:button", "Send message")
|
||||||
display: QQC2.AbstractButton.IconOnly
|
display: QQC2.AbstractButton.IconOnly
|
||||||
|
|
||||||
onClicked: root.contentModel.postMessage();
|
onClicked: root.contentModel.postMessage();
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
#include "chattextitemhelper.h"
|
#include "chattextitemhelper.h"
|
||||||
#include "clipboard.h"
|
#include "clipboard.h"
|
||||||
#include "neochatroom.h"
|
#include "neochatroom.h"
|
||||||
#include <qnamespace.h>
|
|
||||||
|
|
||||||
ChatKeyHelper::ChatKeyHelper(QObject *parent)
|
ChatKeyHelper::ChatKeyHelper(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ void ChatTextItemHelper::initializeChars()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTextCursor cursor = QTextCursor(doc);
|
QTextCursor cursor(doc);
|
||||||
if (cursor.isNull()) {
|
if (cursor.isNull()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QQuickItem>
|
#include <QQuickItem>
|
||||||
#include <qcontainerfwd.h>
|
|
||||||
|
|
||||||
#include "enums/chatbartype.h"
|
#include "enums/chatbartype.h"
|
||||||
#include "enums/richformat.h"
|
#include "enums/richformat.h"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
struct MessageComponent {
|
struct MessageComponent {
|
||||||
MessageComponentType::Type type = MessageComponentType::Other;
|
MessageComponentType::Type type = MessageComponentType::Other;
|
||||||
QString display;
|
QString display;
|
||||||
QVariantMap attributes = {};
|
QVariantMap attributes;
|
||||||
|
|
||||||
bool operator==(const MessageComponent &right) const
|
bool operator==(const MessageComponent &right) const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class CompletionModel : public QAbstractListModel
|
|||||||
Q_PROPERTY(NeoChatRoom *room READ room WRITE setRoom NOTIFY roomChanged)
|
Q_PROPERTY(NeoChatRoom *room READ room WRITE setRoom NOTIFY roomChanged)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The QQuickTextDocument that is being handled.
|
* @brief The ChatBarType::Type of the chat bar.
|
||||||
*/
|
*/
|
||||||
Q_PROPERTY(ChatBarType::Type type READ type WRITE setType NOTIFY typeChanged)
|
Q_PROPERTY(ChatBarType::Type type READ type WRITE setType NOTIFY typeChanged)
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
#include "chatbarmessagecontentmodel.h"
|
#include "chatbarmessagecontentmodel.h"
|
||||||
|
|
||||||
#include <QTextDocumentFragment>
|
#include <QTextDocumentFragment>
|
||||||
#include <qlogging.h>
|
|
||||||
|
|
||||||
#include "chatbarcache.h"
|
#include "chatbarcache.h"
|
||||||
#include "chatkeyhelper.h"
|
#include "chatkeyhelper.h"
|
||||||
@@ -332,7 +331,7 @@ QModelIndex ChatBarMessageContentModel::indexForTextItem(ChatTextItemHelper *tex
|
|||||||
|
|
||||||
bool ChatBarMessageContentModel::hasRichFormatting() const
|
bool ChatBarMessageContentModel::hasRichFormatting() const
|
||||||
{
|
{
|
||||||
for (const auto &component : m_components) {
|
return std::ranges::any_of(m_components, [this](const auto &component) {
|
||||||
if (component.type != MessageComponentType::Text) {
|
if (component.type != MessageComponentType::Text) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -341,8 +340,8 @@ bool ChatBarMessageContentModel::hasRichFormatting() const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
return false;
|
||||||
return false;
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ChatBarMessageContentModel::hasAttachment() const
|
bool ChatBarMessageContentModel::hasAttachment() const
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
/**
|
/**
|
||||||
* @class ChatBarMessageContentModel
|
* @class ChatBarMessageContentModel
|
||||||
*
|
*
|
||||||
* Inherited from MessageContentModel this visulaises the content of a Quotient::RoomMessageEvent.
|
* Inherited from MessageContentModel this visualises the content of a Quotient::RoomMessageEvent.
|
||||||
*/
|
*/
|
||||||
class ChatBarMessageContentModel : public MessageContentModel
|
class ChatBarMessageContentModel : public MessageContentModel
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ QVariant MessageContentModel::data(const QModelIndex &index, int role) const
|
|||||||
}
|
}
|
||||||
return QVariant::fromValue<ChatBarCache *>(m_room->editCache());
|
return QVariant::fromValue<ChatBarCache *>(m_room->editCache());
|
||||||
}
|
}
|
||||||
if (role == Editable) {
|
if (role == EditableRole) {
|
||||||
return m_editableActive;
|
return m_editableActive;
|
||||||
}
|
}
|
||||||
if (role == CurrentFocusRole) {
|
if (role == CurrentFocusRole) {
|
||||||
@@ -239,7 +239,7 @@ QHash<int, QByteArray> MessageContentModel::roleNamesStatic()
|
|||||||
roles[MessageContentModel::ThreadRootRole] = "threadRoot";
|
roles[MessageContentModel::ThreadRootRole] = "threadRoot";
|
||||||
roles[MessageContentModel::LinkPreviewerRole] = "linkPreviewer";
|
roles[MessageContentModel::LinkPreviewerRole] = "linkPreviewer";
|
||||||
roles[MessageContentModel::ChatBarCacheRole] = "chatBarCache";
|
roles[MessageContentModel::ChatBarCacheRole] = "chatBarCache";
|
||||||
roles[MessageContentModel::Editable] = "editable";
|
roles[MessageContentModel::EditableRole] = "editable";
|
||||||
roles[MessageContentModel::CurrentFocusRole] = "currentFocus";
|
roles[MessageContentModel::CurrentFocusRole] = "currentFocus";
|
||||||
return roles;
|
return roles;
|
||||||
}
|
}
|
||||||
@@ -254,14 +254,11 @@ bool MessageContentModel::hasComponentType(MessageComponentType::Type type) cons
|
|||||||
!= m_components.cend();
|
!= m_components.cend();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MessageContentModel::hasComponentType(QList<MessageComponentType::Type> types) const
|
bool MessageContentModel::hasComponentType(const QList<MessageComponentType::Type> &types) const
|
||||||
{
|
{
|
||||||
for (const auto &type : types) {
|
return std::ranges::any_of(types, [this](const MessageComponentType::Type &type) {
|
||||||
if (hasComponentType(type)) {
|
return hasComponentType(type);
|
||||||
return true;
|
});
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageContentModel::forEachComponentOfType(MessageComponentType::Type type,
|
void MessageContentModel::forEachComponentOfType(MessageComponentType::Type type,
|
||||||
@@ -316,8 +313,7 @@ void MessageContentModel::updateReplyModel()
|
|||||||
|
|
||||||
m_replyModel = new EventMessageContentModel(m_room, *eventId, true, false, this);
|
m_replyModel = new EventMessageContentModel(m_room, *eventId, true, false, this);
|
||||||
|
|
||||||
bool hasModel = hasComponentType(MessageComponentType::Reply);
|
if (!hasComponentType(MessageComponentType::Reply)) {
|
||||||
if (!hasModel) {
|
|
||||||
int insertRow = 0;
|
int insertRow = 0;
|
||||||
if (m_components.first().type == MessageComponentType::Author) {
|
if (m_components.first().type == MessageComponentType::Author) {
|
||||||
insertRow = 1;
|
insertRow = 1;
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public:
|
|||||||
ThreadRootRole, /**< The thread root event ID for the event. */
|
ThreadRootRole, /**< The thread root event ID for the event. */
|
||||||
LinkPreviewerRole, /**< The link preview details. */
|
LinkPreviewerRole, /**< The link preview details. */
|
||||||
ChatBarCacheRole, /**< The ChatBarCache to use. */
|
ChatBarCacheRole, /**< The ChatBarCache to use. */
|
||||||
Editable, /**< Whether the component can be edited. */
|
EditableRole, /**< Whether the component can be edited. */
|
||||||
CurrentFocusRole, /**< Whteher the delegate should have focus. */
|
CurrentFocusRole, /**< Whteher the delegate should have focus. */
|
||||||
};
|
};
|
||||||
Q_ENUM(Roles)
|
Q_ENUM(Roles)
|
||||||
@@ -138,7 +138,7 @@ Q_SIGNALS:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
QPointer<NeoChatRoom> m_room;
|
QPointer<NeoChatRoom> m_room;
|
||||||
QString m_eventId = {};
|
QString m_eventId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief NeoChatDateTime for the message.
|
* @brief NeoChatDateTime for the message.
|
||||||
@@ -165,7 +165,7 @@ protected:
|
|||||||
|
|
||||||
QList<MessageComponent> m_components;
|
QList<MessageComponent> m_components;
|
||||||
bool hasComponentType(MessageComponentType::Type type) const;
|
bool hasComponentType(MessageComponentType::Type type) const;
|
||||||
bool hasComponentType(QList<MessageComponentType::Type> types) const;
|
bool hasComponentType(const QList<MessageComponentType::Type> &types) const;
|
||||||
void forEachComponentOfType(MessageComponentType::Type type, std::function<ComponentIt(ComponentIt)> function);
|
void forEachComponentOfType(MessageComponentType::Type type, std::function<ComponentIt(ComponentIt)> function);
|
||||||
void forEachComponentOfType(QList<MessageComponentType::Type> types, std::function<ComponentIt(ComponentIt)> function);
|
void forEachComponentOfType(QList<MessageComponentType::Type> types, std::function<ComponentIt(ComponentIt)> function);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user