From 044d1bb6a09f13bc8e4d65549878d69a3685e9fe Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 00:21:23 -0800 Subject: [PATCH 01/25] add dray nuklear --- dub.sdl | 1 + dub.selections.json | 1 + 2 files changed, 2 insertions(+) diff --git a/dub.sdl b/dub.sdl index 331f7b6..53b98c3 100644 --- a/dub.sdl +++ b/dub.sdl @@ -7,6 +7,7 @@ dependency "silly" version="~>1.1.1" dependency "reng" version="~>0.8.8" dependency "infoflow" path="ext/infoflow" dependency "dunit" version="~>1.0.16" +dependency "dray-nuklear" version="~>0.1.5" dependency "intel-intrinsics" version="~>1.10.8" dependency "commandr" version="~>0.2.0" dependency "memoryunit" version="1.0.2" diff --git a/dub.selections.json b/dub.selections.json index b8c802c..3b8a0c2 100644 --- a/dub.selections.json +++ b/dub.selections.json @@ -8,6 +8,7 @@ "dlib": "0.19.2", "dmech": "0.4.1", "dray": "4.2.0-r2", + "dray-nuklear": "0.1.5", "dunit": "1.0.16", "fluent-asserts": "0.13.3", "gperftools_d": "0.1.0", From bcd24c471ef1f2a99720631bc6f88f07a6095ab8 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 00:27:56 -0800 Subject: [PATCH 02/25] use nuklear ui in debug mode --- dub.sdl | 1 + 1 file changed, 1 insertion(+) diff --git a/dub.sdl b/dub.sdl index 53b98c3..c1bedc3 100644 --- a/dub.sdl +++ b/dub.sdl @@ -14,6 +14,7 @@ dependency "memoryunit" version="1.0.2" dflags "-mattr=+sse4.2" "-mattr=+sse4.1" "-mattr=+ssse3" "-mattr=+sse3" "-mattr=+bmi2" "-mattr=+avx" "-mattr=+avx2" "--enable-cross-module-inlining" lflags "-lglew" "-lglfw" "/System/Library/Frameworks/OpenGL.framework/OpenGL" platform="osx" lflags "WinMM.lib" "OLDNAMES.lib" "MSVCRT.lib" "raylib.lib" "$PACKAGE_DIR/*.lib $PACKAGE_DIR/glfw3_mt.lib" "user32.lib" "gdi32.lib" platform="windows" +subConfiguration "dray-nuklear" "debug" configuration "default" { targetType "executable" versions "default" From 725574b3629cf8362c262b7116f2fa06d4dd2314 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 00:30:53 -0800 Subject: [PATCH 03/25] add an option to run beands with larger ui --- source/app.d | 3 ++- source/ui/cli/cli.d | 5 ++++- source/ui/reng/device.d | 4 ++-- source/ui/reng/emudebugscene.d | 23 +++++++++++++++++++++++ source/ui/reng/package.d | 1 + source/ui/reng/rengcore.d | 26 ++++++++++++++++++++++---- 6 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 source/ui/reng/emudebugscene.d diff --git a/source/app.d b/source/app.d index b2338ed..de30fb6 100644 --- a/source/app.d +++ b/source/app.d @@ -18,7 +18,8 @@ version (unittest) { auto nds = new NDS(cli_args.arm7_ringbuffer_size, cli_args.arm9_ringbuffer_size); - auto reng = new RengMultimediaDevice(cli_args.screen_scale); + auto show_full_ui = cli_args.detailed_ui; + auto reng = new RengMultimediaDevice(cli_args.screen_scale, show_full_ui); nds.set_multimedia_device(reng); // sure i could put the bios in the cli_args... and i *will* diff --git a/source/ui/cli/cli.d b/source/ui/cli/cli.d index caf0937..a1b1f3e 100644 --- a/source/ui/cli/cli.d +++ b/source/ui/cli/cli.d @@ -10,6 +10,7 @@ struct CLIArgs { uint screen_scale; bool direct_boot; bool reset_firmware; + bool detailed_ui; } CLIArgs parse_cli_args(string[] args) { @@ -22,6 +23,7 @@ CLIArgs parse_cli_args(string[] args) { .add(new Option("s", "screen_scale", "the screen scale (default: 1)").optional.defaultValue("1")) .add(new Flag("d", "direct_boot", "skip the firmware")) .add(new Flag("r", "reset_firmware", "factory reset the firmware before booting")) + .add(new Flag("u", "detailed_ui", "show the detailed ui")) .parse(args); return CLIArgs( @@ -30,6 +32,7 @@ CLIArgs parse_cli_args(string[] args) { to!int(program.option("arm9_ringbuffer_size")), to!int(program.option("screen_scale")), program.hasFlag("direct_boot"), - program.hasFlag("reset_firmware") + program.hasFlag("reset_firmware"), + program.hasFlag("detailed_ui"), ); } diff --git a/source/ui/reng/device.d b/source/ui/reng/device.d index f368a45..f231a04 100644 --- a/source/ui/reng/device.d +++ b/source/ui/reng/device.d @@ -25,9 +25,9 @@ class RengMultimediaDevice : MultiMediaDevice { string rom_title; int fps; - this(int screen_scale) { + this(int screen_scale, bool full_ui) { Core.target_fps = 999; - reng_core = new RengCore(screen_scale); + reng_core = new RengCore(screen_scale, full_ui); InitAudioDevice(); SetAudioStreamBufferSizeDefault(SAMPLES_PER_UPDATE); diff --git a/source/ui/reng/emudebugscene.d b/source/ui/reng/emudebugscene.d new file mode 100644 index 0000000..cf3aa43 --- /dev/null +++ b/source/ui/reng/emudebugscene.d @@ -0,0 +1,23 @@ +module ui.reng.emudebugscene; + +import re; +import ui.reng; + +class EmuDebugInterfaceScene : Scene2D { + int screen_scale; + + this(int screen_scale) { + this.screen_scale = screen_scale; + super(); + } + + override void on_start() { + auto ds_screen = create_entity("ds_display"); + auto ds_video = ds_screen.add_component(new DSVideo(screen_scale)); + Core.jar.register(ds_video); + } + + override void update() { + super.update(); + } +} \ No newline at end of file diff --git a/source/ui/reng/package.d b/source/ui/reng/package.d index f7f356a..5fb6d8a 100644 --- a/source/ui/reng/package.d +++ b/source/ui/reng/package.d @@ -4,6 +4,7 @@ public { import ui.reng.device; import ui.reng.dsvideo; import ui.reng.emuscene; + import ui.reng.emudebugscene; import ui.reng.rengcore; import ui.reng.runner; } \ No newline at end of file diff --git a/source/ui/reng/rengcore.d b/source/ui/reng/rengcore.d index b801867..f3c729d 100644 --- a/source/ui/reng/rengcore.d +++ b/source/ui/reng/rengcore.d @@ -3,17 +3,29 @@ module ui.reng.rengcore; import re; import re.math; import ui.reng; +import std.algorithm.comparison : max; class RengCore : Core { int width; int height; int screen_scale; + bool start_full_ui = false; - this(int screen_scale) { - this.width = 256 * screen_scale; + this(int screen_scale, bool full_ui) { + this.start_full_ui = full_ui; + + this.width = 256 * screen_scale; this.height = 192 * screen_scale * 2 + SCREEN_SEPARATION_HEIGHT; this.screen_scale = screen_scale; + if (this.start_full_ui) { + this.width = max(this.width, 960); + this.height = max(this.height, 720); + + sync_render_window_resolution = true; + auto_compensate_hidpi = true; + } + super(width, height, "BeanDS"); } @@ -21,7 +33,13 @@ class RengCore : Core { default_resolution = Vector2(width, height); content.paths ~= ["../content/", "content/"]; - load_scenes([new EmuScene(screen_scale)]); + screen_scale *= cast(int) window.scale_dpi; + + if (start_full_ui) { + load_scenes([new EmuDebugInterfaceScene(screen_scale)]); + } else { + load_scenes([new EmuScene(screen_scale)]); + } } pragma(inline, true) { @@ -33,4 +51,4 @@ class RengCore : Core { draw(); } } -} \ No newline at end of file +} From 9e43d40543ff9e42bd58fa4ad25d6655d1f98ee2 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 00:49:10 -0800 Subject: [PATCH 04/25] draw red on dbg render --- source/ui/reng/dsvideo.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ui/reng/dsvideo.d b/source/ui/reng/dsvideo.d index 7a0dc4c..d6bbee3 100644 --- a/source/ui/reng/dsvideo.d +++ b/source/ui/reng/dsvideo.d @@ -81,7 +81,7 @@ class DSVideo : Component, Updatable, Renderable2D { } void debug_render() { - // leave this blank + raylib.DrawRectangleLinesEx(bounds, 1, Colors.RED); } @property Rectangle bounds() { From 027a2b2df4dd4e197bad95a0ebeff183f4d42beb Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 00:50:18 -0800 Subject: [PATCH 05/25] use vars for nds screen size --- source/ui/reng/dsvideo.d | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/source/ui/reng/dsvideo.d b/source/ui/reng/dsvideo.d index d6bbee3..456f527 100644 --- a/source/ui/reng/dsvideo.d +++ b/source/ui/reng/dsvideo.d @@ -8,6 +8,8 @@ import std.format; import std.string; enum SCREEN_SEPARATION_HEIGHT = 0; +enum NDS_SCREEN_WIDTH = 256; +enum NDS_SCREEN_HEIGHT = 192; class DSVideo : Component, Updatable, Renderable2D { int screen_scale; @@ -16,20 +18,20 @@ class DSVideo : Component, Updatable, Renderable2D { RenderTarget render_target_bot; RenderTarget render_target_icon; - uint[256 * 192] videobuffer_top; - uint[256 * 192] videobuffer_bot; + uint[NDS_SCREEN_WIDTH * NDS_SCREEN_HEIGHT] videobuffer_top; + uint[NDS_SCREEN_WIDTH * NDS_SCREEN_HEIGHT] videobuffer_bot; this(int screen_scale) { this.screen_scale = screen_scale; render_target_top = RenderExt.create_render_target( - 256, - 192 + NDS_SCREEN_WIDTH, + NDS_SCREEN_HEIGHT ); render_target_bot = RenderExt.create_render_target( - 256, - 192 + NDS_SCREEN_WIDTH, + NDS_SCREEN_HEIGHT ); render_target_icon = RenderExt.create_render_target( @@ -64,17 +66,17 @@ class DSVideo : Component, Updatable, Renderable2D { raylib.DrawTexturePro( render_target_top.texture, - Rectangle(0, 0, 256, 192), - Rectangle(0, 0, 256 * screen_scale, 192 * screen_scale), + Rectangle(0, 0, NDS_SCREEN_WIDTH, NDS_SCREEN_HEIGHT), + Rectangle(0, 0, NDS_SCREEN_WIDTH * screen_scale, NDS_SCREEN_HEIGHT * screen_scale), Vector2(0, 0), 0, Colors.WHITE ); raylib.DrawTexturePro( render_target_bot.texture, - Rectangle(0, 0, 256, 192), - Rectangle(0, 0, 256 * screen_scale, 192 * screen_scale), - Vector2(0, -192 * screen_scale - SCREEN_SEPARATION_HEIGHT), + Rectangle(0, 0, NDS_SCREEN_WIDTH, NDS_SCREEN_HEIGHT), + Rectangle(0, 0, NDS_SCREEN_WIDTH * screen_scale, NDS_SCREEN_HEIGHT * screen_scale), + Vector2(0, -NDS_SCREEN_HEIGHT * screen_scale - SCREEN_SEPARATION_HEIGHT), 0, Colors.WHITE ); From 01149aa04dc308926833bdb23af04912319811c3 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 00:52:31 -0800 Subject: [PATCH 06/25] set proper dsvideo bounds --- source/ui/reng/dsvideo.d | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/ui/reng/dsvideo.d b/source/ui/reng/dsvideo.d index 456f527..03df365 100644 --- a/source/ui/reng/dsvideo.d +++ b/source/ui/reng/dsvideo.d @@ -10,6 +10,8 @@ import std.string; enum SCREEN_SEPARATION_HEIGHT = 0; enum NDS_SCREEN_WIDTH = 256; enum NDS_SCREEN_HEIGHT = 192; +enum NDS_VIEW_WIDTH = 256; +enum NDS_VIEW_HEIGHT = NDS_SCREEN_HEIGHT + SCREEN_SEPARATION_HEIGHT + NDS_SCREEN_HEIGHT; class DSVideo : Component, Updatable, Renderable2D { int screen_scale; @@ -87,8 +89,6 @@ class DSVideo : Component, Updatable, Renderable2D { } @property Rectangle bounds() { - // if we're not using culling who cares - // problem solved lol - return Rectangle(0, 0, 1000, 1080); + return Rectangle(0, 0, NDS_VIEW_WIDTH * screen_scale, NDS_VIEW_HEIGHT * screen_scale); } } \ No newline at end of file From bfc72df1635572afd610ff56fde6447b6074e756 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 01:05:12 -0800 Subject: [PATCH 07/25] create ui panels --- res/SourceSansPro-Regular.ttf | Bin 0 -> 254076 bytes source/ui/reng/dsdebugger.d | 168 +++++++++++++++++++++++++++++++++ source/ui/reng/emudebugscene.d | 4 + source/ui/reng/package.d | 1 + 4 files changed, 173 insertions(+) create mode 100644 res/SourceSansPro-Regular.ttf create mode 100644 source/ui/reng/dsdebugger.d diff --git a/res/SourceSansPro-Regular.ttf b/res/SourceSansPro-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..410287fd6ce1a80eb55dbae412f1d31eea67a726 GIT binary patch literal 254076 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

-TAxQ?C!aH`0gpY zD|c_+eQfs+du;Z&?lJBO-V?E>XiuL#)AnrGb8OFyLZ6e#e28!ePi$0 zy;t`>-siM0d|%GK9{Vcxt=hL~-=Tf)?mM^d=6;*~9{U6LC+=^uzi@xc{T=s@-oJGJ zq5bFf-`j6F;C#UQfd7Gz1JMT>9_Vsl?14E4Rv$Qh;L3p;2ksqsaxnN{=D`jJdmdbJ z@Z`ZehkOs^9GZLR_@SQ;dmYX>+~x4N!%GkEKYa1Pc(nP^ z1xG(P`r9$DV+qGvAFDie=-7qh&iG&D@jb`CdsTVW>mUASeieIc%!akbiaZwI8Op2% z{sN0D!;VQbmVtr(!NF!NJ~}?$>?Owsa~G{O|F&uY=Q%M-T$~b_elva4gbBRWcxmyo zzDZMh^mwm)#E7c7*REGZ@iW&M{goFc`AG|qD)t@RwCLcVpkTAA%5KqaW~BU)@jauf zsixv=`uh9w?^~zbN#z5&c8%|snAooheBRz zs(I+5n&s%IxY(E=vl(YZpv^lO-4Y`slJimr=8o^wJhz~r+u*YD_ALfW3rtOuB8!|A z`@+n|EkgLHq^QIO&wfu$Zw>fX~RoOMy1yc zh^Zfi+Mwr%!E@MBZRk&dhcE{}FY~5lYgR8Q%Nv4!dD4RIt5)yHoIQ5zRFn&M^6zn{ zz1}V!{vOdDX8df!M^}CI_%V-^7BoEr=h=GY=X#A(3yLdU^y{8H!ByWkt@_&foI!X_ z)89QOJ!Y&qHrfS`+OEa4{K6S6Gu!)y`=m#uca9y@%iP#)_Ls(9)<=yt#MP>UM;*J+ z!*yqqs$c!Fxuus`imEO%SyQx&89&>U^2p}Rt3H($RNdlk&j#|?s*l9gY&Wik#h_+z z6*WKNjrhCbGZBw{KCgh_c)bB)ae=$4em*9tp=W|QHl}%Cu|uzrU~^g?KUEc(P#$m1 zJr(z1ACc0F=Fys)S=Kz-l*-(t{F7Vl-yMV!9OXGrs(SOXsh?R(%s<9GHsT)CZz(sT z97nUNpJyD-!Zwheo2RE&bX;7#8$DG_T)bJsFVqH`VUR9ux{i17a!?#R9L9Dlw3U^Z zvGHSL6j?)l8v>dH;6GlD=k68OCv-{GF5Y}eXrHjErPeanM-JF~qa3`VVS!X@)#b0VIPR6K`(evhwE*X^pW%f$nBppt#9AXElOLqD3=!0Da-EBwdyI)PHUPKua~c_Gz8^y zWFgp@e5pL>al!b5`=Zb3<<Xn1F&O9mdKT;WLBofa zmqDVI;5C~J4~;T+h)&D)i!_!S8`X;~PfqS?u5ZW*kI(Rrs?|QIQJuK14zXcLf%TIc z1l09)s^=Jz-XN-|e*HRee*Q6G#(K5v>(;EF78z3(g>qm|7k}kv0mJ4rEGE|9!|Zb9 zeSYbEDYt3UXV^^UtR*ZX99Lj$*T**MM0)+kS^E>u$mo+&TCYiHSkrpNDZL%y#`fY9 ztHu?z4GL;o#3xrx=rz{*x5OkF={O=M`GtNUpF7vOmuqb|#nsoPSJ`K<&oxQilJFnz ztoLNpHhyb+0rUTd`~K=l=s{wB(BuuXTQsTRUPH0>wr`u?*1_9Bso`qZqK>qoSV0NuZmY5uhTRzuxXv+RsE|_CRhr; zi#zegB084)qp7&RM}6M9>V3YUY71{4C3!cEe0CjUj^3O3e*C^cEmnudKbnx@VOyAt zv|xQ|@^HaCs(0-8Sbc&z*{Iq4l`f%mLvsC00bP<>7iVg6Kr>Hsig{G0D2JT1;xZRw zg4yJr=vl8{+o}smz9H!W#_7%tBkBbrzYeqop^3c22tpGr^2glE z>jmVPWG%f!@-M2}p>uMFrVWddn;09LO{ot4eo@ltldb%Mrwu9{p3+obL0Z4&Ve5fG{;oa&Zr;IB%_H6GIBxIi;?U@j5WsO*K@J2?e1lWZ&W`& zg6~g_jcwR4Ha4|tMx&sBT8iQp;t?E+pXs#hSqDJ&3=E5v2dVpQ`1LMXcqbC72!1V=v%5 zV#koRQhwKvU$rOUMxI2l=26m2{i%r8n+xYDiXw87?xMYDgmj4}_ktR{x}WRMr&*s< zb18wrn({*vQk{be!}4-U!ouS+OTr@JGWoTp=7`9!dNI`xomaJvo*hzMd&oo7o;44Q zBF}3N$(jqFSD&6(bwYaWS?wQx-v-ZD`z8CY_A$f=f$5GrC-+EA?UCHDdunR;hN%Sw zsVRkp*1p?ta7ppthM7G|oA>P5ytD`P-4aVQ{!Y$4G5UBtuK}_|GtAD*!)k+K^q~sy zFA6QkxRVf&5g?7w2cOhB{wbeG2NQhjP9Ib<938l96IWjteQ1P;#$WES=3)~YuP2Tk zA-Y0*w2K_|!U(~qDSmk&Vwh;`FWIJl`h1A^WOpmyy81BT=NJC0fUAFv5yEQ9k&E#3 zMLk>n0MT|n+4cOqYC5<(8#8?PwN~MAcG-#&l~RQj4`y?WFq3gNd?buvFM1WagCxcQ zGI!ml5H7{pm~wMHQ)Xy`2L92t1JXlU7u7HHt?LtK3J*0jsBO-yU$4j^*f-wCzrN8Y zz{}3jKek?Sk;yB@%{#=`%g@8!(LX*sIK3`%_eSnbr2ga|(Fh86B0fG^A99}C@y)_U z+4*)&CQtScaWpv8bdPXolg%AdY-Y^JsJd4_vWAj^F9A5qLrQ1(HL^B6C2~1va3`;p z=B-Nw*`=Wkf|3KMF$3})I<@C9RbOVN1czcitd(E40n$Lf!(Xqu_CNiN6MM_r*?ZY5 z_Fi`Fn(gA(s(!7LZ8m4u;qFzn=qX@QM{wVNIh)v3BTIRX@Yb@E`YiAykXom@@+do0zMfB2OojbszF1e)3VoD@fIhxDrJecVFa-9y~^+}Gt9#y)N2scfF(k& z0ra-NtRX)BCFjdYYE#qCp{A{Sje2p;_V1K+vG+mExZAZXKI#(D+qke z?i;fM{IgBm@!7ow`Q(hyEQY`NdClsPkn;$S1Yb2?<@px;6@)N8A|tG7W(LMheLXLC z!P|Sh&u5yJOy5ZVllYXE;+sCdKJBIWoagZwFU8k?9$)lQy!Z3?CNIV3K9A3RDSqJd z_|li+3!cZftd6%t(LTlV_+HiVupvLW=kxexFU6019>3sk;wxW@pY{Cu#V^J0d>;Qw zbv%_vuCBLWO|Li9_siuv^!&bM)%WS;{VRUOOYz5^U%%?5_`T2L*Hp*r`B&F#u%_2* zb^d63*%Br-)O}d&$NaUg!-a>6uC1A|#Up%)DB3UiYo~`h*G-7>al>9u8TNe4^?hBv z+`OFe$L6gYKhLIxh1Sb(IenTo0Gt|`yu6(1+q=N>C{Nl;a>1;FT;X?-8{ix z{6F@WxNqHr=sN!K1{Y7tquc-3Zu&edG%Tx@v0k*uMauZc-6yhb%2&7feBI`C+eRJO zVr$9<<*^|TjcXXuRE~aAy*J|@Yu0!`qg_gD)jr;eudKRp{W>>Q%{kMBj~veP`&8js z^i7*L-=rR-rzZD7OB9M+q*!MAJl^y?z6r&nHsBp%$BtHW28QjHXl&MCRQu$wlt#D!Ht^_Ey+k zvkjKA^aKcyz!xA8S~@KdLPCH%ATPWGQh|gddOD$nYs5$*SiMt z|327V+dq$H&YYP!=ggTiXWq3tF)=-P>X~ypRu|5^<(5we^z7d1;b8j~xX5OP1{Ryx zh1~&v`|&@-hWmSVgo#$}kJI@;6XXGA#U$PCCVYK?{B$aQj3Fuvc-ML*dDVa;@(1M) zQ{+9z;cerb6?l}5rQtOD1>Ud0Y4r+xQG*jb0-uy|?r+mkd3bct?jpmMU8cW_(=YHz z1;?z1e@-pG#yUiK^eY`dCgZf>7)N=GyHYQEf%nJA+Y2*9O^Nn2cvOQ^KSlX|4Ni0m zd{Kk9sQ9!7C+R544{2~(#R4DK;KVP1Pb&Djm%NNBzDBpuRQgE@it@8cdCdD4bR@+E z9!ud8(~)!(_;oTq&C93o>r>^~YdVsSqWlNb@E3F>9R+@qf)kxwIucIO5q##-3G_mr zEw4ATKVof&-5E&BlkmOe3lCwcNd}eeb_Z;#KREd%X1=BBJhx1~^z-iSmHK_{@>u?W&wY4` z_}Yae0Zx9ydOmj{iGWAhjx?O+sKEO*IL$4Ak85z6TLPa{@k(TxBN-s@gDOt#(p(q# zq6ViqE$|@?PIFG+F~Tt>-0!KY&G2e=BsS6!8f#g$!G+d1!N*$5G#Z^0Ck6l!g&`Nt8kpv79tKD)9AJftT{0iSqq2{@=iTTpkEK zCgZOFx9do537jH3QU7`pc(#tlSl~kf&)5Pg{)^91fltciMY}Xt1imPj??d_j=2n`( zXJvd6?@xS@b6VhQgk!EWtv6@7lcXS2^Euc=>+vKJXb)DdDUF<+0a6 zJqOvSI#bf|H5Fgbls_ipBwxSH#|yq$PS54|%DwhD*Z3c3LC^!w0)&;$-Dxt>@y5ma zFw5g-9Fp{d?hgxU=oAFhh*}OZ=sCiv_7twa6uEVad3kR-4jYx1$M^#0qf7O;O+$E} zfT)sxPu7CwbI0g&@T~p=|2&J)!KXTXCO7RB12z-H>yDAiQxl)7{0^&nwZRu)E6JyJ z_zr((M5ax;i1!>jFzPuwpwJAQq>;cU6&#xWBHkB)uTj1v(MPF;*MofxuLo=3BzTza zJ*zm)NKt-KgOijJcuc`z3E_lC#Sc>MEVUk@QBD*Oceo)2dH8}B2lwVYFFP&bg z_?n92REw{0QGQl~lSLu$>o&o!*WhGni1HuQ;ACkC{3aC#J$%IyPL_t)18C`@l`cLv z&VR3$`Ar@`2mB9p8l9wg$lDD%w@=A_$&c887NUH_GI069%;&<>68 z7Pte-A+`-`NOkh+N~|_U?jtzVhzvKg?ra^ds=<-k{?TabP<0Is1ow{=7Z$MU&WWw3 zeFcYag$2o9dMj(UHJ>wzQ?=e%*HY8jBRC=KXV&&aH9OmXP4ZkE7Pik;C9evS)Pb$7 ztHe4kAa971@76j~CQBXmOWb|M&baZOPu;>kF7J<4+uP5%;DXP7^dq0*o1;M~^F0?` zbQRSXfQ52USBFyr^ep9dxA6|(V3@q`qK6xfIj6-j=SX-q)7YP#+wE-+oaDT-s$d|$ z%4{$2*u3G~rmMDT4?nSnMEkV1aG!(AhH1XGHsWE*ai^9it67wv)!?+Y1Ri5J>fzfkdY}sJ z=7`!1^Ed4k$E7>2oGU8oEfac<6{ej4b4dbfxP<(Y%mpD~Xs?ySB`rLj;LaoiwJ1+` zH7}1-ZO%1!8cq^G;FN(rRh}fFz$X-2Ftk$D?&zuWg`9~= z!}|&bI;WTCt~@VspyI0i+uP>NjWzx%M_)&k-;?XVwWfXNsma6awzIF88@|P|XQV4Z zy9a*C%&m3!Jiwhr21`c8Y19Nhso>}>PNh}+Fy&dL@*D7jYI(1w{F;g{Xz*hS4p#h& zTb82TX~MxBl5* z*Wffm1-_`kuU7H@qrsn4@hdd=S5*8O4W26hUKRIJyn$MNO~nz1z;(HxXO?h`8S(#i zT{rpb8HM-Y$VWaq!)6^qtq|v7zAl>Skn~b(^t7~a1*fMYzdy$ulMW{DK$OCU$OS`f zV^sx7_E1nB&)fMp|BjDyl*QC>PRGL)GyCVlq}2YZ_AC31^SR5I%ReHbmo+OD&mEyXs3=gzjkN zef^`{S23q~EC$C*<+=Vo&V!A3l%?Y|*G2h$4Nh}f;L`#Jmk}Mo>n|7eXP|xT2sYwT z4Nmoo^8Ff|>KFL51}AwV@JR*7p5teH&Ix>ta?q&l(ijSSRw>Wvq%jnDOyD9$gVT>Q z7p?`+KTzL-@~?6EC-6nerJ~|QkH9At9P}X8L&eu9mkO1~-X|SDMmTgm=0158u@9sZ zB$8a@)5UyGMG2A&JAHaOJy!6>8(Dvoo>i+6gFkIUUCXG;!uL^FXV~>wWbd%cW$|G_ z@p#GQ#5rRJBUcC{=7cM*!T3OZtsXYJg&9ayKfk}a3QfjGkLk;6m#O{eTH1qdGD@ubk{U}_Rd4M z&J3M>`k`~dQfTovq!F|OKOQVQS(_1wq{)nQ=-p}I2ejOHW;YeLW7?U+lLxo)E@W(BrV#Oh!*m0n@ADTr!0eKSr+vD!wjb&B^KG2l9&k*+Avr>V3`< zy-C-5VsII5_?A^WigJoUXmf{3Xiax9JAup)t}7Qrpq@66%I6q(O>2sYHO1EsRw+rK zm(hc!j3DLaq9}rmtd%2VO44Gl&_g#xyTTN9i@3NzCl3#LDiXi;=7Oe%hEa#JW~bjj zobQNtEbY`Kzph(|x`GvzRg>OG+`f0LX2zMB&CcB2@!Ff=pm$swITvhe3tqI}UNo^{ zE9@?*4AgELaMu?5>}5QT?iX8T=FlTfIqwlX?3gtX_EEl?IF5HS>zTj@3CCDvV%1RW zT?M_9LQ;@o?}S$uB43Gf65^Ie*rbQxjgQA4epnNR*E1|f;kEk>tE=JoqQiaB-igDZ zp&iph%dsCJ5)U-W@qU>3h-wCn6Kt5%7>9lWEh>JDHE_HYb~_^XfD76WF?bYF50B{M z5>e@EQ3~fPSm1q>3r#7HH*u7D7Bu+7Dn3CtW&xu5q%rAlklEGbO%bzzZ*EQ=*T=}c zxp{CO8zryjrXhapW#I{xV+lb`mEaCpdZ4}y>mD(ND!#_B`{4M320unPMwX~|@{t7> zHMAqbo;&QJ;Ye_}(<6^ko4fRpSzz1YJj`91E?i}EV9>O^F!y`!J7svWU zJh6(e$0mkj%b@7%axSM@e|<7hL3;7_irH8IMviay2J zj!@gznKT%wt4n?p`_@08=FjuBu!8T5rVzy`Q?5{)JCdy=&h9Zahi{Flov5DIGy?_7}-meCoG4&ua>$5qpP z1<<>80ZE#Apx;IILo1Dl(0}PCu0q&}0|LI3FRAx6SxVxSE_-oKaW;foS*g=mYI8ct z01jIaiCJ#-D+aHww9;1UaFp6AK^0mOoRLoD?F-KQ0{to_J6@)B^g;j>*NwL#Uxal* zyJLinQ@!9hqQFs_`1n7(j=qbizj0VThyuqff&T`x=OBY$nd4p!zNX>}8vGdHqE+@H zS~ZJSJJo3Nxb8dKZhK_;nq`oYWD=su|MxWB@(A>lUUvgpCJ(mJ6uqb&JSEGm1Qt;~ z`JIWU+>=DHwOGl;Wd5Xwn!C8Yqlq_{+F|5~9=yR0z&a82oAj6B6-qkS^{!WD{G9h# zc+L+}9%s>Gif)(bq1_nA*Z&IM>vW?sUT+!#o$7B9!@9t%X`ebqpTcSHU(t_Jv<}Y` z^&)lPD@O{WH~-P<8LQkE-{RPx7CHZNo3EGoldre=qRHPXA@oEYCfsXW8aME9im*=! zstKpq{tSUnC^*g!5Oc5MYn0ho)B|Zjdwh>v54dm=JS3k_aOuJ=T2X#MgOfB8_<(|A zKK+QdEAWG|4Jqm&It4zVmWPx|E3ep`TuP5uY3JNIK57m?+<;!Kq&YAJE`r6$*SxgOjut_@D;=yNb_gaFY6>{DO*m z>1|yVS0Z9L{oE=P_UE|1i*dOm!z`xGOx0VA$N zZMaq;IfeZKDc8FGdvNYJ^i(yifk26^n0wcBn;a4chyb_F`Yzl5)CD~Qb7J{5XG?$Relym}bPa8D$;TZ1)eAmc%<@L?-J%~CJUR;Z#RprH|8jE* z-q1O*mv?2f$sQA>$EhuRr6kKRWecw|p-$}JS!U>zp2#WT;P!I+vTu2}F8PGiIOuVO zuy>#Kc5k-5mJ>kf2b=CVJTmvPqFa{9X{3-Ax=7O~qKf`bHa5}+ZPUnyKh;W?C4uSX43vi%R;3WG5zM$fjbSp^3 z57Dckyu21asN%Rq#Cs;{nNaKTYU){|@?@J}2D*?HxuS~cx}vz2O~OJw zRK~oZFxpBTc3$i<&rp@K%kODw2!$IeYAPB%zMlBr?Y`0ain@x1aHwIyTwx70byT?; zE1llPnvSNns``$p$)s7*Z9k)7prOv+gt%Cjqb}6ZyFeDBxPkOHSOs?3x`88X;~gX( z!*;?&B#E0kC*DRJ^PVcYej~1|Gmi85D9S6kUf`tb1+M6Nfs?KmxT5O?PHRNqimn$p z=|X{XU8vBB7r_-gPC8P?{|9eQPF{jjp@Q7v?FlFg5~uzcuvi=2Pz zT{w%YBhv^y;%K&=cq`7(*pcTjlNxF8S7j!P%ZX|48es5?RZ)ChW#~Uq^K&F8g_L z_ph;o?*1YEs8Aeq&;~DJ8*RWoIQ=4EYPTo1Np}iiPeDi1X+RA>(MWIc#Ip=mT;Eky zqBlzEHx6yh1r-kE>;i2&yNk6AZz*->SppTZhf2&z%mL2n$7N27xr%dO>0!Rsyc`d) z{hV_f@klz(*P1Bbr@?7W34BV%`5i!Bf0wAAUQ5BqZ^R?%IImxn@6+H^zrd$7IPE(G zK9P>|IWO=vyu_+k+U54Pz-Q9S^D|9>56C#A8@ra%?-P8Z7a~v($GKJ(_<{x}dIUb9 z;LyLgtEl2@^r|M+1I?R`A0r%^#0RPSTfAbBPir$EVlAM{ko*DatXQ@2tTvn!A=sEN z%2cf6Wyond7{j%$ftuLZRlz-xz-p*|q%1dB|NhcE z(>cznCmMF1f{V_s0Vhkl=&ZZ(iMjGRe$&}emeAgGCVlRvJ!3|-qR+WPSNu>oQ&+El zLy5<&b>@Ps(%jloes7*G{X5;6zYD7os{q*&KNUi z=}g9)OiP~AZIqmGeji=r!Jwy2dmwVMm|z$$uN|R8$VF@9HM!Cv}K|x zYBDJfZaUB8R#^JE-`u>lxuCeh-rgdec=}guZKj`(0wRjf-E!%2! zHwDI);#N~^Alww{ubF;EdUXFK^%J4c669{vbWe1pv$}3KCh0`~@Kk6r+TFc%DS2Cy z19Y^me~~?gF~}m@v#!P@EYErx0X2d-Jq?$#U!-#sx6#O^Vtw`A>Y(ipojGN>&U%qE zq`}hRXc=iJDQwu*>h*a>T1JEBl3Pa0ofU9g%wV+*%GxU`s6nXS*N$Xs@ zvP7)buyuw#x+AOM?ZNQ=2bj(@ z80a1~SC;q-Ei02*Wx4w=j2@ktJ{n>5qtla|*KbH!%KA?0XD3oUl%zQuPTI|&2T31H zF^kS<%E>|&b+-|{tWY^EA0a#1lIPSSiw72YgS|PGD+YQg4!!q7=qsacoy#|jJoX+> zLc8|~dtc!?jtiVP4Uqtjj+cJ&LQtI85z{8jT`S=Uzo@a|5p zz02AVk41+wGh2|SX0^MbamZDjtSD7--fSEzvb!{aV2aZ!-~?GKhjfgM=(h~iMeL56 zL}z4IuzP1DIBZHDA2eTdD6cGQY}r=aZL5IO3Tbu*;#;PtXkDNc={}5A6ZwZQR`u?> z^k6d^mPu+i1SY{>EQkEdnXJ0H+r>E28a84hWufFm#4bB!s(oBX`O5ZQ3JlM=CaCw&C=G;fCe$F7F@Y1 zvxi!0!g>0fkgug5N}8nf8;tVPSTR0n{xRN$l8aGRQfc&n8?15o%vkK`V8?VjZ*IBU z*WcUSSP}FEJY!4C=HQXpg|ow&_6Ag1_OCAPK;PG2hQ&|-c?^p>B`bJx5)nh;g2~aT znjEVuEWUNCYIiWJ-|+2khm$YCXyG!UR*E6sutE4CWkv=zNMX&@QPj?(wnRuGb&74D zt#XaKV*O0AlSJ;>74Sr>AQKB5kcma+O4}LRYr<8OP^zzP_@};*%{tn%Qc-{DnG;7M zmE|-2vqoGX)q6e1|FC)*t8>=;(Qa#<>5A`^Ddbsd9D>&;r;v-VcS2TQm1G)v3u+wp zmZV_=5h735;~4L1&1lK`5RS*!T&v6DTE z7E914MeC;T9NEPNGJAPinjTl;na`f))@(+PPtrOhss1Cbzj1b`Op`QgE$y^7%|g?h z`KpH5#r)LwzhR`(sqfuXJK621UF>j`Ri3ijPuAc`Ecg>zPOXL|(N@Yj6hwRkt3%dV zzaX8Z7rXx~^tOQfh|*r@Fhq%ET#K)mANa=&UgFLLmLOu)AoQ@8X`P$q4mos4oLF`e zJ?G+e#Y^xM8}2c)G2q!0%~ss0I_QgW)l9Z1Y@m~_?XW4uYbtq zmiV0H#^-SEP3^v=f_Ksp^x@A9EqX#LzSyF@!PeJ~mkXknvO?#h$-hcZLR(8+OR~1M zxzn^YwS>N30v;RWb7f0B{xh5;uM+7OUcVp4LyXwgs4y zY@c@Heofl^L_^PDW?(aj`N=bJ!uF=M%rkL9`dZ>spUSJs)$0sXlb_Dz-(Xt(0h^k( zmHMZVMWEQ)W2J9FaT(U-hd?n_Uy3WVXXP7NcPfDY;pW+Dmo4OM9(33Dd0ZXV#)>V0 z&?%9~KIDxIlsMYv0^M_Mwi3Us2D$?WWuy@cQ2U=yJDnaXoNxBhTOJ5CHZRrHEj2eHn3~R0ae@qb@?j65$C!=E7K)p~I*6s&OKvedpd&VL+AQW znQ5DO*Vvh7Hnz4l4g`kw?{5oOrx$v5bw~GvW@ZFmJEij>GbytX`IUX*Fp{!c2&aU} zg8R!>TVbALfFrLkDzVmqv&Y8H9+((BYZPDp+B((NHr2{*-!aiX+4{`aq#oRtITDth zdrk@;nVvqqNBSCjA~e@3vGb+YcxYjdE_sF2I!EjJIL0&!>j5XPYPM;TlUzP_AYWf@ zNgnd`kytDnGgHRC&Ik)8%a>Y_b6R{Fl>a-QmdcL@l~23b>1bQbC7%zhhI2#g0u@;; zT#NjDdlc}K7&+D&rX=8 z-K5%7qQa}vYM%x3rcpai9fUn3*J~-9U7Gee^9#yL>Ow5Eusd(ar0?rb{s=RTgdFmb z;4?z{$hoVKC@<}TQv5z&qCL`b*|xK{P5L7d|0H{{qSqf9%zOIr$N$;d)P$g%jWv-8 z0>fC@7z&q_%aXh=j!G_TiL@sM6ps4P%fUXxpzU65Pz+}811C40$Rr)12` z4tIEsx`-i@<|xIdRl#qA6PT2gg?i9HfDfOg^_X#-0}$ zChJ-{;FLy&NjfQZOEaLliOwz3ECR87aQj0(N)-+zW$@(9Tp^vUvRP|wuJC;8?08pd zh|vk_v*=M(w#>EbYrCtSZBTf3#Od0#`WjI(rFM;&$V#f*tmehRD9y<%$k9HoS+RQ} zIZA{;geiMf;mi@U#^?IS)A!l0wyt;0Nu!Bho@`25OSO$)1n*Rtrz7;2wC-s zGY_K)9#F*dD-O~p$5yI6<-CyFa!xKesgKa|9~64QXkJdm7_r z**-kdHNLbo-gP9+aztx9!`1sScesXAkF3%xVN>Dt3-N)T&f&7=svX1KEB@w*4mR4c zEgBkZcKDtCrun|$++bDmCq#P*{<%Y`O%2gfWE!IP3;(NQqB*!DG`LdPTpH_$4#yW* zUDe=Ruy4Kzl{uORL(y#=$wyHasgj#f7p)@_O`X1zl4l_i@{wbU)hAGS=9%yH8!kVA z(%s?rrcs)z{bc0w%Kr`u z`0p=%!#=;^%{RmQ!heBW?n7?wNAXz$S!n?ZA<~)1%9X{~PO~&8neAmRR~i0(gPs50 z_a?9SzN^CFaycqou=>N0hTjL@a&Rsrq_6r}xT)mHNB+gA@CUUhXl zM}59AXUJ7zx0jSuRG1%p;-UZi&xf9Pa4>xNkz233?$#rhhhc}%uS!Y~{KWIXODkv* zOT-DklDHE{^kU#i9Ydukx?jl*&o25_d|+V9gx6hI>8fq`mL^Sna+OlW_f2dqisp8< zN7Hl0LmJ_hi}VIstC!F_oXgfq{rr5ra{UcmSsLypoT!7I8v^dZJmR+%HMDFD+2Y;+ zZRYw1vj^Yvo*Frev~4Q#SxqAQ^nB73(}leDyiMJ1v>ASf9NC15O}TUuk~U-7N$DfM zSOe~upXe9+MF^@Q@e%ME9A*uaWk7<&g&!-NaUbV3eZDgdkIFc7AM2xRRC4)# zfv^7)_$uYylku2bp5(^(0>(Q%lHiMS2@~^QeHf{{&6ag@oYsNJ>nPU9^Y{yA77d~5h{jjG!n`WxP#55 z`{(As$3;g?Di;Q>MJs%@QEVws84M0n&4QCSPXdQIC($CZ07&%GPPN8nR36&F4x(6j zdh=o<+d8#(TU z1(<%g%Wr(jCysPzcj9vtIA|=_oT8$SybX%1k+5q)A4BSGRJ??dhDXwIiVTv=_i1p% ze#!WN21mq@j8AEBMES}1paw^jpNx-ca76jZcwB=cnoq_TR2;W#DcV)Wl^YM@RxYCL zWPC;~k2nsB=$G+pWgHR;d`RIRNR?+VQl!6J{)ROCIlAX5<2R}}-TGDdMv?w>yO-{H z;;T9i$T}c@?&eMKTQxYc5y<5cyOLHjQ2ljAMji8aZCe=be$gocfu{(a*dbj$)N^G#_NVPtNVqwvNy9 z+h(Hts0M#nEkD6?zR=xvD*roJHBIDqFsMGCzzJiw@d#3Tck`qNk|&(}9aFDrZa9%V z$r&Jf^Mu=&f?BLrxz`Jt-a#73_@D--h*H6g0p4qVUXgJp>@fBAo%G~!%FaYl`Wd>L zG5fcH+qms^UKeH&`HJYan~v;Ox~<1=xW(h$JbNiVDb*^s*-(<-X5*hv-DX3^v5cqa z{+V3w!3$^%>AvEFX(;Y1;(X~%=r4(GvhlLG$#!8oMfmgEkZ&T+FeB{~$1Wg(@gK`Y zZ*qt_HD_tz_I}6qcyHw@oAmgCERcNN?F%HYLc7p(?0K@L#9d-(8zcS1#7#-;fUGG^ zh|Z=jjT7!h(qi0rClWRBGdsSU6E-q@0c6Uby0Q{qTKYLZ4F5SalsIEUxojS#EOw4$ zRvO50E*2^&EIPuWy^*bq`$R$AR4eWl_d1~vUb~n;&Nx1qx7?V z?NzS+mX=^njwB^@#We-?EiJ@vj5dE~!H6-XpO^77WsEn{Z$LGEWOjfbs)5af%4O={9)wwRZkbe{uRrpV4E! z(b43WH+xG@^qpQjM9bool_;TXzeb(~n9nImerK&i;~{x==l8dsR%jOwtxm_`zN1r9N22F{VLlvcbb7+V%VEV>@_6cWjKvE0Up98Au6B+(5qgI z+J)#9cKA*T1j2lwMmr0!7o_hID$4w4T^3Kor{nR&WoP}xaO~pSKDvEL&$cG-F>Kxb z(c3OQX7~%$gqbOwhna_c9-M@7Z?N|GX_ARnuh^o~>LiQUW@)+1?spAcJU@T&u*>hb z?DxT`w#7(fv2`*ysJG9o4Xj)nk6*hour_1Y4@R1=+Bb4WfBzXH`>tw^P*1QPq)zE$ z*y-(uxH0NJSVmm_1JFv29_-^N=RKiEIeJ)&X8eJpr>CK>pfi;1+erDIsYdJ&Kgdg+ zgM&M?qt>{@(F-n2p?r+_Xa5TBO6$MJKlh-No1$ReAy*g@;je7UndDCbj)}Kp5Bpxu zS20a_#FJD5>!q5a$F=sm{E7fSks&$hqWD~Y07?Di@%epXf6uO9%bZ2B%;wrl9L1T% zCUbU`waKRoOjn28y3E{$R-3EW-D`f=vAJ`ip`kPTu6cJ$S-C;itIulh+%x1E@@(@3 zEzJvk^Q%P7^!lWf1+7s|79K_G(q1Ax&I@$7A*1=tO-vJ$Te-JoGQtl$-Ly2=p6K$n zj?DQNJ6f0PC5heS8y_4jFU{?W+Iu{~KBjZUACf*6TZ`0Bg#8JJKKs8%qhUpqB^{fBoq?P)|mDUaH3(9atA zq?g;Tlr2&Ade90W7mGN5apODTsD#F1xq(xn-uW(9q<%8KbZ$v>)zw(v5OX&UH=Xe( zcW>=Lthae$tJ$|_D7+jkDDy|_oBQ1ZwxY_C^0szIWo$mY@7+Id8?Ij(i^OXRchb6~ zb6$!`#QKzXrzZ{ggB#IOkBcaLugYh|KbOx8H`cp5=e^C-HBNg^O-sZV%Ci?+Ym3eu zj=K74T+MOw)S#~$L4WvV$ZjtSSgaKEC$T;$-q2>P2-MI^R_*Jf>=UpqAQ=qs9nyh1 ze_S*w1t>cnB&jP87xBOlJ{#EnfpTk6TWd$6vtxRDYsJ>(YBp|Y-8s{N5W|sy@<%JG zYfJJ=3bV4?woeDoJA03dNm4B4+;jG^&h9~1W^RkuIzm0)g0X!TJugSQ>P+IHO?cW$ z_5v5OizOYaZEEQA#3jQPldgW&KN5Lp=98Zo9*nj{lV4%G90T>I2D=g9PzIet{(>Cf7ZvmHNI-;&r-Etb(u*Y zx$v56E62V}coK%tbjlc5~RzF4_Ie zR<|)~fC^(7W9xt8k&Qe~2PY?;V5FrJ{Dsc}mkw+uOly3HKbE-8IBU@B-P`wfWj4&U zlnrdD-B#WmD1`^yikJL$IYz6Cqt&;>&YI1g%8hiiAK2TF>4-n_-AbHVsRBkiDIBhO&)=nc1i9 zKb~Ya@cvFpHuM*sByOV7Lcm$EY%nTrY_SP+qaX2jW1BNt14fh-2;U?$T(N6chCkul(6O{w!) zEO6=#qF`l#s!Z=AnBL8?&V??|U_)~^-iGuvRk8ORZ6B`-IZDcli>pdJ6YUKM_m5Wa zsctLF&2F6RYo897^+n@dp8i5U-=iT{pjy%o8<;EB*6z0}^IpWc{vLgN`}YlVdQR=Z zp9uXM=^q{K?;9OOxZ|w2>O6ZiJh*pme&4?NxxLhTD>PvTMhmly&wH#X7Yqbq1RU7% zDwf}k`E95jRNhyVlPD}YW0?JL7i>Y+YOcUDedgY9@$lAd4SRpG*Rb!o-MxlE&yMBc zqIP4i-UR76g;o0|s4wE@D6*Eo@-lAF4)7dXty7_0;k^e#+dAFjHCV?N`zLw^ebY7l z53x_r9}c|dEP6uG-G5sDEA)io^2&vtGFdBH(T@_ckkJ$2UvOfi-12cFRG}R91F^(1 z!+Uyq_ja>v�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 literal 0 HcmV?d00001 diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d new file mode 100644 index 0000000..afc918b --- /dev/null +++ b/source/ui/reng/dsdebugger.d @@ -0,0 +1,168 @@ +module ui.reng.dsdebugger; + +import re; +import re.gfx; +import re.math; +import re.ecs; +import re.ng.diag; +import re.util.interop; + +import raylib; +import raylib_nuklear; + +import std.array; +import std.conv; +import std.string; + +import ui.reng.dsvideo; + +// font size +enum UI_FS = 16; +enum UI_PAD = 4; + +class DSDebuggerUIRoot : Component, Renderable2D, Updatable { + mixin Reflect; + + DSVideo ds_video_display; + + @property public Rectangle bounds() { + return Rectangle(transform.position2.x, transform.position2.y, + entity.scene.resolution.x, entity.scene.resolution.y); + } + + nk_context* ctx; + nk_colorf bg; + + override void setup() { + ds_video_display = entity.scene.get_entity("ds_display").get_component!DSVideo(); + + bg = ColorToNuklearF(Colors.RAYWHITE); + auto ui_font = raylib.LoadFontEx("./res/SourceSansPro-Regular.ttf", UI_FS, null, 0); + ctx = InitNuklearEx(ui_font, UI_FS); + ctx.backend_render_scale = cast(int) (Core.window.scale_dpi); + + // nk_color[nk_style_colors.NK_COLOR_COUNT] table; + // table[nk_style_colors.NK_COLOR_TEXT] = nk_rgba(190, 190, 190, 255); + // table[nk_style_colors.NK_COLOR_WINDOW] = nk_rgba(30, 33, 40, 215); + // table[nk_style_colors.NK_COLOR_HEADER] = nk_rgba(181, 45, 69, 220); + // table[nk_style_colors.NK_COLOR_BORDER] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_BUTTON] = nk_rgba(181, 45, 69, 255); + // table[nk_style_colors.NK_COLOR_BUTTON_HOVER] = nk_rgba(190, 50, 70, 255); + // table[nk_style_colors.NK_COLOR_BUTTON_ACTIVE] = nk_rgba(195, 55, 75, 255); + // table[nk_style_colors.NK_COLOR_TOGGLE] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_TOGGLE_HOVER] = nk_rgba(45, 60, 60, 255); + // table[nk_style_colors.NK_COLOR_TOGGLE_CURSOR] = nk_rgba(181, 45, 69, 255); + // table[nk_style_colors.NK_COLOR_SELECT] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_SELECT_ACTIVE] = nk_rgba(181, 45, 69, 255); + // table[nk_style_colors.NK_COLOR_SLIDER] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_SLIDER_CURSOR] = nk_rgba(181, 45, 69, 255); + // table[nk_style_colors.NK_COLOR_SLIDER_CURSOR_HOVER] = nk_rgba(186, 50, 74, 255); + // table[nk_style_colors.NK_COLOR_SLIDER_CURSOR_ACTIVE] = nk_rgba(191, 55, 79, 255); + // table[nk_style_colors.NK_COLOR_PROPERTY] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_EDIT] = nk_rgba(51, 55, 67, 225); + // table[nk_style_colors.NK_COLOR_EDIT_CURSOR] = nk_rgba(190, 190, 190, 255); + // table[nk_style_colors.NK_COLOR_COMBO] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_CHART] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_CHART_COLOR] = nk_rgba(170, 40, 60, 255); + // table[nk_style_colors.NK_COLOR_CHART_COLOR_HIGHLIGHT] = nk_rgba(255, 0, 0, 255); + // table[nk_style_colors.NK_COLOR_SCROLLBAR] = nk_rgba(30, 33, 40, 255); + // table[nk_style_colors.NK_COLOR_SCROLLBAR_CURSOR] = nk_rgba(64, 84, 95, 255); + // table[nk_style_colors.NK_COLOR_SCROLLBAR_CURSOR_HOVER] = nk_rgba(70, 90, 100, 255); + // table[nk_style_colors.NK_COLOR_SCROLLBAR_CURSOR_ACTIVE] = nk_rgba(75, 95, 105, 255); + // table[nk_style_colors.NK_COLOR_TAB_HEADER] = nk_rgba(181, 45, 69, 220); + // nk_style_from_table(ctx, cast(nk_color*) table); + + status("ready."); + } + + @property string status(string val) { + // log status + Core.log.info(format("status: %s", val)); + return status_text = val; + } + + private string status_text = ""; + int active_tab = 0; + bool tab_picker_open = false; + Rectangle panel1_bounds; + Rectangle panel2_bounds; + + void update() { + // keyboard shortcuts + if (Input.is_key_down(Keys.KEY_LEFT_CONTROL) && Input.is_key_pressed(Keys.KEY_TAB)) { + // advance tab + // active_tab = cast(int)((active_tab + 1) % tab_mds.length); + } + } + + void render() { + auto ds_disp_bounds = ds_video_display.bounds; + // panel 1 is to the right of the video display + panel1_bounds = Rectangle(ds_disp_bounds.x + ds_disp_bounds.width, ds_disp_bounds.y, + bounds.width - ds_disp_bounds.width, ds_disp_bounds.height); + // panel 2 is below the video display, but not overlapping the panel 1 + panel2_bounds = Rectangle(ds_disp_bounds.x, ds_disp_bounds.y + ds_disp_bounds.height, + bounds.width, bounds.height - ds_disp_bounds.height); + + UpdateNuklear(ctx); + + // GUI + if (nk_begin(ctx, "panel 1", RectangleToNuklearScaled(ctx, panel1_bounds), + nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { + enum EASY = 0; + enum HARD = 1; + static int op = EASY; + static int property = 20; + nk_layout_row_static(ctx, 30, 80, 1); + if (nk_button_label(ctx, "button")) + TraceLog(TraceLogLevel.LOG_INFO, "button pressed"); + + nk_layout_row_dynamic(ctx, 30, 2); + if (nk_option_label(ctx, "easy", op == EASY)) + op = EASY; + if (nk_option_label(ctx, "hard", op == HARD)) + op = HARD; + + nk_layout_row_dynamic(ctx, 25, 1); + nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1); + + nk_layout_row_dynamic(ctx, 20, 1); + nk_label(ctx, "background:", nk_text_alignment.NK_TEXT_LEFT); + nk_layout_row_dynamic(ctx, 25, 1); + if (nk_combo_begin_color(ctx, nk_rgb_cf(bg), nk_vec2(nk_widget_width(ctx), 400))) { + nk_layout_row_dynamic(ctx, 120, 1); + bg = nk_color_picker(ctx, bg, nk_color_format.NK_RGBA); + nk_layout_row_dynamic(ctx, 25, 1); + bg.r = nk_propertyf(ctx, "#R:", 0, bg.r, 1.0f, 0.01f, 0.005f); + bg.g = nk_propertyf(ctx, "#G:", 0, bg.g, 1.0f, 0.01f, 0.005f); + bg.b = nk_propertyf(ctx, "#B:", 0, bg.b, 1.0f, 0.01f, 0.005f); + bg.a = nk_propertyf(ctx, "#A:", 0, bg.a, 1.0f, 0.01f, 0.005f); + nk_combo_end(ctx); + } + } + + nk_end(ctx); + + if (nk_begin(ctx, "panel 2", RectangleToNuklearScaled(ctx, panel2_bounds), + nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { + nk_layout_row_dynamic(ctx, 30, 1); + // have a button and some rows + if (nk_button_label(ctx, "button")) + TraceLog(TraceLogLevel.LOG_INFO, "button pressed"); + nk_layout_row_dynamic(ctx, 30, 2); + // have some labels and some rows + nk_label(ctx, "first label", nk_text_alignment.NK_TEXT_LEFT); + nk_label(ctx, "second label", nk_text_alignment.NK_TEXT_LEFT); + } + + nk_end(ctx); + + DrawNuklear(ctx); + } + + void debug_render() { + raylib.DrawRectangleLinesEx(bounds, 1, Colors.RED); + raylib.DrawRectangleLinesEx(panel1_bounds, 1, Colors.PURPLE); + raylib.DrawRectangleLinesEx(panel2_bounds, 1, Colors.PURPLE); + } +} diff --git a/source/ui/reng/emudebugscene.d b/source/ui/reng/emudebugscene.d index cf3aa43..5c009ef 100644 --- a/source/ui/reng/emudebugscene.d +++ b/source/ui/reng/emudebugscene.d @@ -15,6 +15,10 @@ class EmuDebugInterfaceScene : Scene2D { auto ds_screen = create_entity("ds_display"); auto ds_video = ds_screen.add_component(new DSVideo(screen_scale)); Core.jar.register(ds_video); + + // add debugger ui + auto ds_debugger_nt = create_entity("ds_debugger"); + ds_debugger_nt.add_component(new DSDebuggerUIRoot()); } override void update() { diff --git a/source/ui/reng/package.d b/source/ui/reng/package.d index 5fb6d8a..0df8cb6 100644 --- a/source/ui/reng/package.d +++ b/source/ui/reng/package.d @@ -3,6 +3,7 @@ module ui.reng; public { import ui.reng.device; import ui.reng.dsvideo; + import ui.reng.dsdebugger; import ui.reng.emuscene; import ui.reng.emudebugscene; import ui.reng.rengcore; From bdfae0f2da5cf57f89efda58b5a690335c414fbe Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 02:10:28 -0800 Subject: [PATCH 08/25] update dray nuklear --- dub.sdl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dub.sdl b/dub.sdl index bb9d953..46b298d 100644 --- a/dub.sdl +++ b/dub.sdl @@ -6,15 +6,15 @@ license "GPL 3" dependency "reng" version="~>0.8.8" dependency "infoflow" path="ext/infoflow" dependency "dunit" version="~>1.0.16" -dependency "dray-nuklear" version="~>0.1.5" +dependency "dray-nuklear" version="~>0.1.6" dependency "intel-intrinsics" version="~>1.10.8" dependency "commandr" version="~>0.2.0" dependency "dray" version=">=4.2.0-r2 <4.3.0-0" dependency "memoryunit" version="1.0.2" +subConfiguration "dray-nuklear" "debug" dflags "-mattr=+sse4.2" "-mattr=+sse4.1" "-mattr=+ssse3" "-mattr=+sse3" "-mattr=+bmi2" "-mattr=+avx" "-mattr=+avx2" "--enable-cross-module-inlining" lflags "-lglew" "-lglfw" "/System/Library/Frameworks/OpenGL.framework/OpenGL" platform="osx" lflags "WinMM.lib" "OLDNAMES.lib" "MSVCRT.lib" "raylib.lib" "$PACKAGE_DIR/*.lib $PACKAGE_DIR/glfw3_mt.lib" "user32.lib" "gdi32.lib" platform="windows" -subConfiguration "dray-nuklear" "debug" configuration "default" { targetType "executable" versions "default" @@ -37,6 +37,6 @@ configuration "ift" { versions "ift" } configuration "unittest" { - targetType "library" dependency "silly" version="~>1.1.1" -} \ No newline at end of file + targetType "library" +} From 2a4feb36e1be0e6449e4f0f9520d286bf1032755 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 02:10:59 -0800 Subject: [PATCH 09/25] fixup! update dray nuklear --- dub.selections.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dub.selections.json b/dub.selections.json index 3b8a0c2..83774b3 100644 --- a/dub.selections.json +++ b/dub.selections.json @@ -8,7 +8,7 @@ "dlib": "0.19.2", "dmech": "0.4.1", "dray": "4.2.0-r2", - "dray-nuklear": "0.1.5", + "dray-nuklear": "0.1.6", "dunit": "1.0.16", "fluent-asserts": "0.13.3", "gperftools_d": "0.1.0", From 6d8ba641b58d59a767980f79053ea0de3e84cffd Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 19:11:43 -0800 Subject: [PATCH 10/25] update ui lib --- dub.sdl | 4 ++-- dub.selections.json | 2 +- source/ui/reng/dsdebugger.d | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dub.sdl b/dub.sdl index 46b298d..e240188 100644 --- a/dub.sdl +++ b/dub.sdl @@ -6,13 +6,13 @@ license "GPL 3" dependency "reng" version="~>0.8.8" dependency "infoflow" path="ext/infoflow" dependency "dunit" version="~>1.0.16" -dependency "dray-nuklear" version="~>0.1.6" +dependency "dray-nuklear" version="~>0.2.0" dependency "intel-intrinsics" version="~>1.10.8" dependency "commandr" version="~>0.2.0" dependency "dray" version=">=4.2.0-r2 <4.3.0-0" dependency "memoryunit" version="1.0.2" subConfiguration "dray-nuklear" "debug" -dflags "-mattr=+sse4.2" "-mattr=+sse4.1" "-mattr=+ssse3" "-mattr=+sse3" "-mattr=+bmi2" "-mattr=+avx" "-mattr=+avx2" "--enable-cross-module-inlining" +// dflags "-mattr=+sse4.2" "-mattr=+sse4.1" "-mattr=+ssse3" "-mattr=+sse3" "-mattr=+bmi2" "-mattr=+avx" "-mattr=+avx2" "--enable-cross-module-inlining" lflags "-lglew" "-lglfw" "/System/Library/Frameworks/OpenGL.framework/OpenGL" platform="osx" lflags "WinMM.lib" "OLDNAMES.lib" "MSVCRT.lib" "raylib.lib" "$PACKAGE_DIR/*.lib $PACKAGE_DIR/glfw3_mt.lib" "user32.lib" "gdi32.lib" platform="windows" configuration "default" { diff --git a/dub.selections.json b/dub.selections.json index 83774b3..157adf9 100644 --- a/dub.selections.json +++ b/dub.selections.json @@ -8,7 +8,7 @@ "dlib": "0.19.2", "dmech": "0.4.1", "dray": "4.2.0-r2", - "dray-nuklear": "0.1.6", + "dray-nuklear": "0.2.0", "dunit": "1.0.16", "fluent-asserts": "0.13.3", "gperftools_d": "0.1.0", diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index afc918b..a4bdc82 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -39,7 +39,7 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { bg = ColorToNuklearF(Colors.RAYWHITE); auto ui_font = raylib.LoadFontEx("./res/SourceSansPro-Regular.ttf", UI_FS, null, 0); ctx = InitNuklearEx(ui_font, UI_FS); - ctx.backend_render_scale = cast(int) (Core.window.scale_dpi); + SetNuklearScaling(ctx, cast(int) Core.window.scale_dpi); // nk_color[nk_style_colors.NK_COLOR_COUNT] table; // table[nk_style_colors.NK_COLOR_TEXT] = nk_rgba(190, 190, 190, 255); @@ -107,7 +107,7 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { UpdateNuklear(ctx); // GUI - if (nk_begin(ctx, "panel 1", RectangleToNuklearScaled(ctx, panel1_bounds), + if (nk_begin(ctx, "panel 1", RectangleToNuklear(ctx, panel1_bounds), nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { enum EASY = 0; enum HARD = 1; @@ -143,7 +143,7 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { nk_end(ctx); - if (nk_begin(ctx, "panel 2", RectangleToNuklearScaled(ctx, panel2_bounds), + if (nk_begin(ctx, "panel 2", RectangleToNuklear(ctx, panel2_bounds), nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { nk_layout_row_dynamic(ctx, 30, 1); // have a button and some rows From d46770690f4d58964ef5023b872fa49f11a5baba Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 19:12:55 -0800 Subject: [PATCH 11/25] update dray nuklear --- dub.sdl | 2 +- dub.selections.json | 2 +- source/ui/reng/dsdebugger.d | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dub.sdl b/dub.sdl index 46b298d..2db56d6 100644 --- a/dub.sdl +++ b/dub.sdl @@ -6,7 +6,7 @@ license "GPL 3" dependency "reng" version="~>0.8.8" dependency "infoflow" path="ext/infoflow" dependency "dunit" version="~>1.0.16" -dependency "dray-nuklear" version="~>0.1.6" +dependency "dray-nuklear" version="~>0.2.0" dependency "intel-intrinsics" version="~>1.10.8" dependency "commandr" version="~>0.2.0" dependency "dray" version=">=4.2.0-r2 <4.3.0-0" diff --git a/dub.selections.json b/dub.selections.json index 83774b3..157adf9 100644 --- a/dub.selections.json +++ b/dub.selections.json @@ -8,7 +8,7 @@ "dlib": "0.19.2", "dmech": "0.4.1", "dray": "4.2.0-r2", - "dray-nuklear": "0.1.6", + "dray-nuklear": "0.2.0", "dunit": "1.0.16", "fluent-asserts": "0.13.3", "gperftools_d": "0.1.0", diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index afc918b..a4bdc82 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -39,7 +39,7 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { bg = ColorToNuklearF(Colors.RAYWHITE); auto ui_font = raylib.LoadFontEx("./res/SourceSansPro-Regular.ttf", UI_FS, null, 0); ctx = InitNuklearEx(ui_font, UI_FS); - ctx.backend_render_scale = cast(int) (Core.window.scale_dpi); + SetNuklearScaling(ctx, cast(int) Core.window.scale_dpi); // nk_color[nk_style_colors.NK_COLOR_COUNT] table; // table[nk_style_colors.NK_COLOR_TEXT] = nk_rgba(190, 190, 190, 255); @@ -107,7 +107,7 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { UpdateNuklear(ctx); // GUI - if (nk_begin(ctx, "panel 1", RectangleToNuklearScaled(ctx, panel1_bounds), + if (nk_begin(ctx, "panel 1", RectangleToNuklear(ctx, panel1_bounds), nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { enum EASY = 0; enum HARD = 1; @@ -143,7 +143,7 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { nk_end(ctx); - if (nk_begin(ctx, "panel 2", RectangleToNuklearScaled(ctx, panel2_bounds), + if (nk_begin(ctx, "panel 2", RectangleToNuklear(ctx, panel2_bounds), nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { nk_layout_row_dynamic(ctx, 30, 1); // have a button and some rows From 5f809378a5719cdd3e604c9b22c9c74079f7650b Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 19:13:17 -0800 Subject: [PATCH 12/25] fixup! Merge branch 'ui' of https://github.com/GhostRain0/BeanDS into ui --- dub.sdl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dub.sdl b/dub.sdl index e240188..2db56d6 100644 --- a/dub.sdl +++ b/dub.sdl @@ -12,7 +12,7 @@ dependency "commandr" version="~>0.2.0" dependency "dray" version=">=4.2.0-r2 <4.3.0-0" dependency "memoryunit" version="1.0.2" subConfiguration "dray-nuklear" "debug" -// dflags "-mattr=+sse4.2" "-mattr=+sse4.1" "-mattr=+ssse3" "-mattr=+sse3" "-mattr=+bmi2" "-mattr=+avx" "-mattr=+avx2" "--enable-cross-module-inlining" +dflags "-mattr=+sse4.2" "-mattr=+sse4.1" "-mattr=+ssse3" "-mattr=+sse3" "-mattr=+bmi2" "-mattr=+avx" "-mattr=+avx2" "--enable-cross-module-inlining" lflags "-lglew" "-lglfw" "/System/Library/Frameworks/OpenGL.framework/OpenGL" platform="osx" lflags "WinMM.lib" "OLDNAMES.lib" "MSVCRT.lib" "raylib.lib" "$PACKAGE_DIR/*.lib $PACKAGE_DIR/glfw3_mt.lib" "user32.lib" "gdi32.lib" platform="windows" configuration "default" { From bae9a6511fe25988edaf706235203cf6a044b987 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 19:32:22 -0800 Subject: [PATCH 13/25] tweak demo ui and add tabs --- source/ui/reng/dsdebugger.d | 90 ++++++++++++++++++++++------------ source/ui/reng/nuklear_style.d | 46 +++++++++++++++++ 2 files changed, 104 insertions(+), 32 deletions(-) create mode 100644 source/ui/reng/nuklear_style.d diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index a4bdc82..b983e8e 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -9,16 +9,16 @@ import re.util.interop; import raylib; import raylib_nuklear; +import nuklear_ext; import std.array; import std.conv; import std.string; import ui.reng.dsvideo; +import ui.reng.nuklear_style; -// font size -enum UI_FS = 16; -enum UI_PAD = 4; +enum UI_FS = 16; // font size class DSDebuggerUIRoot : Component, Renderable2D, Updatable { mixin Reflect; @@ -40,6 +40,7 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { auto ui_font = raylib.LoadFontEx("./res/SourceSansPro-Regular.ttf", UI_FS, null, 0); ctx = InitNuklearEx(ui_font, UI_FS); SetNuklearScaling(ctx, cast(int) Core.window.scale_dpi); + apply_style(ctx); // nk_color[nk_style_colors.NK_COLOR_COUNT] table; // table[nk_style_colors.NK_COLOR_TEXT] = nk_rgba(190, 190, 190, 255); @@ -81,11 +82,16 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { return status_text = val; } + enum Panel1Tab { + Tab1, + Tab2, + Tab3, + } + private string status_text = ""; - int active_tab = 0; - bool tab_picker_open = false; Rectangle panel1_bounds; Rectangle panel2_bounds; + Panel1Tab panel1_tab = Panel1Tab.Tab1; void update() { // keyboard shortcuts @@ -109,36 +115,56 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { // GUI if (nk_begin(ctx, "panel 1", RectangleToNuklear(ctx, panel1_bounds), nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { - enum EASY = 0; - enum HARD = 1; - static int op = EASY; - static int property = 20; - nk_layout_row_static(ctx, 30, 80, 1); - if (nk_button_label(ctx, "button")) - TraceLog(TraceLogLevel.LOG_INFO, "button pressed"); + enum Difficulty { + Easy, + Hard, + } - nk_layout_row_dynamic(ctx, 30, 2); - if (nk_option_label(ctx, "easy", op == EASY)) - op = EASY; - if (nk_option_label(ctx, "hard", op == HARD)) - op = HARD; - - nk_layout_row_dynamic(ctx, 25, 1); - nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1); - - nk_layout_row_dynamic(ctx, 20, 1); - nk_label(ctx, "background:", nk_text_alignment.NK_TEXT_LEFT); - nk_layout_row_dynamic(ctx, 25, 1); - if (nk_combo_begin_color(ctx, nk_rgb_cf(bg), nk_vec2(nk_widget_width(ctx), 400))) { - nk_layout_row_dynamic(ctx, 120, 1); - bg = nk_color_picker(ctx, bg, nk_color_format.NK_RGBA); + auto diff_opt = Difficulty.Easy; + auto property = 20; + + nk_layout_row_begin(ctx, nk_layout_format.NK_STATIC, 30, 2); + if (nk_tab(ctx, Panel1Tab.Tab1.to!string.c_str, panel1_tab == Panel1Tab.Tab1)) { + panel1_tab = Panel1Tab.Tab1; + } + if (nk_tab(ctx, Panel1Tab.Tab2.to!string.c_str, panel1_tab == Panel1Tab.Tab2)) { + panel1_tab = Panel1Tab.Tab2; + } + + nk_layout_row_dynamic(ctx, UI_PAD, 1); + + switch (panel1_tab) { + case Panel1Tab.Tab1: + nk_layout_row_static(ctx, 30, 80, 1); + if (nk_button_label(ctx, "button")) + TraceLog(TraceLogLevel.LOG_INFO, "button pressed"); + + nk_layout_row_dynamic(ctx, 30, 2); + if (nk_option_label(ctx, "easy", diff_opt == Difficulty.Easy)) + diff_opt = Difficulty.Easy; + if (nk_option_label(ctx, "hard", diff_opt == Difficulty.Hard)) + diff_opt = Difficulty.Hard; + break; + default: nk_layout_row_dynamic(ctx, 25, 1); - bg.r = nk_propertyf(ctx, "#R:", 0, bg.r, 1.0f, 0.01f, 0.005f); - bg.g = nk_propertyf(ctx, "#G:", 0, bg.g, 1.0f, 0.01f, 0.005f); - bg.b = nk_propertyf(ctx, "#B:", 0, bg.b, 1.0f, 0.01f, 0.005f); - bg.a = nk_propertyf(ctx, "#A:", 0, bg.a, 1.0f, 0.01f, 0.005f); - nk_combo_end(ctx); + nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1); + + nk_layout_row_dynamic(ctx, 20, 1); + nk_label(ctx, "background:", nk_text_alignment.NK_TEXT_LEFT); + nk_layout_row_dynamic(ctx, 25, 1); + if (nk_combo_begin_color(ctx, nk_rgb_cf(bg), nk_vec2(nk_widget_width(ctx), 400))) { + nk_layout_row_dynamic(ctx, 120, 1); + bg = nk_color_picker(ctx, bg, nk_color_format.NK_RGBA); + nk_layout_row_dynamic(ctx, 25, 1); + bg.r = nk_propertyf(ctx, "#R:", 0, bg.r, 1.0f, 0.01f, 0.005f); + bg.g = nk_propertyf(ctx, "#G:", 0, bg.g, 1.0f, 0.01f, 0.005f); + bg.b = nk_propertyf(ctx, "#B:", 0, bg.b, 1.0f, 0.01f, 0.005f); + bg.a = nk_propertyf(ctx, "#A:", 0, bg.a, 1.0f, 0.01f, 0.005f); + nk_combo_end(ctx); + } + break; } + } nk_end(ctx); diff --git a/source/ui/reng/nuklear_style.d b/source/ui/reng/nuklear_style.d new file mode 100644 index 0000000..f9a9014 --- /dev/null +++ b/source/ui/reng/nuklear_style.d @@ -0,0 +1,46 @@ +module ui.reng.nuklear_style; + +import raylib; +import nuklear; +import raylib_nuklear; + +enum UI_PAD = 4; + +void apply_style(nk_context* ctx) { + + // nk_color[nk_style_colors.NK_COLOR_COUNT] table; + // table[nk_style_colors.NK_COLOR_TEXT] = nk_rgba(190, 190, 190, 255); + // table[nk_style_colors.NK_COLOR_WINDOW] = nk_rgba(30, 33, 40, 215); + // table[nk_style_colors.NK_COLOR_HEADER] = nk_rgba(181, 45, 69, 220); + // table[nk_style_colors.NK_COLOR_BORDER] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_BUTTON] = nk_rgba(181, 45, 69, 255); + // table[nk_style_colors.NK_COLOR_BUTTON_HOVER] = nk_rgba(190, 50, 70, 255); + // table[nk_style_colors.NK_COLOR_BUTTON_ACTIVE] = nk_rgba(195, 55, 75, 255); + // table[nk_style_colors.NK_COLOR_TOGGLE] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_TOGGLE_HOVER] = nk_rgba(45, 60, 60, 255); + // table[nk_style_colors.NK_COLOR_TOGGLE_CURSOR] = nk_rgba(181, 45, 69, 255); + // table[nk_style_colors.NK_COLOR_SELECT] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_SELECT_ACTIVE] = nk_rgba(181, 45, 69, 255); + // table[nk_style_colors.NK_COLOR_SLIDER] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_SLIDER_CURSOR] = nk_rgba(181, 45, 69, 255); + // table[nk_style_colors.NK_COLOR_SLIDER_CURSOR_HOVER] = nk_rgba(186, 50, 74, 255); + // table[nk_style_colors.NK_COLOR_SLIDER_CURSOR_ACTIVE] = nk_rgba(191, 55, 79, 255); + // table[nk_style_colors.NK_COLOR_PROPERTY] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_EDIT] = nk_rgba(51, 55, 67, 225); + // table[nk_style_colors.NK_COLOR_EDIT_CURSOR] = nk_rgba(190, 190, 190, 255); + // table[nk_style_colors.NK_COLOR_COMBO] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_CHART] = nk_rgba(51, 55, 67, 255); + // table[nk_style_colors.NK_COLOR_CHART_COLOR] = nk_rgba(170, 40, 60, 255); + // table[nk_style_colors.NK_COLOR_CHART_COLOR_HIGHLIGHT] = nk_rgba(255, 0, 0, 255); + // table[nk_style_colors.NK_COLOR_SCROLLBAR] = nk_rgba(30, 33, 40, 255); + // table[nk_style_colors.NK_COLOR_SCROLLBAR_CURSOR] = nk_rgba(64, 84, 95, 255); + // table[nk_style_colors.NK_COLOR_SCROLLBAR_CURSOR_HOVER] = nk_rgba(70, 90, 100, 255); + // table[nk_style_colors.NK_COLOR_SCROLLBAR_CURSOR_ACTIVE] = nk_rgba(75, 95, 105, 255); + // table[nk_style_colors.NK_COLOR_TAB_HEADER] = nk_rgba(181, 45, 69, 220); + // nk_style_from_table(ctx, cast(nk_color*) table); + + ctx.style.button.padding.x = UI_PAD; + + ctx.style.window.spacing = nk_vec2(UI_PAD, UI_PAD); + ctx.style.button.rounding = 0; +} From 5e1d661a791fe10af2a5925ba739871ca470ad2a Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 19:43:00 -0800 Subject: [PATCH 14/25] debug dray ui --- dub.sdl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dub.sdl b/dub.sdl index f7648a8..03fa387 100644 --- a/dub.sdl +++ b/dub.sdl @@ -13,6 +13,7 @@ dependency "dray" version=">=4.2.0-r2 <4.3.0-0" dependency "memoryunit" version="1.0.2" lflags "-lglew" "-lglfw" "/System/Library/Frameworks/OpenGL.framework/OpenGL" platform="osx" lflags "WinMM.lib" "OLDNAMES.lib" "MSVCRT.lib" "raylib.lib" "$PACKAGE_DIR/*.lib $PACKAGE_DIR/glfw3_mt.lib" "user32.lib" "gdi32.lib" platform="windows" +subConfiguration "dray-nuklear" "debug" configuration "default" { targetType "executable" @@ -23,6 +24,7 @@ configuration "release" { dflags "-O3" versions "release" "quiet" "silent" dflags "-mattr=+sse4.2" "-mattr=+sse4.1" "-mattr=+ssse3" "-mattr=+sse3" "-mattr=+bmi2" "-mattr=+avx" "-mattr=+avx2" "--enable-cross-module-inlining" + subConfiguration "dray-nuklear" "release" } configuration "silent" { targetType "executable" From d1f0791fa089878bfb73ddc4368b6902e12ba9c3 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 20:02:49 -0800 Subject: [PATCH 15/25] new, better ui layout --- source/ui/reng/dsdebugger.d | 45 ++++++++++++++++++++++++++++------ source/ui/reng/nuklear_style.d | 5 ++-- source/ui/reng/rengcore.d | 2 +- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index b983e8e..c89d2e1 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -91,6 +91,7 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { private string status_text = ""; Rectangle panel1_bounds; Rectangle panel2_bounds; + Rectangle panel3_bounds; Panel1Tab panel1_tab = Panel1Tab.Tab1; void update() { @@ -103,18 +104,46 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { void render() { auto ds_disp_bounds = ds_video_display.bounds; - // panel 1 is to the right of the video display - panel1_bounds = Rectangle(ds_disp_bounds.x + ds_disp_bounds.width, ds_disp_bounds.y, - bounds.width - ds_disp_bounds.width, ds_disp_bounds.height); - // panel 2 is below the video display, but not overlapping the panel 1 - panel2_bounds = Rectangle(ds_disp_bounds.x, ds_disp_bounds.y + ds_disp_bounds.height, + // region 1 is to the right of the video display + auto region1_bounds = Rectangle(ds_disp_bounds.x + ds_disp_bounds.width, ds_disp_bounds.y, + bounds.width - ds_disp_bounds.width, bounds.height); + // regiom 2 is below the video display, but not overlapping the panel 1 + auto region2_bounds = Rectangle(ds_disp_bounds.x, ds_disp_bounds.y + ds_disp_bounds.height, bounds.width, bounds.height - ds_disp_bounds.height); + // panel 1 is right below the video display on the left + panel1_bounds = Rectangle(ds_disp_bounds.x, ds_disp_bounds.y + ds_disp_bounds.height, + ds_disp_bounds.width, bounds.height - ds_disp_bounds.height); + + // panel 3 is smaller width and 100% tall, docked to the right + const panel3_right_dock_width = cast(int) (region1_bounds.width * 0.3); + panel3_bounds = Rectangle(region1_bounds.x + region1_bounds.width - panel3_right_dock_width, region1_bounds.y, + panel3_right_dock_width, region1_bounds.height); + + // panel 2 is to the right of the video display, and fairly wide, to the left of panel 3 + panel2_bounds = Rectangle(region1_bounds.x, region1_bounds.y, + region1_bounds.width - panel3_bounds.width, region1_bounds.height); + UpdateNuklear(ctx); - // GUI + // - GUI + if (nk_begin(ctx, "panel 1", RectangleToNuklear(ctx, panel1_bounds), nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { + nk_layout_row_dynamic(ctx, 30, 1); + // have a button and some rows + if (nk_button_label(ctx, "button")) + TraceLog(TraceLogLevel.LOG_INFO, "button pressed"); + nk_layout_row_dynamic(ctx, 30, 2); + // have some labels and some rows + nk_label(ctx, "first label", nk_text_alignment.NK_TEXT_LEFT); + nk_label(ctx, "second label", nk_text_alignment.NK_TEXT_LEFT); + } + + nk_end(ctx); + + if (nk_begin(ctx, "panel 2", RectangleToNuklear(ctx, panel2_bounds), + nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { enum Difficulty { Easy, Hard, @@ -164,12 +193,11 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { } break; } - } nk_end(ctx); - if (nk_begin(ctx, "panel 2", RectangleToNuklear(ctx, panel2_bounds), + if (nk_begin(ctx, "panel 3", RectangleToNuklear(ctx, panel3_bounds), nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { nk_layout_row_dynamic(ctx, 30, 1); // have a button and some rows @@ -190,5 +218,6 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { raylib.DrawRectangleLinesEx(bounds, 1, Colors.RED); raylib.DrawRectangleLinesEx(panel1_bounds, 1, Colors.PURPLE); raylib.DrawRectangleLinesEx(panel2_bounds, 1, Colors.PURPLE); + raylib.DrawRectangleLinesEx(panel3_bounds, 1, Colors.PURPLE); } } diff --git a/source/ui/reng/nuklear_style.d b/source/ui/reng/nuklear_style.d index f9a9014..1b06c14 100644 --- a/source/ui/reng/nuklear_style.d +++ b/source/ui/reng/nuklear_style.d @@ -39,8 +39,9 @@ void apply_style(nk_context* ctx) { // table[nk_style_colors.NK_COLOR_TAB_HEADER] = nk_rgba(181, 45, 69, 220); // nk_style_from_table(ctx, cast(nk_color*) table); - ctx.style.button.padding.x = UI_PAD; + ctx.style.button.padding.x = UI_PAD * 2; - ctx.style.window.spacing = nk_vec2(UI_PAD, UI_PAD); + // ctx.style.window.spacing = nk_vec2(UI_PAD, UI_PAD); + ctx.style.window.spacing = nk_vec2(0, 0); ctx.style.button.rounding = 0; } diff --git a/source/ui/reng/rengcore.d b/source/ui/reng/rengcore.d index f3c729d..8f86e27 100644 --- a/source/ui/reng/rengcore.d +++ b/source/ui/reng/rengcore.d @@ -19,7 +19,7 @@ class RengCore : Core { this.screen_scale = screen_scale; if (this.start_full_ui) { - this.width = max(this.width, 960); + this.width = max(this.width, 1280); this.height = max(this.height, 720); sync_render_window_resolution = true; From 0248c8638597408c15944b4202aec08f32f74b7f Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 20:19:11 -0800 Subject: [PATCH 16/25] tweaks to make the ui better --- source/ui/reng/dsdebugger.d | 48 +++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index c89d2e1..5853775 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -116,7 +116,7 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { ds_disp_bounds.width, bounds.height - ds_disp_bounds.height); // panel 3 is smaller width and 100% tall, docked to the right - const panel3_right_dock_width = cast(int) (region1_bounds.width * 0.3); + const panel3_right_dock_width = cast(int)(region1_bounds.width * 0.3); panel3_bounds = Rectangle(region1_bounds.x + region1_bounds.width - panel3_right_dock_width, region1_bounds.y, panel3_right_dock_width, region1_bounds.height); @@ -149,17 +149,39 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { Hard, } - auto diff_opt = Difficulty.Easy; - auto property = 20; + static auto diff_opt = Difficulty.Easy; + static auto property = 20; - nk_layout_row_begin(ctx, nk_layout_format.NK_STATIC, 30, 2); - if (nk_tab(ctx, Panel1Tab.Tab1.to!string.c_str, panel1_tab == Panel1Tab.Tab1)) { - panel1_tab = Panel1Tab.Tab1; - } - if (nk_tab(ctx, Panel1Tab.Tab2.to!string.c_str, panel1_tab == Panel1Tab.Tab2)) { - panel1_tab = Panel1Tab.Tab2; + // nk_layout_row_begin(ctx, nk_layout_format.NK_STATIC, 30, 2); + // if (nk_tab(ctx, Panel1Tab.Tab1.to!string.c_str, panel1_tab == Panel1Tab.Tab1)) { + // panel1_tab = Panel1Tab.Tab1; + // } + // if (nk_tab(ctx, Panel1Tab.Tab2.to!string.c_str, panel1_tab == Panel1Tab.Tab2)) { + // panel1_tab = Panel1Tab.Tab2; + // } + + auto GEN_NK_TABS(TTabs)(string tab_var) { + import std.traits; + import std.array : appender; + + auto enum_name = __traits(identifier, TTabs); + auto tab_names = EnumMembers!TTabs; + auto num_tabs = tab_names.length; + + auto sb = appender!string; + + sb ~= format("nk_layout_row_begin(ctx, nk_layout_format.NK_STATIC, 30, %d);", num_tabs); + + foreach (i, tab_name; tab_names) { + sb ~= format("if (nk_tab(ctx, \"%s\", %s == %s.%s)) { %s = %s.%s; }", + tab_name, tab_var, enum_name, tab_name, tab_var, enum_name, tab_name); + } + + return sb.data; } + mixin(GEN_NK_TABS!(Panel1Tab)("panel1_tab")); + nk_layout_row_dynamic(ctx, UI_PAD, 1); switch (panel1_tab) { @@ -174,7 +196,7 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { if (nk_option_label(ctx, "hard", diff_opt == Difficulty.Hard)) diff_opt = Difficulty.Hard; break; - default: + case Panel1Tab.Tab2: nk_layout_row_dynamic(ctx, 25, 1); nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1); @@ -192,6 +214,12 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { nk_combo_end(ctx); } break; + case Panel1Tab.Tab3: + nk_layout_row_dynamic(ctx, 30, 1); + nk_label(ctx, "Tab 3", nk_text_alignment.NK_TEXT_LEFT); + break; + default: + break; } } From 1b195332ac4265c9ad8ccf21cbf1114c5887a6a0 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 20:20:01 -0800 Subject: [PATCH 17/25] reorganize gen tabs --- source/ui/reng/dsdebugger.d | 56 ++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index 5853775..31b3a63 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -126,6 +126,34 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { UpdateNuklear(ctx); + // nk_layout_row_begin(ctx, nk_layout_format.NK_STATIC, 30, 2); + // if (nk_tab(ctx, Panel1Tab.Tab1.to!string.c_str, panel1_tab == Panel1Tab.Tab1)) { + // panel1_tab = Panel1Tab.Tab1; + // } + // if (nk_tab(ctx, Panel1Tab.Tab2.to!string.c_str, panel1_tab == Panel1Tab.Tab2)) { + // panel1_tab = Panel1Tab.Tab2; + // } + + auto GEN_NK_TABS(TTabs)(string tab_var) { + import std.traits; + import std.array : appender; + + auto enum_name = __traits(identifier, TTabs); + auto tab_names = EnumMembers!TTabs; + auto num_tabs = tab_names.length; + + auto sb = appender!string; + + sb ~= format("nk_layout_row_begin(ctx, nk_layout_format.NK_STATIC, 30, %d);", num_tabs); + + foreach (i, tab_name; tab_names) { + sb ~= format("if (nk_tab(ctx, \"%s\", %s == %s.%s)) { %s = %s.%s; }", + tab_name, tab_var, enum_name, tab_name, tab_var, enum_name, tab_name); + } + + return sb.data; + } + // - GUI if (nk_begin(ctx, "panel 1", RectangleToNuklear(ctx, panel1_bounds), @@ -152,34 +180,6 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { static auto diff_opt = Difficulty.Easy; static auto property = 20; - // nk_layout_row_begin(ctx, nk_layout_format.NK_STATIC, 30, 2); - // if (nk_tab(ctx, Panel1Tab.Tab1.to!string.c_str, panel1_tab == Panel1Tab.Tab1)) { - // panel1_tab = Panel1Tab.Tab1; - // } - // if (nk_tab(ctx, Panel1Tab.Tab2.to!string.c_str, panel1_tab == Panel1Tab.Tab2)) { - // panel1_tab = Panel1Tab.Tab2; - // } - - auto GEN_NK_TABS(TTabs)(string tab_var) { - import std.traits; - import std.array : appender; - - auto enum_name = __traits(identifier, TTabs); - auto tab_names = EnumMembers!TTabs; - auto num_tabs = tab_names.length; - - auto sb = appender!string; - - sb ~= format("nk_layout_row_begin(ctx, nk_layout_format.NK_STATIC, 30, %d);", num_tabs); - - foreach (i, tab_name; tab_names) { - sb ~= format("if (nk_tab(ctx, \"%s\", %s == %s.%s)) { %s = %s.%s; }", - tab_name, tab_var, enum_name, tab_name, tab_var, enum_name, tab_name); - } - - return sb.data; - } - mixin(GEN_NK_TABS!(Panel1Tab)("panel1_tab")); nk_layout_row_dynamic(ctx, UI_PAD, 1); From cb8747f367ca1cc42fcd81ffec92d1fa4fac8b35 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 22:36:17 -0800 Subject: [PATCH 18/25] add a top menu --- source/ui/reng/dsdebugger.d | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index 31b3a63..ac7bb7e 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -171,7 +171,32 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { nk_end(ctx); if (nk_begin(ctx, "panel 2", RectangleToNuklear(ctx, panel2_bounds), - nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { + nk_panel_flags.NK_WINDOW_BORDER)) { + + // menu bar + nk_menubar_begin(ctx); + nk_layout_row_begin(ctx, nk_layout_format.NK_STATIC, 25, 2); + nk_layout_row_push(ctx, 45); + if (nk_menu_begin_label(ctx, "File", nk_text_alignment.NK_TEXT_LEFT, nk_vec2_(120, 200))) { + nk_layout_row_dynamic(ctx, 25, 1); + if (nk_menu_item_label(ctx, "Open", nk_text_alignment.NK_TEXT_LEFT)) + TraceLog(TraceLogLevel.LOG_INFO, "Open"); + if (nk_menu_item_label(ctx, "Close", nk_text_alignment.NK_TEXT_LEFT)) + TraceLog(TraceLogLevel.LOG_INFO, "Close"); + nk_menu_end(ctx); + } + nk_layout_row_push(ctx, 45); + if (nk_menu_begin_label(ctx, "Edit", nk_text_alignment.NK_TEXT_LEFT, nk_vec2_(120, 200))) { + nk_layout_row_dynamic(ctx, 25, 1); + if (nk_menu_item_label(ctx, "Copy", nk_text_alignment.NK_TEXT_LEFT)) + TraceLog(TraceLogLevel.LOG_INFO, "Copy"); + if (nk_menu_item_label(ctx, "Paste", nk_text_alignment.NK_TEXT_LEFT)) + TraceLog(TraceLogLevel.LOG_INFO, "Paste"); + nk_menu_end(ctx); + } + nk_menubar_end(ctx); + nk_layout_row_dynamic(ctx, UI_PAD, 1); + enum Difficulty { Easy, Hard, From 8a88d2169e57d4a15425216b203cca965d3ed814 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 22:38:32 -0800 Subject: [PATCH 19/25] support Ctrl Tab --- source/ui/reng/dsdebugger.d | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index ac7bb7e..6fd1f21 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -98,7 +98,10 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { // keyboard shortcuts if (Input.is_key_down(Keys.KEY_LEFT_CONTROL) && Input.is_key_pressed(Keys.KEY_TAB)) { // advance tab - // active_tab = cast(int)((active_tab + 1) % tab_mds.length); + import std.traits : EnumMembers; + + auto panel1_tabs = EnumMembers!Panel1Tab; + panel1_tab = ((panel1_tab.to!int + 1) % panel1_tabs.length).to!Panel1Tab; } } From 4a515496e7d087700907e374e30c96697e1eeab2 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 23:04:50 -0800 Subject: [PATCH 20/25] improve tab contents layout --- source/ui/reng/dsdebugger.d | 75 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index 6fd1f21..e6a85c7 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -210,44 +210,49 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { mixin(GEN_NK_TABS!(Panel1Tab)("panel1_tab")); - nk_layout_row_dynamic(ctx, UI_PAD, 1); - - switch (panel1_tab) { - case Panel1Tab.Tab1: - nk_layout_row_static(ctx, 30, 80, 1); - if (nk_button_label(ctx, "button")) - TraceLog(TraceLogLevel.LOG_INFO, "button pressed"); - - nk_layout_row_dynamic(ctx, 30, 2); - if (nk_option_label(ctx, "easy", diff_opt == Difficulty.Easy)) - diff_opt = Difficulty.Easy; - if (nk_option_label(ctx, "hard", diff_opt == Difficulty.Hard)) - diff_opt = Difficulty.Hard; - break; - case Panel1Tab.Tab2: - nk_layout_row_dynamic(ctx, 25, 1); - nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1); + auto curr_win_space = nk_window_get_content_region_size(ctx); + nk_layout_row_dynamic(ctx, curr_win_space.y - 42, 1); + + if (nk_group_begin(ctx, "dashboard", nk_panel_flags.NK_WINDOW_BORDER)) { + nk_layout_row_dynamic(ctx, UI_PAD, 1); + switch (panel1_tab) { + case Panel1Tab.Tab1: + nk_layout_row_static(ctx, 30, 80, 1); + if (nk_button_label(ctx, "button")) + TraceLog(TraceLogLevel.LOG_INFO, "button pressed"); + + nk_layout_row_dynamic(ctx, 30, 2); + if (nk_option_label(ctx, "easy", diff_opt == Difficulty.Easy)) + diff_opt = Difficulty.Easy; + if (nk_option_label(ctx, "hard", diff_opt == Difficulty.Hard)) + diff_opt = Difficulty.Hard; + break; + case Panel1Tab.Tab2: + nk_layout_row_dynamic(ctx, 25, 1); + nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1); - nk_layout_row_dynamic(ctx, 20, 1); - nk_label(ctx, "background:", nk_text_alignment.NK_TEXT_LEFT); - nk_layout_row_dynamic(ctx, 25, 1); - if (nk_combo_begin_color(ctx, nk_rgb_cf(bg), nk_vec2(nk_widget_width(ctx), 400))) { - nk_layout_row_dynamic(ctx, 120, 1); - bg = nk_color_picker(ctx, bg, nk_color_format.NK_RGBA); + nk_layout_row_dynamic(ctx, 20, 1); + nk_label(ctx, "background:", nk_text_alignment.NK_TEXT_LEFT); nk_layout_row_dynamic(ctx, 25, 1); - bg.r = nk_propertyf(ctx, "#R:", 0, bg.r, 1.0f, 0.01f, 0.005f); - bg.g = nk_propertyf(ctx, "#G:", 0, bg.g, 1.0f, 0.01f, 0.005f); - bg.b = nk_propertyf(ctx, "#B:", 0, bg.b, 1.0f, 0.01f, 0.005f); - bg.a = nk_propertyf(ctx, "#A:", 0, bg.a, 1.0f, 0.01f, 0.005f); - nk_combo_end(ctx); + if (nk_combo_begin_color(ctx, nk_rgb_cf(bg), nk_vec2(nk_widget_width(ctx), 400))) { + nk_layout_row_dynamic(ctx, 120, 1); + bg = nk_color_picker(ctx, bg, nk_color_format.NK_RGBA); + nk_layout_row_dynamic(ctx, 25, 1); + bg.r = nk_propertyf(ctx, "#R:", 0, bg.r, 1.0f, 0.01f, 0.005f); + bg.g = nk_propertyf(ctx, "#G:", 0, bg.g, 1.0f, 0.01f, 0.005f); + bg.b = nk_propertyf(ctx, "#B:", 0, bg.b, 1.0f, 0.01f, 0.005f); + bg.a = nk_propertyf(ctx, "#A:", 0, bg.a, 1.0f, 0.01f, 0.005f); + nk_combo_end(ctx); + } + break; + case Panel1Tab.Tab3: + nk_layout_row_dynamic(ctx, 30, 1); + nk_label(ctx, "Tab 3", nk_text_alignment.NK_TEXT_LEFT); + break; + default: + break; } - break; - case Panel1Tab.Tab3: - nk_layout_row_dynamic(ctx, 30, 1); - nk_label(ctx, "Tab 3", nk_text_alignment.NK_TEXT_LEFT); - break; - default: - break; + nk_group_end(ctx); } } From 48f868bc3860d81c47d51935ba807e62ea84ead8 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 23:21:17 -0800 Subject: [PATCH 21/25] add a list --- source/ui/reng/dsdebugger.d | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index e6a85c7..aa26e3e 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -260,14 +260,25 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { if (nk_begin(ctx, "panel 3", RectangleToNuklear(ctx, panel3_bounds), nk_panel_flags.NK_WINDOW_BORDER | nk_panel_flags.NK_WINDOW_TITLE)) { - nk_layout_row_dynamic(ctx, 30, 1); - // have a button and some rows - if (nk_button_label(ctx, "button")) - TraceLog(TraceLogLevel.LOG_INFO, "button pressed"); - nk_layout_row_dynamic(ctx, 30, 2); - // have some labels and some rows - nk_label(ctx, "first label", nk_text_alignment.NK_TEXT_LEFT); - nk_label(ctx, "second label", nk_text_alignment.NK_TEXT_LEFT); + nk_layout_row_dynamic(ctx, UI_PAD, 1); + // // have a button and some rows + // if (nk_button_label(ctx, "button")) + // TraceLog(TraceLogLevel.LOG_INFO, "button pressed"); + // nk_layout_row_dynamic(ctx, 30, 2); + // // have some labels and some rows + // nk_label(ctx, "first label", nk_text_alignment.NK_TEXT_LEFT); + // nk_label(ctx, "second label", nk_text_alignment.NK_TEXT_LEFT); + + nk_layout_row_dynamic(ctx, 480, 1); + nk_list_view list_view; + if (nk_list_view_begin(ctx, &list_view, "test_list", 0, 12, 1024)) { + nk_layout_row_dynamic(ctx, 30, 1); + for (int i = 0; i < list_view.count; i++) { + auto id = list_view.begin + i; + nk_button_label(ctx, format("item %d", id).c_str, nk_text_alignment.NK_TEXT_LEFT); + } + nk_list_view_end(&list_view); + } } nk_end(ctx); From 9234308f466ef190df56f33c3e97f6826fa3d51d Mon Sep 17 00:00:00 2001 From: redthing1 Date: Sun, 13 Nov 2022 23:22:56 -0800 Subject: [PATCH 22/25] fixup! add a list --- source/ui/reng/dsdebugger.d | 2 +- source/ui/reng/runner.d | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index aa26e3e..2dc1487 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -275,7 +275,7 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { nk_layout_row_dynamic(ctx, 30, 1); for (int i = 0; i < list_view.count; i++) { auto id = list_view.begin + i; - nk_button_label(ctx, format("item %d", id).c_str, nk_text_alignment.NK_TEXT_LEFT); + nk_label(ctx, format("item %d", id).c_str, nk_text_alignment.NK_TEXT_LEFT); } nk_list_view_end(&list_view); } diff --git a/source/ui/reng/runner.d b/source/ui/reng/runner.d index 03ba8a4..c94fdf1 100644 --- a/source/ui/reng/runner.d +++ b/source/ui/reng/runner.d @@ -53,7 +53,7 @@ final class Runner { while (running) { if (frontend.should_cycle_nds() || frontend.should_fast_forward()) { - nds.cycle(33_513_982 / 60); + // nds.cycle(33_513_982 / 60); fps++; } From a32517dd8740e0e4a9a20ae587d6f00f417becee Mon Sep 17 00:00:00 2001 From: GhostRain Date: Mon, 14 Nov 2022 23:08:58 -0800 Subject: [PATCH 23/25] made stuff resizable --- source/ui/reng/rengcore.d | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/ui/reng/rengcore.d b/source/ui/reng/rengcore.d index 8f86e27..df5260c 100644 --- a/source/ui/reng/rengcore.d +++ b/source/ui/reng/rengcore.d @@ -1,5 +1,6 @@ module ui.reng.rengcore; +import raylib; import re; import re.math; import ui.reng; @@ -26,6 +27,7 @@ class RengCore : Core { auto_compensate_hidpi = true; } + raylib.SetConfigFlags(raylib.ConfigFlags.FLAG_WINDOW_RESIZABLE); super(width, height, "BeanDS"); } From ae59399442f3815c155279f8d547750cb72c96df Mon Sep 17 00:00:00 2001 From: redthing1 Date: Tue, 15 Nov 2022 16:35:34 -0800 Subject: [PATCH 24/25] re enable runner --- source/ui/reng/runner.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ui/reng/runner.d b/source/ui/reng/runner.d index c94fdf1..03ba8a4 100644 --- a/source/ui/reng/runner.d +++ b/source/ui/reng/runner.d @@ -53,7 +53,7 @@ final class Runner { while (running) { if (frontend.should_cycle_nds() || frontend.should_fast_forward()) { - // nds.cycle(33_513_982 / 60); + nds.cycle(33_513_982 / 60); fps++; } From 1207d6645788e7346a76d0f4ce74bdcd9be324f9 Mon Sep 17 00:00:00 2001 From: redthing1 Date: Tue, 15 Nov 2022 16:38:56 -0800 Subject: [PATCH 25/25] unload nuklear on close --- source/ui/reng/dsdebugger.d | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/ui/reng/dsdebugger.d b/source/ui/reng/dsdebugger.d index 2dc1487..3e45c73 100644 --- a/source/ui/reng/dsdebugger.d +++ b/source/ui/reng/dsdebugger.d @@ -292,4 +292,8 @@ class DSDebuggerUIRoot : Component, Renderable2D, Updatable { raylib.DrawRectangleLinesEx(panel2_bounds, 1, Colors.PURPLE); raylib.DrawRectangleLinesEx(panel3_bounds, 1, Colors.PURPLE); } + + override void destroy() { + UnloadNuklear(ctx); + } }