Compare commits
222 Commits
work/carl/
...
v24.04.80
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eeddf99ca5 | ||
|
|
09a35b1a7e | ||
|
|
533182ec55 | ||
|
|
70a8842f00 | ||
|
|
ab33d1ca88 | ||
|
|
9e45f22e09 | ||
|
|
6a627dfff0 | ||
|
|
a9f05a7f63 | ||
|
|
4dfd4b68eb | ||
|
|
3786710d81 | ||
|
|
3967b27352 | ||
|
|
714ea8413c | ||
|
|
4097addae9 | ||
|
|
e9ac9deb40 | ||
|
|
3b858ab7d5 | ||
|
|
08807797a5 | ||
|
|
923839d6c7 | ||
|
|
3d4a1d22b0 | ||
|
|
5aa7f499c0 | ||
|
|
40c3519737 | ||
|
|
6ec9cc2475 | ||
|
|
eba34b19ad | ||
|
|
8517636485 | ||
|
|
4a96dae57d | ||
|
|
09f433be45 | ||
|
|
b9901a9167 | ||
|
|
8b27d99d82 | ||
|
|
6b53c4d7b1 | ||
|
|
bd28a7f66d | ||
|
|
0d1c09696d | ||
|
|
aeb4013d26 | ||
|
|
08a7e324aa | ||
|
|
9202a4525f | ||
|
|
bfc756fb35 | ||
|
|
2a735ff1cc | ||
|
|
551092a1b4 | ||
|
|
ddd12688aa | ||
|
|
71767c4172 | ||
|
|
ee405fbff6 | ||
|
|
c87c6fbabb | ||
|
|
096b36b89b | ||
|
|
c3db90d2e3 | ||
|
|
b7df10aa45 | ||
|
|
fea5e02e7d | ||
|
|
cb94261727 | ||
|
|
efac7e4860 | ||
|
|
0f6fd3adee | ||
|
|
e5e0405401 | ||
|
|
bb35e9ce15 | ||
|
|
5881db4e55 | ||
|
|
89f7167b08 | ||
|
|
3b39fcff84 | ||
|
|
0daf45a465 | ||
|
|
c0d7b96e79 | ||
|
|
a247e40865 | ||
|
|
c3e7a99bca | ||
|
|
9080d8be6a | ||
|
|
b7ee83f6b6 | ||
|
|
1e24bde9a9 | ||
|
|
ba82df1152 | ||
|
|
8980fe7838 | ||
|
|
ef34ed7c20 | ||
|
|
17d60b79ca | ||
|
|
ab0a32c339 | ||
|
|
697778df8d | ||
|
|
55caf84b94 | ||
|
|
335c012f1b | ||
|
|
3c4c538de8 | ||
|
|
c344a3ee55 | ||
|
|
d2695947ed | ||
|
|
21beeef920 | ||
|
|
a4630a53fa | ||
|
|
f5aef8d0c3 | ||
|
|
e044e66030 | ||
|
|
88bfacd386 | ||
|
|
c61c73088f | ||
|
|
2887263f26 | ||
|
|
72b90bdf5c | ||
|
|
163b02f023 | ||
|
|
1a96899336 | ||
|
|
554c086aba | ||
|
|
1fad9bf7db | ||
|
|
22d922e451 | ||
|
|
70bff21632 | ||
|
|
f58c390a47 | ||
|
|
089a9abcb4 | ||
|
|
bf1c76d0a6 | ||
|
|
879da627b1 | ||
|
|
9b93eb44d5 | ||
|
|
b30220eca9 | ||
|
|
d270d4e5e1 | ||
|
|
21da6cb0f4 | ||
|
|
6ac75df935 | ||
|
|
f29781349c | ||
|
|
bb776d5c2b | ||
|
|
6cfab9e3ea | ||
|
|
6373186c15 | ||
|
|
e342de3bc1 | ||
|
|
4cd7b69ea5 | ||
|
|
988e8529da | ||
|
|
6a32d1e961 | ||
|
|
0552c798fb | ||
|
|
a53ad41879 | ||
|
|
92351edcd0 | ||
|
|
878eb48cb0 | ||
|
|
053ca6bed8 | ||
|
|
78ae14ab2f | ||
|
|
5fdc2ad765 | ||
|
|
b75dbe8d5c | ||
|
|
eaf4663c84 | ||
|
|
64b8cd5bcc | ||
|
|
482d61ee47 | ||
|
|
276dcce95e | ||
|
|
217f9e2e02 | ||
|
|
f40a0a6f5f | ||
|
|
9bd67acc2f | ||
|
|
e87da0feb0 | ||
|
|
2608d879fa | ||
|
|
6ab61fd41f | ||
|
|
30dd6297ee | ||
|
|
ce02183f82 | ||
|
|
7c74a6cbe1 | ||
|
|
e6a11b2ad8 | ||
|
|
158942d1b5 | ||
|
|
aaa97ec029 | ||
|
|
882ead5715 | ||
|
|
ab4519dedd | ||
|
|
c3fd2428a2 | ||
|
|
fbb4b962fa | ||
|
|
9bf65de649 | ||
|
|
75f069cb7d | ||
|
|
87d50125ab | ||
|
|
dc2cf21cb8 | ||
|
|
bae14ecd35 | ||
|
|
b48c1c3b80 | ||
|
|
0f9eb4beeb | ||
|
|
0ab8624d79 | ||
|
|
e872c934c3 | ||
|
|
c3d5d18aae | ||
|
|
ff5853a850 | ||
|
|
f772906324 | ||
|
|
07eabb2dc1 | ||
|
|
b3c88763a4 | ||
|
|
f7081f8829 | ||
|
|
ceef2167fd | ||
|
|
1dcfd94328 | ||
|
|
a1aa0804e2 | ||
|
|
77176478eb | ||
|
|
bf4ebfa7a8 | ||
|
|
6e7d622b41 | ||
|
|
8398b7d24d | ||
|
|
aef9b7375a | ||
|
|
ba45318b56 | ||
|
|
7d4f8780ad | ||
|
|
b504c990f8 | ||
|
|
e07b876677 | ||
|
|
a0bfd34951 | ||
|
|
b173714bbe | ||
|
|
db4021b601 | ||
|
|
2f46fd1d2c | ||
|
|
1f85f848e2 | ||
|
|
d7e0954e86 | ||
|
|
1671e05d12 | ||
|
|
33c55d1563 | ||
|
|
4984181613 | ||
|
|
af75136269 | ||
|
|
c8eb75a148 | ||
|
|
5109b4fcd1 | ||
|
|
1b7f482d0b | ||
|
|
6f9a273d39 | ||
|
|
51d354a9c8 | ||
|
|
40b2b9554b | ||
|
|
ba1aca84ff | ||
|
|
17688a49d5 | ||
|
|
5ff199cc3e | ||
|
|
81a79105d7 | ||
|
|
e39760ccfb | ||
|
|
1c43da2532 | ||
|
|
2846def00f | ||
|
|
e2eb6ab33c | ||
|
|
35b08d085c | ||
|
|
064b0581a7 | ||
|
|
0cc38aa69a | ||
|
|
8312483659 | ||
|
|
0ceb0b4421 | ||
|
|
cc373365fb | ||
|
|
75d9b6e2a1 | ||
|
|
78fa38ba68 | ||
|
|
0b28712a34 | ||
|
|
48937c8d9a | ||
|
|
8c966a5e1a | ||
|
|
f49dd371b7 | ||
|
|
6947fbc12a | ||
|
|
550dc43dc0 | ||
|
|
23c9a4fea7 | ||
|
|
7d26f3351f | ||
|
|
b546554fef | ||
|
|
cc058a7cd3 | ||
|
|
7654b83339 | ||
|
|
93426546ad | ||
|
|
23bc38ca6c | ||
|
|
5ccce364d3 | ||
|
|
b488b55a71 | ||
|
|
0bace17074 | ||
|
|
ad6c7dbd1f | ||
|
|
2a6e63595e | ||
|
|
4d62ad1938 | ||
|
|
e7c3a24011 | ||
|
|
37468607fe | ||
|
|
5b007129e3 | ||
|
|
93ceb4d49c | ||
|
|
85b806fcba | ||
|
|
20596aabb8 | ||
|
|
825108c59e | ||
|
|
09c31b20e6 | ||
|
|
78271a3738 | ||
|
|
e029aaadfc | ||
|
|
f6efa35ed2 | ||
|
|
728bad00b4 | ||
|
|
97f3013f7a | ||
|
|
269a832ac9 | ||
|
|
3b5b7af531 |
@@ -2,7 +2,7 @@
|
|||||||
"id": "org.kde.neochat",
|
"id": "org.kde.neochat",
|
||||||
"branch": "master",
|
"branch": "master",
|
||||||
"runtime": "org.kde.Platform",
|
"runtime": "org.kde.Platform",
|
||||||
"runtime-version": "6.6-kf6preview",
|
"runtime-version": "6.6",
|
||||||
"sdk": "org.kde.Sdk",
|
"sdk": "org.kde.Sdk",
|
||||||
"command": "neochat",
|
"command": "neochat",
|
||||||
"tags": [
|
"tags": [
|
||||||
@@ -110,7 +110,7 @@
|
|||||||
{
|
{
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/quotient-im/libQuotient.git",
|
"url": "https://github.com/quotient-im/libQuotient.git",
|
||||||
"branch": "dev",
|
"branch": "0.8.x",
|
||||||
"disable-submodules": true
|
"disable-submodules": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -12,3 +12,4 @@ kate.project.ctags.*
|
|||||||
.idea/
|
.idea/
|
||||||
cmake-build-*
|
cmake-build-*
|
||||||
src/res.generated.qrc
|
src/res.generated.qrc
|
||||||
|
.qmlls.ini
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ Dependencies:
|
|||||||
'frameworks/kio': '@latest-kf6'
|
'frameworks/kio': '@latest-kf6'
|
||||||
'frameworks/kwindowsystem': '@latest-kf6'
|
'frameworks/kwindowsystem': '@latest-kf6'
|
||||||
'frameworks/kstatusnotifieritem': '@latest-kf6'
|
'frameworks/kstatusnotifieritem': '@latest-kf6'
|
||||||
|
'frameworks/kcrash': '@latest-kf6'
|
||||||
- 'on': ['Linux', 'FreeBSD']
|
- 'on': ['Linux', 'FreeBSD']
|
||||||
'require':
|
'require':
|
||||||
'frameworks/kdbusaddons': '@latest-kf6'
|
'frameworks/kdbusaddons': '@latest-kf6'
|
||||||
|
|||||||
@@ -49,3 +49,7 @@ License: CC0-1.0
|
|||||||
Files: appiumtests/data/*
|
Files: appiumtests/data/*
|
||||||
Copyright: 2023 Tobias Fella <tobias.fella@kde.org>
|
Copyright: 2023 Tobias Fella <tobias.fella@kde.org>
|
||||||
License: CC0-1.0
|
License: CC0-1.0
|
||||||
|
|
||||||
|
Files: src/purpose/purposeplugin.json
|
||||||
|
Copyright: 2023 Tobias Fella <tobias.fella@kde.org>
|
||||||
|
License: BSD-2-Clause
|
||||||
|
|||||||
@@ -9,12 +9,12 @@ 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 "24")
|
set(RELEASE_SERVICE_VERSION_MAJOR "24")
|
||||||
set(RELEASE_SERVICE_VERSION_MINOR "04")
|
set(RELEASE_SERVICE_VERSION_MINOR "04")
|
||||||
set(RELEASE_SERVICE_VERSION_MICRO "70")
|
set(RELEASE_SERVICE_VERSION_MICRO "80")
|
||||||
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 "5.240.0")
|
set(KF_MIN_VERSION "6.0")
|
||||||
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)
|
||||||
@@ -24,7 +24,7 @@ set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
|
|||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
set(KDE_COMPILERSETTINGS_LEVEL 5.105)
|
set(KDE_COMPILERSETTINGS_LEVEL 6.0)
|
||||||
|
|
||||||
include(FeatureSummary)
|
include(FeatureSummary)
|
||||||
include(ECMSetupVersion)
|
include(ECMSetupVersion)
|
||||||
@@ -72,6 +72,10 @@ set_package_properties(KF6Kirigami PROPERTIES
|
|||||||
)
|
)
|
||||||
find_package(KF6KirigamiAddons 0.7.2 REQUIRED)
|
find_package(KF6KirigamiAddons 0.7.2 REQUIRED)
|
||||||
|
|
||||||
|
if (UNIX AND NOT APPLE AND NOT ANDROID AND NOT NEOCHAT_FLATPAK AND NOT NEOCHAT_APPIMAGE)
|
||||||
|
find_package(KF6 ${KF_MIN_VERSION} REQUIRED COMPONENTS Purpose)
|
||||||
|
endif ()
|
||||||
|
|
||||||
if(ANDROID)
|
if(ANDROID)
|
||||||
find_package(OpenSSL)
|
find_package(OpenSSL)
|
||||||
set_package_properties(OpenSSL PROPERTIES
|
set_package_properties(OpenSSL PROPERTIES
|
||||||
@@ -80,7 +84,8 @@ if(ANDROID)
|
|||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
find_package(Qt6 ${QT_MIN_VERSION} COMPONENTS Widgets)
|
find_package(Qt6 ${QT_MIN_VERSION} COMPONENTS Widgets)
|
||||||
find_package(KF6 ${KF_MIN_VERSION} REQUIRED COMPONENTS QQC2DesktopStyle KIO WindowSystem StatusNotifierItem)
|
find_package(KF6 ${KF_MIN_VERSION} REQUIRED COMPONENTS QQC2DesktopStyle KIO WindowSystem StatusNotifierItem Crash)
|
||||||
|
find_package(KF6SyntaxHighlighting ${KF_MIN_VERSION} REQUIRED)
|
||||||
set_package_properties(KF6QQC2DesktopStyle PROPERTIES
|
set_package_properties(KF6QQC2DesktopStyle PROPERTIES
|
||||||
TYPE RUNTIME
|
TYPE RUNTIME
|
||||||
)
|
)
|
||||||
|
|||||||
48
README.md
48
README.md
@@ -1,6 +1,6 @@
|
|||||||
<!--
|
<!--
|
||||||
SPDX-FileCopyrightText: 2020-2021 Carl Schwan <carlschwan@kde.org>
|
SPDX-FileCopyrightText: 2020-2021 Carl Schwan <carlschwan@kde.org>
|
||||||
SPDX-FileCopyrightText: 2020-2021 Tobias Fella <tobias.fella@kde.org>
|
SPDX-FileCopyrightText: 2020-2024 Tobias Fella <tobias.fella@kde.org>
|
||||||
SPDX-FileCopyrightText: 2023 James Graham <james.h.graham@protonmail.com>
|
SPDX-FileCopyrightText: 2023 James Graham <james.h.graham@protonmail.com>
|
||||||
SPDX-License-Identifier: CC0-1.0
|
SPDX-License-Identifier: CC0-1.0
|
||||||
-->
|
-->
|
||||||
@@ -16,19 +16,18 @@ A Qt/QML based Matrix client.
|
|||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
NeoChat is a client for [Matrix](https://matrix.org), the decentralized communication protocol for instant
|
NeoChat is a client for [Matrix](https://matrix.org), the decentralized communication protocol for instant
|
||||||
messaging. It is a fork of Spectral, using KDE frameworks, most notably [Kirigami](https://invent.kde.org/frameworks/kirigami)
|
messaging.
|
||||||
to provide a convergent experience across multiple platforms.
|
|
||||||
|
|
||||||
NeoChat also make use of other KDE Frameworks as well as [libQuotient](https://github.com/quotient-im/libQuotient), a
|
NeoChat is based on KDE frameworks and as [libQuotient](https://github.com/quotient-im/libQuotient), a
|
||||||
Qt-based SDK for the [Matrix Protocol](https://spec.matrix.org/).
|
Qt-based SDK for the [Matrix Protocol](https://spec.matrix.org/).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
NeoChat aims to be a fully featured application for the Matrix specification. As such everything in the current stable specification with the notable exceptions
|
NeoChat aims to be a fully featured application for the Matrix specification. As such most parts of the current specification are supported, 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
|
of VoIP, threads, and some aspects of End-to-End Encryption. 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.
|
evolving, but the aim remains to provide eventual support for the entire spec.
|
||||||
|
|
||||||
Due to the nature of the Matrix specification development NeoChat also supports numerous unstable features. Currently these are:
|
Due to the nature of the Matrix specification development NeoChat also supports numerous unstable features. Currently these are:
|
||||||
- Polls - MSC3381
|
- Polls - MSC3381
|
||||||
@@ -39,26 +38,9 @@ Due to the nature of the Matrix specification development NeoChat also supports
|
|||||||
|
|
||||||
Details where to find stable releases for NeoChat can be found on its [homepage](https://apps.kde.org/neochat).
|
Details where to find stable releases for NeoChat can be found on its [homepage](https://apps.kde.org/neochat).
|
||||||
|
|
||||||
In addition to the stable builds, unstable nightly builds are available for all platforms. These can be downloaded
|
Nightly builds for linux and windows can be downloaded from [cdn.kde.org](https://cdn.kde.org/ci-builds/network/neochat/).
|
||||||
from the [binary factory](https://binary-factory.kde.org/). There are unstable versions for the following platforms
|
Nightly builds for android are available from [KDE's nightly F-Droid repository](https://community.kde.org/Android/F-Droid).
|
||||||
in addition to stable ones:
|
Nightly Flatpaks are available from [KDE's nightly Flatpak repository](https://userbase.kde.org/Tutorials/Flatpak).
|
||||||
- Android
|
|
||||||
- MacOS
|
|
||||||
- Windows
|
|
||||||
|
|
||||||
Additionally the nightly Flatpak version can be obtained from the nightly Flatpak repo using the following commands in your terminal:
|
|
||||||
|
|
||||||
```
|
|
||||||
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
|
||||||
flatpak remote-add --if-not-exists kdeapps --from https://distribute.kde.org/kdeapps.flatpakrepo
|
|
||||||
flatpak install kdeapps org.kde.neochat
|
|
||||||
```
|
|
||||||
|
|
||||||
The unstable Android version can also be obtained from the [KDE nightly F-Droid repo](https://community.kde.org/Android/FDroid).
|
|
||||||
|
|
||||||
## Running
|
|
||||||
|
|
||||||
Just start the executable in your preferred way - either from the build directory or from the installed location.
|
|
||||||
|
|
||||||
## Building NeoChat
|
## Building NeoChat
|
||||||
|
|
||||||
@@ -69,14 +51,18 @@ is primarily aimed at Linux development.
|
|||||||
For Windows and Android [Craft](https://invent.kde.org/packaging/craft) is the primary choice. There are guides for setting up
|
For Windows and Android [Craft](https://invent.kde.org/packaging/craft) is the primary choice. There are guides for setting up
|
||||||
development environments for [Windows](https://community.kde.org/Get_Involved/development/Windows) and [Android](https://develop.kde.org/docs/packaging/android/building_applications/).
|
development environments for [Windows](https://community.kde.org/Get_Involved/development/Windows) and [Android](https://develop.kde.org/docs/packaging/android/building_applications/).
|
||||||
|
|
||||||
|
## Running
|
||||||
|
|
||||||
|
Just start the executable in your preferred way - either from the build directory or from the installed location.
|
||||||
|
|
||||||
## Tests
|
## Tests
|
||||||
|
|
||||||
Tests are in the repository under [autotests](autotests) and should all pass for any contribution.
|
Tests are in the repository under [autotests](autotests) and [appiumtests](appiumtests).
|
||||||
|
|
||||||
The project has CI setup to test new commits to the repository. All tests are expected to pass for a merge request to
|
The project has CI setup to test new commits to the repository. All tests are expected to pass for a merge request to
|
||||||
be complete.
|
be complete.
|
||||||
|
|
||||||
Current build status
|
## Current build status
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -100,9 +86,9 @@ The best place to reach the maintainers is on the KDE Matrix instance in the Neo
|
|||||||
|
|
||||||
## Acknowledgement
|
## Acknowledgement
|
||||||
|
|
||||||
This program utilizes [libQuotient](https://github.com/quotient-im/libQuotient/) as its Matrix SDK.
|
NeoChat utilizes [libQuotient](https://github.com/quotient-im/libQuotient/) as its Matrix SDK.
|
||||||
|
|
||||||
This program is a fork of [Spectral](https://gitlab.com/spectral-im/spectral/).
|
NeoChat is a fork of [Spectral](https://gitlab.com/spectral-im/spectral/).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,10 @@ class OpenUserDetailsTest(unittest.TestCase):
|
|||||||
|
|
||||||
def test_open_sheet(self):
|
def test_open_sheet(self):
|
||||||
self.driver.find_element(by=AppiumBy.NAME, value="@user:localhost:1234").click()
|
self.driver.find_element(by=AppiumBy.NAME, value="@user:localhost:1234").click()
|
||||||
|
try:
|
||||||
|
self.driver.find_element(by=AppiumBy.NAME, value="Expand Normal").click()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
self.driver.find_element(by=AppiumBy.NAME, value="Empty room (!room_id_1234:localhost:1234)").click()
|
self.driver.find_element(by=AppiumBy.NAME, value="Empty room (!room_id_1234:localhost:1234)").click()
|
||||||
self.driver.find_element(by=AppiumBy.NAME, value="A Display Name").click()
|
self.driver.find_element(by=AppiumBy.NAME, value="A Display Name").click()
|
||||||
self.driver.find_element(by=AppiumBy.NAME, value="Account Details")
|
self.driver.find_element(by=AppiumBy.NAME, value="Account Details")
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ void DelegateSizeHelperTest::equalBreakpoint_data()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* We expect a default return except in the case where the the two percentages are
|
* We expect a default return except in the case where the two percentages are
|
||||||
* equal as that case can be calculated without dividing by zero.
|
* equal as that case can be calculated without dividing by zero.
|
||||||
*/
|
*/
|
||||||
void DelegateSizeHelperTest::equalBreakpoint()
|
void DelegateSizeHelperTest::equalBreakpoint()
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ private Q_SLOTS:
|
|||||||
void genericBody_data();
|
void genericBody_data();
|
||||||
void genericBody();
|
void genericBody();
|
||||||
void nullGenericBody();
|
void nullGenericBody();
|
||||||
|
void markdownBody();
|
||||||
void subtitle();
|
void subtitle();
|
||||||
void nullSubtitle();
|
void nullSubtitle();
|
||||||
void mediaInfo();
|
void mediaInfo();
|
||||||
@@ -293,6 +294,13 @@ void EventHandlerTest::nullGenericBody()
|
|||||||
QCOMPARE(noEventHandler.getGenericBody(), QString());
|
QCOMPARE(noEventHandler.getGenericBody(), QString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EventHandlerTest::markdownBody()
|
||||||
|
{
|
||||||
|
EventHandler eventHandler(room, room->messageEvents().at(0).get());
|
||||||
|
|
||||||
|
QCOMPARE(eventHandler.getMarkdownBody(), QStringLiteral("This is an example\ntext message"));
|
||||||
|
}
|
||||||
|
|
||||||
void EventHandlerTest::subtitle()
|
void EventHandlerTest::subtitle()
|
||||||
{
|
{
|
||||||
EventHandler eventHandler(room, room->messageEvents().at(0).get());
|
EventHandler eventHandler(room, room->messageEvents().at(0).get());
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ private Q_SLOTS:
|
|||||||
|
|
||||||
void linkPreviewsReject_data();
|
void linkPreviewsReject_data();
|
||||||
void linkPreviewsReject();
|
void linkPreviewsReject();
|
||||||
|
|
||||||
void editedLink();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void LinkPreviewerTest::initTestCase()
|
void LinkPreviewerTest::initTestCase()
|
||||||
@@ -59,7 +57,7 @@ void LinkPreviewerTest::linkPreviewsMatch()
|
|||||||
QFETCH(QUrl, testOutputLink);
|
QFETCH(QUrl, testOutputLink);
|
||||||
|
|
||||||
auto event = TestUtils::loadEventFromFile<RoomMessageEvent>(eventSource);
|
auto event = TestUtils::loadEventFromFile<RoomMessageEvent>(eventSource);
|
||||||
auto linkPreviewer = LinkPreviewer(room, event.get());
|
auto linkPreviewer = LinkPreviewer(LinkPreviewer::linkPreview(event.get()), connection);
|
||||||
|
|
||||||
QCOMPARE(linkPreviewer.empty(), false);
|
QCOMPARE(linkPreviewer.empty(), false);
|
||||||
QCOMPARE(linkPreviewer.url(), testOutputLink);
|
QCOMPARE(linkPreviewer.url(), testOutputLink);
|
||||||
@@ -79,22 +77,7 @@ void LinkPreviewerTest::linkPreviewsReject()
|
|||||||
QFETCH(QString, eventSource);
|
QFETCH(QString, eventSource);
|
||||||
|
|
||||||
auto event = TestUtils::loadEventFromFile<RoomMessageEvent>(eventSource);
|
auto event = TestUtils::loadEventFromFile<RoomMessageEvent>(eventSource);
|
||||||
auto linkPreviewer = LinkPreviewer(room, event.get());
|
auto linkPreviewer = LinkPreviewer(LinkPreviewer::linkPreview(event.get()), connection);
|
||||||
|
|
||||||
QCOMPARE(linkPreviewer.empty(), true);
|
|
||||||
QCOMPARE(linkPreviewer.url(), QUrl());
|
|
||||||
}
|
|
||||||
|
|
||||||
void LinkPreviewerTest::editedLink()
|
|
||||||
{
|
|
||||||
room->syncNewEvents(QStringLiteral("test-linkpreviewerintial-sync.json"));
|
|
||||||
auto event = eventCast<const RoomMessageEvent>(room->messageEvents().at(0).get());
|
|
||||||
auto linkPreviewer = LinkPreviewer(room, event);
|
|
||||||
|
|
||||||
QCOMPARE(linkPreviewer.empty(), false);
|
|
||||||
QCOMPARE(linkPreviewer.url(), QUrl("https://kde.org"_ls));
|
|
||||||
|
|
||||||
room->syncNewEvents(QStringLiteral("test-linkpreviewerreplace-sync.json"));
|
|
||||||
|
|
||||||
QCOMPARE(linkPreviewer.empty(), true);
|
QCOMPARE(linkPreviewer.empty(), true);
|
||||||
QCOMPARE(linkPreviewer.url(), QUrl());
|
QCOMPARE(linkPreviewer.url(), QUrl());
|
||||||
|
|||||||
@@ -513,7 +513,7 @@ void TextHandlerTest::componentOutput_data()
|
|||||||
<< QList<MessageComponent>{MessageComponent{MessageComponentType::Text, QStringLiteral("Text"), {}},
|
<< QList<MessageComponent>{MessageComponent{MessageComponentType::Text, QStringLiteral("Text"), {}},
|
||||||
MessageComponent{MessageComponentType::Code,
|
MessageComponent{MessageComponentType::Code,
|
||||||
QStringLiteral("Some code"),
|
QStringLiteral("Some code"),
|
||||||
QVariantMap{{QStringLiteral("class"), QStringLiteral("HTML")}}}};
|
QVariantMap{{QStringLiteral("class"), QStringLiteral("html")}}}};
|
||||||
QTest::newRow("quote") << QStringLiteral("<p>Text</p>\n<blockquote>\n<p>blockquote</p>\n</blockquote>")
|
QTest::newRow("quote") << QStringLiteral("<p>Text</p>\n<blockquote>\n<p>blockquote</p>\n</blockquote>")
|
||||||
<< QList<MessageComponent>{MessageComponent{MessageComponentType::Text, QStringLiteral("Text"), {}},
|
<< QList<MessageComponent>{MessageComponent{MessageComponentType::Text, QStringLiteral("Text"), {}},
|
||||||
MessageComponent{MessageComponentType::Quote, QStringLiteral("\"blockquote\""), {}}};
|
MessageComponent{MessageComponentType::Quote, QStringLiteral("\"blockquote\""), {}}};
|
||||||
@@ -529,6 +529,19 @@ void TextHandlerTest::componentOutput_data()
|
|||||||
QTest::newRow("inline code single block") << QStringLiteral("<code>https://kde.org</code>")
|
QTest::newRow("inline code single block") << QStringLiteral("<code>https://kde.org</code>")
|
||||||
<< QList<MessageComponent>{
|
<< QList<MessageComponent>{
|
||||||
MessageComponent{MessageComponentType::Text, QStringLiteral("<code>https://kde.org</code>"), {}}};
|
MessageComponent{MessageComponentType::Text, QStringLiteral("<code>https://kde.org</code>"), {}}};
|
||||||
|
QTest::newRow("long start tag")
|
||||||
|
<< QStringLiteral(
|
||||||
|
"Ah, you mean something like<br/><pre data-md=\"```\"><code class=\"language-qml\"># main.qml\nimport CustomQml\n...\nControls.TextField { id: "
|
||||||
|
"someField }\nCustomQml {\n someTextProperty: someField.text\n}\n</code></pre>Sure you can, it's still local to the same file where you "
|
||||||
|
"defined the id")
|
||||||
|
<< QList<MessageComponent>{
|
||||||
|
MessageComponent{MessageComponentType::Text, QStringLiteral("Ah, you mean something like"), {}},
|
||||||
|
MessageComponent{
|
||||||
|
MessageComponentType::Code,
|
||||||
|
QStringLiteral(
|
||||||
|
"# main.qml\nimport CustomQml\n...\nControls.TextField { id: someField }\nCustomQml {\n someTextProperty: someField.text\n}"),
|
||||||
|
QVariantMap{{QStringLiteral("class"), QStringLiteral("qml")}}},
|
||||||
|
MessageComponent{MessageComponentType::Text, QStringLiteral("Sure you can, it's still local to the same file where you defined the id"), {}}};
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextHandlerTest::componentOutput()
|
void TextHandlerTest::componentOutput()
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
<name xml:lang="it">NeoChat</name>
|
<name xml:lang="it">NeoChat</name>
|
||||||
<name xml:lang="ka">NeoChat</name>
|
<name xml:lang="ka">NeoChat</name>
|
||||||
<name xml:lang="ko">NeoChat</name>
|
<name xml:lang="ko">NeoChat</name>
|
||||||
|
<name xml:lang="lv">NeoChat</name>
|
||||||
<name xml:lang="nl">NeoChat</name>
|
<name xml:lang="nl">NeoChat</name>
|
||||||
<name xml:lang="nn">NeoChat</name>
|
<name xml:lang="nn">NeoChat</name>
|
||||||
<name xml:lang="pa">ਨਿਓ-ਚੈਟ</name>
|
<name xml:lang="pa">ਨਿਓ-ਚੈਟ</name>
|
||||||
@@ -59,10 +60,12 @@
|
|||||||
<summary xml:lang="fi">Keskustelu ystäviesi kanssa Matrixissa</summary>
|
<summary xml:lang="fi">Keskustelu ystäviesi kanssa Matrixissa</summary>
|
||||||
<summary xml:lang="fr">Discuter avec vos ami(e)s sur le réseau Matrix</summary>
|
<summary xml:lang="fr">Discuter avec vos ami(e)s sur le réseau Matrix</summary>
|
||||||
<summary xml:lang="gl">Charle coas súas amizades en Matrix.</summary>
|
<summary xml:lang="gl">Charle coas súas amizades en Matrix.</summary>
|
||||||
|
<summary xml:lang="hu">Csevegjen barátaival a matrixon</summary>
|
||||||
<summary xml:lang="ia">Starta Conversation con tu amicos sur matrix</summary>
|
<summary xml:lang="ia">Starta Conversation con tu amicos sur matrix</summary>
|
||||||
<summary xml:lang="it">Conversa con i tuoi contatti su matrix</summary>
|
<summary xml:lang="it">Conversa con i tuoi contatti su matrix</summary>
|
||||||
<summary xml:lang="ka">ესაუბრეთ მეგობრებს Matrix-ზე</summary>
|
<summary xml:lang="ka">ესაუბრეთ მეგობრებს Matrix-ზე</summary>
|
||||||
<summary xml:lang="ko">Matrix를 사용하여 친구들과 대화하기</summary>
|
<summary xml:lang="ko">Matrix를 사용하여 친구들과 대화하기</summary>
|
||||||
|
<summary xml:lang="lv">Tērzējiet ar saviem draugiem „Matrix“ tīklā</summary>
|
||||||
<summary xml:lang="nl">Met uw vrienden chatten op matrix</summary>
|
<summary xml:lang="nl">Met uw vrienden chatten op matrix</summary>
|
||||||
<summary xml:lang="nn">Prat med vennar på Matrix</summary>
|
<summary xml:lang="nn">Prat med vennar på Matrix</summary>
|
||||||
<summary xml:lang="pl">Rozmawiaj ze swoimi znajomymi w Matriksie</summary>
|
<summary xml:lang="pl">Rozmawiaj ze swoimi znajomymi w Matriksie</summary>
|
||||||
@@ -78,17 +81,22 @@
|
|||||||
<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>
|
||||||
<p xml:lang="ca">El NeoChat és una aplicació de xat que us permet aprofitar plenament la xarxa Matrix. Proporciona una manera segura d'enviar missatges de text, vídeos i arxius d'àudio a la vostra família, companys i amics.</p>
|
<p xml:lang="ca">El NeoChat és una aplicació de xat que us permet aprofitar plenament la xarxa Matrix. Proporciona una manera segura d'enviar missatges de text, vídeos i arxius d'àudio a la vostra família, companys i amics.</p>
|
||||||
<p xml:lang="ca-valencia">NeoChat és una aplicació de xat que us permet aprofitar plenament la xarxa Matrix. Proporciona una manera segura d'enviar missatges de text, vídeos i arxius d'àudio a la vostra família, companys i amics.</p>
|
<p xml:lang="ca-valencia">NeoChat és una aplicació de xat que us permet aprofitar plenament la xarxa Matrix. Proporciona una manera segura d'enviar missatges de text, vídeos i arxius d'àudio a la vostra família, companys i amics.</p>
|
||||||
|
<p xml:lang="eo">NeoChat estas babilej-apo, kiu ebligas al vi plene profiti de la Matrix-reto. Ĝi provizas al vi sekuran manieron sendi tekstmesaĝojn, filmetojn kaj sondosierojn al via familio, kolegoj kaj amikoj.</p>
|
||||||
<p xml:lang="es">NeoChat es una aplicación de chat que le permite aprovechar al máximo la red Matrix. Le proporciona un modo seguro de enviar mensajes de texto, vídeos y archivos de sonido a su familia, colegas y amigos.</p>
|
<p xml:lang="es">NeoChat es una aplicación de chat que le permite aprovechar al máximo la red Matrix. Le proporciona un modo seguro de enviar mensajes de texto, vídeos y archivos de sonido a su familia, colegas y amigos.</p>
|
||||||
<p xml:lang="eu">NeoChat, Matrix sarearen abantaila guztiei probetsua ateratzeko aukera ematen dizun berriketa aplikaizo bat da. Zure familiari, kideei eta lagunei testu mezuak, bideoak eta audio fitxategiak era seguruan bidaltzeko aukera ematen dizu.</p>
|
<p xml:lang="eu">NeoChat, Matrix sarearen abantaila guztiei probetsua ateratzeko aukera ematen dizun berriketa aplikaizo bat da. Zure familiari, kideei eta lagunei testu mezuak, bideoak eta audio fitxategiak era seguruan bidaltzeko aukera ematen dizu.</p>
|
||||||
|
<p xml:lang="fr">NeoChat est une application de discussions vous permettant de profiter pleinement du réseau Matrix. Elle vous offre un moyen sécurisé d’envoyer des messages de texte, des vidéos et des fichiers audio à votre famille, vos collègues et vos ami(e)s.</p>
|
||||||
|
<p xml:lang="hu">A NeoChat egy olyan csevegőalkalmazás, amellyel teljes mértékben kihasználhatja a Matrix hálózatot. Biztonságos módot biztosít szöveges üzenetek, videók és hangfájlok küldéséhez családtagjainak, kollégáinak és barátainak.</p>
|
||||||
<p xml:lang="ia">NeoChat es un app de conversation que te permitte prender avantage plen del rete Matrix. Il te forni un modo secur de inviar messages de texto, videos e files audio a tui familia, collegas e amicos.</p>
|
<p xml:lang="ia">NeoChat es un app de conversation que te permitte prender avantage plen del rete Matrix. Il te forni un modo secur de inviar messages de texto, videos e files audio a tui familia, collegas e amicos.</p>
|
||||||
<p xml:lang="it">NeoChat è un'applicazione di chat che ti consente di sfruttare appieno la rete Matrix. Ti fornisce un modo sicuro per inviare messaggi di testo, video e file audio a familiari, colleghi e amici.</p>
|
<p xml:lang="it">NeoChat è un'applicazione di chat che ti consente di sfruttare appieno la rete Matrix. Ti fornisce un modo sicuro per inviare messaggi di testo, video e file audio a familiari, colleghi e amici.</p>
|
||||||
<p xml:lang="ka">NeoChat ჩატის აპია, რომელიც საშუალება გაძლევთ, Matrix-ის ქსელის საშუალებები ბოლომდე გამოიყენოთ. ის გაძლევთ უსაფრთხო გზას, გააგზავნოთ ტექსტური შეტყობინებები, ვიდეოებ და აუდიოფაილები თქვენს ოჯახთან, კოლეგებთან და მეგობრებთან.</p>
|
<p xml:lang="ka">NeoChat ჩატის აპია, რომელიც საშუალება გაძლევთ, Matrix-ის ქსელის საშუალებები ბოლომდე გამოიყენოთ. ის გაძლევთ უსაფრთხო გზას, გააგზავნოთ ტექსტური შეტყობინებები, ვიდეოებ და აუდიოფაილები თქვენს ოჯახთან, კოლეგებთან და მეგობრებთან.</p>
|
||||||
|
<p xml:lang="lv">„NeoChat“ ir tērzēšanas programma, kas ļauj pilnvērtīgi izmantot „Matrix“ tīklu. Tā sniedz drošu veidu teksta ziņu, video un audio sūtīšanai ģimenes locekļiem, kolēģiem un draugiem.</p>
|
||||||
<p xml:lang="nl">NeoChat is een chat-toepassing die u het volledige voordeel van het Matrix-netwerk laat genieten. Het levert u op een veilige manier tekstberichten, video's en geluidsbestanden naar uw familie, collega's en vrienden te verzenden.</p>
|
<p xml:lang="nl">NeoChat is een chat-toepassing die u het volledige voordeel van het Matrix-netwerk laat genieten. Het levert u op een veilige manier tekstberichten, video's en geluidsbestanden naar uw familie, collega's en vrienden te verzenden.</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="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="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="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>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>
|
||||||
@@ -100,10 +108,12 @@
|
|||||||
<p xml:lang="fi">NeoChat pyrkii olemaan Matrix-määritelmän täysominaisuuksinen sovellus, joten se tukee kaikkea nykyisessä vakaassa määritelmässä muutamaa huomattavaa poikkeusta lukuun ottamatta (VoIP, säikeet ja jotkin piirteet päästä päähän -salauksessa). Joitakin pienempiäkin puutteita on Matrix-määritelmän jatkuvan kehityksen vuoksi, mutta lopputavoitteena on tarjota määritelmän täysi tuki.</p>
|
<p xml:lang="fi">NeoChat pyrkii olemaan Matrix-määritelmän täysominaisuuksinen sovellus, joten se tukee kaikkea nykyisessä vakaassa määritelmässä muutamaa huomattavaa poikkeusta lukuun ottamatta (VoIP, säikeet ja jotkin piirteet päästä päähän -salauksessa). Joitakin pienempiäkin puutteita on Matrix-määritelmän jatkuvan kehityksen vuoksi, mutta lopputavoitteena on tarjota määritelmän täysi tuki.</p>
|
||||||
<p xml:lang="fr">L'objectif de NeoChat est d'être une application complète pour le protocole Matrix. En tant que tel, tout dans la spécification stable actuelle avec les exceptions notables de VoIP, les processus et certains aspects du chiffrement de bout en bout sont pris en charge. Il y a quelques autres petites omissions en raison du fait que la spécification du protocole Matrix est en constante évolution. Cependant, l'objectif reste de fournir un soutien éventuel pour l'ensemble de la spécification.</p>
|
<p xml:lang="fr">L'objectif de NeoChat est d'être une application complète pour le protocole Matrix. En tant que tel, tout dans la spécification stable actuelle avec les exceptions notables de VoIP, les processus et certains aspects du chiffrement de bout en bout sont pris en charge. Il y a quelques autres petites omissions en raison du fait que la spécification du protocole Matrix est en constante évolution. Cependant, l'objectif reste de fournir un soutien éventuel pour l'ensemble de la spécification.</p>
|
||||||
<p xml:lang="gl">NeoChat pretende ser unha aplicación completa para a especificación de Matrix. Coas excepcións de VoIP, conversas fiadas e algúns aspectos da cifraxe de extremo a extremo, a versión estábel segue as especificacións. Existen algunhas outras pequenas omisións debido ao feito de que Matrix está en continua evolución pero a intención é implementar a especificación completa.</p>
|
<p xml:lang="gl">NeoChat pretende ser unha aplicación completa para a especificación de Matrix. Coas excepcións de VoIP, conversas fiadas e algúns aspectos da cifraxe de extremo a extremo, a versión estábel segue as especificacións. Existen algunhas outras pequenas omisións debido ao feito de que Matrix está en continua evolución pero a intención é implementar a especificación completa.</p>
|
||||||
|
<p xml:lang="hu">A NeoChat célja, hogy a Matrix specifikációnak megfelelő teljes funkcionalitású alkalmazás legyen. Mint ilyen, a jelenlegi stabil specifikáció támogatott a VoIP, a szálak és a végpontok közötti titkosítás egyes elemeinek kivételével. Van még néhány kisebb hiányosság annak köszönhetően, hogy a Matrix specifikáció folyamatosan fejlődik, de végső cél a teljes specifikáció megvalósítása.</p>
|
||||||
<p xml:lang="ia">NeoChat aspira a esser un application plenemente eminente per le specification de Matrix. Tal como omne cosas in le specification currentemente stabile con le exceptiones notabile de VOIP, threads e alcun aspectos del cryptation End-to-End es supportate. Il ha ltere pauc omissiones, debite al facto que le specification de Matrix es in evolution constante ma le aspiration remane a fornir supporto eventual per le integre specification.</p>
|
<p xml:lang="ia">NeoChat aspira a esser un application plenemente eminente per le specification de Matrix. Tal como omne cosas in le specification currentemente stabile con le exceptiones notabile de VOIP, threads e alcun aspectos del cryptation End-to-End es supportate. Il ha ltere pauc omissiones, debite al facto que le specification de Matrix es in evolution constante ma le aspiration remane a fornir supporto eventual per le integre specification.</p>
|
||||||
<p xml:lang="it">NeoChat mira ad essere un'applicazione completa per le specifiche Matrix. Pertanto, sono supportati tutti gli elementi dell'attuale specifica stabile con le notevoli eccezioni di VoIP, conversazioni e alcuni aspetti della cifratura end-to-end. Ci sono alcune altre piccole omissioni dovute al fatto che le specifiche Matrix sono in continua evoluzione, ma l'obiettivo rimane quello di fornire un eventuale supporto per l'intera specifica.</p>
|
<p xml:lang="it">NeoChat mira ad essere un'applicazione completa per le specifiche Matrix. Pertanto, sono supportati tutti gli elementi dell'attuale specifica stabile con le notevoli eccezioni di VoIP, conversazioni e alcuni aspetti della cifratura end-to-end. Ci sono alcune altre piccole omissioni dovute al fatto che le specifiche Matrix sono in continua evoluzione, ma l'obiettivo rimane quello di fornire un eventuale supporto per l'intera specifica.</p>
|
||||||
<p xml:lang="ka">NeoChat მიზნად ისახავს Matrix სპეციფიკაციის სრული განხორციელება ჰქონდეს. როგორც ასეთი, ყველაფერი მიმდინარე სპეციფიკაციიდან, VoIP-ის, ძაფებისა და გამჭოლი დაშიფვრის ზოგიერთი ასპექტის გარდა, მხარდაჭერილია. შეძლება ასევე იყოს მცირე ლაფსუსებიც იმის გამო, რომ Matrix-ის სპეციფიკაცია მუდმივად ვითარდება, მაგრამ ჩვენი მიზანი მისი სრული მხარდაჭერაა.</p>
|
<p xml:lang="ka">NeoChat მიზნად ისახავს Matrix სპეციფიკაციის სრული განხორციელება ჰქონდეს. როგორც ასეთი, ყველაფერი მიმდინარე სპეციფიკაციიდან, VoIP-ის, ძაფებისა და გამჭოლი დაშიფვრის ზოგიერთი ასპექტის გარდა, მხარდაჭერილია. შეძლება ასევე იყოს მცირე ლაფსუსებიც იმის გამო, რომ Matrix-ის სპეციფიკაცია მუდმივად ვითარდება, მაგრამ ჩვენი მიზანი მისი სრული მხარდაჭერაა.</p>
|
||||||
<p xml:lang="ko">NeoChat은 Matrix 표준을 따르는 프로그램을 목표로 합니다. 현재 안정 버전의 표준에서 제공하는 기능의 대부분을 지원하며, VoIP, 스레드, 일부 종단간 암호화와 같은 기능은 아직 지원하지 않습니다. Matrix 표준은 계속하여 진화 중이기 때문에 일부 기능이 빠져 있을 수도 있지만 장기적으로는 전체 표준을 지원하는 것이 목표입니다.</p>
|
<p xml:lang="ko">NeoChat은 Matrix 표준을 따르는 프로그램을 목표로 합니다. 현재 안정 버전의 표준에서 제공하는 기능의 대부분을 지원하며, VoIP, 스레드, 일부 종단간 암호화와 같은 기능은 아직 지원하지 않습니다. Matrix 표준은 계속하여 진화 중이기 때문에 일부 기능이 빠져 있을 수도 있지만 장기적으로는 전체 표준을 지원하는 것이 목표입니다.</p>
|
||||||
|
<p xml:lang="lv">„NeoChat“ mērķis ir piedāvāt plašas iespējas atbilstoši „Matrix“ specifikācijai. Līdz ar to programma atbalsta visu pašreizējā stabilajā specifikācijā, izņemot VoIP, pavedienus un dažos aspektos galšifrēšanu. Pastāv citas atsevišķas sīkas neieviestas daļas, jo „Matrix“ specifikācija nepārtraukti attīstās, tomēr mērķis ir ar laiku nodrošināt atbalstu pilnai specifikācijai.</p>
|
||||||
<p xml:lang="nl">NeoChat richt zich op het volledig bieden van alle mogelijkheden van de Matrix-specificatie. Alles in de huidige stabiele specificatie met merkbare uitzondering van VoIP, gekoppelde discussies en sommige aspecten van eind-tot-eind versleuteling worden ondersteund. Er zijn een paar andere kleinere omissies vanwege het feit dat de Matrix specificatie constant evolueert maar het doel blijft het eventueel bieden van ondersteuning van de gehele specificatie.</p>
|
<p xml:lang="nl">NeoChat richt zich op het volledig bieden van alle mogelijkheden van de Matrix-specificatie. Alles in de huidige stabiele specificatie met merkbare uitzondering van VoIP, gekoppelde discussies en sommige aspecten van eind-tot-eind versleuteling worden ondersteund. Er zijn een paar andere kleinere omissies vanwege het feit dat de Matrix specificatie constant evolueert maar het doel blijft het eventueel bieden van ondersteuning van de gehele specificatie.</p>
|
||||||
<p xml:lang="nn">NeoChat har som mål å støtta all funksjonalitet i Matrix-spesifikasjonen. Førebels er alt i den gjeldande stabile spesifikasjonen støtta, med unntak av VoIP, trådar og nokre delar av ende-til-kryptering. Det finst òg andre småting som ikkje er støtta, sidan Matrix-spesifikasjon er i stadig endring, men målet er altså støtte for alt.</p>
|
<p xml:lang="nn">NeoChat har som mål å støtta all funksjonalitet i Matrix-spesifikasjonen. Førebels er alt i den gjeldande stabile spesifikasjonen støtta, med unntak av VoIP, trådar og nokre delar av ende-til-kryptering. Det finst òg andre småting som ikkje er støtta, sidan Matrix-spesifikasjon er i stadig endring, men målet er altså støtte for alt.</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="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>
|
||||||
@@ -125,10 +135,12 @@
|
|||||||
<p xml:lang="fi">Matrix-määritelmän kehittyessä NeoChat tukee myös monia epävakaita ominaisuuksia. Tällä hetkellä näitä ovat:</p>
|
<p xml:lang="fi">Matrix-määritelmän kehittyessä NeoChat tukee myös monia epävakaita ominaisuuksia. Tällä hetkellä näitä ovat:</p>
|
||||||
<p xml:lang="fr">En raison de la nature du développement des spécifications du protocole Matrix, NeoChat prend également en charge de nombreuses fonctionnalités instables. Actuellement, ce sont :</p>
|
<p xml:lang="fr">En raison de la nature du développement des spécifications du protocole Matrix, NeoChat prend également en charge de nombreuses fonctionnalités instables. Actuellement, ce sont :</p>
|
||||||
<p xml:lang="gl">Debido á natureza do desenvolvemento da especificación de Matrix, NeoChat tamén inclúe varias funcionalidades non estábeis:</p>
|
<p xml:lang="gl">Debido á natureza do desenvolvemento da especificación de Matrix, NeoChat tamén inclúe varias funcionalidades non estábeis:</p>
|
||||||
|
<p xml:lang="hu">A Matrix specifikáció fejlesztésének jellegéből adódóan a NeoChat számos instabil funkciót is támogat. Jelenleg a következőket:</p>
|
||||||
<p xml:lang="ia">Debite al natura del disveloppamento de specification de Matrix NeoChat tamben supporta numerose characteristicas instabile. Currentemente istes es:</p>
|
<p xml:lang="ia">Debite al natura del disveloppamento de specification de Matrix NeoChat tamben supporta numerose characteristicas instabile. Currentemente istes es:</p>
|
||||||
<p xml:lang="it">A causa della natura dello sviluppo delle specifiche Matrix, NeoChat supporta anche numerose funzionalità instabili. Attualmente queste sono:</p>
|
<p xml:lang="it">A causa della natura dello sviluppo delle specifiche Matrix, NeoChat supporta anche numerose funzionalità instabili. Attualmente queste sono:</p>
|
||||||
<p xml:lang="ka">Matrix-ის სპეციფიკაციის განვითარების ბუნების გამო NeoChat-ს ასევე აქვს უამრავი არასტაბილური ფუნქციაც. ახლა ისინია:</p>
|
<p xml:lang="ka">Matrix-ის სპეციფიკაციის განვითარების ბუნების გამო NeoChat-ს ასევე აქვს უამრავი არასტაბილური ფუნქციაც. ახლა ისინია:</p>
|
||||||
<p xml:lang="ko">Matrix 표준 개발의 특징으로 인하여 NeoChat은 일부 실험적인 기능을 지원합니다. 현재 지원하는 기능은 다음과 같습니다.</p>
|
<p xml:lang="ko">Matrix 표준 개발의 특징으로 인하여 NeoChat은 일부 실험적인 기능을 지원합니다. 현재 지원하는 기능은 다음과 같습니다.</p>
|
||||||
|
<p xml:lang="lv">„Matrix“ specifikācijas veida dēļ „NeoChat“ attīstība atbalsta arī vairākas nestabilas iespējas, šobrīd šādas ir:</p>
|
||||||
<p xml:lang="nl">Vanwege de aard van de ontwikkeling van de Matrix specificatie ondersteunt NeoChat ook talloze onstabiele mogelijkheden. Dit zijn nu:</p>
|
<p xml:lang="nl">Vanwege de aard van de ontwikkeling van de Matrix specificatie ondersteunt NeoChat ook talloze onstabiele mogelijkheden. Dit zijn nu:</p>
|
||||||
<p xml:lang="nn">På grunn av måten Matrix-spesifikasjonen vert utvikla på, støttar NeoChat òg nokre uferdige funksjonar:</p>
|
<p xml:lang="nn">På grunn av måten Matrix-spesifikasjonen vert utvikla på, støttar NeoChat òg nokre uferdige funksjonar:</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="pl">Ze względu na sposób rozwoju Matriksa, NeoChat obsługuje także kilka niestabilnych możliwości. Obecnie są to:</p>
|
||||||
@@ -152,10 +164,12 @@
|
|||||||
<li xml:lang="fi">Kyselyt – MSC3381</li>
|
<li xml:lang="fi">Kyselyt – MSC3381</li>
|
||||||
<li xml:lang="fr">Sondages - MSC3381</li>
|
<li xml:lang="fr">Sondages - MSC3381</li>
|
||||||
<li xml:lang="gl">Enquisas — MSC3381</li>
|
<li xml:lang="gl">Enquisas — MSC3381</li>
|
||||||
|
<li xml:lang="hu">Szavazások - MSC3381</li>
|
||||||
<li xml:lang="ia">Inquestas - MSC3381</li>
|
<li xml:lang="ia">Inquestas - MSC3381</li>
|
||||||
<li xml:lang="it">Sondaggi - MSC3381</li>
|
<li xml:lang="it">Sondaggi - MSC3381</li>
|
||||||
<li xml:lang="ka">Polls - MSC3381</li>
|
<li xml:lang="ka">Polls - MSC3381</li>
|
||||||
<li xml:lang="ko">투표 - MSC3381</li>
|
<li xml:lang="ko">투표 - MSC3381</li>
|
||||||
|
<li xml:lang="lv">Aptaujas — MSC3381</li>
|
||||||
<li xml:lang="nl">Polls - MSC3381</li>
|
<li xml:lang="nl">Polls - MSC3381</li>
|
||||||
<li xml:lang="nn">Avstemmingar – MSC3381</li>
|
<li xml:lang="nn">Avstemmingar – MSC3381</li>
|
||||||
<li xml:lang="pl">Ankiety - MSC3381</li>
|
<li xml:lang="pl">Ankiety - MSC3381</li>
|
||||||
@@ -178,10 +192,12 @@
|
|||||||
<li xml:lang="fi">Tarrapakkaukset – MSC2545</li>
|
<li xml:lang="fi">Tarrapakkaukset – MSC2545</li>
|
||||||
<li xml:lang="fr">Paquets d'auto-collants - MSC2545</li>
|
<li xml:lang="fr">Paquets d'auto-collants - MSC2545</li>
|
||||||
<li xml:lang="gl">Paquetes de adhesivos — MSC2545</li>
|
<li xml:lang="gl">Paquetes de adhesivos — MSC2545</li>
|
||||||
|
<li xml:lang="hu">Matricacsomagok - MSC2545</li>
|
||||||
<li xml:lang="ia">Etiquetta gummate (sticker) -MSC2545</li>
|
<li xml:lang="ia">Etiquetta gummate (sticker) -MSC2545</li>
|
||||||
<li xml:lang="it">Pacchetti di adesivi - MSC2545</li>
|
<li xml:lang="it">Pacchetti di adesivi - MSC2545</li>
|
||||||
<li xml:lang="ka">სტიკერების პაკეტები - MSC2545</li>
|
<li xml:lang="ka">სტიკერების პაკეტები - MSC2545</li>
|
||||||
<li xml:lang="ko">스티커 팩 - MSC2545</li>
|
<li xml:lang="ko">스티커 팩 - MSC2545</li>
|
||||||
|
<li xml:lang="lv">Uzlīmju pakas — MSC2545</li>
|
||||||
<li xml:lang="nl">Sticker Packs - MSC2545</li>
|
<li xml:lang="nl">Sticker Packs - MSC2545</li>
|
||||||
<li xml:lang="nn">Klistremerke-pakkar – MSC2545</li>
|
<li xml:lang="nn">Klistremerke-pakkar – MSC2545</li>
|
||||||
<li xml:lang="pl">Paczki naklejek - MSC2545</li>
|
<li xml:lang="pl">Paczki naklejek - MSC2545</li>
|
||||||
@@ -204,10 +220,12 @@
|
|||||||
<li xml:lang="fi">Sijaintitapahtumat – MSC3488</li>
|
<li xml:lang="fi">Sijaintitapahtumat – MSC3488</li>
|
||||||
<li xml:lang="fr">Événements de lieu - MSC3488</li>
|
<li xml:lang="fr">Événements de lieu - MSC3488</li>
|
||||||
<li xml:lang="gl">Localización de eventos — MSC3488</li>
|
<li xml:lang="gl">Localización de eventos — MSC3488</li>
|
||||||
|
<li xml:lang="hu">Események helyadatai - MSC3488</li>
|
||||||
<li xml:lang="ia">Eventos de Location - MSC3488</li>
|
<li xml:lang="ia">Eventos de Location - MSC3488</li>
|
||||||
<li xml:lang="it">Località eventi - MSC3488</li>
|
<li xml:lang="it">Località eventi - MSC3488</li>
|
||||||
<li xml:lang="ka">მდებარეობის მოვლენები - MSC3488</li>
|
<li xml:lang="ka">მდებარეობის მოვლენები - MSC3488</li>
|
||||||
<li xml:lang="ko">위치 이벤트 - MSC3488</li>
|
<li xml:lang="ko">위치 이벤트 - MSC3488</li>
|
||||||
|
<li xml:lang="lv">Atrašanās vietas notikumi — MSC3488</li>
|
||||||
<li xml:lang="nl">Locatie gebeurtenissen - MSC3488</li>
|
<li xml:lang="nl">Locatie gebeurtenissen - MSC3488</li>
|
||||||
<li xml:lang="nn">Posisjonshendingar – MSC3488</li>
|
<li xml:lang="nn">Posisjonshendingar – MSC3488</li>
|
||||||
<li xml:lang="pl">Wydarzenia w miejscach - MSC3488</li>
|
<li xml:lang="pl">Wydarzenia w miejscach - MSC3488</li>
|
||||||
@@ -234,8 +252,7 @@
|
|||||||
<keyword>Matrix</keyword>
|
<keyword>Matrix</keyword>
|
||||||
<keyword>Kirigami</keyword>
|
<keyword>Kirigami</keyword>
|
||||||
</keywords>
|
</keywords>
|
||||||
<developer>
|
<developer id="kde.org">
|
||||||
<id>kde.org</id>
|
|
||||||
<name>The KDE Community</name>
|
<name>The KDE Community</name>
|
||||||
<url>https://kde.org</url>
|
<url>https://kde.org</url>
|
||||||
</developer>
|
</developer>
|
||||||
@@ -264,10 +281,12 @@
|
|||||||
<caption xml:lang="fi">Päänäkymä, jossa huoneluettelo, keskustelu ja huoneen tiedot</caption>
|
<caption xml:lang="fi">Päänäkymä, jossa huoneluettelo, keskustelu ja huoneen tiedot</caption>
|
||||||
<caption xml:lang="fr">Vue principale avec la liste des salons ainsi que des informations sur les salons et forums de discussions</caption>
|
<caption xml:lang="fr">Vue principale avec la liste des salons ainsi que des informations sur les salons et forums de discussions</caption>
|
||||||
<caption xml:lang="gl">Vista principal coa lista de salas, a charla, e información da sala.</caption>
|
<caption xml:lang="gl">Vista principal coa lista de salas, a charla, e información da sala.</caption>
|
||||||
|
<caption xml:lang="hu">A fő nézet a szobalistával, csevegéssel és szobainformációkkal</caption>
|
||||||
<caption xml:lang="ia">Vista principal con lista de sala, chat e information de sala</caption>
|
<caption xml:lang="ia">Vista principal con lista de sala, chat e information de sala</caption>
|
||||||
<caption xml:lang="it">Vista principale con elenco delle stanze, chat e informazioni sulla stanza</caption>
|
<caption xml:lang="it">Vista principale con elenco delle stanze, chat e informazioni sulla stanza</caption>
|
||||||
<caption xml:lang="ka">მთავარი ხედი სურათების სიით, ჩატით და ოთახის ინფორმაციით</caption>
|
<caption xml:lang="ka">მთავარი ხედი სურათების სიით, ჩატით და ოთახის ინფორმაციით</caption>
|
||||||
<caption xml:lang="ko">대화방 목록, 채팅, 대화방 정보가 표시된 주 보기</caption>
|
<caption xml:lang="ko">대화방 목록, 채팅, 대화방 정보가 표시된 주 보기</caption>
|
||||||
|
<caption xml:lang="lv">Pamata skats ar istabu sarakstu, tērzēšanu un istabas informāciju</caption>
|
||||||
<caption xml:lang="nl">Hoofdweergave met lijst met rooms, chat en roominformatie</caption>
|
<caption xml:lang="nl">Hoofdweergave met lijst met rooms, chat en roominformatie</caption>
|
||||||
<caption xml:lang="nn">Hovudvising med romliste, pratevindauge og rominformasjon</caption>
|
<caption xml:lang="nn">Hovudvising med romliste, pratevindauge og rominformasjon</caption>
|
||||||
<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>
|
||||||
@@ -285,17 +304,22 @@
|
|||||||
<caption>Discover new communities with Matrix Spaces</caption>
|
<caption>Discover new communities with Matrix Spaces</caption>
|
||||||
<caption xml:lang="ca">Descobriu comunitats noves amb els espais de Matrix</caption>
|
<caption xml:lang="ca">Descobriu comunitats noves amb els espais de Matrix</caption>
|
||||||
<caption xml:lang="ca-valencia">Descobriu comunitats noves amb els espais de Matrix</caption>
|
<caption xml:lang="ca-valencia">Descobriu comunitats noves amb els espais de Matrix</caption>
|
||||||
|
<caption xml:lang="eo">Malkovru novajn komunumojn per Matrix Spaces</caption>
|
||||||
<caption xml:lang="es">Descubra nuevas comunidades con los espacios de Matrix</caption>
|
<caption xml:lang="es">Descubra nuevas comunidades con los espacios de Matrix</caption>
|
||||||
<caption xml:lang="eu">Ezagutu komunitate berriak Matrixeko Tokiak erabiliz</caption>
|
<caption xml:lang="eu">Ezagutu komunitate berriak Matrixeko Tokiak erabiliz</caption>
|
||||||
|
<caption xml:lang="fr">Découvrez de nouvelles communautés avec les espaces sous Matrix</caption>
|
||||||
|
<caption xml:lang="hu">Fedezzen fel új közösségeket a Matrix Terek segítségével</caption>
|
||||||
<caption xml:lang="ia">Discoperi nove communitate con Matrix Spaces (Spatios de Matrix)</caption>
|
<caption xml:lang="ia">Discoperi nove communitate con Matrix Spaces (Spatios de Matrix)</caption>
|
||||||
<caption xml:lang="it">Scopri nuove comunità con Matrix Spaces</caption>
|
<caption xml:lang="it">Scopri nuove comunità con Matrix Spaces</caption>
|
||||||
<caption xml:lang="ka">აღმოაჩინეთ ახალი საზოგადოებები Matrix Spaces-თან ერთად</caption>
|
<caption xml:lang="ka">აღმოაჩინეთ ახალი საზოგადოებები Matrix Spaces-თან ერთად</caption>
|
||||||
|
<caption xml:lang="lv">Atklājiet jaunas kopienas ar „Matrix“ telpām</caption>
|
||||||
<caption xml:lang="nl">Ontdek nieuwe gemeenschappen met Matrix-ruimten</caption>
|
<caption xml:lang="nl">Ontdek nieuwe gemeenschappen met Matrix-ruimten</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="sl">Odkrijte nove skupnosti z Matrix Spaces</caption>
|
<caption xml:lang="sl">Odkrijte nove skupnosti z Matrix Spaces</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="x-test">xxDiscover new communities with Matrix Spacesxx</caption>
|
||||||
|
<caption xml:lang="zh-TW">利用 Matrix 聊天空間發現新的社群</caption>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<!--
|
<!--
|
||||||
Currently invalid. See https://github.com/ximion/appstream/issues/611
|
Currently invalid. See https://github.com/ximion/appstream/issues/611
|
||||||
@@ -316,10 +340,12 @@
|
|||||||
<caption xml:lang="fi">Päänäkymä, jossa huoneluettelo, keskustelu ja huoneen tiedot</caption>
|
<caption xml:lang="fi">Päänäkymä, jossa huoneluettelo, keskustelu ja huoneen tiedot</caption>
|
||||||
<caption xml:lang="fr">Vue principale avec la liste des salons ainsi que des informations sur les salons et forums de discussions</caption>
|
<caption xml:lang="fr">Vue principale avec la liste des salons ainsi que des informations sur les salons et forums de discussions</caption>
|
||||||
<caption xml:lang="gl">Vista principal coa lista de salas, a charla, e información da sala.</caption>
|
<caption xml:lang="gl">Vista principal coa lista de salas, a charla, e información da sala.</caption>
|
||||||
|
<caption xml:lang="hu">A fő nézet a szobalistával, csevegéssel és szobainformációkkal</caption>
|
||||||
<caption xml:lang="ia">Vista principal con lista de sala, chat e information de sala</caption>
|
<caption xml:lang="ia">Vista principal con lista de sala, chat e information de sala</caption>
|
||||||
<caption xml:lang="it">Vista principale con elenco delle stanze, chat e informazioni sulla stanza</caption>
|
<caption xml:lang="it">Vista principale con elenco delle stanze, chat e informazioni sulla stanza</caption>
|
||||||
<caption xml:lang="ka">მთავარი ხედი სურათების სიით, ჩატით და ოთახის ინფორმაციით</caption>
|
<caption xml:lang="ka">მთავარი ხედი სურათების სიით, ჩატით და ოთახის ინფორმაციით</caption>
|
||||||
<caption xml:lang="ko">대화방 목록, 채팅, 대화방 정보가 표시된 주 보기</caption>
|
<caption xml:lang="ko">대화방 목록, 채팅, 대화방 정보가 표시된 주 보기</caption>
|
||||||
|
<caption xml:lang="lv">Pamata skats ar istabu sarakstu, tērzēšanu un istabas informāciju</caption>
|
||||||
<caption xml:lang="nl">Hoofdweergave met lijst met rooms, chat en roominformatie</caption>
|
<caption xml:lang="nl">Hoofdweergave met lijst met rooms, chat en roominformatie</caption>
|
||||||
<caption xml:lang="nn">Hovudvising med romliste, pratevindauge og rominformasjon</caption>
|
<caption xml:lang="nn">Hovudvising med romliste, pratevindauge og rominformasjon</caption>
|
||||||
<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>
|
||||||
@@ -345,10 +371,12 @@
|
|||||||
<caption xml:lang="fi">Kirjautumisnäkymä</caption>
|
<caption xml:lang="fi">Kirjautumisnäkymä</caption>
|
||||||
<caption xml:lang="fr">Écran de connexion</caption>
|
<caption xml:lang="fr">Écran de connexion</caption>
|
||||||
<caption xml:lang="gl">Pantalla de identificación.</caption>
|
<caption xml:lang="gl">Pantalla de identificación.</caption>
|
||||||
|
<caption xml:lang="hu">Bejelentkező képernyő</caption>
|
||||||
<caption xml:lang="ia">Schermo de accesso</caption>
|
<caption xml:lang="ia">Schermo de accesso</caption>
|
||||||
<caption xml:lang="it">Schermata di accesso</caption>
|
<caption xml:lang="it">Schermata di accesso</caption>
|
||||||
<caption xml:lang="ka">შესვლის ეკრანი</caption>
|
<caption xml:lang="ka">შესვლის ეკრანი</caption>
|
||||||
<caption xml:lang="ko">로그인 화면</caption>
|
<caption xml:lang="ko">로그인 화면</caption>
|
||||||
|
<caption xml:lang="lv">Ierakstīšanās logs</caption>
|
||||||
<caption xml:lang="nl">Aanmeldscherm</caption>
|
<caption xml:lang="nl">Aanmeldscherm</caption>
|
||||||
<caption xml:lang="nn">Innloggingsbilete</caption>
|
<caption xml:lang="nn">Innloggingsbilete</caption>
|
||||||
<caption xml:lang="pl">Ekran logowania</caption>
|
<caption xml:lang="pl">Ekran logowania</caption>
|
||||||
@@ -366,6 +394,8 @@
|
|||||||
<content_attribute id="social-chat">intense</content_attribute>
|
<content_attribute id="social-chat">intense</content_attribute>
|
||||||
</content_rating>
|
</content_rating>
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="24.02.2" date="2024-04-11"/>
|
||||||
|
<release version="24.02.1" date="2024-03-21"/>
|
||||||
<release version="24.02.0" date="2024-02-28">
|
<release version="24.02.0" date="2024-02-28">
|
||||||
<url>https://kde.org/announcements/megarelease/6/#neochat</url>
|
<url>https://kde.org/announcements/megarelease/6/#neochat</url>
|
||||||
<description>
|
<description>
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ Name[it]=NeoChat
|
|||||||
Name[ka]=NeoChat
|
Name[ka]=NeoChat
|
||||||
Name[ko]=NeoChat
|
Name[ko]=NeoChat
|
||||||
Name[lt]=NeoChat
|
Name[lt]=NeoChat
|
||||||
|
Name[lv]=NeoChat
|
||||||
Name[nl]=NeoChat
|
Name[nl]=NeoChat
|
||||||
Name[nn]=NeoChat
|
Name[nn]=NeoChat
|
||||||
Name[pa]=ਨਿਓ-ਚੈਟ
|
Name[pa]=ਨਿਓ-ਚੈਟ
|
||||||
@@ -66,6 +67,7 @@ GenericName[it]=Client Matrix
|
|||||||
GenericName[ka]=Matrix -ის კლიენტი
|
GenericName[ka]=Matrix -ის კლიენტი
|
||||||
GenericName[ko]=Matrix 클라이언트
|
GenericName[ko]=Matrix 클라이언트
|
||||||
GenericName[lt]=Matrix kliento programa
|
GenericName[lt]=Matrix kliento programa
|
||||||
|
GenericName[lv]=„Matrix“ klients
|
||||||
GenericName[nl]=Matrix-client
|
GenericName[nl]=Matrix-client
|
||||||
GenericName[nn]=Matrix-klient
|
GenericName[nn]=Matrix-klient
|
||||||
GenericName[pa]=ਮੈਟਰਿਕਸ ਕਲਾਈਂਟ
|
GenericName[pa]=ਮੈਟਰਿਕਸ ਕਲਾਈਂਟ
|
||||||
@@ -105,6 +107,7 @@ Comment[it]=Client per il protocollo Matrix
|
|||||||
Comment[ka]=კლიენტი Matrix-ის პროტოკოლისთვის
|
Comment[ka]=კლიენტი Matrix-ის პროტოკოლისთვის
|
||||||
Comment[ko]=Matrix 프로토콜용 클라이언트
|
Comment[ko]=Matrix 프로토콜용 클라이언트
|
||||||
Comment[lt]=Matrix protokolo kliento programa
|
Comment[lt]=Matrix protokolo kliento programa
|
||||||
|
Comment[lv]=Klients „Matrix“ protokolam
|
||||||
Comment[nl]=Client voor het Matrix-protocol
|
Comment[nl]=Client voor het Matrix-protocol
|
||||||
Comment[nn]=Klient for Matrix-protokollen
|
Comment[nn]=Klient for Matrix-protokollen
|
||||||
Comment[pa]=ਮੈਟਰਿਕਸ ਪਰੋਟੋਕਾਲ ਲਈ ਕਲਾਈਂਟ ਹੈ
|
Comment[pa]=ਮੈਟਰਿਕਸ ਪਰੋਟੋਕਾਲ ਲਈ ਕਲਾਈਂਟ ਹੈ
|
||||||
|
|||||||
4804
po/ar/neochat.po
4804
po/ar/neochat.po
File diff suppressed because it is too large
Load Diff
4521
po/ast/neochat.po
4521
po/ast/neochat.po
File diff suppressed because it is too large
Load Diff
4990
po/az/neochat.po
4990
po/az/neochat.po
File diff suppressed because it is too large
Load Diff
4713
po/ca/neochat.po
4713
po/ca/neochat.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
4616
po/cs/neochat.po
4616
po/cs/neochat.po
File diff suppressed because it is too large
Load Diff
4730
po/da/neochat.po
4730
po/da/neochat.po
File diff suppressed because it is too large
Load Diff
4866
po/de/neochat.po
4866
po/de/neochat.po
File diff suppressed because it is too large
Load Diff
4889
po/el/neochat.po
4889
po/el/neochat.po
File diff suppressed because it is too large
Load Diff
4814
po/en_GB/neochat.po
4814
po/en_GB/neochat.po
File diff suppressed because it is too large
Load Diff
4649
po/eo/neochat.po
4649
po/eo/neochat.po
File diff suppressed because it is too large
Load Diff
4702
po/es/neochat.po
4702
po/es/neochat.po
File diff suppressed because it is too large
Load Diff
4674
po/eu/neochat.po
4674
po/eu/neochat.po
File diff suppressed because it is too large
Load Diff
4745
po/fi/neochat.po
4745
po/fi/neochat.po
File diff suppressed because it is too large
Load Diff
4715
po/fr/neochat.po
4715
po/fr/neochat.po
File diff suppressed because it is too large
Load Diff
5633
po/hu/neochat.po
5633
po/hu/neochat.po
File diff suppressed because it is too large
Load Diff
4694
po/ia/neochat.po
4694
po/ia/neochat.po
File diff suppressed because it is too large
Load Diff
4830
po/id/neochat.po
4830
po/id/neochat.po
File diff suppressed because it is too large
Load Diff
4820
po/ie/neochat.po
4820
po/ie/neochat.po
File diff suppressed because it is too large
Load Diff
4729
po/it/neochat.po
4729
po/it/neochat.po
File diff suppressed because it is too large
Load Diff
4515
po/ja/neochat.po
4515
po/ja/neochat.po
File diff suppressed because it is too large
Load Diff
4679
po/ka/neochat.po
4679
po/ka/neochat.po
File diff suppressed because it is too large
Load Diff
4719
po/ko/neochat.po
4719
po/ko/neochat.po
File diff suppressed because it is too large
Load Diff
4531
po/lt/neochat.po
4531
po/lt/neochat.po
File diff suppressed because it is too large
Load Diff
5299
po/lv/neochat.po
Normal file
5299
po/lv/neochat.po
Normal file
File diff suppressed because it is too large
Load Diff
4702
po/nl/neochat.po
4702
po/nl/neochat.po
File diff suppressed because it is too large
Load Diff
4750
po/nn/neochat.po
4750
po/nn/neochat.po
File diff suppressed because it is too large
Load Diff
4942
po/pa/neochat.po
4942
po/pa/neochat.po
File diff suppressed because it is too large
Load Diff
4709
po/pl/neochat.po
4709
po/pl/neochat.po
File diff suppressed because it is too large
Load Diff
4824
po/pt/neochat.po
4824
po/pt/neochat.po
File diff suppressed because it is too large
Load Diff
4994
po/pt_BR/neochat.po
4994
po/pt_BR/neochat.po
File diff suppressed because it is too large
Load Diff
4817
po/ru/neochat.po
4817
po/ru/neochat.po
File diff suppressed because it is too large
Load Diff
4951
po/sk/neochat.po
4951
po/sk/neochat.po
File diff suppressed because it is too large
Load Diff
5095
po/sl/neochat.po
5095
po/sl/neochat.po
File diff suppressed because it is too large
Load Diff
4794
po/sv/neochat.po
4794
po/sv/neochat.po
File diff suppressed because it is too large
Load Diff
4709
po/ta/neochat.po
4709
po/ta/neochat.po
File diff suppressed because it is too large
Load Diff
4700
po/tok/neochat.po
4700
po/tok/neochat.po
File diff suppressed because it is too large
Load Diff
4674
po/tr/neochat.po
4674
po/tr/neochat.po
File diff suppressed because it is too large
Load Diff
4718
po/uk/neochat.po
4718
po/uk/neochat.po
File diff suppressed because it is too large
Load Diff
4653
po/zh_CN/neochat.po
4653
po/zh_CN/neochat.po
File diff suppressed because it is too large
Load Diff
4620
po/zh_TW/neochat.po
4620
po/zh_TW/neochat.po
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,10 @@
|
|||||||
# SPDX-FileCopyrightText: 2020-2021 Tobias Fella <tobias.fella@kde.org>
|
# SPDX-FileCopyrightText: 2020-2021 Tobias Fella <tobias.fella@kde.org>
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
# SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
|
||||||
|
if (NOT ANDROID AND NOT WIN32 AND NOT APPLE AND NOT NEOCHAT_FLATPAK AND NOT NEOCHAT_APPIMAGE)
|
||||||
|
add_subdirectory(purpose)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_library(neochat STATIC
|
add_library(neochat STATIC
|
||||||
controller.cpp
|
controller.cpp
|
||||||
controller.h
|
controller.h
|
||||||
@@ -122,6 +126,7 @@ add_library(neochat STATIC
|
|||||||
events/pollevent.cpp
|
events/pollevent.cpp
|
||||||
pollhandler.cpp
|
pollhandler.cpp
|
||||||
utils.h
|
utils.h
|
||||||
|
utils.cpp
|
||||||
registration.cpp
|
registration.cpp
|
||||||
neochatconnection.cpp
|
neochatconnection.cpp
|
||||||
neochatconnection.h
|
neochatconnection.h
|
||||||
@@ -165,11 +170,23 @@ add_library(neochat STATIC
|
|||||||
mediamanager.h
|
mediamanager.h
|
||||||
models/statekeysmodel.cpp
|
models/statekeysmodel.cpp
|
||||||
models/statekeysmodel.h
|
models/statekeysmodel.h
|
||||||
|
sharehandler.cpp
|
||||||
|
sharehandler.h
|
||||||
|
models/roomtreeitem.cpp
|
||||||
|
models/roomtreeitem.h
|
||||||
|
foreigntypes.h
|
||||||
|
models/threepidmodel.cpp
|
||||||
|
models/threepidmodel.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set_source_files_properties(qml/OsmLocationPlugin.qml PROPERTIES
|
||||||
|
QT_QML_SINGLETON_TYPE TRUE
|
||||||
)
|
)
|
||||||
|
|
||||||
qt_add_qml_module(neochat URI org.kde.neochat NO_PLUGIN
|
qt_add_qml_module(neochat URI org.kde.neochat NO_PLUGIN
|
||||||
|
OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/src/org/kde/neochat
|
||||||
QML_FILES
|
QML_FILES
|
||||||
qml/main.qml
|
qml/Main.qml
|
||||||
qml/AccountMenu.qml
|
qml/AccountMenu.qml
|
||||||
qml/ExploreComponent.qml
|
qml/ExploreComponent.qml
|
||||||
qml/ExploreComponentMobile.qml
|
qml/ExploreComponentMobile.qml
|
||||||
@@ -181,20 +198,12 @@ qt_add_qml_module(neochat URI org.kde.neochat NO_PLUGIN
|
|||||||
qml/UserInfo.qml
|
qml/UserInfo.qml
|
||||||
qml/UserInfoDesktop.qml
|
qml/UserInfoDesktop.qml
|
||||||
qml/RoomPage.qml
|
qml/RoomPage.qml
|
||||||
qml/RoomWindow.qml
|
|
||||||
qml/ExploreRoomsPage.qml
|
qml/ExploreRoomsPage.qml
|
||||||
qml/ManualRoomDialog.qml
|
qml/ManualRoomDialog.qml
|
||||||
qml/ExplorerDelegate.qml
|
qml/ExplorerDelegate.qml
|
||||||
qml/InviteUserPage.qml
|
qml/InviteUserPage.qml
|
||||||
qml/ImageEditorPage.qml
|
qml/ImageEditorPage.qml
|
||||||
qml/WelcomePage.qml
|
|
||||||
qml/General.qml
|
|
||||||
qml/RoomSecurity.qml
|
|
||||||
qml/PushNotification.qml
|
|
||||||
qml/Categories.qml
|
|
||||||
qml/Permissions.qml
|
|
||||||
qml/NeochatMaximizeComponent.qml
|
qml/NeochatMaximizeComponent.qml
|
||||||
qml/FancyEffectsContainer.qml
|
|
||||||
qml/TypingPane.qml
|
qml/TypingPane.qml
|
||||||
qml/QuickSwitcher.qml
|
qml/QuickSwitcher.qml
|
||||||
qml/HoverActions.qml
|
qml/HoverActions.qml
|
||||||
@@ -204,35 +213,7 @@ qt_add_qml_module(neochat URI org.kde.neochat NO_PLUGIN
|
|||||||
qml/CompletionMenu.qml
|
qml/CompletionMenu.qml
|
||||||
qml/PieProgressBar.qml
|
qml/PieProgressBar.qml
|
||||||
qml/QuickFormatBar.qml
|
qml/QuickFormatBar.qml
|
||||||
qml/RoomData.qml
|
|
||||||
qml/ServerData.qml
|
|
||||||
qml/EmojiPicker.qml
|
qml/EmojiPicker.qml
|
||||||
qml/TimelineDelegate.qml
|
|
||||||
qml/ReplyComponent.qml
|
|
||||||
qml/StateDelegate.qml
|
|
||||||
qml/MessageDelegate.qml
|
|
||||||
qml/Bubble.qml
|
|
||||||
qml/SectionDelegate.qml
|
|
||||||
qml/ReactionDelegate.qml
|
|
||||||
qml/EventDelegate.qml
|
|
||||||
qml/ReadMarkerDelegate.qml
|
|
||||||
qml/MimeComponent.qml
|
|
||||||
qml/StateComponent.qml
|
|
||||||
qml/MessageEditComponent.qml
|
|
||||||
qml/AvatarFlow.qml
|
|
||||||
qml/LoginStep.qml
|
|
||||||
qml/Login.qml
|
|
||||||
qml/Homeserver.qml
|
|
||||||
qml/Username.qml
|
|
||||||
qml/RegisterPassword.qml
|
|
||||||
qml/Captcha.qml
|
|
||||||
qml/Terms.qml
|
|
||||||
qml/Email.qml
|
|
||||||
qml/Password.qml
|
|
||||||
qml/LoginRegister.qml
|
|
||||||
qml/Loading.qml
|
|
||||||
qml/LoginMethod.qml
|
|
||||||
qml/Sso.qml
|
|
||||||
qml/UserDetailDialog.qml
|
qml/UserDetailDialog.qml
|
||||||
qml/CreateRoomDialog.qml
|
qml/CreateRoomDialog.qml
|
||||||
qml/EmojiDialog.qml
|
qml/EmojiDialog.qml
|
||||||
@@ -252,26 +233,6 @@ qt_add_qml_module(neochat URI org.kde.neochat NO_PLUGIN
|
|||||||
qml/FileDelegateContextMenu.qml
|
qml/FileDelegateContextMenu.qml
|
||||||
qml/MessageSourceSheet.qml
|
qml/MessageSourceSheet.qml
|
||||||
qml/ReportSheet.qml
|
qml/ReportSheet.qml
|
||||||
qml/SettingsPage.qml
|
|
||||||
qml/ThemeRadioButton.qml
|
|
||||||
qml/ColorScheme.qml
|
|
||||||
qml/GeneralSettingsPage.qml
|
|
||||||
qml/EmoticonsPage.qml
|
|
||||||
qml/EmoticonEditorPage.qml
|
|
||||||
qml/EmoticonFormCard.qml
|
|
||||||
qml/GlobalNotificationsPage.qml
|
|
||||||
qml/NotificationRuleItem.qml
|
|
||||||
qml/AppearanceSettingsPage.qml
|
|
||||||
qml/AccountsPage.qml
|
|
||||||
qml/AccountEditorPage.qml
|
|
||||||
qml/DevicesPage.qml
|
|
||||||
qml/DeviceDelegate.qml
|
|
||||||
qml/DevicesCard.qml
|
|
||||||
qml/About.qml
|
|
||||||
qml/AboutKDE.qml
|
|
||||||
qml/SonnetConfigPage.qml
|
|
||||||
qml/NetworkProxyPage.qml
|
|
||||||
qml/DevtoolsPage.qml
|
|
||||||
qml/ConfirmEncryptionDialog.qml
|
qml/ConfirmEncryptionDialog.qml
|
||||||
qml/RemoveSheet.qml
|
qml/RemoveSheet.qml
|
||||||
qml/BanSheet.qml
|
qml/BanSheet.qml
|
||||||
@@ -299,44 +260,33 @@ qt_add_qml_module(neochat URI org.kde.neochat NO_PLUGIN
|
|||||||
qml/SpaceHierarchyDelegate.qml
|
qml/SpaceHierarchyDelegate.qml
|
||||||
qml/RemoveChildDialog.qml
|
qml/RemoveChildDialog.qml
|
||||||
qml/SelectParentDialog.qml
|
qml/SelectParentDialog.qml
|
||||||
qml/Security.qml
|
|
||||||
qml/QrCodeMaximizeComponent.qml
|
qml/QrCodeMaximizeComponent.qml
|
||||||
qml/SelectSpacesDialog.qml
|
qml/SelectSpacesDialog.qml
|
||||||
qml/AttachDialog.qml
|
qml/AttachDialog.qml
|
||||||
qml/NotificationsView.qml
|
qml/NotificationsView.qml
|
||||||
qml/LoadingDelegate.qml
|
|
||||||
qml/TimelineEndDelegate.qml
|
|
||||||
qml/SearchPage.qml
|
qml/SearchPage.qml
|
||||||
qml/ServerComboBox.qml
|
qml/ServerComboBox.qml
|
||||||
qml/UserSearchPage.qml
|
qml/UserSearchPage.qml
|
||||||
qml/ManualUserDialog.qml
|
qml/ManualUserDialog.qml
|
||||||
qml/MessageComponentChooser.qml
|
|
||||||
qml/TextComponent.qml
|
|
||||||
qml/ImageComponent.qml
|
|
||||||
qml/VideoComponent.qml
|
|
||||||
qml/AudioComponent.qml
|
|
||||||
qml/EncryptedComponent.qml
|
|
||||||
qml/FileComponent.qml
|
|
||||||
qml/LocationComponent.qml
|
|
||||||
qml/LiveLocationComponent.qml
|
|
||||||
qml/PollComponent.qml
|
|
||||||
qml/LinkPreviewComponent.qml
|
|
||||||
qml/LoadComponent.qml
|
|
||||||
qml/RecommendedSpaceDialog.qml
|
qml/RecommendedSpaceDialog.qml
|
||||||
qml/RoomTreeSection.qml
|
qml/RoomTreeSection.qml
|
||||||
qml/DelegateContextMenu.qml
|
qml/DelegateContextMenu.qml
|
||||||
qml/ShareDialog.qml
|
qml/ShareDialog.qml
|
||||||
qml/FeatureFlagPage.qml
|
qml/UnlockSSSSDialog.qml
|
||||||
qml/IgnoredUsersDialog.qml
|
qml/QrScannerPage.qml
|
||||||
qml/AccountData.qml
|
qml/JoinRoomDialog.qml
|
||||||
qml/StateKeys.qml
|
qml/ConfirmUrlDialog.qml
|
||||||
qml/CodeComponent.qml
|
qml/AccountSwitchDialog.qml
|
||||||
qml/QuoteComponent.qml
|
qml/ConfirmLeaveDialog.qml
|
||||||
RESOURCES
|
qml/CodeMaximizeComponent.qml
|
||||||
qml/confetti.png
|
qml/EditStateDialog.qml
|
||||||
qml/glowdot.png
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_subdirectory(settings)
|
||||||
|
add_subdirectory(timeline)
|
||||||
|
add_subdirectory(devtools)
|
||||||
|
add_subdirectory(login)
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
qt_target_qml_sources(neochat QML_FILES qml/ShareAction.qml)
|
qt_target_qml_sources(neochat QML_FILES qml/ShareAction.qml)
|
||||||
else()
|
else()
|
||||||
@@ -420,9 +370,14 @@ if (NOT ANDROID AND NOT WIN32 AND NOT APPLE)
|
|||||||
target_compile_definitions(neochat PUBLIC -DHAVE_RUNNER)
|
target_compile_definitions(neochat PUBLIC -DHAVE_RUNNER)
|
||||||
target_compile_definitions(neochat PUBLIC -DHAVE_X11)
|
target_compile_definitions(neochat PUBLIC -DHAVE_X11)
|
||||||
target_sources(neochat PRIVATE runner.cpp)
|
target_sources(neochat PRIVATE runner.cpp)
|
||||||
|
|
||||||
|
if (TARGET KUnifiedPush)
|
||||||
|
target_sources(neochat PRIVATE fakerunner.cpp)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_include_directories(neochat PRIVATE ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/models ${CMAKE_CURRENT_SOURCE_DIR}/enums)
|
target_include_directories(neochat PRIVATE ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/models ${CMAKE_CURRENT_SOURCE_DIR}/enums)
|
||||||
|
target_link_libraries(neochat PRIVATE settingsplugin timelineplugin devtoolsplugin loginplugin)
|
||||||
target_link_libraries(neochat PUBLIC
|
target_link_libraries(neochat PUBLIC
|
||||||
Qt::Core
|
Qt::Core
|
||||||
Qt::Quick
|
Qt::Quick
|
||||||
@@ -446,6 +401,10 @@ target_link_libraries(neochat PUBLIC
|
|||||||
QCoro::Network
|
QCoro::Network
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (TARGET KF6::Crash)
|
||||||
|
target_link_libraries(neochat PUBLIC KF6::Crash)
|
||||||
|
endif()
|
||||||
|
|
||||||
kconfig_add_kcfg_files(neochat GENERATE_MOC neochatconfig.kcfgc)
|
kconfig_add_kcfg_files(neochat GENERATE_MOC neochatconfig.kcfgc)
|
||||||
|
|
||||||
if(NEOCHAT_FLATPAK)
|
if(NEOCHAT_FLATPAK)
|
||||||
@@ -548,7 +507,7 @@ if(ANDROID)
|
|||||||
)
|
)
|
||||||
ecm_add_android_apk(neochat-app ANDROID_DIR ${CMAKE_SOURCE_DIR}/android)
|
ecm_add_android_apk(neochat-app ANDROID_DIR ${CMAKE_SOURCE_DIR}/android)
|
||||||
else()
|
else()
|
||||||
target_link_libraries(neochat PUBLIC Qt::Widgets KF6::KIOWidgets)
|
target_link_libraries(neochat PUBLIC Qt::Widgets KF6::KIOWidgets KF6::SyntaxHighlighting)
|
||||||
install(FILES neochat.notifyrc DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR})
|
install(FILES neochat.notifyrc DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -556,7 +515,7 @@ if(NOT ANDROID)
|
|||||||
set_target_properties(neochat-app PROPERTIES OUTPUT_NAME "neochat")
|
set_target_properties(neochat-app PROPERTIES OUTPUT_NAME "neochat")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(TARGET KF6::DBusAddons)
|
if(TARGET KF6::DBusAddons AND NOT WIN32)
|
||||||
target_link_libraries(neochat PUBLIC KF6::DBusAddons)
|
target_link_libraries(neochat PUBLIC KF6::DBusAddons)
|
||||||
target_compile_definitions(neochat PUBLIC -DHAVE_KDBUSADDONS)
|
target_compile_definitions(neochat PUBLIC -DHAVE_KDBUSADDONS)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include "models/actionsmodel.h"
|
#include "models/actionsmodel.h"
|
||||||
#include "neochatconfig.h"
|
#include "neochatconfig.h"
|
||||||
#include "texthandler.h"
|
#include "texthandler.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
using namespace Quotient;
|
using namespace Quotient;
|
||||||
|
|
||||||
@@ -80,6 +81,7 @@ QString ActionsHandler::handleMentions(QString handledText, QList<Mention> *ment
|
|||||||
|
|
||||||
void ActionsHandler::handleMessage(const QString &text, QString handledText, ChatBarCache *chatBarCache)
|
void ActionsHandler::handleMessage(const QString &text, QString handledText, ChatBarCache *chatBarCache)
|
||||||
{
|
{
|
||||||
|
Q_ASSERT(m_room);
|
||||||
if (NeoChatConfig::allowQuickEdit()) {
|
if (NeoChatConfig::allowQuickEdit()) {
|
||||||
QRegularExpression sed(QStringLiteral("^s/([^/]*)/([^/]*)(/g)?$"));
|
QRegularExpression sed(QStringLiteral("^s/([^/]*)/([^/]*)(/g)?$"));
|
||||||
auto match = sed.match(text);
|
auto match = sed.match(text);
|
||||||
@@ -144,6 +146,26 @@ void ActionsHandler::handleMessage(const QString &text, QString handledText, Cha
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We want to add back the <mx-reply> if it's in the original message but not in the edit, to preserve the reply.
|
||||||
|
for (auto it = m_room->messageEvents().crbegin(); it != m_room->messageEvents().crend(); it++) {
|
||||||
|
if (const auto event = eventCast<const RoomMessageEvent>(&**it)) {
|
||||||
|
if (event->senderId() == m_room->localUser()->id() && event->hasTextContent()) {
|
||||||
|
QString originalString;
|
||||||
|
if (event->content()) {
|
||||||
|
originalString = static_cast<const Quotient::EventContent::TextContent *>(event->content())->body;
|
||||||
|
} else {
|
||||||
|
originalString = event->plainBody();
|
||||||
|
}
|
||||||
|
|
||||||
|
const QRegularExpression exp(TextRegex::removeRichReply);
|
||||||
|
const auto match = exp.match(originalString);
|
||||||
|
if (match.hasCaptured(0) && !handledText.contains(TextRegex::removeRichReply)) {
|
||||||
|
handledText.prepend(match.captured(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_room->postMessage(text, handledText, messageType, chatBarCache->replyId(), chatBarCache->editId(), chatBarCache->threadId());
|
m_room->postMessage(text, handledText, messageType, chatBarCache->replyId(), chatBarCache->editId(), chatBarCache->threadId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public Q_SLOTS:
|
|||||||
void handleMessageEvent(ChatBarCache *chatBarCache);
|
void handleMessageEvent(ChatBarCache *chatBarCache);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NeoChatRoom *m_room = nullptr;
|
QPointer<NeoChatRoom> m_room;
|
||||||
void checkEffects(const QString &text);
|
void checkEffects(const QString &text);
|
||||||
|
|
||||||
QString handleMentions(QString handledText, QList<Mention> *mentions);
|
QString handleMentions(QString handledText, QList<Mention> *mentions);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "chatbarcache.h"
|
#include "chatbarcache.h"
|
||||||
|
|
||||||
|
#include "chatdocumenthandler.h"
|
||||||
#include "eventhandler.h"
|
#include "eventhandler.h"
|
||||||
#include "neochatroom.h"
|
#include "neochatroom.h"
|
||||||
|
|
||||||
@@ -117,7 +118,7 @@ QString ChatBarCache::relationMessage() const
|
|||||||
|
|
||||||
if (auto event = room->findInTimeline(m_relationId); event != room->historyEdge()) {
|
if (auto event = room->findInTimeline(m_relationId); event != room->historyEdge()) {
|
||||||
EventHandler eventhandler(room, &**event);
|
EventHandler eventhandler(room, &**event);
|
||||||
return eventhandler.getPlainBody();
|
return eventhandler.getMarkdownBody();
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@@ -163,6 +164,54 @@ QList<Mention> *ChatBarCache::mentions()
|
|||||||
return &m_mentions;
|
return &m_mentions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChatBarCache::updateMentions(QQuickTextDocument *document, ChatDocumentHandler *documentHandler)
|
||||||
|
{
|
||||||
|
documentHandler->setDocument(document);
|
||||||
|
|
||||||
|
if (parent() == nullptr) {
|
||||||
|
qWarning() << "ChatBarCache created with no parent, a NeoChatRoom must be set as the parent on creation.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (m_relationId.isEmpty()) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto event = room->findInTimeline(m_relationId); event != room->historyEdge()) {
|
||||||
|
if (const auto &roomMessageEvent = &*event->viewAs<Quotient::RoomMessageEvent>()) {
|
||||||
|
// Replaces the mentions that are baked into the HTML but plaintext in the original markdown
|
||||||
|
const QRegularExpression re(QStringLiteral(R"lit(<a\shref="https:\/\/matrix.to\/#\/([\S]*)"\s?>([\S]*)<\/a>)lit"));
|
||||||
|
|
||||||
|
m_mentions.clear();
|
||||||
|
|
||||||
|
int linkSize = 0;
|
||||||
|
auto matches = re.globalMatch(EventHandler::rawMessageBody(*roomMessageEvent));
|
||||||
|
while (matches.hasNext()) {
|
||||||
|
const QRegularExpressionMatch match = matches.next();
|
||||||
|
if (match.hasMatch()) {
|
||||||
|
const QString id = match.captured(1);
|
||||||
|
const QString name = match.captured(2);
|
||||||
|
|
||||||
|
const int position = match.capturedStart(0) - linkSize;
|
||||||
|
const int end = position + name.length();
|
||||||
|
linkSize += match.capturedLength(0) - name.length();
|
||||||
|
|
||||||
|
QTextCursor cursor(documentHandler->document()->textDocument());
|
||||||
|
cursor.setPosition(position);
|
||||||
|
cursor.setPosition(end, QTextCursor::KeepAnchor);
|
||||||
|
cursor.setKeepPositionOnInsert(true);
|
||||||
|
|
||||||
|
m_mentions.push_back(Mention{.cursor = cursor, .text = name, .start = position, .position = end, .id = id});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QString ChatBarCache::savedText() const
|
QString ChatBarCache::savedText() const
|
||||||
{
|
{
|
||||||
return m_savedText;
|
return m_savedText;
|
||||||
|
|||||||
@@ -5,8 +5,11 @@
|
|||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QQmlEngine>
|
#include <QQmlEngine>
|
||||||
|
#include <QQuickTextDocument>
|
||||||
#include <QTextCursor>
|
#include <QTextCursor>
|
||||||
|
|
||||||
|
class ChatDocumentHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Defines a user mention in the current chat or edit text.
|
* @brief Defines a user mention in the current chat or edit text.
|
||||||
*/
|
*/
|
||||||
@@ -174,6 +177,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
QList<Mention> *mentions();
|
QList<Mention> *mentions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Update the mentions in @p document when editing a message.
|
||||||
|
*/
|
||||||
|
Q_INVOKABLE void updateMentions(QQuickTextDocument *document, ChatDocumentHandler *documentHandler);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the saved chat bar text.
|
* @brief Get the saved chat bar text.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ class ChatDocumentHandler : public QObject
|
|||||||
Q_PROPERTY(CompletionModel *completionModel READ completionModel CONSTANT)
|
Q_PROPERTY(CompletionModel *completionModel READ completionModel CONSTANT)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The current room that the the text document is being handled for.
|
* @brief The current room that the text document is being handled for.
|
||||||
*/
|
*/
|
||||||
Q_PROPERTY(NeoChatRoom *room READ room WRITE setRoom NOTIFY roomChanged)
|
Q_PROPERTY(NeoChatRoom *room READ room WRITE setRoom NOTIFY roomChanged)
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
#include <Quotient/accountregistry.h>
|
#include <Quotient/accountregistry.h>
|
||||||
#include <Quotient/connection.h>
|
|
||||||
#include <Quotient/csapi/logout.h>
|
#include <Quotient/csapi/logout.h>
|
||||||
#include <Quotient/csapi/notifications.h>
|
#include <Quotient/csapi/notifications.h>
|
||||||
#include <Quotient/eventstats.h>
|
#include <Quotient/eventstats.h>
|
||||||
@@ -156,6 +155,15 @@ void Controller::addConnection(NeoChatConnection *c)
|
|||||||
c->saveState();
|
c->saveState();
|
||||||
});
|
});
|
||||||
connect(c, &NeoChatConnection::loggedOut, this, [this, c] {
|
connect(c, &NeoChatConnection::loggedOut, this, [this, c] {
|
||||||
|
if (accounts().count() > 1) {
|
||||||
|
// Only set the connection if the account being logged out is currently active
|
||||||
|
if (c == activeConnection()) {
|
||||||
|
setActiveConnection(dynamic_cast<NeoChatConnection *>(accounts().accounts()[0]));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setActiveConnection(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
dropConnection(c);
|
dropConnection(c);
|
||||||
});
|
});
|
||||||
connect(c, &NeoChatConnection::badgeNotificationCountChanged, this, &Controller::updateBadgeNotificationCount);
|
connect(c, &NeoChatConnection::badgeNotificationCountChanged, this, &Controller::updateBadgeNotificationCount);
|
||||||
@@ -309,7 +317,7 @@ void Controller::setActiveConnection(NeoChatConnection *connection)
|
|||||||
updateBadgeNotificationCount(m_connection, m_connection->badgeNotificationCount());
|
updateBadgeNotificationCount(m_connection, m_connection->badgeNotificationCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
Q_EMIT activeConnectionChanged();
|
Q_EMIT activeConnectionChanged(m_connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Controller::listenForNotifications()
|
void Controller::listenForNotifications()
|
||||||
@@ -377,6 +385,14 @@ AccountRegistry &Controller::accounts()
|
|||||||
return m_accountRegistry;
|
return m_accountRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString Controller::loadFileContent(const QString &path) const
|
||||||
|
{
|
||||||
|
QUrl url(path);
|
||||||
|
QFile file(url.isLocalFile() ? url.toLocalFile() : url.toString());
|
||||||
|
file.open(QFile::ReadOnly);
|
||||||
|
return QString::fromLatin1(file.readAll());
|
||||||
|
}
|
||||||
|
|
||||||
#include "moc_controller.cpp"
|
#include "moc_controller.cpp"
|
||||||
|
|
||||||
void Controller::setTestMode(bool test)
|
void Controller::setTestMode(bool test)
|
||||||
@@ -393,3 +409,12 @@ void Controller::removeConnection(const QString &userId)
|
|||||||
SettingsGroup("Accounts"_ls).remove(userId);
|
SettingsGroup("Accounts"_ls).remove(userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Controller::ssssSupported() const
|
||||||
|
{
|
||||||
|
#if __has_include("Quotient/e2ee/sssshandler.h")
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ class Controller : public QObject
|
|||||||
|
|
||||||
Q_PROPERTY(QStringList accountsLoading MEMBER m_accountsLoading NOTIFY accountsLoadingChanged)
|
Q_PROPERTY(QStringList accountsLoading MEMBER m_accountsLoading NOTIFY accountsLoadingChanged)
|
||||||
|
|
||||||
|
Q_PROPERTY(bool ssssSupported READ ssssSupported CONSTANT)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static Controller &instance();
|
static Controller &instance();
|
||||||
static Controller *create(QQmlEngine *engine, QJSEngine *)
|
static Controller *create(QQmlEngine *engine, QJSEngine *)
|
||||||
@@ -92,12 +94,16 @@ public:
|
|||||||
*/
|
*/
|
||||||
static void listenForNotifications();
|
static void listenForNotifications();
|
||||||
|
|
||||||
|
Q_INVOKABLE QString loadFileContent(const QString &path) const;
|
||||||
|
|
||||||
Quotient::AccountRegistry &accounts();
|
Quotient::AccountRegistry &accounts();
|
||||||
|
|
||||||
static void setTestMode(bool testMode);
|
static void setTestMode(bool testMode);
|
||||||
|
|
||||||
Q_INVOKABLE void removeConnection(const QString &userId);
|
Q_INVOKABLE void removeConnection(const QString &userId);
|
||||||
|
|
||||||
|
bool ssssSupported() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit Controller(QObject *parent = nullptr);
|
explicit Controller(QObject *parent = nullptr);
|
||||||
|
|
||||||
@@ -111,7 +117,7 @@ private:
|
|||||||
|
|
||||||
Quotient::AccountRegistry m_accountRegistry;
|
Quotient::AccountRegistry m_accountRegistry;
|
||||||
QStringList m_accountsLoading;
|
QStringList m_accountsLoading;
|
||||||
QMap<QString, QPointer<Quotient::Connection>> m_connectionsLoading;
|
QMap<QString, QPointer<NeoChatConnection>> m_connectionsLoading;
|
||||||
QString m_endpoint;
|
QString m_endpoint;
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
@@ -123,6 +129,6 @@ Q_SIGNALS:
|
|||||||
void errorOccured(const QString &error, const QString &detail);
|
void errorOccured(const QString &error, const QString &detail);
|
||||||
void connectionAdded(NeoChatConnection *connection);
|
void connectionAdded(NeoChatConnection *connection);
|
||||||
void connectionDropped(NeoChatConnection *connection);
|
void connectionDropped(NeoChatConnection *connection);
|
||||||
void activeConnectionChanged();
|
void activeConnectionChanged(NeoChatConnection *connection);
|
||||||
void accountsLoadingChanged();
|
void accountsLoadingChanged();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ ColumnLayout {
|
|||||||
model: root.connection.accountDataEventTypes
|
model: root.connection.accountDataEventTypes
|
||||||
delegate: FormCard.FormButtonDelegate {
|
delegate: FormCard.FormButtonDelegate {
|
||||||
text: modelData
|
text: modelData
|
||||||
onClicked: applicationWindow().pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/MessageSourceSheet.qml", {
|
onClicked: applicationWindow().pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'MessageSourceSheet'), {
|
||||||
sourceText: root.connection.accountDataJsonString(modelData)
|
sourceText: root.connection.accountDataJsonString(modelData)
|
||||||
}, {
|
}, {
|
||||||
title: i18nc("@title:window", "Event Source"),
|
title: i18nc("@title:window", "Event Source"),
|
||||||
16
src/devtools/CMakeLists.txt
Normal file
16
src/devtools/CMakeLists.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2024 James Graham <james.h.graham@protonmail.com>
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
|
||||||
|
qt_add_library(devtools STATIC)
|
||||||
|
qt_add_qml_module(devtools
|
||||||
|
URI org.kde.neochat.devtools
|
||||||
|
OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/src/org/kde/neochat/devtools
|
||||||
|
QML_FILES
|
||||||
|
DevtoolsPage.qml
|
||||||
|
AccountData.qml
|
||||||
|
DebugOptions.qml
|
||||||
|
FeatureFlagPage.qml
|
||||||
|
RoomData.qml
|
||||||
|
ServerData.qml
|
||||||
|
StateKeys.qml
|
||||||
|
)
|
||||||
42
src/devtools/DebugOptions.qml
Normal file
42
src/devtools/DebugOptions.qml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2024 James Graham <james.h.graham@protonmail.com>
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
|
||||||
|
import org.kde.kirigami as Kirigami
|
||||||
|
import org.kde.kirigamiaddons.formcard as FormCard
|
||||||
|
|
||||||
|
import org.kde.neochat
|
||||||
|
|
||||||
|
FormCard.FormCardPage {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
FormCard.FormCard {
|
||||||
|
Layout.topMargin: Kirigami.Units.largeSpacing
|
||||||
|
|
||||||
|
FormCard.FormCheckDelegate {
|
||||||
|
text: i18nc("@option:check", "Show hidden events in the timeline")
|
||||||
|
checked: Config.showAllEvents
|
||||||
|
|
||||||
|
onToggled: Config.showAllEvents = checked
|
||||||
|
}
|
||||||
|
FormCard.FormCheckDelegate {
|
||||||
|
id: roomAccountDataVisibleCheck
|
||||||
|
text: i18nc("@option:check Enable the matrix 'threads' feature", "Always allow device verification")
|
||||||
|
description: i18n("Allow the user to start a verification session with devices that were already verified")
|
||||||
|
checked: Config.alwaysVerifyDevice
|
||||||
|
|
||||||
|
onToggled: Config.alwaysVerifyDevice = checked
|
||||||
|
}
|
||||||
|
FormCard.FormCheckDelegate {
|
||||||
|
text: i18nc("@option:check", "Show focus in window header")
|
||||||
|
checked: Config.windowTitleFocus
|
||||||
|
|
||||||
|
onToggled: {
|
||||||
|
Config.windowTitleFocus = checked;
|
||||||
|
Config.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,17 +23,32 @@ FormCard.FormCardPage {
|
|||||||
header: QQC2.TabBar {
|
header: QQC2.TabBar {
|
||||||
id: tabBar
|
id: tabBar
|
||||||
|
|
||||||
|
readonly property real tabWidth: tabBar.width / tabBar.count
|
||||||
|
|
||||||
|
QQC2.TabButton {
|
||||||
|
text: i18nc("@title:tab", "Debug Options")
|
||||||
|
|
||||||
|
implicitWidth: tabBar.tabWidth
|
||||||
|
}
|
||||||
QQC2.TabButton {
|
QQC2.TabButton {
|
||||||
text: qsTr("Room Data")
|
text: qsTr("Room Data")
|
||||||
|
|
||||||
|
implicitWidth: tabBar.tabWidth
|
||||||
}
|
}
|
||||||
QQC2.TabButton {
|
QQC2.TabButton {
|
||||||
text: qsTr("Server Info")
|
text: qsTr("Server Info")
|
||||||
|
|
||||||
|
implicitWidth: tabBar.tabWidth
|
||||||
}
|
}
|
||||||
QQC2.TabButton {
|
QQC2.TabButton {
|
||||||
text: i18nc("@title:tab", "Account Data")
|
text: i18nc("@title:tab", "Account Data")
|
||||||
|
|
||||||
|
implicitWidth: tabBar.tabWidth
|
||||||
}
|
}
|
||||||
QQC2.TabButton {
|
QQC2.TabButton {
|
||||||
text: i18nc("@title:tab", "Feature Flags")
|
text: i18nc("@title:tab", "Feature Flags")
|
||||||
|
|
||||||
|
implicitWidth: tabBar.tabWidth
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,6 +57,7 @@ FormCard.FormCardPage {
|
|||||||
|
|
||||||
currentIndex: tabBar.currentIndex
|
currentIndex: tabBar.currentIndex
|
||||||
|
|
||||||
|
DebugOptions {}
|
||||||
RoomData {
|
RoomData {
|
||||||
room: root.room
|
room: root.room
|
||||||
connection: root.connection
|
connection: root.connection
|
||||||
@@ -8,7 +8,6 @@ import org.kde.kirigami as Kirigami
|
|||||||
import org.kde.kirigamiaddons.formcard as FormCard
|
import org.kde.kirigamiaddons.formcard as FormCard
|
||||||
|
|
||||||
import org.kde.neochat
|
import org.kde.neochat
|
||||||
import org.kde.neochat.config
|
|
||||||
|
|
||||||
FormCard.FormCardPage {
|
FormCard.FormCardPage {
|
||||||
id: root
|
id: root
|
||||||
@@ -23,5 +22,11 @@ FormCard.FormCardPage {
|
|||||||
|
|
||||||
onToggled: Config.threads = checked
|
onToggled: Config.threads = checked
|
||||||
}
|
}
|
||||||
|
FormCard.FormCheckDelegate {
|
||||||
|
text: i18nc("@option:check Enable the matrix 'secret backup' feature", "Secret Backup")
|
||||||
|
checked: Config.secretBackup
|
||||||
|
|
||||||
|
onToggled: Config.secretBackup = checked
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -25,14 +25,12 @@ ColumnLayout {
|
|||||||
text: i18n("Room")
|
text: i18n("Room")
|
||||||
textRole: "escapedDisplayName"
|
textRole: "escapedDisplayName"
|
||||||
valueRole: "roomId"
|
valueRole: "roomId"
|
||||||
displayText: roomListModel.data(roomListModel.index(currentIndex, 0), RoomListModel.DisplayNameRole)
|
displayText: RoomManager.roomListModel.data(RoomManager.roomListModel.index(currentIndex, 0), RoomListModel.EscapedDisplayNameRole)
|
||||||
model: RoomListModel {
|
model: RoomManager.roomListModel
|
||||||
id: roomListModel
|
currentIndex: 0
|
||||||
connection: root.connection
|
displayMode: FormCard.FormComboBoxDelegate.Page
|
||||||
}
|
Component.onCompleted: currentIndex = RoomManager.roomListModel.rowForRoom(root.room)
|
||||||
currentIndex: -1
|
onCurrentValueChanged: root.room = RoomManager.roomListModel.roomByAliasOrId(roomComboBox.currentValue)
|
||||||
Component.onCompleted: currentIndex = roomListModel.rowForRoom(root.room)
|
|
||||||
onCurrentValueChanged: root.room = roomListModel.roomByAliasOrId(roomComboBox.currentValue)
|
|
||||||
}
|
}
|
||||||
FormCard.FormTextDelegate {
|
FormCard.FormTextDelegate {
|
||||||
text: i18n("Room Id: %1", root.room.id)
|
text: i18n("Room Id: %1", root.room.id)
|
||||||
@@ -49,7 +47,7 @@ ColumnLayout {
|
|||||||
model: root.room.accountDataEventTypes
|
model: root.room.accountDataEventTypes
|
||||||
delegate: FormCard.FormButtonDelegate {
|
delegate: FormCard.FormButtonDelegate {
|
||||||
text: modelData
|
text: modelData
|
||||||
onClicked: applicationWindow().pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'MessageSourceSheet.qml'), {
|
onClicked: applicationWindow().pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'MessageSourceSheet'), {
|
||||||
sourceText: root.room.roomAcountDataJson(text)
|
sourceText: root.room.roomAcountDataJson(text)
|
||||||
}, {
|
}, {
|
||||||
title: i18n("Event Source"),
|
title: i18n("Event Source"),
|
||||||
@@ -77,14 +75,9 @@ ColumnLayout {
|
|||||||
description: i18ncp("'Event' being some JSON data, not something physically happening.", "%1 event of this type", "%1 events of this type", model.eventCount)
|
description: i18ncp("'Event' being some JSON data, not something physically happening.", "%1 event of this type", "%1 events of this type", model.eventCount)
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if (model.eventCount === 1) {
|
if (model.eventCount === 1) {
|
||||||
onClicked: applicationWindow().pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'MessageSourceSheet.qml'), {
|
openEventSource(model.type, model.stateKey);
|
||||||
sourceText: stateModel.stateEventJson(stateModel.index(model.index, 0))
|
|
||||||
}, {
|
|
||||||
title: i18n("Event Source"),
|
|
||||||
width: Kirigami.Units.gridUnit * 25
|
|
||||||
})
|
|
||||||
} else {
|
} else {
|
||||||
pageStack.pushDialogLayer(stateKeysComponent, {
|
pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat.devtools', 'StateKeys'), {
|
||||||
room: root.room,
|
room: root.room,
|
||||||
eventType: model.type
|
eventType: model.type
|
||||||
}, {
|
}, {
|
||||||
@@ -94,9 +87,17 @@ ColumnLayout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Component {
|
}
|
||||||
id: stateKeysComponent
|
function openEventSource(type: string, stateKey: string): void {
|
||||||
StateKeys {}
|
onClicked: applicationWindow().pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'MessageSourceSheet'), {
|
||||||
}
|
model: stateModel,
|
||||||
|
allowEdit: true,
|
||||||
|
room: root.room,
|
||||||
|
type: type,
|
||||||
|
stateKey: stateKey,
|
||||||
|
}, {
|
||||||
|
title: i18n("Event Source"),
|
||||||
|
width: Kirigami.Units.gridUnit * 25
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -38,7 +38,7 @@ ColumnLayout {
|
|||||||
}
|
}
|
||||||
FormCard.FormCard {
|
FormCard.FormCard {
|
||||||
Repeater {
|
Repeater {
|
||||||
model: room.connection.getSupportedRoomVersions()
|
model: root.connection.getSupportedRoomVersions()
|
||||||
|
|
||||||
delegate: FormCard.FormTextDelegate {
|
delegate: FormCard.FormTextDelegate {
|
||||||
text: modelData.id
|
text: modelData.id
|
||||||
@@ -31,13 +31,21 @@ FormCard.FormCardPage {
|
|||||||
|
|
||||||
delegate: FormCard.FormButtonDelegate {
|
delegate: FormCard.FormButtonDelegate {
|
||||||
text: model.stateKey
|
text: model.stateKey
|
||||||
onClicked: applicationWindow().pageStack.pushDialogLayer('qrc:/org/kde/neochat/qml/MessageSourceSheet.qml', {
|
onClicked: openEventSource(model.stateKey)
|
||||||
sourceText: stateKeysModel.stateEventJson(stateKeysModel.index(model.index, 0))
|
|
||||||
}, {
|
|
||||||
title: i18nc("@title:window", "Event Source"),
|
|
||||||
width: Kirigami.Units.gridUnit * 25
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function openEventSource(stateKey: string): void {
|
||||||
|
applicationWindow().pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'MessageSourceSheet'), {
|
||||||
|
model: stateKeysModel,
|
||||||
|
allowEdit: true,
|
||||||
|
room: root.room,
|
||||||
|
type: root.eventType,
|
||||||
|
stateKey: stateKey
|
||||||
|
}, {
|
||||||
|
title: i18nc("@title:window", "Event Source"),
|
||||||
|
width: Kirigami.Units.gridUnit * 25
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -40,6 +40,8 @@ public:
|
|||||||
Code, /**< A code section. */
|
Code, /**< A code section. */
|
||||||
Quote, /**< A quote section. */
|
Quote, /**< A quote section. */
|
||||||
File, /**< A message that is a file. */
|
File, /**< A message that is a file. */
|
||||||
|
Itinerary, /**< A preview for a file that can integrate with KDE itinerary. */
|
||||||
|
Pdf, /**< A preview for a PDF file. */
|
||||||
Poll, /**< The initial event for a poll. */
|
Poll, /**< The initial event for a poll. */
|
||||||
Location, /**< A location event. */
|
Location, /**< A location event. */
|
||||||
LiveLocation, /**< The initial event of a shared live location (i.e., the place where this is supposed to be shown in the timeline). */
|
LiveLocation, /**< The initial event of a shared live location (i.e., the place where this is supposed to be shown in the timeline). */
|
||||||
@@ -49,6 +51,7 @@ public:
|
|||||||
LinkPreview, /**< A preview of a URL in the message. */
|
LinkPreview, /**< A preview of a URL in the message. */
|
||||||
LinkPreviewLoad, /**< A loading dialog for a link preview. */
|
LinkPreviewLoad, /**< A loading dialog for a link preview. */
|
||||||
Edit, /**< A text edit for editing a message. */
|
Edit, /**< A text edit for editing a message. */
|
||||||
|
Verification, /**< A user verification session start message. */
|
||||||
Other, /**< Anything that cannot be classified as another type. */
|
Other, /**< Anything that cannot be classified as another type. */
|
||||||
};
|
};
|
||||||
Q_ENUM(Type);
|
Q_ENUM(Type);
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ public:
|
|||||||
* @brief Defines the room list categories a room can be assigned.
|
* @brief Defines the room list categories a room can be assigned.
|
||||||
*/
|
*/
|
||||||
enum Types {
|
enum Types {
|
||||||
Search = 0, /**< So we can show a search delegate if needed, e.g. collapsed mode. */
|
|
||||||
Invited, /**< The user has been invited to the room. */
|
Invited, /**< The user has been invited to the room. */
|
||||||
Favorite, /**< The room is set as a favourite. */
|
Favorite, /**< The room is set as a favourite. */
|
||||||
Direct, /**< The room is a direct chat. */
|
Direct, /**< The room is a direct chat. */
|
||||||
@@ -29,6 +28,7 @@ public:
|
|||||||
Deprioritized, /**< The room is set as low priority. */
|
Deprioritized, /**< The room is set as low priority. */
|
||||||
Space, /**< The room is a space. */
|
Space, /**< The room is a space. */
|
||||||
AddDirect, /**< So we can show the add friend delegate. */
|
AddDirect, /**< So we can show the add friend delegate. */
|
||||||
|
TypesCount, /**< Number of different types (this should always be last). */
|
||||||
};
|
};
|
||||||
Q_ENUM(Types);
|
Q_ENUM(Types);
|
||||||
|
|
||||||
@@ -67,8 +67,6 @@ public:
|
|||||||
return i18n("Low priority");
|
return i18n("Low priority");
|
||||||
case NeoChatRoomType::Space:
|
case NeoChatRoomType::Space:
|
||||||
return i18n("Spaces");
|
return i18n("Spaces");
|
||||||
case NeoChatRoomType::Search:
|
|
||||||
return i18n("Search");
|
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@@ -88,8 +86,6 @@ public:
|
|||||||
return QStringLiteral("object-order-lower");
|
return QStringLiteral("object-order-lower");
|
||||||
case NeoChatRoomType::Space:
|
case NeoChatRoomType::Space:
|
||||||
return QStringLiteral("group");
|
return QStringLiteral("group");
|
||||||
case NeoChatRoomType::Search:
|
|
||||||
return QStringLiteral("search");
|
|
||||||
default:
|
default:
|
||||||
return QStringLiteral("tools-report-bug");
|
return QStringLiteral("tools-report-bug");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -280,6 +280,22 @@ QString EventHandler::getPlainBody(bool stripNewlines) const
|
|||||||
return getBody(m_event, Qt::PlainText, stripNewlines);
|
return getBody(m_event, Qt::PlainText, stripNewlines);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString EventHandler::getMarkdownBody() const
|
||||||
|
{
|
||||||
|
if (m_event == nullptr) {
|
||||||
|
qCWarning(EventHandling) << "getMarkdownBody called with m_event set to nullptr.";
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_event->is<RoomMessageEvent>()) {
|
||||||
|
qCWarning(EventHandling) << "getMarkdownBody called when m_event isn't a RoomMessageEvent.";
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto roomMessageEvent = eventCast<const RoomMessageEvent>(m_event);
|
||||||
|
return roomMessageEvent->plainBody();
|
||||||
|
}
|
||||||
|
|
||||||
QString EventHandler::getBody(const Quotient::RoomEvent *event, Qt::TextFormat format, bool stripNewlines) const
|
QString EventHandler::getBody(const Quotient::RoomEvent *event, Qt::TextFormat format, bool stripNewlines) const
|
||||||
{
|
{
|
||||||
if (event->isRedacted()) {
|
if (event->isRedacted()) {
|
||||||
@@ -640,6 +656,7 @@ QVariantMap EventHandler::getMediaInfoForEvent(const Quotient::RoomEvent *event)
|
|||||||
|
|
||||||
// Get the file info for the event.
|
// Get the file info for the event.
|
||||||
const EventContent::FileInfo *fileInfo;
|
const EventContent::FileInfo *fileInfo;
|
||||||
|
bool isSticker = false;
|
||||||
if (event->is<RoomMessageEvent>()) {
|
if (event->is<RoomMessageEvent>()) {
|
||||||
auto roomMessageEvent = eventCast<const RoomMessageEvent>(event);
|
auto roomMessageEvent = eventCast<const RoomMessageEvent>(event);
|
||||||
if (!roomMessageEvent->hasFileContent()) {
|
if (!roomMessageEvent->hasFileContent()) {
|
||||||
@@ -649,14 +666,15 @@ QVariantMap EventHandler::getMediaInfoForEvent(const Quotient::RoomEvent *event)
|
|||||||
} else if (event->is<StickerEvent>()) {
|
} else if (event->is<StickerEvent>()) {
|
||||||
auto stickerEvent = eventCast<const StickerEvent>(event);
|
auto stickerEvent = eventCast<const StickerEvent>(event);
|
||||||
fileInfo = &stickerEvent->image();
|
fileInfo = &stickerEvent->image();
|
||||||
|
isSticker = true;
|
||||||
} else {
|
} else {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
return getMediaInfoFromFileInfo(fileInfo, eventId);
|
return getMediaInfoFromFileInfo(fileInfo, eventId, false, isSticker);
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariantMap EventHandler::getMediaInfoFromFileInfo(const EventContent::FileInfo *fileInfo, const QString &eventId, bool isThumbnail) const
|
QVariantMap EventHandler::getMediaInfoFromFileInfo(const EventContent::FileInfo *fileInfo, const QString &eventId, bool isThumbnail, bool isSticker) const
|
||||||
{
|
{
|
||||||
QVariantMap mediaInfo;
|
QVariantMap mediaInfo;
|
||||||
|
|
||||||
@@ -683,6 +701,8 @@ QVariantMap EventHandler::getMediaInfoFromFileInfo(const EventContent::FileInfo
|
|||||||
// Add media size if available.
|
// Add media size if available.
|
||||||
mediaInfo["size"_ls] = fileInfo->payloadSize;
|
mediaInfo["size"_ls] = fileInfo->payloadSize;
|
||||||
|
|
||||||
|
mediaInfo["isSticker"_ls] = isSticker;
|
||||||
|
|
||||||
// Add parameter depending on media type.
|
// Add parameter depending on media type.
|
||||||
if (mimeType.name().contains(QStringLiteral("image"))) {
|
if (mimeType.name().contains(QStringLiteral("image"))) {
|
||||||
if (auto castInfo = static_cast<const EventContent::ImageContent *>(fileInfo)) {
|
if (auto castInfo = static_cast<const EventContent::ImageContent *>(fileInfo)) {
|
||||||
|
|||||||
@@ -185,6 +185,13 @@ public:
|
|||||||
*/
|
*/
|
||||||
QString getPlainBody(bool stripNewlines = false) const;
|
QString getPlainBody(bool stripNewlines = false) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Output the original body for the message content, useful for editing the original message.
|
||||||
|
*
|
||||||
|
* The event type must be a room message event.
|
||||||
|
*/
|
||||||
|
QString getMarkdownBody() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Output a generic string for the message content ready for display.
|
* @brief Output a generic string for the message content ready for display.
|
||||||
*
|
*
|
||||||
@@ -222,6 +229,7 @@ public:
|
|||||||
* - width - The width in pixels of the audio media.
|
* - width - The width in pixels of the audio media.
|
||||||
* - height - The height in pixels of the audio media.
|
* - height - The height in pixels of the audio media.
|
||||||
* - tempInfo - mediaInfo (with the same properties as this except no tempInfo) for a temporary image while the file downloads.
|
* - tempInfo - mediaInfo (with the same properties as this except no tempInfo) for a temporary image while the file downloads.
|
||||||
|
* - isSticker - Whether the image is a sticker or not
|
||||||
*/
|
*/
|
||||||
QVariantMap getMediaInfo() const;
|
QVariantMap getMediaInfo() const;
|
||||||
|
|
||||||
@@ -313,6 +321,7 @@ public:
|
|||||||
* - width - The width in pixels of the audio media.
|
* - width - The width in pixels of the audio media.
|
||||||
* - height - The height in pixels of the audio media.
|
* - height - The height in pixels of the audio media.
|
||||||
* - tempInfo - mediaInfo (with the same properties as this except no tempInfo) for a temporary image while the file downloads.
|
* - tempInfo - mediaInfo (with the same properties as this except no tempInfo) for a temporary image while the file downloads.
|
||||||
|
* - isSticker - Whether the image is a sticker or not
|
||||||
*/
|
*/
|
||||||
QVariantMap getReplyMediaInfo() const;
|
QVariantMap getReplyMediaInfo() const;
|
||||||
|
|
||||||
@@ -398,5 +407,6 @@ private:
|
|||||||
QString getMessageBody(const Quotient::RoomMessageEvent &event, Qt::TextFormat format, bool stripNewlines) const;
|
QString getMessageBody(const Quotient::RoomMessageEvent &event, Qt::TextFormat format, bool stripNewlines) const;
|
||||||
|
|
||||||
QVariantMap getMediaInfoForEvent(const Quotient::RoomEvent *event) const;
|
QVariantMap getMediaInfoForEvent(const Quotient::RoomEvent *event) const;
|
||||||
QVariantMap getMediaInfoFromFileInfo(const Quotient::EventContent::FileInfo *fileInfo, const QString &eventId, bool isThumbnail = false) const;
|
QVariantMap
|
||||||
|
getMediaInfoFromFileInfo(const Quotient::EventContent::FileInfo *fileInfo, const QString &eventId, bool isThumbnail = false, bool isSticker = false) const;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -74,6 +74,9 @@ void ImagePackEventContent::fillJson(QJsonObject *o) const
|
|||||||
}
|
}
|
||||||
imageJson["usage"_ls] = usageJson;
|
imageJson["usage"_ls] = usageJson;
|
||||||
}
|
}
|
||||||
|
if (image.info.has_value()) {
|
||||||
|
imageJson["info"_ls] = Quotient::EventContent::toInfoJson(*image.info);
|
||||||
|
}
|
||||||
imagesJson[image.shortcode] = imageJson;
|
imagesJson[image.shortcode] = imageJson;
|
||||||
}
|
}
|
||||||
(*o)["images"_ls] = imagesJson;
|
(*o)["images"_ls] = imagesJson;
|
||||||
|
|||||||
@@ -89,6 +89,4 @@ public:
|
|||||||
QUO_EVENT(ImagePackEvent, "im.ponies.room_emotes")
|
QUO_EVENT(ImagePackEvent, "im.ponies.room_emotes")
|
||||||
using KeyedStateEventBase::KeyedStateEventBase;
|
using KeyedStateEventBase::KeyedStateEventBase;
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_EVENT_TYPE(ImagePackEvent)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,5 +40,4 @@ public:
|
|||||||
*/
|
*/
|
||||||
QJsonArray allow() const;
|
QJsonArray allow() const;
|
||||||
};
|
};
|
||||||
REGISTER_EVENT_TYPE(JoinRulesEvent)
|
|
||||||
}
|
}
|
||||||
|
|||||||
36
src/fakerunner.cpp
Normal file
36
src/fakerunner.cpp
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2024 Joshua Goins <josh@redstrate.com>
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||||
|
|
||||||
|
#include "fakerunner.h"
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QDBusMetaType>
|
||||||
|
|
||||||
|
Q_SCRIPTABLE RemoteActions FakeRunner::Actions()
|
||||||
|
{
|
||||||
|
QCoreApplication::quit();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_SCRIPTABLE RemoteMatches FakeRunner::Match(const QString &searchTerm)
|
||||||
|
{
|
||||||
|
QCoreApplication::quit();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_SCRIPTABLE void FakeRunner::Run(const QString &id, const QString &actionId)
|
||||||
|
{
|
||||||
|
QCoreApplication::quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
FakeRunner::FakeRunner()
|
||||||
|
: QObject()
|
||||||
|
{
|
||||||
|
qDBusRegisterMetaType<RemoteMatch>();
|
||||||
|
qDBusRegisterMetaType<RemoteMatches>();
|
||||||
|
qDBusRegisterMetaType<RemoteAction>();
|
||||||
|
qDBusRegisterMetaType<RemoteActions>();
|
||||||
|
qDBusRegisterMetaType<RemoteImage>();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "moc_fakerunner.cpp"
|
||||||
31
src/fakerunner.h
Normal file
31
src/fakerunner.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2024 Joshua Goins <josh@redstrate.com>
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QDBusContext>
|
||||||
|
|
||||||
|
#include "runner.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a close-to-identical copy of the regular Runner interface,
|
||||||
|
* only used when activated for push notifications. This stubs it out so
|
||||||
|
* Plasma Search and Kickoff doesn't accidentally activate the push notification
|
||||||
|
* service.
|
||||||
|
*
|
||||||
|
* @sa Runner
|
||||||
|
*/
|
||||||
|
class FakeRunner : public QObject, protected QDBusContext
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_CLASSINFO("D-Bus Interface", "org.kde.krunner1")
|
||||||
|
|
||||||
|
public:
|
||||||
|
Q_SCRIPTABLE RemoteActions Actions();
|
||||||
|
|
||||||
|
Q_SCRIPTABLE RemoteMatches Match(const QString &searchTerm);
|
||||||
|
|
||||||
|
Q_SCRIPTABLE void Run(const QString &id, const QString &actionId);
|
||||||
|
|
||||||
|
FakeRunner();
|
||||||
|
};
|
||||||
@@ -41,6 +41,12 @@ FileType::~FileType() noexcept
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FileType &FileType::instance()
|
||||||
|
{
|
||||||
|
static FileType _instance;
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
|
||||||
QMimeType FileType::mimeTypeForName(const QString &nameOrAlias) const
|
QMimeType FileType::mimeTypeForName(const QString &nameOrAlias) const
|
||||||
{
|
{
|
||||||
Q_D(const FileType);
|
Q_D(const FileType);
|
||||||
@@ -113,4 +119,10 @@ QStringList FileType::supportedAnimatedImageFormats() const
|
|||||||
return d->supportedAnimatedImageFormats;
|
return d->supportedAnimatedImageFormats;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FileType::fileHasImage(const QUrl &file) const
|
||||||
|
{
|
||||||
|
const auto mimeType = mimeTypeForFile(file.toString());
|
||||||
|
return mimeType.isValid() && supportedImageFormats().contains(mimeType.preferredSuffix());
|
||||||
|
}
|
||||||
|
|
||||||
#include "moc_filetype.cpp"
|
#include "moc_filetype.cpp"
|
||||||
|
|||||||
@@ -41,8 +41,13 @@ class FileType : public QObject
|
|||||||
Q_PROPERTY(QStringList supportedAnimatedImageFormats READ supportedAnimatedImageFormats CONSTANT FINAL)
|
Q_PROPERTY(QStringList supportedAnimatedImageFormats READ supportedAnimatedImageFormats CONSTANT FINAL)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit FileType(QObject *parent = nullptr);
|
|
||||||
~FileType();
|
~FileType();
|
||||||
|
static FileType &instance();
|
||||||
|
static FileType *create(QQmlEngine *engine, QJSEngine *)
|
||||||
|
{
|
||||||
|
engine->setObjectOwnership(&instance(), QQmlEngine::CppOwnership);
|
||||||
|
return &instance();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns a MIME type for nameOrAlias or an invalid one if none found.
|
* @brief Returns a MIME type for nameOrAlias or an invalid one if none found.
|
||||||
@@ -120,7 +125,11 @@ public:
|
|||||||
QStringList supportedImageFormats() const;
|
QStringList supportedImageFormats() const;
|
||||||
QStringList supportedAnimatedImageFormats() const;
|
QStringList supportedAnimatedImageFormats() const;
|
||||||
|
|
||||||
|
bool fileHasImage(const QUrl &file) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
explicit FileType(QObject *parent = nullptr);
|
||||||
|
|
||||||
const QScopedPointer<FileTypePrivate> d_ptr;
|
const QScopedPointer<FileTypePrivate> d_ptr;
|
||||||
Q_DECLARE_PRIVATE(FileType)
|
Q_DECLARE_PRIVATE(FileType)
|
||||||
Q_DISABLE_COPY(FileType)
|
Q_DISABLE_COPY(FileType)
|
||||||
|
|||||||
56
src/foreigntypes.h
Normal file
56
src/foreigntypes.h
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2024 Tobias Fella <tobias.fella@kde.org>
|
||||||
|
// SPDX-License-Identifier: LGPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QQmlEngine>
|
||||||
|
|
||||||
|
#include <Quotient/accountregistry.h>
|
||||||
|
#include <Quotient/keyverificationsession.h>
|
||||||
|
#if __has_include("Quotient/e2ee/sssshandler.h")
|
||||||
|
#include <Quotient/e2ee/sssshandler.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "controller.h"
|
||||||
|
#include "neochatconfig.h"
|
||||||
|
|
||||||
|
struct ForeignConfig {
|
||||||
|
Q_GADGET
|
||||||
|
QML_FOREIGN(NeoChatConfig)
|
||||||
|
QML_NAMED_ELEMENT(Config)
|
||||||
|
QML_SINGLETON
|
||||||
|
public:
|
||||||
|
static NeoChatConfig *create(QQmlEngine *, QJSEngine *)
|
||||||
|
{
|
||||||
|
QQmlEngine::setObjectOwnership(NeoChatConfig::self(), QQmlEngine::CppOwnership);
|
||||||
|
return NeoChatConfig::self();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ForeignAccountRegistry {
|
||||||
|
Q_GADGET
|
||||||
|
QML_FOREIGN(Quotient::AccountRegistry)
|
||||||
|
QML_NAMED_ELEMENT(AccountRegistry)
|
||||||
|
QML_SINGLETON
|
||||||
|
public:
|
||||||
|
static Quotient::AccountRegistry *create(QQmlEngine *, QJSEngine *)
|
||||||
|
{
|
||||||
|
QQmlEngine::setObjectOwnership(&Controller::instance().accounts(), QQmlEngine::CppOwnership);
|
||||||
|
return &Controller::instance().accounts();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ForeignKeyVerificationSession {
|
||||||
|
Q_GADGET
|
||||||
|
QML_FOREIGN(Quotient::KeyVerificationSession)
|
||||||
|
QML_NAMED_ELEMENT(KeyVerificationSession)
|
||||||
|
QML_UNCREATABLE("")
|
||||||
|
};
|
||||||
|
|
||||||
|
#if __has_include("Quotient/e2ee/sssshandler.h")
|
||||||
|
struct ForeignSSSSHandler {
|
||||||
|
Q_GADGET
|
||||||
|
QML_FOREIGN(Quotient::SSSSHandler)
|
||||||
|
QML_NAMED_ELEMENT(SSSSHandler)
|
||||||
|
};
|
||||||
|
#endif
|
||||||
@@ -8,34 +8,22 @@
|
|||||||
#include <Quotient/events/roommessageevent.h>
|
#include <Quotient/events/roommessageevent.h>
|
||||||
|
|
||||||
#include "neochatconfig.h"
|
#include "neochatconfig.h"
|
||||||
#include "neochatroom.h"
|
#include "neochatconnection.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
using namespace Quotient;
|
using namespace Quotient;
|
||||||
|
|
||||||
LinkPreviewer::LinkPreviewer(const NeoChatRoom *room, const Quotient::RoomMessageEvent *event, QObject *parent)
|
LinkPreviewer::LinkPreviewer(const QUrl &url, QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_currentRoom(room)
|
|
||||||
, m_event(event)
|
|
||||||
, m_loaded(false)
|
, m_loaded(false)
|
||||||
, m_url(linkPreview(event))
|
, m_url(url)
|
||||||
{
|
{
|
||||||
connect(this, &LinkPreviewer::urlChanged, this, &LinkPreviewer::emptyChanged);
|
Q_ASSERT(dynamic_cast<Connection *>(this->parent()));
|
||||||
|
|
||||||
if (m_event != nullptr && m_currentRoom != nullptr) {
|
connect(this, &LinkPreviewer::urlChanged, this, &LinkPreviewer::emptyChanged);
|
||||||
loadUrlPreview();
|
|
||||||
connect(m_currentRoom, &NeoChatRoom::urlPreviewEnabledChanged, this, &LinkPreviewer::loadUrlPreview);
|
|
||||||
// Make sure that we react to edits
|
|
||||||
connect(m_currentRoom, &NeoChatRoom::replacedEvent, this, [this](const Quotient::RoomEvent *newEvent) {
|
|
||||||
if (m_event->id() == newEvent->id()) {
|
|
||||||
m_event = eventCast<const Quotient::RoomMessageEvent>(newEvent);
|
|
||||||
m_url = linkPreview(m_event);
|
|
||||||
Q_EMIT urlChanged();
|
|
||||||
loadUrlPreview();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
connect(NeoChatConfig::self(), &NeoChatConfig::ShowLinkPreviewChanged, this, &LinkPreviewer::loadUrlPreview);
|
connect(NeoChatConfig::self(), &NeoChatConfig::ShowLinkPreviewChanged, this, &LinkPreviewer::loadUrlPreview);
|
||||||
|
|
||||||
|
loadUrlPreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LinkPreviewer::loaded() const
|
bool LinkPreviewer::loaded() const
|
||||||
@@ -65,14 +53,14 @@ QUrl LinkPreviewer::url() const
|
|||||||
|
|
||||||
void LinkPreviewer::loadUrlPreview()
|
void LinkPreviewer::loadUrlPreview()
|
||||||
{
|
{
|
||||||
if (!m_currentRoom || !NeoChatConfig::showLinkPreview() || !m_currentRoom->urlPreviewEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (m_url.scheme() == QStringLiteral("https")) {
|
if (m_url.scheme() == QStringLiteral("https")) {
|
||||||
m_loaded = false;
|
m_loaded = false;
|
||||||
Q_EMIT loadedChanged();
|
Q_EMIT loadedChanged();
|
||||||
|
|
||||||
auto conn = m_currentRoom->connection();
|
auto conn = dynamic_cast<Connection *>(this->parent());
|
||||||
|
if (conn == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
GetUrlPreviewJob *job = conn->callApi<GetUrlPreviewJob>(m_url);
|
GetUrlPreviewJob *job = conn->callApi<GetUrlPreviewJob>(m_url);
|
||||||
|
|
||||||
connect(job, &BaseJob::success, this, [this, job, conn]() {
|
connect(job, &BaseJob::success, this, [this, job, conn]() {
|
||||||
|
|||||||
@@ -53,14 +53,15 @@ class LinkPreviewer : public QObject
|
|||||||
Q_PROPERTY(QUrl imageSource READ imageSource NOTIFY imageSourceChanged)
|
Q_PROPERTY(QUrl imageSource READ imageSource NOTIFY imageSourceChanged)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Whether the there is a link to preview.
|
* @brief Whether there is a link to preview.
|
||||||
*
|
*
|
||||||
* A linkPreviwer is empty if the URL is empty.
|
* A linkPreviwer is empty if the URL is empty.
|
||||||
*/
|
*/
|
||||||
Q_PROPERTY(bool empty READ empty NOTIFY emptyChanged)
|
Q_PROPERTY(bool empty READ empty NOTIFY emptyChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit LinkPreviewer(const NeoChatRoom *room = nullptr, const Quotient::RoomMessageEvent *event = nullptr, QObject *parent = nullptr);
|
LinkPreviewer() = default;
|
||||||
|
explicit LinkPreviewer(const QUrl &url, QObject *parent = nullptr);
|
||||||
|
|
||||||
[[nodiscard]] QUrl url() const;
|
[[nodiscard]] QUrl url() const;
|
||||||
[[nodiscard]] bool loaded() const;
|
[[nodiscard]] bool loaded() const;
|
||||||
@@ -76,18 +77,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
static bool hasPreviewableLinks(const Quotient::RoomMessageEvent *event);
|
static bool hasPreviewableLinks(const Quotient::RoomMessageEvent *event);
|
||||||
|
|
||||||
private:
|
|
||||||
const NeoChatRoom *m_currentRoom;
|
|
||||||
const Quotient::RoomMessageEvent *m_event;
|
|
||||||
|
|
||||||
bool m_loaded;
|
|
||||||
QString m_title = QString();
|
|
||||||
QString m_description = QString();
|
|
||||||
QUrl m_imageSource = QUrl();
|
|
||||||
QUrl m_url;
|
|
||||||
|
|
||||||
void loadUrlPreview();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Return the link to be previewed from the given event.
|
* @brief Return the link to be previewed from the given event.
|
||||||
*
|
*
|
||||||
@@ -96,6 +85,15 @@ private:
|
|||||||
*/
|
*/
|
||||||
static QUrl linkPreview(const Quotient::RoomMessageEvent *event);
|
static QUrl linkPreview(const Quotient::RoomMessageEvent *event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_loaded;
|
||||||
|
QString m_title = QString();
|
||||||
|
QString m_description = QString();
|
||||||
|
QUrl m_imageSource = QUrl();
|
||||||
|
QUrl m_url;
|
||||||
|
|
||||||
|
void loadUrlPreview();
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void loadedChanged();
|
void loadedChanged();
|
||||||
void titleChanged();
|
void titleChanged();
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
#include "login.h"
|
#include "login.h"
|
||||||
|
|
||||||
#include <Quotient/accountregistry.h>
|
#include <Quotient/accountregistry.h>
|
||||||
#include <Quotient/connection.h>
|
|
||||||
#include <Quotient/qt_connection_util.h>
|
#include <Quotient/qt_connection_util.h>
|
||||||
|
|
||||||
#include "controller.h"
|
#include "controller.h"
|
||||||
@@ -54,7 +53,7 @@ void LoginHelper::init()
|
|||||||
m_connection = new NeoChatConnection();
|
m_connection = new NeoChatConnection();
|
||||||
}
|
}
|
||||||
m_connection->resolveServer(m_matrixId);
|
m_connection->resolveServer(m_matrixId);
|
||||||
connectSingleShot(m_connection, &Connection::loginFlowsChanged, this, [this]() {
|
connectSingleShot(m_connection.get(), &Connection::loginFlowsChanged, this, [this]() {
|
||||||
setHomeserverReachable(true);
|
setHomeserverReachable(true);
|
||||||
m_testing = false;
|
m_testing = false;
|
||||||
Q_EMIT testingChanged();
|
Q_EMIT testingChanged();
|
||||||
@@ -100,7 +99,7 @@ void LoginHelper::init()
|
|||||||
Q_EMIT Controller::instance().errorOccured(i18n("Network Error"), std::move(error));
|
Q_EMIT Controller::instance().errorOccured(i18n("Network Error"), std::move(error));
|
||||||
});
|
});
|
||||||
|
|
||||||
connectSingleShot(m_connection, &Connection::syncDone, this, [this]() {
|
connectSingleShot(m_connection.get(), &Connection::syncDone, this, [this]() {
|
||||||
Q_EMIT loaded();
|
Q_EMIT loaded();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -182,7 +181,7 @@ QUrl LoginHelper::ssoUrl() const
|
|||||||
void LoginHelper::loginWithSso()
|
void LoginHelper::loginWithSso()
|
||||||
{
|
{
|
||||||
m_connection->resolveServer(m_matrixId);
|
m_connection->resolveServer(m_matrixId);
|
||||||
connectSingleShot(m_connection, &Connection::loginFlowsChanged, this, [this]() {
|
connectSingleShot(m_connection.get(), &Connection::loginFlowsChanged, this, [this]() {
|
||||||
SsoSession *session = m_connection->prepareForSso(m_deviceName);
|
SsoSession *session = m_connection->prepareForSso(m_deviceName);
|
||||||
m_ssoUrl = session->ssoUrl();
|
m_ssoUrl = session->ssoUrl();
|
||||||
Q_EMIT ssoUrlChanged();
|
Q_EMIT ssoUrlChanged();
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ private:
|
|||||||
QString m_deviceName;
|
QString m_deviceName;
|
||||||
bool m_supportsSso = false;
|
bool m_supportsSso = false;
|
||||||
bool m_supportsPassword = false;
|
bool m_supportsPassword = false;
|
||||||
NeoChatConnection *m_connection = nullptr;
|
QPointer<NeoChatConnection> m_connection;
|
||||||
QUrl m_ssoUrl;
|
QUrl m_ssoUrl;
|
||||||
bool m_testing = false;
|
bool m_testing = false;
|
||||||
bool m_isLoggingIn = false;
|
bool m_isLoggingIn = false;
|
||||||
|
|||||||
23
src/login/CMakeLists.txt
Normal file
23
src/login/CMakeLists.txt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2024 James Graham <james.h.graham@protonmail.com>
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
|
||||||
|
qt_add_library(login STATIC)
|
||||||
|
qt_add_qml_module(login
|
||||||
|
URI org.kde.neochat.login
|
||||||
|
OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/src/org/kde/neochat/login
|
||||||
|
QML_FILES
|
||||||
|
WelcomePage.qml
|
||||||
|
LoginStep.qml
|
||||||
|
Captcha.qml
|
||||||
|
Email.qml
|
||||||
|
Homeserver.qml
|
||||||
|
Loading.qml
|
||||||
|
Login.qml
|
||||||
|
LoginMethod.qml
|
||||||
|
LoginRegister.qml
|
||||||
|
Password.qml
|
||||||
|
RegisterPassword.qml
|
||||||
|
Sso.qml
|
||||||
|
Terms.qml
|
||||||
|
Username.qml
|
||||||
|
)
|
||||||
@@ -43,6 +43,6 @@ LoginStep {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
previousAction: Kirigami.Action {
|
previousAction: Kirigami.Action {
|
||||||
onTriggered: root.processed("Username.qml")
|
onTriggered: root.processed("Username")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -55,6 +55,6 @@ LoginStep {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
previousAction: Kirigami.Action {
|
previousAction: Kirigami.Action {
|
||||||
onTriggered: root.processed("Username.qml")
|
onTriggered: root.processed("Username")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -40,9 +40,9 @@ LoginStep {
|
|||||||
nextAction: Kirigami.Action {
|
nextAction: Kirigami.Action {
|
||||||
text: Registration.testing ? i18n("Loading") : null
|
text: Registration.testing ? i18n("Loading") : null
|
||||||
enabled: Registration.status > Registration.ServerNoRegistration
|
enabled: Registration.status > Registration.ServerNoRegistration
|
||||||
onTriggered: root.processed("Username.qml")
|
onTriggered: root.processed("Username")
|
||||||
}
|
}
|
||||||
previousAction: Kirigami.Action {
|
previousAction: Kirigami.Action {
|
||||||
onTriggered: root.processed("LoginRegister.qml")
|
onTriggered: root.processed("LoginRegister")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -38,18 +38,18 @@ LoginStep {
|
|||||||
text: LoginHelper.isLoggedIn ? i18n("Already logged in") : (LoginHelper.testing && matrixIdField.acceptableInput) ? i18n("Loading…") : i18nc("@action:button", "Continue")
|
text: LoginHelper.isLoggedIn ? i18n("Already logged in") : (LoginHelper.testing && matrixIdField.acceptableInput) ? i18n("Loading…") : i18nc("@action:button", "Continue")
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
if (LoginHelper.supportsSso && LoginHelper.supportsPassword) {
|
if (LoginHelper.supportsSso && LoginHelper.supportsPassword) {
|
||||||
processed("LoginMethod.qml");
|
processed("LoginMethod");
|
||||||
} else if (LoginHelper.supportsSso) {
|
} else if (LoginHelper.supportsSso) {
|
||||||
processed("Sso.qml");
|
processed("Sso");
|
||||||
} else {
|
} else {
|
||||||
processed("Password.qml");
|
processed("Password");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
enabled: LoginHelper.homeserverReachable
|
enabled: LoginHelper.homeserverReachable
|
||||||
}
|
}
|
||||||
previousAction: Kirigami.Action {
|
previousAction: Kirigami.Action {
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
root.processed("LoginRegister.qml");
|
root.processed("LoginRegister");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -18,12 +18,12 @@ LoginStep {
|
|||||||
FormCard.FormButtonDelegate {
|
FormCard.FormButtonDelegate {
|
||||||
id: loginPasswordButton
|
id: loginPasswordButton
|
||||||
text: i18nc("@action:button", "Login with password")
|
text: i18nc("@action:button", "Login with password")
|
||||||
onClicked: processed("Password.qml")
|
onClicked: processed("Password")
|
||||||
}
|
}
|
||||||
|
|
||||||
FormCard.FormButtonDelegate {
|
FormCard.FormButtonDelegate {
|
||||||
id: loginSsoButton
|
id: loginSsoButton
|
||||||
text: i18nc("@action:button", "Login with single sign-on")
|
text: i18nc("@action:button", "Login with single sign-on")
|
||||||
onClicked: processed("Sso.qml")
|
onClicked: processed("Sso")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,13 +22,13 @@ LoginStep {
|
|||||||
FormCard.FormButtonDelegate {
|
FormCard.FormButtonDelegate {
|
||||||
id: loginButton
|
id: loginButton
|
||||||
text: i18nc("@action:button", "Login")
|
text: i18nc("@action:button", "Login")
|
||||||
onClicked: root.processed("Login.qml")
|
onClicked: root.processed("Login")
|
||||||
}
|
}
|
||||||
|
|
||||||
FormCard.FormDelegateSeparator {}
|
FormCard.FormDelegateSeparator {}
|
||||||
|
|
||||||
FormCard.FormButtonDelegate {
|
FormCard.FormButtonDelegate {
|
||||||
text: i18nc("@action:button", "Register")
|
text: i18nc("@action:button", "Register")
|
||||||
onClicked: root.processed("Homeserver.qml")
|
onClicked: root.processed("Homeserver")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -15,7 +15,7 @@ LoginStep {
|
|||||||
Connections {
|
Connections {
|
||||||
target: LoginHelper
|
target: LoginHelper
|
||||||
function onConnected() {
|
function onConnected() {
|
||||||
processed("Loading.qml");
|
processed("Loading");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,6 +46,6 @@ LoginStep {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
previousAction: Kirigami.Action {
|
previousAction: Kirigami.Action {
|
||||||
onTriggered: processed("Login.qml")
|
onTriggered: processed("Login")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -47,6 +47,6 @@ LoginStep {
|
|||||||
}
|
}
|
||||||
|
|
||||||
previousAction: Kirigami.Action {
|
previousAction: Kirigami.Action {
|
||||||
onTriggered: root.processed("Username.qml")
|
onTriggered: root.processed("Username")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,7 +22,7 @@ LoginStep {
|
|||||||
UrlHelper.openUrl(LoginHelper.ssoUrl);
|
UrlHelper.openUrl(LoginHelper.ssoUrl);
|
||||||
}
|
}
|
||||||
function onConnected() {
|
function onConnected() {
|
||||||
processed("Loading.qml");
|
processed("Loading");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ LoginStep {
|
|||||||
}
|
}
|
||||||
|
|
||||||
previousAction: Kirigami.Action {
|
previousAction: Kirigami.Action {
|
||||||
onTriggered: processed("Login.qml")
|
onTriggered: processed("Login")
|
||||||
}
|
}
|
||||||
|
|
||||||
nextAction: Kirigami.Action {
|
nextAction: Kirigami.Action {
|
||||||
@@ -33,6 +33,6 @@ LoginStep {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
previousAction: Kirigami.Action {
|
previousAction: Kirigami.Action {
|
||||||
onTriggered: root.processed("Username.qml")
|
onTriggered: root.processed("Username")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,11 +37,11 @@ LoginStep {
|
|||||||
nextAction: Kirigami.Action {
|
nextAction: Kirigami.Action {
|
||||||
text: Registration.status === Registration.TestingUsername ? i18n("Loading") : null
|
text: Registration.status === Registration.TestingUsername ? i18n("Loading") : null
|
||||||
|
|
||||||
onTriggered: root.processed("RegisterPassword.qml")
|
onTriggered: root.processed("RegisterPassword")
|
||||||
enabled: Registration.status === Registration.Ready
|
enabled: Registration.status === Registration.Ready
|
||||||
}
|
}
|
||||||
|
|
||||||
previousAction: Kirigami.Action {
|
previousAction: Kirigami.Action {
|
||||||
onTriggered: root.processed("Homeserver.qml")
|
onTriggered: root.processed("Homeserver")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user