7.9 KiB
7.9 KiB
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/PPMvoid 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
- Fork репозиторий
- Создайте ветку (
git checkout -b feature/AmazingFeature) - Закоммитьте изменения (
git commit -m 'Add some AmazingFeature') - Отправьте в ветку (
git push origin feature/AmazingFeature) - Откройте Pull Request
📄 Лицензия
Распространяется под лицензией MIT.
👥 Авторы
- Your Name - Initial work
🙏 Благодарности
- X11 library
- Все, кто тестировал и помогал с разработкой
## 🎯 Что еще можно добавить:
1. ** badges** в начало README:
```markdown



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