Page MenuHomePhorge

matrix-room-timeline.cpp
No OneTemporary

Size
3 KB
Referenced Files
None
Subscribers
None

matrix-room-timeline.cpp

/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2020 Tusooa Zhu <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include <libkazv-config.hpp>
#include <immer/config.hpp> // https://github.com/arximboldi/immer/issues/168
#include <cmath>
#include <lager/lenses/optional.hpp>
#include <cursorutil.hpp>
#include "matrix-room-timeline.hpp"
#include "matrix-event.hpp"
#include "helper.hpp"
using namespace Kazv;
MatrixRoomTimeline::MatrixRoomTimeline(Kazv::Room room, QObject *parent)
: QAbstractListModel(parent)
, m_room(room)
, m_timeline(m_room.timelineEvents())
, m_internalCount(0)
, m_localEchoes(m_room.localEchoes())
, LAGER_QT(count)(lager::with(
m_timeline.xform(containerSize),
m_localEchoes.xform(containerSize)
).map([](const auto &tlSize, const auto &localSize) { return tlSize + localSize; }))
, LAGER_QT(eventIds)(m_timeline.xform(zug::map(
[](auto container) {
return zug::into(
QStringList{},
zug::map([](Kazv::Event event) {
return QString::fromStdString(event.id());
}),
std::move(container));
})))
{
m_internalCount = count();
connect(this, &MatrixRoomTimeline::countChanged, this, &MatrixRoomTimeline::updateInternalCount);
}
MatrixRoomTimeline::~MatrixRoomTimeline() = default;
MatrixEvent *MatrixRoomTimeline::at(int index) const
{
return new MatrixEvent(lager::with(m_timeline, m_localEchoes, LAGER_QT(count))
.map([index](const auto &tl, const auto &localEchoes, const auto &count) -> std::variant<Kazv::Event, Kazv::LocalEchoDesc> {
auto rIndex = count - index - 1;
if (static_cast<unsigned int>(rIndex) < tl.size()) {
return tl[rIndex];
} else {
auto remainingIndex = rIndex - tl.size();
if (remainingIndex < localEchoes.size()) {
return localEchoes[remainingIndex];
} else {
return Event();
}
}
}));
}
int MatrixRoomTimeline::rowCount(const QModelIndex &index) const
{
if (index.isValid()) {
return 0;
} else {
return count();
}
}
QVariant MatrixRoomTimeline::data(const QModelIndex &, int) const
{
return QVariant();
}
void MatrixRoomTimeline::updateInternalCount()
{
auto curCount = count();
auto oldCount = m_internalCount;
auto diff = std::abs(curCount - oldCount);
if (curCount > oldCount) {
beginInsertRows(QModelIndex(), 0, diff - 1);
m_internalCount = curCount;
endInsertRows();
} else if (curCount < oldCount) {
beginRemoveRows(QModelIndex(), 0, diff - 1);
m_internalCount = curCount;
endRemoveRows();
}
}

File Metadata

Mime Type
text/x-c
Expires
Tue, Jun 24, 5:33 AM (2 h, 48 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
234636
Default Alt Text
matrix-room-timeline.cpp (3 KB)

Event Timeline