mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-16 06:07:06 +02:00
Returned old design of toggles in admin rights box for now.
This commit is contained in:
parent
29379fac35
commit
fecf538e31
1 changed files with 153 additions and 16 deletions
|
@ -57,6 +57,59 @@ int SlowmodeDelayByIndex(int index) {
|
|||
Unexpected("Index in SlowmodeDelayByIndex.");
|
||||
}
|
||||
|
||||
template <typename CheckboxesMap, typename DependenciesMap>
|
||||
void ApplyDependencies(
|
||||
const CheckboxesMap &checkboxes,
|
||||
const DependenciesMap &dependencies,
|
||||
QPointer<Ui::Checkbox> changed) {
|
||||
const auto checkAndApply = [&](
|
||||
auto &¤t,
|
||||
auto dependency,
|
||||
bool isChecked) {
|
||||
for (auto &&checkbox : checkboxes) {
|
||||
if ((checkbox.first & dependency)
|
||||
&& (checkbox.second->checked() == isChecked)) {
|
||||
current->setChecked(isChecked);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
const auto applySomeDependency = [&] {
|
||||
auto result = false;
|
||||
for (auto &&entry : checkboxes) {
|
||||
if (entry.second == changed) {
|
||||
continue;
|
||||
}
|
||||
auto isChecked = entry.second->checked();
|
||||
for (auto &&dependency : dependencies) {
|
||||
const auto check = isChecked
|
||||
? dependency.first
|
||||
: dependency.second;
|
||||
if (entry.first & check) {
|
||||
if (checkAndApply(
|
||||
entry.second,
|
||||
(isChecked
|
||||
? dependency.second
|
||||
: dependency.first),
|
||||
!isChecked)) {
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
const auto maxFixesCount = int(checkboxes.size());
|
||||
for (auto i = 0; i != maxFixesCount; ++i) {
|
||||
if (!applySomeDependency()) {
|
||||
break;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
auto Dependencies(ChatRestrictions)
|
||||
-> std::vector<std::pair<ChatRestriction, ChatRestriction>> {
|
||||
using Flag = ChatRestriction;
|
||||
|
@ -524,6 +577,103 @@ template <
|
|||
};
|
||||
}
|
||||
|
||||
template <
|
||||
typename Flags,
|
||||
typename DisabledMessagePairs,
|
||||
typename FlagLabelPairs>
|
||||
[[nodiscard]] EditFlagsControl<Flags, Ui::RpWidget> CreateEditAdminFlags(
|
||||
QWidget *parent,
|
||||
rpl::producer<QString> header,
|
||||
Flags checked,
|
||||
const DisabledMessagePairs &disabledMessagePairs,
|
||||
const FlagLabelPairs &flagLabelPairs) {
|
||||
auto widget = object_ptr<Ui::VerticalLayout>(parent);
|
||||
const auto container = widget.data();
|
||||
|
||||
const auto checkboxes = container->lifetime(
|
||||
).make_state<std::map<Flags, QPointer<Ui::Checkbox>>>();
|
||||
|
||||
const auto value = [=] {
|
||||
auto result = Flags(0);
|
||||
for (const auto &[flags, checkbox] : *checkboxes) {
|
||||
if (checkbox->checked()) {
|
||||
result |= flags;
|
||||
} else {
|
||||
result &= ~flags;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
const auto changes = container->lifetime(
|
||||
).make_state<rpl::event_stream<>>();
|
||||
|
||||
const auto applyDependencies = [=](Ui::Checkbox *control) {
|
||||
static const auto dependencies = Dependencies(Flags());
|
||||
ApplyDependencies(*checkboxes, dependencies, control);
|
||||
};
|
||||
|
||||
container->add(
|
||||
object_ptr<Ui::FlatLabel>(
|
||||
container,
|
||||
std::move(header),
|
||||
st::rightsHeaderLabel),
|
||||
st::rightsHeaderMargin);
|
||||
|
||||
auto addCheckbox = [&](Flags flags, const QString &text) {
|
||||
const auto lockedIt = ranges::find_if(
|
||||
disabledMessagePairs,
|
||||
[&](const auto &pair) { return (pair.first & flags) != 0; });
|
||||
const auto locked = (lockedIt != end(disabledMessagePairs))
|
||||
? std::make_optional(lockedIt->second)
|
||||
: std::nullopt;
|
||||
const auto toggled = ((checked & flags) != 0);
|
||||
auto toggle = std::make_unique<Ui::ToggleView>(
|
||||
st::rightsToggle,
|
||||
toggled);
|
||||
toggle->setLocked(locked.has_value());
|
||||
const auto control = container->add(
|
||||
object_ptr<Ui::Checkbox>(
|
||||
container,
|
||||
text,
|
||||
st::rightsCheckbox,
|
||||
std::move(toggle)),
|
||||
st::rightsToggleMargin);
|
||||
control->checkedChanges(
|
||||
) | rpl::start_with_next([=](bool checked) {
|
||||
if (locked.has_value()) {
|
||||
if (checked != toggled) {
|
||||
Ui::ShowMultilineToast({
|
||||
.parentOverride = parent,
|
||||
.text = { *locked },
|
||||
});
|
||||
control->setChecked(toggled);
|
||||
}
|
||||
} else {
|
||||
InvokeQueued(control, [=] {
|
||||
applyDependencies(control);
|
||||
changes->fire({});
|
||||
});
|
||||
}
|
||||
}, control->lifetime());
|
||||
checkboxes->emplace(flags, control);
|
||||
};
|
||||
for (const auto &[flags, label] : flagLabelPairs) {
|
||||
addCheckbox(flags, label);
|
||||
}
|
||||
|
||||
applyDependencies(nullptr);
|
||||
for (const auto &[flags, checkbox] : *checkboxes) {
|
||||
checkbox->finishAnimating();
|
||||
}
|
||||
|
||||
return {
|
||||
std::move(widget),
|
||||
value,
|
||||
changes->events() | rpl::map(value)
|
||||
};
|
||||
}
|
||||
|
||||
void AddSlowmodeLabels(
|
||||
not_null<Ui::VerticalLayout*> container) {
|
||||
const auto labels = container->add(
|
||||
|
@ -1044,25 +1194,12 @@ EditFlagsControl<ChatAdminRights, Ui::RpWidget> CreateEditAdminRights(
|
|||
ChatAdminRights rights,
|
||||
std::map<ChatAdminRights, QString> disabledMessages,
|
||||
Data::AdminRightsSetOptions options) {
|
||||
auto widget = object_ptr<Ui::VerticalLayout>(parent);
|
||||
const auto checkboxFactory = [&](
|
||||
not_null<Ui::VerticalLayout*> container,
|
||||
ChatAdminRights flags,
|
||||
const QString &text,
|
||||
bool toggled,
|
||||
std::optional<QString>,
|
||||
auto&&) {
|
||||
return AddDefaultCheckbox(container, text, toggled);
|
||||
};
|
||||
auto result = CreateEditFlags(
|
||||
widget.data(),
|
||||
return CreateEditAdminFlags(
|
||||
parent,
|
||||
header,
|
||||
rights,
|
||||
disabledMessages,
|
||||
AdminRightLabels(options),
|
||||
checkboxFactory);
|
||||
result.widget = std::move(widget);
|
||||
return result;
|
||||
AdminRightLabels(options));
|
||||
}
|
||||
|
||||
ChatAdminRights DisabledByDefaultRestrictions(not_null<PeerData*> peer) {
|
||||
|
|
Loading…
Add table
Reference in a new issue