Fix fast messages UI: icons, animation crash, keybind count, ru translation

- Use st::settingsButton (with icon padding) instead of settingsButtonNoIcon
  so the Rounded icon background doesn't overlap the button label
- Rebuild slots via CountStr.changes() + InvokeQueued to avoid deleting
  widgets from within their own click handlers (fixes _active.empty() assert)
- Filter keybind entries to Count() active slots via settings_shortcuts.cpp
  (stock worktree edit, part of fast-messages-shortcuts patch)
- Add lng_shortcuts_fast_message Russian translation to ag_lang blob

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
cube 2026-05-04 17:54:29 +04:00
parent 45133a2ecb
commit 34f1f1218b
3 changed files with 29 additions and 20 deletions

View file

@ -22,6 +22,7 @@
"ag_fast_messages_placeholder" = "Текст сообщения";
"ag_fast_messages_add" = "Добавить слот";
"ag_fast_messages_remove" = "Удалить слот";
"lng_shortcuts_fast_message" = "Быстрое сообщение {index}";
"ag_settings_appearance" = "Внешний вид чата";
"ag_settings_sync_title" = "Облачная синхронизация";
"ag_sync_enabled_setting" = "Включить облачную синхронизацию";

View file

@ -35,6 +35,7 @@ constexpr auto kRuStrings = R"strings(
"ag_fast_messages_placeholder" = "Текст сообщения";
"ag_fast_messages_add" = "Добавить слот";
"ag_fast_messages_remove" = "Удалить слот";
"lng_shortcuts_fast_message" = "Быстрое сообщение {index}";
"ag_settings_appearance" = "Внешний вид чата";
"ag_settings_sync_title" = "Облачная синхронизация";
"ag_sync_enabled_setting" = "Включить облачную синхронизацию";

View file

@ -3,6 +3,7 @@
#include "apiwrap.h"
#include "arcanegram/ag_config.h"
#include "arcanegram/ui/ag_settings_main.h"
#include "base/invoke_queued.h"
#include "data/data_peer.h"
#include "data/data_session.h"
#include "history/history.h"
@ -26,21 +27,18 @@ namespace {
using namespace ::Settings;
using namespace ::Settings::Builder;
void Rebuild(not_null<Ui::VerticalLayout*> container) {
while (container->count()) {
delete container->widgetAt(0);
}
void FillSlots(not_null<Ui::VerticalLayout*> wrap, not_null<Ui::VerticalLayout*> outer) {
const auto count = Config::FastMessages::Count();
for (auto i = 0; i < count; ++i) {
auto &item = Config::FastMessages::Slot(i);
Ui::AddSubsectionTitle(
container,
wrap,
tr::ag_fast_messages_slot(
lt_index,
rpl::single(QString::number(i + 1))));
const auto field = container->add(
const auto field = wrap->add(
object_ptr<Ui::InputField>(
container,
wrap,
st::agFastMessageField,
tr::ag_fast_messages_placeholder(),
item.value()),
@ -54,17 +52,16 @@ void Rebuild(not_null<Ui::VerticalLayout*> container) {
}, field->lifetime());
const auto idx = i;
::Settings::AddButtonWithIcon(
container,
wrap,
tr::ag_fast_messages_remove(),
st::settingsButtonNoIcon,
st::settingsButton,
{ &st::menuIconDelete }
)->setClickedCallback([container, idx] {
)->setClickedCallback([outer, idx] {
Config::FastMessages::RemoveSlot(idx);
Rebuild(container);
container->resizeToWidth(container->width());
outer->resizeToWidth(outer->width());
});
Ui::AddSkip(container);
Ui::AddDivider(container);
Ui::AddSkip(wrap);
Ui::AddDivider(wrap);
}
}
@ -82,23 +79,33 @@ private:
void BuildPage(SectionBuilder &builder) {
const auto outer = builder.container();
const auto inner = outer->add(object_ptr<Ui::VerticalLayout>(outer));
Rebuild(inner);
const auto slotWrap = outer->add(object_ptr<Ui::VerticalLayout>(outer));
FillSlots(slotWrap, outer);
Config::FastMessages::CountStr.changes(
) | rpl::on_next([outer, slotWrap](auto) {
InvokeQueued(slotWrap, [outer, slotWrap] {
while (slotWrap->count()) {
delete slotWrap->widgetAt(0);
}
FillSlots(slotWrap, outer);
slotWrap->resizeToWidth(slotWrap->width());
});
}, slotWrap->lifetime());
Ui::AddSkip(outer);
::Settings::AddButtonWithIcon(
outer,
tr::ag_fast_messages_add(),
st::settingsButtonNoIcon,
st::settingsButton,
{ &st::menuIconAdd }
)->setClickedCallback([inner] {
)->setClickedCallback([outer] {
const auto count = Config::FastMessages::Count();
if (count >= Config::FastMessages::kSlotCount) {
return;
}
Config::FastMessages::SetCount(count + 1);
Rebuild(inner);
inner->resizeToWidth(inner->width());
});
Ui::AddSkip(outer);