/* 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 "ui/round_rect.h" #include "ui/wrap/fade_wrap.h" #include "ui/effects/animations.h" #include "ui/effects/numbers_animation.h" #include "info/info_wrap_widget.h" namespace style { struct InfoTopBar; } // namespace style namespace Dialogs::Stories { class List; struct Content; } // namespace Dialogs::Stories namespace Window { class SessionNavigation; } // namespace Window namespace Ui { class AbstractButton; class IconButton; class FlatLabel; class InputField; class SearchFieldController; class LabelWithNumbers; } // namespace Ui namespace Info { class Key; class Section; struct TitleDescriptor { rpl::producer title; rpl::producer subtitle; }; class TopBar : public Ui::RpWidget { public: TopBar( QWidget *parent, not_null navigation, const style::InfoTopBar &st, SelectedItems &&items); [[nodiscard]] auto backRequest() const { return _backClicks.events(); } [[nodiscard]] auto storyClicks() const { return _storyClicks.events(); } void setTitle(TitleDescriptor descriptor); void setStories(rpl::producer content); void setStoriesArchive(bool archive); void enableBackButton(); void highlight(); template ButtonWidget *addButton(base::unique_qptr button) { auto result = button.get(); pushButton(std::move(button)); return result; } template ButtonWidget *addButtonWithVisibility( base::unique_qptr button, rpl::producer shown) { auto result = button.get(); forceButtonVisibility( pushButton(std::move(button)), std::move(shown)); return result; } void createSearchView( not_null controller, rpl::producer &&shown, bool startsFocused); bool focusSearchField(); void setSelectedItems(SelectedItems &&items); SelectedItems takeSelectedItems(); [[nodiscard]] auto selectionActionRequests() const -> rpl::producer; void finishAnimating() { updateControlsVisibility(anim::type::instant); } void showSearch(); protected: int resizeGetHeight(int newWidth) override; void paintEvent(QPaintEvent *e) override; private: void updateControlsGeometry(int newWidth); void updateDefaultControlsGeometry(int newWidth); void updateSelectionControlsGeometry(int newWidth); void updateStoriesGeometry(int newWidth); Ui::FadeWrap *pushButton( base::unique_qptr button); void forceButtonVisibility( Ui::FadeWrap *button, rpl::producer shown); void removeButton(not_null button); void startHighlightAnimation(); void updateControlsVisibility(anim::type animated); [[nodiscard]] bool selectionMode() const; [[nodiscard]] bool storiesTitle() const; [[nodiscard]] bool searchMode() const; [[nodiscard]] Ui::StringWithNumbers generateSelectedText() const; [[nodiscard]] bool computeCanDelete() const; [[nodiscard]] bool computeCanForward() const; [[nodiscard]] bool computeCanToggleStoryPin() const; void updateSelectionState(); void createSelectionControls(); void performForward(); void performDelete(); void performToggleStoryPin(); void setSearchField( base::unique_qptr field, rpl::producer &&shown, bool startsFocused); void clearSearchField(); void createSearchView( not_null field, rpl::producer &&shown, bool startsFocused); template void registerUpdateControlCallback(QObject *guard, Callback &&callback); template void registerToggleControlCallback(Widget *widget, IsVisible &&callback); const not_null _navigation; const style::InfoTopBar &_st; std::optional _roundRect; Ui::Animations::Simple _a_highlight; bool _highlight = false; QPointer> _back; std::vector> _buttons; QPointer> _title; QPointer> _subtitle; bool _searchModeEnabled = false; bool _searchModeAvailable = false; base::unique_qptr _searchView; QPointer _searchField; rpl::event_stream<> _backClicks; rpl::event_stream _storyClicks; SelectedItems _selectedItems; bool _canDelete = false; bool _canForward = false; bool _canToggleStoryPin = false; bool _storiesArchive = false; QPointer> _cancelSelection; QPointer> _selectionText; QPointer> _forward; QPointer> _delete; QPointer> _toggleStoryPin; rpl::event_stream _selectionActionRequests; QPointer> _storiesWrap; QPointer _stories; rpl::lifetime _storiesLifetime; int _storiesCount = 0; using UpdateCallback = Fn; std::map _updateControlCallbacks; }; } // namespace Info