Don't allow empty "Do Not Translate" list.

This commit is contained in:
John Preston 2023-02-07 18:38:10 +04:00
parent 4a37846605
commit ddfcf9f1df
3 changed files with 57 additions and 8 deletions

View file

@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/boxes/choose_language_box.h"
#include "ui/effects/loading_element.h"
#include "ui/layers/generic_box.h"
#include "ui/toasts/common_toasts.h"
#include "ui/painter.h"
#include "ui/widgets/buttons.h"
#include "ui/widgets/labels.h"
@ -39,6 +40,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Ui {
namespace {
constexpr auto kSkipAtLeastOneDuration = 3 * crl::time(1000);
class ShowButton final : public RpWidget {
public:
ShowButton(not_null<Ui::RpWidget*> parent);
@ -285,12 +288,36 @@ bool SkipTranslate(TextWithEntities textWithEntities) {
object_ptr<BoxContent> EditSkipTranslationLanguages() {
auto title = tr::lng_translate_settings_choose();
return Box(ChooseLanguageBox, std::move(title), [=](
const auto selected = std::make_shared<std::vector<LanguageId>>(
Core::App().settings().skipTranslationLanguages());
const auto weak = std::make_shared<QPointer<BoxContent>>();
const auto check = [=](LanguageId id) {
const auto already = ranges::contains(*selected, id);
if (already) {
selected->erase(ranges::remove(*selected, id), selected->end());
} else {
selected->push_back(id);
}
if (already && selected->empty()) {
if (const auto strong = weak->data()) {
Ui::ShowMultilineToast({
.parentOverride = BoxShow(strong).toastParent(),
.text = { tr::lng_translate_settings_one(tr::now) },
.duration = kSkipAtLeastOneDuration,
});
}
return false;
}
return true;
};
auto result = Box(ChooseLanguageBox, std::move(title), [=](
std::vector<LanguageId> &&list) {
Core::App().settings().setSkipTranslationLanguages(
std::move(list));
Core::App().saveSettingsDelayed();
}, Core::App().settings().skipTranslationLanguages(), true);
}, *selected, true, check);
*weak = result.data();
return result;
}
object_ptr<BoxContent> ChooseTranslateToBox(
@ -310,7 +337,7 @@ object_ptr<BoxContent> ChooseTranslateToBox(
Core::App().settings().setTranslateTo(id);
Core::App().saveSettingsDelayed();
callback(id);
}, selected, false);
}, selected, false, nullptr);
}
LanguageId ChooseTranslateTo(not_null<History*> history) {

View file

@ -266,7 +266,8 @@ void ChooseLanguageBox(
rpl::producer<QString> title,
Fn<void(std::vector<LanguageId>)> callback,
std::vector<LanguageId> selected,
bool multiselect) {
bool multiselect,
Fn<bool(LanguageId)> toggleCheck) {
box->setMinHeight(st::boxWidth);
box->setMaxHeight(st::boxWidth);
box->setTitle(std::move(title));
@ -294,6 +295,14 @@ void ChooseLanguageBox(
});
return list;
}();
struct ToggleOne {
LanguageId id;
bool selected = false;
};
struct State {
rpl::event_stream<ToggleOne> toggles;
};
const auto state = box->lifetime().make_state<State>();
auto rows = std::vector<not_null<SlideWrap<Row>*>>();
rows.reserve(langs.size());
for (const auto &id : langs) {
@ -302,9 +311,21 @@ void ChooseLanguageBox(
container,
object_ptr<Row>(container, id)));
if (multiselect) {
button->entity()->toggleOn(
rpl::single(ranges::contains(selected, id)),
false);
button->entity()->toggleOn(rpl::single(
ranges::contains(selected, id)
) | rpl::then(state->toggles.events(
) | rpl::filter([=](ToggleOne one) {
return one.id == id;
}) | rpl::map([=](ToggleOne one) {
return one.selected;
})));
button->entity()->toggledChanges(
) | rpl::start_with_next([=](bool value) {
if (toggleCheck && !toggleCheck(id)) {
state->toggles.fire({ .id = id, .selected = !value });
}
}, button->lifetime());
} else {
button->entity()->setClickedCallback([=] {
callback({ id });

View file

@ -30,6 +30,7 @@ void ChooseLanguageBox(
rpl::producer<QString> title,
Fn<void(std::vector<LanguageId>)> callback,
std::vector<LanguageId> selected,
bool multiselect);
bool multiselect,
Fn<bool(LanguageId)> toggleCheck);
} // namespace Ui