diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 4dafca555..8d88fe7fd 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1509,6 +1509,8 @@ PRIVATE ui/image/image_location_factory.h ui/text/format_song_document_name.cpp ui/text/format_song_document_name.h + ui/widgets/expandable_peer_list.cpp + ui/widgets/expandable_peer_list.h ui/widgets/label_with_custom_emoji.cpp ui/widgets/label_with_custom_emoji.h ui/countryinput.cpp diff --git a/Telegram/SourceFiles/boxes/moderate_messages_box.cpp b/Telegram/SourceFiles/boxes/moderate_messages_box.cpp index bdd4c53dc..5ea43c0c9 100644 --- a/Telegram/SourceFiles/boxes/moderate_messages_box.cpp +++ b/Telegram/SourceFiles/boxes/moderate_messages_box.cpp @@ -12,7 +12,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "base/event_filter.h" #include "base/timer.h" -#include "ui/widgets/participants_check_view.h" #include "boxes/delete_messages_box.h" #include "boxes/peers/edit_peer_permissions_box.h" #include "core/application.h" @@ -32,7 +31,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/boxes/confirm_box.h" #include "ui/controls/userpic_button.h" #include "ui/effects/ripple_animation.h" -#include "ui/effects/toggle_arrow.h" #include "ui/layers/generic_box.h" #include "ui/painter.h" #include "ui/rect.h" @@ -40,6 +38,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/text/text_utilities.h" #include "ui/vertical_list.h" #include "ui/widgets/checkbox.h" +#include "ui/widgets/expandable_peer_list.h" +#include "ui/widgets/participants_check_view.h" #include "ui/wrap/slide_wrap.h" #include "styles/style_boxes.h" #include "styles/style_layers.h" @@ -47,15 +47,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace { -using Participants = std::vector>; - -struct Controller final { - rpl::event_stream toggleRequestsFromTop; - rpl::event_stream toggleRequestsFromInner; - rpl::event_stream checkAllRequests; - Fn collectRequests; -}; - struct ModerateOptions final { bool allCanBan = false; bool allCanDelete = false; @@ -111,192 +102,14 @@ ModerateOptions CalculateModerateOptions(const HistoryItemsList &items) { }; } -class Button final : public Ui::RippleButton { -public: - Button(not_null parent, int count); - - [[nodiscard]] not_null checkView() const; - -private: - void paintEvent(QPaintEvent *event) override; - QImage prepareRippleMask() const override; - QPoint prepareRippleStartPosition() const override; - - std::unique_ptr _view; - -}; - -Button::Button(not_null parent, int count) -: Ui::RippleButton(parent, st::defaultRippleAnimation) -, _view(std::make_unique( - count, - st::slideWrapDuration, - false, - [=] { update(); })) { -} - -not_null Button::checkView() const { - return _view.get(); -} - -QImage Button::prepareRippleMask() const { - return _view->prepareRippleMask(); -} - -QPoint Button::prepareRippleStartPosition() const { - return mapFromGlobal(QCursor::pos()); -} - -void Button::paintEvent(QPaintEvent *event) { - auto p = QPainter(this); - Ui::RippleButton::paintRipple(p, QPoint()); - _view->paint(p, 0, 0, width()); -} - -void CreateParticipantsList( - not_null controller, - not_null inner, - const Participants &participants) { - const auto wrap = inner->add( - object_ptr>( - inner, - object_ptr(inner))); - wrap->toggle(false, anim::type::instant); - - controller->toggleRequestsFromTop.events( - ) | rpl::start_with_next([=](bool toggled) { - wrap->toggle(toggled, anim::type::normal); - }, wrap->lifetime()); - - const auto container = wrap->entity(); - Ui::AddSkip(container); - - auto &lifetime = wrap->lifetime(); - const auto clicks = lifetime.make_state>(); - const auto checkboxes = ranges::views::all( - participants - ) | ranges::views::transform([&](not_null peer) { - const auto line = container->add( - object_ptr(container)); - const auto &st = st::moderateBoxUserpic; - line->resize(line->width(), st.size.height()); - - const auto userpic = Ui::CreateChild( - line, - peer, - st); - const auto checkbox = Ui::CreateChild( - line, - peer->name(), - false, - st::defaultBoxCheckbox); - line->widthValue( - ) | rpl::start_with_next([=](int width) { - userpic->moveToLeft( - st::boxRowPadding.left() - + checkbox->checkRect().width() - + st::defaultBoxCheckbox.textPosition.x(), - 0); - const auto skip = st::defaultBoxCheckbox.textPosition.x(); - checkbox->resizeToWidth(width - - rect::right(userpic) - - skip - - st::boxRowPadding.right()); - checkbox->moveToLeft( - rect::right(userpic) + skip, - ((userpic->height() - checkbox->height()) / 2) - + st::defaultBoxCheckbox.margin.top()); - }, checkbox->lifetime()); - - userpic->setAttribute(Qt::WA_TransparentForMouseEvents); - checkbox->setAttribute(Qt::WA_TransparentForMouseEvents); - - line->setClickedCallback([=] { - checkbox->setChecked(!checkbox->checked()); - clicks->fire({}); - }); - - return checkbox; - }) | ranges::to_vector; - - clicks->events( - ) | rpl::start_with_next([=] { - controller->toggleRequestsFromInner.fire_copy( - ranges::any_of(checkboxes, &Ui::Checkbox::checked)); - }, container->lifetime()); - - controller->checkAllRequests.events( - ) | rpl::start_with_next([=](bool checked) { - for (const auto &c : checkboxes) { - c->setChecked(checked); - } - }, container->lifetime()); - - controller->collectRequests = [=] { - auto result = Participants(); - for (auto i = 0; i < checkboxes.size(); i++) { - if (checkboxes[i]->checked()) { - result.push_back(participants[i]); - } - } - return result; - }; -} - -void AppendList( - not_null checkbox, - not_null controller, - not_null inner, - const Participants &participants, - bool handleSingle) { - const auto isSingle = handleSingle ? (participants.size() == 1) : false; - if (isSingle) { - const auto p = participants.front(); - controller->collectRequests = [=] { return Participants{ p }; }; - return; - } - const auto count = int(participants.size()); - const auto button = Ui::CreateChild