Use RosterModel and MessageModel as singletons
This commit is contained in:
parent
af698cac54
commit
24cb1ef92f
@ -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()
|
||||
|
12
src/Kaidan.h
12
src/Kaidan.h
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
});
|
||||
});
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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());
|
||||
|
@ -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())
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -181,7 +181,7 @@ Kirigami.ApplicationWindow {
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: Kaidan.rosterModel
|
||||
target: RosterModel
|
||||
|
||||
function onSubscriptionRequestReceived(from, msg) {
|
||||
Kaidan.client.vCardManager.vCardRequested(from)
|
||||
|
Loading…
x
Reference in New Issue
Block a user