Allow creating EmojiListWidget without SessionController.

This commit is contained in:
John Preston 2022-08-20 07:45:44 +03:00
parent c9a98ae723
commit 33b266175d
15 changed files with 192 additions and 123 deletions

View file

@ -366,14 +366,26 @@ EmojiListWidget::EmojiListWidget(
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
Window::GifPauseReason level, Window::GifPauseReason level,
Mode mode) Mode mode)
: Inner(parent, controller, level) : EmojiListWidget(parent, {
, _mode(mode) .session = &controller->session(),
.mode = mode,
.controller = controller,
.paused = Window::PausedIn(controller, level),
}) {
}
EmojiListWidget::EmojiListWidget(
QWidget *parent,
EmojiListDescriptor &&descriptor)
: Inner(parent, descriptor.session, std::move(descriptor.paused))
, _controller(descriptor.controller)
, _mode(descriptor.mode)
, _staticCount(_mode == Mode::Full ? kEmojiSectionCount : 1) , _staticCount(_mode == Mode::Full ? kEmojiSectionCount : 1)
, _premiumIcon(_mode == Mode::EmojiStatus , _premiumIcon(_mode == Mode::EmojiStatus
? std::make_unique<GradientPremiumStar>() ? std::make_unique<GradientPremiumStar>()
: nullptr) : nullptr)
, _localSetsManager( , _localSetsManager(
std::make_unique<LocalStickersManager>(&controller->session())) std::make_unique<LocalStickersManager>(&session()))
, _collapsedBg(st::emojiPanExpand.height / 2, st::emojiPanHeaderFg) , _collapsedBg(st::emojiPanExpand.height / 2, st::emojiPanHeaderFg)
, _picker(this) , _picker(this)
, _showPickerTimer([=] { showPicker(); }) { , _showPickerTimer([=] { showPicker(); }) {
@ -397,7 +409,7 @@ EmojiListWidget::EmojiListWidget(
pickerHidden(); pickerHidden();
}, lifetime()); }, lifetime());
controller->session().data().stickers().updated( session().data().stickers().updated(
Data::StickersType::Emoji Data::StickersType::Emoji
) | rpl::start_with_next([=] { ) | rpl::start_with_next([=] {
refreshCustom(); refreshCustom();
@ -405,8 +417,8 @@ EmojiListWidget::EmojiListWidget(
}, lifetime()); }, lifetime());
rpl::combine( rpl::combine(
Data::AmPremiumValue(&controller->session()), Data::AmPremiumValue(&session()),
controller->session().premiumPossibleValue() session().premiumPossibleValue()
) | rpl::skip(1) | rpl::start_with_next([=] { ) | rpl::skip(1) | rpl::start_with_next([=] {
refreshCustom(); refreshCustom();
resizeToWidth(width()); resizeToWidth(width());
@ -520,8 +532,8 @@ object_ptr<TabbedSelector::InnerFooter> EmojiListWidget::createFooter() {
using FooterDescriptor = StickersListFooter::Descriptor; using FooterDescriptor = StickersListFooter::Descriptor;
auto result = object_ptr<StickersListFooter>(FooterDescriptor{ auto result = object_ptr<StickersListFooter>(FooterDescriptor{
.controller = controller(), .session = &session(),
.level = level(), .paused = pausedMethod(),
.parent = this, .parent = this,
}); });
_footer = result; _footer = result;
@ -685,7 +697,7 @@ void EmojiListWidget::fillRecent() {
const auto star = QString::fromUtf8("\xe2\xad\x90\xef\xb8\x8f"); const auto star = QString::fromUtf8("\xe2\xad\x90\xef\xb8\x8f");
_recent.push_back({ .id = { Ui::Emoji::Find(star) } }); _recent.push_back({ .id = { Ui::Emoji::Find(star) } });
} }
const auto test = controller()->session().isTestMode(); const auto test = session().isTestMode();
for (const auto &one : list) { for (const auto &one : list) {
const auto document = std::get_if<RecentEmojiDocument>(&one.id.data); const auto document = std::get_if<RecentEmojiDocument>(&one.id.data);
if (_mode == Mode::EmojiStatus && !document) { if (_mode == Mode::EmojiStatus && !document) {
@ -725,7 +737,7 @@ void EmojiListWidget::paintEvent(QPaintEvent *e) {
toColumn = _columnCount - toColumn; toColumn = _columnCount - toColumn;
} }
const auto paused = controller()->isGifPausedAtLeastFor(level()); const auto paused = this->paused();
const auto now = crl::now(); const auto now = crl::now();
auto selectedButton = std::get_if<OverButton>(!v::is_null(_pressed) auto selectedButton = std::get_if<OverButton>(!v::is_null(_pressed)
? &_pressed ? &_pressed
@ -1020,8 +1032,8 @@ void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) {
removeSet(id); removeSet(id);
} else if (hasAddButton(button->section)) { } else if (hasAddButton(button->section)) {
_localSetsManager->install(id); _localSetsManager->install(id);
} else { } else if (_controller) {
Settings::ShowPremium(controller(), u"animated_emoji"_q); Settings::ShowPremium(_controller, u"animated_emoji"_q);
} }
} }
} }
@ -1029,18 +1041,20 @@ void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) {
void EmojiListWidget::displaySet(uint64 setId) { void EmojiListWidget::displaySet(uint64 setId) {
const auto &sets = session().data().stickers().sets(); const auto &sets = session().data().stickers().sets();
auto it = sets.find(setId); auto it = sets.find(setId);
if (it != sets.cend()) { if (it != sets.cend() && _controller) {
checkHideWithBox(controller()->show( checkHideWithBox(_controller->show(
Box<StickerSetBox>(controller(), it->second.get()), Box<StickerSetBox>(_controller, it->second.get()),
Ui::LayerOption::KeepOther).data()); Ui::LayerOption::KeepOther).data());
} }
} }
void EmojiListWidget::removeSet(uint64 setId) { void EmojiListWidget::removeSet(uint64 setId) {
if (auto box = MakeConfirmRemoveSetBox(&session(), setId)) { if (auto box = MakeConfirmRemoveSetBox(&session(), setId)) {
checkHideWithBox(controller()->show( if (_controller) {
std::move(box), checkHideWithBox(_controller->show(
Ui::LayerOption::KeepOther)); std::move(box),
Ui::LayerOption::KeepOther));
}
} }
} }
@ -1315,7 +1329,7 @@ void EmojiListWidget::refreshRecent() {
void EmojiListWidget::refreshCustom() { void EmojiListWidget::refreshCustom() {
auto old = base::take(_custom); auto old = base::take(_custom);
const auto session = &controller()->session(); const auto session = &this->session();
const auto premiumPossible = session->premiumPossible(); const auto premiumPossible = session->premiumPossible();
const auto premiumMayBeBought = premiumPossible const auto premiumMayBeBought = premiumPossible
&& !session->premium() && !session->premium()

View file

@ -53,19 +53,30 @@ class StickersListFooter;
class GradientPremiumStar; class GradientPremiumStar;
class LocalStickersManager; class LocalStickersManager;
enum class EmojiListMode {
Full,
EmojiStatus,
Reactions,
};
struct EmojiListDescriptor {
not_null<Main::Session*> session;
EmojiListMode mode = EmojiListMode::Full;
Window::SessionController *controller = nullptr;
Fn<bool()> paused;
};
class EmojiListWidget class EmojiListWidget
: public TabbedSelector::Inner : public TabbedSelector::Inner
, public Ui::AbstractTooltipShower { , public Ui::AbstractTooltipShower {
public: public:
enum class Mode { using Mode = EmojiListMode;
Full,
EmojiStatus,
};
EmojiListWidget( EmojiListWidget(
QWidget *parent, QWidget *parent,
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
Window::GifPauseReason level, Window::GifPauseReason level,
Mode mode); Mode mode);
EmojiListWidget(QWidget *parent, EmojiListDescriptor &&descriptor);
~EmojiListWidget(); ~EmojiListWidget();
using Section = Ui::Emoji::Section; using Section = Ui::Emoji::Section;
@ -272,6 +283,7 @@ private:
DocumentId documentId, DocumentId documentId,
uint64 setId); uint64 setId);
Window::SessionController *_controller = nullptr;
Mode _mode = Mode::Full; Mode _mode = Mode::Full;
const int _staticCount = 0; const int _staticCount = 0;
StickersListFooter *_footer = nullptr; StickersListFooter *_footer = nullptr;

View file

@ -170,8 +170,9 @@ GifsListWidget::GifsListWidget(
QWidget *parent, QWidget *parent,
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
Window::GifPauseReason level) Window::GifPauseReason level)
: Inner(parent, controller, level) : Inner(parent, &controller->session(), Window::PausedIn(controller, level))
, _api(&controller->session().mtp()) , _controller(controller)
, _api(&session().mtp())
, _section(Section::Gifs) , _section(Section::Gifs)
, _updateInlineItems([=] { updateInlineItems(); }) , _updateInlineItems([=] { updateInlineItems(); })
, _mosaic(st::emojiPanWidth - st::inlineResultsLeft) , _mosaic(st::emojiPanWidth - st::inlineResultsLeft)
@ -186,19 +187,19 @@ GifsListWidget::GifsListWidget(
this, this,
[=] { sendInlineRequest(); }); [=] { sendInlineRequest(); });
controller->session().data().stickers().savedGifsUpdated( session().data().stickers().savedGifsUpdated(
) | rpl::start_with_next([=] { ) | rpl::start_with_next([=] {
refreshSavedGifs(); refreshSavedGifs();
}, lifetime()); }, lifetime());
controller->session().downloaderTaskFinished( session().downloaderTaskFinished(
) | rpl::start_with_next([=] { ) | rpl::start_with_next([=] {
updateInlineItems(); updateInlineItems();
}, lifetime()); }, lifetime());
controller->gifPauseLevelChanged( controller->gifPauseLevelChanged(
) | rpl::start_with_next([=] { ) | rpl::start_with_next([=] {
if (!controller->isGifPausedAtLeastFor(level)) { if (!paused()) {
updateInlineItems(); updateInlineItems();
} }
}, lifetime()); }, lifetime());
@ -285,7 +286,7 @@ void GifsListWidget::inlineResultsDone(const MTPmessages_BotResults &result) {
auto adding = (it != _inlineCache.cend()); auto adding = (it != _inlineCache.cend());
if (result.type() == mtpc_messages_botResults) { if (result.type() == mtpc_messages_botResults) {
auto &d = result.c_messages_botResults(); auto &d = result.c_messages_botResults();
controller()->session().data().processUsers(d.vusers()); session().data().processUsers(d.vusers());
auto &v = d.vresults().v; auto &v = d.vresults().v;
auto queryId = d.vquery_id().v; auto queryId = d.vquery_id().v;
@ -303,7 +304,7 @@ void GifsListWidget::inlineResultsDone(const MTPmessages_BotResults &result) {
auto added = 0; auto added = 0;
for (const auto &res : v) { for (const auto &res : v) {
auto result = InlineBots::Result::Create( auto result = InlineBots::Result::Create(
&controller()->session(), &session(),
queryId, queryId,
res); res);
if (result) { if (result) {
@ -343,7 +344,7 @@ void GifsListWidget::paintInlineItems(Painter &p, QRect clip) {
p.drawText(QRect(0, 0, width(), (height() / 3) * 2 + st::normalFont->height), text, style::al_center); p.drawText(QRect(0, 0, width(), (height() / 3) * 2 + st::normalFont->height), text, style::al_center);
return; return;
} }
const auto gifPaused = controller()->isGifPausedAtLeastFor(level()); const auto gifPaused = paused();
using namespace InlineBots::Layout; using namespace InlineBots::Layout;
PaintContext context(crl::now(), false, gifPaused, false); PaintContext context(crl::now(), false, gifPaused, false);
@ -397,7 +398,7 @@ void GifsListWidget::fillContextMenu(
const style::icon *icon) { const style::icon *icon) {
menu->addAction(text, std::move(done), icon); menu->addAction(text, std::move(done), icon);
}; };
AddGifAction(std::move(callback), controller(), document); AddGifAction(std::move(callback), _controller, document);
} }
}; };
} }
@ -426,7 +427,7 @@ void GifsListWidget::mouseReleaseEvent(QMouseEvent *e) {
ActivateClickHandler(window(), activated, { ActivateClickHandler(window(), activated, {
e->button(), e->button(),
QVariant::fromValue(ClickHandlerContext{ QVariant::fromValue(ClickHandlerContext{
.sessionWindow = base::make_weak(controller().get()), .sessionWindow = base::make_weak(_controller.get()),
}) })
}); });
} }
@ -449,7 +450,7 @@ void GifsListWidget::selectInlineResult(
_mosaic.findRect(index).topLeft()); _mosaic.findRect(index).topLeft());
return Ui::MessageSendingAnimationFrom{ return Ui::MessageSendingAnimationFrom{
.type = Ui::MessageSendingAnimationFrom::Type::Gif, .type = Ui::MessageSendingAnimationFrom::Type::Gif,
.localId = controller()->session().data().nextLocalMessageId(), .localId = session().data().nextLocalMessageId(),
.globalStartGeometry = mapToGlobal(rect), .globalStartGeometry = mapToGlobal(rect),
.crop = true, .crop = true,
}; };
@ -554,7 +555,7 @@ void GifsListWidget::refreshSavedGifs() {
if (_section == Section::Gifs) { if (_section == Section::Gifs) {
clearInlineRows(false); clearInlineRows(false);
const auto &saved = controller()->session().data().stickers().savedGifs(); const auto &saved = session().data().stickers().savedGifs();
if (!saved.isEmpty()) { if (!saved.isEmpty()) {
const auto layouts = ranges::views::all( const auto layouts = ranges::views::all(
saved saved
@ -827,9 +828,9 @@ void GifsListWidget::searchForGifs(const QString &query) {
Expects(result.type() == mtpc_contacts_resolvedPeer); Expects(result.type() == mtpc_contacts_resolvedPeer);
auto &data = result.c_contacts_resolvedPeer(); auto &data = result.c_contacts_resolvedPeer();
controller()->session().data().processUsers(data.vusers()); session().data().processUsers(data.vusers());
controller()->session().data().processChats(data.vchats()); session().data().processChats(data.vchats());
const auto peer = controller()->session().data().peerLoaded( const auto peer = session().data().peerLoaded(
peerFromMTP(data.vpeer())); peerFromMTP(data.vpeer()));
if (const auto user = peer ? peer->asUser() : nullptr) { if (const auto user = peer ? peer->asUser() : nullptr) {
_searchBot = user; _searchBot = user;
@ -918,11 +919,11 @@ void GifsListWidget::updateSelected() {
_pressed = _selected; _pressed = _selected;
if (item) { if (item) {
if (const auto preview = item->getPreviewDocument()) { if (const auto preview = item->getPreviewDocument()) {
controller()->widget()->showMediaPreview( _controller->widget()->showMediaPreview(
Data::FileOriginSavedGifs(), Data::FileOriginSavedGifs(),
preview); preview);
} else if (const auto preview = item->getPreviewPhoto()) { } else if (const auto preview = item->getPreviewPhoto()) {
controller()->widget()->showMediaPreview( _controller->widget()->showMediaPreview(
Data::FileOrigin(), Data::FileOrigin(),
preview); preview);
} }
@ -940,11 +941,11 @@ void GifsListWidget::showPreview() {
} }
if (const auto layout = _mosaic.maybeItemAt(_pressed)) { if (const auto layout = _mosaic.maybeItemAt(_pressed)) {
if (const auto previewDocument = layout->getPreviewDocument()) { if (const auto previewDocument = layout->getPreviewDocument()) {
_previewShown = controller()->widget()->showMediaPreview( _previewShown = _controller->widget()->showMediaPreview(
Data::FileOriginSavedGifs(), Data::FileOriginSavedGifs(),
previewDocument); previewDocument);
} else if (const auto previewPhoto = layout->getPreviewPhoto()) { } else if (const auto previewPhoto = layout->getPreviewPhoto()) {
_previewShown = controller()->widget()->showMediaPreview( _previewShown = _controller->widget()->showMediaPreview(
Data::FileOrigin(), Data::FileOrigin(),
previewPhoto); previewPhoto);
} }

View file

@ -140,24 +140,8 @@ private:
void repaintItems(crl::time now = 0); void repaintItems(crl::time now = 0);
void showPreview(); void showPreview();
MTP::Sender _api;
Section _section = Section::Gifs;
crl::time _lastScrolledAt = 0;
crl::time _lastUpdatedAt = 0;
base::Timer _updateInlineItems;
bool _inlineWithThumb = false;
void clearInlineRows(bool resultsDeleted); void clearInlineRows(bool resultsDeleted);
std::map<
not_null<DocumentData*>,
std::unique_ptr<LayoutItem>> _gifLayouts;
LayoutItem *layoutPrepareSavedGif(not_null<DocumentData*> document); LayoutItem *layoutPrepareSavedGif(not_null<DocumentData*> document);
std::map<
not_null<InlineResult*>,
std::unique_ptr<LayoutItem>> _inlineLayouts;
LayoutItem *layoutPrepareInlineResult(not_null<InlineResult*> result); LayoutItem *layoutPrepareInlineResult(not_null<InlineResult*> result);
void deleteUnusedGifLayouts(); void deleteUnusedGifLayouts();
@ -170,6 +154,23 @@ private:
Api::SendOptions options, Api::SendOptions options,
bool forceSend = false); bool forceSend = false);
not_null<Window::SessionController*> _controller;
MTP::Sender _api;
Section _section = Section::Gifs;
crl::time _lastScrolledAt = 0;
crl::time _lastUpdatedAt = 0;
base::Timer _updateInlineItems;
bool _inlineWithThumb = false;
std::map<
not_null<DocumentData*>,
std::unique_ptr<LayoutItem>> _gifLayouts;
std::map<
not_null<InlineResult*>,
std::unique_ptr<LayoutItem>> _inlineLayouts;
Footer *_footer = nullptr; Footer *_footer = nullptr;
Mosaic::Layout::MosaicLayout<LayoutItem> _mosaic; Mosaic::Layout::MosaicLayout<LayoutItem> _mosaic;

View file

@ -21,7 +21,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "lottie/lottie_single_player.h" #include "lottie/lottie_single_player.h"
#include "ui/widgets/input_fields.h" #include "ui/widgets/input_fields.h"
#include "ui/widgets/buttons.h" #include "ui/widgets/buttons.h"
#include "window/window_session_controller.h"
#include "styles/style_chat_helpers.h" #include "styles/style_chat_helpers.h"
#include <QtWidgets/QApplication> #include <QtWidgets/QApplication>
@ -183,8 +182,8 @@ void GradientPremiumStar::renderOnDemand() const {
StickersListFooter::StickersListFooter(Descriptor &&descriptor) StickersListFooter::StickersListFooter(Descriptor &&descriptor)
: InnerFooter(descriptor.parent) : InnerFooter(descriptor.parent)
, _controller(descriptor.controller) , _session(descriptor.session)
, _level(descriptor.level) , _paused(descriptor.paused)
, _searchButtonVisible(descriptor.searchButtonVisible) , _searchButtonVisible(descriptor.searchButtonVisible)
, _settingsButtonVisible(descriptor.settingsButtonVisible) , _settingsButtonVisible(descriptor.settingsButtonVisible)
, _iconState([=] { update(); }) , _iconState([=] { update(); })
@ -201,7 +200,7 @@ StickersListFooter::StickersListFooter(Descriptor &&descriptor)
? st::stickerIconWidth ? st::stickerIconWidth
: 0); : 0);
_controller->session().downloaderTaskFinished( _session->downloaderTaskFinished(
) | rpl::start_with_next([=] { ) | rpl::start_with_next([=] {
update(); update();
}, lifetime()); }, lifetime());
@ -564,7 +563,7 @@ void StickersListFooter::paintEvent(QPaintEvent *e) {
} }
const auto now = crl::now(); const auto now = crl::now();
const auto paused = _controller->isGifPausedAtLeastFor(_level); const auto paused = _paused();
enumerateVisibleIcons([&](const IconInfo &info) { enumerateVisibleIcons([&](const IconInfo &info) {
paintSetIcon(p, info, now, paused); paintSetIcon(p, info, now, paused);
}); });
@ -1280,8 +1279,8 @@ void StickersListFooter::paintSetIcon(
} else { } else {
paintOne(left, [&] { paintOne(left, [&] {
if (icon.setId == Data::Stickers::FeaturedSetId) { if (icon.setId == Data::Stickers::FeaturedSetId) {
const auto session = &_controller->session(); const auto &stickers = _session->data().stickers();
return session->data().stickers().featuredSetsUnreadCount() return stickers.featuredSetsUnreadCount()
? &st::stickersTrendingUnread ? &st::stickersTrendingUnread
: &st::stickersTrending; : &st::stickersTrending;
//} else if (setId == Stickers::FavedSetId) { //} else if (setId == Stickers::FavedSetId) {

View file

@ -92,8 +92,8 @@ private:
class StickersListFooter final : public TabbedSelector::InnerFooter { class StickersListFooter final : public TabbedSelector::InnerFooter {
public: public:
struct Descriptor { struct Descriptor {
not_null<Window::SessionController*> controller; not_null<Main::Session*> session;
Window::GifPauseReason level = {}; Fn<bool()> paused;
not_null<RpWidget*> parent; not_null<RpWidget*> parent;
bool searchButtonVisible = false; bool searchButtonVisible = false;
bool settingsButtonVisible = false; bool settingsButtonVisible = false;
@ -228,8 +228,8 @@ private:
void clipCallback(Media::Clip::Notification notification, uint64 setId); void clipCallback(Media::Clip::Notification notification, uint64 setId);
const not_null<Window::SessionController*> _controller; const not_null<Main::Session*> _session;
const Window::GifPauseReason _level = {}; const Fn<bool()> _paused;
const bool _searchButtonVisible = false; const bool _searchButtonVisible = false;
const bool _settingsButtonVisible = false; const bool _settingsButtonVisible = false;

View file

@ -164,10 +164,10 @@ StickersListWidget::StickersListWidget(
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
Window::GifPauseReason level, Window::GifPauseReason level,
bool masks) bool masks)
: Inner(parent, controller, level) : Inner(parent, &controller->session(), Window::PausedIn(controller, level))
, _api(&controller->session().mtp()) , _controller(controller)
, _localSetsManager( , _api(&session().mtp())
std::make_unique<LocalStickersManager>(&controller->session())) , _localSetsManager(std::make_unique<LocalStickersManager>(&session()))
, _section(Section::Stickers) , _section(Section::Stickers)
, _isMasks(masks) , _isMasks(masks)
, _updateItemsTimer([=] { updateItems(); }) , _updateItemsTimer([=] { updateItems(); })
@ -181,7 +181,7 @@ StickersListWidget::StickersListWidget(
, _addWidth(st::stickersTrendingAdd.font->width(_addText)) , _addWidth(st::stickersTrendingAdd.font->width(_addText))
, _settings(this, tr::lng_stickers_you_have(tr::now)) , _settings(this, tr::lng_stickers_you_have(tr::now))
, _previewTimer([=] { showPreview(); }) , _previewTimer([=] { showPreview(); })
, _premiumMark(std::make_unique<StickerPremiumMark>(&controller->session())) , _premiumMark(std::make_unique<StickerPremiumMark>(&session()))
, _searchRequestTimer([=] { sendSearchRequest(); }) { , _searchRequestTimer([=] { sendSearchRequest(); }) {
setMouseTracking(true); setMouseTracking(true);
setAttribute(Qt::WA_OpaquePaintEvent); setAttribute(Qt::WA_OpaquePaintEvent);
@ -246,8 +246,8 @@ object_ptr<TabbedSelector::InnerFooter> StickersListWidget::createFooter() {
using FooterDescriptor = StickersListFooter::Descriptor; using FooterDescriptor = StickersListFooter::Descriptor;
auto result = object_ptr<StickersListFooter>(FooterDescriptor{ auto result = object_ptr<StickersListFooter>(FooterDescriptor{
.controller = controller(), .session = &session(),
.level = level(), .paused = pausedMethod(),
.parent = this, .parent = this,
.searchButtonVisible = !_isMasks, .searchButtonVisible = !_isMasks,
.settingsButtonVisible = true, .settingsButtonVisible = true,
@ -263,8 +263,8 @@ object_ptr<TabbedSelector::InnerFooter> StickersListWidget::createFooter() {
_footer->openSettingsRequests( _footer->openSettingsRequests(
) | rpl::start_with_next([=] { ) | rpl::start_with_next([=] {
const auto onlyFeatured = _footer->hasOnlyFeaturedSets(); const auto onlyFeatured = _footer->hasOnlyFeaturedSets();
controller()->show(Box<StickersBox>( _controller->show(Box<StickersBox>(
controller(), _controller,
(onlyFeatured (onlyFeatured
? StickersBox::Section::Featured ? StickersBox::Section::Featured
: _isMasks : _isMasks
@ -814,7 +814,7 @@ void StickersListWidget::paintStickers(Painter &p, QRect clip) {
: &_selected); : &_selected);
const auto now = crl::now(); const auto now = crl::now();
const auto paused = controller()->isGifPausedAtLeastFor(level()); const auto paused = this->paused();
if (sets.empty() && _section == Section::Search) { if (sets.empty() && _section == Section::Search) {
paintEmptySearchResults(p); paintEmptySearchResults(p);
} }
@ -1534,7 +1534,7 @@ QPoint StickersListWidget::buttonRippleTopLeft(int section) const {
void StickersListWidget::showStickerSetBox(not_null<DocumentData*> document) { void StickersListWidget::showStickerSetBox(not_null<DocumentData*> document) {
if (document->sticker() && document->sticker()->set) { if (document->sticker() && document->sticker()->set) {
checkHideWithBox(StickerSetBox::Show(controller(), document)); checkHideWithBox(StickerSetBox::Show(_controller, document));
} }
} }
@ -1569,7 +1569,7 @@ void StickersListWidget::fillContextMenu(
SendMenu::DefaultSilentCallback(send), SendMenu::DefaultSilentCallback(send),
SendMenu::DefaultScheduleCallback(this, type, send)); SendMenu::DefaultScheduleCallback(this, type, send));
const auto window = controller(); const auto window = _controller;
const auto toggleFavedSticker = [=] { const auto toggleFavedSticker = [=] {
Api::ToggleFavedSticker( Api::ToggleFavedSticker(
window, window,
@ -1674,7 +1674,7 @@ void StickersListWidget::mouseReleaseEvent(QMouseEvent *e) {
removeSet(sets[button->section].id); removeSet(sets[button->section].id);
} }
} else if (std::get_if<OverGroupAdd>(&pressed)) { } else if (std::get_if<OverGroupAdd>(&pressed)) {
controller()->show(Box<StickersBox>(controller(), _megagroupSet)); _controller->show(Box<StickersBox>(_controller, _megagroupSet));
} }
} }
} }
@ -1732,9 +1732,9 @@ void StickersListWidget::removeFavedSticker(int section, int index) {
clearSelection(); clearSelection();
const auto &sticker = _mySets[section].stickers[index]; const auto &sticker = _mySets[section].stickers[index];
const auto document = sticker.document; const auto document = sticker.document;
session().data().stickers().setFaved(controller(), document, false); session().data().stickers().setFaved(_controller, document, false);
Api::ToggleFavedSticker( Api::ToggleFavedSticker(
controller(), _controller,
document, document,
Data::FileOriginStickerSet(Data::Stickers::FavedSetId, 0), Data::FileOriginStickerSet(Data::Stickers::FavedSetId, 0),
false); false);
@ -2146,8 +2146,7 @@ void StickersListWidget::refreshRecentStickers(bool performResize) {
} }
void StickersListWidget::refreshPremiumStickers() { void StickersListWidget::refreshPremiumStickers() {
if (_isMasks if (_isMasks || session().settings().skipPremiumStickersSet()) {
|| controller()->session().settings().skipPremiumStickersSet()) {
return; return;
} }
clearSelection(); clearSelection();
@ -2457,7 +2456,7 @@ void StickersListWidget::setSelected(OverState newSelected) {
const auto &set = sets[sticker->section]; const auto &set = sets[sticker->section];
Assert(sticker->index >= 0 && sticker->index < set.stickers.size()); Assert(sticker->index >= 0 && sticker->index < set.stickers.size());
const auto document = set.stickers[sticker->index].document; const auto document = set.stickers[sticker->index].document;
controller()->widget()->showMediaPreview( _controller->widget()->showMediaPreview(
document->stickerSetOrigin(), document->stickerSetOrigin(),
document); document);
} }
@ -2472,7 +2471,7 @@ void StickersListWidget::showPreview() {
const auto &set = sets[sticker->section]; const auto &set = sets[sticker->section];
Assert(sticker->index >= 0 && sticker->index < set.stickers.size()); Assert(sticker->index >= 0 && sticker->index < set.stickers.size());
const auto document = set.stickers[sticker->index].document; const auto document = set.stickers[sticker->index].document;
controller()->widget()->showMediaPreview( _controller->widget()->showMediaPreview(
document->stickerSetOrigin(), document->stickerSetOrigin(),
document); document);
_previewShown = true; _previewShown = true;
@ -2586,8 +2585,8 @@ void StickersListWidget::beforeHiding() {
void StickersListWidget::displaySet(uint64 setId) { void StickersListWidget::displaySet(uint64 setId) {
if (setId == Data::Stickers::MegagroupSetId) { if (setId == Data::Stickers::MegagroupSetId) {
if (_megagroupSet->canEditStickers()) { if (_megagroupSet->canEditStickers()) {
checkHideWithBox(controller()->show( checkHideWithBox(_controller->show(
Box<StickersBox>(controller(), _megagroupSet), Box<StickersBox>(_controller, _megagroupSet),
Ui::LayerOption::KeepOther).data()); Ui::LayerOption::KeepOther).data());
return; return;
} else if (_megagroupSet->mgInfo->stickerSet.id) { } else if (_megagroupSet->mgInfo->stickerSet.id) {
@ -2599,8 +2598,8 @@ void StickersListWidget::displaySet(uint64 setId) {
const auto &sets = session().data().stickers().sets(); const auto &sets = session().data().stickers().sets();
auto it = sets.find(setId); auto it = sets.find(setId);
if (it != sets.cend()) { if (it != sets.cend()) {
checkHideWithBox(controller()->show( checkHideWithBox(_controller->show(
Box<StickerSetBox>(controller(), it->second.get()), Box<StickerSetBox>(_controller, it->second.get()),
Ui::LayerOption::KeepOther).data()); Ui::LayerOption::KeepOther).data());
} }
} }
@ -2615,7 +2614,7 @@ void StickersListWidget::removeMegagroupSet(bool locally) {
const auto cancelled = [](Fn<void()> &&close) { const auto cancelled = [](Fn<void()> &&close) {
close(); close();
}; };
checkHideWithBox(controller()->show(Ui::MakeConfirmBox({ checkHideWithBox(_controller->show(Ui::MakeConfirmBox({
.text = tr::lng_stickers_remove_group_set(), .text = tr::lng_stickers_remove_group_set(),
.confirmed = crl::guard(this, [this, group = _megagroupSet]( .confirmed = crl::guard(this, [this, group = _megagroupSet](
Fn<void()> &&close) { Fn<void()> &&close) {
@ -2639,7 +2638,7 @@ void StickersListWidget::removeSet(uint64 setId) {
|| !_megagroupSet->canEditStickers(); || !_megagroupSet->canEditStickers();
removeMegagroupSet(removeLocally); removeMegagroupSet(removeLocally);
} else if (auto box = MakeConfirmRemoveSetBox(&session(), setId)) { } else if (auto box = MakeConfirmRemoveSetBox(&session(), setId)) {
checkHideWithBox(controller()->show( checkHideWithBox(_controller->show(
std::move(box), std::move(box),
Ui::LayerOption::KeepOther)); Ui::LayerOption::KeepOther));
} }

View file

@ -328,6 +328,7 @@ private:
int index, int index,
not_null<DocumentData*> document); not_null<DocumentData*> document);
not_null<Window::SessionController*> _controller;
MTP::Sender _api; MTP::Sender _api;
std::unique_ptr<LocalStickersManager> _localSetsManager; std::unique_ptr<LocalStickersManager> _localSetsManager;
ChannelData *_megagroupSet = nullptr; ChannelData *_megagroupSet = nullptr;

View file

@ -1198,13 +1198,19 @@ TabbedSelector::Inner::Inner(
QWidget *parent, QWidget *parent,
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
Window::GifPauseReason level) Window::GifPauseReason level)
: RpWidget(parent) : Inner(
, _controller(controller) parent,
, _level(level) { &controller->session(),
Window::PausedIn(controller, level)) {
} }
Main::Session &TabbedSelector::Inner::session() const { TabbedSelector::Inner::Inner(
return controller()->session(); QWidget *parent,
not_null<Main::Session*> session,
Fn<bool()> paused)
: RpWidget(parent)
, _session(session)
, _paused(paused) {
} }
rpl::producer<int> TabbedSelector::Inner::scrollToRequests() const { rpl::producer<int> TabbedSelector::Inner::scrollToRequests() const {

View file

@ -276,14 +276,20 @@ public:
QWidget *parent, QWidget *parent,
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
Window::GifPauseReason level); Window::GifPauseReason level);
Inner(
QWidget *parent,
not_null<Main::Session*> session,
Fn<bool()> paused);
[[nodiscard]] not_null<Window::SessionController*> controller() const { [[nodiscard]] Main::Session &session() const {
return _controller; return *_session;
} }
[[nodiscard]] Window::GifPauseReason level() const { [[nodiscard]] Fn<bool()> pausedMethod() const {
return _level; return _paused;
}
[[nodiscard]] bool paused() const {
return _paused();
} }
[[nodiscard]] Main::Session &session() const;
[[nodiscard]] int getVisibleTop() const { [[nodiscard]] int getVisibleTop() const {
return _visibleTop; return _visibleTop;
@ -341,8 +347,8 @@ protected:
void checkHideWithBox(QPointer<Ui::BoxContent> box); void checkHideWithBox(QPointer<Ui::BoxContent> box);
private: private:
const not_null<Window::SessionController*> _controller; const not_null<Main::Session*> _session;
const Window::GifPauseReason _level = {}; const Fn<bool()> _paused;
int _visibleTop = 0; int _visibleTop = 0;
int _visibleBottom = 0; int _visibleBottom = 0;

View file

@ -2446,6 +2446,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
const auto attached = reactItem const auto attached = reactItem
? AttachSelectorToMenu( ? AttachSelectorToMenu(
_menu.get(), _menu.get(),
controller,
desiredPosition, desiredPosition,
reactItem, reactItem,
[=](ChosenReaction reaction) { reactionChosen(reaction); }, [=](ChosenReaction reaction) { reactionChosen(reaction); },

View file

@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/popup_menu.h" #include "ui/widgets/popup_menu.h"
#include "history/history_item.h" #include "history/history_item.h"
#include "window/window_session_controller.h"
#include "styles/style_chat_helpers.h" #include "styles/style_chat_helpers.h"
#include "styles/style_chat.h" #include "styles/style_chat.h"
@ -16,9 +17,11 @@ namespace HistoryView::Reactions {
Selector::Selector( Selector::Selector(
not_null<QWidget*> parent, not_null<QWidget*> parent,
not_null<Window::SessionController*> parentController,
Data::PossibleItemReactions &&reactions, Data::PossibleItemReactions &&reactions,
IconFactory iconFactory) IconFactory iconFactory)
: RpWidget(parent) : RpWidget(parent)
, _parentController(parentController.get())
, _reactions(std::move(reactions)) , _reactions(std::move(reactions))
, _cachedRound( , _cachedRound(
QSize(st::reactStripSkip * 2 + st::reactStripSize, st::reactStripHeight), QSize(st::reactStripSkip * 2 + st::reactStripSize, st::reactStripHeight),
@ -251,25 +254,27 @@ void Selector::paintFadingExpandIcon(QPainter &p, float64 progress) {
} }
void Selector::paintExpanded(QPainter &p) { void Selector::paintExpanded(QPainter &p) {
paintExpandedBg(p); if (!_expandFinished) {
finishExpand();
}
p.drawImage(0, 0, _paintBuffer);
paintStripWithoutExpand(p); paintStripWithoutExpand(p);
} }
void Selector::paintExpandedBg(QPainter &p) { void Selector::finishExpand() {
if (!_expandedBgReady) { Expects(!_expandFinished);
_expandedBgReady = true;
auto q = QPainter(&_paintBuffer); _expandFinished = true;
q.setCompositionMode(QPainter::CompositionMode_Source); auto q = QPainter(&_paintBuffer);
const auto pattern = _cachedRound.validateFrame( q.setCompositionMode(QPainter::CompositionMode_Source);
kFramesCount - 1, const auto pattern = _cachedRound.validateFrame(
1., kFramesCount - 1,
st::roundRadiusSmall); 1.,
const auto fill = _cachedRound.FillWithImage(q, rect(), pattern); st::roundRadiusSmall);
if (!fill.isEmpty()) { const auto fill = _cachedRound.FillWithImage(q, rect(), pattern);
q.fillRect(fill, st::defaultPopupMenu.menu.itemBg); if (!fill.isEmpty()) {
} q.fillRect(fill, st::defaultPopupMenu.menu.itemBg);
} }
p.drawImage(0, 0, _paintBuffer);
} }
void Selector::paintBubble(QPainter &p, int innerWidth) { void Selector::paintBubble(QPainter &p, int innerWidth) {
@ -441,6 +446,7 @@ bool AdjustMenuGeometryForSelector(
AttachSelectorResult AttachSelectorToMenu( AttachSelectorResult AttachSelectorToMenu(
not_null<Ui::PopupMenu*> menu, not_null<Ui::PopupMenu*> menu,
not_null<Window::SessionController*> controller,
QPoint desiredPosition, QPoint desiredPosition,
not_null<HistoryItem*> item, not_null<HistoryItem*> item,
Fn<void(ChosenReaction)> chosen, Fn<void(ChosenReaction)> chosen,
@ -452,6 +458,7 @@ AttachSelectorResult AttachSelectorToMenu(
} }
const auto selector = Ui::CreateChild<Selector>( const auto selector = Ui::CreateChild<Selector>(
menu.get(), menu.get(),
controller,
std::move(reactions), std::move(reactions),
std::move(iconFactory)); std::move(iconFactory));
if (!AdjustMenuGeometryForSelector(menu, desiredPosition, selector)) { if (!AdjustMenuGeometryForSelector(menu, desiredPosition, selector)) {

View file

@ -36,6 +36,7 @@ class Selector final : public Ui::RpWidget {
public: public:
Selector( Selector(
not_null<QWidget*> parent, not_null<QWidget*> parent,
not_null<Window::SessionController*> parentController,
Data::PossibleItemReactions &&reactions, Data::PossibleItemReactions &&reactions,
IconFactory iconFactory); IconFactory iconFactory);
@ -75,15 +76,16 @@ private:
void paintStripWithoutExpand(QPainter &p); void paintStripWithoutExpand(QPainter &p);
void paintFadingExpandIcon(QPainter &p, float64 progress); void paintFadingExpandIcon(QPainter &p, float64 progress);
void paintExpanded(QPainter &p); void paintExpanded(QPainter &p);
void paintExpandedBg(QPainter &p);
void paintBubble(QPainter &p, int innerWidth); void paintBubble(QPainter &p, int innerWidth);
void paintBackgroundToBuffer(); void paintBackgroundToBuffer();
void finishExpand();
[[nodiscard]] int lookupSelectedIndex(QPoint position) const; [[nodiscard]] int lookupSelectedIndex(QPoint position) const;
void setSelected(int index); void setSelected(int index);
void expand(); void expand();
const base::weak_ptr<Window::SessionController> _parentController;
const Data::PossibleItemReactions _reactions; const Data::PossibleItemReactions _reactions;
Ui::RoundAreaWithShadow _cachedRound; Ui::RoundAreaWithShadow _cachedRound;
Strip _strip; Strip _strip;
@ -112,7 +114,7 @@ private:
bool _appearing = false; bool _appearing = false;
bool _toggling = false; bool _toggling = false;
bool _expanded = false; bool _expanded = false;
bool _expandedBgReady = false; bool _expandFinished = false;
bool _small = false; bool _small = false;
bool _over = false; bool _over = false;
bool _low = false; bool _low = false;
@ -126,6 +128,7 @@ enum class AttachSelectorResult {
}; };
AttachSelectorResult AttachSelectorToMenu( AttachSelectorResult AttachSelectorToMenu(
not_null<Ui::PopupMenu*> menu, not_null<Ui::PopupMenu*> menu,
not_null<Window::SessionController*> controller,
QPoint desiredPosition, QPoint desiredPosition,
not_null<HistoryItem*> item, not_null<HistoryItem*> item,
Fn<void(ChosenReaction)> chosen, Fn<void(ChosenReaction)> chosen,

View file

@ -144,6 +144,18 @@ void ActivateWindow(not_null<SessionController*> controller) {
Ui::ActivateWindowDelayed(window); Ui::ActivateWindowDelayed(window);
} }
bool IsPaused(
not_null<SessionController*> controller,
GifPauseReason level) {
return controller->isGifPausedAtLeastFor(level);
}
Fn<bool()> PausedIn(
not_null<SessionController*> controller,
GifPauseReason level) {
return [=] { return IsPaused(controller, level); };
}
bool operator==(const PeerThemeOverride &a, const PeerThemeOverride &b) { bool operator==(const PeerThemeOverride &a, const PeerThemeOverride &b) {
return (a.peer == b.peer) && (a.theme == b.theme); return (a.peer == b.peer) && (a.theme == b.theme);
} }

View file

@ -611,6 +611,13 @@ private:
void ActivateWindow(not_null<SessionController*> controller); void ActivateWindow(not_null<SessionController*> controller);
[[nodiscard]] bool IsPaused(
not_null<SessionController*> controller,
GifPauseReason level);
[[nodiscard]] Fn<bool()> PausedIn(
not_null<SessionController*> controller,
GifPauseReason level);
class Show : public Ui::Show { class Show : public Ui::Show {
public: public:
explicit Show(not_null<SessionNavigation*> navigation); explicit Show(not_null<SessionNavigation*> navigation);