diff options
author | Nicolas Werner <nicolas.werner@hotmail.de> | 2022-01-30 13:16:36 +0100 |
---|---|---|
committer | Nicolas Werner <nicolas.werner@hotmail.de> | 2022-01-30 13:16:36 +0100 |
commit | f44d8e916beb3e1059ba31e149de0cffbcaa02fd (patch) | |
tree | 71ef187a209d4fb4bf11bd7015d75bc0bd857d8f /src | |
parent | Fix centering dialogs (diff) | |
download | nheko-f44d8e916beb3e1059ba31e149de0cffbcaa02fd.tar.xz |
Remove a few now unused files
Diffstat (limited to 'src')
-rw-r--r-- | src/ChatPage.cpp | 3 | ||||
-rw-r--r-- | src/ChatPage.h | 2 | ||||
-rw-r--r-- | src/MainWindow.cpp | 6 | ||||
-rw-r--r-- | src/MainWindow.h | 5 | ||||
-rw-r--r-- | src/UserSettingsPage.cpp | 3 | ||||
-rw-r--r-- | src/WelcomePage.cpp | 88 | ||||
-rw-r--r-- | src/WelcomePage.h | 26 | ||||
-rw-r--r-- | src/ui/DropShadow.cpp | 108 | ||||
-rw-r--r-- | src/ui/DropShadow.h | 25 | ||||
-rw-r--r-- | src/ui/FlatButton.cpp | 730 | ||||
-rw-r--r-- | src/ui/FlatButton.h | 198 | ||||
-rw-r--r-- | src/ui/Label.cpp | 33 | ||||
-rw-r--r-- | src/ui/Label.h | 30 | ||||
-rw-r--r-- | src/ui/LoadingIndicator.cpp | 84 | ||||
-rw-r--r-- | src/ui/LoadingIndicator.h | 49 | ||||
-rw-r--r-- | src/ui/Menu.h | 26 | ||||
-rw-r--r-- | src/ui/OverlayModal.cpp | 62 | ||||
-rw-r--r-- | src/ui/OverlayModal.h | 40 | ||||
-rw-r--r-- | src/ui/Painter.h | 154 | ||||
-rw-r--r-- | src/ui/RaisedButton.cpp | 92 | ||||
-rw-r--r-- | src/ui/RaisedButton.h | 32 | ||||
-rw-r--r-- | src/ui/Ripple.cpp | 116 | ||||
-rw-r--r-- | src/ui/Ripple.h | 154 | ||||
-rw-r--r-- | src/ui/RippleOverlay.cpp | 67 | ||||
-rw-r--r-- | src/ui/RippleOverlay.h | 62 | ||||
-rw-r--r-- | src/ui/SnackBar.cpp | 136 | ||||
-rw-r--r-- | src/ui/SnackBar.h | 98 | ||||
-rw-r--r-- | src/ui/TextLabel.cpp | 123 | ||||
-rw-r--r-- | src/ui/TextLabel.h | 60 |
29 files changed, 1 insertions, 2611 deletions
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 808489d7..cdaf7260 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -22,7 +22,6 @@ #include "Utils.h" #include "encryption/DeviceVerificationFlow.h" #include "encryption/Olm.h" -#include "ui/OverlayModal.h" #include "ui/Theme.h" #include "ui/UserProfile.h" #include "voip/CallManager.h" @@ -1050,8 +1049,6 @@ ChatPage::initiateLogout() emit loggedOut(); }); - - emit showOverlayProgressBar(); } template<typename T> diff --git a/src/ChatPage.h b/src/ChatPage.h index 4b7351a5..70bbb6c2 100644 --- a/src/ChatPage.h +++ b/src/ChatPage.h @@ -28,7 +28,6 @@ #include "CacheStructs.h" #include "notifications/Manager.h" -class OverlayModal; class TimelineViewManager; class UserSettings; class NotificationsManager; @@ -112,7 +111,6 @@ signals: void showNotification(const QString &msg); void showLoginPage(const QString &msg); void showUserSettingsPage(); - void showOverlayProgressBar(); void ownProfileOk(); void setUserDisplayName(const QString &name); diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index a4661da7..ce9dd945 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -41,21 +41,17 @@ #include "UserSettingsPage.h" #include "UsersModel.h" #include "Utils.h" -#include "WelcomePage.h" #include "emoji/EmojiModel.h" #include "emoji/Provider.h" #include "encryption/DeviceVerificationFlow.h" #include "encryption/SelfVerificationStatus.h" #include "timeline/DelegateChooser.h" #include "timeline/TimelineViewManager.h" -#include "ui/LoadingIndicator.h" #include "ui/MxcAnimatedImage.h" #include "ui/MxcMediaProxy.h" #include "ui/NhekoCursorShape.h" #include "ui/NhekoDropArea.h" #include "ui/NhekoGlobalObject.h" -#include "ui/OverlayModal.h" -#include "ui/SnackBar.h" #include "ui/UIA.h" #include "voip/WebRTCSession.h" @@ -101,8 +97,6 @@ MainWindow::MainWindow(QWindow *parent) this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); - connect(chat_page_, SIGNAL(contentLoaded()), this, SLOT(removeOverlayProgressBar())); - trayIcon_->setVisible(userSettings_->tray()); // load cache on event loop diff --git a/src/MainWindow.h b/src/MainWindow.h index 1258bafb..80ade988 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -10,11 +10,9 @@ #include <QQuickView> #include <QSharedPointer> -#include <QStackedWidget> #include <QSystemTrayIcon> #include "UserSettingsPage.h" -#include "ui/OverlayModal.h" #include "jdenticoninterface.h" @@ -22,9 +20,6 @@ class ChatPage; class RegisterPage; class WelcomePage; -class LoadingIndicator; -class OverlayModal; -class SnackBar; class TrayIcon; class UserSettings; class MxcImageProvider; diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp index e973fc1f..388aa241 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp @@ -33,8 +33,7 @@ #include "UserSettingsPage.h" #include "Utils.h" #include "encryption/Olm.h" -#include "ui/FlatButton.h" -#include "ui/ToggleButton.h" +#include "ui/Theme.h" #include "voip/CallDevices.h" #include "config/nheko.h" diff --git a/src/WelcomePage.cpp b/src/WelcomePage.cpp deleted file mode 100644 index 5d540f4e..00000000 --- a/src/WelcomePage.cpp +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-FileCopyrightText: 2017 Konstantinos Sideris <siderisk@auth.gr> -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include <QLabel> -#include <QLayout> -#include <QPainter> -#include <QStyleOption> - -#include "Config.h" -#include "WelcomePage.h" -#include "ui/RaisedButton.h" -#include "ui/TextLabel.h" - -WelcomePage::WelcomePage(QWidget *parent) - : QWidget(parent) -{ - auto topLayout_ = new QVBoxLayout(this); - topLayout_->setSpacing(20); - topLayout_->setAlignment(Qt::AlignCenter); - - QFont headingFont; - headingFont.setPointSizeF(headingFont.pointSizeF() * 2); - QFont subTitleFont; - subTitleFont.setPointSizeF(subTitleFont.pointSizeF() * 1.5); - - QIcon icon{QIcon::fromTheme("nheko", QIcon{":/logos/splash.png"})}; - - auto logo_ = new QLabel(this); - logo_->setPixmap(icon.pixmap(256)); - logo_->setAlignment(Qt::AlignCenter); - - QString heading(tr("Welcome to nheko! The desktop client for the Matrix protocol.")); - QString main(tr("Enjoy your stay!")); - - auto intoTxt_ = new TextLabel(heading, this); - intoTxt_->setFont(headingFont); - intoTxt_->setAlignment(Qt::AlignCenter); - - auto subTitle = new TextLabel(main, this); - subTitle->setFont(subTitleFont); - subTitle->setAlignment(Qt::AlignCenter); - - topLayout_->addStretch(1); - topLayout_->addWidget(logo_); - topLayout_->addWidget(intoTxt_); - topLayout_->addWidget(subTitle); - - auto btnLayout_ = new QHBoxLayout(); - btnLayout_->setSpacing(20); - btnLayout_->setContentsMargins(0, 20, 0, 20); - - const int fontHeight = QFontMetrics{subTitleFont}.height(); - const int buttonHeight = fontHeight * 2.5; - const int buttonWidth = fontHeight * 8; - - auto registerBtn = new RaisedButton(tr("REGISTER"), this); - registerBtn->setMinimumSize(buttonWidth, buttonHeight); - registerBtn->setFontSize(subTitleFont.pointSizeF()); - registerBtn->setCornerRadius(conf::btn::cornerRadius); - - auto loginBtn = new RaisedButton(tr("LOGIN"), this); - loginBtn->setMinimumSize(buttonWidth, buttonHeight); - loginBtn->setFontSize(subTitleFont.pointSizeF()); - loginBtn->setCornerRadius(conf::btn::cornerRadius); - - btnLayout_->addStretch(1); - btnLayout_->addWidget(registerBtn); - btnLayout_->addWidget(loginBtn); - btnLayout_->addStretch(1); - - topLayout_->addLayout(btnLayout_); - topLayout_->addStretch(1); - - connect(registerBtn, &QPushButton::clicked, this, &WelcomePage::userRegister); - connect(loginBtn, &QPushButton::clicked, this, &WelcomePage::userLogin); -} - -void -WelcomePage::paintEvent(QPaintEvent *) -{ - QStyleOption opt; - opt.initFrom(this); - QPainter p(this); - style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); -} diff --git a/src/WelcomePage.h b/src/WelcomePage.h deleted file mode 100644 index 9d5da8ba..00000000 --- a/src/WelcomePage.h +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QWidget> - -class WelcomePage : public QWidget -{ - Q_OBJECT - -public: - explicit WelcomePage(QWidget *parent = nullptr); - -protected: - void paintEvent(QPaintEvent *) override; - -signals: - // Notify that the user wants to login in. - void userLogin(); - - // Notify that the user wants to register. - void userRegister(); -}; diff --git a/src/ui/DropShadow.cpp b/src/ui/DropShadow.cpp deleted file mode 100644 index 039d6558..00000000 --- a/src/ui/DropShadow.cpp +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "DropShadow.h" - -#include <QLinearGradient> -#include <QPainter> - -void -DropShadow::draw(QPainter &painter, - qint16 margin, - qreal radius, - QColor start, - QColor end, - qreal startPosition, - qreal endPosition0, - qreal endPosition1, - qreal width, - qreal height) -{ - painter.setPen(Qt::NoPen); - - QLinearGradient gradient; - gradient.setColorAt(startPosition, start); - gradient.setColorAt(endPosition0, end); - - // Right - QPointF right0(width - margin, height / 2); - QPointF right1(width, height / 2); - gradient.setStart(right0); - gradient.setFinalStop(right1); - painter.setBrush(QBrush(gradient)); - // Deprecated in 5.13: painter.drawRoundRect( - // QRectF(QPointF(width - margin * radius, margin), QPointF(width, height - - // margin)), 0.0, 0.0); - painter.drawRoundedRect( - QRectF(QPointF(width - margin * radius, margin), QPointF(width, height - margin)), 0.0, 0.0); - - // Left - QPointF left0(margin, height / 2); - QPointF left1(0, height / 2); - gradient.setStart(left0); - gradient.setFinalStop(left1); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect( - QRectF(QPointF(margin * radius, margin), QPointF(0, height - margin)), 0.0, 0.0); - - // Top - QPointF top0(width / 2, margin); - QPointF top1(width / 2, 0); - gradient.setStart(top0); - gradient.setFinalStop(top1); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect(QRectF(QPointF(width - margin, 0), QPointF(margin, margin)), 0.0, 0.0); - - // Bottom - QPointF bottom0(width / 2, height - margin); - QPointF bottom1(width / 2, height); - gradient.setStart(bottom0); - gradient.setFinalStop(bottom1); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect( - QRectF(QPointF(margin, height - margin), QPointF(width - margin, height)), 0.0, 0.0); - - // BottomRight - QPointF bottomright0(width - margin, height - margin); - QPointF bottomright1(width, height); - gradient.setStart(bottomright0); - gradient.setFinalStop(bottomright1); - gradient.setColorAt(endPosition1, end); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect(QRectF(bottomright0, bottomright1), 0.0, 0.0); - - // BottomLeft - QPointF bottomleft0(margin, height - margin); - QPointF bottomleft1(0, height); - gradient.setStart(bottomleft0); - gradient.setFinalStop(bottomleft1); - gradient.setColorAt(endPosition1, end); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect(QRectF(bottomleft0, bottomleft1), 0.0, 0.0); - - // TopLeft - QPointF topleft0(margin, margin); - QPointF topleft1(0, 0); - gradient.setStart(topleft0); - gradient.setFinalStop(topleft1); - gradient.setColorAt(endPosition1, end); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect(QRectF(topleft0, topleft1), 0.0, 0.0); - - // TopRight - QPointF topright0(width - margin, margin); - QPointF topright1(width, 0); - gradient.setStart(topright0); - gradient.setFinalStop(topright1); - gradient.setColorAt(endPosition1, end); - painter.setBrush(QBrush(gradient)); - painter.drawRoundedRect(QRectF(topright0, topright1), 0.0, 0.0); - - // Widget - painter.setBrush(QBrush(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/DropShadow.h b/src/ui/DropShadow.h deleted file mode 100644 index 1810a1fe..00000000 --- a/src/ui/DropShadow.h +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QColor> - -class QPainter; - -class DropShadow -{ -public: - static void draw(QPainter &painter, - qint16 margin, - qreal radius, - QColor start, - QColor end, - qreal startPosition, - qreal endPosition0, - qreal endPosition1, - qreal width, - qreal height); -}; diff --git a/src/ui/FlatButton.cpp b/src/ui/FlatButton.cpp deleted file mode 100644 index da322378..00000000 --- a/src/ui/FlatButton.cpp +++ /dev/null @@ -1,730 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include <QEventTransition> -#include <QFontDatabase> -#include <QIcon> -#include <QMouseEvent> -#include <QPaintEvent> -#include <QPainter> -#include <QPainterPath> -#include <QResizeEvent> -#include <QSignalTransition> - -#include "FlatButton.h" -#include "Ripple.h" -#include "RippleOverlay.h" -#include "ThemeManager.h" - -// The ampersand is automatically set in QPushButton or QCheckbx -// by KDEPlatformTheme plugin in Qt5. -// [https://bugs.kde.org/show_bug.cgi?id=337491] -// -// A workaroud is to add -// -// [Development] -// AutoCheckAccelerators=false -// -// to ~/.config/kdeglobals -static QString -removeKDEAccelerators(QString text) -{ - return text.remove(QChar('&')); -} - -void -FlatButton::init() -{ - ripple_overlay_ = new RippleOverlay(this); - state_machine_ = new FlatButtonStateMachine(this); - role_ = ui::Role::Default; - ripple_style_ = ui::RippleStyle::PositionedRipple; - icon_placement_ = ui::ButtonIconPlacement::LeftIcon; - overlay_style_ = ui::OverlayStyle::GrayOverlay; - bg_mode_ = Qt::TransparentMode; - fixed_ripple_radius_ = 64; - corner_radius_ = 3; - base_opacity_ = 0.13; - font_size_ = 10; // 10.5; - use_fixed_ripple_radius_ = false; - - setStyle(&ThemeManager::instance()); - setAttribute(Qt::WA_Hover); - setMouseTracking(true); - setCursor(QCursor(Qt::PointingHandCursor)); - - QPainterPath path; - path.addRoundedRect(rect(), corner_radius_, corner_radius_); - - ripple_overlay_->setClipPath(path); - ripple_overlay_->setClipping(true); - - state_machine_->setupProperties(); - state_machine_->startAnimations(); -} - -FlatButton::FlatButton(QWidget *parent, ui::ButtonPreset preset) - : QPushButton(parent) -{ - init(); - applyPreset(preset); -} - -FlatButton::FlatButton(const QString &text, QWidget *parent, ui::ButtonPreset preset) - : QPushButton(text, parent) -{ - init(); - applyPreset(preset); -} - -FlatButton::FlatButton(const QString &text, ui::Role role, QWidget *parent, ui::ButtonPreset preset) - : QPushButton(text, parent) -{ - init(); - applyPreset(preset); - setRole(role); -} - -void -FlatButton::applyPreset(ui::ButtonPreset preset) -{ - switch (preset) { - case ui::ButtonPreset::FlatPreset: - setOverlayStyle(ui::OverlayStyle::NoOverlay); - break; - case ui::ButtonPreset::CheckablePreset: - setOverlayStyle(ui::OverlayStyle::NoOverlay); - setCheckable(true); - break; - default: - break; - } -} - -void -FlatButton::setRole(ui::Role role) -{ - role_ = role; - state_machine_->setupProperties(); -} - -ui::Role -FlatButton::role() const -{ - return role_; -} - -void -FlatButton::setForegroundColor(const QColor &color) -{ - foreground_color_ = color; - emit foregroundColorChanged(); -} - -QColor -FlatButton::foregroundColor() const -{ - if (!foreground_color_.isValid()) { - if (bg_mode_ == Qt::OpaqueMode) { - return ThemeManager::instance().themeColor(QStringLiteral("BrightWhite")); - } - - switch (role_) { - case ui::Role::Primary: - return ThemeManager::instance().themeColor(QStringLiteral("Blue")); - case ui::Role::Secondary: - return ThemeManager::instance().themeColor(QStringLiteral("Gray")); - case ui::Role::Default: - default: - return ThemeManager::instance().themeColor(QStringLiteral("Black")); - } - } - - return foreground_color_; -} - -void -FlatButton::setBackgroundColor(const QColor &color) -{ - background_color_ = color; - emit backgroundColorChanged(); -} - -QColor -FlatButton::backgroundColor() const -{ - if (!background_color_.isValid()) { - switch (role_) { - case ui::Role::Primary: - return ThemeManager::instance().themeColor(QStringLiteral("Blue")); - case ui::Role::Secondary: - return ThemeManager::instance().themeColor(QStringLiteral("Gray")); - case ui::Role::Default: - default: - return ThemeManager::instance().themeColor(QStringLiteral("Black")); - } - } - - return background_color_; -} - -void -FlatButton::setOverlayColor(const QColor &color) -{ - overlay_color_ = color; - setOverlayStyle(ui::OverlayStyle::TintedOverlay); - emit overlayColorChanged(); -} - -QColor -FlatButton::overlayColor() const -{ - if (!overlay_color_.isValid()) { - return foregroundColor(); - } - - return overlay_color_; -} - -void -FlatButton::setDisabledForegroundColor(const QColor &color) -{ - disabled_color_ = color; - emit disabledForegroundColorChanged(); -} - -QColor -FlatButton::disabledForegroundColor() const -{ - if (!disabled_color_.isValid()) { - return ThemeManager::instance().themeColor(QStringLiteral("FadedWhite")); - } - - return disabled_color_; -} - -void -FlatButton::setDisabledBackgroundColor(const QColor &color) -{ - disabled_background_color_ = color; - emit disabledBackgroundColorChanged(); -} - -QColor -FlatButton::disabledBackgroundColor() const -{ - if (!disabled_background_color_.isValid()) { - return ThemeManager::instance().themeColor(QStringLiteral("FadedWhite")); - } - - return disabled_background_color_; -} - -void -FlatButton::setFontSize(qreal size) -{ - font_size_ = size; - - QFont f(font()); - f.setPointSizeF(size); - setFont(f); - - emit fontSizeChanged(); - - update(); -} - -qreal -FlatButton::fontSize() const -{ - return font_size_; -} - -void -FlatButton::setOverlayStyle(ui::OverlayStyle style) -{ - overlay_style_ = style; - update(); -} - -ui::OverlayStyle -FlatButton::overlayStyle() const -{ - return overlay_style_; -} - -void -FlatButton::setRippleStyle(ui::RippleStyle style) -{ - ripple_style_ = style; -} - -ui::RippleStyle -FlatButton::rippleStyle() const -{ - return ripple_style_; -} - -void -FlatButton::setIconPlacement(ui::ButtonIconPlacement placement) -{ - icon_placement_ = placement; - update(); -} - -ui::ButtonIconPlacement -FlatButton::iconPlacement() const -{ - return icon_placement_; -} - -void -FlatButton::setCornerRadius(qreal radius) -{ - corner_radius_ = radius; - updateClipPath(); - update(); -} - -qreal -FlatButton::cornerRadius() const -{ - return corner_radius_; -} - -void -FlatButton::setBackgroundMode(Qt::BGMode mode) -{ - bg_mode_ = mode; - state_machine_->setupProperties(); -} - -Qt::BGMode -FlatButton::backgroundMode() const -{ - return bg_mode_; -} - -void -FlatButton::setBaseOpacity(qreal opacity) -{ - base_opacity_ = opacity; - state_machine_->setupProperties(); -} - -qreal -FlatButton::baseOpacity() const -{ - return base_opacity_; -} - -void -FlatButton::setCheckable(bool value) -{ - state_machine_->updateCheckedStatus(); - state_machine_->setCheckedOverlayProgress(0); - - QPushButton::setCheckable(value); -} - -void -FlatButton::setHasFixedRippleRadius(bool value) -{ - use_fixed_ripple_radius_ = value; -} - -bool -FlatButton::hasFixedRippleRadius() const -{ - return use_fixed_ripple_radius_; -} - -void -FlatButton::setFixedRippleRadius(qreal radius) -{ - fixed_ripple_radius_ = radius; - setHasFixedRippleRadius(true); -} - -QSize -FlatButton::sizeHint() const -{ - ensurePolished(); - - QSize label(fontMetrics().size(Qt::TextSingleLine, removeKDEAccelerators(text()))); - - int w = 20 + label.width(); - int h = label.height(); - - if (!icon().isNull()) { - w += iconSize().width() + FlatButton::IconPadding; - h = qMax(h, iconSize().height()); - } - - return QSize(w, 20 + h); -} - -void -FlatButton::checkStateSet() -{ - state_machine_->updateCheckedStatus(); - QPushButton::checkStateSet(); -} - -void -FlatButton::mousePressEvent(QMouseEvent *event) -{ - if (ui::RippleStyle::NoRipple != ripple_style_) { - QPoint pos; - qreal radiusEndValue; - - if (ui::RippleStyle::CenteredRipple == ripple_style_) { - pos = rect().center(); - } else { - pos = event->pos(); - } - - if (use_fixed_ripple_radius_) { - radiusEndValue = fixed_ripple_radius_; - } else { - radiusEndValue = static_cast<qreal>(width()) / 2; - } - - Ripple *ripple = new Ripple(pos); - - ripple->setRadiusEndValue(radiusEndValue); - ripple->setOpacityStartValue(0.35); - ripple->setColor(foregroundColor()); - ripple->radiusAnimation()->setDuration(250); - ripple->opacityAnimation()->setDuration(250); - - ripple_overlay_->addRipple(ripple); - } - - QPushButton::mousePressEvent(event); -} - -void -FlatButton::mouseReleaseEvent(QMouseEvent *event) -{ - QPushButton::mouseReleaseEvent(event); - state_machine_->updateCheckedStatus(); -} - -void -FlatButton::resizeEvent(QResizeEvent *event) -{ - QPushButton::resizeEvent(event); - updateClipPath(); -} - -void -FlatButton::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event) - - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - - const qreal cr = corner_radius_; - - if (cr > 0) { - QPainterPath path; - path.addRoundedRect(rect(), cr, cr); - - painter.setClipPath(path); - painter.setClipping(true); - } - - paintBackground(&painter); - - painter.setOpacity(1); - painter.setClipping(false); - - paintForeground(&painter); -} - -void -FlatButton::paintBackground(QPainter *painter) -{ - const qreal overlayOpacity = state_machine_->overlayOpacity(); - const qreal checkedProgress = state_machine_->checkedOverlayProgress(); - - if (Qt::OpaqueMode == bg_mode_) { - QBrush brush; - brush.setStyle(Qt::SolidPattern); - - if (isEnabled()) { - brush.setColor(backgroundColor()); - } else { - brush.setColor(disabledBackgroundColor()); - } - - painter->setOpacity(1); - painter->setBrush(brush); - painter->setPen(Qt::NoPen); - painter->drawRect(rect()); - } - - QBrush brush; - brush.setStyle(Qt::SolidPattern); - painter->setPen(Qt::NoPen); - - if (!isEnabled()) { - return; - } - - if ((ui::OverlayStyle::NoOverlay != overlay_style_) && (overlayOpacity > 0)) { - if (ui::OverlayStyle::TintedOverlay == overlay_style_) { - brush.setColor(overlayColor()); - } else { - brush.setColor(Qt::gray); - } - - painter->setOpacity(overlayOpacity); - painter->setBrush(brush); - painter->drawRect(rect()); - } - - if (isCheckable() && checkedProgress > 0) { - const qreal q = Qt::TransparentMode == bg_mode_ ? 0.45 : 0.7; - brush.setColor(foregroundColor()); - painter->setOpacity(q * checkedProgress); - painter->setBrush(brush); - QRect r(rect()); - r.setHeight(static_cast<qreal>(r.height()) * checkedProgress); - painter->drawRect(r); - } -} - -#define COLOR_INTERPOLATE(CH) (1 - progress) * source.CH() + progress *dest.CH() - -void -FlatButton::paintForeground(QPainter *painter) -{ - if (isEnabled()) { - painter->setPen(foregroundColor()); - const qreal progress = state_machine_->checkedOverlayProgress(); - - if (isCheckable() && progress > 0) { - QColor source = foregroundColor(); - QColor dest = Qt::TransparentMode == bg_mode_ ? Qt::white : backgroundColor(); - if (qFuzzyCompare(1, progress)) { - painter->setPen(dest); - } else { - painter->setPen(QColor(COLOR_INTERPOLATE(red), - COLOR_INTERPOLATE(green), - COLOR_INTERPOLATE(blue), - COLOR_INTERPOLATE(alpha))); - } - } - } else { - painter->setPen(disabledForegroundColor()); - } - - if (icon().isNull()) { - painter->drawText(rect(), Qt::AlignCenter, removeKDEAccelerators(text())); - return; - } - - QSize textSize(fontMetrics().size(Qt::TextSingleLine, removeKDEAccelerators(text()))); - QSize base(size() - textSize); - - const int iw = iconSize().width() + IconPadding; - QPoint pos((base.width() - iw) / 2, 0); - - QRect textGeometry(pos + QPoint(0, base.height() / 2), textSize); - QRect iconGeometry(pos + QPoint(0, (height() - iconSize().height()) / 2), iconSize()); - - /* if (ui::LeftIcon == icon_placement_) { */ - /* textGeometry.translate(iw, 0); */ - /* } else { */ - /* iconGeometry.translate(textSize.width() + IconPadding, 0); */ - /* } */ - - painter->drawText(textGeometry, Qt::AlignCenter, removeKDEAccelerators(text())); - - QPixmap pixmap = icon().pixmap(iconSize()); - QPainter icon(&pixmap); - icon.setCompositionMode(QPainter::CompositionMode_SourceIn); - icon.fillRect(pixmap.rect(), painter->pen().color()); - painter->drawPixmap(iconGeometry, pixmap); -} - -void -FlatButton::updateClipPath() -{ - const qreal radius = corner_radius_; - - QPainterPath path; - path.addRoundedRect(rect(), radius, radius); - ripple_overlay_->setClipPath(path); -} - -FlatButtonStateMachine::FlatButtonStateMachine(FlatButton *parent) - : QStateMachine(parent) - , button_(parent) - , top_level_state_(new QState(QState::ParallelStates)) - , config_state_(new QState(top_level_state_)) - , checkable_state_(new QState(top_level_state_)) - , checked_state_(new QState(checkable_state_)) - , unchecked_state_(new QState(checkable_state_)) - , neutral_state_(new QState(config_state_)) - , neutral_focused_state_(new QState(config_state_)) - , hovered_state_(new QState(config_state_)) - , hovered_focused_state_(new QState(config_state_)) - , pressed_state_(new QState(config_state_)) - , overlay_opacity_(0) - , checked_overlay_progress_(parent->isChecked() ? 1 : 0) - , was_checked_(false) -{ - Q_ASSERT(parent); - - parent->installEventFilter(this); - - config_state_->setInitialState(neutral_state_); - addState(top_level_state_); - setInitialState(top_level_state_); - - checkable_state_->setInitialState(parent->isChecked() ? checked_state_ : unchecked_state_); - QSignalTransition *transition; - QPropertyAnimation *animation; - - transition = new QSignalTransition(this, SIGNAL(buttonChecked())); - transition->setTargetState(checked_state_); - unchecked_state_->addTransition(transition); - - animation = new QPropertyAnimation(this, "checkedOverlayProgress", this); - animation->setDuration(200); - transition->addAnimation(animation); - - transition = new QSignalTransition(this, SIGNAL(buttonUnchecked())); - transition->setTargetState(unchecked_state_); - checked_state_->addTransition(transition); - - animation = new QPropertyAnimation(this, "checkedOverlayProgress", this); - animation->setDuration(200); - transition->addAnimation(animation); - - addTransition(button_, QEvent::FocusIn, neutral_state_, neutral_focused_state_); - addTransition(button_, QEvent::FocusOut, neutral_focused_state_, neutral_state_); - addTransition(button_, QEvent::Enter, neutral_state_, hovered_state_); - addTransition(button_, QEvent::Leave, hovered_state_, neutral_state_); - addTransition(button_, QEvent::Enter, neutral_focused_state_, hovered_focused_state_); - addTransition(button_, QEvent::Leave, hovered_focused_state_, neutral_focused_state_); - addTransition(button_, QEvent::FocusIn, hovered_state_, hovered_focused_state_); - addTransition(button_, QEvent::FocusOut, hovered_focused_state_, hovered_state_); - addTransition(this, SIGNAL(buttonPressed()), hovered_state_, pressed_state_); - addTransition(button_, QEvent::Leave, pressed_state_, neutral_focused_state_); - addTransition(button_, QEvent::FocusOut, pressed_state_, hovered_state_); -} - -void -FlatButtonStateMachine::setOverlayOpacity(qreal opacity) -{ - overlay_opacity_ = opacity; - emit overlayOpacityChanged(); - button_->update(); -} - -void -FlatButtonStateMachine::setCheckedOverlayProgress(qreal opacity) -{ - checked_overlay_progress_ = opacity; - emit checkedOverlayProgressChanged(); - button_->update(); -} - -void -FlatButtonStateMachine::startAnimations() -{ - start(); -} - -void -FlatButtonStateMachine::setupProperties() -{ - QColor overlayColor; - - if (Qt::TransparentMode == button_->backgroundMode()) { - overlayColor = button_->backgroundColor(); - } else { - overlayColor = button_->foregroundColor(); - } - - const qreal baseOpacity = button_->baseOpacity(); - - neutral_state_->assignProperty(this, "overlayOpacity", 0); - neutral_focused_state_->assignProperty(this, "overlayOpacity", 0); - hovered_state_->assignProperty(this, "overlayOpacity", baseOpacity); - hovered_focused_state_->assignProperty(this, "overlayOpacity", baseOpacity); - pressed_state_->assignProperty(this, "overlayOpacity", baseOpacity); - checked_state_->assignProperty(this, "checkedOverlayProgress", 1); - unchecked_state_->assignProperty(this, "checkedOverlayProgress", 0); - - button_->update(); -} - -void -FlatButtonStateMachine::updateCheckedStatus() -{ - const bool checked = button_->isChecked(); - if (was_checked_ != checked) { - was_checked_ = checked; - if (checked) { - emit buttonChecked(); - } else { - emit buttonUnchecked(); - } - } -} - -bool -FlatButtonStateMachine::eventFilter(QObject *watched, QEvent *event) -{ - if (QEvent::FocusIn == event->type()) { - QFocusEvent *focusEvent = static_cast<QFocusEvent *>(event); - if (focusEvent && Qt::MouseFocusReason == focusEvent->reason()) { - emit buttonPressed(); - return true; - } - } - - return QStateMachine::eventFilter(watched, event); -} - -void -FlatButtonStateMachine::addTransition(QObject *object, - const char *signal, - QState *fromState, - QState *toState) -{ - addTransition(new QSignalTransition(object, signal), fromState, toState); -} - -void -FlatButtonStateMachine::addTransition(QObject *object, - QEvent::Type eventType, - QState *fromState, - QState *toState) -{ - addTransition(new QEventTransition(object, eventType), fromState, toState); -} - -void -FlatButtonStateMachine::addTransition(QAbstractTransition *transition, - QState *fromState, - QState *toState) -{ - transition->setTargetState(toState); - - QPropertyAnimation *animation; - - animation = new QPropertyAnimation(this, "overlayOpacity", this); - animation->setDuration(150); - transition->addAnimation(animation); - - fromState->addTransition(transition); -} diff --git a/src/ui/FlatButton.h b/src/ui/FlatButton.h deleted file mode 100644 index e6215024..00000000 --- a/src/ui/FlatButton.h +++ /dev/null @@ -1,198 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QPushButton> -#include <QStateMachine> - -#include "Theme.h" - -class RippleOverlay; -class FlatButton; - -class FlatButtonStateMachine : public QStateMachine -{ - Q_OBJECT - - Q_PROPERTY( - qreal overlayOpacity WRITE setOverlayOpacity READ overlayOpacity NOTIFY overlayOpacityChanged) - Q_PROPERTY(qreal checkedOverlayProgress WRITE setCheckedOverlayProgress READ - checkedOverlayProgress NOTIFY checkedOverlayProgressChanged) - -public: - explicit FlatButtonStateMachine(FlatButton *parent); - - void setOverlayOpacity(qreal opacity); - void setCheckedOverlayProgress(qreal opacity); - - inline qreal overlayOpacity() const; - inline qreal checkedOverlayProgress() const; - - void startAnimations(); - void setupProperties(); - void updateCheckedStatus(); - -signals: - void buttonPressed(); - void buttonChecked(); - void buttonUnchecked(); - - void overlayOpacityChanged(); - void checkedOverlayProgressChanged(); - -protected: - bool eventFilter(QObject *watched, QEvent *event) override; - -private: - void addTransition(QObject *object, const char *signal, QState *fromState, QState *toState); - void addTransition(QObject *object, QEvent::Type eventType, QState *fromState, QState *toState); - void addTransition(QAbstractTransition *transition, QState *fromState, QState *toState); - - FlatButton *const button_; - - QState *const top_level_state_; - QState *const config_state_; - QState *const checkable_state_; - QState *const checked_state_; - QState *const unchecked_state_; - QState *const neutral_state_; - QState *const neutral_focused_state_; - QState *const hovered_state_; - QState *const hovered_focused_state_; - QState *const pressed_state_; - - qreal overlay_opacity_; - qreal checked_overlay_progress_; - - bool was_checked_; -}; - -inline qreal -FlatButtonStateMachine::overlayOpacity() const -{ - return overlay_opacity_; -} - -inline qreal -FlatButtonStateMachine::checkedOverlayProgress() const -{ - return checked_overlay_progress_; -} - -class FlatButton : public QPushButton -{ - Q_OBJECT - - Q_PROPERTY(QColor foregroundColor WRITE setForegroundColor READ foregroundColor NOTIFY - foregroundColorChanged) - Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor NOTIFY - backgroundColorChanged) - Q_PROPERTY( - 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, - ui::ButtonPreset preset = ui::ButtonPreset::FlatPreset); - explicit FlatButton(const QString &text, - QWidget *parent = nullptr, - ui::ButtonPreset preset = ui::ButtonPreset::FlatPreset); - FlatButton(const QString &text, - ui::Role role, - QWidget *parent = nullptr, - ui::ButtonPreset preset = ui::ButtonPreset::FlatPreset); - - void applyPreset(ui::ButtonPreset preset); - - void setBackgroundColor(const QColor &color); - void setBackgroundMode(Qt::BGMode mode); - void setBaseOpacity(qreal opacity); - void setCheckable(bool value); - void setCornerRadius(qreal radius); - void setDisabledBackgroundColor(const QColor &color); - void setDisabledForegroundColor(const QColor &color); - void setFixedRippleRadius(qreal radius); - void setFontSize(qreal size); - void setForegroundColor(const QColor &color); - void setHasFixedRippleRadius(bool value); - void setIconPlacement(ui::ButtonIconPlacement placement); - void setOverlayColor(const QColor &color); - void setOverlayStyle(ui::OverlayStyle style); - void setRippleStyle(ui::RippleStyle style); - void setRole(ui::Role role); - - QColor foregroundColor() const; - QColor backgroundColor() const; - QColor overlayColor() const; - QColor disabledForegroundColor() const; - QColor disabledBackgroundColor() const; - - qreal fontSize() const; - qreal cornerRadius() const; - qreal baseOpacity() const; - - bool hasFixedRippleRadius() const; - - ui::Role role() const; - ui::OverlayStyle overlayStyle() const; - ui::RippleStyle rippleStyle() const; - ui::ButtonIconPlacement iconPlacement() const; - - Qt::BGMode backgroundMode() const; - - QSize sizeHint() const override; - -protected: - int IconPadding = 0; - - void checkStateSet() override; - void mousePressEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - void resizeEvent(QResizeEvent *event) override; - void paintEvent(QPaintEvent *event) override; - - virtual void paintBackground(QPainter *painter); - virtual void paintForeground(QPainter *painter); - virtual void updateClipPath(); - - void init(); - -signals: - void foregroundColorChanged(); - void backgroundColorChanged(); - void overlayColorChanged(); - void disabledForegroundColorChanged(); - void disabledBackgroundColorChanged(); - void fontSizeChanged(); - -private: - RippleOverlay *ripple_overlay_; - FlatButtonStateMachine *state_machine_; - - ui::Role role_; - ui::RippleStyle ripple_style_; - ui::ButtonIconPlacement icon_placement_; - ui::OverlayStyle overlay_style_; - - Qt::BGMode bg_mode_; - - QColor background_color_; - QColor foreground_color_; - QColor overlay_color_; - QColor disabled_color_; - QColor disabled_background_color_; - - qreal fixed_ripple_radius_; - qreal corner_radius_; - qreal base_opacity_; - qreal font_size_; - - bool use_fixed_ripple_radius_; -}; diff --git a/src/ui/Label.cpp b/src/ui/Label.cpp deleted file mode 100644 index 40d2cfa4..00000000 --- a/src/ui/Label.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-FileCopyrightText: 2017 Konstantinos Sideris <siderisk@auth.gr> -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "Label.h" -#include <QMouseEvent> - -Label::Label(QWidget *parent, Qt::WindowFlags f) - : QLabel(parent, f) -{} - -Label::Label(const QString &text, QWidget *parent, Qt::WindowFlags f) - : QLabel(text, parent, f) -{} - -void -Label::mousePressEvent(QMouseEvent *e) -{ - pressPosition_ = e->pos(); - emit pressed(e); - QLabel::mousePressEvent(e); -} - -void -Label::mouseReleaseEvent(QMouseEvent *e) -{ - emit released(e); - if (pressPosition_ == e->pos()) - emit clicked(e); - QLabel::mouseReleaseEvent(e); -} diff --git a/src/ui/Label.h b/src/ui/Label.h deleted file mode 100644 index 034e3c6c..00000000 --- a/src/ui/Label.h +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QLabel> - -class Label : public QLabel -{ - Q_OBJECT - -public: - explicit Label(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); - explicit Label(const QString &text, - QWidget *parent = Q_NULLPTR, - Qt::WindowFlags f = Qt::WindowFlags()); - -signals: - void clicked(QMouseEvent *e); - void pressed(QMouseEvent *e); - void released(QMouseEvent *e); - -protected: - void mousePressEvent(QMouseEvent *e) override; - void mouseReleaseEvent(QMouseEvent *e) override; - - QPoint pressPosition_; -}; diff --git a/src/ui/LoadingIndicator.cpp b/src/ui/LoadingIndicator.cpp deleted file mode 100644 index 151f0750..00000000 --- a/src/ui/LoadingIndicator.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "LoadingIndicator.h" - -#include <QPaintEvent> -#include <QPainter> -#include <QTimer> - -LoadingIndicator::LoadingIndicator(QWidget *parent) - : QWidget(parent) - , interval_(70) - , angle_(0) - , color_(Qt::black) -{ - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - setFocusPolicy(Qt::NoFocus); - - timer_ = new QTimer(this); - connect(timer_, SIGNAL(timeout()), this, SLOT(onTimeout())); -} - -void -LoadingIndicator::paintEvent(QPaintEvent *e) -{ - Q_UNUSED(e) - - if (!timer_->isActive()) - return; - - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - - int width = qMin(this->width(), this->height()); - - int outerRadius = (width - 4) * 0.5f; - int innerRadius = outerRadius * 0.78f; - - int capsuleRadius = (outerRadius - innerRadius) / 2; - - for (int i = 0; i < 8; ++i) { - QColor color = color_; - - color.setAlphaF(1.0f - (i / 8.0f)); - - painter.setPen(Qt::NoPen); - painter.setBrush(color); - - qreal radius = capsuleRadius * (1.0f - (i / 16.0f)); - - painter.save(); - - painter.translate(rect().center()); - painter.rotate(angle_ - i * 45.0f); - - QPointF center = QPointF(-capsuleRadius, -innerRadius); - painter.drawEllipse(center, radius * 2, radius * 2); - - painter.restore(); - } -} - -void -LoadingIndicator::start() -{ - timer_->start(interval_); - show(); -} - -void -LoadingIndicator::stop() -{ - timer_->stop(); - hide(); -} - -void -LoadingIndicator::onTimeout() -{ - angle_ = (angle_ + 45) % 360; - repaint(); -} diff --git a/src/ui/LoadingIndicator.h b/src/ui/LoadingIndicator.h deleted file mode 100644 index 6d3f2a89..00000000 --- a/src/ui/LoadingIndicator.h +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QColor> -#include <QWidget> - -class QPainter; -class QTimer; -class QPaintEvent; -class LoadingIndicator : public QWidget -{ - Q_OBJECT - Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) - -public: - LoadingIndicator(QWidget *parent = nullptr); - - void paintEvent(QPaintEvent *e) override; - - void start(); - void stop(); - - QColor color() { return color_; } - void setColor(QColor color) - { - color_ = color; - emit colorChanged(); - } - - int interval() { return interval_; } - void setInterval(int interval) { interval_ = interval; } - -private slots: - void onTimeout(); - -signals: - void colorChanged(); - -private: - int interval_; - int angle_; - - QColor color_; - QTimer *timer_; -}; diff --git a/src/ui/Menu.h b/src/ui/Menu.h deleted file mode 100644 index a666229a..00000000 --- a/src/ui/Menu.h +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QMenu> - -#include "Config.h" - -class Menu : public QMenu -{ - Q_OBJECT -public: - Menu(QWidget *parent = nullptr) - : QMenu(parent){}; - -protected: - void leaveEvent(QEvent *e) override - { - hide(); - - QMenu::leaveEvent(e); - } -}; diff --git a/src/ui/OverlayModal.cpp b/src/ui/OverlayModal.cpp deleted file mode 100644 index 88334ce8..00000000 --- a/src/ui/OverlayModal.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-FileCopyrightText: 2017 Konstantinos Sideris <siderisk@auth.gr> -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include <QPainter> -#include <QVBoxLayout> - -#include "OverlayModal.h" - -OverlayModal::OverlayModal(QWidget *parent) - : OverlayWidget(parent) - , color_{QColor(30, 30, 30, 170)} -{ - layout_ = new QVBoxLayout(this); - layout_->setSpacing(0); - layout_->setContentsMargins(10, 40, 10, 20); - setContentAlignment(Qt::AlignCenter); -} - -void -OverlayModal::setWidget(QWidget *widget) -{ - // Delete the previous widget - if (layout_->count() > 0) { - QLayoutItem *item; - while ((item = layout_->takeAt(0)) != nullptr) { - delete item->widget(); - delete item; - } - } - - layout_->addWidget(widget); - content_ = widget; - content_->setFocus(); -} - -void -OverlayModal::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - - QPainter painter(this); - painter.fillRect(rect(), color_); -} - -void -OverlayModal::mousePressEvent(QMouseEvent *e) -{ - if (isDismissible_ && content_ && !content_->geometry().contains(e->pos())) - hide(); -} - -void -OverlayModal::keyPressEvent(QKeyEvent *event) -{ - if (event->key() == Qt::Key_Escape) { - event->accept(); - hide(); - } -} diff --git a/src/ui/OverlayModal.h b/src/ui/OverlayModal.h deleted file mode 100644 index 5e7ecc20..00000000 --- a/src/ui/OverlayModal.h +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-FileCopyrightText: 2017 Konstantinos Sideris <siderisk@auth.gr> -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QKeyEvent> -#include <QMouseEvent> -#include <QPaintEvent> -#include <QVBoxLayout> - -#include "OverlayWidget.h" - -class OverlayModal : public OverlayWidget -{ -public: - OverlayModal(QWidget *parent); - - void setColor(QColor color) { color_ = color; } - void setDismissible(bool state) { isDismissible_ = state; } - - void setContentAlignment(QFlags<Qt::AlignmentFlag> flag) { layout_->setAlignment(flag); } - void setWidget(QWidget *widget); - -protected: - void paintEvent(QPaintEvent *event) override; - void keyPressEvent(QKeyEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; - -private: - QWidget *content_; - QVBoxLayout *layout_; - - QColor color_; - - //! Decides whether or not the modal can be removed by clicking into it. - bool isDismissible_ = true; -}; diff --git a/src/ui/Painter.h b/src/ui/Painter.h deleted file mode 100644 index 5a7dae3e..00000000 --- a/src/ui/Painter.h +++ /dev/null @@ -1,154 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QFontMetrics> -#include <QPaintDevice> -#include <QPainter> -#include <QPainterPath> -#include <QtGlobal> - -class Painter : public QPainter -{ -public: - explicit Painter(QPaintDevice *device) - : QPainter(device) - {} - - void drawTextLeft(int x, int y, const QString &text) - { - QFontMetrics m(fontMetrics()); - drawText(x, y + m.ascent(), text); - } - - void drawTextRight(int x, int y, int outerw, const QString &text, int textWidth = -1) - { - QFontMetrics m(fontMetrics()); - if (textWidth < 0) { - textWidth = m.horizontalAdvance(text); - } - drawText((outerw - x - textWidth), y + m.ascent(), text); - } - - void drawPixmapLeft(int x, int y, const QPixmap &pix, const QRect &from) - { - drawPixmap(QPoint(x, y), pix, from); - } - - void drawPixmapLeft(const QPoint &p, const QPixmap &pix, const QRect &from) - { - return drawPixmapLeft(p.x(), p.y(), pix, from); - } - - void drawPixmapLeft(int x, int y, int w, int h, const QPixmap &pix, const QRect &from) - { - drawPixmap(QRect(x, y, w, h), pix, from); - } - - void drawPixmapLeft(const QRect &r, const QPixmap &pix, const QRect &from) - { - return drawPixmapLeft(r.x(), r.y(), r.width(), r.height(), pix, from); - } - - void drawPixmapLeft(int x, int y, int outerw, const QPixmap &pix) - { - Q_UNUSED(outerw); - drawPixmap(QPoint(x, y), pix); - } - - void drawPixmapLeft(const QPoint &p, int outerw, const QPixmap &pix) - { - return drawPixmapLeft(p.x(), p.y(), outerw, pix); - } - - void drawPixmapRight(int x, int y, int outerw, const QPixmap &pix, const QRect &from) - { - drawPixmap(QPoint((outerw - x - (from.width() / pix.devicePixelRatio())), y), pix, from); - } - - void drawPixmapRight(const QPoint &p, int outerw, const QPixmap &pix, const QRect &from) - { - return drawPixmapRight(p.x(), p.y(), outerw, pix, from); - } - void - drawPixmapRight(int x, int y, int w, int h, int outerw, const QPixmap &pix, const QRect &from) - { - drawPixmap(QRect((outerw - x - w), y, w, h), pix, from); - } - - void drawPixmapRight(const QRect &r, int outerw, const QPixmap &pix, const QRect &from) - { - return drawPixmapRight(r.x(), r.y(), r.width(), r.height(), outerw, pix, from); - } - - void drawPixmapRight(int x, int y, int outerw, const QPixmap &pix) - { - drawPixmap(QPoint((outerw - x - (pix.width() / pix.devicePixelRatio())), y), pix); - } - - void drawPixmapRight(const QPoint &p, int outerw, const QPixmap &pix) - { - return drawPixmapRight(p.x(), p.y(), outerw, pix); - } - - void drawAvatar(const QPixmap &pix, int w, int h, int d) - { - QPainterPath pp; - pp.addEllipse((w - d) / 2, (h - d) / 2, d, d); - - QRect region((w - d) / 2, (h - d) / 2, d, d); - - setClipPath(pp); - drawPixmap(region, pix); - } - - void drawLetterAvatar(const QString &c, - const QColor &penColor, - const QColor &brushColor, - int w, - int h, - int d) - { - QRect region((w - d) / 2, (h - d) / 2, d, d); - - setPen(Qt::NoPen); - setBrush(brushColor); - - drawEllipse(region.center(), d / 2, d / 2); - - setBrush(Qt::NoBrush); - drawEllipse(region.center(), d / 2, d / 2); - - setPen(penColor); - drawText(region.translated(0, -1), Qt::AlignCenter, c); - } -}; - -class PainterHighQualityEnabler -{ -public: - PainterHighQualityEnabler(Painter &p) - : _painter(p) - { - hints_ = - QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing; - - _painter.setRenderHints(hints_); - } - - ~PainterHighQualityEnabler() - { - if (hints_) - _painter.setRenderHints(hints_, false); - } - - PainterHighQualityEnabler(const PainterHighQualityEnabler &other) = delete; - PainterHighQualityEnabler &operator=(const PainterHighQualityEnabler &other) = delete; - -private: - Painter &_painter; - QPainter::RenderHints hints_ = {}; -}; diff --git a/src/ui/RaisedButton.cpp b/src/ui/RaisedButton.cpp deleted file mode 100644 index 491ab573..00000000 --- a/src/ui/RaisedButton.cpp +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include <QEventTransition> -#include <QPropertyAnimation> - -#include "RaisedButton.h" - -void -RaisedButton::init() -{ - shadow_state_machine_ = new QStateMachine(this); - normal_state_ = new QState; - pressed_state_ = new QState; - effect_ = new QGraphicsDropShadowEffect; - - effect_->setBlurRadius(7); - effect_->setOffset(QPointF(0, 2)); - effect_->setColor(QColor(0, 0, 0, 75)); - - setBackgroundMode(Qt::OpaqueMode); - setMinimumHeight(42); - setGraphicsEffect(effect_); - setBaseOpacity(0.3); - - shadow_state_machine_->addState(normal_state_); - shadow_state_machine_->addState(pressed_state_); - - normal_state_->assignProperty(effect_, "offset", QPointF(0, 2)); - normal_state_->assignProperty(effect_, "blurRadius", 7); - - pressed_state_->assignProperty(effect_, "offset", QPointF(0, 5)); - pressed_state_->assignProperty(effect_, "blurRadius", 29); - - QAbstractTransition *transition; - - transition = new QEventTransition(this, QEvent::MouseButtonPress); - transition->setTargetState(pressed_state_); - normal_state_->addTransition(transition); - - transition = new QEventTransition(this, QEvent::MouseButtonDblClick); - transition->setTargetState(pressed_state_); - normal_state_->addTransition(transition); - - transition = new QEventTransition(this, QEvent::MouseButtonRelease); - transition->setTargetState(normal_state_); - pressed_state_->addTransition(transition); - - QPropertyAnimation *animation; - - animation = new QPropertyAnimation(effect_, "offset", this); - animation->setDuration(100); - shadow_state_machine_->addDefaultAnimation(animation); - - animation = new QPropertyAnimation(effect_, "blurRadius", this); - animation->setDuration(100); - shadow_state_machine_->addDefaultAnimation(animation); - - shadow_state_machine_->setInitialState(normal_state_); - shadow_state_machine_->start(); -} - -RaisedButton::RaisedButton(QWidget *parent) - : FlatButton(parent) -{ - init(); -} - -RaisedButton::RaisedButton(const QString &text, QWidget *parent) - : FlatButton(parent) -{ - init(); - setText(text); -} - -bool -RaisedButton::event(QEvent *event) -{ - if (QEvent::EnabledChange == event->type()) { - if (isEnabled()) { - shadow_state_machine_->start(); - effect_->setEnabled(true); - } else { - shadow_state_machine_->stop(); - effect_->setEnabled(false); - } - } - - return FlatButton::event(event); -} diff --git a/src/ui/RaisedButton.h b/src/ui/RaisedButton.h deleted file mode 100644 index 7464c207..00000000 --- a/src/ui/RaisedButton.h +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QGraphicsDropShadowEffect> -#include <QState> -#include <QStateMachine> - -#include "FlatButton.h" - -class RaisedButton : public FlatButton -{ - Q_OBJECT - -public: - explicit RaisedButton(QWidget *parent = nullptr); - explicit RaisedButton(const QString &text, QWidget *parent = nullptr); - -protected: - bool event(QEvent *event) override; - -private: - void init(); - - QStateMachine *shadow_state_machine_; - QState *normal_state_; - QState *pressed_state_; - QGraphicsDropShadowEffect *effect_; -}; diff --git a/src/ui/Ripple.cpp b/src/ui/Ripple.cpp deleted file mode 100644 index 84c0b394..00000000 --- a/src/ui/Ripple.cpp +++ /dev/null @@ -1,116 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "Ripple.h" -#include "RippleOverlay.h" - -Ripple::Ripple(const QPoint ¢er, QObject *parent) - : QParallelAnimationGroup(parent) - , overlay_(nullptr) - , radius_anim_(animate("radius")) - , opacity_anim_(animate("opacity")) - , radius_(0) - , opacity_(0) - , center_(center) -{ - init(); -} - -Ripple::Ripple(const QPoint ¢er, RippleOverlay *overlay, QObject *parent) - : QParallelAnimationGroup(parent) - , overlay_(overlay) - , radius_anim_(animate("radius")) - , opacity_anim_(animate("opacity")) - , radius_(0) - , opacity_(0) - , center_(center) -{ - init(); -} - -void -Ripple::setRadius(qreal radius) -{ - Q_ASSERT(overlay_); - - if (radius_ == radius) - return; - - radius_ = radius; - overlay_->update(); - - emit radiusChanged(); -} - -void -Ripple::setOpacity(qreal opacity) -{ - Q_ASSERT(overlay_); - - if (opacity_ == opacity) - return; - - opacity_ = opacity; - overlay_->update(); - - emit opacityChanged(); -} - -void -Ripple::setColor(const QColor &color) -{ - if (brush_.color() == color) - return; - - brush_.setColor(color); - - if (overlay_) - overlay_->update(); -} - -void -Ripple::setBrush(const QBrush &brush) -{ - brush_ = brush; - - if (overlay_) - overlay_->update(); -} - -void -Ripple::destroy() -{ - Q_ASSERT(overlay_); - - overlay_->removeRipple(this); -} - -QPropertyAnimation * -Ripple::animate(const QByteArray &property, const QEasingCurve &easing, int duration) -{ - QPropertyAnimation *animation = new QPropertyAnimation; - animation->setTargetObject(this); - animation->setPropertyName(property); - animation->setEasingCurve(easing); - animation->setDuration(duration); - - addAnimation(animation); - - return animation; -} - -void -Ripple::init() -{ - setOpacityStartValue(0.5); - setOpacityEndValue(0); - setRadiusStartValue(0); - setRadiusEndValue(300); - - brush_.setColor(Qt::black); - brush_.setStyle(Qt::SolidPattern); - - connect(this, SIGNAL(finished()), this, SLOT(destroy())); -} diff --git a/src/ui/Ripple.h b/src/ui/Ripple.h deleted file mode 100644 index 43d291cb..00000000 --- a/src/ui/Ripple.h +++ /dev/null @@ -1,154 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QBrush> -#include <QEasingCurve> -#include <QParallelAnimationGroup> -#include <QPoint> -#include <QPropertyAnimation> - -class RippleOverlay; - -class Ripple : public QParallelAnimationGroup -{ - Q_OBJECT - - 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); - Ripple(const QPoint ¢er, RippleOverlay *overlay, QObject *parent = nullptr); - - inline void setOverlay(RippleOverlay *overlay); - - void setRadius(qreal radius); - void setOpacity(qreal opacity); - void setColor(const QColor &color); - void setBrush(const QBrush &brush); - - inline qreal radius() const; - inline qreal opacity() const; - inline QColor color() const; - inline QBrush brush() const; - inline QPoint center() const; - - inline QPropertyAnimation *radiusAnimation() const; - inline QPropertyAnimation *opacityAnimation() const; - - inline void setOpacityStartValue(qreal value); - inline void setOpacityEndValue(qreal value); - inline void setRadiusStartValue(qreal value); - inline void setRadiusEndValue(qreal value); - inline void setDuration(int msecs); - -protected slots: - void destroy(); - -signals: - void radiusChanged(); - void opacityChanged(); - -private: - Q_DISABLE_COPY(Ripple) - - QPropertyAnimation *animate(const QByteArray &property, - const QEasingCurve &easing = QEasingCurve::OutQuad, - int duration = 800); - - void init(); - - RippleOverlay *overlay_; - - QPropertyAnimation *const radius_anim_; - QPropertyAnimation *const opacity_anim_; - - qreal radius_; - qreal opacity_; - - QPoint center_; - QBrush brush_; -}; - -inline void -Ripple::setOverlay(RippleOverlay *overlay) -{ - overlay_ = overlay; -} - -inline qreal -Ripple::radius() const -{ - return radius_; -} - -inline qreal -Ripple::opacity() const -{ - return opacity_; -} - -inline QColor -Ripple::color() const -{ - return brush_.color(); -} - -inline QBrush -Ripple::brush() const -{ - return brush_; -} - -inline QPoint -Ripple::center() const -{ - return center_; -} - -inline QPropertyAnimation * -Ripple::radiusAnimation() const -{ - return radius_anim_; -} - -inline QPropertyAnimation * -Ripple::opacityAnimation() const -{ - return opacity_anim_; -} - -inline void -Ripple::setOpacityStartValue(qreal value) -{ - opacity_anim_->setStartValue(value); -} - -inline void -Ripple::setOpacityEndValue(qreal value) -{ - opacity_anim_->setEndValue(value); -} - -inline void -Ripple::setRadiusStartValue(qreal value) -{ - radius_anim_->setStartValue(value); -} - -inline void -Ripple::setRadiusEndValue(qreal value) -{ - radius_anim_->setEndValue(value); -} - -inline void -Ripple::setDuration(int msecs) -{ - radius_anim_->setDuration(msecs); - opacity_anim_->setDuration(msecs); -} diff --git a/src/ui/RippleOverlay.cpp b/src/ui/RippleOverlay.cpp deleted file mode 100644 index 97ad8662..00000000 --- a/src/ui/RippleOverlay.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include <QPainter> - -#include "Ripple.h" -#include "RippleOverlay.h" - -RippleOverlay::RippleOverlay(QWidget *parent) - : OverlayWidget(parent) - , use_clip_(false) -{ - setAttribute(Qt::WA_TransparentForMouseEvents); - setAttribute(Qt::WA_NoSystemBackground); -} - -void -RippleOverlay::addRipple(Ripple *ripple) -{ - ripple->setOverlay(this); - ripples_.push_back(ripple); - ripple->start(); -} - -void -RippleOverlay::addRipple(const QPoint &position, qreal radius) -{ - Ripple *ripple = new Ripple(position); - ripple->setRadiusEndValue(radius); - addRipple(ripple); -} - -void -RippleOverlay::removeRipple(Ripple *ripple) -{ - if (ripples_.removeOne(ripple)) - delete ripple; -} - -void -RippleOverlay::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event) - - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - painter.setPen(Qt::NoPen); - - if (use_clip_) - painter.setClipPath(clip_path_); - - for (auto it = ripples_.constBegin(); it != ripples_.constEnd(); ++it) - paintRipple(&painter, *it); -} - -void -RippleOverlay::paintRipple(QPainter *painter, Ripple *ripple) -{ - const qreal radius = ripple->radius(); - const QPointF center = ripple->center(); - - painter->setOpacity(ripple->opacity()); - painter->setBrush(ripple->brush()); - painter->drawEllipse(center, radius, radius); -} diff --git a/src/ui/RippleOverlay.h b/src/ui/RippleOverlay.h deleted file mode 100644 index f70d00a7..00000000 --- a/src/ui/RippleOverlay.h +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QPainterPath> - -#include "OverlayWidget.h" - -class Ripple; - -class RippleOverlay : public OverlayWidget -{ - Q_OBJECT - -public: - explicit RippleOverlay(QWidget *parent = nullptr); - - void addRipple(Ripple *ripple); - void addRipple(const QPoint &position, qreal radius = 300); - - void removeRipple(Ripple *ripple); - - inline void setClipping(bool enable); - inline bool hasClipping() const; - - inline void setClipPath(const QPainterPath &path); - -protected: - void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; - -private: - Q_DISABLE_COPY(RippleOverlay) - - void paintRipple(QPainter *painter, Ripple *ripple); - - QList<Ripple *> ripples_; - QPainterPath clip_path_; - bool use_clip_; -}; - -inline void -RippleOverlay::setClipping(bool enable) -{ - use_clip_ = enable; - update(); -} - -inline bool -RippleOverlay::hasClipping() const -{ - return use_clip_; -} - -inline void -RippleOverlay::setClipPath(const QPainterPath &path) -{ - clip_path_ = path; - update(); -} diff --git a/src/ui/SnackBar.cpp b/src/ui/SnackBar.cpp deleted file mode 100644 index 50c3d3f9..00000000 --- a/src/ui/SnackBar.cpp +++ /dev/null @@ -1,136 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include <QPainter> - -#include "SnackBar.h" - -constexpr int STARTING_OFFSET = 1; -constexpr int BOX_PADDING = 10; -constexpr double MIN_WIDTH = 400.0; -constexpr double MIN_WIDTH_PERCENTAGE = 0.3; - -SnackBar::SnackBar(QWidget *parent) - : OverlayWidget(parent) - , offset_anim(this, "offset", this) -{ - QFont font; - font.setPointSizeF(font.pointSizeF() * 1.2); - font.setWeight(QFont::Weight::Thin); - setFont(font); - - boxHeight_ = QFontMetrics(font).height() * 2; - offset_ = STARTING_OFFSET; - position_ = SnackBarPosition::Top; - - hideTimer_.setSingleShot(true); - - offset_anim.setStartValue(1.0); - offset_anim.setEndValue(0.0); - offset_anim.setDuration(100); - offset_anim.setEasingCurve(QEasingCurve::OutCubic); - - connect(this, &SnackBar::offsetChanged, this, [this]() mutable { repaint(); }); - connect( - &offset_anim, &QPropertyAnimation::finished, this, [this]() { hideTimer_.start(10000); }); - - connect(&hideTimer_, SIGNAL(timeout()), this, SLOT(hideMessage())); - - hide(); -} - -void -SnackBar::start() -{ - if (messages_.empty()) - return; - - show(); - raise(); - - offset_anim.start(); -} - -void -SnackBar::hideMessage() -{ - stopTimers(); - hide(); - - if (!messages_.empty()) - // Moving on to the next message. - messages_.pop_front(); - - // Resetting the starting position of the widget. - offset_ = STARTING_OFFSET; - - if (!messages_.empty()) - start(); -} - -void -SnackBar::stopTimers() -{ - hideTimer_.stop(); -} - -void -SnackBar::showMessage(const QString &msg) -{ - messages_.push_back(msg); - - // There is already an active message. - if (isVisible()) - return; - - start(); -} - -void -SnackBar::mousePressEvent(QMouseEvent *) -{ - hideMessage(); -} - -void -SnackBar::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event) - - if (messages_.empty()) - return; - - auto message_ = messages_.front(); - - QPainter p(this); - p.setRenderHint(QPainter::Antialiasing); - - QBrush brush; - brush.setStyle(Qt::SolidPattern); - brush.setColor(bgColor_); - p.setBrush(brush); - - QRect r(0, 0, std::max(MIN_WIDTH, width() * MIN_WIDTH_PERCENTAGE), boxHeight_); - - p.setPen(Qt::white); - QRect br = p.boundingRect(r, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, message_); - - p.setPen(Qt::NoPen); - r = br.united(r).adjusted(-BOX_PADDING, -BOX_PADDING, BOX_PADDING, BOX_PADDING); - - const qreal s = 1 - offset_; - - if (position_ == SnackBarPosition::Bottom) - p.translate((width() - (r.width() - 2 * BOX_PADDING)) / 2, - height() - BOX_PADDING - s * (r.height())); - else - p.translate((width() - (r.width() - 2 * BOX_PADDING)) / 2, - s * (r.height()) - 2 * BOX_PADDING); - - br.moveCenter(r.center()); - p.drawRoundedRect(r.adjusted(0, 0, 0, 4), 4, 4); - p.setPen(textColor_); - p.drawText(br, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, message_); -} diff --git a/src/ui/SnackBar.h b/src/ui/SnackBar.h deleted file mode 100644 index caac68aa..00000000 --- a/src/ui/SnackBar.h +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QCoreApplication> -#include <QPaintEvent> -#include <QPropertyAnimation> -#include <QTimer> -#include <deque> - -#include "OverlayWidget.h" - -enum class SnackBarPosition -{ - Bottom, - Top, -}; - -class SnackBar : public OverlayWidget -{ - Q_OBJECT - - 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: - explicit SnackBar(QWidget *parent); - - QColor backgroundColor() const { return bgColor_; } - void setBackgroundColor(const QColor &color) - { - bgColor_ = color; - update(); - emit backgroundColorChanged(); - } - - QColor textColor() const { return textColor_; } - void setTextColor(const QColor &color) - { - textColor_ = color; - update(); - emit textColorChanged(); - } - void setPosition(SnackBarPosition pos) - { - position_ = pos; - update(); - } - - double offset() { return offset_; } - void setOffset(double offset) - { - if (offset != offset_) { - offset_ = offset; - emit offsetChanged(); - } - } - -public slots: - void showMessage(const QString &msg); - -signals: - void offsetChanged(); - void backgroundColorChanged(); - void textColorChanged(); - -protected: - void paintEvent(QPaintEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; - -private slots: - void hideMessage(); - -private: - void stopTimers(); - void start(); - - QColor bgColor_; - QColor textColor_; - - qreal bgOpacity_; - qreal offset_; - - std::deque<QString> messages_; - - QTimer hideTimer_; - - double boxHeight_; - - QPropertyAnimation offset_anim; - - SnackBarPosition position_; -}; diff --git a/src/ui/TextLabel.cpp b/src/ui/TextLabel.cpp deleted file mode 100644 index 246d9d6b..00000000 --- a/src/ui/TextLabel.cpp +++ /dev/null @@ -1,123 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "ui/TextLabel.h" - -#include <QAbstractTextDocumentLayout> -#include <QDesktopServices> -#include <QEvent> -#include <QWheelEvent> - -#include "Utils.h" - -bool -ContextMenuFilter::eventFilter(QObject *obj, QEvent *event) -{ - if (event->type() == QEvent::MouseButtonPress) { - emit contextMenuIsOpening(); - return true; - } - - return QObject::eventFilter(obj, event); -} - -TextLabel::TextLabel(QWidget *parent) - : TextLabel(QString(), parent) -{} - -TextLabel::TextLabel(const QString &text, QWidget *parent) - : QTextBrowser(parent) -{ - document()->setDefaultStyleSheet(QStringLiteral("a {color: %1; }").arg(utils::linkColor())); - - setText(text); - setOpenExternalLinks(true); - - // Make it look and feel like an ordinary label. - setReadOnly(true); - setFrameStyle(QFrame::NoFrame); - QPalette pal = palette(); - pal.setColor(QPalette::Base, Qt::transparent); - setPalette(pal); - - // Wrap anywhere but prefer words, adjust minimum height on the fly. - setLineWrapMode(QTextEdit::WidgetWidth); - setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); - connect(document()->documentLayout(), - &QAbstractTextDocumentLayout::documentSizeChanged, - this, - &TextLabel::adjustHeight); - document()->setDocumentMargin(0); - - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - setFixedHeight(0); - - connect(this, &TextLabel::linkActivated, this, &TextLabel::handleLinkActivation); - - auto filter = new ContextMenuFilter(this); - installEventFilter(filter); - connect(filter, &ContextMenuFilter::contextMenuIsOpening, this, [this]() { - contextMenuRequested_ = true; - }); -} - -void -TextLabel::focusOutEvent(QFocusEvent *e) -{ - QTextBrowser::focusOutEvent(e); - - // We keep the selection available for the context menu. - if (contextMenuRequested_) { - contextMenuRequested_ = false; - return; - } - - QTextCursor cursor = textCursor(); - cursor.clearSelection(); - setTextCursor(cursor); -} - -void -TextLabel::mousePressEvent(QMouseEvent *e) -{ - link_ = (e->button() & Qt::LeftButton) ? anchorAt(e->pos()) : QString(); - QTextBrowser::mousePressEvent(e); -} - -void -TextLabel::mouseReleaseEvent(QMouseEvent *e) -{ - if (e->button() & Qt::LeftButton && !link_.isEmpty() && anchorAt(e->pos()) == link_) { - emit linkActivated(link_); - return; - } - - QTextBrowser::mouseReleaseEvent(e); -} - -void -TextLabel::wheelEvent(QWheelEvent *event) -{ - event->ignore(); -} - -void -TextLabel::handleLinkActivation(const QUrl &url) -{ - auto parts = url.toString().split('/'); - auto defaultHandler = [](const QUrl &url) { QDesktopServices::openUrl(url); }; - - if (url.host() != QLatin1String("matrix.to") || parts.isEmpty()) - return defaultHandler(url); - - try { - using namespace mtx::identifiers; - parse<User>(parts.last().toStdString()); - } catch (const std::exception &) { - return defaultHandler(url); - } - - emit userProfileTriggered(parts.last()); -} diff --git a/src/ui/TextLabel.h b/src/ui/TextLabel.h deleted file mode 100644 index 2c6f4aa3..00000000 --- a/src/ui/TextLabel.h +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// SPDX-FileCopyrightText: 2022 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QSize> -#include <QString> -#include <QTextBrowser> -#include <QUrl> - -class QMouseEvent; -class QFocusEvent; -class QWheelEvent; - -class ContextMenuFilter : public QObject -{ - Q_OBJECT - -public: - explicit ContextMenuFilter(QWidget *parent) - : QObject(parent) - {} - -signals: - void contextMenuIsOpening(); - -protected: - bool eventFilter(QObject *obj, QEvent *event) override; -}; - -class TextLabel : public QTextBrowser -{ - Q_OBJECT - -public: - TextLabel(const QString &text, QWidget *parent = nullptr); - TextLabel(QWidget *parent = nullptr); - - void wheelEvent(QWheelEvent *event) override; - void clearLinks() { link_.clear(); } - -protected: - void mousePressEvent(QMouseEvent *e) override; - void mouseReleaseEvent(QMouseEvent *e) override; - void focusOutEvent(QFocusEvent *e) override; - -private slots: - void adjustHeight(const QSizeF &size) { setFixedHeight(size.height()); } - void handleLinkActivation(const QUrl &link); - -signals: - void userProfileTriggered(const QString &user_id); - void linkActivated(const QUrl &link); - -private: - QString link_; - bool contextMenuRequested_ = false; -}; |