From fd308f9a3a55537f9764cb0c94d8127b2188b102 Mon Sep 17 00:00:00 2001 From: Ilia Demianenko Date: Fri, 29 Sep 2023 18:15:04 -0700 Subject: [PATCH] Zig UI demo --- samples/ui/src/main.c | 58 +- samples/zig-sample/README.md | 1 - samples/zig-sample/src/main.zig | 2 +- samples/zig-ui/.gitignore | 6 + samples/zig-ui/README.md | 13 + samples/zig-ui/build.zig | 107 ++ samples/zig-ui/data/OpenSans-Bold.ttf | Bin 0 -> 130864 bytes samples/zig-ui/data/OpenSans-Regular.ttf | Bin 0 -> 130836 bytes samples/zig-ui/src/main.zig | 870 ++++++++++++ src/orca.zig | 1563 +++++++++++++++++++++- src/ui/ui.c | 107 +- src/ui/ui.h | 14 - 12 files changed, 2633 insertions(+), 108 deletions(-) create mode 100644 samples/zig-ui/.gitignore create mode 100644 samples/zig-ui/README.md create mode 100644 samples/zig-ui/build.zig create mode 100644 samples/zig-ui/data/OpenSans-Bold.ttf create mode 100644 samples/zig-ui/data/OpenSans-Regular.ttf create mode 100644 samples/zig-ui/src/main.zig diff --git a/samples/ui/src/main.c b/samples/ui/src/main.c index 49c2fe8..7bcecdb 100644 --- a/samples/ui/src/main.c +++ b/samples/ui/src/main.c @@ -73,6 +73,12 @@ ORCA_EXPORT void oc_on_raw_event(oc_event* event) oc_ui_process_event(event); } +ORCA_EXPORT void oc_on_resize(u32 width, u32 height) +{ + frameSize.x = width; + frameSize.y = height; +} + void log_push(const char* line) { oc_str8_list_push(&logArena, &logLines, (oc_str8)OC_STR8(line)); @@ -158,12 +164,6 @@ void labeled_slider(const char* label, f32* value) } } -ORCA_EXPORT void oc_on_resize(u32 width, u32 height) -{ - frameSize.x = width; - frameSize.y = height; -} - void reset_next_radio_group_to_dark_theme(oc_arena* arena); ORCA_EXPORT void oc_on_frame_refresh(void) @@ -330,7 +330,7 @@ ORCA_EXPORT void oc_on_frame_refresh(void) radioSelected = result.selectedIndex; if(result.changed) { - log_pushf("Selected Radio %i", result.selectedIndex + 1); + log_pushf("Selected %s", options[result.selectedIndex].ptr); } //----------------------------------------------------------------------------- @@ -359,13 +359,13 @@ ORCA_EXPORT void oc_on_frame_refresh(void) .size.height = { OC_UI_SIZE_TEXT } }, OC_UI_STYLE_SIZE); static oc_str8 text = OC_STR8_LIT("Text box"); - oc_ui_text_box_result res = oc_ui_text_box("text", scratch.arena, text); - if(res.changed) + oc_ui_text_box_result result = oc_ui_text_box("text", scratch.arena, text); + if(result.changed) { oc_arena_clear(&textArena); - text = oc_str8_push_copy(&textArena, res.text); + text = oc_str8_push_copy(&textArena, result.text); } - if(res.accepted) + if(result.accepted) { log_pushf("Entered text \"%s\"", text.ptr); } @@ -465,7 +465,7 @@ ORCA_EXPORT void oc_on_frame_refresh(void) oc_ui_style_next(&(oc_ui_style){ .size.width = { OC_UI_SIZE_PARENT, 1 }, .size.height = { OC_UI_SIZE_PIXELS, 152 }, - .layout.margin.x = 320, + .layout.margin.x = 310, .layout.margin.y = 16, .bgColor = OC_UI_DARK_THEME.bg0, .roundness = OC_UI_DARK_THEME.roundnessSmall }, @@ -527,8 +527,8 @@ ORCA_EXPORT void oc_on_frame_refresh(void) | OC_UI_STYLE_BG_COLOR | OC_UI_STYLE_ROUNDNESS); - oc_ui_pattern labelPattern = { 0 }; oc_ui_tag labelTag = oc_ui_tag_make("label"); + oc_ui_pattern labelPattern = { 0 }; oc_ui_pattern_push(scratch.arena, &labelPattern, (oc_ui_selector){ .kind = OC_UI_SEL_TAG, .tag = labelTag }); oc_ui_style_match_after(labelPattern, &(oc_ui_style){ .color = labelFontColor, @@ -818,32 +818,32 @@ ORCA_EXPORT void oc_on_frame_refresh(void) // You won't need it in a real program as long as your colors come from ui.theme or ui.theme->palette void reset_next_radio_group_to_dark_theme(oc_arena* arena) { - oc_ui_tag defaultTag = oc_ui_tag_make("radio"); - oc_ui_pattern defaultPattern = { 0 }; - oc_ui_pattern_push(arena, &defaultPattern, (oc_ui_selector){ .kind = OC_UI_SEL_TAG, .tag = defaultTag }); - oc_ui_style defaultStyle = { .borderColor = OC_UI_DARK_THEME.text3, - .borderSize = 1 }; - oc_ui_style_mask defaultMask = OC_UI_STYLE_BORDER_COLOR - | OC_UI_STYLE_BORDER_SIZE; - oc_ui_style_match_after(defaultPattern, &defaultStyle, defaultMask); + oc_ui_tag unselectedTag = oc_ui_tag_make("radio"); + oc_ui_pattern unselectedPattern = { 0 }; + oc_ui_pattern_push(arena, &unselectedPattern, (oc_ui_selector){ .kind = OC_UI_SEL_TAG, .tag = unselectedTag }); + oc_ui_style unselectedStyle = { .borderColor = OC_UI_DARK_THEME.text3, + .borderSize = 1 }; + oc_ui_style_mask unselectedMask = OC_UI_STYLE_BORDER_COLOR + | OC_UI_STYLE_BORDER_SIZE; + oc_ui_style_match_after(unselectedPattern, &unselectedStyle, unselectedMask); - oc_ui_pattern hoverPattern = { 0 }; - oc_ui_pattern_push(arena, &hoverPattern, (oc_ui_selector){ .kind = OC_UI_SEL_TAG, .tag = defaultTag }); - oc_ui_pattern_push(arena, &hoverPattern, (oc_ui_selector){ .op = OC_UI_SEL_AND, .kind = OC_UI_SEL_STATUS, .status = OC_UI_HOVER }); + oc_ui_pattern unselectedHoverPattern = { 0 }; + oc_ui_pattern_push(arena, &unselectedHoverPattern, (oc_ui_selector){ .kind = OC_UI_SEL_TAG, .tag = unselectedTag }); + oc_ui_pattern_push(arena, &unselectedHoverPattern, (oc_ui_selector){ .op = OC_UI_SEL_AND, .kind = OC_UI_SEL_STATUS, .status = OC_UI_HOVER }); oc_ui_style hoverStyle = { .bgColor = OC_UI_DARK_THEME.fill0, .borderColor = OC_UI_DARK_THEME.primary }; oc_ui_style_mask hoverMask = OC_UI_STYLE_BG_COLOR | OC_UI_STYLE_BORDER_COLOR; - oc_ui_style_match_after(hoverPattern, &hoverStyle, hoverMask); + oc_ui_style_match_after(unselectedHoverPattern, &hoverStyle, hoverMask); - oc_ui_pattern activePattern = { 0 }; - oc_ui_pattern_push(arena, &activePattern, (oc_ui_selector){ .kind = OC_UI_SEL_TAG, .tag = defaultTag }); - oc_ui_pattern_push(arena, &activePattern, (oc_ui_selector){ .op = OC_UI_SEL_AND, .kind = OC_UI_SEL_STATUS, .status = OC_UI_ACTIVE }); + oc_ui_pattern unselectedActivePattern = { 0 }; + oc_ui_pattern_push(arena, &unselectedActivePattern, (oc_ui_selector){ .kind = OC_UI_SEL_TAG, .tag = unselectedTag }); + oc_ui_pattern_push(arena, &unselectedActivePattern, (oc_ui_selector){ .op = OC_UI_SEL_AND, .kind = OC_UI_SEL_STATUS, .status = OC_UI_ACTIVE }); oc_ui_style activeStyle = { .bgColor = OC_UI_DARK_THEME.fill1, .borderColor = OC_UI_DARK_THEME.primary }; oc_ui_style_mask activeMask = OC_UI_STYLE_BG_COLOR | OC_UI_STYLE_BORDER_COLOR; - oc_ui_style_match_after(activePattern, &activeStyle, activeMask); + oc_ui_style_match_after(unselectedActivePattern, &activeStyle, activeMask); oc_ui_tag selectedTag = oc_ui_tag_make("radio_selected"); oc_ui_pattern selectedPattern = { 0 }; diff --git a/samples/zig-sample/README.md b/samples/zig-sample/README.md index 99b973c..5320304 100644 --- a/samples/zig-sample/README.md +++ b/samples/zig-sample/README.md @@ -9,6 +9,5 @@ These two commands build the runtime - the native host executable - and the samp ### Warning Zig bindings for Orca are in-progress and experimental. You may encounter bugs since not all the bound APIs have been tested extensively - this sample is currently the only code doing so! Additionally, not all APIs have zig coverage yet, notably: -* `oc_ui` * `gles` As more APIs get tested, there is a possibility of breaking changes. Please report any bugs you find on the Handmade discord in the #orca channel. diff --git a/samples/zig-sample/src/main.zig b/samples/zig-sample/src/main.zig index 27ba3db..a0ede41 100644 --- a/samples/zig-sample/src/main.zig +++ b/samples/zig-sample/src/main.zig @@ -205,7 +205,7 @@ export fn oc_on_frame_refresh() void { const text_rect = text_metrics.ink; const center_x = frame_size.x / 2; - const text_begin_x = center_x - text_rect.Flat.w / 2; + const text_begin_x = center_x - text_rect.w / 2; Mat2x3.push(Mat2x3.translate(text_begin_x, 100)); defer Mat2x3.pop(); diff --git a/samples/zig-ui/.gitignore b/samples/zig-ui/.gitignore new file mode 100644 index 0000000..ab6e6a5 --- /dev/null +++ b/samples/zig-ui/.gitignore @@ -0,0 +1,6 @@ +UI +zig-out +zig-cache +liborca.a +profile.dtrace +profile.spall diff --git a/samples/zig-ui/README.md b/samples/zig-ui/README.md new file mode 100644 index 0000000..5320304 --- /dev/null +++ b/samples/zig-ui/README.md @@ -0,0 +1,13 @@ +### Build and run +Zig version `0.11.0` or greater is required for this sample. To build and run: +``` +orca dev build-runtime +zig build run +``` + +These two commands build the runtime - the native host executable - and the sample as a loadable wasm library, then runs it. To only build the sample without running it, use `zig build bundle`. + +### Warning +Zig bindings for Orca are in-progress and experimental. You may encounter bugs since not all the bound APIs have been tested extensively - this sample is currently the only code doing so! Additionally, not all APIs have zig coverage yet, notably: +* `gles` +As more APIs get tested, there is a possibility of breaking changes. Please report any bugs you find on the Handmade discord in the #orca channel. diff --git a/samples/zig-ui/build.zig b/samples/zig-ui/build.zig new file mode 100644 index 0000000..5060e0b --- /dev/null +++ b/samples/zig-ui/build.zig @@ -0,0 +1,107 @@ +const std = @import("std"); +const builtin = @import("builtin"); + +fn addSourceString(str: []const u8, strings: *std.ArrayList(u8), sources: *std.ArrayList([]const u8)) !void { + var begin = strings.items.len; + try strings.appendSlice(str); + var realstring = strings.items[begin..]; + try sources.append(realstring); +} + +pub fn build(b: *std.Build) !void { + const optimize = b.standardOptimizeOption(.{}); + var wasm_target = std.zig.CrossTarget{ + .cpu_arch = .wasm32, + .os_tag = .freestanding, + }; + wasm_target.cpu_features_add.addFeature(@intFromEnum(std.Target.wasm.Feature.bulk_memory)); + + var orca_source_strings = try std.ArrayList(u8).initCapacity(b.allocator, 1024 * 4); + var orca_sources = try std.ArrayList([]const u8).initCapacity(b.allocator, 128); + defer orca_source_strings.deinit(); + defer orca_sources.deinit(); + + { + try addSourceString("../../src/orca.c", &orca_source_strings, &orca_sources); + + var libc_shim_dir = try std.fs.cwd().openIterableDir("../../src/libc-shim/src", .{}); + var walker = try libc_shim_dir.walk(b.allocator); + defer walker.deinit(); + + while (try walker.next()) |entry| { + const extension = std.fs.path.extension(entry.path); + if (std.mem.eql(u8, extension, ".c")) { + var path_buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined; + var abs_path = try libc_shim_dir.dir.realpath(entry.path, &path_buffer); + try addSourceString(abs_path, &orca_source_strings, &orca_sources); + } + } + } + + const orca_compile_opts = [_][]const u8{ + "-D__ORCA__", + "--no-standard-libraries", + "-fno-builtin", + "-g", + "-O2", + "-mexec-model=reactor", + "-fno-sanitize=undefined", + "-isystem ../../src/libc-shim/include", + "-I../../src", + "-I../../src/ext", + "-Wl,--export-dynamic", + }; + + var orca_lib = b.addStaticLibrary(.{ + .name = "orca", + .target = wasm_target, + .optimize = optimize, + }); + orca_lib.rdynamic = true; + orca_lib.addIncludePath(.{ .path = "../../src" }); + orca_lib.addIncludePath(.{ .path = "../../src/libc-shim/include" }); + orca_lib.addIncludePath(.{ .path = "../../src/ext" }); + orca_lib.addCSourceFiles(orca_sources.items, &orca_compile_opts); + + // builds the wasm module out of the orca C sources and main.zig + const orca_module: *std.Build.Module = b.createModule(.{ + .source_file = .{ .path = "../../src/orca.zig" }, + }); + const wasm_lib = b.addSharedLibrary(.{ + .name = "module", + .root_source_file = .{ .path = "src/main.zig" }, + .target = wasm_target, + .optimize = optimize, + }); + wasm_lib.rdynamic = true; + wasm_lib.addIncludePath(.{ .path = "../../src" }); + wasm_lib.addIncludePath(.{ .path = "../../src/libc-shim/include" }); + wasm_lib.addIncludePath(.{ .path = "../../ext" }); + wasm_lib.addModule("orca", orca_module); + wasm_lib.linkLibrary(orca_lib); + + // copies the wasm module into zig-out/wasm_lib + b.installArtifact(wasm_lib); + + // Runs the orca build command + const bundle_cmd_str = [_][]const u8{ "orca", "bundle", "--orca-dir", "../..", "--name", "UI", "--resource-dir", "data", "zig-out/lib/module.wasm" }; + var bundle_cmd = b.addSystemCommand(&bundle_cmd_str); + bundle_cmd.step.dependOn(b.getInstallStep()); + + const bundle_step = b.step("bundle", "Runs the orca toolchain to bundle the wasm module into an orca app."); + bundle_step.dependOn(&bundle_cmd.step); + + // Runs the app + const run_cmd_windows = [_][]const u8{"UI/bin/UI.exe"}; + const run_cmd_macos = [_][]const u8{ "open", "UI.app" }; + const run_cmd_str: []const []const u8 = switch (builtin.os.tag) { + .windows => &run_cmd_windows, + .macos => &run_cmd_macos, + else => @compileError("unsupported platform"), + }; + var run_cmd = b.addSystemCommand(run_cmd_str); + run_cmd.step.dependOn(&bundle_cmd.step); + + const run_step = b.step("run", "Runs the bundled app using the Orca runtime."); + run_step.dependOn(&run_cmd.step); +} diff --git a/samples/zig-ui/data/OpenSans-Bold.ttf b/samples/zig-ui/data/OpenSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4a5bc3958b164df21ed073620b89b58c1d1e420c GIT binary patch literal 130864 zcmbS!2Vm4i_W#WH``t|iLXnn`-DHzZ*(AG3c2lV7B%zZ4NoeT>QXqu@(u+W(iHZmu zL_pxw^MW9b~-#+^I3_{dJgwWIDr%uUxc*n@Gge=J?B=Pw8ycuZ&%S;u71g;>Y zpK(f_J?@^`^}d8CgV0KGUVdu+yz8m=qi!eiMP+p*i=Im|ts%tY9NPS@Y)P|uOit7p z&^M#}TIHgux{JdO6cG}=0qxyYRnoMG+(ImMM=4T zm-7jfqfL@f4Mg7vuX~W6gM3JJUGvhjKlIs5$e5vo^nb0kp{(SYb+w}i@p*+1&(G^h zmM-$R>c{#w8uaG+lDdkr?1saH3_^dso?q0^)NFld|9(Oye@aN$f<=uLi#A@r^)o^Y zPW1U8p+qH~#GCXX9$j6eAM!+NCU=m*WIizvh4>LW*$c{N`mF~gW#yjRt{*4Fd)rmt zYhQS8W0;;lS`){pB<*GMWA*dcQr%I#ou zkdux;=6vI+e6k^9L?avQmw+|A*K z!EY&9MK+T=!E+g?SlM0Re9U-SU2gCugSwKG1L`qIT_H^S+0OtTGp!;7Rz?OR__2A> zETA&dJem)?X;zzwqApRF5LKgEAEIgfwLzr67N`Y6PL%j5F0HTDPxI4m(FSWnw4vHC zZMf#I1!yBQvlgs{qOC*{LdJkLgUm%-i(g7s;Fn_5Os{s4J&5;`PQ*`<4-lWnFC`c8 zOUWhtQt~nR4DtWrmy&K_i;wsvLxD}c} z=^>~vRa}aTs7kJq3wV+;3GozVI^uj~7UDu>3F4K?D#YuQ4#bZrk0X9kc^>f#YAm5@ zyc&<#rIsMBQ(;M5QmWdbf|rn&x?J4=xJ}&-3GPsL0KQAT8}U8r5yVH;hY&xkqJ8yI z^-;u6sLvoirJh3kC-o!D1cm%mtwCD^xKY?^O4sty%VsPqT#_`!)RNR?YEF94)Rge5 zsWG9;v^e2G)1t&KQ-iC^R3AUjR2Sc6s&zhSTIlRDEr{zf)i|n5)s8Mxm7~#A>Buxy z#CDm=V_!9u#ZEDm+UJ={>|Lhfm?@_DF%O#N#dMkG#w3{LM0c5HN6j-8MRl19qpC~= zwt1#mwmVHTZC$1rkzJGhzCv6Bf3n}!q=FlhIg5!Ae|i6WtwE|GEEHaGEE3w zW6BLpG3A7GnX)Zirt!fKnzDksOqs#+Oc_CUn$m;1OlhW9O{u0XQ;O+9(>QaNX{@=* zG$ydiGJZGqJ$_&p!rLdo}TKT7<`VloH#Xvjh z&W?QBgiepH=@UA#}DSe!DgsKdCqgUl$JU2uZZ?S&h+Z6hPnCUoq~D|iH^ zIwGy`grcNRD>$L4+Y8g0h>h56wkD(;WEo@yR>aiS{flCXas<5$utbWgtU4p%&9apL z+>GIQR?=NbWU%zXmm}zF1M~HRh^AgddLEw1NQwdVA*-l^#?lg6Mpx5a^gh}_|3SZ` zU5dYw2>Uy!yr}$1d0+Wj)l^@#pE^LbsNt}rt?GU1Yw8>7n;Ox4wLaPuZK^g$o3E|Y zZqs&XcNhj5o;EyVIBj^*@OdB&92dAT@Ic^KfnNvyV47t5!0cnb#T;l3He1aObG&(^ zd9*phyvV%VyxP3Q+-BZx-fuo)K4yL>$PhFzXmF4@C^*O(6caQrSP3=;_X{2nd`s}~ z;J{#8aCUHUa7E}##~yz$@2Yk+;p*tCW3Q%O&A2+@MpxH$tj+AF57wG?j4+Ot(sGQj zo&J`7juHN-43#5%0V8}1BP6O(j?k)ZzzDaiht)sx5yIcXw@%fjX>+w=ZN0Wx+o|m` zbYO(fVuWV{N#NMPH5g%g;FZ8{_y~!4pm~Vd%tsh!PL?BVHm@+R!3ejS?=~OC2p_m< zgtO%c`~PHwJDR=7AQFwjtjY-$< zz2S3x4@#~he1E;_`gb=fZrp#P^v1mFKU|u2ssBgIE`4=r!AE^ARbLAKXwSt_7rwag zj|-PCe0Jgdg%2;hbK&g^Z+zsz#Qo9RADu@Wb)n@#6CoFdT=2f&`O)O_*U$fW{_FEE zo)0-6bbi?Rp%-VJ?|;7UdF8{8KYabeSKg~8q+q^ho99!Wzw_+$eA4p?&&SnlWg^y- zU;26eXN6Bm%&DK1=!k~^JgjH_=X3>DcJ|XIYl@uA{9;nxdnwJPIn+W!G^6IBd8*Bt zm*%bcU?s;ouFRp|((kl^+90g-1E8x(>QW_H8L2MQs6=?pO^mC=ZGD@jcZdZ;gzf;aBpTmx)z>+`2KA}{5N_*2V#<1J) zoZ)L@f1}NqW8Cdw_L%8$pU3;2zMiq3(>-^4p7ea(^II>A*GR8sulv0|_8#V4>3zui zUp|9;QhXNr{K4n4ub;2ecd~D}?@Hf$eIN9FwaqdUSa5Ri*5Cud9l@uA&jo)Rd?omX#m^FK zaayu01(pSt6_)LmcFUud--iqc2?|j| z==RWqp(jG054~Z{u+Fm9SXWrLS=+6TSf93@vA%2l#QJrZA#6yPB`hYaEUYDLQ`oMs z17Rn^o)0@4_FlL#JSu!__|)(@;nm^G!?%X-34cE#G$Jt~Ct`L)UBsG*J0mVf&W&t{ zTpPJ9^4`b?BTq)Y7I{AMicPikv-#ViZDVaYwtQQqt9i5?d{J-R%4N%ZFEz0nUvKOOy1OjOK0_F%iyo@FnvFR-`R z*Vun!f6x9;$6!aCW4>dHjC(2WjktH>X}ni_NPJX$d3eaSD63>?`w z@^_;Kjb!+O2sjsIw(^jV4o%TxFx%7VNW$AaNA5DKPgJdLT%*&|ESeMb3u`A=Z z8Bb>VW)8|6nOU2;EAv$5w^=b+#aRcl{xLpee8Tu0rU=S;|%o70f9F6Zu?V>!Rec`4`JoR4y@=lbW4%uUZN$-OK0#oV*G zKTH@op=iQ_313W9CI(MTnK*Caf{CjqK0NWgN%l$GCS93aIQh3z`c0WJW$u(iQ!P_p znpQRK{pq8pXH1_zearN{)1S^8kvBbWe%|i9LwOJ9{VnfCeqerBepdd{{LcKp%!vB; zzcYu>J}VefP+M@a;6`C~VQb-*!hMCmDf~mx@S?_| zM~kk^&Yrzz_FHp?%vmt!skuILi{_r1XPNiR{KEMq^K0fmKL2X*sN!YCTZ<2t3@Ndc zY%jS|`cT>IvbwU>WlxuVUv4WuU$Lm-PnG7%;>v@SUscVi+F12))sNLF)f=kMRG+Ip zUo)U4y{5J1!J79L3|^4Fpkcwm1+OpoVWDMV%fdg@X4O7h`)cjmwOw@~by0P*>+Yy~ zrCzH~uCK1Yr~c0ko(S-0kF7ej>XlU=tom}bwtDF5sMRT}^H*1|Ua@-T>Z7Yqu0Ff^((3Qm_^vUpajwZ; zGiOcXn$2tOTGPJfku}e+d2`JtYkpkYXKm10*V>%5bJs3jyK(KlwI|j-xAw1VFRcB? z+8@>#)(u$~v2OIbDeKDCwXVB;-NAK_u6uFa`|G}5Z&*KMeZ=}v>nE+Bzkc!h_3L-6 z-?#qQ`bXFQasA)cf42VWhCUli8)7%4Z z+pprmaqy179o8MmJLc`E+)=+{^^RRTj_wTD8NM@q=j}T`-+AqhzIT}KXuRXh9cOnb zyW)3c?z&^wsXIOHoOb8NJI~(bdDoP?TJL)Du0P%N{oT&Hcinyb?n}Eo9y$7(qfZ?D!_hNG|9teFqaPjp z=GdTPBaV$dHvU+}u~o-59ouP|XXuhddMs zQ!>E#rGypYY5Y{eDsdP)C9IJE<9-Pn$Z+F22^#@dOW1=PF+49}PZDX^D`77ZZfKOS zH%T)%B2$@bA@K&&d)RP>% zWh=pZt{PHCCXouf*{mTgD4Pt5Mov>p@_?@cJ{`DvP*fmp;QR%(!t?cGr_eS&6-u6b(-OHc%=w=Q-ZLPcJEX-Ru zX04jc!tDR&Ib<{33`-b^Pde_nyX#dU*Npo0 zC~HQrAnAz+wk8b8vY(%A~VFo?( zaZK0P2w0BMupXGX)-(doW}M|0K*mhFn?S>Ksu?kp3e$AGk9rTI-G2UNZHouBga7Jv znEtZfF^kZ>L^stajAIIZ$CFXNz(ue3^ER2MScExbJr^F?OyaLswTQKHo;F$H8@d=-nV=BOdsa)Qj{d1A(~(JBJ};C}DdG ze-c1OkU(PUh1&0bqVD%UQTO>TsM+VdqTjy%1$Fl*ef|sT?zX-E1NA^i(BSULzn7l| zIwo;OulVHAMh$xdLWSGg=yyv=M!q_XdWl< z*umpS9*6KakjF!LJb=f(sM<)44Xg#y&{$qieq02YeA9%UkjqU?j#wVYk&gk#lkgh;JjQIIG?2%^h*fEy49h+Z*T9pVtT6C0 zma@+p*hvPanFK*E7c@BGz-jTwf)>KOYCUp|Ul`BfH`s8*Fi5+oox<+{d}1|P3s8T= z@5lIEp~k3#RZry`b+Gb~asa=@%2>rp&(pm$pZbw&Phu!_USc7o=ZL?7syBC?`|seRU3sIh1N6e7X44)sR1(_h#m~U^XFDbZi;$4;)!Y- z;v9Ttu3}A|qHg0U`%H!+uggGzpB=;69uqT3bjP-Ycs8Pb>{BMKT5Tn_Vuf${$!AbC$`H`@BR+Wg z?%kJ~u_xAfGARt^pH(f;3bi6_Hf(RMHV>Z|7i%T>{Ar>3ta@5~PJLeeqxypSqIw23 z2mfN*6YvZ_1=ctX`>2_CZqYem{^+;JQTmb_$L9{8j_p)WsE+`v(fPEAuA+DLumvU` zX44uPQm}JkGPCzu&gN8Ujfejk4^If753d*bXI*O$kv1<}V{ z>SOAi>f@a98o5r5c$=e-j8o{J7%~cKqGp_VsqaBCn0VrB%MXYhjwG$^?euq*| z@&b90yhGlFPx*?*Q)iEHHNrPnlX=*o=i(hq0{l=gd;wZlyI^NQ9J=9#uDhXYZshCY{&7tYkYs=lMXr@pVAS1+g+al)qCC)Gm|qoMyAcAA0Mt$C}faMsCF zGiX#@Eg?l+!yzMZYbB)gsIlB#<5qW#748}<-8C?ibR)f^2lrjzycs9BnsGW}CY~U5YRy_FXvNGL>0GmrZw}>o8PJ(IF*FcNjRA#JV+$>Ak1^5 zfo2eDvl`43X!e1vEgNyXHXd=DmW4Q0 z%S7zZG7u-D4OVv+;zVsG;sk95VwaYW*s0|qj@PCmj?<(`t&^sWl?rt=>lzWr+Gmv|Xbu z#9S}a?C4uMR@hSPKSpXX=wljI+!ExHwP^G;6)SKtD3@wc=yM8I7~3eEekmdzYO7|&7)NT8 zA>%^ysajirxKgV^T(04apIa~Yl3c7qwQMiM)=cbBo@II}ygXSUyu5ptr28zni;=q~ zv1gJ#k$FDm&#;HO1G}i5*hj&e%e~YenD*;CDy@l~sZbB0uVENV1jcHEETSPR=5=$S z?;(7@#n$g!GJ)&3SWTwO)kNQk>3&n+Pl=rw-QK9aC&(9C0fMnlQZ}Gs8b9sL7!sS80ryVo`UszQSzuS?L+-fpiPVb=uW!kgjb3`dW)6> z>M6Pglnl4VjYH2FS&xRmQVe`X_XuVb6+G%o&_0hrk;Z}#>yDJX0!CZx51kJxEX;_GV%lXcuvGY43Qr6g)V3(|gr8sfgtl}j zI&_UI*ohLOwb<5H(7{xWDVoJ^B-B<7%_*~F6@$bAv%y~uP-QdC#T})^Hh^ZotTq&z z%SsqE8GJ%fLr>r=F&#_BLT*Oi4sT0ET8ED%&0R8%j1whBR^nkv>!5>$)H5xa=Akuh zWtLKCV9L~jD*wvD613fsVkzm+ENT8HG?E7E8cH#w%oAj?4P%=C9h_pDIvYmHgkf%L z%P^lv(X1t9B`lv21iNpOMV5>VX0&>ZOmkaDN=aEUC^8EtpvmNHrT+x$i`y!3h&6OogxtQCX3jX+; z3g3^Uq%9A12{R!74iBsVl_eFHAUJp63b|bQ^nrUWG^C(|__wuL+Bzt@7@7rQG;i%N zT60)}zeP4nNd+d6@iUiH@VZ&(E|(7LpMRz$s1PJdD3d!A9K1y-i^|%djU97gZHCbP zZ3EiO$!+jjbK!6`YuU_VEDL5obC#J;bqO??2_c8&3ek`t^n%6m`e=gnrp|U^u19D$ z2FTEk2Ad%ER{S{1&to;sO{^u3i;TejF?$FQ&QS8Bn zqqoUnbXwFwm(X1?0Kj0y);ada2U09ES}4Sh_W07s2Eb-Mr36-AV)5_nIyDtOvKYBy zOJN~nk3Xm#tHGOY6Ad$Qp=HlrMIku}=02evKA>Vl5C{=_hj!o(gF>HKnGhUU0LA;u z_(c;QfYS;{vFkYwsO&!Q6xELcvN`qvT1y`F&oxk3G#p+ zg9PBv%pG|)EFyetn|KW?RGhgGrj<0yLb9Mk62L2r4r0lsEFv&1OLm8XtQ)dCg7+?- zmL!&VS&~jD)C1lgKG@>d#}|&it*p3QEYy%PN%9}fwn~r(CK`X3+a=637^~N6D+H9qLNTbaSdf7jx?M(?W~8F}BcK+%2-)3F?c@ zu;y<7N2}Qn;u^`P&We#B-!}3D^{`3;Xrv#8IkK(I$0C*#3v>U!!&3+0n@ds%@BC9l z$4X3nTbpN}-b*}hrtiZmFyqH8_i?AJ6=@FM=^Z}lZ2y7@?C@fKC|&^{LFMT87&@*EJEY*um)(M1*83w3-Mgh+4Wff^H&g!f<+!7zs+p+ z>yM%~^8h?(bZlg%sL3)5$6*yWS|t@5!A4tKo1kNRa$luwLLP*`p4hyT{Jqg9_w&~t z+bV7M*0CWf`^$>6Q+&c@CT+mikUIDWI^e4NGd9g*{izWDh!s zSs}jr>j+@`1GblO(~k(ivszDtFB-tuI=dbWU=L2+eAl}9wt_F~L7UFFlT`J}mZ=<_ z&0_w?huTT78e2q1G^^y@Hm9u!kBdQ_B#^O}{bBjO0nCl_4&BK*q`gX>CHPVBc^D75 zq(yy^Y&6(Nw00*c@NkiFc;Pl(2_hSDwr)DY7`#In$I6s!GETXZj6vF>P9}YU%SBj* zFj)o*(sG1sghZL9F?v=P`2sztes zsT^gYtJ*LX_>H8~<95<%T#GOd^hTLxqYQ6+wL>Jr=t~|p#N(UU`1Y@1CSDNUKsZEV z(asL^*%xU%`e0XcyRIpJC)2gRl9>iS(yomlbCAx_o+5M9VI%^)jD|GQt}G^ZDvP^T zYTt3V-Q!)-&hXkdoW7ma!RKA=>W@g55j)EEYTNJu-rINw)=s<`tbRfg)i7exs_BbJ zr!yJovIo2af#DV-7&*;HWP$cB9b!CA%2j;#TDvUkK=ur$k**)rIx-dX1*#{;;z>ra zu^6(^w=rZflQ%um^)B#pRDY7p>Kl)cXyXlp=SUG`pUCCTWPeleH~<{xg3kk+3mGs6 zN90@_0(=c~W!L9{%|*|Eey!zs%mtedJ+Qf8b7ts({2=$(swVnXVhsy0#%D=(7eHKY?-Xh0F=kPmzBa=@ZCrf*j@`eb_J&ye~jMVIL@4 z$!!FB%5)XH_Aq%dn?brwrVQT+U16z$I-jsP1i$v5r4g7ay$tiqO)|TX>ExU8Q<=Roo4GmVHjKIZZ&POL+}@b2V{UbuXLiSIzh?@2 zYKMOQQJ;UN?@Z_PvAO%`37bPua}nSN>6h?@dl8b6zksqJgah<~c7VKWc$f@gHfN|r zTR0=2?nQszMOcl1Z~v=lU7R2DbJ|MCI|DY!^aXum^UioP+hX&_eV6oc+8wZ4lo`GQ z9(JQW13wFyvGEx%K<@Bw9tx>5=8{Balia?dA@9XxGMiHs!4N@q7=SatH)!}2oZAV? z)oZ|^T)P4v!BVC(mx(8*dk*i~QO<4XGrZ})LY8s*WZ))~2-c=?Cg77@uNxl${0XVU z7_TrqufxiLV`DTfMt|9u7eIHQ4{V&QuS{n>ZV*3DP0;W)U@{rR$I5(?Kk7(%8F2=h zwFTc#40bZlxEpm4c%AQvA72xs9CcZ7`-Q9wXj7M!aUAOWh17YrlTOdi0RI{CV>rfZ zGRgMbfpmJ;cib;QZw;Q1;a?!bsbmDRapN`U7L)CBz#(9)OuoeUEYgWQKgW;=Sgt1; z&NMQ8G_HrNuof8BqHG+w)dTb%7XagXo5ojB?=ys9B-cYj`V4r07v@G|yfye3W<#)H zwhmoncJASie*2?7XjmV(Un@om*`l3x-5zdExm_^(!1|6uEIhDvke(#NSbz?vuoU+R z@SypV6zKV_2#Zy`oiP55w0Prfo>GUkHWqVv1@?fT?ZA5DeWO)fK&oL|Y!5Kq!-Brt zNz#mL?+`&EJd?>Lqn%iouA5`qVJ=aT^PO~M-9Hv8Ro;wNvPpCcuz#1 zS-xj@0Qm#pN9a79oXST!8S9-dLOxp$5u({gu%Uwx&|ZOYFYL2{%<&k6b#4$&|C4KPYfSHLd|#(j+p@{&!hA-3bEp0tTT_zK65BLpZKK2+m8Ekl++{)~h z*$z^^UU}>W9d5VLQ|4Ege_%F>dFV7GgXd$!kJ&h1TVbEZ_km}9mTh_FqE0pTb*O8& zX&>Nm0By6q$gSjdZu?uv5u^o1nd-clKVou0Su%7unfoQoxjVgS&2-Np{0*~t=AXFz z-ki!lGT+Jk0P|DaSLpMD^##7io9}U%Z}Eq0u`j`R=6IAMOeVvO-@%^tLx*$8WX}xv z$y=do1sL-I^sf^0F&R4J2mSsKdl@_IiOuirklD*<`zCq(G~e}?pXRZL{zdwqmopn- za{c#d*DKmnT_66ta?Bb0A)YI6&kgg9x?FotyFTn4kMT?U{f{YouIRBR(e3>|rChI> z&t-bvBV~I>_=;#kuEM*p^jhrAfgUB^%1q+NY=!NUZXN^EN7Q-S6L%kBFT%b%6@d_s zV8eR+9m4krAF{yK=AOYg1p36DqcASGzA-YuGeYMNz?a2BFSdx_3H~e?{UL*mU0-tB z$3Bwp581q9E-??ASX=4{lBU8Aka}`>1o)32N$QBMFOiN#@D+H_ffnniPS5jLGl?um z9Zr)Z+e^bd<9Q7GT(+0N-h=5oaPu)Q;&}r4guK}Ivpsr`fSZSW;jiZKHnC2r$)uX@ zCe^T;YPN1+pI5EyCZm-!V&ePy1Ef-Yl4Ri&g3XXBp8b@k$sz_D;>ccnr|eFgaj?S<2imKsZ@$^!Vv2L<7MbivJ4~8#<$4dO+2+9Nva_beH}?`#!Ni>?jz$_+A}cT zdcZu~)CcVUpYD1?@bCJ~Pxynko3GBZ7k*5J(7ESuCkEEd8&d&)h!i?-VNBIKeM>9P`3Qg;Bp)StsU1vHw4gosT^$=*`k#D?&@F(OSL>MYVD$-1e zV|b_-FMq8EE>r669Hjht7OB3LGkxakIZ_+ey*kY0FsxGj7=d%4qCDy7sEej`6 zUL>V}Sv$-Y{&Ra5NU{1V=H?FUQ#RsV$5U9(_F`Xg9R6?%=8nC~IL_Z^mXSULD zG9?q=D;kdzUpY6OQJIDlV0k2;%pmOCV*x3|Hz#Lfd~+Bh*0Js1f&=-AO&DCvHmf!fChX$OqJ$u)EQ|CEt+maBtdg$e(at z@L_zPqm1mtndg^D1#U-siM&o;!S3%h+yGWd{zA@@Ka=0$+a+I;J8*jI9QiA$#@#ai zAY1V5ks7iP-?^#9_gmWWjgQ6nE(-hh2>T|<5`3%ab9^syInGetN><`*P$#($cQvgd zYsgx{&OJYc6J6{GL0{Srr>?J)8?--8j18oNNEeQz-9iV`A(Y}2*)Tes`qKb90%yuh z)J%hDFtw2H$qzVX7D}x&jE2()oH?^meC$kPsGZ+*6i4I9k2tO4!ils*nnaW7NIDAV z)5g%TbR12gsWgpTBp=aqnn5#Z79Gz|T;|dVbRwOE(`-}dR631xkP~z|yXOqIoXuo+ zoZ<9O5uHu0;#ANj@^?Ci&ZYBk9;g^ME0yAIrE*$t;)b-PxVvXLy_K$@E9olo7P-JrZ@x#~C+ErA*#vA0Vf!5qnmKS&^ba`k_bfe4pQF#yKhhWIi}Vcr6V5xmOkbg|;ymE%^ep`|eS`jmo}+)o z{WE`~Z_&5uJM>+g7JQ$6KtIH}`U~_T{fJ(of2SYQPw1!gGn^&-KYAHAP<=uFi94FU zqF3nG^c!{$4*eHS8va0kq*v)RdY#_D4OIlEX%t0OG{vA86%U-1@lw1MABCMt>8tcp z{BYyV0A(P~Dc+(CR)*ldr(w!)+-nt}j8Fm<6As!0DZz?G2~k27s}iP!D-lYhVk3`` zN0lfgnmj?CB+n}`xKZhG@<-f|cbaU%Er2g5cEy2HihodI$w?)S{7Z>foVdp>ft`*f zTiFdgxMydyGDaDTcS_^nb?(J2WcQO@WIs8E^Zj?>uE5_ZDN3r6rlczwN~V&fj90Ri z9NdC8L79kK@FwF9ys64GWxA4wd+=r`GnH9N0q)`|Qf4c2l)1`0Wxi6ZlqjW2nNqG) zD3wZ;Qmxb|3zUVp-=|KgR~nQ>%3`HaX;PY%7G;Ujsw`EODa(~xl@;tZJ=}n{Mp=s+ z_0}sJl#R-5$|hyAvPEgb-9THFZOV3Khq6<-L)oR=sobU9t?X9rQT8bJDtncE%6{cn z_+G?8rCqsCIiws`jwtslN0no^Q|Q;q1ImN=-o$T|hn3$d9m)yZ)%U3KnDRJIzdfmR z;?AL`l;7h%v8R=1ls_n^lxLOG%5%!|${&>%aL3pg+`;vd^0M-Z@~ZNh^15uu#7IgMZHK}GbNDWpkYKR)D zTGcSzr4*q?sx~!BjmEb~?5abJRpW3sp%XU~Ca8&OlA5fJR7a_!)iLT=b)1@_rmAUb zx|*S8s#)rIHCxS5bJYpzM0JunS)HOzRi~-b)jTy{ouSTDXQ>5hp<1NQR_Ca5)p_cC zwOB1tOVu*9T&++m)he}Gtx*@K3)NbF!mvSIq%Kw))h3+gZNVLgt?E*B8E!$m72k1L zsjgC2t83J?;-sm%QN2ywq;6KX;4Y}!aqHPO+C(@t9Y4qQbzq!Au@{IZieE;R9Q~x*_{*wB# z`U=j6zox#fp2huZZ>WD!Y^-&FsmzNNm6bK~#wlj9$#AL^&a)l2H%@%^1o)KAsV z)X&xbQ!lIkP`^WW-SOeYg)7rEws0@rkbOd@1pc__OrL| zr|=WDQ*j3Or{AjS?Yk3Y?Bp#wgUjy)TYx*kYPCA8o}UL_%xa$eX_f$e5$))ExWX&QL9E|%xSKvEw3=v@WdlW_PIv( zIY;!lMhGTH_O3>xN=~j)v%n{}yIr3J-LU9Oe1c39eHY?uu@&{TCH3VsWyXmmWi8DW z##)|8k~Ep78z+ik*YZT0$c9&o$T(Tls_#+DDP}d+nP8kOYSjy2)t9jAkQ*BoRadB) z^;K#`eU--)IlKlryeVRM4Ls>HrMjiQs-&@{uC}D5xlcpSoN>C~jIThV+oGQ?IW$+I zak}8#D3Uxu+r$%}yl#>BGbTTbnsc%u1)_63C@u`i~4WcAH&d|gM*^EKT z4ycPTz%m5%$I!qe@5|cN`_=EJe)`Hr#k9#np7G|DImo#=9kDVMzR>9qi-6PNlz8Db zoDN~cPDi4|3uSXUl4V{PsM8^wlhctd@tHEs5^1bhhMcjIZ>;1SEBVGszOj;TtmGRj z`Nm4Vv68QJ49-}|H&*hE&5-;g|5(XCPV$eF{N)ykhUhymt3lCMkhbxD3M$uC)sH#ycgtE#aCo0nFR z%;H|u*vb>HS-L5Cwd#OHKagIdMMMol^66E=m#5o*X#7Ozn zBIQ$ylus>ESziv(AzTUYvK@!s4xd`!`P3riQ=65U#iueWD~nGtQlVP0Sz>DA(!|uq zX9(4b&k(8=pTR{Kn<-2HDQ_n>Q}h?9ppVOnH%zH+XskCh@OTD~TUe}BH#98d;&F;f z4yQxvwM*)iOXd?~K0)etg4FK>sox1wzZ0Z>CrG) zep1g9q@E{A{)v)*qU4__`6o*LViFzBM9E)FCi0ShqU4__`6o*LiIRV!KlzyCOqJtEmHbmB|5V98Rq{`j{8J_WRLMV8@=ulg zQzidY$v;){PnG;rCI2)j$27@bKAbtzB>yzYKTYyall;>p|1`-zP4Z8Z{L>_VX)Mk( z$v;i}>bjd$m@=uri(xP_Ul_T=nIZXSNd6g;e}?3rA^B%W{uz>ghUA|i`DaT0nR5J@ za{QT+f2QQ0Dfws0@n=f@nUa5|ybQKTGl#PSoL)PSlwt`3ooOa7jPslFrd3oH_7^7rLY$bvXoomqU!-CHIFexj%Ht{h>>&i?Nx)K9O?y zAm#Ew%KL|u%Lgf!4^rMgq+C8oxqOiF{vqY^LCX7wl+O=RK0io#|B&+j#byfoL@N0U z`$S&y7xsy~k(d01ea2=A`$Q_oFYFU}IeuZE z$jk8y`$S%jU)U$|a{R(Rk(c8a_KCb4zp&5POktl$<@kktA}_};>=Su8eti)Z_6fY? zFYFU}$zRwf@{+%>Pvj+kVV|*?!ak8o{=z=Ah>Z()zf%kc_(jB}*oA8WbalJUJKc3q`CaD2DP za09yO*f!)QGX9o>;rjATox3HGbvM$7m+JLJp}VS|zAt3uwH1}k{dGhscA3D<5Y8%A zZf0WTW(L;47h!0nOeLLkYH_aQKCF64Dc&@)J~FD$eo|}%h=ZW`YF}QszRtMsA zAif{(x+4~>7-^EsV-x(7JS%6z>RB%Gy6EROG}o0hE>tV$R~iuJ*YKD>L&Ro^-AZbr z@HR-DoKI|gS`5204EN-Tywl~*%a^n~kGu2w$v3C&ynI*b&dXO`dfu25!|oe1=JLcR zhijIExzcgiFQ;2sIihcl{um``xzcgiSH3%y1zbU8fq2WtGlOKm=Cg63-yGR5$Nk!j z=RI;nxBPm%S`|$(g@do_nMviDzUCx%5o8j3X1beq zIMW@xgxf=$cv#2ua3_?S=8E@WZQ(^T(;hix>0HF!QJD1$wx#a%NCHHqOxxaJC{hdqh?_6?!=aTz7m)zgE_uI}-UI4}2_A~C%8%=gJWUwxV1lX(E#X-T06LM}0V%i*sy@gD65d$DUK*W8)lt z>|S4DX7~CMv$)rnf8~JP=c@2p3ftn4!F3Dk7UIMmJF}ce4$|37hRW)wT{N%a-8W*#ewjn}<_!({amF7EafV#L2rDoXVru zKf%d&di_S}iMq~- z2w5^sK{`^xPNa~fGaMlp0e5~naknSh5bZD-LZ&?6m}~qE1ZXD@SCC#t_*mx8BYlUE z_;W}h=lGKd9q6N{`2Vsv!REq!b4))~uAdt8Gmsc?#>I>?!@*iGVW(U|ajF$xQW5f( zUlpS92OKwuAub%>7yim|+3~UCJSd3c9mhGxYaBY`IPEyep(h+2jt3k^POYCYW00dSAWw&4 zzs7L(@9baNKj+XT`v>;7>~8?~iv0!qDT#Z^{uYNGvp;M<&Y?s0{r24)+G%gIZ?LaI zjivTRdo9OR+KcT)9Ll#(wr6uF%|6JYp1`Z9d``V2hA~8S4e8Zra zFJeB8xyYgSV&0578}kxy&&NCy)5&p<#5@#pltb+?dt>h6(Ds22e~)cnmZKPypx#$3RnJykoRzSRVe*_V>|O zqAzpkLPewlx-N9Okejplih0+7jd!qSlMQ@G1EqV>dEst)F z=Cc)D9bGC*=S0tpp2|yeqxr0%?$~HPYk=Y$AG5N514X$@t!~KdhK5HE5_KJCqA}m> zC)(4o=NBMFFLgZOI4$U+uGzno(0BF^egXQ@UHZ8jx)i0?c+1`>>-Gk{;Vyl}9x3Tw zu)iRoQ&CSz=rKFIH~Wd|4SLvJdfW{iazp#0xV~bJzKGf>TWO1V<`3yE3m&e1=Ou; zc4B)^@_19%MB7X2i(jr$ZrY}*}Dy0*y)(6;m!-jlI?T3_l5UBO`!eC>bzC={UYGel zQOZ_>o9S#ZZi~;>$7cV|CiOWc#uhAU^hRe3uniWasNpADj<>%mwdnH#vOgAiMnKUYN1m3Yz0gITwC|Ut zPei{ap-_SoAbv@80gfb3W=1r&`{LzZrJ z`@c%vrXz3Dagl4>xaDqKvm00M##QUMsBRzY_8a!4ky49eVj|~AzBBEUB{VhqHUUL- zdtkR$iOki#a%6^msH`zIdZvVu+_*S5t~a`>~5D5k9a)}sfFP69g?i#)k#t4oK|1ta%BN0vCf-BYXja!^^|xNxFh?>6ODL>OBq5a@S39 z_j#ln=hSONyLVOLG2zmSh6n4~6dvF>CwSPgrxuW7YPj^G5pF#V_Y3!yed%sR)3r0~ zM%eeFG-7Gk71@f^VnV_$hjD$zx_~DPQQED~Vdul7Kh^aaTI9BhuybM3JBFPJJ1y#l zozx-No3xK^J?++P-4^g{;I@Tsx^8`T;Auzps#~8QbC0MOeGYpftV8zYfiUTJ@t>Uc zNZhWltrEJ;UAiW0xx~4p5!S5p2&)gPmZhaJKMKh1-Wi3>37aWPr-tQ9C?jmFgp$JI z1jL?BBrYnBF zb%TUfS(i$vQTI(z?)|g1)+Tk=TB%FTT5K&6HP~~MfY?);fTG-cYT(Lc%lTHhT3NfH zTHP0S@3XDh?vZzoGR-Za(R!aFds+Q@!&wvbRnqFvJ!@~PWRE>ulISsBV?^p+-WsB> zLXOMUKv8ZVU>zzU_mfggfbR9|ORWP$X-tf6zuo&-tFLZ@-8)*VQP(Rg36)wL`c3E; zqLt83LoZ6`JzcLt-wZt~aW92FFQ6W4=zvhE&!L^6k4UQZRC#O>Ah2cdU` zZkM>tq3a~HB6Nv_7KL)Z3jg9>kGg%Vy@w2Rs|YO*ohR!S=sW$;>2BOaH!dqQMbeE7 zbqXjvK;LIui$h~%X?SR`fWiia21wjsUE-mBx@JeYpFX3%*Pp0Dy+buoBjiTN_Y%4i za#=zjhn$ztJ0a4?hP)PXM&QEEg`Ae9CqtePkbP-Lhr~S)azsGg`;Bgk@5Y53(B%?x zC1j7RyG!3&bo+7ZwGiq5x}Q_JeM!h|A!}saN^kiWF0b9l=g-T$qmU6r4a){#tJATDMb3t@FgKp0vB~DMEcGUbBOLS z-G02ge_`FYK_Pu*d!8YRga%oz={U=G0;Bnt$?}0H4Zq9smZW>bBE6&K z1bqe}vA!F&6zO_z$=6pL%VbNoXt{e8vZU#_ZeMH}?Uq4;TLun& zjkiSVtCc0h-Ev@*K8~Tf&#?^9J&ncfhb(UI6V?3&$o*EMH|w?#_paVe7yP5XCI^3` zd+OjX+_+D5-yVEX$3?l{bOgWW#<`zeg5T740KsRir-X!pUkZL+LeB(uO6U=Ne-QkT zzS4zy2TNZUawE81((MhtOF&_LgQc(Q-e&`9l@J}rB4iA5xhjUw2{&Dbo30lgQA6E4++%Yb2zo$_GUoZ9BXYd*IggN_ zJ-Sr{?b2;9Xsa7{n;W<07jetobj@zMdN;0G$3=VUeTiyw_ocM^jZ%>G#r8`<(ig`B z1W6AZl&e2|24(20M$lL{F6kF>ac;W*$JmzuMpa$?zx&>sH_2qOF9S&?lgVTy8_8rL zYza$3$VLcZ4`B;i5RpM-Cm;e+L_`pgDn+zNDYX<*q!e*Mq>9K#{rsqH97UB%> zm42*F_QNH1_~8=2@2vaUU+1bz{M0udmc$Q@QtpyOpUlq5N&JgZm)IFYPJF{32T6R@ zZ~G*^nCO$O4<+q0tm-yvX zqNlU&4u4(lLy0qe&%T^E#fR_1#0f?zCqA*!C}pbtx?Z}!F0szfC5e@ZgAKUE{(j%I zTdAnCuB+5LcZ%Sbd?;h`|mnlah&wEam-%_ zIG-KsIOw+`6VX2(TxYxgp>Cgl4m$Svy%WbC$1Vd)SM;1B2}WI4^tUVemj0z3g994EQGrsKqc2JYjvPmN z>We5PIpQ5L4#;+g1tm2>m!yPi3Evub6FzsuC;Wr_sD$?t{+jUL32&nGr-YXiPEeF2 z;b_94gaZkXgbBM7b|yTW@Bm8d6ILfIOSl`QI}>InOiO?qN*LqFNvKb#LTPBiz=S@; zbqVuGb!T0E6xTQCuKWhoh%i$l)}fb)7qLS9sCqxjHoB|W=q^sBCYUDq z7l7|cWtlI}O@R0R^E7v5_6=#|d=Dl3rL#<0p z4Jn=KMJvO%(p{{EQ%y0~6r0jesbltO3a3VAJMrQnJ@6?qEr3ChT85hZFf%I{L9 zi`c?kw8i{AYOYXOzGBpy=kZ-UCAOH?@)cPID9_|;6JM92tqly1^AhpwRpVLi`4%cG zm?yZBR1%7n@GDlTmp7PC^7S>~siHEjD65!5xPHknP2A7r)N>_|uHs96iw3?{YRKh~ z+o(TsB{FQNOmES~tyqjJVNf=4c@y`?LQg51=qbfQPoa#b6btvzLi9lm-b>!gcQwXo zV2}xqe2lTx8D+*+$9*`)@O2D-jIhba7+W1*SKZ?_iCmFepdFFiIYFkF(Tpoyuz4k81f21Dm7+;q^~bxj2LqXKedx!ls1Mx z!{rL&%5PN1kj*%YnZ|S{AP*7-h3SCtqWV)@-%kBk+L>-C)PFU_=s(rVpYR)9=kj&N zFrR9a`3$p9x1bybMM{ti&oC1hW&*?P)~$fC5R77>8uS^hD`&X%q4bnm!SF-5=R>(C z6;xJ@(f^n+f6SPR88VYC!eHk=O%Z1Wgf8`UVRk5ry7 z>S2aSVHks3w(zsQE8nH%Fk#AI4Eson$^5K*m}-OjZ``G_{1TNFCv&5d%gsEO zYZy-pLozSPJNa%1LxylYkBhvS%ND0LgxWO7X=Q)vTV)A;SuxV)Ro zyScoSAmyc8{+_SX_^!bZPxIZUxqdNmm#Ct$TE{eB%8*OhzS8w|xT`ZK82rXMPOf11 zX9-4OYRgCYS(Zz9yLNsfdec4J7JbP8^OrHN`m`C7^~hm0%L;FMxq#c8Smh0!Z~(T3VOL-i_(bfvQLEY~08 zGUHdqaZMxD$e&YL{+!A}r%Yfug|5m$p55nZlwn02!1WYgtN5)y$9dU8@SBQDOwX%K z$tJcoukyTZ;%D1f53&qY3>mnIFeozP*-P2jiWWf9crV$vibgi7yqC4DM%orNWU208 z{0)Q?)+6<^fv)H?@k0t-F`6W4D;TDfVJ`EP^S|YGs#kb!Dr_MrA2A(1Vmd76)^oY_ z<=lEM>-xRiTlUcueqUuHbJt$NtPD1;++qp0wV1A=#C#Fgda9R~bNy>v-^evb8Rr3d zBUpoUEuq#$3AKwdS+-%+H!*xLz2HR zo8PFJFr!S?3&jM4{5?NgL-2~q@HIT*D%ZC%wo}FxXYP|#N!U&?wpPY=im_GF?3On& zS@e}8kgBeQ;O*>EIqQ^a@mi_<-3E~(w@z_ zY&KKldv5(aVO9;V=aiW^_7uaMV)#=8DK^VjaNR|_5yT?-DqX3pu$3Zsj*F|*e~EF* zl`L%*^BWn`rjE**p{*A1`_5yS7KULSa6Qz)7E(gJ1&JtcNfSuykx z3>?(x1dlI|<0=e!62N#^S}GTf5#$=S?nFPXIYu>zCjh^C)+jT~B`)tJ%Yxi z#nPZJs792~Q-Woq`YrPY+x((}%90^(E2%8l*21`>j1x(ztu(<_7dt}=UF+ot`#t<@#wpY9W2e%G_}PM!pFhD#+n?cQJ5JF4 z0%rt&g`XYLH~4u}x+;cCJ8{zVXz5EjYg+mWXHCzLzQK9Yi|`Hl#W>B`D)wT#Ng>V< zt`ggEhH$NT1g8i$h#fdVc&ylk(}V93yXov-%=dfcL*gV(=l#9-0w?pnBEFGdRr175 zoL1|W=iiVL50VlbBApe=pAeFzMGf3sHa0?xS$1pG1u@e zk^r9y*qj0qN|gEjBH}9weB~VcO~-E%e&g{QgXhB-hk?g}I+!hNy6E5`#6qNReZQaM z??3SSp6}m(#ozzN*u9CpE7%2t9b<|F9VO8?9`e<}Vv)p6j5SbB=JHCq!jljSb++J!4enSc8ST>IgEbsY&PCnH?>P~l0zyf!x``KA(F$8_HT7B*IcanQbgx=2xsl3+E?o?)_v`@zmofkQuEI@^;WTie&77(1@Wjphkh^o z^PkvJCXKtfQ5_0TBpGM>7fR`6QE}LHlNA`B9ju9{i13tv02jtD_naG@!ZpHHfFKSWr|{TfFBBw|g{Q~oBn5k7tr40O7l&PTG=TZJVQ=J@X6C;^Rl5pR&!Jga?+>;72 z$25&HovnIs=H?eG_0P(8)h*O-EYvS8$mpLq`;RMTKeC|rz&qyloBimhj{Ww56}`r_ zB-)ju1;g?u=jBcwFaSGAXnaU zEFM)55mD^cz*G?tHdm@FH@Wo=E@X00!i^Pa&s5L_!>)O&xoTR)@!ebo|t zU7;Va4FEQZ2!sIgCm-Lll?Ior3 zlHMlPToUW4fBH3X7T=?=NY*2!)sV!w5MI6WX4pdT)&u2YaUwLLWJuEAqEelfFKw0k z_EnEOd~g`O*#NO0r}po~7zO-}p9AF!ozVm2o?`#?>jc3P7xrxs=&1w-5l{BcTii{) zF7gZ3EuAtIt94-Xp*;3M?HGCi@khfToI)AueOLcXMi_^t2+7~7o1Y^(bPnU6D1|*| z4>ozCO~K6jG;gD1jifjPPz1^J2ot0XxSPd}D@oJT%HpN3JaFj!JEp()$KQT%r?)U= zTwU$>)YS2{b>mXxOTW`UeR<{)G4iu7#K`s|`ftB{=H0vIzq|jL_ZBR84{wKPi9(U< zU@5xH5@fMxR@Ea}(KtyDkbkN(oCKeynayd!t<>pf@ezlhA@==`h>N;X=bAMyE4Z}h zhT{Szqmb&L4eBwo?UJo5$P!`l;1dqnfbpEa>&#gHjue>N0dLCO{bnCou=G!_ zEdCwHj8;Lv!Dux{a+HOd)cAM^z~n5GC(`PpA_NFD56KT|2_hUVs-P*!c0&rLx?F`m zq7qHbX+@y5s@fX2j6d|;O1**)d1iiJ(CEn`03^S%gB z=g-*Q9HYe?d}#IScc-NbbML%`vj;S0ec>KoQa8?(XM1~K1CO)|^r5JbMT()mYBAt+ zA>;_N>X8kiQ&++F#Q0!(u)P4^I|~cI#4hwps0$A1fA&5kuMze`dXl1=L_lP(c>Su# z)h~$Li^`#nIoDiMrc{S!)b`Tn5_MWY9r6gAlB+B{wr9_n7}($e32~|?G@u)O&?rwg zV?4T1hZv0qD-zvNii+f!>n|)>t9xHsc($hI?dGOcgC2UMWO>H&Vx_0|`?#cfW#7zK zx9M33rCXQU+9k(i6A+A0uX;Nfapb6hG>6{`&v4t2RXSDc0PVwfd zJ-rvz!$N%--#%0LJ*!Nw!7|FBUFu~anLPrERLK<BuOEB&<0EdI7%^-5 z$Ucoj>>>8b2}(xYu>9&iJz|P#3WwEU)CObJs=7ukJi<3>CX8A)J~DVWDnw=$Dl}wO zv8zi>yYmy|6u$ui=E{-PDh%6A4BOqQ=@W9EJ2O(V+D9yFUipU^OW)gh*UQ@)ykAZ5 zOlv8hS%P6xDpp;)^s6am^EFG*-EVH_U7J1c{I*|wu&j3Xw-~n875-sEk6Ci73)xNz zdoDWE?D5I(TO~L|99RrO0hI5Q=C?|9Wjl%Yi6ce;GwGYRfSKlT#B)(0W{)tfwvZw$ zA>5sMN9l&RyAI0rBkxj1@+CidaNIcQtXg8i(G|chn-IIBHTm59H(AZjzz30{g-}a6 z9Lg1MqkQnJIJ!lA{k48d{}_E6C-y>2{A%pHmQOeR&u4{m z>-(44^oxF)iI1v=&Y7H_RZ*TbXlPN^r9S27b~i4c(>JSszh3?I1AZkeOEYgaY7{9S zB#n?V$|8r?)Wk%l3{*UU<>hvh$+|kH5bqfK2J{?yNmerckd9zpO@p`vJ5a|-{3s+~ zV!HG$8JQ8PJ3qNNn&6UIJws5b5rV;riw$|Doyl(6G`V`AEv(o5Q=fbFp1*FNdaiGj zEOPBR0~0rW^VpN$KQsD1A&xH=V(zqWH|YA#7nc7+l)rXKjDER8nlxfoqdC~tH)-nK zZu#=$KRhzNvcz3?>G03qTH=b*o1%MZql=q%HU0XVwwcGSZ$EZZy00+(rHs6GG3txs zqV%ivztfNFPu?|s$I{Ct)97_1d-0!X9b&y^DFU`!aIg{qd1jJ5_^u9H9Hf83G3Zm_ z^f_Uz2qi~`)G;e+ajW;UR{gN7isiEA)mtr2r^Vt*G|v%D`qQQp*N4heL}Sw2`575Y z@383y!GDM@saHXNv;0YuI!69Iz)aEU?qoN-~@{v{oGcgJET- zPe~cSaZ>Nvy{pF`nKSjoqWAU74@`JgNc-kpYH4ZMr@mHx@3DnHzqBwtMej&={ZWj( zvQI?4erIv-j1Zr5MC|G%6n(PTT88kPnJk$^Ji zY2xfZM8k3YHxPY*Nzs8RkY=+V6C+|z><4&| zig8}4@O~yB4G6~uuaClr8lHv4fxbBL+EKxZC*I^Ev(cA9&MpG8euq1?I5V$q|AxU6)Ai4kLa!w?`=F@*-+zeuWBKXV zl5$qO`{)?{F(;c8UltlKpZ=~1Ux3p$sLL~cdA!<-==2S&E?lpY z+soUZ%DAz?_x7)$%}C-x*%}xbgrN)cu`|mHygJ&m8SOzxVfzixa)6n*uja6fY6?b@gBz3=JjgQwU2vR1zQEB&)S&7J!v z5p&=JG4l9v{n-y6yS#Yu<;VUZ0v02f&k{jBfOoV?G4z(9fq_9GR@oE8yhTwD(ncf{ zp^(TKFtJo1K`3v+=M>exYyY}u9me|9=9yzxS1d6d{qF54zrBBi_Zm&bx}0gXcg&&p zgmk9&jDZZsd`yC3R?Ts7CJW8SH^?s{lZ9Rw;S`aS^zYxgcF%G#MPI02HCwcQ_wrBa z-@MvKUo0wrk^qK8q^yWgsfT1Q3kisbuv$aHLm{_9d;?81h#*OQOHgBbbIY!ETTDl%yu7_-$84u}t(@mQPZU`+t7Y~$;^$^)02|~} zF8DbtOp3}%@2RQDcEw{=eKLyqnVdy3#eH5PE1 zT95LUEiG%0PcO{>CL=p#NLInH!C8e1e~zAJK&n$@$V{FG0xJj(`6aPW4io#!pX;yd z3)Oo3wj)f6g+L)a3+|@ewMgii$UxZ>(v7zvfK*qa#G=SBX~Ip->-6v5(EqOgmnhu6 zb!J<3!C385YZ$`DK*+2B_mCyb9%U{+Gh z#pKpQ^=I`ke77^woaltmbC^Z65%%cV6|;0hR@VBZHU;bcgw=ckSTkUggap`9-vFD(Qg0Yo#A35so?QXFX%hN|9nF%$*z`-`v{N!wUu4@qTj4ycsE} zGv-W)SKJ-v;wHAvNXg&wU~eVC_x5AZ&mfY?vMDG)6&8}os;{4ZnG7Nr|C`3>yY++k zX%`>qeewO#ez2wM^g=nqdl6qfe8u~%9OA{AJ5c~}^rJW{%?ACAj~=S{Os0qN`o!xX zV8mz(r`#s;fFn+SLyr^nN|QXHW3Bg$oU4%BgyQ1}LmkdcsKiuhl_g(R!9>2iU_}2fy`9bq?fZAd@3C9FILP9_|u%F9k|HO?LHoh5q z^da%pSNci)pK^e5w4+L1>jlT&?9fjrbvG-axe?)$@fHv#h$bp^9nUI=ygop<8`O8? zZOAOJ!rux~rPZODfd4ZI?i>jp@N={aj8`c3CyXAK_H*Rh?E}(eLiL=-(dnuN^Vm7_5S%ltslzo@k3FBGTaq z4f2>&n=OEQ$YDCVP_z<)!t5shCn6l`0kSa7Wp;%N3d3}+ABYQPlQnDS(i5NF@$%~B z4`xNXKas8V&6)C)w&wYFA>O;AbVXA6RQ<2|hcD>fwd0DHYf;|0gYTQ+eCjvPKK=AQ zP`~Ns=gMVx({{+JP;|p4ag>$RQaOi0IPgi!E`EO*>FDLrAE-Aj@g+b%kzHz-ZF2lY3rJ~hnq+J ze$9T}yKUW&9p}+KsFs*&ZvutSVK$-{8HwvAN z*n{M-hR~!fkYjF`0q8_kg4i_6;Fs|gJ$Jm_FW)AMUQqy?;#JD-mpr-ia z9xE2j4xQadrbYPQH_nG^r)w{&A8tlHPKx*IwN(zXW6eO1Xz@xXQwpgw!fyB zBGO}G?4i3Kd*v@@GO7!DRTt`n@=+)wi3nnKwj?$FUAtZVrRc@;pkhLH2U`s zdDG<0OO}oPo=g87FH2W?}w1OP=oN7@tkIchMF`_|08R-v&fwwwxM0y#$DkA#B;)jZ6v zD$N>`E*kYX?*?&tj{YE^$AUxFdhn&ySt-06Kt%ljpAOYVqU|@3%%f zKAE}`Z5ZBE0wSU@rcNntgw$wx_D7en)ScB^UR!m~>8&H~yZWmqzT4DsqxZ~)ku!30 zXErRIC+9uzmq%)99{I}y$A!Fpy{;d>b4N|hjyvaXtJ+6e4N{~X?e>7yg;tBuJmDdp zAZt>RImi)rF+hPU_zKG6tojH>T?Yw5qMyHQ855yWO#)uI|x!&~K3I=;H$P z(XV+!Jkb!V5zxG5%ynp9CRBHQGYGyjt@pT~cMO`@+{IvEh_Nn(qm-Jp;LJytKmW-c zFSRXytam`1kiB~2^enk${k+yYFg4%qH9Dhw3Td7fgmT~H@-6>&R6a9!T}uk7-e;ci zak#RWd821pFnEJm!))#%o52}2g_JL%V}5EWVYUI0w$S3Je)Gq<_46NRhdQUXsS8c2 z{=UhSFl62c?-{lEM9Jh5@E_^-gJ`1{SMa!On;cY50BmGt(x=vgsxDB1rEi3pC44hsbf zNnjq#jLiIVSQ8_^W(E{Jt6Eb2(0s-2Xo{ji=`YTooSV0GOv^7OKD>Y2DJ*KA8UAim z=m#Kl@zYC-;+G`s1R-d)a$hwCQU=0i3AKG_?~CYxekH zRq7EQ>aj{b#Ef?&d{MlsL04lH!M^}jEb88}gh1J9(P8JsFg-2vXGi81)Wk)XxyqUb zMnr(*n-T^NPA+QBkr&;Fy!+>MLE5*bfTD>-#b_NXkeprI>D57J!>eQJ|G=xm@($kW zK*wfT(|aOuJwUd!%P)QMs&^!?IN)==4WBCo(U#zNy9Id`QdFeuL9Qvnlx$uyf55r| zn^PFNknARkcL zzd?1$U%5t*7@_gj&l-!`KEVtICAk74;A7Zuww5^WW3Dv+nLNZ*2W#%8wFBA-K$ z#2jq)fKp^ftfV9%H`th$En%xcQtrR%*7u3#nN=0DXIE6sl$$&9Oex*g6}LbJg(33g zlA@lA?Ga{63czbo+FP#s99bn8-CNx(h&^+(tI(eSCx0~c;Xdqa&4II3J$X}o+3Mkk z?>o^l=lNBpv%A$^@t@g~$>G{MEInCwB$-aU61n!v-@W+ts)&6gagjl)wsH?r$|7u$ zkueEDLH3XkDaH!J(OCQ^7n!pWeEA4|@lPU`7l`0~(0CUjWrJK0`NaG)^^+<#l@6XF z7V8^x%9G_cZ~U{QKJ)P5#b-=sdnf(F?y8;q(xolKr}U51JFfNYH>GatrBjbS*9ZzP zkaX3l9sot$QdODDnUIhk-J?f(dR&anmgtBJwOV^)&i3vd7!n+;ngRonT371MeUm*B zUnj%eVYmDn0|Q=6D@N)Wsjp(2;gy(eX1FEfMw`>%wG`iy$aBKpbIrE4%vtWjsX1*s z*7S^zi(UC}TV_jP@r=xsTiase&%4JI6pk$@7+Y8{#x1{9)RNh@tqoxDYqqTEHLIw2 zdiKh#D{b*TW0!ATnLVwjU`&2K9vI_xk0Htb4Hh2iDG!>uA( z^;q#{h7h3iOfppQ1D=5K?2dLt)31|B4zeShQz-(V?be+7{`>FsEC2e}zfS5KM1KlK zd7}^i?C|BwxX7P@hr7*kT8~x{+rr%CC=BL0+Ti(4Grr@3-qvveW6}z(+y*bSNGgZ4 z4b64B6Z#KPYynxxVS$3=c&?k*r9or%0BWA}zahhkDmL|+avJ+uD2FqoJv2I62_z}P6z}FErF1I`+sM8pjg2LJ zM~ZDD`5aiPmehwBuXq^2 zX~NU*Ma_R*L_XE|(9=Nl`g{>95>u^NNH7_XV@Wu7@Ak;K*E2HGE$GQBT}Cy{t6nu6~0D?>RPoVo^?F?Re9f?JM<) zJNuUPo?cTwCC8+O=N2Z#ZAi@5muOn4D>b>X3_WX*n$=yZiuo2SC6`46S*@nPfB-ER zhZdMMS#UbW8~HZsnlZyh2^-S5VWsn*2C?vx{)w<%(l?9i!t*yO|4n~T9w5$OB}adH zu{a&uRV1w>U4vFCrM0|vWQ8z(Bk6+ECe@Nl9oLmo?;pe+m+;*dU%n$kOSJb)?c|kU z$c0|gK#E*i140lLN2ZA4u}G^kZQWVMNLRu-H7&=ODPP;aHt%vp{s=Rr-NG?)o(O;D z@o59UJbtQeW_|te@hvNVgoU2Ig;_+Lvhl%nQ|I^87s7MjFRqL%8$Rg9+dsxaYj0x~ zar3$sg*Cy;Y-h+6#|BFv0<3B`uBuio3R_!bsb1-+#9_{aN^!`650hSu3E%`4@DZSW z30V*{ybP7rJ$!U@&fbX=_s(hEGjZac)Tb!$zSUEI=W%hrW`7mdb)c)ZpMivjutlBo#4iZeRA_Lbl}KWB5{Ek+ef;um0@U zOP7=t-SS^^l}7ob_BNtO$QOdsyTlT{7<%eMgZ-U_#XpvMV|L0Xy-VL4P;T#?o<6p4 z`Jlb??t3bGTKya`MQPlBsegT0a!Pte?#`0R)yoF7-Zh*yfk^$7q1Y??7O&J;HM89w z8ygk8#3iA*{15YaxsKv<27i#T$ks`hS7+o|b_;YbUHSCL@iV3#I$m?%puzVIuPQH} zdRNoz{`v0Q#*!HWAJyJk*;>(Jx5nH(Z0V*X*9+eKZ^r7wm;%d7HiYj@fBvonyx!dLJF%Fn(lQT$fMXl-wKHCDlL*2rWt%##Yx=_NA{Y7fhSOj)~4P2Zs!3wX)?Nqlsxo@vy zSk|iNXD>LrUT)GmwEF)$q__hECtv#GEAKVaH<}j7Y2qzqxn@RGMv@0(E#wk{0(&v< z@ui&KM}}FH7bB3f_C`L1RLgG}s5E?WJV6$F*Z(%V(r#}|uxC~^)x8v#QI&grVVgB@ zzd0n%mC`qO*MMMmHTa?l99XHn1eq6678qo~(v!R-7)*k4U?WK-w;$+;|y3nxRAp_bzr@2@H*?tAG-3q@Pb5T)Z0(mYPRzo*)HwKIH zhHgh(SHALxC$_zCZ1>ci<8{}dO45gwgVd(qyzs(ro_&7w-n(07%xGzuJ{|bGOK8{^ za-b#HEJ5)FSxie#5r2lW}8481(+EW4rh0&d21z-Z!4vDN3L2)tnbUGafyrzPEGV zBT!B)i;Bw3jCVy^Jt4uN7F7+yzOHUPej}eP7hg{?*Nl;-p8kaBiSF#LP!!?supIU7 zKo&>i3Vh;ddi`vHz4J!5qxzS*t;{FfZ=a0H=+#X|y#~7D#4ha+@^0xZ`XKwSw9Jv$ zw{Jl~?!e;W{2WEev3kONjUy^ZlIak);W z=NA`b4B9iKmrv}ioLk;v4~||0q3Atx`}oOHvA$TjpiaU{QYQ9^1xgaKGR?@!1b6$L z$3f_`W+qFHCQ-4CT@y0>Xvhk?yOr{()KL`!YFtxCb5iCf4{%cEfKr>t=yWwFRSjuv zc4w7WWR;a8DYLkuTT-SN<4?+jRKkCzb>^j7DpudH5mg!@eS*D(mLol}R4rw`**ot? zVD1se{u7L-l3rpM$8C6K`r8sCr3(y`d>c%YA4Y1G8UbT%Pmec%y7$OpKuKmX0vjI2 zL6+b@GoAbp3Tr#FEIKkUFif!oEBG-XF(5?v(#;U0fi;?&OBNq1<*9IDDT~3Mk0+q% z%_$v^>d`y&(>Nn+hxZ&Z1HP5rH|%0r8>d+Ma`eO$xsIg!VrVSnF``GQ)Cp-BBs|q4 zTMM}ZL|@v8N%Y;q?~FvxPWs*obB}2LQJDBHJfQE)ABB<4L_4Fc)|=OvcFt&{F{a(k zr_qlu8B>Qyo-g)YaFV?>I{xqbPAUpFj%F~n^b-6{?cj@}UZ@)sirZGaM z*UZF~l%{AFBZcuEQAn!u(}T0q_+9f2njv?DW(l%ieiG&$IfY@;e;P(qiEM_+z72-@ z!)>8I0~jX%HW(Udqd%=Y+pO(Hy$m3ttB}?Rs~V>6f>)bd7HJN|2Jj%+6ktK<0XvIS zm2%241?XbLVcFv`^sBP?G1yAkkLc(1w|0mO{q3D1Tivw-|Ga<_|5Ie|(%*(uUwm_) z>0|iLvCyf#vFkLx7irb#=eiI; zMacj2#>Uyj^|a;U@riI8U@o021YWDUHr( zcVZ0Xc~gMKC?3>?f;-ZnBU3K=PZ==(D4jhnN&_Ad5sIf(5pcR!DNokz8JVGbn#6%spbte}aLep3N|Yx8Vu#wWW!X z$OE<<>3bW5>W7e8Axf?71M>}#?!7te?=iF>cC<;s&nYra5frP(NSOr%6oEpoH66K7 zc{pvMTymGi28M<87^J0SVNE<=%h#lm9zmYmfdd&g^dZF^p&i*YF@hrSAaBWX!Ga(! zsoWO9q3~b#jH#kRWGGQ8jLEtA;!^!4*rckV!@_)wWXykeP!3o<$>Z^kv--I$uij!D~2^?BExF&V|AL= zSU$Ly>-F5CL4yaCdAAv9Rs}7?#MeeH4MrEMzLeDjT2+8X(9dEI>u1V7n#QAE=^J%y z%)nTrb{mUZVea7*HvTOPM!kvgWZi~`#+2I9q}H!#Obau*jp@z9xbq$LNBOPMpPN${ zk42`XEo0o*K&!so38P8(K!IA0bc49L5fEQ=LYSeOv1SFBur4e&-v`V?8hYbvsZ~D< z7;AgaU;_wkL5|S7@5HQ5#@QUsvd9$Gl&m;Cr{BpfV%XLEULtt}vF z(x88|9CB6n649e(<{}AUd23vsv6>@sSlR=-W>0)azqa>z{a>3Ff4Fz=`}f3TI@N~t z10H<5)s}1XZYy0mxv_27(@*7&9+HO9-vep5U!(aplBf#H^AOV`?UvEm$(+z&P+o$C z1Dd5Fd%{n7gBm0w448Ywg8u{qPQc^_p6uK3P=6Q?`hyVzO#W>!#4Q8^Zn4tn^eQqy zXmoIrf^-?X%g&%gk+LY{4@og_1}Rv9RS^7-wGRqiae|iN7b)G!6vhfI88xb;xUsR= z_g8MYbV*-YS>HHhNMn7a{Kv`>qlXL`J%Tben{Kw_bi}RDC`s_;3d>^csi`qBiHXrs zVP;QSe7pr~7`=K025=@pH{IT)=M63ISMsU&mNAJ7<`@JIe2TrBwpVxF_rLqg78MTJ zHFWq0k?bA1vbcC>-=S35Z|7Ej? z5m|9P8}4WveqlW}eTYjz)_wcZhb8Fw0p^+=;0n$G;1M6^8*v05F$xJt2k?*htuXh9 zoebmnX&8+7o}a)&qe*RHG;z?5wLRNupfTn(uWECDAUohI+#|5r1^r3kn3pjhIl~5# zsd&VPon;ZAeyo`iCPPC!foW+*4hJMS=Qedx8>uzEy&#-JN||dBf>o_AbF@fpZ#}uH ze(9Km5LHttN)~7ev5#Fg;>4%=YcuCAnW9W-LynD{N9i>w15=|)N@DbW0g}En?=DA9 zbv80@{`vI2?T;dRvhGn()_4Y~~ zs(p59;w}A=yY;6UUl1oe3Eld0jJ!Ig57K-gbE~EAxj)hH#JkZ4QknWQj9}yfJ|{8g zsGJuHd}P27rG5S(R!JU4E$bu`RtgYJ$&z}N(cv~dVBp4DA|+3nMKi}GCc@<@g&|Xl zES}O%*YTFLVMOilLo2EOK7H66rk}<}f&8EU{I(?G7#trJCTy8ixmouYxX(QK~c_5dh+I_R7J-rE5#iwuM`~Vte2ijA4f5o~aHeDC8=T`}xPq`9$~zY}p&vN# zRU9HKw;7(vxYwCpt<+_^5=$c!tMV3Z=s#=VnTAQJSN?6n^#{Gut=i$hkTo;<&zt1x zQ8}x|A?Y~R==Fb^BFs+MLm&8@f5oaUxMt7-{LGoV#sH=0xYAdT_#;<-?TJtHJ5 zaHTPbsewr{s|y73(?C1l`>3gMQ7$4y zK8a;=bXij*A!agFGJRAD;Xd@}k`OmHljUZ<2<+7c%*}oRJARG|iWNW1eSk#3e;S?3 zhy96CT3KX}YBq-mTSQcpgcBm59=mN|Lox*|9nt1W%2+|j&nE;B0t`ngi}TnqY$2sB zr+@eZZ9tWWc%N6Z&%BKP&fIv5wxKFZ+tC$7wvAlzBwD3KrV18&gOemrq#gT9SgT`I zpEsBoajR$}U#9cK403Thon7jQxPapyPX{Rx$Cm1N%D6b!{Rub74=%n<=dR5kn3JUM7LT=wrd#_9p( zItulYUMb!}a>A=y$dD7VqPogcL|!XZvV_m^8)K^9*WZ11F70Y`2&+-VHu2>79`VjL$Q% zchft>aoD$Q;9=Pet|YpEE5oW7K6Fn?y>M&+J#-W7dR|OV!E|! zf@I%<8J32=fi4mx!{_LvgqcVEk(}V^kf0c=5^0Z?J&^&vz4-_v@KSH*>K@qH@3{y! zk{&S%2puZd%BCl!H00Jy%~QNMvnfFHZ7^5NCShCjXWGF3tvNWYafn)1vTJ8C?KSUM z-gn2t`Qn@FRoh>fNV5xb9Tb4?0WZqdqen#5pOq;$bV% zz*8$h{xM9KZZ_}`2O4-9c+Jn+o>tJg!hl{=kKSS)G%z&?XhnE>fMQgJ&k9`TdhB_p zT_M?JJyMdA!UH`>vr&Suvs}a8)KnzN&}(w+(a3tFGANJeK&n>GqtYuMS=hfVHD#6QoHfWeTjQn_7<583 zen2Y#x;}LEa|>}CKvbl%DJq&H9iN+*Gk3V9e&}9c{o!I`au_ zHt@rcgu$r+;1l3sN%9s;l5KiF+R1`?Jj+ra_k9wkTf2}R?c8q9ZtWstKsnjjt|qDj zSiW>?mCp>|-WU0L-;c2rqCR>s#@G9+-1~fNcJag9f(L%}P{uQ$8y=iz zhwtO~@xU(cpxzXB#{yY`6AaK2dc(10C~%q`h&f}YjnMD%7jTCGQ` z?cG|f2I(zFGP|{!0U2)SPqH+iZ7T_PF6fRuG-z|IQTqYaW{|FBdI1)aqgpc7d;@r= zw-JZH?iPjEAR;)HQ@8FnfIsiqAXd`*f|Hs zS{%K0%{U9;U;o0=tC&UyB47``_aKyI=YAiB@^Q){!f+a11omi))zLAUN5xic%&*LI z$cXZ-7aGA#<)?Q443=Nrdi(w#@$IXx>R&^ks^x6KdRfBoDl(} zSnW6i#uq#8(JcaK;2|I1z*B=aC8-;8D;}2K2A&$K@N4@qwWPp!{S>~Sj|mfi-Q zTIn3d$#NwARyey!yc?|`8MsCW%sqzdfyH1p(;4oT z^-a+rD2u_`9+z%(%-|rxcAa_Fz}6t(*8$3rWpvHZ2G1hSMrUC}gR`(QncR-3o|vIr$#W(4i%P7@U$|kwtbs39Hf4&Hw;ZBzuAqQ@ z|NHJLZ=2(?5B5yc#{Sr`8sLjvn9#se7YB-Wj7!$X#Zfv1{%G^}6UhKFP>;eiH#=q3nXZ^(W_k4v#G z6^1jDB#ZEv*v97U;BL#uHgjsKTwhV5pPzbY$+Y!3!(8>I?Arb}n$$!7?eD;K8l#&yq>`z0Vg zQ!J&HMMm}%!45S%96n%ZK=0ng#VKawZ&3C|X{mqtZ2>YP(73VCgY$zFrxJ-nT5x2X zVvg*VC9O~bu9H%6#nqVTjq_W#^^6hU>+P-HPwqG*w$2R7OfzfoiE-N0+`Qt9>;iYS zy{vz<7!y`Kd6LWIvJcOk-?r+`tSbBU%c4p@D%T08^X^4X+t?{}q2lA-IoWP^cBWgb z4T~LGVYfyUloUkZg^U$;ycM0vQGiUqTB)EcR!d2VOh}-EIZT!zwY9^C4a+FZ?e9CG zszdP~Yl*CaG$U8sh%5?hpYtUl|Hsoj9_v+{*E^%QIAhqt zq1)!pM^@3r=!I)@&JscXKTi5k8w#?r3ktHc3O1L_8GhI5w)uCq38&RoUEPC;W6WZ6 z3eV5`jk%{7@&CB4D44N=&+`*1$DU(fj*n}>+AqQrM&9>P`=n{fuNSoy7A-40n>wv2p3ZJ*O^Hh!UtByk$w&e3 zjybN(8i>!WVsF6eP&CO0!5BwSU@n5U3*A^3X>4)v_{6xBRwS4+cKMo#PDQk~E1@zSL^Fxp4Fm(_Yu*W_gKxd%d%G5V zgC`7m{9ysBt)VL18+tR|g}~_#X>Q)ngwxGi%(H&uIdm@IfN8+gzP+cFYg*>?$HpAn zRZ8Ic7CbHTytMPj^F^X^)`nRt?jFVFV-)r zPI2^d6c+A&G%+Kw5T-VA$H9N+`J|wpuq8r7NQkxP>Hwq{ghmP^*P_92@F8&v4KCyz zv!JW9q?`{MF{34QuYGuhZHlirtfB|@BgEBDXo!zXYrQk4TM=0`SI}Y|zB6V8%>uO5 z#E-tQD8%+^$W-v)6>AS$gh|B3^c|X}zT-%qIITIYN8ysTLEyKu*lBhZ-wvbEbYa#6 z_DD#G2wJUKk^ArdTkIRYe49=QW$wlv&TeI;UsT_U)Qv$sqfDQaR8^Jq9X3p!+^4#_ zPyb=VwDzd%nR5$c)92oqb?68C(S{5wgT#S_VtUr3L%Sx!xHpSYy8GrH)Gt!(*x$Oq z*rA~G@mUyOnsmf*(j^3N7}mkC_=ncOcQS9kBfrmgvLy1j2*2+cN@{9EJrH=BlCr`MTfYIUylX|4ct4 zzUCw2=G#}SP3yIGSwhD)j1rG8osWrDdUv);F;I=@2x=ix#j#&Hk(tkDHDP-os4TrQoE~J~1yj0imty>+f`DhR9`F?IP(f3R7?Uv^>#Ls~m zniWey{?j}WM^@KiVd)>#dA0pUjh`nEa37Ht0-nS=0G~7%Az?L32?{cstuj`TJt8<5 zMu{z{q4I%VnOaqyDqhuH!yc><7p}?{ zarO&c#@QePyjL~tCbjSL@$nY$1n_VCN9W(+-|#FzGsIG~b+C|oAaYB2Ct*oK^tAO* zJT8mH8EhpkV<~G~iPK`}h)9ebW`XhV$kIWch^i{L$MsL1 zzp-s#`D53Ptb1Z;^)FTk+sfV5L!U66ZP#{v_u!-#_s&$WTv2B|_2R_2FFrcK)UHp^ z>en_l{j6S-=Xf90>VMYMxVGNcZxc=gM8Eqn9p^!Q?7(Q)$*lh?k89A`| zY}hmX28B}+EM`135r>&!&f{Nv;)1qg$d2pJ>7V}b#`aQ?RQHQzB4+-RV{wS3^Zs)i z%k>)3KI~^_*NP8x=aSWVNPd@F+Semz;}2ozA=Pm zGCbWuzN9!lL6x@mQ~EQdy2EawXo`}C2Kmq=D+t?9!gb}!sA!gy~6x=?BG{lUHA2|BHqrNIgg*5ci$`H5Z8hu z>;KBm_wa(q;s0-^OmK)^XTXV>LA2wkM-K=N%4{SbH2%>y{4a24x&Zz-Jt%Yn zVk8U9t(G0;L3dMzn+uMzmJa+M|98Io@plV$WLmspg4!+7&deCUc%!*zzH{}dW$-wdOC-QZ)Y8k<&)Af!NA0=)?v zt|xLV0!+rFq~v6s!_sPxh>iw^V6cvBd?9pC!bRgY|V_WebFdT9Jpz4@63zS~qZu_*I_g5~#A&abMQSnPah2-z%H8xRCF!Uf*)+4Iv)S<(P z&1`TYK58I{GLdvldJ}|SwUZHLtqRQF*Ejrb=AzNR9x=EaNV1D}SKs%;Q@g%fKjryZ zy=RvH_;lXFq1h9w229DD1#s!C^F8v55@Y)gO7Fe>*z^~#&Y6CC%f{c#i%Oihr266A z?Kds88)lSFE-YTyFl`H1R&-E_L-e5sNeyREj~XnKazelv!&l3MUq=YBJ^{hO zAtCWTa;Of_)#+Vy5{g)j(W>AQ=uuDt*cwQ&Knj?e0!#o>-wn^=rxW@lg$$}$_wKaO zkDqP}9@Y@T|13A0x;{Uy&(emwHx|W>Jl-#7R&$I!GTbkC_N!}GUAuU)(O{B4KmIho ze&JW;?E_ST2gR&4GA>Qi{H(j>Mn5t#{9GXoSB8^rZmVY6binp^9k;Y|w-Rm)MEF zMwSv4;^E-y0>|lrsTm%-xa5KTK$<@D^-<;g)!d8z){BABj~18WIv7?nz^Y)>SKqG`L$7q0pvPVG9v7?bKMxwmF|{ ztlg4t*L(BRORhb${hPJ!f6khjGPkI8{CFw-W$s>^5|h5Gj9*s5Ut-dI_i^{b4;|z; zQc`vueV(wrg+#+>;&qNvbBG;z&;c6k9x5Az!042untte9Fc`S@TxtE77l(|fzQ1H? zYrkc~AhbG{X!4V-MeEy@w&eJ~hsVA1_L!zL|KQpwC8OUMkUw{d%Rf5G;;3%h+57_w zp08;wy;T_p{*5BPTDT=5!pG1W*dbO#KPuJjO!_G{3wD1XRo|;66*vKavy=l%|8s2L z59=Obp=g@G|2kk=`?ZWI^-Eg93z9N-Ze$lXe6ebI`^z7@=YC%EQRTP?>-Mc4a&JrK zPS7F=d_mna1L)}v$=@G&5eD?N6zWps&cRXkQvm~53q{A<`WGPtmv$dX8GadwMgnio zBWa}2WrQy-EHvETi8B&K7|cIG7{(fVkOUHIR8tllnMy8C( z6a-99ODnLn8NiT*4FxP!u~7vU2dR50A)3&O41$dDNZ1t%ioTul^_d&`q`FvWV*DQd z&!_pNgZ#&bnJaJk41@jV``%UCmak>TjSuo4?>l>Yp%;&5e>AlH=d_gNes}JMJ|;c& zQ=EyD=wk3rPsD0$E|;YzFp+({lafrP2w1%!8pa~P8xa%1+IARnS_2`~oZL1zWIUy(`fyI>;kD1)NZx{;>uPp96EU~CeX>30B z>a3^ugL9gi<~+!sn)T|j=C%CFj)!0EHM@=_@C$Xbdkx#xw4H^n#X0LcacV(ySUt7q zrg5}+g6BCtL_M~sXB+k0LRX1%i*8ylU6UHE9a}^tzL3~-{vnA?XDA%p&Cf@7$^TLB zLMJ5k^fMG`7dS(CB4?2Lf`Z}<^)T)MkD7?mnxD@AB|R|!@`?Q)mE=NBTr*I&=P24` zh~Ddh91f&&p`VaZMYd8isD$qc(BU1O8>q^Y^oI5cuO>0e%>Wh48!8x_%4fnWdR)fJ!o5i=4VJc@j;SV>C7%+FHStpbL!oth!bxyn(!i*Y?8wBNoQtf92N^4g^?m}8}ay@ zF2i%l_Qs`Kt1v3HcaSz1%HrngAVhwP;9`uS)K9Y8{bbn+P)jeX#}(-bI}*QwSMjZb zf0b3>&=qGc^HY^|{2}65YHdQC>AoyU9$wYfSU*ni=<^znekpj=?%`4Jfdf2RW84lt zevPg{FZLF3O^i*;E&w0D#2bWv(VJ{r>Y!wjG*F9=M8*UmS$ID6#k`)MLldN2DTL+V z;0zbzt!m{MjRzl{UU79Ll-IEmzR=3FL!3^Xf@SdYxG&YS3^iCHULoh65}nXVd3l$6 z=iMJOuVpw@zB_ly1AA+?PO2rRIailorMAlJo!)otXL#QcUc%nRILw$Iyz{7Mbm~G% zeMJ8m78s})4d~f=nlgdJG|M36)p;W48LfF)G=e+P`i!^vx%L_S+?;}GV+I6Ek^Hl8y*MIzOrZ$ESe>-T5594}_!3NFjuk(^EJ{TTS z0&J#MlV0RR13esyM)e#(17j%o-}6E;ap38&3;6j0D@9(oi67%m5XQ-mNjHG z^i}RQNtfKA^o6IAR5%X_CHkf+a%gBsh_@?6ZuR%>BBaz)e+Rk^HASN4*Xly3UK>%n zkK?7*&Q&@1+b2Hw!v=os!~OhrW9j4jD&IQH&#znj?1@2Z?rnXqVePOTW@0)o}%qi;?$sj!m%%-bYQD$f+^tf~6!g(!eM!HR`q})@BuKBL{!7}Dl28+R1?wst zC90(=w12cdlz+J5_cK5K8_Q{)*KlYWo{-Zc?fsXeG4A$h)8pc#P1M=jC z(+Pg=$C%E0cBKGBJ*XfF`p(0hHQDY25hP??|3tPo37Y;~wzC$#S=zVwV`f^8j#Tf> zo3inV+N~4o$OzNasisO1CxUD+tQFJNLYfO2k@$t4hzDxV6Iny5-SG3L z;YoMUS>2w3b)o*qB$tKd7!e+BbW)2-BPG?4_gKsZ(Hpf%b)bN46)-l!n@)LFInilA z!;XS}12Xu24?qC*16rH}Nh0_vgRl zhhKFiG9@lC{jT+Q@rKonh)H0sx38Ll5l=#u8=b~1X0tvPQ6)4t^f7hxbR?@=9Thx} z@bSmuJSNsQI#&%UX`TYrYJv~S6kNOKho?W{-)yt;zmsfa5rI3I<()sXs15BY=ruNP zYo9)w+u9zg)Y|Ah!Q$Rk+c6$zK3h6_>FuPBdKl;JA8>xyi8Ueg8SFe6)`U*7qIktu zv?tTJz|*6QPTH~2G)9}|63fbx_VI(j7Tr_0poYcZr1K~K;Ujf(3YXuznHtDRtAfWp zvEbBsD2xngZT#ShrrD4qqFNl4+6Jl?2es(5v>P7U7{q3QvYeKj90*5UV4%?jPo}TQ zq!=N9)YB{0aS2+jicg%j5q-;p=gwcq`i_!4&E+Cd;|C3?#t7WqF?TcbA7*^M(3O4n zJ#*71-B)F@1dUiZY|T5<*Z;8ho)0!vOBrQNc_XKn&8e{j=Ql~a|HDR|iSrM(@_!rr zEEc1+&qM3uYjb8@*!%kJ<)e-;#;+EvYFYDG$>6ZshZiF2Qx@J?^32(QvgD$ufFegl z1qS*M3W3vy{IMM*C1+KKeP9q>OalX{*k7Pz$@C%s0!~>rXV%<}6aIL_eN}R-`eY%$ zJbB{DGYzxDhSZ%u)-*vb7`4o9@>@M|-1gy0W8QN2i{*v4ypN~yGjRX3uf;`Ji*Vke&%jGR>{7%GtbPVF3kWbO%k^em2~u=G zd6aA8?OhBz*mZhD(Tvf`1N-WfMngUv#*C)rDo5A;(bK~zwO2|(lF zAH6V~;}h81Xx-bu|BA0y@OlF3!8f9T)JAxT|L%T8%5$F-UzKQr@TC+KS{DSbi3<3l2@h4@dg5{&{t6Gip?0*%(JVYw&PaKSe!KGSiAYJD|F73a zJ$`RS-&1Wv*VguZV8;B}JN8ezyY}^=qnf@_+DcYUp12^yZ0j{?=v|MEvqlECN96_; z^h_-b|1`5AH#aWkTwJ=kmUm!SkFo3kJcoosetU4YR* z?L7$9MjeInJuVlPoZc)UITh88O1EmqGS8}j!ws}~IiT05HO;xhT!EP(;n`_PF&4Q- zUi1Use_?{v`n{KT+MEwq<^^@khG;wk5uj2(e}h@JQqLPNh&mxyJi$dlHkiQpR9)DZ zh9R1NWgzI1OZ+_mQuDvEBLFN3C16@9Zt$-1_Cs<*#m+JAuP`061c55{oN@?H6Im;0 zrD0Zxfz8@NX)+(r@_eGA_#n%`d>Uvg;vD!a*5x$M!Y#Bt($)KqH9|C?QDm;bIB%5< z+Kp-X)mth%_{V%Y-R#z0>LaE!(%Qn0iJm{$YeR)K2dOKNmJ9-E2>{QyZ?U*9dQvgH z-hdKTbrnQbp13pMpNshxjC3<{NJWFPOSrQRcSh$F+<6SRMIZ|p5)gF^Kvr}-A~23f zNH#?5qrAK#e7sxD2qRMv2KrC6y~O=(A`_+47YToPp6w^8DDv62nEC$I{68P?ODFjE z53FR~r$?@+tXMIIg^pfU@d!G2)mb0@*JHcB-)5sei}vmRdUVgfxB9Xp?&&^bHjNy; zX_Sw&%RRwo)TYsEUckuBm@_(`VB~;Dr7)hpuhyD{!yHxc461OW3sNDd}Uen7#aQOO2==n-+VPT%1(D z+F{+YL;XreY)4fIKhyukd51p%S4{5TKQW4Z1Gh&7na8Rv>)^6zn=$%FYJ$0dzKAun!D7JL+>O+&#zK~W#Rr__%K)joT(Fmzy=vKZ zN`93P#^`DjPsPa{)!yNRi zRi&x4?fjuHW=^T`gORBS5xjE)tiEfnIx9#@1hbK4Zck4)1*N%YTb>7g zN{`}kL_yM+v>!?5(-W}@HpokCce}RTwcV~d!tfx_tV7AOvzXT`q1!>dJyRy1JvXvd zdRCnl#EFE*+$f{98Gya|8Z?yXaOjJk6Sg2DyoH`nkFX-ibL%|9Xu(F6FL)1IDDN|En-jQ_k%pQOJjEIXR_UBeMZpF*bZC zks4=denCGL;Dum=+UG}IZL(mSC`}PzIAq)*6e?rWp^HWg>UH>WmRc~OxBCM)fX*B^ z*)rnb*&#LTm7rlOM?d{M_S+uTTv^LPYBgEhOjvBcgbatZQXmbfH(@&E`virB1%!tq z$H*@sSl6v+Sy-_hGN5Dax>hc0xEBG`zoo;t?Ow#(*dSUL?%D+g>V`_uwV3(ntXUl> z6kP!-+P_h2n!&;HD^zX3J_56mUp@h3H9rq9-VUu#+TuERAd2=c`e5m(FjHlV7$2e_m5mUjZ&`?b*(S*=D#%kT_Fm;6VSKdtm7f!2@X{!SEMxYZWBq^qo+fIFI99q`vbMz>cjFb2CV|n~a9zV(Q@>pOVtCsgfw3o}T zNBlE_J;BFP&-ppH;}LNNNhq~>!QCkXtK82f<5O<|-{8&ySROZrM?+9AEyy>f8v%9@&$wS!kyOIO?0mz1n;o3o*;Yy$bI9GH~wBibbLk)SJy0*5xfm)yQ)*1_Kin(0FE_bky7x<{$AG`q5wZ);*$T8wXN zh>zW%3q|`i(XD}6WMraUnWvEz(u`qRz*vJ>gv??!*8(21IGlj}f9Y?(@O!r7(9r|O zpE>f>@r<;zjEwYj`C|LI>vGCpe)4PS{Gp>yzxd4IeaACWQ|UVWsp}UmeE2i+gf}?-dk{DSvN!sJCm8@}IdY z`9OAGRsYuM{2l4>hHR?Q1eUdufaf3!uGGS;R>ju~2NaVYjZQjxJ`PI{n4?LeMotXQZy1Qyt^{uLBlldd~ z+8$PxPmK`EYh6e2(e^<{E5tcR+K#%0REMD#Vo<-48AscWv~5Q-L@Xq{{f4hW0XhMu z>3~8L5$E071GxIhAt7l_ip5>>DD*UZy0>gVhw1V}XG5H%%xE$WMRr(Xia6uoAte!nB z2|+>00q|Am!d$*MVyew0g@xI*y`hJ|q;ZJ25FJjuP?O%YmP-j(Y>}9shZnsi*){P{ zZFAp+WyKR~vc1_>-Y9|X$Ma`xL+>3~dtXt(#>PFj_J*&U&t%5tt`6D9^(T@O{~qaz zt(;VG#299`hTD$T&diGpxvdM2nD@n=quws7CEV-CzAGqYQ6LYm8p1IX6=OLUekXg+ zFjulHyOh>oUnB4|j6SsCMavrPo4Q}RHf_N(^iZ zwbodPe(_WFd0D_(3G_57M;=3u{fd_(=%qst!a|Lg7d zzWYeU*Fz@DC&~s?m++U8pCihzg;+xUAUs`8T^y?S;!Ev4BIAP`0lu=%%Zq}1kOu&I z#bBwsV0sq81&Cmu2P_QI8Xk2*btDXIQb(Ga>{>0o77!gbkvNPFzG#6g`QerPzO;h&P`c;Le`H62d;M##F?++lwqO5d*b{Sq z{pLQ=)oQ|oiKH1^(k1;ajGxe&u?s?-PNb5^K}IxK)dd9UB`HW~iu5c@|TrB^R*Nvd8}Ev;t(iM9RGI1YV!T^{z=v!D|7<%$IE zO&?uaX>dVSLa1>7ehMZAYR9fH@l^WEm`03|*R3+#3e`&>vV?&Gj z%y?~Qd}eabl+f3(x$b^mX~1U1Lq{@QR! z@KX#jA^QV=thh8PDLKE-0DWEW43{it__jI%0&F%E8h9&#!Hfl}z0%N_V| zhg9@aK0GQYXGYwgf+f@L;2@C>A z^Cn1hrb7&rQ21cQ`@Nu6ox=zxGjOQp=i0CAe1zR@ObrcCl;ofw zCDv^2so2qTRcvMyV|g?yY!=uuU78QmQi^S?7a9$!0A^a8FlnGA@LHc&x2bW&LnXZ) zs%_jnr0&6{ArBQ7ZW{f-5qC;_U1qO}lG4<{QqRi#l=`IjhP3=X(&8?jc)iu_QdSy$Win@aA!R2KI)n$E3``3XA@M6l<@FRp{#R4rlSj3(c>lEIaq2&w^ zL&NdOVR$=le3ENuVqw^4**kW zBLZ%~3s|*IV;1BdWS^V>>pPl~o21WAj`@~9Tg#qs-&l5X)%bw@m(c$BWts^=+L-p!vJdEvtbFQhh(n>J#$x1nU(-ciG!m^G(=-8AqqYgA67 z_pSq{Gjw`3`Ygwx9S%U)BLJEa@KSP~blj0ue(tgxj!Y_D?c`r9ogEpkbXm_MDW}dVkh%W~Iw}8wdmmxZo z5MBc4wxE{}dcOW(cpn}~iVXW2yuA@m18EjojH3IndXg3Pr7HkyCwi7f!z9ilvq}14 z$u(+sd36bYn3|K?m&sRmsI4ruHl%NWg7xS(e9CYF@pqu@golL%2cu)Xzt2J`LTzx| zJ@_%3TeFV~uv-Z~3sh5tuyv>~iS&=H2NEZ#~VC#}M%USA^ z5aKYT>7#uXCTg9MNqebItBy|fbXd?j+N+h{>hUcBmAhnA3fqyb_Sl0hJ8M-7v4!l# z0@7UyOq_VwiH36>cHfTj`GY#FLHAYFLKIq>EhbwqP-tUapst>;FrLs~1MhpoDkeW% zBu;Dzz|yl5K(TmOn2*1)pdcqF8u?2QfvQiy z^IfO}bgGTZp}I{5lum4DpwGj7fmp`xPhr;nYxnP8yKdjUbz`PZ9W!Ril#>-h zGy0emufo1{qgZoHR806+J5%DKlKD;ZBv~Ju$+qy;iFc9Ks^=$+2O%?L9aUDtCmkIp zIV~wEh(n}9{S_40sf$*BSx?(iRL)aEq*2vSL{yY222hAuC1i|2=JKKT`t}C-o8*eZ znuOmxS+Hn!+K@iW@=AK=^r@~09bA+@bZCCjV1uK*p?$dg%&qjy-r4E(%@yl*g!TwM z8k5#5y;r}S;yHDN{M)LMlB(+BVv&caQyBc7EZEzS7VYBgjjM z54}PEHuN~~27*F$atNvhLQJhzwMn)H`(B2ajyOeYy4;AwQdnjzT3Qm-ySP_qWaV9@ ziGyOy@d1%pae)Je4~yX+@nEzds_(n{o*AjxCE>n)mt?Q7+~_6yj*r6WK3#@$MABuU z=Iaz9ouR-}Of7XLCfcO1u%Mt2z?t~^#l`|JBF*ec<{(pDbu);{NOG!yql7u+qHluc zQ0RI3Xth8cJccdbSygO2#kqf&bppyGcf_0Hx1+VHHQdf`KC7H*-{T)<88dlI9~OiX z$;o4^VMzTfUb(95sju&$5=rL&pR!dei|-VbkCxp3V<^ygQoL*>Mcol; zHGC?t3z6o`2;cA(5gm-|f_u9M-k@@UU0A1Ga|6Ujf5zxej2WH#fT(JUC#)~n7()r) z5ch9zA5aQCJ)Dq#I8-d0^#xf<_h#&++uM$)khriq+y|tZ+p8dVQJs9uNB1V;9QQyC z2MNr-F1^#bdXQLMSG>KXyq@j@KgZjXsE)&M9=jjjAaIMXGr$(2r|z)PU1~2x*x;ua zT|f-aiAI?+lv8KE3!HKWPY=}R`ORO|Z)17?c#awCBa;GHs$b0gDJ9 zdbhLr>GTg+;6Z{tpVkymJF_hC=}&U%UY!Q?b2L8v8#5t+TkWuPT5o`LO$Z;p4!d8F zlHhG@jr7!@<7nU+DYUz!HF6Wfgz?jLn8J1yecaI64=vmPWS(0d&QdLo{+pHrhqmAH z;F%9uG*eB?A@p+U-B#JhRyVI-;P_`2M;EQH>%cJIk6i~mVq+3083{|r&!~@#WPmHc zz5}j2+?V3uk}k#DKV-HFf+-(c*e&eX*H;)K~P0@Zqd7JMs?9&D40!qCMvXB3p8fGOz zxxzGs3NgBnyrs!jxO1Vc`JN$l=4YJ)bCY8dE26@i5#!dM88pGsZ>vvMTvUv&`GDD% z^6Rln|Ce6Y`p-n2BV4%H$rV~3gD_9c7VblN`ORV{Bl1Ys=vIrJ+_k$Db~`eLDR=0s zb{~_tCb&z+FwpOeRM(OMj1p_4!x7@0Y*i>vBTg$n_8j|~;?3AVfp&YKz-sbGNIW_) z1S$umgE`S?pat}OIYDNhkJ!DaFY9B<=r;sSi!(wN`#O9iR$=H-IXcI;Y_|9u;3ck*}nC;aN%ZTS1+oPWU?FZj6p zp`AM_-A6GMSaCW7`8<>Kpti|E|xf=_M@7R5l{n2fA=JU@DZTMTxi;xBQfQD0R zbYp?1Vm2!*9Pr5cmu}xa*6Pp-M9E*Q0c|#sDGAL%pFc0UA^be1V>xUQUyGt5wPJMM zR8cWnr&#~?=9_<8FDiyTRYmFu6nz5DHDSmTvkgdOq!VihQZ*N_1Ef z4~|k3Fex^NqYms3Ta z%@BBsl3`&7c!z~4k&!y5RYu`$tI^aN>#1~C{YAo@=}RRyo-9S-EHaW5gkZ#II*QBn zZGYy!f86>p72KQ;Xg&VJBl9j#oG|iu!;rNTOU%*)_fA88^8=%rPP9&b&(T?Nv*wSF z4a@7=ntY!27!jYyv|nsKlsT9pVm zFhMZ5S|EiwhDvUJEh2@WrYGu#K%w&PqhGDHe@3ZYpZRaRxMuomr44zj`&W#~G_d`A zl(Ben-;qxZ=>L?XBd79L?+(ohKN}pMJ)!?sV`gWj#axSv(s=2-{xxXVAj&&Kn=T)3 zyWI;JFi6B#d%X*Bi7X01$ueMA6Cqu4G$YZ8G!(eQ4@l|!)3X!!KPI6axs>{b5}6q1 z9mfh>W>;JUP&NBdeK&pSUwb8>e&XoRQKP~~jjz|9Pg$L$-Mc=YvfT}8A;>R3pR!+Q z0FqqEF7S&xYWR)1?ffD;|B}fZ=Q6}G-#BAp5~c4FQRqu)JQ6j2m~VZZ--ro#I^?H` zkVE}-QM#U`&Jdf;M*$Ln#mC3bADDy~g4yhcfEK1s?2IiX$Ur}VtvgBK4>qDt{|=Jq zFKQ&YJ{csrj#5-G72AHXgETSTKOv1E&vEzLQbjisVU&=(#yrr-AKEpoG*BC5fEc7o zCoezL>}Z2TfLw*3{KYW}vSop6`bHw#ljZzI`F{SVxA`8!6T6q8@$ugtqn~WUlQbJCFD^A&QOR5MoTbxfr=Rr6@l7IizPrM zpehZ-AW0-p`Kk(q4#Hs_v@W^`H2PSX0>8KQ-P0rlQhRCziA*}#@-#drm4iv&aFp^!TT5? zGUAlWpkO%G86%96q|i_rVPv>Lj8LUshrke&yWk{f;BD;i{Q$L#Uk)|-VqM|so>=^fQCKA zANlWV5moB1=AE-Xv>=e$NoeGE+;AQFlf|Xsu~AX!Hfw2VUT}JGu{k9jj^QEo%ZJz0 z^fQZ+Q&^Ogmj~Q`K#Wng86l0)Y_J*-->R=z^ z$ff8gYouD%JlGuqS{)e{Z>RV6HD`xpG$%d%@`;CE{&2{itB+0?A5}7>dcma3frI@V zO)06XA0N8nVEwS)zxietc!75t?i>2zg6Ls&;b+rYvg1e3H(dA8Z`T_e`oz4nT*Dg} zw`XptBPAw2Q?C#7zvO@if7s@c%?}OJ>zn3u!5_#SWKC{t2n&swk<)WZ6{r>os=4$N zP+?P88b(yJ+RDp8wUQE*YD0%DA5mLn7WP4=$YuQBXy!Q<|2LXxq(Uua_rkocL|dF* zWcAGmNgfh2Yg_BsiWz0ofB5b25fKAN4j5gXF`(Ahe{53ftTjWH?dsQX`pBqx1>LIm z3YJubmGusOCv{q{_%ZYK6TJ01^roV$@HI2L6!bZhLbH=Qs8)UdT~l_{NAybSQr;I3 zYjzFj6A~IVxhNe(gYAuqctXTQVgzSVsz5@VxR#w2Gt$}uv-p>~3 zdoX$UlJVtZgB>}_i5~UEx1e#_+lt4H%8u_}H84psEkD*6?Dw6QpZa{|tTG8+A3Wcm z3Z8taYn=c#gTqPnWqY={7zPR})RRwdNhuC)hzm}%g(rr1!O3)z*Rzt-j%dAN2y-ru z>pw@C%C15y|jAAPXM36IU_+H(e1 zDQD^Qh6ERJm2wKd@;Mfhj={o#NEM&pHSRD!fNFLdGc5J`T>XYc-rFA4d+V~5TZ#&|tXTd~Z)E_h`PA%ZMpz@jdWQAm2`TqKKRvrTG@#T~ zI=aMezXP}aRrQ^S;`ht$^%1?xV{;qRq}Iy6JdNJ~kv_=x@;IO14OXQiAbuc;M@s4(1N zQVAMBfRk7cB(!LlHUP#|e*uRA8lR{hKH<>|lt=X%VA=8cmVV2a@gsXxUQU($LuOds z@4-KBvkiPZurfWhGO%fJ;k}#u2fzy*Fm`ca(UK(vz5MTfi?K&OV!hr8DeuvvJmg*e z?ngWLiNyg0z1WhZ$jGFSE8beV?49MXGsfKBthWPfC`2GE`^UvZ zMmlUxV{2MQN=Am+D7LLO9Xh~acC@(IH|mH5{GK+o2uY7niZ&G?m!0Yqb943f*}vWD zRh3)N&+GoP^MCxpyKhEnrO(FSFXAVo`sCP(dzTd3YO1P-_!ku9=lc(>l`@{VvN0&T zurN1h!<8rg#Ui58U9R+ijo&;uc-82Dw1R@Pn1c)NITDqSl9~_+7lx3Cref0rxA|U@jE9uMZ`sUPvIrG=l_}N-^OdFb%mf{^&R1ljUTib6?y)=9y|LPC?o7Dpz z{O!8BBZV_ulZuKb^ot+-#KN9K<5+Io$lOJHYUBHj?_D&>HKXWA?YiGSIAFlet9#p? zA5?wVSeJ3vjBHC>dfZ#l$<;B#Fui!bk;cX)nbp7VTq@8(zdkNXeuFVD@d8aNOxAwhFvmT?Fw z(vx(PVHHJHH+#1Z9c63<(r}dja+gbIGWNzmdud23DI#eaHm%*w0L7=N z-^^G5>5QNhGs^22d{ywIBO8Q-vp^aYUMl^UxCZbI;+k+sa3H#?kcFaRAM#sZ>P6{L z*=-H7#tj-2qwl$_x&K3H|IKR@-z^}}uX z1f{1xC0rbRSH9Ht=*6}Gi(6uUzz>(#?q`kOx+Gqwx}v>?mnPhJDpf4qUJ2kEI( zZr?;-28yuzJg@gbl{cbxq>}(_WsDPF3I1_;dis(#FFVd62k=WDu&{pot79vU@k^B~ z@;(07ek@#X?$6)Zw|F1lzaRg-KY$hD2R3Tol6`Oy;5={w(cjI$>j?$_=jr+)&fA1I zZ&0aEf7|d>xzG?fV`6+HvI9hB3!bkE3761+M(X|meegg0h>f1PCsGt_!)*;BmP=uY=77D*Fl-Mc#`KQ@m3|L+mCJZ(+p#su^N{e z+n?`tBl+maX)_xNBEyQ><2tE_ll2}&ua^y#V1w#2$fzLvyp*8GXwPz%QgMaRF}TK0r6d{V&qfaw-QrS)}Y0W9WOh*8NxC z#IzuK-g>zT_w}Ruldpg`7*mX!;Vnxb%fuDFJSxa&^YVwoEzOh8;%=J&Rt+lz{EYu0e!RAN?A?YA`7R0}jY=2E9Q7FdVBn+J3Sl?PmBK zZ{|QE4q+EcuUBk;F#pyb)ZO&%y=g;$!2sw*V4tv* zE$&E+*2JvlvC~G(0j7=j_)iG1fxVu!Vqq+q(7dweihGh|E5R2SreU;GhSW{dMoZWj zgk6P<9UZD%0`zvqEQ;a>{K-J!3H11C)nHavk2p3THIm-hP%ZP_ZwO?uX~^MI4Rt(4v4~Vzn|wu>i8yug%$4fNqftL3^zxBT6Syz#}4r2CJcpCFcL*<|# z8$gb2NO7>)%;?HvHUr>DKwF7O8ph%A+IYSTi_wTp23;&1?okQ>m*yqp!9b)KmrFS~ zeBy{5Z9OLBuZE}TQ#964+YxB3X8n>lM! zNWZihQ&oNv=q8{~CS_&&qFa}-6S*h<{}I!QK-Q zK#!YUP2<=4hTE|<)RD_{SoBzSo{`Ij!E=X1SPf===0=J&qG4g}Z@wPXr*Zd;kX{Sw z8dIdCreP+#*RliCynQA)lFH&@#%1$b!+_1H)v5fC{I9z&4_G{Zz0phFT7K`u=o#B; z7~8#gRs3Cf`}UI_Bfdi?CTJMMPm$OQI1-ZtQfqB-w5lgi7Yj~{E||@x)VX&P+7kb8 z-8!oO*@-^B=;|v?z#YL!^6T)#b-yFLZ(10%8xwWhQGOjcqo{b~XVw9#=f;I^cq7~U zjR^Tc_UQD$c!OsT`MD@fG5h*PIK5C@r&sY9)3ZA6NlCcsK!rjh3^ww5X^6w(9275Y z>vh61aWI%aQ@`=L+?90jA*xqn+2{=G$IK0h|o|R75$`WLu-_|HNcNLnPk$UcZ?02 zMje#LVC?9!LUucbEuZDOxIwOmZfsxs#hTJ(Wjz*VP28~gpf$ruKsz`7X)vs~{hRmN z7dpe3F*tn7fprIDnFAJw#-amepdB;{&?S}z0-x03$G}PyOz=W|u+gZt)53|7z+pS^ zt!OzJ{)2l0|LBFW1+4&wuws7hKnGH37Zg*7+;VPrS3?MEc%@x&OvN}_j3Y24F%ITu z^LCiTI8gfTY6@WUNYY+Ys+!lX?AiwSexdqF%5f~Z3>NCVM zjTJ$-fjUV_JP2$im4!f<@2g*qFtksl} zaBZl|qApC9O>wPLp{>{<0dfmJI@5h7LRtZ5!a?WD(m=be)mv|p5!eQs zGGIdi09$ye)Z`6;^Gg-5Lj85@8KHg85;%&sJQ@<&u3ZMl6YsmX()y^-aLS?gpP)U0 zSy45c4>D@dB8JIm=Y;ij!On(*twVC{JFxV;ninLhrAr@0XgB60`BnH#& zyb0?f?(EGJac7`xc>ugR_?PxN!r{2{6kdts`d7hUU-4bi3IBe0?^^?%y?l)>^2SK0|VZTv8mLiVDWVfl3v_(%i z9bN7ZS0>%R(@MMZ{gr1CJp`&5kUM~I#sY-J)e$ZvOH1r-___~a{6Z(mqIj6#o6TCv z0xd7ZbSJ8~Is>4BN)^�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%0DT7>-*+<%js3u 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

