mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Dedicated CreateEditFlags function only for restrictions.
This commit is contained in:
parent
6dd6066738
commit
0c2f5ed76c
1 changed files with 61 additions and 75 deletions
|
@ -434,24 +434,25 @@ not_null<Ui::SettingsButton*> AddDefaultCheckbox(
|
||||||
template <
|
template <
|
||||||
typename Flags,
|
typename Flags,
|
||||||
typename DisabledMessagePairs,
|
typename DisabledMessagePairs,
|
||||||
typename FlagLabelPairs,
|
typename FlagLabelPairs>
|
||||||
typename CheckboxFactory>
|
|
||||||
[[nodiscard]] EditFlagsControl<Flags, Ui::RpWidget> CreateEditFlags(
|
[[nodiscard]] EditFlagsControl<Flags, Ui::RpWidget> CreateEditFlags(
|
||||||
not_null<Ui::VerticalLayout*> container,
|
not_null<Ui::VerticalLayout*> container,
|
||||||
rpl::producer<QString> header,
|
rpl::producer<QString> header,
|
||||||
Flags checked,
|
Flags checked,
|
||||||
const DisabledMessagePairs &disabledMessagePairs,
|
const DisabledMessagePairs &disabledMessagePairs,
|
||||||
const FlagLabelPairs &flagLabelPairs,
|
const FlagLabelPairs &flagLabelPairs) {
|
||||||
CheckboxFactory checkboxFactory) {
|
|
||||||
struct FlagCheck final {
|
struct FlagCheck final {
|
||||||
QPointer<Ui::SettingsButton> widget;
|
QPointer<Ui::SettingsButton> widget;
|
||||||
rpl::event_stream<bool> checkChanges;
|
rpl::event_stream<bool> checkChanges;
|
||||||
};
|
};
|
||||||
struct State final {
|
struct State final {
|
||||||
|
Ui::SlideWrap<Ui::VerticalLayout> *inner = nullptr;
|
||||||
std::map<Flags, FlagCheck> checkboxes;
|
std::map<Flags, FlagCheck> checkboxes;
|
||||||
rpl::event_stream<> anyChanges;
|
rpl::event_stream<> anyChanges;
|
||||||
|
std::vector<Fn<void(bool)>> mediaToggleCallbacks;
|
||||||
};
|
};
|
||||||
const auto state = container->lifetime().make_state<State>();
|
const auto state = container->lifetime().make_state<State>();
|
||||||
|
const auto mediaRestrictions = MediaRestrictions();
|
||||||
|
|
||||||
const auto value = [=] {
|
const auto value = [=] {
|
||||||
auto result = Flags(0);
|
auto result = Flags(0);
|
||||||
|
@ -532,13 +533,54 @@ template <
|
||||||
: std::nullopt;
|
: std::nullopt;
|
||||||
const auto toggled = ((checked & flags) != 0);
|
const auto toggled = ((checked & flags) != 0);
|
||||||
auto flagCheck = state->checkboxes.emplace(flags, FlagCheck()).first;
|
auto flagCheck = state->checkboxes.emplace(flags, FlagCheck()).first;
|
||||||
const auto control = checkboxFactory(
|
|
||||||
container,
|
const auto control = [&] {
|
||||||
flags,
|
const auto isMedia = ranges::any_of(
|
||||||
text,
|
mediaRestrictions,
|
||||||
toggled,
|
[&](auto f) { return (flags & f); });
|
||||||
locked,
|
if (isMedia) {
|
||||||
[=](bool v) { flagCheck->second.checkChanges.fire_copy(v); });
|
state->mediaToggleCallbacks.push_back([=](bool v) {
|
||||||
|
flagCheck->second.checkChanges.fire_copy(v);
|
||||||
|
});
|
||||||
|
if (!state->inner) {
|
||||||
|
auto wrap = object_ptr<Ui::SlideWrap<Ui::VerticalLayout>>(
|
||||||
|
container,
|
||||||
|
object_ptr<Ui::VerticalLayout>(container));
|
||||||
|
wrap->hide(anim::type::instant);
|
||||||
|
SendMediaToggle(
|
||||||
|
container,
|
||||||
|
rpl::single(
|
||||||
|
ChatRestrictions(0)
|
||||||
|
) | rpl::then(
|
||||||
|
state->anyChanges.events(
|
||||||
|
) | rpl::map(value) | rpl::map(NegateRestrictions)
|
||||||
|
) | rpl::map([=](ChatRestrictions r) -> int {
|
||||||
|
return (r == ChatRestrictions(0))
|
||||||
|
? 0
|
||||||
|
: ranges::count_if(
|
||||||
|
mediaRestrictions,
|
||||||
|
[&](auto f) { return !(r & f); });
|
||||||
|
}),
|
||||||
|
mediaRestrictions.size(),
|
||||||
|
wrap.data(),
|
||||||
|
[=](bool toggled) {
|
||||||
|
for (auto &c : state->mediaToggleCallbacks) {
|
||||||
|
c(toggled);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
locked);
|
||||||
|
state->inner = container->add(std::move(wrap));
|
||||||
|
}
|
||||||
|
const auto checkbox = AddInnerCheckbox(
|
||||||
|
state->inner->entity(),
|
||||||
|
text,
|
||||||
|
toggled,
|
||||||
|
state->anyChanges.events());
|
||||||
|
return checkbox;
|
||||||
|
} else {
|
||||||
|
return AddDefaultCheckbox(container, text, toggled);
|
||||||
|
}
|
||||||
|
}();
|
||||||
flagCheck->second.widget = Ui::MakeWeak(control);
|
flagCheck->second.widget = Ui::MakeWeak(control);
|
||||||
control->toggleOn(flagCheck->second.checkChanges.events());
|
control->toggleOn(flagCheck->second.checkChanges.events());
|
||||||
control->setToggleLocked(locked.has_value());
|
control->setToggleLocked(locked.has_value());
|
||||||
|
@ -570,6 +612,13 @@ template <
|
||||||
checkbox.widget->finishAnimating();
|
checkbox.widget->finishAnimating();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
container->widthValue(
|
||||||
|
) | rpl::start_with_next([=](int w) {
|
||||||
|
state->inner->resizeToWidth(w);
|
||||||
|
}, state->inner->lifetime());
|
||||||
|
//
|
||||||
|
|
||||||
return {
|
return {
|
||||||
nullptr,
|
nullptr,
|
||||||
value,
|
value,
|
||||||
|
@ -1108,68 +1157,12 @@ EditFlagsControl<ChatRestrictions, Ui::RpWidget> CreateEditRestrictions(
|
||||||
std::map<ChatRestrictions, QString> disabledMessages,
|
std::map<ChatRestrictions, QString> disabledMessages,
|
||||||
Data::RestrictionsSetOptions options) {
|
Data::RestrictionsSetOptions options) {
|
||||||
auto widget = object_ptr<Ui::VerticalLayout>(parent);
|
auto widget = object_ptr<Ui::VerticalLayout>(parent);
|
||||||
struct State {
|
|
||||||
Ui::SlideWrap<Ui::VerticalLayout> *inner = nullptr;
|
|
||||||
rpl::event_stream<ChatRestrictions> restrictions;
|
|
||||||
std::vector<Fn<void(bool)>> mediaToggleCallbacks;
|
|
||||||
};
|
|
||||||
const auto state = widget->lifetime().make_state<State>();
|
|
||||||
const auto mediaRestrictions = MediaRestrictions();
|
|
||||||
const auto checkboxFactory = [&](
|
|
||||||
not_null<Ui::VerticalLayout*> container,
|
|
||||||
ChatRestrictions flags,
|
|
||||||
const QString &text,
|
|
||||||
bool toggled,
|
|
||||||
std::optional<QString> locked,
|
|
||||||
Fn<void(bool)> toggleCallback) {
|
|
||||||
const auto isMedia = ranges::any_of(
|
|
||||||
mediaRestrictions,
|
|
||||||
[&](auto f) { return (flags & f); });
|
|
||||||
if (isMedia) {
|
|
||||||
state->mediaToggleCallbacks.push_back(toggleCallback);
|
|
||||||
if (!state->inner) {
|
|
||||||
auto wrap = object_ptr<Ui::SlideWrap<Ui::VerticalLayout>>(
|
|
||||||
container,
|
|
||||||
object_ptr<Ui::VerticalLayout>(container));
|
|
||||||
wrap->hide(anim::type::instant);
|
|
||||||
SendMediaToggle(
|
|
||||||
container,
|
|
||||||
state->restrictions.events_starting_with(
|
|
||||||
ChatRestrictions(0)
|
|
||||||
) | rpl::map([=](ChatRestrictions r) -> int {
|
|
||||||
return (r == ChatRestrictions(0))
|
|
||||||
? 0
|
|
||||||
: ranges::count_if(
|
|
||||||
mediaRestrictions,
|
|
||||||
[&](auto f) { return !(r & f); });
|
|
||||||
}),
|
|
||||||
mediaRestrictions.size(),
|
|
||||||
wrap.data(),
|
|
||||||
[=](bool toggled) {
|
|
||||||
for (auto &callback : state->mediaToggleCallbacks) {
|
|
||||||
callback(toggled);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
locked);
|
|
||||||
state->inner = container->add(std::move(wrap));
|
|
||||||
}
|
|
||||||
const auto checkbox = AddInnerCheckbox(
|
|
||||||
state->inner->entity(),
|
|
||||||
text,
|
|
||||||
toggled,
|
|
||||||
state->restrictions.events() | rpl::to_empty);
|
|
||||||
return checkbox;
|
|
||||||
} else {
|
|
||||||
return AddDefaultCheckbox(container, text, toggled);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
auto result = CreateEditFlags(
|
auto result = CreateEditFlags(
|
||||||
widget.data(),
|
widget.data(),
|
||||||
header,
|
header,
|
||||||
NegateRestrictions(restrictions),
|
NegateRestrictions(restrictions),
|
||||||
disabledMessages,
|
disabledMessages,
|
||||||
RestrictionLabels(options),
|
RestrictionLabels(options));
|
||||||
checkboxFactory);
|
|
||||||
result.widget = std::move(widget);
|
result.widget = std::move(widget);
|
||||||
result.value = [original = std::move(result.value)]{
|
result.value = [original = std::move(result.value)]{
|
||||||
return NegateRestrictions(original());
|
return NegateRestrictions(original());
|
||||||
|
@ -1177,13 +1170,6 @@ EditFlagsControl<ChatRestrictions, Ui::RpWidget> CreateEditRestrictions(
|
||||||
result.changes = std::move(
|
result.changes = std::move(
|
||||||
result.changes
|
result.changes
|
||||||
) | rpl::map(NegateRestrictions);
|
) | rpl::map(NegateRestrictions);
|
||||||
rpl::duplicate(
|
|
||||||
result.changes
|
|
||||||
) | rpl::start_to_stream(state->restrictions, state->inner->lifetime());
|
|
||||||
result.widget->widthValue(
|
|
||||||
) | rpl::start_with_next([=](int w) {
|
|
||||||
state->inner->resizeToWidth(w);
|
|
||||||
}, state->inner->lifetime());
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue