AiteBar — это скрываемая edge-панель быстрого доступа для Windows. Она появляется при наведении курсора на край экрана и предоставляет быстрый доступ к пользовательским действиям, встроенным утилитам, контекстам и системной интеграцией через tray/hotkeys.
Обеспечить быстрый и удобный доступ к часто используемым ресурсам: сайтам, программам, файлам, папкам, скриптам и системным командам.
- Показ/скрытие панели при наведении на край экрана или по горячим клавишам
- Управление пользовательскими кнопками (добавление, редактирование, удаление, дублирование, переименование, перетаскивание)
- Поддержка нескольких контекстов (панелей) кнопок (фиксировано 8 контекстов)
- Выполнение различных типов действий (веб, программы, файлы, папки, скрипты, команды, горячие клавиши)
- Импорт и экспорт панелей в ZIP-архивах .aitebarpanel
- Системная интеграция через tray icon и глобальные горячие клавиши
- Быстрый запуск сайтов в выбранном браузере и профиле
- Открытие программ, файлов и папок
- Выполнение скриптов (.bat, .cmd, .ps1, .py)
- Использование встроенных утилит (поиск, скриншот, запись видео, калькулятор, проводник, цветовой пикер, быстрая заметка)
- Переключение между контекстами кнопок
- Импорт/экспорт панелей с кнопками
- Скрытая панель, появляющаяся при наведении
- Поддержка 4 сторон экрана (Top, Bottom, Left, Right)
- Поддержка нескольких мониторов
- Глобальные горячие клавиши
- 8 контекстов (панелей) кнопок (первый включен по умолчанию)
- Импорт/экспорт панелей в ZIP-архивах .aitebarpanel (включая пользовательские иконки)
- Ротация профилей браузера
- Поддержка различных браузеров (Chrome, Edge, Brave, Yandex, Opera, OperaGX, Vivaldi, Firefox)
- Встроенная библиотека иконок (Material Symbols, Fluent System Icons, Font Awesome Brands)
- Быстрые заметки с поддержкой Markdown
- Локализация (ru, en, de, uk)
┌─────────────────────────────────────────────────────────────────┐
│ Windows UI Layer │
│ ┌──────────────┐ ┌─────────────────┐ ┌──────────────────┐ │
│ │ MainWindow │ │ SettingsWindow │ │ AppSettingsWindow│ │
│ └──────┬───────┘ └────────┬────────┘ └────────┬─────────┘ │
│ ┌──────────────┐ ┌─────────────────┐ ┌──────────────────┐ │
│ │QuickNoteWindow│ │IconPickerWindow │ │Other Windows... │ │
│ └──────────────┘ └─────────────────┘ └──────────────────┘ │
└─────────┼─────────────────────┼──────────────────────┼────────────┘
│ │ │
└─────────────────────┼──────────────────────┘
│
┌───────────────────────────────┼───────────────────────────────────┐
│ Services Layer │
│ ┌──────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │
│ │ ActionService │ │AppSettingsService │ │PanelPackageService│ │
│ └──────────────────┘ └──────────────────┘ └─────────────────┘ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │
│ │QuickNoteService │ │NativeIntegrationSvc│ │ LocalizationSvc │ │
│ └──────────────────┘ └──────────────────┘ └─────────────────┘ │
└───────────────────────┬───────────────────────────────────────────┘
│
┌───────────────────────┼───────────────────────────────────────────┐
│ Helpers Layer │
│ ┌──────────┐ ┌────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │BrowserHel│ │PathHelper │ │PanelLayoutHel│ │ContextStateHel │ │
│ └──────────┘ └────────────┘ └──────────────┘ └───────────────┘ │
│ ┌──────────┐ ┌────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │FontHelper│ │IconHelper │ │ProfileRotation│ │ActionTargetHel│ │
│ └──────────┘ └────────────┘ └──────────────┘ └───────────────┘ │
│ ┌──────────────────┐ ┌──────────────────────┐ │
│ │QuickNoteMarkdown │ │PanelPackageMapper │ │
│ └──────────────────┘ └──────────────────────┘ │
└───────────────────────┬───────────────────────────────────────────┘
│
┌───────────────────────┼───────────────────────────────────────────┐
│ Native Integration Layer │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ NativeMethods.cs │ │
│ │ - Win32 interop (hotkeys, mouse hooks, window positioning) │ │
│ └──────────────────────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────────────────┘
Слой пользовательского интерфейса на базе WPF. Основные окна:
MainWindow— основная панель с кнопкамиSettingsWindow— редактирование отдельной кнопкиAppSettingsWindow— общие настройки приложенияQuickNoteWindow— быстрые заметки с MarkdownIconPickerWindow— выбор иконкиAboutWindow— окно "О программе"DarkDialog— диалоговое окно с подтверждениемTextPromptDialog— диалоговое окно для ввода текстаRotationProfileSelectionWindow— выбор профилей для ротацииScreenColorPickerWindow— цветовой пикер
Сервисы, реализующие бизнес-логику:
ActionService— выполнение пользовательских действий и системных утилитAppSettingsService— загрузка, сохранение и нормализация настроекPanelPackageService— импорт и экспорт панелей (ZIP-архивирование)QuickNoteService— управление быстрыми заметкамиNativeIntegrationService— низкоуровневая интеграция с Windows (mouse hooks)LocalizationService— локализация интерфейса (ru, en, de, uk)
Статические классы-помощники для различных задач:
BrowserHelper— работа с браузерами (поиск exe, получение профилей)PathHelper— пути к файлам конфигурации и данныхPanelLayoutHelper— расчет геометрии панелиContextStateHelper— работа с контекстами (8 фиксированных контекстов)FontHelper,IconHelper— работа с иконками и шрифтамиProfileRotationHelper— ротация профилей браузераActionTargetHelper— валидация целей действийQuickNoteMarkdown— парсинг и генерация Markdown для быстрых заметокPanelPackageMapper— маппинг между CustomElement и PanelPackageElement
Низкоуровневая интеграция с Windows API через NativeMethods.cs, содержащий P/Invoke объявления для Win32 функций:
- Регистрация глобальных горячих клавиш
- Low-level mouse hook
- Позиционирование окон
- Отправка ввода (SendInput)
UI Layer использует Services Layer для выполнения бизнес-логики. Services Layer использует Helpers Layer для вспомогательных вычислений и Native Integration Layer для взаимодействия с операционной системой.
| Технология | Назначение | Где используется |
|---|---|---|
| .NET 8 | Платформа приложения | Весь проект |
| WPF | Пользовательский интерфейс | Все окна и элементы UI |
| Windows Forms | NotifyIcon (трей) | MainWindow.xaml.cs |
| System.Text.Json | Сериализация/десериализация настроек | AppSettingsService, PanelPackageService |
| System.IO.Compression | ZIP-архивирование панелей | PanelPackageService |
| Win32 API (P/Invoke) | Глобальные горячие клавиши, mouse hooks, позиционирование окон | NativeMethods.cs, NativeIntegrationService |
Основной проект приложения.
Назначение: Содержит весь код приложения, включая UI, сервисы, модели и вспомогательные классы.
Ключевые файлы:
- Models.cs — модели данных (AppSettings, CustomElement, PanelContext, и т.д.)
- MainWindow.xaml / MainWindow.xaml.cs — основное окно приложения
- AppSettingsService.cs — управление настройками
- ActionService.cs — выполнение действий
- PanelPackageService.cs — импорт/экспорт панелей
- QuickNoteService.cs — управление быстрыми заметками
- NativeMethods.cs — Win32 interop
- PathHelper.cs — пути к данным
- Logger.cs — логирование ошибок
- LocalizationService.cs — локализация
Связи с другими частями системы: Является основным исполняемым проектом, ссылается на сам себя и использует все внутренние компоненты.
Тестовый проект.
Назначение: Содержит unit-тесты для ключевых компонентов приложения.
Ключевые файлы:
- ActionServiceTests.cs
- AppSettingsServiceTests.cs
- PanelLayoutHelperTests.cs
- PanelPackageServiceTests.cs
- и другие тесты для helper-классов
Связи с другими частями системы: Ссылается на AiteBar для тестирования его компонентов.
Документация проекта.
Назначение: Содержит внутреннюю и внешнюю документацию.
Скрипты для создания инсталлятора.
Назначение: Содержит Inno Setup скрипт и PowerShell скрипт для сборки инсталлятора.
Ключевые файлы:
- AiteBar.iss — Inno Setup скрипт
- Build-Installer.ps1 — PowerShell скрипт для сборки инсталлятора
Назначение: Основное окно приложения, содержащее панель с кнопками.
Ответственность:
- Показ и скрытие панели
- Отображение и управление кнопками
- Обработка drag-and-drop для переупорядочивания кнопок и смены стороны панели
- Управление контекстами
- Управление tray icon
- Регистрация глобальных горячих клавиш
- Обработка mouse hook для скрытия панели при клике вне
Входящие зависимости:
- AppSettingsService
- ActionService
- PanelPackageService
- NativeIntegrationService
Исходящие зависимости:
- SettingsWindow
- AppSettingsWindow
- QuickNoteWindow
- IconPickerWindow
- и другие вспомогательные окна
Основные компоненты:
- RootBorder — корневой контейнер панели
- MainPanel — основная панель
- FixedPanel — панель с системными кнопками
- UserButtonsPanel — панель с пользовательскими кнопками
- ControlBlock — блок с кнопкой добавления
- AppSettingsBlock — блок с кнопкой настроек
Основные классы:
- MainWindow (partial class)
Основные функции:
- ShowDock() / HideDock() / ToggleDock()
- RefreshPanel()
- RegisterGlobalHotkey()
- InitTrayIcon()
- ImportIntoCurrentPanelAsync() / ExportCurrentPanelAsync()
Потоки данных:
- Настройки загружаются из AppSettingsService
- Кнопки отображаются на основе _elements из AppSettingsService
- Действия выполняются через ActionService
Назначение: Управление настройками приложения и пользовательскими кнопками.
Ответственность:
- Загрузка настроек из файла (settings.json)
- Миграция из старого формата (custom_buttons.json)
- Сохранение настроек в файл
- Нормализация состояния приложения
- Управление списком пользовательских кнопок
- Управление контекстами (8 фиксированных)
Входящие зависимости:
- PathHelper
- ContextStateHelper
- LocalizationService
Исходящие зависимости:
- Нет
Основные компоненты:
- _appSettings — текущие настройки
- _elements — список пользовательских кнопок
- _saveSemaphore — семафор для потокобезопасного сохранения
Основные классы:
- AppSettingsService
Основные функции:
- LoadAsync()
- SaveAsync()
- NormalizeAppState()
- SaveElementAsync()
- ReorderElements()
- CloneElement()
Потоки данных:
- Загружает данные из SettingsFile (settings.json)
- Сохраняет данные в SettingsFile (settings.json)
Назначение: Выполнение пользовательских действий и системных утилит.
Ответственность:
- Выполнение веб-действий (открытие URL в браузере)
- Выполнение действий с программами, файлами, папками
- Выполнение скриптов (.bat, .cmd, .ps1, .py)
- Выполнение команд
- Выполнение горячих клавиш
- Запуск системных утилит (поиск, скриншот, калькулятор, и т.д.)
- Запуск встроенных утилит через UtilityRegistry
Входящие зависимости:
- AppSettingsService
- BrowserHelper
- ProfileRotationHelper
- NativeMethods
- UtilityRegistry
Исходящие зависимости:
- QuickNoteWindow
- ScreenColorPickerWindow
- TimerStopwatchWindow
- FileSorterWindow
Основные компоненты:
- _quickNoteWindow — экземпляр окна быстрых заметок
- _timerStopwatchWindow — экземпляр окна таймера/секундомера
- _fileSorterWindow — экземпляр окна сортировщика файлов
Основные классы:
- ActionService
- UtilityRegistry
- IUtility (интерфейс)
Основные функции:
- ExecuteCustomActionAsync()
- ExecuteWebActionAsync()
- StartSearchAsync()
- StartScreenshotAsync()
- LaunchUtilityAsync() (новый универсальный метод для запуска утилит)
Потоки данных:
- Принимает CustomElement для выполнения действия
- Использует BrowserHelper для работы с браузерами
- Использует NativeMethods для отправки горячих клавиш
- Для запуска утилит использует UtilityRegistry, содержащий все зарегистрированные утилиты
Назначение: Универсальная система для регистрации и запуска встроенных утилит.
Ответственность:
- Регистрация всех утилит в центральном реестре
- Универсальный запуск утилит по уникальному идентификатору
- Простое добавление новых утилит без изменения основного кода
Входящие зависимости:
- Нет
Исходящие зависимости:
- ActionService
- Окна утилит (QuickNoteWindow, TimerStopwatchWindow, и т.д.)
Основные компоненты:
- IUtility — интерфейс для всех утилит
- UtilityRegistry — статический класс для регистрации и получения утилит
- Классы утилит: QuickNoteUtility, TimerStopwatchUtility, ColorPickerUtility, FileSorterUtility
Основные функции:
- UtilityRegistry.Register() — регистрация утилиты
- UtilityRegistry.GetById() — получение утилиты по ID
- IUtility.Launch() — запуск утилиты
Потоки данных:
- При запуске утилиты ActionService вызывает UtilityRegistry.GetById() для получения экземпляра
- Затем вызывает IUtility.Launch() для запуска окна утилиты
Назначение: Импорт и экспорт панелей кнопок в ZIP-архивах .aitebarpanel.
Ответственность:
- Экспорт текущей панели в ZIP-архив .aitebarpanel (включая manifest.json и пользовательские иконки)
- Чтение превью импорта
- Импорт панели из ZIP-архива .aitebarpanel в текущую панель
Входящие зависимости:
- AppSettingsService
- PanelPackageManifest
- PanelPackageMapper
- PathHelper
Исходящие зависимости:
- Нет
Основные классы:
- PanelPackageService
- PanelExportResult
- PanelImportResult
- PanelImportPreview
Основные функции:
- ExportCurrentPanelAsync()
- ReadImportPreviewAsync()
- ImportIntoCurrentPanelAsync()
Потоки данных:
- Экспорт: CustomElement → PanelPackageElement → ZIP-архив
- Импорт: ZIP-архив → PanelPackageElement → CustomElement
Назначение: Управление быстрыми заметками.
Ответственность:
- Загрузка заметки из файла QuickNote.md
- Сохранение заметки в файл QuickNote.md
- Проверка внешних изменений файла
- Сохранение копии при конфликте
- Открытие заметки в внешнем редакторе
Входящие зависимости:
- PathHelper
- QuickNoteMarkdown
Исходящие зависимости:
- Нет
Основные классы:
- QuickNoteService
Основные функции:
- LoadAsync()
- SaveAsync()
- ReadMarkdownAsync()
- HasExternalChanges()
- SaveConflictCopyAsync()
- OpenInEditor()
Потоки данных:
- Заметка хранится в QuickNote.md в папке данных приложения
Назначение: Локализация интерфейса приложения.
Ответственность:
- Применение культуры интерфейса
- Получение локализованных строк по ключу
- Форматирование локализованных строк
- Нормализация имени культуры
Поддерживаемые культуры:
- auto (автоматически по ОС)
- en
- ru
- de
- uk
Входящие зависимости:
- Нет
Исходящие зависимости:
- Нет
Основные классы:
- LocalizationService (static)
- LocalizedStringProvider
- LocExtension (MarkupExtension для XAML)
Основные функции:
- ApplyCulture()
- Get()
- Format()
- NormalizeCultureName()
Назначение: Работа с контекстами (панелями) кнопок.
Ответственность:
- Нормализация списка контекстов (всегда 8 контекстов)
- Нормализация активного контекста
- Получение списка включенных контекстов
- Получение относительного контекста (следующий/предыдущий)
- Обертка индекса контекста
Входящие зависимости:
- Нет
Исходящие зависимости:
- Нет
Основные константы:
- FixedContextCount = 8
- DefaultContextPrefix = "Panel "
Основные функции:
- NormalizeContexts()
- NormalizeActiveContextId()
- GetEnabledContexts()
- GetRelativeEnabledContextId()
- WrapIndex()
Назначение: Работа с веб-браузерами.
Ответственность:
- Поиск исполняемого файла браузера (через реестр и стандартные пути)
- Получение пути к пользовательским данным браузера
- Получение списка профилей браузера (из Preferences для Chromium, из profiles.ini для Firefox)
- Определение системного браузера по умолчанию
- Переход к следующему профилю для ротации
Поддерживаемые браузеры:
- Chrome
- Edge
- Brave
- Yandex
- Opera
- OperaGX
- Vivaldi
- Firefox
Входящие зависимости:
- Нет
Исходящие зависимости:
- Нет
Основные классы:
- BrowserHelper (static)
- BrowserProfileInfo
Основные функции:
- GetExecutablePath()
- GetProfiles()
- GetSystemDefaultBrowser()
- GetUserDataPath()
- AdvanceProfile()
Назначение: Расчет геометрии панели.
Ответственность:
- Расчет размеров панели в зависимости от ориентации (вертикальная/горизонтальная)
- Расчет расположения системных и пользовательских кнопок
- Расчет количества полос (bands) для пользовательских кнопок (максимум 2)
Входящие зависимости:
- Нет
Исходящие зависимости:
- Нет
Основные константы:
- ButtonOuterSize = 44
- SeparatorSize = 9
- PanelChrome = 8
- MaxUserBands = 2
Основные классы:
- PanelLayoutHelper (static)
- PanelLayoutMetrics (record)
- UserLayout (record)
Основные функции:
- Calculate()
- CalculateUserLayout()
Назначение: Отображение и скрытие основной панели с кнопками.
Где находится: MainWindow.xaml.cs
Какие компоненты участвуют: MainWindow, NativeIntegrationService, NativeMethods
Какие файлы реализуют функцию: MainWindow.xaml.cs, NativeMethods.cs, NativeIntegrationService.cs
Пошаговый сценарий выполнения:
- Пользователь наводит курсор на край экрана или нажимает глобальную горячую клавишу
- Если курсор находится в зоне активации — запускается таймер
- По истечении задержки — панель плавно появляется с анимацией
- Для скрытия — пользователь кликает вне панели (обрабатывается mouse hook) или курсор покидает панель
Какие данные используются:
- _appSettings.Edge — сторона экрана
- _appSettings.ActivationZoneSizePercent — размер зоны активации
- _appSettings.ActivationDelayMs — задержка перед показом
Что получает пользователь: Плавно появляющаяся/скрывающаяся панель с кнопками.
Назначение: Добавление, редактирование, удаление, дублирование, переименование и перетаскивание пользовательских кнопок.
Где находится: MainWindow.xaml.cs, SettingsWindow.xaml.cs
Какие компоненты участвуют: MainWindow, SettingsWindow, AppSettingsService
Какие файлы реализуют функцию: MainWindow.xaml.cs, SettingsWindow.xaml.cs, AppSettingsService.cs
Пошаговый сценарий выполнения (добавление кнопки):
- Пользователь нажимает кнопку "+"
- Открывается SettingsWindow для создания новой кнопки
- Пользователь заполняет параметры кнопки
- Нажимает "Сохранить"
- Кнопка добавляется в панель и сохраняется в настройках
Какие данные используются: CustomElement, AppSettings
Что получает пользователь: Возможность полного управления своими кнопками.
Назначение: Переключение между различными панелями (контекстами) кнопок (8 контекстов).
Где находится: MainWindow.xaml.cs, ContextStateHelper.cs
Какие компоненты участвуют: MainWindow, ContextStateHelper, AppSettingsService
Какие файлы реализуют функцию: MainWindow.xaml.cs, ContextStateHelper.cs, AppSettingsService.cs
Пошаговый сценарий выполнения:
- Пользователь выбирает контекст из контекстного меню панели или использует горячие клавиши
- Обновляется _appSettings.ActiveContextId
- Вызывается RefreshPanel() для обновления отображаемых кнопок
- Настройки сохраняются
Какие данные используются: PanelContext, AppSettings.Contexts, AppSettings.ActiveContextId
Что получает пользователь: Быстрый доступ к разным наборам кнопок.
Назначение: Выполнение различных типов действий (веб, программы, файлы, папки, скрипты, команды, горячие клавиши).
Где находится: ActionService.cs
Какие компоненты участвуют: ActionService, BrowserHelper, NativeMethods
Какие файлы реализуют функцию: ActionService.cs, BrowserHelper.cs, NativeMethods.cs
Пошаговый сценарий выполнения (веб-действие):
- Пользователь нажимает на кнопку с веб-действием
- ActionService.ExecuteCustomActionAsync() вызывает ExecuteWebActionAsync()
- Если включена ротация профилей — выбирается следующий профиль
- Создается ProcessStartInfo с нужными аргументами (профиль, инкогнито, app mode)
- Запускается процесс браузера
- Если нужно — открывается в полноэкранном режиме (отправка F11 через SendInput)
Какие данные используются: CustomElement, BrowserType, BrowserProfileInfo
Что получает пользователь: Выполнение нужного действия в один клик.
Назначение: Сохранение текущей панели в ZIP-архив и загрузка панели из ZIP-архива.
Где находится: MainWindow.xaml.cs, PanelPackageService.cs
Какие компоненты участвуют: MainWindow, PanelPackageService, AppSettingsService, PanelPackageManifest, PanelPackageMapper
Какие файлы реализуют функцию: MainWindow.xaml.cs, PanelPackageService.cs, PanelPackageManifest.cs, PanelPackageMapper.cs
Пошаговый сценарий выполнения (экспорт):
- Пользователь выбирает "Экспорт текущей панели" из контекстного меню
- Открывается диалог сохранения файла
- PanelPackageService.ExportCurrentPanelAsync() сериализует кнопки текущего контекста в manifest.json
- Пользовательские иконки копируются в папку icons/ в архиве
- Все упаковывается в ZIP-архив с расширением .aitebarpanel
Пошаговый сценарий выполнения (импорт):
- Пользователь выбирает "Импорт в текущую панель" из контекстного меню
- Открывается диалог выбора файла
- PanelPackageService.ReadImportPreviewAsync() показывает превью импорта
- PanelPackageService.ImportIntoCurrentPanelAsync() извлекает архив, копирует иконки в локальное хранилище, добавляет кнопки в текущий контекст
Какие данные используются: PanelPackageManifest, PanelPackageElement, List
Что получает пользователь: Возможность переносить свои панели между компьютерами или делиться ими.
Назначение: Быстрый доступ к встроенным утилитам Windows и функциям AiteBar.
Где находится: MainWindow.xaml.cs, ActionService.cs
Какие компоненты участвуют: MainWindow, ActionService
Какие файлы реализуют функцию: MainWindow.xaml.cs, ActionService.cs
Список системных утилит:
- Поиск (Google)
- Скриншот (ms-screenclip:)
- Запись видео (ms-screenclip:?type=recording)
- Калькулятор (calc.exe)
- Проводник (explorer.exe)
- Загрузки (shell:Downloads)
- Цветовой пикер (ScreenColorPickerWindow)
- Быстрая заметка (QuickNoteWindow)
Пошаговый сценарий выполнения (скриншот):
- Пользователь нажимает кнопку скриншота
- ActionService.StartScreenshotAsync() запускает процесс "ms-screenclip:"
- Открывается встроенный инструмент Windows для создания скриншотов
Что получает пользователь: Быстрый доступ к часто используемым системным функциям.
Назначение: Создание и редактирование быстрых заметок с поддержкой Markdown.
Где находится: QuickNoteWindow.xaml.cs, QuickNoteService.cs
Какие компоненты участвуют: QuickNoteWindow, QuickNoteService, QuickNoteMarkdown
Какие файлы реализуют функцию: QuickNoteWindow.xaml.cs, QuickNoteService.cs, QuickNoteMarkdown.cs
Пошаговый сценарий выполнения:
- Пользователь нажимает кнопку быстрых заметок
- ActionService.StartQuickNoteAsync() открывает QuickNoteWindow
- QuickNoteService загружает заметку из QuickNote.md
- Пользователь редактирует заметку
- Заметка автоматически сохраняется в QuickNote.md
Какие данные используются: QuickNote.md (хранится в папке данных приложения)
Что получает пользователь: Удобный редактор быстрых заметок с поддержкой Markdown.
Пользователь
↓
Нажатие на кнопку в MainWindow
↓
Обработчик клика в MainWindow.xaml.cs
↓
ActionService.ExecuteCustomActionAsync(element)
↓
Определение типа действия (ActionType)
↓
┌─────────────────────────────────────────┐
│ В зависимости от ActionType: │
│ • Web → ExecuteWebActionAsync() │
│ • Hotkey → ExecuteHotkey() │
│ • Program/File/Folder → Process.Start()│
│ • ScriptFile → StartScriptFileAsync() │
│ • Command → ExecuteCommand() │
└─────────────────────────────────────────┘
↓
Выполнение действия
↓
Возврат ActionExecutionResult
Запуск приложения
↓
MainWindow конструктор
↓
PathHelper.EnsureDirectories()
↓
AppSettingsService.LoadAsync()
↓
Проверка наличия settings.json
├─ Если есть → десериализация → NormalizeAppState()
├─ Если нет, но есть custom_buttons.json → миграция → NormalizeAppState()
└─ Если нет → NormalizeAppState() с значениями по умолчанию
↓
SaveAsync() (если были изменения при нормализации)
↓
Настройки готовы к использованию
Пользователь нажимает глобальную горячую клавишу
↓
Windows отправляет сообщение WM_HOTKEY
↓
WndProc в MainWindow.xaml.cs получает сообщение
↓
Проверка id горячей клавиши
↓
Если HOTKEY_ID → вызов ToggleDock()
↓
ToggleDock() проверяет текущее состояние (_shown)
├─ Если скрыта → ShowDock()
└─ Если показана → HideDock()
↓
Панель появляется или скрывается с анимацией
Пользователь выбирает "Экспорт текущей панели"
↓
Открывается SaveFileDialog
↓
PanelPackageService.ExportCurrentPanelAsync(packagePath)
↓
Создается временная директория
↓
Создается manifest.json с информацией о панели и кнопках
↓
Копируются пользовательские иконки в папку icons/
↓
Создается ZIP-архив .aitebarpanel
↓
Возвращается PanelExportResult
Основные окна (WPF Windows):
- MainWindow — основная панель с кнопками
- SettingsWindow — редактирование отдельной кнопки
- AppSettingsWindow — общие настройки приложения
- QuickNoteWindow — быстрые заметки с Markdown
- IconPickerWindow — выбор иконки
- AboutWindow — окно "О программе"
- DarkDialog — диалоговое окно с подтверждением
- TextPromptDialog — диалоговое окно для ввода текста
- RotationProfileSelectionWindow — выбор профилей для ротации
- ScreenColorPickerWindow — цветовой пикер
Дополнительно:
- DarkWindow — базовый класс для темных окон
- DarkDialog — темное диалоговое окно
- MainWindow:
- RootBorder — корневой контейнер с закругленными углами
- MainPanel — основная панель
- FixedPanel — панель с системными кнопками
- UserButtonsPanel — панель с пользовательскими кнопками
- ControlBlock — блок с кнопкой добавления
Состояние приложения хранится в:
- AppSettings — в AppSettingsService
- MainWindow — локальное состояние панели (показана/скрыта, перетаскивание, и т.д.)
- Нет внешних библиотек управления состоянием (используются обычные C# свойства и события)
- AppSettingsService имеет событие SettingsChanged для уведомления об изменениях настроек
- LocalizationService имеет событие CultureChanged для уведомления об изменении языка
- Кэш изображений кнопок в MainWindow (
_buttonImageCache)
- Приложение запускается → создается App → создается MainWindow
- MainWindow инициализирует сервисы и tray icon
- При закрытии MainWindow → приложение завершается
- Окна настроек открываются модально как диалоги
Так как это desktop-приложение на WPF, классического backend в веб-понимании нет. Весь код выполняется локально на компьютере пользователя.
- ActionService — выполнение действий
- AppSettingsService — управление настройками
- PanelPackageService — импорт/экспорт панелей
- QuickNoteService — управление быстрыми заметками
- LocalizationService — локализация
- NativeIntegrationService — native integration
Валидация целей действий выполняется в ActionTargetHelper.cs.
Нет явных фоновых задач. Все операции выполняются синхронно или через async/await без отдельных фоновых потоков.
API отсутствует, так как это desktop-приложение без сетевого взаимодействия (кроме открытия сайтов в браузере).
База данных отсутствует. Все данные хранятся в JSON-файлах в папке %APPDATA%\Codebdbd\Aite Bar\.
- settings.json — основные настройки и пользовательские кнопки
- custom_buttons.json — старый формат файла с кнопками (для миграции)
- QuickNote.md — быстрая заметка
- error.log — лог ошибок
- Icons/ — папка с пользовательскими иконками
Назначение: Представляет контекст (панель) кнопок.
Поля:
- Id (string) — уникальный идентификатор контекста
- Name (string) — название контекста
- IconGlyph (string) — глиф иконки контекста
- IsEnabled (bool) — включен ли контекст
Использование в системе: Используется в AppSettings для хранения списка контекстов. Нормализуется ContextStateHelper до 8 контекстов.
Назначение: Представляет комбинацию горячих клавиш.
Поля:
- Ctrl (bool) — нажат ли Ctrl
- Alt (bool) — нажат ли Alt
- Shift (bool) — нажат ли Shift
- Win (bool) — нажат ли Win
- Key (string) — основная клавиша
Использование в системе: Используется в AppSettings для глобальных горячих клавиш и в CustomElement.ActivationHotkey для отдельного global shortcut пользовательской кнопки.
Назначение: Представляет пользовательскую кнопку.
Поля:
- Id (string) — уникальный идентификатор кнопки
- Name (string) — название кнопки
- Icon (string) — глиф иконки
- IconFont (string) — шрифт иконки
- Color (string) — цвет иконки
- ActionType (string) — тип действия (Web, Hotkey, Program, File, Folder, ScriptFile, Command)
- ActionValue (string) — значение действия (URL, путь, команда)
- Browser (BrowserType) — браузер для веб-действий
- ChromeProfile (string) — профиль браузера
- RotationProfilePaths (List) — пути к профилям для ротации
- IsAppMode (bool) — открывать в app mode
- IsIncognito (bool) — открывать в инкогнито
- UseRotation (bool) — использовать ротацию профилей
- OpenFullscreen (bool) — открывать в полноэкранном режиме
- IsTopmost (bool) — окно поверх всех
- LastUsedProfile (string) — последний использованный профиль
- Alt/Ctrl/Shift/Win (bool) — модификаторы payload для действия Hotkey
- Key (string) — основная клавиша payload для действия Hotkey
- ActivationHotkey (HotkeyBinding) — отдельная глобальная горячая клавиша запуска кнопки
- ImagePath (string) — путь к кастомному изображению
- ContextId (string) — идентификатор контекста, к которому принадлежит кнопка
Использование в системе: Основная модель данных для пользовательских кнопок. Хранится в AppSettings и управляется через AppSettingsService.
Назначение: Представляет все настройки приложения.
Поля:
- GlobalHotkeyCtrl/Alt/Shift/Win (bool) — глобальная горячая клавиша для показа панели
- GlobalHotkeyKey (string) — основная клавиша глобальной горячей клавиши
- ShowPresetSearch/Screenshot/Video/Calc/Explorer/Downloads/ColorPicker/QuickNote (bool) — показывать ли соответствующие системные кнопки
- QuickNoteThemeId (string) — тема быстрых заметок
- Edge (DockEdge) — сторона экрана для панели
- MonitorIndex (int) — индекс монитора
- ActivationZoneSizePercent (double) — размер зоны активации
- PanelSizePercent (double) — размер панели
- ActivationDelayMs (int) — задержка перед показом панели
- UiCulture (string) — язык интерфейса
- Contexts (List) — список контекстов (8 контекстов)
- ActiveContextId (string) — активный контекст
- NextContextHotkey/PreviousContextHotkey/AddButtonHotkey (HotkeyBinding) — горячие клавиши
- Elements (List) — список пользовательских кнопок
Использование в системе: Основная модель настроек приложения. Загружается и сохраняется через AppSettingsService.
Назначение: Представляет информацию о профиле браузера.
Поля:
- DisplayName (string) — отображаемое имя профиля
- ProfilePath (string) — путь к профилю
- ProfileName (string) — имя папки профиля (вычисляемое)
Использование в системе: Используется в BrowserHelper для получения списка профилей браузера.
Назначение: Представляет manifest.json в ZIP-архиве панели.
Поля:
- FormatVersion (int) — версия формата (текущая 1)
- ExportedAt (DateTime) — дата экспорта
- App (PanelPackageAppInfo) — информация о приложении
- Panel (PanelPackagePanelInfo) — информация о панели
- Elements (List) — список кнопок
Использование в системе: Используется PanelPackageService для экспорта и импорта панелей.
Назначение: Представляет кнопку в manifest.json панели.
Поля:
- Name (string) — название кнопки
- ActionType (string) — тип действия
- ActionValue (string) — значение действия
- Browser (BrowserType) — браузер
- ChromeProfile (string) — профиль браузера
- RotationProfilePaths (List) — пути к профилям для ротации
- IsAppMode (bool) — app mode
- IsIncognito (bool) — инкогнито
- UseRotation (bool) — ротация профилей
- OpenFullscreen (bool) — полноэкранный режим
- IsTopmost (bool) — поверх всех окон
- Alt/Ctrl/Shift/Win (bool) — модификаторы горячей клавиши
- Key (string) — клавиша горячей клавиши
- Icon (string) — глиф иконки
- IconFont (string) — шрифт иконки
- Color (string) — цвет иконки
- Image (PanelPackageImageInfo?) — информация о кастомном изображении
Использование в системе: Используется PanelPackageService для экспорта и импорта панелей.
Управление состоянием в приложении организовано простым образом без внешних библиотек:
- Глобальное состояние: Хранится в
AppSettingsвнутриAppSettingsService. Состояние сохраняется в JSON-файл. - Локальное состояние: Локальные переменные и свойства в окнах (например,
_shown,_isAnimatingв MainWindow). - События:
AppSettingsService.SettingsChanged— для уведомления об изменениях настроекLocalizationService.CultureChanged— для уведомления об изменении языка
- Кэширование: Кэш изображений кнопок в MainWindow (
_buttonImageCache).
Авторизация и аутентификация отсутствуют, так как это локальное desktop-приложение без пользовательских учетных записей.
Безопасность:
- При выполнении команд (
ActionType.Command) показывается диалог подтверждения - Скрипты запускаются с учетом расширения файла
- Ошибки логируются в локальный файл, не содержащий конфиденциальных данных
- При импорте панелей проверяется безопасность путей к изображениям (PanelPackageMapper.IsPackagedImagePathSafe)
Назначение: Взаимодействие с операционной системой Windows.
Используемые методы: Win32 API через P/Invoke (NativeMethods.cs).
Передаваемые данные: Окна, сообщения, ввод пользователя.
Точки вызова: MainWindow.xaml.cs, NativeIntegrationService.cs, ActionService.cs.
Обработка ошибок: Ошибки логируются через Logger.
Возможности:
- Глобальные горячие клавиши (RegisterHotKey/UnregisterHotKey)
- Low-level mouse hook (SetWindowsHookEx)
- Позиционирование окон (SetWindowPos)
- Отправка ввода (SendInput)
- Установка окна на передний план (SetForegroundWindow)
Назначение: Открытие URL в различных браузерах с поддержкой профилей, инкогнито и app mode.
Используемые методы: Process.Start(), работа с реестром Windows, чтение файлов настроек браузеров (Preferences для Chromium, profiles.ini для Firefox).
Передаваемые данные: URL, профиль браузера, аргументы командной строки.
Точки вызова: ActionService.cs, BrowserHelper.cs.
Обработка ошибок: Ошибки логируются через Logger.
Поддерживаемые браузеры:
- Chrome
- Edge
- Brave
- Yandex
- Opera
- OperaGX
- Vivaldi
- Firefox
Все конфигурационные файлы хранятся в %APPDATA%\Codebdbd\Aite Bar\:
- settings.json — основной файл настроек (AppSettings)
- custom_buttons.json — старый формат файла с кнопками (для миграции)
- QuickNote.md — быстрая заметка
- error.log — лог ошибок
- Icons/ — папка с пользовательскими иконками
См. раздел "Модели данных" → AppSettings.
Значения по умолчанию задаются в конструкторах моделей (Models.cs) и в методе NormalizeAppState() в AppSettingsService.
Основные значения по умолчанию:
- Глобальная горячая клавиша: Alt + D4
- Сторона панели: Top
- Язык интерфейса: auto (по ОС)
- Включенные системные кнопки: Search, Screenshot, Video, Calculator, Explorer, Downloads
- Ленивая загрузка: Нет, все компоненты загружаются при запуске.
- Кэширование: Кэш изображений кнопок в MainWindow (
_buttonImageCache). - Потокобезопасность: Сохранение настроек защищено SemaphoreSlim в AppSettingsService.
Ошибки логируются в файл %APPDATA%\Codebdbd\Aite Bar\error.log с помощью статического класса Logger.cs.
Ограничения лога:
- Максимальный размер файла: 1 МБ
- При превышении размера создается бэкап error.log.bak и новый файл
- Если браузер не найден — используется Chrome по умолчанию
- Если файл настроек поврежден — создаются настройки по умолчанию
- Если иконка не найдена — используется иконка по умолчанию
- Если культура не поддерживается — используется английский
- Ошибки при выполнении действий не показываются пользователю (только логируются)
- Для опасных действий (например, выполнение команд) показывается диалог подтверждения
- При импорте/экспорте могут показываться диалоги об успехе/ошибке
Зависимости являются частью .NET 8 SDK и WPF, дополнительных пакетов NuGet не требуется. Требуется установленный .NET 8 SDK.
Требуется:
- Windows 10 или Windows 11
- .NET 8 SDK
dotnet build .\AiteBar.sln -c Releasedotnet run --project .\AiteBar\AiteBar.csprojИли запустите скомпилированный exe-файл из bin\Release\net8.0-windows.
Основной вариант:
dotnet test .\AiteBar.Tests\AiteBar.Tests.csproj -c ReleaseFallback для случаев с WPF temp-файлами:
dotnet vstest .\AiteBar.Tests\bin\Release\net8.0-windows\AiteBar.Tests.dllСборка инсталлятора:
.\installer\Build-Installer.ps1Инсталлятор будет создан в artifacts\installer.
CI/CD настроен через GitHub Actions:
.github/workflows/build-test.yml— Release build, тесты и coverage summary/artifact для push/PR вmainиmaster..github/workflows/codeql.yml— CodeQL security-and-quality analysis для C#..github/workflows/release.yml— проверка версии, сборка инсталлятора, checksum и публикация GitHub Release дляvX.Y.Ztag.
Зависимости NuGet и GitHub Actions отслеживаются через .github/dependabot.yml.
App → MainWindow
MainWindow → AppSettingsService
MainWindow → ActionService
MainWindow → PanelPackageService
MainWindow → NativeIntegrationService
MainWindow → SettingsWindow
MainWindow → AppSettingsWindow
MainWindow → QuickNoteWindow
MainWindow → IconPickerWindow
MainWindow → Other Windows...
ActionService → AppSettingsService
ActionService → BrowserHelper
ActionService → ProfileRotationHelper
ActionService → NativeMethods
ActionService → QuickNoteWindow
ActionService → ScreenColorPickerWindow
AppSettingsService → PathHelper
AppSettingsService → ContextStateHelper
AppSettingsService → LocalizationService
PanelPackageService → AppSettingsService
PanelPackageService → PanelPackageManifest
PanelPackageService → PanelPackageMapper
PanelPackageService → PathHelper
QuickNoteService → PathHelper
QuickNoteService → QuickNoteMarkdown
BrowserHelper → (нет зависимостей)
PanelLayoutHelper → (нет зависимостей)
ContextStateHelper → (нет зависимостей)
ProfileRotationHelper → (нет зависимостей)
PathHelper → (нет зависимостей)
Logger → PathHelper
NativeMethods → (нет зависимостей, P/Invoke)
LocalizationService → (нет зависимостей)
QuickNoteMarkdown → (нет зависимостей)
PanelPackageMapper → (нет зависимостей)
| Файл | Назначение | Важность |
|---|---|---|
| Models.cs | Модели данных (AppSettings, CustomElement, и т.д.) | Critical |
| MainWindow.xaml / MainWindow.xaml.cs | Основное окно приложения | Critical |
| AppSettingsService.cs | Управление настройками | Critical |
| ActionService.cs | Выполнение действий | Critical |
| NativeMethods.cs | Win32 interop | Critical |
| PathHelper.cs | Пути к данным | High |
| Logger.cs | Логирование ошибок | High |
| BrowserHelper.cs | Работа с браузерами | High |
| PanelLayoutHelper.cs | Расчет геометрии панели | High |
| PanelPackageService.cs | Импорт/экспорт панелей | High |
| ContextStateHelper.cs | Работа с контекстами | High |
| QuickNoteService.cs | Быстрые заметки | Medium |
| LocalizationService.cs | Локализация | Medium |
| SettingsWindow.xaml.cs | Редактирование кнопки | Medium |
| AppSettingsWindow.xaml.cs | Общие настройки | Medium |
| ProfileRotationHelper.cs | Ротация профилей | Medium |
| IconHelper.cs / FontHelper.cs | Работа с иконками | Medium |
| NativeIntegrationService.cs | Native integration | Medium |
| PanelPackageManifest.cs / PanelPackageMapper.cs | Импорт/экспорт панелей | Medium |
| QuickNoteMarkdown.cs | Markdown для заметок | Medium |
| Other Windows (.xaml/.cs) | Вспомогательные окна | Low |
| AssemblyInfo.cs | Информация о сборке | Low |
Явных debug-функций или feature flags нет.
Нет экспериментальных механизмов.
- Логирование ошибок в error.log (включено всегда)
- Возможность открыть папку с данными через проводник (клик на иконке проводника в системных кнопках)
- Логирование всех ошибок через Logger.cs
Почему критичен: Это основное окно приложения, без него панель не работает. Содержит логику показа/скрытия панели, tray icon, глобальных горячих клавиш и управления кнопками.
Почему критичен: Управляет всеми настройками и пользовательскими кнопками. Без него приложение не может загрузить или сохранить конфигурацию.
Почему критичен: Выполняет все пользовательские действия и системные утилиты. Без него кнопки не будут работать.
Почему критичен: Содержит P/Invoke объявления для Win32 API, которые используются для глобальных горячих клавиш, mouse hooks, позиционирования окон и отправки ввода. Без них интеграция с Windows не работает.
- Простая и понятная архитектура без избыточной сложности
- Хорошая разделение ответственности между сервисами и helper-классами
- Unit-тесты для ключевых компонентов
- Поддержка локализации (4 языка)
- Кросс-браузерность с поддержкой профилей
- Плавная анимация и отзывчивый UI
- ZIP-архивирование панелей с пользовательскими иконками
- 8 фиксированных контекстов для организации кнопок
- Быстрые заметки с поддержкой Markdown
- Основная логика UI и системного поведения сосредоточена в MainWindow.xaml.cs (класс очень большой, >1000 строк)
- Нет разделения на ViewModel и View (нет MVVM)
- Нет инверсии контрола (IoC) или контейнера зависимостей
- Логирование только ошибок, нет информационных или отладочных сообщений
- Нет CI/CD
- Рефакторинг MainWindow.xaml.cs — разбить на более мелкие классы
- Внедрение MVVM для лучшей тестируемости и разделения ответственности
- Добавление более подробного логирования
- Настройка CI/CD для автоматической сборки и тестирования
- Разбить MainWindow.xaml.cs на несколько специализированных классов (например, PanelVisibilityManager, TrayIconManager, HotkeyManager, ButtonPanelManager)
- Внедрить шаблон MVVM с использованием CommunityToolkit.Mvvm или аналогичной библиотеки
- Добавить более подробное логирование (информационные, отладочные сообщения)
- Настроить CI/CD (например, GitHub Actions) для автоматической сборки, тестирования и создания релизов
- Добавить больше unit-тестов для покрытия всех сценариев
- Рассмотреть внедрение контейнера зависимостей для улучшения тестируемости и расширяемости