Replaced AdminLog::FilterBox with GenericBox.

This commit is contained in:
23rd 2024-08-21 17:17:45 +03:00
parent 8011adb219
commit c6ea91e671
3 changed files with 103 additions and 1 deletions

View file

@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "boxes/peers/edit_peer_permissions_box.h"
#include "history/admin_log/history_admin_log_filter_value.h"
#include "lang/lang_keys.h"
#include "ui/wrap/vertical_layout.h"
namespace AdminLog {
@ -85,4 +86,17 @@ EditFlagsDescriptor<FilterValue::Flags> FilterValueLabels(bool isChannel) {
}, .st = nullptr };
}
Fn<FilterValue::Flags()> FillFilterValueList(
not_null<Ui::VerticalLayout*> container,
bool isChannel,
const FilterValue &filter) {
auto [checkboxes, getResult, changes] = CreateEditAdminLogFilter(
container,
filter.flags ? (*filter.flags) : ~FilterValue::Flags(0),
isChannel);
const auto controlsRaw = checkboxes.data();
container->add(std::move(checkboxes));
return getResult;
}
} // namespace AdminLog

View file

@ -13,10 +13,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
template <typename Flags>
struct EditFlagsDescriptor;
namespace Ui {
class VerticalLayout;
} // namespace Ui
namespace AdminLog {
struct FilterValue;
[[nodiscard]] Fn<FilterValue::Flags()> FillFilterValueList(
not_null<Ui::VerticalLayout*> container,
bool isChannel,
const FilterValue &filter);
EditFlagsDescriptor<FilterValue::Flags> FilterValueLabels(bool isChannel);
} // namespace AdminLog

View file

@ -37,11 +37,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "main/main_session_settings.h"
#include "ui/chat/chat_theme.h"
#include "ui/chat/chat_style.h"
#include "ui/widgets/checkbox.h"
#include "ui/widgets/expandable_peer_list.h"
#include "ui/widgets/popup_menu.h"
#include "ui/image/image.h"
#include "ui/text/text_utilities.h"
#include "ui/inactive_press.h"
#include "ui/painter.h"
#include "ui/vertical_list.h"
#include "ui/effects/path_shift_gradient.h"
#include "core/click_handler_types.h"
#include "core/file_utilities.h"
@ -59,6 +62,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_channel.h"
#include "data/data_user.h"
#include "styles/style_chat.h"
#include "styles/style_layers.h"
#include "styles/style_menu_icons.h"
#include <QtWidgets/QApplication>
@ -496,8 +500,83 @@ void InnerWidget::requestAdmins() {
void InnerWidget::showFilter(Fn<void(FilterValue &&filter)> callback) {
if (_admins.empty()) {
_showFilterCallback = std::move(callback);
} else {
return;
}
const auto isChannel = !_channel->isMegagroup();
const auto filter = _filter;
const auto admins = _admins;
_controller->uiShow()->show(Box([=](not_null<Ui::GenericBox*> box) {
box->setTitle(tr::lng_manage_peer_recent_actions());
Ui::AddSubsectionTitle(
box->verticalLayout(),
tr::lng_admin_log_filter_actions_type_subtitle());
const auto collectFlags = FillFilterValueList(
box->verticalLayout(),
isChannel,
filter);
Ui::AddSkip(box->verticalLayout());
Ui::AddDivider(box->verticalLayout());
Ui::AddSkip(box->verticalLayout());
Ui::AddSubsectionTitle(
box->verticalLayout(),
tr::lng_admin_log_filter_actions_admins_subtitle());
Ui::AddSkip(box->verticalLayout());
auto checkedPeerId = std::vector<PeerId>();
{
checkedPeerId.reserve(admins.size());
for (const auto &user : admins) {
if (!filter.admins
|| ranges::contains(
(*filter.admins),
user->id,
&UserData::id)) {
checkedPeerId.push_back(user->id);
}
}
}
const auto checkbox = box->addRow(
object_ptr<Ui::Checkbox>(
box->verticalLayout(),
tr::lng_admin_log_filter_actions_admins_section(
tr::now,
Ui::Text::WithEntities),
checkedPeerId.size() == admins.size(),
st::defaultBoxCheckbox));
using Controller = Ui::ExpandablePeerListController;
using Data = Ui::ExpandablePeerListController::Data;
const auto controller = box->lifetime().make_state<Controller>(Data{
.participants = ranges::views::all(
admins
) | ranges::views::transform([](
not_null<UserData*> user) -> not_null<PeerData*> {
return not_null{ user };
}) | ranges::to_vector,
.checked = std::move(checkedPeerId),
.skipSingle = true,
.hideRightButton = true,
.checkTopOnAllInner = true,
});
Ui::AddExpandablePeerList(
checkbox,
controller,
box->verticalLayout());
box->addButton(tr::lng_settings_save(), [=] {
const auto peers = controller->collectRequests();
const auto users = ranges::views::all(
peers
) | ranges::views::transform([](not_null<PeerData*> p) {
return not_null{ p->asUser() };
}) | ranges::to_vector;
callback(FilterValue{
.flags = collectFlags(),
.admins = users,
});
});
box->addButton(tr::lng_cancel(), [box] { box->closeBox(); });
}));
}
void InnerWidget::clearAndRequestLog() {