mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-25 20:48:52 +03:00
Clear timeline widgets when they exceed a certain limit (#158)
That's a fix to deal with long running sessions which will end up taking more & more memory given enough time.
This commit is contained in:
parent
e8cb2cee0c
commit
9d718fccf4
2 changed files with 45 additions and 2 deletions
|
@ -38,6 +38,10 @@
|
||||||
|
|
||||||
using TimelineEvent = mtx::events::collections::TimelineEvents;
|
using TimelineEvent = mtx::events::collections::TimelineEvents;
|
||||||
|
|
||||||
|
//! Maximum number of widgets to keep in the timeline layout.
|
||||||
|
constexpr int MAX_RETAINED_WIDGETS = 100;
|
||||||
|
constexpr int MIN_SCROLLBAR_HANDLE = 60;
|
||||||
|
|
||||||
//! Retrieve the timestamp of the event represented by the given widget.
|
//! Retrieve the timestamp of the event represented by the given widget.
|
||||||
QDateTime
|
QDateTime
|
||||||
getDate(QWidget *widget)
|
getDate(QWidget *widget)
|
||||||
|
@ -481,8 +485,7 @@ TimelineView::addEvents(const mtx::responses::Timeline &timeline)
|
||||||
void
|
void
|
||||||
TimelineView::init()
|
TimelineView::init()
|
||||||
{
|
{
|
||||||
QSettings settings;
|
local_user_ = utils::localUser();
|
||||||
local_user_ = settings.value("auth/user_id").toString();
|
|
||||||
|
|
||||||
QIcon icon;
|
QIcon icon;
|
||||||
icon.addFile(":/icons/icons/ui/angle-arrow-down.png");
|
icon.addFile(":/icons/icons/ui/angle-arrow-down.png");
|
||||||
|
@ -965,6 +968,19 @@ TimelineView::showEvent(QShowEvent *event)
|
||||||
QWidget::showEvent(event);
|
QWidget::showEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TimelineView::hideEvent(QHideEvent *event)
|
||||||
|
{
|
||||||
|
const auto handleHeight = scroll_area_->verticalScrollBar()->sizeHint().height();
|
||||||
|
const auto widgetsNum = scroll_layout_->count();
|
||||||
|
|
||||||
|
// Remove widgets from the timeline to reduce the memory footprint.
|
||||||
|
if (handleHeight < MIN_SCROLLBAR_HANDLE && widgetsNum > MAX_RETAINED_WIDGETS)
|
||||||
|
clearTimeline();
|
||||||
|
|
||||||
|
QWidget::hideEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TimelineView::event(QEvent *event)
|
TimelineView::event(QEvent *event)
|
||||||
{
|
{
|
||||||
|
@ -974,6 +990,30 @@ TimelineView::event(QEvent *event)
|
||||||
return QWidget::event(event);
|
return QWidget::event(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TimelineView::clearTimeline()
|
||||||
|
{
|
||||||
|
// Delete all widgets.
|
||||||
|
QLayoutItem *item;
|
||||||
|
while ((item = scroll_layout_->takeAt(0)) != nullptr) {
|
||||||
|
delete item->widget();
|
||||||
|
delete item;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The next call to /messages will be without a prev token.
|
||||||
|
prev_batch_token_.clear();
|
||||||
|
eventIds_.clear();
|
||||||
|
|
||||||
|
// Clear queues with pending messages to be rendered.
|
||||||
|
bottomMessages_.clear();
|
||||||
|
topMessages_.clear();
|
||||||
|
|
||||||
|
firstSender_.clear();
|
||||||
|
lastSender_.clear();
|
||||||
|
|
||||||
|
scroll_layout_->addStretch(1);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
TimelineView::toggleScrollDownButton()
|
TimelineView::toggleScrollDownButton()
|
||||||
{
|
{
|
||||||
|
|
|
@ -161,6 +161,7 @@ signals:
|
||||||
protected:
|
protected:
|
||||||
void paintEvent(QPaintEvent *event) override;
|
void paintEvent(QPaintEvent *event) override;
|
||||||
void showEvent(QShowEvent *event) override;
|
void showEvent(QShowEvent *event) override;
|
||||||
|
void hideEvent(QHideEvent *event) override;
|
||||||
bool event(QEvent *event) override;
|
bool event(QEvent *event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -271,6 +272,8 @@ private:
|
||||||
|
|
||||||
//! Store the event id associated with the given widget.
|
//! Store the event id associated with the given widget.
|
||||||
void saveEventId(QWidget *widget);
|
void saveEventId(QWidget *widget);
|
||||||
|
//! Remove all widgets from the timeline layout.
|
||||||
|
void clearTimeline();
|
||||||
|
|
||||||
QVBoxLayout *top_layout_;
|
QVBoxLayout *top_layout_;
|
||||||
QVBoxLayout *scroll_layout_;
|
QVBoxLayout *scroll_layout_;
|
||||||
|
|
Loading…
Reference in a new issue