πŸ“˜ X11 GUI Library

БоврСмСнная лСгковСсная GUI Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для C++ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ X11, оптимизированная для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‡Π΅Ρ€Π΅Π· систСму частичной пСрСрисовки ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ инструмСнты ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ уровня Android Studio.

πŸ’‘ ВСрсия 2.0 - Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹: Dirty Rectangles, Android-style ΠΎΡ‚Π»Π°Π΄ΠΊΠ°, двойная буфСризация, ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Ρ‹ ΠΊΠ»ΠΈΠΊΠΎΠ², визуализация Π³Ρ€Π°Π½ΠΈΡ† Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ².

✨ ВозмоТности

⚑

Dirty Rectangles

ΠŸΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²ΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Ρ… областСй. УскорСниС Π² 5-50 Ρ€Π°Π·.

🎨

Двойная буфСризация

Никакого мСрцания благодаря backbuffer Ρ‡Π΅Ρ€Π΅Π· X11 Pixmap.

πŸ”

Android Debug

Визуализация dirty rects, Π³Ρ€Π°Π½ΠΈΡ† Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Ρ‹ ΠΊΠ»ΠΈΠΊΠΎΠ².

πŸ“‘

EventBus

Π‘Π»Π°Π±ΠΎΠ΅ связываниС Ρ‡Π΅Ρ€Π΅Π· Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΡˆΠΈΠ½Ρƒ событий.

🎭

Анимации

ΠŸΠ»Π°Π²Π½Ρ‹Π΅ dropdown ΠΈ progress bar с ease-функциями.

πŸ“¦

Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ

TreeView, ScrollView, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹.

πŸš€ Быстрый старт

main.cpp
#include "gui.h"

int main() {
    gui::window win("My App");
    
    win.addPAGE("main");
    win.configur_page("main", [](gui::page& p) {
        gui::WidgetData btn;
        btn.id = "start_btn";
        btn.text = "Start";
        btn.x = 50; btn.y = 50;
        btn.width = 150; btn.height = 40;
        btn.bg_color = 0x2563EB;
        p.Button(btn);
    }, true);

    // Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ всС Ρ€Π΅ΠΆΠΈΠΌΡ‹ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ
    win.debug().show_debug_overlay = true;
    win.debug().show_dirty_rects = true;
    win.debug().log_to_console = true;

    gui::EventBus::get().on("button.click", [](const gui::EventData& e) {
        std::cout << "Clicked: " << e.source_id << "\n";
    });

    while (true) {
        win.update();
    }
    return 0;
}

⚑ Dirty Rectangles NEW

БистСма частичной пСрСрисовки DirtyRegion отслСТиваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Π΅ области экрана. Когда Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ мСняСт состояниС, ΠΎΠ½ ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ свою ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΠ°ΠΊ "Π³Ρ€ΡΠ·Π½ΡƒΡŽ", ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° пСрСрисовываСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эти области.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

  1. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ mark_dirty() ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ
  2. ΠžΠ±Π»Π°ΡΡ‚ΡŒ добавляСтся Π² DirtyRegion
  3. ΠŸΡ€ΠΈ window::update() ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ dirty-области
  4. XCopyArea ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ ΠΈΠ· backbuffer
πŸ“Š Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: Для интСрфСйса с 100 Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ, Π³Π΄Π΅ мСняСтся 1 элСмСнт, CPU Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° сниТаСтся Π² 50+ Ρ€Π°Π·.

АвтоматичСскоС отслСТиваниС

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° автоматичСски ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ ΠΊΠ°ΠΊ dirty:

🎨 Двойная буфСризация

Вся отрисовка происходит Π² off-screen Pixmap (backbuffer), Π·Π°Ρ‚Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹Π΅ области ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΎΠΊΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· XCopyArea. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ ΠΌΠ΅Ρ€Ρ†Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ анимациях.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ backbuffer
// 1. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ backbuffer ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
backbuffer = XCreatePixmap(dpy, win, width, height, depth);

// 2. Вся отрисовка ΠΈΠ΄Ρ‘Ρ‚ Π² backbuffer
XFillRectangle(dpy, backbuffer, gc, ...);
XDrawString(dpy, backbuffer, gc, ...);

// 3. ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ dirty-Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ Π² ΠΎΠΊΠ½ΠΎ
for (auto& rect : dirty_rects) {
    XCopyArea(dpy, backbuffer, window, gc,
              rect.x, rect.y, rect.width, rect.height,
              rect.x, rect.y);
}

⌨️ ГорячиС клавиши ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ NEW

Π’ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ F-клавиши для ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ:

F1
Toggle Debug Overlay - FPS, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΌΡ‹ΡˆΠΈ, Π»ΠΎΠ³ событий
F2
Toggle Dirty Rectangles - ΠΌΠΈΠ³Π°Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Ρ… областСй (Android-style)
F3
Toggle Click Markers - красныС крСстики Π² мСстах ΠΊΠ»ΠΈΠΊΠ°
F4
Toggle Widget Bounds - Ρ€ΠΎΠ·ΠΎΠ²Ρ‹Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ всСх Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ²
F5
Toggle Console Logging - Π²Ρ‹Π²ΠΎΠ΄ событий Π² stdout
πŸ’‘ Π‘ΠΎΠ²Π΅Ρ‚: Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ F2 ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ - Π²Ρ‹ сразу ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ области ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ смоТСтС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ UI.

πŸ“Š Debug Overlay

ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ F1 Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ появляСтся панСль с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ:

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅
FPSΠ’Π΅ΠΊΡƒΡ‰ΠΈΠΉ FPS (обновляСтся ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 0.5 сСк)
WidgetsΠžΠ±Ρ‰Π΅Π΅ количСство Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π½Π° всСх страницах
Partial updatesΠ‘Ρ‡Ρ‘Ρ‚Ρ‡ΠΈΠΊ частичных ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ (ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ dirty rects)
MouseΠ’Π΅ΠΊΡƒΡ‰ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΌΡ‹ΡˆΠΈ
Event LogПослСдниС 5 событий с ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ

πŸ”§ API ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅
gui::window win("App");

// ΠŸΡ€ΡΠΌΠΎΠΉ доступ ΠΊ настройкам ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ
win.debug().show_debug_overlay = true;
win.debug().show_dirty_rects = true;
win.debug().show_click_markers = true;
win.debug().show_widget_bounds = true;
win.debug().log_to_console = true;

// Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π»ΠΎΠ³Π°
win.debug().max_log_size = 30;

// Π ΡƒΡ‡Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ dirty region
win.mark_dirty(100, 100, 200, 50);  // ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ
win.mark_all_dirty();                // ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ вСсь экран

// Π§Ρ‚Π΅Π½ΠΈΠ΅ состояния ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ
std::cout << "FPS: " << win.debug().fps << "\n";
std::cout << "Mouse: " << win.debug().mouse_x 
          << "," << win.debug().mouse_y << "\n";

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° DebugInfo

struct DebugInfo {
    int fps;                    // Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ FPS
    int widget_count;           // количСство Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ²
    int partial_updates;        // счётчик dirty updates
    int mouse_x, mouse_y;       // ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΌΡ‹ΡˆΠΈ
    
    bool show_debug_overlay;    // F1
    bool show_dirty_rects;      // F2
    bool show_click_markers;    // F3
    bool show_widget_bounds;    // F4
    bool log_to_console;        // F5
    
    std::deque<std::string> log;  // Π»ΠΎΠ³ событий
    size_t max_log_size;          // макс Ρ€Π°Π·ΠΌΠ΅Ρ€ Π»ΠΎΠ³Π°
};

πŸ“‘ EventBus

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ шина событий для слабой связи ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ глобальноС Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх событий.

Π Π°Π±ΠΎΡ‚Π° с EventBus
// Подписка
int token = gui::EventBus::get().on("button.click", [](const gui::EventData& e) {
    std::cout << "Button: " << e.source_id << "\n";
});

// ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ°
gui::EventBus::get().emit("custom.event", {
    "widget_id",     // source_id
    "text value",    // text
    0.5f,            // value
    3,               // index
    true             // flag
});

// ΠžΡ‚ΠΏΠΈΡΠΊΠ°
gui::EventBus::get().off(token);

ВстроСнныС события

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ΠšΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚Π”Π°Π½Π½Ρ‹Π΅
button.clickНаТатиС ΠΊΠ½ΠΎΠΏΠΊΠΈsource_id, text
checkbox.changeИзмСнСниС чСкбоксаsource_id, text, flag
radio.changeΠ’Ρ‹Π±ΠΎΡ€ Ρ€Π°Π΄ΠΈΠΎ-ΠΊΠ½ΠΎΠΏΠΊΠΈsource_id, text, flag
slider.changeΠ”Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ слайдСраsource_id, value (0-1)
list.selectΠ’Ρ‹Π±ΠΎΡ€ Π² спискСsource_id, text, index
dropdown.selectΠ’Ρ‹Π±ΠΎΡ€ Π² dropdownsource_id, text, index
tree.toggleРаскрытиС ΡƒΠ·Π»Π°source_id, text, flag
input.submitEnter Π² Inputsource_id, text
page.openΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ страницыsource_id (name)

🎨 RawPicture

Класс для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ 8/16/24/32 Π±ΠΈΡ‚Π°, Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ BMP ΠΈ PPM, ΠΈ всС Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
auto pic = std::make_shared<gui::RawPicture>(200, 200);

pic->clear(0x1A1A1A);
pic->fillCircle(100, 100, 50, 0xFF0000);
pic->drawText(display, 80, 95, "Hello", 0xFFFFFF);

