2017-09-13 17:01:23 +00:00
|
|
|
/*
|
|
|
|
This file is part of Telegram Desktop,
|
2018-01-03 10:23:14 +00:00
|
|
|
the official desktop application for the Telegram messaging service.
|
2017-09-13 17:01:23 +00:00
|
|
|
|
2018-01-03 10:23:14 +00:00
|
|
|
For license and copyright information please follow this link:
|
|
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
2017-09-13 17:01:23 +00:00
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "ui/rp_widget.h"
|
2022-02-08 17:25:24 +00:00
|
|
|
#include "ui/round_rect.h"
|
2017-11-26 17:05:52 +00:00
|
|
|
#include "ui/wrap/fade_wrap.h"
|
2019-04-02 09:13:30 +00:00
|
|
|
#include "ui/effects/animations.h"
|
2017-11-26 17:05:52 +00:00
|
|
|
#include "ui/effects/numbers_animation.h"
|
|
|
|
#include "info/info_wrap_widget.h"
|
2017-09-13 17:01:23 +00:00
|
|
|
|
|
|
|
namespace style {
|
|
|
|
struct InfoTopBar;
|
|
|
|
} // namespace style
|
|
|
|
|
2019-07-25 18:55:11 +00:00
|
|
|
namespace Window {
|
|
|
|
class SessionNavigation;
|
|
|
|
} // namespace Window
|
|
|
|
|
2017-09-13 17:01:23 +00:00
|
|
|
namespace Ui {
|
|
|
|
class IconButton;
|
|
|
|
class FlatLabel;
|
2017-11-03 12:03:00 +00:00
|
|
|
class InputField;
|
|
|
|
class SearchFieldController;
|
2017-11-26 17:05:52 +00:00
|
|
|
class LabelWithNumbers;
|
2017-09-13 17:01:23 +00:00
|
|
|
} // namespace Ui
|
|
|
|
|
|
|
|
namespace Info {
|
|
|
|
|
2018-01-22 19:51:38 +00:00
|
|
|
class Key;
|
2017-09-30 18:26:45 +00:00
|
|
|
class Section;
|
|
|
|
|
|
|
|
rpl::producer<QString> TitleValue(
|
|
|
|
const Section §ion,
|
2018-01-22 19:51:38 +00:00
|
|
|
Key key,
|
2017-12-06 14:39:27 +00:00
|
|
|
bool isStackBottom);
|
2017-09-30 18:26:45 +00:00
|
|
|
|
2017-09-13 17:01:23 +00:00
|
|
|
class TopBar : public Ui::RpWidget {
|
|
|
|
public:
|
2017-11-26 17:05:52 +00:00
|
|
|
TopBar(
|
|
|
|
QWidget *parent,
|
2019-07-25 18:55:11 +00:00
|
|
|
not_null<Window::SessionNavigation*> navigation,
|
2017-11-26 17:05:52 +00:00
|
|
|
const style::InfoTopBar &st,
|
|
|
|
SelectedItems &&items);
|
2017-09-13 17:01:23 +00:00
|
|
|
|
2017-09-27 12:04:19 +00:00
|
|
|
auto backRequest() const {
|
2017-09-13 17:01:23 +00:00
|
|
|
return _backClicks.events();
|
|
|
|
}
|
|
|
|
|
|
|
|
void setTitle(rpl::producer<QString> &&title);
|
2017-11-26 17:05:52 +00:00
|
|
|
void enableBackButton();
|
2017-11-16 09:13:17 +00:00
|
|
|
void highlight();
|
2017-09-13 17:01:23 +00:00
|
|
|
|
|
|
|
template <typename ButtonWidget>
|
2017-11-03 12:03:00 +00:00
|
|
|
ButtonWidget *addButton(base::unique_qptr<ButtonWidget> button) {
|
|
|
|
auto result = button.get();
|
2017-09-13 17:01:23 +00:00
|
|
|
pushButton(std::move(button));
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2018-09-09 17:38:08 +00:00
|
|
|
template <typename ButtonWidget>
|
|
|
|
ButtonWidget *addButtonWithVisibility(
|
|
|
|
base::unique_qptr<ButtonWidget> button,
|
|
|
|
rpl::producer<bool> shown) {
|
|
|
|
auto result = button.get();
|
|
|
|
forceButtonVisibility(
|
|
|
|
pushButton(std::move(button)),
|
|
|
|
std::move(shown));
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2017-11-03 12:03:00 +00:00
|
|
|
void createSearchView(
|
2017-11-03 18:26:14 +00:00
|
|
|
not_null<Ui::SearchFieldController*> controller,
|
2017-12-08 08:14:30 +00:00
|
|
|
rpl::producer<bool> &&shown,
|
|
|
|
bool startsFocused);
|
|
|
|
bool focusSearchField();
|
2017-11-03 12:03:00 +00:00
|
|
|
|
2017-11-26 17:05:52 +00:00
|
|
|
void setSelectedItems(SelectedItems &&items);
|
|
|
|
SelectedItems takeSelectedItems();
|
|
|
|
|
2022-02-27 11:14:39 +00:00
|
|
|
[[nodiscard]] auto selectionActionRequests() const
|
|
|
|
-> rpl::producer<SelectionAction>;
|
2017-11-26 17:05:52 +00:00
|
|
|
|
2017-11-28 20:01:00 +00:00
|
|
|
void finishAnimating() {
|
|
|
|
updateControlsVisibility(anim::type::instant);
|
|
|
|
}
|
|
|
|
|
2019-03-09 18:44:46 +00:00
|
|
|
void showSearch();
|
|
|
|
|
2017-09-13 17:01:23 +00:00
|
|
|
protected:
|
|
|
|
int resizeGetHeight(int newWidth) override;
|
|
|
|
void paintEvent(QPaintEvent *e) override;
|
|
|
|
|
|
|
|
private:
|
|
|
|
void updateControlsGeometry(int newWidth);
|
2017-11-26 17:05:52 +00:00
|
|
|
void updateDefaultControlsGeometry(int newWidth);
|
|
|
|
void updateSelectionControlsGeometry(int newWidth);
|
2018-09-09 17:38:08 +00:00
|
|
|
Ui::FadeWrap<Ui::RpWidget> *pushButton(
|
|
|
|
base::unique_qptr<Ui::RpWidget> button);
|
|
|
|
void forceButtonVisibility(
|
|
|
|
Ui::FadeWrap<Ui::RpWidget> *button,
|
|
|
|
rpl::producer<bool> shown);
|
2017-11-03 12:03:00 +00:00
|
|
|
void removeButton(not_null<Ui::RpWidget*> button);
|
2017-11-16 09:13:17 +00:00
|
|
|
void startHighlightAnimation();
|
2017-11-27 11:43:57 +00:00
|
|
|
void updateControlsVisibility(anim::type animated);
|
2017-11-03 12:03:00 +00:00
|
|
|
|
2017-11-26 17:05:52 +00:00
|
|
|
bool selectionMode() const;
|
2017-11-27 11:43:57 +00:00
|
|
|
bool searchMode() const;
|
2017-11-26 17:05:52 +00:00
|
|
|
Ui::StringWithNumbers generateSelectedText() const;
|
|
|
|
[[nodiscard]] bool computeCanDelete() const;
|
2021-11-30 12:26:47 +00:00
|
|
|
[[nodiscard]] bool computeCanForward() const;
|
2017-11-26 17:05:52 +00:00
|
|
|
void updateSelectionState();
|
|
|
|
void createSelectionControls();
|
|
|
|
|
|
|
|
void performForward();
|
|
|
|
void performDelete();
|
|
|
|
|
2017-11-03 18:26:14 +00:00
|
|
|
void setSearchField(
|
|
|
|
base::unique_qptr<Ui::InputField> field,
|
2017-12-08 08:14:30 +00:00
|
|
|
rpl::producer<bool> &&shown,
|
|
|
|
bool startsFocused);
|
|
|
|
void clearSearchField();
|
2017-11-03 18:26:14 +00:00
|
|
|
void createSearchView(
|
|
|
|
not_null<Ui::InputField*> field,
|
2017-12-08 08:14:30 +00:00
|
|
|
rpl::producer<bool> &&shown,
|
|
|
|
bool startsFocused);
|
2017-09-13 17:01:23 +00:00
|
|
|
|
2017-11-27 11:43:57 +00:00
|
|
|
template <typename Callback>
|
|
|
|
void registerUpdateControlCallback(QObject *guard, Callback &&callback);
|
|
|
|
|
|
|
|
template <typename Widget, typename IsVisible>
|
|
|
|
void registerToggleControlCallback(Widget *widget, IsVisible &&callback);
|
|
|
|
|
2019-07-25 18:55:11 +00:00
|
|
|
const not_null<Window::SessionNavigation*> _navigation;
|
2019-07-24 14:00:30 +00:00
|
|
|
|
2017-09-13 17:01:23 +00:00
|
|
|
const style::InfoTopBar &_st;
|
2022-02-08 17:25:24 +00:00
|
|
|
std::optional<Ui::RoundRect> _roundRect;
|
2019-04-02 09:13:30 +00:00
|
|
|
Ui::Animations::Simple _a_highlight;
|
2017-11-16 09:13:17 +00:00
|
|
|
bool _highlight = false;
|
2017-11-26 17:05:52 +00:00
|
|
|
QPointer<Ui::FadeWrap<Ui::IconButton>> _back;
|
2017-11-03 12:03:00 +00:00
|
|
|
std::vector<base::unique_qptr<Ui::RpWidget>> _buttons;
|
2017-11-26 17:05:52 +00:00
|
|
|
QPointer<Ui::FadeWrap<Ui::FlatLabel>> _title;
|
2017-09-13 17:01:23 +00:00
|
|
|
|
2017-11-27 11:43:57 +00:00
|
|
|
bool _searchModeEnabled = false;
|
|
|
|
bool _searchModeAvailable = false;
|
2017-11-03 12:03:00 +00:00
|
|
|
base::unique_qptr<Ui::RpWidget> _searchView;
|
2017-12-08 08:14:30 +00:00
|
|
|
QPointer<Ui::InputField> _searchField;
|
2017-11-03 12:03:00 +00:00
|
|
|
|
2017-09-13 17:01:23 +00:00
|
|
|
rpl::event_stream<> _backClicks;
|
|
|
|
|
2017-11-26 17:05:52 +00:00
|
|
|
SelectedItems _selectedItems;
|
|
|
|
bool _canDelete = false;
|
2021-11-30 12:26:47 +00:00
|
|
|
bool _canForward = false;
|
2017-11-26 17:05:52 +00:00
|
|
|
QPointer<Ui::FadeWrap<Ui::IconButton>> _cancelSelection;
|
|
|
|
QPointer<Ui::FadeWrap<Ui::LabelWithNumbers>> _selectionText;
|
|
|
|
QPointer<Ui::FadeWrap<Ui::IconButton>> _forward;
|
|
|
|
QPointer<Ui::FadeWrap<Ui::IconButton>> _delete;
|
2022-02-27 11:14:39 +00:00
|
|
|
rpl::event_stream<SelectionAction> _selectionActionRequests;
|
2017-11-26 17:05:52 +00:00
|
|
|
|
2018-06-04 15:35:11 +00:00
|
|
|
using UpdateCallback = Fn<bool(anim::type)>;
|
2017-11-27 11:43:57 +00:00
|
|
|
std::map<QObject*, UpdateCallback> _updateControlCallbacks;
|
2017-11-26 17:05:52 +00:00
|
|
|
|
2017-09-13 17:01:23 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Info
|