From 1dbe631edf22fa2cafb1eda330075fac2c6dfeaf Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 13 Oct 2025 06:55:43 +1100 Subject: [PATCH] fix scroll, fix click/drag boundaries, fix line counter box being too large --- assets/gui.frag.spv | Bin 2696 -> 5992 bytes assets/gui.vert.spv | Bin 4052 -> 8860 bytes build.sh | 2 +- src/editor/buffer.d | 4 ++++ src/editor/ui.d | 40 ++++++++++++++++++++++++++++++++-------- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/assets/gui.frag.spv b/assets/gui.frag.spv index fc0c95d9b8db20922ac7e4ad919032cc824d8da0..670e1a26507b0a542eb0916d5e3be8aee151cdad 100644 GIT binary patch literal 5992 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 diff --git a/assets/gui.vert.spv b/assets/gui.vert.spv index 72d0979c0cbf656c73910a4327b2a28f2bc7927d..9928c20dcd9d656525055f39c8f1d700b9bc3430 100644 GIT binary patch literal 8860 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 literal 4052 zcmZ9NS!`8R6oyY*+9CxiP?X8qL5K`iT8pAstxAB023wp$2oEMC#s^2x#3`vUNEJb= ziK219Mr&|DB9RCpAWD%KqhbvRnh@)NjWJPQd_n!b+r7w1ckp!5_iz zZ8zU~yF{fL%mj_#63_uwfR$i9*Z`gc-Jl2T0((IpI1Kv1F)#oI!QyO0p>8d{BX}LY zdzQPV@jN%~Fz$ZLaj$asCa*}`eacG{chAOVCGP%>mnZI73nA@x1b4 zVBE9I?WWv5Ov$Wtt3;okt*SNi~r`ph*qh=pM(^vCZO`xhd zwPdL4pM_`NYrxrLxmUTdiEw*T101sxw~yAF#;-kej+$}j+M6uv+&hQ88nc&bB62G6 z$+2VF*8lK-h)B%V4nvQiJ_S9N4u=Y(| zem=G+Y3@PpH>eiR#Ba-C{%ou@$SSukNbW$@hYC_Cj4r?#?4sQaP8r+w|Tg)SJC{gHUrm@_W(8Hy~($xd~4#? zj(u#y_x%jMJ>>-70rx!#z7yYlxSr3|yRHaWe>c{(jYs|-eAkP7??UqQ}6N@H?o+JBf8IHDkhce#5$78-(CMg z)WpSf!{_H29M<{=#U5GDcinqFo`L+X9Ph$^Eb%LtZLarQ3v<0crULIDxp&REze3_ht^531$Ind(I1hdgNS)Z;m~ToVobw!JF_K z!6VeQ#znv!^>$8e&*uSa8}r`rE{`?l<9qky_i-s)J#sEfIr)7oKvR!3F2{GCdaQ9R z>)ZEMU|cwSM_o#kG9 z=c&iM`|wwQ{Ji_&>M`#DeCMghya(}}m*3MvaP^qiiLd5*p{-4twS2y#u#W=w<~p6g z9KRR8C1du_ckKz_e?#z%`2IHpe+u9KhTu=*cLUd1hkXWE!+GW!cOAb`W1rBcD(rJ$ z8SsDPEwoM8=YhKC-NM&UhJ693`_4CmgK7SY_`~PFgr=UK|1wmty@GFTtsCciJ?ZB3;=ciUKppU0a&wHgV7CB!8Z~?;-%R=)=^cF=?w!)b9OLf*bJVS~ z75gr59sA=ta`Pho9=`Eyz_@%li1_>X#xG@gVMlFY(nqtF`U*SHRkbfVJi3xtEdHZ$UpWb~th89>@P490PU0 z{3F;OfO-cx_VNVq**HS`5ns*wGS2)H{s4$O`DgqSz+7XMpqrZ0vA+P 0 && screen_pos < start) { offset += screen_pos; + Logf("scroll up %s", offset); } else if(screen_pos > end) { offset += screen_pos - end; + Logf("scroll down %s", offset); } } diff --git a/src/editor/ui.d b/src/editor/ui.d index 41b366c..fece7a3 100644 --- a/src/editor/ui.d +++ b/src/editor/ui.d @@ -363,6 +363,21 @@ DrawChar(FontAtlas* atlas, u8 ch, f32* x_pos, f32 y, Vec4 col = Vec4(1.0)) } } +bool +PrintInputs() +{ + bool result; + UICtx* ctx = GetCtx(); + + for(auto n = ctx.inputs.list.first; n != null; n = n.next) + { + Logf("key %s %s %s", n.value.key, n.value.x, n.value.y); + result = true; + } + + return result; +} + void Panel(UIPanel* panel) { @@ -381,14 +396,20 @@ Panel(UIPanel* panel) parent.axis == A2D.Y ? 10 : 0 ); - Vec2 p0 = panel.rect.vec0-adj; - Vec2 p1 = panel.rect.vec1+adj; + Vec2 p0 = panel.rect.vec0+adj; + Vec2 p1 = panel.rect.vec1-adj; if(!Nil(prev)) with(panel) { - if(Dragged(item, p0, p1) && item.dragged.v[pax] != 0.0) + Vec2 d0 = rect.vec0-adj; + Vec2 d1 = Vec2( + pax == A2D.X ? rect.vec0.x+adj.x : rect.vec1.x, + pax == A2D.Y ? rect.vec0.y+adj.y : rect.vec1.y + ); + + if(Dragged(item, d0, d1) && item.dragged.v[pax] != 0.0) { - f32 mov_pct = Remap(item.dragged.v[pax], 0.0, size.v[pax], 0.0, 1.0); + f32 mov_pct = Remap(item.dragged.v[pax], 0.0, panel.parent.size.v[pax], 0.0, 1.0); if(CheckPanelBounds(pct + mov_pct) && CheckPanelBounds(panel.prev.pct - mov_pct)) { pct += mov_pct; @@ -404,8 +425,6 @@ Panel(UIPanel* panel) SetFocusedPanel(panel); } - DrawBorderedRect(panel.rect.vec0, panel.size, 2.0, 2.0, 0.1, DEFAULT_COL, focused ? HL_BORDER_COL : DEFAULT_BORDER_COL); - i64 rows = cast(i64)ceil(panel.size.y/TEXT_SIZE); GetLines(&ed.buf, &ed.linebufs, rows); @@ -418,7 +437,11 @@ Panel(UIPanel* panel) f32 lcw = CalcTextWidth(end_line_text); f32 padding = 4.0; - DrawRect(panel.rect.vec0, panel.rect.vec1+Vec2(lcw+padding*2, panel.size.y), 0.0, 0.0, focused ? LC_HL_COLOR : LC_COLOR); + f32 border = 2.0, radius = 2.0, softness = 0.1; + + DrawRect(panel.rect.vec0, panel.size, radius, border, DEFAULT_COL); + DrawRect(panel.rect.vec0, Vec2(lcw+padding*2, panel.size.y), 0.0, 0.0, focused ? LC_HL_COLOR : LC_COLOR); + DrawBorder(panel.rect.vec0, panel.size, border, radius, softness, focused ? HL_BORDER_COL : DEFAULT_BORDER_COL); f32 x = panel.rect.x0; f32 y = panel.rect.y0 + TEXT_SIZE; @@ -441,7 +464,7 @@ Panel(UIPanel* panel) { auto l = &n.value; - if(pos.y == i) + if(pos.y == ed.buf.offset+i) { DrawCursor(atlas, l.text, pos.x, x+lcw+padding*2.0, y, ch_offset, edit); } @@ -598,6 +621,7 @@ SetFocusedPanel(UIPanel* panel) { if(!CheckNil(g_UI_NIL_PANEL, panel)) { + Logf("set focus"); g_ui_ctx.focused_panel = panel; } }