Finalize rename / move.

Also removed non-existent emoji_section module from GYP.
This commit is contained in:
John Preston 2017-04-08 17:05:19 +03:00
parent 155cd8ce42
commit 26b05cf844
11 changed files with 114 additions and 116 deletions

View File

@ -34,7 +34,7 @@ constexpr auto kSaveRecentEmojiTimeout = 3000;
} // namespace } // namespace
class EmojiListWidget::Footer : public EmojiPanel::InnerFooter { class EmojiListWidget::Footer : public TabbedPanel::InnerFooter {
public: public:
Footer(gsl::not_null<EmojiListWidget*> parent); Footer(gsl::not_null<EmojiListWidget*> parent);
@ -330,7 +330,7 @@ void EmojiListWidget::setVisibleTopBottom(int visibleTop, int visibleBottom) {
} }
} }
object_ptr<EmojiPanel::InnerFooter> EmojiListWidget::createFooter() { object_ptr<TabbedPanel::InnerFooter> EmojiListWidget::createFooter() {
Expects(_footer == nullptr); Expects(_footer == nullptr);
auto result = object_ptr<Footer>(this); auto result = object_ptr<Footer>(this);
_footer = result; _footer = result;
@ -664,7 +664,7 @@ Ui::Emoji::Section EmojiListWidget::currentSection(int yOffset) const {
return static_cast<Section>(sectionInfoByOffset(yOffset).section); return static_cast<Section>(sectionInfoByOffset(yOffset).section);
} }
EmojiPanel::InnerFooter *EmojiListWidget::getFooter() const { TabbedPanel::InnerFooter *EmojiListWidget::getFooter() const {
return _footer; return _footer;
} }

View File

@ -20,7 +20,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
*/ */
#pragma once #pragma once
#include "chat_helpers/emoji_panel.h" #include "chat_helpers/tabbed_panel.h"
namespace Window { namespace Window {
class Controller; class Controller;
@ -84,7 +84,7 @@ private:
}; };
class EmojiListWidget : public EmojiPanel::Inner { class EmojiListWidget : public TabbedPanel::Inner {
Q_OBJECT Q_OBJECT
public: public:
@ -95,7 +95,7 @@ public:
void setVisibleTopBottom(int visibleTop, int visibleBottom) override; void setVisibleTopBottom(int visibleTop, int visibleBottom) override;
void refreshRecent() override; void refreshRecent() override;
void clearSelection() override; void clearSelection() override;
object_ptr<EmojiPanel::InnerFooter> createFooter() override; object_ptr<TabbedPanel::InnerFooter> createFooter() override;
void showEmojiSection(Section section); void showEmojiSection(Section section);
Section currentSection(int yOffset) const; Section currentSection(int yOffset) const;
@ -121,7 +121,7 @@ protected:
void enterFromChildEvent(QEvent *e, QWidget *child) override; void enterFromChildEvent(QEvent *e, QWidget *child) override;
bool event(QEvent *e) override; bool event(QEvent *e) override;
EmojiPanel::InnerFooter *getFooter() const override; TabbedPanel::InnerFooter *getFooter() const override;
void processHideFinished() override; void processHideFinished() override;
int countHeight() override; int countHeight() override;

View File

@ -43,7 +43,7 @@ constexpr auto kSearchBotUsername = "gif";
} // namespace } // namespace
class GifsListWidget::Footer : public EmojiPanel::InnerFooter { class GifsListWidget::Footer : public TabbedPanel::InnerFooter {
public: public:
Footer(gsl::not_null<GifsListWidget*> parent); Footer(gsl::not_null<GifsListWidget*> parent);
@ -145,7 +145,7 @@ GifsListWidget::GifsListWidget(QWidget *parent, gsl::not_null<Window::Controller
}); });
} }
object_ptr<EmojiPanel::InnerFooter> GifsListWidget::createFooter() { object_ptr<TabbedPanel::InnerFooter> GifsListWidget::createFooter() {
Expects(_footer == nullptr); Expects(_footer == nullptr);
auto result = object_ptr<Footer>(this); auto result = object_ptr<Footer>(this);
_footer = result; _footer = result;
@ -383,7 +383,7 @@ void GifsListWidget::clearSelection() {
update(); update();
} }
EmojiPanel::InnerFooter *GifsListWidget::getFooter() const { TabbedPanel::InnerFooter *GifsListWidget::getFooter() const {
return _footer; return _footer;
} }

View File

@ -20,7 +20,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
*/ */
#pragma once #pragma once
#include "chat_helpers/emoji_panel.h" #include "chat_helpers/tabbed_panel.h"
#include "inline_bots/inline_bot_layout_item.h" #include "inline_bots/inline_bot_layout_item.h"
namespace InlineBots { namespace InlineBots {
@ -40,7 +40,7 @@ class Controller;
namespace ChatHelpers { namespace ChatHelpers {
class GifsListWidget : public EmojiPanel::Inner, public InlineBots::Layout::Context, private base::Subscriber, private MTP::Sender { class GifsListWidget : public TabbedPanel::Inner, public InlineBots::Layout::Context, private base::Subscriber, private MTP::Sender {
Q_OBJECT Q_OBJECT
public: public:
@ -49,7 +49,7 @@ public:
void refreshRecent() override; void refreshRecent() override;
void preloadImages() override; void preloadImages() override;
void clearSelection() override; void clearSelection() override;
object_ptr<EmojiPanel::InnerFooter> createFooter() override; object_ptr<TabbedPanel::InnerFooter> createFooter() override;
void setVisibleTopBottom(int visibleTop, int visibleBottom) override; void setVisibleTopBottom(int visibleTop, int visibleBottom) override;
@ -77,7 +77,7 @@ protected:
void leaveToChildEvent(QEvent *e, QWidget *child) override; void leaveToChildEvent(QEvent *e, QWidget *child) override;
void enterFromChildEvent(QEvent *e, QWidget *child) override; void enterFromChildEvent(QEvent *e, QWidget *child) override;
EmojiPanel::InnerFooter *getFooter() const override; TabbedPanel::InnerFooter *getFooter() const override;
void processHideFinished() override; void processHideFinished() override;
void processPanelHideFinished() override; void processPanelHideFinished() override;
int countHeight() override; int countHeight() override;

View File

@ -54,7 +54,7 @@ struct StickerIcon {
}; };
class StickersListWidget::Footer : public EmojiPanel::InnerFooter { class StickersListWidget::Footer : public TabbedPanel::InnerFooter {
public: public:
Footer(gsl::not_null<StickersListWidget*> parent); Footer(gsl::not_null<StickersListWidget*> parent);
@ -433,7 +433,7 @@ StickersListWidget::StickersListWidget(QWidget *parent, gsl::not_null<Window::Co
}); });
} }
object_ptr<EmojiPanel::InnerFooter> StickersListWidget::createFooter() { object_ptr<TabbedPanel::InnerFooter> StickersListWidget::createFooter() {
Expects(_footer == nullptr); Expects(_footer == nullptr);
auto result = object_ptr<Footer>(this); auto result = object_ptr<Footer>(this);
_footer = result; _footer = result;
@ -984,7 +984,7 @@ void StickersListWidget::clearSelection() {
update(); update();
} }
EmojiPanel::InnerFooter *StickersListWidget::getFooter() const { TabbedPanel::InnerFooter *StickersListWidget::getFooter() const {
return _footer; return _footer;
} }

View File

@ -20,7 +20,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
*/ */
#pragma once #pragma once
#include "chat_helpers/emoji_panel.h" #include "chat_helpers/tabbed_panel.h"
#include "base/variant.h" #include "base/variant.h"
namespace Window { namespace Window {
@ -35,7 +35,7 @@ namespace ChatHelpers {
struct StickerIcon; struct StickerIcon;
class StickersListWidget : public EmojiPanel::Inner, private base::Subscriber, private MTP::Sender { class StickersListWidget : public TabbedPanel::Inner, private base::Subscriber, private MTP::Sender {
Q_OBJECT Q_OBJECT
public: public:
@ -44,7 +44,7 @@ public:
void refreshRecent() override; void refreshRecent() override;
void preloadImages() override; void preloadImages() override;
void clearSelection() override; void clearSelection() override;
object_ptr<EmojiPanel::InnerFooter> createFooter() override; object_ptr<TabbedPanel::InnerFooter> createFooter() override;
void showStickerSet(uint64 setId); void showStickerSet(uint64 setId);
@ -72,7 +72,7 @@ protected:
void leaveToChildEvent(QEvent *e, QWidget *child) override; void leaveToChildEvent(QEvent *e, QWidget *child) override;
void enterFromChildEvent(QEvent *e, QWidget *child) override; void enterFromChildEvent(QEvent *e, QWidget *child) override;
EmojiPanel::InnerFooter *getFooter() const override; TabbedPanel::InnerFooter *getFooter() const override;
void processHideFinished() override; void processHideFinished() override;
void processPanelHideFinished() override; void processPanelHideFinished() override;
int countHeight() override; int countHeight() override;

View File

@ -18,7 +18,7 @@ to link the code of portions of this program with the OpenSSL library.
Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
*/ */
#include "chat_helpers/emoji_panel.h" #include "chat_helpers/tabbed_panel.h"
#include "chat_helpers/emoji_list_widget.h" #include "chat_helpers/emoji_list_widget.h"
#include "chat_helpers/stickers_list_widget.h" #include "chat_helpers/stickers_list_widget.h"
@ -40,7 +40,7 @@ constexpr auto kSaveChosenTabTimeout = 1000;
} // namespace } // namespace
class EmojiPanel::SlideAnimation : public Ui::RoundShadowAnimation { class TabbedPanel::SlideAnimation : public Ui::RoundShadowAnimation {
public: public:
enum class Direction { enum class Direction {
LeftToRight, LeftToRight,
@ -75,7 +75,7 @@ private:
}; };
void EmojiPanel::SlideAnimation::setFinalImages(Direction direction, QImage &&left, QImage &&right, QRect inner) { void TabbedPanel::SlideAnimation::setFinalImages(Direction direction, QImage &&left, QImage &&right, QRect inner) {
Expects(!started()); Expects(!started());
_direction = direction; _direction = direction;
_leftImage = QPixmap::fromImage(std::move(left).convertToFormat(QImage::Format_ARGB32_Premultiplied), Qt::ColorOnly); _leftImage = QPixmap::fromImage(std::move(left).convertToFormat(QImage::Format_ARGB32_Premultiplied), Qt::ColorOnly);
@ -111,7 +111,7 @@ void EmojiPanel::SlideAnimation::setFinalImages(Direction direction, QImage &&le
_painterCategoriesTop = _painterInnerBottom - st::emojiCategory.height; _painterCategoriesTop = _painterInnerBottom - st::emojiCategory.height;
} }
void EmojiPanel::SlideAnimation::start() { void TabbedPanel::SlideAnimation::start() {
t_assert(!_leftImage.isNull()); t_assert(!_leftImage.isNull());
t_assert(!_rightImage.isNull()); t_assert(!_rightImage.isNull());
RoundShadowAnimation::start(_width, _height, _leftImage.devicePixelRatio()); RoundShadowAnimation::start(_width, _height, _leftImage.devicePixelRatio());
@ -127,7 +127,7 @@ void EmojiPanel::SlideAnimation::start() {
_frameIntsPerLineAdd = (_width - _innerWidth) + _frameIntsPerLineAdded; _frameIntsPerLineAdd = (_width - _innerWidth) + _frameIntsPerLineAdded;
} }
void EmojiPanel::SlideAnimation::paintFrame(QPainter &p, float64 dt, float64 opacity) { void TabbedPanel::SlideAnimation::paintFrame(QPainter &p, float64 dt, float64 opacity) {
t_assert(started()); t_assert(started());
t_assert(dt >= 0.); t_assert(dt >= 0.);
@ -258,7 +258,7 @@ void EmojiPanel::SlideAnimation::paintFrame(QPainter &p, float64 dt, float64 opa
p.drawImage(outerLeft / cIntRetinaFactor(), outerTop / cIntRetinaFactor(), _frame, outerLeft, outerTop, outerRight - outerLeft, outerBottom - outerTop); p.drawImage(outerLeft / cIntRetinaFactor(), outerTop / cIntRetinaFactor(), _frame, outerLeft, outerTop, outerRight - outerLeft, outerBottom - outerTop);
} }
EmojiPanel::Tab::Tab(TabType type, object_ptr<Inner> widget) TabbedPanel::Tab::Tab(TabType type, object_ptr<Inner> widget)
: _type(type) : _type(type)
, _widget(std::move(widget)) , _widget(std::move(widget))
, _weak(_widget) , _weak(_widget)
@ -266,20 +266,20 @@ EmojiPanel::Tab::Tab(TabType type, object_ptr<Inner> widget)
_footer->setParent(_widget->parentWidget()); _footer->setParent(_widget->parentWidget());
} }
object_ptr<EmojiPanel::Inner> EmojiPanel::Tab::takeWidget() { object_ptr<TabbedPanel::Inner> TabbedPanel::Tab::takeWidget() {
return std::move(_widget); return std::move(_widget);
} }
void EmojiPanel::Tab::returnWidget(object_ptr<Inner> widget) { void TabbedPanel::Tab::returnWidget(object_ptr<Inner> widget) {
_widget = std::move(widget); _widget = std::move(widget);
Ensures(_widget == _weak); Ensures(_widget == _weak);
} }
void EmojiPanel::Tab::saveScrollTop() { void TabbedPanel::Tab::saveScrollTop() {
_scrollTop = widget()->getVisibleTop(); _scrollTop = widget()->getVisibleTop();
} }
EmojiPanel::EmojiPanel(QWidget *parent, gsl::not_null<Window::Controller*> controller) : TWidget(parent) TabbedPanel::TabbedPanel(QWidget *parent, gsl::not_null<Window::Controller*> controller) : TWidget(parent)
, _tabsSlider(this, st::emojiTabs) , _tabsSlider(this, st::emojiTabs)
, _topShadow(this, st::shadowFg) , _topShadow(this, st::shadowFg)
, _bottomShadow(this, st::shadowFg) , _bottomShadow(this, st::shadowFg)
@ -353,12 +353,12 @@ EmojiPanel::EmojiPanel(QWidget *parent, gsl::not_null<Window::Controller*> contr
hideChildren(); hideChildren();
} }
void EmojiPanel::moveBottom(int bottom) { void TabbedPanel::moveBottom(int bottom) {
_bottom = bottom; _bottom = bottom;
updateContentHeight(); updateContentHeight();
} }
void EmojiPanel::updateContentHeight() { void TabbedPanel::updateContentHeight() {
auto addedHeight = innerPadding().top() + marginTop() + marginBottom() + innerPadding().bottom(); auto addedHeight = innerPadding().top() + marginTop() + marginBottom() + innerPadding().bottom();
auto wantedContentHeight = qRound(st::emojiPanHeightRatio * _bottom) - addedHeight; auto wantedContentHeight = qRound(st::emojiPanHeightRatio * _bottom) - addedHeight;
auto contentHeight = snap(wantedContentHeight, st::emojiPanMinHeight, st::emojiPanMaxHeight); auto contentHeight = snap(wantedContentHeight, st::emojiPanMinHeight, st::emojiPanMaxHeight);
@ -394,21 +394,21 @@ void EmojiPanel::updateContentHeight() {
update(); update();
} }
void EmojiPanel::onWndActiveChanged() { void TabbedPanel::onWndActiveChanged() {
if (!App::wnd()->windowHandle()->isActive() && !isHidden()) { if (!App::wnd()->windowHandle()->isActive() && !isHidden()) {
leaveEvent(0); leaveEvent(0);
} }
} }
void EmojiPanel::onSaveConfig() { void TabbedPanel::onSaveConfig() {
Local::writeUserSettings(); Local::writeUserSettings();
} }
void EmojiPanel::onSaveConfigDelayed(int delay) { void TabbedPanel::onSaveConfigDelayed(int delay) {
_saveConfigTimer.start(delay); _saveConfigTimer.start(delay);
} }
void EmojiPanel::paintEvent(QPaintEvent *e) { void TabbedPanel::paintEvent(QPaintEvent *e) {
Painter p(this); Painter p(this);
auto ms = getms(); auto ms = getms();
@ -457,7 +457,7 @@ void EmojiPanel::paintEvent(QPaintEvent *e) {
} }
} }
void EmojiPanel::paintSlideFrame(Painter &p, TimeMs ms) { void TabbedPanel::paintSlideFrame(Painter &p, TimeMs ms) {
Ui::Shadow::paint(p, innerRect(), width(), st::emojiPanAnimation.shadow); Ui::Shadow::paint(p, innerRect(), width(), st::emojiPanAnimation.shadow);
auto inner = innerRect(); auto inner = innerRect();
@ -468,7 +468,7 @@ void EmojiPanel::paintSlideFrame(Painter &p, TimeMs ms) {
_slideAnimation->paintFrame(p, slideDt, _a_opacity.current(_hiding ? 0. : 1.)); _slideAnimation->paintFrame(p, slideDt, _a_opacity.current(_hiding ? 0. : 1.));
} }
void EmojiPanel::paintContent(Painter &p) { void TabbedPanel::paintContent(Painter &p) {
auto inner = innerRect(); auto inner = innerRect();
auto topPart = QRect(inner.x(), inner.y(), inner.width(), _tabsSlider->height() + st::buttonRadius); auto topPart = QRect(inner.x(), inner.y(), inner.width(), _tabsSlider->height() + st::buttonRadius);
App::roundRect(p, topPart, st::emojiPanBg, ImageRoundRadius::Small, App::RectPart::TopFull | App::RectPart::NoTopBottom); App::roundRect(p, topPart, st::emojiPanBg, ImageRoundRadius::Small, App::RectPart::TopFull | App::RectPart::NoTopBottom);
@ -486,28 +486,28 @@ void EmojiPanel::paintContent(Painter &p) {
p.fillRect(myrtlrect(inner.x(), sidesTop, st::buttonRadius, sidesHeight), st::emojiPanBg); p.fillRect(myrtlrect(inner.x(), sidesTop, st::buttonRadius, sidesHeight), st::emojiPanBg);
} }
int EmojiPanel::marginTop() const { int TabbedPanel::marginTop() const {
return _tabsSlider->height() - st::lineWidth; return _tabsSlider->height() - st::lineWidth;
} }
int EmojiPanel::marginBottom() const { int TabbedPanel::marginBottom() const {
return st::emojiCategory.height; return st::emojiCategory.height;
} }
void EmojiPanel::moveByBottom() { void TabbedPanel::moveByBottom() {
moveToRight(0, y()); moveToRight(0, y());
updateContentHeight(); updateContentHeight();
} }
void EmojiPanel::enterEventHook(QEvent *e) { void TabbedPanel::enterEventHook(QEvent *e) {
showAnimated(); showAnimated();
} }
bool EmojiPanel::preventAutoHide() const { bool TabbedPanel::preventAutoHide() const {
return stickers()->preventAutoHide(); return stickers()->preventAutoHide();
} }
void EmojiPanel::leaveEventHook(QEvent *e) { void TabbedPanel::leaveEventHook(QEvent *e) {
if (preventAutoHide()) { if (preventAutoHide()) {
return; return;
} }
@ -520,11 +520,11 @@ void EmojiPanel::leaveEventHook(QEvent *e) {
return TWidget::leaveEventHook(e); return TWidget::leaveEventHook(e);
} }
void EmojiPanel::otherEnter() { void TabbedPanel::otherEnter() {
showAnimated(); showAnimated();
} }
void EmojiPanel::otherLeave() { void TabbedPanel::otherLeave() {
if (preventAutoHide()) { if (preventAutoHide()) {
return; return;
} }
@ -537,7 +537,7 @@ void EmojiPanel::otherLeave() {
} }
} }
void EmojiPanel::hideFast() { void TabbedPanel::hideFast() {
if (isHidden()) return; if (isHidden()) return;
_hideTimer.stop(); _hideTimer.stop();
@ -546,14 +546,14 @@ void EmojiPanel::hideFast() {
hideFinished(); hideFinished();
} }
void EmojiPanel::refreshStickers() { void TabbedPanel::refreshStickers() {
stickers()->refreshStickers(); stickers()->refreshStickers();
if (isHidden() || _currentTabType != TabType::Stickers) { if (isHidden() || _currentTabType != TabType::Stickers) {
stickers()->preloadImages(); stickers()->preloadImages();
} }
} }
void EmojiPanel::opacityAnimationCallback() { void TabbedPanel::opacityAnimationCallback() {
update(); update();
if (!_a_opacity.animating()) { if (!_a_opacity.animating()) {
if (_hiding) { if (_hiding) {
@ -566,13 +566,13 @@ void EmojiPanel::opacityAnimationCallback() {
} }
} }
void EmojiPanel::hideByTimerOrLeave() { void TabbedPanel::hideByTimerOrLeave() {
if (isHidden() || preventAutoHide()) return; if (isHidden() || preventAutoHide()) return;
hideAnimated(); hideAnimated();
} }
void EmojiPanel::prepareCache() { void TabbedPanel::prepareCache() {
if (_a_opacity.animating()) return; if (_a_opacity.animating()) return;
auto showAnimation = base::take(_a_show); auto showAnimation = base::take(_a_show);
@ -588,7 +588,7 @@ void EmojiPanel::prepareCache() {
} }
} }
void EmojiPanel::startOpacityAnimation(bool hiding) { void TabbedPanel::startOpacityAnimation(bool hiding) {
if (!_scroll->isHidden()) { if (!_scroll->isHidden()) {
currentTab()->widget()->beforeHiding(); currentTab()->widget()->beforeHiding();
} }
@ -599,7 +599,7 @@ void EmojiPanel::startOpacityAnimation(bool hiding) {
_a_opacity.start([this] { opacityAnimationCallback(); }, _hiding ? 1. : 0., _hiding ? 0. : 1., st::emojiPanDuration); _a_opacity.start([this] { opacityAnimationCallback(); }, _hiding ? 1. : 0., _hiding ? 0. : 1., st::emojiPanDuration);
} }
void EmojiPanel::startShowAnimation() { void TabbedPanel::startShowAnimation() {
if (!_a_show.animating()) { if (!_a_show.animating()) {
auto image = grabForComplexAnimation(GrabType::Panel); auto image = grabForComplexAnimation(GrabType::Panel);
@ -614,7 +614,7 @@ void EmojiPanel::startShowAnimation() {
_a_show.start([this] { update(); }, 0., 1., st::emojiPanShowDuration); _a_show.start([this] { update(); }, 0., 1., st::emojiPanShowDuration);
} }
QImage EmojiPanel::grabForComplexAnimation(GrabType type) { QImage TabbedPanel::grabForComplexAnimation(GrabType type) {
auto cache = base::take(_cache); auto cache = base::take(_cache);
auto opacityAnimation = base::take(_a_opacity); auto opacityAnimation = base::take(_a_opacity);
auto slideAnimationData = base::take(_slideAnimation); auto slideAnimationData = base::take(_slideAnimation);
@ -646,7 +646,7 @@ QImage EmojiPanel::grabForComplexAnimation(GrabType type) {
return result; return result;
} }
void EmojiPanel::hideAnimated() { void TabbedPanel::hideAnimated() {
if (isHidden()) return; if (isHidden()) return;
if (_hiding) return; if (_hiding) return;
@ -658,9 +658,9 @@ void EmojiPanel::hideAnimated() {
} }
} }
EmojiPanel::~EmojiPanel() = default; TabbedPanel::~TabbedPanel() = default;
void EmojiPanel::hideFinished() { void TabbedPanel::hideFinished() {
hide(); hide();
for (auto &tab : _tabs) { for (auto &tab : _tabs) {
tab.widget()->panelHideFinished(); tab.widget()->panelHideFinished();
@ -675,13 +675,13 @@ void EmojiPanel::hideFinished() {
scrollToY(0); scrollToY(0);
} }
void EmojiPanel::showAnimated() { void TabbedPanel::showAnimated() {
_hideTimer.stop(); _hideTimer.stop();
_hideAfterSlide = false; _hideAfterSlide = false;
showStarted(); showStarted();
} }
void EmojiPanel::showStarted() { void TabbedPanel::showStarted() {
if (isHidden()) { if (isHidden()) {
emit updateStickers(); emit updateStickers();
currentTab()->widget()->refreshRecent(); currentTab()->widget()->refreshRecent();
@ -696,7 +696,7 @@ void EmojiPanel::showStarted() {
} }
} }
bool EmojiPanel::eventFilter(QObject *obj, QEvent *e) { bool TabbedPanel::eventFilter(QObject *obj, QEvent *e) {
if (e->type() == QEvent::Enter) { if (e->type() == QEvent::Enter) {
otherEnter(); otherEnter();
} else if (e->type() == QEvent::Leave) { } else if (e->type() == QEvent::Leave) {
@ -711,7 +711,7 @@ bool EmojiPanel::eventFilter(QObject *obj, QEvent *e) {
return false; return false;
} }
void EmojiPanel::stickersInstalled(uint64 setId) { void TabbedPanel::stickersInstalled(uint64 setId) {
_tabsSlider->setActiveSection(static_cast<int>(TabType::Stickers)); _tabsSlider->setActiveSection(static_cast<int>(TabType::Stickers));
if (isHidden()) { if (isHidden()) {
moveByBottom(); moveByBottom();
@ -724,11 +724,11 @@ void EmojiPanel::stickersInstalled(uint64 setId) {
showAnimated(); showAnimated();
} }
void EmojiPanel::setInlineQueryPeer(PeerData *peer) { void TabbedPanel::setInlineQueryPeer(PeerData *peer) {
gifs()->setInlineQueryPeer(peer); gifs()->setInlineQueryPeer(peer);
} }
void EmojiPanel::showAll() { void TabbedPanel::showAll() {
currentTab()->footer()->show(); currentTab()->footer()->show();
_scroll->show(); _scroll->show();
_topShadow->show(); _topShadow->show();
@ -736,36 +736,36 @@ void EmojiPanel::showAll() {
_tabsSlider->show(); _tabsSlider->show();
} }
void EmojiPanel::hideForSliding() { void TabbedPanel::hideForSliding() {
hideChildren(); hideChildren();
_tabsSlider->show(); _tabsSlider->show();
_topShadow->show(); _topShadow->show();
currentTab()->widget()->clearSelection(); currentTab()->widget()->clearSelection();
} }
void EmojiPanel::onScroll() { void TabbedPanel::onScroll() {
auto scrollTop = _scroll->scrollTop(); auto scrollTop = _scroll->scrollTop();
auto scrollBottom = scrollTop + _scroll->height(); auto scrollBottom = scrollTop + _scroll->height();
currentTab()->widget()->setVisibleTopBottom(scrollTop, scrollBottom); currentTab()->widget()->setVisibleTopBottom(scrollTop, scrollBottom);
} }
style::margins EmojiPanel::innerPadding() const { style::margins TabbedPanel::innerPadding() const {
return st::emojiPanMargins; return st::emojiPanMargins;
} }
QRect EmojiPanel::innerRect() const { QRect TabbedPanel::innerRect() const {
return rect().marginsRemoved(innerPadding()); return rect().marginsRemoved(innerPadding());
} }
QRect EmojiPanel::horizontalRect() const { QRect TabbedPanel::horizontalRect() const {
return innerRect().marginsRemoved(style::margins(0, st::buttonRadius, 0, st::buttonRadius)); return innerRect().marginsRemoved(style::margins(0, st::buttonRadius, 0, st::buttonRadius));
} }
QRect EmojiPanel::verticalRect() const { QRect TabbedPanel::verticalRect() const {
return innerRect().marginsRemoved(style::margins(st::buttonRadius, 0, st::buttonRadius, 0)); return innerRect().marginsRemoved(style::margins(st::buttonRadius, 0, st::buttonRadius, 0));
} }
void EmojiPanel::createTabsSlider() { void TabbedPanel::createTabsSlider() {
auto sections = QStringList(); auto sections = QStringList();
sections.push_back(lang(lng_switch_emoji).toUpper()); sections.push_back(lang(lng_switch_emoji).toUpper());
sections.push_back(lang(lng_switch_stickers).toUpper()); sections.push_back(lang(lng_switch_stickers).toUpper());
@ -782,7 +782,7 @@ void EmojiPanel::createTabsSlider() {
_topShadow->setGeometry(_tabsSlider->x(), _tabsSlider->bottomNoMargins() - st::lineWidth, _tabsSlider->width(), st::lineWidth); _topShadow->setGeometry(_tabsSlider->x(), _tabsSlider->bottomNoMargins() - st::lineWidth, _tabsSlider->width(), st::lineWidth);
} }
void EmojiPanel::switchTab() { void TabbedPanel::switchTab() {
auto tab = _tabsSlider->activeSection(); auto tab = _tabsSlider->activeSection();
t_assert(tab >= 0 && tab < Tab::kCount); t_assert(tab >= 0 && tab < Tab::kCount);
auto newTabType = static_cast<TabType>(tab); auto newTabType = static_cast<TabType>(tab);
@ -835,19 +835,19 @@ void EmojiPanel::switchTab() {
onSaveConfigDelayed(kSaveChosenTabTimeout); onSaveConfigDelayed(kSaveChosenTabTimeout);
} }
gsl::not_null<EmojiListWidget*> EmojiPanel::emoji() const { gsl::not_null<EmojiListWidget*> TabbedPanel::emoji() const {
return static_cast<EmojiListWidget*>(getTab(TabType::Emoji)->widget().get()); return static_cast<EmojiListWidget*>(getTab(TabType::Emoji)->widget().get());
} }
gsl::not_null<StickersListWidget*> EmojiPanel::stickers() const { gsl::not_null<StickersListWidget*> TabbedPanel::stickers() const {
return static_cast<StickersListWidget*>(getTab(TabType::Stickers)->widget().get()); return static_cast<StickersListWidget*>(getTab(TabType::Stickers)->widget().get());
} }
gsl::not_null<GifsListWidget*> EmojiPanel::gifs() const { gsl::not_null<GifsListWidget*> TabbedPanel::gifs() const {
return static_cast<GifsListWidget*>(getTab(TabType::Gifs)->widget().get()); return static_cast<GifsListWidget*>(getTab(TabType::Gifs)->widget().get());
} }
void EmojiPanel::setWidgetToScrollArea() { void TabbedPanel::setWidgetToScrollArea() {
_scroll->setOwnedWidget(currentTab()->takeWidget()); _scroll->setOwnedWidget(currentTab()->takeWidget());
_scroll->disableScroll(false); _scroll->disableScroll(false);
currentTab()->widget()->moveToLeft(0, 0); currentTab()->widget()->moveToLeft(0, 0);
@ -857,13 +857,13 @@ void EmojiPanel::setWidgetToScrollArea() {
onScroll(); onScroll();
} }
void EmojiPanel::onCheckForHide() { void TabbedPanel::onCheckForHide() {
if (!rect().contains(mapFromGlobal(QCursor::pos()))) { if (!rect().contains(mapFromGlobal(QCursor::pos()))) {
_hideTimer.start(3000); _hideTimer.start(3000);
} }
} }
bool EmojiPanel::overlaps(const QRect &globalRect) const { bool TabbedPanel::overlaps(const QRect &globalRect) const {
if (isHidden() || !_cache.isNull()) return false; if (isHidden() || !_cache.isNull()) return false;
auto testRect = QRect(mapFromGlobal(globalRect.topLeft()), globalRect.size()); auto testRect = QRect(mapFromGlobal(globalRect.topLeft()), globalRect.size());
@ -872,18 +872,18 @@ bool EmojiPanel::overlaps(const QRect &globalRect) const {
|| inner.marginsRemoved(QMargins(0, st::buttonRadius, 0, st::buttonRadius)).contains(testRect); || inner.marginsRemoved(QMargins(0, st::buttonRadius, 0, st::buttonRadius)).contains(testRect);
} }
void EmojiPanel::scrollToY(int y) { void TabbedPanel::scrollToY(int y) {
_scroll->scrollToY(y); _scroll->scrollToY(y);
// Qt render glitch workaround, shadow sometimes disappears if we just scroll to y. // Qt render glitch workaround, shadow sometimes disappears if we just scroll to y.
_topShadow->update(); _topShadow->update();
} }
EmojiPanel::Inner::Inner(QWidget *parent, gsl::not_null<Window::Controller*> controller) : TWidget(parent) TabbedPanel::Inner::Inner(QWidget *parent, gsl::not_null<Window::Controller*> controller) : TWidget(parent)
, _controller(controller) { , _controller(controller) {
} }
void EmojiPanel::Inner::setVisibleTopBottom(int visibleTop, int visibleBottom) { void TabbedPanel::Inner::setVisibleTopBottom(int visibleTop, int visibleBottom) {
auto oldVisibleHeight = getVisibleBottom() - getVisibleTop(); auto oldVisibleHeight = getVisibleBottom() - getVisibleTop();
_visibleTop = visibleTop; _visibleTop = visibleTop;
_visibleBottom = visibleBottom; _visibleBottom = visibleBottom;
@ -893,14 +893,14 @@ void EmojiPanel::Inner::setVisibleTopBottom(int visibleTop, int visibleBottom) {
} }
} }
void EmojiPanel::Inner::hideFinished() { void TabbedPanel::Inner::hideFinished() {
processHideFinished(); processHideFinished();
if (auto footer = getFooter()) { if (auto footer = getFooter()) {
footer->processHideFinished(); footer->processHideFinished();
} }
} }
void EmojiPanel::Inner::panelHideFinished() { void TabbedPanel::Inner::panelHideFinished() {
hideFinished(); hideFinished();
processPanelHideFinished(); processPanelHideFinished();
if (auto footer = getFooter()) { if (auto footer = getFooter()) {
@ -908,7 +908,7 @@ void EmojiPanel::Inner::panelHideFinished() {
} }
} }
EmojiPanel::InnerFooter::InnerFooter(QWidget *parent) : TWidget(parent) { TabbedPanel::InnerFooter::InnerFooter(QWidget *parent) : TWidget(parent) {
resize(st::emojiPanWidth, st::emojiCategory.height); resize(st::emojiPanWidth, st::emojiCategory.height);
} }

View File

@ -46,11 +46,11 @@ class EmojiListWidget;
class StickersListWidget; class StickersListWidget;
class GifsListWidget; class GifsListWidget;
class EmojiPanel : public TWidget { class TabbedPanel : public TWidget {
Q_OBJECT Q_OBJECT
public: public:
EmojiPanel(QWidget *parent, gsl::not_null<Window::Controller*> controller); TabbedPanel(QWidget *parent, gsl::not_null<Window::Controller*> controller);
void moveBottom(int bottom); void moveBottom(int bottom);
@ -67,7 +67,7 @@ public:
void showAnimated(); void showAnimated();
void hideAnimated(); void hideAnimated();
~EmojiPanel(); ~TabbedPanel();
class Inner; class Inner;
class InnerFooter; class InnerFooter;
@ -234,7 +234,7 @@ private:
}; };
class EmojiPanel::Inner : public TWidget { class TabbedPanel::Inner : public TWidget {
Q_OBJECT Q_OBJECT
public: public:
@ -288,7 +288,7 @@ private:
}; };
class EmojiPanel::InnerFooter : public TWidget { class TabbedPanel::InnerFooter : public TWidget {
public: public:
InnerFooter(QWidget *parent); InnerFooter(QWidget *parent);

View File

@ -43,7 +43,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
#include "history/history_inner_widget.h" #include "history/history_inner_widget.h"
#include "profile/profile_block_group_members.h" #include "profile/profile_block_group_members.h"
#include "core/click_handler_types.h" #include "core/click_handler_types.h"
#include "chat_helpers/emoji_panel.h" #include "chat_helpers/tabbed_panel.h"
#include "chat_helpers/bot_keyboard.h" #include "chat_helpers/bot_keyboard.h"
#include "chat_helpers/message_field.h" #include "chat_helpers/message_field.h"
#include "lang.h" #include "lang.h"
@ -484,7 +484,7 @@ HistoryWidget::HistoryWidget(QWidget *parent, gsl::not_null<Window::Controller*>
, _recordCancelWidth(st::historyRecordFont->width(lang(lng_record_cancel))) , _recordCancelWidth(st::historyRecordFont->width(lang(lng_record_cancel)))
, _a_recording(animation(this, &HistoryWidget::step_recording)) , _a_recording(animation(this, &HistoryWidget::step_recording))
, _kbScroll(this, st::botKbScroll) , _kbScroll(this, st::botKbScroll)
, _emojiPanel(this, _controller) , _tabbedPanel(this, _controller)
, _attachDragDocument(this) , _attachDragDocument(this)
, _attachDragPhoto(this) , _attachDragPhoto(this)
, _fileLoader(this, FileLoaderQueueStopTimeout) , _fileLoader(this, FileLoaderQueueStopTimeout)
@ -515,11 +515,11 @@ HistoryWidget::HistoryWidget(QWidget *parent, gsl::not_null<Window::Controller*>
connect(_field, SIGNAL(linksChanged()), this, SLOT(onPreviewCheck())); connect(_field, SIGNAL(linksChanged()), this, SLOT(onPreviewCheck()));
connect(App::wnd()->windowHandle(), SIGNAL(visibleChanged(bool)), this, SLOT(onWindowVisibleChanged())); connect(App::wnd()->windowHandle(), SIGNAL(visibleChanged(bool)), this, SLOT(onWindowVisibleChanged()));
connect(&_scrollTimer, SIGNAL(timeout()), this, SLOT(onScrollTimer())); connect(&_scrollTimer, SIGNAL(timeout()), this, SLOT(onScrollTimer()));
connect(_emojiPanel, SIGNAL(emojiSelected(EmojiPtr)), _field, SLOT(onEmojiInsert(EmojiPtr))); connect(_tabbedPanel, SIGNAL(emojiSelected(EmojiPtr)), _field, SLOT(onEmojiInsert(EmojiPtr)));
connect(_emojiPanel, SIGNAL(stickerSelected(DocumentData*)), this, SLOT(onStickerSend(DocumentData*))); connect(_tabbedPanel, SIGNAL(stickerSelected(DocumentData*)), this, SLOT(onStickerSend(DocumentData*)));
connect(_emojiPanel, SIGNAL(photoSelected(PhotoData*)), this, SLOT(onPhotoSend(PhotoData*))); connect(_tabbedPanel, SIGNAL(photoSelected(PhotoData*)), this, SLOT(onPhotoSend(PhotoData*)));
connect(_emojiPanel, SIGNAL(inlineResultSelected(InlineBots::Result*,UserData*)), this, SLOT(onInlineResultSend(InlineBots::Result*,UserData*))); connect(_tabbedPanel, SIGNAL(inlineResultSelected(InlineBots::Result*,UserData*)), this, SLOT(onInlineResultSend(InlineBots::Result*,UserData*)));
connect(_emojiPanel, SIGNAL(updateStickers()), this, SLOT(updateStickers())); connect(_tabbedPanel, SIGNAL(updateStickers()), this, SLOT(updateStickers()));
connect(&_sendActionStopTimer, SIGNAL(timeout()), this, SLOT(onCancelSendAction())); connect(&_sendActionStopTimer, SIGNAL(timeout()), this, SLOT(onCancelSendAction()));
connect(&_previewTimer, SIGNAL(timeout()), this, SLOT(onPreviewTimeout())); connect(&_previewTimer, SIGNAL(timeout()), this, SLOT(onPreviewTimeout()));
connect(Media::Capture::instance(), SIGNAL(error()), this, SLOT(onRecordError())); connect(Media::Capture::instance(), SIGNAL(error()), this, SLOT(onRecordError()));
@ -597,13 +597,13 @@ HistoryWidget::HistoryWidget(QWidget *parent, gsl::not_null<Window::Controller*>
_silent->hide(); _silent->hide();
_botCommandStart->hide(); _botCommandStart->hide();
_attachEmoji->installEventFilter(_emojiPanel); _attachEmoji->installEventFilter(_tabbedPanel);
connect(_botKeyboardShow, SIGNAL(clicked()), this, SLOT(onKbToggle())); connect(_botKeyboardShow, SIGNAL(clicked()), this, SLOT(onKbToggle()));
connect(_botKeyboardHide, SIGNAL(clicked()), this, SLOT(onKbToggle())); connect(_botKeyboardHide, SIGNAL(clicked()), this, SLOT(onKbToggle()));
connect(_botCommandStart, SIGNAL(clicked()), this, SLOT(onCmdStart())); connect(_botCommandStart, SIGNAL(clicked()), this, SLOT(onCmdStart()));
_emojiPanel->hide(); _tabbedPanel->hide();
_attachDragDocument->hide(); _attachDragDocument->hide();
_attachDragPhoto->hide(); _attachDragPhoto->hide();
@ -638,7 +638,7 @@ void HistoryWidget::start() {
} }
void HistoryWidget::onStickersUpdated() { void HistoryWidget::onStickersUpdated() {
_emojiPanel->refreshStickers(); _tabbedPanel->refreshStickers();
updateStickersByEmoji(); updateStickersByEmoji();
} }
@ -725,7 +725,7 @@ void HistoryWidget::orderWidgets() {
if (_inlineResults) { if (_inlineResults) {
_inlineResults->raise(); _inlineResults->raise();
} }
_emojiPanel->raise(); _tabbedPanel->raise();
_attachDragDocument->raise(); _attachDragDocument->raise();
_attachDragPhoto->raise(); _attachDragPhoto->raise();
} }
@ -916,11 +916,11 @@ void HistoryWidget::updateSendAction(History *history, SendAction::Type type, in
} }
void HistoryWidget::updateRecentStickers() { void HistoryWidget::updateRecentStickers() {
_emojiPanel->refreshStickers(); _tabbedPanel->refreshStickers();
} }
void HistoryWidget::stickersInstalled(uint64 setId) { void HistoryWidget::stickersInstalled(uint64 setId) {
_emojiPanel->stickersInstalled(setId); _tabbedPanel->stickersInstalled(setId);
} }
void HistoryWidget::sendActionDone(const MTPBool &result, mtpRequestId req) { void HistoryWidget::sendActionDone(const MTPBool &result, mtpRequestId req) {
@ -1695,7 +1695,7 @@ void HistoryWidget::showHistory(const PeerId &peerId, MsgId showAtMsgId, bool re
_peer = App::peer(peerId); _peer = App::peer(peerId);
_channel = peerToChannel(_peer->id); _channel = peerToChannel(_peer->id);
_canSendMessages = canSendMessages(_peer); _canSendMessages = canSendMessages(_peer);
_emojiPanel->setInlineQueryPeer(_peer); _tabbedPanel->setInlineQueryPeer(_peer);
} }
updateTopBarSelection(); updateTopBarSelection();
@ -1847,7 +1847,7 @@ bool HistoryWidget::contentOverlapped(const QRect &globalRect) {
return (_attachDragDocument->overlaps(globalRect) return (_attachDragDocument->overlaps(globalRect)
|| _attachDragPhoto->overlaps(globalRect) || _attachDragPhoto->overlaps(globalRect)
|| _fieldAutocomplete->overlaps(globalRect) || _fieldAutocomplete->overlaps(globalRect)
|| _emojiPanel->overlaps(globalRect) || _tabbedPanel->overlaps(globalRect)
|| (_inlineResults && _inlineResults->overlaps(globalRect))); || (_inlineResults && _inlineResults->overlaps(globalRect)));
} }
@ -1979,7 +1979,7 @@ void HistoryWidget::updateControlsVisibility() {
_botKeyboardShow->hide(); _botKeyboardShow->hide();
_botKeyboardHide->hide(); _botKeyboardHide->hide();
_botCommandStart->hide(); _botCommandStart->hide();
_emojiPanel->hide(); _tabbedPanel->hide();
if (_inlineResults) { if (_inlineResults) {
_inlineResults->hide(); _inlineResults->hide();
} }
@ -2040,7 +2040,7 @@ void HistoryWidget::updateControlsVisibility() {
_botKeyboardShow->hide(); _botKeyboardShow->hide();
_botKeyboardHide->hide(); _botKeyboardHide->hide();
_botCommandStart->hide(); _botCommandStart->hide();
_emojiPanel->hide(); _tabbedPanel->hide();
if (_inlineResults) { if (_inlineResults) {
_inlineResults->hide(); _inlineResults->hide();
} }
@ -2154,7 +2154,7 @@ void HistoryWidget::updateControlsVisibility() {
_botKeyboardShow->hide(); _botKeyboardShow->hide();
_botKeyboardHide->hide(); _botKeyboardHide->hide();
_botCommandStart->hide(); _botCommandStart->hide();
_emojiPanel->hide(); _tabbedPanel->hide();
if (_inlineResults) { if (_inlineResults) {
_inlineResults->hide(); _inlineResults->hide();
} }
@ -2675,7 +2675,7 @@ bool HistoryWidget::saveEditMsgFail(History *history, const RPCError &error, mtp
void HistoryWidget::hideSelectorControlsAnimated() { void HistoryWidget::hideSelectorControlsAnimated() {
_fieldAutocomplete->hideAnimated(); _fieldAutocomplete->hideAnimated();
_emojiPanel->hideAnimated(); _tabbedPanel->hideAnimated();
if (_inlineResults) { if (_inlineResults) {
_inlineResults->hideAnimated(); _inlineResults->hideAnimated();
} }
@ -3790,7 +3790,7 @@ void HistoryWidget::moveFieldControls() {
_kbScroll->setGeometry(0, bottom, width(), keyboardHeight); _kbScroll->setGeometry(0, bottom, width(), keyboardHeight);
} }
// _attachToggle ------- _inlineResults ---------------------------------- _emojiPanel ------- _fieldBarCancel // _attachToggle ------- _inlineResults --------------------------------- _tabbedPanel ------- _fieldBarCancel
// (_attachDocument|_attachPhoto) _field (_silent|_cmdStart|_kbShow) (_kbHide|_attachEmoji) [_broadcast] _send // (_attachDocument|_attachPhoto) _field (_silent|_cmdStart|_kbShow) (_kbHide|_attachEmoji) [_broadcast] _send
// (_botStart|_unblock|_joinChannel|_muteUnmute) // (_botStart|_unblock|_joinChannel|_muteUnmute)
@ -3810,7 +3810,7 @@ void HistoryWidget::moveFieldControls() {
if (_inlineResults) { if (_inlineResults) {
_inlineResults->moveBottom(_field->y() - st::historySendPadding); _inlineResults->moveBottom(_field->y() - st::historySendPadding);
} }
_emojiPanel->moveBottom(buttonsBottom); _tabbedPanel->moveBottom(buttonsBottom);
auto fullWidthButtonRect = QRect(0, bottom - _botStart->height(), width(), _botStart->height()); auto fullWidthButtonRect = QRect(0, bottom - _botStart->height(), width(), _botStart->height());
_botStart->setGeometry(fullWidthButtonRect); _botStart->setGeometry(fullWidthButtonRect);

View File

@ -57,7 +57,7 @@ class TopBarWidget;
} // namespace Window } // namespace Window
namespace ChatHelpers { namespace ChatHelpers {
class EmojiPanel; class TabbedPanel;
} // namespace ChatHelpers } // namespace ChatHelpers
class DragArea; class DragArea;
@ -780,7 +780,7 @@ private:
QTimer _membersDropdownShowTimer; QTimer _membersDropdownShowTimer;
object_ptr<InlineBots::Layout::Widget> _inlineResults = { nullptr }; object_ptr<InlineBots::Layout::Widget> _inlineResults = { nullptr };
object_ptr<ChatHelpers::EmojiPanel> _emojiPanel; object_ptr<ChatHelpers::TabbedPanel> _tabbedPanel;
DragState _attachDrag = DragStateNone; DragState _attachDrag = DragStateNone;
object_ptr<DragArea> _attachDragDocument, _attachDragPhoto; object_ptr<DragArea> _attachDragDocument, _attachDragPhoto;

View File

@ -81,12 +81,8 @@
<(src_loc)/boxes/username_box.h <(src_loc)/boxes/username_box.h
<(src_loc)/chat_helpers/bot_keyboard.cpp <(src_loc)/chat_helpers/bot_keyboard.cpp
<(src_loc)/chat_helpers/bot_keyboard.h <(src_loc)/chat_helpers/bot_keyboard.h
<(src_loc)/chat_helpers/emoji_panel.cpp
<(src_loc)/chat_helpers/emoji_panel.h
<(src_loc)/chat_helpers/emoji_list_widget.cpp <(src_loc)/chat_helpers/emoji_list_widget.cpp
<(src_loc)/chat_helpers/emoji_list_widget.h <(src_loc)/chat_helpers/emoji_list_widget.h
<(src_loc)/chat_helpers/emoji_section.cpp
<(src_loc)/chat_helpers/emoji_section.h
<(src_loc)/chat_helpers/field_autocomplete.cpp <(src_loc)/chat_helpers/field_autocomplete.cpp
<(src_loc)/chat_helpers/field_autocomplete.h <(src_loc)/chat_helpers/field_autocomplete.h
<(src_loc)/chat_helpers/gifs_list_widget.cpp <(src_loc)/chat_helpers/gifs_list_widget.cpp
@ -97,6 +93,8 @@
<(src_loc)/chat_helpers/stickers.h <(src_loc)/chat_helpers/stickers.h
<(src_loc)/chat_helpers/stickers_list_widget.cpp <(src_loc)/chat_helpers/stickers_list_widget.cpp
<(src_loc)/chat_helpers/stickers_list_widget.h <(src_loc)/chat_helpers/stickers_list_widget.h
<(src_loc)/chat_helpers/tabbed_panel.cpp
<(src_loc)/chat_helpers/tabbed_panel.h
<(src_loc)/core/basic_types.h <(src_loc)/core/basic_types.h
<(src_loc)/core/click_handler.cpp <(src_loc)/core/click_handler.cpp
<(src_loc)/core/click_handler.h <(src_loc)/core/click_handler.h