1 files changed, 142 insertions, 0 deletions
diff --git a/src/ui/NhekoGlobalObject.cpp b/src/ui/NhekoGlobalObject.cpp
new file mode 100644
index 00000000..fea10839
--- /dev/null
+++ b/src/ui/NhekoGlobalObject.cpp
@@ -0,0 +1,142 @@
+// SPDX-FileCopyrightText: 2021 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "NhekoGlobalObject.h"
+
+#include <QDesktopServices>
+#include <QUrl>
+
+#include "Cache_p.h"
+#include "ChatPage.h"
+#include "Logging.h"
+#include "MainWindow.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 Theme::paletteFromTheme(UserSettings::instance()->theme().toStdString());
+}
+
+QPalette
+Nheko::inactiveColors() const
+{
+ 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
+{
+ QUrl url(link);
+ if (url.scheme() == "https" && url.host() == "matrix.to") {
+ // handle matrix.to links internally
+ QString p = url.fragment(QUrl::FullyEncoded);
+ if (p.startsWith("/"))
+ p.remove(0, 1);
+
+ auto temp = p.split("?");
+ QString query;
+ if (temp.size() >= 2)
+ query = QUrl::fromPercentEncoding(temp.takeAt(1).toUtf8());
+
+ temp = temp.first().split("/");
+ auto identifier = QUrl::fromPercentEncoding(temp.takeFirst().toUtf8());
+ QString eventId = QUrl::fromPercentEncoding(temp.join('/').toUtf8());
+ if (!identifier.isEmpty()) {
+ if (identifier.startsWith("@")) {
+ QByteArray uri =
+ "matrix:u/" + QUrl::toPercentEncoding(identifier.remove(0, 1));
+ if (!query.isEmpty())
+ uri.append("?" + query.toUtf8());
+ ChatPage::instance()->handleMatrixUri(QUrl::fromEncoded(uri));
+ } else if (identifier.startsWith("#")) {
+ QByteArray uri =
+ "matrix:r/" + QUrl::toPercentEncoding(identifier.remove(0, 1));
+ if (!eventId.isEmpty())
+ uri.append("/e/" +
+ QUrl::toPercentEncoding(eventId.remove(0, 1)));
+ if (!query.isEmpty())
+ uri.append("?" + query.toUtf8());
+ ChatPage::instance()->handleMatrixUri(QUrl::fromEncoded(uri));
+ } else if (identifier.startsWith("!")) {
+ QByteArray uri = "matrix:roomid/" +
+ QUrl::toPercentEncoding(identifier.remove(0, 1));
+ if (!eventId.isEmpty())
+ uri.append("/e/" +
+ QUrl::toPercentEncoding(eventId.remove(0, 1)));
+ if (!query.isEmpty())
+ uri.append("?" + query.toUtf8());
+ ChatPage::instance()->handleMatrixUri(QUrl::fromEncoded(uri));
+ }
+ }
+ } else {
+ QDesktopServices::openUrl(url);
+ }
+}
+void
+Nheko::setStatusMessage(QString msg) const
+{
+ ChatPage::instance()->setStatus(msg);
+}
+
+UserProfile *
+Nheko::currentUser() const
+{
+ nhlog::ui()->debug("Profile requested");
+
+ return currentUser_.get();
+}
+
+void
+Nheko::showUserSettingsPage() const
+{
+ ChatPage::instance()->showUserSettingsPage();
+}
+
+void
+Nheko::openLogoutDialog() const
+{
+ MainWindow::instance()->openLogoutDialog();
+}
+
+void
+Nheko::openCreateRoomDialog() const
+{
+ MainWindow::instance()->openCreateRoomDialog(
+ [](const mtx::requests::CreateRoom &req) { ChatPage::instance()->createRoom(req); });
+}
+
+void
+Nheko::openJoinRoomDialog() const
+{
+ MainWindow::instance()->openJoinRoomDialog(
+ [](const QString &room_id) { ChatPage::instance()->joinRoom(room_id); });
+}
|