gui::WidgetData w;
w.id = "image";
w.x = 50; w.y = 150;
w.width = 200; w.height = 200;
w.picture = pic;
page.RawPictureWidget(w);

ДоступныС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹

ΠœΠ΅Ρ‚ΠΎΠ΄ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅
clear(color)ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Ρ†Π²Π΅Ρ‚ΠΎΠΌ
drawLine(x0,y0,x1,y1,c)Линия (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π‘Ρ€Π΅Π·Π΅Π½Ρ…Π΅ΠΌΠ°)
drawRect/fillRect(...)ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ
drawCircle/fillCircle(...)ΠžΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ/ΠΊΡ€ΡƒΠ³
drawTriangle/fillTriangle(...)Π’Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ
drawPolygon/fillPolygon(...)ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½
drawText(...)ВСкст (X11 ΡˆΡ€ΠΈΡ„Ρ‚ с ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ)
load(path)Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° BMP ΠΈΠ»ΠΈ PPM
blit(src,dx,dy)ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ RawPicture

🧩 Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹

ВсС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса combat с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ структуры WidgetData.

ΠœΠ΅Ρ‚ΠΎΠ΄Π’ΠΈΠΏΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅
Button(d)BUTTONКнопка
Label(d)LABELВСкстовая ΠΌΠ΅Ρ‚ΠΊΠ°
Input(d)INPUTПолС ввода
Checkbox(d)CHECKBOXΠ€Π»Π°ΠΆΠΎΠΊ
Radiobutton(d)RADIOΠ Π°Π΄ΠΈΠΎ-ΠΊΠ½ΠΎΠΏΠΊΠ°
Slider(d)SLIDERΠŸΠΎΠ»Π·ΡƒΠ½ΠΎΠΊ 0-1
Progressbar(d)PROGRESSΠŸΡ€ΠΎΠ³Ρ€Π΅ΡΡ-Π±Π°Ρ€
Listbox(d)LISTBOXБписок
Dropdown(d)DROPDOWNΠ’Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ список
TreeView(d)TREE_VIEWΠ”Π΅Ρ€Π΅Π²ΠΎ
TreeNode(d)TREEΠ£Π·Π΅Π» Π΄Π΅Ρ€Π΅Π²Π°
ScrollView(d)SCROLLΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΎΠΉ
RawPictureWidget(d)RAW_PICΠ˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
SpriteButton(d)SPRITE_BTNКнопка со спрайтом

πŸ“š API: gui::window

window(std::string title)

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€. Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ X11 ΠΎΠΊΠ½ΠΎ 1200x600, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ backbuffer, настраиваСт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ EventBus.

void update()

Π“Π»Π°Π²Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ†ΠΈΠΊΠ»Π°. ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ X11 события, обновляСт Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, пСрСрисовываСт dirty regions, обновляСт debug overlay. Π”ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ постоянно.

void addPAGE(name) / configur_page(...)

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ настройка страниц с Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· callback.

void openPAGE(name)

ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ страницы. ΠŸΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ вСсь экран ΠΊΠ°ΠΊ dirty.

DebugInfo& debug() NEW

Доступ ΠΊ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ: FPS, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹, Ρ€Π΅ΠΆΠΈΠΌΡ‹, Π»ΠΎΠ³ событий.

void mark_dirty(x,y,w,h) / mark_all_dirty() NEW

Π ΡƒΡ‡Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ dirty region для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ пСрСрисовки.

πŸ“š API: gui::page

НаслСдуСтся ΠΎΡ‚ combat, прСдоставляСт всС Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для создания Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ². Π˜ΠΌΠ΅Π΅Ρ‚ поля width, height, active.

πŸ“š API: gui::combat

Π€Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

14 ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для создания Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ²: Button, Label, Input, Checkbox, Radiobutton, Slider, Progressbar, Listbox, Dropdown, TreeView, TreeNode, ScrollView, RawPictureWidget, SpriteButton.

Widget* find(const std::string& id)

РСкурсивный поиск Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΏΠΎ ID Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ.

void visit(fn)

ΠžΠ±Ρ…ΠΎΠ΄ всСх Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

int count_widgets() NEW

РСкурсивный подсчёт всСх Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ.

πŸ“š API: gui::Widget

void setValue(float v) / getValue()

Установка Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ значСния с ΠΏΠ»Π°Π²Π½ΠΎΠΉ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°.

void mark_dirty(dirty, ox, oy) NEW

ΠŸΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΊΠ°ΠΊ dirty для частичной пСрСрисовки.

АвтоматичСская оптимизация

ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ состояния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ сам ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ свою ΠΎΠ±Π»Π°ΡΡ‚ΡŒ. Для составных Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² (dropdown с popup) ΠΏΠΎΠΌΠ΅Ρ‡Π°ΡŽΡ‚ΡΡ всС связанныС области.