Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,13 @@ jobs:
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main

- name: Build and install ECM
run: |
cd ..
git clone https://invent.kde.org/frameworks/extra-cmake-modules.git
cmake -S extra-cmake-modules -B extra-cmake-modules/build $CMAKE_ARGS
cmake --build extra-cmake-modules/build --target install

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we also have some basic test that the installed QML integration files are there and have something reasonable inside? Like grep a line in qmldir and *qmltypes... Just to make sure it doesn't silently fall apart, because right now QML integration is not checked at all.

- name: Configure libQuotient
run: |
cmake -S $GITHUB_WORKSPACE -B $BUILD_PATH $CMAKE_ARGS -DQuotient_INSTALL_TESTS=ON
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,5 @@ compile_commands.json
# Created by doxygen
html/
latex/

.qmlls.ini
11 changes: 10 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ string(JOIN ~ FULL_VERSION ${PROJECT_VERSION} ${PRE_STAGE})
message(STATUS)
message(STATUS "Configuring ${PROJECT_NAME} ${FULL_VERSION} ==>")

find_package(ECM NO_MODULE)
find_package(ECM REQUIRED NO_MODULE)
if (ECM_FOUND)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
include(ECMEnableSanitizers)
Expand Down Expand Up @@ -257,6 +257,15 @@ target_sources(${QUOTIENT_LIB_NAME} PUBLIC FILE_SET HEADERS BASE_DIRS .
libquotientemojis.qrc
)

include(ECMQmlModule)
include(KDEInstallDirs)

qt_extract_metatypes(${QUOTIENT_LIB_NAME})
ecm_add_qml_module(${QUOTIENT_LIB_NAME}plugin URI io.github.quotient_im.libquotient GENERATE_PLUGIN_SOURCE)
target_sources(${QUOTIENT_LIB_NAME}plugin PRIVATE Quotient/types.h)
target_link_libraries(${QUOTIENT_LIB_NAME}plugin PRIVATE ${Qt}::Core ${Qt}::Qml ${QUOTIENT_LIB_NAME})
ecm_finalize_qml_module(${QUOTIENT_LIB_NAME}plugin DESTINATION ${KDE_INSTALL_QMLDIR} EXPORT ${QUOTIENT_LIB_NAME}Targets)

# Configure API files generation

