diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index f2b8253b..673fc9a2 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -986,6 +986,8 @@ ChatPage::startInitialSync()
mtx::http::SyncOpts opts;
opts.timeout = 0;
+ opts.set_presence = currentPresence();
+
http::client()->sync(
opts,
std::bind(
@@ -996,6 +998,7 @@ void
ChatPage::trySync()
{
mtx::http::SyncOpts opts;
+ opts.set_presence = currentPresence();
if (!connectivityTimer_.isActive())
connectivityTimer_.start();
@@ -1241,6 +1244,21 @@ ChatPage::setStatus(const QString &status)
});
}
+mtx::presence::PresenceState
+ChatPage::currentPresence() const
+{
+ switch (userSettings_->presence()) {
+ case UserSettings::Presence::Online:
+ return mtx::presence::online;
+ case UserSettings::Presence::Unavailable:
+ return mtx::presence::unavailable;
+ case UserSettings::Presence::Offline:
+ return mtx::presence::offline;
+ default:
+ return mtx::presence::online;
+ }
+}
+
void
ChatPage::initialSyncHandler(const mtx::responses::Sync &res, mtx::http::RequestErr err)
{
diff --git a/src/ChatPage.h b/src/ChatPage.h
index 72fc3b81..e1a342d1 100644
--- a/src/ChatPage.h
+++ b/src/ChatPage.h
@@ -92,7 +92,7 @@ public:
QString status() const;
void setStatus(const QString &status);
- mtx::presence::PresenceState currentPresence() const { return mtx::presence::online; }
+ mtx::presence::PresenceState currentPresence() const;
public slots:
void leaveRoom(const QString &room_id);
diff --git a/src/UserInfoWidget.cpp b/src/UserInfoWidget.cpp
index 38677f25..bf59427c 100644
--- a/src/UserInfoWidget.cpp
+++ b/src/UserInfoWidget.cpp
@@ -31,6 +31,7 @@
#include "MainWindow.h"
#include "Splitter.h"
#include "UserInfoWidget.h"
+#include "UserSettingsPage.h"
#include "ui/Avatar.h"
#include "ui/FlatButton.h"
#include "ui/OverlayModal.h"
@@ -123,6 +124,28 @@ UserInfoWidget::UserInfoWidget(QWidget *parent)
if (ok && !text.isEmpty())
ChatPage::instance()->setStatus(text);
});
+ auto setAutoPresence = menu->addAction(tr("Set presence automatically"));
+ connect(setAutoPresence, &QAction::triggered, this, [this]() {
+ ChatPage::instance()->userSettings()->setPresence(
+ UserSettings::Presence::AutomaticPresence);
+ ChatPage::instance()->setStatus(ChatPage::instance()->status());
+ });
+ auto setOnline = menu->addAction(tr("Online"));
+ connect(setOnline, &QAction::triggered, this, [this]() {
+ ChatPage::instance()->userSettings()->setPresence(UserSettings::Presence::Online);
+ ChatPage::instance()->setStatus(ChatPage::instance()->status());
+ });
+ auto setUnavailable = menu->addAction(tr("Unavailable"));
+ connect(setUnavailable, &QAction::triggered, this, [this]() {
+ ChatPage::instance()->userSettings()->setPresence(
+ UserSettings::Presence::Unavailable);
+ ChatPage::instance()->setStatus(ChatPage::instance()->status());
+ });
+ auto setOffline = menu->addAction(tr("Offline"));
+ connect(setOffline, &QAction::triggered, this, [this]() {
+ ChatPage::instance()->userSettings()->setPresence(UserSettings::Presence::Offline);
+ ChatPage::instance()->setStatus(ChatPage::instance()->status());
+ });
}
void
diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index dfd99069..659e8ceb 100644
--- a/src/UserSettingsPage.cpp
+++ b/src/UserSettingsPage.cpp
@@ -34,6 +34,7 @@
#include <QStandardPaths>
#include <QString>
#include <QTextStream>
+#include <QtQml>
#include "Cache.h"
#include "Config.h"
@@ -46,7 +47,11 @@
#include "config/nheko.h"
-UserSettings::UserSettings() { load(); }
+UserSettings::UserSettings()
+{
+ qRegisterMetaType<UserSettings::Presence>();
+ load();
+}
void
UserSettings::load()
@@ -72,6 +77,9 @@ UserSettings::load()
decryptSidebar_ = settings.value("user/decrypt_sidebar", true).toBool();
emojiFont_ = settings.value("user/emoji_font_family", "default").toString();
baseFontSize_ = settings.value("user/font_size", QFont().pointSizeF()).toDouble();
+ presence_ =
+ settings.value("user/presence", QVariant::fromValue(Presence::AutomaticPresence))
+ .value<Presence>();
applyTheme();
}
@@ -244,6 +252,16 @@ UserSettings::setEmojiFontFamily(QString family)
}
void
+UserSettings::setPresence(Presence state)
+{
+ if (state == presence_)
+ return;
+ presence_ = state;
+ emit presenceChanged(state);
+ save();
+}
+
+void
UserSettings::setTheme(QString theme)
{
if (theme == theme)
@@ -337,6 +355,7 @@ UserSettings::save()
settings.setValue("theme", theme());
settings.setValue("font_family", font_);
settings.setValue("emoji_font_family", emojiFont_);
+ settings.setValue("presence", QVariant::fromValue(presence_));
settings.endGroup();
diff --git a/src/UserSettingsPage.h b/src/UserSettingsPage.h
index fb807067..550f207e 100644
--- a/src/UserSettingsPage.h
+++ b/src/UserSettingsPage.h
@@ -68,10 +68,20 @@ class UserSettings : public QObject
Q_PROPERTY(QString font READ font WRITE setFontFamily NOTIFY fontChanged)
Q_PROPERTY(
QString emojiFont READ emojiFont WRITE setEmojiFontFamily NOTIFY emojiFontChanged)
+ Q_PROPERTY(Presence presence READ presence WRITE setPresence NOTIFY presenceChanged)
public:
UserSettings();
+ enum class Presence
+ {
+ AutomaticPresence,
+ Online,
+ Unavailable,
+ Offline,
+ };
+ Q_ENUM(Presence);
+
void save();
void load();
void applyTheme();
@@ -93,6 +103,7 @@ public:
void setDesktopNotifications(bool state);
void setAvatarCircles(bool state);
void setDecryptSidebar(bool state);
+ void setPresence(Presence state);
QString theme() const { return !theme_.isEmpty() ? theme_ : defaultTheme_; }
bool messageHoverHighlight() const { return messageHoverHighlight_; }
@@ -112,6 +123,7 @@ public:
double fontSize() const { return baseFontSize_; }
QString font() const { return font_; }
QString emojiFont() const { return emojiFont_; }
+ Presence presence() const { return presence_; }
signals:
void groupViewStateChanged(bool state);
@@ -132,6 +144,7 @@ signals:
void fontSizeChanged(double state);
void fontChanged(QString state);
void emojiFontChanged(QString state);
+ void presenceChanged(Presence state);
private:
// Default to system theme if QT_QPA_PLATFORMTHEME var is set.
@@ -157,6 +170,7 @@ private:
double baseFontSize_;
QString font_;
QString emojiFont_;
+ Presence presence_;
};
class HorizontalLine : public QFrame
|