From 8e80b9cb0646025bb2255c341f404af838f183e0 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 19 May 2022 03:30:46 +0300 Subject: [PATCH] Moved out gradient round button to td_ui. --- .../SourceFiles/boxes/sticker_preview_box.cpp | 49 +------------------ .../ui/widgets/gradient_round_button.cpp | 47 ++++++++++++++++++ .../ui/widgets/gradient_round_button.h | 27 ++++++++++ Telegram/cmake/td_ui.cmake | 2 + Telegram/lib_ui | 2 +- 5 files changed, 79 insertions(+), 48 deletions(-) create mode 100644 Telegram/SourceFiles/ui/widgets/gradient_round_button.cpp create mode 100644 Telegram/SourceFiles/ui/widgets/gradient_round_button.h diff --git a/Telegram/SourceFiles/boxes/sticker_preview_box.cpp b/Telegram/SourceFiles/boxes/sticker_preview_box.cpp index 35da7eae0b..8dfbbffe8a 100644 --- a/Telegram/SourceFiles/boxes/sticker_preview_box.cpp +++ b/Telegram/SourceFiles/boxes/sticker_preview_box.cpp @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/chat/chat_theme.h" #include "ui/layers/generic_box.h" #include "ui/widgets/buttons.h" +#include "ui/widgets/gradient_round_button.h" #include "ui/wrap/padding_wrap.h" #include "lottie/lottie_single_player.h" #include "history/view/media/history_view_sticker.h" @@ -139,56 +140,10 @@ void PreloadSticker(const std::shared_ptr &media) { return result; } -class GradientButton final : public Ui::RippleButton { -public: - GradientButton(QWidget *widget, QGradientStops stops); - -private: - void paintEvent(QPaintEvent *e); - void validateBg(); - - QGradientStops _stops; - QImage _bg; - -}; - -GradientButton::GradientButton(QWidget *widget, QGradientStops stops) -: RippleButton(widget, st::defaultRippleAnimation) -, _stops(std::move(stops)) { -} - -void GradientButton::paintEvent(QPaintEvent *e) { - QPainter p(this); - - validateBg(); - p.drawImage(0, 0, _bg); - const auto ripple = QColor(0, 0, 0, 36); - paintRipple(p, 0, 0, &ripple); -} - -void GradientButton::validateBg() { - const auto factor = devicePixelRatio(); - if (!_bg.isNull() - && (_bg.devicePixelRatio() == factor) - && (_bg.size() == size() * factor)) { - return; - } - _bg = QImage(size() * factor, QImage::Format_ARGB32_Premultiplied); - _bg.setDevicePixelRatio(factor); - - auto p = QPainter(&_bg); - auto gradient = QLinearGradient(QPointF(0, 0), QPointF(width(), 0)); - gradient.setStops(_stops); - p.fillRect(rect(), gradient); - p.end(); - - _bg = Images::Round(std::move(_bg), ImageRoundRadius::Large); -} - [[nodiscard]] object_ptr CreateGradientButton( QWidget *parent, QGradientStops stops) { - return object_ptr(parent, std::move(stops)); + return object_ptr(parent, std::move(stops)); } [[nodiscard]] object_ptr CreatePremiumButton( diff --git a/Telegram/SourceFiles/ui/widgets/gradient_round_button.cpp b/Telegram/SourceFiles/ui/widgets/gradient_round_button.cpp new file mode 100644 index 0000000000..429b5f063a --- /dev/null +++ b/Telegram/SourceFiles/ui/widgets/gradient_round_button.cpp @@ -0,0 +1,47 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "ui/widgets/gradient_round_button.h" + +#include "ui/image/image_prepare.h" + +namespace Ui { + +GradientButton::GradientButton(QWidget *widget, QGradientStops stops) +: RippleButton(widget, st::defaultRippleAnimation) +, _stops(std::move(stops)) { +} + +void GradientButton::paintEvent(QPaintEvent *e) { + QPainter p(this); + + validateBg(); + p.drawImage(0, 0, _bg); + const auto ripple = QColor(0, 0, 0, 36); + paintRipple(p, 0, 0, &ripple); +} + +void GradientButton::validateBg() { + const auto factor = devicePixelRatio(); + if (!_bg.isNull() + && (_bg.devicePixelRatio() == factor) + && (_bg.size() == size() * factor)) { + return; + } + _bg = QImage(size() * factor, QImage::Format_ARGB32_Premultiplied); + _bg.setDevicePixelRatio(factor); + + auto p = QPainter(&_bg); + auto gradient = QLinearGradient(QPointF(0, 0), QPointF(width(), 0)); + gradient.setStops(_stops); + p.fillRect(rect(), gradient); + p.end(); + + _bg = Images::Round(std::move(_bg), ImageRoundRadius::Large); +} + +} // namespace Ui diff --git a/Telegram/SourceFiles/ui/widgets/gradient_round_button.h b/Telegram/SourceFiles/ui/widgets/gradient_round_button.h new file mode 100644 index 0000000000..4aa024e849 --- /dev/null +++ b/Telegram/SourceFiles/ui/widgets/gradient_round_button.h @@ -0,0 +1,27 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "ui/widgets/buttons.h" + +namespace Ui { + +class GradientButton final : public Ui::RippleButton { +public: + GradientButton(QWidget *widget, QGradientStops stops); + +private: + void paintEvent(QPaintEvent *e); + void validateBg(); + + QGradientStops _stops; + QImage _bg; + +}; + +} // namespace Ui diff --git a/Telegram/cmake/td_ui.cmake b/Telegram/cmake/td_ui.cmake index e9c21a4a77..4dacf7817d 100644 --- a/Telegram/cmake/td_ui.cmake +++ b/Telegram/cmake/td_ui.cmake @@ -241,6 +241,8 @@ PRIVATE ui/widgets/continuous_sliders.h ui/widgets/discrete_sliders.cpp ui/widgets/discrete_sliders.h + ui/widgets/gradient_round_button.cpp + ui/widgets/gradient_round_button.h ui/widgets/multi_select.cpp ui/widgets/multi_select.h ui/widgets/sent_code_field.cpp diff --git a/Telegram/lib_ui b/Telegram/lib_ui index 9c09b1fad0..cea7f128a5 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit 9c09b1fad07d5048b55a1dfcb27c7d1a585bba55 +Subproject commit cea7f128a55a3f93df956ad21eb51634f851cc70