+
+

Документация 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-битные форматы.

+
    +
  • Примитивы: 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 при отрисовке.
  • +
+
+ +
+

Сгенерировано для X11 C++ GUI Library. 2026

+
+