Fixed display of most of simple toasts in corresponding window.

This commit is contained in:
23rd 2022-06-14 12:48:25 +03:00
parent 29910cd1f7
commit 629574685e
27 changed files with 179 additions and 79 deletions

View file

@ -1056,7 +1056,9 @@ void SetupChannelBox::mousePressEvent(QMouseEvent *e) {
return; return;
} else if (!_channel->inviteLink().isEmpty()) { } else if (!_channel->inviteLink().isEmpty()) {
QGuiApplication::clipboard()->setText(_channel->inviteLink()); QGuiApplication::clipboard()->setText(_channel->inviteLink());
Ui::Toast::Show(tr::lng_create_channel_link_copied(tr::now)); Ui::Toast::Show(
Ui::BoxShow(this).toastParent(),
tr::lng_create_channel_link_copied(tr::now));
} else if (_channel->isFullLoaded() && !_creatingInviteLink) { } else if (_channel->isFullLoaded() && !_creatingInviteLink) {
_creatingInviteLink = true; _creatingInviteLink = true;
_channel->session().api().inviteLinks().create(_channel); _channel->session().api().inviteLinks().create(_channel);

View file

@ -258,7 +258,9 @@ void BackgroundPreviewBox::apply() {
void BackgroundPreviewBox::share() { void BackgroundPreviewBox::share() {
QGuiApplication::clipboard()->setText( QGuiApplication::clipboard()->setText(
_paper.shareUrl(&_controller->session())); _paper.shareUrl(&_controller->session()));
Ui::Toast::Show(tr::lng_background_link_copied(tr::now)); Ui::Toast::Show(
Ui::BoxShow(this).toastParent(),
tr::lng_background_link_copied(tr::now));
} }
void BackgroundPreviewBox::paintEvent(QPaintEvent *e) { void BackgroundPreviewBox::paintEvent(QPaintEvent *e) {

View file

@ -1264,6 +1264,7 @@ object_ptr<Ui::BoxContent> ProxiesBoxController::CreateOwningBox(
object_ptr<Ui::BoxContent> ProxiesBoxController::create() { object_ptr<Ui::BoxContent> ProxiesBoxController::create() {
auto result = Box<ProxiesBox>(this, _settings); auto result = Box<ProxiesBox>(this, _settings);
_toastParent = Ui::BoxShow(result.data()).toastParent();
for (const auto &item : _list) { for (const auto &item : _list) {
updateView(item); updateView(item);
} }
@ -1549,7 +1550,9 @@ void ProxiesBoxController::share(const ProxyData &proxy) {
+ ((proxy.type == Type::Mtproto && !proxy.password.isEmpty()) + ((proxy.type == Type::Mtproto && !proxy.password.isEmpty())
? "&secret=" + proxy.password : ""); ? "&secret=" + proxy.password : "");
QGuiApplication::clipboard()->setText(link); QGuiApplication::clipboard()->setText(link);
Ui::Toast::Show(tr::lng_username_copied(tr::now)); if (_toastParent) {
Ui::Toast::Show(_toastParent, tr::lng_username_copied(tr::now));
}
} }
ProxiesBoxController::~ProxiesBoxController() { ProxiesBoxController::~ProxiesBoxController() {

View file

@ -117,6 +117,7 @@ private:
rpl::event_stream<ItemView> _views; rpl::event_stream<ItemView> _views;
base::Timer _saveTimer; base::Timer _saveTimer;
rpl::event_stream<ProxyData::Settings> _proxySettingsChanges; rpl::event_stream<ProxyData::Settings> _proxySettingsChanges;
QPointer<QWidget> _toastParent;
ProxyData _lastSelectedProxy; ProxyData _lastSelectedProxy;
bool _lastSelectedProxyUsed = false; bool _lastSelectedProxyUsed = false;

View file

@ -18,7 +18,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/labels.h" #include "ui/widgets/labels.h"
#include "ui/widgets/buttons.h" #include "ui/widgets/buttons.h"
#include "ui/widgets/checkbox.h" #include "ui/widgets/checkbox.h"
#include "ui/toast/toast.h"
#include "ui/text/text_utilities.h" #include "ui/text/text_utilities.h"
#include "main/main_session.h" #include "main/main_session.h"
#include "core/application.h" #include "core/application.h"
@ -776,7 +775,7 @@ void CreatePollBox::setInnerFocus() {
} }
void CreatePollBox::submitFailed(const QString &error) { void CreatePollBox::submitFailed(const QString &error) {
Ui::Toast::Show(error); Ui::Toast::Show(Ui::BoxShow(this).toastParent(), error);
} }
not_null<Ui::InputField*> CreatePollBox::setupQuestion( not_null<Ui::InputField*> CreatePollBox::setupQuestion(
@ -990,8 +989,11 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
multiple->events( multiple->events(
) | rpl::filter([=](not_null<QEvent*> e) { ) | rpl::filter([=](not_null<QEvent*> e) {
return (e->type() == QEvent::MouseButtonPress) && quiz->checked(); return (e->type() == QEvent::MouseButtonPress) && quiz->checked();
}) | rpl::start_with_next([=] { }) | rpl::start_with_next([
Ui::Toast::Show(tr::lng_polls_create_one_answer(tr::now)); toastParent = Ui::BoxShow(this).toastParent()] {
Ui::Toast::Show(
toastParent,
tr::lng_polls_create_one_answer(tr::now));
}, multiple->lifetime()); }, multiple->lifetime());
} }
@ -1068,8 +1070,10 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
*error &= ~Error::Solution; *error &= ~Error::Solution;
} }
}; };
const auto showError = [](tr::phrase<> text) { const auto showError = [
Ui::Toast::Show(text(tr::now)); toastParent = Ui::BoxShow(this).toastParent()](
tr::phrase<> text) {
Ui::Toast::Show(toastParent, text(tr::now));
}; };
const auto send = [=](Api::SendOptions sendOptions) { const auto send = [=](Api::SendOptions sendOptions) {
collectError(); collectError();

View file

@ -324,9 +324,10 @@ void EditCaptionBox::setupControls() {
} }
void EditCaptionBox::setupEditEventHandler() { void EditCaptionBox::setupEditEventHandler() {
const auto toastParent = Ui::BoxShow(this).toastParent();
const auto callback = [=](FileDialog::OpenResult &&result) { const auto callback = [=](FileDialog::OpenResult &&result) {
auto showError = [](tr::phrase<> t) { auto showError = [toastParent](tr::phrase<> t) {
Ui::Toast::Show(t(tr::now)); Ui::Toast::Show(toastParent, t(tr::now));
}; };
const auto checkResult = [=](const Ui::PreparedList &list) { const auto checkResult = [=](const Ui::PreparedList &list) {
@ -547,7 +548,9 @@ bool EditCaptionBox::setPreparedList(Ui::PreparedList &&list) {
} }
} }
if (invalidForAlbum) { if (invalidForAlbum) {
Ui::Toast::Show(tr::lng_edit_media_album_error(tr::now)); Ui::Toast::Show(
Ui::BoxShow(this).toastParent(),
tr::lng_edit_media_album_error(tr::now));
return false; return false;
} }
_preparedList = std::move(list); _preparedList = std::move(list);

View file

@ -90,7 +90,9 @@ void MaxInviteBox::mousePressEvent(QMouseEvent *e) {
if (_linkOver) { if (_linkOver) {
if (!_channel->inviteLink().isEmpty()) { if (!_channel->inviteLink().isEmpty()) {
QGuiApplication::clipboard()->setText(_channel->inviteLink()); QGuiApplication::clipboard()->setText(_channel->inviteLink());
Ui::Toast::Show(tr::lng_create_channel_link_copied(tr::now)); Ui::Toast::Show(
Ui::BoxShow(this).toastParent(),
tr::lng_create_channel_link_copied(tr::now));
} else if (_channel->isFullLoaded() && !_creatingInviteLink) { } else if (_channel->isFullLoaded() && !_creatingInviteLink) {
_creatingInviteLink = true; _creatingInviteLink = true;
_channel->session().api().inviteLinks().create(_channel); _channel->session().api().inviteLinks().create(_channel);

View file

@ -74,9 +74,10 @@ void FileDialogCallback(
FileDialog::OpenResult &&result, FileDialog::OpenResult &&result,
Fn<bool(const Ui::PreparedList&)> checkResult, Fn<bool(const Ui::PreparedList&)> checkResult,
Fn<void(Ui::PreparedList)> callback, Fn<void(Ui::PreparedList)> callback,
bool premium) { bool premium,
auto showError = [](tr::phrase<> text) { not_null<QWidget*> toastParent) {
Ui::Toast::Show(text(tr::now)); auto showError = [=](tr::phrase<> text) {
Ui::Toast::Show(toastParent, text(tr::now));
}; };
auto list = Storage::PreparedFileFromFilesDialog( auto list = Storage::PreparedFileFromFilesDialog(
@ -394,11 +395,12 @@ void SendFilesBox::refreshAllAfterChanges(int fromItem) {
} }
void SendFilesBox::openDialogToAddFileToAlbum() { void SendFilesBox::openDialogToAddFileToAlbum() {
const auto toastParent = Ui::BoxShow(this).toastParent();
const auto checkResult = [=](const Ui::PreparedList &list) { const auto checkResult = [=](const Ui::PreparedList &list) {
if (_sendLimit != SendLimit::One) { if (_sendLimit != SendLimit::One) {
return true; return true;
} else if (!_list.canBeSentInSlowmodeWith(list)) { } else if (!_list.canBeSentInSlowmodeWith(list)) {
Ui::Toast::Show(tr::lng_slowmode_no_many(tr::now)); Ui::Toast::Show(toastParent, tr::lng_slowmode_no_many(tr::now));
return false; return false;
} }
return true; return true;
@ -409,7 +411,8 @@ void SendFilesBox::openDialogToAddFileToAlbum() {
std::move(result), std::move(result),
checkResult, checkResult,
[=](Ui::PreparedList list) { addFiles(std::move(list)); }, [=](Ui::PreparedList list) { addFiles(std::move(list)); },
premium); premium,
toastParent);
}; };
FileDialog::GetOpenPaths( FileDialog::GetOpenPaths(
@ -549,6 +552,7 @@ void SendFilesBox::pushBlock(int from, int till) {
}); });
}, widget->lifetime()); }, widget->lifetime());
const auto toastParent = Ui::BoxShow(this).toastParent();
block.itemReplaceRequest( block.itemReplaceRequest(
) | rpl::start_with_next([=](int index) { ) | rpl::start_with_next([=](int index) {
const auto replace = [=](Ui::PreparedList list) { const auto replace = [=](Ui::PreparedList list) {
@ -569,7 +573,9 @@ void SendFilesBox::pushBlock(int from, int till) {
_list.files.push_back(std::move(removing)); _list.files.push_back(std::move(removing));
std::swap(_list.files[index], _list.files.back()); std::swap(_list.files[index], _list.files.back());
if (!result) { if (!result) {
Ui::Toast::Show(tr::lng_slowmode_no_many(tr::now)); Ui::Toast::Show(
toastParent,
tr::lng_slowmode_no_many(tr::now));
return false; return false;
} }
return true; return true;
@ -580,7 +586,8 @@ void SendFilesBox::pushBlock(int from, int till) {
std::move(result), std::move(result),
checkResult, checkResult,
replace, replace,
premium); premium,
toastParent);
}; };
FileDialog::GetOpenPath( FileDialog::GetOpenPath(

View file

@ -272,7 +272,9 @@ void StickerSetBox::prepare() {
_inner->setInstalled( _inner->setInstalled(
) | rpl::start_with_next([=](uint64 setId) { ) | rpl::start_with_next([=](uint64 setId) {
if (_inner->isMasksSet()) { if (_inner->isMasksSet()) {
Ui::Toast::Show(tr::lng_masks_installed(tr::now)); Ui::Toast::Show(
Ui::BoxShow(this).toastParent(),
tr::lng_masks_installed(tr::now));
} else { } else {
auto &stickers = _controller->session().data().stickers(); auto &stickers = _controller->session().data().stickers();
stickers.notifyStickerSetInstalled(setId); stickers.notifyStickerSetInstalled(setId);
@ -289,9 +291,11 @@ void StickerSetBox::prepare() {
) | rpl::start_with_next([=](uint64 setId) { ) | rpl::start_with_next([=](uint64 setId) {
const auto isMasks = _inner->isMasksSet(); const auto isMasks = _inner->isMasksSet();
Ui::Toast::Show(isMasks Ui::Toast::Show(
? tr::lng_masks_has_been_archived(tr::now) Ui::BoxShow(this).toastParent(),
: tr::lng_stickers_has_been_archived(tr::now)); isMasks
? tr::lng_masks_has_been_archived(tr::now)
: tr::lng_stickers_has_been_archived(tr::now));
auto &order = isMasks auto &order = isMasks
? _controller->session().data().stickers().maskSetsOrderRef() ? _controller->session().data().stickers().maskSetsOrderRef()
@ -360,7 +364,9 @@ void StickerSetBox::updateButtons() {
const auto top = addTopButton(st::infoTopBarMenu); const auto top = addTopButton(st::infoTopBarMenu);
const auto share = [=] { const auto share = [=] {
copyStickersLink(); copyStickersLink();
Ui::Toast::Show(tr::lng_stickers_copied(tr::now)); Ui::Toast::Show(
Ui::BoxShow(this).toastParent(),
tr::lng_stickers_copied(tr::now));
closeBox(); closeBox();
}; };
const auto menu = const auto menu =
@ -384,7 +390,9 @@ void StickerSetBox::updateButtons() {
} else { } else {
auto share = [=] { auto share = [=] {
copyStickersLink(); copyStickersLink();
Ui::Toast::Show(tr::lng_stickers_copied(tr::now)); Ui::Toast::Show(
Ui::BoxShow(this).toastParent(),
tr::lng_stickers_copied(tr::now));
}; };
auto shareText = isMasks auto shareText = isMasks
? tr::lng_stickers_share_masks() ? tr::lng_stickers_share_masks()
@ -1123,8 +1131,8 @@ void StickerSetBox::Inner::archiveStickers() {
if (result.type() == mtpc_messages_stickerSetInstallResultSuccess) { if (result.type() == mtpc_messages_stickerSetInstallResultSuccess) {
_setArchived.fire_copy(_setId); _setArchived.fire_copy(_setId);
} }
}).fail([] { }).fail([toastParent = Window::Show(_controller).toastParent()] {
Ui::Toast::Show(Lang::Hard::ServerError()); Ui::Toast::Show(toastParent, Lang::Hard::ServerError());
}).send(); }).send();
} }

View file

@ -254,7 +254,9 @@ void UsernameBox::changed() {
void UsernameBox::linkClick() { void UsernameBox::linkClick() {
QGuiApplication::clipboard()->setText( QGuiApplication::clipboard()->setText(
_session->createInternalLinkFull(getName())); _session->createInternalLinkFull(getName()));
Ui::Toast::Show(tr::lng_username_copied(tr::now)); Ui::Toast::Show(
Ui::BoxShow(this).toastParent(),
tr::lng_username_copied(tr::now));
} }
void UsernameBox::updateFail(const QString &error) { void UsernameBox::updateFail(const QString &error) {

View file

@ -308,14 +308,17 @@ void MonospaceClickHandler::onClick(ClickContext context) const {
const auto hasCopyRestriction = item const auto hasCopyRestriction = item
&& (!item->history()->peer->allowsForwarding() && (!item->history()->peer->allowsForwarding()
|| item->forbidsForward()); || item->forbidsForward());
const auto toastParent = Window::Show(controller).toastParent();
if (hasCopyRestriction) { if (hasCopyRestriction) {
Ui::Toast::Show(item->history()->peer->isBroadcast() Ui::Toast::Show(
? tr::lng_error_nocopy_channel(tr::now) toastParent,
: tr::lng_error_nocopy_group(tr::now)); item->history()->peer->isBroadcast()
? tr::lng_error_nocopy_channel(tr::now)
: tr::lng_error_nocopy_group(tr::now));
return; return;
} }
Ui::Toast::Show(toastParent, tr::lng_text_copied(tr::now));
} }
Ui::Toast::Show(tr::lng_text_copied(tr::now));
TextUtilities::SetClipboardText(TextForMimeData::Simple(_text.trimmed())); TextUtilities::SetClipboardText(TextForMimeData::Simple(_text.trimmed()));
} }

View file

@ -565,7 +565,9 @@ bool ShowInviteLink(
return false; return false;
} }
QGuiApplication::clipboard()->setText(link); QGuiApplication::clipboard()->setText(link);
Ui::Toast::Show(tr::lng_group_invite_copied(tr::now)); Ui::Toast::Show(
Window::Show(controller).toastParent(),
tr::lng_group_invite_copied(tr::now));
return true; return true;
} }
@ -579,13 +581,15 @@ bool OpenExternalLink(
} }
void ExportTestChatTheme( void ExportTestChatTheme(
not_null<Main::Session*> session, not_null<Window::SessionController*> controller,
not_null<const Data::CloudTheme*> theme) { not_null<const Data::CloudTheme*> theme) {
const auto session = &controller->session();
const auto show = std::make_shared<Window::Show>(controller);
const auto inputSettings = [&](Data::CloudThemeType type) const auto inputSettings = [&](Data::CloudThemeType type)
-> std::optional<MTPInputThemeSettings> { -> std::optional<MTPInputThemeSettings> {
const auto i = theme->settings.find(type); const auto i = theme->settings.find(type);
if (i == end(theme->settings)) { if (i == end(theme->settings)) {
Ui::Toast::Show("Something went wrong :("); Ui::Toast::Show(show->toastParent(), "Something went wrong :(");
return std::nullopt; return std::nullopt;
} }
const auto &fields = i->second; const auto &fields = i->second;
@ -593,7 +597,7 @@ void ExportTestChatTheme(
|| !fields.paper->isPattern() || !fields.paper->isPattern()
|| fields.paper->backgroundColors().empty() || fields.paper->backgroundColors().empty()
|| !fields.paper->hasShareUrl()) { || !fields.paper->hasShareUrl()) {
Ui::Toast::Show("Something went wrong :("); Ui::Toast::Show(show->toastParent(), "Something went wrong :(");
return std::nullopt; return std::nullopt;
} }
const auto &bg = fields.paper->backgroundColors(); const auto &bg = fields.paper->backgroundColors();
@ -601,7 +605,9 @@ void ExportTestChatTheme(
const auto from = url.indexOf("bg/"); const auto from = url.indexOf("bg/");
const auto till = url.indexOf("?"); const auto till = url.indexOf("?");
if (from < 0 || till <= from) { if (from < 0 || till <= from) {
Ui::Toast::Show("Bad WallPaper link: " + url); Ui::Toast::Show(
show->toastParent(),
"Bad WallPaper link: " + url);
return std::nullopt; return std::nullopt;
} }
@ -683,9 +689,15 @@ void ExportTestChatTheme(
const auto slug = Data::CloudTheme::Parse(session, result, true).slug; const auto slug = Data::CloudTheme::Parse(session, result, true).slug;
QGuiApplication::clipboard()->setText( QGuiApplication::clipboard()->setText(
session->createInternalLinkFull("addtheme/" + slug)); session->createInternalLinkFull("addtheme/" + slug));
Ui::Toast::Show(tr::lng_background_link_copied(tr::now)); if (show->valid()) {
Ui::Toast::Show(
show->toastParent(),
tr::lng_background_link_copied(tr::now));
}
}).fail([=](const MTP::Error &error) { }).fail([=](const MTP::Error &error) {
Ui::Toast::Show("Error: " + error.type()); if (show->valid()) {
Ui::Toast::Show(show->toastParent(), "Error: " + error.type());
}
}).send(); }).send();
} }
@ -706,7 +718,7 @@ bool ResolveTestChatTheme(
params); params);
if (theme) { if (theme) {
if (!params["export"].isEmpty()) { if (!params["export"].isEmpty()) {
ExportTestChatTheme(&controller->session(), &*theme); ExportTestChatTheme(controller, &*theme);
} }
const auto recache = [&](Data::CloudThemeType type) { const auto recache = [&](Data::CloudThemeType type) {
[[maybe_unused]] auto value = theme->settings.contains(type) [[maybe_unused]] auto value = theme->settings.contains(type)

View file

@ -52,8 +52,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "main/main_session.h" #include "main/main_session.h"
#include "main/main_session_settings.h" #include "main/main_session_settings.h"
#include "core/application.h" #include "core/application.h"
#include "core/click_handler_types.h" // ClickHandlerContext
#include "lang/lang_keys.h" #include "lang/lang_keys.h"
#include "storage/file_upload.h" #include "storage/file_upload.h"
#include "window/window_session_controller.h" // Window::Show
#include "styles/style_chat.h" #include "styles/style_chat.h"
#include "styles/style_dialogs.h" #include "styles/style_dialogs.h"
@ -1646,6 +1648,7 @@ ClickHandlerPtr MediaDice::makeHandler() const {
ClickHandlerPtr MediaDice::MakeHandler( ClickHandlerPtr MediaDice::MakeHandler(
not_null<History*> history, not_null<History*> history,
const QString &emoji) { const QString &emoji) {
// TODO support multi-windows.
static auto ShownToast = base::weak_ptr<Ui::Toast::Instance>(); static auto ShownToast = base::weak_ptr<Ui::Toast::Instance>();
static const auto HideExisting = [] { static const auto HideExisting = [] {
if (const auto toast = ShownToast.get()) { if (const auto toast = ShownToast.get()) {
@ -1653,7 +1656,7 @@ ClickHandlerPtr MediaDice::MakeHandler(
ShownToast = nullptr; ShownToast = nullptr;
} }
}; };
return std::make_shared<LambdaClickHandler>([=] { return std::make_shared<LambdaClickHandler>([=](ClickContext context) {
auto config = Ui::Toast::Config{ auto config = Ui::Toast::Config{
.text = { tr::lng_about_random(tr::now, lt_emoji, emoji) }, .text = { tr::lng_about_random(tr::now, lt_emoji, emoji) },
.st = &st::historyDiceToast, .st = &st::historyDiceToast,
@ -1683,7 +1686,15 @@ ClickHandlerPtr MediaDice::MakeHandler(
} }
HideExisting(); HideExisting();
ShownToast = Ui::Toast::Show(config); const auto my = context.other.value<ClickHandlerContext>();
const auto weak = my.sessionWindow;
if (const auto strong = weak.get()) {
ShownToast = Ui::Toast::Show(
Window::Show(strong).toastParent(),
config);
} else {
ShownToast = Ui::Toast::Show(config);
}
}); });
} }

View file

@ -405,6 +405,7 @@ void Stickers::applyArchivedResult(
session().local().writeArchivedMasks(); session().local().writeArchivedMasks();
} }
// TODO async toast.
Ui::Toast::Show(Ui::Toast::Config{ Ui::Toast::Show(Ui::Toast::Config{
.text = { tr::lng_stickers_packs_archived(tr::now) }, .text = { tr::lng_stickers_packs_archived(tr::now) },
.st = &st::stickersToast, .st = &st::stickersToast,

View file

@ -113,6 +113,20 @@ HiddenSenderInfo::HiddenSenderInfo(const QString &name, bool external)
} }
} }
ClickHandlerPtr HiddenSenderInfo::ForwardClickHandler() {
static const auto hidden = std::make_shared<LambdaClickHandler>([](
ClickContext context) {
const auto my = context.other.value<ClickHandlerContext>();
const auto weak = my.sessionWindow;
if (const auto strong = weak.get()) {
Ui::Toast::Show(
Window::Show(strong).toastParent(),
tr::lng_forwarded_hidden(tr::now));
}
});
return hidden;
}
bool HiddenSenderInfo::paintCustomUserpic( bool HiddenSenderInfo::paintCustomUserpic(
Painter &p, Painter &p,
int x, int x,
@ -202,15 +216,12 @@ void HistoryMessageForwarded::create(const HistoryMessageVia *via) const {
} }
} }
text.setMarkedText(st::fwdTextStyle, phrase); text.setMarkedText(st::fwdTextStyle, phrase);
static const auto hidden = std::make_shared<LambdaClickHandler>([] {
Ui::Toast::Show(tr::lng_forwarded_hidden(tr::now));
});
text.setLink(1, fromChannel text.setLink(1, fromChannel
? goToMessageClickHandler(originalSender, originalId) ? goToMessageClickHandler(originalSender, originalId)
: originalSender : originalSender
? originalSender->openLink() ? originalSender->openLink()
: hidden); : HiddenSenderInfo::ForwardClickHandler());
if (via) { if (via) {
text.setLink(2, via->link); text.setLink(2, via->link);
} }

View file

@ -81,6 +81,8 @@ struct HiddenSenderInfo {
Ui::EmptyUserpic emptyUserpic; Ui::EmptyUserpic emptyUserpic;
mutable Data::CloudImage customUserpic; mutable Data::CloudImage customUserpic;
[[nodiscard]] static ClickHandlerPtr ForwardClickHandler();
[[nodiscard]] bool paintCustomUserpic( [[nodiscard]] bool paintCustomUserpic(
Painter &p, Painter &p,
int x, int x,

View file

@ -441,6 +441,7 @@ void ContactStatus::setupBlockHandler(not_null<UserData*> user) {
void ContactStatus::setupShareHandler(not_null<UserData*> user) { void ContactStatus::setupShareHandler(not_null<UserData*> user) {
_bar.entity()->shareClicks( _bar.entity()->shareClicks(
) | rpl::start_with_next([=] { ) | rpl::start_with_next([=] {
const auto show = std::make_shared<Window::Show>(_controller);
const auto share = [=](Fn<void()> &&close) { const auto share = [=](Fn<void()> &&close) {
user->setSettings(0); user->setSettings(0);
user->session().api().request(MTPcontacts_AcceptContact( user->session().api().request(MTPcontacts_AcceptContact(
@ -448,14 +449,18 @@ void ContactStatus::setupShareHandler(not_null<UserData*> user) {
)).done([=](const MTPUpdates &result) { )).done([=](const MTPUpdates &result) {
user->session().api().applyUpdates(result); user->session().api().applyUpdates(result);
Ui::Toast::Show(tr::lng_new_contact_share_done( if (show->valid()) {
tr::now, Ui::Toast::Show(
lt_user, show->toastParent(),
user->shortName())); tr::lng_new_contact_share_done(
tr::now,
lt_user,
user->shortName()));
}
}).send(); }).send();
close(); close();
}; };
_controller->window().show(Ui::MakeConfirmBox({ show->showBox(Ui::MakeConfirmBox({
.text = tr::lng_new_contact_share_sure( .text = tr::lng_new_contact_share_sure(
tr::now, tr::now,
lt_phone, lt_phone,
@ -488,6 +493,7 @@ void ContactStatus::setupReportHandler(not_null<PeerData*> peer) {
_bar.entity()->reportClicks( _bar.entity()->reportClicks(
) | rpl::start_with_next([=] { ) | rpl::start_with_next([=] {
Expects(!peer->isUser()); Expects(!peer->isUser());
const auto show = std::make_shared<Window::Show>(_controller);
const auto callback = crl::guard(&_bar, [=](Fn<void()> &&close) { const auto callback = crl::guard(&_bar, [=](Fn<void()> &&close) {
close(); close();
@ -503,7 +509,11 @@ void ContactStatus::setupReportHandler(not_null<PeerData*> peer) {
peer->session().api().deleteConversation(peer, false); peer->session().api().deleteConversation(peer, false);
}); });
Ui::Toast::Show(tr::lng_report_spam_done(tr::now)); if (show->valid()) {
Ui::Toast::Show(
show->toastParent(),
tr::lng_report_spam_done(tr::now));
}
// Destroys _bar. // Destroys _bar.
_controller->showBackFromStack(); _controller->showBackFromStack();
@ -514,7 +524,7 @@ void ContactStatus::setupReportHandler(not_null<PeerData*> peer) {
auto text = ((peer->isChat() || peer->isMegagroup()) auto text = ((peer->isChat() || peer->isMegagroup())
? tr::lng_report_spam_sure_group ? tr::lng_report_spam_sure_group
: tr::lng_report_spam_sure_channel)(); : tr::lng_report_spam_sure_channel)();
_controller->window().show(Ui::MakeConfirmBox({ show->showBox(Ui::MakeConfirmBox({
.text= std::move(text), .text= std::move(text),
.confirmed = callback, .confirmed = callback,
.confirmText = tr::lng_report_spam_ok(), .confirmText = tr::lng_report_spam_ok(),

View file

@ -682,10 +682,7 @@ ClickHandlerPtr Element::fromLink() const {
return imported; return imported;
} }
} }
static const auto hidden = std::make_shared<LambdaClickHandler>([] { _fromLink = HiddenSenderInfo::ForwardClickHandler();
Ui::Toast::Show(tr::lng_forwarded_hidden(tr::now));
});
_fromLink = hidden;
return _fromLink; return _fromLink;
} }

View file

@ -1651,6 +1651,7 @@ ClickHandlerPtr Message::createGoToCommentsLink() const {
if (const auto channel = history->peer->asChannel()) { if (const auto channel = history->peer->asChannel()) {
if (channel->invitePeekExpires()) { if (channel->invitePeekExpires()) {
Ui::Toast::Show( Ui::Toast::Show(
Window::Show(controller).toastParent(),
tr::lng_channel_invite_private(tr::now)); tr::lng_channel_invite_private(tr::now));
return; return;
} }

View file

@ -353,12 +353,15 @@ object_ptr<Ui::RpWidget> DetailsFiller::setupInfo() {
tr::lng_info_link_label(), tr::lng_info_link_label(),
std::move(linkText), std::move(linkText),
QString()); QString());
link->setClickHandlerFilter([peer = _peer](auto&&...) { const auto controller = _controller->parentController();
link->setClickHandlerFilter([=, peer = _peer](auto&&...) {
const auto link = peer->session().createInternalLinkFull( const auto link = peer->session().createInternalLinkFull(
peer->userName()); peer->userName());
if (!link.isEmpty()) { if (!link.isEmpty()) {
QGuiApplication::clipboard()->setText(link); QGuiApplication::clipboard()->setText(link);
Ui::Toast::Show(tr::lng_username_copied(tr::now)); Ui::Toast::Show(
Window::Show(controller).toastParent(),
tr::lng_username_copied(tr::now));
} }
return false; return false;
}); });

View file

@ -199,7 +199,9 @@ void Cover::initViewers() {
} else { } else {
QGuiApplication::clipboard()->setText( QGuiApplication::clipboard()->setText(
_user->session().createInternalLinkFull(username)); _user->session().createInternalLinkFull(username));
Ui::Toast::Show(tr::lng_username_copied(tr::now)); Ui::Toast::Show(
Window::Show(_controller).toastParent(),
tr::lng_username_copied(tr::now));
} }
return false; return false;
}); });

View file

@ -760,7 +760,7 @@ void Editor::exportTheme() {
_window->show(Ui::MakeInformBox(tr::lng_theme_editor_error())); _window->show(Ui::MakeInformBox(tr::lng_theme_editor_error()));
return; return;
} }
Ui::Toast::Show(tr::lng_theme_editor_done(tr::now)); _window->showToast(tr::lng_theme_editor_done(tr::now));
})); }));
} }
@ -817,10 +817,10 @@ QByteArray Editor::ColorizeInContent(
void Editor::save() { void Editor::save() {
if (Core::App().passcodeLocked()) { if (Core::App().passcodeLocked()) {
Ui::Toast::Show(tr::lng_theme_editor_need_unlock(tr::now)); _window->showToast(tr::lng_theme_editor_need_unlock(tr::now));
return; return;
} else if (!_window->account().sessionExists()) { } else if (!_window->account().sessionExists()) {
Ui::Toast::Show(tr::lng_theme_editor_need_auth(tr::now)); _window->showToast(tr::lng_theme_editor_need_auth(tr::now));
return; return;
} else if (_saving) { } else if (_saving) {
return; return;

View file

@ -893,10 +893,11 @@ void SaveThemeBox(
type = SaveErrorType::Link; type = SaveErrorType::Link;
} else if (error == qstr("THEME_SLUG_OCCUPIED")) { } else if (error == qstr("THEME_SLUG_OCCUPIED")) {
Ui::Toast::Show( Ui::Toast::Show(
Ui::BoxShow(box).toastParent(),
tr::lng_create_channel_link_occupied(tr::now)); tr::lng_create_channel_link_occupied(tr::now));
type = SaveErrorType::Link; type = SaveErrorType::Link;
} else if (!error.isEmpty()) { } else if (!error.isEmpty()) {
Ui::Toast::Show(error); Ui::Toast::Show(Ui::BoxShow(box).toastParent(), error);
} }
if (type == SaveErrorType::Name) { if (type == SaveErrorType::Name) {
name->showError(); name->showError();

View file

@ -592,7 +592,8 @@ void CloudList::showMenu(Element &element) {
_contextMenu->addAction(tr::lng_theme_share(tr::now), [=] { _contextMenu->addAction(tr::lng_theme_share(tr::now), [=] {
QGuiApplication::clipboard()->setText( QGuiApplication::clipboard()->setText(
_window->session().createInternalLinkFull("addtheme/" + slug)); _window->session().createInternalLinkFull("addtheme/" + slug));
Ui::Toast::Show(tr::lng_background_link_copied(tr::now)); _window->window().showToast(
tr::lng_background_link_copied(tr::now));
}, &st::menuIconShare); }, &st::menuIconShare);
} }
if (cloud.documentId if (cloud.documentId

View file

@ -263,6 +263,7 @@ void TermsBox::prepare() {
st::termsPadding), st::termsPadding),
0, 0,
age ? age->height() : 0); age ? age->height() : 0);
const auto toastParent = Ui::BoxShow(this).toastParent();
content->entity()->setClickHandlerFilter([=]( content->entity()->setClickHandlerFilter([=](
const ClickHandlerPtr &handler, const ClickHandlerPtr &handler,
Qt::MouseButton button) { Qt::MouseButton button) {
@ -271,7 +272,9 @@ void TermsBox::prepare() {
: QString(); : QString();
if (TextUtilities::RegExpMention().match(link).hasMatch()) { if (TextUtilities::RegExpMention().match(link).hasMatch()) {
_lastClickedMention = link; _lastClickedMention = link;
Ui::Toast::Show(tr::lng_terms_agree_to_proceed(tr::now, lt_bot, link)); Ui::Toast::Show(
toastParent,
tr::lng_terms_agree_to_proceed(tr::now, lt_bot, link));
return false; return false;
} }
return true; return true;

View file

@ -297,10 +297,12 @@ void TogglePinnedDialog(
// This can happen when you remove this filter from another client. // This can happen when you remove this filter from another client.
if (!ranges::contains( if (!ranges::contains(
(&owner->session())->data().chatsFilters().list(), (&owner->session())->data().chatsFilters().list(),
filterId, filterId,
&Data::ChatFilter::id)) { &Data::ChatFilter::id)) {
Ui::Toast::Show(tr::lng_cant_do_this(tr::now)); Ui::Toast::Show(
Window::Show(controller).toastParent(),
tr::lng_cant_do_this(tr::now));
return; return;
} }
@ -601,6 +603,7 @@ void Filler::addViewDiscussion() {
_addAction(tr::lng_profile_view_discussion(tr::now), [=] { _addAction(tr::lng_profile_view_discussion(tr::now), [=] {
if (channel->invitePeekExpires()) { if (channel->invitePeekExpires()) {
Ui::Toast::Show( Ui::Toast::Show(
Window::Show(navigation).toastParent(),
tr::lng_channel_invite_private(tr::now)); tr::lng_channel_invite_private(tr::now));
return; return;
} }
@ -895,12 +898,14 @@ void Filler::fillArchiveActions() {
}, hidden ? &st::menuIconExpand : &st::menuIconCollapse); }, hidden ? &st::menuIconExpand : &st::menuIconCollapse);
_addAction(tr::lng_context_archive_to_menu(tr::now), [=] { _addAction(tr::lng_context_archive_to_menu(tr::now), [=] {
Ui::Toast::Show(Ui::Toast::Config{ Ui::Toast::Show(
.text = { tr::lng_context_archive_to_menu_info(tr::now) }, Window::Show(controller).toastParent(),
.st = &st::windowArchiveToast, Ui::Toast::Config{
.durationMs = kArchivedToastDuration, .text = { tr::lng_context_archive_to_menu_info(tr::now) },
.multiline = true, .st = &st::windowArchiveToast,
}); .durationMs = kArchivedToastDuration,
.multiline = true,
});
controller->session().settings().setArchiveInMainMenu( controller->session().settings().setArchiveInMainMenu(
!controller->session().settings().archiveInMainMenu()); !controller->session().settings().archiveInMainMenu());
@ -959,7 +964,7 @@ void PeerMenuShareContactBox(
action.clearDraft = false; action.clearDraft = false;
user->session().api().shareContact(user, action); user->session().api().shareContact(user, action);
Ui::Toast::Show( Ui::Toast::Show(
navigation->parentController()->widget()->bodyWidget(), Window::Show(navigation).toastParent(),
tr::lng_share_done(tr::now)); tr::lng_share_done(tr::now));
if (auto strong = *weak) { if (auto strong = *weak) {
strong->closeBox(); strong->closeBox();
@ -1152,6 +1157,7 @@ void PeerMenuBlockUserBox(
} }
Ui::Toast::Show( Ui::Toast::Show(
Window::Show(window).toastParent(),
tr::lng_new_contact_block_done(tr::now, lt_user, name)); tr::lng_new_contact_block_done(tr::now, lt_user, name));
}, st::attentionBoxButton); }, st::attentionBoxButton);

View file

@ -525,7 +525,9 @@ void SessionNavigation::showRepliesForMessage(
_showingRepliesRequestId = 0; _showingRepliesRequestId = 0;
if (error.type() == u"CHANNEL_PRIVATE"_q if (error.type() == u"CHANNEL_PRIVATE"_q
|| error.type() == u"USER_BANNED_IN_CHANNEL"_q) { || error.type() == u"USER_BANNED_IN_CHANNEL"_q) {
Ui::Toast::Show(tr::lng_group_not_accessible(tr::now)); Ui::Toast::Show(
Show(this).toastParent(),
tr::lng_group_not_accessible(tr::now));
} }
}).send(); }).send();
} }