Basic thread filtering
The reply pagination logic is a bit weird rn though.
This commit is contained in:
parent
a87f1be688
commit
857d9cf2b6
5 changed files with 135 additions and 4 deletions
75
src/timeline/TimelineFilter.cpp
Normal file
75
src/timeline/TimelineFilter.cpp
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
#include "TimelineFilter.h"
|
||||
|
||||
#include "Logging.h"
|
||||
|
||||
TimelineFilter::TimelineFilter(QObject *parent)
|
||||
: QSortFilterProxyModel(parent)
|
||||
{
|
||||
setDynamicSortFilter(true);
|
||||
}
|
||||
|
||||
void
|
||||
TimelineFilter::setThreadId(const QString &t)
|
||||
{
|
||||
nhlog::ui()->debug("Filtering by thread '{}'", t.toStdString());
|
||||
if (this->threadId != t) {
|
||||
this->threadId = t;
|
||||
invalidateFilter();
|
||||
}
|
||||
emit threadIdChanged();
|
||||
}
|
||||
|
||||
void
|
||||
TimelineFilter::setSource(TimelineModel *s)
|
||||
{
|
||||
if (auto orig = this->source(); orig != s) {
|
||||
if (orig)
|
||||
disconnect(orig,
|
||||
&TimelineModel::currentIndexChanged,
|
||||
this,
|
||||
&TimelineFilter::currentIndexChanged);
|
||||
this->setSourceModel(s);
|
||||
connect(s, &TimelineModel::currentIndexChanged, this, &TimelineFilter::currentIndexChanged);
|
||||
emit sourceChanged();
|
||||
invalidateFilter();
|
||||
}
|
||||
}
|
||||
|
||||
TimelineModel *
|
||||
TimelineFilter::source() const
|
||||
{
|
||||
return qobject_cast<TimelineModel *>(sourceModel());
|
||||
}
|
||||
|
||||
void
|
||||
TimelineFilter::setCurrentIndex(int idx)
|
||||
{
|
||||
// TODO: maybe send read receipt in thread timeline? Or not at all?
|
||||
if (auto s = source()) {
|
||||
s->setCurrentIndex(this->mapToSource(index(idx, 0)).row());
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
TimelineFilter::currentIndex() const
|
||||
{
|
||||
if (auto s = source())
|
||||
return this->mapFromSource(s->index(s->currentIndex())).row();
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool
|
||||
TimelineFilter::filterAcceptsRow(int source_row, const QModelIndex &) const
|
||||
{
|
||||
if (threadId.isEmpty())
|
||||
return true;
|
||||
|
||||
if (auto s = sourceModel()) {
|
||||
auto idx = s->index(source_row, 0);
|
||||
return s->data(idx, TimelineModel::EventId) == threadId ||
|
||||
s->data(idx, TimelineModel::ThreadId) == threadId;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue