/* 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 Window { class SessionNavigation; } // namespace Window namespace Ui { class IconButton; class FlatLabel; class InputField; class SearchFieldController; class LabelWithNumbers; } // namespace Ui namespace Info { class Key; class Section; rpl::producer TitleValue( const Section §ion, Key key, bool isStackBottom); class TopBar : public Ui::RpWidget { public: TopBar( QWidget *parent, not_null navigation, const style::InfoTopBar &st, SelectedItems &&items); auto backRequest() const { return _backClicks.events(); } void setTitle(rpl::producer &&title); 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(); rpl::producer<> cancelSelectionRequests() const; 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); 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); bool selectionMode() const; bool searchMode() const; Ui::StringWithNumbers generateSelectedText() const; [[nodiscard]] bool computeCanDelete() const; [[nodiscard]] bool computeCanForward() const; void updateSelectionState(); void createSelectionControls(); void clearSelectionControls(); MessageIdsList collectItems() const; void performForward(); void performDelete(); 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; bool _searchModeEnabled = false; bool _searchModeAvailable = false; base::unique_qptr _searchView; QPointer _searchField; rpl::event_stream<> _backClicks; SelectedItems _selectedItems; bool _canDelete = false; bool _canForward = false; QPointer> _cancelSelection; QPointer> _selectionText; QPointer> _forward; QPointer> _delete; rpl::event_stream<> _cancelSelectionClicks; using UpdateCallback = Fn; std::map _updateControlCallbacks; }; } // namespace Info