Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1526c81a2f | ||
|
|
03d13bb543 | ||
|
|
d8916aa133 | ||
|
|
bb3b3bc088 | ||
|
|
1234132a05 | ||
|
|
52e5ec50c6 | ||
|
|
16f661f6ae | ||
|
|
df1835de2d | ||
|
|
1432ba2368 | ||
|
|
edcbc9ab01 | ||
|
|
1afbd42523 |
@@ -28,7 +28,7 @@ endif()
|
|||||||
# Fix a crash due to problems with quotient's event system. Can probably be removed once the reworked event system is in
|
# Fix a crash due to problems with quotient's event system. Can probably be removed once the reworked event system is in
|
||||||
cmake_policy(SET CMP0063 OLD)
|
cmake_policy(SET CMP0063 OLD)
|
||||||
|
|
||||||
ecm_setup_version(1.0.80
|
ecm_setup_version(1.1.0
|
||||||
VARIABLE_PREFIX NEOCHAT
|
VARIABLE_PREFIX NEOCHAT
|
||||||
VERSION_HEADER ${CMAKE_CURRENT_BINARY_DIR}/neochat-version.h
|
VERSION_HEADER ${CMAKE_CURRENT_BINARY_DIR}/neochat-version.h
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -318,6 +318,11 @@ ToolBar {
|
|||||||
property real progress: 0
|
property real progress: 0
|
||||||
property bool autoAppeared: false
|
property bool autoAppeared: false
|
||||||
|
|
||||||
|
// store each user we autoComplete here, this will be helpful later to generate
|
||||||
|
// the matrix.to links.
|
||||||
|
// This use an hack to define: https://doc.qt.io/qt-5/qml-var.html#property-value-initialization-semantics
|
||||||
|
property var userAutocompleted: ({})
|
||||||
|
|
||||||
ChatDocumentHandler {
|
ChatDocumentHandler {
|
||||||
id: documentHandler
|
id: documentHandler
|
||||||
document: inputField.textDocument
|
document: inputField.textDocument
|
||||||
@@ -469,11 +474,6 @@ ToolBar {
|
|||||||
autoCompleteEndPosition = cursorPosition
|
autoCompleteEndPosition = cursorPosition
|
||||||
}
|
}
|
||||||
|
|
||||||
// store each user we autoComplete here, this will be helpful later to generate
|
|
||||||
// the matrix.to links.
|
|
||||||
// This use an hack to define: https://doc.qt.io/qt-5/qml-var.html#property-value-initialization-semantics
|
|
||||||
property var userAutocompleted: ({})
|
|
||||||
|
|
||||||
function postMessage() {
|
function postMessage() {
|
||||||
roomManager.actionsHandler.postMessage(inputField.text.trim(), attachmentPath,
|
roomManager.actionsHandler.postMessage(inputField.text.trim(), attachmentPath,
|
||||||
replyEventID, editEventId, inputField.userAutocompleted);
|
replyEventID, editEventId, inputField.userAutocompleted);
|
||||||
@@ -487,10 +487,10 @@ ToolBar {
|
|||||||
|
|
||||||
function autoComplete() {
|
function autoComplete() {
|
||||||
documentHandler.replaceAutoComplete(autoCompleteListView.currentItem.displayText)
|
documentHandler.replaceAutoComplete(autoCompleteListView.currentItem.displayText)
|
||||||
// Unfortunally it doesn't
|
|
||||||
if (!autoCompleteListView.currentItem.isEmoji) {
|
if (!autoCompleteListView.currentItem.isEmoji) {
|
||||||
inputField.userAutocompleted[autoCompleteListView.currentItem.displayText] = autoCompleteListView.currentItem.userId;
|
inputField.userAutocompleted[autoCompleteListView.currentItem.displayText] = autoCompleteListView.currentItem.userId;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -582,16 +582,14 @@ ToolBar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function clear() {
|
function clear() {
|
||||||
inputField.clear()
|
inputField.clear();
|
||||||
inputField.userAutocompleted = {};
|
inputField.userAutocompleted = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearEditReply() {
|
function clearEditReply() {
|
||||||
isReply = false;
|
isReply = false;
|
||||||
replyUser = null;
|
replyUser = null;
|
||||||
if (root.editEventId.length > 0) {
|
clear();
|
||||||
clear();
|
|
||||||
}
|
|
||||||
root.replyContent = "";
|
root.replyContent = "";
|
||||||
root.replyEventID = "";
|
root.replyEventID = "";
|
||||||
root.editEventId = "";
|
root.editEventId = "";
|
||||||
@@ -602,9 +600,26 @@ ToolBar {
|
|||||||
inputField.forceActiveFocus()
|
inputField.forceActiveFocus()
|
||||||
}
|
}
|
||||||
|
|
||||||
function edit(editContent, editEventId) {
|
function edit(editContent, editFormatedContent, editEventId) {
|
||||||
|
console.log("Editing ", editContent, "html:", editFormatedContent)
|
||||||
|
// Set the input field in edit mode
|
||||||
inputField.text = editContent;
|
inputField.text = editContent;
|
||||||
root.editEventId = editEventId
|
root.editEventId = editEventId
|
||||||
|
|
||||||
|
// clean autocompletion list
|
||||||
|
inputField.userAutocompleted = {};
|
||||||
|
|
||||||
|
// Fill autocompletion list with values extracted from message.
|
||||||
|
// We can't just iterate on every user in the list and try to
|
||||||
|
// find matching display name since some users have display name
|
||||||
|
// matching frequent words and this will marks too many words as
|
||||||
|
// mentions.
|
||||||
|
const regex = /<a href=\"https:\/\/matrix.to\/#\/(@[a-zA-Z09]*:[a-zA-Z09.]*)\">([^<]*)<\/a>/g;
|
||||||
|
|
||||||
|
let match;
|
||||||
|
while ((match = regex.exec(editFormatedContent.toString())) !== null) {
|
||||||
|
inputField.userAutocompleted[match[2]] = match[1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function closeAll() {
|
function closeAll() {
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ RowLayout {
|
|||||||
QQC2.ToolTip.visible: hovered
|
QQC2.ToolTip.visible: hovered
|
||||||
visible: controlContainer.hovered && author.id === Controller.activeConnection.localUserId && (model.eventType === "emote" || model.eventType === "message")
|
visible: controlContainer.hovered && author.id === Controller.activeConnection.localUserId && (model.eventType === "emote" || model.eventType === "message")
|
||||||
icon.name: "document-edit"
|
icon.name: "document-edit"
|
||||||
onClicked: chatTextInput.edit(message, eventId)
|
onClicked: chatTextInput.edit(message, model.formattedBody, eventId)
|
||||||
}
|
}
|
||||||
QQC2.Button {
|
QQC2.Button {
|
||||||
QQC2.ToolTip.text: i18n("Reply")
|
QQC2.ToolTip.text: i18n("Reply")
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import QtQuick 2.10
|
|||||||
import QtQuick.Controls 2.1 as QQC2
|
import QtQuick.Controls 2.1 as QQC2
|
||||||
import QtQuick.Layouts 1.12
|
import QtQuick.Layouts 1.12
|
||||||
import org.kde.kirigami 2.12 as Kirigami
|
import org.kde.kirigami 2.12 as Kirigami
|
||||||
import QtQuick.Dialogs 1.2
|
|
||||||
import org.kde.kquickimageeditor 1.0 as KQuickImageEditor
|
import org.kde.kquickimageeditor 1.0 as KQuickImageEditor
|
||||||
import QtGraphicalEffects 1.12
|
import QtGraphicalEffects 1.12
|
||||||
import Qt.labs.platform 1.0 as Platform
|
import Qt.labs.platform 1.0 as Platform
|
||||||
@@ -81,21 +80,6 @@ Kirigami.Page {
|
|||||||
onActivated: saveAsAction.trigger();
|
onActivated: saveAsAction.trigger();
|
||||||
} anchors.fill: parent
|
} anchors.fill: parent
|
||||||
|
|
||||||
FileDialog {
|
|
||||||
id: fileDialog
|
|
||||||
title: i18n("Save As")
|
|
||||||
folder: shortcuts.home
|
|
||||||
selectMultiple: false
|
|
||||||
selectExisting: false
|
|
||||||
onAccepted: {
|
|
||||||
fileDialog.close()
|
|
||||||
}
|
|
||||||
onRejected: {
|
|
||||||
fileDialog.close()
|
|
||||||
}
|
|
||||||
Component.onCompleted: visible = false
|
|
||||||
}
|
|
||||||
|
|
||||||
KQuickImageEditor.ImageDocument {
|
KQuickImageEditor.ImageDocument {
|
||||||
id: imageDoc
|
id: imageDoc
|
||||||
path: rootEditorView.imagePath
|
path: rootEditorView.imagePath
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
[Global]
|
[Global]
|
||||||
IconName=org.kde.neochat
|
IconName=org.kde.neochat
|
||||||
Name=Neochat
|
Name=Neochat
|
||||||
Name[az]=Neochat
|
|
||||||
Name[ca]=Neochat
|
Name[ca]=Neochat
|
||||||
Name[ca@valencia]=Neochat
|
Name[ca@valencia]=Neochat
|
||||||
Name[da]=Neochat
|
Name[da]=Neochat
|
||||||
@@ -15,7 +14,6 @@ Name[hu]=Neochat
|
|||||||
Name[it]=Neochat
|
Name[it]=Neochat
|
||||||
Name[nl]=Neochat
|
Name[nl]=Neochat
|
||||||
Name[nn]=Neochat
|
Name[nn]=Neochat
|
||||||
Name[pa]=ਨਿਓ-ਚੈਟ
|
|
||||||
Name[pl]=Neochat
|
Name[pl]=Neochat
|
||||||
Name[pt]=Neochat
|
Name[pt]=Neochat
|
||||||
Name[pt_BR]=Neochat
|
Name[pt_BR]=Neochat
|
||||||
@@ -27,23 +25,16 @@ Name[x-test]=xxNeochatxx
|
|||||||
Name[zh_CN]=Neochat
|
Name[zh_CN]=Neochat
|
||||||
DesktopEntry=org.kde.neochat
|
DesktopEntry=org.kde.neochat
|
||||||
Comment=A client for matrix, the decentralized communication protocol
|
Comment=A client for matrix, the decentralized communication protocol
|
||||||
Comment[az]=Matrix üçün müştəri, mərkəzləşməmiş kommunikasiya protokolu
|
|
||||||
Comment[ca]=Un client per al Matrix, el protocol de comunicacions descentralitzat
|
Comment[ca]=Un client per al Matrix, el protocol de comunicacions descentralitzat
|
||||||
Comment[ca@valencia]=Un client per al Matrix, el protocol de comunicacions descentralitzat
|
|
||||||
Comment[en_GB]=A client for matrix, the decentralised communication protocol
|
Comment[en_GB]=A client for matrix, the decentralised communication protocol
|
||||||
Comment[es]=Un cliente para Matrix, el protocolo de comunicaciones descentralizado
|
Comment[es]=Un cliente para Matrix, el protocolo de comunicaciones descentralizado
|
||||||
Comment[eu]=Matrix, deszentralizatutako komunikazio protokolorako, bezero bat
|
|
||||||
Comment[fi]=Hajautetun Matrix-viestintäyhteyskäytännön asiakasohjelma
|
Comment[fi]=Hajautetun Matrix-viestintäyhteyskäytännön asiakasohjelma
|
||||||
Comment[hu]=Kliens a matrixhoz, a decentralizált kommunikációs protokollhoz
|
Comment[fr]=Un client pour « Matrix », le protocole décentralisé de communications.
|
||||||
Comment[it]=Un client per matrix, il protocollo di comunicazione decentralizzato
|
Comment[it]=Un client per matrix, il protocollo di comunicazione decentralizzato
|
||||||
Comment[nl]=Een client voor matrix, het gedecentraliseerde communicatieprotocol
|
Comment[nl]=Een client voor matrix, het gedecentraliseerde communicatieprotocol
|
||||||
Comment[nn]=Klient for Matrix, den desentraliserte lynmeldingsprotokollen.
|
Comment[nn]=Klient for Matrix, den desentraliserte lynmeldingsprotokollen.
|
||||||
Comment[pa]=ਮੈਟਰਿਕਸ, ਸਰਬ-ਸਾਂਝੇ ਸੰਚਾਰ ਪਰੋਟੋਕਾਲ, ਲਈ ਕਲਾਈਂਟ ਹੈ
|
|
||||||
Comment[pl]=Program do obsługi matriksa, rozproszonego protokołu porozumiewania się
|
Comment[pl]=Program do obsługi matriksa, rozproszonego protokołu porozumiewania się
|
||||||
Comment[pt]=Um cliente para o Matrix, o protocolo descentralizado de comunicações
|
|
||||||
Comment[pt_BR]=Um cliente para o Matrix, o protocolo de comunicação decentralizado
|
Comment[pt_BR]=Um cliente para o Matrix, o protocolo de comunicação decentralizado
|
||||||
Comment[sk]=Klient pre matrix, decentralizovaný komunikačný protokol
|
|
||||||
Comment[sl]=Odjemalec za decentralizirani komunikacijski protokol matrix
|
|
||||||
Comment[sv]=En klient för matrix, det decentraliserade kommunikationsprotokollet
|
Comment[sv]=En klient för matrix, det decentraliserade kommunikationsprotokollet
|
||||||
Comment[uk]=Клієнт matrix, децентралізованого протоколу обміну даними
|
Comment[uk]=Клієнт matrix, децентралізованого протоколу обміну даними
|
||||||
Comment[x-test]=xxA client for matrix, the decentralized communication protocolxx
|
Comment[x-test]=xxA client for matrix, the decentralized communication protocolxx
|
||||||
@@ -51,7 +42,6 @@ Comment[x-test]=xxA client for matrix, the decentralized communication protocolx
|
|||||||
|
|
||||||
[Event/message]
|
[Event/message]
|
||||||
Name=New message
|
Name=New message
|
||||||
Name[az]=Yeni ismarıc
|
|
||||||
Name[ca]=Missatge nou
|
Name[ca]=Missatge nou
|
||||||
Name[ca@valencia]=Missatge nou
|
Name[ca@valencia]=Missatge nou
|
||||||
Name[de]=Neue Nachricht
|
Name[de]=Neue Nachricht
|
||||||
@@ -64,7 +54,6 @@ Name[hu]=Új üzenet
|
|||||||
Name[it]=Nuovo messaggio
|
Name[it]=Nuovo messaggio
|
||||||
Name[nl]=Nieuw bericht
|
Name[nl]=Nieuw bericht
|
||||||
Name[nn]=Ny melding
|
Name[nn]=Ny melding
|
||||||
Name[pa]=ਨਵਾਂ ਸੁਨੇਹਾ
|
|
||||||
Name[pl]=Nowa wiadomość
|
Name[pl]=Nowa wiadomość
|
||||||
Name[pt]=Nova mensagem
|
Name[pt]=Nova mensagem
|
||||||
Name[pt_BR]=Nova mensagem
|
Name[pt_BR]=Nova mensagem
|
||||||
@@ -75,7 +64,6 @@ Name[uk]=Нове повідомлення
|
|||||||
Name[x-test]=xxNew messagexx
|
Name[x-test]=xxNew messagexx
|
||||||
Name[zh_CN]=新消息
|
Name[zh_CN]=新消息
|
||||||
Comment=There is a new message
|
Comment=There is a new message
|
||||||
Comment[az]=Yeni ismarıc var
|
|
||||||
Comment[ca]=Hi ha un missatge nou
|
Comment[ca]=Hi ha un missatge nou
|
||||||
Comment[ca@valencia]=Hi ha un missatge nou
|
Comment[ca@valencia]=Hi ha un missatge nou
|
||||||
Comment[de]=Es ist eine neue Nachricht vorhanden
|
Comment[de]=Es ist eine neue Nachricht vorhanden
|
||||||
@@ -88,7 +76,6 @@ Comment[hu]=Új üzenet érkezett
|
|||||||
Comment[it]=È presente un nuovo messaggio
|
Comment[it]=È presente un nuovo messaggio
|
||||||
Comment[nl]=Er is een nieuw bericht
|
Comment[nl]=Er is een nieuw bericht
|
||||||
Comment[nn]=Du har ei ny melding
|
Comment[nn]=Du har ei ny melding
|
||||||
Comment[pa]=ਨਵਾਂ ਸੁਨੇਹਾ ਹੈ
|
|
||||||
Comment[pl]=Dostępna jest nowa wiadomość
|
Comment[pl]=Dostępna jest nowa wiadomość
|
||||||
Comment[pt]=Tem uma mensagem nova
|
Comment[pt]=Tem uma mensagem nova
|
||||||
Comment[pt_BR]=Existe uma nova mensagem
|
Comment[pt_BR]=Existe uma nova mensagem
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
<binary>neochat</binary>
|
<binary>neochat</binary>
|
||||||
</provides>
|
</provides>
|
||||||
<name>Neochat</name>
|
<name>Neochat</name>
|
||||||
<name xml:lang="az">Neochat</name>
|
|
||||||
<name xml:lang="ca">Neochat</name>
|
<name xml:lang="ca">Neochat</name>
|
||||||
<name xml:lang="ca-valencia">Neochat</name>
|
<name xml:lang="ca-valencia">Neochat</name>
|
||||||
<name xml:lang="da">Neochat</name>
|
<name xml:lang="da">Neochat</name>
|
||||||
@@ -20,7 +19,6 @@
|
|||||||
<name xml:lang="it">Neochat</name>
|
<name xml:lang="it">Neochat</name>
|
||||||
<name xml:lang="nl">Neochat</name>
|
<name xml:lang="nl">Neochat</name>
|
||||||
<name xml:lang="nn">Neochat</name>
|
<name xml:lang="nn">Neochat</name>
|
||||||
<name xml:lang="pa">ਨਿਓ-ਚੈਟ</name>
|
|
||||||
<name xml:lang="pl">Neochat</name>
|
<name xml:lang="pl">Neochat</name>
|
||||||
<name xml:lang="pt">Neochat</name>
|
<name xml:lang="pt">Neochat</name>
|
||||||
<name xml:lang="pt-BR">Neochat</name>
|
<name xml:lang="pt-BR">Neochat</name>
|
||||||
@@ -30,7 +28,6 @@
|
|||||||
<name xml:lang="uk">Neochat</name>
|
<name xml:lang="uk">Neochat</name>
|
||||||
<name xml:lang="x-test">xxNeochatxx</name>
|
<name xml:lang="x-test">xxNeochatxx</name>
|
||||||
<summary>A client for matrix, the decentralized communication protocol</summary>
|
<summary>A client for matrix, the decentralized communication protocol</summary>
|
||||||
<summary xml:lang="az">Matrix üçün müştəri, mərkəzləşməmiş kommunikasiya protokolu</summary>
|
|
||||||
<summary xml:lang="ca">Un client per al Matrix, el protocol de comunicacions descentralitzat</summary>
|
<summary xml:lang="ca">Un client per al Matrix, el protocol de comunicacions descentralitzat</summary>
|
||||||
<summary xml:lang="ca-valencia">Un client per al Matrix, el protocol de comunicacions descentralitzat</summary>
|
<summary xml:lang="ca-valencia">Un client per al Matrix, el protocol de comunicacions descentralitzat</summary>
|
||||||
<summary xml:lang="de">Ein Programm für Matrix, das dezentrale Kommunikationsprotokoll</summary>
|
<summary xml:lang="de">Ein Programm für Matrix, das dezentrale Kommunikationsprotokoll</summary>
|
||||||
@@ -44,7 +41,6 @@
|
|||||||
<summary xml:lang="it">Un client per matrix, il protocollo di comunicazione decentralizzato</summary>
|
<summary xml:lang="it">Un client per matrix, il protocollo di comunicazione decentralizzato</summary>
|
||||||
<summary xml:lang="nl">Een client voor matrix, het gedecentraliseerde communicatieprotocol</summary>
|
<summary xml:lang="nl">Een client voor matrix, het gedecentraliseerde communicatieprotocol</summary>
|
||||||
<summary xml:lang="nn">Ein klient for Matrix, den desentraliserte lynmeldingsprotokollen</summary>
|
<summary xml:lang="nn">Ein klient for Matrix, den desentraliserte lynmeldingsprotokollen</summary>
|
||||||
<summary xml:lang="pa">ਮੈਟਰਿਕਸ, ਸਰਬ-ਸਾਂਝੇ ਸੰਚਾਰ ਪਰੋਟੋਕਾਲ, ਲਈ ਕਲਾਈਂਟ ਹੈ</summary>
|
|
||||||
<summary xml:lang="pl">Program do obsługi matriksa, rozproszonego protokołu porozumiewania się</summary>
|
<summary xml:lang="pl">Program do obsługi matriksa, rozproszonego protokołu porozumiewania się</summary>
|
||||||
<summary xml:lang="pt">Um cliente para o Matrix, o protocolo de comunicação descentralizado</summary>
|
<summary xml:lang="pt">Um cliente para o Matrix, o protocolo de comunicação descentralizado</summary>
|
||||||
<summary xml:lang="pt-BR">Um cliente do Matrix, o protocolo de comunicação descentralizado</summary>
|
<summary xml:lang="pt-BR">Um cliente do Matrix, o protocolo de comunicação descentralizado</summary>
|
||||||
@@ -55,7 +51,6 @@
|
|||||||
<summary xml:lang="x-test">xxA client for matrix, the decentralized communication protocolxx</summary>
|
<summary xml:lang="x-test">xxA client for matrix, the decentralized communication protocolxx</summary>
|
||||||
<description>
|
<description>
|
||||||
<p>A client for matrix, the decentralized communication protocol.</p>
|
<p>A client for matrix, the decentralized communication protocol.</p>
|
||||||
<p xml:lang="az">Matrix üçün müştəri, mərkəzləşməmiş kommunikasiya protokolu.</p>
|
|
||||||
<p xml:lang="ca">Un client per al Matrix, el protocol de comunicacions descentralitzat.</p>
|
<p xml:lang="ca">Un client per al Matrix, el protocol de comunicacions descentralitzat.</p>
|
||||||
<p xml:lang="ca-valencia">Un client per al Matrix, el protocol de comunicacions descentralitzat.</p>
|
<p xml:lang="ca-valencia">Un client per al Matrix, el protocol de comunicacions descentralitzat.</p>
|
||||||
<p xml:lang="de">Ein Programm für Matrix, das dezentrale Kommunikationsprotokoll.</p>
|
<p xml:lang="de">Ein Programm für Matrix, das dezentrale Kommunikationsprotokoll.</p>
|
||||||
@@ -69,7 +64,6 @@
|
|||||||
<p xml:lang="it">Un client per matrix, il protocollo di comunicazione decentralizzato.</p>
|
<p xml:lang="it">Un client per matrix, il protocollo di comunicazione decentralizzato.</p>
|
||||||
<p xml:lang="nl">Een client voor matrix, het gedecentraliseerde communicatieprotocol.</p>
|
<p xml:lang="nl">Een client voor matrix, het gedecentraliseerde communicatieprotocol.</p>
|
||||||
<p xml:lang="nn">Ein klient for Matrix, den desentraliserte lynmeldingsprotokollen.</p>
|
<p xml:lang="nn">Ein klient for Matrix, den desentraliserte lynmeldingsprotokollen.</p>
|
||||||
<p xml:lang="pa">ਮੈਟਰਿਕਸ, ਸਰਬ-ਸਾਂਝੇ ਸੰਚਾਰ ਪਰੋਟੋਕਾਲ, ਲਈ ਕਲਾਈਂਟ ਹੈ।</p>
|
|
||||||
<p xml:lang="pl">Program do obsługi matriksa, rozproszonego protokołu porozumiewania się.</p>
|
<p xml:lang="pl">Program do obsługi matriksa, rozproszonego protokołu porozumiewania się.</p>
|
||||||
<p xml:lang="pt">Um cliente para o Matrix, o protocolo de comunicação descentralizado.</p>
|
<p xml:lang="pt">Um cliente para o Matrix, o protocolo de comunicação descentralizado.</p>
|
||||||
<p xml:lang="pt-BR">Um cliente do Matrix, o protocolo de comunicação descentralizado.</p>
|
<p xml:lang="pt-BR">Um cliente do Matrix, o protocolo de comunicação descentralizado.</p>
|
||||||
@@ -85,7 +79,6 @@
|
|||||||
<category>Network</category>
|
<category>Network</category>
|
||||||
</categories>
|
</categories>
|
||||||
<developer_name>The KDE Community</developer_name>
|
<developer_name>The KDE Community</developer_name>
|
||||||
<developer_name xml:lang="az">KDE Cəmiyyəti</developer_name>
|
|
||||||
<developer_name xml:lang="ca">La comunitat KDE</developer_name>
|
<developer_name xml:lang="ca">La comunitat KDE</developer_name>
|
||||||
<developer_name xml:lang="ca-valencia">La comunitat KDE</developer_name>
|
<developer_name xml:lang="ca-valencia">La comunitat KDE</developer_name>
|
||||||
<developer_name xml:lang="de">Die KDE-Gemeinschaft</developer_name>
|
<developer_name xml:lang="de">Die KDE-Gemeinschaft</developer_name>
|
||||||
@@ -112,13 +105,26 @@
|
|||||||
<value key="KDE::matrix">#neochat:kde.org</value>
|
<value key="KDE::matrix">#neochat:kde.org</value>
|
||||||
<screenshots>
|
<screenshots>
|
||||||
<screenshot type="default">
|
<screenshot type="default">
|
||||||
<image>https://www.plasma-mobile.org/img/post-2020-10/post-2020-10-neochat-timeline.png</image>
|
<image>https://cdn.kde.org/screenshots/neochat/application.png</image>
|
||||||
|
</screenshot>
|
||||||
|
<screenshot>
|
||||||
|
<image>https://cdn.kde.org/screenshots/neochat/application-mobile.png</image>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
</screenshots>
|
</screenshots>
|
||||||
<content_rating type="oars-1.1">
|
<content_rating type="oars-1.1">
|
||||||
<content_attribute id="social-chat">intense</content_attribute>
|
<content_attribute id="social-chat">intense</content_attribute>
|
||||||
</content_rating>
|
</content_rating>
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="1.1.0" date="2021-02-22">
|
||||||
|
<description>
|
||||||
|
<p>Probably the highlight of this release is the completely new login page. It detects the server configuration based on your Matrix Id. This allows you to login to servers requiring Single Sign On (SSO) (like the Mozilla or the incoming Fedora Matrix instance).</p>
|
||||||
|
<p>Servers that require agreeing to the TOS before usage are correctly detected now and redirect to their TOS webpage, allowing the user to agree to them instead of silently failing to load the account.</p>
|
||||||
|
<p>It is now possible to open a room into a new window. This allows you to view and interact with multiple rooms at the same time.</p>
|
||||||
|
<p>We added a few commands to NeoChat (/shrug, /lenny, /join, /ignore, ...).</p>
|
||||||
|
<p>We improved the Plasma integration a bit. Now the number of unread messages is displayed in the Plasma Taskbar.</p>
|
||||||
|
</description>
|
||||||
|
<url>https://carlschwan.eu/2020/02/22/neochat-1.1/</url>
|
||||||
|
</release>
|
||||||
<release version="1.0.1" date="2021-01-13">
|
<release version="1.0.1" date="2021-01-13">
|
||||||
<description>
|
<description>
|
||||||
<p>This version fixes several bugs.</p>
|
<p>This version fixes several bugs.</p>
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Name=Neochat
|
Name=Neochat
|
||||||
Name[az]=Neochat
|
|
||||||
Name[ca]=Neochat
|
Name[ca]=Neochat
|
||||||
Name[ca@valencia]=Neochat
|
Name[ca@valencia]=Neochat
|
||||||
Name[da]=Neochat
|
Name[da]=Neochat
|
||||||
@@ -14,7 +13,6 @@ Name[hu]=Neochat
|
|||||||
Name[it]=Neochat
|
Name[it]=Neochat
|
||||||
Name[nl]=Neochat
|
Name[nl]=Neochat
|
||||||
Name[nn]=Neochat
|
Name[nn]=Neochat
|
||||||
Name[pa]=ਨਿਓ-ਚੈਟ
|
|
||||||
Name[pl]=Neochat
|
Name[pl]=Neochat
|
||||||
Name[pt]=Neochat
|
Name[pt]=Neochat
|
||||||
Name[pt_BR]=Neochat
|
Name[pt_BR]=Neochat
|
||||||
@@ -25,7 +23,6 @@ Name[uk]=Neochat
|
|||||||
Name[x-test]=xxNeochatxx
|
Name[x-test]=xxNeochatxx
|
||||||
Name[zh_CN]=Neochat
|
Name[zh_CN]=Neochat
|
||||||
GenericName=Matrix Client
|
GenericName=Matrix Client
|
||||||
GenericName[az]=Matrix Müştərisi
|
|
||||||
GenericName[ca]=Client del Matrix
|
GenericName[ca]=Client del Matrix
|
||||||
GenericName[ca@valencia]=Client del Matrix
|
GenericName[ca@valencia]=Client del Matrix
|
||||||
GenericName[de]=Matrix-Programm
|
GenericName[de]=Matrix-Programm
|
||||||
@@ -38,7 +35,6 @@ GenericName[hu]=Matrix kliens
|
|||||||
GenericName[it]=Client Matrix
|
GenericName[it]=Client Matrix
|
||||||
GenericName[nl]=Matrix-client
|
GenericName[nl]=Matrix-client
|
||||||
GenericName[nn]=Matrix-klient
|
GenericName[nn]=Matrix-klient
|
||||||
GenericName[pa]=ਮੈਟਰਿਕਸ ਕਲਾਈਂਟ
|
|
||||||
GenericName[pl]=Program Matriksa
|
GenericName[pl]=Program Matriksa
|
||||||
GenericName[pt]=Cliente de Matrix
|
GenericName[pt]=Cliente de Matrix
|
||||||
GenericName[pt_BR]=Cliente Matrix
|
GenericName[pt_BR]=Cliente Matrix
|
||||||
@@ -49,7 +45,6 @@ GenericName[uk]=Клієнт Matrix
|
|||||||
GenericName[x-test]=xxMatrix Clientxx
|
GenericName[x-test]=xxMatrix Clientxx
|
||||||
GenericName[zh_CN]=Matrix 客户端
|
GenericName[zh_CN]=Matrix 客户端
|
||||||
Comment=Client for the Matrix protocol
|
Comment=Client for the Matrix protocol
|
||||||
Comment[az]=Matrix protokolu üçün müştəri
|
|
||||||
Comment[ca]=Client per al protocol Matrix
|
Comment[ca]=Client per al protocol Matrix
|
||||||
Comment[ca@valencia]=Client per al protocol Matrix
|
Comment[ca@valencia]=Client per al protocol Matrix
|
||||||
Comment[de]=Programm für das Matrix-Protokoll
|
Comment[de]=Programm für das Matrix-Protokoll
|
||||||
@@ -62,7 +57,6 @@ Comment[hu]=Kliens a Matrix protokollhoz
|
|||||||
Comment[it]=Client per il protocollo Matrix
|
Comment[it]=Client per il protocollo Matrix
|
||||||
Comment[nl]=Client voor het Matrix-protocol
|
Comment[nl]=Client voor het Matrix-protocol
|
||||||
Comment[nn]=Lynmeldingsklient for Matrix-protokollen
|
Comment[nn]=Lynmeldingsklient for Matrix-protokollen
|
||||||
Comment[pa]=ਮੈਟਰਿਕਸ ਪਰੋਟੋਕਾਲ ਲਈ ਕਲਾਈਂਟ ਹੈ
|
|
||||||
Comment[pl]=Program obsługi protokołu Matriksa
|
Comment[pl]=Program obsługi protokołu Matriksa
|
||||||
Comment[pt]=Cliente para o protocolo Matrix
|
Comment[pt]=Cliente para o protocolo Matrix
|
||||||
Comment[pt_BR]=Cliente para o protocolo Matrix
|
Comment[pt_BR]=Cliente para o protocolo Matrix
|
||||||
|
|||||||
@@ -142,7 +142,6 @@ void ActionsHandler::joinRoom(const QString &alias)
|
|||||||
joinRoomJob->errorString()));
|
joinRoomJob->errorString()));
|
||||||
});
|
});
|
||||||
Quotient::JoinRoomJob::connect(joinRoomJob, &JoinRoomJob::success, [this, joinRoomJob] {
|
Quotient::JoinRoomJob::connect(joinRoomJob, &JoinRoomJob::success, [this, joinRoomJob] {
|
||||||
qDebug() << "joined" << joinRoomJob->roomId();
|
|
||||||
Q_EMIT roomJoined(joinRoomJob->roomId());
|
Q_EMIT roomJoined(joinRoomJob->roomId());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -160,15 +159,15 @@ void ActionsHandler::createRoom(const QString &name, const QString &topic)
|
|||||||
|
|
||||||
void ActionsHandler::postMessage(const QString &text,
|
void ActionsHandler::postMessage(const QString &text,
|
||||||
const QString &attachementPath, const QString &replyEventId, const QString &editEventId,
|
const QString &attachementPath, const QString &replyEventId, const QString &editEventId,
|
||||||
const QVariantMap usernames)
|
const QVariantMap &usernames)
|
||||||
{
|
{
|
||||||
QString rawText = text;
|
QString rawText = text;
|
||||||
QString cleanedText = text;
|
QString cleanedText = text;
|
||||||
|
|
||||||
for (const auto username : usernames.keys()) {
|
|
||||||
const auto replacement = usernames.value(username);
|
for (auto it = usernames.constBegin(); it != usernames.constEnd(); it++) {
|
||||||
cleanedText = cleanedText.replace(username,
|
cleanedText = cleanedText.replace(it.key(),
|
||||||
"[" + username + "](https://matrix.to/#/" + replacement.toString() + ")");
|
"[" + it.key() + "](https://matrix.to/#/" + it.value().toString() + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attachementPath.length() > 0) {
|
if (attachementPath.length() > 0) {
|
||||||
@@ -277,9 +276,6 @@ void ActionsHandler::postMessage(const QString &text,
|
|||||||
if (rawText.indexOf(partPrefix) == 0) {
|
if (rawText.indexOf(partPrefix) == 0) {
|
||||||
rawText = rawText.remove(0, partPrefix.length());
|
rawText = rawText.remove(0, partPrefix.length());
|
||||||
const QStringList splittedText = rawText.split(" ");
|
const QStringList splittedText = rawText.split(" ");
|
||||||
qDebug() << m_room;
|
|
||||||
qDebug() << "m_room";
|
|
||||||
qDebug() << splittedText;
|
|
||||||
if (splittedText.count() == 0 || splittedText[0].isEmpty()) {
|
if (splittedText.count() == 0 || splittedText[0].isEmpty()) {
|
||||||
// leave current room
|
// leave current room
|
||||||
m_connection->leaveRoom(m_room);
|
m_connection->leaveRoom(m_room);
|
||||||
@@ -332,5 +328,5 @@ void ActionsHandler::postMessage(const QString &text,
|
|||||||
cleanedText = cleanedText.remove(0, noticePrefix.length());
|
cleanedText = cleanedText.remove(0, noticePrefix.length());
|
||||||
messageEventType = RoomMessageEvent::MsgType::Notice;
|
messageEventType = RoomMessageEvent::MsgType::Notice;
|
||||||
}
|
}
|
||||||
m_room->postMessage(cleanedText, messageEventType, replyEventId, editEventId);
|
m_room->postMessage(rawText, cleanedText, messageEventType, replyEventId, editEventId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,8 +72,7 @@ public Q_SLOTS:
|
|||||||
///
|
///
|
||||||
/// This also interprets commands if any.
|
/// This also interprets commands if any.
|
||||||
void postMessage(const QString &text, const QString &attachementPath,
|
void postMessage(const QString &text, const QString &attachementPath,
|
||||||
const QString &replyEventId, const QString &editEventId,
|
const QString &replyEventId, const QString &editEventId, const QVariantMap &usernames);
|
||||||
const QVariantMap usernames);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Connection *m_connection = nullptr;
|
Connection *m_connection = nullptr;
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ QHash<int, QByteArray> MessageEventModel::roleNames() const
|
|||||||
roles[ShowSectionRole] = "showSection";
|
roles[ShowSectionRole] = "showSection";
|
||||||
roles[ReactionRole] = "reaction";
|
roles[ReactionRole] = "reaction";
|
||||||
roles[IsEditedRole] = "isEdited";
|
roles[IsEditedRole] = "isEdited";
|
||||||
|
roles[FormattedBodyRole] = "formattedBody";
|
||||||
return roles;
|
return roles;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,6 +335,16 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
|
|||||||
return m_currentRoom->eventToString(evt, Qt::RichText);
|
return m_currentRoom->eventToString(evt, Qt::RichText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (role == FormattedBodyRole) {
|
||||||
|
if (auto e = eventCast<const RoomMessageEvent>(&evt)) {
|
||||||
|
if (e->hasTextContent() && e->mimeType().name() != "text/plain") {
|
||||||
|
return static_cast<const Quotient::EventContent::TextContent *>(e->content())->body;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
if (role == MessageRole) {
|
if (role == MessageRole) {
|
||||||
return m_currentRoom->eventToString(evt);
|
return m_currentRoom->eventToString(evt);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ public:
|
|||||||
LongOperationRole,
|
LongOperationRole,
|
||||||
AnnotationRole,
|
AnnotationRole,
|
||||||
UserMarkerRole,
|
UserMarkerRole,
|
||||||
|
FormattedBodyRole,
|
||||||
|
|
||||||
ReplyRole,
|
ReplyRole,
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,6 @@ void NeoChatRoom::uploadFile(const QUrl &url, const QString &body)
|
|||||||
});
|
});
|
||||||
connect(this, &Room::fileTransferProgress, [=](const QString &id, qint64 progress, qint64 total) {
|
connect(this, &Room::fileTransferProgress, [=](const QString &id, qint64 progress, qint64 total) {
|
||||||
if (id == txnId) {
|
if (id == txnId) {
|
||||||
qDebug() << "Progress:" << progress << total;
|
|
||||||
setFileUploadingProgress(int(float(progress) / float(total) * 100));
|
setFileUploadingProgress(int(float(progress) / float(total) * 100));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -539,19 +538,17 @@ QString msgTypeToString(MessageEventType msgType)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NeoChatRoom::postMessage(const QString &text, MessageEventType type, const QString &replyEventId, const QString &relateToEventId)
|
void NeoChatRoom::postMessage(const QString &rawText, const QString &text, MessageEventType type, const QString &replyEventId, const QString &relateToEventId)
|
||||||
{
|
{
|
||||||
const auto html = markdownToHTML(text);
|
const auto html = markdownToHTML(text);
|
||||||
QString cleanText(text);
|
QString cleanText(text);
|
||||||
cleanText.replace(QRegularExpression("\\[(.+)\\]\\(.+\\)"), "\\1");
|
cleanText.replace(QRegularExpression("\\[(.+)\\]\\(.+\\)"), "\\1");
|
||||||
postHtmlMessage(cleanText, html, type, replyEventId, relateToEventId);
|
postHtmlMessage(rawText, html, type, replyEventId, relateToEventId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NeoChatRoom::postHtmlMessage(const QString &text, const QString &html, MessageEventType type, const QString &replyEventId, const QString &relateToEventId)
|
void NeoChatRoom::postHtmlMessage(const QString &text, const QString &html, MessageEventType type, const QString &replyEventId, const QString &relateToEventId)
|
||||||
{
|
{
|
||||||
QString htmlWithLinks = html;
|
bool isRichText = Qt::mightBeRichText(html);
|
||||||
htmlWithLinks = htmlWithLinks.replace(QRegularExpression("@([^: ]*):([^ ]*\\.[^ ]*)"), "<a href=\"https://matrix.to/#/@$1:$2\">@$1:$2</a>");
|
|
||||||
bool isRichText = Qt::mightBeRichText(htmlWithLinks);
|
|
||||||
bool isReply = !replyEventId.isEmpty();
|
bool isReply = !replyEventId.isEmpty();
|
||||||
bool isEdit = !relateToEventId.isEmpty();
|
bool isEdit = !relateToEventId.isEmpty();
|
||||||
const auto replyIt = findInTimeline(replyEventId);
|
const auto replyIt = findInTimeline(replyEventId);
|
||||||
@@ -564,11 +561,15 @@ void NeoChatRoom::postHtmlMessage(const QString &text, const QString &html, Mess
|
|||||||
QJsonObject json {
|
QJsonObject json {
|
||||||
{"type", "m.room.message"},
|
{"type", "m.room.message"},
|
||||||
{"msgtype", msgTypeToString(type)},
|
{"msgtype", msgTypeToString(type)},
|
||||||
{"body", "* " + (isRichText ? text : htmlWithLinks)},
|
{"body", "* " + text},
|
||||||
|
{"format", "org.matrix.custom.html"},
|
||||||
|
{"formatted_body", html},
|
||||||
{"m.new_content",
|
{"m.new_content",
|
||||||
QJsonObject {
|
QJsonObject {
|
||||||
{"body", (isRichText ? text : htmlWithLinks)},
|
{"body", text},
|
||||||
{"msgtype", msgTypeToString(type)}
|
{"msgtype", msgTypeToString(type)},
|
||||||
|
{"format", "org.matrix.custom.html"},
|
||||||
|
{"formatted_body", html}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{"m.relates_to",
|
{"m.relates_to",
|
||||||
@@ -607,7 +608,7 @@ void NeoChatRoom::postHtmlMessage(const QString &text, const QString &html, Mess
|
|||||||
"\">In reply to</a> <a href=\"https://matrix.to/#/" +
|
"\">In reply to</a> <a href=\"https://matrix.to/#/" +
|
||||||
replyEvt.senderId() + "\">" + replyEvt.senderId() +
|
replyEvt.senderId() + "\">" + replyEvt.senderId() +
|
||||||
"</a><br>" + eventToString(replyEvt, Qt::RichText) +
|
"</a><br>" + eventToString(replyEvt, Qt::RichText) +
|
||||||
"</blockquote></mx-reply>" + (isRichText ? htmlWithLinks : text)
|
"</blockquote></mx-reply>" + (isRichText ? html : text)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|||||||
@@ -139,7 +139,9 @@ public Q_SLOTS:
|
|||||||
void acceptInvitation();
|
void acceptInvitation();
|
||||||
void forget();
|
void forget();
|
||||||
void sendTypingNotification(bool isTyping);
|
void sendTypingNotification(bool isTyping);
|
||||||
void postMessage(const QString &text, Quotient::MessageEventType type = Quotient::MessageEventType::Text, const QString &replyEventId = QString(), const QString &relateToEventId = QString());
|
/// @param rawText The text as it was typed.
|
||||||
|
/// @param cleanedText The text with link to the users.
|
||||||
|
void postMessage(const QString &rawText, const QString &cleanedText, Quotient::MessageEventType type = Quotient::MessageEventType::Text, const QString &replyEventId = QString(), const QString &relateToEventId = QString());
|
||||||
void postHtmlMessage(const QString &text, const QString &html, Quotient::MessageEventType type = Quotient::MessageEventType::Text, const QString &replyEventId = QString(), const QString &relateToEventId = QString());
|
void postHtmlMessage(const QString &text, const QString &html, Quotient::MessageEventType type = Quotient::MessageEventType::Text, const QString &replyEventId = QString(), const QString &relateToEventId = QString());
|
||||||
void changeAvatar(const QUrl &localFile);
|
void changeAvatar(const QUrl &localFile);
|
||||||
void addLocalAlias(const QString &alias);
|
void addLocalAlias(const QString &alias);
|
||||||
|
|||||||
Reference in New Issue
Block a user