Compare commits

..

1 Commits

Author SHA1 Message Date
Carl Schwan
29cc585b06 PoC: syntax highlighting
Signed-off-by: Carl Schwan <carl@carlschwan.eu>
2023-09-12 17:52:18 +02:00
267 changed files with 15357 additions and 20594 deletions

View File

@@ -3,8 +3,12 @@
include: include:
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/reuse-lint.yml - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/reuse-lint.yml
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/android.yml
# - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/android-qt6.yml # - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/android-qt6.yml
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux.yml
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux-qt6.yml - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux-qt6.yml
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/windows.yml
# - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/windows-qt6.yml # - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/windows-qt6.yml
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd-qt6.yml # - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd.yml
# - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/flatpak.yml # - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd-qt6.yml
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/flatpak.yml

View File

@@ -2,7 +2,35 @@
# SPDX-License-Identifier: BSD-2-Clause # SPDX-License-Identifier: BSD-2-Clause
Dependencies: Dependencies:
- 'on': ['Linux', 'Android', 'FreeBSD', 'Windows'] - 'on': ['Linux/Qt5', 'Android/Qt5', 'FreeBSD/Qt5', 'Windows/Qt5']
'require':
'frameworks/extra-cmake-modules': '@stable'
'frameworks/kcoreaddons': '@stable'
'frameworks/kirigami': '@stable'
'frameworks/ki18n': '@stable'
'frameworks/kconfig': '@stable'
'frameworks/syntax-highlighting': '@stable'
'frameworks/kitemmodels': '@stable'
'frameworks/kquickcharts': '@stable'
'frameworks/knotifications': '@stable'
'libraries/kquickimageeditor': '@stable'
'frameworks/sonnet': '@stable'
'libraries/kirigami-addons': '@latest'
'third-party/libquotient': '@latest'
'third-party/qtkeychain': '@latest'
'third-party/cmark': '@latest'
'third-party/qcoro': '@latest'
- 'on': ['Windows/Qt5', 'Linux/Qt5', 'FreeBSD/Qt5']
'require':
'frameworks/qqc2-desktop-style': '@stable'
'frameworks/kio': '@stable'
'frameworks/kwindowsystem': '@stable'
'frameworks/kconfigwidgets': '@stable'
- 'on': ['Linux/Qt5', 'FreeBSD/Qt5']
'require':
'frameworks/kdbusaddons': '@stable'
- 'on': ['Linux/Qt6', 'Android/Qt6', 'FreeBSD/Qt6', 'Windows/Qt6']
'require': 'require':
'frameworks/extra-cmake-modules': '@latest-kf6' 'frameworks/extra-cmake-modules': '@latest-kf6'
'frameworks/kcoreaddons': '@latest-kf6' 'frameworks/kcoreaddons': '@latest-kf6'
@@ -20,21 +48,21 @@ Dependencies:
'third-party/qtkeychain': '@latest' 'third-party/qtkeychain': '@latest'
'third-party/cmark': '@latest' 'third-party/cmark': '@latest'
'third-party/qcoro': '@latest' 'third-party/qcoro': '@latest'
- 'on': ['Windows', 'Linux', 'FreeBSD'] - 'on': ['Windows/Qt6', 'Linux/Qt6', 'FreeBSD/Qt6']
'require': 'require':
'frameworks/qqc2-desktop-style': '@latest-kf6' 'frameworks/qqc2-desktop-style': '@latest-kf6'
'frameworks/kio': '@latest-kf6' 'frameworks/kio': '@latest-kf6'
'frameworks/kwindowsystem': '@latest-kf6' 'frameworks/kwindowsystem': '@latest-kf6'
'frameworks/kconfigwidgets': '@latest-kf6' 'frameworks/kconfigwidgets': '@latest-kf6'
- 'on': ['Linux', 'FreeBSD'] - 'on': ['Linux/Qt6', 'FreeBSD/Qt6']
'require': 'require':
'frameworks/kdbusaddons': '@latest-kf6' 'frameworks/kdbusaddons': '@latest-kf6'
'frameworks/kstatusnotifieritem': '@latest-kf6' 'frameworks/kstatusnotifieritem': '@latest-kf6'
- 'on': ['Linux'] - 'on': ['Linux/Qt6', 'Linux/Qt5']
'require': 'require':
'sdk/selenium-webdriver-at-spi': '@latest-kf6' 'sdk/selenium-webdriver-at-spi': '@latest-kf6'
Options: Options:
per-test-timeout: 90 per-test-timeout: 90
require-passing-tests-on: [ '@all' ] require-passing-tests-on: [ 'Linux/Qt5', 'FreeBSD', 'Windows' ]

View File

@@ -34,7 +34,7 @@ Files: src/neochat.notifyrc
Copyright: 2020 Tobias Fella <tobias.fella@kde.org> Copyright: 2020 Tobias Fella <tobias.fella@kde.org>
License: BSD-2-Clause License: BSD-2-Clause
Files: src/qml/confetti.png src/qml/glowdot.png Files: src/qml/Component/confetti.png src/qml/Component/glowdot.png
Copyright: 2021 Alexey Andreyev <aa13q@ya.ru> Copyright: 2021 Alexey Andreyev <aa13q@ya.ru>
License: CC0-1.0 License: CC0-1.0

View File

@@ -14,8 +14,11 @@ set(RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_
project(NeoChat VERSION ${RELEASE_SERVICE_VERSION}) project(NeoChat VERSION ${RELEASE_SERVICE_VERSION})
set(KF_MIN_VERSION "5.240.0") set(KF_MIN_VERSION "5.105.0")
set(QT_MIN_VERSION "6.5") set(QT_MIN_VERSION "5.15.2")
if (ANDROID)
set(QT_MIN_VERSION "5.15.10")
endif()
find_package(ECM ${KF_MIN_VERSION} REQUIRED NO_MODULE) find_package(ECM ${KF_MIN_VERSION} REQUIRED NO_MODULE)
@@ -45,6 +48,28 @@ if(NEOCHAT_FLATPAK)
include(cmake/Flatpak.cmake) include(cmake/Flatpak.cmake)
endif() endif()
if(QT_MAJOR_VERSION STREQUAL "6")
set(BASICLISTITEM_BOLD "font.bold")
set(OVERLAYSHEET_OPEN "onOpened")
set(QTQUICK_MODULE_QML_VERSION "")
set(QTLOCATION_MODULE_QML_VERSION "")
set(QTMULTIMEDIA_MODULE_QML_VERSION "")
set(QTMULTIMEDIA_AUDIO "MediaPlayer")
# in Audio qt6 we don't have it but we disable it in qt5 => it seems ok
set(QTMULTIMEDIA_AUDIO_AUTOLOAD "")
# In Video qml qt6 we don't have it.
set(QTMULTIMEDIA_VIDEO_FLUSHMODE "")
else()
set(BASICLISTITEM_BOLD "bold")
set(OVERLAYSHEET_OPEN "onSheetOpenChanged")
set(QTQUICK_MODULE_QML_VERSION "2.15")
set(QTLOCATION_MODULE_QML_VERSION "5.15")
set(QTMULTIMEDIA_MODULE_QML_VERSION "5.15")
set(QTMULTIMEDIA_AUDIO "Audio")
set(QTMULTIMEDIA_AUDIO_AUTOLOAD "autoLoad: false")
set(QTMULTIMEDIA_VIDEO_FLUSHMODE "flushMode: VideoOutput.FirstFrame")
endif()
set(QUOTIENT_FORCE_NAMESPACED_INCLUDES TRUE) set(QUOTIENT_FORCE_NAMESPACED_INCLUDES TRUE)
ecm_setup_version(${PROJECT_VERSION} ecm_setup_version(${PROJECT_VERSION}
@@ -52,21 +77,25 @@ ecm_setup_version(${PROJECT_VERSION}
VERSION_HEADER ${CMAKE_CURRENT_BINARY_DIR}/neochat-version.h VERSION_HEADER ${CMAKE_CURRENT_BINARY_DIR}/neochat-version.h
) )
find_package(Qt6 ${QT_MIN_VERSION} NO_MODULE COMPONENTS Core Quick Gui QuickControls2 Multimedia Svg WebView) find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} NO_MODULE COMPONENTS Core Quick Gui QuickControls2 Multimedia Svg WebView)
set_package_properties(Qt6 PROPERTIES set_package_properties(Qt${QT_MAJOR_VERSION} PROPERTIES
TYPE REQUIRED TYPE REQUIRED
PURPOSE "Basic application components" PURPOSE "Basic application components"
) )
find_package(KF6 ${KF_MIN_VERSION} COMPONENTS Kirigami2 I18n Notifications Config CoreAddons Sonnet ItemModels) find_package(KF${QT_MAJOR_VERSION} ${KF_MIN_VERSION} COMPONENTS Kirigami2 I18n Notifications Config CoreAddons Sonnet ItemModels SyntaxHighlighting)
set_package_properties(KF6 PROPERTIES set_package_properties(KF${QT_MAJOR_VERSION} PROPERTIES
TYPE REQUIRED TYPE REQUIRED
PURPOSE "Basic application components" PURPOSE "Basic application components"
) )
set_package_properties(KF6Kirigami2 PROPERTIES set_package_properties(KF${QT_MAJOR_VERSION}Kirigami2 PROPERTIES
TYPE REQUIRED TYPE REQUIRED
PURPOSE "Kirigami application UI framework" PURPOSE "Kirigami application UI framework"
) )
find_package(KF6KirigamiAddons 0.7.2 REQUIRED) find_package(KF${QT_MAJOR_VERSION}KirigamiAddons 0.7.2 REQUIRED)
if(QT_MAJOR_VERSION STREQUAL "6")
find_package(KF6StatusNotifierItem ${KF_MIN_VERSION} REQUIRED)
endif()
if(ANDROID) if(ANDROID)
find_package(OpenSSL) find_package(OpenSSL)
@@ -75,20 +104,24 @@ if(ANDROID)
PURPOSE "Encrypted communications" PURPOSE "Encrypted communications"
) )
else() else()
find_package(Qt6 ${QT_MIN_VERSION} COMPONENTS Widgets) find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} COMPONENTS Widgets)
find_package(KF6 ${KF_MIN_VERSION} REQUIRED COMPONENTS QQC2DesktopStyle ConfigWidgets KIO WindowSystem StatusNotifierItem) find_package(KF${QT_MAJOR_VERSION} ${KF_MIN_VERSION} REQUIRED COMPONENTS QQC2DesktopStyle ConfigWidgets KIO WindowSystem)
set_package_properties(KF6QQC2DesktopStyle PROPERTIES set_package_properties(KF${QT_MAJOR_VERSION}QQC2DesktopStyle PROPERTIES
TYPE RUNTIME TYPE RUNTIME
) )
ecm_find_qmlmodule(org.kde.syntaxhighlighting 1.0) ecm_find_qmlmodule(org.kde.syntaxhighlighting 1.0)
endif() endif()
if (NOT ANDROID AND NOT WIN32 AND NOT APPLE) if (NOT ANDROID AND NOT WIN32 AND NOT APPLE)
find_package(KF6DBusAddons ${KF_MIN_VERSION} REQUIRED) find_package(KF${QT_MAJOR_VERSION}DBusAddons ${KF_MIN_VERSION} REQUIRED)
endif() endif()
find_package(QuotientQt6 0.7) if(QT_MAJOR_VERSION STREQUAL "6" AND NOT ANDROID AND NOT WIN32)
set_package_properties(QuotientQt6 PROPERTIES set(QUOTIENT_SUFFIX "Qt6")
endif()
find_package(Quotient${QUOTIENT_SUFFIX} 0.7)
set_package_properties(Quotient${QUOTIENT_SUFFIX} PROPERTIES
TYPE REQUIRED TYPE REQUIRED
DESCRIPTION "Qt wrapper around Matrix API" DESCRIPTION "Qt wrapper around Matrix API"
URL "https://github.com/quotient-im/libQuotient/" URL "https://github.com/quotient-im/libQuotient/"
@@ -121,12 +154,12 @@ set_package_properties(KQuickImageEditor PROPERTIES
PURPOSE "Add image editing capability to image attachments" PURPOSE "Add image editing capability to image attachments"
) )
find_package(QCoro6 0.4 COMPONENTS Core REQUIRED) find_package(QCoro${QT_MAJOR_VERSION} 0.4 COMPONENTS Core REQUIRED)
qcoro_enable_coroutines() qcoro_enable_coroutines()
find_package(KF6DocTools ${KF_MIN_VERSION}) find_package(KF${QT_MAJOR_VERSION}DocTools ${KF_MIN_VERSION})
set_package_properties(KF6DocTools PROPERTIES DESCRIPTION set_package_properties(KF${QT_MAJOR_VERSION}DocTools PROPERTIES DESCRIPTION
"Tools to generate documentation" "Tools to generate documentation"
TYPE OPTIONAL TYPE OPTIONAL
) )
@@ -148,12 +181,12 @@ add_definitions(-DQT_NO_FOREACH)
add_subdirectory(src) add_subdirectory(src)
if (BUILD_TESTING) if (BUILD_TESTING)
find_package(Qt6 ${QT_MIN_VERSION} NO_MODULE COMPONENTS Test) find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} NO_MODULE COMPONENTS Test)
add_subdirectory(autotests) add_subdirectory(autotests)
add_subdirectory(appiumtests) add_subdirectory(appiumtests)
endif() endif()
if(KF6DocTools_FOUND) if(KF${QT_MAJOR_VERSION}DocTools_FOUND)
kdoctools_install(po) kdoctools_install(po)
add_subdirectory(doc) add_subdirectory(doc)
endif() endif()

