gui/README.md
2026-08-23 17:57:34 +00:00

7.9 KiB
Raw Blame History

X11 GUI Library

Легковесная GUI библиотека для C++ с использованием X11.

Возможности

  • Программный рендеринг виджетов
  • Событийно-ориентированная архитектура (EventBus)
  • Поддержка анимаций
  • Иерархия виджетов
  • Работа с изображениями (BMP, PPM)

📦 Установка

git clone https://github.com/yourusername/gui.git
cd gui
mkdir build && cd build
cmake ..
make

🎯 Быстрый старт

#include "gui.h"

int main() {
    gui::window win("Мое Приложение");
    
    win.addPAGE("main");
    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;
        
        p.Button(btnData);
    }, true);

    gui::EventBus::get().on("button.click", [](const gui::EventData& e) {
        std::cout << "Button clicked: " << e.source_id << std::endl;
    });

    while (true) {
        win.update();
    }
    
    return 0;
}

📚 API Документация

Основные классы

gui::window

Основное окно приложения.

Методы:

  • window(std::string title) - создание окна
  • void update() - главный цикл обработки событий
  • void addPAGE(std::string name) - добавление страницы
  • void configur_page(std::string name, callback_page fn, bool active) - настройка страницы
  • void openPAGE(std::string name) - открытие страницы

gui::page

Страница/вкладка с виджетами.

Методы создания виджетов:

  • Button(WidgetData data) - кнопка
  • Label(WidgetData data) - текстовая метка
  • Input(WidgetData data) - поле ввода
  • Checkbox(WidgetData data) - флажок
  • Slider(WidgetData data) - ползунок
  • Progressbar(WidgetData data) - индикатор прогресса
  • Listbox(WidgetData data) - список
  • Dropdown(WidgetData data) - выпадающий список
  • TreeView(WidgetData data) - дерево
  • RawPictureWidget(WidgetData data) - изображение

gui::WidgetData

Структура данных для настройки виджета.

struct WidgetData {
    WidgetType type;           // Тип виджета
    std::string text;          // Текст
    std::string id;            // Уникальный ID
    unsigned long bg_color;    // Цвет фона (0xRRGGBB)
    unsigned long fg_color;    // Цвет текста
    int x, y;                  // Позиция
    int width, height;         // Размеры
    bool checked;              // Состояние (для checkbox/radio)
    float value;               // Значение (для slider/progress)
    std::vector<std::string> items; // Элементы списка
    callback_void on_change;   // Callback при изменении
};

gui::EventBus

Система событий.

Методы:

  • static EventBus& get() - получение экземпляра
  • int on(const std::string& event, Handler h) - подписка на событие
  • void off(int token) - отписка
  • void emit(const std::string& event, EventData data) - генерация события

События виджетов:

  • "button.click" - нажатие кнопки
  • "slider.change" - изменение слайдера
  • "checkbox.change" - изменение чекбокса
  • "list.select" - выбор элемента списка
  • "dropdown.select" - выбор из выпадающего списка
  • "input.submit" - отправка ввода (Enter)

gui::RawPicture

Класс для работы с изображениями.

Методы:

  • void create(int w, int h, int bits) - создание буфера
  • void setPixel(int x, int y, uint32_t color) - установка пикселя
  • void drawLine(...) - рисование линии
  • void fillRect(...) - заполнение прямоугольника
  • void drawCircle(...) - рисование круга
  • void fillCircle(...) - заполнение круга
  • void drawText(...) - рисование текста
  • bool load(const std::string& path) - загрузка BMP/PPM
  • void present(...) - вывод на экран

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

Виджет Описание
Button Кнопка с текстом или изображением
Label Текстовая метка
Input Поле ввода текста
Checkbox Флажок (вкл/выкл)
Radio Радиокнопка
Slider Ползунок (0.0 - 1.0)
Progressbar Индикатор прогресса
Listbox Список с прокруткой
Dropdown Выпадающий список
TreeView Древовидная структура
ScrollView Область прокрутки
RawPicture Отображение изображения

Требования

  • X11
  • C++17 или выше
  • CMake 3.10+

Примеры

Создание кнопки

gui::WidgetData btn;
btn.id = "start_btn";
btn.text = "Старт";
btn.x = 100;
btn.y = 100;
btn.width = 120;
btn.height = 40;
btn.bg_color = 0x2563EB;  // Синий
btn.fg_color = 0xFFFFFF;  // Белый текст

page.Button(btn);

Работа с событиями

gui::EventBus::get().on("button.click", [](const gui::EventData& e) {
    if (e.source_id == "start_btn") {
        std::cout << "Start button clicked!" << std::endl;
    }
});

Создание слайдера

gui::WidgetData slider;
slider.id = "volume";
slider.type = gui::WidgetType::SLIDER;
slider.x = 50;
slider.y = 200;
slider.width = 200;
slider.height = 20;
slider.value = 0.5;  // 50%

gui::EventBus::get().on("slider.change", [](const gui::EventData& e) {
    std::cout << "Volume: " << (e.value * 100) << "%" << std::endl;
});

page.Slider(slider);

Структура проекта

gui/
├── include/
│   └── gui.h           # Заголовочный файл
── src/
│   └── gui.cpp         # Реализация
├── examples/
│   └── basic.cpp       # Пример использования
├── CMakeLists.txt
└── README.md

🤝 Contributing

  1. Fork репозиторий
  2. Создайте ветку (git checkout -b feature/AmazingFeature)
  3. Закоммитьте изменения (git commit -m 'Add some AmazingFeature')
  4. Отправьте в ветку (git push origin feature/AmazingFeature)
  5. Откройте Pull Request

📄 Лицензия

Распространяется под лицензией MIT.

👥 Авторы

  • Your Name - Initial work

🙏 Благодарности

  • X11 library
  • Все, кто тестировал и помогал с разработкой

## 🎯 Что еще можно добавить:

1. ** badges** в начало README:
```markdown
![Platform](https://img.shields.io/badge/platform-Linux-blue)
![License](https://img.shields.io/badge/license-MIT-green)
![C++](https://img.shields.io/badge/C++-17-blue)

Demo


3. **Wiki** - на GitHub/GitLab можно создать отдельную Wiki для расширенной документации

4. **GitHub Pages** - можно сгенерировать HTML документацию (как я сделал выше) и разместить на GitHub Pages

Нужна помощь с чем-то конкретным из этого?