Compare commits
106 Commits
work/tobia
...
release/25
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58f5a4bbd3 | ||
|
|
bceeef14de | ||
|
|
bae20aaf84 | ||
|
|
135aa74209 | ||
|
|
2ea6e0425a | ||
|
|
fe55ff19d2 | ||
|
|
c35bdc0592 | ||
|
|
c6fa5a10dd | ||
|
|
f956c33b82 | ||
|
|
0b9295e67e | ||
|
|
0fdade83e0 | ||
|
|
6a25945131 | ||
|
|
218222bc58 | ||
|
|
4300bba804 | ||
|
|
13f766d166 | ||
|
|
fd4e701c51 | ||
|
|
d8ff639374 | ||
|
|
4a50281152 | ||
|
|
acc9289d06 | ||
|
|
235bd21eaf | ||
|
|
c7c1c8fd5c | ||
|
|
fdbee5a508 | ||
|
|
fb58003451 | ||
|
|
debbe8e478 | ||
|
|
0ce86e5a08 | ||
|
|
6935d887c4 | ||
|
|
963346e0f4 | ||
|
|
e37dd88c43 | ||
|
|
2aacb640c8 | ||
|
|
2d63a92702 | ||
|
|
de6731cfda | ||
|
|
7b3c40757c | ||
|
|
87f243ba8b | ||
|
|
192cdc1ff3 | ||
|
|
c72f77f7b6 | ||
|
|
d978f8de50 | ||
|
|
cf216268ab | ||
|
|
f9741a66c4 | ||
|
|
aac3bfda88 | ||
|
|
2722a6f2f0 | ||
|
|
ecf4b85f00 | ||
|
|
ec1413d1ce | ||
|
|
0b7a6df0a3 | ||
|
|
040efa46f9 | ||
|
|
ef4b41e6f8 | ||
|
|
80f81847f4 | ||
|
|
681a3c4036 | ||
|
|
fd27c70b85 | ||
|
|
435124ffe8 | ||
|
|
e2ca698389 | ||
|
|
7e9cfbedc9 | ||
|
|
eeed8a7277 | ||
|
|
aa8c515432 | ||
|
|
ba30014d40 | ||
|
|
d131030d47 | ||
|
|
23a0d91627 | ||
|
|
11d5a37ffe | ||
|
|
256a8e5a1e | ||
|
|
b608921d43 | ||
|
|
45a3984bf9 | ||
|
|
570e0425e9 | ||
|
|
09ed1bd616 | ||
|
|
3201426886 | ||
|
|
96dc83d807 | ||
|
|
ab1fb8ae97 | ||
|
|
c5a4b2a50a | ||
|
|
17fdad3afd | ||
|
|
64bc2691cb | ||
|
|
c7df34a9c8 | ||
|
|
1525c74b10 | ||
|
|
58b85622c5 | ||
|
|
796470d0e0 | ||
|
|
3a43d99575 | ||
|
|
a62798ef1e | ||
|
|
349d0c5f5f | ||
|
|
c917fc0166 | ||
|
|
a4f2d8fca1 | ||
|
|
fd18f88adf | ||
|
|
546694b08e | ||
|
|
699026fc2f | ||
|
|
c61c2d7437 | ||
|
|
56babbc1c5 | ||
|
|
74b3e703c1 | ||
|
|
f620221113 | ||
|
|
896c001430 | ||
|
|
defee77c96 | ||
|
|
4328ab8e89 | ||
|
|
54b081abba | ||
|
|
29686608e1 | ||
|
|
b720ecf29d | ||
|
|
fc859d679a | ||
|
|
3595ad9293 | ||
|
|
73f8ebc54e | ||
|
|
19cf534acd | ||
|
|
9b86088e26 | ||
|
|
a93117fcd6 | ||
|
|
ee20c90498 | ||
|
|
860a2267d5 | ||
|
|
cb9b2648ca | ||
|
|
1e798b6c15 | ||
|
|
124ffba5e0 | ||
|
|
3aaaa610df | ||
|
|
18e883834c | ||
|
|
6acbd2dffd | ||
|
|
dc5c27aa2d | ||
|
|
26774bbe56 |
@@ -20,16 +20,8 @@
|
|||||||
"--talk-name=org.kde.kwalletd5",
|
"--talk-name=org.kde.kwalletd5",
|
||||||
"--talk-name=org.kde.StatusNotifierWatcher",
|
"--talk-name=org.kde.StatusNotifierWatcher",
|
||||||
"--talk-name=org.freedesktop.secrets",
|
"--talk-name=org.freedesktop.secrets",
|
||||||
"--talk-name=org.kde.kuiserver",
|
|
||||||
"--own-name=org.kde.StatusNotifierItem-2-2"
|
"--own-name=org.kde.StatusNotifierItem-2-2"
|
||||||
],
|
],
|
||||||
"cleanup": [
|
|
||||||
"/include",
|
|
||||||
"/lib/*.a",
|
|
||||||
"/lib/cmake",
|
|
||||||
"/lib/pkgconfig",
|
|
||||||
"/share/ndk-modules"
|
|
||||||
],
|
|
||||||
"modules": [
|
"modules": [
|
||||||
{
|
{
|
||||||
"name": "kirigamiaddons",
|
"name": "kirigamiaddons",
|
||||||
@@ -90,8 +82,8 @@
|
|||||||
"sources": [
|
"sources": [
|
||||||
{
|
{
|
||||||
"type": "archive",
|
"type": "archive",
|
||||||
"url": "https://download.gnome.org/sources/libsecret/0.21/libsecret-0.21.7.tar.xz",
|
"url": "https://download.gnome.org/sources/libsecret/0.21/libsecret-0.21.6.tar.xz",
|
||||||
"sha256": "6b452e4750590a2b5617adc40026f28d2f4903de15f1250e1d1c40bfd68ed55e",
|
"sha256": "747b8c175be108c880d3adfb9c3537ea66e520e4ad2dccf5dce58003aeeca090",
|
||||||
"x-checker-data": {
|
"x-checker-data": {
|
||||||
"type": "gnome",
|
"type": "gnome",
|
||||||
"name": "libsecret",
|
"name": "libsecret",
|
||||||
@@ -164,13 +156,13 @@
|
|||||||
"sources": [
|
"sources": [
|
||||||
{
|
{
|
||||||
"type": "archive",
|
"type": "archive",
|
||||||
"url": "https://download.kde.org/stable/release-service/25.04.3/src/kunifiedpush-25.04.3.tar.xz",
|
"url": "https://download.kde.org/stable/kunifiedpush/kunifiedpush-1.0.0.tar.xz",
|
||||||
"sha256": "a16ffe4117b14baa02f3b8ae7de9e509a17359c1b67dcd851aef4f3c3661a1df",
|
"sha256": "2ddeba21306d0307114ec50a2c38159ec62359f9fc6cdd58da30a369fbd550cf",
|
||||||
"x-checker-data": {
|
"x-checker-data": {
|
||||||
"type": "anitya",
|
"type": "anitya",
|
||||||
"project-id": 8763,
|
"project-id": 375055,
|
||||||
"stable-only": true,
|
"stable-only": true,
|
||||||
"url-template": "https://download.kde.org/stable/release-service/$version/src/kunifiedpush-$version.tar.xz"
|
"url-template": "https://download.kde.org/stable/kunifiedpush/kunifiedpush-$version.tar.xz"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,13 +8,13 @@ cmake_minimum_required(VERSION 3.16)
|
|||||||
|
|
||||||
# KDE Applications version, managed by release script.
|
# KDE Applications version, managed by release script.
|
||||||
set(RELEASE_SERVICE_VERSION_MAJOR "25")
|
set(RELEASE_SERVICE_VERSION_MAJOR "25")
|
||||||
set(RELEASE_SERVICE_VERSION_MINOR "11")
|
set(RELEASE_SERVICE_VERSION_MINOR "08")
|
||||||
set(RELEASE_SERVICE_VERSION_MICRO "70")
|
set(RELEASE_SERVICE_VERSION_MICRO "3")
|
||||||
set(RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
|
set(RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
|
||||||
|
|
||||||
project(NeoChat VERSION ${RELEASE_SERVICE_VERSION})
|
project(NeoChat VERSION ${RELEASE_SERVICE_VERSION})
|
||||||
|
|
||||||
set(KF_MIN_VERSION "6.12")
|
set(KF_MIN_VERSION "6.16")
|
||||||
set(QT_MIN_VERSION "6.5")
|
set(QT_MIN_VERSION "6.5")
|
||||||
|
|
||||||
find_package(ECM ${KF_MIN_VERSION} REQUIRED NO_MODULE)
|
find_package(ECM ${KF_MIN_VERSION} REQUIRED NO_MODULE)
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ void ActionsTest::testActions_data()
|
|||||||
QTest::addColumn<std::optional<QString>>("resultText");
|
QTest::addColumn<std::optional<QString>>("resultText");
|
||||||
QTest::addColumn<std::optional<Quotient::RoomMessageEvent::MsgType>>("type");
|
QTest::addColumn<std::optional<Quotient::RoomMessageEvent::MsgType>>("type");
|
||||||
|
|
||||||
QTest::newRow("shrug") << u"/shrug Hello"_s << std::make_optional(u"¯\\\\_(ツ)_/¯ Hello"_s)
|
QTest::newRow("shrug") << u"/shrug Hello"_s << std::make_optional(u"¯\\\\\\_(ツ)\\_/¯ Hello"_s)
|
||||||
<< std::make_optional(Quotient::RoomMessageEvent::MsgType::Text);
|
<< std::make_optional(Quotient::RoomMessageEvent::MsgType::Text);
|
||||||
QTest::newRow("lenny") << u"/lenny Hello"_s << std::make_optional(u"( ͡° ͜ʖ ͡°) Hello"_s) << std::make_optional(Quotient::RoomMessageEvent::MsgType::Text);
|
QTest::newRow("lenny") << u"/lenny Hello"_s << std::make_optional(u"( ͡° ͜ʖ ͡°) Hello"_s) << std::make_optional(Quotient::RoomMessageEvent::MsgType::Text);
|
||||||
QTest::newRow("tableflip") << u"/tableflip Hello"_s << std::make_optional(u"(╯°□°)╯︵ ┻━┻ Hello"_s)
|
QTest::newRow("tableflip") << u"/tableflip Hello"_s << std::make_optional(u"(╯°□°)╯︵ ┻━┻ Hello"_s)
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QTest>
|
#include <QTest>
|
||||||
|
|
||||||
#include <QSignalSpy>
|
|
||||||
#include <Quotient/roommember.h>
|
#include <Quotient/roommember.h>
|
||||||
#include <Quotient/syncdata.h>
|
#include <Quotient/syncdata.h>
|
||||||
#include <qtestcase.h>
|
#include <qtestcase.h>
|
||||||
@@ -33,7 +32,6 @@ private Q_SLOTS:
|
|||||||
void noRoom();
|
void noRoom();
|
||||||
void badParent();
|
void badParent();
|
||||||
void reply();
|
void reply();
|
||||||
void replyMissingUser();
|
|
||||||
void edit();
|
void edit();
|
||||||
void attachment();
|
void attachment();
|
||||||
};
|
};
|
||||||
@@ -104,33 +102,6 @@ void ChatBarCacheTest::reply()
|
|||||||
QCOMPARE(chatBarCache->relationAuthor(), room->member(u"@example:example.org"_s));
|
QCOMPARE(chatBarCache->relationAuthor(), room->member(u"@example:example.org"_s));
|
||||||
QCOMPARE(chatBarCache->relationMessage(), u"This is an example\ntext message"_s);
|
QCOMPARE(chatBarCache->relationMessage(), u"This is an example\ntext message"_s);
|
||||||
QCOMPARE(chatBarCache->attachmentPath(), QString());
|
QCOMPARE(chatBarCache->attachmentPath(), QString());
|
||||||
QCOMPARE(chatBarCache->relationAuthorIsPresent(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChatBarCacheTest::replyMissingUser()
|
|
||||||
{
|
|
||||||
QScopedPointer<ChatBarCache> chatBarCache(new ChatBarCache(room));
|
|
||||||
chatBarCache->setText(u"some text"_s);
|
|
||||||
chatBarCache->setAttachmentPath(u"some/path"_s);
|
|
||||||
chatBarCache->setReplyId(u"$153456789:example.org"_s);
|
|
||||||
|
|
||||||
QCOMPARE(chatBarCache->text(), u"some text"_s);
|
|
||||||
QCOMPARE(chatBarCache->isReplying(), true);
|
|
||||||
QCOMPARE(chatBarCache->replyId(), u"$153456789:example.org"_s);
|
|
||||||
QCOMPARE(chatBarCache->isEditing(), false);
|
|
||||||
QCOMPARE(chatBarCache->editId(), QString());
|
|
||||||
QCOMPARE(chatBarCache->relationAuthor(), room->member(u"@example:example.org"_s));
|
|
||||||
QCOMPARE(chatBarCache->relationMessage(), u"This is an example\ntext message"_s);
|
|
||||||
QCOMPARE(chatBarCache->attachmentPath(), QString());
|
|
||||||
QCOMPARE(chatBarCache->relationAuthorIsPresent(), true);
|
|
||||||
|
|
||||||
QSignalSpy relationAuthorIsPresentSpy(chatBarCache.get(), &ChatBarCache::relationAuthorIsPresentChanged);
|
|
||||||
|
|
||||||
// sync again, which will simulate the reply user leaving the room
|
|
||||||
room->syncNewEvents(u"test-min-sync-extra-sync.json"_s);
|
|
||||||
|
|
||||||
QTRY_COMPARE(relationAuthorIsPresentSpy.count(), 1);
|
|
||||||
QCOMPARE(chatBarCache->relationAuthorIsPresent(), false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatBarCacheTest::edit()
|
void ChatBarCacheTest::edit()
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"state": {
|
|
||||||
"events": [
|
|
||||||
{
|
|
||||||
"content": {
|
|
||||||
"membership": "leave"
|
|
||||||
},
|
|
||||||
"event_id": "$1432735824666PhrSA:example.org",
|
|
||||||
"origin_server_ts": 1432735824666,
|
|
||||||
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
|
|
||||||
"sender": "@example:example.org",
|
|
||||||
"state_key": "@example:example.org",
|
|
||||||
"type": "m.room.member",
|
|
||||||
"unsigned": {
|
|
||||||
"replaces_state": "$143273582443PhrSn:example.org"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
#include <Quotient/roommember.h>
|
#include <Quotient/roommember.h>
|
||||||
#include <Quotient/syncdata.h>
|
#include <Quotient/syncdata.h>
|
||||||
|
|
||||||
#include "models/eventmessagecontentmodel.h"
|
#include "models/messagecontentmodel.h"
|
||||||
|
|
||||||
#include "neochatconnection.h"
|
#include "neochatconnection.h"
|
||||||
#include "testutils.h"
|
#include "testutils.h"
|
||||||
@@ -39,13 +39,13 @@ void MessageContentModelTest::initTestCase()
|
|||||||
void MessageContentModelTest::missingEvent()
|
void MessageContentModelTest::missingEvent()
|
||||||
{
|
{
|
||||||
auto room = new TestUtils::TestRoom(connection, u"#firstRoom:kde.org"_s);
|
auto room = new TestUtils::TestRoom(connection, u"#firstRoom:kde.org"_s);
|
||||||
auto model1 = EventMessageContentModel(room, u"$153456789:example.org"_s);
|
auto model1 = MessageContentModel(room, u"$153456789:example.org"_s);
|
||||||
|
|
||||||
QCOMPARE(model1.rowCount(), 1);
|
QCOMPARE(model1.rowCount(), 1);
|
||||||
QCOMPARE(model1.data(model1.index(0), MessageContentModel::ComponentTypeRole), MessageComponentType::Loading);
|
QCOMPARE(model1.data(model1.index(0), MessageContentModel::ComponentTypeRole), MessageComponentType::Loading);
|
||||||
QCOMPARE(model1.data(model1.index(0), MessageContentModel::DisplayRole), u"Loading"_s);
|
QCOMPARE(model1.data(model1.index(0), MessageContentModel::DisplayRole), u"Loading"_s);
|
||||||
|
|
||||||
auto model2 = EventMessageContentModel(room, u"$153456789:example.org"_s, true);
|
auto model2 = MessageContentModel(room, u"$153456789:example.org"_s, true);
|
||||||
|
|
||||||
QCOMPARE(model2.rowCount(), 1);
|
QCOMPARE(model2.rowCount(), 1);
|
||||||
QCOMPARE(model2.data(model2.index(0), MessageContentModel::ComponentTypeRole), MessageComponentType::Loading);
|
QCOMPARE(model2.data(model2.index(0), MessageContentModel::ComponentTypeRole), MessageComponentType::Loading);
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
#include <Quotient/events/roommessageevent.h>
|
#include <Quotient/events/roommessageevent.h>
|
||||||
|
|
||||||
#include "models/eventmessagecontentmodel.h"
|
#include "models/messagecontentmodel.h"
|
||||||
#include "testutils.h"
|
#include "testutils.h"
|
||||||
|
|
||||||
using namespace Quotient;
|
using namespace Quotient;
|
||||||
@@ -21,7 +21,7 @@ class ReactionModelTest : public QObject
|
|||||||
private:
|
private:
|
||||||
Connection *connection = nullptr;
|
Connection *connection = nullptr;
|
||||||
TestUtils::TestRoom *room = nullptr;
|
TestUtils::TestRoom *room = nullptr;
|
||||||
EventMessageContentModel *parentModel;
|
MessageContentModel *parentModel;
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void initTestCase();
|
void initTestCase();
|
||||||
@@ -34,7 +34,7 @@ void ReactionModelTest::initTestCase()
|
|||||||
{
|
{
|
||||||
connection = Connection::makeMockConnection(u"@bob:kde.org"_s);
|
connection = Connection::makeMockConnection(u"@bob:kde.org"_s);
|
||||||
room = new TestUtils::TestRoom(connection, u"#myroom:kde.org"_s, u"test-reactionmodel-sync.json"_s);
|
room = new TestUtils::TestRoom(connection, u"#myroom:kde.org"_s, u"test-reactionmodel-sync.json"_s);
|
||||||
parentModel = new EventMessageContentModel(room, "123456"_L1);
|
parentModel = new MessageContentModel(room, "123456"_L1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReactionModelTest::basicReaction()
|
void ReactionModelTest::basicReaction()
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
<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>
|
||||||
|
<name xml:lang="ro">NeoChat</name>
|
||||||
<name xml:lang="ru">NeoChat</name>
|
<name xml:lang="ru">NeoChat</name>
|
||||||
<name xml:lang="sa">नवचैट्</name>
|
<name xml:lang="sa">नवचैट्</name>
|
||||||
<name xml:lang="sk">NeoChat</name>
|
<name xml:lang="sk">NeoChat</name>
|
||||||
@@ -49,7 +50,6 @@
|
|||||||
<name xml:lang="ta">நியோச்சாட்</name>
|
<name xml:lang="ta">நியோச்சாட்</name>
|
||||||
<name xml:lang="tr">NeoChat</name>
|
<name xml:lang="tr">NeoChat</name>
|
||||||
<name xml:lang="uk">NeoChat</name>
|
<name xml:lang="uk">NeoChat</name>
|
||||||
<name xml:lang="x-test">xxNeoChatxx</name>
|
|
||||||
<name xml:lang="zh-CN">NeoChat</name>
|
<name xml:lang="zh-CN">NeoChat</name>
|
||||||
<name xml:lang="zh-TW">NeoChat</name>
|
<name xml:lang="zh-TW">NeoChat</name>
|
||||||
<summary>Chat on Matrix</summary>
|
<summary>Chat on Matrix</summary>
|
||||||
@@ -76,6 +76,7 @@
|
|||||||
<summary xml:lang="nn">Prat med via Matrix</summary>
|
<summary xml:lang="nn">Prat med via Matrix</summary>
|
||||||
<summary xml:lang="pl">Rozmawiaj na Matriksie</summary>
|
<summary xml:lang="pl">Rozmawiaj na Matriksie</summary>
|
||||||
<summary xml:lang="pt-BR">Bate-papo na Matrix</summary>
|
<summary xml:lang="pt-BR">Bate-papo na Matrix</summary>
|
||||||
|
<summary xml:lang="ro">Discutați pe Matrix</summary>
|
||||||
<summary xml:lang="ru">Общение в Matrix</summary>
|
<summary xml:lang="ru">Общение в Matrix</summary>
|
||||||
<summary xml:lang="sa">Matrix इत्यत्र गपशपं कुर्वन्तु</summary>
|
<summary xml:lang="sa">Matrix इत्यत्र गपशपं कुर्वन्तु</summary>
|
||||||
<summary xml:lang="sl">Klepet na Matrixu</summary>
|
<summary xml:lang="sl">Klepet na Matrixu</summary>
|
||||||
@@ -83,7 +84,6 @@
|
|||||||
<summary xml:lang="ta">மேட்ரிக்ஸுக்கான உரையாடல் செயலி</summary>
|
<summary xml:lang="ta">மேட்ரிக்ஸுக்கான உரையாடல் செயலி</summary>
|
||||||
<summary xml:lang="tr">Matrix Üzerinde Sohbet</summary>
|
<summary xml:lang="tr">Matrix Üzerinde Sohbet</summary>
|
||||||
<summary xml:lang="uk">Спілкування у Matrix</summary>
|
<summary xml:lang="uk">Спілкування у Matrix</summary>
|
||||||
<summary xml:lang="x-test">xxChat on Matrixxx</summary>
|
|
||||||
<summary xml:lang="zh-TW">在 Matrix 上聊天</summary>
|
<summary xml:lang="zh-TW">在 Matrix 上聊天</summary>
|
||||||
<description>
|
<description>
|
||||||
<p>NeoChat is a chat app that lets you take full advantage of the Matrix network. It provides you with a secure way to send text messages, videos and audio files to your family, colleagues and friends.</p>
|
<p>NeoChat is a chat app that lets you take full advantage of the Matrix network. It provides you with a secure way to send text messages, videos and audio files to your family, colleagues and friends.</p>
|
||||||
@@ -111,16 +111,16 @@
|
|||||||
<p xml:lang="nn">NeoChat er ein prateapp som lèt deg bruka all funksjonalitet i Matrix-nettverket. Du kan utveksla tekst, lyd og videoar med vennar, familie og kollegaar på ein trygg måte.</p>
|
<p xml:lang="nn">NeoChat er ein prateapp som lèt deg bruka all funksjonalitet i Matrix-nettverket. Du kan utveksla tekst, lyd og videoar med vennar, familie og kollegaar på ein trygg måte.</p>
|
||||||
<p xml:lang="pl">NoeChat to aplikacja do rozmów, która umożliwia wykorzystanie wszystkich możliwości Matriksa. Umożliwia wysyłanie wiadomości tekstowych, filmów i dźwięków w bezpieczny sposób do twojej rodziny, kolegów i przyjaciół.</p>
|
<p xml:lang="pl">NoeChat to aplikacja do rozmów, która umożliwia wykorzystanie wszystkich możliwości Matriksa. Umożliwia wysyłanie wiadomości tekstowych, filmów i dźwięków w bezpieczny sposób do twojej rodziny, kolegów i przyjaciół.</p>
|
||||||
<p xml:lang="pt-BR">O NeoChat é um aplicativo de bate-papo que permite que você aproveite ao máximo a rede Matrix. Ele oferece uma maneira segura de enviar mensagens de texto, vídeos e arquivos de áudio para sua família, colegas e amigos.</p>
|
<p xml:lang="pt-BR">O NeoChat é um aplicativo de bate-papo que permite que você aproveite ao máximo a rede Matrix. Ele oferece uma maneira segura de enviar mensagens de texto, vídeos e arquivos de áudio para sua família, colegas e amigos.</p>
|
||||||
|
<p xml:lang="ro">NeoChat e o aplicație de discuții ce vă ajută să profitați din plin de rețeaua Matrix. Aceasta oferă o modalitate sigură de a trimite mesaje textuale, videoclipuri și fișiere audio familiei, colegilor și prietenilor.</p>
|
||||||
<p xml:lang="ru">NeoChat — приложение для общения, предоставляющее все преимущества сети Matrix. С его помощью можно безопасно отправлять текстовые сообщения, видеозаписи и звуковые файлы родственникам, коллегам и друзьям.</p>
|
<p xml:lang="ru">NeoChat — приложение для общения, предоставляющее все преимущества сети Matrix. С его помощью можно безопасно отправлять текстовые сообщения, видеозаписи и звуковые файлы родственникам, коллегам и друзьям.</p>
|
||||||
<p xml:lang="sa">NeoChat इति एकं गपशप-अनुप्रयोगं यत् भवान् Matrix-जालस्य पूर्णं लाभं ग्रहीतुं शक्नोति । एतत् भवन्तं भवतः परिवाराय, सहकारिभ्यः, मित्रेभ्यः च पाठसन्देशान्, भिडियो, श्रव्यसञ्चिकाः च प्रेषयितुं सुरक्षितं मार्गं प्रदाति ।</p>
|
<p xml:lang="sa">NeoChat इति एकं गपशप-अनुप्रयोगं यत् भवान् Matrix-जालस्य पूर्णं लाभं ग्रहीतुं शक्नोति । एतत् भवन्तं भवतः परिवाराय, सहकारिभ्यः, मित्रेभ्यः च पाठसन्देशान्, भिडियो, श्रव्यसञ्चिकाः च प्रेषयितुं सुरक्षितं मार्गं प्रदाति ।</p>
|
||||||
<p xml:lang="sl">NeoChat je aplikacija za klepet, ki vam omogoča, da v celoti izkoristite omrežje Matrix. Zagotavlja vam varen način za pošiljanje besedilnih sporočil, videoposnetkov in zvočnih datotek vaši družini, sodelavcem in prijateljem.</p>
|
<p xml:lang="sl">NeoChat je aplikacija za klepet, ki vam omogoča, da v celoti izkoristite omrežje Matrix. Zagotavlja vam varen način za pošiljanje besedilnih sporočil, videoposnetkov in zvočnih datotek vaši družini, sodelavcem in prijateljem.</p>
|
||||||
<p xml:lang="sv">NeoChat är ett chattprogram som låter dig dra full nytta av Matrix-nätverket. Det ger dig ett säkert sätt att skicka textmeddelanden, videor och ljudfiler till din familj, kollegor och vänner.</p>
|
<p xml:lang="sv">NeoChat är ett chattprogram som låter dig dra full nytta av Matrix-nätverket. Det ger dig ett säkert sätt att skicka textmeddelanden, videor och ljudfiler till din familj, kollegor och vänner.</p>
|
||||||
<p xml:lang="tr">NeoChat, Matrix ağının tüm özelliklerini kullanan bir sohbet uygulamasıdır. Ailenize, arkadaşlarınıza ve iş arkadaşlarınıza metin iletileri, ses ve video dosyaları göndermenin kolay bir yolunu sunar.</p>
|
<p xml:lang="tr">NeoChat, Matrix ağının tüm özelliklerini kullanan bir sohbet uygulamasıdır. Ailenize, arkadaşlarınıza ve iş arkadaşlarınıza metin iletileri, ses ve video dosyaları göndermenin kolay bir yolunu sunar.</p>
|
||||||
<p xml:lang="uk">NeoChat є програмою для спілкування, за допомогою якої ви можете скористатися усіма перевагами мережі Matrix. За її допомогою ви можете безпечно надсилати текстові повідомлення, відео та звукові файли вашим родичам, колегам та друзям.</p>
|
<p xml:lang="uk">NeoChat є програмою для спілкування, за допомогою якої ви можете скористатися усіма перевагами мережі Matrix. За її допомогою ви можете безпечно надсилати текстові повідомлення, відео та звукові файли вашим родичам, колегам та друзям.</p>
|
||||||
<p xml:lang="x-test">xxNeoChat is a chat app that lets you take full advantage of the Matrix network. It provides you with a secure way to send text messages, videos and audio files to your family, colleagues and friends.xx</p>
|
|
||||||
<p xml:lang="zh-TW">NeoChat 是一個讓您能夠完全利用 Matrix 網路的聊天應用程式。它讓您安全地傳送文字訊息、影片或音訊檔給家人、同事或朋友等等。</p>
|
<p xml:lang="zh-TW">NeoChat 是一個讓您能夠完全利用 Matrix 網路的聊天應用程式。它讓您安全地傳送文字訊息、影片或音訊檔給家人、同事或朋友等等。</p>
|
||||||
<p>NeoChat aims to be a fully featured application for the Matrix specification. As such everything in the current stable specification with the notable exceptions of VoIP, threads and some aspects of End-to-End Encryption are supported. There are a few other smaller omissions due to the fact that the Matrix spec is constantly evolving but the aim remains to provide eventual support for the entire spec.</p>
|
<p>NeoChat aims to be a fully featured application for the Matrix specification. As such everything in the current stable specification with the notable exceptions of VoIP, threads and some aspects of End-to-End Encryption are supported. There are a few other smaller omissions due to the fact that the Matrix spec is constantly evolving but the aim remains to provide eventual support for the entire spec.</p>
|
||||||
<p xml:lang="ar">يهدف نيوتشات إلى أن يكون تطبيقًا كامل الميزات لمواصفات ماتركس. على هذا النحو يتم دعم كل شيء في المواصفات المستقرة الحالية مع الاستثناءات الملحوظة لـ VoIP والخيوط وبعض جوانب التشفير من طرف إلى طرف. هناك عدد قليل من الإغفالات الصغيرة الأخرى بسبب حقيقة أن مواصفات ماتركس تتطور باستمرار ، ولكن يبقى الهدف توفير الدعم النهائي للمواصفات بأكملها.</p>
|
<p xml:lang="ar">يهدف نيوتشات إلى أن يكون تطبيقًا كامل الميزات لمواصفات ماتركس. يوفر نيوتشات كل شيء في المواصفات المستقرة الحالية مع الاستثناءات الملحوظة لـ VoIP و تعدد الخيوط وبعض جوانب التعمية من طرف إلى طرف. هناك عدد قليل من الإغفالات الصغيرة الأخرى بسبب حقيقة أن مواصفات ماتركس تتطور باستمرار، ولكن يبقى الهدف توفير تطبيق للمواصفات بأكملها.</p>
|
||||||
<p xml:lang="ca">NeoChat pretén ser una aplicació amb totes les característiques per a l'especificació de Matrix. Com a tal, s'ha implementat tota l'especificació actual estable amb les notables excepcions de la VoIP, fils i alguns aspectes de l'encriptatge d'extrem a extrem. Hi ha algunes altres omissions més petites a causa del fet que l'especificació de Matrix està evolucionant constantment, però l'objectiu segueix sent proporcionar suport eventual per a tota l'especificació.</p>
|
<p xml:lang="ca">NeoChat pretén ser una aplicació amb totes les característiques per a l'especificació de Matrix. Com a tal, s'ha implementat tota l'especificació actual estable amb les notables excepcions de la VoIP, fils i alguns aspectes de l'encriptatge d'extrem a extrem. Hi ha algunes altres omissions més petites a causa del fet que l'especificació de Matrix està evolucionant constantment, però l'objectiu segueix sent proporcionar suport eventual per a tota l'especificació.</p>
|
||||||
<p xml:lang="ca-valencia">NeoChat pretén ser una aplicació amb totes les característiques per a l'especificació de Matrix. Com a tal, s'ha implementat tota l'especificació actual estable amb les notables excepcions de la VoIP, fils i alguns aspectes de l'encriptació d'extrem a extrem. Hi ha algunes altres omissions més xicotetes a causa del fet que l'especificació de Matrix està evolucionant constantment, però l'objectiu seguix sent proporcionar suport eventual per a tota l'especificació.</p>
|
<p xml:lang="ca-valencia">NeoChat pretén ser una aplicació amb totes les característiques per a l'especificació de Matrix. Com a tal, s'ha implementat tota l'especificació actual estable amb les notables excepcions de la VoIP, fils i alguns aspectes de l'encriptació d'extrem a extrem. Hi ha algunes altres omissions més xicotetes a causa del fet que l'especificació de Matrix està evolucionant constantment, però l'objectiu seguix sent proporcionar suport eventual per a tota l'especificació.</p>
|
||||||
<p xml:lang="de">NeoChat versucht eine vollumfängliche Anwendung für die Spezifikation von Matrix zu sein. Damit wird alles der aktuellen stabilen Spezifikation mit den erwähnenswerten Ausnahmen von VoIP, Diskussionsfäden und ein paar Teilen der Ende-zu-Ende-Verschlüsselung unterstützt. Zudem sind andere kleinere Auslassungen vorhanden, da sich die Matrixspezifikation ständig weiterentwickelt. Nichtsdestotrotz soll letztendlich die gesamte Spezifikation unterstützt werden.</p>
|
<p xml:lang="de">NeoChat versucht eine vollumfängliche Anwendung für die Spezifikation von Matrix zu sein. Damit wird alles der aktuellen stabilen Spezifikation mit den erwähnenswerten Ausnahmen von VoIP, Diskussionsfäden und ein paar Teilen der Ende-zu-Ende-Verschlüsselung unterstützt. Zudem sind andere kleinere Auslassungen vorhanden, da sich die Matrixspezifikation ständig weiterentwickelt. Nichtsdestotrotz soll letztendlich die gesamte Spezifikation unterstützt werden.</p>
|
||||||
@@ -145,16 +145,16 @@
|
|||||||
<p xml:lang="pl">NeoChat w zamyśle ma być pełnowartościową aplikacją wg wytycznych Matriksa. Z tego powodu, wszystko, co jest obecnie w stabilnych wytycznych z pominięciem VoIP, wątków i niektórych części szyfrowania Użytkownik-do-Użytkownika są obecnie obsługiwane. Pominięto też kilka mniejszych rzeczy ze względu na ciągły rozwój wytycznych Matriksa, lecz celem nadal jest zapewnienie obsługi wszystkich wytycznych.</p>
|
<p xml:lang="pl">NeoChat w zamyśle ma być pełnowartościową aplikacją wg wytycznych Matriksa. Z tego powodu, wszystko, co jest obecnie w stabilnych wytycznych z pominięciem VoIP, wątków i niektórych części szyfrowania Użytkownik-do-Użytkownika są obecnie obsługiwane. Pominięto też kilka mniejszych rzeczy ze względu na ciągły rozwój wytycznych Matriksa, lecz celem nadal jest zapewnienie obsługi wszystkich wytycznych.</p>
|
||||||
<p xml:lang="pt">O NeoChat pretende ser uma aplicação completa para a especificação do Matrix. Como tal, tudo o que existe na especificação estável actual, com as notáveis excepções do VoIP, tópicos e alguns aspectos da Encriptação Ponto-a-Ponto, são suportados. Existem mais algumas omissões, devido ao facto que a norma do Matrix está em constante evolução, mas o objectivo continua a ser oferecer o suporte eventual para a norma por inteiro.</p>
|
<p xml:lang="pt">O NeoChat pretende ser uma aplicação completa para a especificação do Matrix. Como tal, tudo o que existe na especificação estável actual, com as notáveis excepções do VoIP, tópicos e alguns aspectos da Encriptação Ponto-a-Ponto, são suportados. Existem mais algumas omissões, devido ao facto que a norma do Matrix está em constante evolução, mas o objectivo continua a ser oferecer o suporte eventual para a norma por inteiro.</p>
|
||||||
<p xml:lang="pt-BR">O NeoChat pretende ser um aplicativo completo para a especificação Matrix. Dessa forma, tudo na especificação estável atual, com as notáveis exceções de VoIP, tópicos e alguns aspectos da criptografia de ponta a ponta, é suportado. Há algumas outras pequenas omissões devido ao fato de a especificação Matrix estar em constante evolução, mas o objetivo continua sendo fornecer suporte eventual para toda a especificação.</p>
|
<p xml:lang="pt-BR">O NeoChat pretende ser um aplicativo completo para a especificação Matrix. Dessa forma, tudo na especificação estável atual, com as notáveis exceções de VoIP, tópicos e alguns aspectos da criptografia de ponta a ponta, é suportado. Há algumas outras pequenas omissões devido ao fato de a especificação Matrix estar em constante evolução, mas o objetivo continua sendo fornecer suporte eventual para toda a especificação.</p>
|
||||||
|
<p xml:lang="ro">NeoChat vrea să fie o aplicație completă pentru specificațiile Matrix. Astfel, susține tot ce se găsește acum în specificațiile stabile cu excepția VoIP, a firelor de discuții, și a unor părți din criptarea punct-la-punct. Sunt și câteva omisiuni minore din cauza faptului că specificația Matrix evoluează continuu, dar scopul rămâne acela de a implementa întreaga specificație.</p>
|
||||||
<p xml:lang="ru">Целью создания NeoChat является полноценная реализация программы для спецификации Matrix. Как следствие, реализовано всё в текущей стабильной спецификации (за исключением голосовой интернет-связи, потоков и некоторых аспектов сквозного шифрования). Есть также несколько других незначительных пробелов, обусловленных постоянными изменениями спецификации Matrix. Тем не менее, стоит задача в итоге предоставить полную поддержку спецификации.</p>
|
<p xml:lang="ru">Целью создания NeoChat является полноценная реализация программы для спецификации Matrix. Как следствие, реализовано всё в текущей стабильной спецификации (за исключением голосовой интернет-связи, потоков и некоторых аспектов сквозного шифрования). Есть также несколько других незначительных пробелов, обусловленных постоянными изменениями спецификации Matrix. Тем не менее, стоит задача в итоге предоставить полную поддержку спецификации.</p>
|
||||||
<p xml:lang="sa">NeoChat इत्यस्य उद्देश्यं Matrix विनिर्देशस्य कृते पूर्णतया विशेषतायुक्तः अनुप्रयोगः भवितुम् अस्ति । यथा तथा वर्तमानस्थिरविनिर्देशे सर्वं VoIP इत्यस्य उल्लेखनीयअपवादैः सह, थ्रेड्स तथा च End-to-End Encryption इत्यस्य केचन पक्षाः समर्थिताः सन्ति । अन्ये कतिचन लघु लोपाः सन्ति यतोहि Matrix spec निरन्तरं विकसितः अस्ति परन्तु उद्देश्यं सम्पूर्ण spec कृते अन्ततः समर्थनं प्रदातुं अवशिष्टम् अस्ति</p>
|
<p xml:lang="sa">NeoChat इत्यस्य उद्देश्यं Matrix विनिर्देशस्य कृते पूर्णतया विशेषतायुक्तः अनुप्रयोगः भवितुम् अस्ति । यथा तथा वर्तमानस्थिरविनिर्देशे सर्वं VoIP इत्यस्य उल्लेखनीयअपवादैः सह, थ्रेड्स तथा च End-to-End Encryption इत्यस्य केचन पक्षाः समर्थिताः सन्ति । अन्ये कतिचन लघु लोपाः सन्ति यतोहि Matrix spec निरन्तरं विकसितः अस्ति परन्तु उद्देश्यं सम्पूर्ण spec कृते अन्ततः समर्थनं प्रदातुं अवशिष्टम् अस्ति</p>
|
||||||
<p xml:lang="sl">Neochat cilja, da bi bila popolna aplikacija po specifikaciji Matrixa. Kot takšna vsebuje vse v trenutni stabilni specifikaciji z pomembnimi izjemami pri VoIP, nitih in nekaterih vidikov šifriranja od konca do konca. Obstaja nekaj drugih manjših opustitev zaradi dejstva, da se specifikacija Matrix nenehno razvija, vendar cilj ostaja zagotoviti morebitno podporo celotni specifikaciji.</p>
|
<p xml:lang="sl">Neochat cilja, da bi bila popolna aplikacija po specifikaciji Matrixa. Kot takšna vsebuje vse v trenutni stabilni specifikaciji z pomembnimi izjemami pri VoIP, nitih in nekaterih vidikov šifriranja od konca do konca. Obstaja nekaj drugih manjših opustitev zaradi dejstva, da se specifikacija Matrix nenehno razvija, vendar cilj ostaja zagotoviti morebitno podporo celotni specifikaciji.</p>
|
||||||
<p xml:lang="sv">NeoChat har som mål att vara ett fullständigt program enligt Matrix-specifikationen. Som sådant stöds allt i den nuvarande stabila specifikationen, med de nämnvärda undantagen VoIP, trådar och några aspekter av kryptering hela vägen. Det finns några ytterligare utelämnanden på grund av att Matrix-specifikationen hela tiden utvecklas, men målet förblir att till slut erbjuda stöd för hela specifikationen.</p>
|
<p xml:lang="sv">NeoChat har som mål att vara ett fullständigt program enligt Matrix-specifikationen. Som sådant stöds allt i den nuvarande stabila specifikationen, med de nämnvärda undantagen VoIP, trådar och några aspekter av kryptering hela vägen. Det finns några ytterligare utelämnanden på grund av att Matrix-specifikationen hela tiden utvecklas, men målet förblir att till slut erbjuda stöd för hela specifikationen.</p>
|
||||||
<p xml:lang="tr">NeoChat, Matrix belirtimi için tam özellikli bir uygulama olmayı hedefler. Bu nedenle; VoIP, ileti zincirleri ve Uçtan Uca Şifreleme’nin bazı yönleri gibi dikkate değer istisnalar dışında var olan kararlı belirtimdeki her şey desteklenir. Matrix belirtiminin sürekli gelişmesi nedeniyle birkaç küçük eksiklik daha var; ancak amaç tüm belirtim için nihai destek sağlamak olmayı sürdürüyor.</p>
|
<p xml:lang="tr">NeoChat, Matrix belirtimi için tam özellikli bir uygulama olmayı hedefler. Bu nedenle; VoIP, ileti zincirleri ve Uçtan Uca Şifreleme’nin bazı yönleri gibi dikkate değer istisnalar dışında var olan kararlı belirtimdeki her şey desteklenir. Matrix belirtiminin sürekli gelişmesi nedeniyle birkaç küçük eksiklik daha var; ancak amaç tüm belirtim için nihai destek sağlamak olmayı sürdürüyor.</p>
|
||||||
<p xml:lang="uk">Метою створення NeoChat є повноцінна реалізація програми для специфікації Matrix. Як наслідок, реалізовано усе у поточній стабільній специфікації, окрім голосового інтернет-зв'язку, потоків та деяких аспектів міжвузлового шифрування. Є також декілька інших незначних прогалин через те, що специфікація Matrix постійно змінюється, але метою лишається повна підтримка специфікації.</p>
|
<p xml:lang="uk">Метою створення NeoChat є повноцінна реалізація програми для специфікації Matrix. Як наслідок, реалізовано усе у поточній стабільній специфікації, окрім голосового інтернет-зв'язку, потоків та деяких аспектів міжвузлового шифрування. Є також декілька інших незначних прогалин через те, що специфікація Matrix постійно змінюється, але метою лишається повна підтримка специфікації.</p>
|
||||||
<p xml:lang="x-test">xxNeoChat aims to be a fully featured application for the Matrix specification. As such everything in the current stable specification with the notable exceptions of VoIP, threads and some aspects of End-to-End Encryption are supported. There are a few other smaller omissions due to the fact that the Matrix spec is constantly evolving but the aim remains to provide eventual support for the entire spec.xx</p>
|
|
||||||
<p xml:lang="zh-TW">NeoChat 以完整支援 Matrix 標準為目標,因此目前穩定版標準除了 VoIP、對話串與端對端加密的某些部分以外的所有部分都有支援。其他部分還有一些較小的不支援的部分,這是因為 Matrix 標準隨時都在改進,但目標仍然時最終提供整個標準的完整支援。</p>
|
<p xml:lang="zh-TW">NeoChat 以完整支援 Matrix 標準為目標,因此目前穩定版標準除了 VoIP、對話串與端對端加密的某些部分以外的所有部分都有支援。其他部分還有一些較小的不支援的部分,這是因為 Matrix 標準隨時都在改進,但目標仍然時最終提供整個標準的完整支援。</p>
|
||||||
<p>Due to the nature of the Matrix specification development NeoChat also supports numerous unstable features. Currently these are:</p>
|
<p>Due to the nature of the Matrix specification development NeoChat also supports numerous unstable features. Currently these are:</p>
|
||||||
<p xml:lang="ar">نظرًا لطبيعة تطوير مواصفات ماتركس، يدعم نيوتشات أيضًا العديد من الميزات غير المستقرة وهي:</p>
|
<p xml:lang="ar">نظرًا لطبيعة تطوير مواصفات ماتركس، يوفر نيوتشات أيضًا العديد من الميزات غير المستقرة وهي:</p>
|
||||||
<p xml:lang="ca">A causa de la naturalesa del desenvolupament de l'especificació de Matrix, el NeoChat també implementa nombroses característiques inestables. Actualment són:</p>
|
<p xml:lang="ca">A causa de la naturalesa del desenvolupament de l'especificació de Matrix, el NeoChat també implementa nombroses característiques inestables. Actualment són:</p>
|
||||||
<p xml:lang="ca-valencia">A causa de la naturalea del desenvolupament de l'especificació de Matrix, NeoChat també implementa nombroses característiques inestables. Actualment són:</p>
|
<p xml:lang="ca-valencia">A causa de la naturalea del desenvolupament de l'especificació de Matrix, NeoChat també implementa nombroses característiques inestables. Actualment són:</p>
|
||||||
<p xml:lang="de">Durch die Weiterentwicklung der Matrix-Spezifikation unterstützt auch NeoChat einige als noch instabil gekennzeichnete Funktionen. Derzeit sind das:</p>
|
<p xml:lang="de">Durch die Weiterentwicklung der Matrix-Spezifikation unterstützt auch NeoChat einige als noch instabil gekennzeichnete Funktionen. Derzeit sind das:</p>
|
||||||
@@ -179,6 +179,7 @@
|
|||||||
<p xml:lang="pl">Ze względu na sposób rozwoju Matriksa, NeoChat obsługuje także kilka niestabilnych możliwości. Obecnie są to:</p>
|
<p xml:lang="pl">Ze względu na sposób rozwoju Matriksa, NeoChat obsługuje także kilka niestabilnych możliwości. Obecnie są to:</p>
|
||||||
<p xml:lang="pt">Devido à natureza do desenvolvimento da especificação do Matrix, o NeoChat também suporta diversas funcionalidades instáveis. De momento são:</p>
|
<p xml:lang="pt">Devido à natureza do desenvolvimento da especificação do Matrix, o NeoChat também suporta diversas funcionalidades instáveis. De momento são:</p>
|
||||||
<p xml:lang="pt-BR">Devido à natureza do desenvolvimento da especificação Matrix, o NeoChat também suporta diversos recursos instáveis. Atualmente, são eles:</p>
|
<p xml:lang="pt-BR">Devido à natureza do desenvolvimento da especificação Matrix, o NeoChat também suporta diversos recursos instáveis. Atualmente, são eles:</p>
|
||||||
|
<p xml:lang="ro">Datorită modului de dezvoltare a specificațiilor Matrix, NeoChat susține și numeroase caracteristici nestabile. Acum, acestea sunt:</p>
|
||||||
<p xml:lang="ru">В силу природы разработки спецификации Matrix в NeoChat тоже предусмотрена поддержка многочисленных нестабильных возможностей. В текущей версии это следующие возможности:</p>
|
<p xml:lang="ru">В силу природы разработки спецификации Matrix в NeoChat тоже предусмотрена поддержка многочисленных нестабильных возможностей. В текущей версии это следующие возможности:</p>
|
||||||
<p xml:lang="sa">Matrix विनिर्देशविकासस्य प्रकृतेः कारणात् NeoChat अपि अनेकानाम् अस्थिरविशेषतानां समर्थनं करोति । सम्प्रति एते सन्ति :</p>
|
<p xml:lang="sa">Matrix विनिर्देशविकासस्य प्रकृतेः कारणात् NeoChat अपि अनेकानाम् अस्थिरविशेषतानां समर्थनं करोति । सम्प्रति एते सन्ति :</p>
|
||||||
<p xml:lang="sl">Zaradi narave razvoja specifikacije Matrixa NeoChat podpira tudi številne nestabilne zmožnosti. Trenutno so to:</p>
|
<p xml:lang="sl">Zaradi narave razvoja specifikacije Matrixa NeoChat podpira tudi številne nestabilne zmožnosti. Trenutno so to:</p>
|
||||||
@@ -186,7 +187,6 @@
|
|||||||
<p xml:lang="ta">மேட்ரிக்ஸு நெறிமுறை வரையறுக்கப்படும் விதத்தின் காரணமாக, பல நிலையற்ற அம்சங்களையும் நியோச்சாட் ஆதரிக்கிறது. தற்போது ஆதரிக்கப்படுபவை:</p>
|
<p xml:lang="ta">மேட்ரிக்ஸு நெறிமுறை வரையறுக்கப்படும் விதத்தின் காரணமாக, பல நிலையற்ற அம்சங்களையும் நியோச்சாட் ஆதரிக்கிறது. தற்போது ஆதரிக்கப்படுபவை:</p>
|
||||||
<p xml:lang="tr">NeoChat, Matrix belirtimi geliştirmesinin doğası gereği çok sayıda kararsız özelliği de destekler. Şu anda bunlar:</p>
|
<p xml:lang="tr">NeoChat, Matrix belirtimi geliştirmesinin doğası gereği çok sayıda kararsız özelliği de destekler. Şu anda bunlar:</p>
|
||||||
<p xml:lang="uk">Через природу розробки специфікації Matrix, у NeoChat також передбачено підтримку численних нестабільних можливостей. У поточній версії цими можливостями є:</p>
|
<p xml:lang="uk">Через природу розробки специфікації Matrix, у NeoChat також передбачено підтримку численних нестабільних можливостей. У поточній версії цими можливостями є:</p>
|
||||||
<p xml:lang="x-test">xxDue to the nature of the Matrix specification development NeoChat also supports numerous unstable features. Currently these are:xx</p>
|
|
||||||
<p xml:lang="zh-TW">由於 Matrix 標準的開發流程的緣故,NeoChat 也支援數個非穩定版的功能。目前這些功能是:</p>
|
<p xml:lang="zh-TW">由於 Matrix 標準的開發流程的緣故,NeoChat 也支援數個非穩定版的功能。目前這些功能是:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Polls - MSC3381</li>
|
<li>Polls - MSC3381</li>
|
||||||
@@ -214,6 +214,7 @@
|
|||||||
<li xml:lang="pl">Ankiety - MSC3381</li>
|
<li xml:lang="pl">Ankiety - MSC3381</li>
|
||||||
<li xml:lang="pt">Inquéritos - MSC3381</li>
|
<li xml:lang="pt">Inquéritos - MSC3381</li>
|
||||||
<li xml:lang="pt-BR">Enquetes - MSC3381</li>
|
<li xml:lang="pt-BR">Enquetes - MSC3381</li>
|
||||||
|
<li xml:lang="ro">Sondaje - MSC3381</li>
|
||||||
<li xml:lang="ru">Голосования — MSC3381</li>
|
<li xml:lang="ru">Голосования — MSC3381</li>
|
||||||
<li xml:lang="sa">मतदान - MSC3381</li>
|
<li xml:lang="sa">मतदान - MSC3381</li>
|
||||||
<li xml:lang="sl">Polls - MSC3381</li>
|
<li xml:lang="sl">Polls - MSC3381</li>
|
||||||
@@ -221,7 +222,6 @@
|
|||||||
<li xml:lang="ta">வாக்கெடுப்புகள் - MSC3381</li>
|
<li xml:lang="ta">வாக்கெடுப்புகள் - MSC3381</li>
|
||||||
<li xml:lang="tr">Anketler — MSC3381</li>
|
<li xml:lang="tr">Anketler — MSC3381</li>
|
||||||
<li xml:lang="uk">Опитування - MSC3381</li>
|
<li xml:lang="uk">Опитування - MSC3381</li>
|
||||||
<li xml:lang="x-test">xxPolls - MSC3381xx</li>
|
|
||||||
<li xml:lang="zh-TW">投票 - MSC3381</li>
|
<li xml:lang="zh-TW">投票 - MSC3381</li>
|
||||||
<li>Sticker Packs - MSC2545</li>
|
<li>Sticker Packs - MSC2545</li>
|
||||||
<li xml:lang="ar">حزم الملصقات - MSC2545</li>
|
<li xml:lang="ar">حزم الملصقات - MSC2545</li>
|
||||||
@@ -248,6 +248,7 @@
|
|||||||
<li xml:lang="pl">Paczki naklejek - MSC2545</li>
|
<li xml:lang="pl">Paczki naklejek - MSC2545</li>
|
||||||
<li xml:lang="pt">Pacotes de Autocolantes - MSC2545</li>
|
<li xml:lang="pt">Pacotes de Autocolantes - MSC2545</li>
|
||||||
<li xml:lang="pt-BR">Pacotes de Stickers - MSC2545</li>
|
<li xml:lang="pt-BR">Pacotes de Stickers - MSC2545</li>
|
||||||
|
<li xml:lang="ro">Colecții de abțibilduri - MSC2545</li>
|
||||||
<li xml:lang="ru">Наборы стикеров — MSC2545</li>
|
<li xml:lang="ru">Наборы стикеров — MSC2545</li>
|
||||||
<li xml:lang="sa">स्टिकर पैक - MSC2545</li>
|
<li xml:lang="sa">स्टिकर पैक - MSC2545</li>
|
||||||
<li xml:lang="sl">Sticker Packs - MSC2545</li>
|
<li xml:lang="sl">Sticker Packs - MSC2545</li>
|
||||||
@@ -255,7 +256,6 @@
|
|||||||
<li xml:lang="ta">ஒட்டி தொகுப்புகள் - MSC2545</li>
|
<li xml:lang="ta">ஒட்டி தொகுப்புகள் - MSC2545</li>
|
||||||
<li xml:lang="tr">Çıkartma Paketleri — MSC2545</li>
|
<li xml:lang="tr">Çıkartma Paketleri — MSC2545</li>
|
||||||
<li xml:lang="uk">Пакунки наліпок - MSC2545</li>
|
<li xml:lang="uk">Пакунки наліпок - MSC2545</li>
|
||||||
<li xml:lang="x-test">xxSticker Packs - MSC2545xx</li>
|
|
||||||
<li xml:lang="zh-TW">貼圖包 - MSC2545</li>
|
<li xml:lang="zh-TW">貼圖包 - MSC2545</li>
|
||||||
<li>Location Events - MSC3488</li>
|
<li>Location Events - MSC3488</li>
|
||||||
<li xml:lang="ar">موقع الأحداث - MSC3488</li>
|
<li xml:lang="ar">موقع الأحداث - MSC3488</li>
|
||||||
@@ -282,6 +282,7 @@
|
|||||||
<li xml:lang="pl">Wydarzenia w miejscach - MSC3488</li>
|
<li xml:lang="pl">Wydarzenia w miejscach - MSC3488</li>
|
||||||
<li xml:lang="pt">Eventos com Localizações - MSC3488</li>
|
<li xml:lang="pt">Eventos com Localizações - MSC3488</li>
|
||||||
<li xml:lang="pt-BR">Localização de eventos - MSC3488</li>
|
<li xml:lang="pt-BR">Localização de eventos - MSC3488</li>
|
||||||
|
<li xml:lang="ro">Evenimente de amplasare - MSC3488</li>
|
||||||
<li xml:lang="ru">События местоположения — MSC3488</li>
|
<li xml:lang="ru">События местоположения — MSC3488</li>
|
||||||
<li xml:lang="sa">स्थान घटनाएँ - MSC3488</li>
|
<li xml:lang="sa">स्थान घटनाएँ - MSC3488</li>
|
||||||
<li xml:lang="sl">Location Events - MSC3488</li>
|
<li xml:lang="sl">Location Events - MSC3488</li>
|
||||||
@@ -289,7 +290,6 @@
|
|||||||
<li xml:lang="ta">இட நிகழ்வுகள் - MSC3488</li>
|
<li xml:lang="ta">இட நிகழ்வுகள் - MSC3488</li>
|
||||||
<li xml:lang="tr">Konum Etkinlikleri — MSC3488</li>
|
<li xml:lang="tr">Konum Etkinlikleri — MSC3488</li>
|
||||||
<li xml:lang="uk">Місцеві зустрічі - MSC3488</li>
|
<li xml:lang="uk">Місцеві зустрічі - MSC3488</li>
|
||||||
<li xml:lang="x-test">xxLocation Events - MSC3488xx</li>
|
|
||||||
<li xml:lang="zh-TW">位置事件 - MSC3488</li>
|
<li xml:lang="zh-TW">位置事件 - MSC3488</li>
|
||||||
</ul>
|
</ul>
|
||||||
</description>
|
</description>
|
||||||
@@ -352,6 +352,7 @@
|
|||||||
<caption xml:lang="pl">Główny widok z wykazem pokojów, rozmowami i szczegółami pokojów</caption>
|
<caption xml:lang="pl">Główny widok z wykazem pokojów, rozmowami i szczegółami pokojów</caption>
|
||||||
<caption xml:lang="pt">A área principal com a lista de salas e com informações sobre a conversa e a sala</caption>
|
<caption xml:lang="pt">A área principal com a lista de salas e com informações sobre a conversa e a sala</caption>
|
||||||
<caption xml:lang="pt-BR">Visão principal com lista de salas, bate-papo e informações sobre as salas</caption>
|
<caption xml:lang="pt-BR">Visão principal com lista de salas, bate-papo e informações sobre as salas</caption>
|
||||||
|
<caption xml:lang="ro">Vederea principală cu lista de camere, discuție, și informații despre cameră</caption>
|
||||||
<caption xml:lang="ru">Главное окно со списком комнат, чатом и информацией о комнате</caption>
|
<caption xml:lang="ru">Главное окно со списком комнат, чатом и информацией о комнате</caption>
|
||||||
<caption xml:lang="sa">कक्षसूची, गपशपः, कक्षसूचना च सह मुख्यदृश्यम्</caption>
|
<caption xml:lang="sa">कक्षसूची, गपशपः, कक्षसूचना च सह मुख्यदृश्यम्</caption>
|
||||||
<caption xml:lang="sl">Glavni pogled s seznamom sob, klepetom in informacijami o sobah</caption>
|
<caption xml:lang="sl">Glavni pogled s seznamom sob, klepetom in informacijami o sobah</caption>
|
||||||
@@ -359,7 +360,6 @@
|
|||||||
<caption xml:lang="ta">அரங்குப்பட்டியல், உரையாடல், மற்றும் அரங்குவிவரங்களைக் கொண்டுள்ள பிரதான காட்சி</caption>
|
<caption xml:lang="ta">அரங்குப்பட்டியல், உரையாடல், மற்றும் அரங்குவிவரங்களைக் கொண்டுள்ள பிரதான காட்சி</caption>
|
||||||
<caption xml:lang="tr">Oda listesini, sohbet penceresini ve oda bilgisini gösteren ana görünüm</caption>
|
<caption xml:lang="tr">Oda listesini, sohbet penceresini ve oda bilgisini gösteren ana görünüm</caption>
|
||||||
<caption xml:lang="uk">Головна панель із списком кімнат, спілкуванням та даними щодо кімнати</caption>
|
<caption xml:lang="uk">Головна панель із списком кімнат, спілкуванням та даними щодо кімнати</caption>
|
||||||
<caption xml:lang="x-test">xxMain view with room list, chat, and room informationxx</caption>
|
|
||||||
<caption xml:lang="zh-TW">主頁面,包含聊天室列表、聊天內容,與聊天室資訊</caption>
|
<caption xml:lang="zh-TW">主頁面,包含聊天室列表、聊天內容,與聊天室資訊</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot type="default">
|
<screenshot type="default">
|
||||||
@@ -389,6 +389,7 @@
|
|||||||
<caption xml:lang="nn">Oppdag nye fellesskap med Matrix Spaces</caption>
|
<caption xml:lang="nn">Oppdag nye fellesskap med Matrix Spaces</caption>
|
||||||
<caption xml:lang="pl">Odkrywaj nowe społeczności w Przestrzeniach Matriksa</caption>
|
<caption xml:lang="pl">Odkrywaj nowe społeczności w Przestrzeniach Matriksa</caption>
|
||||||
<caption xml:lang="pt-BR">Descubra novas comunidades com os Espaços Matrix</caption>
|
<caption xml:lang="pt-BR">Descubra novas comunidades com os Espaços Matrix</caption>
|
||||||
|
<caption xml:lang="ro">Descoperiți comunități noi cu Spații Matrix</caption>
|
||||||
<caption xml:lang="ru">Поиск новых сообществ с помощью Matrix Spaces</caption>
|
<caption xml:lang="ru">Поиск новых сообществ с помощью Matrix Spaces</caption>
|
||||||
<caption xml:lang="sa">Matrix Spaces इत्यनेन सह नूतनानां समुदायानाम् अन्वेषणं कुर्वन्तु</caption>
|
<caption xml:lang="sa">Matrix Spaces इत्यनेन सह नूतनानां समुदायानाम् अन्वेषणं कुर्वन्तु</caption>
|
||||||
<caption xml:lang="sl">Odkrijte nove skupnosti z Matrix Spaces</caption>
|
<caption xml:lang="sl">Odkrijte nove skupnosti z Matrix Spaces</caption>
|
||||||
@@ -396,7 +397,6 @@
|
|||||||
<caption xml:lang="ta">மேட்ரிக்ஸு இடங்களின் மூலம் புதிய சமூகங்களைக் கண்டுபிடிக்கலாம்</caption>
|
<caption xml:lang="ta">மேட்ரிக்ஸு இடங்களின் மூலம் புதிய சமூகங்களைக் கண்டுபிடிக்கலாம்</caption>
|
||||||
<caption xml:lang="tr">Matrix Alanlar ile yeni topluluklar keşfedin</caption>
|
<caption xml:lang="tr">Matrix Alanlar ile yeni topluluklar keşfedin</caption>
|
||||||
<caption xml:lang="uk">Пошук нових спільнот за допомогою Matrix Spaces</caption>
|
<caption xml:lang="uk">Пошук нових спільнот за допомогою Matrix Spaces</caption>
|
||||||
<caption xml:lang="x-test">xxDiscover new communities with Matrix Spacesxx</caption>
|
|
||||||
<caption xml:lang="zh-TW">利用 Matrix 聊天空間發現新的社群</caption>
|
<caption xml:lang="zh-TW">利用 Matrix 聊天空間發現新的社群</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<!--
|
<!--
|
||||||
@@ -434,6 +434,7 @@
|
|||||||
<caption xml:lang="pl">Główny widok z wykazem pokojów, rozmowami i szczegółami pokojów</caption>
|
<caption xml:lang="pl">Główny widok z wykazem pokojów, rozmowami i szczegółami pokojów</caption>
|
||||||
<caption xml:lang="pt">A área principal com a lista de salas e com informações sobre a conversa e a sala</caption>
|
<caption xml:lang="pt">A área principal com a lista de salas e com informações sobre a conversa e a sala</caption>
|
||||||
<caption xml:lang="pt-BR">Visão principal com lista de salas, bate-papo e informações sobre as salas</caption>
|
<caption xml:lang="pt-BR">Visão principal com lista de salas, bate-papo e informações sobre as salas</caption>
|
||||||
|
<caption xml:lang="ro">Vederea principală cu lista de camere, discuție, și informații despre cameră</caption>
|
||||||
<caption xml:lang="ru">Главное окно со списком комнат, чатом и информацией о комнате</caption>
|
<caption xml:lang="ru">Главное окно со списком комнат, чатом и информацией о комнате</caption>
|
||||||
<caption xml:lang="sa">कक्षसूची, गपशपः, कक्षसूचना च सह मुख्यदृश्यम्</caption>
|
<caption xml:lang="sa">कक्षसूची, गपशपः, कक्षसूचना च सह मुख्यदृश्यम्</caption>
|
||||||
<caption xml:lang="sl">Glavni pogled s seznamom sob, klepetom in informacijami o sobah</caption>
|
<caption xml:lang="sl">Glavni pogled s seznamom sob, klepetom in informacijami o sobah</caption>
|
||||||
@@ -441,7 +442,6 @@
|
|||||||
<caption xml:lang="ta">அரங்குப்பட்டியல், உரையாடல், மற்றும் அரங்குவிவரங்களைக் கொண்டுள்ள பிரதான காட்சி</caption>
|
<caption xml:lang="ta">அரங்குப்பட்டியல், உரையாடல், மற்றும் அரங்குவிவரங்களைக் கொண்டுள்ள பிரதான காட்சி</caption>
|
||||||
<caption xml:lang="tr">Oda listesini, sohbet penceresini ve oda bilgisini gösteren ana görünüm</caption>
|
<caption xml:lang="tr">Oda listesini, sohbet penceresini ve oda bilgisini gösteren ana görünüm</caption>
|
||||||
<caption xml:lang="uk">Головна панель із списком кімнат, спілкуванням та даними щодо кімнати</caption>
|
<caption xml:lang="uk">Головна панель із списком кімнат, спілкуванням та даними щодо кімнати</caption>
|
||||||
<caption xml:lang="x-test">xxMain view with room list, chat, and room informationxx</caption>
|
|
||||||
<caption xml:lang="zh-TW">主頁面,包含聊天室列表、聊天內容,與聊天室資訊</caption>
|
<caption xml:lang="zh-TW">主頁面,包含聊天室列表、聊天內容,與聊天室資訊</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot environment="windows">
|
<screenshot environment="windows">
|
||||||
@@ -473,6 +473,7 @@
|
|||||||
<caption xml:lang="pl">Ekran logowania</caption>
|
<caption xml:lang="pl">Ekran logowania</caption>
|
||||||
<caption xml:lang="pt">Ecrã de autenticação</caption>
|
<caption xml:lang="pt">Ecrã de autenticação</caption>
|
||||||
<caption xml:lang="pt-BR">Tela de login</caption>
|
<caption xml:lang="pt-BR">Tela de login</caption>
|
||||||
|
<caption xml:lang="ro">Ecran de autentificare</caption>
|
||||||
<caption xml:lang="ru">Окно входа</caption>
|
<caption xml:lang="ru">Окно входа</caption>
|
||||||
<caption xml:lang="sa">लॉगिन् स्क्रीन</caption>
|
<caption xml:lang="sa">लॉगिन् स्क्रीन</caption>
|
||||||
<caption xml:lang="sl">Prijavni zaslon</caption>
|
<caption xml:lang="sl">Prijavni zaslon</caption>
|
||||||
@@ -480,7 +481,6 @@
|
|||||||
<caption xml:lang="ta">நுழைவுத் திரை</caption>
|
<caption xml:lang="ta">நுழைவுத் திரை</caption>
|
||||||
<caption xml:lang="tr">Oturum açma ekranı</caption>
|
<caption xml:lang="tr">Oturum açma ekranı</caption>
|
||||||
<caption xml:lang="uk">Вікно входу</caption>
|
<caption xml:lang="uk">Вікно входу</caption>
|
||||||
<caption xml:lang="x-test">xxLogin screenxx</caption>
|
|
||||||
<caption xml:lang="zh-TW">登入畫面</caption>
|
<caption xml:lang="zh-TW">登入畫面</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
</screenshots>
|
</screenshots>
|
||||||
@@ -488,6 +488,9 @@
|
|||||||
<content_attribute id="social-chat">intense</content_attribute>
|
<content_attribute id="social-chat">intense</content_attribute>
|
||||||
</content_rating>
|
</content_rating>
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="25.08.3" date="2025-11-06"/>
|
||||||
|
<release version="25.08.2" date="2025-10-09"/>
|
||||||
|
<release version="25.08.1" date="2025-09-11"/>
|
||||||
<release version="25.08.0" date="2025-08-14"/>
|
<release version="25.08.0" date="2025-08-14"/>
|
||||||
<release version="25.04.3" date="2025-07-03"/>
|
<release version="25.04.3" date="2025-07-03"/>
|
||||||
<release version="25.04.2" date="2025-06-05"/>
|
<release version="25.04.2" date="2025-06-05"/>
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ Name[sv]=NeoChat
|
|||||||
Name[ta]=நியோச்சாட்
|
Name[ta]=நியோச்சாட்
|
||||||
Name[tr]=NeoChat
|
Name[tr]=NeoChat
|
||||||
Name[uk]=NeoChat
|
Name[uk]=NeoChat
|
||||||
Name[x-test]=xxNeoChatxx
|
|
||||||
Name[zh_CN]=NeoChat
|
Name[zh_CN]=NeoChat
|
||||||
Name[zh_TW]=NeoChat
|
Name[zh_TW]=NeoChat
|
||||||
GenericName=Matrix Client
|
GenericName=Matrix Client
|
||||||
@@ -88,7 +87,6 @@ GenericName[sv]=Matrix-klient
|
|||||||
GenericName[ta]=Matrix வாங்கி
|
GenericName[ta]=Matrix வாங்கி
|
||||||
GenericName[tr]=Matrix İstemcisi
|
GenericName[tr]=Matrix İstemcisi
|
||||||
GenericName[uk]=Клієнт Matrix
|
GenericName[uk]=Клієнт Matrix
|
||||||
GenericName[x-test]=xxMatrix Clientxx
|
|
||||||
GenericName[zh_CN]=Matrix 客户端
|
GenericName[zh_CN]=Matrix 客户端
|
||||||
GenericName[zh_TW]=Matrix 用戶端
|
GenericName[zh_TW]=Matrix 用戶端
|
||||||
Comment=Chat on Matrix
|
Comment=Chat on Matrix
|
||||||
@@ -114,6 +112,7 @@ Comment[lv]=Tērzējiet „Matrix“ tīklā
|
|||||||
Comment[nl]=Chat op Matrix
|
Comment[nl]=Chat op Matrix
|
||||||
Comment[pl]=Rozmawiaj na Matriksie
|
Comment[pl]=Rozmawiaj na Matriksie
|
||||||
Comment[pt_BR]=Bate papo na Matrix
|
Comment[pt_BR]=Bate papo na Matrix
|
||||||
|
Comment[ro]=Discutați pe Matrix
|
||||||
Comment[ru]=Общение в Matrix
|
Comment[ru]=Общение в Matrix
|
||||||
Comment[sa]=Matrix इत्यत्र गपशपं कुर्वन्तु
|
Comment[sa]=Matrix इत्यत्र गपशपं कुर्वन्तु
|
||||||
Comment[sl]=Klepet na Matrixu
|
Comment[sl]=Klepet na Matrixu
|
||||||
@@ -121,7 +120,6 @@ Comment[sv]=Chatta på Matrix
|
|||||||
Comment[ta]=மேட்ரிக்ஸில் உரையாட உதவும்
|
Comment[ta]=மேட்ரிக்ஸில் உரையாட உதவும்
|
||||||
Comment[tr]=Matrix üzerinde sohbet edin
|
Comment[tr]=Matrix üzerinde sohbet edin
|
||||||
Comment[uk]=Спілкування у Matrix
|
Comment[uk]=Спілкування у Matrix
|
||||||
Comment[x-test]=xxChat on Matrixxx
|
|
||||||
Comment[zh_CN]=在 Matrix 上聊天
|
Comment[zh_CN]=在 Matrix 上聊天
|
||||||
Comment[zh_TW]=在 Matrix 上聊天
|
Comment[zh_TW]=在 Matrix 上聊天
|
||||||
MimeType=x-scheme-handler/matrix;
|
MimeType=x-scheme-handler/matrix;
|
||||||
|
|||||||
1023
po/ar/neochat.po
1023
po/ar/neochat.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
969
po/az/neochat.po
969
po/az/neochat.po
File diff suppressed because it is too large
Load Diff
948
po/ca/neochat.po
948
po/ca/neochat.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1007
po/cs/neochat.po
1007
po/cs/neochat.po
File diff suppressed because it is too large
Load Diff
964
po/da/neochat.po
964
po/da/neochat.po
File diff suppressed because it is too large
Load Diff
1035
po/de/neochat.po
1035
po/de/neochat.po
File diff suppressed because it is too large
Load Diff
992
po/el/neochat.po
992
po/el/neochat.po
File diff suppressed because it is too large
Load Diff
1005
po/en_GB/neochat.po
1005
po/en_GB/neochat.po
File diff suppressed because it is too large
Load Diff
1005
po/eo/neochat.po
1005
po/eo/neochat.po
File diff suppressed because it is too large
Load Diff
951
po/es/neochat.po
951
po/es/neochat.po
File diff suppressed because it is too large
Load Diff
973
po/eu/neochat.po
973
po/eu/neochat.po
File diff suppressed because it is too large
Load Diff
1009
po/fi/neochat.po
1009
po/fi/neochat.po
File diff suppressed because it is too large
Load Diff
997
po/fr/neochat.po
997
po/fr/neochat.po
File diff suppressed because it is too large
Load Diff
1019
po/gl/neochat.po
1019
po/gl/neochat.po
File diff suppressed because it is too large
Load Diff
961
po/he/neochat.po
961
po/he/neochat.po
File diff suppressed because it is too large
Load Diff
1007
po/hi/neochat.po
1007
po/hi/neochat.po
File diff suppressed because it is too large
Load Diff
1013
po/hu/neochat.po
1013
po/hu/neochat.po
File diff suppressed because it is too large
Load Diff
1083
po/ia/neochat.po
1083
po/ia/neochat.po
File diff suppressed because it is too large
Load Diff
989
po/id/neochat.po
989
po/id/neochat.po
File diff suppressed because it is too large
Load Diff
956
po/ie/neochat.po
956
po/ie/neochat.po
File diff suppressed because it is too large
Load Diff
973
po/it/neochat.po
973
po/it/neochat.po
File diff suppressed because it is too large
Load Diff
915
po/ja/neochat.po
915
po/ja/neochat.po
File diff suppressed because it is too large
Load Diff
955
po/ka/neochat.po
955
po/ka/neochat.po
File diff suppressed because it is too large
Load Diff
986
po/ko/neochat.po
986
po/ko/neochat.po
File diff suppressed because it is too large
Load Diff
1693
po/lt/neochat.po
1693
po/lt/neochat.po
File diff suppressed because it is too large
Load Diff
1019
po/lv/neochat.po
1019
po/lv/neochat.po
File diff suppressed because it is too large
Load Diff
957
po/nl/neochat.po
957
po/nl/neochat.po
File diff suppressed because it is too large
Load Diff
975
po/nn/neochat.po
975
po/nn/neochat.po
File diff suppressed because it is too large
Load Diff
968
po/pa/neochat.po
968
po/pa/neochat.po
File diff suppressed because it is too large
Load Diff
1485
po/pl/neochat.po
1485
po/pl/neochat.po
File diff suppressed because it is too large
Load Diff
989
po/pt/neochat.po
989
po/pt/neochat.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
6548
po/ro/neochat.po
Normal file
6548
po/ro/neochat.po
Normal file
File diff suppressed because it is too large
Load Diff
981
po/ru/neochat.po
981
po/ru/neochat.po
File diff suppressed because it is too large
Load Diff
1007
po/sa/neochat.po
1007
po/sa/neochat.po
File diff suppressed because it is too large
Load Diff
971
po/sk/neochat.po
971
po/sk/neochat.po
File diff suppressed because it is too large
Load Diff
973
po/sl/neochat.po
973
po/sl/neochat.po
File diff suppressed because it is too large
Load Diff
956
po/sv/neochat.po
956
po/sv/neochat.po
File diff suppressed because it is too large
Load Diff
1011
po/ta/neochat.po
1011
po/ta/neochat.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
971
po/tr/neochat.po
971
po/tr/neochat.po
File diff suppressed because it is too large
Load Diff
952
po/uk/neochat.po
952
po/uk/neochat.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,7 @@
|
|||||||
#include "controller.h"
|
#include "controller.h"
|
||||||
|
|
||||||
#include <Quotient/connection.h>
|
#include <Quotient/connection.h>
|
||||||
|
#include <qt6keychain/keychain.h>
|
||||||
|
|
||||||
#include <KLocalizedString>
|
#include <KLocalizedString>
|
||||||
|
|
||||||
@@ -13,6 +14,7 @@
|
|||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include <Quotient/csapi/notifications.h>
|
||||||
#include <Quotient/events/roommemberevent.h>
|
#include <Quotient/events/roommemberevent.h>
|
||||||
#include <Quotient/qt_connection_util.h>
|
#include <Quotient/qt_connection_util.h>
|
||||||
#include <Quotient/settings.h>
|
#include <Quotient/settings.h>
|
||||||
@@ -22,6 +24,7 @@
|
|||||||
#include "mediasizehelper.h"
|
#include "mediasizehelper.h"
|
||||||
#include "models/actionsmodel.h"
|
#include "models/actionsmodel.h"
|
||||||
#include "models/messagemodel.h"
|
#include "models/messagemodel.h"
|
||||||
|
#include "models/pushrulemodel.h"
|
||||||
#include "models/roomlistmodel.h"
|
#include "models/roomlistmodel.h"
|
||||||
#include "models/roomtreemodel.h"
|
#include "models/roomtreemodel.h"
|
||||||
#include "neochatconfig.h"
|
#include "neochatconfig.h"
|
||||||
@@ -315,8 +318,7 @@ void Controller::listenForNotifications()
|
|||||||
connect(timer, &QTimer::timeout, qGuiApp, &QGuiApplication::quit);
|
connect(timer, &QTimer::timeout, qGuiApp, &QGuiApplication::quit);
|
||||||
|
|
||||||
connect(connector, &KUnifiedPush::Connector::messageReceived, [timer](const QByteArray &data) {
|
connect(connector, &KUnifiedPush::Connector::messageReceived, [timer](const QByteArray &data) {
|
||||||
instance().m_notificationsManager.postPushNotification(data);
|
NotificationsManager::postPushNotification(data);
|
||||||
timer->stop();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Wait five seconds to see if we received any messages or this happened to be an erroneous activation.
|
// Wait five seconds to see if we received any messages or this happened to be an erroneous activation.
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ int main(int argc, char *argv[])
|
|||||||
parser.addOption(testOption);
|
parser.addOption(testOption);
|
||||||
|
|
||||||
#ifdef HAVE_KUNIFIEDPUSH
|
#ifdef HAVE_KUNIFIEDPUSH
|
||||||
QCommandLineOption dbusActivatedOption(u"dbus-activated"_s, i18n("Internal usage only."));
|
QCommandLineOption dbusActivatedOption(u"dbus-activated"_s);
|
||||||
dbusActivatedOption.setFlags(QCommandLineOption::Flag::HiddenFromHelp);
|
dbusActivatedOption.setFlags(QCommandLineOption::Flag::HiddenFromHelp);
|
||||||
parser.addOption(dbusActivatedOption);
|
parser.addOption(dbusActivatedOption);
|
||||||
#endif
|
#endif
|
||||||
@@ -219,8 +219,14 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
#ifdef HAVE_KUNIFIEDPUSH
|
#ifdef HAVE_KUNIFIEDPUSH
|
||||||
if (parser.isSet(dbusActivatedOption)) {
|
if (parser.isSet(dbusActivatedOption)) {
|
||||||
// We want to be replaceable by the main client
|
#ifdef HAVE_KDBUSADDONS
|
||||||
KDBusService service(KDBusService::Replace);
|
// We *don't* want to use KDBusService here. I don't know why, but it makes activation super unreliable. We don't really need it anyway.
|
||||||
|
if (!QDBusConnection::sessionBus().registerService(QStringLiteral("org.kde.neochat"))) {
|
||||||
|
// Gracefully fail if NeoChat is already running
|
||||||
|
qWarning() << "NeoChat already running, not sending push notifications.";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_RUNNER
|
#ifdef HAVE_RUNNER
|
||||||
// If we are built with KRunner and KUnifiedPush support, we need to do something special.
|
// If we are built with KRunner and KUnifiedPush support, we need to do something special.
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <QQmlEngine>
|
#include <QQmlEngine>
|
||||||
|
|
||||||
#include "neochatconnection.h"
|
#include "neochatconnection.h"
|
||||||
|
#include "neochatroom.h"
|
||||||
|
|
||||||
#include <Quotient/events/roommessageevent.h>
|
#include <Quotient/events/roommessageevent.h>
|
||||||
#include <Quotient/roommember.h>
|
#include <Quotient/roommember.h>
|
||||||
@@ -24,7 +25,11 @@ class CommonRoomsModel : public QAbstractListModel
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
enum Roles {
|
enum Roles {
|
||||||
RoomIdRole = Qt::DisplayRole,
|
TextRole = Qt::DisplayRole,
|
||||||
|
LongitudeRole,
|
||||||
|
LatitudeRole,
|
||||||
|
AssetRole,
|
||||||
|
AuthorRole,
|
||||||
};
|
};
|
||||||
Q_ENUM(Roles)
|
Q_ENUM(Roles)
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ Name[sv]=NeoChat
|
|||||||
Name[ta]=நியோச்சாட்
|
Name[ta]=நியோச்சாட்
|
||||||
Name[tr]=NeoChat
|
Name[tr]=NeoChat
|
||||||
Name[uk]=NeoChat
|
Name[uk]=NeoChat
|
||||||
Name[x-test]=xxNeoChatxx
|
|
||||||
Name[zh_CN]=NeoChat
|
Name[zh_CN]=NeoChat
|
||||||
Name[zh_TW]=NeoChat
|
Name[zh_TW]=NeoChat
|
||||||
DesktopEntry=org.kde.neochat
|
DesktopEntry=org.kde.neochat
|
||||||
@@ -87,7 +86,6 @@ Comment[sv]=En klient för matrix, det decentraliserade kommunikationsprotokolle
|
|||||||
Comment[ta]=மையமில்லா தகவல் பரிமாற்ற நெறிமுறையான மேட்ரிக்ஸுக்கான செயலி
|
Comment[ta]=மையமில்லா தகவல் பரிமாற்ற நெறிமுறையான மேட்ரிக்ஸுக்கான செயலி
|
||||||
Comment[tr]=Merkezi olmayan iletişim protokolü Matrix için bir istemci
|
Comment[tr]=Merkezi olmayan iletişim protokolü Matrix için bir istemci
|
||||||
Comment[uk]=Клієнт matrix, децентралізованого протоколу обміну даними
|
Comment[uk]=Клієнт matrix, децентралізованого протоколу обміну даними
|
||||||
Comment[x-test]=xxA client for matrix, the decentralized communication protocolxx
|
|
||||||
Comment[zh_CN]=分布式通讯协议 Matrix 的客户端
|
Comment[zh_CN]=分布式通讯协议 Matrix 的客户端
|
||||||
Comment[zh_TW]=去中心化通訊協定 Matrix 的用戶端
|
Comment[zh_TW]=去中心化通訊協定 Matrix 的用戶端
|
||||||
|
|
||||||
@@ -134,7 +132,6 @@ Name[sv]=Nytt meddelande
|
|||||||
Name[ta]=புதிய செய்தி
|
Name[ta]=புதிய செய்தி
|
||||||
Name[tr]=Yeni İleti
|
Name[tr]=Yeni İleti
|
||||||
Name[uk]=Нове повідомлення
|
Name[uk]=Нове повідомлення
|
||||||
Name[x-test]=xxNew messagexx
|
|
||||||
Name[zh_CN]=新消息
|
Name[zh_CN]=新消息
|
||||||
Name[zh_TW]=新訊息
|
Name[zh_TW]=新訊息
|
||||||
Comment=There is a new message
|
Comment=There is a new message
|
||||||
@@ -177,7 +174,6 @@ Comment[sv]=Det finns ett nytt meddelande
|
|||||||
Comment[ta]=ஒரு புதிய செய்தி உள்ளது
|
Comment[ta]=ஒரு புதிய செய்தி உள்ளது
|
||||||
Comment[tr]=Yeni bir ileti var
|
Comment[tr]=Yeni bir ileti var
|
||||||
Comment[uk]=Надійшло нове повідомлення
|
Comment[uk]=Надійшло нове повідомлення
|
||||||
Comment[x-test]=xxThere is a new messagexx
|
|
||||||
Comment[zh_CN]=有新消息
|
Comment[zh_CN]=有新消息
|
||||||
Comment[zh_TW]=有新的訊息
|
Comment[zh_TW]=有新的訊息
|
||||||
Action=Popup
|
Action=Popup
|
||||||
@@ -215,6 +211,7 @@ Name[pa]=ਨਵਾਂ ਸੱਦਾ
|
|||||||
Name[pl]=Nowe zaproszenie
|
Name[pl]=Nowe zaproszenie
|
||||||
Name[pt]=Novo Convite
|
Name[pt]=Novo Convite
|
||||||
Name[pt_BR]=Novo convite
|
Name[pt_BR]=Novo convite
|
||||||
|
Name[ro]=Invitație nouă
|
||||||
Name[ru]=Новое приглашение
|
Name[ru]=Новое приглашение
|
||||||
Name[sa]=नवीन आमन्त्रणम्
|
Name[sa]=नवीन आमन्त्रणम्
|
||||||
Name[sl]=Novo povabilo
|
Name[sl]=Novo povabilo
|
||||||
@@ -222,7 +219,6 @@ Name[sv]=Ny inbjudan
|
|||||||
Name[ta]=புதிய அழைப்பிதழ்
|
Name[ta]=புதிய அழைப்பிதழ்
|
||||||
Name[tr]=Yeni Davet
|
Name[tr]=Yeni Davet
|
||||||
Name[uk]=Нове запрошення
|
Name[uk]=Нове запрошення
|
||||||
Name[x-test]=xxNew Invitationxx
|
|
||||||
Name[zh_CN]=新邀请
|
Name[zh_CN]=新邀请
|
||||||
Name[zh_TW]=新邀請
|
Name[zh_TW]=新邀請
|
||||||
Comment=There is a new invitation to a room
|
Comment=There is a new invitation to a room
|
||||||
@@ -257,6 +253,7 @@ Comment[pa]=ਰੂਮ ਲਈ ਨਵਾਂ ਸੱਦਾ ਹੈ
|
|||||||
Comment[pl]=Dostępna jest nowe zaproszenie do pokoju
|
Comment[pl]=Dostępna jest nowe zaproszenie do pokoju
|
||||||
Comment[pt]=Existe um novo convite para uma sala
|
Comment[pt]=Existe um novo convite para uma sala
|
||||||
Comment[pt_BR]=Existe um novo convite para uma sala
|
Comment[pt_BR]=Existe um novo convite para uma sala
|
||||||
|
Comment[ro]=E o nouă invitație la o cameră
|
||||||
Comment[ru]=Доступно новое приглашение в комнату
|
Comment[ru]=Доступно новое приглашение в комнату
|
||||||
Comment[sa]=कक्षस्य नूतनं निमन्त्रणम् अस्ति
|
Comment[sa]=कक्षस्य नूतनं निमन्त्रणम् अस्ति
|
||||||
Comment[sl]=Tam je novo povabilo v sobo
|
Comment[sl]=Tam je novo povabilo v sobo
|
||||||
@@ -264,7 +261,6 @@ Comment[sv]=Det finns en ny inbjudan till ett rum
|
|||||||
Comment[ta]=ஓர் அரங்கிற்கான புதிய அழைப்பிதழ் உள்ளது
|
Comment[ta]=ஓர் அரங்கிற்கான புதிய அழைப்பிதழ் உள்ளது
|
||||||
Comment[tr]=Bir odaya yeni bir davetiye var
|
Comment[tr]=Bir odaya yeni bir davetiye var
|
||||||
Comment[uk]=У кімнаті нове запрошення
|
Comment[uk]=У кімнаті нове запрошення
|
||||||
Comment[x-test]=xxThere is a new invitation to a roomxx
|
|
||||||
Comment[zh_CN]=有新的聊天室邀请
|
Comment[zh_CN]=有新的聊天室邀请
|
||||||
Comment[zh_TW]=有新的加入聊天室邀請
|
Comment[zh_TW]=有新的加入聊天室邀請
|
||||||
Action=Popup
|
Action=Popup
|
||||||
@@ -296,6 +292,7 @@ Name[nl]=Gedeelde
|
|||||||
Name[nn]=Del
|
Name[nn]=Del
|
||||||
Name[pl]=Udostępnij
|
Name[pl]=Udostępnij
|
||||||
Name[pt_BR]=Compartilhar
|
Name[pt_BR]=Compartilhar
|
||||||
|
Name[ro]=Partajare
|
||||||
Name[ru]=Публикация
|
Name[ru]=Публикация
|
||||||
Name[sa]=संविभागः
|
Name[sa]=संविभागः
|
||||||
Name[sl]=Deli
|
Name[sl]=Deli
|
||||||
@@ -303,7 +300,6 @@ Name[sv]=Dela
|
|||||||
Name[ta]=பகிர்
|
Name[ta]=பகிர்
|
||||||
Name[tr]=Paylaş
|
Name[tr]=Paylaş
|
||||||
Name[uk]=Оприлюднення
|
Name[uk]=Оприлюднення
|
||||||
Name[x-test]=xxSharexx
|
|
||||||
Name[zh_CN]=分享
|
Name[zh_CN]=分享
|
||||||
Name[zh_TW]=分享
|
Name[zh_TW]=分享
|
||||||
Comment=The result of sharing a piece of content
|
Comment=The result of sharing a piece of content
|
||||||
@@ -331,6 +327,7 @@ Comment[nl]=Het resultaat van het delen van een stukje inhoud
|
|||||||
Comment[nn]=Resultatet av deling av innhald
|
Comment[nn]=Resultatet av deling av innhald
|
||||||
Comment[pl]=Wynik udostępniania kawałka treści
|
Comment[pl]=Wynik udostępniania kawałka treści
|
||||||
Comment[pt_BR]=O resultado de compartilhar um conteúdo
|
Comment[pt_BR]=O resultado de compartilhar um conteúdo
|
||||||
|
Comment[ro]=Rezultatul partajării unei bucăți de conținut
|
||||||
Comment[ru]=Результат публикации данных
|
Comment[ru]=Результат публикации данных
|
||||||
Comment[sa]=सामग्रीखण्डस्य साझाकरणस्य परिणामः
|
Comment[sa]=सामग्रीखण्डस्य साझाकरणस्य परिणामः
|
||||||
Comment[sl]=Rezultat deljenega kosa vsebine
|
Comment[sl]=Rezultat deljenega kosa vsebine
|
||||||
@@ -338,7 +335,6 @@ Comment[sv]=Resultatet av att dela innehåll
|
|||||||
Comment[ta]=எதையோ பகிர்ந்ததன் விளைவு
|
Comment[ta]=எதையோ பகிர்ந்ததன் விளைவு
|
||||||
Comment[tr]=Bir parça içerik paylaşımının sonucu
|
Comment[tr]=Bir parça içerik paylaşımının sonucu
|
||||||
Comment[uk]=Результат оприлюднення даних
|
Comment[uk]=Результат оприлюднення даних
|
||||||
Comment[x-test]=xxThe result of sharing a piece of contentxx
|
|
||||||
Comment[zh_CN]=分享一个内容得到的结果
|
Comment[zh_CN]=分享一个内容得到的结果
|
||||||
Comment[zh_TW]=分享一份內容之後的結果
|
Comment[zh_TW]=分享一份內容之後的結果
|
||||||
Action=Popup
|
Action=Popup
|
||||||
|
|||||||
@@ -189,10 +189,6 @@
|
|||||||
<label>Don't hide any events in the timeline</label>
|
<label>Don't hide any events in the timeline</label>
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
</entry>
|
</entry>
|
||||||
<entry name="RelateAnyEvent" type="bool">
|
|
||||||
<label>Send relations to any event, including state events and events normally hidden.</label>
|
|
||||||
<default>false</default>
|
|
||||||
</entry>
|
|
||||||
<entry name="AlwaysVerifyDevice" type="bool">
|
<entry name="AlwaysVerifyDevice" type="bool">
|
||||||
<label>Always allow device verification</label>
|
<label>Always allow device verification</label>
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
|
|||||||
@@ -389,7 +389,7 @@ void NotificationsManager::postPushNotification(const QByteArray &message)
|
|||||||
|
|
||||||
#ifdef HAVE_KIO
|
#ifdef HAVE_KIO
|
||||||
auto openAction = notification->addAction(i18n("Open NeoChat"));
|
auto openAction = notification->addAction(i18n("Open NeoChat"));
|
||||||
connect(openAction, &KNotificationAction::activated, this, [=]() {
|
connect(openAction, &KNotificationAction::activated, notification, [=]() {
|
||||||
QString properId = roomId;
|
QString properId = roomId;
|
||||||
properId = properId.replace(u"#"_s, QString());
|
properId = properId.replace(u"#"_s, QString());
|
||||||
properId = properId.replace(u"!"_s, QString());
|
properId = properId.replace(u"!"_s, QString());
|
||||||
@@ -403,8 +403,6 @@ void NotificationsManager::postPushNotification(const QByteArray &message)
|
|||||||
connect(notification, &KNotification::closed, qGuiApp, &QGuiApplication::quit);
|
connect(notification, &KNotification::closed, qGuiApp, &QGuiApplication::quit);
|
||||||
|
|
||||||
notification->sendEvent();
|
notification->sendEvent();
|
||||||
|
|
||||||
m_notifications.insert(roomId, {json["ts"_L1].toVariant().toLongLong(), notification});
|
|
||||||
} else {
|
} else {
|
||||||
qWarning() << "Skipping unsupported push notification" << type;
|
qWarning() << "Skipping unsupported push notification" << type;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* @brief Display a native notification for the given push notification.
|
* @brief Display a native notification for the given push notification.
|
||||||
*/
|
*/
|
||||||
void postPushNotification(const QByteArray &message);
|
static void postPushNotification(const QByteArray &message);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Handle the notifications for the given connection.
|
* @brief Handle the notifications for the given connection.
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ Name[sv]=NeoChat
|
|||||||
Name[ta]=நியோச்சாட்
|
Name[ta]=நியோச்சாட்
|
||||||
Name[tr]=NeoChat
|
Name[tr]=NeoChat
|
||||||
Name[uk]=NeoChat
|
Name[uk]=NeoChat
|
||||||
Name[x-test]=xxNeoChatxx
|
|
||||||
Name[zh_CN]=NeoChat
|
Name[zh_CN]=NeoChat
|
||||||
Name[zh_TW]=NeoChat
|
Name[zh_TW]=NeoChat
|
||||||
Comment=Find rooms in NeoChat
|
Comment=Find rooms in NeoChat
|
||||||
@@ -76,6 +75,7 @@ Comment[nn]=Finn rom i NeoChat
|
|||||||
Comment[pl]=Znajdź pokoje w NeoChat
|
Comment[pl]=Znajdź pokoje w NeoChat
|
||||||
Comment[pt]=Procurar salas no NeoChat
|
Comment[pt]=Procurar salas no NeoChat
|
||||||
Comment[pt_BR]=Encontrar salas no NeoChat
|
Comment[pt_BR]=Encontrar salas no NeoChat
|
||||||
|
Comment[ro]=Găsește camere în NeoChat
|
||||||
Comment[ru]=Поиск комнат NeoChat
|
Comment[ru]=Поиск комнат NeoChat
|
||||||
Comment[sa]=NeoChat इत्यत्र कक्ष्याः अन्वेषणं कुर्वन्तु
|
Comment[sa]=NeoChat इत्यत्र कक्ष्याः अन्वेषणं कुर्वन्तु
|
||||||
Comment[sl]=Najdi sobe v NeoChatu
|
Comment[sl]=Najdi sobe v NeoChatu
|
||||||
@@ -83,7 +83,6 @@ Comment[sv]=Sök efter rum i NeoChat
|
|||||||
Comment[ta]=நியோச்சாட்டில் அரங்குகளை கண்டுபிடிக்கும்
|
Comment[ta]=நியோச்சாட்டில் அரங்குகளை கண்டுபிடிக்கும்
|
||||||
Comment[tr]=NeoChat’te odalar bulun
|
Comment[tr]=NeoChat’te odalar bulun
|
||||||
Comment[uk]=Пошук кімнат у NeoChat
|
Comment[uk]=Пошук кімнат у NeoChat
|
||||||
Comment[x-test]=xxFind rooms in NeoChatxx
|
|
||||||
Comment[zh_CN]=在 NeoChat 查找聊天室
|
Comment[zh_CN]=在 NeoChat 查找聊天室
|
||||||
Comment[zh_TW]=在 NeoChat 尋找聊天室
|
Comment[zh_TW]=在 NeoChat 尋找聊天室
|
||||||
X-KDE-ServiceTypes=Plasma/Runner
|
X-KDE-ServiceTypes=Plasma/Runner
|
||||||
@@ -93,3 +92,4 @@ X-Plasma-API=DBus
|
|||||||
X-Plasma-DBusRunner-Service=org.kde.neochat
|
X-Plasma-DBusRunner-Service=org.kde.neochat
|
||||||
X-Plasma-DBusRunner-Path=/RoomRunner
|
X-Plasma-DBusRunner-Path=/RoomRunner
|
||||||
X-Plasma-Request-Actions-Once=true
|
X-Plasma-Request-Actions-Once=true
|
||||||
|
X-Plasma-Runner-Min-Letter-Count=3
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 James Graham <james.h.graham@protonmail.com>
|
// SPDX-FileCopyrightText: 2022 James Graham <james.h.graham@protonmail.com>
|
||||||
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||||
|
|
||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls as QQC2
|
import QtQuick.Controls as QQC2
|
||||||
|
import QtQuick.Layouts
|
||||||
|
|
||||||
import org.kde.kirigami as Kirigami
|
import org.kde.kirigami as Kirigami
|
||||||
import org.kde.kirigamiaddons.components as KirigamiComponents
|
import org.kde.kirigamiaddons.components as KirigamiComponents
|
||||||
@@ -19,17 +18,21 @@ KirigamiComponents.ConvergentContextMenu {
|
|||||||
required property NeoChatConnection connection
|
required property NeoChatConnection connection
|
||||||
required property Kirigami.ApplicationWindow window
|
required property Kirigami.ApplicationWindow window
|
||||||
|
|
||||||
Kirigami.Action {
|
QQC2.Action {
|
||||||
text: i18nc("@action:button", "Show QR Code")
|
text: i18nc("@action:button", "Show QR Code")
|
||||||
icon.name: "view-barcode-qr-symbolic"
|
icon.name: "view-barcode-qr-symbolic"
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
(Qt.createComponent('org.kde.neochat', 'QrCodeMaximizeComponent').createObject(QQC2.Overlay.overlay, {
|
let qrMax = Qt.createComponent('org.kde.neochat', 'QrCodeMaximizeComponent').createObject(QQC2.Overlay.overlay, {
|
||||||
text: "https://matrix.to/#/" + root.connection.localUser.id,
|
text: "https://matrix.to/#/" + root.connection.localUser.id,
|
||||||
title: root.connection.localUser.displayName,
|
title: root.connection.localUser.displayName,
|
||||||
subtitle: root.connection.localUser.id,
|
subtitle: root.connection.localUser.id,
|
||||||
// Note: User::avatarUrl does not set user_id, and thus cannot be used directly here. Hence the makeMediaUrl.
|
// Note: User::avatarUrl does not set user_id, and thus cannot be used directly here. Hence the makeMediaUrl.
|
||||||
avatarSource: root.connection.localUser.avatarUrl.toString().length > 0 ? root.connection.makeMediaUrl(root.connection.localUser.avatarUrl) : ""
|
avatarSource: root.connection.localUser.avatarUrl.toString().length > 0 ? root.connection.makeMediaUrl(root.connection.localUser.avatarUrl) : ""
|
||||||
}) as QrCodeMaximizeComponent).open();
|
});
|
||||||
|
if (typeof root.closeDialog === "function") {
|
||||||
|
root.closeDialog();
|
||||||
|
}
|
||||||
|
qrMax.open();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,27 +40,26 @@ KirigamiComponents.ConvergentContextMenu {
|
|||||||
text: i18nc("@action:inmenu", "Switch Account")
|
text: i18nc("@action:inmenu", "Switch Account")
|
||||||
icon.name: "system-switch-user"
|
icon.name: "system-switch-user"
|
||||||
shortcut: "Ctrl+U"
|
shortcut: "Ctrl+U"
|
||||||
onTriggered: (Qt.createComponent("org.kde.neochat", "AccountSwitchDialog").createObject(QQC2.Overlay.overlay, {
|
onTriggered: accountSwitchDialog.createObject(QQC2.Overlay.overlay, {
|
||||||
connection: root.connection
|
connection: root.connection
|
||||||
}) as Kirigami.Dialog).open();
|
}).open();
|
||||||
}
|
}
|
||||||
|
QQC2.Action {
|
||||||
Kirigami.Action {
|
text: i18n("Edit This Account")
|
||||||
text: i18nc("@action:inmenu", "Edit This Account")
|
|
||||||
icon.name: "document-edit"
|
icon.name: "document-edit"
|
||||||
onTriggered: NeoChatSettingsView.openWithInitialProperties("accounts", {initialAccount: root.connection});
|
onTriggered: NeoChatSettingsView.openWithInitialProperties("accounts", {initialAccount: root.connection});
|
||||||
}
|
}
|
||||||
|
|
||||||
Kirigami.Action {
|
QQC2.Action {
|
||||||
text: i18nc("@action:inmenu", "Notification Settings")
|
text: i18n("Notification Settings")
|
||||||
icon.name: "notifications"
|
icon.name: "notifications"
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
NeoChatSettingsView.open('notifications');
|
NeoChatSettingsView.open('notifications');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Kirigami.Action {
|
QQC2.Action {
|
||||||
text: i18nc("@action:inmenu", "Devices")
|
text: i18n("Devices")
|
||||||
icon.name: "computer-symbolic"
|
icon.name: "computer-symbolic"
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
NeoChatSettingsView.open('devices');
|
NeoChatSettingsView.open('devices');
|
||||||
@@ -65,10 +67,10 @@ KirigamiComponents.ConvergentContextMenu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Kirigami.Action {
|
Kirigami.Action {
|
||||||
text: i18nc("@action:inmenu", "Open Developer Tools")
|
text: i18n("Open Developer Tools")
|
||||||
icon.name: "tools"
|
icon.name: "tools"
|
||||||
visible: NeoChatConfig.developerTools
|
visible: NeoChatConfig.developerTools
|
||||||
onTriggered: root.window.pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat.devtools', 'DevtoolsPage'), {
|
onTriggered: pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat.devtools', 'DevtoolsPage'), {
|
||||||
connection: root.connection
|
connection: root.connection
|
||||||
}, {
|
}, {
|
||||||
title: i18nc("@title:window", "Developer Tools"),
|
title: i18nc("@title:window", "Developer Tools"),
|
||||||
@@ -86,10 +88,9 @@ KirigamiComponents.ConvergentContextMenu {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
Kirigami.Action {
|
QQC2.Action {
|
||||||
text: i18nc("@action:inmenu", "Verify This Device")
|
text: i18nc("@action:inmenu", "Verify This Device")
|
||||||
icon.name: "security-low"
|
icon.name: "security-low"
|
||||||
visible: !root.connection.isVerifiedSession()
|
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
root.connection.startSelfVerification();
|
root.connection.startSelfVerification();
|
||||||
const dialog = Qt.createComponent("org.kde.kirigami", "PromptDialog").createObject(QQC2.Overlay.overlay, {
|
const dialog = Qt.createComponent("org.kde.kirigami", "PromptDialog").createObject(QQC2.Overlay.overlay, {
|
||||||
@@ -98,17 +99,19 @@ KirigamiComponents.ConvergentContextMenu {
|
|||||||
standardButtons: Kirigami.Dialog.Ok
|
standardButtons: Kirigami.Dialog.Ok
|
||||||
})
|
})
|
||||||
dialog.open();
|
dialog.open();
|
||||||
root.connection.newKeyVerificationSession.connect(() => {
|
root.connection.onNewKeyVerificationSession.connect(() => {
|
||||||
dialog.close();
|
dialog.close();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Kirigami.Action {
|
QQC2.Action {
|
||||||
text: i18nc("@action:inmenu", "Logout…")
|
text: i18n("Logout")
|
||||||
icon.name: "im-kick-user"
|
icon.name: "im-kick-user"
|
||||||
onTriggered: (Qt.createComponent("org.kde.neochat", "ConfirmLogoutDialog").createObject(QQC2.Overlay.overlay, {
|
onTriggered: confirmLogoutDialogComponent.createObject(root).open()
|
||||||
connection: root.connection
|
}
|
||||||
}) as Kirigami.Dialog).open()
|
|
||||||
|
readonly property Component confirmLogoutDialogComponent: ConfirmLogoutDialog {
|
||||||
|
connection: root.connection
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls as QQC2
|
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
|
|
||||||
import org.kde.kirigami as Kirigami
|
import org.kde.kirigami as Kirigami
|
||||||
@@ -17,6 +16,8 @@ Kirigami.Dialog {
|
|||||||
|
|
||||||
required property NeoChatConnection connection
|
required property NeoChatConnection connection
|
||||||
|
|
||||||
|
parent: applicationWindow().overlay
|
||||||
|
|
||||||
leftPadding: 0
|
leftPadding: 0
|
||||||
rightPadding: 0
|
rightPadding: 0
|
||||||
topPadding: 0
|
topPadding: 0
|
||||||
@@ -24,7 +25,7 @@ Kirigami.Dialog {
|
|||||||
|
|
||||||
standardButtons: Kirigami.Dialog.NoButton
|
standardButtons: Kirigami.Dialog.NoButton
|
||||||
|
|
||||||
width: Math.min(QQC2.ApplicationWindow.window.width, Kirigami.Units.gridUnit * 24)
|
width: Math.min(applicationWindow().width, Kirigami.Units.gridUnit * 24)
|
||||||
title: i18nc("@title: dialog to switch between logged in accounts", "Switch Account")
|
title: i18nc("@title: dialog to switch between logged in accounts", "Switch Account")
|
||||||
|
|
||||||
onVisibleChanged: if (visible) {
|
onVisibleChanged: if (visible) {
|
||||||
@@ -52,7 +53,7 @@ Kirigami.Dialog {
|
|||||||
}
|
}
|
||||||
text: i18nc("@button: login to or register a new account.", "Add Account")
|
text: i18nc("@button: login to or register a new account.", "Add Account")
|
||||||
contentItem: Delegates.SubtitleContentItem {
|
contentItem: Delegates.SubtitleContentItem {
|
||||||
itemDelegate: addDelegate
|
itemDelegate: parent
|
||||||
subtitle: i18n("Log in or create a new account")
|
subtitle: i18n("Log in or create a new account")
|
||||||
labelItem.textFormat: Text.PlainText
|
labelItem.textFormat: Text.PlainText
|
||||||
subtitleItem.textFormat: Text.PlainText
|
subtitleItem.textFormat: Text.PlainText
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ ColumnLayout {
|
|||||||
}
|
}
|
||||||
QQC2.ToolButton {
|
QQC2.ToolButton {
|
||||||
id: editImageButton
|
id: editImageButton
|
||||||
visible: root.hasImage
|
visible: hasImage
|
||||||
icon.name: "document-edit"
|
icon.name: "document-edit"
|
||||||
text: i18n("Edit")
|
text: i18n("Edit")
|
||||||
display: QQC2.AbstractButton.IconOnly
|
display: QQC2.AbstractButton.IconOnly
|
||||||
@@ -46,9 +46,9 @@ ColumnLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
let imageEditor = (Kirigami.PageStack.pageStack as Kirigami.PageRow).pushDialogLayer(imageEditorPage);
|
let imageEditor = applicationWindow().pageStack.pushDialogLayer(imageEditorPage);
|
||||||
imageEditor.newPathChanged.connect(function (newPath) {
|
imageEditor.newPathChanged.connect(function (newPath) {
|
||||||
imageEditor.closeDialog();
|
applicationWindow().pageStack.layers.pop();
|
||||||
root.attachmentPath = newPath;
|
root.attachmentPath = newPath;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -61,7 +61,7 @@ ColumnLayout {
|
|||||||
action: Kirigami.Action {
|
action: Kirigami.Action {
|
||||||
text: i18n("Cancel sending attachment")
|
text: i18n("Cancel sending attachment")
|
||||||
icon.name: "dialog-close"
|
icon.name: "dialog-close"
|
||||||
onTriggered: root.attachmentCancelled()
|
onTriggered: attachmentCancelled()
|
||||||
shortcut: "Escape"
|
shortcut: "Escape"
|
||||||
}
|
}
|
||||||
QQC2.ToolTip.text: text
|
QQC2.ToolTip.text: text
|
||||||
@@ -75,8 +75,8 @@ ColumnLayout {
|
|||||||
|
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
cache: false // Cache is not needed. Images will rarely be shown repeatedly.
|
cache: false // Cache is not needed. Images will rarely be shown repeatedly.
|
||||||
source: root.hasImage ? root.attachmentPath : ""
|
source: hasImage ? root.attachmentPath : ""
|
||||||
visible: root.hasImage
|
visible: hasImage
|
||||||
fillMode: Image.PreserveAspectFit
|
fillMode: Image.PreserveAspectFit
|
||||||
|
|
||||||
onSourceChanged: {
|
onSourceChanged: {
|
||||||
@@ -114,11 +114,11 @@ ColumnLayout {
|
|||||||
id: mimetypeIcon
|
id: mimetypeIcon
|
||||||
implicitWidth: Kirigami.Units.iconSizes.smallMedium
|
implicitWidth: Kirigami.Units.iconSizes.smallMedium
|
||||||
implicitHeight: Kirigami.Units.iconSizes.smallMedium
|
implicitHeight: Kirigami.Units.iconSizes.smallMedium
|
||||||
source: root.attachmentMimetype.iconName
|
source: attachmentMimetype.iconName
|
||||||
}
|
}
|
||||||
QQC2.Label {
|
QQC2.Label {
|
||||||
id: fileLabel
|
id: fileLabel
|
||||||
text: root.baseFileName
|
text: baseFileName
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,12 @@
|
|||||||
// SPDX-License-Identifier: LGPL-2.0-or-later
|
// SPDX-License-Identifier: LGPL-2.0-or-later
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
import QtQuick.Controls as QQC2
|
import QtQuick.Controls as QQC2
|
||||||
|
import QtQuick.Templates as T
|
||||||
import org.kde.kirigami as Kirigami
|
import org.kde.kirigami as Kirigami
|
||||||
import org.kde.kirigamiaddons.delegates as Delegates
|
import org.kde.kirigamiaddons.delegates as Delegates
|
||||||
|
import org.kde.kirigamiaddons.labs.components as KirigamiComponents
|
||||||
|
|
||||||
Delegates.RoundedItemDelegate {
|
Delegates.RoundedItemDelegate {
|
||||||
id: root
|
id: root
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import QtQml.Models
|
|||||||
|
|
||||||
import org.kde.kirigami as Kirigami
|
import org.kde.kirigami as Kirigami
|
||||||
import org.kde.kirigamiaddons.labs.components as KirigamiComponents
|
import org.kde.kirigamiaddons.labs.components as KirigamiComponents
|
||||||
|
import org.kde.kitemmodels
|
||||||
|
|
||||||
import org.kde.neochat
|
import org.kde.neochat
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ ApplicationWindow {
|
|||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: mapView.map
|
target: mapView.map
|
||||||
function onCopyrightLinkActivated(link: string): void {
|
function onCopyrightLinkActivated() {
|
||||||
Qt.openUrlExternally(link);
|
Qt.openUrlExternally(link);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,23 @@ Labs.MenuBar {
|
|||||||
|
|
||||||
required property NeoChatConnection connection
|
required property NeoChatConnection connection
|
||||||
|
|
||||||
|
Labs.Menu {
|
||||||
|
title: i18nc("menu", "NeoChat")
|
||||||
|
|
||||||
|
Labs.MenuItem {
|
||||||
|
enabled: pageStack.layers.currentItem.title !== i18n("Configure NeoChat…")
|
||||||
|
text: i18nc("menu", "Configure NeoChat…")
|
||||||
|
|
||||||
|
shortcut: StandardKey.Preferences
|
||||||
|
onTriggered: NeoChatSettingsView.open()
|
||||||
|
}
|
||||||
|
Labs.MenuItem {
|
||||||
|
text: i18nc("menu", "Quit NeoChat")
|
||||||
|
|
||||||
|
shortcut: StandardKey.Quit
|
||||||
|
onTriggered: Qt.quit()
|
||||||
|
}
|
||||||
|
}
|
||||||
Labs.Menu {
|
Labs.Menu {
|
||||||
title: i18nc("menu", "File")
|
title: i18nc("menu", "File")
|
||||||
|
|
||||||
@@ -57,19 +74,6 @@ Labs.MenuBar {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Labs.MenuItem {
|
|
||||||
enabled: pageStack.layers.currentItem.title !== i18n("Configure NeoChat…")
|
|
||||||
text: i18nc("menu", "Configure NeoChat…")
|
|
||||||
|
|
||||||
shortcut: StandardKey.Preferences
|
|
||||||
onTriggered: NeoChatSettingsView.open()
|
|
||||||
}
|
|
||||||
Labs.MenuItem {
|
|
||||||
text: i18nc("menu", "Quit NeoChat")
|
|
||||||
|
|
||||||
shortcut: StandardKey.Quit
|
|
||||||
onTriggered: Qt.quit()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
EditMenu {
|
EditMenu {
|
||||||
title: i18nc("menu", "Edit")
|
title: i18nc("menu", "Edit")
|
||||||
|
|||||||
@@ -52,15 +52,6 @@ ColumnLayout {
|
|||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
}
|
}
|
||||||
|
|
||||||
Kirigami.SelectableLabel {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
font: Kirigami.Theme.smallFont
|
|
||||||
textFormat: TextEdit.PlainText
|
|
||||||
visible: root.currentRoom && root.currentRoom.canonicalAlias
|
|
||||||
text: root.currentRoom && root.currentRoom.canonicalAlias ? root.currentRoom.canonicalAlias : ""
|
|
||||||
color: Kirigami.Theme.disabledTextColor
|
|
||||||
}
|
|
||||||
|
|
||||||
Kirigami.Heading {
|
Kirigami.Heading {
|
||||||
text: root.currentRoom.displayName
|
text: root.currentRoom.displayName
|
||||||
|
|
||||||
@@ -79,14 +70,7 @@ ColumnLayout {
|
|||||||
spacing: Kirigami.Units.smallSpacing
|
spacing: Kirigami.Units.smallSpacing
|
||||||
|
|
||||||
Kirigami.Heading {
|
Kirigami.Heading {
|
||||||
text: root.invitingMember.displayName
|
text: root.currentRoom.displayName
|
||||||
|
|
||||||
Layout.alignment: Qt.AlignHCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
QQC2.Label {
|
|
||||||
text: root.invitingMember.id
|
|
||||||
color: Kirigami.Theme.disabledTextColor
|
|
||||||
|
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
}
|
}
|
||||||
@@ -175,7 +159,7 @@ ColumnLayout {
|
|||||||
|
|
||||||
QQC2.Label {
|
QQC2.Label {
|
||||||
color: Kirigami.Theme.disabledTextColor
|
color: Kirigami.Theme.disabledTextColor
|
||||||
text: xi18nc("@info:label Ensure you are referring to the same translation used for that settings page", "You can reject invitations from unknown users under the <interface>Security & Safety</interface> settings.")
|
text: i18nc("@info:label", "You can reject invitations from unknown users under Security settings.")
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
|
|
||||||
// + 5 to prevent it from wrapping unnecessarily
|
// + 5 to prevent it from wrapping unnecessarily
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import QtQuick.Layouts
|
|||||||
import org.kde.kirigami as Kirigami
|
import org.kde.kirigami as Kirigami
|
||||||
import org.kde.kirigamiaddons.components as KirigamiComponents
|
import org.kde.kirigamiaddons.components as KirigamiComponents
|
||||||
import org.kde.kirigamiaddons.formcard as FormCard
|
import org.kde.kirigamiaddons.formcard as FormCard
|
||||||
|
import org.kde.prison
|
||||||
|
|
||||||
import org.kde.neochat
|
import org.kde.neochat
|
||||||
|
|
||||||
@@ -24,7 +25,7 @@ Kirigami.Dialog {
|
|||||||
|
|
||||||
standardButtons: Kirigami.Dialog.NoButton
|
standardButtons: Kirigami.Dialog.NoButton
|
||||||
|
|
||||||
width: Math.min(QQC2.ApplicationWindow.window.width, Kirigami.Units.gridUnit * 24)
|
width: Math.min(applicationWindow().width, Kirigami.Units.gridUnit * 24)
|
||||||
title: i18nc("@title:dialog", "Join Room")
|
title: i18nc("@title:dialog", "Join Room")
|
||||||
|
|
||||||
contentItem: ColumnLayout {
|
contentItem: ColumnLayout {
|
||||||
|
|||||||
@@ -60,21 +60,21 @@ Kirigami.ApplicationWindow {
|
|||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: LoginHelper
|
target: LoginHelper
|
||||||
function onLoaded(): void {
|
function onLoaded() {
|
||||||
root.load();
|
root.load();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: Registration
|
target: Registration
|
||||||
function onLoaded(): void {
|
function onLoaded() {
|
||||||
root.load();
|
root.load();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: root.quitAction
|
target: root.quitAction
|
||||||
function onTriggered(): void {
|
function onTriggered() {
|
||||||
Qt.quit();
|
Qt.quit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -98,40 +98,42 @@ Kirigami.ApplicationWindow {
|
|||||||
Connections {
|
Connections {
|
||||||
target: RoomManager
|
target: RoomManager
|
||||||
|
|
||||||
function onCurrentRoomChanged(): void {
|
function onCurrentRoomChanged() {
|
||||||
if (RoomManager.currentRoom && pageStack.depth <= 1 && root.initialized && Kirigami.Settings.isMobile) {
|
if (RoomManager.currentRoom && pageStack.depth <= 1 && root.initialized && Kirigami.Settings.isMobile) {
|
||||||
let roomPage = pageStack.layers.push(Qt.createComponent('org.kde.neochat', 'RoomPage'));
|
let roomPage = pageStack.layers.push(Qt.createComponent('org.kde.neochat', 'RoomPage'), {
|
||||||
|
connection: root.connection
|
||||||
|
});
|
||||||
roomPage.backRequested.connect(event => {
|
roomPage.backRequested.connect(event => {
|
||||||
RoomManager.clearCurrentRoom();
|
RoomManager.clearCurrentRoom();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onAskJoinRoom(room: NeoChatRoom): void {
|
function onAskJoinRoom(room) {
|
||||||
Qt.createComponent("org.kde.neochat", "JoinRoomDialog").createObject(root, {
|
Qt.createComponent("org.kde.neochat", "JoinRoomDialog").createObject(root, {
|
||||||
room: room,
|
room: room,
|
||||||
connection: root.connection
|
connection: root.connection
|
||||||
}).open();
|
}).open();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onShowUserDetail(user, room: NeoChatRoom): void {
|
function onShowUserDetail(user, room) {
|
||||||
root.showUserDetail(user, room);
|
root.showUserDetail(user, room);
|
||||||
}
|
}
|
||||||
|
|
||||||
function goToEvent(event: string): void {
|
function goToEvent(event) {
|
||||||
if (event.length > 0) {
|
if (event.length > 0) {
|
||||||
roomItem.goToEvent(event);
|
roomItem.goToEvent(event);
|
||||||
}
|
}
|
||||||
roomItem.forceActiveFocus();
|
roomItem.forceActiveFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onAskDirectChatConfirmation(user): void {
|
function onAskDirectChatConfirmation(user) {
|
||||||
Qt.createComponent("org.kde.neochat", "AskDirectChatConfirmation").createObject(this, {
|
Qt.createComponent("org.kde.neochat", "AskDirectChatConfirmation").createObject(this, {
|
||||||
user: user
|
user: user
|
||||||
}).open();
|
}).open();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onExternalUrl(url): void {
|
function onExternalUrl(url) {
|
||||||
let dialog = Qt.createComponent("org.kde.neochat", "ConfirmUrlDialog").createObject(this);
|
let dialog = Qt.createComponent("org.kde.neochat", "ConfirmUrlDialog").createObject(this);
|
||||||
dialog.link = url;
|
dialog.link = url;
|
||||||
dialog.open();
|
dialog.open();
|
||||||
@@ -336,7 +338,7 @@ Kirigami.ApplicationWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
function handleShare(): void {
|
function handleShare(): void {
|
||||||
const dialog = root.pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'ChooseRoomDialog'), {
|
const dialog = applicationWindow().pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'ChooseRoomDialog'), {
|
||||||
connection: root.connection
|
connection: root.connection
|
||||||
}, {
|
}, {
|
||||||
title: i18nc("@title", "Share"),
|
title: i18nc("@title", "Share"),
|
||||||
@@ -363,7 +365,9 @@ Kirigami.ApplicationWindow {
|
|||||||
RoomManager.loadInitialRoom();
|
RoomManager.loadInitialRoom();
|
||||||
|
|
||||||
if (!Kirigami.Settings.isMobile) {
|
if (!Kirigami.Settings.isMobile) {
|
||||||
let roomPage = pageStack.push(Qt.createComponent('org.kde.neochat', 'RoomPage'));
|
let roomPage = pageStack.push(Qt.createComponent('org.kde.neochat', 'RoomPage'), {
|
||||||
|
connection: root.connection
|
||||||
|
});
|
||||||
roomPage.forceActiveFocus();
|
roomPage.forceActiveFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ Kirigami.Page {
|
|||||||
icon.name: "document-edit"
|
icon.name: "document-edit"
|
||||||
visible: root.allowEdit
|
visible: root.allowEdit
|
||||||
enabled: room.canSendState(root.type) && (!root.stateKey.startsWith("@") || root.stateKey === root.room.connection.localUserId) && root.type !== "m.room.create"
|
enabled: room.canSendState(root.type) && (!root.stateKey.startsWith("@") || root.stateKey === root.room.connection.localUserId) && root.type !== "m.room.create"
|
||||||
onTriggered: pageStack.pushDialogLayer(Qt.createComponent("org.kde.neochat", "EditStateDialog"), {
|
onTriggered: pageStack.pushDialogLayer(Qt.createComponent("org.kde.neochat", "EditStateDialog.qml"), {
|
||||||
room: root.room,
|
room: root.room,
|
||||||
type: root.type,
|
type: root.type,
|
||||||
stateKey: root.stateKey,
|
stateKey: root.stateKey,
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ Components.AlbumMaximizeComponent {
|
|||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: MediaManager
|
target: MediaManager
|
||||||
function onPlaybackStarted(): void {
|
function onPlaybackStarted() {
|
||||||
if (currentItem.playbackState === MediaPlayer.PlayingState) {
|
if (currentItem.playbackState === MediaPlayer.PlayingState) {
|
||||||
currentItem.pause();
|
currentItem.pause();
|
||||||
}
|
}
|
||||||
@@ -82,7 +82,7 @@ Components.AlbumMaximizeComponent {
|
|||||||
Connections {
|
Connections {
|
||||||
target: currentRoom
|
target: currentRoom
|
||||||
|
|
||||||
function onFileTransferProgress(id: string, progress: int, total: int): void {
|
function onFileTransferProgress(id, progress, total) {
|
||||||
if (id == root.currentEventId) {
|
if (id == root.currentEventId) {
|
||||||
root.downloadAction.progress = progress / total * 100.0;
|
root.downloadAction.progress = progress / total * 100.0;
|
||||||
}
|
}
|
||||||
@@ -130,7 +130,7 @@ Components.AlbumMaximizeComponent {
|
|||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: RoomManager
|
target: RoomManager
|
||||||
function onCloseFullScreen(): void {
|
function onCloseFullScreen() {
|
||||||
root.close();
|
root.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ Kirigami.Dialog {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
width: Math.min(QQC2.ApplicationWindow.window.width, Kirigami.Units.gridUnit * 24)
|
width: Math.min(applicationWindow().width, Kirigami.Units.gridUnit * 24)
|
||||||
title: i18nc("@title: create new poll in the room", "Create Poll")
|
title: i18nc("@title: create new poll in the room", "Create Poll")
|
||||||
|
|
||||||
contentItem: ColumnLayout {
|
contentItem: ColumnLayout {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Kirigami.Page {
|
|||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: root.QQC2.ApplicationWindow.window
|
target: root.QQC2.ApplicationWindow.window
|
||||||
function onClosing(): void {
|
function onClosing() {
|
||||||
root.destroy();
|
root.destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import QtQuick.Controls as QQC2
|
|||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
|
|
||||||
import org.kde.kirigami as Kirigami
|
import org.kde.kirigami as Kirigami
|
||||||
|
import org.kde.kitemmodels
|
||||||
|
|
||||||
import org.kde.neochat
|
import org.kde.neochat
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ Kirigami.Dialog {
|
|||||||
|
|
||||||
property var connection
|
property var connection
|
||||||
|
|
||||||
|
parent: applicationWindow().overlay
|
||||||
|
|
||||||
leftPadding: 0
|
leftPadding: 0
|
||||||
rightPadding: 0
|
rightPadding: 0
|
||||||
topPadding: 0
|
topPadding: 0
|
||||||
@@ -22,7 +24,7 @@ Kirigami.Dialog {
|
|||||||
|
|
||||||
title: i18nc("@title Join <name of a space>", "Join %1", SpaceHierarchyCache.recommendedSpaceDisplayName)
|
title: i18nc("@title Join <name of a space>", "Join %1", SpaceHierarchyCache.recommendedSpaceDisplayName)
|
||||||
|
|
||||||
width: Math.min(QQC2.ApplicationWindow.window.width, Kirigami.Units.gridUnit * 24)
|
width: Math.min(applicationWindow().width, Kirigami.Units.gridUnit * 24)
|
||||||
|
|
||||||
contentItem: ColumnLayout {
|
contentItem: ColumnLayout {
|
||||||
FormCard.AbstractFormDelegate {
|
FormCard.AbstractFormDelegate {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import QtQuick.Layouts
|
|||||||
import QtQuick.Window
|
import QtQuick.Window
|
||||||
|
|
||||||
import org.kde.kirigami as Kirigami
|
import org.kde.kirigami as Kirigami
|
||||||
|
import org.kde.kitemmodels
|
||||||
|
|
||||||
import org.kde.neochat
|
import org.kde.neochat
|
||||||
|
|
||||||
@@ -63,9 +64,9 @@ Kirigami.Page {
|
|||||||
|
|
||||||
actions: [
|
actions: [
|
||||||
Kirigami.Action {
|
Kirigami.Action {
|
||||||
visible: Kirigami.Settings.isMobile || !root.Kirigami.PageStack.pageStack.wideMode
|
visible: Kirigami.Settings.isMobile || !applicationWindow().pageStack.wideMode
|
||||||
icon.name: "view-right-new"
|
icon.name: "view-right-new"
|
||||||
onTriggered: (root.QQC2.ApplicationWindow.window as Main).openRoomDrawer()
|
onTriggered: applicationWindow().openRoomDrawer()
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -80,9 +81,9 @@ Kirigami.Page {
|
|||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: root.currentRoom.connection
|
target: root.currentRoom.connection
|
||||||
function onIsOnlineChanged(): void {
|
function onIsOnlineChanged() {
|
||||||
if (!root.currentRoom.connection.isOnline) {
|
if (!root.currentRoom.connection.isOnline) {
|
||||||
banner.text = i18nc("@info:status", "NeoChat is offline. Please check your network connection.");
|
banner.text = i18n("NeoChat is offline. Please check your network connection.");
|
||||||
banner.visible = true;
|
banner.visible = true;
|
||||||
banner.type = Kirigami.MessageType.Error;
|
banner.type = Kirigami.MessageType.Error;
|
||||||
} else {
|
} else {
|
||||||
@@ -137,8 +138,8 @@ Kirigami.Page {
|
|||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
sourceComponent: Kirigami.PlaceholderMessage {
|
sourceComponent: Kirigami.PlaceholderMessage {
|
||||||
icon.name: "org.kde.neochat"
|
icon.name: "org.kde.neochat"
|
||||||
text: i18nc("@title", "Welcome to NeoChat")
|
text: i18n("Welcome to NeoChat")
|
||||||
explanation: i18nc("@info:usagetip", "Select or join a room to get started")
|
explanation: i18n("Select or join a room to get started")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,20 +163,20 @@ Kirigami.Page {
|
|||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: RoomManager
|
target: RoomManager
|
||||||
function onCurrentRoomChanged(): void {
|
function onCurrentRoomChanged() {
|
||||||
if (root.currentRoom && root.currentRoom.isInvite) {
|
if (root.currentRoom && root.currentRoom.isInvite) {
|
||||||
Controller.clearInvitationNotification(root.currentRoom.id);
|
Controller.clearInvitationNotification(root.currentRoom.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onGoToEvent(eventId: string): void {
|
function onGoToEvent(eventId) {
|
||||||
(timelineViewLoader.item as TimelineView).goToEvent(eventId);
|
(timelineViewLoader.item as TimelineView).goToEvent(eventId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: root.currentRoom.connection
|
target: root.currentRoom.connection
|
||||||
function onJoinedRoom(room: NeoChatRoom, invited: NeoChatRoom): void {
|
function onJoinedRoom(room, invited) {
|
||||||
if (root.currentRoom.id === invited.id) {
|
if (root.currentRoom.id === invited.id) {
|
||||||
RoomManager.resolveResource(room.id);
|
RoomManager.resolveResource(room.id);
|
||||||
}
|
}
|
||||||
@@ -195,22 +196,22 @@ Kirigami.Page {
|
|||||||
Connections {
|
Connections {
|
||||||
target: RoomManager
|
target: RoomManager
|
||||||
|
|
||||||
function onShowMessage(messageType: Kirigami.MessageType, message: string): void {
|
function onShowMessage(messageType, message) {
|
||||||
banner.text = message;
|
banner.text = message;
|
||||||
banner.type = messageType;
|
banner.type = messageType;
|
||||||
banner.visible = true;
|
banner.visible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function onShowEventSource(eventId: string): void {
|
function onShowEventSource(eventId) {
|
||||||
(root.Kirigami.PageStack.pageStack as Kirigami.PageRow).pushDialogLayer(Qt.createComponent('org.kde.neochat', 'MessageSourceSheet'), {
|
applicationWindow().pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'MessageSourceSheet'), {
|
||||||
sourceText: root.currentRoom.getEventJsonSource(eventId)
|
sourceText: root.currentRoom.getEventJsonSource(eventId)
|
||||||
}, {
|
}, {
|
||||||
title: i18nc("@title:dialog", "Message Source"),
|
title: i18n("Message Source"),
|
||||||
width: Kirigami.Units.gridUnit * 25
|
width: Kirigami.Units.gridUnit * 25
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onShowMessageMenu(eventId: string, author, messageComponentType, plainText: string, htmlText: string, selectedText: string, hoveredLink: string, isThread: bool): void {
|
function onShowMessageMenu(eventId, author, messageComponentType, plainText, htmlText, selectedText, hoveredLink, isThread) {
|
||||||
const contextMenu = messageDelegateContextMenu.createObject(root, {
|
const contextMenu = messageDelegateContextMenu.createObject(root, {
|
||||||
selectedText: selectedText,
|
selectedText: selectedText,
|
||||||
hoveredLink: hoveredLink,
|
hoveredLink: hoveredLink,
|
||||||
|
|||||||
@@ -67,14 +67,10 @@ QQC2.ComboBox {
|
|||||||
QQC2.ToolButton {
|
QQC2.ToolButton {
|
||||||
visible: serverItem.isAddServerDelegate || serverItem.isDeletable
|
visible: serverItem.isAddServerDelegate || serverItem.isDeletable
|
||||||
icon.name: serverItem.isAddServerDelegate ? "list-add" : "dialog-close"
|
icon.name: serverItem.isAddServerDelegate ? "list-add" : "dialog-close"
|
||||||
text: serverItem.isAddServerDelegate ? i18nc("@action:button", "Add new server") : i18nc("@action:button", "Remove server")
|
text: i18nc("@action:button", "Add new server")
|
||||||
Accessible.name: text
|
Accessible.name: text
|
||||||
display: QQC2.AbstractButton.IconOnly
|
display: QQC2.AbstractButton.IconOnly
|
||||||
|
|
||||||
QQC2.ToolTip.text: text
|
|
||||||
QQC2.ToolTip.visible: hovered
|
|
||||||
QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
|
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if (root.currentIndex === serverItem.index && serverItem.isDeletable) {
|
if (root.currentIndex === serverItem.index && serverItem.isDeletable) {
|
||||||
root.currentIndex = 0;
|
root.currentIndex = 0;
|
||||||
@@ -177,7 +173,7 @@ QQC2.ComboBox {
|
|||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: serverListModel
|
target: serverListModel
|
||||||
function onServerCheckComplete(url: string, valid: bool): void {
|
function onServerCheckComplete(url, valid) {
|
||||||
if (url == serverUrlField.text && valid) {
|
if (url == serverUrlField.text && valid) {
|
||||||
serverUrlField.isValidServer = true;
|
serverUrlField.isValidServer = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ Kirigami.Action {
|
|||||||
text: i18n("Share")
|
text: i18n("Share")
|
||||||
tooltip: i18n("Share the selected media")
|
tooltip: i18n("Share the selected media")
|
||||||
|
|
||||||
|
visible: false
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This property holds the input data for purpose.
|
* This property holds the input data for purpose.
|
||||||
*
|
*
|
||||||
@@ -58,7 +60,7 @@ Kirigami.Action {
|
|||||||
if (id != root.eventId) {
|
if (id != root.eventId) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pageStack.pushDialogLayer(Qt.createComponent("org.kde.neochat", "ShareDialog"), {
|
applicationWindow().pageStack.pushDialogLayer(Qt.createComponent("org.kde.neochat", "ShareDialog"), {
|
||||||
title: root.text,
|
title: root.text,
|
||||||
index: index,
|
index: index,
|
||||||
model: root._instantiator.model
|
model: root._instantiator.model
|
||||||
|
|||||||
@@ -261,7 +261,7 @@ Kirigami.Dialog {
|
|||||||
icon.name: "delete"
|
icon.name: "delete"
|
||||||
icon.color: Kirigami.Theme.negativeTextColor
|
icon.color: Kirigami.Theme.negativeTextColor
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
let dialog = pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'ReasonDialog'), {
|
let dialog = applicationWindow().pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'ReasonDialog'), {
|
||||||
title: i18nc("@title:dialog", "Remove Messages"),
|
title: i18nc("@title:dialog", "Remove Messages"),
|
||||||
placeholder: i18nc("@info:placeholder", "Reason for removing this user's recent messages"),
|
placeholder: i18nc("@info:placeholder", "Reason for removing this user's recent messages"),
|
||||||
actionText: i18nc("@action:button 'Remove' as in 'Remove these messages'", "Remove"),
|
actionText: i18nc("@action:button 'Remove' as in 'Remove these messages'", "Remove"),
|
||||||
|
|||||||
@@ -11,7 +11,19 @@ VerificationMessage {
|
|||||||
|
|
||||||
required property int reason
|
required property int reason
|
||||||
|
|
||||||
icon: "security-low"
|
icon: {
|
||||||
|
switch (root.reason) {
|
||||||
|
case KeyVerificationSession.TIMEOUT:
|
||||||
|
case KeyVerificationSession.REMOTE_TIMEOUT:
|
||||||
|
case KeyVerificationSession.USER:
|
||||||
|
case KeyVerificationSession.REMOTE_USER:
|
||||||
|
case KeyVerificationSession.SESSION_ACCEPTED:
|
||||||
|
case KeyVerificationSession.REMOTE_SESSION_ACCEPTED:
|
||||||
|
return "dialog-information";
|
||||||
|
default:
|
||||||
|
return "security-low";
|
||||||
|
}
|
||||||
|
}
|
||||||
text: {
|
text: {
|
||||||
switch (root.reason) {
|
switch (root.reason) {
|
||||||
case KeyVerificationSession.NONE:
|
case KeyVerificationSession.NONE:
|
||||||
|
|||||||
@@ -236,18 +236,11 @@ void RoomManager::resolveResource(Uri uri, const QString &action)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RoomManager::maximizeMedia(const QString &eventId)
|
void RoomManager::maximizeMedia(int index)
|
||||||
{
|
{
|
||||||
if (eventId.isEmpty()) {
|
if (index < -1 || index > m_mediaMessageFilterModel->rowCount()) {
|
||||||
qWarning() << "Tried to open media for empty event id";
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto index = m_mediaMessageFilterModel->getRowForEventId(eventId);
|
|
||||||
if (index == -1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_EMIT showMaximizedMedia(index);
|
Q_EMIT showMaximizedMedia(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,17 +264,8 @@ void RoomManager::viewEventSource(const QString &eventId)
|
|||||||
|
|
||||||
void RoomManager::viewEventMenu(const QString &eventId, NeoChatRoom *room, NeochatRoomMember *sender, const QString &selectedText, const QString &hoveredLink)
|
void RoomManager::viewEventMenu(const QString &eventId, NeoChatRoom *room, NeochatRoomMember *sender, const QString &selectedText, const QString &hoveredLink)
|
||||||
{
|
{
|
||||||
if (eventId.isEmpty()) {
|
const auto &event = **room->findInTimeline(eventId);
|
||||||
qWarning() << "Tried to open event menu with empty event id";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto it = room->findInTimeline(eventId);
|
|
||||||
if (it == room->historyEdge()) {
|
|
||||||
// This is probably a pending event
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const auto &event = **it;
|
|
||||||
if (EventHandler::mediaInfo(room, &event).contains("mimeType"_L1)) {
|
if (EventHandler::mediaInfo(room, &event).contains("mimeType"_L1)) {
|
||||||
Q_EMIT showFileMenu(eventId,
|
Q_EMIT showFileMenu(eventId,
|
||||||
sender,
|
sender,
|
||||||
@@ -374,6 +358,19 @@ void RoomManager::visitRoom(Room *r, const QString &eventId)
|
|||||||
if (m_currentRoom && !m_currentRoom->editCache()->editId().isEmpty()) {
|
if (m_currentRoom && !m_currentRoom->editCache()->editId().isEmpty()) {
|
||||||
m_currentRoom->editCache()->setEditId({});
|
m_currentRoom->editCache()->setEditId({});
|
||||||
}
|
}
|
||||||
|
if (m_currentRoom && !m_currentRoom->isSpace() && m_chatDocumentHandler) {
|
||||||
|
// We're doing these things here because it is critical that they are switched at the same time
|
||||||
|
if (m_chatDocumentHandler->document()) {
|
||||||
|
m_currentRoom->mainCache()->setSavedText(m_chatDocumentHandler->document()->textDocument()->toPlainText());
|
||||||
|
m_chatDocumentHandler->setRoom(room);
|
||||||
|
if (room) {
|
||||||
|
m_chatDocumentHandler->document()->textDocument()->setPlainText(room->mainCache()->savedText());
|
||||||
|
room->mainCache()->setText(room->mainCache()->savedText());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_chatDocumentHandler->setRoom(room);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!room) {
|
if (!room) {
|
||||||
setCurrentRoom({});
|
setCurrentRoom({});
|
||||||
@@ -473,6 +470,18 @@ bool RoomManager::visitNonMatrix(const QUrl &url)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ChatDocumentHandler *RoomManager::chatDocumentHandler() const
|
||||||
|
{
|
||||||
|
return m_chatDocumentHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RoomManager::setChatDocumentHandler(ChatDocumentHandler *handler)
|
||||||
|
{
|
||||||
|
m_chatDocumentHandler = handler;
|
||||||
|
m_chatDocumentHandler->setRoom(m_currentRoom);
|
||||||
|
Q_EMIT chatDocumentHandlerChanged();
|
||||||
|
}
|
||||||
|
|
||||||
void RoomManager::setConnection(NeoChatConnection *connection)
|
void RoomManager::setConnection(NeoChatConnection *connection)
|
||||||
{
|
{
|
||||||
if (m_connection == connection) {
|
if (m_connection == connection) {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include <Quotient/roommember.h>
|
#include <Quotient/roommember.h>
|
||||||
#include <Quotient/uriresolver.h>
|
#include <Quotient/uriresolver.h>
|
||||||
|
|
||||||
|
#include "chatdocumenthandler.h"
|
||||||
#include "enums/messagecomponenttype.h"
|
#include "enums/messagecomponenttype.h"
|
||||||
#include "enums/messagetype.h"
|
#include "enums/messagetype.h"
|
||||||
#include "models/mediamessagefiltermodel.h"
|
#include "models/mediamessagefiltermodel.h"
|
||||||
@@ -136,6 +137,13 @@ class RoomManager : public QObject, public UriResolverBase
|
|||||||
*/
|
*/
|
||||||
Q_PROPERTY(bool hasOpenRoom READ hasOpenRoom NOTIFY currentRoomChanged)
|
Q_PROPERTY(bool hasOpenRoom READ hasOpenRoom NOTIFY currentRoomChanged)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The ChatDocumentHandler for the open room.
|
||||||
|
*
|
||||||
|
* @sa ChatDocumentHandler
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(ChatDocumentHandler *chatDocumentHandler READ chatDocumentHandler WRITE setChatDocumentHandler NOTIFY chatDocumentHandlerChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~RoomManager();
|
virtual ~RoomManager();
|
||||||
static RoomManager &instance();
|
static RoomManager &instance();
|
||||||
@@ -204,8 +212,12 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Show a media item maximized.
|
* @brief Show a media item maximized.
|
||||||
|
*
|
||||||
|
* @param index the index to open the maximize delegate model at. This is the
|
||||||
|
* index in the MediaMessageFilterModel owned by this RoomManager. A value
|
||||||
|
* of -1 opens a the default item.
|
||||||
*/
|
*/
|
||||||
Q_INVOKABLE void maximizeMedia(const QString &eventId);
|
Q_INVOKABLE void maximizeMedia(int index);
|
||||||
|
|
||||||
Q_INVOKABLE void maximizeCode(NeochatRoomMember *author, const QDateTime &time, const QString &codeText, const QString &language);
|
Q_INVOKABLE void maximizeCode(NeochatRoomMember *author, const QDateTime &time, const QString &codeText, const QString &language);
|
||||||
|
|
||||||
@@ -225,6 +237,9 @@ public:
|
|||||||
Q_INVOKABLE void
|
Q_INVOKABLE void
|
||||||
viewEventMenu(const QString &eventId, NeoChatRoom *room, NeochatRoomMember *sender, const QString &selectedText = {}, const QString &hoveredLink = {});
|
viewEventMenu(const QString &eventId, NeoChatRoom *room, NeochatRoomMember *sender, const QString &selectedText = {}, const QString &hoveredLink = {});
|
||||||
|
|
||||||
|
ChatDocumentHandler *chatDocumentHandler() const;
|
||||||
|
void setChatDocumentHandler(ChatDocumentHandler *handler);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set a URL to be loaded as the initial room.
|
* @brief Set a URL to be loaded as the initial room.
|
||||||
*/
|
*/
|
||||||
@@ -327,6 +342,8 @@ Q_SIGNALS:
|
|||||||
*/
|
*/
|
||||||
void showMessage(MessageType::Type messageType, const QString &message);
|
void showMessage(MessageType::Type messageType, const QString &message);
|
||||||
|
|
||||||
|
void chatDocumentHandlerChanged();
|
||||||
|
|
||||||
void connectionChanged();
|
void connectionChanged();
|
||||||
|
|
||||||
void directChatsActiveChanged();
|
void directChatsActiveChanged();
|
||||||
@@ -355,6 +372,7 @@ private:
|
|||||||
KConfigGroup m_lastRoomConfig;
|
KConfigGroup m_lastRoomConfig;
|
||||||
KConfigGroup m_lastSpaceConfig;
|
KConfigGroup m_lastSpaceConfig;
|
||||||
KConfigGroup m_directChatsConfig;
|
KConfigGroup m_directChatsConfig;
|
||||||
|
QPointer<ChatDocumentHandler> m_chatDocumentHandler;
|
||||||
|
|
||||||
RoomListModel *m_roomListModel;
|
RoomListModel *m_roomListModel;
|
||||||
SortFilterRoomListModel *m_sortFilterRoomListModel;
|
SortFilterRoomListModel *m_sortFilterRoomListModel;
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
|
|
||||||
#include <QDBusMetaType>
|
#include <QDBusMetaType>
|
||||||
|
|
||||||
#include <KWindowSystem>
|
|
||||||
|
|
||||||
#include "controller.h"
|
#include "controller.h"
|
||||||
#include "models/roomlistmodel.h"
|
#include "models/roomlistmodel.h"
|
||||||
#include "models/sortfilterroomlistmodel.h"
|
#include "models/sortfilterroomlistmodel.h"
|
||||||
@@ -88,9 +86,4 @@ void Runner::Run(const QString &id, const QString &actionId)
|
|||||||
WindowController::instance().showAndRaiseWindow(QString());
|
WindowController::instance().showAndRaiseWindow(QString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Runner::SetActivationToken(const QString &token)
|
|
||||||
{
|
|
||||||
KWindowSystem::setCurrentXdgActivationToken(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "moc_runner.cpp"
|
#include "moc_runner.cpp"
|
||||||
|
|||||||
@@ -190,8 +190,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
Q_SCRIPTABLE void Run(const QString &id, const QString &actionId);
|
Q_SCRIPTABLE void Run(const QString &id, const QString &actionId);
|
||||||
|
|
||||||
Q_SCRIPTABLE void SetActivationToken(const QString &token);
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void roomListModelChanged();
|
void roomListModelChanged();
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ QQC2.Control {
|
|||||||
displayHint: Kirigami.DisplayHint.IconOnly
|
displayHint: Kirigami.DisplayHint.IconOnly
|
||||||
|
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
let dialog = (Clipboard.hasImage ? attachDialog : openFileDialog).createObject(root.QQC2.Overlay.overlay);
|
let dialog = (Clipboard.hasImage ? attachDialog : openFileDialog).createObject(applicationWindow().overlay);
|
||||||
dialog.chosen.connect(path => _private.chatBarCache.attachmentPath = path);
|
dialog.chosen.connect(path => _private.chatBarCache.attachmentPath = path);
|
||||||
dialog.open();
|
dialog.open();
|
||||||
}
|
}
|
||||||
@@ -197,22 +197,6 @@ QQC2.Control {
|
|||||||
visible: root.currentRoom.mainCache.replyId.length > 0
|
visible: root.currentRoom.mainCache.replyId.length > 0
|
||||||
sourceComponent: replyPane
|
sourceComponent: replyPane
|
||||||
}
|
}
|
||||||
RowLayout {
|
|
||||||
visible: replyLoader.visible && !root.currentRoom.mainCache.relationAuthorIsPresent
|
|
||||||
spacing: Kirigami.Units.smallSpacing
|
|
||||||
|
|
||||||
Kirigami.Icon {
|
|
||||||
source: "help-hint-symbolic"
|
|
||||||
color: Kirigami.Theme.disabledTextColor
|
|
||||||
|
|
||||||
Layout.preferredWidth: Kirigami.Units.iconSizes.small
|
|
||||||
Layout.preferredHeight: Kirigami.Units.iconSizes.small
|
|
||||||
}
|
|
||||||
QQC2.Label {
|
|
||||||
text: i18nc("@info", "The user you're replying to has left the room, and can't be notified.")
|
|
||||||
color: Kirigami.Theme.disabledTextColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loader {
|
Loader {
|
||||||
id: attachLoader
|
id: attachLoader
|
||||||
|
|
||||||
@@ -398,6 +382,8 @@ QQC2.Control {
|
|||||||
implicitHeight: replyComponent.implicitHeight
|
implicitHeight: replyComponent.implicitHeight
|
||||||
ReplyComponent {
|
ReplyComponent {
|
||||||
id: replyComponent
|
id: replyComponent
|
||||||
|
replyEventId: _private.chatBarCache.replyId
|
||||||
|
replyAuthor: _private.chatBarCache.relationAuthor
|
||||||
replyContentModel: ContentProvider.contentModelForEvent(root.currentRoom, _private.chatBarCache.replyId, true)
|
replyContentModel: ContentProvider.contentModelForEvent(root.currentRoom, _private.chatBarCache.replyId, true)
|
||||||
Message.maxContentWidth: replyLoader.item.width
|
Message.maxContentWidth: replyLoader.item.width
|
||||||
|
|
||||||
@@ -438,6 +424,7 @@ QQC2.Control {
|
|||||||
QtObject {
|
QtObject {
|
||||||
id: _private
|
id: _private
|
||||||
property ChatBarCache chatBarCache
|
property ChatBarCache chatBarCache
|
||||||
|
onChatBarCacheChanged: documentHandler.chatBarCache = chatBarCache
|
||||||
|
|
||||||
function postMessage() {
|
function postMessage() {
|
||||||
_private.chatBarCache.postMessage();
|
_private.chatBarCache.postMessage();
|
||||||
@@ -499,14 +486,15 @@ QQC2.Control {
|
|||||||
|
|
||||||
ChatDocumentHandler {
|
ChatDocumentHandler {
|
||||||
id: documentHandler
|
id: documentHandler
|
||||||
type: ChatBarType.Room
|
|
||||||
room: root.currentRoom
|
|
||||||
document: textField.textDocument
|
document: textField.textDocument
|
||||||
cursorPosition: textField.cursorPosition
|
cursorPosition: textField.cursorPosition
|
||||||
selectionStart: textField.selectionStart
|
selectionStart: textField.selectionStart
|
||||||
selectionEnd: textField.selectionEnd
|
selectionEnd: textField.selectionEnd
|
||||||
mentionColor: Kirigami.Theme.linkColor
|
mentionColor: Kirigami.Theme.linkColor
|
||||||
errorColor: Kirigami.Theme.negativeTextColor
|
errorColor: Kirigami.Theme.negativeTextColor
|
||||||
|
Component.onCompleted: {
|
||||||
|
RoomManager.chatDocumentHandler = documentHandler;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Component {
|
Component {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ QQC2.Popup {
|
|||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: RoomManager
|
target: RoomManager
|
||||||
function onCurrentRoomChanged(): void {
|
function onCurrentRoomChanged() {
|
||||||
root.close();
|
root.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -65,7 +65,7 @@ QQC2.Popup {
|
|||||||
padding: 2
|
padding: 2
|
||||||
|
|
||||||
implicitHeight: Kirigami.Units.gridUnit * 20 + 2 * padding
|
implicitHeight: Kirigami.Units.gridUnit * 20 + 2 * padding
|
||||||
width: Math.min(contentItem.categoryIconSize * 11 + 2 * padding, QQC2.ApplicationWindow.window.width)
|
width: Math.min(contentItem.categoryIconSize * 11 + 2 * padding, applicationWindow().width)
|
||||||
contentItem: EmojiPicker {
|
contentItem: EmojiPicker {
|
||||||
id: emojiPicker
|
id: emojiPicker
|
||||||
height: 400
|
height: 400
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ ColumnLayout {
|
|||||||
id: quickReactions
|
id: quickReactions
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
|
|
||||||
model: ["👍", "👎", "😄", "🎉", "😕", "❤", "🚀", "👀"]
|
model: ["👍", "👎", "😄", "🎉", "😕", "❤️", "🚀", "👀"]
|
||||||
|
|
||||||
delegate: EmojiDelegate {
|
delegate: EmojiDelegate {
|
||||||
emoji: modelData
|
emoji: modelData
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ Kirigami.Page {
|
|||||||
}
|
}
|
||||||
Connections {
|
Connections {
|
||||||
target: selectionTool.selectionArea
|
target: selectionTool.selectionArea
|
||||||
function onDoubleClicked(): void {
|
function onDoubleClicked() {
|
||||||
rootEditorView.crop();
|
rootEditorView.crop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,13 +20,6 @@ FormCard.FormCard {
|
|||||||
|
|
||||||
onToggled: NeoChatConfig.showAllEvents = checked
|
onToggled: NeoChatConfig.showAllEvents = checked
|
||||||
}
|
}
|
||||||
FormCard.FormCheckDelegate {
|
|
||||||
text: i18nc("@option:check", "Allow sending relations to any event in the timeline")
|
|
||||||
description: i18nc("@info", "This includes state events")
|
|
||||||
checked: NeoChatConfig.relateAnyEvent
|
|
||||||
|
|
||||||
onToggled: NeoChatConfig.relateAnyEvent = checked
|
|
||||||
}
|
|
||||||
FormCard.FormCheckDelegate {
|
FormCard.FormCheckDelegate {
|
||||||
id: roomAccountDataVisibleCheck
|
id: roomAccountDataVisibleCheck
|
||||||
text: i18nc("@option:check Enable the matrix 'threads' feature", "Always allow device verification")
|
text: i18nc("@option:check Enable the matrix 'threads' feature", "Always allow device verification")
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import QtQuick.Window
|
|||||||
|
|
||||||
import org.kde.kirigami as Kirigami
|
import org.kde.kirigami as Kirigami
|
||||||
import org.kde.kirigamiaddons.formcard as FormCard
|
import org.kde.kirigamiaddons.formcard as FormCard
|
||||||
|
import org.kde.kitemmodels
|
||||||
|
|
||||||
import org.kde.neochat
|
import org.kde.neochat
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import QtQuick.Layouts
|
|||||||
|
|
||||||
import org.kde.kirigami as Kirigami
|
import org.kde.kirigami as Kirigami
|
||||||
import org.kde.kirigamiaddons.formcard as FormCard
|
import org.kde.kirigamiaddons.formcard as FormCard
|
||||||
|
import org.kde.kitemmodels
|
||||||
|
|
||||||
import org.kde.neochat
|
import org.kde.neochat
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import QtQuick.Window
|
|||||||
|
|
||||||
import org.kde.kirigami as Kirigami
|
import org.kde.kirigami as Kirigami
|
||||||
import org.kde.kirigamiaddons.formcard as FormCard
|
import org.kde.kirigamiaddons.formcard as FormCard
|
||||||
|
import org.kde.kitemmodels
|
||||||
|
|
||||||
import org.kde.neochat
|
import org.kde.neochat
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ target_sources(LibNeoChat PRIVATE
|
|||||||
texthandler.cpp
|
texthandler.cpp
|
||||||
urlhelper.cpp
|
urlhelper.cpp
|
||||||
utils.cpp
|
utils.cpp
|
||||||
enums/chatbartype.h
|
|
||||||
enums/messagecomponenttype.h
|
enums/messagecomponenttype.h
|
||||||
enums/messagetype.h
|
enums/messagetype.h
|
||||||
enums/powerlevel.cpp
|
enums/powerlevel.cpp
|
||||||
|
|||||||
@@ -15,18 +15,6 @@ using namespace Qt::StringLiterals;
|
|||||||
ChatBarCache::ChatBarCache(QObject *parent)
|
ChatBarCache::ChatBarCache(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
{
|
{
|
||||||
if (parent == nullptr) {
|
|
||||||
qWarning() << "ChatBarCache created with no parent, a NeoChatRoom must be set as the parent on creation.";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto room = dynamic_cast<NeoChatRoom *>(parent);
|
|
||||||
if (room == nullptr) {
|
|
||||||
qWarning() << "ChatBarCache created with incorrect parent, a NeoChatRoom must be set as the parent on creation.";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
connect(room, &NeoChatRoom::memberLeft, this, &ChatBarCache::relationAuthorIsPresentChanged);
|
|
||||||
connect(room, &NeoChatRoom::memberJoined, this, &ChatBarCache::relationAuthorIsPresentChanged);
|
|
||||||
connect(this, &ChatBarCache::relationIdChanged, this, &ChatBarCache::relationAuthorIsPresentChanged);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString ChatBarCache::text() const
|
QString ChatBarCache::text() const
|
||||||
@@ -149,11 +137,6 @@ Quotient::RoomMember ChatBarCache::relationAuthor() const
|
|||||||
return room->member((*room->findInTimeline(m_relationId))->senderId());
|
return room->member((*room->findInTimeline(m_relationId))->senderId());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ChatBarCache::relationAuthorIsPresent() const
|
|
||||||
{
|
|
||||||
return relationAuthor().membershipState() == Quotient::Membership::Join;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString ChatBarCache::relationMessage() const
|
QString ChatBarCache::relationMessage() const
|
||||||
{
|
{
|
||||||
if (parent() == nullptr) {
|
if (parent() == nullptr) {
|
||||||
|
|||||||
@@ -99,13 +99,6 @@ class ChatBarCache : public QObject
|
|||||||
*/
|
*/
|
||||||
Q_PROPERTY(Quotient::RoomMember relationAuthor READ relationAuthor NOTIFY relationIdChanged)
|
Q_PROPERTY(Quotient::RoomMember relationAuthor READ relationAuthor NOTIFY relationIdChanged)
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief If the author for the message being replied to is still present in the room.
|
|
||||||
*
|
|
||||||
* @sa Quotient::RoomMember
|
|
||||||
*/
|
|
||||||
Q_PROPERTY(bool relationAuthorIsPresent READ relationAuthorIsPresent NOTIFY relationAuthorIsPresentChanged)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The content of the related message.
|
* @brief The content of the related message.
|
||||||
*
|
*
|
||||||
@@ -160,7 +153,6 @@ public:
|
|||||||
void setEditId(const QString &editId);
|
void setEditId(const QString &editId);
|
||||||
|
|
||||||
Quotient::RoomMember relationAuthor() const;
|
Quotient::RoomMember relationAuthor() const;
|
||||||
bool relationAuthorIsPresent() const;
|
|
||||||
|
|
||||||
QString relationMessage() const;
|
QString relationMessage() const;
|
||||||
|
|
||||||
@@ -204,7 +196,6 @@ Q_SIGNALS:
|
|||||||
void threadIdChanged(const QString &oldThreadId, const QString &newThreadId);
|
void threadIdChanged(const QString &oldThreadId, const QString &newThreadId);
|
||||||
void attachmentPathChanged();
|
void attachmentPathChanged();
|
||||||
void mentionAdded(const QString &mention);
|
void mentionAdded(const QString &mention);
|
||||||
void relationAuthorIsPresentChanged();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_text = QString();
|
QString m_text = QString();
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
#include <Sonnet/BackgroundChecker>
|
#include <Sonnet/BackgroundChecker>
|
||||||
#include <Sonnet/Settings>
|
#include <Sonnet/Settings>
|
||||||
|
|
||||||
#include "chatbartype.h"
|
|
||||||
#include "chatdocumenthandler_logging.h"
|
#include "chatdocumenthandler_logging.h"
|
||||||
#include "eventhandler.h"
|
#include "eventhandler.h"
|
||||||
|
|
||||||
@@ -68,11 +67,7 @@ public:
|
|||||||
if (!room) {
|
if (!room) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto chatchache = handler->chatBarCache();
|
auto mentions = handler->chatBarCache()->mentions();
|
||||||
if (!chatchache) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto mentions = chatchache->mentions();
|
|
||||||
mentions->erase(std::remove_if(mentions->begin(),
|
mentions->erase(std::remove_if(mentions->begin(),
|
||||||
mentions->end(),
|
mentions->end(),
|
||||||
[this](auto &mention) {
|
[this](auto &mention) {
|
||||||
@@ -110,6 +105,18 @@ ChatDocumentHandler::ChatDocumentHandler(QObject *parent)
|
|||||||
, m_highlighter(new SyntaxHighlighter(this))
|
, m_highlighter(new SyntaxHighlighter(this))
|
||||||
, m_completionModel(new CompletionModel(this))
|
, m_completionModel(new CompletionModel(this))
|
||||||
{
|
{
|
||||||
|
connect(this, &ChatDocumentHandler::roomChanged, this, [this]() {
|
||||||
|
m_completionModel->setRoom(m_room);
|
||||||
|
static QPointer<NeoChatRoom> previousRoom = nullptr;
|
||||||
|
if (previousRoom) {
|
||||||
|
disconnect(m_chatBarCache, &ChatBarCache::textChanged, this, nullptr);
|
||||||
|
}
|
||||||
|
previousRoom = m_room;
|
||||||
|
connect(m_chatBarCache, &ChatBarCache::textChanged, this, [this]() {
|
||||||
|
int start = completionStartIndex();
|
||||||
|
m_completionModel->setText(getText().mid(start, cursorPosition() - start), getText().mid(start));
|
||||||
|
});
|
||||||
|
});
|
||||||
connect(this, &ChatDocumentHandler::documentChanged, this, [this]() {
|
connect(this, &ChatDocumentHandler::documentChanged, this, [this]() {
|
||||||
if (!m_document) {
|
if (!m_document) {
|
||||||
m_highlighter->setDocument(nullptr);
|
m_highlighter->setDocument(nullptr);
|
||||||
@@ -146,20 +153,6 @@ int ChatDocumentHandler::completionStartIndex() const
|
|||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatBarType::Type ChatDocumentHandler::type() const
|
|
||||||
{
|
|
||||||
return m_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChatDocumentHandler::setType(ChatBarType::Type type)
|
|
||||||
{
|
|
||||||
if (type == m_type) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_type = type;
|
|
||||||
Q_EMIT typeChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
QQuickTextDocument *ChatDocumentHandler::document() const
|
QQuickTextDocument *ChatDocumentHandler::document() const
|
||||||
{
|
{
|
||||||
return m_document;
|
return m_document;
|
||||||
@@ -205,36 +198,22 @@ void ChatDocumentHandler::setRoom(NeoChatRoom *room)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_room && m_type != ChatBarType::None) {
|
|
||||||
m_room->cacheForType(m_type)->disconnect(this);
|
|
||||||
if (!m_room->isSpace() && m_document && m_type == ChatBarType::Room) {
|
|
||||||
m_room->mainCache()->setSavedText(document()->textDocument()->toPlainText());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_room = room;
|
m_room = room;
|
||||||
|
|
||||||
m_completionModel->setRoom(m_room);
|
|
||||||
if (m_room && m_type != ChatBarType::None) {
|
|
||||||
connect(m_room->cacheForType(m_type), &ChatBarCache::textChanged, this, [this]() {
|
|
||||||
int start = completionStartIndex();
|
|
||||||
m_completionModel->setText(getText().mid(start, cursorPosition() - start), getText().mid(start));
|
|
||||||
});
|
|
||||||
if (!m_room->isSpace() && m_document && m_type == ChatBarType::Room) {
|
|
||||||
document()->textDocument()->setPlainText(room->mainCache()->savedText());
|
|
||||||
m_room->mainCache()->setText(room->mainCache()->savedText());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_EMIT roomChanged();
|
Q_EMIT roomChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatBarCache *ChatDocumentHandler::chatBarCache() const
|
ChatBarCache *ChatDocumentHandler::chatBarCache() const
|
||||||
{
|
{
|
||||||
if (!m_room || m_type == ChatBarType::None) {
|
return m_chatBarCache;
|
||||||
return nullptr;
|
}
|
||||||
|
|
||||||
|
void ChatDocumentHandler::setChatBarCache(ChatBarCache *chatBarCache)
|
||||||
|
{
|
||||||
|
if (m_chatBarCache == chatBarCache) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return m_room->cacheForType(m_type);
|
m_chatBarCache = chatBarCache;
|
||||||
|
Q_EMIT chatBarCacheChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatDocumentHandler::complete(int index)
|
void ChatDocumentHandler::complete(int index)
|
||||||
@@ -334,20 +313,20 @@ void ChatDocumentHandler::setSelectionEnd(int position)
|
|||||||
|
|
||||||
QString ChatDocumentHandler::getText() const
|
QString ChatDocumentHandler::getText() const
|
||||||
{
|
{
|
||||||
if (!m_room || m_type == ChatBarType::None) {
|
if (!m_chatBarCache) {
|
||||||
qCWarning(ChatDocumentHandling) << "getText called with no ChatBarCache available. ChatBarType: " << m_type << " Room: " << m_room;
|
qCWarning(ChatDocumentHandling) << "getText called with m_chatBarCache set to nullptr.";
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
return m_room->cacheForType(m_type)->text();
|
return m_chatBarCache->text();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatDocumentHandler::pushMention(const Mention mention) const
|
void ChatDocumentHandler::pushMention(const Mention mention) const
|
||||||
{
|
{
|
||||||
if (!m_room || m_type == ChatBarType::None) {
|
if (!m_chatBarCache) {
|
||||||
qCWarning(ChatDocumentHandling) << "pushMention called with no ChatBarCache available. ChatBarType: " << m_type << " Room: " << m_room;
|
qCWarning(ChatDocumentHandling) << "pushMention called with m_chatBarCache set to nullptr.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_room->cacheForType(m_type)->mentions()->push_back(mention);
|
m_chatBarCache->mentions()->push_back(mention);
|
||||||
}
|
}
|
||||||
|
|
||||||
QColor ChatDocumentHandler::mentionColor() const
|
QColor ChatDocumentHandler::mentionColor() const
|
||||||
@@ -386,7 +365,7 @@ void ChatDocumentHandler::updateMentions(QQuickTextDocument *document, const QSt
|
|||||||
{
|
{
|
||||||
setDocument(document);
|
setDocument(document);
|
||||||
|
|
||||||
if (editId.isEmpty() || m_type == ChatBarType::None || !m_room) {
|
if (editId.isEmpty() || !m_chatBarCache || !m_room) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,7 +374,7 @@ void ChatDocumentHandler::updateMentions(QQuickTextDocument *document, const QSt
|
|||||||
// Replaces the mentions that are baked into the HTML but plaintext in the original markdown
|
// Replaces the mentions that are baked into the HTML but plaintext in the original markdown
|
||||||
const QRegularExpression re(uR"lit(<a\shref="https:\/\/matrix.to\/#\/([\S]*)"\s?>([\S]*)<\/a>)lit"_s);
|
const QRegularExpression re(uR"lit(<a\shref="https:\/\/matrix.to\/#\/([\S]*)"\s?>([\S]*)<\/a>)lit"_s);
|
||||||
|
|
||||||
m_room->cacheForType(m_type)->mentions()->clear();
|
m_chatBarCache->mentions()->clear();
|
||||||
|
|
||||||
int linkSize = 0;
|
int linkSize = 0;
|
||||||
auto matches = re.globalMatch(EventHandler::rawMessageBody(*roomMessageEvent));
|
auto matches = re.globalMatch(EventHandler::rawMessageBody(*roomMessageEvent));
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user