Документация GUI Библиотеки
Легковесная, кроссплатформенная (X11) библиотека для создания графических интерфейсов на C++. Поддерживает программный рендеринг, анимации, иерархию виджетов и событийно-ориентированную архитектуру.
🚀 Быстрый старт
Минимальный пример создания окна с кнопкой и обработкой события.
#include "gui.h"
int main() {
// 1. Создаем окно
gui::window win("Мое Приложение");
// 2. Добавляем страницу
win.addPAGE("main");
// 3. Настраиваем страницу виджетами
win.configur_page("main", [](gui::page& p) {
// Создаем кнопку
gui::WidgetData btnData;
btnData.id = "my_button";
btnData.text = "Нажми меня!";
btnData.x = 50; btnData.y = 50;
btnData.width = 150; btnData.height = 40;
btnData.bg_color = 0x2563EB; // Синий
btnData.fg_color = 0xFFFFFF; // Белый текст
p.Button(btnData);
}, true); // true = сделать активной сразу
// 4. Подписываемся на событие
gui::EventBus::get().on("button.click", [](const gui::EventData& e) {
if (e.source_id == "my_button") {
std::cout << "Кнопка нажата!" << std::endl;
}
});
// 5. Главный цикл
while (true) {
win.update(); // Обработка событий X11 и отрисовка
// Добавьте std::this_thread::sleep_for для экономии CPU
}
return 0;
}
🏛 Архитектура
Библиотека построена на строгой иерархии:
| Уровень | Класс | Описание |
|---|---|---|
| 1 | gui::window | Управляет соединением с X11, главным циклом (`update`) и вкладками. |
| 2 | gui::page | Представляет собой вкладку или экран. Наследуется от combat. |
| 3 | gui::combat | Базовый контейнер. Хранит коллекцию виджетов и предоставляет фабричные методы для их создания. |
| 4 | gui::Widget | Конкретный элемент интерфейса (кнопка, ввод, слайдер). Также наследуется от combat, позволяя создавать вложенные структуры (например, деревья). |
📡 EventBus
Глобальная шина событий для слабой связи между компонентами. Реализована как Singleton.
// Подписка на событие
int token = gui::EventBus::get().on("slider.change", [](const gui::EventData& e) {
std::cout << "Widget: " << e.source_id << ", Value: " << e.value << std::endl;
});
// Генерация события (обычно делается внутри библиотеки, но можно и вручную)
gui::EventBus::get().emit("custom.event", {"widget_id", "some text", 0.5f, 0, true});
// Отписка
gui::EventBus::get().off(token);
Структура EventData содержит: source_id (ID виджета), text, value (для слайдеров/прогресса), index (для списков), flag (для чекбоксов).
🎨 RawPicture
Класс для программного рендеринга в буфер. Поддерживает 8, 16, 24 и 32-битные форматы.
- Примитивы:
drawLine,fillRect,drawCircle,fillPolygon,drawText. - Загрузка:
load("image.bmp")илиload("image.ppm"). - Отображение:
present(display, window, gc, x, y)для вывода на экран X11.
🧩 Доступные виджеты
Все виджеты создаются через методы класса combat (или page) путем передачи структуры WidgetData.
| Метод | Тип | Описание |
|---|---|---|
Button() | BUTTON | Стандартная кнопка. Поддерживает on_page_click и on_window_click. |
Label() | LABEL | Текстовая метка. |
Input() | INPUT | Поле ввода текста. Перехватывает фокус клавиатуры. |
Checkbox() | CHECKBOX | Флажок. Состояние в data.checked. |
Radiobutton() | RADIO | Радиокнопка. Автоматически снимает выделение с других радио-кнопок с тем же id на странице. |
Slider() | SLIDER | Ползунок. Значение 0.0 - 1.0 в data.value. Поддерживает перетаскивание. |
Progressbar() | PROGRESS | Индикатор прогресса. Поддерживает анимацию indeterminate. |
Listbox() | LISTBOX | Список элементов. Элементы задаются через data.items. |
Dropdown() | DROPDOWN | Выпадающий список с анимацией открытия. |
TreeView() | TREE_VIEW | Контейнер для древовидной структуры. Использует TreeNode как детей. |
ScrollView() | SCROLL | Область с прокруткой содержимого. |
RawPictureWidget() | RAW_PIC | Отображает объект RawPicture из data.picture. |
📚 API Справочник: gui::window
window(std::string title)
Конструктор. Инициализирует соединение с X11, создает окно заданного размера (по умолчанию 1200x600) и настраивает маску событий.
void update()
Главный метод цикла. Обрабатывает все накопленные события X11, обновляет анимации виджетов (tick), очищает окно и перерисовывает вкладки и активную страницу. Должен вызываться постоянно.
void addPAGE(std::string name) / void configur_page(...)
addPAGE создает пустую страницу. configur_page создает (если нет), применяет лямбда-функцию для наполнения виджетами и может сделать её активной (active = true).
void openPAGE(std::string name)
Делает указанную страницу активной, деактивируя остальные. Генерирует событие "page.open".
📚 API Справочник: gui::combat
Базовый класс для контейнеров. Все методы создания виджетов возвращают ссылку на созданный Widget, что позволяет сохранять его для последующего изменения.
Фабричные методы (Button, Label, Input и т.д.)
Принимают объект WidgetData. Автоматически устанавливают соответствующий WidgetType, добавляют виджет во внутренний вектор и возвращают на него ссылку.
Widget* find(const std::string& id)
Рекурсивный поиск виджета по его уникальному идентификатору id внутри контейнера и всех его дочерних элементов.
void visit(const std::function& fn)
Применяет переданную лямбда-функцию ко всем виджетам в иерархии. Удобно для массовой модификации (например, отключения всех кнопок).
📚 API Справочник: gui::Widget
void setValue(float v) / float getValue()
Устанавливает целевое значение. Для прогресс-баров и слайдеров это запускает плавную анимацию изменения data.value к data.target_value внутри метода tick().
Анимация и состояние
Виджет содержит поля anim (для dropdown), phase (для неопределенного прогресса). Метод tick(float dt) автоматически вызывается из window::update() и интерполирует значения.
💡 Советы и лучшие практики
- Производительность: Библиотека использует программный рендеринг (CPU). Для сложных сцен избегайте частого пересоздания
RawPicture. Используйтеblitдля кеширования отрисовки. - ID Виджетов: Всегда задавайте уникальное поле
idвWidgetData, если планируете обращаться к виджету позже или слушать его события. - Вложенность: Виджеты
TreeViewиScrollViewпредназначены для содержания других виджетов. Добавляйте их через стандартные методы, они будут учитываться при расчете высоты контента и прокрутки. - Цвета: Указываются в формате HEX (например,
0xFF0000для красного). Библиотека автоматически преобразует их в формат пикселей X11 при отрисовке.