Replaced CallButton with AbstractButton in mute button.
This commit is contained in:
parent
d61e1a7bde
commit
37d939a650
2 changed files with 76 additions and 64 deletions
|
|
@ -6,12 +6,14 @@
|
|||
//
|
||||
#include "ui/widgets/call_mute_button.h"
|
||||
|
||||
#include "base/event_filter.h"
|
||||
#include "base/flat_map.h"
|
||||
#include "ui/abstract_button.h"
|
||||
#include "ui/effects/gradient.h"
|
||||
#include "ui/effects/radial_animation.h"
|
||||
#include "ui/paint/blobs.h"
|
||||
#include "ui/painter.h"
|
||||
#include "ui/widgets/call_button.h"
|
||||
#include "ui/widgets/labels.h"
|
||||
|
||||
#include "styles/palette.h"
|
||||
#include "styles/style_widgets.h"
|
||||
|
|
@ -46,8 +48,8 @@ constexpr auto kOverrideColorRippleAlpha = 50;
|
|||
|
||||
constexpr auto kSwitchStateDuration = 120;
|
||||
|
||||
auto MuteBlobs() -> std::array<Paint::Blobs::BlobData, 3> {
|
||||
return {{
|
||||
auto MuteBlobs() {
|
||||
return std::vector<Paint::Blobs::BlobData>{
|
||||
{
|
||||
.segmentsCount = 6,
|
||||
.minScale = 1.,
|
||||
|
|
@ -82,7 +84,7 @@ auto MuteBlobs() -> std::array<Paint::Blobs::BlobData, 3> {
|
|||
.speedScale = 1.,
|
||||
.alpha = (76. / 255.),
|
||||
},
|
||||
}};
|
||||
};
|
||||
}
|
||||
|
||||
auto Colors() {
|
||||
|
|
@ -158,7 +160,7 @@ BlobsWidget::BlobsWidget(
|
|||
not_null<RpWidget*> parent,
|
||||
rpl::producer<bool> &&hideBlobs)
|
||||
: RpWidget(parent)
|
||||
, _blobs(MuteBlobs() | ranges::to_vector, kLevelDuration, kMaxLevel)
|
||||
, _blobs(MuteBlobs(), kLevelDuration, kMaxLevel)
|
||||
, _blobBrush(Qt::transparent)
|
||||
, _glowBrush(Qt::transparent)
|
||||
, _blobsLastTime(crl::now()) {
|
||||
|
|
@ -278,6 +280,7 @@ CallMuteButton::CallMuteButton(
|
|||
rpl::producer<bool> &&hideBlobs,
|
||||
CallMuteButtonState initial)
|
||||
: _state(initial)
|
||||
, _st(st::callMuteButtonActive)
|
||||
, _blobs(base::make_unique_q<BlobsWidget>(
|
||||
parent,
|
||||
rpl::combine(
|
||||
|
|
@ -290,25 +293,40 @@ CallMuteButton::CallMuteButton(
|
|||
) | rpl::map([](bool animDisabled, bool hide, bool isConnecting) {
|
||||
return isConnecting || !(!animDisabled && !hide);
|
||||
})))
|
||||
, _content(parent, st::callMuteButtonActive, &st::callMuteButtonMuted)
|
||||
, _content(base::make_unique_q<AbstractButton>(parent))
|
||||
, _label(base::make_unique_q<FlatLabel>(
|
||||
_content,
|
||||
_state.value(
|
||||
) | rpl::map([](const CallMuteButtonState &state) {
|
||||
return state.text;
|
||||
}),
|
||||
_st.label))
|
||||
, _radial(nullptr)
|
||||
, _colors(Colors())
|
||||
, _crossLineMuteAnimation(st::callMuteCrossLine) {
|
||||
init();
|
||||
}
|
||||
|
||||
void CallMuteButton::init() {
|
||||
_content->resize(_st.button.width, _st.button.height);
|
||||
|
||||
style::PaletteChanged(
|
||||
) | rpl::start_with_next([=] {
|
||||
_crossLineMuteAnimation.invalidate();
|
||||
}, lifetime());
|
||||
}
|
||||
|
||||
void CallMuteButton::init() {
|
||||
// Label text.
|
||||
auto text = _state.value(
|
||||
) | rpl::map([](const CallMuteButtonState &state) {
|
||||
return state.text;
|
||||
});
|
||||
_content.setText(std::move(text));
|
||||
_label->show();
|
||||
rpl::combine(
|
||||
_content->sizeValue(),
|
||||
_label->sizeValue()
|
||||
) | rpl::start_with_next([=](QSize my, QSize label) {
|
||||
_label->moveToLeft(
|
||||
(my.width() - label.width()) / 2,
|
||||
my.height() - label.height(),
|
||||
my.width());
|
||||
}, _label->lifetime());
|
||||
_label->setAttribute(Qt::WA_TransparentForMouseEvents);
|
||||
|
||||
_radialShowProgress.value(
|
||||
) | rpl::start_with_next([=](float64 value) {
|
||||
|
|
@ -319,7 +337,7 @@ void CallMuteButton::init() {
|
|||
}
|
||||
if ((value > 0.) && !anim::Disabled() && !_radial) {
|
||||
_radial = std::make_unique<InfiniteRadialAnimation>(
|
||||
[=] { _content.update(); },
|
||||
[=] { _content->update(); },
|
||||
st::callConnectingRadial);
|
||||
_radial->start();
|
||||
}
|
||||
|
|
@ -387,7 +405,7 @@ void CallMuteButton::init() {
|
|||
: InterpolateF(crossFrom, crossTo, value);
|
||||
if (crossProgress != _crossLineProgress) {
|
||||
_crossLineProgress = crossProgress;
|
||||
_content.update(_muteIconPosition);
|
||||
_content->update(_muteIconPosition);
|
||||
}
|
||||
|
||||
const auto radialShowProgress = (radialShowFrom == radialShowTo)
|
||||
|
|
@ -412,10 +430,10 @@ void CallMuteButton::init() {
|
|||
}, lifetime());
|
||||
|
||||
// Icon rect.
|
||||
_content.sizeValue(
|
||||
_content->sizeValue(
|
||||
) | rpl::start_with_next([=](QSize size) {
|
||||
const auto &icon = st::callMuteButtonActive.button.icon;
|
||||
const auto &pos = st::callMuteButtonActive.button.iconPosition;
|
||||
const auto &icon = _st.button.icon;
|
||||
const auto &pos = _st.button.iconPosition;
|
||||
|
||||
_muteIconPosition = QRect(
|
||||
(pos.x() < 0) ? ((size.width() - icon.width()) / 2) : pos.x(),
|
||||
|
|
@ -425,34 +443,23 @@ void CallMuteButton::init() {
|
|||
}, lifetime());
|
||||
|
||||
// Paint.
|
||||
auto filterCallback = [=](not_null<QEvent*> e) {
|
||||
if (e->type() != QEvent::Paint) {
|
||||
return base::EventFilterResult::Continue;
|
||||
}
|
||||
contentPaint();
|
||||
return base::EventFilterResult::Cancel;
|
||||
};
|
||||
_content->paintRequest(
|
||||
) | rpl::start_with_next([=](QRect clip) {
|
||||
Painter p(_content);
|
||||
|
||||
auto filter = base::install_event_filter(
|
||||
&_content,
|
||||
std::move(filterCallback));
|
||||
|
||||
lifetime().make_state<base::unique_qptr<QObject>>(std::move(filter));
|
||||
}
|
||||
|
||||
void CallMuteButton::contentPaint() {
|
||||
Painter p(&_content);
|
||||
|
||||
const auto progress = 1. - _crossLineProgress;
|
||||
_crossLineMuteAnimation.paint(p, _muteIconPosition.topLeft(), progress);
|
||||
|
||||
if (_radial) {
|
||||
p.setOpacity(_radialShowProgress.current());
|
||||
_radial->draw(
|
||||
_crossLineMuteAnimation.paint(
|
||||
p,
|
||||
st::callMuteButtonActive.bgPosition,
|
||||
_content.width());
|
||||
}
|
||||
_muteIconPosition.topLeft(),
|
||||
1. - _crossLineProgress);
|
||||
|
||||
if (_radial) {
|
||||
p.setOpacity(_radialShowProgress.current());
|
||||
_radial->draw(
|
||||
p,
|
||||
_st.bgPosition,
|
||||
_content->width());
|
||||
}
|
||||
}, _content->lifetime());
|
||||
}
|
||||
|
||||
void CallMuteButton::setState(const CallMuteButtonState &state) {
|
||||
|
|
@ -465,7 +472,7 @@ void CallMuteButton::setLevel(float level) {
|
|||
}
|
||||
|
||||
rpl::producer<Qt::MouseButton> CallMuteButton::clicks() const {
|
||||
return _content.clicks();
|
||||
return _content->clicks();
|
||||
}
|
||||
|
||||
QSize CallMuteButton::innerSize() const {
|
||||
|
|
@ -473,43 +480,43 @@ QSize CallMuteButton::innerSize() const {
|
|||
}
|
||||
|
||||
QRect CallMuteButton::innerGeometry() const {
|
||||
const auto skip = st::callMuteButtonActive.outerRadius;
|
||||
const auto &skip = _st.outerRadius;
|
||||
return QRect(
|
||||
_content.x(),
|
||||
_content.y(),
|
||||
_content.width() - 2 * skip,
|
||||
_content.width() - 2 * skip);
|
||||
_content->x(),
|
||||
_content->y(),
|
||||
_content->width() - 2 * skip,
|
||||
_content->width() - 2 * skip);
|
||||
}
|
||||
|
||||
void CallMuteButton::moveInner(QPoint position) {
|
||||
const auto skip = st::callMuteButtonActive.outerRadius;
|
||||
_content.move(position - QPoint(skip, skip));
|
||||
const auto &skip = _st.outerRadius;
|
||||
_content->move(position - QPoint(skip, skip));
|
||||
|
||||
{
|
||||
const auto offset = QPoint(
|
||||
(_blobs->width() - _content.width()) / 2,
|
||||
(_blobs->height() - _content.width()) / 2);
|
||||
_blobs->move(_content.pos() - offset);
|
||||
(_blobs->width() - _content->width()) / 2,
|
||||
(_blobs->height() - _content->width()) / 2);
|
||||
_blobs->move(_content->pos() - offset);
|
||||
}
|
||||
}
|
||||
|
||||
void CallMuteButton::setVisible(bool visible) {
|
||||
_content.setVisible(visible);
|
||||
_content->setVisible(visible);
|
||||
_blobs->setVisible(visible);
|
||||
}
|
||||
|
||||
void CallMuteButton::raise() {
|
||||
_blobs->raise();
|
||||
_content.raise();
|
||||
_content->raise();
|
||||
}
|
||||
|
||||
void CallMuteButton::lower() {
|
||||
_content.lower();
|
||||
_content->lower();
|
||||
_blobs->lower();
|
||||
}
|
||||
|
||||
void CallMuteButton::setEnableMouse(bool value) {
|
||||
_content.setAttribute(Qt::WA_TransparentForMouseEvents, !value);
|
||||
_content->setAttribute(Qt::WA_TransparentForMouseEvents, !value);
|
||||
}
|
||||
|
||||
void CallMuteButton::overridesColors(
|
||||
|
|
|
|||
|
|
@ -9,14 +9,17 @@
|
|||
#include "base/unique_qptr.h"
|
||||
#include "ui/effects/animations.h"
|
||||
#include "ui/effects/cross_line.h"
|
||||
#include "ui/widgets/call_button.h"
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
namespace Ui {
|
||||
|
||||
class BlobsWidget;
|
||||
|
||||
class AbstractButton;
|
||||
class FlatLabel;
|
||||
class InfiniteRadialAnimation;
|
||||
class RpWidget;
|
||||
|
||||
struct CallButtonColors;
|
||||
|
||||
enum class CallMuteButtonType {
|
||||
Connecting,
|
||||
|
|
@ -62,7 +65,6 @@ public:
|
|||
|
||||
private:
|
||||
void init();
|
||||
void contentPaint();
|
||||
void overridesColors(
|
||||
CallMuteButtonType fromType,
|
||||
CallMuteButtonType toType,
|
||||
|
|
@ -76,8 +78,11 @@ private:
|
|||
rpl::variable<float64> _radialShowProgress = 0.;
|
||||
QRect _muteIconPosition;
|
||||
|
||||
const style::CallButton &_st;
|
||||
|
||||
const base::unique_qptr<BlobsWidget> _blobs;
|
||||
CallButton _content;
|
||||
const base::unique_qptr<AbstractButton> _content;
|
||||
const base::unique_qptr<FlatLabel> _label;
|
||||
|
||||
std::unique_ptr<InfiniteRadialAnimation> _radial;
|
||||
const base::flat_map<CallMuteButtonType, std::vector<QColor>> _colors;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue