Этот документ описывает фактическую схему подключения быстрых встроенных утилит в AiteBar.
Утилиты автоматически регистрируются через UtilityRegistry и реализуют IUtility из AiteBar/UtilityRegistry.cs. Для обычной утилиты с отдельным WPF-окном предпочтительно наследоваться от UtilityBase<TWindow>: базовый класс уже умеет активировать открытое окно, вызывать onBeforeExecute, создавать окно и очищать ссылку после закрытия.
Каждая утилита должна быть помечена атрибутом [Utility] для автоматической регистрации.
ContractVersion: версия контракта утилиты (по умолчанию 1.0)IsCompatibleWith(Version coreVersion): проверка совместимости с ядром (по умолчанию true)
- Крах утилиты не крашит всё приложение
- Логирование и телеметрия отправляется
- Пользователь видит понятное сообщение вместо краш
Минимальный класс утилиты:
using System.Runtime.Versioning;
using System.Windows;
namespace AiteBar;
[SupportedOSPlatform("windows6.1")]
[Utility]
public sealed class MyNewUtility : UtilityBase<MyNewUtilityWindow>
{
public override string Id => "MyNewUtility";
public override string DisplayNameKey => "Tool_MyNewUtility";
public override string IconGlyph => "\uE946";
public override string IconColor => "#007ACC";
// Опционально: можно переопределить версию контракта и проверку совместимости
public override Version ContractVersion => new(1, 0);
public override bool IsCompatibleWith(Version coreVersion) => true;
protected override MyNewUtilityWindow CreateWindow(AppSettingsService settingsService, Window? owner)
{
return new MyNewUtilityWindow(settingsService) { Owner = owner };
}
protected override void ShowWindow(MyNewUtilityWindow window, AppSettingsService settingsService)
{
window.ShowNearPanel(settingsService);
}
}Если утилита не имеет постоянного окна, можно реализовать IUtility напрямую. Пример: ColorPickerUtility.
- Создайте WPF-окно утилиты:
MyNewUtilityWindow.xamlиMyNewUtilityWindow.xaml.cs. - Создайте класс
MyNewUtilityс атрибутом[Utility]. - Утилита будет автоматически зарегистрирована из текущей сборки через
UtilityRegistry.RegisterAllFromAssembly(). - Добавьте локализацию во все ресурсы:
AiteBar/Resources/Strings.resxAiteBar/Resources/Strings.ru.resxAiteBar/Resources/Strings.uk.resxAiteBar/Resources/Strings.de.resx
Тест LocalizationServiceTests.ResourceFiles_HaveSameKeysAndFormatPlaceholders требует одинаковый набор ключей во всех ресурсных файлах.
Начиная с версии с рефакторингом unified buttons, системные утилиты регистрируются единым способом через централизованный каталог. Для добавления новой кнопки утилиты нужно обновить следующие 6 точек:
-
**
AiteBar/UtilityButtonCatalog.cs** — добавить статическое свойствоUtilityButtonDefinition MyAi(Id, PresetFlag nameof(AppSettings.ShowPresetMyAi), Glyph, DefaultOrder, LocTitleKey, LocTooltipKey) и включить его в массивAll`. -
AiteBar/Models.cs— в классAppSettingsдобавить:public bool ShowPresetMyAi { get; set; } = true; // или false если по умолчанию скрыто
-
AiteBar/AppSettingsService.cs— вClone()сделать deep-copy нового ShowPreset-флага (аналогично другим ShowPreset*). -
**
AiteBar/AppSettingsWindow.xaml.cs** — в методеGetUtilityVisibilityBindings()` добавить binding нового чекбокса:(nameof(AppSettings.ShowPresetMyAi), "Tool_MyAi_Title")
-
AiteBar/AppSettingsWindow.xaml— добавитьCheckBoxв секциюQuick ToolsвкладкиQuick Toolsс локализацией{local:Loc ResourceKey=Tool_MyAi_Title}. -
AiteBar/MainWindow.xaml.cs— вExecuteUnifiedButtonActionAsync()добавитьcase "MyAi"с запуском:case "MyAi": _ = _actionService.LaunchUtilityAsync("MyAi", HideDock); break;
Если кнопка должна участвовать в keyboard focus traversal, дополнительно включите ее имя в списки обхода фокуса — UnifiedButtonService и UtilityButtonCatalog автоматически подхватывают кнопку из All.
Для AI-утилит (с внешним AI-шлюзом) дополнительно см. creating-ai-utilities.md — там описана интеграция AiGateway, шаблон окна и соглашения об автосохранении состояния.
Добавьте boolean-настройку в AppSettings:
public bool ShowPresetMyNewUtility { get; set; } = true;Затем подключите ее в:
AiteBar/AppSettingsWindow.xaml.cs: binding вGetUtilityVisibilityBindings().AiteBar/AppSettingsService.cs: clone вClone().AiteBar/AppSettingsWindow.xaml: чекбокс во вкладке быстрых утилит (если используется ручной binding вместо GetUtilityVisibilityBindings — не требуется, если метод уже используется).
Хоткеи для утилит не создаются автоматически. Если утилите нужен глобальный хоткей, обновите:
AiteBar/Models.cs: новое свойствоHotkeyBinding.AiteBar/HotkeyService.cs:HotkeyCommand, уникальный ID, descriptor и binding mapping.AiteBar/AppSettingsWindow.xaml: controls для выбора hotkey.AiteBar/AppSettingsWindow.xaml.cs: загрузка, валидация и сохранение.AiteBar/MainWindow.xaml.cs: запуск вExecuteHotkeyCommand().AiteBar.Tests/HotkeyServiceTests.cs: ожидаемый список команд и mapping.
QuickNoteUtility.cs: окно со своим позиционированием и сохранением состояния.TimerStopwatchUtility.cs: окно рядом с панелью.ColorPickerUtility.cs: modal/dialog-like одноразовый запуск без `UtilityBase.FileSorterUtility.cs: сервисная логика отдельно от окна.IconConverterUtility.cs: конвертация PNG/JPG/WEBP/BMP/TIFF/SVG в Windows ICO через SkiaSharp/Svg.Skia, отдельный сервис и encoder; preview работает отдельно от финальной сборки ICO, входные файлы валидируются по размеру/безопасности.ClipboardManagerUtility.cs: утилита с отдельным runtime-history сервисом, множеством контекстных действий над клипом, persistence истории между сессиями.TextProcessingUtility.cs: AI-утилита с потоковым SSE-выводом через AiGateway, Diff, Undo/Redo, защита технических фрагментов.ZenEditorUtility.cs: отдельное полноэкранное окно с multi-document store, поиском, темами, экспортом TXT и корзиной.PromptBuilderUtility.cs: комплексная AI-утилита с 11 рубриками, каталогом стилей, кэшем моделей AiGateway и сохранением draft-ов (PromptBuilderDrafts) для каждого направления.AiteProfilesUtility/AiteProfilesUtility.cs: WPF-утилита для локальных Chrome-профилей с поиском, категориями, тегами, quick-link, rotation и запуском профилей; не переносит standalone tray/API/hotkeys и не читает ChromeLogin Data.