Fetch missing events for replies

remotes/origin/0.7.0-dev
Nicolas Werner 5 years ago
parent 91a576fac1
commit 4727f1c2bb
  1. 4
      resources/qml/delegates/MessageDelegate.qml
  2. 149
      src/timeline/TimelineModel.cpp
  3. 2
      src/timeline/TimelineModel.h
  4. 3
      src/timeline/TimelineViewManager.cpp

@ -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…
Cancel
Save