diff --git a/src/app/qml/RoomPage.qml b/src/app/qml/RoomPage.qml index 883e6df21..5739a9969 100644 --- a/src/app/qml/RoomPage.qml +++ b/src/app/qml/RoomPage.qml @@ -59,11 +59,33 @@ Kirigami.Page { */ property MediaMessageFilterModel mediaMessageFilterModel: RoomManager.mediaMessageFilterModel + /** + * @brief The WidgetModel to use. + * + * This model has the list of widgets available in the current room. + * + * @note For loading a room in a different window, override this with a new + * WidgetModel. + * + * @sa WidgetModel + */ + property WidgetModel widgetModel: RoomManager.widgetModel + title: root.currentRoom ? root.currentRoom.displayName : "" focus: true padding: 0 actions: [ + Kirigami.Action { + tooltip: i18nc("@action:button", "Open Jitsi Meet in browser") + icon.name: "camera-video-symbolic" + visible: root.widgetModel.jitsiIndex >= 0 + onTriggered: { + let idx = root.widgetModel.index(root.widgetModel.jitsiIndex, 0); + let url = root.widgetModel.data(idx, WidgetModel.UrlRole); + Qt.openUrlExternally(url); + } + }, Kirigami.Action { visible: Kirigami.Settings.isMobile || !(root.Kirigami.PageStack.pageStack as Kirigami.PageRow).wideMode icon.name: "view-right-new" diff --git a/src/app/roommanager.cpp b/src/app/roommanager.cpp index ee959d086..8fa261601 100644 --- a/src/app/roommanager.cpp +++ b/src/app/roommanager.cpp @@ -41,6 +41,7 @@ RoomManager::RoomManager(QObject *parent) , m_messageFilterModel(new MessageFilterModel(this, m_timelineModel)) , m_mediaMessageFilterModel(new MediaMessageFilterModel(this, m_messageFilterModel)) , m_userListModel(new UserListModel(this)) + , m_widgetModel(new WidgetModel(this)) { #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) || defined(UBUNTU_TOUCH) m_isMobile = true; @@ -53,6 +54,7 @@ RoomManager::RoomManager(QObject *parent) #endif connect(this, &RoomManager::currentRoomChanged, this, [this]() { + m_widgetModel->setRoom(m_currentRoom); m_userListModel->setRoom(m_currentRoom); m_timelineModel->setRoom(m_currentRoom); m_sortFilterRoomTreeModel->setCurrentRoom(m_currentRoom); @@ -195,6 +197,11 @@ void RoomManager::activateUserModel() m_userListModel->activate(); } +WidgetModel *RoomManager::widgetModel() const +{ + return m_widgetModel; +} + void RoomManager::resolveResource(const QString &idOrUri, const QString &action) { resolveResource(Uri{idOrUri}, action); diff --git a/src/app/roommanager.h b/src/app/roommanager.h index 83cd60854..f169e99e5 100644 --- a/src/app/roommanager.h +++ b/src/app/roommanager.h @@ -22,6 +22,7 @@ #include "models/sortfilterspacelistmodel.h" #include "models/timelinemodel.h" #include "models/userlistmodel.h" +#include "models/widgetmodel.h" #include "neochatroommember.h" class NeoChatRoom; @@ -129,6 +130,14 @@ class RoomManager : public QObject, public UriResolverBase */ Q_PROPERTY(UserListModel *userListModel READ userListModel CONSTANT) + /** + * @brief The WidgetModel that should be used for room widget visualisation. + * + * @note Available here so that the room page and drawer both have access to the + * same model. + */ + Q_PROPERTY(WidgetModel *widgetModel READ widgetModel CONSTANT) + /** * @brief Whether a room is currently open in NeoChat. * @@ -160,6 +169,8 @@ public: UserListModel *userListModel() const; Q_INVOKABLE void activateUserModel(); + WidgetModel *widgetModel() const; + /** * @brief Resolve the given resource. * @@ -356,6 +367,7 @@ private: MediaMessageFilterModel *m_mediaMessageFilterModel; UserListModel *m_userListModel; + WidgetModel *m_widgetModel; QPointer m_connection;