ResolveResource
Use ResolveResource rather than calling individual functions like visit user and room
This commit is contained in:
@@ -232,7 +232,7 @@ int main(int argc, char *argv[])
|
||||
auto args = arguments;
|
||||
args.removeFirst();
|
||||
for (const auto &arg : args) {
|
||||
RoomManager::instance().openResource(arg);
|
||||
RoomManager::instance().resolveResource(arg);
|
||||
}
|
||||
});
|
||||
#endif
|
||||
|
||||
@@ -235,7 +235,7 @@ QList<ActionsModel::Action> actions{
|
||||
return QString();
|
||||
}
|
||||
Q_EMIT room->showMessage(NeoChatRoom::Info, i18nc("Joining room <roomname>.", "Joining room %1.", text));
|
||||
RoomManager::instance().openResource(text, "join"_ls);
|
||||
RoomManager::instance().resolveResource(text, "join"_ls);
|
||||
return QString();
|
||||
},
|
||||
false,
|
||||
@@ -290,7 +290,7 @@ QList<ActionsModel::Action> actions{
|
||||
return QString();
|
||||
}
|
||||
Q_EMIT room->showMessage(NeoChatRoom::Info, i18nc("Joining room <roomname>.", "Joining room %1.", text));
|
||||
RoomManager::instance().openResource(text, "join"_ls);
|
||||
RoomManager::instance().resolveResource(text, "join"_ls);
|
||||
return QString();
|
||||
},
|
||||
false,
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include <Quotient/connection.h>
|
||||
#include <Quotient/events/event.h>
|
||||
#include <Quotient/uri.h>
|
||||
|
||||
#include "eventhandler.h"
|
||||
#include "neochatroom.h"
|
||||
@@ -49,6 +50,9 @@ QVariant NotificationsModel::data(const QModelIndex &index, int role) const
|
||||
if (role == RoomDisplayNameRole) {
|
||||
return m_notifications[row].roomDisplayName;
|
||||
}
|
||||
if (role == UriRole) {
|
||||
return Uri(m_notifications[row].roomId.toLatin1(), m_notifications[row].eventId.toLatin1()).toUrl();
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
@@ -62,6 +66,7 @@ QHash<int, QByteArray> NotificationsModel::roleNames() const
|
||||
{RoomRole, "room"},
|
||||
{EventIdRole, "eventId"},
|
||||
{RoomDisplayNameRole, "roomDisplayName"},
|
||||
{UriRole, "uri"},
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ public:
|
||||
RoomRole,
|
||||
EventIdRole,
|
||||
RoomDisplayNameRole,
|
||||
UriRole,
|
||||
};
|
||||
Q_ENUM(Roles);
|
||||
|
||||
|
||||
@@ -149,7 +149,7 @@ QQC2.Control {
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
Accessible.name: contentItem.text
|
||||
onClicked: RoomManager.visitUser(root.author.object, "mention")
|
||||
onClicked: RoomManager.resolveResource(root.author.id, "mention")
|
||||
}
|
||||
QQC2.Label {
|
||||
text: root.timeString
|
||||
|
||||
@@ -33,7 +33,7 @@ ColumnLayout {
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
onClicked: {
|
||||
RoomManager.visitUser(root.room.getUser(root.room.directChatRemoteUser.id).object, "mention")
|
||||
RoomManager.resolveResource(root.room.directChatRemoteUser.id, "mention")
|
||||
}
|
||||
|
||||
contentItem: KirigamiComponents.Avatar {
|
||||
|
||||
@@ -26,7 +26,7 @@ RowLayout {
|
||||
if (isJoined) {
|
||||
RoomManager.enterRoom(root.connection.room(roomId))
|
||||
} else {
|
||||
RoomManager.openResource(roomId.length > 0 ? roomId : alias, "join")
|
||||
RoomManager.resolveResource(roomId.length > 0 ? roomId : alias, "join")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ ColumnLayout {
|
||||
if (isJoined) {
|
||||
RoomManager.enterRoom(root.connection.room(roomId));
|
||||
} else {
|
||||
RoomManager.openResource(roomId.length > 0 ? roomId : alias, "join");
|
||||
RoomManager.resolveResource(roomId.length > 0 ? roomId : alias, "join");
|
||||
}
|
||||
})
|
||||
exploreTabBar.currentIndex = -1;
|
||||
|
||||
@@ -66,7 +66,7 @@ Labs.MenuBar {
|
||||
if (isJoined) {
|
||||
RoomManager.enterRoom(root.connection.room(roomId))
|
||||
} else {
|
||||
RoomManager.openResource(roomId, "join")
|
||||
RoomManager.resolveResource(roomId, "join")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ Loader {
|
||||
}
|
||||
</style>
|
||||
<a href=\"" + root.linkPreviewer.url + "\">" + (maximizeButton.checked ? root.linkPreviewer.title : titleTextMetrics.elidedText).replace("–", "—") + "</a>"
|
||||
onLinkActivated: RoomManager.openResource(link, "join")
|
||||
onLinkActivated: RoomManager.resolveResource(link, "join")
|
||||
|
||||
TextMetrics {
|
||||
id: titleTextMetrics
|
||||
|
||||
@@ -355,7 +355,7 @@ TimelineDelegate {
|
||||
source: root.author.avatarSource
|
||||
color: root.author.color
|
||||
|
||||
onClicked: RoomManager.visitUser(root.author.object, "mention")
|
||||
onClicked: RoomManager.resolveResource(root.author.id, "mention")
|
||||
}
|
||||
Bubble {
|
||||
id: bubble
|
||||
|
||||
@@ -209,7 +209,7 @@ Loader {
|
||||
model: WebShortcutModel {
|
||||
id: webshortcutmodel
|
||||
selectedText: root.selectedText.length > 0 ? root.selectedText : root.plainText
|
||||
onOpenUrl: RoomManager.visitNonMatrix(url)
|
||||
onOpenUrl: RoomManager.resolveResource(url)
|
||||
}
|
||||
delegate: QQC2.MenuItem {
|
||||
text: model.display
|
||||
@@ -315,7 +315,7 @@ Loader {
|
||||
Layout.fillWidth: true
|
||||
wrapMode: Text.WordWrap
|
||||
|
||||
onLinkActivated: RoomManager.openResource(link, "join");
|
||||
onLinkActivated: RoomManager.resolveResource(link, "join");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ Kirigami.ScrollablePage {
|
||||
delegate: QQC2.ItemDelegate {
|
||||
width: parent?.width ?? 0
|
||||
|
||||
onClicked: RoomManager.visitRoom(model.room, model.eventId)
|
||||
onClicked: RoomManager.resolveResource(model.uri)
|
||||
contentItem: RowLayout {
|
||||
spacing: Kirigami.Units.largeSpacing
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ a{
|
||||
|
||||
onLinkActivated: link => {
|
||||
spoilerRevealed = true
|
||||
RoomManager.openResource(link, "join")
|
||||
RoomManager.resolveResource(link, "join")
|
||||
}
|
||||
onHoveredLinkChanged: if (hoveredLink.length > 0 && hoveredLink !== "1") {
|
||||
applicationWindow().hoverLinkIndicator.text = hoveredLink;
|
||||
|
||||
@@ -206,7 +206,7 @@ QQC2.ScrollView {
|
||||
|
||||
onClicked: {
|
||||
userDelegate.highlighted = true;
|
||||
RoomManager.visitUser(room.getUser(userDelegate.userId).object, "mention")
|
||||
RoomManager.resolveResource(userDelegate.userId, "mention")
|
||||
}
|
||||
|
||||
contentItem: RowLayout {
|
||||
|
||||
@@ -191,7 +191,7 @@ Kirigami.Page {
|
||||
if (isJoined) {
|
||||
RoomManager.enterRoom(root.connection.room(roomId))
|
||||
} else {
|
||||
RoomManager.openResource(roomId, "join")
|
||||
RoomManager.resolveResource(roomId, "join")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -149,7 +149,7 @@ Item {
|
||||
if (root.isJoined) {
|
||||
root.enterRoom()
|
||||
} else {
|
||||
RoomManager.openResource(root.roomId, "join")
|
||||
RoomManager.resolveResource(root.roomId, "join")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ RowLayout {
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: RoomManager.openResource("https://matrix.to/#/" + root.author.id)
|
||||
onClicked: RoomManager.resolveResource("https://matrix.to/#/" + root.author.id)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,6 +73,6 @@ RowLayout {
|
||||
text: `<style>a {text-decoration: none;}</style><a href="https://matrix.to/#/${root.author.id}" style="color: ${root.author.color}">${root.authorDisplayName}</a> ${root.text}`
|
||||
wrapMode: Text.WordWrap
|
||||
textFormat: Text.RichText
|
||||
onLinkActivated: link => RoomManager.openResource(link)
|
||||
onLinkActivated: link => RoomManager.resolveResource(link)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,7 +156,7 @@ TimelineDelegate {
|
||||
elide: Qt.ElideRight
|
||||
textFormat: Text.RichText
|
||||
wrapMode: Text.WordWrap
|
||||
onLinkActivated: RoomManager.openResource(link)
|
||||
onLinkActivated: RoomManager.resolveResource(link)
|
||||
}
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
|
||||
@@ -72,7 +72,12 @@ MediaMessageFilterModel *RoomManager::mediaMessageFilterModel() const
|
||||
return m_mediaMessageFilterModel;
|
||||
}
|
||||
|
||||
void RoomManager::openResource(const QString &idOrUri, const QString &action)
|
||||
UriResolveResult RoomManager::resolveResource(const Uri &uri)
|
||||
{
|
||||
return UriResolverBase::visitResource(m_connection, uri);
|
||||
}
|
||||
|
||||
void RoomManager::resolveResource(const QString &idOrUri, const QString &action)
|
||||
{
|
||||
Uri uri{idOrUri};
|
||||
if (!uri.isValid()) {
|
||||
@@ -155,7 +160,7 @@ void RoomManager::loadInitialRoom()
|
||||
Q_ASSERT(m_connection);
|
||||
|
||||
if (!m_arg.isEmpty()) {
|
||||
openResource(m_arg);
|
||||
resolveResource(m_arg);
|
||||
}
|
||||
|
||||
if (m_currentRoom) {
|
||||
|
||||
@@ -32,6 +32,11 @@ using namespace Quotient;
|
||||
* @class RoomManager
|
||||
*
|
||||
* A singleton class to help manage which room is open in NeoChat.
|
||||
*
|
||||
* This class also inherits UriResolverBase and overrides the relevant functions to
|
||||
* resolve various URIs. The base functions visitUser(), visitRoom(), etc are held
|
||||
* private intentionally and instead resolveResource() should be called with either
|
||||
* an appropriate URI or a Matrix ID and action.
|
||||
*/
|
||||
class RoomManager : public QObject, public UriResolverBase
|
||||
{
|
||||
@@ -106,6 +111,26 @@ public:
|
||||
MessageFilterModel *messageFilterModel() const;
|
||||
MediaMessageFilterModel *mediaMessageFilterModel() const;
|
||||
|
||||
/**
|
||||
* @brief Resolve the given URI resource.
|
||||
*
|
||||
* @note It's actually Quotient::UriResolverBase::visitResource() but with Q_INVOKABLE
|
||||
* and the connection grabbed from RoomManager.
|
||||
*
|
||||
* @sa Quotient::UriResolverBase::visitResource()
|
||||
*/
|
||||
Q_INVOKABLE UriResolveResult resolveResource(const Uri &uri);
|
||||
|
||||
/**
|
||||
* @brief Resolve the given resource.
|
||||
*
|
||||
* @note It's actually Quotient::UriResolverBase::visitResource() but with Q_INVOKABLE
|
||||
* and the connection grabbed from RoomManager.
|
||||
*
|
||||
* @sa Quotient::UriResolverBase::visitResource()
|
||||
*/
|
||||
Q_INVOKABLE void resolveResource(const QString &idOrUri, const QString &action = {});
|
||||
|
||||
bool hasOpenRoom() const;
|
||||
|
||||
/**
|
||||
@@ -139,56 +164,6 @@ public:
|
||||
*/
|
||||
Q_INVOKABLE void enterSpaceHome(NeoChatRoom *spaceRoom);
|
||||
|
||||
// Overrided methods from UriResolverBase
|
||||
/**
|
||||
* @brief Resolve a user URI.
|
||||
*
|
||||
* This overloads Quotient::UriResolverBase::visitUser().
|
||||
*
|
||||
* Called by Quotient::UriResolverBase::visitResource() when the passed URI
|
||||
* identifies a Matrix user.
|
||||
*
|
||||
* @sa Quotient::UriResolverBase::visitUser(), Quotient::UriResolverBase::visitResource()
|
||||
*/
|
||||
Q_INVOKABLE UriResolveResult visitUser(User *user, const QString &action) override;
|
||||
|
||||
/**
|
||||
* @brief Visit a room.
|
||||
*
|
||||
* This overloads Quotient::UriResolverBase::visitRoom().
|
||||
*
|
||||
* Called by Quotient::UriResolverBase::visitResource() when the passed URI
|
||||
* identifies a room or an event in a room.
|
||||
*
|
||||
* @sa Quotient::UriResolverBase::visitRoom(), Quotient::UriResolverBase::visitResource()
|
||||
*/
|
||||
Q_INVOKABLE void visitRoom(Quotient::Room *room, const QString &eventId) override;
|
||||
|
||||
/**
|
||||
* @brief Join a room.
|
||||
*
|
||||
* This overloads Quotient::UriResolverBase::joinRoom().
|
||||
*
|
||||
* Called by Quotient::UriResolverBase::visitResource() when the passed URI has
|
||||
* `action() == "join"` and identifies a room that the user defined by the
|
||||
* Connection argument is not a member of.
|
||||
*
|
||||
* @sa Quotient::UriResolverBase::joinRoom(), Quotient::UriResolverBase::visitResource()
|
||||
*/
|
||||
void joinRoom(Quotient::Connection *account, const QString &roomAliasOrId, const QStringList &viaServers) override;
|
||||
|
||||
/**
|
||||
* @brief Visit a non-matrix resource.
|
||||
*
|
||||
* This overloads Quotient::UriResolverBase::visitNonMatrix().
|
||||
*
|
||||
* Called by Quotient::UriResolverBase::visitResource() when the passed URI
|
||||
* has `type() == NonMatrix`
|
||||
*
|
||||
* @sa Quotient::UriResolverBase::visitNonMatrix(), Quotient::UriResolverBase::visitResource()
|
||||
*/
|
||||
Q_INVOKABLE bool visitNonMatrix(const QUrl &url) override;
|
||||
|
||||
/**
|
||||
* @brief Knock a room.
|
||||
*
|
||||
@@ -197,16 +172,6 @@ public:
|
||||
*/
|
||||
void knockRoom(Quotient::Connection *account, const QString &roomAliasOrId, const QString &reason, const QStringList &viaServers);
|
||||
|
||||
/**
|
||||
* @brief Open the given resource.
|
||||
*
|
||||
* Convenience function to call Quotient::UriResolverBase::visitResource() from
|
||||
* QML if valid.
|
||||
*
|
||||
* @sa Quotient::UriResolverBase::visitResource()
|
||||
*/
|
||||
Q_INVOKABLE void openResource(const QString &idOrUri, const QString &action = {});
|
||||
|
||||
/**
|
||||
* @brief Show a media item maximized.
|
||||
*
|
||||
@@ -388,4 +353,69 @@ private:
|
||||
MessageFilterModel *m_messageFilterModel;
|
||||
MediaMessageFilterModel *m_mediaMessageFilterModel;
|
||||
NeoChatConnection *m_connection;
|
||||
|
||||
/**
|
||||
* @brief Resolve a user URI.
|
||||
*
|
||||
* This overloads Quotient::UriResolverBase::visitUser().
|
||||
*
|
||||
* Called by Quotient::UriResolverBase::visitResource() when the passed URI
|
||||
* identifies a Matrix user.
|
||||
*
|
||||
* @note This is private as resolveResource() should always be called, which
|
||||
* will in turn call Quotient::UriResolverBase::visitResource() and this
|
||||
* function if appropriate for the URI.
|
||||
*
|
||||
* @sa resolveResource(), Quotient::UriResolverBase::visitUser(), Quotient::UriResolverBase::visitResource()
|
||||
*/
|
||||
UriResolveResult visitUser(User *user, const QString &action) override;
|
||||
|
||||
/**
|
||||
* @brief Visit a room.
|
||||
*
|
||||
* This overloads Quotient::UriResolverBase::visitRoom().
|
||||
*
|
||||
* Called by Quotient::UriResolverBase::visitResource() when the passed URI
|
||||
* identifies a room or an event in a room.
|
||||
*
|
||||
* @note This is private as resolveResource() should always be called, which
|
||||
* will in turn call Quotient::UriResolverBase::visitResource() and this
|
||||
* function if appropriate for the URI.
|
||||
*
|
||||
* @sa resolveResource(), Quotient::UriResolverBase::visitUser(), Quotient::UriResolverBase::visitResource()
|
||||
*/
|
||||
Q_INVOKABLE void visitRoom(Quotient::Room *room, const QString &eventId) override;
|
||||
|
||||
/**
|
||||
* @brief Join a room.
|
||||
*
|
||||
* This overloads Quotient::UriResolverBase::joinRoom().
|
||||
*
|
||||
* Called by Quotient::UriResolverBase::visitResource() when the passed URI has
|
||||
* `action() == "join"` and identifies a room that the user defined by the
|
||||
* Connection argument is not a member of.
|
||||
*
|
||||
* @note This is private as resolveResource() should always be called, which
|
||||
* will in turn call Quotient::UriResolverBase::visitResource() and this
|
||||
* function if appropriate for the URI.
|
||||
*
|
||||
* @sa resolveResource(), Quotient::UriResolverBase::visitUser(), Quotient::UriResolverBase::visitResource()
|
||||
*/
|
||||
void joinRoom(Quotient::Connection *account, const QString &roomAliasOrId, const QStringList &viaServers) override;
|
||||
|
||||
/**
|
||||
* @brief Visit a non-matrix resource.
|
||||
*
|
||||
* This overloads Quotient::UriResolverBase::visitNonMatrix().
|
||||
*
|
||||
* Called by Quotient::UriResolverBase::visitResource() when the passed URI
|
||||
* has `type() == NonMatrix`
|
||||
*
|
||||
* @note This is private as resolveResource() should always be called, which
|
||||
* will in turn call Quotient::UriResolverBase::visitResource() and this
|
||||
* function if appropriate for the URI.
|
||||
*
|
||||
* @sa resolveResource(), Quotient::UriResolverBase::visitUser(), Quotient::UriResolverBase::visitResource()
|
||||
*/
|
||||
Q_INVOKABLE bool visitNonMatrix(const QUrl &url) override;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user