init
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled
This commit is contained in:
155
Telegram/SourceFiles/ui/boxes/edit_invite_link_session.cpp
Normal file
155
Telegram/SourceFiles/ui/boxes/edit_invite_link_session.cpp
Normal file
@@ -0,0 +1,155 @@
|
||||
/*
|
||||
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/boxes/edit_invite_link_session.h"
|
||||
|
||||
#include "core/ui_integration.h" // TextContext
|
||||
#include "data/components/credits.h"
|
||||
#include "data/data_peer.h"
|
||||
#include "data/data_session.h"
|
||||
#include "data/stickers/data_custom_emoji.h"
|
||||
#include "lang/lang_keys.h"
|
||||
#include "main/main_app_config.h"
|
||||
#include "main/main_session.h"
|
||||
#include "ui/boxes/edit_invite_link.h" // InviteLinkSubscriptionToggle
|
||||
#include "ui/effects/credits_graphics.h"
|
||||
#include "ui/layers/generic_box.h"
|
||||
#include "ui/rect.h"
|
||||
#include "ui/text/format_values.h"
|
||||
#include "ui/text/text_utilities.h"
|
||||
#include "ui/vertical_list.h"
|
||||
#include "ui/widgets/buttons.h"
|
||||
#include "ui/widgets/fields/number_input.h"
|
||||
#include "ui/widgets/labels.h"
|
||||
#include "ui/wrap/slide_wrap.h"
|
||||
#include "ui/wrap/vertical_layout.h"
|
||||
#include "styles/style_channel_earn.h"
|
||||
#include "styles/style_chat.h"
|
||||
#include "styles/style_settings.h"
|
||||
#include "styles/style_layers.h"
|
||||
#include "styles/style_info.h"
|
||||
|
||||
namespace Ui {
|
||||
|
||||
InviteLinkSubscriptionToggle FillCreateInviteLinkSubscriptionToggle(
|
||||
not_null<Ui::GenericBox*> box,
|
||||
not_null<PeerData*> peer) {
|
||||
struct State final {
|
||||
rpl::variable<float64> usdRate = 0;
|
||||
};
|
||||
const auto state = box->lifetime().make_state<State>();
|
||||
const auto currency = u"USD"_q;
|
||||
|
||||
const auto container = box->verticalLayout();
|
||||
const auto toggle = container->add(
|
||||
object_ptr<SettingsButton>(
|
||||
container,
|
||||
tr::lng_group_invite_subscription(),
|
||||
st::settingsButtonNoIconLocked),
|
||||
style::margins{ 0, 0, 0, st::defaultVerticalListSkip });
|
||||
|
||||
const auto maxCredits = peer->session().appConfig().get<int>(
|
||||
u"stars_subscription_amount_max"_q,
|
||||
2500);
|
||||
|
||||
const auto &st = st::inviteLinkCreditsField;
|
||||
const auto skip = st.textMargins.top() / 2;
|
||||
const auto wrap = container->add(
|
||||
object_ptr<Ui::SlideWrap<Ui::VerticalLayout>>(
|
||||
container,
|
||||
object_ptr<Ui::VerticalLayout>(container)));
|
||||
box->setShowFinishedCallback([=] {
|
||||
wrap->toggleOn(toggle->toggledValue());
|
||||
wrap->finishAnimating();
|
||||
});
|
||||
const auto inputContainer = wrap->entity()->add(
|
||||
CreateSkipWidget(container, st.heightMin - skip));
|
||||
const auto input = CreateChild<NumberInput>(
|
||||
inputContainer,
|
||||
st,
|
||||
tr::lng_group_invite_subscription_ph(),
|
||||
QString(),
|
||||
std::pow(QString::number(maxCredits).size(), 10));
|
||||
wrap->toggledValue() | rpl::on_next([=](bool shown) {
|
||||
if (shown) {
|
||||
input->setFocus();
|
||||
}
|
||||
}, input->lifetime());
|
||||
const auto icon = CreateSingleStarWidget(
|
||||
inputContainer,
|
||||
st.style.font->height);
|
||||
const auto priceOverlay = Ui::CreateChild<Ui::RpWidget>(inputContainer);
|
||||
priceOverlay->setAttribute(Qt::WA_TransparentForMouseEvents);
|
||||
inputContainer->sizeValue(
|
||||
) | rpl::on_next([=](const QSize &size) {
|
||||
input->resize(
|
||||
size.width() - rect::m::sum::h(st::boxRowPadding),
|
||||
st.heightMin);
|
||||
input->moveToLeft(st::boxRowPadding.left(), -skip);
|
||||
icon->moveToLeft(
|
||||
st::boxRowPadding.left(),
|
||||
input->pos().y() + st.textMargins.top());
|
||||
priceOverlay->resize(size);
|
||||
}, input->lifetime());
|
||||
ToggleChildrenVisibility(inputContainer, true);
|
||||
QObject::connect(input, &Ui::MaskedInputField::changed, [=] {
|
||||
const auto amount = input->getLastText().toDouble();
|
||||
if (amount > maxCredits) {
|
||||
input->setText(QString::number(maxCredits));
|
||||
}
|
||||
priceOverlay->update();
|
||||
});
|
||||
priceOverlay->paintRequest(
|
||||
) | rpl::on_next([=, right = st::boxRowPadding.right()] {
|
||||
if (state->usdRate.current() <= 0) {
|
||||
return;
|
||||
}
|
||||
const auto amount = input->getLastText().toDouble();
|
||||
if (amount <= 0) {
|
||||
return;
|
||||
}
|
||||
const auto text = tr::lng_group_invite_subscription_price(
|
||||
tr::now,
|
||||
lt_cost,
|
||||
Ui::FillAmountAndCurrency(
|
||||
amount * state->usdRate.current(),
|
||||
currency));
|
||||
auto p = QPainter(priceOverlay);
|
||||
p.setFont(st.placeholderFont);
|
||||
p.setPen(st.placeholderFg);
|
||||
p.setBrush(Qt::NoBrush);
|
||||
const auto m = QMargins(0, skip, right, 0);
|
||||
p.drawText(priceOverlay->rect() - m, text, style::al_right);
|
||||
}, priceOverlay->lifetime());
|
||||
|
||||
state->usdRate = peer->session().credits().rateValue(peer);
|
||||
|
||||
auto about = object_ptr<Ui::FlatLabel>(
|
||||
container,
|
||||
tr::lng_group_invite_subscription_about(
|
||||
lt_link,
|
||||
tr::lng_group_invite_subscription_about_link(
|
||||
lt_emoji,
|
||||
rpl::single(Ui::Text::IconEmoji(&st::textMoreIconEmoji)),
|
||||
tr::rich
|
||||
) | rpl::map([](TextWithEntities text) {
|
||||
return tr::link(
|
||||
std::move(text),
|
||||
tr::lng_group_invite_subscription_about_url(tr::now));
|
||||
}),
|
||||
tr::rich),
|
||||
st::boxDividerLabel);
|
||||
Ui::AddSkip(wrap->entity());
|
||||
Ui::AddSkip(wrap->entity());
|
||||
container->add(object_ptr<Ui::DividerLabel>(
|
||||
container,
|
||||
std::move(about),
|
||||
st::defaultBoxDividerLabelPadding));
|
||||
return { toggle, input };
|
||||
}
|
||||
|
||||
} // namespace Ui
|
||||
Reference in New Issue
Block a user