π X11 GUI Library
Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½Π°Ρ GUI Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ C++ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ X11, ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΠ΅ΡΠ΅Π· ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΡΡΠΎΠ²Π½Ρ Android Studio.
β¨ ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
Dirty Rectangles
ΠΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠ° ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΡ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ. Π£ΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ Π² 5-50 ΡΠ°Π·.
ΠΠ²ΠΎΠΉΠ½Π°Ρ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ
ΠΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°Π½ΠΈΡ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ backbuffer ΡΠ΅ΡΠ΅Π· X11 Pixmap.
Android Debug
ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ dirty rects, Π³ΡΠ°Π½ΠΈΡ Π²ΠΈΠ΄ΠΆΠ΅ΡΠΎΠ², ΠΌΠ°ΡΠΊΠ΅ΡΡ ΠΊΠ»ΠΈΠΊΠΎΠ².
EventBus
Π‘Π»Π°Π±ΠΎΠ΅ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ±ΡΡΠΈΠΉ.
ΠΠ½ΠΈΠΌΠ°ΡΠΈΠΈ
ΠΠ»Π°Π²Π½ΡΠ΅ dropdown ΠΈ progress bar Ρ ease-ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ.
ΠΠ΅ΡΠ°ΡΡ ΠΈΡ
TreeView, ScrollView, Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π²ΠΈΠ΄ΠΆΠ΅ΡΡ.
π ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ
#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 ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠΊΡΠ°Π½Π°. ΠΠΎΠ³Π΄Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, ΠΎΠ½ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΡΠ²ΠΎΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΊΠ°ΠΊ "Π³ΡΡΠ·Π½ΡΡ", ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ.
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
- ΠΠΈΠ΄ΠΆΠ΅Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ
mark_dirty()ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ - ΠΠ±Π»Π°ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Π²
DirtyRegion - ΠΡΠΈ
window::update()ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΡΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ dirty-ΠΎΠ±Π»Π°ΡΡΠΈ XCopyAreaΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½ΡΠΆΠ½ΡΠ΅ ΡΠ΅Π³ΠΈΠΎΠ½Ρ ΠΈΠ· backbuffer
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΊΠ°ΠΊ dirty:
- Dropdown - Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΎΡΠΊΡΡΡΠΈΡ/Π·Π°ΠΊΡΡΡΠΈΡ
- Progressbar - ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π² indeterminate-ΡΠ΅ΠΆΠΈΠΌΠ΅
- Slider - Π²ΠΎ Π²ΡΠ΅ΠΌΡ drag
- Input - ΠΏΡΠΈ Π²Π²ΠΎΠ΄Π΅ ΡΠ΅ΠΊΡΡΠ°
- Expose events - ΠΏΡΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΎΠΊΠ½Π° ΠΈΠ·-ΠΏΠΎΠ΄ Π΄ΡΡΠ³ΠΎΠ³ΠΎ
- Resize - Π²Π΅ΡΡ ΡΠΊΡΠ°Π½ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΎΠΊΠ½Π°
π¨ ΠΠ²ΠΎΠΉΠ½Π°Ρ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ
ΠΡΡ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π² off-screen Pixmap (backbuffer), Π·Π°ΡΠ΅ΠΌ Π½ΡΠΆΠ½ΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΊΠΎΠΏΠΈΡΡΡΡΡΡ Π² ΠΎΠΊΠ½ΠΎ ΡΠ΅ΡΠ΅Π· XCopyArea. ΠΡΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠ±ΠΈΡΠ°Π΅Ρ ΠΌΠ΅ΡΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΈ Π°Π½ΠΈΠΌΠ°ΡΠΈΡΡ
.
// 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-ΠΊΠ»Π°Π²ΠΈΡΠΈ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΆΠΈΠΌΠΎΠ² ΠΎΡΠ»Π°Π΄ΠΊΠΈ:
π 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
ΠΠ»ΠΎΠ±Π°Π»ΡΠ½Π°Ρ ΡΠΈΠ½Π° ΡΠΎΠ±ΡΡΠΈΠΉ Π΄Π»Ρ ΡΠ»Π°Π±ΠΎΠΉ ΡΠ²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ΅ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΡΠΎΠ±ΡΡΠΈΠΉ.
// ΠΠΎΠ΄ΠΏΠΈΡΠΊΠ°
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 | ΠΡΠ±ΠΎΡ Π² dropdown | source_id, text, index |
tree.toggle | Π Π°ΡΠΊΡΡΡΠΈΠ΅ ΡΠ·Π»Π° | source_id, text, flag |
input.submit | Enter Π² Input | source_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) ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π²ΡΠ΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ.