tdesktop/Telegram/SourceFiles/ui/controls/invite_link_buttons.cpp

172 lines
4.8 KiB
C++

/*
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/controls/invite_link_buttons.h"
#include "ui/widgets/buttons.h"
#include "ui/wrap/vertical_layout.h"
#include "ui/wrap/padding_wrap.h"
#include "ui/wrap/slide_wrap.h"
#include "lang/lang_keys.h"
#include "styles/style_chat_helpers.h"
#include "styles/style_info.h"
namespace Ui {
namespace {
class JoinedCountButton final : public AbstractButton {
public:
using AbstractButton::AbstractButton;
void onStateChanged(State was, StateChangeSource source) override {
update();
}
};
} // namespace
void AddCopyShareLinkButtons(
not_null<VerticalLayout*> container,
Fn<void()> copyLink,
Fn<void()> shareLink) {
const auto wrap = container->add(
object_ptr<FixedHeightWidget>(
container,
st::inviteLinkButton.height),
st::inviteLinkButtonsPadding);
const auto copy = CreateChild<RoundButton>(
wrap,
tr::lng_group_invite_copy(),
st::inviteLinkCopy);
copy->setTextTransform(RoundButton::TextTransform::NoTransform);
copy->setClickedCallback(copyLink);
const auto share = CreateChild<RoundButton>(
wrap,
tr::lng_group_invite_share(),
st::inviteLinkShare);
share->setTextTransform(RoundButton::TextTransform::NoTransform);
share->setClickedCallback(shareLink);
wrap->widthValue(
) | rpl::start_with_next([=](int width) {
const auto buttonWidth = (width - st::inviteLinkButtonsSkip) / 2;
copy->setFullWidth(buttonWidth);
share->setFullWidth(buttonWidth);
copy->moveToLeft(0, 0, width);
share->moveToRight(0, 0, width);
}, wrap->lifetime());
}
void AddReactivateLinkButton(
not_null<VerticalLayout*> container,
Fn<void()> editLink) {
const auto button = container->add(
object_ptr<RoundButton>(
container,
tr::lng_group_invite_reactivate(),
st::inviteLinkReactivate),
st::inviteLinkButtonsPadding);
button->setTextTransform(RoundButton::TextTransform::NoTransform);
button->setClickedCallback(editLink);
}
void AddDeleteLinkButton(
not_null<VerticalLayout*> container,
Fn<void()> deleteLink) {
const auto button = container->add(
object_ptr<RoundButton>(
container,
tr::lng_group_invite_delete(),
st::inviteLinkDelete),
st::inviteLinkButtonsPadding);
button->setTextTransform(RoundButton::TextTransform::NoTransform);
button->setClickedCallback(deleteLink);
}
not_null<AbstractButton*> AddJoinedCountButton(
not_null<VerticalLayout*> container,
rpl::producer<JoinedCountContent> content,
style::margins padding) {
struct State {
JoinedCountContent content;
QString phrase;
int addedWidth = 0;
};
const auto wrap = container->add(
object_ptr<Ui::SlideWrap<Ui::FixedHeightWidget>>(
container,
object_ptr<Ui::FixedHeightWidget>(
container,
st::inviteLinkUserpics.size),
QMargins(padding.left(), padding.top(), padding.right(), 0)),
QMargins(0, 0, 0, padding.bottom()));
const auto result = CreateChild<JoinedCountButton>(wrap->entity());
const auto state = result->lifetime().make_state<State>();
std::move(
content
) | rpl::start_with_next([=](JoinedCountContent &&content) {
state->content = std::move(content);
wrap->toggle(state->content.count > 0, anim::type::instant);
if (state->content.count <= 0) {
return;
}
result->setAttribute(
Qt::WA_TransparentForMouseEvents,
!state->content.count);
if (!state->content.count) {
result->clearState();
}
const auto &st = st::inviteLinkUserpics;
const auto imageWidth = !state->content.userpics.isNull()
? state->content.userpics.width() / style::DevicePixelRatio()
: !state->content.count
? 0
: ((std::min(state->content.count, 3) - 1) * (st.size - st.shift)
+ st.size);
state->addedWidth = imageWidth
? (imageWidth + st::inviteLinkUserpicsSkip)
: 0;
state->phrase = tr::lng_group_invite_joined(
tr::now,
lt_count_decimal,
state->content.count);
const auto fullWidth = st::inviteLinkJoinedFont->width(state->phrase)
+ state->addedWidth;
result->resize(fullWidth, st.size);
result->move((wrap->width() - fullWidth) / 2, 0);
result->update();
}, result->lifetime());
result->paintRequest(
) | rpl::start_with_next([=] {
auto p = QPainter(result);
if (!state->content.userpics.isNull()) {
p.drawImage(0, 0, state->content.userpics);
}
const auto &font = st::inviteLinkJoinedFont;
p.setPen(st::defaultLinkButton.color);
p.setFont((result->isOver() || result->isDown())
? font->underline()
: font);
const auto top = (result->height() - font->height) / 2;
p.drawText(
state->addedWidth,
top + font->ascent,
state->phrase);
}, result->lifetime());
wrap->widthValue(
) | rpl::start_with_next([=](int width) {
result->move((width - result->width()) / 2, 0);
}, wrap->lifetime());
return result;
}
} // namespace Ui