mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 19:08:58 +03:00
Add option to only play animated images on hover
This commit is contained in:
parent
47c7c4c777
commit
15bf643347
5 changed files with 49 additions and 1 deletions
|
@ -63,6 +63,7 @@ Item {
|
||||||
visible: loaded
|
visible: loaded
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
roomm: room
|
roomm: room
|
||||||
|
play: !Settings.animateImagesOnHover || mouseArea.hovered
|
||||||
eventId: parent.eventId
|
eventId: parent.eventId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,7 @@ UserSettings::load(std::optional<QString> profile)
|
||||||
enlargeEmojiOnlyMessages_ =
|
enlargeEmojiOnlyMessages_ =
|
||||||
settings.value("user/timeline/enlarge_emoji_only_msg", false).toBool();
|
settings.value("user/timeline/enlarge_emoji_only_msg", false).toBool();
|
||||||
markdown_ = settings.value("user/markdown_enabled", true).toBool();
|
markdown_ = settings.value("user/markdown_enabled", true).toBool();
|
||||||
|
animateImagesOnHover_ = settings.value("user/animate_images_on_hover", false).toBool();
|
||||||
typingNotifications_ = settings.value("user/typing_notifications", true).toBool();
|
typingNotifications_ = settings.value("user/typing_notifications", true).toBool();
|
||||||
sortByImportance_ = settings.value("user/sort_by_unread", true).toBool();
|
sortByImportance_ = settings.value("user/sort_by_unread", true).toBool();
|
||||||
readReceipts_ = settings.value("user/read_receipts", true).toBool();
|
readReceipts_ = settings.value("user/read_receipts", true).toBool();
|
||||||
|
@ -207,6 +208,16 @@ UserSettings::setMarkdown(bool state)
|
||||||
save();
|
save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
UserSettings::setAnimateImagesOnHover(bool state)
|
||||||
|
{
|
||||||
|
if (state == animateImagesOnHover_)
|
||||||
|
return;
|
||||||
|
animateImagesOnHover_ = state;
|
||||||
|
emit animateImagesOnHoverChanged(state);
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
UserSettings::setReadReceipts(bool state)
|
UserSettings::setReadReceipts(bool state)
|
||||||
{
|
{
|
||||||
|
@ -643,6 +654,7 @@ UserSettings::save()
|
||||||
settings.setValue("group_view", groupView_);
|
settings.setValue("group_view", groupView_);
|
||||||
settings.setValue("hidden_tags", hiddenTags_);
|
settings.setValue("hidden_tags", hiddenTags_);
|
||||||
settings.setValue("markdown_enabled", markdown_);
|
settings.setValue("markdown_enabled", markdown_);
|
||||||
|
settings.setValue("animate_images_on_hover", animateImagesOnHover_);
|
||||||
settings.setValue("desktop_notifications", hasDesktopNotifications_);
|
settings.setValue("desktop_notifications", hasDesktopNotifications_);
|
||||||
settings.setValue("alert_on_notification", hasAlertOnNotification_);
|
settings.setValue("alert_on_notification", hasAlertOnNotification_);
|
||||||
settings.setValue("theme", theme());
|
settings.setValue("theme", theme());
|
||||||
|
@ -747,6 +759,7 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
|
||||||
sortByImportance_ = new Toggle{this};
|
sortByImportance_ = new Toggle{this};
|
||||||
readReceipts_ = new Toggle{this};
|
readReceipts_ = new Toggle{this};
|
||||||
markdown_ = new Toggle{this};
|
markdown_ = new Toggle{this};
|
||||||
|
animateImagesOnHover_ = new Toggle{this};
|
||||||
desktopNotifications_ = new Toggle{this};
|
desktopNotifications_ = new Toggle{this};
|
||||||
alertOnNotification_ = new Toggle{this};
|
alertOnNotification_ = new Toggle{this};
|
||||||
useStunServer_ = new Toggle{this};
|
useStunServer_ = new Toggle{this};
|
||||||
|
@ -779,6 +792,7 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
|
||||||
sortByImportance_->setChecked(settings_->sortByImportance());
|
sortByImportance_->setChecked(settings_->sortByImportance());
|
||||||
readReceipts_->setChecked(settings_->readReceipts());
|
readReceipts_->setChecked(settings_->readReceipts());
|
||||||
markdown_->setChecked(settings_->markdown());
|
markdown_->setChecked(settings_->markdown());
|
||||||
|
animateImagesOnHover_->setChecked(settings_->animateImagesOnHover());
|
||||||
desktopNotifications_->setChecked(settings_->hasDesktopNotifications());
|
desktopNotifications_->setChecked(settings_->hasDesktopNotifications());
|
||||||
alertOnNotification_->setChecked(settings_->hasAlertOnNotification());
|
alertOnNotification_->setChecked(settings_->hasAlertOnNotification());
|
||||||
useStunServer_->setChecked(settings_->useStunServer());
|
useStunServer_->setChecked(settings_->useStunServer());
|
||||||
|
@ -973,6 +987,9 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
|
||||||
markdown_,
|
markdown_,
|
||||||
tr("Allow using markdown in messages.\nWhen disabled, all messages are sent as a plain "
|
tr("Allow using markdown in messages.\nWhen disabled, all messages are sent as a plain "
|
||||||
"text."));
|
"text."));
|
||||||
|
boxWrap(tr("Play animated images only on hover"),
|
||||||
|
animateImagesOnHover_,
|
||||||
|
tr("Plays media like GIFs or APNGs only when explicitly hovering over them."));
|
||||||
boxWrap(tr("Desktop notifications"),
|
boxWrap(tr("Desktop notifications"),
|
||||||
desktopNotifications_,
|
desktopNotifications_,
|
||||||
tr("Notify about received message when the client is not currently focused."));
|
tr("Notify about received message when the client is not currently focused."));
|
||||||
|
@ -1250,6 +1267,10 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
|
||||||
settings_->setMarkdown(enabled);
|
settings_->setMarkdown(enabled);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connect(animateImagesOnHover_, &Toggle::toggled, this, [this](bool enabled) {
|
||||||
|
settings_->setAnimateImagesOnHover(enabled);
|
||||||
|
});
|
||||||
|
|
||||||
connect(typingNotifications_, &Toggle::toggled, this, [this](bool enabled) {
|
connect(typingNotifications_, &Toggle::toggled, this, [this](bool enabled) {
|
||||||
settings_->setTypingNotifications(enabled);
|
settings_->setTypingNotifications(enabled);
|
||||||
});
|
});
|
||||||
|
|
|
@ -40,6 +40,8 @@ class UserSettings : public QObject
|
||||||
Q_PROPERTY(bool startInTray READ startInTray WRITE setStartInTray NOTIFY startInTrayChanged)
|
Q_PROPERTY(bool startInTray READ startInTray WRITE setStartInTray NOTIFY startInTrayChanged)
|
||||||
Q_PROPERTY(bool groupView READ groupView WRITE setGroupView NOTIFY groupViewStateChanged)
|
Q_PROPERTY(bool groupView READ groupView WRITE setGroupView NOTIFY groupViewStateChanged)
|
||||||
Q_PROPERTY(bool markdown READ markdown WRITE setMarkdown NOTIFY markdownChanged)
|
Q_PROPERTY(bool markdown READ markdown WRITE setMarkdown NOTIFY markdownChanged)
|
||||||
|
Q_PROPERTY(bool animateImagesOnHover READ animateImagesOnHover WRITE setAnimateImagesOnHover
|
||||||
|
NOTIFY animateImagesOnHoverChanged)
|
||||||
Q_PROPERTY(bool typingNotifications READ typingNotifications WRITE setTypingNotifications
|
Q_PROPERTY(bool typingNotifications READ typingNotifications WRITE setTypingNotifications
|
||||||
NOTIFY typingNotificationsChanged)
|
NOTIFY typingNotificationsChanged)
|
||||||
Q_PROPERTY(bool sortByImportance READ sortByImportance WRITE setSortByImportance NOTIFY
|
Q_PROPERTY(bool sortByImportance READ sortByImportance WRITE setSortByImportance NOTIFY
|
||||||
|
@ -135,6 +137,7 @@ public:
|
||||||
void setEmojiFontFamily(QString family);
|
void setEmojiFontFamily(QString family);
|
||||||
void setGroupView(bool state);
|
void setGroupView(bool state);
|
||||||
void setMarkdown(bool state);
|
void setMarkdown(bool state);
|
||||||
|
void setAnimateImagesOnHover(bool state);
|
||||||
void setReadReceipts(bool state);
|
void setReadReceipts(bool state);
|
||||||
void setTypingNotifications(bool state);
|
void setTypingNotifications(bool state);
|
||||||
void setSortByImportance(bool state);
|
void setSortByImportance(bool state);
|
||||||
|
@ -181,6 +184,7 @@ public:
|
||||||
bool privacyScreen() const { return privacyScreen_; }
|
bool privacyScreen() const { return privacyScreen_; }
|
||||||
int privacyScreenTimeout() const { return privacyScreenTimeout_; }
|
int privacyScreenTimeout() const { return privacyScreenTimeout_; }
|
||||||
bool markdown() const { return markdown_; }
|
bool markdown() const { return markdown_; }
|
||||||
|
bool animateImagesOnHover() const { return animateImagesOnHover_; }
|
||||||
bool typingNotifications() const { return typingNotifications_; }
|
bool typingNotifications() const { return typingNotifications_; }
|
||||||
bool sortByImportance() const { return sortByImportance_; }
|
bool sortByImportance() const { return sortByImportance_; }
|
||||||
bool buttonsInTimeline() const { return buttonsInTimeline_; }
|
bool buttonsInTimeline() const { return buttonsInTimeline_; }
|
||||||
|
@ -236,6 +240,7 @@ signals:
|
||||||
void trayChanged(bool state);
|
void trayChanged(bool state);
|
||||||
void startInTrayChanged(bool state);
|
void startInTrayChanged(bool state);
|
||||||
void markdownChanged(bool state);
|
void markdownChanged(bool state);
|
||||||
|
void animateImagesOnHoverChanged(bool state);
|
||||||
void typingNotificationsChanged(bool state);
|
void typingNotificationsChanged(bool state);
|
||||||
void buttonInTimelineChanged(bool state);
|
void buttonInTimelineChanged(bool state);
|
||||||
void readReceiptsChanged(bool state);
|
void readReceiptsChanged(bool state);
|
||||||
|
@ -286,6 +291,7 @@ private:
|
||||||
bool startInTray_;
|
bool startInTray_;
|
||||||
bool groupView_;
|
bool groupView_;
|
||||||
bool markdown_;
|
bool markdown_;
|
||||||
|
bool animateImagesOnHover_;
|
||||||
bool typingNotifications_;
|
bool typingNotifications_;
|
||||||
bool sortByImportance_;
|
bool sortByImportance_;
|
||||||
bool buttonsInTimeline_;
|
bool buttonsInTimeline_;
|
||||||
|
@ -381,6 +387,7 @@ private:
|
||||||
Toggle *sortByImportance_;
|
Toggle *sortByImportance_;
|
||||||
Toggle *readReceipts_;
|
Toggle *readReceipts_;
|
||||||
Toggle *markdown_;
|
Toggle *markdown_;
|
||||||
|
Toggle *animateImagesOnHover_;
|
||||||
Toggle *desktopNotifications_;
|
Toggle *desktopNotifications_;
|
||||||
Toggle *alertOnNotification_;
|
Toggle *alertOnNotification_;
|
||||||
Toggle *avatarCircles_;
|
Toggle *avatarCircles_;
|
||||||
|
|
|
@ -94,8 +94,12 @@ MxcAnimatedImage::startDownload()
|
||||||
buffer.isOpen());
|
buffer.isOpen());
|
||||||
movie.setFormat(mimeType);
|
movie.setFormat(mimeType);
|
||||||
movie.setDevice(&buffer);
|
movie.setDevice(&buffer);
|
||||||
movie.start();
|
if (play_)
|
||||||
|
movie.start();
|
||||||
|
else
|
||||||
|
movie.jumpToFrame(0);
|
||||||
emit loadedChanged();
|
emit loadedChanged();
|
||||||
|
update();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -143,6 +147,9 @@ MxcAnimatedImage::startDownload()
|
||||||
QSGNode *
|
QSGNode *
|
||||||
MxcAnimatedImage::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)
|
MxcAnimatedImage::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)
|
||||||
{
|
{
|
||||||
|
if (!imageDirty)
|
||||||
|
return oldNode;
|
||||||
|
|
||||||
imageDirty = false;
|
imageDirty = false;
|
||||||
QSGImageNode *n = static_cast<QSGImageNode *>(oldNode);
|
QSGImageNode *n = static_cast<QSGImageNode *>(oldNode);
|
||||||
if (!n)
|
if (!n)
|
||||||
|
|
|
@ -19,6 +19,7 @@ class MxcAnimatedImage : public QQuickItem
|
||||||
Q_PROPERTY(QString eventId READ eventId WRITE setEventId NOTIFY eventIdChanged)
|
Q_PROPERTY(QString eventId READ eventId WRITE setEventId NOTIFY eventIdChanged)
|
||||||
Q_PROPERTY(bool animatable READ animatable NOTIFY animatableChanged)
|
Q_PROPERTY(bool animatable READ animatable NOTIFY animatableChanged)
|
||||||
Q_PROPERTY(bool loaded READ loaded NOTIFY loadedChanged)
|
Q_PROPERTY(bool loaded READ loaded NOTIFY loadedChanged)
|
||||||
|
Q_PROPERTY(bool play READ play WRITE setPlay NOTIFY playChanged)
|
||||||
public:
|
public:
|
||||||
MxcAnimatedImage(QQuickItem *parent = nullptr)
|
MxcAnimatedImage(QQuickItem *parent = nullptr)
|
||||||
: QQuickItem(parent)
|
: QQuickItem(parent)
|
||||||
|
@ -32,6 +33,7 @@ public:
|
||||||
|
|
||||||
bool animatable() const { return animatable_; }
|
bool animatable() const { return animatable_; }
|
||||||
bool loaded() const { return buffer.size() > 0; }
|
bool loaded() const { return buffer.size() > 0; }
|
||||||
|
bool play() const { return play_; }
|
||||||
QString eventId() const { return eventId_; }
|
QString eventId() const { return eventId_; }
|
||||||
TimelineModel *room() const { return room_; }
|
TimelineModel *room() const { return room_; }
|
||||||
void setEventId(QString newEventId)
|
void setEventId(QString newEventId)
|
||||||
|
@ -48,6 +50,14 @@ public:
|
||||||
emit roomChanged();
|
emit roomChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void setPlay(bool newPlay)
|
||||||
|
{
|
||||||
|
if (play_ != newPlay) {
|
||||||
|
play_ = newPlay;
|
||||||
|
movie.setPaused(!play_);
|
||||||
|
emit playChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QSGNode *updatePaintNode(QSGNode *oldNode,
|
QSGNode *updatePaintNode(QSGNode *oldNode,
|
||||||
QQuickItem::UpdatePaintNodeData *updatePaintNodeData) override;
|
QQuickItem::UpdatePaintNodeData *updatePaintNodeData) override;
|
||||||
|
@ -57,6 +67,7 @@ signals:
|
||||||
void eventIdChanged();
|
void eventIdChanged();
|
||||||
void animatableChanged();
|
void animatableChanged();
|
||||||
void loadedChanged();
|
void loadedChanged();
|
||||||
|
void playChanged();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void startDownload();
|
void startDownload();
|
||||||
|
@ -76,4 +87,5 @@ private:
|
||||||
QMovie movie;
|
QMovie movie;
|
||||||
int currentFrame = 0;
|
int currentFrame = 0;
|
||||||
bool imageDirty = true;
|
bool imageDirty = true;
|
||||||
|
bool play_ = true;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue