lib_ui/ui/widgets/call_mute_button.cpp
2020-11-28 14:59:40 +03:00

112 lines
2.9 KiB
C++

// This file is part of Desktop App Toolkit,
// a set of libraries for developing nice desktop applications.
//
// For license and copyright information please follow this link:
// https://github.com/desktop-app/legal/blob/master/LEGAL
//
#include "ui/widgets/call_mute_button.h"
#include "styles/style_widgets.h"
namespace Ui {
CallMuteButton::CallMuteButton(
not_null<QWidget*> parent,
CallMuteButtonState initial)
: _state(initial)
, _content(parent, st::callMuteButtonActive, &st::callMuteButtonMuted)
, _connecting(parent, st::callMuteButtonConnecting) {
if (_state.type == CallMuteButtonType::Connecting
|| _state.type == CallMuteButtonType::ForceMuted) {
_connecting.setText(rpl::single(_state.text));
_connecting.show();
_content.hide();
} else {
_content.setText(rpl::single(_state.text));
_content.setProgress((_state.type == CallMuteButtonType::Muted) ? 1. : 0.);
_connecting.hide();
_content.show();
}
_connecting.setAttribute(Qt::WA_TransparentForMouseEvents);
}
void CallMuteButton::setState(const CallMuteButtonState &state) {
if (state.type == CallMuteButtonType::Connecting
|| state.type == CallMuteButtonType::ForceMuted) {
if (_state.text != state.text) {
_connecting.setText(rpl::single(state.text));
}
if (!_connecting.isHidden() || !_content.isHidden()) {
_connecting.show();
}
_content.setOuterValue(0.);
_content.hide();
} else {
if (_state.text != state.text) {
_content.setText(rpl::single(state.text));
}
_content.setProgress((state.type == CallMuteButtonType::Muted) ? 1. : 0.);
if (!_connecting.isHidden() || !_content.isHidden()) {
_content.show();
}
_connecting.hide();
if (state.type == CallMuteButtonType::Active) {
_content.setOuterValue(_level);
} else {
_content.setOuterValue(0.);
}
}
_state = state;
}
void CallMuteButton::setLevel(float level) {
_level = level;
if (_state.type == CallMuteButtonType::Active) {
_content.setOuterValue(level);
}
}
rpl::producer<Qt::MouseButton> CallMuteButton::clicks() const {
return _content.clicks();
}
QSize CallMuteButton::innerSize() const {
const auto skip = st::callMuteButtonActive.outerRadius;
return QSize(
_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));
_connecting.move(_content.pos());
}
void CallMuteButton::setVisible(bool visible) {
if (!visible) {
_content.hide();
_connecting.hide();
} else if (_state.type == CallMuteButtonType::Connecting
|| _state.type == CallMuteButtonType::ForceMuted) {
_connecting.show();
} else {
_content.show();
}
}
void CallMuteButton::raise() {
_content.raise();
_connecting.raise();
}
void CallMuteButton::lower() {
_content.lower();
_connecting.lower();
}
rpl::lifetime &CallMuteButton::lifetime() {
return _content.lifetime();
}
} // namespace Ui