aboutsummaryrefslogtreecommitdiff
path: root/qml/ChatlistPage.qml
blob: 985afaf0f1514256abb8019cc9f8fc3ba34cf832 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtQml.Models 2.1
import org.kde.kirigami 2.12 as Kirigami

import DeltaChat 1.0

Kirigami.Page {
    title: qsTr("Chats")
    id: chatlistPage

    property DcContext context

    signal messagesChanged
    onMessagesChanged: {
        // Reload chatlist
        updateChatlist();
    }

    Component.onCompleted: {
        eventEmitter.onMessagesChanged.connect(messagesChanged)
        updateChatlist()
    }

    ListModel {
        id: chatlistModel
    }

    function updateChatlist() {
        let chatlist = chatlistPage.context.getChatlist()

        // Merge new chatlist with existing one.
        // To preserve selected item, we do not simply clear and fill
        // the model from scratch.

        for (let i = 0; i < chatlist.getChatCount(); i++) {
            const summary = chatlist.getSummary(i)
            const chatId = chatlist.getChatId(i)

            const item = {
                chatId: chatId,
                msgId: chatlist.getMsgId(i),
                username: summary.text1
            }

            let j;
            for (j = i; j < chatlistModel.count; j++) {
                if (chatlistModel.get(j).chatId == chatId) {
                    // This chat was already in the chatlist,
                    // move it to the new place and update.
                    chatlistModel.move(j, i, 1)
                    chatlistModel.set(i, item)
                    break
                }
            }

            // This chat is new, insert it.
            if (j == chatlistModel.count) {
                chatlistModel.insert(i, item)
            }
        }

        // Remove any chats that are not present in the new chatlist.
        if (chatlistModel.count > chatlist.getChatCount()) {
            chatlistModel.remove(chatlist.getChatCount(),
                                 chatlistModel.count - chatlist.getChatCount())
        }
    }

    ListView {
        id: chatlist

        anchors.fill: parent
        model: chatlistModel

        onCurrentItemChanged: {
            var chatId = chatlistModel.get(currentIndex).chatId

            console.log("Current index is " + currentIndex)
            console.log("Selected chat " + chatId)

            console.log("Depth is " + pageStack.depth)
            let chatPageComponent = Qt.createComponent("qrc:/qml/ChatPage.qml")
            if (chatPageComponent.status == Component.Ready) {
                let myPage = chatPageComponent.createObject(chatlistPage, {chatId: chatId})
                if (pageStack.depth == 2) {
                    pageStack.push(myPage)
                } else if (pageStack.depth == 3) {
                    pageStack.currentIndex = 2
                    pageStack.replace(myPage)
                }
            } else if (chatPageComponent.status == Component.Error) {
                console.log("Error loading chat page: " + chatPageComponent.errorString())
            }
        }

        delegate: Kirigami.BasicListItem {
            width: chatlist.width

            label: chatlistPage.context.getChat(model.chatId).getName()
            subtitle: model.username
        }

        ScrollBar.vertical: ScrollBar {}
    }
}