Fix more warnings and remove dead code

This commit is contained in:
Nicolas Werner 2021-12-28 22:30:12 +01:00
parent 409ff22d80
commit bb290f9fec
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9
50 changed files with 276 additions and 695 deletions

View file

@ -311,7 +311,6 @@ set(SRC_FILES
src/dialogs/CreateRoom.cpp src/dialogs/CreateRoom.cpp
src/dialogs/FallbackAuth.cpp src/dialogs/FallbackAuth.cpp
src/dialogs/ImageOverlay.cpp src/dialogs/ImageOverlay.cpp
src/dialogs/Logout.cpp
src/dialogs/PreviewUploadOverlay.cpp src/dialogs/PreviewUploadOverlay.cpp
src/dialogs/ReCaptcha.cpp src/dialogs/ReCaptcha.cpp
@ -332,10 +331,8 @@ set(SRC_FILES
src/timeline/RoomlistModel.cpp src/timeline/RoomlistModel.cpp
# UI components # UI components
src/ui/Badge.cpp
src/ui/DropShadow.cpp src/ui/DropShadow.cpp
src/ui/FlatButton.cpp src/ui/FlatButton.cpp
src/ui/InfoMessage.cpp
src/ui/Label.cpp src/ui/Label.cpp
src/ui/LoadingIndicator.cpp src/ui/LoadingIndicator.cpp
src/ui/MxcAnimatedImage.cpp src/ui/MxcAnimatedImage.cpp
@ -522,7 +519,6 @@ qt5_wrap_cpp(MOC_HEADERS
src/dialogs/CreateRoom.h src/dialogs/CreateRoom.h
src/dialogs/FallbackAuth.h src/dialogs/FallbackAuth.h
src/dialogs/ImageOverlay.h src/dialogs/ImageOverlay.h
src/dialogs/Logout.h
src/dialogs/PreviewUploadOverlay.h src/dialogs/PreviewUploadOverlay.h
src/dialogs/ReCaptcha.h src/dialogs/ReCaptcha.h
@ -542,9 +538,7 @@ qt5_wrap_cpp(MOC_HEADERS
src/timeline/RoomlistModel.h src/timeline/RoomlistModel.h
# UI components # UI components
src/ui/Badge.h
src/ui/FlatButton.h src/ui/FlatButton.h
src/ui/InfoMessage.h
src/ui/Label.h src/ui/Label.h
src/ui/LoadingIndicator.h src/ui/LoadingIndicator.h
src/ui/MxcAnimatedImage.h src/ui/MxcAnimatedImage.h

View file

@ -62,6 +62,7 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
topLayout_ = new QHBoxLayout(this); topLayout_ = new QHBoxLayout(this);
topLayout_->setSpacing(0); topLayout_->setSpacing(0);
topLayout_->setContentsMargins(0, 0, 0, 0);
view_manager_ = new TimelineViewManager(callManager_, this); view_manager_ = new TimelineViewManager(callManager_, this);
@ -777,8 +778,7 @@ ChatPage::inviteUser(QString userid, QString reason)
if (QMessageBox::question(this, if (QMessageBox::question(this,
tr("Confirm invite"), tr("Confirm invite"),
tr("Do you really want to invite %1 (%2)?") tr("Do you really want to invite %1 (%2)?")
.arg(cache::displayName(room, userid)) .arg(cache::displayName(room, userid), userid)) != QMessageBox::Yes)
.arg(userid)) != QMessageBox::Yes)
return; return;
http::client()->invite_user( http::client()->invite_user(
@ -786,10 +786,9 @@ ChatPage::inviteUser(QString userid, QString reason)
userid.toStdString(), userid.toStdString(),
[this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) { [this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) {
if (err) { if (err) {
emit showNotification(tr("Failed to invite %1 to %2: %3") emit showNotification(
.arg(userid) tr("Failed to invite %1 to %2: %3")
.arg(room) .arg(userid, room, QString::fromStdString(err->matrix_error.error)));
.arg(QString::fromStdString(err->matrix_error.error)));
} else } else
emit showNotification(tr("Invited user: %1").arg(userid)); emit showNotification(tr("Invited user: %1").arg(userid));
}, },
@ -803,8 +802,7 @@ ChatPage::kickUser(QString userid, QString reason)
if (QMessageBox::question(this, if (QMessageBox::question(this,
tr("Confirm kick"), tr("Confirm kick"),
tr("Do you really want to kick %1 (%2)?") tr("Do you really want to kick %1 (%2)?")
.arg(cache::displayName(room, userid)) .arg(cache::displayName(room, userid), userid)) != QMessageBox::Yes)
.arg(userid)) != QMessageBox::Yes)
return; return;
http::client()->kick_user( http::client()->kick_user(
@ -812,10 +810,9 @@ ChatPage::kickUser(QString userid, QString reason)
userid.toStdString(), userid.toStdString(),
[this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) { [this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) {
if (err) { if (err) {
emit showNotification(tr("Failed to kick %1 from %2: %3") emit showNotification(
.arg(userid) tr("Failed to kick %1 from %2: %3")
.arg(room) .arg(userid, room, QString::fromStdString(err->matrix_error.error)));
.arg(QString::fromStdString(err->matrix_error.error)));
} else } else
emit showNotification(tr("Kicked user: %1").arg(userid)); emit showNotification(tr("Kicked user: %1").arg(userid));
}, },
@ -826,11 +823,11 @@ ChatPage::banUser(QString userid, QString reason)
{ {
auto room = currentRoom(); auto room = currentRoom();
if (QMessageBox::question(this, if (QMessageBox::question(
this,
tr("Confirm ban"), tr("Confirm ban"),
tr("Do you really want to ban %1 (%2)?") tr("Do you really want to ban %1 (%2)?").arg(cache::displayName(room, userid), userid)) !=
.arg(cache::displayName(room, userid)) QMessageBox::Yes)
.arg(userid)) != QMessageBox::Yes)
return; return;
http::client()->ban_user( http::client()->ban_user(
@ -838,10 +835,9 @@ ChatPage::banUser(QString userid, QString reason)
userid.toStdString(), userid.toStdString(),
[this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) { [this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) {
if (err) { if (err) {
emit showNotification(tr("Failed to ban %1 in %2: %3") emit showNotification(
.arg(userid) tr("Failed to ban %1 in %2: %3")
.arg(room) .arg(userid, room, QString::fromStdString(err->matrix_error.error)));
.arg(QString::fromStdString(err->matrix_error.error)));
} else } else
emit showNotification(tr("Banned user: %1").arg(userid)); emit showNotification(tr("Banned user: %1").arg(userid));
}, },
@ -855,8 +851,7 @@ ChatPage::unbanUser(QString userid, QString reason)
if (QMessageBox::question(this, if (QMessageBox::question(this,
tr("Confirm unban"), tr("Confirm unban"),
tr("Do you really want to unban %1 (%2)?") tr("Do you really want to unban %1 (%2)?")
.arg(cache::displayName(room, userid)) .arg(cache::displayName(room, userid), userid)) != QMessageBox::Yes)
.arg(userid)) != QMessageBox::Yes)
return; return;
http::client()->unban_user( http::client()->unban_user(
@ -864,10 +859,9 @@ ChatPage::unbanUser(QString userid, QString reason)
userid.toStdString(), userid.toStdString(),
[this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) { [this, userid, room](const mtx::responses::Empty &, mtx::http::RequestErr err) {
if (err) { if (err) {
emit showNotification(tr("Failed to unban %1 in %2: %3") emit showNotification(
.arg(userid) tr("Failed to unban %1 in %2: %3")
.arg(room) .arg(userid, room, QString::fromStdString(err->matrix_error.error)));
.arg(QString::fromStdString(err->matrix_error.error)));
} else } else
emit showNotification(tr("Unbanned user: %1").arg(userid)); emit showNotification(tr("Unbanned user: %1").arg(userid));
}, },
@ -1201,7 +1195,7 @@ ChatPage::startChat(QString userid)
auto joined_rooms = cache::joinedRooms(); auto joined_rooms = cache::joinedRooms();
auto room_infos = cache::getRoomInfo(joined_rooms); 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) { if (room_infos[QString::fromStdString(room_id)].member_count == 2) {
auto room_members = cache::roomMembers(room_id); auto room_members = cache::roomMembers(room_id);
if (std::find(room_members.begin(), room_members.end(), (userid).toStdString()) != if (std::find(room_members.begin(), room_members.end(), (userid).toStdString()) !=
@ -1323,8 +1317,9 @@ ChatPage::handleMatrixUri(QString uri)
std::vector<std::string> vias; std::vector<std::string> vias;
QString action; QString action;
for (QString item : auto items =
uri_.query(QUrl::ComponentFormattingOption::FullyEncoded).split('&', Qt::SkipEmptyParts)) { uri_.query(QUrl::ComponentFormattingOption::FullyEncoded).split('&', Qt::SkipEmptyParts);
for (QString item : qAsConst(items)) {
nhlog::ui()->info("item: {}", item.toStdString()); nhlog::ui()->info("item: {}", item.toStdString());
if (item.startsWith("action=")) { if (item.startsWith("action=")) {
@ -1350,7 +1345,7 @@ ChatPage::handleMatrixUri(QString uri)
auto joined_rooms = cache::joinedRooms(); auto joined_rooms = cache::joinedRooms();
auto targetRoomId = mxid1.toStdString(); auto targetRoomId = mxid1.toStdString();
for (auto roomid : joined_rooms) { for (const auto &roomid : joined_rooms) {
if (roomid == targetRoomId) { if (roomid == targetRoomId) {
view_manager_->rooms()->setCurrentRoom(mxid1); view_manager_->rooms()->setCurrentRoom(mxid1);
if (!mxid2.isEmpty()) if (!mxid2.isEmpty())
@ -1368,7 +1363,7 @@ ChatPage::handleMatrixUri(QString uri)
auto joined_rooms = cache::joinedRooms(); auto joined_rooms = cache::joinedRooms();
auto targetRoomAlias = mxid1.toStdString(); auto targetRoomAlias = mxid1.toStdString();
for (auto roomid : joined_rooms) { for (const auto &roomid : joined_rooms) {
auto aliases = cache::client()->getRoomAliases(roomid); auto aliases = cache::client()->getRoomAliases(roomid);
if (aliases) { if (aliases) {
if (aliases->alias == targetRoomAlias) { if (aliases->alias == targetRoomAlias) {

View file

@ -48,8 +48,8 @@ CompletionProxyModel::CompletionProxyModel(QAbstractItemModel *model,
.toString() .toString()
.toLower(); .toLower();
for (const auto &e : QStringView(string1).split(splitPoints)) { auto split1 = QStringView(string1).split(splitPoints, Qt::SkipEmptyParts);
if (!e.isEmpty()) // NOTE(Nico): Use Qt::SkipEmptyParts in Qt 5.14 for (const auto &e : qAsConst(split1)) {
trie_.insert(e.toUcs4(), i); trie_.insert(e.toUcs4(), i);
} }
@ -59,8 +59,8 @@ CompletionProxyModel::CompletionProxyModel(QAbstractItemModel *model,
.toLower(); .toLower();
if (!string2.isEmpty()) { if (!string2.isEmpty()) {
for (const auto &e : QStringView(string2).split(splitPoints)) { auto split2 = QStringView(string2).split(splitPoints, Qt::SkipEmptyParts);
if (!e.isEmpty()) // NOTE(Nico): Use Qt::SkipEmptyParts in Qt 5.14 for (const auto &e : qAsConst(split2)) {
trie_.insert(e.toUcs4(), i); trie_.insert(e.toUcs4(), i);
} }
} }

View file

@ -7,10 +7,11 @@
#include <QRegularExpression> #include <QRegularExpression>
#include <QString> #include <QString>
// clazy:excludeall=non-pod-global-static
// Non-theme app configuration. Layouts, fonts spacing etc. // Non-theme app configuration. Layouts, fonts spacing etc.
// //
// Font sizes are in pixels. // Font sizes are in pixels.
namespace conf { namespace conf {
// Global settings. // Global settings.
constexpr int fontSize = 14; constexpr int fontSize = 14;
@ -54,16 +55,18 @@ constexpr auto LABEL_BIG_SIZE_RATIO = 2;
} }
namespace strings { namespace strings {
const QString url_html = "<a href=\"\\1\">\\1</a>"; const QString url_html = QStringLiteral("<a href=\"\\1\">\\1</a>");
const QRegularExpression url_regex( const QRegularExpression url_regex(
// match an URL, that is not quoted, i.e. // match an URL, that is not quoted, i.e.
// vvvvvv match quote via negative lookahead/lookbehind vv // vvvvvv match quote via negative lookahead/lookbehind vv
// vvvv atomic match url -> fail if there is a " before or after vvv // 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. // match any markdown matrix.to link. Capture group 1 is the link name, group 2 is the target.
static const QRegularExpression static const QRegularExpression matrixToMarkdownLink(
matrixToMarkdownLink(R"(\[(.*?)(?<!\\)\]\((https://matrix.to/#/.*?\)))"); R"(\[(.*?)(?<!\\)\]\((https://matrix.to/#/.*?\)))"); // clazy:exclude=non-pod-global-static
static const QRegularExpression matrixToLink(R"(<a href=\"(https://matrix.to/#/.*?)\">(.*?)</a>)"); static const QRegularExpression matrixToLink(
R"(<a href=\"(https://matrix.to/#/.*?)\">(.*?)</a>)"); // clazy:exclude=non-pod-global-static
} }
// Window geometry. // Window geometry.

View file

@ -16,7 +16,7 @@ InviteesModel::InviteesModel(QObject *parent)
void void
InviteesModel::addUser(QString mxid) InviteesModel::addUser(QString mxid)
{ {
for (const auto &invitee : invitees_) for (const auto &invitee : qAsConst(invitees_))
if (invitee->mxid_ == mxid) if (invitee->mxid_ == mxid)
return; return;

View file

@ -5,7 +5,6 @@
#include "JdenticonProvider.h" #include "JdenticonProvider.h"
#include <QApplication> #include <QApplication>
#include <QDir>
#include <QPainter> #include <QPainter>
#include <QPainterPath> #include <QPainterPath>
#include <QPluginLoader> #include <QPluginLoader>
@ -27,8 +26,6 @@ getJdenticonInterface()
static bool interfaceExists{true}; static bool interfaceExists{true};
if (interface == nullptr && interfaceExists) { if (interface == nullptr && interfaceExists) {
QDir pluginsDir(qApp->applicationDirPath());
QPluginLoader pluginLoader("qtjdenticon"); QPluginLoader pluginLoader("qtjdenticon");
QObject *plugin = pluginLoader.instance(); QObject *plugin = pluginLoader.instance();
if (plugin) { if (plugin) {

View file

@ -79,7 +79,7 @@ public slots:
auto query = id.mid(queryStart + 1); auto query = id.mid(queryStart + 1);
auto queryBits = query.splitRef('&'); auto queryBits = query.splitRef('&');
for (auto b : queryBits) { for (const auto &b : queryBits) {
if (b.startsWith(QStringView(u"radius="))) { if (b.startsWith(QStringView(u"radius="))) {
radius = b.mid(7).toDouble(); radius = b.mid(7).toDouble();
} }

View file

@ -40,6 +40,7 @@ LoginPage::LoginPage(QWidget *parent)
top_bar_layout_ = new QHBoxLayout(); top_bar_layout_ = new QHBoxLayout();
top_bar_layout_->setSpacing(0); top_bar_layout_->setSpacing(0);
top_bar_layout_->setContentsMargins(0, 0, 0, 0);
back_button_ = new FlatButton(this); back_button_ = new FlatButton(this);
back_button_->setMinimumSize(QSize(30, 30)); back_button_->setMinimumSize(QSize(30, 30));

View file

@ -203,7 +203,7 @@ MainWindow::removeOverlayProgressBar()
QTimer *timer = new QTimer(this); QTimer *timer = new QTimer(this);
timer->setSingleShot(true); timer->setSingleShot(true);
connect(timer, &QTimer::timeout, [this, timer]() { connect(timer, &QTimer::timeout, this, [this, timer]() {
timer->deleteLater(); timer->deleteLater();
if (modal_) if (modal_)

View file

@ -37,7 +37,6 @@ struct CreateRoom;
namespace dialogs { namespace dialogs {
class CreateRoom; class CreateRoom;
class InviteUsers; class InviteUsers;
class Logout;
class MemberList; class MemberList;
class ReCaptcha; class ReCaptcha;
} }
@ -60,7 +59,6 @@ public:
void void
openCreateRoomDialog(std::function<void(const mtx::requests::CreateRoom &request)> callback); openCreateRoomDialog(std::function<void(const mtx::requests::CreateRoom &request)> callback);
void openJoinRoomDialog(std::function<void(const QString &room_id)> callback); void openJoinRoomDialog(std::function<void(const QString &room_id)> callback);
void openLogoutDialog();
void hideOverlay(); void hideOverlay();
void showSolidOverlayModal(QWidget *content, QFlags<Qt::AlignmentFlag> flags = Qt::AlignCenter); void showSolidOverlayModal(QWidget *content, QFlags<Qt::AlignmentFlag> flags = Qt::AlignCenter);

View file

@ -61,6 +61,7 @@ RegisterPage::RegisterPage(QWidget *parent)
logo_->setPixmap(logo.pixmap(128)); logo_->setPixmap(logo.pixmap(128));
logo_layout_ = new QHBoxLayout(); logo_layout_ = new QHBoxLayout();
logo_layout_->setContentsMargins(0, 0, 0, 0);
logo_layout_->addWidget(logo_, 0, Qt::AlignHCenter); logo_layout_->addWidget(logo_, 0, Qt::AlignHCenter);
form_wrapper_ = new QHBoxLayout(); form_wrapper_ = new QHBoxLayout();
@ -127,6 +128,7 @@ RegisterPage::RegisterPage(QWidget *parent)
button_layout_ = new QHBoxLayout(); button_layout_ = new QHBoxLayout();
button_layout_->setSpacing(0); button_layout_->setSpacing(0);
button_layout_->setContentsMargins(0, 0, 0, 0);
error_label_ = new QLabel(this); error_label_ = new QLabel(this);
error_label_->setWordWrap(true); error_label_->setWordWrap(true);

View file

@ -771,6 +771,7 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
topBarLayout_ = new QHBoxLayout; topBarLayout_ = new QHBoxLayout;
topBarLayout_->setSpacing(0); topBarLayout_->setSpacing(0);
topBarLayout_->setContentsMargins(0, 0, 0, 0);
topBarLayout_->addWidget(backBtn_, 1, Qt::AlignLeft | Qt::AlignVCenter); topBarLayout_->addWidget(backBtn_, 1, Qt::AlignLeft | Qt::AlignVCenter);
topBarLayout_->addStretch(1); topBarLayout_->addStretch(1);

View file

@ -155,10 +155,9 @@ messageDescription(const QString &username = "",
return QCoreApplication::translate("message-description sent:", "You: %1").arg(body); return QCoreApplication::translate("message-description sent:", "You: %1").arg(body);
else else
return QCoreApplication::translate("message-description sent:", "%1: %2") return QCoreApplication::translate("message-description sent:", "%1: %2")
.arg(username) .arg(username, body);
.arg(body);
} else if (std::is_same<T, Emote>::value) { } else if (std::is_same<T, Emote>::value) {
return QString("* %1 %2").arg(username).arg(body); return QString("* %1 %2").arg(username, body);
} else if (std::is_same<T, Encrypted>::value) { } else if (std::is_same<T, Encrypted>::value) {
if (isLocal) if (isLocal)
return QCoreApplication::translate("message-description sent:", return QCoreApplication::translate("message-description sent:",

View file

@ -85,7 +85,7 @@ CreateRoom::CreateRoom(QWidget *parent)
auto directLabel_ = new QLabel(tr("Direct Chat"), this); auto directLabel_ = new QLabel(tr("Direct Chat"), this);
directToggle_ = new Toggle(this); directToggle_ = new Toggle(this);
directToggle_->setActiveColor(QColor("#38A3D8")); directToggle_->setActiveColor(QColor(0x38, 0xA3, 0xD8));
directToggle_->setInactiveColor(QColor("gray")); directToggle_->setInactiveColor(QColor("gray"));
directToggle_->setState(false); directToggle_->setState(false);
@ -120,6 +120,7 @@ CreateRoom::CreateRoom(QWidget *parent)
connect(visibilityCombo_, connect(visibilityCombo_,
static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentTextChanged), static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentTextChanged),
this,
[this](const QString &text) { [this](const QString &text) {
if (text == "Private") { if (text == "Private") {
request_.visibility = mtx::common::RoomVisibility::Private; request_.visibility = mtx::common::RoomVisibility::Private;
@ -130,6 +131,7 @@ CreateRoom::CreateRoom(QWidget *parent)
connect(presetCombo_, connect(presetCombo_,
static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentTextChanged), static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentTextChanged),
this,
[this](const QString &text) { [this](const QString &text) {
if (text == "Private Chat") { if (text == "Private Chat") {
request_.preset = mtx::requests::Preset::PrivateChat; request_.preset = mtx::requests::Preset::PrivateChat;

View file

@ -32,6 +32,7 @@ FallbackAuth::FallbackAuth(const QString &authType, const QString &session, QWid
auto buttonLayout = new QHBoxLayout(); auto buttonLayout = new QHBoxLayout();
buttonLayout->setSpacing(8); buttonLayout->setSpacing(8);
buttonLayout->setContentsMargins(0, 0, 0, 0);
openBtn_ = new QPushButton(tr("Open Fallback in Browser"), this); openBtn_ = new QPushButton(tr("Open Fallback in Browser"), this);
cancelBtn_ = new QPushButton(tr("Cancel"), this); cancelBtn_ = new QPushButton(tr("Cancel"), this);
@ -58,8 +59,7 @@ FallbackAuth::FallbackAuth(const QString &authType, const QString &session, QWid
"fallback/web?session=%3") "fallback/web?session=%3")
.arg(QString::fromStdString(http::client()->server())) .arg(QString::fromStdString(http::client()->server()))
.arg(http::client()->port()) .arg(http::client()->port())
.arg(session) .arg(session, authType);
.arg(authType);
QDesktopServices::openUrl(url); QDesktopServices::openUrl(url);
}); });

View file

@ -1,56 +0,0 @@
// SPDX-FileCopyrightText: 2017 Konstantinos Sideris <siderisk@auth.gr>
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#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);
}

View file

@ -1,27 +0,0 @@
// SPDX-FileCopyrightText: 2017 Konstantinos Sideris <siderisk@auth.gr>
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QFrame>
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

View file

@ -30,6 +30,7 @@ PreviewUploadOverlay::PreviewUploadOverlay(QWidget *parent)
, cancel_{tr("Cancel"), this} , cancel_{tr("Cancel"), this}
{ {
auto hlayout = new QHBoxLayout; auto hlayout = new QHBoxLayout;
hlayout->setContentsMargins(0, 0, 0, 0);
hlayout->addStretch(1); hlayout->addStretch(1);
hlayout->addWidget(&cancel_); hlayout->addWidget(&cancel_);
hlayout->addWidget(&upload_); hlayout->addWidget(&upload_);
@ -46,7 +47,7 @@ PreviewUploadOverlay::PreviewUploadOverlay(QWidget *parent)
conf::modals::WIDGET_MARGIN); conf::modals::WIDGET_MARGIN);
upload_.setDefault(true); upload_.setDefault(true);
connect(&upload_, &QPushButton::clicked, [this]() { connect(&upload_, &QPushButton::clicked, this, [this]() {
emit confirmUpload(data_, mediaType_, fileName_.text()); emit confirmUpload(data_, mediaType_, fileName_.text());
close(); close();
}); });
@ -124,8 +125,7 @@ PreviewUploadOverlay::setLabels(const QString &type, const QString &mime, uint64
} else { } else {
auto const info = QString{tr("Media type: %1\n" auto const info = QString{tr("Media type: %1\n"
"Media size: %2\n")} "Media size: %2\n")}
.arg(mime) .arg(mime, utils::humanReadableFileSize(upload_size));
.arg(utils::humanReadableFileSize(upload_size));
titleLabel_.setText(QString{tr(DEFAULT)}.arg("file")); titleLabel_.setText(QString{tr(DEFAULT)}.arg("file"));
infoLabel_.setText(info); infoLabel_.setText(info);

View file

@ -31,6 +31,7 @@ ReCaptcha::ReCaptcha(const QString &session, QWidget *parent)
conf::modals::WIDGET_MARGIN); conf::modals::WIDGET_MARGIN);
auto buttonLayout = new QHBoxLayout(); auto buttonLayout = new QHBoxLayout();
buttonLayout->setContentsMargins(0, 0, 0, 0);
buttonLayout->setSpacing(8); buttonLayout->setSpacing(8);
openCaptchaBtn_ = new QPushButton("Open reCAPTCHA", this); openCaptchaBtn_ = new QPushButton("Open reCAPTCHA", this);

View file

@ -273,7 +273,7 @@ handle_olm_message(const OlmMessage &msg, const UserKeyCache &otherUserDeviceKey
} }
bool from_their_device = false; 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 c_key = key.keys.find("curve25519:" + device_id);
auto e_key = key.keys.find("ed25519:" + 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) { if (failed_decryption) {
try { try {
std::map<std::string, std::vector<std::string>> targets; std::map<std::string, std::vector<std::string>> 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) if (key.keys.at("curve25519:" + device_id) == msg.sender_key)
targets[msg.sender].push_back(device_id); targets[msg.sender].push_back(device_id);
} }
@ -1522,7 +1522,7 @@ request_cross_signing_keys()
} }
// timeout after 15 min // 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)) { if (request_id_to_secret_name.count(secretRequest.request_id)) {
request_id_to_secret_name.erase(secretRequest.request_id); request_id_to_secret_name.erase(secretRequest.request_id);
http::client()->send_to_device<mtx::events::msg::SecretRequest>( http::client()->send_to_device<mtx::events::msg::SecretRequest>(

View file

@ -280,7 +280,7 @@ SelfVerificationStatus::invalidate()
cache::client()->markUserKeysOutOfDate({http::client()->user_id().to_string()}); 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(), cache::client()->query_keys(http::client()->user_id().to_string(),
[](const UserKeyCache &, mtx::http::RequestErr) {}); [](const UserKeyCache &, mtx::http::RequestErr) {});
}); });

View file

@ -79,7 +79,7 @@ VerificationManager::verifyUser(QString userid)
auto joined_rooms = cache::joinedRooms(); auto joined_rooms = cache::joinedRooms();
auto room_infos = cache::getRoomInfo(joined_rooms); 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) && if ((room_infos[QString::fromStdString(room_id)].member_count == 2) &&
cache::isRoomEncrypted(room_id)) { cache::isRoomEncrypted(room_id)) {
auto room_members = cache::roomMembers(room_id); auto room_members = cache::roomMembers(room_id);

View file

@ -394,7 +394,7 @@ CommunitiesModel::setCurrentTagId(QString tagId)
{ {
if (tagId.startsWith("tag:")) { if (tagId.startsWith("tag:")) {
auto tag = tagId.mid(4); auto tag = tagId.mid(4);
for (const auto &t : tags_) { for (const auto &t : qAsConst(tags_)) {
if (t == tag) { if (t == tag) {
this->currentTagId_ = tagId; this->currentTagId_ = tagId;
emit currentTagIdChanged(currentTagId_); emit currentTagIdChanged(currentTagId_);

View file

@ -132,7 +132,8 @@ DelegateChooser::DelegateIncubator::statusChanged(QQmlIncubator::Status status)
emit chooser.childChanged(); emit chooser.childChanged();
} else if (status == QQmlIncubator::Error) { } 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()); nhlog::ui()->error("Error instantiating delegate: {}", e.toString().toStdString());
} }
} }

View file

@ -185,7 +185,7 @@ EventStore::EventStore(std::string room_id, QObject *)
// FIXME (introduced by balsoft): this doesn't work for encrypted events, but // 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 // 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)) { if (cache::client()->getEvent(room_id_, related_event_id)) {
auto related_event = auto related_event =
cache::client()->getEvent(room_id_, related_event_id).value(); cache::client()->getEvent(room_id_, related_event_id).value();
@ -717,7 +717,8 @@ void
EventStore::enableKeyRequests(bool suppressKeyRequests_) EventStore::enableKeyRequests(bool suppressKeyRequests_)
{ {
if (!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_) if (key.room == this->room_id_)
decryptedEvents_.remove(key); decryptedEvents_.remove(key);
suppressKeyRequests = false; suppressKeyRequests = false;

View file

@ -324,7 +324,8 @@ InputBar::message(const QString &msg, MarkdownOverride useMarkdown, bool rainbow
QString body; QString body;
bool firstLine = true; 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) { if (firstLine) {
firstLine = false; firstLine = false;
body = QString("> <%1> %2\n").arg(related.quoted_user, line); body = QString("> <%1> %2\n").arg(related.quoted_user, line);

View file

@ -317,7 +317,7 @@ RoomlistModel::addRoom(const QString &room_id, bool suppressInsertNotification)
int total_unread_msgs = 0; int total_unread_msgs = 0;
for (const auto &room : models) { for (const auto &room : qAsConst(models)) {
if (!room.isNull()) if (!room.isNull())
total_unread_msgs += room->notificationCount(); total_unread_msgs += room->notificationCount();
} }
@ -586,8 +586,8 @@ RoomlistModel::initializeRooms()
} }
invites = cache::client()->invites(); invites = cache::client()->invites();
for (const auto &id : invites.keys()) { for (auto id = invites.keyBegin(); id != invites.keyEnd(); ++id) {
roomids.push_back(id); roomids.push_back(*id);
} }
for (const auto &id : cache::client()->roomIds()) for (const auto &id : cache::client()->roomIds())
@ -826,10 +826,12 @@ FilteredRoomlistModel::updateHiddenTagsAndSpaces()
hiddenTags.clear(); hiddenTags.clear();
hiddenSpaces.clear(); hiddenSpaces.clear();
hideDMs = false; 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)); hiddenTags.push_back(t.mid(4));
else if (t.startsWith("space:")) else if (t.startsWith(u"space:"))
hiddenSpaces.push_back(t.mid(6)); hiddenSpaces.push_back(t.mid(6));
else if (t == "dm") else if (t == "dm")
hideDMs = true; hideDMs = true;

View file

@ -36,7 +36,7 @@
Q_DECLARE_METATYPE(QModelIndex) Q_DECLARE_METATYPE(QModelIndex)
namespace std { namespace std {
inline uint inline uint // clazy:exclude=qhash-namespace
qHash(const std::string &key, uint seed = 0) qHash(const std::string &key, uint seed = 0)
{ {
return qHash(QByteArray::fromRawData(key.data(), (int)key.length()), seed); return qHash(QByteArray::fromRawData(key.data(), (int)key.length()), seed);
@ -1541,7 +1541,6 @@ TimelineModel::cacheMedia(const QString &eventId,
return; return;
QString mxcUrl = QString::fromStdString(mtx::accessors::url(*event)); 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 mimeType = QString::fromStdString(mtx::accessors::mimetype(*event));
auto encryptionInfo = mtx::accessors::file(*event); auto encryptionInfo = mtx::accessors::file(*event);
@ -1556,10 +1555,9 @@ TimelineModel::cacheMedia(const QString &eventId,
const auto url = mxcUrl.toStdString(); const auto url = mxcUrl.toStdString();
const auto name = QString(mxcUrl).remove("mxc://"); const auto name = QString(mxcUrl).remove("mxc://");
QFileInfo filename(QString("%1/media_cache/%2.%3") QFileInfo filename(
.arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) QString("%1/media_cache/%2.%3")
.arg(name) .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation), name, suffix));
.arg(suffix));
if (QDir::cleanPath(name) != name) { if (QDir::cleanPath(name) != name) {
nhlog::net()->warn("mxcUrl '{}' is not safe, not downloading file", url); nhlog::net()->warn("mxcUrl '{}' is not safe, not downloading file", url);
return; return;
@ -1780,7 +1778,7 @@ TimelineModel::formatTypingUsers(const std::vector<QString> &users, const QColor
uidWithoutLast.append(formatUser(users[i])); uidWithoutLast.append(formatUser(users[i]));
} }
return temp.arg(uidWithoutLast.join(", ")).arg(formatUser(users.back())); return temp.arg(uidWithoutLast.join(", "), formatUser(users.back()));
} }
QString QString
@ -1812,8 +1810,7 @@ TimelineModel::formatJoinRuleEvent(const QString &id)
} }
return tr("%1 allowed members of the following rooms to automatically join this " return tr("%1 allowed members of the following rooms to automatically join this "
"room: %2") "room: %2")
.arg(name) .arg(name, rooms.join(", "));
.arg(rooms.join(", "));
} }
default: default:
// Currently, knock and private are reserved keywords and not implemented in Matrix. // Currently, knock and private are reserved keywords and not implemented in Matrix.
@ -2035,8 +2032,8 @@ TimelineModel::formatMemberEvent(const QString &id)
else else
rendered = rendered =
tr("%1 joined via authorisation from %2's server.") tr("%1 joined via authorisation from %2's server.")
.arg(name) .arg(name,
.arg(QString::fromStdString(event->content.join_authorised_via_users_server)); QString::fromStdString(event->content.join_authorised_via_users_server));
} }
break; break;
case Membership::Leave: case Membership::Leave:

View file

@ -1,222 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include <QPainter>
#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_;
}

View file

@ -1,66 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QColor>
#include <QIcon>
#include <QWidget>
#include <QtGlobal>
#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_;
};

View file

@ -100,7 +100,7 @@ DropShadow::draw(QPainter &painter,
painter.drawRoundedRect(QRectF(topright0, topright1), 0.0, 0.0); painter.drawRoundedRect(QRectF(topright0, topright1), 0.0, 0.0);
// Widget // Widget
painter.setBrush(QBrush("#FFFFFF")); painter.setBrush(QBrush(QColor(0xff, 0xff, 0xff)));
painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::Antialiasing);
painter.drawRoundedRect( painter.drawRoundedRect(
QRectF(QPointF(margin, margin), QPointF(width - margin, height - margin)), radius, radius); QRectF(QPointF(margin, margin), QPointF(width - margin, height - margin)), radius, radius);

View file

@ -119,6 +119,7 @@ void
FlatButton::setForegroundColor(const QColor &color) FlatButton::setForegroundColor(const QColor &color)
{ {
foreground_color_ = color; foreground_color_ = color;
emit foregroundColorChanged();
} }
QColor QColor
@ -147,6 +148,7 @@ void
FlatButton::setBackgroundColor(const QColor &color) FlatButton::setBackgroundColor(const QColor &color)
{ {
background_color_ = color; background_color_ = color;
emit backgroundColorChanged();
} }
QColor QColor
@ -172,6 +174,7 @@ FlatButton::setOverlayColor(const QColor &color)
{ {
overlay_color_ = color; overlay_color_ = color;
setOverlayStyle(ui::OverlayStyle::TintedOverlay); setOverlayStyle(ui::OverlayStyle::TintedOverlay);
emit overlayColorChanged();
} }
QColor QColor
@ -188,6 +191,7 @@ void
FlatButton::setDisabledForegroundColor(const QColor &color) FlatButton::setDisabledForegroundColor(const QColor &color)
{ {
disabled_color_ = color; disabled_color_ = color;
emit disabledForegroundColorChanged();
} }
QColor QColor
@ -204,6 +208,7 @@ void
FlatButton::setDisabledBackgroundColor(const QColor &color) FlatButton::setDisabledBackgroundColor(const QColor &color)
{ {
disabled_background_color_ = color; disabled_background_color_ = color;
emit disabledBackgroundColorChanged();
} }
QColor QColor
@ -225,6 +230,8 @@ FlatButton::setFontSize(qreal size)
f.setPointSizeF(size); f.setPointSizeF(size);
setFont(f); setFont(f);
emit fontSizeChanged();
update(); update();
} }
@ -617,6 +624,7 @@ void
FlatButtonStateMachine::setOverlayOpacity(qreal opacity) FlatButtonStateMachine::setOverlayOpacity(qreal opacity)
{ {
overlay_opacity_ = opacity; overlay_opacity_ = opacity;
emit overlayOpacityChanged();
button_->update(); button_->update();
} }
@ -624,6 +632,7 @@ void
FlatButtonStateMachine::setCheckedOverlayProgress(qreal opacity) FlatButtonStateMachine::setCheckedOverlayProgress(qreal opacity)
{ {
checked_overlay_progress_ = opacity; checked_overlay_progress_ = opacity;
emit checkedOverlayProgressChanged();
button_->update(); button_->update();
} }

View file

@ -16,9 +16,10 @@ class FlatButtonStateMachine : public QStateMachine
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(qreal overlayOpacity WRITE setOverlayOpacity READ overlayOpacity)
Q_PROPERTY( 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: public:
explicit FlatButtonStateMachine(FlatButton *parent); explicit FlatButtonStateMachine(FlatButton *parent);
@ -38,6 +39,9 @@ signals:
void buttonChecked(); void buttonChecked();
void buttonUnchecked(); void buttonUnchecked();
void overlayOpacityChanged();
void checkedOverlayProgressChanged();
protected: protected:
bool eventFilter(QObject *watched, QEvent *event) override; bool eventFilter(QObject *watched, QEvent *event) override;
@ -81,14 +85,17 @@ class FlatButton : public QPushButton
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QColor foregroundColor WRITE setForegroundColor READ foregroundColor) Q_PROPERTY(QColor foregroundColor WRITE setForegroundColor READ foregroundColor NOTIFY
Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor) foregroundColorChanged)
Q_PROPERTY(QColor overlayColor WRITE setOverlayColor READ overlayColor) Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor NOTIFY
backgroundColorChanged)
Q_PROPERTY( Q_PROPERTY(
QColor disabledForegroundColor WRITE setDisabledForegroundColor READ disabledForegroundColor) QColor overlayColor WRITE setOverlayColor READ overlayColor NOTIFY overlayColorChanged)
Q_PROPERTY( Q_PROPERTY(QColor disabledForegroundColor WRITE setDisabledForegroundColor READ
QColor disabledBackgroundColor WRITE setDisabledBackgroundColor READ disabledBackgroundColor) disabledForegroundColor NOTIFY disabledForegroundColorChanged)
Q_PROPERTY(qreal fontSize WRITE setFontSize READ fontSize) Q_PROPERTY(QColor disabledBackgroundColor WRITE setDisabledBackgroundColor READ
disabledBackgroundColor NOTIFY disabledBackgroundColorChanged)
Q_PROPERTY(qreal fontSize WRITE setFontSize READ fontSize NOTIFY fontSizeChanged)
public: public:
explicit FlatButton(QWidget *parent = nullptr, explicit FlatButton(QWidget *parent = nullptr,
@ -156,6 +163,14 @@ protected:
void init(); void init();
signals:
void foregroundColorChanged();
void backgroundColorChanged();
void overlayColorChanged();
void disabledForegroundColorChanged();
void disabledBackgroundColorChanged();
void fontSizeChanged();
private: private:
RippleOverlay *ripple_overlay_; RippleOverlay *ripple_overlay_;
FlatButtonStateMachine *state_machine_; FlatButtonStateMachine *state_machine_;

View file

@ -1,78 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "InfoMessage.h"
#include "Config.h"
#include <QDateTime>
#include <QLocale>
#include <QPainter>
#include <QPainterPath>
#include <QPen>
#include <QtGlobal>
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);
}

View file

@ -1,56 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QColor>
#include <QDateTime>
#include <QWidget>
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);
};

View file

@ -13,7 +13,7 @@ class QPaintEvent;
class LoadingIndicator : public QWidget class LoadingIndicator : public QWidget
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QColor color READ color WRITE setColor) Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
public: public:
LoadingIndicator(QWidget *parent = nullptr); LoadingIndicator(QWidget *parent = nullptr);
@ -24,7 +24,11 @@ public:
void stop(); void stop();
QColor color() { return color_; } QColor color() { return color_; }
void setColor(QColor color) { color_ = color; } void setColor(QColor color)
{
color_ = color;
emit colorChanged();
}
int interval() { return interval_; } int interval() { return interval_; }
void setInterval(int interval) { interval_ = interval; } void setInterval(int interval) { interval_ = interval; }
@ -32,6 +36,9 @@ public:
private slots: private slots:
void onTimeout(); void onTimeout();
signals:
void colorChanged();
private: private:
int interval_; int interval_;
int angle_; int angle_;

View file

@ -40,7 +40,6 @@ MxcAnimatedImage::startDownload()
return; return;
QString mxcUrl = QString::fromStdString(mtx::accessors::url(*event)); QString mxcUrl = QString::fromStdString(mtx::accessors::url(*event));
QString originalFilename = QString::fromStdString(mtx::accessors::filename(*event));
auto encryptionInfo = mtx::accessors::file(*event); auto encryptionInfo = mtx::accessors::file(*event);
@ -53,10 +52,9 @@ MxcAnimatedImage::startDownload()
const auto url = mxcUrl.toStdString(); const auto url = mxcUrl.toStdString();
const auto name = QString(mxcUrl).remove("mxc://"); const auto name = QString(mxcUrl).remove("mxc://");
QFileInfo filename(QString("%1/media_cache/media/%2.%3") QFileInfo filename(
.arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) QStringLiteral("%1/media_cache/media/%2.%3")
.arg(name) .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation), name, suffix));
.arg(suffix));
if (QDir::cleanPath(name) != name) { if (QDir::cleanPath(name) != name) {
nhlog::net()->warn("mxcUrl '{}' is not safe, not downloading file", url); nhlog::net()->warn("mxcUrl '{}' is not safe, not downloading file", url);
return; return;

View file

@ -49,9 +49,12 @@ MxcMediaProxy::MxcMediaProxy(QObject *parent)
void void
MxcMediaProxy::setVideoSurface(QAbstractVideoSurface *surface) MxcMediaProxy::setVideoSurface(QAbstractVideoSurface *surface)
{ {
if (surface != m_surface) {
qDebug() << "Changing surface"; qDebug() << "Changing surface";
m_surface = surface; m_surface = surface;
setVideoOutput(m_surface); setVideoOutput(m_surface);
emit videoSurfaceChanged();
}
} }
QAbstractVideoSurface * QAbstractVideoSurface *
@ -85,7 +88,6 @@ MxcMediaProxy::startDownload()
} }
QString mxcUrl = QString::fromStdString(mtx::accessors::url(*event)); 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 mimeType = QString::fromStdString(mtx::accessors::mimetype(*event));
auto encryptionInfo = mtx::accessors::file(*event); auto encryptionInfo = mtx::accessors::file(*event);
@ -99,10 +101,9 @@ MxcMediaProxy::startDownload()
const auto url = mxcUrl.toStdString(); const auto url = mxcUrl.toStdString();
const auto name = QString(mxcUrl).remove("mxc://"); const auto name = QString(mxcUrl).remove("mxc://");
QFileInfo filename(QString("%1/media_cache/media/%2.%3") QFileInfo filename(
.arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) QString("%1/media_cache/media/%2.%3")
.arg(name) .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation), name, suffix));
.arg(suffix));
if (QDir::cleanPath(name) != name) { if (QDir::cleanPath(name) != name) {
nhlog::net()->warn("mxcUrl '{}' is not safe, not downloading file", url); nhlog::net()->warn("mxcUrl '{}' is not safe, not downloading file", url);
return; return;

View file

@ -23,7 +23,8 @@ class MxcMediaProxy : public QMediaPlayer
Q_OBJECT Q_OBJECT
Q_PROPERTY(TimelineModel *roomm READ room WRITE setRoom NOTIFY roomChanged REQUIRED) Q_PROPERTY(TimelineModel *roomm READ room WRITE setRoom NOTIFY roomChanged REQUIRED)
Q_PROPERTY(QString eventId READ eventId WRITE setEventId NOTIFY eventIdChanged) 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(bool loaded READ loaded NOTIFY loadedChanged)
Q_PROPERTY(int orientation READ orientation NOTIFY orientationChanged) Q_PROPERTY(int orientation READ orientation NOTIFY orientationChanged)
@ -55,6 +56,7 @@ signals:
void newBuffer(QMediaContent, QIODevice *buf); void newBuffer(QMediaContent, QIODevice *buf);
void orientationChanged(); void orientationChanged();
void videoSurfaceChanged();
private slots: private slots:
void startDownload(); void startDownload();

View file

@ -39,6 +39,8 @@ Ripple::setRadius(qreal radius)
radius_ = radius; radius_ = radius;
overlay_->update(); overlay_->update();
emit radiusChanged();
} }
void void
@ -51,6 +53,8 @@ Ripple::setOpacity(qreal opacity)
opacity_ = opacity; opacity_ = opacity;
overlay_->update(); overlay_->update();
emit opacityChanged();
} }
void void

View file

@ -16,8 +16,8 @@ class Ripple : public QParallelAnimationGroup
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(qreal radius WRITE setRadius READ radius) Q_PROPERTY(qreal radius WRITE setRadius READ radius NOTIFY radiusChanged)
Q_PROPERTY(qreal opacity WRITE setOpacity READ opacity) Q_PROPERTY(qreal opacity WRITE setOpacity READ opacity NOTIFY opacityChanged)
public: public:
explicit Ripple(const QPoint &center, QObject *parent = nullptr); explicit Ripple(const QPoint &center, QObject *parent = nullptr);
@ -48,6 +48,10 @@ public:
protected slots: protected slots:
void destroy(); void destroy();
signals:
void radiusChanged();
void opacityChanged();
private: private:
Q_DISABLE_COPY(Ripple) Q_DISABLE_COPY(Ripple)

View file

@ -22,8 +22,9 @@ class SnackBar : public OverlayWidget
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QColor bgColor READ backgroundColor WRITE setBackgroundColor) Q_PROPERTY(
Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor) 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) Q_PROPERTY(double offset READ offset WRITE setOffset NOTIFY offsetChanged)
public: public:
@ -34,6 +35,7 @@ public:
{ {
bgColor_ = color; bgColor_ = color;
update(); update();
emit backgroundColorChanged();
} }
QColor textColor() const { return textColor_; } QColor textColor() const { return textColor_; }
@ -41,6 +43,7 @@ public:
{ {
textColor_ = color; textColor_ = color;
update(); update();
emit textColorChanged();
} }
void setPosition(SnackBarPosition pos) void setPosition(SnackBarPosition pos)
{ {
@ -62,6 +65,8 @@ public slots:
signals: signals:
void offsetChanged(); void offsetChanged();
void backgroundColorChanged();
void textColorChanged();
protected: protected:
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;

View file

@ -40,6 +40,7 @@ void
TextField::setBackgroundColor(const QColor &color) TextField::setBackgroundColor(const QColor &color)
{ {
background_color_ = color; background_color_ = color;
emit backgroundColorChanged();
} }
QColor QColor
@ -130,6 +131,7 @@ void
TextField::setLabelColor(const QColor &color) TextField::setLabelColor(const QColor &color)
{ {
label_color_ = color; label_color_ = color;
emit labelColorChanged();
update(); update();
} }
@ -147,6 +149,7 @@ void
TextField::setInkColor(const QColor &color) TextField::setInkColor(const QColor &color)
{ {
ink_color_ = color; ink_color_ = color;
emit inkColorChanged();
update(); update();
} }
@ -164,6 +167,7 @@ void
TextField::setUnderlineColor(const QColor &color) TextField::setUnderlineColor(const QColor &color)
{ {
underline_color_ = color; underline_color_ = color;
emit underlineColorChanged();
update(); update();
} }

View file

@ -20,10 +20,12 @@ class TextField : public QLineEdit
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QColor inkColor WRITE setInkColor READ inkColor) Q_PROPERTY(QColor inkColor WRITE setInkColor READ inkColor NOTIFY inkColorChanged)
Q_PROPERTY(QColor labelColor WRITE setLabelColor READ labelColor) Q_PROPERTY(QColor labelColor WRITE setLabelColor READ labelColor NOTIFY labelColorChanged)
Q_PROPERTY(QColor underlineColor WRITE setUnderlineColor READ underlineColor) Q_PROPERTY(QColor underlineColor WRITE setUnderlineColor READ underlineColor NOTIFY
Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor) underlineColorChanged)
Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor NOTIFY
backgroundColorChanged)
public: public:
explicit TextField(QWidget *parent = nullptr); explicit TextField(QWidget *parent = nullptr);
@ -51,6 +53,12 @@ protected:
bool event(QEvent *event) override; bool event(QEvent *event) override;
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
signals:
void inkColorChanged();
void labelColorChanged();
void underlineColorChanged();
void backgroundColorChanged();
private: private:
void init(); void init();
@ -71,9 +79,9 @@ class TextFieldLabel : public QWidget
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(qreal scale WRITE setScale READ scale) Q_PROPERTY(qreal scale WRITE setScale READ scale NOTIFY scaleChanged)
Q_PROPERTY(QPointF offset WRITE setOffset READ offset) Q_PROPERTY(QPointF offset WRITE setOffset READ offset NOTIFY offsetChanged)
Q_PROPERTY(QColor color WRITE setColor READ color) Q_PROPERTY(QColor color WRITE setColor READ color NOTIFY colorChanged)
public: public:
TextFieldLabel(TextField *parent); TextFieldLabel(TextField *parent);
@ -89,6 +97,11 @@ public:
protected: protected:
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
signals:
void scaleChanged();
void offsetChanged();
void colorChanged();
private: private:
TextField *const text_field_; TextField *const text_field_;
@ -102,6 +115,7 @@ inline void
TextFieldLabel::setColor(const QColor &color) TextFieldLabel::setColor(const QColor &color)
{ {
color_ = color; color_ = color;
emit colorChanged();
update(); update();
} }
@ -110,6 +124,7 @@ TextFieldLabel::setOffset(const QPointF &pos)
{ {
x_ = pos.x(); x_ = pos.x();
y_ = pos.y(); y_ = pos.y();
emit offsetChanged();
update(); update();
} }
@ -117,6 +132,7 @@ inline void
TextFieldLabel::setScale(qreal scale) TextFieldLabel::setScale(qreal scale)
{ {
scale_ = scale; scale_ = scale;
emit scaleChanged();
update(); update();
} }
@ -140,7 +156,7 @@ class TextFieldStateMachine : public QStateMachine
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(qreal progress WRITE setProgress READ progress) Q_PROPERTY(qreal progress WRITE setProgress READ progress NOTIFY progressChanged)
public: public:
TextFieldStateMachine(TextField *parent); TextFieldStateMachine(TextField *parent);
@ -153,6 +169,9 @@ public:
public slots: public slots:
void setupProperties(); void setupProperties();
signals:
void progressChanged();
private: private:
QPropertyAnimation *color_anim_; QPropertyAnimation *color_anim_;
QPropertyAnimation *offset_anim_; QPropertyAnimation *offset_anim_;
@ -170,6 +189,7 @@ inline void
TextFieldStateMachine::setProgress(qreal progress) TextFieldStateMachine::setProgress(qreal progress)
{ {
progress_ = progress; progress_ = progress;
emit progressChanged();
text_field_->update(); text_field_->update();
} }

View file

@ -13,41 +13,41 @@ Theme::paletteFromTheme(std::string_view theme)
static QPalette original; static QPalette original;
if (theme == "light") { if (theme == "light") {
QPalette lightActive( QPalette lightActive(
/*windowText*/ QColor("#333"), /*windowText*/ QColor(0x33, 0x33, 0x33),
/*button*/ QColor("white"), /*button*/ QColor(Qt::GlobalColor::white),
/*light*/ QColor(0xef, 0xef, 0xef), /*light*/ QColor(0xef, 0xef, 0xef),
/*dark*/ QColor(70, 77, 93), /*dark*/ QColor(70, 77, 93),
/*mid*/ QColor(220, 220, 220), /*mid*/ QColor(220, 220, 220),
/*text*/ QColor("#333"), /*text*/ QColor(0x33, 0x33, 0x33),
/*bright_text*/ QColor("#f2f5f8"), /*bright_text*/ QColor(0xf2, 0xf5, 0xf8),
/*base*/ QColor("#fff"), /*base*/ QColor(Qt::GlobalColor::white),
/*window*/ QColor("white")); /*window*/ QColor(Qt::GlobalColor::white));
lightActive.setColor(QPalette::AlternateBase, QColor("#eee")); lightActive.setColor(QPalette::AlternateBase, QColor(0xee, 0xee, 0xee));
lightActive.setColor(QPalette::Highlight, QColor("#38a3d8")); lightActive.setColor(QPalette::Highlight, QColor(0x38, 0xa3, 0xd8));
lightActive.setColor(QPalette::HighlightedText, QColor("#f4f4f5")); lightActive.setColor(QPalette::HighlightedText, QColor(0xf4, 0xf4, 0xf5));
lightActive.setColor(QPalette::ToolTipBase, lightActive.base().color()); lightActive.setColor(QPalette::ToolTipBase, lightActive.base().color());
lightActive.setColor(QPalette::ToolTipText, lightActive.text().color()); lightActive.setColor(QPalette::ToolTipText, lightActive.text().color());
lightActive.setColor(QPalette::Link, QColor("#0077b5")); lightActive.setColor(QPalette::Link, QColor(0x00, 0x77, 0xb5));
lightActive.setColor(QPalette::ButtonText, QColor("#555459")); lightActive.setColor(QPalette::ButtonText, QColor(0x55, 0x54, 0x59));
return lightActive; return lightActive;
} else if (theme == "dark") { } else if (theme == "dark") {
QPalette darkActive( QPalette darkActive(
/*windowText*/ QColor("#caccd1"), /*windowText*/ QColor(0xca, 0xcc, 0xd1),
/*button*/ QColor(0xff, 0xff, 0xff), /*button*/ QColor(Qt::GlobalColor::white),
/*light*/ QColor("#caccd1"), /*light*/ QColor(0xca, 0xcc, 0xd1),
/*dark*/ QColor(60, 70, 77), /*dark*/ QColor(60, 70, 77),
/*mid*/ QColor("#202228"), /*mid*/ QColor(0x20, 0x22, 0x28),
/*text*/ QColor("#caccd1"), /*text*/ QColor(0xca, 0xcc, 0xd1),
/*bright_text*/ QColor("#f4f5f8"), /*bright_text*/ QColor(0xf4, 0xf5, 0xf8),
/*base*/ QColor("#202228"), /*base*/ QColor(0x20, 0x22, 0x28),
/*window*/ QColor("#2d3139")); /*window*/ QColor(0x2d, 0x31, 0x39));
darkActive.setColor(QPalette::AlternateBase, QColor("#2d3139")); darkActive.setColor(QPalette::AlternateBase, QColor(0x2d, 0x31, 0x39));
darkActive.setColor(QPalette::Highlight, QColor("#38a3d8")); darkActive.setColor(QPalette::Highlight, QColor(0x38, 0xa3, 0xd8));
darkActive.setColor(QPalette::HighlightedText, QColor("#f4f5f8")); darkActive.setColor(QPalette::HighlightedText, QColor(0xf4, 0xf5, 0xf8));
darkActive.setColor(QPalette::ToolTipBase, darkActive.base().color()); darkActive.setColor(QPalette::ToolTipBase, darkActive.base().color());
darkActive.setColor(QPalette::ToolTipText, darkActive.text().color()); darkActive.setColor(QPalette::ToolTipText, darkActive.text().color());
darkActive.setColor(QPalette::Link, QColor("#38a3d8")); darkActive.setColor(QPalette::Link, QColor(0x38, 0xa3, 0xd8));
darkActive.setColor(QPalette::ButtonText, "#828284"); darkActive.setColor(QPalette::ButtonText, QColor(0x82, 0x82, 0x84));
return darkActive; return darkActive;
} else { } else {
return original; return original;
@ -59,19 +59,19 @@ Theme::Theme(std::string_view theme)
auto p = paletteFromTheme(theme); auto p = paletteFromTheme(theme);
separator_ = p.mid().color(); separator_ = p.mid().color();
if (theme == "light") { if (theme == "light") {
sidebarBackground_ = QColor("#233649"); sidebarBackground_ = QColor(0x23, 0x36, 0x49);
alternateButton_ = QColor("#ccc"); alternateButton_ = QColor(0xcc, 0xcc, 0xcc);
red_ = QColor("#a82353"); red_ = QColor(0xa8, 0x23, 0x53);
orange_ = QColor("#fcbe05"); orange_ = QColor(0xfc, 0xbe, 0x05);
} else if (theme == "dark") { } else if (theme == "dark") {
sidebarBackground_ = QColor("#2d3139"); sidebarBackground_ = QColor(0x2d, 0x31, 0x39);
alternateButton_ = QColor("#414A59"); alternateButton_ = QColor(0x41, 0x4A, 0x59);
red_ = QColor("#a82353"); red_ = QColor(0xa8, 0x23, 0x53);
orange_ = QColor("#fcc53a"); orange_ = QColor(0xfc, 0xc5, 0x3a);
} else { } else {
sidebarBackground_ = p.window().color(); sidebarBackground_ = p.window().color();
alternateButton_ = p.dark().color(); alternateButton_ = p.dark().color();
red_ = QColor("red"); red_ = QColor(Qt::GlobalColor::red);
orange_ = QColor("orange"); orange_ = QColor(0xff, 0xa5, 0x00); // SVG orange
} }
} }

View file

@ -10,28 +10,28 @@ QColor
ThemeManager::themeColor(const QString &key) const ThemeManager::themeColor(const QString &key) const
{ {
if (key == "Black") if (key == "Black")
return QColor("#171919"); return QColor(0x17, 0x19, 0x19);
else if (key == "BrightWhite") else if (key == "BrightWhite")
return QColor("#EBEBEB"); return QColor(0xEB, 0xEB, 0xEB);
else if (key == "FadedWhite") else if (key == "FadedWhite")
return QColor("#C9C9C9"); return QColor(0xC9, 0xC9, 0xC9);
else if (key == "MediumWhite") else if (key == "MediumWhite")
return QColor("#929292"); return QColor(0x92, 0x92, 0x92);
else if (key == "BrightGreen") else if (key == "BrightGreen")
return QColor("#1C3133"); return QColor(0x1C, 0x31, 0x33);
else if (key == "DarkGreen") else if (key == "DarkGreen")
return QColor("#577275"); return QColor(0x57, 0x72, 0x75);
else if (key == "LightGreen") else if (key == "LightGreen")
return QColor("#46A451"); return QColor(0x46, 0xA4, 0x51);
else if (key == "Gray") else if (key == "Gray")
return QColor("#5D6565"); return QColor(0x5D, 0x65, 0x65);
else if (key == "Red") else if (key == "Red")
return QColor("#E22826"); return QColor(0xE2, 0x28, 0x26);
else if (key == "Blue") else if (key == "Blue")
return QColor("#81B3A9"); return QColor(0x81, 0xB3, 0xA9);
else if (key == "Transparent") else if (key == "Transparent")
return QColor(0, 0, 0, 0); return QColor(0, 0, 0, 0);

View file

@ -69,6 +69,7 @@ Toggle::setDisabledColor(const QColor &color)
{ {
disabledColor_ = color; disabledColor_ = color;
setupProperties(); setupProperties();
emit disabledColorChanged();
} }
void void
@ -76,6 +77,7 @@ Toggle::setActiveColor(const QColor &color)
{ {
activeColor_ = color; activeColor_ = color;
setupProperties(); setupProperties();
emit activeColorChanged();
} }
void void
@ -83,6 +85,7 @@ Toggle::setInactiveColor(const QColor &color)
{ {
inactiveColor_ = color; inactiveColor_ = color;
setupProperties(); setupProperties();
emit inactiveColorChanged();
} }
void void
@ -90,6 +93,7 @@ Toggle::setTrackColor(const QColor &color)
{ {
trackColor_ = color; trackColor_ = color;
setupProperties(); setupProperties();
emit trackColorChanged();
} }
ToggleThumb::ToggleThumb(Toggle *parent) ToggleThumb::ToggleThumb(Toggle *parent)
@ -174,6 +178,7 @@ void
ToggleTrack::setTrackColor(const QColor &color) ToggleTrack::setTrackColor(const QColor &color)
{ {
trackColor_ = color; trackColor_ = color;
emit trackColorChanged();
update(); update();
} }

View file

@ -20,10 +20,12 @@ class Toggle : public QAbstractButton
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QColor activeColor WRITE setActiveColor READ activeColor) Q_PROPERTY(QColor activeColor WRITE setActiveColor READ activeColor NOTIFY activeColorChanged)
Q_PROPERTY(QColor disabledColor WRITE setDisabledColor READ disabledColor) Q_PROPERTY(
Q_PROPERTY(QColor inactiveColor WRITE setInactiveColor READ inactiveColor) QColor disabledColor WRITE setDisabledColor READ disabledColor NOTIFY disabledColorChanged)
Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor) Q_PROPERTY(
QColor inactiveColor WRITE setInactiveColor READ inactiveColor NOTIFY inactiveColorChanged)
Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor NOTIFY trackColorChanged)
public: public:
Toggle(QWidget *parent = nullptr); Toggle(QWidget *parent = nullptr);
@ -38,13 +40,22 @@ public:
QColor activeColor() const { return activeColor_; }; QColor activeColor() const { return activeColor_; };
QColor disabledColor() const { return disabledColor_; }; QColor disabledColor() const { return disabledColor_; };
QColor inactiveColor() const { return inactiveColor_; }; 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); }; QSize sizeHint() const override { return QSize(64, 48); };
protected: protected:
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
signals:
void activeColorChanged();
void disabledColorChanged();
void inactiveColorChanged();
void trackColorChanged();
private: private:
void init(); void init();
void setupProperties(); void setupProperties();
@ -62,7 +73,7 @@ class ToggleThumb : public QWidget
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QColor thumbColor WRITE setThumbColor READ thumbColor) Q_PROPERTY(QColor thumbColor WRITE setThumbColor READ thumbColor NOTIFY thumbColorChanged)
public: public:
ToggleThumb(Toggle *parent); ToggleThumb(Toggle *parent);
@ -75,6 +86,7 @@ public:
void setThumbColor(const QColor &color) void setThumbColor(const QColor &color)
{ {
thumbColor_ = color; thumbColor_ = color;
emit thumbColorChanged();
update(); update();
}; };
@ -82,6 +94,9 @@ protected:
bool eventFilter(QObject *obj, QEvent *event) override; bool eventFilter(QObject *obj, QEvent *event) override;
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
signals:
void thumbColorChanged();
private: private:
void updateOffset(); void updateOffset();
@ -96,7 +111,7 @@ class ToggleTrack : public QWidget
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor) Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor NOTIFY trackColor)
public: public:
ToggleTrack(Toggle *parent); ToggleTrack(Toggle *parent);
@ -108,6 +123,9 @@ protected:
bool eventFilter(QObject *obj, QEvent *event) override; bool eventFilter(QObject *obj, QEvent *event) override;
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
signals:
void trackColorChanged();
private: private:
Toggle *const toggle_; Toggle *const toggle_;
QColor trackColor_; QColor trackColor_;

View file

@ -175,8 +175,6 @@ UserProfile::refreshDevices()
void void
UserProfile::fetchDeviceList(const QString &userID) UserProfile::fetchDeviceList(const QString &userID)
{ {
auto localUser = utils::localUser();
if (!cache::client() || !cache::client()->isDatabaseReady()) if (!cache::client() || !cache::client()->isDatabaseReady())
return; return;

View file

@ -143,6 +143,7 @@ CallManager::CallManager(QObject *parent)
connect(&player_, connect(&player_,
QOverload<QMediaPlayer::Error>::of(&QMediaPlayer::error), QOverload<QMediaPlayer::Error>::of(&QMediaPlayer::error),
this,
[this](QMediaPlayer::Error error) { [this](QMediaPlayer::Error error) {
stopRingtone(); stopRingtone();
switch (error) { switch (error) {