253 lines
7.9 KiB
Markdown
253 lines
7.9 KiB
Markdown
# X11 GUI Library
|
||
|
||
Легковесная 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<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
|
||

|
||

|
||

|
||
```
|
||

|
||
```
|
||
|
||
3. **Wiki** - на GitHub/GitLab можно создать отдельную Wiki для расширенной документации
|
||
|
||
4. **GitHub Pages** - можно сгенерировать HTML документацию (как я сделал выше) и разместить на GitHub Pages
|
||
|
||
Нужна помощь с чем-то конкретным из этого? |