mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +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/boxes/choose_language_box.h"
|
||||||
#include "ui/effects/loading_element.h"
|
#include "ui/effects/loading_element.h"
|
||||||
#include "ui/layers/generic_box.h"
|
#include "ui/layers/generic_box.h"
|
||||||
|
#include "ui/toasts/common_toasts.h"
|
||||||
#include "ui/painter.h"
|
#include "ui/painter.h"
|
||||||
#include "ui/widgets/buttons.h"
|
#include "ui/widgets/buttons.h"
|
||||||
#include "ui/widgets/labels.h"
|
#include "ui/widgets/labels.h"
|
||||||
|
@ -39,6 +40,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
constexpr auto kSkipAtLeastOneDuration = 3 * crl::time(1000);
|
||||||
|
|
||||||
class ShowButton final : public RpWidget {
|
class ShowButton final : public RpWidget {
|
||||||
public:
|
public:
|
||||||
ShowButton(not_null<Ui::RpWidget*> parent);
|
ShowButton(not_null<Ui::RpWidget*> parent);
|
||||||
|
@ -285,12 +288,36 @@ bool SkipTranslate(TextWithEntities textWithEntities) {
|
||||||
|
|
||||||
object_ptr<BoxContent> EditSkipTranslationLanguages() {
|
object_ptr<BoxContent> EditSkipTranslationLanguages() {
|
||||||
auto title = tr::lng_translate_settings_choose();
|
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) {
|
std::vector<LanguageId> &&list) {
|
||||||
Core::App().settings().setSkipTranslationLanguages(
|
Core::App().settings().setSkipTranslationLanguages(
|
||||||
std::move(list));
|
std::move(list));
|
||||||
Core::App().saveSettingsDelayed();
|
Core::App().saveSettingsDelayed();
|
||||||
}, Core::App().settings().skipTranslationLanguages(), true);
|
}, *selected, true, check);
|
||||||
|
*weak = result.data();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
object_ptr<BoxContent> ChooseTranslateToBox(
|
object_ptr<BoxContent> ChooseTranslateToBox(
|
||||||
|
@ -310,7 +337,7 @@ object_ptr<BoxContent> ChooseTranslateToBox(
|
||||||
Core::App().settings().setTranslateTo(id);
|
Core::App().settings().setTranslateTo(id);
|
||||||
Core::App().saveSettingsDelayed();
|
Core::App().saveSettingsDelayed();
|
||||||
callback(id);
|
callback(id);
|
||||||
}, selected, false);
|
}, selected, false, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
LanguageId ChooseTranslateTo(not_null<History*> history) {
|
LanguageId ChooseTranslateTo(not_null<History*> history) {
|
||||||
|
|
|
@ -266,7 +266,8 @@ void ChooseLanguageBox(
|
||||||
rpl::producer<QString> title,
|
rpl::producer<QString> title,
|
||||||
Fn<void(std::vector<LanguageId>)> callback,
|
Fn<void(std::vector<LanguageId>)> callback,
|
||||||
std::vector<LanguageId> selected,
|
std::vector<LanguageId> selected,
|
||||||
bool multiselect) {
|
bool multiselect,
|
||||||
|
Fn<bool(LanguageId)> toggleCheck) {
|
||||||
box->setMinHeight(st::boxWidth);
|
box->setMinHeight(st::boxWidth);
|
||||||
box->setMaxHeight(st::boxWidth);
|
box->setMaxHeight(st::boxWidth);
|
||||||
box->setTitle(std::move(title));
|
box->setTitle(std::move(title));
|
||||||
|
@ -294,6 +295,14 @@ void ChooseLanguageBox(
|
||||||
});
|
});
|
||||||
return list;
|
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>*>>();
|
auto rows = std::vector<not_null<SlideWrap<Row>*>>();
|
||||||
rows.reserve(langs.size());
|
rows.reserve(langs.size());
|
||||||
for (const auto &id : langs) {
|
for (const auto &id : langs) {
|
||||||
|
@ -302,9 +311,21 @@ void ChooseLanguageBox(
|
||||||
container,
|
container,
|
||||||
object_ptr<Row>(container, id)));
|
object_ptr<Row>(container, id)));
|
||||||
if (multiselect) {
|
if (multiselect) {
|
||||||
button->entity()->toggleOn(
|
button->entity()->toggleOn(rpl::single(
|
||||||
rpl::single(ranges::contains(selected, id)),
|
ranges::contains(selected, id)
|
||||||
false);
|
) | 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 {
|
} else {
|
||||||
button->entity()->setClickedCallback([=] {
|
button->entity()->setClickedCallback([=] {
|
||||||
callback({ id });
|
callback({ id });
|
||||||
|
|
|
@ -30,6 +30,7 @@ void ChooseLanguageBox(
|
||||||
rpl::producer<QString> title,
|
rpl::producer<QString> title,
|
||||||
Fn<void(std::vector<LanguageId>)> callback,
|
Fn<void(std::vector<LanguageId>)> callback,
|
||||||
std::vector<LanguageId> selected,
|
std::vector<LanguageId> selected,
|
||||||
bool multiselect);
|
bool multiselect,
|
||||||
|
Fn<bool(LanguageId)> toggleCheck);
|
||||||
|
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
Loading…
Add table
Reference in a new issue