View File

@@ -55,13 +55,11 @@
<summary xml:lang="eu">Berriketan jardun zure lagunekin «Matrix»en</summary> <summary xml:lang="eu">Berriketan jardun zure lagunekin «Matrix»en</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="ia">Starta Conversation conntu 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="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="sl">Klepet z vašimi prijatelji na matrixu</summary> <summary xml:lang="sl">Klepet z vašimi prijatelji na matrixu</summary>
<summary xml:lang="sv">Chatta med dina vänner på Matrix</summary> <summary xml:lang="sv">Chatta med dina vänner på Matrix</summary>
<summary xml:lang="ta">மேட்ரிக்ஸு மூலம் உங்கள் நண்பர்களிடம் பேசலாம்</summary> <summary xml:lang="ta">மேட்ரிக்ஸு மூலம் உங்கள் நண்பர்களிடம் பேசலாம்</summary>
@@ -294,7 +292,6 @@ to provide a convergent experience across multiple platforms.</p>
<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="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>
@@ -321,7 +318,6 @@ to provide a convergent experience across multiple platforms.</p>
<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="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>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -97,7 +97,7 @@ SPDX-License-Identifier: CC-BY-SA-4.0
>Vegeu també</title> >Vegeu també</title>
<simplelist> <simplelist>
<member <member
>Una llista de les preguntes més freqüents quant a Matrix <ulink url="https://matrix.org/faq/" >Una llista de les preguntes més freqüents quan a Matrix <ulink url="https://matrix.org/faq/"
>https://matrix.org/faq/</ulink >https://matrix.org/faq/</ulink
> </member> > </member>
<member <member

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,6 +3,15 @@
# 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
configure_file(qml/Page/RoomList/RoomDelegate.qml ${CMAKE_CURRENT_BINARY_DIR}/qml/Page/RoomList/RoomDelegate.qml)
configure_file(qml/Component/QuickSwitcher.qml ${CMAKE_CURRENT_BINARY_DIR}/qml/Component/QuickSwitcher.qml)
configure_file(qml/Dialog/PowerLevelDialog.qml ${CMAKE_CURRENT_BINARY_DIR}/qml/Dialog/PowerLevelDialog.qml)
configure_file(qml/Component/Timeline/AudioDelegate.qml ${CMAKE_CURRENT_BINARY_DIR}/qml/Component/Timeline/AudioDelegate.qml)
configure_file(qml/Component/Timeline/VideoDelegate.qml ${CMAKE_CURRENT_BINARY_DIR}/qml/Component/Timeline/VideoDelegate.qml)
configure_file(qml/Component/Timeline/OsmLocationPlugin.qml ${CMAKE_CURRENT_BINARY_DIR}/qml/Component/Timeline/OsmLocationPlugin.qml)
configure_file(res.qrc ${CMAKE_CURRENT_SOURCE_DIR}/res.generated.qrc)
add_library(neochat STATIC add_library(neochat STATIC
controller.cpp controller.cpp
controller.h controller.h
@@ -55,8 +64,8 @@ add_library(neochat STATIC
models/devicesmodel.cpp models/devicesmodel.cpp
models/devicesmodel.h models/devicesmodel.h
models/devicesproxymodel.cpp models/devicesproxymodel.cpp
filetype.cpp filetypesingleton.cpp
filetype.h filetypesingleton.h
login.cpp login.cpp
login.h login.h
models/webshortcutmodel.cpp models/webshortcutmodel.cpp
@@ -127,153 +136,7 @@ add_library(neochat STATIC
mediasizehelper.h mediasizehelper.h
eventhandler.cpp eventhandler.cpp
enums/delegatetype.h enums/delegatetype.h
) messageformatter.cpp
qt_add_qml_module(neochat URI org.kde.neochat NO_PLUGIN
QML_FILES
qml/main.qml
qml/AccountMenu.qml
qml/ExploreComponent.qml
qml/ContextMenu.qml
qml/CollapsedRoomDelegate.qml
qml/RoomDelegate.qml
qml/RoomListPage.qml
qml/SpaceListContextMenu.qml
qml/UserInfo.qml
qml/LoadingPage.qml
qml/RoomPage.qml
qml/RoomWindow.qml
qml/JoinRoomPage.qml
qml/ExplorerDelegate.qml
qml/InviteUserPage.qml
qml/StartChatPage.qml
qml/ImageEditorPage.qml
qml/WelcomePage.qml
qml/General.qml
qml/Security.qml
qml/PushNotification.qml
qml/Categories.qml
qml/Permissions.qml
qml/NeochatMaximizeComponent.qml
qml/FancyEffectsContainer.qml
qml/TypingPane.qml
qml/ShimmerGradient.qml
qml/QuickSwitcher.qml
qml/HoverActions.qml
qml/ChatBox.qml
qml/ChatBar.qml
qml/AttachmentPane.qml
qml/ReplyPane.qml
qml/CompletionMenu.qml
qml/PieProgressBar.qml
qml/QuickFormatBar.qml
qml/RoomData.qml
qml/ServerData.qml
qml/EmojiPicker.qml
qml/TimelineDelegate.qml
qml/ReplyComponent.qml
qml/StateDelegate.qml
qml/RichLabel.qml
qml/MessageDelegate.qml
qml/Bubble.qml
qml/SectionDelegate.qml
qml/VideoDelegate.qml
qml/ReactionDelegate.qml
qml/LinkPreviewDelegate.qml
qml/AudioDelegate.qml
qml/FileDelegate.qml
qml/ImageDelegate.qml
qml/EncryptedDelegate.qml
qml/EventDelegate.qml
qml/TextDelegate.qml
qml/ReadMarkerDelegate.qml
qml/PollDelegate.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/CreateRoomDialog.qml
qml/CreateSpaceDialog.qml
qml/EmojiDialog.qml
qml/OpenFileDialog.qml
qml/KeyVerificationDialog.qml
qml/ConfirmLogoutDialog.qml
qml/PowerLevelDialog.qml
qml/Message.qml
qml/EmojiItem.qml
qml/EmojiRow.qml
qml/EmojiSas.qml
qml/ConfirmDeactivateAccountDialog.qml
qml/VerificationCanceled.qml
qml/GlobalMenu.qml
qml/EditMenu.qml
qml/MessageDelegateContextMenu.qml
qml/FileDelegateContextMenu.qml
qml/MessageSourceSheet.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/RemoveSheet.qml
qml/BanSheet.qml
qml/EmojiTonesPicker.qml
qml/EmojiDelegate.qml
qml/EmojiGrid.qml
qml/SearchPage.qml
qml/LocationDelegate.qml
qml/LocationChooser.qml
qml/TimelineView.qml
qml/InvitationView.qml
qml/AvatarTabButton.qml
qml/SpaceDrawer.qml
qml/OsmLocationPlugin.qml
qml/LiveLocationDelegate.qml
qml/FullScreenMap.qml
qml/LocationsPage.qml
qml/LocationMapItem.qml
qml/RoomDrawer.qml
qml/RoomDrawerPage.qml
qml/DirectChatDrawerHeader.qml
qml/GroupChatDrawerHeader.qml
qml/RoomInformation.qml
qml/RoomMedia.qml
qml/ChooseRoomDialog.qml
qml/ShareAction.qml
RESOURCES
qml/confetti.png
qml/glowdot.png
) )
ecm_qt_declare_logging_category(neochat ecm_qt_declare_logging_category(neochat
@@ -294,6 +157,7 @@ ecm_qt_declare_logging_category(neochat
add_executable(neochat-app add_executable(neochat-app
main.cpp main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/res.generated.qrc
) )
if(TARGET Qt::WebView) if(TARGET Qt::WebView)
@@ -315,23 +179,28 @@ if(NOT ANDROID)
target_sources(neochat PRIVATE colorschemer.cpp colorschemer.h) target_sources(neochat PRIVATE colorschemer.cpp colorschemer.h)
if (NOT WIN32 AND NOT APPLE) if (NOT WIN32 AND NOT APPLE)
target_sources(neochat PRIVATE trayicon_sni.cpp trayicon_sni.h) target_sources(neochat PRIVATE trayicon_sni.cpp trayicon_sni.h)
target_link_libraries(neochat PRIVATE KF6::StatusNotifierItem) if(QT_MAJOR_VERSION STREQUAL "6")
target_link_libraries(neochat PRIVATE KF6::StatusNotifierItem)
endif()
else() else()
target_sources(neochat PRIVATE trayicon.cpp trayicon.h) target_sources(neochat PRIVATE trayicon.cpp trayicon.h)
endif() endif()
target_link_libraries(neochat PUBLIC KF6::ConfigWidgets KF6::WindowSystem) target_link_libraries(neochat PUBLIC KF${QT_MAJOR_VERSION}::ConfigWidgets KF${QT_MAJOR_VERSION}::WindowSystem)
target_compile_definitions(neochat PUBLIC -DHAVE_COLORSCHEME) target_compile_definitions(neochat PUBLIC -DHAVE_COLORSCHEME)
target_compile_definitions(neochat PUBLIC -DHAVE_WINDOWSYSTEM) target_compile_definitions(neochat PUBLIC -DHAVE_WINDOWSYSTEM)
endif() endif()
if (NOT ANDROID AND NOT WIN32 AND NOT APPLE) if (NOT ANDROID AND NOT WIN32 AND NOT APPLE)
target_sources(neochat-app PRIVATE res_desktop.qrc)
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)
else()
target_sources(neochat-app PRIVATE res_android.qrc)
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})
target_link_libraries(neochat PUBLIC Qt::Core Qt::Quick Qt::Qml Qt::Gui Qt::Multimedia Qt::Network Qt::QuickControls2 KF6::I18n KF6::Kirigami2 KF6::Notifications KF6::ConfigCore KF6::ConfigGui KF6::CoreAddons KF6::SonnetCore KF6::ItemModels QuotientQt6 cmark::cmark QCoro::Core) target_link_libraries(neochat PUBLIC Qt::Core Qt::Quick Qt::Qml Qt::Gui Qt::Multimedia Qt::Network Qt::QuickControls2 Qt::Xml KF${QT_MAJOR_VERSION}::I18n KF${QT_MAJOR_VERSION}::Kirigami2 KF${QT_MAJOR_VERSION}::Notifications KF${QT_MAJOR_VERSION}::ConfigCore KF${QT_MAJOR_VERSION}::ConfigGui KF${QT_MAJOR_VERSION}::CoreAddons KF${QT_MAJOR_VERSION}::SonnetCore KF${QT_MAJOR_VERSION}::ItemModels KF${QT_MAJOR_VERSION}::SyntaxHighlighting Quotient${QUOTIENT_SUFFIX} cmark::cmark QCoro::Core)
kconfig_add_kcfg_files(neochat GENERATE_MOC neochatconfig.kcfgc) kconfig_add_kcfg_files(neochat GENERATE_MOC neochatconfig.kcfgc)
@@ -419,7 +288,7 @@ if(ANDROID)
"gps" "gps"
) )
else() else()
target_link_libraries(neochat PUBLIC Qt::Widgets KF6::KIOWidgets) target_link_libraries(neochat PUBLIC Qt::Widgets KF${QT_MAJOR_VERSION}::KIOWidgets)
install(FILES neochat.notifyrc DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR}) install(FILES neochat.notifyrc DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR})
endif() endif()
@@ -427,12 +296,12 @@ 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 KF${QT_MAJOR_VERSION}::DBusAddons)
target_link_libraries(neochat PUBLIC KF6::DBusAddons) target_link_libraries(neochat PUBLIC KF${QT_MAJOR_VERSION}::DBusAddons)
target_compile_definitions(neochat PUBLIC -DHAVE_KDBUSADDONS) target_compile_definitions(neochat PUBLIC -DHAVE_KDBUSADDONS)
endif() endif()
if (TARGET KF6::KIOWidgets) if (TARGET KF${QT_MAJOR_VERSION}::KIOWidgets)
target_compile_definitions(neochat PUBLIC -DHAVE_KIO) target_compile_definitions(neochat PUBLIC -DHAVE_KIO)
endif() endif()

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QQmlEngine>
#include <Quotient/events/roommessageevent.h> #include <Quotient/events/roommessageevent.h>
@@ -33,7 +32,6 @@ class NeoChatRoom;
class ActionsHandler : public QObject class ActionsHandler : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The room that messages will be sent to. * @brief The room that messages will be sent to.

