summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Cache.cpp31
-rw-r--r--src/Cache_p.h3
-rw-r--r--src/CommunitiesList.h1
-rw-r--r--src/CommunitiesListItem.h1
-rw-r--r--src/MainWindow.cpp1
-rw-r--r--src/MainWindow.h1
-rw-r--r--src/UserSettingsPage.cpp37
-rw-r--r--src/ui/NhekoGlobalObject.cpp33
-rw-r--r--src/ui/NhekoGlobalObject.h16
-rw-r--r--src/ui/Theme.cpp117
-rw-r--r--src/ui/Theme.h38
-rw-r--r--src/ui/ThemeManager.cpp39
-rw-r--r--src/ui/ThemeManager.h5
-rw-r--r--src/ui/UserProfile.cpp28
14 files changed, 186 insertions, 165 deletions
diff --git a/src/Cache.cpp b/src/Cache.cpp
index 24b2bc24..d8c78381 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -253,6 +253,8 @@ Cache::setup()
         outboundMegolmSessionDb_ = lmdb::dbi::open(txn, OUTBOUND_MEGOLM_SESSIONS_DB, MDB_CREATE);
 
         txn.commit();
+
+        databaseReady_ = true;
 }
 
 void
@@ -788,6 +790,7 @@ Cache::nextBatchToken()
 void
 Cache::deleteData()
 {
+        this->databaseReady_ = false;
         // TODO: We need to remove the env_ while not accepting new requests.
         lmdb::dbi_close(env_, syncStateDb_);
         lmdb::dbi_close(env_, roomsDb_);
@@ -2426,7 +2429,7 @@ Cache::joinedRooms()
 std::optional<MemberInfo>
 Cache::getMember(const std::string &room_id, const std::string &user_id)
 {
-        if (user_id.empty())
+        if (user_id.empty() || !env_.handle())
                 return std::nullopt;
 
         try {
@@ -3551,8 +3554,8 @@ Cache::query_keys(const std::string &user_id,
 
         http::client()->query_keys(
           req,
-          [cb, user_id, last_changed](const mtx::responses::QueryKeys &res,
-                                      mtx::http::RequestErr err) {
+          [cb, user_id, last_changed, this](const mtx::responses::QueryKeys &res,
+                                            mtx::http::RequestErr err) {
                   if (err) {
                           nhlog::net()->warn("failed to query device keys: {},{}",
                                              mtx::errors::to_string(err->matrix_error.errcode),
@@ -3561,10 +3564,22 @@ Cache::query_keys(const std::string &user_id,
                           return;
                   }
 
-                  cache::updateUserKeys(last_changed, res);
-
-                  auto keys = cache::userKeys(user_id);
-                  cb(keys.value_or(UserKeyCache{}), err);
+                  emit userKeysUpdate(last_changed, res);
+
+                  // use context object so that we can disconnect again
+                  std::unique_ptr<QObject> context{new QObject};
+                  QObject *pcontext = context.get();
+                  QObject::connect(
+                    this,
+                    &Cache::verificationStatusChanged,
+                    pcontext,
+                    [cb, user_id, context_ = std::move(context)](std::string updated_user) mutable {
+                            if (user_id == updated_user) {
+                                    context_.release();
+                                    auto keys = cache::userKeys(user_id);
+                                    cb(keys.value_or(UserKeyCache{}), {});
+                            }
+                    });
           });
 }
 
@@ -3999,6 +4014,8 @@ avatarUrl(const QString &room_id, const QString &user_id)
 mtx::presence::PresenceState
 presenceState(const std::string &user_id)
 {
+        if (!instance_)
+                return {};
         return instance_->presenceState(user_id);
 }
 std::string
diff --git a/src/Cache_p.h b/src/Cache_p.h
index 356c6e42..c55fa601 100644
--- a/src/Cache_p.h
+++ b/src/Cache_p.h
@@ -100,6 +100,7 @@ public:
 
         void saveState(const mtx::responses::Sync &res);
         bool isInitialized();
+        bool isDatabaseReady() { return databaseReady_ && isInitialized(); }
 
         std::string nextBatchToken();
 
@@ -620,6 +621,8 @@ private:
         QString cacheDirectory_;
 
         VerificationStorage verification_storage;
+
+        bool databaseReady_ = false;
 };
 
 namespace cache {
diff --git a/src/CommunitiesList.h b/src/CommunitiesList.h
index 2586f6f5..12b275b0 100644
--- a/src/CommunitiesList.h
+++ b/src/CommunitiesList.h
@@ -10,7 +10,6 @@
 
 #include "CacheStructs.h"
 #include "CommunitiesListItem.h"
-#include "ui/Theme.h"
 
 namespace mtx::responses {
 struct GroupProfile;
diff --git a/src/CommunitiesListItem.h b/src/CommunitiesListItem.h
index 006511c8..e7468611 100644
--- a/src/CommunitiesListItem.h
+++ b/src/CommunitiesListItem.h
@@ -10,7 +10,6 @@
 #include <set>
 
 #include "Config.h"
-#include "ui/Theme.h"
 
 class RippleOverlay;
 class QMouseEvent;
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index 92f43e03..e2b625b0 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -295,6 +295,7 @@ MainWindow::showChatPage()
                 &Cache::secretChanged,
                 userSettingsPage_,
                 &UserSettingsPage::updateSecretStatus);
+        emit reload();
 }
 
 void
diff --git a/src/MainWindow.h b/src/MainWindow.h
index 4122e4c1..69d07e62 100644
--- a/src/MainWindow.h
+++ b/src/MainWindow.h
@@ -109,6 +109,7 @@ private slots:
 
 signals:
         void focusChanged(const bool focused);
+        void reload();
 
 private:
         bool loadJdenticonPlugin();
diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index 0edc1288..99560678 100644
--- a/src/UserSettingsPage.cpp
+++ b/src/UserSettingsPage.cpp
@@ -545,49 +545,14 @@ UserSettings::applyTheme()
 {
         QFile stylefile;
 
-        static QPalette original;
         if (this->theme() == "light") {
                 stylefile.setFileName(":/styles/styles/nheko.qss");
-                QPalette lightActive(
-                  /*windowText*/ QColor("#333"),
-                  /*button*/ QColor("white"),
-                  /*light*/ QColor(0xef, 0xef, 0xef),
-                  /*dark*/ QColor(110, 110, 110),
-                  /*mid*/ QColor(220, 220, 220),
-                  /*text*/ QColor("#333"),
-                  /*bright_text*/ QColor("#333"),
-                  /*base*/ QColor("#fff"),
-                  /*window*/ QColor("white"));
-                lightActive.setColor(QPalette::AlternateBase, QColor("#eee"));
-                lightActive.setColor(QPalette::Highlight, QColor("#38a3d8"));
-                lightActive.setColor(QPalette::ToolTipBase, lightActive.base().color());
-                lightActive.setColor(QPalette::ToolTipText, lightActive.text().color());
-                lightActive.setColor(QPalette::Link, QColor("#0077b5"));
-                lightActive.setColor(QPalette::ButtonText, QColor("#333"));
-                QApplication::setPalette(lightActive);
         } else if (this->theme() == "dark") {
                 stylefile.setFileName(":/styles/styles/nheko-dark.qss");
-                QPalette darkActive(
-                  /*windowText*/ QColor("#caccd1"),
-                  /*button*/ QColor(0xff, 0xff, 0xff),
-                  /*light*/ QColor("#caccd1"),
-                  /*dark*/ QColor(110, 110, 110),
-                  /*mid*/ QColor("#202228"),
-                  /*text*/ QColor("#caccd1"),
-                  /*bright_text*/ QColor(0xff, 0xff, 0xff),
-                  /*base*/ QColor("#202228"),
-                  /*window*/ QColor("#2d3139"));
-                darkActive.setColor(QPalette::AlternateBase, QColor("#2d3139"));
-                darkActive.setColor(QPalette::Highlight, QColor("#38a3d8"));
-                darkActive.setColor(QPalette::ToolTipBase, darkActive.base().color());
-                darkActive.setColor(QPalette::ToolTipText, darkActive.text().color());
-                darkActive.setColor(QPalette::Link, QColor("#38a3d8"));
-                darkActive.setColor(QPalette::ButtonText, "#727274");
-                QApplication::setPalette(darkActive);
         } else {
                 stylefile.setFileName(":/styles/styles/system.qss");
-                QApplication::setPalette(original);
         }
+        QApplication::setPalette(Theme::paletteFromTheme(this->theme().toStdString()));
 
         stylefile.open(QFile::ReadOnly);
         QString stylesheet = QString(stylefile.readAll());
diff --git a/src/ui/NhekoGlobalObject.cpp b/src/ui/NhekoGlobalObject.cpp
index e5e6825e..70abfbb8 100644
--- a/src/ui/NhekoGlobalObject.cpp
+++ b/src/ui/NhekoGlobalObject.cpp
@@ -7,29 +7,50 @@
 #include <QDesktopServices>
 #include <QUrl>
 
+#include "Cache_p.h"
 #include "ChatPage.h"
+#include "Logging.h"
 #include "UserSettingsPage.h"
+#include "Utils.h"
 
 Nheko::Nheko()
 {
         connect(
           UserSettings::instance().get(), &UserSettings::themeChanged, this, &Nheko::colorsChanged);
+        connect(ChatPage::instance(), &ChatPage::contentLoaded, this, &Nheko::updateUserProfile);
+}
+
+void
+Nheko::updateUserProfile()
+{
+        if (cache::client() && cache::client()->isInitialized())
+                currentUser_.reset(
+                  new UserProfile("", utils::localUser(), ChatPage::instance()->timelineManager()));
+        else
+                currentUser_.reset();
+        emit profileChanged();
 }
 
 QPalette
 Nheko::colors() const
 {
-        return QPalette();
+        return Theme::paletteFromTheme(UserSettings::instance()->theme().toStdString());
 }
 
 QPalette
 Nheko::inactiveColors() const
 {
-        QPalette p;
+        auto p = colors();
         p.setCurrentColorGroup(QPalette::ColorGroup::Inactive);
         return p;
 }
 
+Theme
+Nheko::theme() const
+{
+        return Theme(UserSettings::instance()->theme().toStdString());
+}
+
 void
 Nheko::openLink(QString link) const
 {
@@ -79,3 +100,11 @@ Nheko::openLink(QString link) const
                 QDesktopServices::openUrl(url);
         }
 }
+
+UserProfile *
+Nheko::currentUser() const
+{
+        nhlog::ui()->debug("Profile requested");
+
+        return currentUser_.get();
+}
diff --git a/src/ui/NhekoGlobalObject.h b/src/ui/NhekoGlobalObject.h
index d952c266..fe645a34 100644
--- a/src/ui/NhekoGlobalObject.h
+++ b/src/ui/NhekoGlobalObject.h
@@ -7,32 +7,46 @@
 #include <QObject>
 #include <QPalette>
 
+#include "Theme.h"
+#include "UserProfile.h"
+
 class Nheko : public QObject
 {
         Q_OBJECT
 
         Q_PROPERTY(QPalette colors READ colors NOTIFY colorsChanged)
         Q_PROPERTY(QPalette inactiveColors READ inactiveColors NOTIFY colorsChanged)
+        Q_PROPERTY(Theme theme READ theme NOTIFY colorsChanged)
         Q_PROPERTY(int avatarSize READ avatarSize CONSTANT)
         Q_PROPERTY(int paddingSmall READ paddingSmall CONSTANT)
         Q_PROPERTY(int paddingMedium READ paddingMedium CONSTANT)
         Q_PROPERTY(int paddingLarge READ paddingLarge CONSTANT)
 
+        Q_PROPERTY(UserProfile *currentUser READ currentUser NOTIFY profileChanged)
+
 public:
         Nheko();
 
         QPalette colors() const;
         QPalette inactiveColors() const;
+        Theme theme() const;
 
         int avatarSize() const { return 40; }
 
         int paddingSmall() const { return 4; }
         int paddingMedium() const { return 8; }
         int paddingLarge() const { return 20; }
+        UserProfile *currentUser() const;
 
         Q_INVOKABLE void openLink(QString link) const;
 
+private slots:
+        void updateUserProfile();
+
 signals:
         void colorsChanged();
-};
+        void profileChanged();
 
+private:
+        QScopedPointer<UserProfile> currentUser_;
+};
diff --git a/src/ui/Theme.cpp b/src/ui/Theme.cpp
index 4341bd63..ca2a4ce0 100644
--- a/src/ui/Theme.cpp
+++ b/src/ui/Theme.cpp
@@ -2,76 +2,65 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-#include <QDebug>
-
 #include "Theme.h"
 
-Theme::Theme(QObject *parent)
-  : QObject(parent)
-{
-        setColor("Black", ui::Color::Black);
-
-        setColor("BrightWhite", ui::Color::BrightWhite);
-        setColor("FadedWhite", ui::Color::FadedWhite);
-        setColor("MediumWhite", ui::Color::MediumWhite);
-
-        setColor("BrightGreen", ui::Color::BrightGreen);
-        setColor("DarkGreen", ui::Color::DarkGreen);
-        setColor("LightGreen", ui::Color::LightGreen);
-
-        setColor("Gray", ui::Color::Gray);
-        setColor("Red", ui::Color::Red);
-        setColor("Blue", ui::Color::Blue);
-
-        setColor("Transparent", ui::Color::Transparent);
-}
-
-QColor
-Theme::rgba(int r, int g, int b, qreal a) const
-{
-        QColor color(r, g, b);
-        color.setAlphaF(a);
-
-        return color;
-}
+Q_DECLARE_METATYPE(Theme)
 
-QColor
-Theme::getColor(const QString &key) const
+QPalette
+Theme::paletteFromTheme(std::string_view theme)
 {
-        if (!colors_.contains(key)) {
-                qWarning() << "Color with key" << key << "could not be found";
-                return QColor();
+        [[maybe_unused]] static auto meta = qRegisterMetaType<Theme>("Theme");
+        static QPalette original;
+        if (theme == "light") {
+                QPalette lightActive(
+                  /*windowText*/ QColor("#333"),
+                  /*button*/ QColor("white"),
+                  /*light*/ QColor(0xef, 0xef, 0xef),
+                  /*dark*/ QColor(110, 110, 110),
+                  /*mid*/ QColor(220, 220, 220),
+                  /*text*/ QColor("#333"),
+                  /*bright_text*/ QColor("#333"),
+                  /*base*/ QColor("#fff"),
+                  /*window*/ QColor("white"));
+                lightActive.setColor(QPalette::AlternateBase, QColor("#eee"));
+                lightActive.setColor(QPalette::Highlight, QColor("#38a3d8"));
+                lightActive.setColor(QPalette::ToolTipBase, lightActive.base().color());
+                lightActive.setColor(QPalette::ToolTipText, lightActive.text().color());
+                lightActive.setColor(QPalette::Link, QColor("#0077b5"));
+                lightActive.setColor(QPalette::ButtonText, QColor("#555459"));
+                return lightActive;
+        } else if (theme == "dark") {
+                QPalette darkActive(
+                  /*windowText*/ QColor("#caccd1"),
+                  /*button*/ QColor(0xff, 0xff, 0xff),
+                  /*light*/ QColor("#caccd1"),
+                  /*dark*/ QColor(110, 110, 110),
+                  /*mid*/ QColor("#202228"),
+                  /*text*/ QColor("#caccd1"),
+                  /*bright_text*/ QColor(0xff, 0xff, 0xff),
+                  /*base*/ QColor("#202228"),
+                  /*window*/ QColor("#2d3139"));
+                darkActive.setColor(QPalette::AlternateBase, QColor("#2d3139"));
+                darkActive.setColor(QPalette::Highlight, QColor("#38a3d8"));
+                darkActive.setColor(QPalette::ToolTipBase, darkActive.base().color());
+                darkActive.setColor(QPalette::ToolTipText, darkActive.text().color());
+                darkActive.setColor(QPalette::Link, QColor("#38a3d8"));
+                darkActive.setColor(QPalette::ButtonText, "#727274");
+                return darkActive;
+        } else {
+                return original;
         }
-
-        return colors_.value(key);
 }
 
-void
-Theme::setColor(const QString &key, const QColor &color)
+Theme::Theme(std::string_view theme)
 {
-        colors_.insert(key, color);
-}
-
-void
-Theme::setColor(const QString &key, ui::Color color)
-{
-        static const QColor palette[] = {
-          QColor("#171919"),
-
-          QColor("#EBEBEB"),
-          QColor("#C9C9C9"),
-          QColor("#929292"),
-
-          QColor("#1C3133"),
-          QColor("#577275"),
-          QColor("#46A451"),
-
-          QColor("#5D6565"),
-          QColor("#E22826"),
-          QColor("#81B3A9"),
-
-          rgba(0, 0, 0, 0),
-        };
-
-        colors_.insert(key, palette[static_cast<int>(color)]);
+        auto p     = paletteFromTheme(theme);
+        separator_ = p.mid().color();
+        if (theme == "light") {
+                sidebarBackground_ = QColor("#233649");
+        } else if (theme == "dark") {
+                sidebarBackground_ = QColor("#2d3139");
+        } else {
+                sidebarBackground_ = p.window().color();
+        }
 }
diff --git a/src/ui/Theme.h b/src/ui/Theme.h
index 3243c076..64bc8273 100644
--- a/src/ui/Theme.h
+++ b/src/ui/Theme.h
@@ -5,8 +5,7 @@
 #pragma once
 
 #include <QColor>
-#include <QHash>
-#include <QObject>
+#include <QPalette>
 
 namespace ui {
 enum class AvatarType
@@ -60,36 +59,21 @@ enum class ProgressType
         IndeterminateProgress
 };
 
-enum class Color
-{
-        Black,
-        BrightWhite,
-        FadedWhite,
-        MediumWhite,
-        DarkGreen,
-        LightGreen,
-        BrightGreen,
-        Gray,
-        Red,
-        Blue,
-        Transparent
-};
-
 } // namespace ui
 
-class Theme : public QObject
+class Theme : public QPalette
 {
-        Q_OBJECT
+        Q_GADGET
+        Q_PROPERTY(QColor sidebarBackground READ sidebarBackground CONSTANT)
+        Q_PROPERTY(QColor separator READ separator CONSTANT)
 public:
-        explicit Theme(QObject *parent = nullptr);
+        Theme() {}
+        explicit Theme(std::string_view theme);
+        static QPalette paletteFromTheme(std::string_view theme);
 
-        QColor getColor(const QString &key) const;
-
-        void setColor(const QString &key, const QColor &color);
-        void setColor(const QString &key, ui::Color color);
+        QColor sidebarBackground() const { return sidebarBackground_; }
+        QColor separator() const { return separator_; }
 
 private:
-        QColor rgba(int r, int g, int b, qreal a) const;
-
-        QHash<QString, QColor> colors_;
+        QColor sidebarBackground_, separator_;
 };
diff --git a/src/ui/ThemeManager.cpp b/src/ui/ThemeManager.cpp
index 834f5083..b7b3df40 100644
--- a/src/ui/ThemeManager.cpp
+++ b/src/ui/ThemeManager.cpp
@@ -6,18 +6,37 @@
 
 #include "ThemeManager.h"
 
-ThemeManager::ThemeManager() { setTheme(new Theme); }
-
-void
-ThemeManager::setTheme(Theme *theme)
-{
-        theme_ = theme;
-        theme_->setParent(this);
-}
+ThemeManager::ThemeManager() {}
 
 QColor
 ThemeManager::themeColor(const QString &key) const
 {
-        Q_ASSERT(theme_);
-        return theme_->getColor(key);
+        if (key == "Black")
+                return QColor("#171919");
+
+        else if (key == "BrightWhite")
+                return QColor("#EBEBEB");
+        else if (key == "FadedWhite")
+                return QColor("#C9C9C9");
+        else if (key == "MediumWhite")
+                return QColor("#929292");
+
+        else if (key == "BrightGreen")
+                return QColor("#1C3133");
+        else if (key == "DarkGreen")
+                return QColor("#577275");
+        else if (key == "LightGreen")
+                return QColor("#46A451");
+
+        else if (key == "Gray")
+                return QColor("#5D6565");
+        else if (key == "Red")
+                return QColor("#E22826");
+        else if (key == "Blue")
+                return QColor("#81B3A9");
+
+        else if (key == "Transparent")
+                return QColor(0, 0, 0, 0);
+
+        return (QColor(0, 0, 0, 0));
 }
diff --git a/src/ui/ThemeManager.h b/src/ui/ThemeManager.h
index f2099730..cbb355fd 100644
--- a/src/ui/ThemeManager.h
+++ b/src/ui/ThemeManager.h
@@ -6,8 +6,6 @@
 
 #include <QCommonStyle>
 
-#include "Theme.h"
-
 class ThemeManager : public QCommonStyle
 {
         Q_OBJECT
@@ -15,7 +13,6 @@ class ThemeManager : public QCommonStyle
 public:
         inline static ThemeManager &instance();
 
-        void setTheme(Theme *theme);
         QColor themeColor(const QString &key) const;
 
 private:
@@ -23,8 +20,6 @@ private:
 
         ThemeManager(ThemeManager const &);
         void operator=(ThemeManager const &);
-
-        Theme *theme_;
 };
 
 inline ThemeManager &
diff --git a/src/ui/UserProfile.cpp b/src/ui/UserProfile.cpp
index 0f330964..cef8bd85 100644
--- a/src/ui/UserProfile.cpp
+++ b/src/ui/UserProfile.cpp
@@ -27,9 +27,22 @@ UserProfile::UserProfile(QString roomid,
   , manager(manager_)
   , model(parent)
 {
-        fetchDeviceList(this->userid_);
         globalAvatarUrl = "";
 
+        connect(this,
+                &UserProfile::globalUsernameRetrieved,
+                this,
+                &UserProfile::setGlobalUsername,
+                Qt::QueuedConnection);
+
+        if (isGlobalUserProfile()) {
+                getGlobalProfileData();
+        }
+
+        if (!cache::client() || !cache::client()->isDatabaseReady())
+                return;
+
+        fetchDeviceList(this->userid_);
         connect(cache::client(),
                 &Cache::verificationStatusChanged,
                 this,
@@ -54,16 +67,6 @@ UserProfile::UserProfile(QString roomid,
                         }
                         deviceList_.reset(deviceList_.deviceList_);
                 });
-
-        connect(this,
-                &UserProfile::globalUsernameRetrieved,
-                this,
-                &UserProfile::setGlobalUsername,
-                Qt::QueuedConnection);
-
-        if (isGlobalUserProfile()) {
-                getGlobalProfileData();
-        }
 }
 
 QHash<int, QByteArray>
@@ -157,6 +160,9 @@ UserProfile::fetchDeviceList(const QString &userID)
 {
         auto localUser = utils::localUser();
 
+        if (!cache::client() || !cache::client()->isDatabaseReady())
+                return;
+
         cache::client()->query_keys(
           userID.toStdString(),
           [other_user_id = userID.toStdString(), this](const UserKeyCache &other_user_keys,