/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "ui/rp_widget.h" #include "base/timer.h" namespace Window { class Controller; } // namespace Window namespace Ui { class PanelAnimation; } // namespace Ui namespace ChatHelpers { class TabbedSelector; class TabbedPanel : public Ui::RpWidget{ Q_OBJECT public: TabbedPanel(QWidget *parent, not_null controller); TabbedPanel(QWidget *parent, not_null controller, object_ptr selector); object_ptr takeSelector(); QPointer getSelector() const; void moveBottom(int bottom); void hideFast(); bool hiding() const { return _hiding || _hideTimer.isActive(); } bool overlaps(const QRect &globalRect) const; void showAnimated(); void hideAnimated(); void toggleAnimated(); ~TabbedPanel(); protected: void enterEventHook(QEvent *e) override; void leaveEventHook(QEvent *e) override; void otherEnter(); void otherLeave(); void paintEvent(QPaintEvent *e) override; bool eventFilter(QObject *obj, QEvent *e) override; private slots: void onWndActiveChanged(); private: void hideByTimerOrLeave(); void moveByBottom(); bool isDestroying() const { return !_selector; } void showFromSelector(); style::margins innerPadding() const; // Rounded rect which has shadow around it. QRect innerRect() const; // Inner rect with removed st::buttonRadius from top and bottom. // This one is allowed to be not rounded. QRect horizontalRect() const; // Inner rect with removed st::buttonRadius from left and right. // This one is allowed to be not rounded. QRect verticalRect() const; QImage grabForAnimation(); void startShowAnimation(); void startOpacityAnimation(bool hiding); void prepareCache(); void opacityAnimationCallback(); void hideFinished(); void showStarted(); bool preventAutoHide() const; void updateContentHeight(); not_null _controller; object_ptr _selector; int _contentMaxHeight = 0; int _contentHeight = 0; int _bottom = 0; std::unique_ptr _showAnimation; Animation _a_show; bool _hiding = false; bool _hideAfterSlide = false; QPixmap _cache; Animation _a_opacity; base::Timer _hideTimer; }; } // namespace ChatHelpers