Use RosterModel and MessageModel as singletons

This commit is contained in:
Melvin Keskin 2021-02-16 19:41:59 +01:00 committed by Linus Jahn
parent af698cac54
commit 24cb1ef92f
16 changed files with 75 additions and 52 deletions

View File

@ -63,11 +63,11 @@ ClientWorker::ClientWorker(Caches *caches, bool enableLogging, QObject* parent)
m_enableLogging(enableLogging),
m_registrationManager(new RegistrationManager(this, m_client, m_caches->settings, this)),
m_vCardManager(new VCardManager(this, m_client, m_caches->avatarStorage, this)),
m_rosterManager(new RosterManager(m_client, m_caches->rosterModel, m_caches->avatarStorage, m_vCardManager, this)),
m_messageHandler(new MessageHandler(this, m_client, m_caches->msgModel, this)),
m_rosterManager(new RosterManager(m_client, RosterModel::instance(), m_caches->avatarStorage, m_vCardManager, this)),
m_messageHandler(new MessageHandler(this, m_client, MessageModel::instance(), this)),
m_discoveryManager(new DiscoveryManager(m_client, this)),
m_uploadManager(new UploadManager(m_client, m_rosterManager, this)),
m_downloadManager(new DownloadManager(caches->transferCache, caches->msgModel, this)),
m_downloadManager(new DownloadManager(caches->transferCache, MessageModel::instance(), this)),
m_versionManager(new VersionManager(m_client, this)),
m_isApplicationWindowActive(true)
{
@ -309,7 +309,7 @@ void ClientWorker::onConnected()
// automatically in case of a connection outage.
m_client->configuration().setAutoReconnectionEnabled(true);
m_caches->msgModel->sendPendingMessages();
MessageModel::instance()->sendPendingMessages();
}
void ClientWorker::onDisconnected()

View File

