-
-

Документация GUI Библиотеки

-

Легковесная, кроссплатформенная (X11) библиотека для создания графических интерфейсов на C++. Поддерживает программный рендеринг, анимации, иерархию виджетов и событийно-ориентированную архитектуру.

-
- -
-

🚀 Быстрый старт

-

Минимальный пример создания окна с кнопкой и обработкой события.

-
-
- main.cpp - -
-
#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;
-}
-
-
- -
-

🏛 Архитектура

-

Библиотека построена на строгой иерархии:

- - - - - - - - - - -
УровеньКлассОписание
1gui::windowУправляет соединением с X11, главным циклом (`update`) и вкладками.
2gui::pageПредставляет собой вкладку или экран. Наследуется от combat.
3gui::combatБазовый контейнер. Хранит коллекцию виджетов и предоставляет фабричные методы для их создания.
4gui::WidgetКонкретный элемент интерфейса (кнопка, ввод, слайдер). Также наследуется от combat, позволяя создавать вложенные структуры (например, деревья).
-
- -
-

📡 EventBus

-

Глобальная шина событий для слабой связи между компонентами. Реализована как Singleton.

-
-
Использование EventBus
-
// Подписка на событие
-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-битные форматы.

- -
- -
-

🧩 Доступные виджеты

-

Все виджеты создаются через методы класса 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() и интерполирует значения.

-
-
-
- -
-

💡 Советы и лучшие практики

- -
- - -