Added chats filters strip to dialogs widget.

This commit is contained in:
23rd 2024-11-03 10:37:15 +03:00
parent 1d7622e0b5
commit f205952ff2
3 changed files with 67 additions and 10 deletions

View file

@ -11,13 +11,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "dialogs/ui/chat_search_empty.h" #include "dialogs/ui/chat_search_empty.h"
#include "dialogs/ui/chat_search_in.h" #include "dialogs/ui/chat_search_in.h"
#include "dialogs/ui/dialogs_layout.h" #include "dialogs/ui/dialogs_layout.h"
#include "dialogs/ui/dialogs_stories_content.h"
#include "dialogs/ui/dialogs_video_userpic.h" #include "dialogs/ui/dialogs_video_userpic.h"
#include "dialogs/dialogs_indexed_list.h" #include "dialogs/dialogs_indexed_list.h"
#include "dialogs/dialogs_widget.h" #include "dialogs/dialogs_widget.h"
#include "dialogs/dialogs_search_from_controllers.h" #include "dialogs/dialogs_search_from_controllers.h"
#include "dialogs/dialogs_search_tags.h" #include "dialogs/dialogs_search_tags.h"
#include "history/view/history_view_chat_preview.h"
#include "history/view/history_view_context_menu.h" #include "history/view/history_view_context_menu.h"
#include "history/history.h" #include "history/history.h"
#include "history/history_item.h" #include "history/history_item.h"
@ -44,7 +42,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_peer_values.h" #include "data/data_peer_values.h"
#include "data/data_histories.h" #include "data/data_histories.h"
#include "data/data_chat_filters.h" #include "data/data_chat_filters.h"
#include "data/data_cloud_file.h"
#include "data/data_changes.h" #include "data/data_changes.h"
#include "data/data_message_reactions.h" #include "data/data_message_reactions.h"
#include "data/data_saved_messages.h" #include "data/data_saved_messages.h"
@ -68,7 +65,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/effects/loading_element.h" #include "ui/effects/loading_element.h"
#include "ui/widgets/multi_select.h" #include "ui/widgets/multi_select.h"
#include "ui/widgets/menu/menu_add_action_callback_factory.h" #include "ui/widgets/menu/menu_add_action_callback_factory.h"
#include "ui/empty_userpic.h"
#include "ui/unread_badge.h" #include "ui/unread_badge.h"
#include "boxes/filters/edit_filter_box.h" #include "boxes/filters/edit_filter_box.h"
#include "boxes/peers/edit_forum_topic_box.h" #include "boxes/peers/edit_forum_topic_box.h"

View file