@ -57,8 +57,6 @@ class Kaidan : public QObject
Q_OBJECT
Q_PROPERTY(ClientWorker* client READ client CONSTANT)
Q_PROPERTY(RosterModel* rosterModel READ rosterModel CONSTANT)
Q_PROPERTY(MessageModel* messageModel READ messageModel CONSTANT)
Q_PROPERTY(AvatarFileStorage* avatarStorage READ avatarStorage NOTIFY avatarStorageChanged)
Q_PROPERTY(PresenceCache* presenceCache READ presenceCache CONSTANT)
Q_PROPERTY(TransferCache* transferCache READ transferCache CONSTANT)
@ -154,16 +152,6 @@ public:
return m_client;
}
RosterModel* rosterModel() const
{
return m_caches->rosterModel;
}
MessageModel* messageModel() const
{
return m_caches->msgModel;
}
AvatarFileStorage* avatarStorage() const
{
return m_caches->avatarStorage;

View File

@ -43,10 +43,20 @@ constexpr int MAX_CORRECTION_MESSAGE_COUNT_DEPTH = 20;
// defines that the message is suitable for correction only if it has ben sent not earlier than N days ago
constexpr int MAX_CORRECTION_MESSAGE_DAYS_DEPTH = 2;
MessageModel *MessageModel::s_instance = nullptr;
MessageModel *MessageModel::instance()
{
return s_instance;
}
MessageModel::MessageModel(MessageDb *msgDb, QObject *parent)
: QAbstractListModel(parent),
m_msgDb(msgDb)
{
Q_ASSERT(!s_instance);
s_instance = this;
connect(msgDb, &MessageDb::messagesFetched,
this, &MessageModel::handleMessagesFetched);
connect(msgDb, &MessageDb::pendingMessagesFetched,

View File

@ -66,6 +66,8 @@ public:
};
Q_ENUM(MessageRoles)
static MessageModel *instance();
MessageModel(MessageDb *msgDb, QObject *parent = nullptr);
~MessageModel();
@ -152,4 +154,6 @@ private:
QVector<Message> m_messages;
QString m_currentChatJid;
bool m_fetchedAll = false;
static MessageModel *s_instance;
};

View File

@ -37,6 +37,7 @@
// Kaidan
#include "Kaidan.h"
#include "RosterModel.h"
// Q_OS_BSD4 includes all BSD variants and also Q_OS_DARWIN
// Q_OS_LINUX is also defined on Android
@ -73,7 +74,7 @@ void Notifications::sendMessageNotification(const QString &senderJid, const QStr
emit Kaidan::instance()->raiseWindowRequested();
});
QObject::connect(notification, &KNotification::action1Activated, [=] {
emit Kaidan::instance()->rosterModel()->updateItemRequested(senderJid, [=](RosterItem &item) {
emit RosterModel::instance()->updateItemRequested(senderJid, [=](RosterItem &item) {
item.setUnreadMessages(0);
});
});

View File

@ -70,7 +70,7 @@ RosterManager::RosterManager(QXmppClient *client,
connect(m_manager, &QXmppRosterManager::subscriptionReceived,
this, [this] (const QString &jid) {
// emit signal to ask user
emit Kaidan::instance()->rosterModel()->subscriptionRequestReceived(jid, {});
emit RosterModel::instance()->subscriptionRequestReceived(jid, {});
});
connect(this, &RosterManager::answerSubscriptionRequestRequested,
this, [=] (QString jid, bool accepted) {

View File

@ -36,10 +36,20 @@
#include "MessageModel.h"
#include "Kaidan.h"
RosterModel *RosterModel::s_instance = nullptr;
RosterModel *RosterModel::instance()
{
return s_instance;
}
RosterModel::RosterModel(RosterDb *rosterDb, QObject *parent)
: QAbstractListModel(parent),
m_rosterDb(rosterDb)
{
Q_ASSERT(!s_instance);
s_instance = this;
connect(rosterDb, &RosterDb::itemsFetched,
this, &RosterModel::handleItemsFetched);
@ -257,7 +267,7 @@ void RosterModel::handleMessageAdded(const Message &message)
if (message.sentByMe()) {
// if we sent a message (with another device), reset counter
newUnreadMessages = 0;
} else if (Kaidan::instance()->messageModel()->currentChatJid() != contactJid) {
} else if (MessageModel::instance()->currentChatJid() != contactJid) {
// increase counter, if chat isn't open
newUnreadMessages = itr->unreadMessages() + 1;
}

View File

@ -56,6 +56,8 @@ public:
LastMessageRole,
};
static RosterModel *instance();
RosterModel(RosterDb *rosterDb, QObject *parent = nullptr);
void setMessageModel(MessageModel *model);
@ -106,4 +108,6 @@ private:
RosterDb *m_rosterDb;
QVector<RosterItem> m_items;
static RosterModel *s_instance;
};

View File

@ -99,7 +99,7 @@ void UploadManager::sendFile(const QString &jid, const QUrl &fileUrl, const QStr
emit Kaidan::instance()->transferCache()->addJobRequested(msgId, upload->bytesTotal());
m_messages.insert(upload->id(), msg);
emit Kaidan::instance()->messageModel()->addMessageRequested(*msg);
emit MessageModel::instance()->addMessageRequested(*msg);
connect(upload, &QXmppHttpUpload::bytesSentChanged, this, [=] () {
emit Kaidan::instance()->transferCache()->setJobBytesSentRequested(
@ -118,7 +118,7 @@ void UploadManager::handleUploadSucceeded(const QXmppHttpUpload *upload)
? oobUrl
: originalMsg->body() + "\n" + oobUrl;
emit Kaidan::instance()->messageModel()->updateMessageRequested(originalMsg->id(), [=] (Message &msg) {
emit MessageModel::instance()->updateMessageRequested(originalMsg->id(), [=] (Message &msg) {
msg.setOutOfBandUrl(oobUrl);
});
@ -131,11 +131,11 @@ void UploadManager::handleUploadSucceeded(const QXmppHttpUpload *upload)
bool success = m_client->sendPacket(m);
if (success) {
emit Kaidan::instance()->messageModel()->setMessageDeliveryStateRequested(
emit MessageModel::instance()->setMessageDeliveryStateRequested(
originalMsg->id(), Enums::DeliveryState::Sent);
} else {
emit Kaidan::instance()->passiveNotificationRequested(tr("Message could not be sent."));
emit Kaidan::instance()->messageModel()->setMessageDeliveryStateRequested(originalMsg->id(), Enums::DeliveryState::Error, "Message could not be sent.");
emit MessageModel::instance()->setMessageDeliveryStateRequested(originalMsg->id(), Enums::DeliveryState::Error, "Message could not be sent.");
}
m_messages.remove(upload->id());

View File

@ -427,6 +427,12 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
qmlRegisterSingletonType<AccountManager>(APPLICATION_ID, 1, 0, "AccountManager", [](QQmlEngine *, QJSEngine *) {
return static_cast<QObject *>(AccountManager::instance());
});
qmlRegisterSingletonType<RosterModel>(APPLICATION_ID, 1, 0, "RosterModel", [](QQmlEngine *, QJSEngine *) {
return static_cast<QObject *>(RosterModel::instance());
});
qmlRegisterSingletonType<MessageModel>(APPLICATION_ID, 1, 0, "MessageModel", [](QQmlEngine *, QJSEngine *) {
return static_cast<QObject *>(MessageModel::instance());
});
engine.load(QUrl("qrc:/qml/main.qml"));
if (engine.rootObjects().isEmpty())

View File

@ -46,7 +46,7 @@ ChatPageBase {
anchors.fill: parent
onDropped: (drop) => {
if (drop.urls.length > 0) {
sendMediaSheet.sendFile(Kaidan.messageModel.currentChatJid, drop.urls[0])
sendMediaSheet.sendFile(MessageModel.currentChatJid, drop.urls[0])
}
}
}
@ -58,14 +58,14 @@ ChatPageBase {
var imageUrl = Utils.pasteImage();
// check if there was an image to be pasted from the clipboard
if (imageUrl.toString().length > 0) {
sendMediaSheet.sendFile(Kaidan.messageModel.currentChatJid, imageUrl)
sendMediaSheet.sendFile(MessageModel.currentChatJid, imageUrl)
}
}
}
property string chatName: {
var currentChatJid = Kaidan.messageModel.currentChatJid
var chatDisplayName = Kaidan.rosterModel.itemName(currentChatJid)
var currentChatJid = MessageModel.currentChatJid
var chatDisplayName = RosterModel.itemName(currentChatJid)
return chatDisplayName ? chatDisplayName : currentChatJid
}
@ -93,19 +93,19 @@ ChatPageBase {
Kirigami.Action {
visible: true
icon.name: {
Kaidan.notificationsMuted(Kaidan.messageModel.currentChatJid)
Kaidan.notificationsMuted(MessageModel.currentChatJid)
? "audio-volume-high-symbolic"
: "audio-volume-muted-symbolic"
}
text: {
Kaidan.notificationsMuted(Kaidan.messageModel.currentChatJid)
Kaidan.notificationsMuted(MessageModel.currentChatJid)
? qsTr("Unmute notifications")
: qsTr("Mute notifications")
}
onTriggered: {
Kaidan.setNotificationsMuted(
Kaidan.messageModel.currentChatJid,
!Kaidan.notificationsMuted(Kaidan.messageModel.currentChatJid)
MessageModel.currentChatJid,
!Kaidan.notificationsMuted(MessageModel.currentChatJid)
)
}
@ -113,10 +113,10 @@ ChatPageBase {
target: Kaidan
function onNotificationsMuted(jid) {
text = Kaidan.notificationsMuted(Kaidan.messageModel.currentChatJid)
text = Kaidan.notificationsMuted(MessageModel.currentChatJid)
? qsTr("Unmute notifications")
: qsTr("Mute notifications")
icon.name = Kaidan.notificationsMuted(Kaidan.messageModel.currentChatJid)
icon.name = Kaidan.notificationsMuted(MessageModel.currentChatJid)
? "audio-volume-high-symbolic"
: "audio-volume-muted-symbolic"
}
@ -126,7 +126,7 @@ ChatPageBase {
visible: true
icon.name: "avatar-default-symbolic"
text: qsTr("View profile")
onTriggered: pageStack.push(userProfilePage, {jid: Kaidan.messageModel.currentChatJid, name: chatName})
onTriggered: pageStack.push(userProfilePage, {jid: MessageModel.currentChatJid, name: chatName})
},
Kirigami.Action {
readonly property int type: Enums.MessageType.MessageImage
@ -139,7 +139,7 @@ ChatPageBase {
}
onTriggered: {
sendMediaSheet.sendNewMessageType(Kaidan.messageModel.currentChatJid, type)
sendMediaSheet.sendNewMessageType(MessageModel.currentChatJid, type)
}
},
Kirigami.Action {
@ -152,7 +152,7 @@ ChatPageBase {
}
onTriggered: {
sendMediaSheet.sendNewMessageType(Kaidan.messageModel.currentChatJid, type)
sendMediaSheet.sendNewMessageType(MessageModel.currentChatJid, type)
}
},
Kirigami.Action {
@ -166,7 +166,7 @@ ChatPageBase {
}
onTriggered: {
sendMediaSheet.sendNewMessageType(Kaidan.messageModel.currentChatJid, type)
sendMediaSheet.sendNewMessageType(MessageModel.currentChatJid, type)
}
},
Kirigami.Action {
@ -179,7 +179,7 @@ ChatPageBase {
}
onTriggered: {
sendMediaSheet.sendNewMessageType(Kaidan.messageModel.currentChatJid, type)
sendMediaSheet.sendNewMessageType(MessageModel.currentChatJid, type)
}
},
Kirigami.Action {
@ -226,16 +226,16 @@ ChatPageBase {
if (searchBar.active && searchField.text.length > 0) {
if (searchUpwards) {
if (startIndex === 0) {
newIndex = Kaidan.messageModel.searchForMessageFromNewToOld(searchField.text)
newIndex = MessageModel.searchForMessageFromNewToOld(searchField.text)
} else {
newIndex = Kaidan.messageModel.searchForMessageFromNewToOld(searchField.text, startIndex)
newIndex = MessageModel.searchForMessageFromNewToOld(searchField.text, startIndex)
if (newIndex === -1)
newIndex = Kaidan.messageModel.searchForMessageFromNewToOld(searchField.text, 0)
newIndex = MessageModel.searchForMessageFromNewToOld(searchField.text, 0)
}
} else {
newIndex = Kaidan.messageModel.searchForMessageFromOldToNew(searchField.text, startIndex)
newIndex = MessageModel.searchForMessageFromOldToNew(searchField.text, startIndex)
if (newIndex === -1)
newIndex = Kaidan.messageModel.searchForMessageFromOldToNew(searchField.text)
newIndex = MessageModel.searchForMessageFromOldToNew(searchField.text)
}
}
messageListView.currentIndex = newIndex
@ -345,7 +345,7 @@ ChatPageBase {
fileChooserLoader.item.selectedNameFilter = nameFilter
fileChooserLoader.item.accepted.connect(
function() {
sendMediaSheet.sendFile(Kaidan.messageModel.currentChatJid, fileChooserLoader.item.fileUrl)
sendMediaSheet.sendFile(MessageModel.currentChatJid, fileChooserLoader.item.fileUrl)
}
)
if (title !== undefined)
@ -472,7 +472,7 @@ ChatPageBase {
currentIndex: -1
// Connect to the database,
model: Kaidan.messageModel
model: MessageModel
ChatMessageContextMenu {
id: messageContextMenu

View File

@ -102,7 +102,7 @@ Kirigami.ScrollablePage {
width: root.width
model: RosterFilterProxyModel {
id: filterModel
sourceModel: Kaidan.rosterModel
sourceModel: RosterModel
}
delegate: RosterListItem {
@ -136,7 +136,7 @@ Kirigami.ScrollablePage {
* @param chatJid JID of the chat for which the chat page is opened
*/
function openChatPage(chatJid) {
Kaidan.messageModel.currentChatJid = chatJid
MessageModel.currentChatJid = chatJid
searchAction.checked = false
// Close all pages (especially the chat page) except the roster page.

View File

@ -54,7 +54,7 @@ Controls.Menu {
Controls.MenuItem {
text: qsTr("Edit message")
enabled: Kaidan.messageModel.canCorrectMessage(root.message && root.message.modelIndex)
enabled: MessageModel.canCorrectMessage(root.message && root.message.modelIndex)
onTriggered: root.message.messageEditRequested(root.message.msgId, root.message.messageBody)
}

View File

@ -198,13 +198,13 @@ Controls.Pane {
// Send the message.
if (messageArea.state === "compose") {
Kaidan.client.messageHandler.sendMessageRequested(
Kaidan.messageModel.currentChatJid,
MessageModel.currentChatJid,
messageArea.text,
chatPage.isWritingSpoiler,
spoilerHintField.text
)
} else if (messageArea.state === "edit") {
Kaidan.messageModel.correctMessage(chatPage.messageToCorrect, messageArea.text)
MessageModel.correctMessage(chatPage.messageToCorrect, messageArea.text)
}
clearMessageArea()

View File

@ -43,7 +43,7 @@ Kirigami.SwipeListItem {
property string name
property string lastMessage
property int unreadMessages
property bool isSelected: !Kirigami.Settings.isMobile && Kaidan.messageModel.currentChatJid === jid
property bool isSelected: !Kirigami.Settings.isMobile && MessageModel.currentChatJid === jid
topPadding: 0
leftPadding: 0

View File

@ -181,7 +181,7 @@ Kirigami.ApplicationWindow {
}
Connections {
target: Kaidan.rosterModel
target: RosterModel
function onSubscriptionRequestReceived(from, msg) {
Kaidan.client.vCardManager.vCardRequested(from)