mirror of https://github.com/Nheko-Reborn/nheko
parent
a87f1be688
commit
857d9cf2b6
@ -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; |
||||
} |
||||
} |
@ -0,0 +1,43 @@ |
||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#pragma once |
||||
|
||||
#include <QSortFilterProxyModel> |
||||
#include <QString> |
||||
|
||||
#include <mtx/events/power_levels.hpp> |
||||
|
||||
#include "TimelineModel.h" |
||||
|
||||
class TimelineFilter : public QSortFilterProxyModel |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
Q_PROPERTY(QString filterByThread READ filterByThread WRITE setThreadId NOTIFY threadIdChanged) |
||||
Q_PROPERTY(TimelineModel *source READ source WRITE setSource NOTIFY sourceChanged) |
||||
Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged) |
||||
|
||||
public: |
||||
explicit TimelineFilter(QObject *parent = nullptr); |
||||
|
||||
QString filterByThread() const { return threadId; } |
||||
TimelineModel *source() const; |
||||
int currentIndex() const; |
||||
|
||||
void setThreadId(const QString &t); |
||||
void setSource(TimelineModel *t); |
||||
void setCurrentIndex(int idx); |
||||
|
||||
signals: |
||||
void threadIdChanged(); |
||||
void sourceChanged(); |
||||
void currentIndexChanged(); |
||||
|
||||
protected: |
||||
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; |
||||
|
||||
private: |
||||
QString threadId; |
||||
}; |
Loading…
Reference in new issue