diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml
index eab6520e..0f8dc24a 100644
--- a/resources/qml/RoomList.qml
+++ b/resources/qml/RoomList.qml
@@ -267,6 +267,40 @@ Page {
onTriggered: statusDialog.show()
}
+ Platform.MenuSeparator {
+ }
+
+ Platform.MenuItemGroup {
+ id: onlineStateGroup
+ }
+ Platform.MenuItem {
+ text: qsTr("Automatic online status")
+ group: onlineStateGroup
+ checkable: true
+ checked: Settings.presence == Settings.AutomaticPresence
+ onTriggered: if (checked) Settings.presence = Settings.AutomaticPresence
+ }
+ Platform.MenuItem {
+ text: qsTr("Online")
+ group: onlineStateGroup
+ checkable: true
+ checked: Settings.presence == Settings.Online
+ onTriggered: if (checked) Settings.presence = Settings.Online
+ }
+ Platform.MenuItem {
+ text: qsTr("Unavailable")
+ group: onlineStateGroup
+ checkable: true
+ checked: Settings.presence == Settings.Unavailable
+ onTriggered: if (checked) Settings.presence = Settings.Unavailable
+ }
+ Platform.MenuItem {
+ text: qsTr("Offline")
+ group: onlineStateGroup
+ checkable: true
+ checked: Settings.presence == Settings.Offline
+ onTriggered: if (checked) Settings.presence = Settings.Offline
+ }
}
TapHandler {
acceptedButtons: Qt.LeftButton
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index 90d542dd..25af8974 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -21,7 +21,6 @@
#include "encryption/DeviceVerificationFlow.h"
#include "encryption/Olm.h"
#include "ui/RoomSummary.h"
-#include "ui/Theme.h"
#include "ui/UserProfile.h"
#include "voip/CallManager.h"
@@ -29,8 +28,6 @@
#include "timeline/TimelineViewManager.h"
-#include "blurhash.hpp"
-
ChatPage *ChatPage::instance_ = nullptr;
static constexpr int CHECK_CONNECTIVITY_INTERVAL = 15'000;
static constexpr int RETRY_TIMEOUT = 5'000;
@@ -404,6 +401,19 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QObject *parent)
[](std::function<void()> f) { f(); },
Qt::QueuedConnection);
+ connect(qobject_cast<QGuiApplication *>(QGuiApplication::instance()),
+ &QGuiApplication::focusWindowChanged,
+ this,
+ [this](QWindow *activeWindow) {
+ if (activeWindow) {
+ nhlog::ui()->debug("Stopping inactive timer.");
+ lastWindowActive = QDateTime();
+ } else {
+ nhlog::ui()->debug("Starting inactive timer.");
+ lastWindowActive = QDateTime::currentDateTime();
+ }
+ });
+
connectCallMessage<mtx::events::voip::CallInvite>();
connectCallMessage<mtx::events::voip::CallCandidates>();
connectCallMessage<mtx::events::voip::CallAnswer>();
@@ -1107,6 +1117,13 @@ ChatPage::currentPresence() const
return mtx::presence::unavailable;
case UserSettings::Presence::Offline:
return mtx::presence::offline;
+ case UserSettings::Presence::AutomaticPresence:
+ if (lastWindowActive.isValid() &&
+ lastWindowActive.addSecs(60 * 5) < QDateTime::currentDateTime())
+ return mtx::presence::unavailable;
+ else
+ return mtx::presence::online;
+
default:
return mtx::presence::online;
}
diff --git a/src/ChatPage.h b/src/ChatPage.h
index fbf4fbce..685b719b 100644
--- a/src/ChatPage.h
+++ b/src/ChatPage.h
@@ -21,8 +21,6 @@
#include <QSharedPointer>
#include <QTimer>
-#include "CacheCryptoStructs.h"
-#include "CacheStructs.h"
#include "ui/RoomSummary.h"
class TimelineViewManager;
@@ -225,6 +223,9 @@ private:
std::unique_ptr<mtx::pushrules::PushRuleEvaluator> pushrules;
QDateTime lastSpacesUpdate = QDateTime::currentDateTime();
+
+ // Stores when our windows lost focus. Invalid when our windows have focus.
+ QDateTime lastWindowActive;
};
template<class Collection>
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index d06171de..1a0b1e96 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -9,42 +9,23 @@
#include <mtx/requests.hpp>
#include <mtx/responses/login.hpp>
-#include "AliasEditModel.h"
#include "BlurhashProvider.h"
-#include "Cache.h"
#include "Cache_p.h"
#include "ChatPage.h"
-#include "Clipboard.h"
#include "ColorImageProvider.h"
-#include "CombinedImagePackModel.h"
-#include "CompletionProxyModel.h"
#include "Config.h"
-#include "EventAccessors.h"
-#include "GridImagePackModel.h"
-#include "ImagePackListModel.h"
-#include "InviteesModel.h"
#include "JdenticonProvider.h"
#include "Logging.h"
#include "MainWindow.h"
#include "MatrixClient.h"
-#include "MemberList.h"
#include "MxcImageProvider.h"
-#include "PowerlevelsEditModels.h"
-#include "SingleImagePackModel.h"
#include "TrayIcon.h"
-#include "UserDirectoryModel.h"
#include "UserSettingsPage.h"
#include "Utils.h"
#include "dock/Dock.h"
-#include "emoji/Provider.h"
#include "encryption/DeviceVerificationFlow.h"
-#include "encryption/SelfVerificationStatus.h"
-#include "timeline/DelegateChooser.h"
-#include "timeline/TimelineFilter.h"
#include "timeline/TimelineViewManager.h"
-#include "ui/NhekoGlobalObject.h"
-#include "ui/RoomSummary.h"
-#include "ui/UIA.h"
+#include "ui/Theme.h"
#include "voip/CallManager.h"
#include "voip/WebRTCSession.h"
diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index 4a25880c..c9c878d0 100644
--- a/src/UserSettingsPage.cpp
+++ b/src/UserSettingsPage.cpp
@@ -14,7 +14,6 @@
#include <mtx/secret_storage.hpp>
#include "Cache.h"
-#include "Config.h"
#include "JdenticonProvider.h"
#include "MainWindow.h"
#include "MatrixClient.h"
|