mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 19:08:58 +03:00
Fetch missing events for replies
This commit is contained in:
parent
91a576fac1
commit
4727f1c2bb
4 changed files with 105 additions and 53 deletions
|
@ -18,6 +18,10 @@ Item {
|
||||||
roleValue: model.data.type
|
roleValue: model.data.type
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
|
DelegateChoice {
|
||||||
|
roleValue: MtxEvent.UnknownMessage
|
||||||
|
Placeholder { text: "Unretrieved event" }
|
||||||
|
}
|
||||||
DelegateChoice {
|
DelegateChoice {
|
||||||
roleValue: MtxEvent.TextMessage
|
roleValue: MtxEvent.TextMessage
|
||||||
TextMessage {}
|
TextMessage {}
|
||||||
|
|
|
@ -70,8 +70,9 @@ struct RoomEventType
|
||||||
case EventType::Tag:
|
case EventType::Tag:
|
||||||
return qml_mtx_events::EventType::Tag;
|
return qml_mtx_events::EventType::Tag;
|
||||||
case EventType::Unsupported:
|
case EventType::Unsupported:
|
||||||
default:
|
|
||||||
return qml_mtx_events::EventType::Unsupported;
|
return qml_mtx_events::EventType::Unsupported;
|
||||||
|
default:
|
||||||
|
return qml_mtx_events::EventType::UnknownMessage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qml_mtx_events::EventType operator()(const mtx::events::Event<mtx::events::msg::Audio> &)
|
qml_mtx_events::EventType operator()(const mtx::events::Event<mtx::events::msg::Audio> &)
|
||||||
|
@ -175,6 +176,17 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
|
||||||
connect(
|
connect(
|
||||||
this, &TimelineModel::nextPendingMessage, this, &TimelineModel::processOnePendingMessage);
|
this, &TimelineModel::nextPendingMessage, this, &TimelineModel::processOnePendingMessage);
|
||||||
connect(this, &TimelineModel::newMessageToSend, this, &TimelineModel::addPendingMessage);
|
connect(this, &TimelineModel::newMessageToSend, this, &TimelineModel::addPendingMessage);
|
||||||
|
|
||||||
|
connect(this,
|
||||||
|
&TimelineModel::replyFetched,
|
||||||
|
this,
|
||||||
|
[this](QString requestingEvent, mtx::events::collections::TimelineEvents event) {
|
||||||
|
events.insert(QString::fromStdString(mtx::accessors::event_id(event)),
|
||||||
|
event);
|
||||||
|
auto idx = idToIndex(requestingEvent);
|
||||||
|
if (idx >= 0)
|
||||||
|
emit dataChanged(index(idx, 0), index(idx, 0));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QHash<int, QByteArray>
|
QHash<int, QByteArray>
|
||||||
|
@ -216,20 +228,15 @@ QVariantMap
|
||||||
TimelineModel::getDump(QString eventId) const
|
TimelineModel::getDump(QString eventId) const
|
||||||
{
|
{
|
||||||
if (events.contains(eventId))
|
if (events.contains(eventId))
|
||||||
return data(index(idToIndex(eventId), 0), Dump).toMap();
|
return data(eventId, Dump).toMap();
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant
|
QVariant
|
||||||
TimelineModel::data(const QModelIndex &index, int role) const
|
TimelineModel::data(const QString &id, int role) const
|
||||||
{
|
{
|
||||||
using namespace mtx::accessors;
|
using namespace mtx::accessors;
|
||||||
namespace acc = mtx::accessors;
|
namespace acc = mtx::accessors;
|
||||||
if (index.row() < 0 && index.row() >= (int)eventOrder.size())
|
|
||||||
return QVariant();
|
|
||||||
|
|
||||||
QString id = eventOrder[index.row()];
|
|
||||||
|
|
||||||
mtx::events::collections::TimelineEvents event = events.value(id);
|
mtx::events::collections::TimelineEvents event = events.value(id);
|
||||||
|
|
||||||
if (auto e =
|
if (auto e =
|
||||||
|
@ -238,28 +245,6 @@ TimelineModel::data(const QModelIndex &index, int role) const
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case Section: {
|
|
||||||
QDateTime date = origin_server_ts(event);
|
|
||||||
date.setTime(QTime());
|
|
||||||
|
|
||||||
std::string userId = acc::sender(event);
|
|
||||||
|
|
||||||
for (size_t r = index.row() + 1; r < eventOrder.size(); r++) {
|
|
||||||
auto tempEv = events.value(eventOrder[r]);
|
|
||||||
QDateTime prevDate = origin_server_ts(tempEv);
|
|
||||||
prevDate.setTime(QTime());
|
|
||||||
if (prevDate != date)
|
|
||||||
return QString("%2 %1")
|
|
||||||
.arg(date.toMSecsSinceEpoch())
|
|
||||||
.arg(QString::fromStdString(userId));
|
|
||||||
|
|
||||||
std::string prevUserId = acc::sender(tempEv);
|
|
||||||
if (userId != prevUserId)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return QString("%1").arg(QString::fromStdString(userId));
|
|
||||||
}
|
|
||||||
case UserId:
|
case UserId:
|
||||||
return QVariant(QString::fromStdString(acc::sender(event)));
|
return QVariant(QString::fromStdString(acc::sender(event)));
|
||||||
case UserName:
|
case UserName:
|
||||||
|
@ -329,28 +314,27 @@ TimelineModel::data(const QModelIndex &index, int role) const
|
||||||
QVariantMap m;
|
QVariantMap m;
|
||||||
auto names = roleNames();
|
auto names = roleNames();
|
||||||
|
|
||||||
// m.insert(names[Section], data(index, static_cast<int>(Section)));
|
// m.insert(names[Section], data(id, static_cast<int>(Section)));
|
||||||
m.insert(names[Type], data(index, static_cast<int>(Type)));
|
m.insert(names[Type], data(id, static_cast<int>(Type)));
|
||||||
m.insert(names[Body], data(index, static_cast<int>(Body)));
|
m.insert(names[Body], data(id, static_cast<int>(Body)));
|
||||||
m.insert(names[FormattedBody], data(index, static_cast<int>(FormattedBody)));
|
m.insert(names[FormattedBody], data(id, static_cast<int>(FormattedBody)));
|
||||||
m.insert(names[UserId], data(index, static_cast<int>(UserId)));
|
m.insert(names[UserId], data(id, static_cast<int>(UserId)));
|
||||||
m.insert(names[UserName], data(index, static_cast<int>(UserName)));
|
m.insert(names[UserName], data(id, static_cast<int>(UserName)));
|
||||||
m.insert(names[Timestamp], data(index, static_cast<int>(Timestamp)));
|
m.insert(names[Timestamp], data(id, static_cast<int>(Timestamp)));
|
||||||
m.insert(names[Url], data(index, static_cast<int>(Url)));
|
m.insert(names[Url], data(id, static_cast<int>(Url)));
|
||||||
m.insert(names[ThumbnailUrl], data(index, static_cast<int>(ThumbnailUrl)));
|
m.insert(names[ThumbnailUrl], data(id, static_cast<int>(ThumbnailUrl)));
|
||||||
m.insert(names[Filename], data(index, static_cast<int>(Filename)));
|
m.insert(names[Filename], data(id, static_cast<int>(Filename)));
|
||||||
m.insert(names[Filesize], data(index, static_cast<int>(Filesize)));
|
m.insert(names[Filesize], data(id, static_cast<int>(Filesize)));
|
||||||
m.insert(names[MimeType], data(index, static_cast<int>(MimeType)));
|
m.insert(names[MimeType], data(id, static_cast<int>(MimeType)));
|
||||||
m.insert(names[Height], data(index, static_cast<int>(Height)));
|
m.insert(names[Height], data(id, static_cast<int>(Height)));
|
||||||
m.insert(names[Width], data(index, static_cast<int>(Width)));
|
m.insert(names[Width], data(id, static_cast<int>(Width)));
|
||||||
m.insert(names[ProportionalHeight],
|
m.insert(names[ProportionalHeight], data(id, static_cast<int>(ProportionalHeight)));
|
||||||
data(index, static_cast<int>(ProportionalHeight)));
|
m.insert(names[Id], data(id, static_cast<int>(Id)));
|
||||||
m.insert(names[Id], data(index, static_cast<int>(Id)));
|
m.insert(names[State], data(id, static_cast<int>(State)));
|
||||||
m.insert(names[State], data(index, static_cast<int>(State)));
|
m.insert(names[IsEncrypted], data(id, static_cast<int>(IsEncrypted)));
|
||||||
m.insert(names[IsEncrypted], data(index, static_cast<int>(IsEncrypted)));
|
m.insert(names[ReplyTo], data(id, static_cast<int>(ReplyTo)));
|
||||||
m.insert(names[ReplyTo], data(index, static_cast<int>(ReplyTo)));
|
m.insert(names[RoomName], data(id, static_cast<int>(RoomName)));
|
||||||
m.insert(names[RoomName], data(index, static_cast<int>(RoomName)));
|
m.insert(names[RoomTopic], data(id, static_cast<int>(RoomTopic)));
|
||||||
m.insert(names[RoomTopic], data(index, static_cast<int>(RoomTopic)));
|
|
||||||
|
|
||||||
return QVariant(m);
|
return QVariant(m);
|
||||||
}
|
}
|
||||||
|
@ -359,6 +343,44 @@ TimelineModel::data(const QModelIndex &index, int role) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QVariant
|
||||||
|
TimelineModel::data(const QModelIndex &index, int role) const
|
||||||
|
{
|
||||||
|
using namespace mtx::accessors;
|
||||||
|
namespace acc = mtx::accessors;
|
||||||
|
if (index.row() < 0 && index.row() >= (int)eventOrder.size())
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
QString id = eventOrder[index.row()];
|
||||||
|
|
||||||
|
mtx::events::collections::TimelineEvents event = events.value(id);
|
||||||
|
|
||||||
|
if (role == Section) {
|
||||||
|
QDateTime date = origin_server_ts(event);
|
||||||
|
date.setTime(QTime());
|
||||||
|
|
||||||
|
std::string userId = acc::sender(event);
|
||||||
|
|
||||||
|
for (size_t r = index.row() + 1; r < eventOrder.size(); r++) {
|
||||||
|
auto tempEv = events.value(eventOrder[r]);
|
||||||
|
QDateTime prevDate = origin_server_ts(tempEv);
|
||||||
|
prevDate.setTime(QTime());
|
||||||
|
if (prevDate != date)
|
||||||
|
return QString("%2 %1")
|
||||||
|
.arg(date.toMSecsSinceEpoch())
|
||||||
|
.arg(QString::fromStdString(userId));
|
||||||
|
|
||||||
|
std::string prevUserId = acc::sender(tempEv);
|
||||||
|
if (userId != prevUserId)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return QString("%1").arg(QString::fromStdString(userId));
|
||||||
|
}
|
||||||
|
|
||||||
|
return data(id, role);
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TimelineModel::canFetchMore(const QModelIndex &) const
|
TimelineModel::canFetchMore(const QModelIndex &) const
|
||||||
{
|
{
|
||||||
|
@ -515,6 +537,27 @@ TimelineModel::internalAddEvents(
|
||||||
|
|
||||||
this->events.insert(id, e);
|
this->events.insert(id, e);
|
||||||
ids.push_back(id);
|
ids.push_back(id);
|
||||||
|
|
||||||
|
auto replyTo = mtx::accessors::in_reply_to_event(e);
|
||||||
|
auto qReplyTo = QString::fromStdString(replyTo);
|
||||||
|
if (!replyTo.empty() && !events.contains(qReplyTo)) {
|
||||||
|
http::client()->get_event(
|
||||||
|
this->room_id_.toStdString(),
|
||||||
|
replyTo,
|
||||||
|
[this, id, replyTo](
|
||||||
|
const mtx::events::collections::TimelineEvents &timeline,
|
||||||
|
mtx::http::RequestErr err) {
|
||||||
|
if (err) {
|
||||||
|
nhlog::net()->error(
|
||||||
|
"Failed to retrieve event with id {}, which was "
|
||||||
|
"requested to show the replyTo for event {}",
|
||||||
|
replyTo,
|
||||||
|
id.toStdString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
emit replyFetched(id, timeline);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ids;
|
return ids;
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,6 +153,7 @@ public:
|
||||||
QHash<int, QByteArray> roleNames() const override;
|
QHash<int, QByteArray> roleNames() const override;
|
||||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||||
|
QVariant data(const QString &id, int role) const;
|
||||||
|
|
||||||
bool canFetchMore(const QModelIndex &) const override;
|
bool canFetchMore(const QModelIndex &) const override;
|
||||||
void fetchMore(const QModelIndex &) override;
|
void fetchMore(const QModelIndex &) override;
|
||||||
|
@ -200,6 +201,7 @@ signals:
|
||||||
void newMessageToSend(mtx::events::collections::TimelineEvents event);
|
void newMessageToSend(mtx::events::collections::TimelineEvents event);
|
||||||
void mediaCached(QString mxcUrl, QString cacheUrl);
|
void mediaCached(QString mxcUrl, QString cacheUrl);
|
||||||
void newEncryptedImage(mtx::crypto::EncryptedFile encryptionInfo);
|
void newEncryptedImage(mtx::crypto::EncryptedFile encryptionInfo);
|
||||||
|
void replyFetched(QString requestingEvent, mtx::events::collections::TimelineEvents event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DecryptionResult decryptEvent(
|
DecryptionResult decryptEvent(
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
#include "UserSettingsPage.h"
|
#include "UserSettingsPage.h"
|
||||||
#include "dialogs/ImageOverlay.h"
|
#include "dialogs/ImageOverlay.h"
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(mtx::events::collections::TimelineEvents)
|
||||||
|
|
||||||
void
|
void
|
||||||
TimelineViewManager::updateColorPalette()
|
TimelineViewManager::updateColorPalette()
|
||||||
{
|
{
|
||||||
|
@ -59,6 +61,7 @@ TimelineViewManager::TimelineViewManager(QWidget *parent)
|
||||||
"Can't instantiate enum!");
|
"Can't instantiate enum!");
|
||||||
qmlRegisterType<DelegateChoice>("im.nheko", 1, 0, "DelegateChoice");
|
qmlRegisterType<DelegateChoice>("im.nheko", 1, 0, "DelegateChoice");
|
||||||
qmlRegisterType<DelegateChooser>("im.nheko", 1, 0, "DelegateChooser");
|
qmlRegisterType<DelegateChooser>("im.nheko", 1, 0, "DelegateChooser");
|
||||||
|
qRegisterMetaType<mtx::events::collections::TimelineEvents>();
|
||||||
|
|
||||||
#ifdef USE_QUICK_VIEW
|
#ifdef USE_QUICK_VIEW
|
||||||
view = new QQuickView();
|
view = new QQuickView();
|
||||||
|
|
Loading…
Reference in a new issue