From 237adfcddf4f86ddf556cfd16e92ffb1dc12cb19 Mon Sep 17 00:00:00 2001 From: KoDer Date: Sun, 23 Aug 2026 17:57:34 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 254 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 252 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 93e09a3..0768bd7 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,253 @@ -# gui +# X11 GUI Library -Lightweight X11 GUI library for C++ with widget system and event handling \ No newline at end of file +Легковесная GUI библиотека для C++ с использованием X11. + +## Возможности + +- Программный рендеринг виджетов +- Событийно-ориентированная архитектура (EventBus) +- Поддержка анимаций +- Иерархия виджетов +- Работа с изображениями (BMP, PPM) + +## 📦 Установка + +```bash +git clone https://github.com/yourusername/gui.git +cd gui +mkdir build && cd build +cmake .. +make +``` + +## 🎯 Быстрый старт + +```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 + +Нужна помощь с чем-то конкретным из этого? \ No newline at end of file