Surrendering - trying delta updates only after successful initialization
This commit is contained in:
parent
d29b3bd79b
commit
d87b5b84fb
4 changed files with 49 additions and 5 deletions
|
@ -127,6 +127,8 @@ CoverBackground {
|
||||||
width: parent.width - unreadMessagesCountText.width - Theme.paddingMedium
|
width: parent.width - unreadMessagesCountText.width - Theme.paddingMedium
|
||||||
wrapMode: Text.Wrap
|
wrapMode: Text.Wrap
|
||||||
anchors.verticalCenter: unreadMessagesCountText.verticalCenter
|
anchors.verticalCenter: unreadMessagesCountText.verticalCenter
|
||||||
|
maximumLineCount: 2
|
||||||
|
elide: Text.ElideRight
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ Page {
|
||||||
property int authorizationState: TelegramAPI.Closed
|
property int authorizationState: TelegramAPI.Closed
|
||||||
property int connectionState: TelegramAPI.WaitingForNetwork
|
property int connectionState: TelegramAPI.WaitingForNetwork
|
||||||
property int ownUserId;
|
property int ownUserId;
|
||||||
|
property bool chatListCreated: false;
|
||||||
|
|
||||||
onStatusChanged: {
|
onStatusChanged: {
|
||||||
console.log("[OverviewPage] Status changed: " + status + ", initialization completed: " + initializationCompleted);
|
console.log("[OverviewPage] Status changed: " + status + ", initialization completed: " + initializationCompleted);
|
||||||
|
@ -43,6 +44,17 @@ Page {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: chatListCreatedTimer
|
||||||
|
interval: 500
|
||||||
|
running: false
|
||||||
|
repeat: false
|
||||||
|
onTriggered: {
|
||||||
|
overviewPage.chatListCreated = true;
|
||||||
|
chatListModel.uiCreated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BusyLabel {
|
BusyLabel {
|
||||||
text: qsTr("Loading...")
|
text: qsTr("Loading...")
|
||||||
running: overviewPage.loading
|
running: overviewPage.loading
|
||||||
|
@ -117,9 +129,17 @@ Page {
|
||||||
onOwnUserIdFound: {
|
onOwnUserIdFound: {
|
||||||
overviewPage.ownUserId = ownUserId;
|
overviewPage.ownUserId = ownUserId;
|
||||||
}
|
}
|
||||||
|
onChatLastMessageUpdated: {
|
||||||
|
if (!overviewPage.chatListCreated) {
|
||||||
|
chatListCreatedTimer.stop();
|
||||||
|
chatListCreatedTimer.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
onChatOrderUpdated: {
|
onChatOrderUpdated: {
|
||||||
chatListSorterTimer.stop();
|
if (!overviewPage.chatListCreated) {
|
||||||
chatListSorterTimer.start();
|
chatListCreatedTimer.stop();
|
||||||
|
chatListCreatedTimer.start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
ChatListModel::ChatListModel(TDLibWrapper *tdLibWrapper)
|
ChatListModel::ChatListModel(TDLibWrapper *tdLibWrapper)
|
||||||
{
|
{
|
||||||
this->tdLibWrapper = tdLibWrapper;
|
this->tdLibWrapper = tdLibWrapper;
|
||||||
|
this->deltaUpdates = false;
|
||||||
connect(this->tdLibWrapper, SIGNAL(newChatDiscovered(QString, QVariantMap)), this, SLOT(handleChatDiscovered(QString, QVariantMap)));
|
connect(this->tdLibWrapper, SIGNAL(newChatDiscovered(QString, QVariantMap)), this, SLOT(handleChatDiscovered(QString, QVariantMap)));
|
||||||
connect(this->tdLibWrapper, SIGNAL(chatLastMessageUpdated(QString, QString, QVariantMap)), this, SLOT(handleChatLastMessageUpdated(QString, QString, QVariantMap)));
|
connect(this->tdLibWrapper, SIGNAL(chatLastMessageUpdated(QString, QString, QVariantMap)), this, SLOT(handleChatLastMessageUpdated(QString, QString, QVariantMap)));
|
||||||
connect(this->tdLibWrapper, SIGNAL(chatOrderUpdated(QString, QString)), this, SLOT(handleChatOrderUpdated(QString, QString)));
|
connect(this->tdLibWrapper, SIGNAL(chatOrderUpdated(QString, QString)), this, SLOT(handleChatOrderUpdated(QString, QString)));
|
||||||
|
@ -37,6 +38,13 @@ bool ChatListModel::insertRows(int row, int count, const QModelIndex &parent)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChatListModel::uiCreated()
|
||||||
|
{
|
||||||
|
qDebug() << "[ChatListModel] Chat list on UI created, enabling delta updates...";
|
||||||
|
layoutChanged();
|
||||||
|
this->deltaUpdates = true;
|
||||||
|
}
|
||||||
|
|
||||||
bool compareChats(const QVariant &chat1, const QVariant &chat2)
|
bool compareChats(const QVariant &chat1, const QVariant &chat2)
|
||||||
{
|
{
|
||||||
QVariantMap chatMap1 = chat1.toMap();
|
QVariantMap chatMap1 = chat1.toMap();
|
||||||
|
@ -102,22 +110,33 @@ void ChatListModel::updateChatOrder(const int ¤tChatIndex, const QVariantM
|
||||||
// Other alternative layoutChanged() after sorting resets the index position - there we would need to calculate the new position as well
|
// Other alternative layoutChanged() after sorting resets the index position - there we would need to calculate the new position as well
|
||||||
// If somebody has a better solution - go for it ;)
|
// If somebody has a better solution - go for it ;)
|
||||||
int newChatIndex = 0;
|
int newChatIndex = 0;
|
||||||
|
QVariantMap previousChat;
|
||||||
for (int i = 0; i < this->chatList.length(); i++) {
|
for (int i = 0; i < this->chatList.length(); i++) {
|
||||||
QVariantMap otherChat = this->chatList.at(i).toMap();
|
QVariantMap otherChat = this->chatList.at(i).toMap();
|
||||||
if (compareChats(updatedChat, otherChat)) {
|
if (compareChats(updatedChat, otherChat)) {
|
||||||
|
if (previousChat.value("id") == updatedChat.value("id")) {
|
||||||
|
newChatIndex = currentChatIndex;
|
||||||
|
} else {
|
||||||
newChatIndex = i;
|
newChatIndex = i;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
previousChat = otherChat;
|
||||||
}
|
}
|
||||||
if (newChatIndex != currentChatIndex) {
|
if (newChatIndex != currentChatIndex) {
|
||||||
// The updated chat now needs to go to the position of the other chat
|
// The updated chat now needs to go to the position of the other chat
|
||||||
qDebug() << "[ChatListModel] Chat " << updatedChat.value("id").toString() << " will be moved from position " << currentChatIndex << " to " << newChatIndex;
|
qDebug() << "[ChatListModel] Chat " << updatedChat.value("id").toString() << " will be moved from position " << currentChatIndex << " to " << newChatIndex;
|
||||||
|
if (deltaUpdates) {
|
||||||
beginMoveRows(QModelIndex(), currentChatIndex, currentChatIndex, QModelIndex(), (( newChatIndex < currentChatIndex ) ? newChatIndex : ( newChatIndex + 1 )));
|
beginMoveRows(QModelIndex(), currentChatIndex, currentChatIndex, QModelIndex(), (( newChatIndex < currentChatIndex ) ? newChatIndex : ( newChatIndex + 1 )));
|
||||||
|
}
|
||||||
std::sort(this->chatList.begin(), this->chatList.end(), compareChats);
|
std::sort(this->chatList.begin(), this->chatList.end(), compareChats);
|
||||||
this->chatIndexMap.clear();
|
this->chatIndexMap.clear();
|
||||||
for (int i = 0; i < this->chatList.length(); i++) {
|
for (int i = 0; i < this->chatList.length(); i++) {
|
||||||
this->chatIndexMap.insert(this->chatList.at(i).toMap().value("id").toString(), i);
|
this->chatIndexMap.insert(this->chatList.at(i).toMap().value("id").toString(), i);
|
||||||
}
|
}
|
||||||
|
if (deltaUpdates) {
|
||||||
endMoveRows();
|
endMoveRows();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,8 @@ public:
|
||||||
virtual QVariant data(const QModelIndex &index, int role) const override;
|
virtual QVariant data(const QModelIndex &index, int role) const override;
|
||||||
virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
|
virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
|
||||||
|
|
||||||
|
Q_INVOKABLE void uiCreated();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void handleChatDiscovered(const QString &chatId, const QVariantMap &chatInformation);
|
void handleChatDiscovered(const QString &chatId, const QVariantMap &chatInformation);
|
||||||
void handleChatLastMessageUpdated(const QString &chatId, const QString &order, const QVariantMap &lastMessage);
|
void handleChatLastMessageUpdated(const QString &chatId, const QString &order, const QVariantMap &lastMessage);
|
||||||
|
@ -28,6 +30,7 @@ private:
|
||||||
QVariantMap chatToBeAdded;
|
QVariantMap chatToBeAdded;
|
||||||
QVariantMap chatIndexMap;
|
QVariantMap chatIndexMap;
|
||||||
QMutex chatListMutex;
|
QMutex chatListMutex;
|
||||||
|
bool deltaUpdates;
|
||||||
|
|
||||||
void updateChatOrder(const int ¤tChatIndex, const QVariantMap &updatedChat);
|
void updateChatOrder(const int ¤tChatIndex, const QVariantMap &updatedChat);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue