# X11 GUI Library Легковесная GUI библиотека для C++ с использованием X11. ## Возможности - Программный рендеринг виджетов - Событийно-ориентированная архитектура (EventBus) - Поддержка анимаций - Иерархия виджетов - Работа с изображениями (BMP, PPM) ## 🎯 Быстрый старт ```cpp #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 Структура данных для настройки виджета. ```cpp 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 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+ ## Примеры ### Создание кнопки ```cpp 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); ``` ### Работа с событиями ```cpp gui::EventBus::get().on("button.click", [](const gui::EventData& e) { if (e.source_id == "start_btn") { std::cout << "Start button clicked!" << std::endl; } }); ``` ### Создание слайдера ```cpp 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](screenshots/demo.png) ``` 3. **Wiki** - на GitHub/GitLab можно создать отдельную Wiki для расширенной документации 4. **GitHub Pages** - можно сгенерировать HTML документацию (как я сделал выше) и разместить на GitHub Pages Нужна помощь с чем-то конкретным из этого?