mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +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.");
|
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)
|
auto Dependencies(ChatRestrictions)
|
||||||
-> std::vector<std::pair<ChatRestriction, ChatRestriction>> {
|
-> std::vector<std::pair<ChatRestriction, ChatRestriction>> {
|
||||||
using Flag = 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(
|
void AddSlowmodeLabels(
|
||||||
not_null<Ui::VerticalLayout*> container) {
|
not_null<Ui::VerticalLayout*> container) {
|
||||||
const auto labels = container->add(
|
const auto labels = container->add(
|
||||||
|
@ -1044,25 +1194,12 @@ EditFlagsControl<ChatAdminRights, Ui::RpWidget> CreateEditAdminRights(
|
||||||
ChatAdminRights rights,
|
ChatAdminRights rights,
|
||||||
std::map<ChatAdminRights, QString> disabledMessages,
|
std::map<ChatAdminRights, QString> disabledMessages,
|
||||||
Data::AdminRightsSetOptions options) {
|
Data::AdminRightsSetOptions options) {
|
||||||
auto widget = object_ptr<Ui::VerticalLayout>(parent);
|
return CreateEditAdminFlags(
|
||||||
const auto checkboxFactory = [&](
|
parent,
|
||||||
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(),
|
|
||||||
header,
|
header,
|
||||||
rights,
|
rights,
|
||||||
disabledMessages,
|
disabledMessages,
|
||||||
AdminRightLabels(options),
|
AdminRightLabels(options));
|
||||||
checkboxFactory);
|
|
||||||
result.widget = std::move(widget);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatAdminRights DisabledByDefaultRestrictions(not_null<PeerData*> peer) {
|
ChatAdminRights DisabledByDefaultRestrictions(not_null<PeerData*> peer) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue