diff --git a/CMakeLists.txt b/CMakeLists.txt index 093693f1..ab6d6f14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -311,7 +311,6 @@ set(SRC_FILES src/dialogs/CreateRoom.cpp src/dialogs/FallbackAuth.cpp src/dialogs/ImageOverlay.cpp - src/dialogs/Logout.cpp src/dialogs/PreviewUploadOverlay.cpp src/dialogs/ReCaptcha.cpp @@ -332,10 +331,8 @@ set(SRC_FILES src/timeline/RoomlistModel.cpp # UI components - src/ui/Badge.cpp src/ui/DropShadow.cpp src/ui/FlatButton.cpp - src/ui/InfoMessage.cpp src/ui/Label.cpp src/ui/LoadingIndicator.cpp src/ui/MxcAnimatedImage.cpp @@ -522,7 +519,6 @@ qt5_wrap_cpp(MOC_HEADERS src/dialogs/CreateRoom.h src/dialogs/FallbackAuth.h src/dialogs/ImageOverlay.h - src/dialogs/Logout.h src/dialogs/PreviewUploadOverlay.h src/dialogs/ReCaptcha.h @@ -542,9 +538,7 @@ qt5_wrap_cpp(MOC_HEADERS src/timeline/RoomlistModel.h # UI components - src/ui/Badge.h src/ui/FlatButton.h - src/ui/InfoMessage.h src/ui/Label.h src/ui/LoadingIndicator.h src/ui/MxcAnimatedImage.h diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 3b977ae6..cc060533 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -62,6 +62,7 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) topLayout_ = new QHBoxLayout(this); topLayout_->setSpacing(0); + topLayout_->setContentsMargins(0, 0, 0, 0); view_manager_ = new TimelineViewManager(callManager_, this); @@ -777,8 +778,7 @@ ChatPage::inviteUser(QString userid, QString reason) if (QMessageBox::question(this, tr("Confirm invite"), tr("Do you really want to invite %1 (%2)?") - .arg(cache::displayName(room, userid)) - .arg(userid)) != QMessageBox::Yes) + .arg(cache::displayName(room, userid), userid)) != QMessageBox::Yes) return; http::client()->invite_user( @@ -786,10 +786,9 @@ ChatPage::inviteUser(QString userid, QString reason) userid.toStdString(), [this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) { if (err) { - emit showNotification(tr("Failed to invite %1 to %2: %3") - .arg(userid) - .arg(room) - .arg(QString::fromStdString(err->matrix_error.error))); + emit showNotification( + tr("Failed to invite %1 to %2: %3") + .arg(userid, room, QString::fromStdString(err->matrix_error.error))); } else emit showNotification(tr("Invited user: %1").arg(userid)); }, @@ -803,8 +802,7 @@ ChatPage::kickUser(QString userid, QString reason) if (QMessageBox::question(this, tr("Confirm kick"), tr("Do you really want to kick %1 (%2)?") - .arg(cache::displayName(room, userid)) - .arg(userid)) != QMessageBox::Yes) + .arg(cache::displayName(room, userid), userid)) != QMessageBox::Yes) return; http::client()->kick_user( @@ -812,10 +810,9 @@ ChatPage::kickUser(QString userid, QString reason) userid.toStdString(), [this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) { if (err) { - emit showNotification(tr("Failed to kick %1 from %2: %3") - .arg(userid) - .arg(room) - .arg(QString::fromStdString(err->matrix_error.error))); + emit showNotification( + tr("Failed to kick %1 from %2: %3") + .arg(userid, room, QString::fromStdString(err->matrix_error.error))); } else emit showNotification(tr("Kicked user: %1").arg(userid)); }, @@ -826,11 +823,11 @@ ChatPage::banUser(QString userid, QString reason) { auto room = currentRoom(); - if (QMessageBox::question(this, - tr("Confirm ban"), - tr("Do you really want to ban %1 (%2)?") - .arg(cache::displayName(room, userid)) - .arg(userid)) != QMessageBox::Yes) + if (QMessageBox::question( + this, + tr("Confirm ban"), + tr("Do you really want to ban %1 (%2)?").arg(cache::displayName(room, userid), userid)) != + QMessageBox::Yes) return; http::client()->ban_user( @@ -838,10 +835,9 @@ ChatPage::banUser(QString userid, QString reason) userid.toStdString(), [this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) { if (err) { - emit showNotification(tr("Failed to ban %1 in %2: %3") - .arg(userid) - .arg(room) - .arg(QString::fromStdString(err->matrix_error.error))); + emit showNotification( + tr("Failed to ban %1 in %2: %3") + .arg(userid, room, QString::fromStdString(err->matrix_error.error))); } else emit showNotification(tr("Banned user: %1").arg(userid)); }, @@ -855,8 +851,7 @@ ChatPage::unbanUser(QString userid, QString reason) if (QMessageBox::question(this, tr("Confirm unban"), tr("Do you really want to unban %1 (%2)?") - .arg(cache::displayName(room, userid)) - .arg(userid)) != QMessageBox::Yes) + .arg(cache::displayName(room, userid), userid)) != QMessageBox::Yes) return; http::client()->unban_user( @@ -864,10 +859,9 @@ ChatPage::unbanUser(QString userid, QString reason) userid.toStdString(), [this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) { if (err) { - emit showNotification(tr("Failed to unban %1 in %2: %3") - .arg(userid) - .arg(room) - .arg(QString::fromStdString(err->matrix_error.error))); + emit showNotification( + tr("Failed to unban %1 in %2: %3") + .arg(userid, room, QString::fromStdString(err->matrix_error.error))); } else emit showNotification(tr("Unbanned user: %1").arg(userid)); }, @@ -1201,7 +1195,7 @@ ChatPage::startChat(QString userid) auto joined_rooms = cache::joinedRooms(); auto room_infos = cache::getRoomInfo(joined_rooms); - for (std::string room_id : joined_rooms) { + for (const std::string &room_id : joined_rooms) { if (room_infos[QString::fromStdString(room_id)].member_count == 2) { auto room_members = cache::roomMembers(room_id); if (std::find(room_members.begin(), room_members.end(), (userid).toStdString()) != @@ -1323,8 +1317,9 @@ ChatPage::handleMatrixUri(QString uri) std::vector vias; QString action; - for (QString item : - uri_.query(QUrl::ComponentFormattingOption::FullyEncoded).split('&', Qt::SkipEmptyParts)) { + auto items = + uri_.query(QUrl::ComponentFormattingOption::FullyEncoded).split('&', Qt::SkipEmptyParts); + for (QString item : qAsConst(items)) { nhlog::ui()->info("item: {}", item.toStdString()); if (item.startsWith("action=")) { @@ -1350,7 +1345,7 @@ ChatPage::handleMatrixUri(QString uri) auto joined_rooms = cache::joinedRooms(); auto targetRoomId = mxid1.toStdString(); - for (auto roomid : joined_rooms) { + for (const auto &roomid : joined_rooms) { if (roomid == targetRoomId) { view_manager_->rooms()->setCurrentRoom(mxid1); if (!mxid2.isEmpty()) @@ -1368,7 +1363,7 @@ ChatPage::handleMatrixUri(QString uri) auto joined_rooms = cache::joinedRooms(); auto targetRoomAlias = mxid1.toStdString(); - for (auto roomid : joined_rooms) { + for (const auto &roomid : joined_rooms) { auto aliases = cache::client()->getRoomAliases(roomid); if (aliases) { if (aliases->alias == targetRoomAlias) { diff --git a/src/CompletionProxyModel.cpp b/src/CompletionProxyModel.cpp index e32038e4..ee3b3374 100644 --- a/src/CompletionProxyModel.cpp +++ b/src/CompletionProxyModel.cpp @@ -48,9 +48,9 @@ CompletionProxyModel::CompletionProxyModel(QAbstractItemModel *model, .toString() .toLower(); - for (const auto &e : QStringView(string1).split(splitPoints)) { - if (!e.isEmpty()) // NOTE(Nico): Use Qt::SkipEmptyParts in Qt 5.14 - trie_.insert(e.toUcs4(), i); + auto split1 = QStringView(string1).split(splitPoints, Qt::SkipEmptyParts); + for (const auto &e : qAsConst(split1)) { + trie_.insert(e.toUcs4(), i); } auto string2 = sourceModel() @@ -59,9 +59,9 @@ CompletionProxyModel::CompletionProxyModel(QAbstractItemModel *model, .toLower(); if (!string2.isEmpty()) { - for (const auto &e : QStringView(string2).split(splitPoints)) { - if (!e.isEmpty()) // NOTE(Nico): Use Qt::SkipEmptyParts in Qt 5.14 - trie_.insert(e.toUcs4(), i); + auto split2 = QStringView(string2).split(splitPoints, Qt::SkipEmptyParts); + for (const auto &e : qAsConst(split2)) { + trie_.insert(e.toUcs4(), i); } } } diff --git a/src/Config.h b/src/Config.h index 4b3fff7b..fcf37112 100644 --- a/src/Config.h +++ b/src/Config.h @@ -7,10 +7,11 @@ #include #include +// clazy:excludeall=non-pod-global-static + // Non-theme app configuration. Layouts, fonts spacing etc. // // Font sizes are in pixels. - namespace conf { // Global settings. constexpr int fontSize = 14; @@ -54,16 +55,18 @@ constexpr auto LABEL_BIG_SIZE_RATIO = 2; } namespace strings { -const QString url_html = "\\1"; +const QString url_html = QStringLiteral("\\1"); const QRegularExpression url_regex( // match an URL, that is not quoted, i.e. // vvvvvv match quote via negative lookahead/lookbehind vv // vvvv atomic match url -> fail if there is a " before or after vvv - R"((?((www\.(?!\.)|[a-z][a-z0-9+.-]*://)[^\s<>'"]+[^!,\.\s<>'"\]\)\:]))(?!["']))"); + QStringLiteral( + R"((?((www\.(?!\.)|[a-z][a-z0-9+.-]*://)[^\s<>'"]+[^!,\.\s<>'"\]\)\:]))(?!["']))")); // match any markdown matrix.to link. Capture group 1 is the link name, group 2 is the target. -static const QRegularExpression - matrixToMarkdownLink(R"(\[(.*?)(?(.*?))"); +static const QRegularExpression matrixToMarkdownLink( + R"(\[(.*?)(?(.*?))"); // clazy:exclude=non-pod-global-static } // Window geometry. diff --git a/src/InviteesModel.cpp b/src/InviteesModel.cpp index ad99c847..ced58389 100644 --- a/src/InviteesModel.cpp +++ b/src/InviteesModel.cpp @@ -16,7 +16,7 @@ InviteesModel::InviteesModel(QObject *parent) void InviteesModel::addUser(QString mxid) { - for (const auto &invitee : invitees_) + for (const auto &invitee : qAsConst(invitees_)) if (invitee->mxid_ == mxid) return; diff --git a/src/JdenticonProvider.cpp b/src/JdenticonProvider.cpp index e69e42e0..e0067af1 100644 --- a/src/JdenticonProvider.cpp +++ b/src/JdenticonProvider.cpp @@ -5,7 +5,6 @@ #include "JdenticonProvider.h" #include -#include #include #include #include @@ -27,8 +26,6 @@ getJdenticonInterface() static bool interfaceExists{true}; if (interface == nullptr && interfaceExists) { - QDir pluginsDir(qApp->applicationDirPath()); - QPluginLoader pluginLoader("qtjdenticon"); QObject *plugin = pluginLoader.instance(); if (plugin) { diff --git a/src/JdenticonProvider.h b/src/JdenticonProvider.h index 08a934c2..421217ca 100644 --- a/src/JdenticonProvider.h +++ b/src/JdenticonProvider.h @@ -79,7 +79,7 @@ public slots: auto query = id.mid(queryStart + 1); auto queryBits = query.splitRef('&'); - for (auto b : queryBits) { + for (const auto &b : queryBits) { if (b.startsWith(QStringView(u"radius="))) { radius = b.mid(7).toDouble(); } diff --git a/src/LoginPage.cpp b/src/LoginPage.cpp index 00a5b964..477b58fb 100644 --- a/src/LoginPage.cpp +++ b/src/LoginPage.cpp @@ -40,6 +40,7 @@ LoginPage::LoginPage(QWidget *parent) top_bar_layout_ = new QHBoxLayout(); top_bar_layout_->setSpacing(0); + top_bar_layout_->setContentsMargins(0, 0, 0, 0); back_button_ = new FlatButton(this); back_button_->setMinimumSize(QSize(30, 30)); diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index a08371cb..846eee2d 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -203,7 +203,7 @@ MainWindow::removeOverlayProgressBar() QTimer *timer = new QTimer(this); timer->setSingleShot(true); - connect(timer, &QTimer::timeout, [this, timer]() { + connect(timer, &QTimer::timeout, this, [this, timer]() { timer->deleteLater(); if (modal_) diff --git a/src/MainWindow.h b/src/MainWindow.h index 7d47d7ce..3ba351e6 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -37,7 +37,6 @@ struct CreateRoom; namespace dialogs { class CreateRoom; class InviteUsers; -class Logout; class MemberList; class ReCaptcha; } @@ -60,7 +59,6 @@ public: void openCreateRoomDialog(std::function callback); void openJoinRoomDialog(std::function callback); - void openLogoutDialog(); void hideOverlay(); void showSolidOverlayModal(QWidget *content, QFlags flags = Qt::AlignCenter); diff --git a/src/RegisterPage.cpp b/src/RegisterPage.cpp index 646ef103..4b91c617 100644 --- a/src/RegisterPage.cpp +++ b/src/RegisterPage.cpp @@ -61,6 +61,7 @@ RegisterPage::RegisterPage(QWidget *parent) logo_->setPixmap(logo.pixmap(128)); logo_layout_ = new QHBoxLayout(); + logo_layout_->setContentsMargins(0, 0, 0, 0); logo_layout_->addWidget(logo_, 0, Qt::AlignHCenter); form_wrapper_ = new QHBoxLayout(); @@ -127,6 +128,7 @@ RegisterPage::RegisterPage(QWidget *parent) button_layout_ = new QHBoxLayout(); button_layout_->setSpacing(0); + button_layout_->setContentsMargins(0, 0, 0, 0); error_label_ = new QLabel(this); error_label_->setWordWrap(true); diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp index c8eedc28..34dc7c45 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp @@ -771,6 +771,7 @@ UserSettingsPage::UserSettingsPage(QSharedPointer settings, QWidge topBarLayout_ = new QHBoxLayout; topBarLayout_->setSpacing(0); + topBarLayout_->setContentsMargins(0, 0, 0, 0); topBarLayout_->addWidget(backBtn_, 1, Qt::AlignLeft | Qt::AlignVCenter); topBarLayout_->addStretch(1); diff --git a/src/Utils.h b/src/Utils.h index 701ec8fc..1d1cb10c 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -155,10 +155,9 @@ messageDescription(const QString &username = "", return QCoreApplication::translate("message-description sent:", "You: %1").arg(body); else return QCoreApplication::translate("message-description sent:", "%1: %2") - .arg(username) - .arg(body); + .arg(username, body); } else if (std::is_same::value) { - return QString("* %1 %2").arg(username).arg(body); + return QString("* %1 %2").arg(username, body); } else if (std::is_same::value) { if (isLocal) return QCoreApplication::translate("message-description sent:", diff --git a/src/dialogs/CreateRoom.cpp b/src/dialogs/CreateRoom.cpp index 153d36c0..0600bd13 100644 --- a/src/dialogs/CreateRoom.cpp +++ b/src/dialogs/CreateRoom.cpp @@ -85,7 +85,7 @@ CreateRoom::CreateRoom(QWidget *parent) auto directLabel_ = new QLabel(tr("Direct Chat"), this); directToggle_ = new Toggle(this); - directToggle_->setActiveColor(QColor("#38A3D8")); + directToggle_->setActiveColor(QColor(0x38, 0xA3, 0xD8)); directToggle_->setInactiveColor(QColor("gray")); directToggle_->setState(false); @@ -120,6 +120,7 @@ CreateRoom::CreateRoom(QWidget *parent) connect(visibilityCombo_, static_cast(&QComboBox::currentTextChanged), + this, [this](const QString &text) { if (text == "Private") { request_.visibility = mtx::common::RoomVisibility::Private; @@ -130,6 +131,7 @@ CreateRoom::CreateRoom(QWidget *parent) connect(presetCombo_, static_cast(&QComboBox::currentTextChanged), + this, [this](const QString &text) { if (text == "Private Chat") { request_.preset = mtx::requests::Preset::PrivateChat; diff --git a/src/dialogs/FallbackAuth.cpp b/src/dialogs/FallbackAuth.cpp index 0d8be237..ac3b7c26 100644 --- a/src/dialogs/FallbackAuth.cpp +++ b/src/dialogs/FallbackAuth.cpp @@ -32,6 +32,7 @@ FallbackAuth::FallbackAuth(const QString &authType, const QString &session, QWid auto buttonLayout = new QHBoxLayout(); buttonLayout->setSpacing(8); + buttonLayout->setContentsMargins(0, 0, 0, 0); openBtn_ = new QPushButton(tr("Open Fallback in Browser"), this); cancelBtn_ = new QPushButton(tr("Cancel"), this); @@ -58,8 +59,7 @@ FallbackAuth::FallbackAuth(const QString &authType, const QString &session, QWid "fallback/web?session=%3") .arg(QString::fromStdString(http::client()->server())) .arg(http::client()->port()) - .arg(session) - .arg(authType); + .arg(session, authType); QDesktopServices::openUrl(url); }); diff --git a/src/dialogs/Logout.cpp b/src/dialogs/Logout.cpp deleted file mode 100644 index 45cef6a5..00000000 --- a/src/dialogs/Logout.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-FileCopyrightText: 2017 Konstantinos Sideris -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include -#include -#include - -#include "Config.h" -#include "dialogs/Logout.h" - -using namespace dialogs; - -Logout::Logout(QWidget *parent) - : QFrame(parent) -{ - setAutoFillBackground(true); - setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint); - setWindowModality(Qt::WindowModal); - setAttribute(Qt::WA_DeleteOnClose, true); - - setMinimumWidth(conf::modals::MIN_WIDGET_WIDTH); - setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); - - auto layout = new QVBoxLayout(this); - layout->setSpacing(conf::modals::WIDGET_SPACING); - layout->setContentsMargins(conf::modals::WIDGET_MARGIN, - conf::modals::WIDGET_MARGIN, - conf::modals::WIDGET_MARGIN, - conf::modals::WIDGET_MARGIN); - - auto buttonLayout = new QHBoxLayout(); - buttonLayout->setSpacing(0); - - confirmBtn_ = new QPushButton("Logout", this); - cancelBtn_ = new QPushButton(tr("Cancel"), this); - cancelBtn_->setDefault(true); - - buttonLayout->addStretch(1); - buttonLayout->setSpacing(15); - buttonLayout->addWidget(cancelBtn_); - buttonLayout->addWidget(confirmBtn_); - - auto label = new QLabel(tr("Logout. Are you sure?"), this); - - layout->addWidget(label); - layout->addLayout(buttonLayout); - layout->addStretch(1); - - connect(confirmBtn_, &QPushButton::clicked, this, [this]() { - emit loggingOut(); - emit close(); - }); - connect(cancelBtn_, &QPushButton::clicked, this, &Logout::close); -} diff --git a/src/dialogs/Logout.h b/src/dialogs/Logout.h deleted file mode 100644 index 7783c68f..00000000 --- a/src/dialogs/Logout.h +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: 2017 Konstantinos Sideris -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include - -class QPushButton; - -namespace dialogs { - -class Logout : public QFrame -{ - Q_OBJECT -public: - explicit Logout(QWidget *parent = nullptr); - -signals: - void loggingOut(); - -private: - QPushButton *confirmBtn_; - QPushButton *cancelBtn_; -}; -} // dialogs diff --git a/src/dialogs/PreviewUploadOverlay.cpp b/src/dialogs/PreviewUploadOverlay.cpp index 338f0635..00abde91 100644 --- a/src/dialogs/PreviewUploadOverlay.cpp +++ b/src/dialogs/PreviewUploadOverlay.cpp @@ -30,6 +30,7 @@ PreviewUploadOverlay::PreviewUploadOverlay(QWidget *parent) , cancel_{tr("Cancel"), this} { auto hlayout = new QHBoxLayout; + hlayout->setContentsMargins(0, 0, 0, 0); hlayout->addStretch(1); hlayout->addWidget(&cancel_); hlayout->addWidget(&upload_); @@ -46,7 +47,7 @@ PreviewUploadOverlay::PreviewUploadOverlay(QWidget *parent) conf::modals::WIDGET_MARGIN); upload_.setDefault(true); - connect(&upload_, &QPushButton::clicked, [this]() { + connect(&upload_, &QPushButton::clicked, this, [this]() { emit confirmUpload(data_, mediaType_, fileName_.text()); close(); }); @@ -124,8 +125,7 @@ PreviewUploadOverlay::setLabels(const QString &type, const QString &mime, uint64 } else { auto const info = QString{tr("Media type: %1\n" "Media size: %2\n")} - .arg(mime) - .arg(utils::humanReadableFileSize(upload_size)); + .arg(mime, utils::humanReadableFileSize(upload_size)); titleLabel_.setText(QString{tr(DEFAULT)}.arg("file")); infoLabel_.setText(info); diff --git a/src/dialogs/ReCaptcha.cpp b/src/dialogs/ReCaptcha.cpp index 982c17b6..a4ada889 100644 --- a/src/dialogs/ReCaptcha.cpp +++ b/src/dialogs/ReCaptcha.cpp @@ -31,6 +31,7 @@ ReCaptcha::ReCaptcha(const QString &session, QWidget *parent) conf::modals::WIDGET_MARGIN); auto buttonLayout = new QHBoxLayout(); + buttonLayout->setContentsMargins(0, 0, 0, 0); buttonLayout->setSpacing(8); openCaptchaBtn_ = new QPushButton("Open reCAPTCHA", this); diff --git a/src/encryption/Olm.cpp b/src/encryption/Olm.cpp index b8df73fc..0004a40c 100644 --- a/src/encryption/Olm.cpp +++ b/src/encryption/Olm.cpp @@ -273,7 +273,7 @@ handle_olm_message(const OlmMessage &msg, const UserKeyCache &otherUserDeviceKey } bool from_their_device = false; - for (auto [device_id, key] : otherUserDeviceKeys.device_keys) { + for (const auto &[device_id, key] : otherUserDeviceKeys.device_keys) { auto c_key = key.keys.find("curve25519:" + device_id); auto e_key = key.keys.find("ed25519:" + device_id); @@ -406,7 +406,7 @@ handle_olm_message(const OlmMessage &msg, const UserKeyCache &otherUserDeviceKey if (failed_decryption) { try { std::map> targets; - for (auto [device_id, key] : otherUserDeviceKeys.device_keys) { + for (const auto &[device_id, key] : otherUserDeviceKeys.device_keys) { if (key.keys.at("curve25519:" + device_id) == msg.sender_key) targets[msg.sender].push_back(device_id); } @@ -1522,7 +1522,7 @@ request_cross_signing_keys() } // timeout after 15 min - QTimer::singleShot(15 * 60 * 1000, [secretRequest, body]() { + QTimer::singleShot(15 * 60 * 1000, ChatPage::instance(), [secretRequest, body]() { if (request_id_to_secret_name.count(secretRequest.request_id)) { request_id_to_secret_name.erase(secretRequest.request_id); http::client()->send_to_device( diff --git a/src/encryption/SelfVerificationStatus.cpp b/src/encryption/SelfVerificationStatus.cpp index 1e278da1..e15fa4cc 100644 --- a/src/encryption/SelfVerificationStatus.cpp +++ b/src/encryption/SelfVerificationStatus.cpp @@ -280,7 +280,7 @@ SelfVerificationStatus::invalidate() cache::client()->markUserKeysOutOfDate({http::client()->user_id().to_string()}); - QTimer::singleShot(1'000, [] { + QTimer::singleShot(1'000, this, [] { cache::client()->query_keys(http::client()->user_id().to_string(), [](const UserKeyCache &, mtx::http::RequestErr) {}); }); diff --git a/src/encryption/VerificationManager.cpp b/src/encryption/VerificationManager.cpp index f4c7ddf2..163c0564 100644 --- a/src/encryption/VerificationManager.cpp +++ b/src/encryption/VerificationManager.cpp @@ -79,7 +79,7 @@ VerificationManager::verifyUser(QString userid) auto joined_rooms = cache::joinedRooms(); auto room_infos = cache::getRoomInfo(joined_rooms); - for (std::string room_id : joined_rooms) { + for (const std::string &room_id : joined_rooms) { if ((room_infos[QString::fromStdString(room_id)].member_count == 2) && cache::isRoomEncrypted(room_id)) { auto room_members = cache::roomMembers(room_id); diff --git a/src/timeline/CommunitiesModel.cpp b/src/timeline/CommunitiesModel.cpp index 3c28463e..c344c8fd 100644 --- a/src/timeline/CommunitiesModel.cpp +++ b/src/timeline/CommunitiesModel.cpp @@ -394,7 +394,7 @@ CommunitiesModel::setCurrentTagId(QString tagId) { if (tagId.startsWith("tag:")) { auto tag = tagId.mid(4); - for (const auto &t : tags_) { + for (const auto &t : qAsConst(tags_)) { if (t == tag) { this->currentTagId_ = tagId; emit currentTagIdChanged(currentTagId_); diff --git a/src/timeline/DelegateChooser.cpp b/src/timeline/DelegateChooser.cpp index 682077ae..f0511f51 100644 --- a/src/timeline/DelegateChooser.cpp +++ b/src/timeline/DelegateChooser.cpp @@ -132,7 +132,8 @@ DelegateChooser::DelegateIncubator::statusChanged(QQmlIncubator::Status status) emit chooser.childChanged(); } else if (status == QQmlIncubator::Error) { - for (const auto &e : errors()) + auto errors_ = errors(); + for (const auto &e : qAsConst(errors_)) nhlog::ui()->error("Error instantiating delegate: {}", e.toString().toStdString()); } } diff --git a/src/timeline/EventStore.cpp b/src/timeline/EventStore.cpp index 7bb985f8..6a9d975e 100644 --- a/src/timeline/EventStore.cpp +++ b/src/timeline/EventStore.cpp @@ -185,7 +185,7 @@ EventStore::EventStore(std::string room_id, QObject *) // FIXME (introduced by balsoft): this doesn't work for encrypted events, but // allegedly it's hard to fix so I'll leave my first contribution at that - for (auto related_event_id : cache::client()->relatedEvents(room_id_, txn_id)) { + for (const auto &related_event_id : cache::client()->relatedEvents(room_id_, txn_id)) { if (cache::client()->getEvent(room_id_, related_event_id)) { auto related_event = cache::client()->getEvent(room_id_, related_event_id).value(); @@ -717,7 +717,8 @@ void EventStore::enableKeyRequests(bool suppressKeyRequests_) { if (!suppressKeyRequests_) { - for (const auto &key : decryptedEvents_.keys()) + auto keys = decryptedEvents_.keys(); + for (const auto &key : qAsConst(keys)) if (key.room == this->room_id_) decryptedEvents_.remove(key); suppressKeyRequests = false; diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp index edc21e54..304e00db 100644 --- a/src/timeline/InputBar.cpp +++ b/src/timeline/InputBar.cpp @@ -324,7 +324,8 @@ InputBar::message(const QString &msg, MarkdownOverride useMarkdown, bool rainbow QString body; bool firstLine = true; - for (auto line : related.quoted_body.splitRef(u'\n')) { + auto lines = related.quoted_body.splitRef(u'\n'); + for (auto line : qAsConst(lines)) { if (firstLine) { firstLine = false; body = QString("> <%1> %2\n").arg(related.quoted_user, line); diff --git a/src/timeline/RoomlistModel.cpp b/src/timeline/RoomlistModel.cpp index 79324628..6c9593ee 100644 --- a/src/timeline/RoomlistModel.cpp +++ b/src/timeline/RoomlistModel.cpp @@ -317,7 +317,7 @@ RoomlistModel::addRoom(const QString &room_id, bool suppressInsertNotification) int total_unread_msgs = 0; - for (const auto &room : models) { + for (const auto &room : qAsConst(models)) { if (!room.isNull()) total_unread_msgs += room->notificationCount(); } @@ -586,8 +586,8 @@ RoomlistModel::initializeRooms() } invites = cache::client()->invites(); - for (const auto &id : invites.keys()) { - roomids.push_back(id); + for (auto id = invites.keyBegin(); id != invites.keyEnd(); ++id) { + roomids.push_back(*id); } for (const auto &id : cache::client()->roomIds()) @@ -826,10 +826,12 @@ FilteredRoomlistModel::updateHiddenTagsAndSpaces() hiddenTags.clear(); hiddenSpaces.clear(); hideDMs = false; - for (const auto &t : UserSettings::instance()->hiddenTags()) { - if (t.startsWith("tag:")) + + auto hidden = UserSettings::instance()->hiddenTags(); + for (const auto &t : qAsConst(hidden)) { + if (t.startsWith(u"tag:")) hiddenTags.push_back(t.mid(4)); - else if (t.startsWith("space:")) + else if (t.startsWith(u"space:")) hiddenSpaces.push_back(t.mid(6)); else if (t == "dm") hideDMs = true; diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 91400a40..cbcfe898 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -36,7 +36,7 @@ Q_DECLARE_METATYPE(QModelIndex) namespace std { -inline uint +inline uint // clazy:exclude=qhash-namespace qHash(const std::string &key, uint seed = 0) { return qHash(QByteArray::fromRawData(key.data(), (int)key.length()), seed); @@ -1540,9 +1540,8 @@ TimelineModel::cacheMedia(const QString &eventId, if (!event) return; - QString mxcUrl = QString::fromStdString(mtx::accessors::url(*event)); - QString originalFilename = QString::fromStdString(mtx::accessors::filename(*event)); - QString mimeType = QString::fromStdString(mtx::accessors::mimetype(*event)); + QString mxcUrl = QString::fromStdString(mtx::accessors::url(*event)); + QString mimeType = QString::fromStdString(mtx::accessors::mimetype(*event)); auto encryptionInfo = mtx::accessors::file(*event); @@ -1556,10 +1555,9 @@ TimelineModel::cacheMedia(const QString &eventId, const auto url = mxcUrl.toStdString(); const auto name = QString(mxcUrl).remove("mxc://"); - QFileInfo filename(QString("%1/media_cache/%2.%3") - .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) - .arg(name) - .arg(suffix)); + QFileInfo filename( + QString("%1/media_cache/%2.%3") + .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation), name, suffix)); if (QDir::cleanPath(name) != name) { nhlog::net()->warn("mxcUrl '{}' is not safe, not downloading file", url); return; @@ -1780,7 +1778,7 @@ TimelineModel::formatTypingUsers(const std::vector &users, const QColor uidWithoutLast.append(formatUser(users[i])); } - return temp.arg(uidWithoutLast.join(", ")).arg(formatUser(users.back())); + return temp.arg(uidWithoutLast.join(", "), formatUser(users.back())); } QString @@ -1812,8 +1810,7 @@ TimelineModel::formatJoinRuleEvent(const QString &id) } return tr("%1 allowed members of the following rooms to automatically join this " "room: %2") - .arg(name) - .arg(rooms.join(", ")); + .arg(name, rooms.join(", ")); } default: // Currently, knock and private are reserved keywords and not implemented in Matrix. @@ -2035,8 +2032,8 @@ TimelineModel::formatMemberEvent(const QString &id) else rendered = tr("%1 joined via authorisation from %2's server.") - .arg(name) - .arg(QString::fromStdString(event->content.join_authorised_via_users_server)); + .arg(name, + QString::fromStdString(event->content.join_authorised_via_users_server)); } break; case Membership::Leave: diff --git a/src/ui/Badge.cpp b/src/ui/Badge.cpp deleted file mode 100644 index 1b5aba2f..00000000 --- a/src/ui/Badge.cpp +++ /dev/null @@ -1,222 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include - -#include "Badge.h" - -Badge::Badge(QWidget *parent) - : OverlayWidget(parent) -{ - init(); -} - -Badge::Badge(const QIcon &icon, QWidget *parent) - : OverlayWidget(parent) -{ - init(); - setIcon(icon); -} - -Badge::Badge(const QString &text, QWidget *parent) - : OverlayWidget(parent) -{ - init(); - setText(text); -} - -void -Badge::init() -{ - x_ = 0; - y_ = 0; - // TODO: Make padding configurable. - padding_ = 5; - diameter_ = 24; - - setAttribute(Qt::WA_TransparentForMouseEvents); - - QFont _font(font()); - _font.setPointSizeF(7.5); - _font.setStyleName("Bold"); - - setFont(_font); - setText(""); -} - -QString -Badge::text() const -{ - return text_; -} - -QIcon -Badge::icon() const -{ - return icon_; -} - -QSize -Badge::sizeHint() const -{ - const int d = diameter(); - return QSize(d + 4, d + 4); -} - -qreal -Badge::relativeYPosition() const -{ - return y_; -} - -qreal -Badge::relativeXPosition() const -{ - return x_; -} - -QPointF -Badge::relativePosition() const -{ - return QPointF(x_, y_); -} - -QColor -Badge::backgroundColor() const -{ - if (!background_color_.isValid()) - return QColor("black"); - - return background_color_; -} - -QColor -Badge::textColor() const -{ - if (!text_color_.isValid()) - return QColor("white"); - - return text_color_; -} - -void -Badge::setTextColor(const QColor &color) -{ - text_color_ = color; -} - -void -Badge::setBackgroundColor(const QColor &color) -{ - background_color_ = color; -} - -void -Badge::setRelativePosition(const QPointF &pos) -{ - setRelativePosition(pos.x(), pos.y()); -} - -void -Badge::setRelativePosition(qreal x, qreal y) -{ - x_ = x; - y_ = y; - update(); -} - -void -Badge::setRelativeXPosition(qreal x) -{ - x_ = x; - update(); -} - -void -Badge::setRelativeYPosition(qreal y) -{ - y_ = y; - update(); -} - -void -Badge::setIcon(const QIcon &icon) -{ - icon_ = icon; - update(); -} - -void -Badge::setText(const QString &text) -{ - text_ = text; - - if (!icon_.isNull()) - icon_ = QIcon(); - - size_ = fontMetrics().size(Qt::TextShowMnemonic, text); - - update(); -} - -void -Badge::setDiameter(int diameter) -{ - if (diameter > 0) { - diameter_ = diameter; - update(); - } -} - -void -Badge::paintEvent(QPaintEvent *) -{ - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - painter.translate(x_, y_); - - QBrush brush; - brush.setStyle(Qt::SolidPattern); - - painter.setBrush(brush); - painter.setPen(Qt::NoPen); - - const int d = diameter(); - - QRectF r(0, 0, d, d); - r.translate(QPointF((width() - d), (height() - d)) / 2); - - if (icon_.isNull()) { - QPen pen; - // TODO: Make badge width configurable. - pen.setWidth(1); - pen.setColor(textColor()); - - painter.setPen(pen); - painter.drawEllipse(r); - - painter.setPen(textColor()); - painter.setBrush(Qt::NoBrush); - painter.drawText(r.translated(0, -0.5), Qt::AlignCenter, text_); - } else { - painter.drawEllipse(r); - QRectF q(0, 0, 16, 16); - q.moveCenter(r.center()); - QPixmap pixmap = icon().pixmap(16, 16); - QPainter icon(&pixmap); - icon.setCompositionMode(QPainter::CompositionMode_SourceIn); - icon.fillRect(pixmap.rect(), textColor()); - painter.drawPixmap(q.toRect(), pixmap); - } -} - -int -Badge::diameter() const -{ - if (icon_.isNull()) { - return qMax(size_.width(), size_.height()) + padding_; - } - - return diameter_; -} diff --git a/src/ui/Badge.h b/src/ui/Badge.h deleted file mode 100644 index 15b69b58..00000000 --- a/src/ui/Badge.h +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include -#include -#include -#include - -#include "OverlayWidget.h" - -class Badge : public OverlayWidget -{ - Q_OBJECT - - Q_PROPERTY(QColor textColor WRITE setTextColor READ textColor) - Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor) - Q_PROPERTY(QPointF relativePosition WRITE setRelativePosition READ relativePosition) - -public: - explicit Badge(QWidget *parent = nullptr); - explicit Badge(const QIcon &icon, QWidget *parent = nullptr); - explicit Badge(const QString &text, QWidget *parent = nullptr); - - void setBackgroundColor(const QColor &color); - void setTextColor(const QColor &color); - void setIcon(const QIcon &icon); - void setRelativePosition(const QPointF &pos); - void setRelativePosition(qreal x, qreal y); - void setRelativeXPosition(qreal x); - void setRelativeYPosition(qreal y); - void setText(const QString &text); - void setDiameter(int diameter); - - QIcon icon() const; - QString text() const; - QColor backgroundColor() const; - QColor textColor() const; - QPointF relativePosition() const; - QSize sizeHint() const override; - qreal relativeXPosition() const; - qreal relativeYPosition() const; - - int diameter() const; - -protected: - void paintEvent(QPaintEvent *event) override; - -private: - void init(); - - QColor background_color_; - QColor text_color_; - - QIcon icon_; - QSize size_; - QString text_; - - int padding_; - int diameter_; - - qreal x_; - qreal y_; -}; diff --git a/src/ui/DropShadow.cpp b/src/ui/DropShadow.cpp index 31d13b93..9a5c6372 100644 --- a/src/ui/DropShadow.cpp +++ b/src/ui/DropShadow.cpp @@ -100,7 +100,7 @@ DropShadow::draw(QPainter &painter, painter.drawRoundedRect(QRectF(topright0, topright1), 0.0, 0.0); // Widget - painter.setBrush(QBrush("#FFFFFF")); + painter.setBrush(QBrush(QColor(0xff, 0xff, 0xff))); painter.setRenderHint(QPainter::Antialiasing); painter.drawRoundedRect( QRectF(QPointF(margin, margin), QPointF(width - margin, height - margin)), radius, radius); diff --git a/src/ui/FlatButton.cpp b/src/ui/FlatButton.cpp index c80a88dc..48da75a2 100644 --- a/src/ui/FlatButton.cpp +++ b/src/ui/FlatButton.cpp @@ -119,6 +119,7 @@ void FlatButton::setForegroundColor(const QColor &color) { foreground_color_ = color; + emit foregroundColorChanged(); } QColor @@ -147,6 +148,7 @@ void FlatButton::setBackgroundColor(const QColor &color) { background_color_ = color; + emit backgroundColorChanged(); } QColor @@ -172,6 +174,7 @@ FlatButton::setOverlayColor(const QColor &color) { overlay_color_ = color; setOverlayStyle(ui::OverlayStyle::TintedOverlay); + emit overlayColorChanged(); } QColor @@ -188,6 +191,7 @@ void FlatButton::setDisabledForegroundColor(const QColor &color) { disabled_color_ = color; + emit disabledForegroundColorChanged(); } QColor @@ -204,6 +208,7 @@ void FlatButton::setDisabledBackgroundColor(const QColor &color) { disabled_background_color_ = color; + emit disabledBackgroundColorChanged(); } QColor @@ -225,6 +230,8 @@ FlatButton::setFontSize(qreal size) f.setPointSizeF(size); setFont(f); + emit fontSizeChanged(); + update(); } @@ -617,6 +624,7 @@ void FlatButtonStateMachine::setOverlayOpacity(qreal opacity) { overlay_opacity_ = opacity; + emit overlayOpacityChanged(); button_->update(); } @@ -624,6 +632,7 @@ void FlatButtonStateMachine::setCheckedOverlayProgress(qreal opacity) { checked_overlay_progress_ = opacity; + emit checkedOverlayProgressChanged(); button_->update(); } diff --git a/src/ui/FlatButton.h b/src/ui/FlatButton.h index 3f2c3f05..307e5520 100644 --- a/src/ui/FlatButton.h +++ b/src/ui/FlatButton.h @@ -16,9 +16,10 @@ class FlatButtonStateMachine : public QStateMachine { Q_OBJECT - Q_PROPERTY(qreal overlayOpacity WRITE setOverlayOpacity READ overlayOpacity) Q_PROPERTY( - qreal checkedOverlayProgress WRITE setCheckedOverlayProgress READ checkedOverlayProgress) + qreal overlayOpacity WRITE setOverlayOpacity READ overlayOpacity NOTIFY overlayOpacityChanged) + Q_PROPERTY(qreal checkedOverlayProgress WRITE setCheckedOverlayProgress READ + checkedOverlayProgress NOTIFY checkedOverlayProgressChanged) public: explicit FlatButtonStateMachine(FlatButton *parent); @@ -38,6 +39,9 @@ signals: void buttonChecked(); void buttonUnchecked(); + void overlayOpacityChanged(); + void checkedOverlayProgressChanged(); + protected: bool eventFilter(QObject *watched, QEvent *event) override; @@ -81,14 +85,17 @@ class FlatButton : public QPushButton { Q_OBJECT - Q_PROPERTY(QColor foregroundColor WRITE setForegroundColor READ foregroundColor) - Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor) - Q_PROPERTY(QColor overlayColor WRITE setOverlayColor READ overlayColor) + Q_PROPERTY(QColor foregroundColor WRITE setForegroundColor READ foregroundColor NOTIFY + foregroundColorChanged) + Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor NOTIFY + backgroundColorChanged) Q_PROPERTY( - QColor disabledForegroundColor WRITE setDisabledForegroundColor READ disabledForegroundColor) - Q_PROPERTY( - QColor disabledBackgroundColor WRITE setDisabledBackgroundColor READ disabledBackgroundColor) - Q_PROPERTY(qreal fontSize WRITE setFontSize READ fontSize) + QColor overlayColor WRITE setOverlayColor READ overlayColor NOTIFY overlayColorChanged) + Q_PROPERTY(QColor disabledForegroundColor WRITE setDisabledForegroundColor READ + disabledForegroundColor NOTIFY disabledForegroundColorChanged) + Q_PROPERTY(QColor disabledBackgroundColor WRITE setDisabledBackgroundColor READ + disabledBackgroundColor NOTIFY disabledBackgroundColorChanged) + Q_PROPERTY(qreal fontSize WRITE setFontSize READ fontSize NOTIFY fontSizeChanged) public: explicit FlatButton(QWidget *parent = nullptr, @@ -156,6 +163,14 @@ protected: void init(); +signals: + void foregroundColorChanged(); + void backgroundColorChanged(); + void overlayColorChanged(); + void disabledForegroundColorChanged(); + void disabledBackgroundColorChanged(); + void fontSizeChanged(); + private: RippleOverlay *ripple_overlay_; FlatButtonStateMachine *state_machine_; diff --git a/src/ui/InfoMessage.cpp b/src/ui/InfoMessage.cpp deleted file mode 100644 index e238a4d2..00000000 --- a/src/ui/InfoMessage.cpp +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "InfoMessage.h" -#include "Config.h" - -#include -#include -#include -#include -#include -#include - -constexpr int VPadding = 6; -constexpr int HPadding = 12; -constexpr int HMargin = 20; - -InfoMessage::InfoMessage(QWidget *parent) - : QWidget{parent} -{ - initFont(); -} - -InfoMessage::InfoMessage(QString msg, QWidget *parent) - : QWidget{parent} - , msg_{msg} -{ - initFont(); - - QFontMetrics fm{font()}; - width_ = fm.horizontalAdvance(msg_) + HPadding * 2; - height_ = fm.ascent() + 2 * VPadding; - - setFixedHeight(height_ + 2 * HMargin); -} - -void -InfoMessage::paintEvent(QPaintEvent *) -{ - QPainter p(this); - p.setRenderHint(QPainter::Antialiasing); - p.setFont(font()); - - // Center the box horizontally & vertically. - auto textRegion = QRectF(width() / 2 - width_ / 2, HMargin, width_, height_); - - QPainterPath ppath; - ppath.addRoundedRect(textRegion, height_ / 2, height_ / 2); - - p.setPen(Qt::NoPen); - p.fillPath(ppath, boxColor()); - p.drawPath(ppath); - - p.setPen(QPen(textColor())); - p.drawText(textRegion, Qt::AlignCenter, msg_); -} - -DateSeparator::DateSeparator(QDateTime datetime, QWidget *parent) - : InfoMessage{parent} -{ - auto now = QDateTime::currentDateTime(); - - QString fmt = QLocale::system().dateFormat(QLocale::LongFormat); - - if (now.date().year() == datetime.date().year()) { - QRegularExpression rx("[^a-zA-Z]*y+[^a-zA-Z]*"); - fmt = fmt.remove(rx); - } - - msg_ = datetime.date().toString(fmt); - - QFontMetrics fm{font()}; - width_ = fm.horizontalAdvance(msg_) + HPadding * 2; - height_ = fm.ascent() + 2 * VPadding; - - setFixedHeight(height_ + 2 * HMargin); -} diff --git a/src/ui/InfoMessage.h b/src/ui/InfoMessage.h deleted file mode 100644 index 486812a2..00000000 --- a/src/ui/InfoMessage.h +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include -#include -#include - -class InfoMessage : public QWidget -{ - Q_OBJECT - - Q_PROPERTY(QColor textColor WRITE setTextColor READ textColor) - Q_PROPERTY(QColor boxColor WRITE setBoxColor READ boxColor) - -public: - explicit InfoMessage(QWidget *parent = nullptr); - InfoMessage(QString msg, QWidget *parent = nullptr); - - void setTextColor(QColor color) { textColor_ = color; } - void setBoxColor(QColor color) { boxColor_ = color; } - void saveDatetime(QDateTime datetime) { datetime_ = datetime; } - - QColor textColor() const { return textColor_; } - QColor boxColor() const { return boxColor_; } - QDateTime datetime() const { return datetime_; } - -protected: - void paintEvent(QPaintEvent *event) override; - void initFont() - { - QFont f; - f.setWeight(QFont::Medium); - setFont(f); - } - - int width_; - int height_; - - QString msg_; - - QDateTime datetime_; - - QColor textColor_ = QColor("black"); - QColor boxColor_ = QColor("white"); -}; - -class DateSeparator : public InfoMessage -{ - Q_OBJECT - -public: - DateSeparator(QDateTime datetime, QWidget *parent = nullptr); -}; diff --git a/src/ui/LoadingIndicator.h b/src/ui/LoadingIndicator.h index 458ecd40..33095c4c 100644 --- a/src/ui/LoadingIndicator.h +++ b/src/ui/LoadingIndicator.h @@ -13,7 +13,7 @@ class QPaintEvent; class LoadingIndicator : public QWidget { Q_OBJECT - Q_PROPERTY(QColor color READ color WRITE setColor) + Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) public: LoadingIndicator(QWidget *parent = nullptr); @@ -24,7 +24,11 @@ public: void stop(); QColor color() { return color_; } - void setColor(QColor color) { color_ = color; } + void setColor(QColor color) + { + color_ = color; + emit colorChanged(); + } int interval() { return interval_; } void setInterval(int interval) { interval_ = interval; } @@ -32,6 +36,9 @@ public: private slots: void onTimeout(); +signals: + void colorChanged(); + private: int interval_; int angle_; diff --git a/src/ui/MxcAnimatedImage.cpp b/src/ui/MxcAnimatedImage.cpp index 72758653..e8ba711f 100644 --- a/src/ui/MxcAnimatedImage.cpp +++ b/src/ui/MxcAnimatedImage.cpp @@ -39,8 +39,7 @@ MxcAnimatedImage::startDownload() if (!animatable_) return; - QString mxcUrl = QString::fromStdString(mtx::accessors::url(*event)); - QString originalFilename = QString::fromStdString(mtx::accessors::filename(*event)); + QString mxcUrl = QString::fromStdString(mtx::accessors::url(*event)); auto encryptionInfo = mtx::accessors::file(*event); @@ -53,10 +52,9 @@ MxcAnimatedImage::startDownload() const auto url = mxcUrl.toStdString(); const auto name = QString(mxcUrl).remove("mxc://"); - QFileInfo filename(QString("%1/media_cache/media/%2.%3") - .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) - .arg(name) - .arg(suffix)); + QFileInfo filename( + QStringLiteral("%1/media_cache/media/%2.%3") + .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation), name, suffix)); if (QDir::cleanPath(name) != name) { nhlog::net()->warn("mxcUrl '{}' is not safe, not downloading file", url); return; diff --git a/src/ui/MxcMediaProxy.cpp b/src/ui/MxcMediaProxy.cpp index a93d0fc0..4fe9eef8 100644 --- a/src/ui/MxcMediaProxy.cpp +++ b/src/ui/MxcMediaProxy.cpp @@ -49,9 +49,12 @@ MxcMediaProxy::MxcMediaProxy(QObject *parent) void MxcMediaProxy::setVideoSurface(QAbstractVideoSurface *surface) { - qDebug() << "Changing surface"; - m_surface = surface; - setVideoOutput(m_surface); + if (surface != m_surface) { + qDebug() << "Changing surface"; + m_surface = surface; + setVideoOutput(m_surface); + emit videoSurfaceChanged(); + } } QAbstractVideoSurface * @@ -84,9 +87,8 @@ MxcMediaProxy::startDownload() return; } - QString mxcUrl = QString::fromStdString(mtx::accessors::url(*event)); - QString originalFilename = QString::fromStdString(mtx::accessors::filename(*event)); - QString mimeType = QString::fromStdString(mtx::accessors::mimetype(*event)); + QString mxcUrl = QString::fromStdString(mtx::accessors::url(*event)); + QString mimeType = QString::fromStdString(mtx::accessors::mimetype(*event)); auto encryptionInfo = mtx::accessors::file(*event); @@ -99,10 +101,9 @@ MxcMediaProxy::startDownload() const auto url = mxcUrl.toStdString(); const auto name = QString(mxcUrl).remove("mxc://"); - QFileInfo filename(QString("%1/media_cache/media/%2.%3") - .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) - .arg(name) - .arg(suffix)); + QFileInfo filename( + QString("%1/media_cache/media/%2.%3") + .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation), name, suffix)); if (QDir::cleanPath(name) != name) { nhlog::net()->warn("mxcUrl '{}' is not safe, not downloading file", url); return; diff --git a/src/ui/MxcMediaProxy.h b/src/ui/MxcMediaProxy.h index e33fc105..84205cc4 100644 --- a/src/ui/MxcMediaProxy.h +++ b/src/ui/MxcMediaProxy.h @@ -23,7 +23,8 @@ class MxcMediaProxy : public QMediaPlayer Q_OBJECT Q_PROPERTY(TimelineModel *roomm READ room WRITE setRoom NOTIFY roomChanged REQUIRED) Q_PROPERTY(QString eventId READ eventId WRITE setEventId NOTIFY eventIdChanged) - Q_PROPERTY(QAbstractVideoSurface *videoSurface READ getVideoSurface WRITE setVideoSurface) + Q_PROPERTY(QAbstractVideoSurface *videoSurface READ getVideoSurface WRITE setVideoSurface NOTIFY + videoSurfaceChanged) Q_PROPERTY(bool loaded READ loaded NOTIFY loadedChanged) Q_PROPERTY(int orientation READ orientation NOTIFY orientationChanged) @@ -55,6 +56,7 @@ signals: void newBuffer(QMediaContent, QIODevice *buf); void orientationChanged(); + void videoSurfaceChanged(); private slots: void startDownload(); diff --git a/src/ui/Ripple.cpp b/src/ui/Ripple.cpp index 72cf2da2..1da0151a 100644 --- a/src/ui/Ripple.cpp +++ b/src/ui/Ripple.cpp @@ -39,6 +39,8 @@ Ripple::setRadius(qreal radius) radius_ = radius; overlay_->update(); + + emit radiusChanged(); } void @@ -51,6 +53,8 @@ Ripple::setOpacity(qreal opacity) opacity_ = opacity; overlay_->update(); + + emit opacityChanged(); } void diff --git a/src/ui/Ripple.h b/src/ui/Ripple.h index df09caba..f74f3f75 100644 --- a/src/ui/Ripple.h +++ b/src/ui/Ripple.h @@ -16,8 +16,8 @@ class Ripple : public QParallelAnimationGroup { Q_OBJECT - Q_PROPERTY(qreal radius WRITE setRadius READ radius) - Q_PROPERTY(qreal opacity WRITE setOpacity READ opacity) + Q_PROPERTY(qreal radius WRITE setRadius READ radius NOTIFY radiusChanged) + Q_PROPERTY(qreal opacity WRITE setOpacity READ opacity NOTIFY opacityChanged) public: explicit Ripple(const QPoint ¢er, QObject *parent = nullptr); @@ -48,6 +48,10 @@ public: protected slots: void destroy(); +signals: + void radiusChanged(); + void opacityChanged(); + private: Q_DISABLE_COPY(Ripple) diff --git a/src/ui/SnackBar.h b/src/ui/SnackBar.h index 0459950f..03870b29 100644 --- a/src/ui/SnackBar.h +++ b/src/ui/SnackBar.h @@ -22,8 +22,9 @@ class SnackBar : public OverlayWidget { Q_OBJECT - Q_PROPERTY(QColor bgColor READ backgroundColor WRITE setBackgroundColor) - Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor) + Q_PROPERTY( + QColor bgColor READ backgroundColor WRITE setBackgroundColor NOTIFY backgroundColorChanged) + Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor NOTIFY textColorChanged) Q_PROPERTY(double offset READ offset WRITE setOffset NOTIFY offsetChanged) public: @@ -34,6 +35,7 @@ public: { bgColor_ = color; update(); + emit backgroundColorChanged(); } QColor textColor() const { return textColor_; } @@ -41,6 +43,7 @@ public: { textColor_ = color; update(); + emit textColorChanged(); } void setPosition(SnackBarPosition pos) { @@ -62,6 +65,8 @@ public slots: signals: void offsetChanged(); + void backgroundColorChanged(); + void textColorChanged(); protected: void paintEvent(QPaintEvent *event) override; diff --git a/src/ui/TextField.cpp b/src/ui/TextField.cpp index 8f1a6aa5..dd4d655d 100644 --- a/src/ui/TextField.cpp +++ b/src/ui/TextField.cpp @@ -40,6 +40,7 @@ void TextField::setBackgroundColor(const QColor &color) { background_color_ = color; + emit backgroundColorChanged(); } QColor @@ -130,6 +131,7 @@ void TextField::setLabelColor(const QColor &color) { label_color_ = color; + emit labelColorChanged(); update(); } @@ -147,6 +149,7 @@ void TextField::setInkColor(const QColor &color) { ink_color_ = color; + emit inkColorChanged(); update(); } @@ -164,6 +167,7 @@ void TextField::setUnderlineColor(const QColor &color) { underline_color_ = color; + emit underlineColorChanged(); update(); } diff --git a/src/ui/TextField.h b/src/ui/TextField.h index 47257019..e226c84b 100644 --- a/src/ui/TextField.h +++ b/src/ui/TextField.h @@ -20,10 +20,12 @@ class TextField : public QLineEdit { Q_OBJECT - Q_PROPERTY(QColor inkColor WRITE setInkColor READ inkColor) - Q_PROPERTY(QColor labelColor WRITE setLabelColor READ labelColor) - Q_PROPERTY(QColor underlineColor WRITE setUnderlineColor READ underlineColor) - Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor) + Q_PROPERTY(QColor inkColor WRITE setInkColor READ inkColor NOTIFY inkColorChanged) + Q_PROPERTY(QColor labelColor WRITE setLabelColor READ labelColor NOTIFY labelColorChanged) + Q_PROPERTY(QColor underlineColor WRITE setUnderlineColor READ underlineColor NOTIFY + underlineColorChanged) + Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor NOTIFY + backgroundColorChanged) public: explicit TextField(QWidget *parent = nullptr); @@ -51,6 +53,12 @@ protected: bool event(QEvent *event) override; void paintEvent(QPaintEvent *event) override; +signals: + void inkColorChanged(); + void labelColorChanged(); + void underlineColorChanged(); + void backgroundColorChanged(); + private: void init(); @@ -71,9 +79,9 @@ class TextFieldLabel : public QWidget { Q_OBJECT - Q_PROPERTY(qreal scale WRITE setScale READ scale) - Q_PROPERTY(QPointF offset WRITE setOffset READ offset) - Q_PROPERTY(QColor color WRITE setColor READ color) + Q_PROPERTY(qreal scale WRITE setScale READ scale NOTIFY scaleChanged) + Q_PROPERTY(QPointF offset WRITE setOffset READ offset NOTIFY offsetChanged) + Q_PROPERTY(QColor color WRITE setColor READ color NOTIFY colorChanged) public: TextFieldLabel(TextField *parent); @@ -89,6 +97,11 @@ public: protected: void paintEvent(QPaintEvent *event) override; +signals: + void scaleChanged(); + void offsetChanged(); + void colorChanged(); + private: TextField *const text_field_; @@ -102,6 +115,7 @@ inline void TextFieldLabel::setColor(const QColor &color) { color_ = color; + emit colorChanged(); update(); } @@ -110,6 +124,7 @@ TextFieldLabel::setOffset(const QPointF &pos) { x_ = pos.x(); y_ = pos.y(); + emit offsetChanged(); update(); } @@ -117,6 +132,7 @@ inline void TextFieldLabel::setScale(qreal scale) { scale_ = scale; + emit scaleChanged(); update(); } @@ -140,7 +156,7 @@ class TextFieldStateMachine : public QStateMachine { Q_OBJECT - Q_PROPERTY(qreal progress WRITE setProgress READ progress) + Q_PROPERTY(qreal progress WRITE setProgress READ progress NOTIFY progressChanged) public: TextFieldStateMachine(TextField *parent); @@ -153,6 +169,9 @@ public: public slots: void setupProperties(); +signals: + void progressChanged(); + private: QPropertyAnimation *color_anim_; QPropertyAnimation *offset_anim_; @@ -170,6 +189,7 @@ inline void TextFieldStateMachine::setProgress(qreal progress) { progress_ = progress; + emit progressChanged(); text_field_->update(); } diff --git a/src/ui/Theme.cpp b/src/ui/Theme.cpp index d7c92fb8..318f93c1 100644 --- a/src/ui/Theme.cpp +++ b/src/ui/Theme.cpp @@ -13,41 +13,41 @@ Theme::paletteFromTheme(std::string_view theme) static QPalette original; if (theme == "light") { QPalette lightActive( - /*windowText*/ QColor("#333"), - /*button*/ QColor("white"), + /*windowText*/ QColor(0x33, 0x33, 0x33), + /*button*/ QColor(Qt::GlobalColor::white), /*light*/ QColor(0xef, 0xef, 0xef), /*dark*/ QColor(70, 77, 93), /*mid*/ QColor(220, 220, 220), - /*text*/ QColor("#333"), - /*bright_text*/ QColor("#f2f5f8"), - /*base*/ QColor("#fff"), - /*window*/ QColor("white")); - lightActive.setColor(QPalette::AlternateBase, QColor("#eee")); - lightActive.setColor(QPalette::Highlight, QColor("#38a3d8")); - lightActive.setColor(QPalette::HighlightedText, QColor("#f4f4f5")); + /*text*/ QColor(0x33, 0x33, 0x33), + /*bright_text*/ QColor(0xf2, 0xf5, 0xf8), + /*base*/ QColor(Qt::GlobalColor::white), + /*window*/ QColor(Qt::GlobalColor::white)); + lightActive.setColor(QPalette::AlternateBase, QColor(0xee, 0xee, 0xee)); + lightActive.setColor(QPalette::Highlight, QColor(0x38, 0xa3, 0xd8)); + lightActive.setColor(QPalette::HighlightedText, QColor(0xf4, 0xf4, 0xf5)); 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")); + lightActive.setColor(QPalette::Link, QColor(0x00, 0x77, 0xb5)); + lightActive.setColor(QPalette::ButtonText, QColor(0x55, 0x54, 0x59)); return lightActive; } else if (theme == "dark") { QPalette darkActive( - /*windowText*/ QColor("#caccd1"), - /*button*/ QColor(0xff, 0xff, 0xff), - /*light*/ QColor("#caccd1"), + /*windowText*/ QColor(0xca, 0xcc, 0xd1), + /*button*/ QColor(Qt::GlobalColor::white), + /*light*/ QColor(0xca, 0xcc, 0xd1), /*dark*/ QColor(60, 70, 77), - /*mid*/ QColor("#202228"), - /*text*/ QColor("#caccd1"), - /*bright_text*/ QColor("#f4f5f8"), - /*base*/ QColor("#202228"), - /*window*/ QColor("#2d3139")); - darkActive.setColor(QPalette::AlternateBase, QColor("#2d3139")); - darkActive.setColor(QPalette::Highlight, QColor("#38a3d8")); - darkActive.setColor(QPalette::HighlightedText, QColor("#f4f5f8")); + /*mid*/ QColor(0x20, 0x22, 0x28), + /*text*/ QColor(0xca, 0xcc, 0xd1), + /*bright_text*/ QColor(0xf4, 0xf5, 0xf8), + /*base*/ QColor(0x20, 0x22, 0x28), + /*window*/ QColor(0x2d, 0x31, 0x39)); + darkActive.setColor(QPalette::AlternateBase, QColor(0x2d, 0x31, 0x39)); + darkActive.setColor(QPalette::Highlight, QColor(0x38, 0xa3, 0xd8)); + darkActive.setColor(QPalette::HighlightedText, QColor(0xf4, 0xf5, 0xf8)); darkActive.setColor(QPalette::ToolTipBase, darkActive.base().color()); darkActive.setColor(QPalette::ToolTipText, darkActive.text().color()); - darkActive.setColor(QPalette::Link, QColor("#38a3d8")); - darkActive.setColor(QPalette::ButtonText, "#828284"); + darkActive.setColor(QPalette::Link, QColor(0x38, 0xa3, 0xd8)); + darkActive.setColor(QPalette::ButtonText, QColor(0x82, 0x82, 0x84)); return darkActive; } else { return original; @@ -59,19 +59,19 @@ Theme::Theme(std::string_view theme) auto p = paletteFromTheme(theme); separator_ = p.mid().color(); if (theme == "light") { - sidebarBackground_ = QColor("#233649"); - alternateButton_ = QColor("#ccc"); - red_ = QColor("#a82353"); - orange_ = QColor("#fcbe05"); + sidebarBackground_ = QColor(0x23, 0x36, 0x49); + alternateButton_ = QColor(0xcc, 0xcc, 0xcc); + red_ = QColor(0xa8, 0x23, 0x53); + orange_ = QColor(0xfc, 0xbe, 0x05); } else if (theme == "dark") { - sidebarBackground_ = QColor("#2d3139"); - alternateButton_ = QColor("#414A59"); - red_ = QColor("#a82353"); - orange_ = QColor("#fcc53a"); + sidebarBackground_ = QColor(0x2d, 0x31, 0x39); + alternateButton_ = QColor(0x41, 0x4A, 0x59); + red_ = QColor(0xa8, 0x23, 0x53); + orange_ = QColor(0xfc, 0xc5, 0x3a); } else { sidebarBackground_ = p.window().color(); alternateButton_ = p.dark().color(); - red_ = QColor("red"); - orange_ = QColor("orange"); + red_ = QColor(Qt::GlobalColor::red); + orange_ = QColor(0xff, 0xa5, 0x00); // SVG orange } } diff --git a/src/ui/ThemeManager.cpp b/src/ui/ThemeManager.cpp index 05c73aa7..58525e4c 100644 --- a/src/ui/ThemeManager.cpp +++ b/src/ui/ThemeManager.cpp @@ -10,28 +10,28 @@ QColor ThemeManager::themeColor(const QString &key) const { if (key == "Black") - return QColor("#171919"); + return QColor(0x17, 0x19, 0x19); else if (key == "BrightWhite") - return QColor("#EBEBEB"); + return QColor(0xEB, 0xEB, 0xEB); else if (key == "FadedWhite") - return QColor("#C9C9C9"); + return QColor(0xC9, 0xC9, 0xC9); else if (key == "MediumWhite") - return QColor("#929292"); + return QColor(0x92, 0x92, 0x92); else if (key == "BrightGreen") - return QColor("#1C3133"); + return QColor(0x1C, 0x31, 0x33); else if (key == "DarkGreen") - return QColor("#577275"); + return QColor(0x57, 0x72, 0x75); else if (key == "LightGreen") - return QColor("#46A451"); + return QColor(0x46, 0xA4, 0x51); else if (key == "Gray") - return QColor("#5D6565"); + return QColor(0x5D, 0x65, 0x65); else if (key == "Red") - return QColor("#E22826"); + return QColor(0xE2, 0x28, 0x26); else if (key == "Blue") - return QColor("#81B3A9"); + return QColor(0x81, 0xB3, 0xA9); else if (key == "Transparent") return QColor(0, 0, 0, 0); diff --git a/src/ui/ToggleButton.cpp b/src/ui/ToggleButton.cpp index 04f752d7..f5dbf021 100644 --- a/src/ui/ToggleButton.cpp +++ b/src/ui/ToggleButton.cpp @@ -69,6 +69,7 @@ Toggle::setDisabledColor(const QColor &color) { disabledColor_ = color; setupProperties(); + emit disabledColorChanged(); } void @@ -76,6 +77,7 @@ Toggle::setActiveColor(const QColor &color) { activeColor_ = color; setupProperties(); + emit activeColorChanged(); } void @@ -83,6 +85,7 @@ Toggle::setInactiveColor(const QColor &color) { inactiveColor_ = color; setupProperties(); + emit inactiveColorChanged(); } void @@ -90,6 +93,7 @@ Toggle::setTrackColor(const QColor &color) { trackColor_ = color; setupProperties(); + emit trackColorChanged(); } ToggleThumb::ToggleThumb(Toggle *parent) @@ -174,6 +178,7 @@ void ToggleTrack::setTrackColor(const QColor &color) { trackColor_ = color; + emit trackColorChanged(); update(); } diff --git a/src/ui/ToggleButton.h b/src/ui/ToggleButton.h index 15d5e192..99433463 100644 --- a/src/ui/ToggleButton.h +++ b/src/ui/ToggleButton.h @@ -20,10 +20,12 @@ class Toggle : public QAbstractButton { Q_OBJECT - Q_PROPERTY(QColor activeColor WRITE setActiveColor READ activeColor) - Q_PROPERTY(QColor disabledColor WRITE setDisabledColor READ disabledColor) - Q_PROPERTY(QColor inactiveColor WRITE setInactiveColor READ inactiveColor) - Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor) + Q_PROPERTY(QColor activeColor WRITE setActiveColor READ activeColor NOTIFY activeColorChanged) + Q_PROPERTY( + QColor disabledColor WRITE setDisabledColor READ disabledColor NOTIFY disabledColorChanged) + Q_PROPERTY( + QColor inactiveColor WRITE setInactiveColor READ inactiveColor NOTIFY inactiveColorChanged) + Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor NOTIFY trackColorChanged) public: Toggle(QWidget *parent = nullptr); @@ -38,13 +40,22 @@ public: QColor activeColor() const { return activeColor_; }; QColor disabledColor() const { return disabledColor_; }; QColor inactiveColor() const { return inactiveColor_; }; - QColor trackColor() const { return trackColor_.isValid() ? trackColor_ : QColor("#eee"); }; + QColor trackColor() const + { + return trackColor_.isValid() ? trackColor_ : QColor(0xee, 0xee, 0xee); + }; QSize sizeHint() const override { return QSize(64, 48); }; protected: void paintEvent(QPaintEvent *event) override; +signals: + void activeColorChanged(); + void disabledColorChanged(); + void inactiveColorChanged(); + void trackColorChanged(); + private: void init(); void setupProperties(); @@ -62,7 +73,7 @@ class ToggleThumb : public QWidget { Q_OBJECT - Q_PROPERTY(QColor thumbColor WRITE setThumbColor READ thumbColor) + Q_PROPERTY(QColor thumbColor WRITE setThumbColor READ thumbColor NOTIFY thumbColorChanged) public: ToggleThumb(Toggle *parent); @@ -75,6 +86,7 @@ public: void setThumbColor(const QColor &color) { thumbColor_ = color; + emit thumbColorChanged(); update(); }; @@ -82,6 +94,9 @@ protected: bool eventFilter(QObject *obj, QEvent *event) override; void paintEvent(QPaintEvent *event) override; +signals: + void thumbColorChanged(); + private: void updateOffset(); @@ -96,7 +111,7 @@ class ToggleTrack : public QWidget { Q_OBJECT - Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor) + Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor NOTIFY trackColor) public: ToggleTrack(Toggle *parent); @@ -108,6 +123,9 @@ protected: bool eventFilter(QObject *obj, QEvent *event) override; void paintEvent(QPaintEvent *event) override; +signals: + void trackColorChanged(); + private: Toggle *const toggle_; QColor trackColor_; diff --git a/src/ui/UserProfile.cpp b/src/ui/UserProfile.cpp index 72b1d8e6..6179ba01 100644 --- a/src/ui/UserProfile.cpp +++ b/src/ui/UserProfile.cpp @@ -175,8 +175,6 @@ UserProfile::refreshDevices() void UserProfile::fetchDeviceList(const QString &userID) { - auto localUser = utils::localUser(); - if (!cache::client() || !cache::client()->isDatabaseReady()) return; diff --git a/src/voip/CallManager.cpp b/src/voip/CallManager.cpp index 0f701b0d..b8dbbe4c 100644 --- a/src/voip/CallManager.cpp +++ b/src/voip/CallManager.cpp @@ -143,6 +143,7 @@ CallManager::CallManager(QObject *parent) connect(&player_, QOverload::of(&QMediaPlayer::error), + this, [this](QMediaPlayer::Error error) { stopRingtone(); switch (error) {