View File

@@ -134,7 +134,7 @@ int ChatDocumentHandler::completionStartIndex() const
return 0; return 0;
} }
#if !defined(Q_OS_ANDROID) #if !defined(Q_OS_ANDROID) && QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
const long long cursor = cursorPosition(); const long long cursor = cursorPosition();
#else #else
const auto cursor = cursorPosition(); const auto cursor = cursorPosition();

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QQmlEngine>
#include <QQuickTextDocument> #include <QQuickTextDocument>
#include <QTextCursor> #include <QTextCursor>
@@ -59,7 +58,6 @@ class SyntaxHighlighter;
class ChatDocumentHandler : public QObject class ChatDocumentHandler : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief Is the instance being used to handle an edit message. * @brief Is the instance being used to handle an edit message.

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QQmlEngine>
class QClipboard; class QClipboard;
class QImage; class QImage;
@@ -19,8 +18,6 @@ class QImage;
class Clipboard : public QObject class Clipboard : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
QML_SINGLETON
/** /**
* @brief Whether the current clipboard content is an image. * @brief Whether the current clipboard content is an image.

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QQmlEngine>
class QAbstractItemModel; class QAbstractItemModel;
class KColorSchemeManager; class KColorSchemeManager;
@@ -20,8 +19,6 @@ class KColorSchemeManager;
class ColorSchemer : public QObject class ColorSchemer : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
QML_SINGLETON
/** /**
* @brief A QAbstractItemModel of all available color schemes. * @brief A QAbstractItemModel of all available color schemes.

View File

@@ -4,7 +4,11 @@
#include "controller.h" #include "controller.h"
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
#include <qt5keychain/keychain.h>
#else
#include <qt6keychain/keychain.h> #include <qt6keychain/keychain.h>
#endif
#include <KConfig> #include <KConfig>
#include <KConfigGroup> #include <KConfigGroup>

View File

@@ -5,7 +5,6 @@
#include "models/pushrulemodel.h" #include "models/pushrulemodel.h"
#include <QObject> #include <QObject>
#include <QQmlEngine>
#include <QQuickItem> #include <QQuickItem>
#include <KFormat> #include <KFormat>
@@ -41,8 +40,6 @@ class ReadPasswordJob;
class Controller : public QObject class Controller : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
QML_SINGLETON
/** /**
* @brief The current connection for the rest of NeoChat to use. * @brief The current connection for the rest of NeoChat to use.
@@ -93,10 +90,6 @@ public:
Q_ENUM(PasswordStatus) Q_ENUM(PasswordStatus)
static Controller &instance(); static Controller &instance();
static Controller *create(QQmlEngine *, QJSEngine *)
{
return &instance();
}
void setActiveConnection(NeoChatConnection *connection); void setActiveConnection(NeoChatConnection *connection);
[[nodiscard]] NeoChatConnection *activeConnection() const; [[nodiscard]] NeoChatConnection *activeConnection() const;

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QQmlEngine>
/** /**
* @class DelegateSizeHelper * @class DelegateSizeHelper
@@ -24,7 +23,6 @@
class DelegateSizeHelper : public QObject class DelegateSizeHelper : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The width of the component's parent. * @brief The width of the component's parent.

View File

@@ -4,18 +4,15 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QQmlEngine>
/** /**
* @class DelegateType * @class DelegateType
* *
* This class is designed to define the DelegateType enumeration. * This class is designed to define the DelegateType enumeration.
*/ */
class DelegateType : public QObject class DelegateType
{ {
Q_OBJECT Q_GADGET
QML_ELEMENT
QML_UNCREATABLE("")
public: public:
/** /**

View File

@@ -1,116 +0,0 @@
// SPDX-FileCopyrightText: 2021 Noah Davis <noahadvs@gmail.com>
// SPDX-License-Identifier: LicenseRef-KDE-Accepted-LGPL
#include "filetype.h"
#include <QImageReader>
#include <QMovie>
static QStringList byteArrayListToStringList(const QByteArrayList &byteArrayList)
{
QStringList stringList;
for (const QByteArray &byteArray : byteArrayList) {
stringList.append(QString::fromLocal8Bit(byteArray));
}
return stringList;
}
class FileTypePrivate
{
Q_DECLARE_PUBLIC(FileType)
Q_DISABLE_COPY(FileTypePrivate)
public:
FileTypePrivate(FileType *qq);
FileType *const q_ptr;
QMimeDatabase mimetypeDatabase;
QStringList supportedImageFormats = byteArrayListToStringList(QImageReader::supportedImageFormats());
QStringList supportedAnimatedImageFormats = byteArrayListToStringList(QMovie::supportedFormats());
};
FileTypePrivate::FileTypePrivate(FileType *qq)
: q_ptr(qq)
{
}
FileType::FileType(QObject *parent)
: QObject(parent)
, d_ptr(new FileTypePrivate(this))
{
}
FileType::~FileType() noexcept
{
}
QMimeType FileType::mimeTypeForName(const QString &nameOrAlias) const
{
Q_D(const FileType);
return d->mimetypeDatabase.mimeTypeForName(nameOrAlias);
}
QMimeType FileType::mimeTypeForFile(const QString &fileName, MatchMode mode) const
{
Q_D(const FileType);
return d->mimetypeDatabase.mimeTypeForFile(fileName, static_cast<QMimeDatabase::MatchMode>(mode));
}
QMimeType FileType::mimeTypeForFile(const QFileInfo &fileInfo, MatchMode mode) const
{
Q_D(const FileType);
return d->mimetypeDatabase.mimeTypeForFile(fileInfo, static_cast<QMimeDatabase::MatchMode>(mode));
}
QList<QMimeType> FileType::mimeTypesForFileName(const QString &fileName) const
{
Q_D(const FileType);
return d->mimetypeDatabase.mimeTypesForFileName(fileName);
}
QMimeType FileType::mimeTypeForData(const QByteArray &data) const
{
Q_D(const FileType);
return d->mimetypeDatabase.mimeTypeForData(data);
}
QMimeType FileType::mimeTypeForData(QIODevice *device) const
{
Q_D(const FileType);
return d->mimetypeDatabase.mimeTypeForData(device);
}
QMimeType FileType::mimeTypeForUrl(const QUrl &url) const
{
Q_D(const FileType);
return d->mimetypeDatabase.mimeTypeForUrl(url);
}
QMimeType FileType::mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device) const
{
Q_D(const FileType);
return d->mimetypeDatabase.mimeTypeForFileNameAndData(fileName, device);
}
QMimeType FileType::mimeTypeForFileNameAndData(const QString &fileName, const QByteArray &data) const
{
Q_D(const FileType);
return d->mimetypeDatabase.mimeTypeForFileNameAndData(fileName, data);
}
QString FileType::suffixForFileName(const QString &fileName) const
{
Q_D(const FileType);
return d->mimetypeDatabase.suffixForFileName(fileName);
}
QStringList FileType::supportedImageFormats() const
{
Q_D(const FileType);
return d->supportedImageFormats;
}
QStringList FileType::supportedAnimatedImageFormats() const
{
Q_D(const FileType);
return d->supportedAnimatedImageFormats;
}
#include "moc_filetype.cpp"

116
src/filetypesingleton.cpp Normal file
View File

@@ -0,0 +1,116 @@
// SPDX-FileCopyrightText: 2021 Noah Davis <noahadvs@gmail.com>
// SPDX-License-Identifier: LicenseRef-KDE-Accepted-LGPL
#include "filetypesingleton.h"
#include <QImageReader>
#include <QMovie>
static QStringList byteArrayListToStringList(const QByteArrayList &byteArrayList)
{
QStringList stringList;
for (const QByteArray &byteArray : byteArrayList) {
stringList.append(QString::fromLocal8Bit(byteArray));
}
return stringList;
}
class FileTypeSingletonPrivate
{
Q_DECLARE_PUBLIC(FileTypeSingleton)
Q_DISABLE_COPY(FileTypeSingletonPrivate)
public:
FileTypeSingletonPrivate(FileTypeSingleton *qq);
FileTypeSingleton *const q_ptr;
QMimeDatabase mimetypeDatabase;
QStringList supportedImageFormats = byteArrayListToStringList(QImageReader::supportedImageFormats());
QStringList supportedAnimatedImageFormats = byteArrayListToStringList(QMovie::supportedFormats());
};
FileTypeSingletonPrivate::FileTypeSingletonPrivate(FileTypeSingleton *qq)
: q_ptr(qq)
{
}
FileTypeSingleton::FileTypeSingleton(QObject *parent)
: QObject(parent)
, d_ptr(new FileTypeSingletonPrivate(this))
{
}
FileTypeSingleton::~FileTypeSingleton() noexcept
{
}
QMimeType FileTypeSingleton::mimeTypeForName(const QString &nameOrAlias) const
{
Q_D(const FileTypeSingleton);
return d->mimetypeDatabase.mimeTypeForName(nameOrAlias);
}
QMimeType FileTypeSingleton::mimeTypeForFile(const QString &fileName, MatchMode mode) const
{
Q_D(const FileTypeSingleton);
return d->mimetypeDatabase.mimeTypeForFile(fileName, static_cast<QMimeDatabase::MatchMode>(mode));
}
QMimeType FileTypeSingleton::mimeTypeForFile(const QFileInfo &fileInfo, MatchMode mode) const
{
Q_D(const FileTypeSingleton);
return d->mimetypeDatabase.mimeTypeForFile(fileInfo, static_cast<QMimeDatabase::MatchMode>(mode));
}
QList<QMimeType> FileTypeSingleton::mimeTypesForFileName(const QString &fileName) const
{
Q_D(const FileTypeSingleton);
return d->mimetypeDatabase.mimeTypesForFileName(fileName);
}
QMimeType FileTypeSingleton::mimeTypeForData(const QByteArray &data) const
{
Q_D(const FileTypeSingleton);
return d->mimetypeDatabase.mimeTypeForData(data);
}
QMimeType FileTypeSingleton::mimeTypeForData(QIODevice *device) const
{
Q_D(const FileTypeSingleton);
return d->mimetypeDatabase.mimeTypeForData(device);
}
QMimeType FileTypeSingleton::mimeTypeForUrl(const QUrl &url) const
{
Q_D(const FileTypeSingleton);
return d->mimetypeDatabase.mimeTypeForUrl(url);
}
QMimeType FileTypeSingleton::mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device) const
{
Q_D(const FileTypeSingleton);
return d->mimetypeDatabase.mimeTypeForFileNameAndData(fileName, device);
}
QMimeType FileTypeSingleton::mimeTypeForFileNameAndData(const QString &fileName, const QByteArray &data) const
{
Q_D(const FileTypeSingleton);
return d->mimetypeDatabase.mimeTypeForFileNameAndData(fileName, data);
}
QString FileTypeSingleton::suffixForFileName(const QString &fileName) const
{
Q_D(const FileTypeSingleton);
return d->mimetypeDatabase.suffixForFileName(fileName);
}
QStringList FileTypeSingleton::supportedImageFormats() const
{
Q_D(const FileTypeSingleton);
return d->supportedImageFormats;
}
QStringList FileTypeSingleton::supportedAnimatedImageFormats() const
{
Q_D(const FileTypeSingleton);
return d->supportedAnimatedImageFormats;
}
#include "moc_filetypesingleton.cpp"

View File

@@ -8,10 +8,9 @@
#include <QFileInfo> #include <QFileInfo>
#include <QMimeDatabase> #include <QMimeDatabase>
#include <QObject> #include <QObject>
#include <QQmlEngine>
#include <qqml.h> #include <qqml.h>
class FileTypePrivate; class FileTypeSingletonPrivate;
/** /**
* @class FileTypeSingleton * @class FileTypeSingleton
@@ -20,11 +19,9 @@ class FileTypePrivate;
* *
* @sa QMimeDatabase * @sa QMimeDatabase
*/ */
class FileType : public QObject class FileTypeSingleton : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
QML_SINGLETON
/** /**
* @brief List of supported image formats. * @brief List of supported image formats.
@@ -40,9 +37,12 @@ class FileType : public QObject
*/ */
Q_PROPERTY(QStringList supportedAnimatedImageFormats READ supportedAnimatedImageFormats CONSTANT FINAL) Q_PROPERTY(QStringList supportedAnimatedImageFormats READ supportedAnimatedImageFormats CONSTANT FINAL)
QML_NAMED_ELEMENT(FileType)
QML_SINGLETON
public: public:
explicit FileType(QObject *parent = nullptr); explicit FileTypeSingleton(QObject *parent = nullptr);
~FileType(); ~FileTypeSingleton();
/** /**
* @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.
@@ -59,14 +59,14 @@ public:
* *
* @sa QMimeDatabase * @sa QMimeDatabase
*/ */
Q_INVOKABLE QMimeType mimeTypeForFile(const QString &fileName, FileType::MatchMode mode = MatchDefault) const; Q_INVOKABLE QMimeType mimeTypeForFile(const QString &fileName, FileTypeSingleton::MatchMode mode = MatchDefault) const;
/** /**
* @brief Returns a MIME type for fileInfo. * @brief Returns a MIME type for fileInfo.
* *
* @sa QMimeDatabase * @sa QMimeDatabase
*/ */
Q_INVOKABLE QMimeType mimeTypeForFile(const QFileInfo &fileInfo, FileType::MatchMode mode = MatchDefault) const; Q_INVOKABLE QMimeType mimeTypeForFile(const QFileInfo &fileInfo, FileTypeSingleton::MatchMode mode = MatchDefault) const;
/** /**
* @brief Returns the MIME types for the file name fileName. * @brief Returns the MIME types for the file name fileName.
@@ -121,7 +121,9 @@ public:
QStringList supportedAnimatedImageFormats() const; QStringList supportedAnimatedImageFormats() const;
private: private:
const QScopedPointer<FileTypePrivate> d_ptr; const QScopedPointer<FileTypeSingletonPrivate> d_ptr;
Q_DECLARE_PRIVATE(FileType) Q_DECLARE_PRIVATE(FileTypeSingleton)
Q_DISABLE_COPY(FileType) Q_DISABLE_COPY(FileTypeSingleton)
}; };
QML_DECLARE_TYPE(FileTypeSingleton)

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QQmlEngine>
#include <QUrl> #include <QUrl>
class NeoChatRoom; class NeoChatRoom;
@@ -20,8 +19,6 @@ class NeoChatRoom;
class LinkPreviewer : public QObject class LinkPreviewer : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The URL to get the preview for. * @brief The URL to get the preview for.
*/ */

View File

@@ -2,17 +2,14 @@
// SPDX-License-Identifier: LGPL-2.0-or-later // SPDX-License-Identifier: LGPL-2.0-or-later
#pragma once #pragma once
#include "linkpreviewer.h"
#include <QMetaType> #include <QMetaType>
#include <QObject>
#include <QQmlEngine>
#include <QRectF> #include <QRectF>
/** Location related helper functions for QML. */ /** Location related helper functions for QML. */
class LocationHelper : public QObject class LocationHelper
{ {
Q_OBJECT Q_GADGET
QML_ELEMENT
QML_UNCREATABLE("")
public: public:
/** Unite two rectanlges. */ /** Unite two rectanlges. */
Q_INVOKABLE static QRectF unite(const QRectF &r1, const QRectF &r2); Q_INVOKABLE static QRectF unite(const QRectF &r1, const QRectF &r2);

View File

@@ -13,13 +13,13 @@
using namespace Quotient; using namespace Quotient;
LoginHelper::LoginHelper(QObject *parent) Login::Login(QObject *parent)
: QObject(parent) : QObject(parent)
{ {
init(); init();
} }
void LoginHelper::init() void Login::init()
{ {
m_homeserverReachable = false; m_homeserverReachable = false;
m_connection = new NeoChatConnection(); m_connection = new NeoChatConnection();
@@ -31,7 +31,7 @@ void LoginHelper::init()
m_supportsPassword = false; m_supportsPassword = false;
m_ssoUrl = QUrl(); m_ssoUrl = QUrl();
connect(this, &LoginHelper::matrixIdChanged, this, [this]() { connect(this, &Login::matrixIdChanged, this, [this]() {
setHomeserverReachable(false); setHomeserverReachable(false);
QRegularExpression validator(QStringLiteral("^\\@?[a-zA-Z0-9\\._=\\-/]+\\:[a-zA-Z0-9\\-]+(\\.[a-zA-Z0-9\\-]+)*(\\:[0-9]+)?$")); QRegularExpression validator(QStringLiteral("^\\@?[a-zA-Z0-9\\._=\\-/]+\\:[a-zA-Z0-9\\-]+(\\.[a-zA-Z0-9\\-]+)*(\\:[0-9]+)?$"));
if (!validator.match(m_matrixId).hasMatch()) { if (!validator.match(m_matrixId).hasMatch()) {
@@ -105,23 +105,23 @@ void LoginHelper::init()
}); });
} }
void LoginHelper::setHomeserverReachable(bool reachable) void Login::setHomeserverReachable(bool reachable)
{ {
m_homeserverReachable = reachable; m_homeserverReachable = reachable;
Q_EMIT homeserverReachableChanged(); Q_EMIT homeserverReachableChanged();
} }
bool LoginHelper::homeserverReachable() const bool Login::homeserverReachable() const
{ {
return m_homeserverReachable; return m_homeserverReachable;
} }
QString LoginHelper::matrixId() const QString Login::matrixId() const
{ {
return m_matrixId; return m_matrixId;
} }
void LoginHelper::setMatrixId(const QString &matrixId) void Login::setMatrixId(const QString &matrixId)
{ {
m_matrixId = matrixId; m_matrixId = matrixId;
if (!m_matrixId.startsWith(QLatin1Char('@'))) { if (!m_matrixId.startsWith(QLatin1Char('@'))) {
@@ -130,30 +130,30 @@ void LoginHelper::setMatrixId(const QString &matrixId)
Q_EMIT matrixIdChanged(); Q_EMIT matrixIdChanged();
} }
QString LoginHelper::password() const QString Login::password() const
{ {
return m_password; return m_password;
} }
void LoginHelper::setPassword(const QString &password) void Login::setPassword(const QString &password)
{ {
setInvalidPassword(false); setInvalidPassword(false);
m_password = password; m_password = password;
Q_EMIT passwordChanged(); Q_EMIT passwordChanged();
} }
QString LoginHelper::deviceName() const QString Login::deviceName() const
{ {
return m_deviceName; return m_deviceName;
} }
void LoginHelper::setDeviceName(const QString &deviceName) void Login::setDeviceName(const QString &deviceName)
{ {
m_deviceName = deviceName; m_deviceName = deviceName;
Q_EMIT deviceNameChanged(); Q_EMIT deviceNameChanged();
} }
void LoginHelper::login() void Login::login()
{ {
m_isLoggingIn = true; m_isLoggingIn = true;
Q_EMIT isLoggingInChanged(); Q_EMIT isLoggingInChanged();
@@ -164,22 +164,22 @@ void LoginHelper::login()
m_connection->loginWithPassword(username, m_password, m_deviceName, QString()); m_connection->loginWithPassword(username, m_password, m_deviceName, QString());
} }
bool LoginHelper::supportsPassword() const bool Login::supportsPassword() const
{ {
return m_supportsPassword; return m_supportsPassword;
} }
bool LoginHelper::supportsSso() const bool Login::supportsSso() const
{ {
return m_supportsSso; return m_supportsSso;
} }
QUrl LoginHelper::ssoUrl() const QUrl Login::ssoUrl() const
{ {
return m_ssoUrl; return m_ssoUrl;
} }
void LoginHelper::loginWithSso() void Login::loginWithSso()
{ {
m_connection->resolveServer(m_matrixId); m_connection->resolveServer(m_matrixId);
connectSingleShot(m_connection, &Connection::loginFlowsChanged, this, [this]() { connectSingleShot(m_connection, &Connection::loginFlowsChanged, this, [this]() {
@@ -189,28 +189,28 @@ void LoginHelper::loginWithSso()
}); });
} }
bool LoginHelper::testing() const bool Login::testing() const
{ {
return m_testing; return m_testing;
} }
bool LoginHelper::isLoggingIn() const bool Login::isLoggingIn() const
{ {
return m_isLoggingIn; return m_isLoggingIn;
} }
bool LoginHelper::isLoggedIn() const bool Login::isLoggedIn() const
{ {
return m_isLoggedIn; return m_isLoggedIn;
} }
void LoginHelper::setInvalidPassword(bool invalid) void Login::setInvalidPassword(bool invalid)
{ {
m_invalidPassword = invalid; m_invalidPassword = invalid;
Q_EMIT isInvalidPasswordChanged(); Q_EMIT isInvalidPasswordChanged();
} }
bool LoginHelper::isInvalidPassword() const bool Login::isInvalidPassword() const
{ {
return m_invalidPassword; return m_invalidPassword;
} }

View File

@@ -4,21 +4,18 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QQmlEngine>
#include <QUrl> #include <QUrl>
class NeoChatConnection; class NeoChatConnection;
/** /**
* @class LoginHelper * @class Login
* *
* A helper class for logging into a Matrix account. * A helper class for logging into a Matrix account.
*/ */
class LoginHelper : public QObject class Login : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
QML_SINGLETON
/** /**
* @brief Whether the home server for the account is reachable. * @brief Whether the home server for the account is reachable.
@@ -79,7 +76,7 @@ class LoginHelper : public QObject
Q_PROPERTY(bool isInvalidPassword READ isInvalidPassword NOTIFY isInvalidPasswordChanged) Q_PROPERTY(bool isInvalidPassword READ isInvalidPassword NOTIFY isInvalidPasswordChanged)
public: public:
explicit LoginHelper(QObject *parent = nullptr); explicit Login(QObject *parent = nullptr);
Q_INVOKABLE void init(); Q_INVOKABLE void init();

View File

@@ -44,9 +44,11 @@
#include "actionshandler.h" #include "actionshandler.h"
#include "blurhashimageprovider.h" #include "blurhashimageprovider.h"
#include "chatdocumenthandler.h" #include "chatdocumenthandler.h"
#include "clipboard.h"
#include "controller.h" #include "controller.h"
#include "delegatesizehelper.h" #include "delegatesizehelper.h"
#include "enums/delegatetype.h" #include "enums/delegatetype.h"
#include "filetypesingleton.h"
#include "linkpreviewer.h" #include "linkpreviewer.h"
#include "locationhelper.h" #include "locationhelper.h"
#include "logger.h" #include "logger.h"
@@ -80,6 +82,9 @@
#include "models/userlistmodel.h" #include "models/userlistmodel.h"
#include "models/webshortcutmodel.h" #include "models/webshortcutmodel.h"
#include "neochatconfig.h" #include "neochatconfig.h"
#include "neochatconnection.h"
#include "neochatroom.h"
#include "notificationsmanager.h"
#include "pollhandler.h" #include "pollhandler.h"
#include "roommanager.h" #include "roommanager.h"
#include "spacehierarchycache.h" #include "spacehierarchycache.h"
@@ -102,9 +107,9 @@
#include <Windows.h> #include <Windows.h>
#endif #endif
using namespace Quotient; #include "messageformatter.h"
void qml_register_types_org_kde_neochat(); using namespace Quotient;
class NetworkAccessManagerFactory : public QQmlNetworkAccessManagerFactory class NetworkAccessManagerFactory : public QQmlNetworkAccessManagerFactory
{ {
@@ -137,13 +142,19 @@ Q_DECL_EXPORT
#endif #endif
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QNetworkProxyFactory::setUseSystemConfiguration(true); QNetworkProxyFactory::setUseSystemConfiguration(true);
#ifdef HAVE_WEBVIEW #ifdef HAVE_WEBVIEW
QtWebView::initialize(); QtWebView::initialize();
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts); QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGLRhi); QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGLRhi);
#endif #endif
#endif
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
@@ -212,18 +223,106 @@ int main(int argc, char *argv[])
QStringLiteral("/var/config/fontconfig/conf.d/99-noto-mono-color-emoji.conf")); QStringLiteral("/var/config/fontconfig/conf.d/99-noto-mono-color-emoji.conf"));
#endif #endif
Clipboard clipboard;
auto config = NeoChatConfig::self();
FileTypeSingleton fileTypeSingleton;
Login *login = new Login();
UrlHelper urlHelper;
MessageFormatter formatter;
// formatter.formatInternal("<p>hrrejoire</p>\n<pre><code class=\"language-js\">var i = 0; i++; function\n</code></pre>\n<p>rekore</p>\n", new
// QTextDocument);
// return 0;
#ifdef HAVE_COLORSCHEME #ifdef HAVE_COLORSCHEME
ColorSchemer colorScheme; ColorSchemer colorScheme;
if (!NeoChatConfig::self()->colorScheme().isEmpty()) { qmlRegisterSingletonInstance<ColorSchemer>("org.kde.neochat", 1, 0, "ColorSchemer", &colorScheme);
colorScheme.apply(NeoChatConfig::self()->colorScheme()); if (!config->colorScheme().isEmpty()) {
colorScheme.apply(config->colorScheme());
} }
#endif #endif
qml_register_types_org_kde_neochat(); qmlRegisterSingletonInstance<MessageFormatter>("org.kde.neochat", 1, 0, "MessageFormatter", &formatter);
qmlRegisterSingletonInstance("org.kde.neochat.config", 1, 0, "Config", NeoChatConfig::self()); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "Controller", &Controller::instance());
qmlRegisterSingletonInstance("org.kde.neochat.accounts", 1, 0, "AccountRegistry", &Controller::instance().accounts()); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "NotificationsManager", &NotificationsManager::instance());
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "Clipboard", &clipboard);
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "Config", config);
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "RoomManager", &RoomManager::instance());
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "FileType", &fileTypeSingleton);
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "LoginHelper", login);
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "UrlHelper", &urlHelper);
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "EmojiModel", &EmojiModel::instance());
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "AccountRegistry", &Controller::instance().accounts());
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "SpaceHierarchyCache", &SpaceHierarchyCache::instance());
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "CustomEmojiModel", &CustomEmojiModel::instance());
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "Registration", &Registration::instance());
qmlRegisterType<ActionsHandler>("org.kde.neochat", 1, 0, "ActionsHandler");
qmlRegisterType<ChatDocumentHandler>("org.kde.neochat", 1, 0, "ChatDocumentHandler");
qmlRegisterType<RoomListModel>("org.kde.neochat", 1, 0, "RoomListModel");
qmlRegisterType<KWebShortcutModel>("org.kde.neochat", 1, 0, "WebShortcutModel");
qmlRegisterType<UserListModel>("org.kde.neochat", 1, 0, "UserListModel");
qmlRegisterType<MessageEventModel>("org.kde.neochat", 1, 0, "MessageEventModel");
qmlRegisterType<ReactionModel>("org.kde.neochat", 1, 0, "ReactionModel");
qmlRegisterType<MediaMessageFilterModel>("org.kde.neochat", 1, 0, "MediaMessageFilterModel");
qmlRegisterType<MessageFilterModel>("org.kde.neochat", 1, 0, "MessageFilterModel");
qmlRegisterType<UserFilterModel>("org.kde.neochat", 1, 0, "UserFilterModel");
qmlRegisterType<PublicRoomListModel>("org.kde.neochat", 1, 0, "PublicRoomListModel");
qmlRegisterType<UserDirectoryListModel>("org.kde.neochat", 1, 0, "UserDirectoryListModel");
qmlRegisterType<ServerListModel>("org.kde.neochat", 1, 0, "ServerListModel");
qmlRegisterType<SortFilterRoomListModel>("org.kde.neochat", 1, 0, "SortFilterRoomListModel");
qmlRegisterType<SortFilterSpaceListModel>("org.kde.neochat", 1, 0, "SortFilterSpaceListModel");
qmlRegisterType<DevicesModel>("org.kde.neochat", 1, 0, "DevicesModel");
qmlRegisterType<DevicesProxyModel>("org.kde.neochat", 1, 0, "DevicesProxyModel");
qmlRegisterType<LinkPreviewer>("org.kde.neochat", 1, 0, "LinkPreviewer");
qmlRegisterType<CompletionModel>("org.kde.neochat", 1, 0, "CompletionModel");
qmlRegisterType<StateModel>("org.kde.neochat", 1, 0, "StateModel");
qmlRegisterType<StateFilterModel>("org.kde.neochat", 1, 0, "StateFilterModel");
qmlRegisterType<SearchModel>("org.kde.neochat", 1, 0, "SearchModel");
qmlRegisterType<LiveLocationsModel>("org.kde.neochat", 1, 0, "LiveLocationsModel");
qmlRegisterType<LocationsModel>("org.kde.neochat", 1, 0, "LocationsModel");
qmlRegisterType<PollHandler>("org.kde.neochat", 1, 0, "PollHandler");
qmlRegisterType<PushRuleModel>("org.kde.neochat", 1, 0, "PushRuleModel");
qmlRegisterType<StickerModel>("org.kde.neochat", 1, 0, "StickerModel");
qmlRegisterType<ImagePacksModel>("org.kde.neochat", 1, 0, "ImagePacksModel");
qmlRegisterType<AccountEmoticonModel>("org.kde.neochat", 1, 0, "AccountEmoticonModel");
qmlRegisterType<EmoticonFilterModel>("org.kde.neochat", 1, 0, "EmoticonFilterModel");
qmlRegisterType<DelegateSizeHelper>("org.kde.neochat", 1, 0, "DelegateSizeHelper");
qmlRegisterType<MediaSizeHelper>("org.kde.neochat", 1, 0, "MediaSizeHelper");
qmlRegisterUncreatableType<DelegateType>("org.kde.neochat", 1, 0, "DelegateType", "ENUM"_ls);
qmlRegisterUncreatableType<PushNotificationKind>("org.kde.neochat", 1, 0, "PushNotificationKind", "ENUM"_ls);
qmlRegisterUncreatableType<PushNotificationSection>("org.kde.neochat", 1, 0, "PushNotificationSection", "ENUM"_ls);
qmlRegisterUncreatableType<PushNotificationState>("org.kde.neochat", 1, 0, "PushNotificationState", "ENUM"_ls);
qmlRegisterUncreatableType<PushNotificationAction>("org.kde.neochat", 1, 0, "PushNotificationAction", "ENUM"_ls);
qmlRegisterUncreatableType<NeoChatRoomType>("org.kde.neochat", 1, 0, "NeoChatRoomType", "ENUM"_ls);
qmlRegisterUncreatableType<User>("org.kde.neochat", 1, 0, "User", {});
qmlRegisterUncreatableType<NeoChatRoom>("org.kde.neochat", 1, 0, "NeoChatRoom", {});
qmlRegisterUncreatableType<NeoChatConnection>("org.kde.neochat", 1, 0, "NeoChatConnection", {});
// qmlRegisterUncreatableType<KeyVerificationSession>("org.kde.neochat", 1, 0, "KeyVerificationSession", {}); qRegisterMetaType<User *>("User*");
qRegisterMetaType<User *>("const User*");
qRegisterMetaType<User *>("const Quotient::User*");
qRegisterMetaType<Room *>("Room*");
qRegisterMetaType<MessageEventType>("MessageEventType");
qRegisterMetaType<NeoChatRoom *>("NeoChatRoom*");
qRegisterMetaType<User *>("User*");
qRegisterMetaType<GetRoomEventsJob *>("GetRoomEventsJob*");
qRegisterMetaType<QMimeType>("QMimeType");
qRegisterMetaType<KeyVerificationSession *>("KeyVerificationSession*");
qmlRegisterUncreatableType<KeyVerificationSession>("org.kde.neochat", 1, 0, "KeyVerificationSession", {});
qRegisterMetaType<QVector<EmojiEntry>>("QVector<EmojiEntry>");
qmlRegisterSingletonType("org.kde.neochat", 1, 0, "About", [](QQmlEngine *engine, QJSEngine *) -> QJSValue {
return engine->toScriptValue(KAboutData::applicationData());
});
qmlRegisterSingletonType(QUrl("qrc:/OsmLocationPlugin.qml"_ls), "org.kde.neochat", 1, 0, "OsmLocationPlugin");
qmlRegisterSingletonType("org.kde.neochat", 1, 0, "LocationHelper", [](QQmlEngine *engine, QJSEngine *) -> QJSValue {
return engine->toScriptValue(LocationHelper());
});
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
qRegisterMetaTypeStreamOperators<Emoji>();
#endif
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
@@ -274,7 +373,7 @@ int main(int argc, char *argv[])
engine.addImageProvider(QLatin1String("mxc"), new MatrixImageProvider); engine.addImageProvider(QLatin1String("mxc"), new MatrixImageProvider);
engine.addImageProvider(QLatin1String("blurhash"), new BlurhashImageProvider); engine.addImageProvider(QLatin1String("blurhash"), new BlurhashImageProvider);
engine.load(QUrl(QStringLiteral("qrc:/org/kde/neochat/qml/main.qml"))); engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty()) { if (engine.rootObjects().isEmpty()) {
return -1; return -1;
} }

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QQmlEngine>
#include <QSize> #include <QSize>
/** /**
@@ -29,7 +28,6 @@
class MediaSizeHelper : public QObject class MediaSizeHelper : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The maximum width (in px) the media can be. * @brief The maximum width (in px) the media can be.

133
src/messageformatter.cpp Normal file
View File

@@ -0,0 +1,133 @@
// SPDX-FileCopyrightText: 2021 Carson Black <uhhadd@gmail.com>
// SPDX-FileCopyrightText: 2022 Carl Schwan <carl@carlschwan.eu>
// SPDX-License-Identifier: GPL-3.0-or-later
#include "messageformatter.h"
#include <QDomDocument>
#include <QGuiApplication>
#include <QPalette>
#include <QQmlContext>
#include <QQmlProperty>
#include <QTextCursor>
#include <QTextDocumentFragment>
#include <KSyntaxHighlighting/definition.h>
#include <KSyntaxHighlighting/repository.h>
#include <KSyntaxHighlighting/syntaxhighlighter.h>
#include <KSyntaxHighlighting/theme.h>
QTextDocumentFragment copyTextLayoutFrom(QTextDocument *document)
{
QTextCursor sourceCursor(document);
sourceCursor.select(QTextCursor::Document);
QTextDocument helper;
// copy the content fragment from the source document into our helper document
QTextCursor curs(&helper);
curs.insertFragment(sourceCursor.selection());
curs.select(QTextCursor::Document);
// not sure why, but fonts get lost. since this is for codeblocks, we can
// just force the mono font. anyone copying this code would probably want
// to fix the problem proper if it's not also for codeblocks.
const auto fixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont);
const int docStart = sourceCursor.selectionStart();
const int docEnd = helper.characterCount() - 1;
// since the copied fragment above lost the qsyntaxhighlighter stuff,
// we gotta go through the qtextlayout and apply those styles to the
// document
const auto end = document->findBlock(sourceCursor.selectionEnd()).next();
for (auto current = document->findBlock(docStart); current.isValid() && current != end; current = current.next()) {
const auto layout = current.layout();
// iterate through the formats, applying them to our document
for (const auto &span : layout->formats()) {
const int start = current.position() + span.start - docStart;
const int end = start + span.length;
curs.setPosition(qMax(start, 0));
curs.setPosition(qMin(end, docEnd), QTextCursor::KeepAnchor);
auto fmt = span.format;
fmt.setFont(fixedFont);
curs.setCharFormat(fmt);
}
}
return QTextDocumentFragment(&helper);
}
QTextDocumentFragment highlight(const QString &code, const QString &language)
{
using namespace KSyntaxHighlighting;
static Repository repo;
auto theme = repo.themeForPalette(QGuiApplication::palette());
auto definition = repo.definitionForFileName(QLatin1String("file.") + language);
QTextDocument doku(code);
QScopedPointer<SyntaxHighlighter> highlighter(new SyntaxHighlighter(&doku));
highlighter->setTheme(theme);
highlighter->setDefinition(definition);
return copyTextLayoutFrom(&doku);
}
bool extractCodeBlock(QTextCursor cursor, QDomElement element)
{
const auto codeNode = element.firstChild();
if (!codeNode.isNull()) {
const auto code = codeNode.toElement();
if (!code.isNull() && code.tagName() == QLatin1String("code")) {
QString lang;
auto langClass = code.attribute(QLatin1String("class"), QLatin1String("none"));
if (langClass != QLatin1String("none") && langClass.startsWith(QLatin1String("language-"))) {
lang = langClass.remove(0, 9);
}
if (!lang.isNull()) {
cursor.insertFragment(highlight(code.text(), lang));
return true;
}
}
}
return false;
}
QString MessageFormatter::formatInternal(const QString &messageBody, QTextDocument *document)
{
QTextCursor curs(document);
QDomDocument doc(QLatin1String("htmlement"));
doc.setContent(QStringLiteral("<div>%1</div>").arg(messageBody));
QDomElement docElem = doc.documentElement();
QDomNode n = docElem.firstChild();
while (!n.isNull()) {
QDomElement e = n.toElement();
if (!e.isNull()) {
if (e.tagName() != QLatin1String("pre") || !extractCodeBlock(curs, e)) {
QString outText;
QTextStream out(&outText);
e.save(out, 0);
curs.insertHtml(outText);
}
}
n = n.nextSibling();
}
Q_EMIT document->contentsChanged();
return document->toHtml();
}
QString MessageFormatter::format(const QString &messageBody, QQuickTextDocument *doc, QQuickItem *item)
{
QColor linkColor = QQmlProperty(item, QLatin1String("Kirigami.Theme.linkColor"), qmlContext(item)).read().value<QColor>();
return formatInternal(messageBody, doc->textDocument());
}

13
src/messageformatter.h Normal file
View File

@@ -0,0 +1,13 @@
// SPDX-FileCopyrightText: 2022 Carl Schwan <carl@carlschwan.eu>
// SPDX-License-Identifier: GPL-3.0-or-later
#include <QQuickItem>
#include <QQuickTextDocument>
class MessageFormatter : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE QString format(const QString &messageBody, QQuickTextDocument *doc, QQuickItem *item);
Q_INVOKABLE QString formatInternal(const QString &messageBody, QTextDocument *doc);
};

View File

@@ -9,7 +9,6 @@
#include <QCoroTask> #include <QCoroTask>
#include <QObject> #include <QObject>
#include <QPointer> #include <QPointer>
#include <QQmlEngine>
#include <QVector> #include <QVector>
#include <Quotient/connection.h> #include <Quotient/connection.h>
@@ -24,8 +23,6 @@
class AccountEmoticonModel : public QAbstractListModel class AccountEmoticonModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The connection to get emoticons from. * @brief The connection to get emoticons from.
*/ */

View File

@@ -87,11 +87,8 @@ QVariant CompletionModel::data(const QModelIndex &index, int role) const
return m_filterModel->data(filterIndex, RoomListModel::CanonicalAliasRole); return m_filterModel->data(filterIndex, RoomListModel::CanonicalAliasRole);
} }
if (role == IconNameRole) { if (role == IconNameRole) {
auto mediaId = m_filterModel->data(filterIndex, RoomListModel::AvatarRole).toString(); return QStringLiteral("mxc://%1")
if (mediaId.isEmpty()) { .arg(m_roomListModel->connection()->makeMediaUrl(m_filterModel->data(filterIndex, RoomListModel::AvatarRole).toUrl()).toString());
return QVariant();
}
return m_room->connection()->makeMediaUrl(QUrl(QStringLiteral("mxc://%1").arg(mediaId)));
} }
} }
if (m_autoCompletionType == Emoji) { if (m_autoCompletionType == Emoji) {
@@ -148,7 +145,7 @@ void CompletionModel::updateCompletion()
m_filterModel->setFullText(m_fullText); m_filterModel->setFullText(m_fullText);
m_filterModel->setFilterText(m_text); m_filterModel->setFilterText(m_text);
m_filterModel->invalidate(); m_filterModel->invalidate();
} else if (text().startsWith(QLatin1Char(':')) && text().size() > 1 && !text()[1].isUpper() } else if (text().startsWith(QLatin1Char(':')) && !text()[1].isUpper()
&& (m_fullText.indexOf(QLatin1Char(':'), 1) == -1 && (m_fullText.indexOf(QLatin1Char(':'), 1) == -1
|| (m_fullText.indexOf(QLatin1Char(' ')) != -1 && m_fullText.indexOf(QLatin1Char(':'), 1) > m_fullText.indexOf(QLatin1Char(' '), 1)))) { || (m_fullText.indexOf(QLatin1Char(' ')) != -1 && m_fullText.indexOf(QLatin1Char(':'), 1) > m_fullText.indexOf(QLatin1Char(' '), 1)))) {
m_filterModel->setSourceModel(m_emojiModel); m_filterModel->setSourceModel(m_emojiModel);

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QConcatenateTablesProxyModel> #include <QConcatenateTablesProxyModel>
#include <QQmlEngine>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include "roomlistmodel.h" #include "roomlistmodel.h"
@@ -25,7 +24,6 @@ class RoomListModel;
class CompletionModel : public QAbstractListModel class CompletionModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The current text to search for completions. * @brief The current text to search for completions.

View File

@@ -22,7 +22,11 @@ bool CompletionProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &so
&& sourceModel() && sourceModel()
->data(sourceModel()->index(sourceRow, 0), secondaryFilterRole()) ->data(sourceModel()->index(sourceRow, 0), secondaryFilterRole())
.toString() .toString()
#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
.startsWith(QStringView(m_filterText).sliced(1), Qt::CaseInsensitive)); .startsWith(QStringView(m_filterText).sliced(1), Qt::CaseInsensitive));
#else
.startsWith(m_filterText.midRef(1), Qt::CaseInsensitive));
#endif
} }
bool CompletionProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const bool CompletionProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QQmlEngine>
#include <QRegularExpression> #include <QRegularExpression>
#include <memory> #include <memory>
@@ -28,8 +27,6 @@ struct CustomEmoji {
class CustomEmojiModel : public QAbstractListModel class CustomEmojiModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
QML_SINGLETON
public: public:
/** /**
@@ -51,10 +48,6 @@ public:
static CustomEmojiModel _instance; static CustomEmojiModel _instance;
return _instance; return _instance;
} }
static CustomEmojiModel *create(QQmlEngine *, QJSEngine *)
{
return &instance();
}
/** /**
* @brief Get the given role value at the given index. * @brief Get the given role value at the given index.

View File

@@ -5,7 +5,6 @@
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QPointer> #include <QPointer>
#include <QQmlEngine>
#include <Quotient/csapi/definitions/client_device.h> #include <Quotient/csapi/definitions/client_device.h>
@@ -26,7 +25,6 @@ class Connection;
class DevicesModel : public QAbstractListModel class DevicesModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The current connection that the model is getting its devices from. * @brief The current connection that the model is getting its devices from.

View File

@@ -3,14 +3,11 @@
#pragma once #pragma once
#include <QQmlEngine>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
class DevicesProxyModel : public QSortFilterProxyModel class DevicesProxyModel : public QSortFilterProxyModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
Q_PROPERTY(int type READ type WRITE setType NOTIFY typeChanged) Q_PROPERTY(int type READ type WRITE setType NOTIFY typeChanged)
public: public:

View File

@@ -5,7 +5,6 @@
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QObject> #include <QObject>
#include <QQmlEngine>
#include <QSettings> #include <QSettings>
struct Emoji { struct Emoji {
@@ -60,8 +59,6 @@ Q_DECLARE_METATYPE(Emoji)
class EmojiModel : public QAbstractListModel class EmojiModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
QML_SINGLETON
/** /**
* @brief Return a list of recently used emojis. * @brief Return a list of recently used emojis.
@@ -86,10 +83,6 @@ public:
static EmojiModel _instance; static EmojiModel _instance;
return _instance; return _instance;
} }
static EmojiModel *create(QQmlEngine *, QJSEngine *)
{
return &instance();
}
/** /**
* @brief Defines the model roles. * @brief Defines the model roles.

View File

@@ -3,7 +3,6 @@
#pragma once #pragma once
#include <QQmlEngine>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
/** /**
@@ -15,7 +14,6 @@
class EmoticonFilterModel : public QSortFilterProxyModel class EmoticonFilterModel : public QSortFilterProxyModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief Whether stickers should be shown * @brief Whether stickers should be shown

View File

@@ -6,7 +6,6 @@
#include "events/imagepackevent.h" #include "events/imagepackevent.h"
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QPointer> #include <QPointer>
#include <QQmlEngine>
#include <QVector> #include <QVector>
class NeoChatRoom; class NeoChatRoom;
@@ -22,7 +21,6 @@ class NeoChatRoom;
class ImagePacksModel : public QAbstractListModel class ImagePacksModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The current room that the model is being used in. * @brief The current room that the model is being used in.

View File

@@ -8,7 +8,6 @@
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QPointer> #include <QPointer>
#include <QQmlEngine>
#include <QRectF> #include <QRectF>
struct LiveLocationData { struct LiveLocationData {
@@ -25,8 +24,6 @@ bool operator<(const LiveLocationData &lhs, const LiveLocationData &rhs);
class LiveLocationsModel : public QAbstractListModel class LiveLocationsModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
Q_PROPERTY(NeoChatRoom *room MEMBER m_room NOTIFY roomChanged) Q_PROPERTY(NeoChatRoom *room MEMBER m_room NOTIFY roomChanged)
/** The event id of the beacon start event, ie. the one all suspequent /** The event id of the beacon start event, ie. the one all suspequent
* events use to relate to the same beacon. * events use to relate to the same beacon.

View File

@@ -5,7 +5,6 @@
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QPointer> #include <QPointer>
#include <QQmlEngine>
#include <QRectF> #include <QRectF>
#include "neochatroom.h" #include "neochatroom.h"
@@ -16,7 +15,6 @@
class LocationsModel : public QAbstractListModel class LocationsModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
public: public:
enum Roles { enum Roles {

View File

@@ -3,8 +3,8 @@
#pragma once #pragma once
#include <QQmlEngine>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <qobjectdefs.h>
#include "models/messagefiltermodel.h" #include "models/messagefiltermodel.h"
@@ -20,8 +20,6 @@ class MessageFilterModel;
class MediaMessageFilterModel : public QSortFilterProxyModel class MediaMessageFilterModel : public QSortFilterProxyModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
public: public:
enum MediaType { enum MediaType {
Image = 0, Image = 0,

View File

@@ -55,6 +55,7 @@ QHash<int, QByteArray> MessageEventModel::roleNames() const
roles[ShowReadMarkersRole] = "showReadMarkers"; roles[ShowReadMarkersRole] = "showReadMarkers";
roles[ReactionRole] = "reaction"; roles[ReactionRole] = "reaction";
roles[ShowReactionsRole] = "showReactions"; roles[ShowReactionsRole] = "showReactions";
roles[SourceRole] = "jsonSource";
roles[AuthorIdRole] = "authorId"; roles[AuthorIdRole] = "authorId";
roles[VerifiedRole] = "verified"; roles[VerifiedRole] = "verified";
roles[AuthorDisplayNameRole] = "authorDisplayName"; roles[AuthorDisplayNameRole] = "authorDisplayName";
@@ -466,6 +467,10 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
return eventHandler.getPlainBody(); return eventHandler.getPlainBody();
} }
if (role == SourceRole) {
return QJsonDocument(evt.fullJson()).toJson();
}
if (role == DelegateTypeRole) { if (role == DelegateTypeRole) {
return eventHandler.getDelegateType(); return eventHandler.getDelegateType();
} }

View File

@@ -5,7 +5,6 @@
#include <KFormat> #include <KFormat>
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QQmlEngine>
#include "linkpreviewer.h" #include "linkpreviewer.h"
#include "neochatroom.h" #include "neochatroom.h"
@@ -26,7 +25,6 @@ class ReactionModel;
class MessageEventModel : public QAbstractListModel class MessageEventModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The current room that the model is getting its messages from. * @brief The current room that the model is getting its messages from.
@@ -72,6 +70,7 @@ public:
ShowReadMarkersRole, /**< Whether there are any other user read markers to be shown. */ ShowReadMarkersRole, /**< Whether there are any other user read markers to be shown. */
ReactionRole, /**< List model for this event. */ ReactionRole, /**< List model for this event. */
ShowReactionsRole, /**< Whether there are any reactions to be shown. */ ShowReactionsRole, /**< Whether there are any reactions to be shown. */
SourceRole, /**< The full message source JSON. */
AuthorIdRole, /**< Matrix ID of the message author. */ AuthorIdRole, /**< Matrix ID of the message author. */

View File

@@ -3,7 +3,6 @@
#pragma once #pragma once
#include <QQmlEngine>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include "messageeventmodel.h" #include "messageeventmodel.h"
@@ -22,8 +21,6 @@
class MessageFilterModel : public QSortFilterProxyModel class MessageFilterModel : public QSortFilterProxyModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
public: public:
/** /**
* @brief Defines the model roles. * @brief Defines the model roles.

View File

@@ -5,7 +5,6 @@
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QObject> #include <QObject>
#include <QQmlEngine>
#include <Quotient/csapi/list_public_rooms.h> #include <Quotient/csapi/list_public_rooms.h>
@@ -28,7 +27,6 @@ class Connection;
class PublicRoomListModel : public QAbstractListModel class PublicRoomListModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The current connection that the model is getting its rooms from. * @brief The current connection that the model is getting its rooms from.

View File

@@ -171,7 +171,7 @@ PushNotificationSection::Section PushRuleModel::getSection(Quotient::PushRule ru
if (!testUserId.startsWith(u'@')) { if (!testUserId.startsWith(u'@')) {
testUserId.prepend(u'@'); testUserId.prepend(u'@');
} }
if (testUserId.startsWith(u'@') && !Quotient::serverPart(testUserId).isEmpty() && connection->user(testUserId) != nullptr) { if (connection->user(testUserId) != nullptr) {
return PushNotificationSection::Undefined; return PushNotificationSection::Undefined;
} }
// If the rule has push conditions and one is a room ID it is a room only keyword. // If the rule has push conditions and one is a room ID it is a room only keyword.

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QQmlEngine>
#include <Quotient/csapi/definitions/push_rule.h> #include <Quotient/csapi/definitions/push_rule.h>
@@ -21,8 +20,6 @@
class PushNotificationKind : public QObject class PushNotificationKind : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
QML_UNCREATABLE("")
public: public:
/** /**
@@ -74,8 +71,6 @@ public:
class PushNotificationSection : public QObject class PushNotificationSection : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
QML_UNCREATABLE("")
public: public:
/** /**
@@ -135,7 +130,6 @@ public:
class PushRuleModel : public QAbstractListModel class PushRuleModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The default state for any newly created keyword rule. * @brief The default state for any newly created keyword rule.

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QQmlEngine>
namespace Quotient namespace Quotient
{ {
@@ -19,7 +18,6 @@ class User;
class ReactionModel : public QAbstractListModel class ReactionModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
public: public:
/** /**

View File

@@ -6,7 +6,6 @@
#include <Quotient/events/roomevent.h> #include <Quotient/events/roomevent.h>
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QQmlEngine>
class NeoChatRoom; class NeoChatRoom;
@@ -19,8 +18,6 @@ class Room;
class NeoChatRoomType : public QObject class NeoChatRoomType : public QObject
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
QML_UNCREATABLE("")
public: public:
/** /**
@@ -45,7 +42,6 @@ public:
class RoomListModel : public QAbstractListModel class RoomListModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The current connection that the model is getting its rooms from. * @brief The current connection that the model is getting its rooms from.

View File

@@ -184,6 +184,7 @@ QHash<int, QByteArray> SearchModel::roleNames() const
{MimeTypeRole, "mimeType"}, {MimeTypeRole, "mimeType"},
{ShowLinkPreviewRole, "showLinkPreview"}, {ShowLinkPreviewRole, "showLinkPreview"},
{LinkPreviewRole, "linkPreview"}, {LinkPreviewRole, "linkPreview"},
{SourceRole, "jsonSource"},
}; };
} }

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QQmlEngine>
#include <QString> #include <QString>
#include <Quotient/csapi/search.h> #include <Quotient/csapi/search.h>
@@ -24,7 +23,6 @@ class NeoChatRoom;
class SearchModel : public QAbstractListModel class SearchModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The text to search messages for. * @brief The text to search messages for.
@@ -85,6 +83,7 @@ public:
MimeTypeRole, MimeTypeRole,
ShowLinkPreviewRole, ShowLinkPreviewRole,
LinkPreviewRole, LinkPreviewRole,
SourceRole,
}; };
Q_ENUM(Roles) Q_ENUM(Roles)
explicit SearchModel(QObject *parent = nullptr); explicit SearchModel(QObject *parent = nullptr);

View File

@@ -7,7 +7,6 @@
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QPointer> #include <QPointer>
#include <QQmlEngine>
#include <QUrl> #include <QUrl>
/** /**
@@ -25,7 +24,6 @@
class ServerListModel : public QAbstractListModel class ServerListModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
public: public:
/** /**

View File

@@ -3,7 +3,6 @@
#pragma once #pragma once
#include <QQmlEngine>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
/** /**
@@ -28,7 +27,6 @@
class SortFilterRoomListModel : public QSortFilterProxyModel class SortFilterRoomListModel : public QSortFilterProxyModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The order by which the rooms will be sorted. * @brief The order by which the rooms will be sorted.

View File

@@ -3,7 +3,6 @@
#pragma once #pragma once
#include <QQmlEngine>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
/** /**
@@ -17,8 +16,6 @@
class SortFilterSpaceListModel : public QSortFilterProxyModel class SortFilterSpaceListModel : public QSortFilterProxyModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The number of spaces in the model. * @brief The number of spaces in the model.
*/ */

View File

@@ -3,7 +3,6 @@
#pragma once #pragma once
#include <QQmlEngine>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
/** /**
@@ -15,7 +14,6 @@
class StateFilterModel : public QSortFilterProxyModel class StateFilterModel : public QSortFilterProxyModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
public: public:
/** /**

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QQmlEngine>
#include "neochatroom.h" #include "neochatroom.h"
@@ -16,7 +15,6 @@
class StateModel : public QAbstractListModel class StateModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The current room that the model is getting its state events from. * @brief The current room that the model is getting its state events from.

View File

@@ -7,7 +7,6 @@
#include "neochatroom.h" #include "neochatroom.h"
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QObject> #include <QObject>
#include <QQmlEngine>
#include <QVector> #include <QVector>
class ImagePacksModel; class ImagePacksModel;
@@ -23,7 +22,6 @@ class ImagePacksModel;
class StickerModel : public QAbstractListModel class StickerModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The image pack that the stickers come from. * @brief The image pack that the stickers come from.

View File

@@ -5,7 +5,6 @@
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QObject> #include <QObject>
#include <QQmlEngine>
#include <Quotient/csapi/users.h> #include <Quotient/csapi/users.h>
@@ -27,7 +26,6 @@ class Connection;
class UserDirectoryListModel : public QAbstractListModel class UserDirectoryListModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The current connection that the model is getting users from. * @brief The current connection that the model is getting users from.

View File

@@ -3,7 +3,6 @@
#pragma once #pragma once
#include <QQmlEngine>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
/** /**
@@ -16,7 +15,6 @@
class UserFilterModel : public QSortFilterProxyModel class UserFilterModel : public QSortFilterProxyModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief This property hold the text of the filter. * @brief This property hold the text of the filter.

View File

@@ -8,7 +8,6 @@
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QObject> #include <QObject>
#include <QPointer> #include <QPointer>
#include <QQmlEngine>
class NeoChatRoom; class NeoChatRoom;
@@ -30,7 +29,6 @@ class User;
class UserListModel : public QAbstractListModel class UserListModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The room that the model is getting its users from. * @brief The room that the model is getting its users from.

View File

@@ -10,7 +10,7 @@
#endif #endif
#include <KStringHandler> #include <KStringHandler>
struct WebShortcutModelPrivate { struct KWebShortcutModelPrivate {
QString selectedText; QString selectedText;
#ifdef HAVE_KIO #ifdef HAVE_KIO
KUriFilterData filterData; KUriFilterData filterData;
@@ -18,27 +18,27 @@ struct WebShortcutModelPrivate {
QStringList searchProviders; QStringList searchProviders;
}; };
WebShortcutModel::WebShortcutModel(QObject *parent) KWebShortcutModel::KWebShortcutModel(QObject *parent)
: QAbstractListModel(parent) : QAbstractListModel(parent)
, d(new WebShortcutModelPrivate) , d(new KWebShortcutModelPrivate)
{ {
} }
WebShortcutModel::~WebShortcutModel() KWebShortcutModel::~KWebShortcutModel()
{ {
} }
QString WebShortcutModel::selectedText() const QString KWebShortcutModel::selectedText() const
{ {
return d->selectedText; return d->selectedText;
} }
QString WebShortcutModel::trunkatedSearchText() const QString KWebShortcutModel::trunkatedSearchText() const
{ {
return KStringHandler::rsqueeze(d->selectedText, 21); return KStringHandler::rsqueeze(d->selectedText, 21);
} }
bool WebShortcutModel::enabled() const bool KWebShortcutModel::enabled() const
{ {
#ifdef HAVE_KIO #ifdef HAVE_KIO
return true; return true;
@@ -47,7 +47,7 @@ bool WebShortcutModel::enabled() const
#endif #endif
} }
void WebShortcutModel::setSelectedText(const QString &selectedText) void KWebShortcutModel::setSelectedText(const QString &selectedText)
{ {
if (d->selectedText == selectedText) { if (d->selectedText == selectedText) {
return; return;
@@ -80,7 +80,7 @@ void WebShortcutModel::setSelectedText(const QString &selectedText)
Q_EMIT selectedTextChanged(); Q_EMIT selectedTextChanged();
} }
int WebShortcutModel::rowCount(const QModelIndex &parent) const int KWebShortcutModel::rowCount(const QModelIndex &parent) const
{ {
Q_UNUSED(parent); Q_UNUSED(parent);
#ifdef HAVE_KIO #ifdef HAVE_KIO
@@ -91,7 +91,7 @@ int WebShortcutModel::rowCount(const QModelIndex &parent) const
return 0; return 0;
} }
QVariant WebShortcutModel::data(const QModelIndex &index, int role) const QVariant KWebShortcutModel::data(const QModelIndex &index, int role) const
{ {
if (!index.isValid()) { if (!index.isValid()) {
return {}; return {};
@@ -110,7 +110,7 @@ QVariant WebShortcutModel::data(const QModelIndex &index, int role) const
return {}; return {};
} }
void WebShortcutModel::trigger(const QString &data) void KWebShortcutModel::trigger(const QString &data)
{ {
#ifdef HAVE_KIO #ifdef HAVE_KIO
KUriFilterData filterData(data); KUriFilterData filterData(data);
@@ -122,7 +122,7 @@ void WebShortcutModel::trigger(const QString &data)
#endif #endif
} }
void WebShortcutModel::configureWebShortcuts() void KWebShortcutModel::configureWebShortcuts()
{ {
#ifdef HAVE_KIO #ifdef HAVE_KIO
auto job = new KIO::CommandLauncherJob(QStringLiteral("kcmshell5"), QStringList() << QStringLiteral("webshortcuts"), this); auto job = new KIO::CommandLauncherJob(QStringLiteral("kcmshell5"), QStringList() << QStringLiteral("webshortcuts"), this);

View File

@@ -4,13 +4,12 @@
#pragma once #pragma once
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QQmlEngine>
#include <memory> #include <memory>
struct WebShortcutModelPrivate; struct KWebShortcutModelPrivate;
/** /**
* @class WebShortcutModel * @class KWebShortcutModel
* *
* This class defines the model for listing web shortcuts for a specified selectedText. * This class defines the model for listing web shortcuts for a specified selectedText.
* *
@@ -46,10 +45,9 @@ struct WebShortcutModelPrivate;
* } * }
* ``` * ```
*/ */
class WebShortcutModel : public QAbstractListModel class KWebShortcutModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
QML_ELEMENT
/** /**
* @brief The text to find web shortcuts for. * @brief The text to find web shortcuts for.
@@ -66,8 +64,8 @@ class WebShortcutModel : public QAbstractListModel
*/ */
Q_PROPERTY(bool enabled READ enabled CONSTANT) Q_PROPERTY(bool enabled READ enabled CONSTANT)
public: public:
explicit WebShortcutModel(QObject *parent = nullptr); explicit KWebShortcutModel(QObject *parent = nullptr);
~WebShortcutModel(); ~KWebShortcutModel();
QString selectedText() const; QString selectedText() const;
void setSelectedText(const QString &selectedText); void setSelectedText(const QString &selectedText);
@@ -105,5 +103,5 @@ Q_SIGNALS:
void openUrl(const QUrl &url); void openUrl(const QUrl &url);
private: private:
std::unique_ptr<WebShortcutModelPrivate> d; std::unique_ptr<KWebShortcutModelPrivate> d;
}; };

Some files were not shown because too many files have changed in this diff Show More