gui/README.md
2026-08-23 19:54:10 +00:00

243 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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<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+
## Примеры
### Создание кнопки
```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
Нужна помощь с чем-то конкретным из этого?