@ -16,7 +16,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "dialogs/dialogs_inner_widget.h" #include "dialogs/dialogs_inner_widget.h"
#include "dialogs/dialogs_search_from_controllers.h" #include "dialogs/dialogs_search_from_controllers.h"
#include "dialogs/dialogs_key.h" #include "dialogs/dialogs_key.h"
#include "dialogs/dialogs_entry.h"
#include "history/history.h" #include "history/history.h"
#include "history/history_item.h" #include "history/history_item.h"
#include "history/view/history_view_top_bar_widget.h" #include "history/view/history_view_top_bar_widget.h"
@ -26,6 +25,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "boxes/peers/edit_peer_requests_box.h" #include "boxes/peers/edit_peer_requests_box.h"
#include "ui/text/text_utilities.h" #include "ui/text/text_utilities.h"
#include "ui/widgets/buttons.h" #include "ui/widgets/buttons.h"
#include "ui/widgets/chat_filters_tabs_strip.h"
#include "ui/widgets/elastic_scroll.h" #include "ui/widgets/elastic_scroll.h"
#include "ui/widgets/fields/input_field.h" #include "ui/widgets/fields/input_field.h"
#include "ui/wrap/fade_wrap.h" #include "ui/wrap/fade_wrap.h"
@ -46,14 +46,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "main/main_session_settings.h" #include "main/main_session_settings.h"
#include "api/api_chat_filters.h" #include "api/api_chat_filters.h"
#include "apiwrap.h" #include "apiwrap.h"
#include "base/event_filter.h"
#include "core/application.h" #include "core/application.h"
#include "core/ui_integration.h" #include "core/ui_integration.h"
#include "core/update_checker.h" #include "core/update_checker.h"
#include "core/shortcuts.h" #include "core/shortcuts.h"
#include "boxes/peer_list_box.h"
#include "boxes/peers/edit_participants_box.h"
#include "window/window_adaptive.h"
#include "window/window_controller.h" #include "window/window_controller.h"
#include "window/window_session_controller.h" #include "window/window_session_controller.h"
#include "window/window_slide_animation.h" #include "window/window_slide_animation.h"
@ -655,6 +651,41 @@ Widget::Widget(
setupMoreChatsBar(); setupMoreChatsBar();
setupDownloadBar(); setupDownloadBar();
} }
session().data().chatsFilters().changed(
) | rpl::start_with_next([=] {
if (!session().data().chatsFilters().loaded()) {
return;
}
if (session().data().chatsFilters().has()) {
if (_chatFilters) {
return;
}
_chatFilters = Ui::AddChatFiltersTabsStrip(
this,
&session(),
rpl::single(0),
[=](int h) { updateControlsGeometry(); },
[=](FilterId id) { controller->setActiveChatsFilter(id); },
Core::App().settings().chatFiltersHorizontalValue());
_chatFilters->stackUnder(_scroll);
_chatFilters->resizeToWidth(width());
updateControlsGeometry();
const auto shadow = Ui::CreateChild<Ui::PlainShadow>(
_chatFilters);
shadow->show();
_chatFilters->sizeValue(
) | rpl::start_with_next([=](const QSize &size) {
shadow->setGeometry(
0,
size.height() - shadow->height(),
size.width(),
shadow->height());
}, lifetime());
} else {
_chatFilters = nullptr;
}
}, lifetime());
} }
void Widget::chosenRow(const ChosenRow &row) { void Widget::chosenRow(const ChosenRow &row) {
@ -1227,6 +1258,9 @@ void Widget::updateControlsVisibility(bool fast) {
if (_moreChatsBar) { if (_moreChatsBar) {
_moreChatsBar->show(); _moreChatsBar->show();
} }
if (_chatFilters) {
_chatFilters->show();
}
if (_openedFolder || _openedForum) { if (_openedFolder || _openedForum) {
_subsectionTopBar->show(); _subsectionTopBar->show();
if (_forumTopShadow) { if (_forumTopShadow) {
@ -1845,6 +1879,12 @@ void Widget::scrollToDefault(bool verytop) {
this, this,
QPoint(), QPoint(),
QRect(0, top, wideGeometry.width(), skip)); QRect(0, top, wideGeometry.width(), skip));
if (_chatFilters) {
Ui::RenderWidget(
p,
_chatFilters,
QPoint(0, skip - _chatFilters->height()));
}
Ui::RenderWidget(p, _scroll, QPoint(0, skip)); Ui::RenderWidget(p, _scroll, QPoint(0, skip));
} }
if (scrollGeometry != wideGeometry) { if (scrollGeometry != wideGeometry) {
@ -1860,6 +1900,9 @@ void Widget::startWidthAnimation() {
} }
_widthAnimationCache = grabNonNarrowScrollFrame(); _widthAnimationCache = grabNonNarrowScrollFrame();
_scroll->hide(); _scroll->hide();
if (_chatFilters) {
_chatFilters->hide();
}
updateStoriesVisibility(); updateStoriesVisibility();
} }
@ -1867,6 +1910,9 @@ void Widget::stopWidthAnimation() {
_widthAnimationCache = QPixmap(); _widthAnimationCache = QPixmap();
if (!_showAnimation) { if (!_showAnimation) {
_scroll->setVisible(!_suggestions); _scroll->setVisible(!_suggestions);
if (_chatFilters) {
_chatFilters->setVisible(!_suggestions);
}
} }
updateStoriesVisibility(); updateStoriesVisibility();
update(); update();
@ -1961,6 +2007,9 @@ void Widget::startSlideAnimation(
if (_moreChatsBar) { if (_moreChatsBar) {
_moreChatsBar->hide(); _moreChatsBar->hide();
} }
if (_chatFilters) {
_chatFilters->hide();
}
if (_forumTopShadow) { if (_forumTopShadow) {
_forumTopShadow->hide(); _forumTopShadow->hide();
} }
@ -3507,6 +3556,9 @@ void Widget::updateControlsGeometry() {
if (_forumRequestsBar) { if (_forumRequestsBar) {
_forumRequestsBar->resizeToWidth(barw); _forumRequestsBar->resizeToWidth(barw);
} }
if (_chatFilters) {
_chatFilters->resizeToWidth(barw);
}
_updateScrollGeometryCached = [=] { _updateScrollGeometryCached = [=] {
const auto moreChatsBarTop = expandedStoriesTop const auto moreChatsBarTop = expandedStoriesTop
+ ((!_stories || _stories->isHidden()) ? 0 : _aboveScrollAdded); + ((!_stories || _stories->isHidden()) ? 0 : _aboveScrollAdded);
@ -3528,8 +3580,15 @@ void Widget::updateControlsGeometry() {
if (_forumReportBar) { if (_forumReportBar) {
_forumReportBar->bar().move(0, forumReportTop); _forumReportBar->bar().move(0, forumReportTop);
} }
const auto scrollTop = forumReportTop const auto chatFiltersTop = forumReportTop
+ (_forumReportBar ? _forumReportBar->bar().height() : 0); + (_forumReportBar ? _forumReportBar->bar().height() : 0);
if (_chatFilters) {
_chatFilters->move(0, chatFiltersTop);
}
const auto scrollTop = chatFiltersTop
+ (_chatFilters
? (_chatFilters->height() * (1. - narrowRatio))
: 0);
const auto scrollHeight = height() - scrollTop - bottomSkip; const auto scrollHeight = height() - scrollTop - bottomSkip;
const auto wasScrollHeight = _scroll->height(); const auto wasScrollHeight = _scroll->height();
_scroll->setGeometry(0, scrollTop, scrollWidth, scrollHeight); _scroll->setGeometry(0, scrollTop, scrollWidth, scrollHeight);

View file

@ -390,6 +390,8 @@ private:
QPixmap _widthAnimationCache; QPixmap _widthAnimationCache;
Ui::RpWidget *_chatFilters = nullptr;
int _topDelta = 0; int _topDelta = 0;
std::unique_ptr<Widget> _childList; std::unique_ptr<Widget> _childList;