n4|U;7DM$wDnY1Ax#u}jKp!>O?~@hdwQoA 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

U6$t8WhBdG7e%? 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 literal 0 HcmV?d00001 diff --git a/samples/zig-ui/src/main.zig b/samples/zig-ui/src/main.zig new file mode 100644 index 0000000..4d8112c --- /dev/null +++ b/samples/zig-ui/src/main.zig @@ -0,0 +1,870 @@ +const std = @import("std"); +const oc = @import("orca"); + +var frame_size: oc.Vec2 = .{ .x = 1200, .y = 838 }; + +var surface: oc.Surface = undefined; +var canvas: oc.Canvas = undefined; +var font_regular: oc.Font = undefined; +var font_bold: oc.Font = undefined; +var ui: oc.UiContext = undefined; +var text_arena: oc.Arena = undefined; +var log_arena: oc.Arena = undefined; +var log_lines: oc.Str8List = undefined; + +const Cmd = enum { + None, + SetDarkTheme, + SetLightTheme, +}; +var cmd: Cmd = .None; + +export fn oc_on_init() void { + oc.windowSetTitle("Orca Zig UI Demo"); + oc.windowSetSize(frame_size); + + surface = oc.Surface.canvas(); + canvas = oc.Canvas.create(); + ui.init(); + + var fonts = [_]*oc.Font{ &font_regular, &font_bold }; + var font_names = [_][]const u8{ "/OpenSans-Regular.ttf", "/OpenSans-Bold.ttf" }; + for (fonts, font_names) |font, name| { + var scratch = oc.Arena.scratchBegin(); + defer scratch.end(); + + var file = oc.File.open(oc.Str8.fromSlice(name), .{ .read = true }, .{}); + if (file.lastError() != oc.io.Error.Ok) { + oc.log.err("Couldn't open file {s}", .{name}, @src()); + } + + var size = file.getSize(); + var buffer = scratch.arena.push(size) catch { + oc.log.err("Out of memory", .{}, @src()); + return; + }; + _ = file.read(size, buffer); + file.close(); + + var ranges = oc.UnicodeRange.range(&[_]oc.UnicodeRange.Enum{ + .BasicLatin, + .C1ControlsAndLatin1Supplement, + .LatinExtendedA, + .LatinExtendedB, + .Specials, + }); + + font.* = oc.Font.createFromMemory(buffer[0..size], &ranges); + } + + text_arena = oc.Arena.init(); + log_arena = oc.Arena.init(); + log_lines = oc.Str8List.init(); +} + +export fn oc_on_raw_event(event: *oc.CEvent) void { + oc.uiProcessCEvent(event); +} + +export fn oc_on_resize(width: u32, height: u32) void { + frame_size.x = @floatFromInt(width); + frame_size.y = @floatFromInt(height); +} + +export fn oc_on_frame_refresh() void { + var scratch = oc.Arena.scratchBegin(); + defer scratch.end(); + + switch (cmd) { + .SetDarkTheme => oc.uiSetTheme(oc.ui_dark_theme), + .SetLightTheme => oc.uiSetTheme(oc.ui_light_theme), + .None => {}, + } + cmd = .None; + + var default_style = oc.UiStyle{ .font = font_regular }; + { + oc.uiBeginFrame(frame_size, &default_style); + defer oc.uiEndFrame(); + + //-------------------------------------------------------------------------------------------- + // Menu bar + //-------------------------------------------------------------------------------------------- + { + oc.uiMenuBarBegin("menu_bar"); + defer oc.uiMenuBarEnd(); + + { + oc.uiMenuBegin("File"); + defer oc.uiMenuEnd(); + + if (oc.uiMenuButton("Quit").pressed) { + oc.requestQuit(); + } + } + + { + oc.uiMenuBegin("Theme"); + defer oc.uiMenuEnd(); + + if (oc.uiMenuButton("Dark theme").pressed) { + cmd = .SetDarkTheme; + } + if (oc.uiMenuButton("Light theme").pressed) { + cmd = .SetLightTheme; + } + } + } + + { + oc.uiPanelBegin("main panel", .{}); + defer oc.uiPanelEnd(); + + { + oc.uiStyleNext(.{ + .size = .{ + .width = .fill_parent, + .height = .{ .custom = .{ .kind = .Parent, .value = 1, .relax = 1 } }, + }, + .layout = .{ + .axis = .X, + .margin = .{ .x = 16, .y = 16 }, + .spacing = 16, + }, + }); + _ = oc.uiBoxBegin("Background", .{ .draw_background = true }); + defer _ = oc.uiBoxEnd(); + + widgets(scratch.arena); + + styling(scratch.arena); + } + } + } + + _ = canvas.select(); + surface.select(); + + oc.Canvas.setColor(ui.theme.bg0); + oc.Canvas.clear(); + + oc.uiDraw(); + canvas.render(); + surface.present(); +} + +var checkbox_checked: bool = false; +var v_slider_value: f32 = 0; +var v_slider_logged_value: f32 = 0; +var v_slider_log_time: f64 = 0; +var radio_selected: usize = 0; +var h_slider_value: f32 = 0; +var h_slider_logged_value: f32 = 0; +var h_slider_log_time: f64 = 0; +var text: []const u8 = "Text box"; +var selected: ?usize = null; + +fn widgets(arena: *oc.Arena) void { + columnBegin("Widgets", 1.0 / 3.0); + defer columnEnd(); + + { + oc.uiStyleNext(.{ + .size = .{ + .width = .fill_parent, + }, + .layout = .{ + .axis = .X, + .spacing = 32, + }, + }); + _ = oc.uiBoxBegin("top", .{}); + defer _ = oc.uiBoxEnd(); + + { + oc.uiStyleNext(.{ + .layout = .{ + .axis = .Y, + .spacing = 24, + }, + }); + _ = oc.uiBoxBegin("top_left", .{}); + defer _ = oc.uiBoxEnd(); + + //----------------------------------------------------------------------------- + // Label + //----------------------------------------------------------------------------- + _ = oc.uiLabel("Label"); + + //----------------------------------------------------------------------------- + // Button + //----------------------------------------------------------------------------- + if (oc.uiButton("Button").clicked) { + logPush("Button clicked"); + } + + { + oc.uiStyleNext(.{ + .layout = .{ + .axis = .X, + .alignment = .{ .y = .Center }, + .spacing = 8, + }, + }); + _ = oc.uiBoxBegin("checkbox", .{}); + defer _ = oc.uiBoxEnd(); + + //------------------------------------------------------------------------- + // Checkbox + //------------------------------------------------------------------------- + if (oc.uiCheckbox("checkbox", &checkbox_checked).clicked) { + if (checkbox_checked) { + logPush("Checkbox checked"); + } else { + logPush("Checkbox unhecked"); + } + } + + _ = oc.uiLabel("Checkbox"); + } + } + + //--------------------------------------------------------------------------------- + // Vertical slider + //--------------------------------------------------------------------------------- + oc.uiStyleNext(.{ .size = .{ .height = .{ .pixels = 130 } } }); + _ = oc.uiSlider("v_slider", &v_slider_value); + + var now = oc.clock.time(.Monotonic); + if ((now - v_slider_log_time) >= 0.2 and v_slider_value != v_slider_logged_value) { + logPushf("Vertical slider moved to {d:.3}", .{v_slider_value}); + v_slider_logged_value = v_slider_value; + v_slider_log_time = now; + } + + { + oc.uiStyleNext(.{ + .layout = .{ + .axis = .Y, + .spacing = 24, + }, + }); + _ = oc.uiBoxBegin("top right", .{}); + defer _ = oc.uiBoxEnd(); + + //----------------------------------------------------------------------------- + // Tooltip + //----------------------------------------------------------------------------- + if (oc.uiLabel("Tooltip").hovering) { + oc.uiTooltip("Hi"); + } + + //----------------------------------------------------------------------------- + // Radio group + //----------------------------------------------------------------------------- + var options = [_][]const u8{ + "Radio 1", + "Radio 2", + }; + var radio_group_info = oc.UiRadioGroupInfo{ + .selected_index = radio_selected, + .options = &options, + }; + var result = oc.uiRadioGroup("radio_group", &radio_group_info); + radio_selected = result.selected_index.?; + if (result.changed) { + logPushf("Selected {s}", .{options[radio_selected]}); + } + + //----------------------------------------------------------------------------- + // Horizontal slider + //----------------------------------------------------------------------------- + oc.uiStyleNext(.{ .size = .{ .width = .{ .pixels = 130 } } }); + _ = oc.uiSlider("h_slider", &h_slider_value); + + if ((now - h_slider_log_time) >= 0.2 and h_slider_value != h_slider_logged_value) { + logPushf("Slider moved to {d:.3}", .{h_slider_value}); + h_slider_logged_value = h_slider_value; + h_slider_log_time = now; + } + } + } + + //------------------------------------------------------------------------------------- + // Text box + //------------------------------------------------------------------------------------- + oc.uiStyleNext(.{ + .size = .{ + .width = .{ .pixels = 305 }, + .height = .text, + }, + }); + var textResult = oc.uiTextBox("text", arena.*, text); + if (textResult.changed) { + text_arena.clear(); + text = text_arena.pushStr(textResult.text) catch { + oc.log.err("Out of memory", .{}, @src()); + oc.requestQuit(); + return; + }; + } + if (textResult.accepted) { + logPushf("Entered text {s}", .{text}); + } + + //------------------------------------------------------------------------------------- + // Select + //------------------------------------------------------------------------------------- + var options = [_][]const u8{ + "Option 1", + "Option 2", + }; + var select_popup_info = oc.UiSelectPopupInfo{ + .selected_index = selected, + .options = &options, + .placeholder = "Select", + }; + var selectResult = oc.uiSelectPopup("select", &select_popup_info); + if (selectResult.selected_index != selected) { + logPushf("Selected {s}", .{options[selectResult.selected_index.?]}); + } + selected = selectResult.selected_index; + + //------------------------------------------------------------------------------------- + // Scrollable panel + //------------------------------------------------------------------------------------- + { + oc.uiStyleNext(.{ + .size = .{ + .width = .fill_parent, + .height = .{ + .custom = .{ .kind = .Parent, .value = 1, .relax = 1, .min_size = 200 }, + }, + }, + .bg_color = ui.theme.bg2, + .border_color = ui.theme.border, + .border_size = 1, + .roundness = ui.theme.roundness_small, + }); + _ = oc.uiPanelBegin("log", .{ .draw_background = true, .draw_border = true }); + defer oc.uiPanelEnd(); + + { + oc.uiStyleNext(.{ + .layout = .{ + .margin = .{ .x = 16, .y = 16 }, + }, + }); + _ = oc.uiBoxBegin("contents", .{}); + defer _ = oc.uiBoxEnd(); + + if (log_lines.list.empty()) { + oc.uiStyleNext(.{ .color = ui.theme.text2 }); + _ = oc.uiLabel("Log"); + } + + var i: i32 = 0; + var log_lines_iter = log_lines.iter(); + while (log_lines_iter.next()) |log_line| { + var buf: [15]u8 = undefined; + var id = std.fmt.bufPrint(&buf, "{d}", .{i}) catch unreachable; + _ = oc.uiBoxBegin(id, .{}); + defer _ = oc.uiBoxEnd(); + + _ = oc.uiLabel(log_line.string.slice()); + + i += 1; + } + } + } +} + +var styling_selected_radio: ?usize = 0; +var unselected_width: f32 = 16; +var unselected_height: f32 = 16; +var unselected_roundness: f32 = 8; +var unselected_bg_color: oc.Color = oc.Color.rgba(0.086, 0.086, 0.102, 1); +var unselected_border_color: oc.Color = oc.Color.rgba(0.976, 0.976, 0.976, 0.35); +var unselected_border_size: f32 = 1; +var unselected_when_status: oc.UiStatus = .{}; +var unselected_status_index: ?usize = 0; +var selected_width: f32 = 16; +var selected_height: f32 = 16; +var selected_roundness: f32 = 8; +var selected_center_color: oc.Color = oc.Color.rgba(1, 1, 1, 1); +var selected_bg_color: oc.Color = oc.Color.rgba(0.33, 0.66, 1, 1); +var selected_when_status: oc.UiStatus = .{}; +var selected_status_index: ?usize = 0; +var label_font_color: oc.Color = oc.Color.rgba(0.976, 0.976, 0.976, 1); +var label_font_color_selected: ?usize = 0; +var label_font: *oc.Font = &font_regular; +var label_font_selected: ?usize = 0; +var label_font_size: f32 = 14; + +fn styling(arena: *oc.Arena) void { + //----------------------------------------------------------------------------------------- + // Styling + //----------------------------------------------------------------------------------------- + // Initial values here are hardcoded from the dark theme and everything is overridden all + // the time. In a real program you'd only override what you need and supply the values from + // ui.theme or ui.theme.palette. + // + // Rule-based styling is described at + // https://www.forkingpaths.dev/posts/23-03-10/rule_based_styling_imgui.html + columnBegin("Styling", 2.0 / 3.0); + defer columnEnd(); + + { + oc.uiStyleNext(.{ + .size = .{ + .width = .fill_parent, + .height = .{ .pixels = 152 }, + }, + .layout = .{ + .margin = .{ .x = 310, .y = 16 }, + }, + .bg_color = oc.ui_dark_theme.bg0, + .roundness = oc.ui_dark_theme.roundness_small, + }); + _ = oc.uiBoxBegin("styled_radios", .{ .draw_background = true, .draw_border = true }); + defer _ = oc.uiBoxEnd(); + + resetNextRadioGroupToDarkTheme(arena); + + var unselected_tag = oc.uiTagMake("radio"); + var unselected_pattern = oc.UiPattern.init(); + unselected_pattern.push(arena, .{ .sel = .{ .tag = unselected_tag } }); + if (!unselected_when_status.empty()) { + unselected_pattern.push(arena, .{ .op = .And, .sel = .{ .status = unselected_when_status } }); + } + oc.uiStyleMatchAfter(unselected_pattern, .{ + .size = .{ + .width = .{ .pixels = unselected_width }, + .height = .{ .pixels = unselected_height }, + }, + .bg_color = unselected_bg_color, + .border_color = unselected_border_color, + .border_size = unselected_border_size, + .roundness = unselected_roundness, + }); + + var selected_tag = oc.uiTagMake("radio_selected"); + var selected_pattern = oc.UiPattern.init(); + selected_pattern.push(arena, .{ .sel = .{ .tag = selected_tag } }); + if (!selected_when_status.empty()) { + selected_pattern.push(arena, .{ .op = .And, .sel = .{ .status = selected_when_status } }); + } + oc.uiStyleMatchAfter(selected_pattern, .{ + .size = .{ + .width = .{ .pixels = selected_width }, + .height = .{ .pixels = selected_height }, + }, + .color = selected_center_color, + .bg_color = selected_bg_color, + .roundness = selected_roundness, + }); + + var label_tag = oc.uiTagMake("label"); + var label_pattern = oc.UiPattern.init(); + label_pattern.push(arena, .{ .sel = .{ .tag = label_tag } }); + oc.uiStyleMatchAfter(label_pattern, .{ + .color = label_font_color, + .font = label_font.*, + .font_size = label_font_size, + }); + + var options = [_][]const u8{ + "I", + "Am", + "Stylish", + }; + var radio_group_info = oc.UiRadioGroupInfo{ + .selected_index = styling_selected_radio, + .options = &options, + }; + var result = oc.uiRadioGroup("radio_group", &radio_group_info); + styling_selected_radio = result.selected_index; + } + + { + oc.uiStyleNext(.{ .layout = .{ .axis = .X, .spacing = 32 } }); + _ = oc.uiBoxBegin("controls", .{}); + defer _ = oc.uiBoxEnd(); + + { + oc.uiStyleNext(.{ .layout = .{ .axis = .Y, .spacing = 16 } }); + _ = oc.uiBoxBegin("unselected", .{}); + defer _ = oc.uiBoxEnd(); + + oc.uiStyleNext(.{ .font_size = 16 }); + _ = oc.uiLabel("Radio style"); + + { + oc.uiStyleNext(.{ .layout = .{ .spacing = 4 } }); + _ = oc.uiBoxBegin("size", .{}); + defer _ = oc.uiBoxEnd(); + + var width_slider = (unselected_width - 8) / 16; + labeledSlider("Width", &width_slider); + unselected_width = 8 + width_slider * 16; + + var height_slider = (unselected_height - 8) / 16; + labeledSlider("Height", &height_slider); + unselected_height = 8 + height_slider * 16; + + var roundness_slider = (unselected_roundness - 4) / 8; + labeledSlider("Roundness", &roundness_slider); + unselected_roundness = 4 + roundness_slider * 8; + } + + { + oc.uiStyleNext(.{ .layout = .{ .spacing = 4 } }); + _ = oc.uiBoxBegin("background", .{}); + defer _ = oc.uiBoxEnd(); + + labeledSlider("Background R", &unselected_bg_color.r); + labeledSlider("Background G", &unselected_bg_color.g); + labeledSlider("Background B", &unselected_bg_color.b); + labeledSlider("Background A", &unselected_bg_color.a); + } + + { + oc.uiStyleNext(.{ .layout = .{ .spacing = 4 } }); + _ = oc.uiBoxBegin("border", .{}); + defer _ = oc.uiBoxEnd(); + + labeledSlider("Border R", &unselected_border_color.r); + labeledSlider("Border G", &unselected_border_color.g); + labeledSlider("Border B", &unselected_border_color.b); + labeledSlider("Border A", &unselected_border_color.a); + } + + var border_size_slider = unselected_border_size / 5; + labeledSlider("Border size", &border_size_slider); + unselected_border_size = border_size_slider * 5; + + { + oc.uiStyleNext(.{ .layout = .{ .spacing = 10 } }); + _ = oc.uiBoxBegin("status_override", .{}); + defer _ = oc.uiBoxEnd(); + + _ = oc.uiLabel("Override"); + + var status_options = [_][]const u8{ + "Always", + "When hovering", + "When active", + }; + var status_info = oc.UiRadioGroupInfo{ + .selected_index = unselected_status_index, + .options = &status_options, + }; + var status_result = oc.uiRadioGroup("status", &status_info); + unselected_status_index = status_result.selected_index; + unselected_when_status = switch (unselected_status_index.?) { + 0 => .{}, + 1 => .{ .hover = true }, + 2 => .{ .active = true }, + else => unreachable, + }; + } + } + + { + oc.uiStyleNext(.{ .layout = .{ .axis = .Y, .spacing = 16 } }); + _ = oc.uiBoxBegin("selected", .{}); + defer _ = oc.uiBoxEnd(); + + oc.uiStyleNext(.{ .font_size = 16 }); + _ = oc.uiLabel("Radio selected style"); + + { + oc.uiStyleNext(.{ .layout = .{ .spacing = 4 } }); + _ = oc.uiBoxBegin("size", .{}); + defer _ = oc.uiBoxEnd(); + + var width_slider = (selected_width - 8) / 16; + labeledSlider("Width", &width_slider); + selected_width = 8 + width_slider * 16; + + var height_slider = (selected_height - 8) / 16; + labeledSlider("Height", &height_slider); + selected_height = 8 + height_slider * 16; + + var roundness_slider = (selected_roundness - 4) / 8; + labeledSlider("Roundness", &roundness_slider); + selected_roundness = 4 + roundness_slider * 8; + } + + { + oc.uiStyleNext(.{ .layout = .{ .spacing = 4 } }); + _ = oc.uiBoxBegin("color", .{}); + defer _ = oc.uiBoxEnd(); + + labeledSlider("Center R", &selected_center_color.r); + labeledSlider("Center G", &selected_center_color.g); + labeledSlider("Center B", &selected_center_color.b); + labeledSlider("Center A", &selected_center_color.a); + } + + { + oc.uiStyleNext(.{ .layout = .{ .spacing = 4 } }); + _ = oc.uiBoxBegin("background", .{}); + defer _ = oc.uiBoxEnd(); + + labeledSlider("Background R", &selected_bg_color.r); + labeledSlider("Background G", &selected_bg_color.g); + labeledSlider("Background B", &selected_bg_color.b); + labeledSlider("Background A", &selected_bg_color.a); + } + + { + oc.uiStyleNext(.{ .layout = .{ .spacing = 10 } }); + _ = oc.uiBoxBegin("status_override", .{}); + defer _ = oc.uiBoxEnd(); + + oc.uiStyleNext(.{ .size = .{ .height = .{ .pixels = 30 } } }); + _ = oc.uiBoxMake("spacer", .{}); + + _ = oc.uiLabel("Override"); + + var status_options = [_][]const u8{ + "Always", + "When hovering", + "When active", + }; + var status_info = oc.UiRadioGroupInfo{ + .selected_index = selected_status_index, + .options = &status_options, + }; + var status_result = oc.uiRadioGroup("status", &status_info); + selected_status_index = status_result.selected_index; + selected_when_status = switch (selected_status_index.?) { + 0 => .{}, + 1 => .{ .hover = true }, + 2 => .{ .active = true }, + else => unreachable, + }; + } + } + + { + oc.uiStyleNext(.{ .layout = .{ .axis = .Y, .spacing = 10 } }); + _ = oc.uiBoxBegin("label", .{}); + defer _ = oc.uiBoxEnd(); + + oc.uiStyleNext(.{ .font_size = 16 }); + _ = oc.uiLabel("Label style"); + + { + oc.uiStyleNext(.{ .layout = .{ .axis = .X, .spacing = 8 } }); + _ = oc.uiBoxBegin("font_color", .{}); + defer _ = oc.uiBoxEnd(); + + oc.uiStyleMatchAfter(oc.UiPattern.owner(), .{ + .size = .{ .width = .{ .pixels = 100 } }, + }); + _ = oc.uiLabel("Font color"); + + var color_names = [_][]const u8{ + "Default", + "Red", + "Orange", + "Amber", + "Yellow", + "Lime", + "Light green", + "Green", + }; + var colors = [_]oc.Color{ + oc.ui_dark_theme.text0, + oc.ui_dark_theme.palette.red5, + oc.ui_dark_theme.palette.orange5, + oc.ui_dark_theme.palette.amber5, + oc.ui_dark_theme.palette.yellow5, + oc.ui_dark_theme.palette.lime5, + oc.ui_dark_theme.palette.light_green5, + oc.ui_dark_theme.palette.green5, + }; + var color_info = oc.UiSelectPopupInfo{ + .selected_index = label_font_color_selected, + .options = &color_names, + }; + var color_result = oc.uiSelectPopup("color", &color_info); + label_font_color_selected = color_result.selected_index; + label_font_color = colors[label_font_color_selected.?]; + } + + { + oc.uiStyleNext(.{ .layout = .{ .axis = .X, .spacing = 8 } }); + _ = oc.uiBoxBegin("font", .{}); + defer _ = oc.uiBoxEnd(); + + oc.uiStyleMatchAfter(oc.UiPattern.owner(), .{ + .size = .{ .width = .{ .pixels = 100 } }, + }); + _ = oc.uiLabel("Font"); + + var font_names = [_][]const u8{ + "Regular", + "Bold", + }; + var fonts = [_]*oc.Font{ + &font_regular, + &font_bold, + }; + var font_info = oc.UiSelectPopupInfo{ + .selected_index = label_font_selected, + .options = &font_names, + }; + var font_result = oc.uiSelectPopup("font_style", &font_info); + label_font_selected = font_result.selected_index; + label_font = fonts[label_font_selected.?]; + } + + var font_size_slider = (label_font_size - 8) / 16; + labeledSlider("Font size", &font_size_slider); + label_font_size = 8 + font_size_slider * 16; + } + } +} + +fn columnBegin(header: []const u8, widthFraction: f32) void { + oc.uiStyleNext(.{ + .size = .{ + .width = .{ + .custom = .{ .kind = .Parent, .value = widthFraction, .relax = 1 }, + }, + .height = .fill_parent, + }, + .layout = .{ + .axis = .Y, + .margin = .{ .y = 8 }, + .spacing = 24, + }, + .bg_color = ui.theme.bg1, + .border_color = ui.theme.border, + .border_size = 1, + .roundness = ui.theme.roundness_small, + }); + _ = oc.uiBoxBegin(header, .{ .draw_background = true, .draw_border = true }); + + { + oc.uiStyleNext(.{ + .size = .{ .width = .fill_parent }, + .layout = .{ .alignment = .{ .x = .Center } }, + }); + _ = oc.uiBoxBegin("header", .{}); + defer _ = oc.uiBoxEnd(); + + oc.uiStyleNext(.{ .font_size = 18 }); + _ = oc.uiLabel(header); + } + + oc.uiStyleNext(.{ + .size = .{ + .width = .fill_parent, + .height = .{ + .custom = .{ .kind = .Parent, .value = 1, .relax = 1 }, + }, + }, + .layout = .{ + .alignment = .{ .x = .Start }, + .margin = .{ .x = 16 }, + .spacing = 24, + }, + }); + _ = oc.uiBoxBegin("contents", .{}); +} + +fn columnEnd() void { + _ = oc.uiBoxEnd(); // contents + _ = oc.uiBoxEnd(); // column +} + +fn labeledSlider(label: []const u8, value: *f32) void { + oc.uiStyleNext(.{ .layout = .{ .axis = .X, .spacing = 8 } }); + _ = oc.uiBoxBegin(label, .{}); + defer _ = oc.uiBoxEnd(); + + oc.uiStyleMatchAfter(oc.UiPattern.owner(), .{ + .size = .{ .width = .{ .pixels = 100 } }, + }); + _ = oc.uiLabel(label); + + oc.uiStyleNext(.{ + .size = .{ .width = .{ .pixels = 100 } }, + }); + _ = oc.uiSlider("slider", value); +} + +fn logPush(line: []const u8) void { + log_lines.push(&log_arena, oc.Str8.fromSlice(line)) catch { + oc.log.err("Out of memory", .{}, @src()); + oc.requestQuit(); + return; + }; +} + +fn logPushf(comptime fmt: []const u8, args: anytype) void { + var str = oc.Str8.pushf(&log_arena, fmt, args) catch { + oc.log.err("Out of memory", .{}, @src()); + oc.requestQuit(); + return; + }; + log_lines.push(&log_arena, str) catch { + oc.log.err("Out of memory", .{}, @src()); + oc.requestQuit(); + return; + }; +} + +/// This makes sure the light theme doesn't break the styling overrides +/// You won't need it in a real program as long as your colors come from ui.theme or ui.theme.palette +fn resetNextRadioGroupToDarkTheme(arena: *oc.Arena) void { + var unselected_tag = oc.uiTagMake("radio"); + var unselected_pattern = oc.UiPattern.init(); + unselected_pattern.push(arena, .{ .sel = .{ .tag = unselected_tag } }); + oc.uiStyleMatchAfter(unselected_pattern, .{ + .border_color = oc.ui_dark_theme.text3, + .border_size = 1, + }); + + var unselected_hover_pattern = oc.UiPattern.init(); + unselected_hover_pattern.push(arena, .{ .sel = .{ .tag = unselected_tag } }); + unselected_hover_pattern.push(arena, .{ .op = .And, .sel = .{ .status = .{ .hover = true } } }); + oc.uiStyleMatchAfter(unselected_hover_pattern, .{ + .bg_color = oc.ui_dark_theme.fill0, + .border_color = oc.ui_dark_theme.primary, + }); + + var unselected_active_pattern = oc.UiPattern.init(); + unselected_active_pattern.push(arena, .{ .sel = .{ .tag = unselected_tag } }); + unselected_active_pattern.push(arena, .{ .op = .And, .sel = .{ .status = .{ .active = true } } }); + oc.uiStyleMatchAfter(unselected_active_pattern, .{ + .bg_color = oc.ui_dark_theme.fill1, + .border_color = oc.ui_dark_theme.primary, + }); + + var selected_tag = oc.uiTagMake("radio_selected"); + var selected_pattern = oc.UiPattern.init(); + selected_pattern.push(arena, .{ .sel = .{ .tag = selected_tag } }); + oc.uiStyleMatchAfter(selected_pattern, .{ + .color = oc.ui_dark_theme.palette.white, + .bg_color = oc.ui_dark_theme.primary, + }); + + var selected_hover_pattern = oc.UiPattern.init(); + selected_hover_pattern.push(arena, .{ .sel = .{ .tag = selected_tag } }); + selected_hover_pattern.push(arena, .{ .op = .And, .sel = .{ .status = .{ .hover = true } } }); + oc.uiStyleMatchAfter(selected_hover_pattern, .{ + .bg_color = oc.ui_dark_theme.primary_hover, + }); + + var selected_active_pattern = oc.UiPattern.init(); + selected_active_pattern.push(arena, .{ .sel = .{ .tag = selected_tag } }); + selected_active_pattern.push(arena, .{ .op = .And, .sel = .{ .status = .{ .active = true } } }); + oc.uiStyleMatchAfter(selected_active_pattern, .{ + .bg_color = oc.ui_dark_theme.primary_active, + }); +} diff --git a/src/orca.zig b/src/orca.zig index 2d94654..5c1263f 100644 --- a/src/orca.zig +++ b/src/orca.zig @@ -363,10 +363,23 @@ pub const Arena = extern struct { return items[0..count]; } + pub fn pushStr(arena: *Arena, str: []u8) AllocError![]u8 { + var result = try arena.pushArray(u8, str.len + 1); + @memcpy(result[0..str.len], str); + result[str.len] = 0; + return result; + } + pub const scratchBegin = oc_scratch_begin; pub const scratchBeginNext = oc_scratch_begin_next; }; +pub const Pool = extern struct { + arena: Arena, + free_list: List, + block_size: u64, +}; + //------------------------------------------------------------------------------------------ // [STRINGS] //------------------------------------------------------------------------------------------ @@ -1194,6 +1207,36 @@ const MouseCursor = enum(c_uint) { extern fn oc_set_cursor(cursor: MouseCursor) void; pub const setCursor = oc_set_cursor; +pub const EventType = enum(c_uint) { + none, + keyboard_mods, + keyboard_key, + keyboard_char, + mouse_button, + mouse_move, + mouse_wheel, + mouse_enter, + mouse_leave, + clipboard_paste, + window_resize, + window_move, + window_focus, + window_unfocus, + window_hide, + window_show, + window_close, + pathdrop, + frame, + quit, +}; + +pub const KeyAction = enum(c_uint) { + NoAction, + Press, + Release, + Repeat, +}; + pub const ScanCode = enum(c_uint) { Unknown = 0, Space = 32, @@ -1440,7 +1483,18 @@ pub const KeyCode = enum(c_uint) { RightAlt = 346, RightSuper = 347, Menu = 348, - Count = 349, +}; + +pub const key_code_count: usize = 349; + +pub const KeymodFlags = packed struct(c_uint) { + none: bool, + alt: bool, + shift: bool, + ctrl: bool, + cmd: bool, + main_modified: bool, // cmd on Mac, ctrl on Win32 + _: u26, }; pub const MouseButton = enum(c_uint) { @@ -1451,10 +1505,111 @@ pub const MouseButton = enum(c_uint) { Ext2 = 0x04, }; +pub const mouse_button_count: usize = 5; + +/// Keyboard and mouse buttons input +pub const KeyEvent = extern struct { + action: KeyAction, + scan_code: ScanCode, + key_code: KeyCode, + button: MouseButton, + mods: KeymodFlags, + click_count: u8, +}; + +/// Character input +pub const CharEvent = extern struct { + codepoint: Utf32, + sequence: [8]u8, + sequence_len: u8, +}; + +/// Mouse move/scroll +pub const MouseEvent = extern struct { + x: f32, + y: f32, + delta_x: f32, + delta_y: f32, + mods: KeymodFlags, +}; + +/// Window resize / move +pub const MoveEvent = extern struct { + frame: Rect, + content: Rect, +}; + +pub const CEvent = extern struct { + window: Window, + type: EventType, + data: extern union { + key: KeyEvent, + character: CharEvent, + mouse: MouseEvent, + move: MoveEvent, + paths: Str8List, + }, + + pub fn event(self: *CEvent) Event { + return .{ .window = self.window, .event = switch (self.type) { + .none => .none, + .keyboard_mods => .{ .keyboard_mods = self.data.key }, + .keyboard_key => .{ .keyboard_key = self.data.key }, + .keyboard_char => .{ .keyboard_char = self.data.character }, + .mouse_button => .{ .mouse_button = self.data.key }, + .mouse_move => .{ .mouse_move = self.data.mouse }, + .mouse_wheel => .{ .mouse_wheel = self.data.mouse }, + .mouse_enter => .{ .mouse_enter = self.data.mouse }, + .mouse_leave => .{ .mouse_leave = self.data.mouse }, + .clipboard_paste => .clipboard_paste, + .window_resize => .{ .window_resize = self.data.move }, + .window_move => .{ .window_move = self.data.move }, + .window_focus => .window_focus, + .window_unfocus => .window_unfocus, + .window_hide => .window_hide, + .window_show => .window_show, + .window_close => .window_close, + .pathdrop => .{ .pathdrop = self.data.paths }, + .frame => .frame, + .quit => .quit, + } }; + } +}; + +pub const Event = struct { + window: Window, + event: union(EventType) { + none, + keyboard_mods: KeyEvent, + keyboard_key: KeyEvent, + keyboard_char: CharEvent, + mouse_button: KeyEvent, + mouse_move: MouseEvent, + mouse_wheel: MouseEvent, + mouse_enter: MouseEvent, + mouse_leave: MouseEvent, + clipboard_paste, + window_resize: MoveEvent, + window_move: MoveEvent, + window_focus, + window_unfocus, + window_hide, + window_show, + window_close, + pathdrop: Str8List, + frame, + quit, + }, +}; + //------------------------------------------------------------------------------------------ // [APP] windows //------------------------------------------------------------------------------------------ +pub const Window = extern struct { + h: u64, +}; + extern fn oc_window_set_title(title: Str8) void; extern fn oc_window_set_size(size: Vec2) void; @@ -1677,21 +1832,26 @@ pub const Image = extern struct { pub const drawRegion = oc_image_draw_region; }; -pub const Rect = extern union { - Flat: extern struct { - x: f32, - y: f32, - w: f32, - h: f32, - }, - Pairs: extern struct { - xy: Vec2, - wh: Vec2, - }, - Array: [4]f32, +pub const Rect = extern struct { + x: f32, + y: f32, + w: f32, + h: f32, pub fn xywh(x: f32, y: f32, w: f32, h: f32) Rect { - return .{ .Flat = .{ .x = x, .y = y, .w = w, .h = h } }; + return .{ .x = x, .y = y, .w = w, .h = h }; + } + + pub fn xyArray(rect: *Rect) *[2]f32 { + return @ptrCast(rect); + } + + pub fn whArray(rect: *Rect) *[2]f32 { + return @ptrCast(&rect.w); + } + + pub fn array(rect: *Rect) *[4]f32 { + return @ptrCast(rect); } }; @@ -1701,6 +1861,10 @@ pub const Color = extern struct { b: f32 = 1.0, a: f32 = 1.0, + pub fn rgba(r: f32, g: f32, b: f32, a: f32) Color { + return .{ .r = r, .g = g, .b = b, .a = a }; + } + pub fn toArray(color: *Color) *[4]f32 { return @ptrCast(color); } @@ -1845,6 +2009,1314 @@ pub const Canvas = extern struct { pub const arc = oc_arc; }; +//------------------------------------------------------------------------------------------ +// [UI]: input state +//------------------------------------------------------------------------------------------ + +pub const KeyState = extern struct { + last_update: u64, + transition_count: u32, + repeat_count: u32, + down: bool, + sys_clicked: bool, + sys_double_clicked: bool, + sys_triple_clicked: bool, +}; + +pub const KeyboardState = extern struct { + keys: [key_code_count]KeyState, + mods: KeymodFlags, +}; + +pub const MouseButtonsState = extern struct { + left: KeyState, + right: KeyState, + middle: KeyState, + ext1: KeyState, + ext2: KeyState, + + pub fn array(self: *MouseButtonsState) [mouse_button_count]KeyState { + return .{ + self.left, + self.right, + self.middle, + self.ext1, + self.ext2, + }; + } +}; + +pub const MouseState = extern struct { + last_update: u64, + pos_valid: bool, + pos: Vec2, + delta: Vec2, + wheel: Vec2, + buttons: MouseButtonsState, +}; + +pub const TextState = extern struct { + last_update: u64, + backing: [64]Utf32, + codepoints: Str32, +}; + +pub const ClipboardState = extern struct { + last_update: u64, + pasted_text: Str8, +}; + +pub const InputState = extern struct { + frame_counter: u64, + keyboard: KeyboardState, + mouse: MouseState, + text: TextState, + clipboard: ClipboardState, + + extern fn oc_input_process_event(arena: *Arena, state: *InputState, event: *CEvent) void; + extern fn oc_input_next_frame(state: *InputState) void; + + extern fn oc_key_down(state: *InputState, key: KeyCode) bool; + extern fn oc_key_press_count(state: *InputState, key: KeyCode) u8; + extern fn oc_key_release_count(state: *InputState, key: KeyCode) u8; + extern fn oc_key_repeat_count(state: *InputState, key: KeyCode) u8; + + extern fn oc_key_down_scancode(state: *InputState, key: ScanCode) bool; + extern fn oc_key_press_count_scancode(state: *InputState, key: ScanCode) u8; + extern fn oc_key_release_count_scancode(state: *InputState, key: ScanCode) u8; + extern fn oc_key_repeat_count_scancode(state: *InputState, key: ScanCode) u8; + + extern fn oc_mouse_down(state: *InputState, button: MouseButton) bool; + extern fn oc_mouse_pressed(state: *InputState, button: MouseButton) u8; + extern fn oc_mouse_released(state: *InputState, button: MouseButton) u8; + extern fn oc_mouse_clicked(state: *InputState, button: MouseButton) bool; + extern fn oc_mouse_double_clicked(state: *InputState, button: MouseButton) bool; + extern fn oc_mouse_position(state: *InputState) Vec2; + extern fn oc_mouse_delta(state: *InputState) Vec2; + extern fn oc_mouse_wheel(state: *InputState) Vec2; + + extern fn oc_input_text_utf32(arena: *Arena, state: *InputState) Str32; + extern fn oc_input_text_utf8(arena: *Arena, state: *InputState) Str8; + + extern fn oc_clipboard_pasted(state: *InputState) bool; + extern fn oc_clipboard_pasted_text(state: *InputState) Str8; + + extern fn oc_key_mods(state: *InputState) KeymodFlags; + + pub fn processEvent(self: *InputState, arena: *Arena, event: *CEvent) void { + oc_input_process_event(arena, self, event); + } + + pub const nextFrame = oc_input_next_frame; + + pub const keyDown = oc_key_down; + pub const keyPressCount = oc_key_press_count; + pub const keyReleaseCount = oc_key_release_count; + pub const keyRepeatCount = oc_key_repeat_count; + + pub const keyDownScancode = oc_key_down_scancode; + pub const keyPressCountScancode = oc_key_press_count_scancode; + pub const keyReleaseCountScancode = oc_key_release_count_scancode; + pub const keyRepeatCountScancode = oc_key_repeat_count_scancode; + + pub const mouseDown = oc_mouse_down; + pub const mousePressed = oc_mouse_pressed; + pub const mouseReleased = oc_mouse_released; + pub const mouseClicked = oc_mouse_clicked; + pub const mouseDoubleClicked = oc_mouse_double_clicked; + pub const mousePosition = oc_mouse_position; + pub const mouseDelta = oc_mouse_delta; + pub const mouseWheel = oc_mouse_wheel; + + pub const inputTextUtf32 = oc_input_text_utf32; + pub const inputTextUtf8 = oc_input_text_utf8; + + pub const clipboardPasted = oc_clipboard_pasted; + + pub fn clipboardPastedText(self: *InputState) []u8 { + return oc_clipboard_pasted_text(self).slice(); + } + + pub const keyMods = oc_key_mods; +}; + +//------------------------------------------------------------------------------------------ +// [UI]: structs +//------------------------------------------------------------------------------------------ + +pub const UiKey = extern struct { + hash: u64, +}; + +pub const UiAxis = enum(c_uint) { X, Y }; + +pub const UiLayoutMargin = struct { + x: ?f32 = null, + y: ?f32 = null, + + pub fn array(self: *UiLayoutMargin) *[2]?f32 { + return @ptrCast(self); + } +}; + +pub const UiAlignment = enum(c_uint) { Start, End, Center }; + +pub const UiLayoutAlignment = struct { + x: ?UiAlignment = null, + y: ?UiAlignment = null, + + pub fn array(self: *UiLayoutAlignment) *[2]?UiAlignment { + return @ptrCast(self); + } +}; + +pub const UiLayout = struct { + axis: ?UiAxis = null, + spacing: ?f32 = null, + margin: UiLayoutMargin = .{}, + alignment: UiLayoutAlignment = .{}, +}; + +pub const UiSizeKind = enum(c_uint) { + Text, + Pixels, + Children, + Parent, + ParentMinusPixels, +}; + +pub const UiSizeCustom = struct { + kind: UiSizeKind = .Text, + value: f32 = 0, + relax: f32 = 0, + min_size: f32 = 0, +}; + +pub const UiSize = union(enum) { + text, + pixels: f32, + children, + fill_parent, + parent: f32, + parent_minus_pixels: f32, + custom: UiSizeCustom, +}; + +pub const UiBoxSize = struct { + width: ?UiSize = null, + height: ?UiSize = null, + + pub fn array(self: *UiBoxSize) *[2]?UiSize { + return @ptrCast(self); + } +}; + +pub const UiBoxFloating = struct { + x: ?bool = null, + y: ?bool = null, + + pub fn array(self: *UiBoxFloating) *[2]?bool { + return @ptrCast(self); + } +}; + +pub const FloatTarget = struct { + x: ?f32 = null, + y: ?f32 = null, + + pub fn array(self: *FloatTarget) *[2]f32 { + return @ptrCast(self); + } +}; + +//NOTE: flags for axis-dependent properties (e.g. FloatX/Y) need to be consecutive bits +// in order to play well with axis agnostic functions. Using explicit bit shifts here +// so that arithmetic on flags is possible +pub const UiAnimationMask = enum(c_uint) { + None = 0, + SizeWidth = 1 << 1, + SizeHeight = 1 << 2, + LayoutAxis = 1 << 3, + LayoutAlignX = 1 << 4, + LayoutAlignY = 1 << 5, + LayoutSpacing = 1 << 6, + LayoutMarginX = 1 << 7, + LayoutMarginY = 1 << 8, + FloatX = 1 << 9, + FloatY = 1 << 10, + Color = 1 << 11, + BgColor = 1 << 12, + BorderColor = 1 << 13, + BorderSize = 1 << 14, + Roundness = 1 << 15, + + FontSize = 1 << 17, +}; + +pub const UiStyle = struct { + size: UiBoxSize = .{}, + layout: UiLayout = .{}, + floating: UiBoxFloating = .{}, + float_target: FloatTarget = .{}, + color: ?Color = null, + bg_color: ?Color = null, + border_color: ?Color = null, + font: ?Font = null, + font_size: ?f32 = null, + border_size: ?f32 = null, + roundness: ?f32 = null, + animation_time: ?f32 = null, + animation_mask: UiAnimationMask = .None, +}; + +pub const UiPalette = extern struct { + red0: Color, + red1: Color, + red2: Color, + red3: Color, + red4: Color, + red5: Color, + red6: Color, + red7: Color, + red8: Color, + red9: Color, + orange0: Color, + orange1: Color, + orange2: Color, + orange3: Color, + orange4: Color, + orange5: Color, + orange6: Color, + orange7: Color, + orange8: Color, + orange9: Color, + amber0: Color, + amber1: Color, + amber2: Color, + amber3: Color, + amber4: Color, + amber5: Color, + amber6: Color, + amber7: Color, + amber8: Color, + amber9: Color, + yellow0: Color, + yellow1: Color, + yellow2: Color, + yellow3: Color, + yellow4: Color, + yellow5: Color, + yellow6: Color, + yellow7: Color, + yellow8: Color, + yellow9: Color, + lime0: Color, + lime1: Color, + lime2: Color, + lime3: Color, + lime4: Color, + lime5: Color, + lime6: Color, + lime7: Color, + lime8: Color, + lime9: Color, + light_green0: Color, + light_green1: Color, + light_green2: Color, + light_green3: Color, + light_green4: Color, + light_green5: Color, + light_green6: Color, + light_green7: Color, + light_green8: Color, + light_green9: Color, + green0: Color, + green1: Color, + green2: Color, + green3: Color, + green4: Color, + green5: Color, + green6: Color, + green7: Color, + green8: Color, + green9: Color, + teal0: Color, + teal1: Color, + teal2: Color, + teal3: Color, + teal4: Color, + teal5: Color, + teal6: Color, + teal7: Color, + teal8: Color, + teal9: Color, + cyan0: Color, + cyan1: Color, + cyan2: Color, + cyan3: Color, + cyan4: Color, + cyan5: Color, + cyan6: Color, + cyan7: Color, + cyan8: Color, + cyan9: Color, + light_blue0: Color, + light_blue1: Color, + light_blue2: Color, + light_blue3: Color, + light_blue4: Color, + light_blue5: Color, + light_blue6: Color, + light_blue7: Color, + light_blue8: Color, + light_blue9: Color, + blue0: Color, + blue1: Color, + blue2: Color, + blue3: Color, + blue4: Color, + blue5: Color, + blue6: Color, + blue7: Color, + blue8: Color, + blue9: Color, + indigo0: Color, + indigo1: Color, + indigo2: Color, + indigo3: Color, + indigo4: Color, + indigo5: Color, + indigo6: Color, + indigo7: Color, + indigo8: Color, + indigo9: Color, + violet0: Color, + violet1: Color, + violet2: Color, + violet3: Color, + violet4: Color, + violet5: Color, + violet6: Color, + violet7: Color, + violet8: Color, + violet9: Color, + purple0: Color, + purple1: Color, + purple2: Color, + purple3: Color, + purple4: Color, + purple5: Color, + purple6: Color, + purple7: Color, + purple8: Color, + purple9: Color, + pink0: Color, + pink1: Color, + pink2: Color, + pink3: Color, + pink4: Color, + pink5: Color, + pink6: Color, + pink7: Color, + pink8: Color, + pink9: Color, + grey0: Color, + grey1: Color, + grey2: Color, + grey3: Color, + grey4: Color, + grey5: Color, + grey6: Color, + grey7: Color, + grey8: Color, + grey9: Color, + black: Color, + white: Color, +}; + +/// Visualized in doc/UIColors.md +pub const ui_dark_palette = @extern(*UiPalette, .{ .name = "OC_UI_DARK_PALETTE" }); + +/// Visualized in doc/UIColors.md +pub const ui_light_palette = @extern(*UiPalette, .{ .name = "OC_UI_LIGHT_PALETTE" }); + +pub const UiTheme = extern struct { + white: Color, + primary: Color, + primary_hover: Color, + primary_active: Color, + border: Color, + fill0: Color, + fill1: Color, + fill2: Color, + bg0: Color, + bg1: Color, + bg2: Color, + bg3: Color, + bg4: Color, + text0: Color, + text1: Color, + text2: Color, + text3: Color, + slider_thumb_border: Color, + elevated_border: Color, + + roundness_small: f32, + roundness_medium: f32, + roundness_large: f32, + + palette: *UiPalette, +}; + +pub const ui_dark_theme = @extern(*UiTheme, .{ .name = "OC_UI_DARK_THEME" }); +pub const ui_light_theme = @extern(*UiTheme, .{ .name = "OC_UI_LIGHT_THEME" }); + +pub const UiTag = extern struct { + hash: u64, +}; + +pub const UiSelectorKind = enum(c_uint) { + any, + owner, + text, + tag, + status, + key, +}; + +pub const UiStatus = packed struct(u8) { + _: u1 = 0, + + hover: bool = false, + hot: bool = false, + active: bool = false, + dragging: bool = false, + + __: u3 = 0, + + pub fn empty(self: UiStatus) bool { + return !self.hover and !self.hot and !self.active and !self.dragging; + } +}; + +pub const UiSelectorOp = enum(c_uint) { + Descendant, + And, +}; + +pub const UiSelector = struct { + op: UiSelectorOp = .Descendant, + sel: union(UiSelectorKind) { + any, + owner, + text: []u8, + key: UiKey, + tag: UiTag, + status: UiStatus, + }, +}; + +pub const UiPattern = extern struct { + l: List, + + extern fn oc_ui_pattern_push(arena: *Arena, pattern: *UiPattern, selector: UiSelectorInternal) void; + extern fn oc_ui_pattern_all() UiPattern; + extern fn oc_ui_pattern_owner() UiPattern; + + pub fn init() UiPattern { + return .{ .l = List.init() }; + } + + /// Push the selector onto frame arena and insert it into the pattern's linked list. + /// Underlying UiSelector implementation has a ListElt within it that is not exposed to the Zig interface + /// in order to simplify the conversion. + /// + /// WARN: You can use a pattern in multiple rules, but be aware that a pattern is referencing + /// an underlying list of selectors, hence pushing to a pattern also modifies rules in + /// which the pattern was previously used! + pub fn push(self: *UiPattern, arena: *Arena, selector: UiSelector) void { + oc_ui_pattern_push(arena, self, uiConvertSelector(selector)); + } + + pub const all = oc_ui_pattern_all; + pub const owner = oc_ui_pattern_owner; +}; + +pub const UiStyleRule = struct { + box_elt: ListElt, + build_elt: ListElt, + tmp_elt: ListElt, + + owner: *UiBox, + pattern: UiPattern, + style: *UiStyle, +}; + +pub const UiSig = extern struct { + box: *UiBox, + + mouse: Vec2, + delta: Vec2, + wheel: Vec2, + + pressed: bool, + released: bool, + clicked: bool, + doubleClicked: bool, + tripleClicked: bool, + rightPressed: bool, + + dragging: bool, + hovering: bool, + + pasted: bool, +}; + +pub const UiBoxDrawProc = *fn (box: *UiBox, data: ?*anyopaque) callconv(.C) void; + +pub const UiOverflowAllow = packed struct { + x: bool = false, + y: bool = false, + + pub fn array(self: *UiOverflowAllow) *[2]bool { + return @ptrCast(self); + } +}; + +pub const UiFlags = packed struct(c_uint) { + clickable: bool = false, // 0 + scroll_wheel_x: bool = false, // 1 + scroll_wheel_y: bool = false, // 2 + block_mouse: bool = false, // 3 + hot_animation: bool = false, // 4 + active_animation: bool = false, // 5 + overflow_allow: UiOverflowAllow = .{}, // 6-7 + clip: bool = false, // 8 + draw_background: bool = false, // 9 + draw_foreground: bool = false, // 10 + draw_border: bool = false, // 11 + draw_text: bool = false, // 12 + draw_proc: bool = false, // 13 + _: u2 = 0, // 14-15 + + overlay: bool = false, // 16 + __: u15 = 0, +}; + +pub const UiBox = extern struct { + // hierarchy + list_elt: ListElt, + children: List, + parent: ?*UiBox, + + overlay_elt: ListElt, + + // keying and caching + bucket_elt: ListElt, + key: UiKey, + frame_counter: u64, + + // builder-provided info + flags: UiFlags, + string: Str8, + tags: List, + + draw_proc: UiBoxDrawProc, + draw_data: *anyopaque, + + // styling + before_rules: List, + after_rules: List, + + target_style: ?*UiStyle, + style: UiStyleInternal, + z: u32, + + float_pos: Vec2, + children_sum: [2]f32, + spacing: [2]f32, + min_size: [2]f32, + rect: Rect, + + // signals + sig: ?*UiSig, + + // stateful behavior + fresh: bool, + closed: bool, + parent_closed: bool, + dragging: bool, + hot: bool, + active: bool, + scroll: Vec2, + pressed_mouse: Vec2, + + // animation data + hot_transition: f32, + active_transition: f32, +}; + +pub const UiInputText = extern struct { + count: u8, + codepoints: [64]Utf32, +}; + +const UiCSize = extern struct { + kind: UiSizeKind, + value: f32 = 0, + relax: f32 = 0, + min_size: f32 = 0, + + fn fromUiSize(ui_size: UiSize) UiCSize { + return switch (ui_size) { + .text => .{ .kind = .Text }, + .pixels => |pixels| .{ .kind = .Pixels, .value = pixels }, + .children => .{ .kind = .Children }, + .fill_parent => .{ .kind = .Parent, .value = 1 }, + .parent => |fraction| .{ .kind = .Parent, .value = fraction }, + .parent_minus_pixels => |pixels| .{ .kind = .ParentMinusPixels, .value = pixels }, + .custom => |custom| .{ + .kind = custom.kind, + .value = custom.value, + .relax = custom.relax, + .min_size = custom.min_size, + }, + }; + } +}; + +pub const UiStackElt = extern struct { + parent: ?*UiStackElt, + elt: extern union { + box: *UiBox, + size: UiCSize, + clip: Rect, + }, +}; + +pub const UiTagElt = extern struct { + list_elt: ListElt, + tag: UiTag, +}; + +pub const UiEditMove = enum(c_uint) { + none, + char, + word, + line, +}; + +pub const UiContext = extern struct { + is_init: bool, + + input: InputState, + + frame_counter: u64, + frame_time: f64, + last_frame_duration: f64, + + frame_arena: Arena, + box_pool: Pool, + box_map: [1024]List, + + root: *UiBox, + overlay: *UiBox, + overlay_list: List, + box_stack: *UiStackElt, + clip_stack: *UiStackElt, + + next_box_before_rules: List, + next_box_after_rules: List, + next_box_tags: List, + + z: u32, + hovered: ?*UiBox, + + focus: ?*UiBox, + edit_cursor: i32, + edit_mark: i32, + edit_first_displayed_char: i32, + edit_cursor_blink_start: f64, + edit_selection_mode: UiEditMove, + edit_word_selection_initial_cursor: i32, + edit_word_selection_initial_mark: i32, + + theme: *UiTheme, + + extern fn oc_ui_init(context: *UiContext) void; + pub const init = oc_ui_init; +}; + +const UiLayoutAlignmentInternal = extern struct { + x: UiAlignment, + y: UiAlignment, +}; + +const UiLayoutMarginInternal = extern struct { + x: f32, + y: f32, +}; + +const UiLayoutInternal = extern struct { + axis: UiAxis, + spacing: f32, + margin: UiLayoutMarginInternal, + alignment: UiLayoutAlignmentInternal, +}; + +const UiBoxSizeInternal = extern struct { + width: UiCSize, + height: UiCSize, +}; + +const UiBoxFloatingInternal = extern struct { + x: bool, + y: bool, +}; + +const UiFloatTargetInternal = extern struct { + x: f32, + y: f32, +}; + +const UiStyleInternal = extern struct { + size: UiBoxSizeInternal, + layout: UiLayoutInternal, + floating: UiBoxFloatingInternal, + float_target: UiFloatTargetInternal, + color: Color, + bg_color: Color, + border_color: Color, + font: Font, + font_size: f32, + border_size: f32, + roundness: f32, + animation_time: f32, + animation_mask: UiAnimationMask, +}; + +const UiStyleMaskInternal = packed struct(u64) { + _: u1 = 0, + size_width: bool = false, + size_height: bool = false, + layout_axis: bool = false, + layout_align_x: bool = false, + layout_align_y: bool = false, + layout_spacing: bool = false, + layout_margin_x: bool = false, + layout_margin_y: bool = false, + float_x: bool = false, + float_y: bool = false, + color: bool = false, + bg_color: bool = false, + border_color: bool = false, + border_size: bool = false, + roundness: bool = false, + font: bool = false, + font_size: bool = false, + animation_time: bool = false, + animation_mask: bool = false, + __: u44 = 0, +}; + +//------------------------------------------------------------------------------------------ +// [UI]: context initialization and frame cycle +//------------------------------------------------------------------------------------------ + +extern fn oc_ui_get_context() *UiContext; +extern fn oc_ui_set_context(context: *UiContext) void; + +extern fn oc_ui_process_event(event: *CEvent) void; +extern fn oc_ui_begin_frame(size: Vec2, default_style: *UiStyleInternal, mask: UiStyleMaskInternal) void; +extern fn oc_ui_end_frame() void; +extern fn oc_ui_draw() void; +extern fn oc_ui_set_theme(theme: *UiTheme) void; + +pub const uiGetContext = oc_ui_get_context; +pub const uiSetContext = oc_ui_set_context; +pub const uiProcessCEvent = oc_ui_process_event; + +pub const uiEndFrame = oc_ui_end_frame; +pub const uiDraw = oc_ui_draw; +pub const uiSetTheme = oc_ui_set_theme; + +pub fn uiBeginFrame(size: Vec2, default_style: *UiStyle) void { + var default_style_and_mask = uiConvertStyle(default_style); + oc_ui_begin_frame(size, &default_style_and_mask.style, default_style_and_mask.mask); +} + +const UiStyleAndMaskInternal = struct { + style: UiStyleInternal, + mask: UiStyleMaskInternal, +}; + +fn uiConvertStyle(style: *const UiStyle) UiStyleAndMaskInternal { + var style_internal: UiStyleInternal = std.mem.zeroes(UiStyleInternal); + var mask: UiStyleMaskInternal = .{}; + if (style.size.width) |width| { + style_internal.size.width = UiCSize.fromUiSize(width); + mask.size_width = true; + } + if (style.size.height) |height| { + style_internal.size.height = UiCSize.fromUiSize(height); + mask.size_height = true; + } + if (style.layout.axis) |axis| { + style_internal.layout.axis = axis; + mask.layout_axis = true; + } + if (style.layout.alignment.x) |x| { + style_internal.layout.alignment.x = x; + mask.layout_align_x = true; + } + if (style.layout.alignment.y) |y| { + style_internal.layout.alignment.y = y; + mask.layout_align_y = true; + } + if (style.layout.spacing) |spacing| { + style_internal.layout.spacing = spacing; + mask.layout_spacing = true; + } + if (style.layout.margin.x) |x| { + style_internal.layout.margin.x = x; + mask.layout_margin_x = true; + } + if (style.layout.margin.y) |y| { + style_internal.layout.margin.y = y; + mask.layout_margin_y = true; + } + if (style.floating.x) |x| { + style_internal.floating.x = x; + if (style.float_target.x) |target_x| { + style_internal.float_target.x = target_x; + } + mask.float_x = true; + } + if (style.floating.y) |y| { + style_internal.floating.y = y; + if (style.float_target.y) |target_y| { + style_internal.float_target.y = target_y; + } + mask.float_y = true; + } + if (style.color) |color| { + style_internal.color = color; + mask.color = true; + } + if (style.bg_color) |bg_color| { + style_internal.bg_color = bg_color; + mask.bg_color = true; + } + if (style.border_color) |border_color| { + style_internal.border_color = border_color; + mask.border_color = true; + } + if (style.border_size) |border_size| { + style_internal.border_size = border_size; + mask.border_size = true; + } + if (style.roundness) |roundness| { + style_internal.roundness = roundness; + mask.roundness = true; + } + if (style.font) |font| { + style_internal.font = font; + mask.font = true; + } + if (style.font_size) |font_size| { + style_internal.font_size = font_size; + mask.font_size = true; + } + if (style.animation_time) |animation_time| { + style_internal.animation_time = animation_time; + mask.animation_time = true; + } + if (style.animation_mask != .None) { + style_internal.animation_mask = @enumFromInt( + @intFromEnum(style_internal.animation_mask) | @intFromEnum(style.animation_mask), + ); + mask.animation_mask = true; + } + + return .{ .style = style_internal, .mask = mask }; +} + +//------------------------------------------------------------------------------------------ +// [UI]: box keys +//------------------------------------------------------------------------------------------ + +extern fn oc_ui_key_make_str8(string: Str8) UiKey; +extern fn oc_ui_key_make_path(path: Str8List) UiKey; + +pub fn uiKeyMake(string: []const u8) UiKey { + return oc_ui_key_make_str8(Str8.fromSlice(string)); +} + +pub const uiKeyMakePath = oc_ui_key_make_path; + +//------------------------------------------------------------------------------------------ +// [UI]: box hierarchy building +//------------------------------------------------------------------------------------------ + +extern fn oc_ui_box_make_str8(string: Str8, flags: UiFlags) *UiBox; +extern fn oc_ui_box_begin_str8(string: Str8, flags: UiFlags) *UiBox; +extern fn oc_ui_box_end() *UiBox; + +extern fn oc_ui_box_push(box: *UiBox) void; +extern fn oc_ui_box_pop() void; +extern fn oc_ui_box_top() ?*UiBox; + +extern fn oc_ui_box_lookup_key(key: UiKey) ?*UiBox; +extern fn oc_ui_box_lookup_str8(string: Str8) ?*UiBox; + +extern fn oc_ui_box_set_draw_proc(box: UiBox, proc: UiBoxDrawProc, data: ?*anyopaque) void; + +pub fn uiBoxMake(string: []const u8, flags: UiFlags) *UiBox { + return oc_ui_box_make_str8(Str8.fromSlice(string), flags); +} + +pub fn uiBoxBegin(string: []const u8, flags: UiFlags) *UiBox { + return oc_ui_box_begin_str8(Str8.fromSlice(string), flags); +} + +pub const uiBoxEnd = oc_ui_box_end; + +pub const uiBoxPush = oc_ui_box_push; +pub const uiBoxPop = oc_ui_box_pop; +pub const uiBoxTop = oc_ui_box_top; + +pub const uiBoxLookupKey = oc_ui_box_lookup_key; + +pub fn uiBoxLookupStr(string: []const u8) ?*UiBox { + return oc_ui_box_lookup_str8(Str8.fromSlice(string)); +} + +pub const uiBoxSetDrawProc = oc_ui_box_set_draw_proc; + +//------------------------------------------------------------------------------------------ +// [UI]: box status and signals +//------------------------------------------------------------------------------------------ + +extern fn oc_ui_box_closed(box: *UiBox) bool; +extern fn oc_ui_box_set_closed(box: *UiBox, closed: bool) void; + +extern fn oc_ui_box_active(box: *UiBox) bool; +extern fn oc_ui_box_activate(box: *UiBox) void; +extern fn oc_ui_box_deactivate(box: *UiBox) void; + +extern fn oc_ui_box_hot(box: *UiBox) bool; +extern fn oc_ui_box_set_hot(box: *UiBox, hot: bool) void; + +extern fn oc_ui_box_sig(box: *UiBox) UiSig; + +pub const uiBoxClosed = oc_ui_box_closed; +pub const uiBoxSetClosed = oc_ui_box_set_closed; + +pub const uiBoxActive = oc_ui_box_active; +pub const uiBoxActivate = oc_ui_box_activate; +pub const uiBoxDeactivate = oc_ui_box_deactivate; + +pub const uiBoxHot = oc_ui_box_hot; +pub const uiBoxSetHot = oc_ui_box_set_hot; + +pub const uiBoxSig = oc_ui_box_sig; + +//------------------------------------------------------------------------------------------ +// [UI]: tagging +//------------------------------------------------------------------------------------------ + +extern fn oc_ui_tag_make_str8(string: Str8) UiTag; +extern fn oc_ui_tag_box_str8(box: *UiBox, string: Str8) void; +extern fn oc_ui_tag_next_str8(string: Str8) void; + +pub fn uiTagMake(string: []const u8) UiTag { + return oc_ui_tag_make_str8(Str8.fromSlice(string)); +} + +pub fn uiTagBox(box: *UiBox, string: []const u8) void { + oc_ui_tag_box_str8(box, Str8.fromSlice(string)); +} + +pub fn uiTagNext(string: []const u8) void { + oc_ui_tag_next_str8(Str8.fromSlice(string)); +} + +//------------------------------------------------------------------------------------------ +// [UI]: styling +//------------------------------------------------------------------------------------------ + +const UiSelectorDataInternal = extern union { + text: Str8, + key: UiKey, + tag: UiTag, + status: UiStatus, +}; + +const UiSelectorInternal = extern struct { + list_elt: ListElt, + kind: UiSelectorKind, + op: UiSelectorOp, + data: UiSelectorDataInternal, +}; + +extern fn oc_ui_style_next(style: *UiStyleInternal, mask: UiStyleMaskInternal) void; +extern fn oc_ui_style_match_before(pattern: UiPattern, style: *UiStyleInternal, mask: UiStyleMaskInternal) void; +extern fn oc_ui_style_match_after(patterh: UiPattern, style: *UiStyleInternal, mask: UiStyleMaskInternal) void; + +pub fn uiStyleNext(style: UiStyle) void { + var style_and_mask = uiConvertStyle(&style); + oc_ui_style_next(&style_and_mask.style, style_and_mask.mask); +} + +pub fn uiStyleMatchBefore(pattern: UiPattern, style: UiStyle) void { + var style_and_mask = uiConvertStyle(&style); + oc_ui_style_match_before(pattern, &style_and_mask.style, style_and_mask.mask); +} + +pub fn uiStyleMatchAfter(pattern: UiPattern, style: UiStyle) void { + var style_and_mask = uiConvertStyle(&style); + oc_ui_style_match_after(pattern, &style_and_mask.style, style_and_mask.mask); +} + +pub fn uiApplyStyle(dst: *UiStyle, src: *UiStyle) void { + if (src.size.width) |width| { + dst.size.width = width; + } + if (src.size.height) |height| { + dst.size.height = height; + } + if (src.layout.axis) |axis| { + dst.layout.axis = axis; + } + if (src.layout.alignment.x) |x| { + dst.layout.alignment.x = x; + } + if (src.layout.alignment.y) |y| { + dst.layout.alignment.y = y; + } + if (src.layout.spacing) |spacing| { + dst.layout.spacing = spacing; + } + if (src.layout.margin.x) |x| { + dst.layout.margin.x = x; + } + if (src.layout.margin.y) |y| { + dst.layout.margin.y = y; + } + if (src.floating.x) |x| { + dst.floating.x = x; + } + if (src.float_target.x) |x| { + dst.float_target.x = x; + } + if (src.floating.y) |y| { + dst.floating.y = y; + } + if (src.float_target.y) |y| { + dst.float_target.y = y; + } + if (src.color) |color| { + dst.color = color; + } + if (src.bg_color) |bg_color| { + dst.bg_color = bg_color; + } + if (src.border_color) |border_color| { + dst.border_color = border_color; + } + if (src.border_size) |border_size| { + dst.border_size = border_size; + } + if (src.roudness) |roudness| { + dst.roudness = roudness; + } + if (src.font) |font| { + dst.font = font; + } + if (src.font_size) |font_size| { + dst.font_size = font_size; + } + if (src.animation_time) |animation_time| { + dst.animation_time = animation_time; + } + if (src.animation_mask) |animation_mask| { + dst.animation_mask = animation_mask; + } +} + +fn uiConvertSelector(selector: UiSelector) UiSelectorInternal { + var data: UiSelectorDataInternal = switch (selector.sel) { + .any, .owner => std.mem.zeroes(UiSelectorDataInternal), + .text => |text| .{ .text = Str8.fromSlice(text) }, + .key => |key| .{ .key = key }, + .tag => |tag| .{ .tag = tag }, + .status => |status| .{ .status = status }, + }; + + return UiSelectorInternal{ + .list_elt = .{ .prev = null, .next = null }, + .kind = selector.sel, + .op = selector.op, + .data = data, + }; +} + +//------------------------------------------------------------------------------------------ +// [UI]: basic widget helpers +//------------------------------------------------------------------------------------------ + +extern fn oc_ui_label_str8(label: Str8) UiSig; +extern fn oc_ui_button_str8(label: Str8) UiSig; +extern fn oc_ui_checkbox_str8(label: Str8, checked: *bool) UiSig; +extern fn oc_ui_slider_str8(label: Str8, value: *f32) *UiBox; +extern fn oc_ui_scrollbar_str8(label: Str8, thumbRatio: f32, scrollValue: *f32) *UiBox; +extern fn oc_ui_tooltip_str8(label: Str8) void; + +extern fn oc_ui_panel_begin_str8(name: Str8, flags: UiFlags) void; +extern fn oc_ui_panel_end() void; + +extern fn oc_ui_menu_bar_begin_str8(label: Str8) void; +extern fn oc_ui_menu_bar_end() void; +extern fn oc_ui_menu_begin_str8(label: Str8) void; +extern fn oc_ui_menu_end() void; +extern fn oc_ui_menu_button_str8(name: Str8) UiSig; + +const UiTextBoxResultInternal = extern struct { + changed: bool, + accepted: bool, + text: Str8, +}; +extern fn oc_ui_text_box_str8(name: Str8, arena: Arena, text: Str8) UiTextBoxResultInternal; + +const UiSelectPopupInfoInternal = extern struct { + changed: bool, + selected_index: c_int, + option_count: c_int, + options: [*]Str8, + placeholder: Str8, +}; +extern fn oc_ui_select_popup_str8(name: Str8, info: *UiSelectPopupInfoInternal) UiSelectPopupInfoInternal; + +const UiRadioGroupInfoInternal = extern struct { + changed: bool, + selected_index: c_int, + option_count: c_int, + options: [*]Str8, +}; +extern fn oc_ui_radio_group_str8(name: Str8, info: UiRadioGroupInfoInternal) UiRadioGroupInfoInternal; + +pub fn uiLabel(label: []const u8) UiSig { + return oc_ui_label_str8(Str8.fromSlice(label)); +} + +pub fn uiButton(label: []const u8) UiSig { + return oc_ui_button_str8(Str8.fromSlice(label)); +} + +pub fn uiCheckbox(label: []const u8, checked: *bool) UiSig { + return oc_ui_checkbox_str8(Str8.fromSlice(label), checked); +} + +pub fn uiSlider(label: []const u8, value: *f32) *UiBox { + return oc_ui_slider_str8(Str8.fromSlice(label), value); +} + +pub fn uiScrollbar(label: []const u8, thumbRatio: f32, scrollValue: *f32) *UiBox { + return oc_ui_scrollbar_str8(Str8.fromSlice(label), thumbRatio, scrollValue); +} + +pub fn uiTooltip(label: []const u8) void { + oc_ui_tooltip_str8(Str8.fromSlice(label)); +} + +pub fn uiPanelBegin(name: []const u8, flags: UiFlags) void { + oc_ui_panel_begin_str8(Str8.fromSlice(name), flags); +} + +pub fn uiPanelEnd() void { + oc_ui_panel_end(); +} + +pub fn uiMenuBarBegin(label: []const u8) void { + oc_ui_menu_bar_begin_str8(Str8.fromSlice(label)); +} + +pub fn uiMenuBarEnd() void { + oc_ui_menu_bar_end(); +} + +pub fn uiMenuBegin(label: []const u8) void { + oc_ui_menu_begin_str8(Str8.fromSlice(label)); +} + +pub fn uiMenuEnd() void { + oc_ui_menu_end(); +} + +pub fn uiMenuButton(name: []const u8) UiSig { + return oc_ui_menu_button_str8(Str8.fromSlice(name)); +} + +pub const UiTextBoxResult = struct { + changed: bool, + accepted: bool, + text: []u8, +}; + +pub fn uiTextBox(name: []const u8, arena: Arena, text: []const u8) UiTextBoxResult { + var result_internal = oc_ui_text_box_str8(Str8.fromSlice(name), arena, Str8.fromSlice(text)); + return .{ + .changed = result_internal.changed, + .accepted = result_internal.accepted, + .text = result_internal.text.slice(), + }; +} + +pub const UiSelectPopupInfo = struct { + changed: bool = false, + selected_index: ?usize, + options: [][]const u8, + placeholder: []const u8 = "", +}; + +pub fn uiSelectPopup(name: []const u8, info: *UiSelectPopupInfo) UiSelectPopupInfo { + var info_internal = UiSelectPopupInfoInternal{ + .changed = info.changed, + .selected_index = if (info.selected_index) |selected_index| @intCast(selected_index) else -1, + .option_count = @intCast(info.options.len), + .options = @ptrCast(info.options.ptr), + .placeholder = Str8.fromSlice(info.placeholder), + }; + var result_internal = oc_ui_select_popup_str8(Str8.fromSlice(name), &info_internal); + return .{ + .changed = result_internal.changed, + .selected_index = if (result_internal.selected_index >= 0) @intCast(result_internal.selected_index) else null, + .options = @ptrCast(result_internal.options[0..@intCast(result_internal.option_count)]), + .placeholder = result_internal.placeholder.slice(), + }; +} + +pub const UiRadioGroupInfo = struct { + changed: bool = false, + selected_index: ?usize, + options: [][]const u8, +}; + +pub fn uiRadioGroup(name: []const u8, info: *UiRadioGroupInfo) UiRadioGroupInfo { + var info_internal = UiRadioGroupInfoInternal{ + .changed = info.changed, + .selected_index = if (info.selected_index) |selected_index| @intCast(selected_index) else -1, + .option_count = @intCast(info.options.len), + .options = @ptrCast(info.options.ptr), + }; + var result_internal = oc_ui_radio_group_str8(Str8.fromSlice(name), info_internal); + return .{ + .changed = result_internal.changed, + .selected_index = if (result_internal.selected_index >= 0) @intCast(result_internal.selected_index) else null, + .options = @ptrCast(result_internal.options[0..@intCast(result_internal.option_count)]), + }; +} + //------------------------------------------------------------------------------------------ // [GRAPHICS]: GLES //------------------------------------------------------------------------------------------ @@ -1861,22 +3333,28 @@ pub const Canvas = extern struct { // [FILE IO] basic API //------------------------------------------------------------------------------------------ -const File = extern struct { +pub const File = extern struct { const OpenFlags = packed struct(u16) { - none: bool, - append: bool, - truncate: bool, - create: bool, + _: u1 = 0, - symlink: bool, - no_follow: bool, - restrict: bool, + append: bool = false, + truncate: bool = false, + create: bool = false, + + symlink: bool = false, + no_follow: bool = false, + restrict: bool = false, + + __: u9 = 0, }; const AccessFlags = packed struct(u16) { - none: bool, - read: bool, - write: bool, + _: u1 = 0, + + read: bool = false, + write: bool = false, + + __: u13 = 0, }; const Whence = enum(c_uint) { @@ -1975,8 +3453,8 @@ const File = extern struct { extern fn oc_file_last_error(file: File) io.Error; extern fn oc_file_pos(file: File) i64; extern fn oc_file_seek(file: File, offset: i64, whence: Whence) i64; - extern fn oc_file_write(file: File, size: u64, buffer: ?[*]u8) u64; - extern fn oc_file_read(file: File, size: u64, buffer: ?[*]u8) u64; + extern fn oc_file_write(file: File, size: u64, buffer: [*]u8) u64; + extern fn oc_file_read(file: File, size: u64, buffer: [*]u8) u64; extern fn oc_file_get_status(file: File) Status; extern fn oc_file_size(file: File) u64; @@ -1992,11 +3470,22 @@ const File = extern struct { pub const lastError = oc_file_last_error; pub const pos = oc_file_pos; pub const seek = oc_file_seek; - pub const write = oc_file_write; - pub const read = oc_file_read; + + pub fn write(self: File, size: u64, buffer: []u8) u64 { + assert(size <= buffer.len, "Trying to write more than the buffer length: {d}/{d}", .{ size, buffer.len }, @src()); + return @intCast(oc_file_write(self, size, buffer.ptr)); + } + + pub fn read(self: File, size: u64, buffer: []u8) u64 { + assert(size <= buffer.len, "Trying to read more than the buffer length: {d}/{d}", .{ size, buffer.len }, @src()); + return @intCast(oc_file_read(self, size, buffer.ptr)); + } pub const getStatus = oc_file_get_status; - pub const size = oc_file_size; + + pub fn getSize(self: File) usize { + return @intCast(oc_file_size(self)); + } pub const openWithRequest = oc_file_open_with_request; pub const openWithDialog = oc_file_open_with_dialog; @@ -2006,11 +3495,11 @@ const File = extern struct { // [FILE IO] low-level io queue api //------------------------------------------------------------------------------------------ -const io = struct { - const ReqId = u16; - const Op = u32; +pub const io = struct { + pub const ReqId = u16; + pub const Op = u32; - const OpEnum = enum(c_uint) { + pub const OpEnum = enum(c_uint) { OpenAt = 0, Close, FStat, @@ -2020,7 +3509,7 @@ const io = struct { Error, }; - const Req = extern struct { + pub const Req = extern struct { id: ReqId, op: Op, handle: File, @@ -2042,7 +3531,7 @@ const io = struct { }, }; - const Error = enum(i32) { + pub const Error = enum(i32) { Ok = 0, Unknown, Op, // unsupported operation @@ -2068,7 +3557,7 @@ const io = struct { Walkout, // attempted to walk out of root directory }; - const Cmp = extern struct { + pub const Cmp = extern struct { id: ReqId, err: Error, data: extern union { diff --git a/src/ui/ui.c b/src/ui/ui.c index c526f40..68bcfc6 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -1778,7 +1778,7 @@ oc_ui_sig oc_ui_button_behavior(oc_ui_box* box) { oc_ui_box_set_hot(box, false); } - if(!sig.hovering && !sig.dragging) + if(!sig.hovering || !sig.dragging) { oc_ui_box_deactivate(box); } @@ -1873,7 +1873,7 @@ void oc_ui_checkbox_draw(oc_ui_box* box, void* data) oc_matrix_pop(); } -oc_ui_sig oc_ui_checkbox(const char* name, bool* checked) +oc_ui_sig oc_ui_checkbox_str8(oc_str8 name, bool* checked) { oc_ui_context* ui = oc_ui_get_context(); oc_ui_theme* theme = ui->theme; @@ -1918,7 +1918,7 @@ oc_ui_sig oc_ui_checkbox(const char* name, bool* checked) | OC_UI_FLAG_HOT_ANIMATION | OC_UI_FLAG_ACTIVE_ANIMATION; - box = oc_ui_box_make(name, flags); + box = oc_ui_box_make_str8(name, flags); oc_ui_tag_box(box, "checkbox"); oc_ui_box_set_draw_proc(box, oc_ui_checkbox_draw, 0); @@ -1968,7 +1968,7 @@ oc_ui_sig oc_ui_checkbox(const char* name, bool* checked) | OC_UI_FLAG_HOT_ANIMATION | OC_UI_FLAG_ACTIVE_ANIMATION; - box = oc_ui_box_make(name, flags); + box = oc_ui_box_make_str8(name, flags); oc_ui_tag_box(box, "checkbox"); } @@ -1981,16 +1981,21 @@ oc_ui_sig oc_ui_checkbox(const char* name, bool* checked) return (sig); } +oc_ui_sig oc_ui_checkbox(const char* name, bool* checked) +{ + return oc_ui_checkbox_str8(OC_STR8(name), checked); +} + //------------------------------------------------------------------------------ // slider / scrollbar //------------------------------------------------------------------------------ -oc_ui_box* oc_ui_slider(const char* label, f32* value) +oc_ui_box* oc_ui_slider_str8(oc_str8 label, f32* value) { oc_ui_context* ui = oc_ui_get_context(); oc_ui_theme* theme = ui->theme; oc_ui_style_match_before(oc_ui_pattern_all(), &(oc_ui_style){ 0 }, OC_UI_STYLE_LAYOUT); - oc_ui_box* frame = oc_ui_box_begin(label, 0); + oc_ui_box* frame = oc_ui_box_begin_str8(label, 0); { oc_ui_axis trackAxis = (frame->rect.w > frame->rect.h) ? OC_UI_AXIS_X : OC_UI_AXIS_Y; oc_ui_axis secondAxis = (trackAxis == OC_UI_AXIS_Y) ? OC_UI_AXIS_X : OC_UI_AXIS_Y; @@ -2161,12 +2166,17 @@ oc_ui_box* oc_ui_slider(const char* label, f32* value) return (frame); } -oc_ui_box* oc_ui_scrollbar(const char* label, f32 thumbRatio, f32* scrollValue) +oc_ui_box* oc_ui_slider(const char* label, f32* value) +{ + return oc_ui_slider_str8(OC_STR8(label), value); +} + +oc_ui_box* oc_ui_scrollbar_str8(oc_str8 label, f32 thumbRatio, f32* scrollValue) { oc_ui_context* ui = oc_ui_get_context(); oc_ui_theme* theme = ui->theme; oc_ui_style_match_before(oc_ui_pattern_all(), &(oc_ui_style){ 0 }, OC_UI_STYLE_LAYOUT); - oc_ui_box* frame = oc_ui_box_begin(label, 0); + oc_ui_box* frame = oc_ui_box_begin_str8(label, 0); { f32 minThumbRatio = 17. / oc_max(frame->rect.w, frame->rect.h); thumbRatio = oc_min(oc_max(thumbRatio, minThumbRatio), 1.); @@ -2292,10 +2302,15 @@ oc_ui_box* oc_ui_scrollbar(const char* label, f32 thumbRatio, f32* scrollValue) return (frame); } +oc_ui_box* oc_ui_scrollbar(const char* label, f32 thumbRatio, f32* scrollValue) +{ + return oc_ui_scrollbar_str8(OC_STR8(label), thumbRatio, scrollValue); +} + //------------------------------------------------------------------------------ // panels //------------------------------------------------------------------------------ -void oc_ui_panel_begin(const char* str, oc_ui_flags flags) +void oc_ui_panel_begin_str8(oc_str8 str, oc_ui_flags flags) { flags = flags | OC_UI_FLAG_CLIP @@ -2311,7 +2326,7 @@ void oc_ui_panel_begin(const char* str, oc_ui_flags flags) .layout.margin.y = 0 }, OC_UI_STYLE_SIZE | OC_UI_STYLE_LAYOUT_MARGINS); - oc_ui_box_begin(str, flags); + oc_ui_box_begin_str8(str, flags); oc_ui_style_next(&(oc_ui_style){ .size.width = { OC_UI_SIZE_PARENT, 1 }, .size.height = { OC_UI_SIZE_PARENT, 1 } }, @@ -2320,6 +2335,11 @@ void oc_ui_panel_begin(const char* str, oc_ui_flags flags) oc_ui_box_begin("contents", 0); } +void oc_ui_panel_begin(const char* str, oc_ui_flags flags) +{ + oc_ui_panel_begin_str8(OC_STR8(str), flags); +} + void oc_ui_panel_end(void) { oc_ui_box_end(); // contents @@ -2413,7 +2433,7 @@ void oc_ui_tooltip_arrow_draw(oc_ui_box* box, void* data) oc_matrix_pop(); } -void oc_ui_tooltip(const char* label) +void oc_ui_tooltip_str8(oc_str8 label) { oc_ui_context* ui = oc_ui_get_context(); oc_ui_theme* theme = ui->theme; @@ -2424,7 +2444,7 @@ void oc_ui_tooltip(const char* label) .floatTarget.x = p.x, .floatTarget.y = p.y }; oc_ui_style_next(&containerStyle, OC_UI_STYLE_FLOAT); - oc_ui_container(label, OC_UI_FLAG_OVERLAY) + oc_ui_container_str8(label, OC_UI_FLAG_OVERLAY) { oc_ui_style arrowStyle = { .size.width = { OC_UI_SIZE_PIXELS, 24 }, .size.height = { OC_UI_SIZE_PIXELS, 24 }, @@ -2460,17 +2480,22 @@ void oc_ui_tooltip(const char* label) oc_ui_box* contents = oc_ui_box_begin("contents", OC_UI_FLAG_DRAW_BACKGROUND); - oc_ui_label(label); + oc_ui_label_str8(label); oc_ui_box_end(); } } +void oc_ui_tooltip(const char* label) +{ + oc_ui_tooltip_str8(OC_STR8(label)); +} + //------------------------------------------------------------------------------ // Menus //------------------------------------------------------------------------------ -void oc_ui_menu_bar_begin(const char* name) +void oc_ui_menu_bar_begin_str8(oc_str8 name) { oc_ui_style style = { .size.width = { OC_UI_SIZE_PARENT, 1, 0 }, @@ -2481,7 +2506,7 @@ void oc_ui_menu_bar_begin(const char* name) | OC_UI_STYLE_LAYOUT_AXIS; oc_ui_style_next(&style, mask); - oc_ui_box* bar = oc_ui_box_begin(name, OC_UI_FLAG_DRAW_BACKGROUND); + oc_ui_box* bar = oc_ui_box_begin_str8(name, OC_UI_FLAG_DRAW_BACKGROUND); oc_ui_sig sig = oc_ui_box_sig(bar); oc_ui_context* ui = oc_ui_get_context(); @@ -2491,16 +2516,21 @@ void oc_ui_menu_bar_begin(const char* name) } } +void oc_ui_menu_bar_begin(const char* name) +{ + oc_ui_menu_bar_begin_str8(OC_STR8(name)); +} + void oc_ui_menu_bar_end(void) { oc_ui_box_end(); // menu bar } -void oc_ui_menu_begin(const char* label) +void oc_ui_menu_begin_str8(oc_str8 label) { oc_ui_context* ui = oc_ui_get_context(); oc_ui_theme* theme = ui->theme; - oc_ui_box* container = oc_ui_box_make(label, 0); + oc_ui_box* container = oc_ui_box_make_str8(label, 0); oc_ui_box_push(container); oc_ui_style_next(&(oc_ui_style){ .size.width = { OC_UI_SIZE_CHILDREN }, @@ -2525,7 +2555,7 @@ void oc_ui_menu_begin(const char* label) oc_ui_style_next(&(oc_ui_style){ .size.width = { OC_UI_SIZE_TEXT }, .size.height = { OC_UI_SIZE_TEXT } }, OC_UI_STYLE_SIZE); - oc_ui_box* buttonLabel = oc_ui_box_make(label, OC_UI_FLAG_DRAW_TEXT); + oc_ui_box* buttonLabel = oc_ui_box_make_str8(label, OC_UI_FLAG_DRAW_TEXT); oc_ui_box_end(); // button @@ -2592,13 +2622,18 @@ void oc_ui_menu_begin(const char* label) oc_ui_box_push(menu); } +void oc_ui_menu_begin(const char* label) +{ + oc_ui_menu_begin_str8(OC_STR8(label)); +} + void oc_ui_menu_end(void) { oc_ui_box_pop(); // menu oc_ui_box_pop(); // container } -oc_ui_sig oc_ui_menu_button(const char* name) +oc_ui_sig oc_ui_menu_button_str8(oc_str8 name) { oc_ui_context* ui = oc_ui_get_context(); oc_ui_theme* theme = ui->theme; @@ -2627,11 +2662,16 @@ oc_ui_sig oc_ui_menu_button(const char* name) | OC_UI_FLAG_DRAW_TEXT | OC_UI_FLAG_DRAW_BACKGROUND; - oc_ui_box* box = oc_ui_box_make(name, flags); + oc_ui_box* box = oc_ui_box_make_str8(name, flags); oc_ui_sig sig = oc_ui_box_sig(box); return (sig); } +oc_ui_sig oc_ui_menu_button(const char* name) +{ + return oc_ui_menu_button_str8(OC_STR8(name)); +} + //------------------------------------------------------------------------------ // Select //------------------------------------------------------------------------------ @@ -2689,14 +2729,14 @@ void oc_ui_select_popup_draw_checkmark(oc_ui_box* box, void* data) oc_matrix_pop(); } -oc_ui_select_popup_info oc_ui_select_popup(const char* name, oc_ui_select_popup_info* info) +oc_ui_select_popup_info oc_ui_select_popup_str8(oc_str8 name, oc_ui_select_popup_info* info) { oc_ui_select_popup_info result = *info; oc_ui_context* ui = oc_ui_get_context(); oc_ui_theme* theme = ui->theme; - oc_ui_container(name, 0) + oc_ui_container_str8(name, 0) { oc_ui_pattern hoverPattern = { 0 }; oc_ui_pattern_push(&ui->frameArena, &hoverPattern, (oc_ui_selector){ .kind = OC_UI_SEL_STATUS, .status = OC_UI_HOVER }); @@ -2908,6 +2948,11 @@ oc_ui_select_popup_info oc_ui_select_popup(const char* name, oc_ui_select_popup_ return (result); } +oc_ui_select_popup_info oc_ui_select_popup(const char* name, oc_ui_select_popup_info* info) +{ + return oc_ui_select_popup_str8(OC_STR8(name), info); +} + //------------------------------------------------------------------------------ // Radio group //------------------------------------------------------------------------------ @@ -2926,7 +2971,7 @@ void oc_ui_radio_indicator_draw(oc_ui_box* box, void* data) oc_matrix_pop(); } -oc_ui_radio_group_info oc_ui_radio_group(const char* name, oc_ui_radio_group_info* info) +oc_ui_radio_group_info oc_ui_radio_group_str8(oc_str8 name, oc_ui_radio_group_info* info) { oc_ui_radio_group_info result = *info; @@ -2937,7 +2982,7 @@ oc_ui_radio_group_info oc_ui_radio_group(const char* name, oc_ui_radio_group_inf .layout.spacing = 12 }, OC_UI_STYLE_LAYOUT_AXIS | OC_UI_STYLE_LAYOUT_SPACING); - oc_ui_container(name, 0) + oc_ui_container_str8(name, 0) { for(int i = 0; i < info->optionCount; i++) { @@ -3036,6 +3081,11 @@ oc_ui_radio_group_info oc_ui_radio_group(const char* name, oc_ui_radio_group_inf return (result); } +oc_ui_radio_group_info oc_ui_radio_group(const char* name, oc_ui_radio_group_info* info) +{ + return oc_ui_radio_group_str8(OC_STR8(name), info); +} + //------------------------------------------------------------------------------ // text box //------------------------------------------------------------------------------ @@ -3817,7 +3867,7 @@ void oc_ui_text_box_render(oc_ui_box* box, void* data) } } -oc_ui_text_box_result oc_ui_text_box(const char* name, oc_arena* arena, oc_str8 text) +oc_ui_text_box_result oc_ui_text_box_str8(oc_str8 name, oc_arena* arena, oc_str8 text) { oc_ui_context* ui = oc_ui_get_context(); oc_ui_theme* theme = ui->theme; @@ -3853,7 +3903,7 @@ oc_ui_text_box_result oc_ui_text_box(const char* name, oc_arena* arena, oc_str8 oc_ui_flags frameFlags = OC_UI_FLAG_CLICKABLE | OC_UI_FLAG_DRAW_BACKGROUND | OC_UI_FLAG_DRAW_BORDER; - oc_ui_box* frame = oc_ui_box_begin(name, frameFlags); + oc_ui_box* frame = oc_ui_box_begin_str8(name, frameFlags); oc_ui_tag_box(frame, "frame"); oc_font font = frame->style.font; f32 fontSize = frame->style.fontSize; @@ -4136,6 +4186,11 @@ oc_ui_text_box_result oc_ui_text_box(const char* name, oc_arena* arena, oc_str8 return (result); } +oc_ui_text_box_result oc_ui_text_box(const char* name, oc_arena* arena, oc_str8 text) +{ + return oc_ui_text_box_str8(OC_STR8(name), arena, text); +} + //------------------------------------------------------------------------------ // Themes // doc/UIColors.md has them visualized diff --git a/src/ui/ui.h b/src/ui/ui.h index e411d4b..93661a5 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -518,7 +518,6 @@ struct oc_ui_box oc_list beforeRules; oc_list afterRules; - //oc_ui_style_tag tag; oc_ui_style* targetStyle; oc_ui_style style; u32 z; @@ -632,8 +631,6 @@ typedef struct oc_ui_context i32 editWordSelectionInitialCursor; i32 editWordSelectionInitialMark; - bool clipboardRegistered; - oc_ui_theme* theme; } oc_ui_context; @@ -731,17 +728,6 @@ ORCA_API void oc_ui_style_match_after(oc_ui_pattern pattern, oc_ui_style* style, //------------------------------------------------------------------------- // Basic widget helpers //------------------------------------------------------------------------- -enum -{ - OC_UI_STYLE_TAG_USER_MAX = 1 << 16, - OC_UI_STYLE_TAG_LABEL, - OC_UI_STYLE_TAG_BUTTON, - OC_UI_STYLE_TAG_SCROLLBAR, - OC_UI_STYLE_TAG_PANEL, - OC_UI_STYLE_TAG_TOOLTIP, - OC_UI_STYLE_TAG_MENU -}; - ORCA_API oc_ui_sig oc_ui_label(const char* label); ORCA_API oc_ui_sig oc_ui_label_str8(oc_str8 label);