~libqtelegram-team/telegram-app/register-notifypeertype

« back to all changes in this revision

Viewing changes to qmlplugin/models/messagesmodel.cpp

messages model sorted insertion to avoid using qsortfilterproxymodel

Show diffs side-by-side

added added

removed removed

Lines of Context:
145
145
    } else {
146
146
        beginInsertRows(QModelIndex(), mMessages.count(), mMessages.count() + messages.count() - 1);
147
147
        Q_FOREACH (const MessageItem newMessage, messages) {
148
 
            mKeysMap.insert(newMessage.id(), mMessages.count());
149
148
            mMessages << newMessage;
 
149
            mKeysMap.insert(newMessage.id(), &mMessages[mMessages.count() - 1]);
150
150
        }
151
151
        endInsertRows();
152
152
    }
353
353
void MessagesModel::onMessageAdded(const MessageItem &message) {
354
354
 
355
355
    if (acceptMessage(message)) {
 
356
 
356
357
        if (!exists(message)) {
357
 
            mKeysMap.insert(message.id(), mMessages.count());
358
 
 
359
 
            beginInsertRows(QModelIndex(), mMessages.count(), mMessages.count());
360
 
            mMessages.append(message);
 
358
            beginInsertRows(QModelIndex(), 0, 0);
 
359
            mMessages.prepend(message);
361
360
            endInsertRows();
 
361
 
 
362
            mKeysMap.insert(message.id(), &mMessages[0]);
362
363
        }
363
364
    }
364
365
}
379
380
 
380
381
    beginInsertRows(QModelIndex(), mMessages.count(), mMessages.count() + filteredMessages.count() - 1);
381
382
    Q_FOREACH (const MessageItem newMessage, filteredMessages) {
382
 
        mKeysMap.insert(newMessage.id(), mMessages.count());
383
383
        mMessages << newMessage;
 
384
        mKeysMap.insert(newMessage.id(), &mMessages[mMessages.count() -1]);
384
385
    }
385
386
    endInsertRows();
386
387
 
393
394
 
394
395
void MessagesModel::onMessageUpdated(qint32 msgId, const MessageItem &message) {
395
396
 
396
 
    qint32 pos = mKeysMap.value(msgId, -1);
397
 
 
398
 
    if (pos >= 0) {
399
 
        mMessages[pos] = message;
400
 
 
 
397
    MessageItem *messageItem = mKeysMap.value(msgId);
 
398
 
 
399
    if (messageItem) {
401
400
        if (msgId != message.id()) {
402
401
            mKeysMap.remove(msgId);
403
 
            mKeysMap.insert(message.id(), pos);
 
402
            mKeysMap.insert(message.id(), messageItem);
404
403
        }
405
404
 
 
405
        *messageItem = message;
 
406
 
 
407
        int pos = mMessages.indexOf(*messageItem);
 
408
 
406
409
        Q_EMIT dataChanged(index(pos), index(pos));
407
410
    }
408
411
}
423
426
 
424
427
void MessagesModel::onMessagePhotoUpdated(qint32 msgId, const QString &localPath, bool isThumbnail) {
425
428
 
426
 
    qint32 pos = mKeysMap.value(msgId, -1);
427
 
 
428
 
    if (pos >= 0) {
429
 
 
430
 
        MessageItem &message = mMessages[pos];
 
429
    MessageItem *messageItem = mKeysMap.value(msgId);
 
430
    if (messageItem) {
 
431
        qint32 pos = mMessages.indexOf(*messageItem);
 
432
 
431
433
        QVector<qint32> changedRoles;
432
434
 
433
435
        if (isThumbnail) {
434
 
            message.setThumbnail(localPath);
 
436
            messageItem->setThumbnail(localPath);
435
437
            changedRoles.append(ThumbnailRole);
436
438
        } else {
437
 
            message.setPhoto(localPath);
 
439
            messageItem->setPhoto(localPath);
438
440
            changedRoles.append(PhotoRole);
439
441
        }
440
442
 
444
446
 
445
447
void MessagesModel::onMessageVideoUpdated(qint32 msgId, const QString &videoLocalPath) {
446
448
 
447
 
    qint32 pos = mKeysMap.value(msgId, -1);
448
 
 
449
 
    if (pos >= 0) {
450
 
 
451
 
        MessageItem &message = mMessages[pos];
 
449
    MessageItem *messageItem = mKeysMap.value(msgId);
 
450
    if (messageItem) {
 
451
 
 
452
        qint32 pos = mMessages.indexOf(*messageItem);
 
453
 
452
454
        const QVector<qint32> changedRoles(QVector<qint32>() << VideoRole);
453
455
 
454
 
        message.setVideo(videoLocalPath);
 
456
        messageItem->setVideo(videoLocalPath);
455
457
 
456
458
        Q_EMIT dataChanged(index(pos), index(pos), changedRoles);
457
459
    }
459
461
 
460
462
void MessagesModel::onMessageDownloadingUpdated(qint32 msgId, bool downloading) {
461
463
 
462
 
    qint32 pos = mKeysMap.value(msgId, -1);
463
 
 
464
 
    if (pos >= 0) {
465
 
 
466
 
        MessageItem &message = mMessages[pos];
 
464
    MessageItem *messageItem = mKeysMap.value(msgId);
 
465
    if (messageItem) {
 
466
 
 
467
        qint32 pos = mMessages.indexOf(*messageItem);
 
468
 
467
469
        const QVector<qint32> changedRoles(QVector<qint32>() << DownloadingRole);
468
470
 
469
 
        message.setDownloading(downloading);
 
471
        messageItem->setDownloading(downloading);
470
472
 
471
473
        Q_EMIT dataChanged(index(pos), index(pos), changedRoles);
472
474
    }
474
476
 
475
477
void MessagesModel::onMessageDownloadedPercentageUpdated(qint32 msgId, qint8 downloadedPercentage) {
476
478
 
477
 
    qint32 pos = mKeysMap.value(msgId, -1);
 
479
    MessageItem *messageItem = mKeysMap.value(msgId);
 
480
    if (messageItem) {
 
481
        qint32 pos = mMessages.indexOf(*messageItem);
478
482
 
479
 
    if (pos >= 0) {
480
483
        bool downloading = downloadedPercentage > 0 && downloadedPercentage < 100;
481
 
        mMessages[pos].setDownloading(downloading);
482
 
        mMessages[pos].setDownloadedPercentage(downloadedPercentage);
 
484
        messageItem->setDownloading(downloading);
 
485
        messageItem->setDownloadedPercentage(downloadedPercentage);
483
486
        QModelIndex i = index(pos);
484
487
        Q_EMIT dataChanged(i, i, DOWNLOADED_PERCENTAGE_CHANGED_ROLES);
485
488
    }
493
496
                beginRemoveRows(QModelIndex(), i, i);
494
497
                mMessages.removeAt(i);
495
498
                endRemoveRows();
 
499
                mKeysMap.remove(msgId);
496
500
            }
497
501
        }
498
502
    }
499
 
 
500
 
    // after messages deletion update mKeysMap with the new msdId - pos relationship
501
 
    mKeysMap.clear();
502
 
    for (int i = 0; i < mMessages.count(); i++) {
503
 
        mKeysMap.insert(mMessages.at(i).id(), i);
504
 
    }
505
503
}
506
504
 
507
505
bool MessagesModel::exists(const MessageItem &message) {
508
 
    qint32 pos = mKeysMap.value(message.id(), -1);
509
 
    return pos >= 0;
 
506
    return mKeysMap.value(message.id(), 0) != 0;
510
507
}