diff --git a/Telegram/SourceFiles/boxes/sticker_set_box.cpp b/Telegram/SourceFiles/boxes/sticker_set_box.cpp index 2120b46db..7a50cf7c7 100644 --- a/Telegram/SourceFiles/boxes/sticker_set_box.cpp +++ b/Telegram/SourceFiles/boxes/sticker_set_box.cpp @@ -32,6 +32,73 @@ constexpr auto kStickersPanelPerRow = 5; } // namespace +class StickerSetBox::Inner : public TWidget, public RPCSender, private base::Subscriber { +public: + Inner(QWidget *parent, const MTPInputStickerSet &set); + + bool loaded() const; + bool notInstalled() const; + bool official() const; + Fn title() const; + QString shortName() const; + + void install(); + rpl::producer setInstalled() const; + rpl::producer<> updateControls() const; + + ~Inner(); + +protected: + void mousePressEvent(QMouseEvent *e) override; + void mouseMoveEvent(QMouseEvent *e) override; + void mouseReleaseEvent(QMouseEvent *e) override; + void paintEvent(QPaintEvent *e) override; + void leaveEventHook(QEvent *e) override; + +private: + void updateSelected(); + void setSelected(int selected); + void startOverAnimation(int index, float64 from, float64 to); + int stickerFromGlobalPos(const QPoint &p) const; + + void gotSet(const MTPmessages_StickerSet &set); + bool failedSet(const RPCError &error); + + void installDone(const MTPmessages_StickerSetInstallResult &result); + bool installFail(const RPCError &error); + + bool isMasksSet() const { + return (_setFlags & MTPDstickerSet::Flag::f_masks); + } + + void showPreview(); + + std::vector _packOvers; + Stickers::Pack _pack; + Stickers::ByEmojiMap _emoji; + bool _loaded = false; + uint64 _setId = 0; + uint64 _setAccess = 0; + QString _setTitle, _setShortName; + int _setCount = 0; + int32 _setHash = 0; + MTPDstickerSet::Flags _setFlags = 0; + TimeId _setInstallDate = TimeId(0); + + MTPInputStickerSet _input; + + mtpRequestId _installRequest = 0; + + int _selected = -1; + + base::Timer _previewTimer; + int _previewShown = -1; + + rpl::event_stream _setInstalled; + rpl::event_stream<> _updateControls; + +}; + StickerSetBox::StickerSetBox(QWidget*, const MTPInputStickerSet &set) : _set(set) { } @@ -41,33 +108,37 @@ void StickerSetBox::prepare() { _inner = setInnerWidget(object_ptr(this, _set), st::stickersScroll); Auth().data().stickersUpdated( - ) | rpl::start_with_next( - [this] { updateButtons(); }, - lifetime()); + ) | rpl::start_with_next([=] { + updateButtons(); + }, lifetime()); setDimensions(st::boxWideWidth, st::stickersMaxHeight); - onUpdateButtons(); + updateTitleAndButtons(); + + _inner->updateControls( + ) | rpl::start_with_next([=] { + updateTitleAndButtons(); + }, lifetime()); - connect(_inner, SIGNAL(updateButtons()), this, SLOT(onUpdateButtons())); _inner->setInstalled( - ) | rpl::start_with_next([this](auto &&setId) { + ) | rpl::start_with_next([=](uint64 setId) { Auth().api().stickerSetInstalled(setId); - this->closeBox(); + closeBox(); }, lifetime()); } -void StickerSetBox::onAddStickers() { +void StickerSetBox::addStickers() { _inner->install(); } -void StickerSetBox::onShareStickers() { +void StickerSetBox::shareStickers() { auto url = Messenger::Instance().createInternalLinkFull(qsl("addstickers/") + _inner->shortName()); QApplication::clipboard()->setText(url); Ui::show(Box(lang(lng_stickers_copied))); } -void StickerSetBox::onUpdateButtons() { +void StickerSetBox::updateTitleAndButtons() { setTitle(_inner->title()); updateButtons(); } @@ -76,16 +147,16 @@ void StickerSetBox::updateButtons() { clearButtons(); if (_inner->loaded()) { if (_inner->notInstalled()) { - addButton(langFactory(lng_stickers_add_pack), [this] { onAddStickers(); }); - addButton(langFactory(lng_cancel), [this] { closeBox(); }); + addButton(langFactory(lng_stickers_add_pack), [=] { addStickers(); }); + addButton(langFactory(lng_cancel), [=] { closeBox(); }); } else if (_inner->official()) { - addButton(langFactory(lng_about_done), [this] { closeBox(); }); + addButton(langFactory(lng_about_done), [=] { closeBox(); }); } else { - addButton(langFactory(lng_stickers_share_pack), [this] { onShareStickers(); }); - addButton(langFactory(lng_cancel), [this] { closeBox(); }); + addButton(langFactory(lng_stickers_share_pack), [=] { shareStickers(); }); + addButton(langFactory(lng_cancel), [=] { closeBox(); }); } } else { - addButton(langFactory(lng_cancel), [this] { closeBox(); }); + addButton(langFactory(lng_cancel), [=] { closeBox(); }); } update(); } @@ -96,7 +167,8 @@ void StickerSetBox::resizeEvent(QResizeEvent *e) { } StickerSetBox::Inner::Inner(QWidget *parent, const MTPInputStickerSet &set) : TWidget(parent) -, _input(set) { +, _input(set) +, _previewTimer([=] { showPreview(); }) { switch (set.type()) { case mtpc_inputStickerSetID: _setId = set.c_inputStickerSetID().vid.v; _setAccess = set.c_inputStickerSetID().vaccess_hash.v; break; case mtpc_inputStickerSetShortName: _setShortName = qs(set.c_inputStickerSetShortName().vshort_name); break; @@ -107,9 +179,6 @@ StickerSetBox::Inner::Inner(QWidget *parent, const MTPInputStickerSet &set) : TW subscribe(Auth().downloaderTaskFinished(), [this] { update(); }); setMouseTracking(true); - - _previewTimer.setSingleShot(true); - connect(&_previewTimer, SIGNAL(timeout()), this, SLOT(onPreview())); } void StickerSetBox::Inner::gotSet(const MTPmessages_StickerSet &set) { @@ -183,8 +252,15 @@ void StickerSetBox::Inner::gotSet(const MTPmessages_StickerSet &set) { _loaded = true; updateSelected(); + _updateControls.fire({}); +} - emit updateButtons(); +rpl::producer StickerSetBox::Inner::setInstalled() const { + return _setInstalled.events(); +} + +rpl::producer<> StickerSetBox::Inner::updateControls() const { + return _updateControls.events(); } bool StickerSetBox::Inner::failedSet(const RPCError &error) { @@ -273,7 +349,7 @@ bool StickerSetBox::Inner::installFail(const RPCError &error) { void StickerSetBox::Inner::mousePressEvent(QMouseEvent *e) { int index = stickerFromGlobalPos(e->globalPos()); if (index >= 0 && index < _pack.size()) { - _previewTimer.start(QApplication::startDragTime()); + _previewTimer.callOnce(QApplication::startDragTime()); } } @@ -300,10 +376,10 @@ void StickerSetBox::Inner::mouseReleaseEvent(QMouseEvent *e) { return; } if (_previewTimer.isActive()) { - _previewTimer.stop(); - int index = stickerFromGlobalPos(e->globalPos()); + _previewTimer.cancel(); + const auto index = stickerFromGlobalPos(e->globalPos()); if (index >= 0 && index < _pack.size() && !isMasksSet()) { - if (auto main = App::main()) { + if (const auto main = App::main()) { if (main->onSendSticker(_pack[index])) { Ui::hideSettingsAndLayer(); } @@ -338,7 +414,7 @@ void StickerSetBox::Inner::startOverAnimation(int index, float64 from, float64 t } } -void StickerSetBox::Inner::onPreview() { +void StickerSetBox::Inner::showPreview() { int index = stickerFromGlobalPos(QCursor::pos()); if (index >= 0 && index < _pack.size()) { _previewShown = index; diff --git a/Telegram/SourceFiles/boxes/sticker_set_box.h b/Telegram/SourceFiles/boxes/sticker_set_box.h index ffab649c1..4c0c060c5 100644 --- a/Telegram/SourceFiles/boxes/sticker_set_box.h +++ b/Telegram/SourceFiles/boxes/sticker_set_box.h @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "boxes/abstract_box.h" +#include "base/timer.h" #include "chat_helpers/stickers.h" class ConfirmBox; @@ -17,8 +18,6 @@ class PlainShadow; } // namespace Ui class StickerSetBox : public BoxContent, public RPCSender { - Q_OBJECT - public: StickerSetBox(QWidget*, const MTPInputStickerSet &set); @@ -27,13 +26,11 @@ protected: void resizeEvent(QResizeEvent *e) override; -private slots: - void onAddStickers(); - void onShareStickers(); - void onUpdateButtons(); - private: + void updateTitleAndButtons(); void updateButtons(); + void addStickers(); + void shareStickers(); MTPInputStickerSet _set; @@ -41,77 +38,3 @@ private: QPointer _inner; }; - -// This class is hold in header because it requires Qt preprocessing. -class StickerSetBox::Inner : public TWidget, public RPCSender, private base::Subscriber { - Q_OBJECT - -public: - Inner(QWidget *parent, const MTPInputStickerSet &set); - - bool loaded() const; - bool notInstalled() const; - bool official() const; - Fn title() const; - QString shortName() const; - - void install(); - auto setInstalled() const { - return _setInstalled.events(); - } - - ~Inner(); - -protected: - void mousePressEvent(QMouseEvent *e) override; - void mouseMoveEvent(QMouseEvent *e) override; - void mouseReleaseEvent(QMouseEvent *e) override; - void paintEvent(QPaintEvent *e) override; - void leaveEventHook(QEvent *e) override; - -private slots: - void onPreview(); - -signals: - void updateButtons(); - -private: - void updateSelected(); - void setSelected(int selected); - void startOverAnimation(int index, float64 from, float64 to); - int stickerFromGlobalPos(const QPoint &p) const; - - void gotSet(const MTPmessages_StickerSet &set); - bool failedSet(const RPCError &error); - - void installDone(const MTPmessages_StickerSetInstallResult &result); - bool installFail(const RPCError &error); - - bool isMasksSet() const { - return (_setFlags & MTPDstickerSet::Flag::f_masks); - } - - std::vector _packOvers; - Stickers::Pack _pack; - Stickers::ByEmojiMap _emoji; - bool _loaded = false; - uint64 _setId = 0; - uint64 _setAccess = 0; - QString _setTitle, _setShortName; - int _setCount = 0; - int32 _setHash = 0; - MTPDstickerSet::Flags _setFlags = 0; - TimeId _setInstallDate = TimeId(0); - - MTPInputStickerSet _input; - - mtpRequestId _installRequest = 0; - - int _selected = -1; - - QTimer _previewTimer; - int _previewShown = -1; - - rpl::event_stream _setInstalled; - -}; diff --git a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp index 9729101d4..974c76b20 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp @@ -18,6 +18,57 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace ChatHelpers { +class EmojiColorPicker : public Ui::RpWidget { +public: + EmojiColorPicker(QWidget *parent); + + void showEmoji(EmojiPtr emoji); + + void clearSelection(); + void handleMouseMove(QPoint globalPos); + void handleMouseRelease(QPoint globalPos); + void setSingleSize(QSize size); + + void showAnimated(); + void hideAnimated(); + void hideFast(); + + rpl::producer chosen() const; + rpl::producer<> hidden() const; + +protected: + void paintEvent(QPaintEvent *e) override; + void mousePressEvent(QMouseEvent *e) override; + void mouseReleaseEvent(QMouseEvent *e) override; + void mouseMoveEvent(QMouseEvent *e) override; + +private: + void animationCallback(); + void updateSize(); + + void drawVariant(Painter &p, int variant); + + void updateSelected(); + void setSelected(int newSelected); + + bool _ignoreShow = false; + + QVector _variants; + + int _selected = -1; + int _pressedSel = -1; + QPoint _lastMousePos; + QSize _singleSize; + + bool _hiding = false; + QPixmap _cache; + Animation _a_opacity; + + rpl::event_stream _chosen; + rpl::event_stream<> _hidden; + +}; + class EmojiListWidget::Footer : public TabbedSelector::InnerFooter { public: Footer(not_null parent); @@ -95,11 +146,9 @@ void EmojiListWidget::Footer::setActiveSection(Ui::Emoji::Section section) { _pan->showEmojiSection(section); } -EmojiColorPicker::EmojiColorPicker(QWidget *parent) : TWidget(parent) { +EmojiColorPicker::EmojiColorPicker(QWidget *parent) +: RpWidget(parent) { setMouseTracking(true); - - _hideTimer.setSingleShot(true); - connect(&_hideTimer, SIGNAL(timeout()), this, SLOT(hideAnimated())); } void EmojiColorPicker::showEmoji(EmojiPtr emoji) { @@ -167,16 +216,6 @@ void EmojiColorPicker::paintEvent(QPaintEvent *e) { } } -void EmojiColorPicker::enterEventHook(QEvent *e) { - _hideTimer.stop(); - if (_hiding) showAnimated(); - TWidget::enterEventHook(e); -} - -void EmojiColorPicker::leaveEventHook(QEvent *e) { - TWidget::leaveEventHook(e); -} - void EmojiColorPicker::mousePressEvent(QMouseEvent *e) { if (e->button() != Qt::LeftButton) { return; @@ -197,7 +236,7 @@ void EmojiColorPicker::handleMouseRelease(QPoint globalPos) { updateSelected(); if (_selected >= 0 && (pressed < 0 || _selected == pressed)) { - emit emojiSelected(_variants[_selected]); + _chosen.fire_copy(_variants[_selected]); } _ignoreShow = true; hideAnimated(); @@ -223,7 +262,7 @@ void EmojiColorPicker::animationCallback() { _cache = QPixmap(); if (_hiding) { hide(); - emit hidden(); + _hidden.fire({}); } else { _lastMousePos = QCursor::pos(); updateSelected(); @@ -236,7 +275,15 @@ void EmojiColorPicker::hideFast() { _a_opacity.finish(); _cache = QPixmap(); hide(); - emit hidden(); + _hidden.fire({}); +} + +rpl::producer EmojiColorPicker::chosen() const { + return _chosen.events(); +} + +rpl::producer<> EmojiColorPicker::hidden() const { + return _hidden.events(); } void EmojiColorPicker::hideAnimated() { @@ -333,7 +380,8 @@ EmojiListWidget::EmojiListWidget( QWidget *parent, not_null controller) : Inner(parent, controller) -, _picker(this) { +, _picker(this) +, _showPickerTimer([=] { showPicker(); }) { setMouseTracking(true); setAttribute(Qt::WA_OpaquePaintEvent); @@ -345,10 +393,18 @@ EmojiListWidget::EmojiListWidget( _counts[i] = Ui::Emoji::GetSectionCount(static_cast
(i)); } - _showPickerTimer.setSingleShot(true); - connect(&_showPickerTimer, SIGNAL(timeout()), this, SLOT(onShowPicker())); - connect(_picker, SIGNAL(emojiSelected(EmojiPtr)), this, SLOT(onColorSelected(EmojiPtr))); - connect(_picker, SIGNAL(hidden()), this, SLOT(onPickerHidden())); + _picker->chosen( + ) | rpl::start_with_next([=](EmojiPtr emoji) { + colorChosen(emoji); + }, lifetime()); + _picker->hidden( + ) | rpl::start_with_next([=] { + pickerHidden(); + }, lifetime()); +} + +rpl::producer EmojiListWidget::chosen() const { + return _chosen.events(); } void EmojiListWidget::visibleTopBottomUpdated( @@ -529,9 +585,9 @@ void EmojiListWidget::mousePressEvent(QMouseEvent *e) { _pickerSel = _selected; setCursor(style::cur_default); if (!cEmojiVariants().contains(_emoji[section][sel]->nonColoredId())) { - onShowPicker(); + showPicker(); } else { - _showPickerTimer.start(500); + _showPickerTimer.callOnce(500); } } } @@ -559,7 +615,7 @@ void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) { updateSelected(); if (_showPickerTimer.isActive()) { - _showPickerTimer.stop(); + _showPickerTimer.cancel(); _pickerSel = -1; _picker->hide(); } @@ -582,10 +638,10 @@ void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) { void EmojiListWidget::selectEmoji(EmojiPtr emoji) { Ui::Emoji::AddRecent(emoji); - emit selected(emoji); + _chosen.fire_copy(emoji); } -void EmojiListWidget::onShowPicker() { +void EmojiListWidget::showPicker() { if (_pickerSel < 0) return; auto section = (_pickerSel / MatrixRowShift); @@ -607,7 +663,7 @@ void EmojiListWidget::onShowPicker() { } } -void EmojiListWidget::onPickerHidden() { +void EmojiListWidget::pickerHidden() { _pickerSel = -1; update(); emit disableScroll(false); @@ -627,7 +683,7 @@ QRect EmojiListWidget::emojiRect(int section, int sel) { return QRect(x, y, _singleSize.width(), _singleSize.height()); } -void EmojiListWidget::onColorSelected(EmojiPtr emoji) { +void EmojiListWidget::colorChosen(EmojiPtr emoji) { if (emoji->hasVariants()) { cRefEmojiVariants().insert( emoji->nonColoredId(), @@ -792,7 +848,7 @@ void EmojiListWidget::showEmojiSection(Section section) { } return true; }); - emit scrollToY(y); + scrollTo(y); _lastMousePos = QCursor::pos(); diff --git a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h index a5d5ba070..f35f13078 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h +++ b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/tabbed_selector.h" #include "ui/widgets/tooltip.h" +#include "base/timer.h" namespace Ui { namespace Emoji { @@ -24,66 +25,11 @@ namespace ChatHelpers { constexpr auto kEmojiSectionCount = 8; -class EmojiColorPicker : public TWidget { - Q_OBJECT - -public: - EmojiColorPicker(QWidget *parent); - - void showEmoji(EmojiPtr emoji); - - void clearSelection(); - void handleMouseMove(QPoint globalPos); - void handleMouseRelease(QPoint globalPos); - void setSingleSize(QSize size); - - void hideFast(); - -public slots: - void showAnimated(); - void hideAnimated(); - -signals: - void emojiSelected(EmojiPtr emoji); - void hidden(); - -protected: - void paintEvent(QPaintEvent *e) override; - void enterEventHook(QEvent *e) override; - void leaveEventHook(QEvent *e) override; - void mousePressEvent(QMouseEvent *e) override; - void mouseReleaseEvent(QMouseEvent *e) override; - void mouseMoveEvent(QMouseEvent *e) override; - -private: - void animationCallback(); - void updateSize(); - - void drawVariant(Painter &p, int variant); - - void updateSelected(); - void setSelected(int newSelected); - - bool _ignoreShow = false; - - QVector _variants; - - int _selected = -1; - int _pressedSel = -1; - QPoint _lastMousePos; - QSize _singleSize; - - bool _hiding = false; - QPixmap _cache; - Animation _a_opacity; - - QTimer _hideTimer; - -}; - -class EmojiListWidget : public TabbedSelector::Inner, public Ui::AbstractTooltipShower { - Q_OBJECT +class EmojiColorPicker; +class EmojiListWidget + : public TabbedSelector::Inner + , public Ui::AbstractTooltipShower { public: EmojiListWidget(QWidget *parent, not_null controller); @@ -100,16 +46,7 @@ public: QString tooltipText() const override; QPoint tooltipPos() const override; -public slots: - void onShowPicker(); - void onPickerHidden(); - void onColorSelected(EmojiPtr emoji); - - bool checkPickerHide(); - -signals: - void selected(EmojiPtr emoji); - void switchToStickers(); + rpl::producer chosen() const; protected: void visibleTopBottomUpdated( @@ -146,8 +83,12 @@ private: SectionInfo sectionInfo(int section) const; SectionInfo sectionInfoByOffset(int yOffset) const; + void showPicker(); + void pickerHidden(); + void colorChosen(EmojiPtr emoji); + bool checkPickerHide(); + void ensureLoaded(int section); - int countSectionTop(int section) const; void updateSelected(); void setSelected(int newSelected); @@ -171,7 +112,9 @@ private: QPoint _lastMousePos; object_ptr _picker; - QTimer _showPickerTimer; + base::Timer _showPickerTimer; + + rpl::event_stream _chosen; }; diff --git a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp index cc94d3186..3ada8b6f2 100644 --- a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp +++ b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp @@ -513,15 +513,7 @@ FieldAutocompleteInner::FieldAutocompleteInner(FieldAutocomplete *parent, Mentio , _hrows(hrows) , _brows(brows) , _srows(srows) -, _stickersPerRow(1) -, _recentInlineBotsInRows(0) -, _sel(-1) -, _down(-1) -, _mouseSel(false) -, _overDelete(false) -, _previewShown(false) { - _previewTimer.setSingleShot(true); - connect(&_previewTimer, SIGNAL(timeout()), this, SLOT(onPreview())); +, _previewTimer([=] { showPreview(); }) { subscribe(Auth().downloaderTaskFinished(), [this] { update(); }); } @@ -806,13 +798,13 @@ void FieldAutocompleteInner::mousePressEvent(QMouseEvent *e) { chooseSelected(FieldAutocomplete::ChooseMethod::ByClick); } else { _down = _sel; - _previewTimer.start(QApplication::startDragTime()); + _previewTimer.callOnce(QApplication::startDragTime()); } } } void FieldAutocompleteInner::mouseReleaseEvent(QMouseEvent *e) { - _previewTimer.stop(); + _previewTimer.cancel(); int32 pressed = _down; _down = -1; @@ -915,7 +907,7 @@ void FieldAutocompleteInner::onParentGeometryChanged() { } } -void FieldAutocompleteInner::onPreview() { +void FieldAutocompleteInner::showPreview() { if (_down >= 0 && _down < _srows->size()) { Ui::showMediaPreview( (*_srows)[_down]->stickerSetOrigin(), diff --git a/Telegram/SourceFiles/chat_helpers/field_autocomplete.h b/Telegram/SourceFiles/chat_helpers/field_autocomplete.h index 4585c4178..1ebd335e6 100644 --- a/Telegram/SourceFiles/chat_helpers/field_autocomplete.h +++ b/Telegram/SourceFiles/chat_helpers/field_autocomplete.h @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "ui/twidget.h" +#include "base/timer.h" #include "chat_helpers/stickers.h" namespace Ui { @@ -152,7 +153,6 @@ signals: public slots: void onParentGeometryChanged(); void onUpdateSelected(bool force = false); - void onPreview(); private: void paintEvent(QPaintEvent *e) override; @@ -167,22 +167,25 @@ private: void updateSelectedRow(); void setSel(int sel, bool scroll = false); + void showPreview(); - FieldAutocomplete *_parent; - MentionRows *_mrows; - HashtagRows *_hrows; - BotCommandRows *_brows; - StickerRows *_srows; - int32 _stickersPerRow, _recentInlineBotsInRows; - int32 _sel, _down; - bool _mouseSel; + FieldAutocomplete *_parent = nullptr; + MentionRows *_mrows = nullptr; + HashtagRows *_hrows = nullptr; + BotCommandRows *_brows = nullptr; + StickerRows *_srows = nullptr; + int _stickersPerRow = 1; + int _recentInlineBotsInRows = 0; + int _sel = -1; + int _down = -1; + bool _mouseSel = false; QPoint _mousePos; - bool _overDelete; + bool _overDelete = false; - bool _previewShown; + bool _previewShown = false; - QTimer _previewTimer; + base::Timer _previewTimer; }; diff --git a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp index 6bf7ed7e4..804296fbb 100644 --- a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp @@ -69,7 +69,7 @@ GifsListWidget::Footer::Footer(not_null parent) : InnerFooter(p }); connect(_field, &Ui::InputField::cancelled, [=] { if (_field->getLastText().isEmpty()) { - emit _pan->cancelled(); + _pan->cancelled(); } else { _field->setText(QString()); } @@ -125,16 +125,12 @@ GifsListWidget::GifsListWidget( QWidget *parent, not_null controller) : Inner(parent, controller) -, _section(Section::Gifs) { +, _section(Section::Gifs) +, _updateInlineItems([=] { updateInlineItems(); }) +, _previewTimer([=] { showPreview(); }) { setMouseTracking(true); setAttribute(Qt::WA_OpaquePaintEvent); - _previewTimer.setSingleShot(true); - connect(&_previewTimer, SIGNAL(timeout()), this, SLOT(onPreview())); - - _updateInlineItems.setSingleShot(true); - connect(&_updateInlineItems, SIGNAL(timeout()), this, SLOT(onUpdateInlineItems())); - _inlineRequestTimer.setSingleShot(true); connect(&_inlineRequestTimer, &QTimer::timeout, this, [this] { sendInlineRequest(); }); @@ -152,8 +148,22 @@ GifsListWidget::GifsListWidget( }); } +rpl::producer> GifsListWidget::fileChosen() const { + return _fileChosen.events(); +} + +rpl::producer> GifsListWidget::photoChosen() const { + return _photoChosen.events(); +} + +auto GifsListWidget::inlineResultChosen() const +-> rpl::producer { + return _inlineResultChosen.events(); +} + object_ptr GifsListWidget::createFooter() { Expects(_footer == nullptr); + auto result = object_ptr