Skip to content
Snippets Groups Projects
UserSettingsPage.h 18.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • Nicolas Werner's avatar
    Nicolas Werner committed
    // SPDX-FileCopyrightText: 2017 Konstantinos Sideris <siderisk@auth.gr>
    // SPDX-FileCopyrightText: 2021 Nheko Contributors
    //
    // SPDX-License-Identifier: GPL-3.0-or-later
    
    
    #pragma once
    
    
    Joe Donofry's avatar
    Joe Donofry committed
    #include <QFontDatabase>
    
    #include <QFrame>
    
    #include <QProcessEnvironment>
    
    #include <QSettings>
    
    #include <QSharedPointer>
    #include <QWidget>
    
    
    #include <optional>
    
    
    class Toggle;
    
    class QLabel;
    class QFormLayout;
    class QComboBox;
    
    class QHBoxLayout;
    class QVBoxLayout;
    
    constexpr int OptionMargin       = 6;
    constexpr int LayoutTopMargin    = 50;
    constexpr int LayoutBottomMargin = LayoutTopMargin;
    
    class UserSettings : public QObject
    
            Q_PROPERTY(QString theme READ theme WRITE setTheme NOTIFY themeChanged)
    
            Q_PROPERTY(bool messageHoverHighlight READ messageHoverHighlight WRITE
    
                         setMessageHoverHighlight NOTIFY messageHoverHighlightChanged)
    
            Q_PROPERTY(bool enlargeEmojiOnlyMessages READ enlargeEmojiOnlyMessages WRITE
    
                         setEnlargeEmojiOnlyMessages NOTIFY enlargeEmojiOnlyMessagesChanged)
    
            Q_PROPERTY(bool tray READ tray WRITE setTray NOTIFY trayChanged)
            Q_PROPERTY(bool startInTray READ startInTray WRITE setStartInTray NOTIFY startInTrayChanged)
            Q_PROPERTY(bool groupView READ groupView WRITE setGroupView NOTIFY groupViewStateChanged)
            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
                         NOTIFY typingNotificationsChanged)
            Q_PROPERTY(bool sortByImportance READ sortByImportance WRITE setSortByImportance NOTIFY
                         roomSortingChanged)
            Q_PROPERTY(bool buttonsInTimeline READ buttonsInTimeline WRITE setButtonsInTimeline NOTIFY
                         buttonInTimelineChanged)
    
              bool readReceipts READ readReceipts WRITE setReadReceipts NOTIFY readReceiptsChanged)
    
            Q_PROPERTY(bool desktopNotifications READ hasDesktopNotifications WRITE
                         setDesktopNotifications NOTIFY desktopNotificationsChanged)
    
            Q_PROPERTY(bool alertOnNotification READ hasAlertOnNotification WRITE setAlertOnNotification
                         NOTIFY alertOnNotificationChanged)
    
            Q_PROPERTY(
              bool avatarCircles READ avatarCircles WRITE setAvatarCircles NOTIFY avatarCirclesChanged)
            Q_PROPERTY(bool decryptSidebar READ decryptSidebar WRITE setDecryptSidebar NOTIFY
    
    Joe Donofry's avatar
    Joe Donofry committed
            Q_PROPERTY(
              bool privacyScreen READ privacyScreen WRITE setPrivacyScreen NOTIFY privacyScreenChanged)
            Q_PROPERTY(int privacyScreenTimeout READ privacyScreenTimeout WRITE setPrivacyScreenTimeout
                         NOTIFY privacyScreenTimeoutChanged)
    
            Q_PROPERTY(int timelineMaxWidth READ timelineMaxWidth WRITE setTimelineMaxWidth NOTIFY
                         timelineMaxWidthChanged)
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            Q_PROPERTY(
              int roomListWidth READ roomListWidth WRITE setRoomListWidth NOTIFY roomListWidthChanged)
            Q_PROPERTY(int communityListWidth READ communityListWidth WRITE setCommunityListWidth NOTIFY
                         communityListWidthChanged)
    
            Q_PROPERTY(bool mobileMode READ mobileMode WRITE setMobileMode NOTIFY mobileModeChanged)
    
            Q_PROPERTY(double fontSize READ fontSize WRITE setFontSize NOTIFY fontSizeChanged)
            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)
    
            Q_PROPERTY(QString ringtone READ ringtone WRITE setRingtone NOTIFY ringtoneChanged)
    
    trilene's avatar
    trilene committed
            Q_PROPERTY(QString microphone READ microphone WRITE setMicrophone NOTIFY microphoneChanged)
            Q_PROPERTY(QString camera READ camera WRITE setCamera NOTIFY cameraChanged)
            Q_PROPERTY(QString cameraResolution READ cameraResolution WRITE setCameraResolution NOTIFY
                         cameraResolutionChanged)
            Q_PROPERTY(QString cameraFrameRate READ cameraFrameRate WRITE setCameraFrameRate NOTIFY
                         cameraFrameRateChanged)
    
            Q_PROPERTY(int screenShareFrameRate READ screenShareFrameRate WRITE setScreenShareFrameRate
                         NOTIFY screenShareFrameRateChanged)
    
            Q_PROPERTY(bool screenSharePiP READ screenSharePiP WRITE setScreenSharePiP NOTIFY
                         screenSharePiPChanged)
    
            Q_PROPERTY(bool screenShareRemoteVideo READ screenShareRemoteVideo WRITE
                         setScreenShareRemoteVideo NOTIFY screenShareRemoteVideoChanged)
    
            Q_PROPERTY(bool screenShareHideCursor READ screenShareHideCursor WRITE
                         setScreenShareHideCursor NOTIFY screenShareHideCursorChanged)
    
    trilene's avatar
    trilene committed
            Q_PROPERTY(
              bool useStunServer READ useStunServer WRITE setUseStunServer NOTIFY useStunServerChanged)
    
            Q_PROPERTY(bool onlyShareKeysWithVerifiedUsers READ onlyShareKeysWithVerifiedUsers WRITE
                         setOnlyShareKeysWithVerifiedUsers NOTIFY onlyShareKeysWithVerifiedUsersChanged)
    
            Q_PROPERTY(bool shareKeysWithTrustedUsers READ shareKeysWithTrustedUsers WRITE
                         setShareKeysWithTrustedUsers NOTIFY shareKeysWithTrustedUsersChanged)
    
            Q_PROPERTY(bool useOnlineKeyBackup READ useOnlineKeyBackup WRITE setUseOnlineKeyBackup
                         NOTIFY useOnlineKeyBackupChanged)
    
            Q_PROPERTY(QString profile READ profile WRITE setProfile NOTIFY profileChanged)
            Q_PROPERTY(QString userId READ userId WRITE setUserId NOTIFY userIdChanged)
            Q_PROPERTY(
              QString accessToken READ accessToken WRITE setAccessToken NOTIFY accessTokenChanged)
            Q_PROPERTY(QString deviceId READ deviceId WRITE setDeviceId NOTIFY deviceIdChanged)
            Q_PROPERTY(QString homeserver READ homeserver WRITE setHomeserver NOTIFY homeserverChanged)
    
            Q_PROPERTY(bool disableCertificateValidation READ disableCertificateValidation WRITE
                         setDisableCertificateValidation NOTIFY disableCertificateValidationChanged)
    
            UserSettings();
    
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    public:
            static QSharedPointer<UserSettings> instance();
            static void initialize(std::optional<QString> profile);
    
    
            QSettings *qsettings() { return &settings; }
    
    
            enum class Presence
            {
                    AutomaticPresence,
                    Online,
                    Unavailable,
                    Offline,
            };
    
            void save();
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            void load(std::optional<QString> profile);
    
            void applyTheme();
            void setTheme(QString theme);
    
            void setMessageHoverHighlight(bool state);
            void setEnlargeEmojiOnlyMessages(bool state);
            void setTray(bool state);
            void setStartInTray(bool state);
    
            void setMobileMode(bool mode);
    
            void setFontSize(double size);
    
    Joe Donofry's avatar
    Joe Donofry committed
            void setFontFamily(QString family);
    
            void setEmojiFontFamily(QString family);
    
            void setMarkdown(bool state);
    
            void setAnimateImagesOnHover(bool state);
    
            void setReadReceipts(bool state);
            void setTypingNotifications(bool state);
            void setSortByImportance(bool state);
            void setButtonsInTimeline(bool state);
            void setTimelineMaxWidth(int state);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            void setCommunityListWidth(int state);
            void setRoomListWidth(int state);
    
            void setDesktopNotifications(bool state);
    
            void setAlertOnNotification(bool state);
    
            void setAvatarCircles(bool state);
            void setDecryptSidebar(bool state);
    
            void setPrivacyScreen(bool state);
            void setPrivacyScreenTimeout(int state);
    
            void setPresence(Presence state);
    
            void setRingtone(QString ringtone);
    
    trilene's avatar
    trilene committed
            void setMicrophone(QString microphone);
            void setCamera(QString camera);
            void setCameraResolution(QString resolution);
            void setCameraFrameRate(QString frameRate);
    
            void setScreenShareFrameRate(int frameRate);
    
            void setScreenSharePiP(bool state);
    
            void setScreenShareRemoteVideo(bool state);
    
            void setScreenShareHideCursor(bool state);
    
    trilene's avatar
    trilene committed
            void setUseStunServer(bool state);
    
            void setOnlyShareKeysWithVerifiedUsers(bool state);
    
            void setShareKeysWithTrustedUsers(bool state);
    
            void setUseOnlineKeyBackup(bool state);
    
            void setProfile(QString profile);
            void setUserId(QString userId);
            void setAccessToken(QString accessToken);
            void setDeviceId(QString deviceId);
            void setHomeserver(QString homeserver);
    
            void setDisableCertificateValidation(bool disabled);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            void setHiddenTags(QStringList hiddenTags);
    
            QString theme() const { return !theme_.isEmpty() ? theme_ : defaultTheme_; }
    
            bool messageHoverHighlight() const { return messageHoverHighlight_; }
            bool enlargeEmojiOnlyMessages() const { return enlargeEmojiOnlyMessages_; }
            bool tray() const { return tray_; }
            bool startInTray() const { return startInTray_; }
            bool groupView() const { return groupView_; }
            bool avatarCircles() const { return avatarCircles_; }
            bool decryptSidebar() const { return decryptSidebar_; }
    
            bool privacyScreen() const { return privacyScreen_; }
            int privacyScreenTimeout() const { return privacyScreenTimeout_; }
    
            bool markdown() const { return markdown_; }
    
            bool animateImagesOnHover() const { return animateImagesOnHover_; }
    
            bool typingNotifications() const { return typingNotifications_; }
            bool sortByImportance() const { return sortByImportance_; }
            bool buttonsInTimeline() const { return buttonsInTimeline_; }
    
            bool mobileMode() const { return mobileMode_; }
    
            bool readReceipts() const { return readReceipts_; }
    
            bool hasDesktopNotifications() const { return hasDesktopNotifications_; }
    
            bool hasAlertOnNotification() const { return hasAlertOnNotification_; }
            bool hasNotifications() const
            {
                    return hasDesktopNotifications() || hasAlertOnNotification();
            }
    
            int timelineMaxWidth() const { return timelineMaxWidth_; }
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            int communityListWidth() const { return communityListWidth_; }
            int roomListWidth() const { return roomListWidth_; }
    
            double fontSize() const { return baseFontSize_; }
    
            QString font() const { return font_; }
    
    Jedi18's avatar
    Jedi18 committed
            QString emojiFont() const
            {
    
    Jedi18's avatar
    Jedi18 committed
                    if (emojiFont_ == "Default") {
                            return tr("Default");
                    }
    
    
    Jedi18's avatar
    Jedi18 committed
                    return emojiFont_;
    
            Presence presence() const { return presence_; }
    
            QString ringtone() const { return ringtone_; }
    
    trilene's avatar
    trilene committed
            QString microphone() const { return microphone_; }
            QString camera() const { return camera_; }
            QString cameraResolution() const { return cameraResolution_; }
            QString cameraFrameRate() const { return cameraFrameRate_; }
    
            int screenShareFrameRate() const { return screenShareFrameRate_; }
    
            bool screenSharePiP() const { return screenSharePiP_; }
    
            bool screenShareRemoteVideo() const { return screenShareRemoteVideo_; }
    
            bool screenShareHideCursor() const { return screenShareHideCursor_; }
    
    trilene's avatar
    trilene committed
            bool useStunServer() const { return useStunServer_; }
    
            bool shareKeysWithTrustedUsers() const { return shareKeysWithTrustedUsers_; }
    
            bool onlyShareKeysWithVerifiedUsers() const { return onlyShareKeysWithVerifiedUsers_; }
    
            bool useOnlineKeyBackup() const { return useOnlineKeyBackup_; }
    
            QString profile() const { return profile_; }
            QString userId() const { return userId_; }
            QString accessToken() const { return accessToken_; }
            QString deviceId() const { return deviceId_; }
            QString homeserver() const { return homeserver_; }
    
            bool disableCertificateValidation() const { return disableCertificateValidation_; }
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            QStringList hiddenTags() const { return hiddenTags_; }
    
    signals:
            void groupViewStateChanged(bool state);
    
            void roomSortingChanged(bool state);
            void themeChanged(QString state);
            void messageHoverHighlightChanged(bool state);
            void enlargeEmojiOnlyMessagesChanged(bool state);
            void trayChanged(bool state);
            void startInTrayChanged(bool state);
            void markdownChanged(bool state);
    
            void animateImagesOnHoverChanged(bool state);
    
            void typingNotificationsChanged(bool state);
            void buttonInTimelineChanged(bool state);
            void readReceiptsChanged(bool state);
            void desktopNotificationsChanged(bool state);
    
            void alertOnNotificationChanged(bool state);
    
            void avatarCirclesChanged(bool state);
            void decryptSidebarChanged(bool state);
    
            void privacyScreenChanged(bool state);
            void privacyScreenTimeoutChanged(int state);
    
            void timelineMaxWidthChanged(int state);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            void roomListWidthChanged(int state);
            void communityListWidthChanged(int state);
    
            void mobileModeChanged(bool mode);
    
            void fontSizeChanged(double state);
            void fontChanged(QString state);
            void emojiFontChanged(QString state);
    
            void presenceChanged(Presence state);
    
            void ringtoneChanged(QString ringtone);
    
    trilene's avatar
    trilene committed
            void microphoneChanged(QString microphone);
            void cameraChanged(QString camera);
            void cameraResolutionChanged(QString resolution);
            void cameraFrameRateChanged(QString frameRate);
    
            void screenShareFrameRateChanged(int frameRate);
    
            void screenSharePiPChanged(bool state);
    
            void screenShareRemoteVideoChanged(bool state);
    
            void screenShareHideCursorChanged(bool state);
    
    trilene's avatar
    trilene committed
            void useStunServerChanged(bool state);
    
            void onlyShareKeysWithVerifiedUsersChanged(bool state);
    
            void shareKeysWithTrustedUsersChanged(bool state);
    
            void useOnlineKeyBackupChanged(bool state);
    
            void profileChanged(QString profile);
            void userIdChanged(QString userId);
            void accessTokenChanged(QString accessToken);
            void deviceIdChanged(QString deviceId);
            void homeserverChanged(QString homeserver);
    
            void disableCertificateValidationChanged(bool disabled);
    
            // Default to system theme if QT_QPA_PLATFORMTHEME var is set.
            QString defaultTheme_ =
              QProcessEnvironment::systemEnvironment().value("QT_QPA_PLATFORMTHEME", "").isEmpty()
                ? "light"
                : "system";
    
            QString theme_;
    
            bool messageHoverHighlight_;
            bool enlargeEmojiOnlyMessages_;
            bool tray_;
            bool startInTray_;
            bool groupView_;
            bool markdown_;
    
            bool animateImagesOnHover_;
    
            bool typingNotifications_;
    
            bool buttonsInTimeline_;
            bool readReceipts_;
    
            bool hasDesktopNotifications_;
    
            bool hasAlertOnNotification_;
    
            bool avatarCircles_;
    
            bool privacyScreen_;
            int privacyScreenTimeout_;
    
            bool shareKeysWithTrustedUsers_;
    
            bool onlyShareKeysWithVerifiedUsers_;
    
            bool useOnlineKeyBackup_;
    
            bool mobileMode_;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            int roomListWidth_;
            int communityListWidth_;
    
            double baseFontSize_;
    
    Joe Donofry's avatar
    Joe Donofry committed
            QString font_;
    
            QString emojiFont_;
    
            Presence presence_;
    
            QString ringtone_;
    
    trilene's avatar
    trilene committed
            QString microphone_;
            QString camera_;
            QString cameraResolution_;
            QString cameraFrameRate_;
    
            int screenShareFrameRate_;
    
            bool screenSharePiP_;
    
            bool screenShareRemoteVideo_;
    
            bool screenShareHideCursor_;
    
    trilene's avatar
    trilene committed
            bool useStunServer_;
    
            bool disableCertificateValidation_ = false;
    
            QString profile_;
            QString userId_;
            QString accessToken_;
            QString deviceId_;
            QString homeserver_;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            QStringList hiddenTags_;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            static QSharedPointer<UserSettings> instance_;
    
    };
    
    class HorizontalLine : public QFrame
    {
            Q_OBJECT
    
    public:
            HorizontalLine(QWidget *parent = nullptr);
    };
    
    class UserSettingsPage : public QWidget
    {
            Q_OBJECT
    
    public:
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            UserSettingsPage(QSharedPointer<UserSettings> settings, QWidget *parent = nullptr);
    
    
    protected:
            void showEvent(QShowEvent *event) override;
    
            void paintEvent(QPaintEvent *event) override;
    
    
    signals:
            void moveBack();
    
            void trayOptionChanged(bool value);
    
    Joe Donofry's avatar
    Joe Donofry committed
            void themeChanged();
    
            void decryptSidebarChanged();
    
    public slots:
            void updateSecretStatus();
    
    
    private slots:
            void importSessionKeys();
            void exportSessionKeys();
    
    
    private:
            // Layouts
            QVBoxLayout *topLayout_;
            QHBoxLayout *topBarLayout_;
    
            QFormLayout *formLayout_;
    
    
            // Shared settings object.
            QSharedPointer<UserSettings> settings_;
    
            Toggle *trayToggle_;
    
    Anton Karmanov's avatar
    Anton Karmanov committed
            Toggle *startInTrayToggle_;
    
            Toggle *groupViewToggle_;
    
            Toggle *typingNotifications_;
    
            Toggle *messageHoverHighlight_;
    
            Toggle *markdown_;
    
            Toggle *animateImagesOnHover_;
    
            Toggle *desktopNotifications_;
    
            Toggle *alertOnNotification_;
    
            Toggle *avatarCircles_;
    
    trilene's avatar
    trilene committed
            Toggle *useStunServer_;
    
            Toggle *privacyScreen_;
            QSpinBox *privacyScreenTimeout_;
    
            Toggle *shareKeysWithTrustedUsers_;
    
            Toggle *onlyShareKeysWithVerifiedUsers_;
    
            Toggle *useOnlineKeyBackup_;
    
            Toggle *mobileMode_;
    
            QLabel *deviceFingerprintValue_;
            QLabel *deviceIdValue_;
    
            QLabel *backupSecretCached;
            QLabel *masterSecretCached;
            QLabel *selfSigningSecretCached;
            QLabel *userSigningSecretCached;
    
            QComboBox *themeCombo_;
    
            QComboBox *scaleFactorCombo_;
    
            QComboBox *fontSizeCombo_;
    
            QFontComboBox *fontSelectionCombo_;
    
            QComboBox *emojiFontSelectionCombo_;
    
            QComboBox *ringtoneCombo_;
    
    trilene's avatar
    trilene committed
            QComboBox *microphoneCombo_;
            QComboBox *cameraCombo_;
            QComboBox *cameraResolutionCombo_;
            QComboBox *cameraFrameRateCombo_;
    
            int sideMargin_ = 0;