From 5fc1f3bd678cca690268eafbb7e4595657a6e133 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sun, 15 Dec 2019 02:56:04 +0100 Subject: Reduce overhead of Cache.h --- src/MainWindow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/MainWindow.cpp') diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 7d9a8902..b13f1b80 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -114,7 +114,7 @@ MainWindow::MainWindow(QWidget *parent) connect( userSettingsPage_, SIGNAL(trayOptionChanged(bool)), trayIcon_, SLOT(setVisible(bool))); connect(userSettingsPage_, &UserSettingsPage::themeChanged, this, []() { - Cache::clearUserColors(); + cache::clearUserColors(); }); connect( userSettingsPage_, &UserSettingsPage::themeChanged, chat_page_, &ChatPage::themeChanged); @@ -444,7 +444,7 @@ MainWindow::openReadReceiptsDialog(const QString &event_id) const auto room_id = chat_page_->currentRoom(); try { - dialog->addUsers(cache::client()->readReceipts(event_id, room_id)); + dialog->addUsers(cache::readReceipts(event_id, room_id)); } catch (const lmdb::error &e) { nhlog::db()->warn("failed to retrieve read receipts for {} {}", event_id.toStdString(), @@ -507,4 +507,4 @@ MainWindow::loadJdenticonPlugin() nhlog::ui()->info("jdenticon plugin not found."); return false; -} \ No newline at end of file +} -- cgit 1.5.1 From 79f967da8c8c077a6fdbbd46ae9ee59a19a891a3 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sun, 15 Dec 2019 03:34:17 +0100 Subject: Reduce Cache.h includes further via one forward declaration --- src/Cache.cpp | 2 -- src/ChatPage.h | 1 + src/MainWindow.cpp | 1 + src/MxcImageProvider.cpp | 2 +- src/QuickSwitcher.cpp | 1 + src/UserSettingsPage.cpp | 1 + src/Utils.cpp | 1 + src/Utils.h | 7 ++++++- src/dialogs/RoomSettings.cpp | 1 + 9 files changed, 13 insertions(+), 4 deletions(-) (limited to 'src/MainWindow.cpp') diff --git a/src/Cache.cpp b/src/Cache.cpp index 79425fa1..0bfc2842 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -104,7 +104,6 @@ numeric_key_comparison(const MDB_val *a, const MDB_val *b) return -1; } - Cache::Cache(const QString &userId, QObject *parent) : QObject{parent} , env_{nullptr} @@ -2901,4 +2900,3 @@ restoreSessions() return instance_->restoreSessions(); } } // namespace cache - diff --git a/src/ChatPage.h b/src/ChatPage.h index a7fb31a8..9e88dcc6 100644 --- a/src/ChatPage.h +++ b/src/ChatPage.h @@ -22,6 +22,7 @@ #include #include +#include #include #include diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index b13f1b80..a24266fa 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -23,6 +23,7 @@ #include +#include "Cache.h" #include "ChatPage.h" #include "Config.h" #include "Logging.h" diff --git a/src/MxcImageProvider.cpp b/src/MxcImageProvider.cpp index 02ca2806..d04eab24 100644 --- a/src/MxcImageProvider.cpp +++ b/src/MxcImageProvider.cpp @@ -1,8 +1,8 @@ #include "MxcImageProvider.h" #include "Cache.h" -#include "MatrixClient.h" #include "Logging.h" +#include "MatrixClient.h" void MxcImageResponse::run() diff --git a/src/QuickSwitcher.cpp b/src/QuickSwitcher.cpp index 29683bb3..53dd21e0 100644 --- a/src/QuickSwitcher.cpp +++ b/src/QuickSwitcher.cpp @@ -22,6 +22,7 @@ #include #include +#include "Cache.h" #include "QuickSwitcher.h" #include "popups/SuggestionsPopup.h" diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp index 772a8d13..6809d605 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp @@ -29,6 +29,7 @@ #include #include +#include "Cache.h" #include "Config.h" #include "MatrixClient.h" #include "Olm.h" diff --git a/src/Utils.cpp b/src/Utils.cpp index 918e1996..1c94761d 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -15,6 +15,7 @@ #include +#include "Cache.h" #include "Config.h" using TimelineEvent = mtx::events::collections::TimelineEvents; diff --git a/src/Utils.h b/src/Utils.h index aa62b8e7..6b809d63 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -2,7 +2,6 @@ #include -#include "Cache.h" #include "RoomInfoListItem.h" #include @@ -13,6 +12,12 @@ #include +namespace cache { +// Forward declarations to prevent dependency on Cache.h, since this header is included often! +QString +displayName(const QString &room_id, const QString &user_id); +} + class QComboBox; // Contains information about related events for diff --git a/src/dialogs/RoomSettings.cpp b/src/dialogs/RoomSettings.cpp index fcaa4fdc..b214b35d 100644 --- a/src/dialogs/RoomSettings.cpp +++ b/src/dialogs/RoomSettings.cpp @@ -16,6 +16,7 @@ #include "dialogs/RoomSettings.h" +#include "Cache.h" #include "ChatPage.h" #include "Config.h" #include "Logging.h" -- cgit 1.5.1 From 995568814bda7a51de8035cb2836122091eac72f Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Fri, 31 Jan 2020 02:30:09 +0100 Subject: Use cleaned up logo --- CMakeLists.txt | 1 + resources/login.png | Bin 5523 -> 5543 bytes resources/login@2x.png | Bin 11395 -> 11432 bytes resources/nheko-1024.png | Bin 42770 -> 53595 bytes resources/nheko-128.png | Bin 5523 -> 5543 bytes resources/nheko-16.png | Bin 728 -> 696 bytes resources/nheko-256.png | Bin 11395 -> 11432 bytes resources/nheko-32.png | Bin 1464 -> 1439 bytes resources/nheko-48.png | Bin 2299 -> 2116 bytes resources/nheko-512.png | Bin 24776 -> 25223 bytes resources/nheko-64.png | Bin 2705 -> 2742 bytes resources/nheko-rebuild-round-corners.svg | 185 ------------------------------ resources/nheko-rebuild-sharp-corners.svg | 185 ------------------------------ resources/nheko.png | Bin 24776 -> 24676 bytes resources/nheko.svg | 155 +++++++++++++++++++++++++ resources/register.png | Bin 5523 -> 5543 bytes resources/register@2x.png | Bin 11395 -> 11432 bytes resources/res.qrc | 1 + resources/splash.png | Bin 11395 -> 11432 bytes resources/splash@2x.png | Bin 24776 -> 25223 bytes src/MainWindow.cpp | 2 +- 21 files changed, 158 insertions(+), 371 deletions(-) delete mode 100644 resources/nheko-rebuild-round-corners.svg delete mode 100644 resources/nheko-rebuild-sharp-corners.svg create mode 100644 resources/nheko.svg (limited to 'src/MainWindow.cpp') diff --git a/CMakeLists.txt b/CMakeLists.txt index 96a6aec6..3b674556 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -594,6 +594,7 @@ if(UNIX AND NOT APPLE) install (FILES "resources/nheko-128.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps" RENAME "nheko.png") install (FILES "resources/nheko-256.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps" RENAME "nheko.png") install (FILES "resources/nheko-512.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/512x512/apps" RENAME "nheko.png") + install (FILES "resources/nheko.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps" RENAME "nheko.svg") install (FILES "resources/nheko.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") install (FILES "resources/nheko.appdata.xml" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo") diff --git a/resources/login.png b/resources/login.png index e65084ef..d098a62a 100644 Binary files a/resources/login.png and b/resources/login.png differ diff --git a/resources/login@2x.png b/resources/login@2x.png index 4f89112f..9cbe3c9f 100644 Binary files a/resources/login@2x.png and b/resources/login@2x.png differ diff --git a/resources/nheko-1024.png b/resources/nheko-1024.png index 45b19a62..8a59d5f6 100644 Binary files a/resources/nheko-1024.png and b/resources/nheko-1024.png differ diff --git a/resources/nheko-128.png b/resources/nheko-128.png index e65084ef..d098a62a 100644 Binary files a/resources/nheko-128.png and b/resources/nheko-128.png differ diff --git a/resources/nheko-16.png b/resources/nheko-16.png index deb4449d..7114e060 100644 Binary files a/resources/nheko-16.png and b/resources/nheko-16.png differ diff --git a/resources/nheko-256.png b/resources/nheko-256.png index 4f89112f..9cbe3c9f 100644 Binary files a/resources/nheko-256.png and b/resources/nheko-256.png differ diff --git a/resources/nheko-32.png b/resources/nheko-32.png index ec582489..5fefc6b5 100644 Binary files a/resources/nheko-32.png and b/resources/nheko-32.png differ diff --git a/resources/nheko-48.png b/resources/nheko-48.png index e5aab6ac..726d0356 100644 Binary files a/resources/nheko-48.png and b/resources/nheko-48.png differ diff --git a/resources/nheko-512.png b/resources/nheko-512.png index 3c39b0be..29c3a607 100644 Binary files a/resources/nheko-512.png and b/resources/nheko-512.png differ diff --git a/resources/nheko-64.png b/resources/nheko-64.png index 768921c9..1b5c9eb3 100644 Binary files a/resources/nheko-64.png and b/resources/nheko-64.png differ diff --git a/resources/nheko-rebuild-round-corners.svg b/resources/nheko-rebuild-round-corners.svg deleted file mode 100644 index 987e0a58..00000000 --- a/resources/nheko-rebuild-round-corners.svg +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/resources/nheko-rebuild-sharp-corners.svg b/resources/nheko-rebuild-sharp-corners.svg deleted file mode 100644 index 89e73dae..00000000 --- a/resources/nheko-rebuild-sharp-corners.svg +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/resources/nheko.png b/resources/nheko.png index 3c39b0be..ae7398a6 100644 Binary files a/resources/nheko.png and b/resources/nheko.png differ diff --git a/resources/nheko.svg b/resources/nheko.svg new file mode 100644 index 00000000..46732585 --- /dev/null +++ b/resources/nheko.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/resources/register.png b/resources/register.png index e65084ef..d098a62a 100644 Binary files a/resources/register.png and b/resources/register.png differ diff --git a/resources/register@2x.png b/resources/register@2x.png index 4f89112f..9cbe3c9f 100644 Binary files a/resources/register@2x.png and b/resources/register@2x.png differ diff --git a/resources/res.qrc b/resources/res.qrc index 0e5f4125..7080fdd6 100644 --- a/resources/res.qrc +++ b/resources/res.qrc @@ -85,6 +85,7 @@ nheko.png + nheko.svg splash.png splash@2x.png diff --git a/resources/splash.png b/resources/splash.png index 4f89112f..9cbe3c9f 100644 Binary files a/resources/splash.png and b/resources/splash.png differ diff --git a/resources/splash@2x.png b/resources/splash@2x.png index 3c39b0be..29c3a607 100644 Binary files a/resources/splash@2x.png and b/resources/splash@2x.png differ diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index a24266fa..43df62ae 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -65,7 +65,7 @@ MainWindow::MainWindow(QWidget *parent) setFont(font); userSettings_ = QSharedPointer(new UserSettings); - trayIcon_ = new TrayIcon(":/logos/nheko-32.png", this); + trayIcon_ = new TrayIcon(":/logos/nheko.svg", this); welcome_page_ = new WelcomePage(this); login_page_ = new LoginPage(this); -- cgit 1.5.1 From 4cd260bfcfcbf88a6efb8bf5a1abf3d37fb06463 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Fri, 31 Jan 2020 06:12:02 +0100 Subject: Optimize includes a bit --- CMakeLists.txt | 1 + src/ChatPage.cpp | 4 +- src/CommunitiesList.cpp | 11 +++-- src/CommunitiesList.h | 5 ++ src/CommunitiesListItem.cpp | 3 ++ src/CommunitiesListItem.h | 7 +-- src/LoginPage.cpp | 1 + src/MainWindow.cpp | 3 +- src/RegisterPage.cpp | 1 + src/RoomInfoListItem.cpp | 6 +-- src/RoomList.cpp | 6 +-- src/SideBarActions.cpp | 8 ++-- src/SideBarActions.h | 2 +- src/Splitter.cpp | 22 +++++++-- src/Splitter.h | 16 ++++++- src/TextInputWidget.cpp | 5 +- src/TextInputWidget.h | 1 - src/TopRoomBar.cpp | 26 +++++++++- src/TopRoomBar.h | 35 +++++--------- src/TrayIcon.cpp | 2 + src/TrayIcon.h | 5 +- src/UserInfoWidget.cpp | 5 +- src/UserSettingsPage.cpp | 1 + src/Utils.cpp | 32 ++++++++----- src/Utils.h | 33 +------------ src/WelcomePage.cpp | 1 + src/dialogs/MemberList.cpp | 3 +- src/dialogs/UserProfile.cpp | 3 +- src/emoji/ItemDelegate.cpp | 1 - src/emoji/Panel.cpp | 1 + src/popups/UserMentions.h | 7 +-- src/timeline/TimelineModel.h | 8 ++-- src/ui/DropShadow.cpp | 110 +++++++++++++++++++++++++++++++++++++++++++ src/ui/DropShadow.h | 100 ++------------------------------------- src/ui/FlatButton.cpp | 2 + src/ui/FlatButton.h | 2 - src/ui/FloatingButton.cpp | 1 + src/ui/LoadingIndicator.cpp | 5 +- src/ui/LoadingIndicator.h | 6 +-- src/ui/OverlayWidget.cpp | 4 +- src/ui/OverlayWidget.h | 4 +- 41 files changed, 271 insertions(+), 228 deletions(-) create mode 100644 src/ui/DropShadow.cpp (limited to 'src/MainWindow.cpp') diff --git a/CMakeLists.txt b/CMakeLists.txt index 96a6aec6..fe00d570 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -256,6 +256,7 @@ set(SRC_FILES # UI components src/ui/Avatar.cpp src/ui/Badge.cpp + src/ui/DropShadow.cpp src/ui/LoadingIndicator.cpp src/ui/InfoMessage.cpp src/ui/FlatButton.cpp diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 2191c6de..e54892a6 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -84,7 +84,7 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) // SideBar sideBar_ = new QFrame(this); sideBar_->setObjectName("sideBar"); - sideBar_->setMinimumWidth(utils::calculateSidebarSizes(QFont{}).normal); + sideBar_->setMinimumWidth(::splitter::calculateSidebarSizes(QFont{}).normal); sideBarLayout_ = new QVBoxLayout(sideBar_); sideBarLayout_->setSpacing(0); sideBarLayout_->setMargin(0); @@ -1307,7 +1307,7 @@ ChatPage::timelineWidth() bool ChatPage::isSideBarExpanded() { - const auto sz = utils::calculateSidebarSizes(QFont{}); + const auto sz = splitter::calculateSidebarSizes(QFont{}); return sideBar_->size().width() > sz.normal; } diff --git a/src/CommunitiesList.cpp b/src/CommunitiesList.cpp index 4ea99408..2d97594a 100644 --- a/src/CommunitiesList.cpp +++ b/src/CommunitiesList.cpp @@ -2,7 +2,9 @@ #include "Cache.h" #include "Logging.h" #include "MatrixClient.h" -#include "Utils.h" +#include "Splitter.h" + +#include #include @@ -20,7 +22,7 @@ CommunitiesList::CommunitiesList(QWidget *parent) topLayout_->setSpacing(0); topLayout_->setMargin(0); - const auto sideBarSizes = utils::calculateSidebarSizes(QFont{}); + const auto sideBarSizes = splitter::calculateSidebarSizes(QFont{}); setFixedWidth(sideBarSizes.groups); scrollArea_ = new QScrollArea(this); @@ -185,7 +187,8 @@ void CommunitiesList::updateCommunityAvatar(const QString &community_id, const QPixmap &img) { if (!communityExists(community_id)) { - qWarning() << "Avatar update on nonexistent community" << community_id; + nhlog::ui()->warn("Avatar update on nonexistent community {}", + community_id.toStdString()); return; } @@ -196,7 +199,7 @@ void CommunitiesList::highlightSelectedCommunity(const QString &community_id) { if (!communityExists(community_id)) { - qDebug() << "CommunitiesList: clicked unknown community"; + nhlog::ui()->debug("CommunitiesList: clicked unknown community"); return; } diff --git a/src/CommunitiesList.h b/src/CommunitiesList.h index 49eaeaf6..e8042666 100644 --- a/src/CommunitiesList.h +++ b/src/CommunitiesList.h @@ -8,6 +8,11 @@ #include "CommunitiesListItem.h" #include "ui/Theme.h" +namespace mtx::responses { +struct GroupProfile; +struct JoinedGroups; +} + class CommunitiesList : public QWidget { Q_OBJECT diff --git a/src/CommunitiesListItem.cpp b/src/CommunitiesListItem.cpp index 324482d3..274271e5 100644 --- a/src/CommunitiesListItem.cpp +++ b/src/CommunitiesListItem.cpp @@ -1,4 +1,7 @@ #include "CommunitiesListItem.h" + +#include + #include "Utils.h" #include "ui/Painter.h" #include "ui/Ripple.h" diff --git a/src/CommunitiesListItem.h b/src/CommunitiesListItem.h index d4d7e9c6..0cc5d60c 100644 --- a/src/CommunitiesListItem.h +++ b/src/CommunitiesListItem.h @@ -1,17 +1,14 @@ #pragma once -#include -#include -#include #include #include -#include - #include "Config.h" #include "ui/Theme.h" class RippleOverlay; +class QPainter; +class QMouseEvent; class CommunitiesListItem : public QWidget { diff --git a/src/LoginPage.cpp b/src/LoginPage.cpp index 0e7a18d4..c244db28 100644 --- a/src/LoginPage.cpp +++ b/src/LoginPage.cpp @@ -15,6 +15,7 @@ * along with this program. If not, see . */ +#include #include #include diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index a24266fa..d400ad8e 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -31,6 +31,7 @@ #include "MainWindow.h" #include "MatrixClient.h" #include "RegisterPage.h" +#include "Splitter.h" #include "TrayIcon.h" #include "UserSettingsPage.h" #include "Utils.h" @@ -191,7 +192,7 @@ MainWindow::resizeEvent(QResizeEvent *event) void MainWindow::adjustSideBars() { - const auto sz = utils::calculateSidebarSizes(QFont{}); + const auto sz = splitter::calculateSidebarSizes(QFont{}); const uint64_t timelineWidth = chat_page_->timelineWidth(); const uint64_t minAvailableWidth = sz.collapsePoint + sz.groups; diff --git a/src/RegisterPage.cpp b/src/RegisterPage.cpp index fdb0f43a..942fd1b8 100644 --- a/src/RegisterPage.cpp +++ b/src/RegisterPage.cpp @@ -15,6 +15,7 @@ * along with this program. If not, see . */ +#include #include #include diff --git a/src/RoomInfoListItem.cpp b/src/RoomInfoListItem.cpp index 926e1359..822a7a55 100644 --- a/src/RoomInfoListItem.cpp +++ b/src/RoomInfoListItem.cpp @@ -16,7 +16,6 @@ */ #include -#include #include #include #include @@ -26,6 +25,7 @@ #include "Cache.h" #include "Config.h" #include "RoomInfoListItem.h" +#include "Splitter.h" #include "Utils.h" #include "ui/Menu.h" #include "ui/Ripple.h" @@ -116,7 +116,7 @@ RoomInfoListItem::resizeEvent(QResizeEvent *) QPainterPath path; path.addRect(0, 0, width(), height()); - const auto sidebarSizes = utils::calculateSidebarSizes(QFont{}); + const auto sidebarSizes = splitter::calculateSidebarSizes(QFont{}); if (width() > sidebarSizes.small) setToolTip(""); @@ -165,7 +165,7 @@ RoomInfoListItem::paintEvent(QPaintEvent *event) // Description line with the default font. int bottom_y = wm.maxHeight - wm.padding - metrics.ascent() / 2; - const auto sidebarSizes = utils::calculateSidebarSizes(QFont{}); + const auto sidebarSizes = splitter::calculateSidebarSizes(QFont{}); if (width() > sidebarSizes.small) { QFont headingFont; diff --git a/src/RoomList.cpp b/src/RoomList.cpp index 6434489e..b90c8fa4 100644 --- a/src/RoomList.cpp +++ b/src/RoomList.cpp @@ -17,18 +17,14 @@ #include -#include -#include #include +#include #include -#include "Cache.h" #include "Logging.h" #include "MainWindow.h" -#include "MatrixClient.h" #include "RoomInfoListItem.h" #include "RoomList.h" -#include "UserSettingsPage.h" #include "Utils.h" #include "ui/OverlayModal.h" diff --git a/src/SideBarActions.cpp b/src/SideBarActions.cpp index 2f447cd8..4934ec05 100644 --- a/src/SideBarActions.cpp +++ b/src/SideBarActions.cpp @@ -1,15 +1,15 @@ -#include #include +#include +#include #include #include "Config.h" #include "MainWindow.h" #include "SideBarActions.h" -#include "Utils.h" +#include "Splitter.h" #include "ui/FlatButton.h" #include "ui/Menu.h" -#include "ui/OverlayModal.h" SideBarActions::SideBarActions(QWidget *parent) : QWidget{parent} @@ -93,7 +93,7 @@ SideBarActions::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); - const auto sidebarSizes = utils::calculateSidebarSizes(QFont{}); + const auto sidebarSizes = splitter::calculateSidebarSizes(QFont{}); if (width() <= sidebarSizes.small) { roomDirectory_->hide(); diff --git a/src/SideBarActions.h b/src/SideBarActions.h index ce96cba8..662750b3 100644 --- a/src/SideBarActions.h +++ b/src/SideBarActions.h @@ -2,7 +2,6 @@ #include #include -#include #include namespace mtx { @@ -13,6 +12,7 @@ struct CreateRoom; class Menu; class FlatButton; +class QResizeEvent; class SideBarActions : public QWidget { diff --git a/src/Splitter.cpp b/src/Splitter.cpp index ddb1dc1c..32c67425 100644 --- a/src/Splitter.cpp +++ b/src/Splitter.cpp @@ -16,19 +16,20 @@ */ #include -#include #include #include #include #include "Config.h" +#include "Logging.h" #include "Splitter.h" +#include "Utils.h" constexpr auto MaxWidth = (1 << 24) - 1; Splitter::Splitter(QWidget *parent) : QSplitter(parent) - , sz_{utils::calculateSidebarSizes(QFont{})} + , sz_{splitter::calculateSidebarSizes(QFont{})} { connect(this, &QSplitter::splitterMoved, this, &Splitter::onSplitterMoved); setChildrenCollapsible(false); @@ -80,7 +81,7 @@ Splitter::onSplitterMoved(int pos, int index) auto s = sizes(); if (s.count() < 2) { - qWarning() << "Splitter needs at least two children"; + nhlog::ui()->warn("Splitter needs at least two children"); return; } @@ -165,3 +166,18 @@ Splitter::showFullRoomList() left->show(); left->setMaximumWidth(MaxWidth); } + +splitter::SideBarSizes +splitter::calculateSidebarSizes(const QFont &f) +{ + const auto height = static_cast(QFontMetrics{f}.lineSpacing()); + + SideBarSizes sz; + sz.small = std::ceil(3.5 * height + height / 4.0); + sz.normal = std::ceil(16 * height); + sz.groups = std::ceil(3 * height); + sz.collapsePoint = 2 * sz.normal; + + return sz; +} + diff --git a/src/Splitter.h b/src/Splitter.h index 14d6773e..36c9f4fb 100644 --- a/src/Splitter.h +++ b/src/Splitter.h @@ -17,9 +17,21 @@ #pragma once -#include "Utils.h" #include +namespace splitter { +struct SideBarSizes +{ + int small; + int normal; + int groups; + int collapsePoint; +}; + +SideBarSizes +calculateSidebarSizes(const QFont &f); +} + class Splitter : public QSplitter { Q_OBJECT @@ -45,5 +57,5 @@ private: int leftMoveCount_ = 0; int rightMoveCount_ = 0; - utils::SideBarSizes sz_; + splitter::SideBarSizes sz_; }; diff --git a/src/TextInputWidget.cpp b/src/TextInputWidget.cpp index 502456bf..7be50ab5 100644 --- a/src/TextInputWidget.cpp +++ b/src/TextInputWidget.cpp @@ -16,12 +16,9 @@ */ #include -#include #include #include -#include #include -#include #include #include #include @@ -31,7 +28,7 @@ #include "Cache.h" #include "ChatPage.h" -#include "Config.h" +#include "Logging.h" #include "TextInputWidget.h" #include "Utils.h" #include "ui/FlatButton.h" diff --git a/src/TextInputWidget.h b/src/TextInputWidget.h index 4bdb2509..a430aa5c 100644 --- a/src/TextInputWidget.h +++ b/src/TextInputWidget.h @@ -23,7 +23,6 @@ #include #include -#include #include #include #include diff --git a/src/TopRoomBar.cpp b/src/TopRoomBar.cpp index 712fe9aa..ffd57d50 100644 --- a/src/TopRoomBar.cpp +++ b/src/TopRoomBar.cpp @@ -15,8 +15,16 @@ * along with this program. If not, see . */ -#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include "Config.h" #include "MainWindow.h" @@ -210,3 +218,19 @@ TopRoomBar::updateRoomTopic(QString topic) topicLabel_->setHtml(topic); update(); } + +void +TopRoomBar::mousePressEvent(QMouseEvent *) +{ + if (roomSettings_ != nullptr) + roomSettings_->trigger(); +} + +void +TopRoomBar::paintEvent(QPaintEvent *) +{ + QStyleOption opt; + opt.init(this); + QPainter p(this); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); +} diff --git a/src/TopRoomBar.h b/src/TopRoomBar.h index 3243064e..5ab25f39 100644 --- a/src/TopRoomBar.h +++ b/src/TopRoomBar.h @@ -17,17 +17,9 @@ #pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include class Avatar; class FlatButton; @@ -35,6 +27,12 @@ class Menu; class TextLabel; class OverlayModal; +class QPainter; +class QLabel; +class QIcon; +class QHBoxLayout; +class QVBoxLayout; + class TopRoomBar : public QWidget { Q_OBJECT @@ -67,19 +65,8 @@ signals: void mentionsClicked(const QPoint &pos); protected: - void mousePressEvent(QMouseEvent *) override - { - if (roomSettings_ != nullptr) - roomSettings_->trigger(); - } - - void paintEvent(QPaintEvent *) override - { - QStyleOption opt; - opt.init(this); - QPainter p(this); - style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); - } + void mousePressEvent(QMouseEvent *) override; + void paintEvent(QPaintEvent *) override; private: QHBoxLayout *topLayout_ = nullptr; diff --git a/src/TrayIcon.cpp b/src/TrayIcon.cpp index 8f62e563..6ab011d1 100644 --- a/src/TrayIcon.cpp +++ b/src/TrayIcon.cpp @@ -15,9 +15,11 @@ * along with this program. If not, see . */ +#include #include #include #include +#include #include #include "TrayIcon.h" diff --git a/src/TrayIcon.h b/src/TrayIcon.h index a3536cc3..6cb26b87 100644 --- a/src/TrayIcon.h +++ b/src/TrayIcon.h @@ -17,13 +17,14 @@ #pragma once -#include #include #include -#include #include #include +class QAction; +class QPainter; + class MsgCountComposedIcon : public QIconEngine { public: diff --git a/src/UserInfoWidget.cpp b/src/UserInfoWidget.cpp index 7a910340..2e21d41f 100644 --- a/src/UserInfoWidget.cpp +++ b/src/UserInfoWidget.cpp @@ -16,14 +16,15 @@ * along with this program. If not, see . */ +#include #include #include #include "Config.h" #include "MainWindow.h" +#include "Splitter.h" #include "UserInfoWidget.h" -#include "Utils.h" #include "ui/Avatar.h" #include "ui/FlatButton.h" #include "ui/OverlayModal.h" @@ -108,7 +109,7 @@ UserInfoWidget::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); - const auto sz = utils::calculateSidebarSizes(QFont{}); + const auto sz = splitter::calculateSidebarSizes(QFont{}); if (width() <= sz.small) { topLayout_->setContentsMargins(0, 0, logoutButtonSize_, 0); diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp index b73f80a1..a0f37c26 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include diff --git a/src/Utils.cpp b/src/Utils.cpp index 00796a53..55eebbc9 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -22,6 +22,25 @@ using TimelineEvent = mtx::events::collections::TimelineEvents; QHash authorColors_; +template +static DescInfo +createDescriptionInfo(const Event &event, const QString &localUser, const QString &room_id) +{ + const auto msg = std::get(event); + const auto sender = QString::fromStdString(msg.sender); + + const auto username = cache::displayName(room_id, sender); + const auto ts = QDateTime::fromMSecsSinceEpoch(msg.origin_server_ts); + + return DescInfo{ + QString::fromStdString(msg.event_id), + sender, + utils::messageDescription( + username, QString::fromStdString(msg.content.body).trimmed(), sender == localUser), + utils::descriptiveTime(ts), + ts}; +} + QString utils::localUser() { @@ -633,16 +652,3 @@ utils::restoreCombobox(QComboBox *combo, const QString &value) } } -utils::SideBarSizes -utils::calculateSidebarSizes(const QFont &f) -{ - const auto height = static_cast(QFontMetrics{f}.lineSpacing()); - - SideBarSizes sz; - sz.small = std::ceil(3.5 * height + height / 4.0); - sz.normal = std::ceil(16 * height); - sz.groups = std::ceil(3 * height); - sz.collapsePoint = 2 * sz.normal; - - return sz; -} diff --git a/src/Utils.h b/src/Utils.h index ea0df21f..a3854dd8 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -2,8 +2,6 @@ #include -#include "RoomInfoListItem.h" - #include #include #include @@ -12,6 +10,8 @@ #include +struct DescInfo; + namespace cache { // Forward declarations to prevent dependency on Cache.h, since this header is included often! QString @@ -166,25 +166,6 @@ messageDescription(const QString &username = "", } } -template -DescInfo -createDescriptionInfo(const Event &event, const QString &localUser, const QString &room_id) -{ - const auto msg = std::get(event); - const auto sender = QString::fromStdString(msg.sender); - - const auto username = cache::displayName(room_id, sender); - const auto ts = QDateTime::fromMSecsSinceEpoch(msg.origin_server_ts); - - return DescInfo{QString::fromStdString(msg.event_id), - sender, - messageDescription(username, - QString::fromStdString(msg.content.body).trimmed(), - sender == localUser), - utils::descriptiveTime(ts), - ts}; -} - //! Scale down an image to fit to the given width & height limitations. QPixmap scaleDown(uint64_t maxWidth, uint64_t maxHeight, const QPixmap &source); @@ -326,14 +307,4 @@ centerWidget(QWidget *widget, QWidget *parent); void restoreCombobox(QComboBox *combo, const QString &value); -struct SideBarSizes -{ - int small; - int normal; - int groups; - int collapsePoint; -}; - -SideBarSizes -calculateSidebarSizes(const QFont &f); } diff --git a/src/WelcomePage.cpp b/src/WelcomePage.cpp index 8c3f6487..e4b0e1c6 100644 --- a/src/WelcomePage.cpp +++ b/src/WelcomePage.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include "Config.h" diff --git a/src/dialogs/MemberList.cpp b/src/dialogs/MemberList.cpp index dfb3d984..54e7bf96 100644 --- a/src/dialogs/MemberList.cpp +++ b/src/dialogs/MemberList.cpp @@ -13,6 +13,7 @@ #include "Cache.h" #include "ChatPage.h" #include "Config.h" +#include "Logging.h" #include "Utils.h" #include "ui/Avatar.h" @@ -116,7 +117,7 @@ MemberList::MemberList(const QString &room_id, QWidget *parent) try { addUsers(cache::getMembers(room_id_.toStdString())); } catch (const lmdb::error &e) { - qCritical() << e.what(); + nhlog::db()->critical("Failed to retrieve members from cache: {}", e.what()); } auto closeShortcut = new QShortcut(QKeySequence(QKeySequence::Cancel), this); diff --git a/src/dialogs/UserProfile.cpp b/src/dialogs/UserProfile.cpp index 755e8395..273ffd54 100644 --- a/src/dialogs/UserProfile.cpp +++ b/src/dialogs/UserProfile.cpp @@ -1,13 +1,12 @@ #include #include #include -#include #include #include -#include "AvatarProvider.h" #include "Cache.h" #include "ChatPage.h" +#include "Logging.h" #include "MatrixClient.h" #include "Utils.h" #include "dialogs/UserProfile.h" diff --git a/src/emoji/ItemDelegate.cpp b/src/emoji/ItemDelegate.cpp index 890e334a..afa01625 100644 --- a/src/emoji/ItemDelegate.cpp +++ b/src/emoji/ItemDelegate.cpp @@ -15,7 +15,6 @@ * along with this program. If not, see . */ -#include #include #include diff --git a/src/emoji/Panel.cpp b/src/emoji/Panel.cpp index 49ff40c5..e3b966b4 100644 --- a/src/emoji/Panel.cpp +++ b/src/emoji/Panel.cpp @@ -15,6 +15,7 @@ * along with this program. If not, see . */ +#include #include #include #include diff --git a/src/popups/UserMentions.h b/src/popups/UserMentions.h index d3877462..42bdcd60 100644 --- a/src/popups/UserMentions.h +++ b/src/popups/UserMentions.h @@ -2,19 +2,14 @@ #include -#include -#include #include #include #include -#include #include #include #include #include -#include -#include "Logging.h" namespace popups { @@ -47,4 +42,4 @@ private: QScrollArea *all_scroll_area_; QWidget *all_scroll_widget_; }; -} \ No newline at end of file +} diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h index 44cf79f4..fb32f0fb 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h @@ -6,16 +6,18 @@ #include #include -#include -#include #include #include "CacheCryptoStructs.h" -#include "Logging.h" namespace mtx::http { using RequestErr = const std::optional &; } +namespace mtx::responses { +struct Timeline; +struct Messages; +struct ClaimKeys; +} namespace qml_mtx_events { Q_NAMESPACE diff --git a/src/ui/DropShadow.cpp b/src/ui/DropShadow.cpp new file mode 100644 index 00000000..93baa02d --- /dev/null +++ b/src/ui/DropShadow.cpp @@ -0,0 +1,110 @@ +#include "DropShadow.h" + +#include +#include + + + void DropShadow::draw(QPainter &painter, + qint16 margin, + qreal radius, + QColor start, + QColor end, + qreal startPosition, + qreal endPosition0, + qreal endPosition1, + qreal width, + qreal height) + { + painter.setPen(Qt::NoPen); + + QLinearGradient gradient; + gradient.setColorAt(startPosition, start); + gradient.setColorAt(endPosition0, end); + + // Right + QPointF right0(width - margin, height / 2); + QPointF right1(width, height / 2); + gradient.setStart(right0); + gradient.setFinalStop(right1); + painter.setBrush(QBrush(gradient)); + // Deprecated in 5.13: painter.drawRoundRect( + // QRectF(QPointF(width - margin * radius, margin), QPointF(width, height - + // margin)), 0.0, 0.0); + painter.drawRoundedRect( + QRectF(QPointF(width - margin * radius, margin), QPointF(width, height - margin)), + 0.0, + 0.0); + + // Left + QPointF left0(margin, height / 2); + QPointF left1(0, height / 2); + gradient.setStart(left0); + gradient.setFinalStop(left1); + painter.setBrush(QBrush(gradient)); + painter.drawRoundedRect( + QRectF(QPointF(margin * radius, margin), QPointF(0, height - margin)), 0.0, 0.0); + + // Top + QPointF top0(width / 2, margin); + QPointF top1(width / 2, 0); + gradient.setStart(top0); + gradient.setFinalStop(top1); + painter.setBrush(QBrush(gradient)); + painter.drawRoundedRect( + QRectF(QPointF(width - margin, 0), QPointF(margin, margin)), 0.0, 0.0); + + // Bottom + QPointF bottom0(width / 2, height - margin); + QPointF bottom1(width / 2, height); + gradient.setStart(bottom0); + gradient.setFinalStop(bottom1); + painter.setBrush(QBrush(gradient)); + painter.drawRoundedRect( + QRectF(QPointF(margin, height - margin), QPointF(width - margin, height)), + 0.0, + 0.0); + + // BottomRight + QPointF bottomright0(width - margin, height - margin); + QPointF bottomright1(width, height); + gradient.setStart(bottomright0); + gradient.setFinalStop(bottomright1); + gradient.setColorAt(endPosition1, end); + painter.setBrush(QBrush(gradient)); + painter.drawRoundedRect(QRectF(bottomright0, bottomright1), 0.0, 0.0); + + // BottomLeft + QPointF bottomleft0(margin, height - margin); + QPointF bottomleft1(0, height); + gradient.setStart(bottomleft0); + gradient.setFinalStop(bottomleft1); + gradient.setColorAt(endPosition1, end); + painter.setBrush(QBrush(gradient)); + painter.drawRoundedRect(QRectF(bottomleft0, bottomleft1), 0.0, 0.0); + + // TopLeft + QPointF topleft0(margin, margin); + QPointF topleft1(0, 0); + gradient.setStart(topleft0); + gradient.setFinalStop(topleft1); + gradient.setColorAt(endPosition1, end); + painter.setBrush(QBrush(gradient)); + painter.drawRoundedRect(QRectF(topleft0, topleft1), 0.0, 0.0); + + // TopRight + QPointF topright0(width - margin, margin); + QPointF topright1(width, 0); + gradient.setStart(topright0); + gradient.setFinalStop(topright1); + gradient.setColorAt(endPosition1, end); + painter.setBrush(QBrush(gradient)); + painter.drawRoundedRect(QRectF(topright0, topright1), 0.0, 0.0); + + // Widget + painter.setBrush(QBrush("#FFFFFF")); + painter.setRenderHint(QPainter::Antialiasing); + painter.drawRoundedRect( + QRectF(QPointF(margin, margin), QPointF(width - margin, height - margin)), + radius, + radius); + } diff --git a/src/ui/DropShadow.h b/src/ui/DropShadow.h index 60fc697b..6997e1a0 100644 --- a/src/ui/DropShadow.h +++ b/src/ui/DropShadow.h @@ -1,8 +1,8 @@ #pragma once #include -#include -#include + +class QPainter; class DropShadow { @@ -16,99 +16,5 @@ public: qreal endPosition0, qreal endPosition1, qreal width, - qreal height) - { - painter.setPen(Qt::NoPen); - - QLinearGradient gradient; - gradient.setColorAt(startPosition, start); - gradient.setColorAt(endPosition0, end); - - // Right - QPointF right0(width - margin, height / 2); - QPointF right1(width, height / 2); - gradient.setStart(right0); - gradient.setFinalStop(right1); - painter.setBrush(QBrush(gradient)); - // Deprecated in 5.13: painter.drawRoundRect( - // QRectF(QPointF(width - margin * radius, margin), QPointF(width, height - - // margin)), 0.0, 0.0); - painter.drawRoundedRect( - QRectF(QPointF(width - margin * radius, margin), QPointF(width, height - margin)), - 0.0, - 0.0); - - // Left - QPointF left0(margin, height / 2); - QPointF left1(0, height / 2); - gradient.setStart(left0); - gradient.setFinalStop(left1); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect( - QRectF(QPointF(margin * radius, margin), QPointF(0, height - margin)), 0.0, 0.0); - - // Top - QPointF top0(width / 2, margin); - QPointF top1(width / 2, 0); - gradient.setStart(top0); - gradient.setFinalStop(top1); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect( - QRectF(QPointF(width - margin, 0), QPointF(margin, margin)), 0.0, 0.0); - - // Bottom - QPointF bottom0(width / 2, height - margin); - QPointF bottom1(width / 2, height); - gradient.setStart(bottom0); - gradient.setFinalStop(bottom1); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect( - QRectF(QPointF(margin, height - margin), QPointF(width - margin, height)), - 0.0, - 0.0); - - // BottomRight - QPointF bottomright0(width - margin, height - margin); - QPointF bottomright1(width, height); - gradient.setStart(bottomright0); - gradient.setFinalStop(bottomright1); - gradient.setColorAt(endPosition1, end); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect(QRectF(bottomright0, bottomright1), 0.0, 0.0); - - // BottomLeft - QPointF bottomleft0(margin, height - margin); - QPointF bottomleft1(0, height); - gradient.setStart(bottomleft0); - gradient.setFinalStop(bottomleft1); - gradient.setColorAt(endPosition1, end); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect(QRectF(bottomleft0, bottomleft1), 0.0, 0.0); - - // TopLeft - QPointF topleft0(margin, margin); - QPointF topleft1(0, 0); - gradient.setStart(topleft0); - gradient.setFinalStop(topleft1); - gradient.setColorAt(endPosition1, end); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect(QRectF(topleft0, topleft1), 0.0, 0.0); - - // TopRight - QPointF topright0(width - margin, margin); - QPointF topright1(width, 0); - gradient.setStart(topright0); - gradient.setFinalStop(topright1); - gradient.setColorAt(endPosition1, end); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect(QRectF(topright0, topright1), 0.0, 0.0); - - // Widget - painter.setBrush(QBrush("#FFFFFF")); - painter.setRenderHint(QPainter::Antialiasing); - painter.drawRoundedRect( - QRectF(QPointF(margin, margin), QPointF(width - margin, height - margin)), - radius, - radius); - } + qreal height); }; diff --git a/src/ui/FlatButton.cpp b/src/ui/FlatButton.cpp index a828f582..6660c58d 100644 --- a/src/ui/FlatButton.cpp +++ b/src/ui/FlatButton.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/src/ui/FlatButton.h b/src/ui/FlatButton.h index 9c2bf425..d29903c2 100644 --- a/src/ui/FlatButton.h +++ b/src/ui/FlatButton.h @@ -1,7 +1,5 @@ #pragma once -#include -#include #include #include diff --git a/src/ui/FloatingButton.cpp b/src/ui/FloatingButton.cpp index 74dcd482..f3a09ccd 100644 --- a/src/ui/FloatingButton.cpp +++ b/src/ui/FloatingButton.cpp @@ -1,3 +1,4 @@ +#include #include #include "FloatingButton.h" diff --git a/src/ui/LoadingIndicator.cpp b/src/ui/LoadingIndicator.cpp index c8337089..d2b1240d 100644 --- a/src/ui/LoadingIndicator.cpp +++ b/src/ui/LoadingIndicator.cpp @@ -1,7 +1,8 @@ #include "LoadingIndicator.h" -#include -#include +#include +#include +#include LoadingIndicator::LoadingIndicator(QWidget *parent) : QWidget(parent) diff --git a/src/ui/LoadingIndicator.h b/src/ui/LoadingIndicator.h index e8de0aec..1585098e 100644 --- a/src/ui/LoadingIndicator.h +++ b/src/ui/LoadingIndicator.h @@ -1,11 +1,11 @@ #pragma once #include -#include -#include -#include #include +class QPainter; +class QTimer; +class QPaintEvent; class LoadingIndicator : public QWidget { Q_OBJECT diff --git a/src/ui/OverlayWidget.cpp b/src/ui/OverlayWidget.cpp index ccac0116..a32d86b6 100644 --- a/src/ui/OverlayWidget.cpp +++ b/src/ui/OverlayWidget.cpp @@ -1,5 +1,7 @@ #include "OverlayWidget.h" -#include + +#include +#include OverlayWidget::OverlayWidget(QWidget *parent) : QWidget(parent) diff --git a/src/ui/OverlayWidget.h b/src/ui/OverlayWidget.h index 6662479d..ed3ef52d 100644 --- a/src/ui/OverlayWidget.h +++ b/src/ui/OverlayWidget.h @@ -1,10 +1,10 @@ #pragma once #include -#include -#include #include +class QPainter; + class OverlayWidget : public QWidget { Q_OBJECT -- cgit 1.5.1 From 6bdc75d07319b3b2a846ee4a905288ec0d9371f6 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Thu, 20 Feb 2020 20:51:07 +0100 Subject: Reset user colors on theme change (in qml timeline) --- resources/qml/TimelineRow.qml | 2 +- resources/qml/TimelineView.qml | 4 +-- resources/qml/delegates/MessageDelegate.qml | 2 +- resources/qml/delegates/Reply.qml | 2 +- src/Cache.cpp | 51 ----------------------------- src/Cache.h | 9 ----- src/Cache_p.h | 6 ---- src/MainWindow.cpp | 3 -- src/timeline/TimelineModel.cpp | 15 ++------- src/timeline/TimelineModel.h | 2 -- src/timeline/TimelineViewManager.cpp | 11 +++++++ src/timeline/TimelineViewManager.h | 2 ++ 12 files changed, 20 insertions(+), 89 deletions(-) (limited to 'src/MainWindow.cpp') diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml index a371f78b..fa427bfd 100644 --- a/resources/qml/TimelineRow.qml +++ b/resources/qml/TimelineRow.qml @@ -23,7 +23,7 @@ RowLayout { Reply { visible: model.replyTo modelData: chat.model.getDump(model.replyTo) - userColor: chat.model.userColor(modelData.userId, colors.window) + userColor: timelineManager.userColor(modelData.userId, colors.window) } // actual message content diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml index 9730422d..46cf484b 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml @@ -218,7 +218,7 @@ Item { Text { id: userName text: chat.model.escapeEmoji(modelData.userName) - color: chat.model.userColor(modelData.userId, colors.window) + color: timelineManager.userColor(modelData.userId, colors.window) textFormat: Text.RichText MouseArea { @@ -283,7 +283,7 @@ Item { anchors.bottom: parent.bottom modelData: chat.model ? chat.model.getDump(timelineManager.replyingEvent) : {} - userColor: chat.model ? chat.model.userColor(modelData.userId, colors.window) : colors.window + userColor: timelineManager.userColor(modelData.userId, colors.window) } ImageButton { diff --git a/resources/qml/delegates/MessageDelegate.qml b/resources/qml/delegates/MessageDelegate.qml index f043efec..ab633087 100644 --- a/resources/qml/delegates/MessageDelegate.qml +++ b/resources/qml/delegates/MessageDelegate.qml @@ -34,7 +34,7 @@ Item { roleValue: MtxEvent.EmoteMessage NoticeMessage { formatted: chat.model.escapeEmoji(modelData.userName) + " " + model.data.formattedBody - color: chat.model.userColor(modelData.userId, colors.window) + color: timelineManager.userColor(modelData.userId, colors.window) } } DelegateChoice { diff --git a/resources/qml/delegates/Reply.qml b/resources/qml/delegates/Reply.qml index a1ddc8f0..8bb9ed38 100644 --- a/resources/qml/delegates/Reply.qml +++ b/resources/qml/delegates/Reply.qml @@ -19,7 +19,7 @@ Rectangle { anchors.bottom: replyContainer.bottom width: 4 - color: chat.model ? chat.model.userColor(reply.modelData.userId, colors.window) : colors.window + color: timelineManager.userColor(reply.modelData.userId, colors.window) } Column { diff --git a/src/Cache.cpp b/src/Cache.cpp index e73f7754..caa3f1ec 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -2186,7 +2186,6 @@ Cache::roomMembers(const std::string &room_id) QHash Cache::DisplayNames; QHash Cache::AvatarUrls; -QHash Cache::UserColors; QString Cache::displayName(const QString &room_id, const QString &user_id) @@ -2218,16 +2217,6 @@ Cache::avatarUrl(const QString &room_id, const QString &user_id) return QString(); } -QString -Cache::userColor(const QString &user_id) -{ - if (UserColors.contains(user_id)) { - return UserColors[user_id]; - } - - return QString(); -} - void Cache::insertDisplayName(const QString &room_id, const QString &user_id, @@ -2258,24 +2247,6 @@ Cache::removeAvatarUrl(const QString &room_id, const QString &user_id) AvatarUrls.remove(fmt); } -void -Cache::insertUserColor(const QString &user_id, const QString &color_name) -{ - UserColors.insert(user_id, color_name); -} - -void -Cache::removeUserColor(const QString &user_id) -{ - UserColors.remove(user_id); -} - -void -Cache::clearUserColors() -{ - UserColors.clear(); -} - void to_json(json &j, const RoomInfo &info) { @@ -2425,12 +2396,6 @@ avatarUrl(const QString &room_id, const QString &user_id) return instance_->avatarUrl(room_id, user_id); } -QString -userColor(const QString &user_id) -{ - return instance_->userColor(user_id); -} - void removeDisplayName(const QString &room_id, const QString &user_id) { @@ -2441,11 +2406,6 @@ removeAvatarUrl(const QString &room_id, const QString &user_id) { instance_->removeAvatarUrl(room_id, user_id); } -void -removeUserColor(const QString &user_id) -{ - instance_->removeUserColor(user_id); -} void insertDisplayName(const QString &room_id, const QString &user_id, const QString &display_name) @@ -2457,17 +2417,6 @@ insertAvatarUrl(const QString &room_id, const QString &user_id, const QString &a { instance_->insertAvatarUrl(room_id, user_id, avatar_url); } -void -insertUserColor(const QString &user_id, const QString &color_name) -{ - instance_->insertUserColor(user_id, color_name); -} - -void -clearUserColors() -{ - instance_->clearUserColors(); -} //! Load saved data for the display names & avatars. void diff --git a/src/Cache.h b/src/Cache.h index 69b3ef2d..bb042ea9 100644 --- a/src/Cache.h +++ b/src/Cache.h @@ -43,25 +43,16 @@ QString displayName(const QString &room_id, const QString &user_id); QString avatarUrl(const QString &room_id, const QString &user_id); -QString -userColor(const QString &user_id); void removeDisplayName(const QString &room_id, const QString &user_id); void removeAvatarUrl(const QString &room_id, const QString &user_id); -void -removeUserColor(const QString &user_id); void insertDisplayName(const QString &room_id, const QString &user_id, const QString &display_name); void insertAvatarUrl(const QString &room_id, const QString &user_id, const QString &avatar_url); -void -insertUserColor(const QString &user_id, const QString &color_name); - -void -clearUserColors(); //! Load saved data for the display names & avatars. void diff --git a/src/Cache_p.h b/src/Cache_p.h index eacb28a7..137408b9 100644 --- a/src/Cache_p.h +++ b/src/Cache_p.h @@ -51,11 +51,9 @@ public: static std::string displayName(const std::string &room_id, const std::string &user_id); static QString displayName(const QString &room_id, const QString &user_id); static QString avatarUrl(const QString &room_id, const QString &user_id); - static QString userColor(const QString &user_id); static void removeDisplayName(const QString &room_id, const QString &user_id); static void removeAvatarUrl(const QString &room_id, const QString &user_id); - static void removeUserColor(const QString &user_id); static void insertDisplayName(const QString &room_id, const QString &user_id, @@ -63,9 +61,6 @@ public: static void insertAvatarUrl(const QString &room_id, const QString &user_id, const QString &avatar_url); - static void insertUserColor(const QString &user_id, const QString &color_name); - - static void clearUserColors(); //! Load saved data for the display names & avatars. void populateMembers(); @@ -484,7 +479,6 @@ private: static QHash DisplayNames; static QHash AvatarUrls; - static QHash UserColors; OlmSessionStorage session_storage; }; diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 1b378ca9..17a04a41 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -115,9 +115,6 @@ MainWindow::MainWindow(QWidget *parent) connect( userSettingsPage_, SIGNAL(trayOptionChanged(bool)), trayIcon_, SLOT(setVisible(bool))); - connect(userSettingsPage_, &UserSettingsPage::themeChanged, this, []() { - cache::clearUserColors(); - }); connect( userSettingsPage_, &UserSettingsPage::themeChanged, chat_page_, &ChatPage::themeChanged); connect(trayIcon_, diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 8de6bec6..cad39bc5 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -196,9 +196,6 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj if (idx >= 0) emit dataChanged(index(idx, 0), index(idx, 0)); }); - - connect( - ChatPage::instance(), &ChatPage::themeChanged, this, [this]() { userColors.clear(); }); } QHash @@ -650,15 +647,6 @@ TimelineModel::addBackwardsEvents(const mtx::responses::Messages &msgs) prev_batch_token_ = QString::fromStdString(msgs.end); } -QColor -TimelineModel::userColor(QString id, QColor background) -{ - if (!userColors.contains(id)) - userColors.insert( - id, QColor(utils::generateContrastingHexColor(id, background.name()))); - return userColors.value(id); -} - QString TimelineModel::displayName(QString id) const { @@ -1446,7 +1434,8 @@ TimelineModel::formatTypingUsers(const std::vector &users, QColor bg) auto formatUser = [this, bg](const QString &user_id) -> QString { auto uncoloredUsername = escapeEmoji(displayName(user_id).toHtmlEscaped()); - QString prefix = QString("").arg(userColor(user_id, bg).name()); + QString prefix = + QString("").arg(manager_->userColor(user_id, bg).name()); // color only parts that don't have a font already specified QString coloredUsername; diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h index 642e9bbc..f06de5d9 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h @@ -165,7 +165,6 @@ public: bool canFetchMore(const QModelIndex &) const override; void fetchMore(const QModelIndex &) override; - Q_INVOKABLE QColor userColor(QString id, QColor background); Q_INVOKABLE QString displayName(QString id) const; Q_INVOKABLE QString avatarUrl(QString id) const; Q_INVOKABLE QString formatDateSeparator(QDate date) const; @@ -248,7 +247,6 @@ private: bool paginationInProgress = false; bool isProcessingPending = false; - QHash userColors; QString currentId; std::vector typingUsers_; diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp index 7cd1432d..14f903a1 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp @@ -18,6 +18,8 @@ Q_DECLARE_METATYPE(mtx::events::collections::TimelineEvents) void TimelineViewManager::updateColorPalette() { + userColors.clear(); + if (settings->theme() == "light") { QPalette lightActive(/*windowText*/ QColor("#333"), /*button*/ QColor("#333"), @@ -53,6 +55,15 @@ TimelineViewManager::updateColorPalette() } } +QColor +TimelineViewManager::userColor(QString id, QColor background) +{ + if (!userColors.contains(id)) + userColors.insert( + id, QColor(utils::generateContrastingHexColor(id, background.name()))); + return userColors.value(id); +} + TimelineViewManager::TimelineViewManager(QSharedPointer userSettings, QWidget *parent) : imgProvider(new MxcImageProvider()) , colorImgProvider(new ColorImageProvider()) diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h index 625999c9..338101c7 100644 --- a/src/timeline/TimelineViewManager.h +++ b/src/timeline/TimelineViewManager.h @@ -40,6 +40,7 @@ public: Q_INVOKABLE TimelineModel *activeTimeline() const { return timeline_; } Q_INVOKABLE bool isInitialSync() const { return isInitialSync_; } Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId) const; + Q_INVOKABLE QColor userColor(QString id, QColor background); signals: void clearRoomMessageCount(QString roomid); @@ -118,4 +119,5 @@ private: QString replyingEvent_; QSharedPointer settings; + QHash userColors; }; -- cgit 1.5.1 From 3ef0d9db3cb1fe84c3c905fe7fbd80c3bbb51fd4 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sun, 23 Feb 2020 11:42:29 +0100 Subject: Fix Registration fixes #97 fixes #51 --- .travis.yml | 1 + CMakeLists.txt | 20 ++-- io.github.NhekoReborn.Nheko.json | 4 +- src/MainWindow.cpp | 30 ++++++ src/MainWindow.h | 31 ++---- src/RegisterPage.cpp | 220 ++++++++++++++++++++++++++++----------- src/RegisterPage.h | 7 +- src/dialogs/FallbackAuth.cpp | 69 ++++++++++++ src/dialogs/FallbackAuth.h | 26 +++++ src/dialogs/ReCaptcha.cpp | 5 +- src/dialogs/ReCaptcha.h | 1 + 11 files changed, 316 insertions(+), 98 deletions(-) create mode 100644 src/dialogs/FallbackAuth.cpp create mode 100644 src/dialogs/FallbackAuth.h (limited to 'src/MainWindow.cpp') diff --git a/.travis.yml b/.travis.yml index bea561f1..ac3512bd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,6 +33,7 @@ matrix: - ninja - openssl - qt5 + update: true # workaround for broken travis homebrew - os: linux compiler: gcc-7 env: diff --git a/CMakeLists.txt b/CMakeLists.txt index eebac250..66e9dcd2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -228,17 +228,18 @@ configure_file(cmake/nheko.h config/nheko.h) set(SRC_FILES # Dialogs src/dialogs/CreateRoom.cpp + src/dialogs/FallbackAuth.cpp src/dialogs/ImageOverlay.cpp - src/dialogs/PreviewUploadOverlay.cpp src/dialogs/InviteUsers.cpp src/dialogs/JoinRoom.cpp - src/dialogs/MemberList.cpp src/dialogs/LeaveRoom.cpp src/dialogs/Logout.cpp - src/dialogs/UserProfile.cpp - src/dialogs/ReadReceipts.cpp + src/dialogs/MemberList.cpp + src/dialogs/PreviewUploadOverlay.cpp src/dialogs/ReCaptcha.cpp + src/dialogs/ReadReceipts.cpp src/dialogs/RoomSettings.cpp + src/dialogs/UserProfile.cpp # Emoji src/emoji/Category.cpp @@ -333,7 +334,7 @@ if(USE_BUNDLED_MTXCLIENT) FetchContent_Declare( MatrixClient GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git - GIT_TAG 5fbee216e640da45c05f25b1f84f03c88bca5910 + GIT_TAG 5838f607d0e4c7595439249e8b9c213aec0667e9 ) FetchContent_MakeAvailable(MatrixClient) else() @@ -424,18 +425,19 @@ feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAG qt5_wrap_cpp(MOC_HEADERS # Dialogs src/dialogs/CreateRoom.h + src/dialogs/FallbackAuth.h src/dialogs/ImageOverlay.h - src/dialogs/PreviewUploadOverlay.h src/dialogs/InviteUsers.h src/dialogs/JoinRoom.h - src/dialogs/MemberList.h src/dialogs/LeaveRoom.h src/dialogs/Logout.h - src/dialogs/UserProfile.h + src/dialogs/MemberList.h + src/dialogs/PreviewUploadOverlay.h src/dialogs/RawMessage.h - src/dialogs/ReadReceipts.h src/dialogs/ReCaptcha.h + src/dialogs/ReadReceipts.h src/dialogs/RoomSettings.h + src/dialogs/UserProfile.h # Emoji src/emoji/Category.h diff --git a/io.github.NhekoReborn.Nheko.json b/io.github.NhekoReborn.Nheko.json index 45007e86..ddc1f1a0 100644 --- a/io.github.NhekoReborn.Nheko.json +++ b/io.github.NhekoReborn.Nheko.json @@ -147,9 +147,9 @@ "name": "mtxclient", "sources": [ { - "sha256": "8cf5470570d2ed6affc0bbe0f4b6be9b0a2e2372e9f920b504126841bb73036f", + "sha256": "df3fe7e3d59b5fc52ee3ca9a132a55fc325aa799c676e9e420073c56daeb1848", "type": "archive", - "url": "https://github.com/Nheko-Reborn/mtxclient/archive/5fbee216e640da45c05f25b1f84f03c88bca5910.tar.gz" + "url": "https://github.com/Nheko-Reborn/mtxclient/archive/5838f607d0e4c7595439249e8b9c213aec0667e9.tar.gz" } ] }, diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 17a04a41..fb64f0fe 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -507,3 +507,33 @@ MainWindow::loadJdenticonPlugin() nhlog::ui()->info("jdenticon plugin not found."); return false; } +void +MainWindow::showWelcomePage() +{ + removeOverlayProgressBar(); + pageStack_->addWidget(welcome_page_); + pageStack_->setCurrentWidget(welcome_page_); +} + +void +MainWindow::showLoginPage() +{ + if (modal_) + modal_->hide(); + + pageStack_->addWidget(login_page_); + pageStack_->setCurrentWidget(login_page_); +} + +void +MainWindow::showRegisterPage() +{ + pageStack_->addWidget(register_page_); + pageStack_->setCurrentWidget(register_page_); +} + +void +MainWindow::showUserSettingsPage() +{ + pageStack_->setCurrentWidget(userSettingsPage_); +} diff --git a/src/MainWindow.h b/src/MainWindow.h index 59f29d50..e3e04698 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -24,16 +24,17 @@ #include #include -#include "LoginPage.h" -#include "RegisterPage.h" #include "UserSettingsPage.h" -#include "WelcomePage.h" #include "dialogs/UserProfile.h" #include "ui/OverlayModal.h" #include "jdenticoninterface.h" class ChatPage; +class RegisterPage; +class LoginPage; +class WelcomePage; + class LoadingIndicator; class OverlayModal; class SnackBar; @@ -97,32 +98,16 @@ private slots: void iconActivated(QSystemTrayIcon::ActivationReason reason); //! Show the welcome page in the main window. - void showWelcomePage() - { - removeOverlayProgressBar(); - pageStack_->addWidget(welcome_page_); - pageStack_->setCurrentWidget(welcome_page_); - } + void showWelcomePage(); //! Show the login page in the main window. - void showLoginPage() - { - if (modal_) - modal_->hide(); - - pageStack_->addWidget(login_page_); - pageStack_->setCurrentWidget(login_page_); - } + void showLoginPage(); //! Show the register page in the main window. - void showRegisterPage() - { - pageStack_->addWidget(register_page_); - pageStack_->setCurrentWidget(register_page_); - } + void showRegisterPage(); //! Show user settings page. - void showUserSettingsPage() { pageStack_->setCurrentWidget(userSettingsPage_); } + void showUserSettingsPage(); //! Show the chat page and start communicating with the given access token. void showChatPage(); diff --git a/src/RegisterPage.cpp b/src/RegisterPage.cpp index 2688e9a9..39a69a34 100644 --- a/src/RegisterPage.cpp +++ b/src/RegisterPage.cpp @@ -15,6 +15,7 @@ * along with this program. If not, see . */ +#include #include #include #include @@ -30,11 +31,17 @@ #include "ui/RaisedButton.h" #include "ui/TextField.h" +#include "dialogs/FallbackAuth.h" #include "dialogs/ReCaptcha.h" +Q_DECLARE_METATYPE(mtx::user_interactive::Unauthorized) +Q_DECLARE_METATYPE(mtx::user_interactive::Auth) + RegisterPage::RegisterPage(QWidget *parent) : QWidget(parent) { + qRegisterMetaType(); + qRegisterMetaType(); top_layout_ = new QVBoxLayout(); back_layout_ = new QHBoxLayout(); @@ -133,46 +140,139 @@ RegisterPage::RegisterPage(QWidget *parent) this, &RegisterPage::registrationFlow, this, - [this](const std::string &user, const std::string &pass, const std::string &session) { - emit errorOccurred(); - - auto captchaDialog = - new dialogs::ReCaptcha(QString::fromStdString(session), this); - - connect(captchaDialog, - &dialogs::ReCaptcha::confirmation, - this, - [this, user, pass, session, captchaDialog]() { - captchaDialog->close(); - captchaDialog->deleteLater(); - - emit registering(); - - http::client()->flow_response( - user, - pass, - session, - "m.login.recaptcha", - [this](const mtx::responses::Register &res, - mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn( - "failed to retrieve registration flows: {}", - err->matrix_error.error); - emit errorOccurred(); - emit registerErrorCb(QString::fromStdString( - err->matrix_error.error)); - return; - } - - http::client()->set_user(res.user_id); - http::client()->set_access_token(res.access_token); - - emit registerOk(); - }); - }); - - QTimer::singleShot(1000, this, [captchaDialog]() { captchaDialog->show(); }); + [this](const std::string &user, + const std::string &pass, + const mtx::user_interactive::Unauthorized &unauthorized) { + auto completed_stages = unauthorized.completed; + auto flows = unauthorized.flows; + auto session = unauthorized.session; + + nhlog::ui()->info("Completed stages: {}", completed_stages.size()); + + if (!completed_stages.empty()) + flows.erase(std::remove_if( + flows.begin(), + flows.end(), + [completed_stages](auto flow) { + if (completed_stages.size() > flow.stages.size()) + return true; + for (size_t f = 0; f < completed_stages.size(); f++) + if (completed_stages[f] != flow.stages[f]) + return true; + return false; + }), + flows.end()); + + if (flows.empty()) { + nhlog::net()->error("No available registration flows!"); + emit registerErrorCb(tr("No supported registration flows!")); + return; + } + + auto current_stage = flows.front().stages.at(completed_stages.size()); + + if (current_stage == mtx::user_interactive::auth_types::recaptcha) { + auto captchaDialog = + new dialogs::ReCaptcha(QString::fromStdString(session), this); + + connect(captchaDialog, + &dialogs::ReCaptcha::confirmation, + this, + [this, user, pass, session, captchaDialog]() { + captchaDialog->close(); + captchaDialog->deleteLater(); + + emit registerAuth( + user, + pass, + mtx::user_interactive::Auth{ + session, mtx::user_interactive::auth::Fallback{}}); + }); + connect(captchaDialog, + &dialogs::ReCaptcha::cancel, + this, + &RegisterPage::errorOccurred); + + QTimer::singleShot( + 1000, this, [captchaDialog]() { captchaDialog->show(); }); + } else if (current_stage == mtx::user_interactive::auth_types::dummy) { + emit registerAuth(user, + pass, + mtx::user_interactive::Auth{ + session, mtx::user_interactive::auth::Dummy{}}); + } else { + // use fallback + auto dialog = + new dialogs::FallbackAuth(QString::fromStdString(current_stage), + QString::fromStdString(session), + this); + + connect(dialog, + &dialogs::FallbackAuth::confirmation, + this, + [this, user, pass, session, dialog]() { + dialog->close(); + dialog->deleteLater(); + + emit registerAuth( + user, + pass, + mtx::user_interactive::Auth{ + session, mtx::user_interactive::auth::Fallback{}}); + }); + connect(dialog, + &dialogs::FallbackAuth::cancel, + this, + &RegisterPage::errorOccurred); + + dialog->show(); + } + }); + + connect( + this, + &RegisterPage::registerAuth, + this, + [this](const std::string &user, + const std::string &pass, + const mtx::user_interactive::Auth &auth) { + http::client()->registration( + user, + pass, + auth, + [this, user, pass](const mtx::responses::Register &res, + mtx::http::RequestErr err) { + if (!err) { + http::client()->set_user(res.user_id); + http::client()->set_access_token(res.access_token); + + emit registerOk(); + return; + } + + // The server requires registration flows. + if (err->status_code == boost::beast::http::status::unauthorized) { + if (err->matrix_error.unauthorized.session.empty()) { + nhlog::net()->warn( + "failed to retrieve registration flows: ({}) " + "{}", + static_cast(err->status_code), + err->matrix_error.error); + emit registerErrorCb( + QString::fromStdString(err->matrix_error.error)); + return; + } + + emit registrationFlow( + user, pass, err->matrix_error.unauthorized); + return; + } + + nhlog::net()->warn("failed to register: status_code ({})", + static_cast(err->status_code)); + + emit registerErrorCb(QString::fromStdString(err->matrix_error.error)); + }); }); setLayout(top_layout_); @@ -225,31 +325,27 @@ RegisterPage::onRegisterButtonClicked() // The server requires registration flows. if (err->status_code == boost::beast::http::status::unauthorized) { - http::client()->flow_register( - username, - password, - [this, username, password]( - const mtx::responses::RegistrationFlows &res, - mtx::http::RequestErr err) { - if (res.session.empty() && err) { - nhlog::net()->warn( - "failed to retrieve registration flows: ({}) " - "{}", - static_cast(err->status_code), - err->matrix_error.error); - emit errorOccurred(); - emit registerErrorCb(QString::fromStdString( - err->matrix_error.error)); - return; - } - - emit registrationFlow(username, password, res.session); - }); + if (err->matrix_error.unauthorized.session.empty()) { + nhlog::net()->warn( + "failed to retrieve registration flows: ({}) " + "{}", + static_cast(err->status_code), + err->matrix_error.error); + emit errorOccurred(); + emit registerErrorCb( + QString::fromStdString(err->matrix_error.error)); + return; + } + + emit registrationFlow( + username, password, err->matrix_error.unauthorized); return; } - nhlog::net()->warn("failed to register: status_code ({})", - static_cast(err->status_code)); + nhlog::net()->warn( + "failed to register: status_code ({}), matrix_error({})", + static_cast(err->status_code), + err->matrix_error.error); emit registerErrorCb(QString::fromStdString(err->matrix_error.error)); emit errorOccurred(); diff --git a/src/RegisterPage.h b/src/RegisterPage.h index 96a5b3ca..ebc24bb1 100644 --- a/src/RegisterPage.h +++ b/src/RegisterPage.h @@ -21,6 +21,8 @@ #include #include +#include + class FlatButton; class RaisedButton; class TextField; @@ -43,7 +45,10 @@ signals: void registerErrorCb(const QString &msg); void registrationFlow(const std::string &user, const std::string &pass, - const std::string &session); + const mtx::user_interactive::Unauthorized &unauthorized); + void registerAuth(const std::string &user, + const std::string &pass, + const mtx::user_interactive::Auth &auth); private slots: void onBackButtonClicked(); diff --git a/src/dialogs/FallbackAuth.cpp b/src/dialogs/FallbackAuth.cpp new file mode 100644 index 00000000..a0633c1e --- /dev/null +++ b/src/dialogs/FallbackAuth.cpp @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include + +#include "dialogs/FallbackAuth.h" + +#include "Config.h" +#include "MatrixClient.h" + +using namespace dialogs; + +FallbackAuth::FallbackAuth(const QString &authType, const QString &session, QWidget *parent) + : QWidget(parent) +{ + setAutoFillBackground(true); + setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint); + setWindowModality(Qt::WindowModal); + setAttribute(Qt::WA_DeleteOnClose, true); + + auto layout = new QVBoxLayout(this); + layout->setSpacing(conf::modals::WIDGET_SPACING); + layout->setMargin(conf::modals::WIDGET_MARGIN); + + auto buttonLayout = new QHBoxLayout(); + buttonLayout->setSpacing(8); + buttonLayout->setMargin(0); + + openBtn_ = new QPushButton(tr("Open Fallback in Browser"), this); + cancelBtn_ = new QPushButton(tr("Cancel"), this); + confirmBtn_ = new QPushButton(tr("Confirm"), this); + confirmBtn_->setDefault(true); + + buttonLayout->addStretch(1); + buttonLayout->addWidget(openBtn_); + buttonLayout->addWidget(cancelBtn_); + buttonLayout->addWidget(confirmBtn_); + + QFont font; + font.setPointSizeF(font.pointSizeF() * conf::modals::LABEL_MEDIUM_SIZE_RATIO); + + auto label = new QLabel( + tr("Open the fallback, follow the steps and confirm after completing them."), this); + label->setFont(font); + + layout->addWidget(label); + layout->addLayout(buttonLayout); + + connect(openBtn_, &QPushButton::clicked, [session, authType]() { + const auto url = QString("https://%1:%2/_matrix/client/r0/auth/%4/" + "fallback/web?session=%3") + .arg(QString::fromStdString(http::client()->server())) + .arg(http::client()->port()) + .arg(session) + .arg(authType); + + QDesktopServices::openUrl(url); + }); + + connect(confirmBtn_, &QPushButton::clicked, this, [this]() { + emit confirmation(); + emit close(); + }); + connect(cancelBtn_, &QPushButton::clicked, this, [this]() { + emit cancel(); + emit close(); + }); +} diff --git a/src/dialogs/FallbackAuth.h b/src/dialogs/FallbackAuth.h new file mode 100644 index 00000000..245fa03e --- /dev/null +++ b/src/dialogs/FallbackAuth.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +class QPushButton; +class QLabel; + +namespace dialogs { + +class FallbackAuth : public QWidget +{ + Q_OBJECT + +public: + FallbackAuth(const QString &authType, const QString &session, QWidget *parent = nullptr); + +signals: + void confirmation(); + void cancel(); + +private: + QPushButton *openBtn_; + QPushButton *confirmBtn_; + QPushButton *cancelBtn_; +}; +} // dialogs diff --git a/src/dialogs/ReCaptcha.cpp b/src/dialogs/ReCaptcha.cpp index 7849aa4f..21dc8c77 100644 --- a/src/dialogs/ReCaptcha.cpp +++ b/src/dialogs/ReCaptcha.cpp @@ -60,5 +60,8 @@ ReCaptcha::ReCaptcha(const QString &session, QWidget *parent) emit confirmation(); emit close(); }); - connect(cancelBtn_, &QPushButton::clicked, this, &dialogs::ReCaptcha::close); + connect(cancelBtn_, &QPushButton::clicked, this, [this]() { + emit cancel(); + emit close(); + }); } diff --git a/src/dialogs/ReCaptcha.h b/src/dialogs/ReCaptcha.h index f8407640..88ff3722 100644 --- a/src/dialogs/ReCaptcha.h +++ b/src/dialogs/ReCaptcha.h @@ -15,6 +15,7 @@ public: signals: void confirmation(); + void cancel(); private: QPushButton *openCaptchaBtn_; -- cgit 1.5.1