experimenting with qml

This commit is contained in:
Blue 2020-08-12 19:55:01 +03:00
parent 38159eafeb
commit 4e6bd04b02
13 changed files with 176 additions and 69 deletions

View file

@ -20,6 +20,15 @@
#include <QDebug>
const QHash<int, QByteArray> MessageFeed::roles = {
{Text, "text"},
{Sender, "sender"},
{Date, "date"},
{DeliveryState, "deliveryState"},
{Correction, "correction"},
{SentByMe,"sentByMe"}
};
MessageFeed::MessageFeed(QObject* parent):
QAbstractListModel(parent),
storage(),
@ -69,25 +78,43 @@ void MessageFeed::removeMessage(const QString& id)
QVariant MessageFeed::data(const QModelIndex& index, int role) const
{
int i = index.row();
if (syncState == syncing) {
--i;
}
QVariant answer;
switch (role) {
case Qt::DisplayRole: {
if (i == -1) {
return "Loading...";
}
StorageByTime::const_iterator itr = indexByTime.nth(i);
if (itr != indexByTime.end()) {
const Shared::Message* msg = *itr;
answer = msg->getFrom() + ": " + msg->getBody();
}
StorageByTime::const_iterator itr = indexByTime.nth(i);
if (itr != indexByTime.end()) {
const Shared::Message* msg = *itr;
switch (role) {
case Text:
answer = msg->getBody();
break;
case Sender:
answer = msg->getFrom();
break;
case Date:
answer = msg->getTime();
break;
case DeliveryState:
answer = static_cast<unsigned int>(msg->getState());
break;
case Correction:
answer = msg->getEdited();
break;
case SentByMe:
answer = msg->getOutgoing();
break;
default:
break;
}
} else {
switch (role) {
case Text:
answer = "loading...";
break;
default:
answer = "";
break;
}
break;
default:
break;
}
return answer;
@ -115,27 +142,28 @@ bool MessageFeed::canFetchMore(const QModelIndex& parent) const
void MessageFeed::fetchMore(const QModelIndex& parent)
{
if (syncState == incomplete) {
beginInsertRows(QModelIndex(), 0, 0);
beginInsertRows(QModelIndex(), storage.size(), storage.size());
syncState = syncing;
endInsertRows();
if (storage.size() == 0) {
emit requestArchive("");
} else {
emit requestArchive((*indexByTime.nth(0))->getId());
emit requestArchive((*indexByTime.rbegin())->getId());
}
}
}
void MessageFeed::responseArchive(const std::list<Shared::Message> list)
{
Storage::size_type size = storage.size();
if (syncState == syncing) {
beginRemoveRows(QModelIndex(), 0, 0);
beginRemoveRows(QModelIndex(), size, size);
syncState = incomplete;
endRemoveRows();
}
beginInsertRows(QModelIndex(), 0, list.size() - 1);
beginInsertRows(QModelIndex(), size, size + list.size() - 1);
for (const Shared::Message& msg : list) {
Shared::Message* copy = new Shared::Message(msg);
storage.insert(copy);
@ -143,3 +171,7 @@ void MessageFeed::responseArchive(const std::list<Shared::Message> list)
endInsertRows();
}
QHash<int, QByteArray> MessageFeed::roleNames() const
{
return roles;
}

View file

@ -47,6 +47,8 @@ public:
bool canFetchMore(const QModelIndex & parent) const override;
void fetchMore(const QModelIndex & parent) override;
QHash<int, QByteArray> roleNames() const override;
void responseArchive(const std::list<Shared::Message> list);
unsigned int unreadMessagesCount() const;
@ -54,6 +56,15 @@ public:
signals:
void requestArchive(const QString& before);
public:
enum MessageRoles {
Text = Qt::UserRole + 1,
Sender,
Date,
DeliveryState,
Correction,
SentByMe
};
private:
enum SyncState {
incomplete,
@ -81,7 +92,8 @@ private:
Shared::Message,
QDateTime,
&Shared::Message::getTime
>
>,
std::greater<QDateTime>
>
>
> Storage;
@ -94,6 +106,7 @@ private:
SyncState syncState;
static const QHash<int, QByteArray> roles;
};