set(CSAPI_DIR csapi)
Expand Down
2 changes: 1 addition & 1 deletion Quotient/connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ using IgnoredUsersList = IgnoredUsersEvent::value_type;
class QUOTIENT_API Connection : public QObject {
Q_OBJECT

Q_PROPERTY(User* localUser READ user NOTIFY stateChanged)
Q_PROPERTY(Quotient::User* localUser READ user NOTIFY stateChanged)
Q_PROPERTY(QString localUserId READ userId NOTIFY stateChanged)
Q_PROPERTY(QString domain READ domain NOTIFY stateChanged STORED false)
Q_PROPERTY(QString deviceId READ deviceId NOTIFY stateChanged)
Expand Down
14 changes: 7 additions & 7 deletions Quotient/room.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,8 @@ struct Notification

class QUOTIENT_API Room : public QObject {
Q_OBJECT
Q_PROPERTY(Connection* connection READ connection CONSTANT)
Q_PROPERTY(RoomMember localMember READ localMember CONSTANT)
Q_PROPERTY(Quotient::Connection* connection READ connection CONSTANT)
Q_PROPERTY(Quotient::RoomMember localMember READ localMember CONSTANT)
Q_PROPERTY(QString id READ id CONSTANT)
Q_PROPERTY(QString version READ version NOTIFY baseStateLoaded)
Q_PROPERTY(bool isUnstable READ isUnstable NOTIFY stabilityUpdated)
Expand All @@ -143,8 +143,8 @@ class QUOTIENT_API Room : public QObject {
Q_PROPERTY(int joinedCount READ joinedCount NOTIFY memberListChanged)
Q_PROPERTY(int invitedCount READ invitedCount NOTIFY memberListChanged)
Q_PROPERTY(int totalMemberCount READ totalMemberCount NOTIFY memberListChanged)
Q_PROPERTY(QList<RoomMember> membersTyping READ membersTyping NOTIFY typingChanged)
Q_PROPERTY(QList<RoomMember> otherMembersTyping READ otherMembersTyping NOTIFY typingChanged)
Q_PROPERTY(QList<Quotient::RoomMember> membersTyping READ membersTyping NOTIFY typingChanged)
Q_PROPERTY(QList<Quotient::RoomMember> otherMembersTyping READ otherMembersTyping NOTIFY typingChanged)
Q_PROPERTY(int localMemberEffectivePowerLevel READ memberEffectivePowerLevel NOTIFY changed)

Q_PROPERTY(bool displayed READ displayed WRITE setDisplayed NOTIFY
Expand All @@ -159,14 +159,14 @@ class QUOTIENT_API Room : public QObject {
NOTIFY highlightCountChanged)
Q_PROPERTY(qsizetype notificationCount READ notificationCount
NOTIFY notificationCountChanged)
Q_PROPERTY(EventStats partiallyReadStats READ partiallyReadStats NOTIFY partiallyReadStatsChanged)
Q_PROPERTY(EventStats unreadStats READ unreadStats NOTIFY unreadStatsChanged)
Q_PROPERTY(Quotient::EventStats partiallyReadStats READ partiallyReadStats NOTIFY partiallyReadStatsChanged)
Q_PROPERTY(Quotient::EventStats unreadStats READ unreadStats NOTIFY unreadStatsChanged)
Q_PROPERTY(bool allHistoryLoaded READ allHistoryLoaded NOTIFY allHistoryLoadedChanged
STORED false)
Q_PROPERTY(QStringList tagNames READ tagNames NOTIFY tagsChanged)
Q_PROPERTY(bool isFavourite READ isFavourite NOTIFY tagsChanged STORED false)
Q_PROPERTY(bool isLowPriority READ isLowPriority NOTIFY tagsChanged STORED false)
Q_PROPERTY(JoinRule joinRule READ joinRule WRITE setJoinRule NOTIFY joinRuleChanged)
Q_PROPERTY(Quotient::JoinRule joinRule READ joinRule WRITE setJoinRule NOTIFY joinRuleChanged)
Q_PROPERTY(QList<QString> allowIds READ allowIds NOTIFY joinRuleChanged)

Q_PROPERTY(GetRoomEventsJob* eventsHistoryJob READ eventsHistoryJob NOTIFY eventsHistoryJobChanged)
Expand Down
86 changes: 86 additions & 0 deletions Quotient/types.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// SPDX-FileCopyrightText: 2025 Tobias Fella <[email protected]>
// SPDX-License-Identifier: LGPL-2.0-or-later

#pragma once

#include "connection.h"
#include "e2ee/sssshandler.h"
#include "eventstats.h"
#include "keyimport.h"
#include "user.h"
#include "keyverificationsession.h"
#include "room.h"
#include "roommember.h"

#include <QtQml/QQmlEngine>

struct ConnectionForeign
{
Q_GADGET
QML_NAMED_ELEMENT(Connection)
QML_FOREIGN(Quotient::Connection)
QML_UNCREATABLE("")
};

struct SSSSHandlerForeign
{
Q_GADGET
QML_NAMED_ELEMENT(SSSSHandler)
QML_FOREIGN(Quotient::SSSSHandler)
};

struct EventStatsForeign
{
Q_GADGET
QML_NAMED_ELEMENT(eventStats)
QML_FOREIGN(Quotient::EventStats)
QML_UNCREATABLE("")
};

struct KeyImportForeign
{
Q_GADGET
QML_NAMED_ELEMENT(KeyImport)
QML_SINGLETON
QML_FOREIGN(Quotient::KeyImport)
};

struct UserForeign
{
Q_GADGET
QML_NAMED_ELEMENT(User)
QML_UNCREATABLE("")
QML_FOREIGN(Quotient::User)
};

struct KeyVerificationSessionForeign
{
Q_GADGET
QML_NAMED_ELEMENT(KeyVerificationSession)
QML_UNCREATABLE("")
QML_FOREIGN(Quotient::KeyVerificationSession)
};

struct JoinRuleForeign
{
Q_GADGET
QML_NAMED_ELEMENT(JoinRule)
QML_UNCREATABLE("Only for enum values")
QML_FOREIGN_NAMESPACE(Quotient)
};

struct RoomForeign
{
Q_GADGET
QML_NAMED_ELEMENT(Room)
QML_UNCREATABLE("")
QML_FOREIGN(Quotient::Room)
};

struct RoomMemberForeign
{
Q_GADGET
QML_NAMED_ELEMENT(roomMember)
QML_UNCREATABLE("")
QML_FOREIGN(Quotient::RoomMember)
};