mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-16 14:17:12 +02:00
Don't allow empty "Do Not Translate" list.
This commit is contained in:
parent
4a37846605
commit
ddfcf9f1df
3 changed files with 57 additions and 8 deletions
|
@ -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) {
|
||||
|
|
|
@ -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 });
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue