From 6b64920f1560fe9bf78308e1bf7914d1e2a5578d Mon Sep 17 00:00:00 2001 From: Matthew Date: Tue, 7 Oct 2025 07:17:30 +1100 Subject: [PATCH] partially implemented panel switching through keyboard, layout system needs to be reworked --- src/editor/editor.d | 101 +++++++++++++++++++++++++++++++++++++++---- src/editor/widgets.d | 1 + 2 files changed, 93 insertions(+), 9 deletions(-) diff --git a/src/editor/editor.d b/src/editor/editor.d index 70b7291..2da9614 100644 --- a/src/editor/editor.d +++ b/src/editor/editor.d @@ -491,11 +491,59 @@ Shift(Modifier md) return cast(bool)(md & (MD.LeftShift | MD.RightShift)); } +bool +MovePanelFocus(A2D axis, bool prev)(UIPanel* panel) +{ + bool result = false; + + if(!Nil(panel)) + { + UIPanel* target = prev ? panel.prev : panel.next; + if(panel.parent.axis == axis && !Nil(target) && target.ed != null) + { + SetFocusedPanel(target); + result = true; + } + else for(UIPanel* p = panel.parent; !Nil(p); p = p.parent) + { + if(p.parent.axis == axis) + { + for(UIPanel* t = prev ? p.prev : p.next; !Nil(t); t = prev ? t.prev : t.next) + { + UIPanel* f = t.first; + if(!Nil(f) || f.ed == null) + { + while(f.ed == null) + { + if(Nil(f.first)) + { + break; + } + + f = f.first; + } + } + + if(!Nil(f) && f.ed != null) + { + SetFocusedPanel(f); + result = true; + break; + } + } + } + } + } + + return result; +} + void HandleInputs(EditorCtx* ctx, Inputs* inputs) { u8[] cb_text; - FlatBuffer* fb = !Nil(GetFocusedPanel()) ? &(GetFocusedPanel()).ed.buf : null; + UIPanel* panel = GetFocusedPanel(); + FlatBuffer* fb = !Nil(panel) ? &panel.ed.buf : null; for(auto node = inputs.list.first; node != null; node = node.next) { @@ -520,6 +568,34 @@ HandleInputs(EditorCtx* ctx, Inputs* inputs) { taken = HandleCmdMode(ctx, node.value); } + else if(ctx.state == ES.SetPanelFocus) + { + switch(key) with(Input) + { + case Up: + { + if(MovePanelFocus!(A2D.Y, true )(panel)) goto case Escape; + } break; + case Down: + { + if(MovePanelFocus!(A2D.Y, false)(panel)) goto case Escape; + } break; + case Left: + { + if(MovePanelFocus!(A2D.X, true )(panel)) goto case Escape; + } break; + case Right: + { + if(MovePanelFocus!(A2D.X, false)(panel)) goto case Escape; + } break; + case Escape: + { + ResetCtx(ctx); + taken = true; + } break; + default: break; + } + } else { switch(key) with(Input) @@ -567,21 +643,28 @@ HandleInputs(EditorCtx* ctx, Inputs* inputs) } break; case c: { - AddEditor(ctx, GetFocusedPanel(), A2D.Y); - taken = true; + if(Ctrl(md)) + { + // Copy + taken = true; + } } break; - case d: + case w: + { + if(Ctrl(md)) + { + ctx.state = ES.SetPanelFocus; + } + } break; + debug case d: { static bool dbg = false; dbg = !dbg; SetDebug(dbg); } break; - case g: + debug case g: { - debug - { - g_frame_step = !g_frame_step; - } + g_frame_step = !g_frame_step; } break; debug case s: { diff --git a/src/editor/widgets.d b/src/editor/widgets.d index 630f21e..96cac71 100644 --- a/src/editor/widgets.d +++ b/src/editor/widgets.d @@ -466,6 +466,7 @@ WrappedTextLine(u8[] text, u8[] parent_id, f32 text_size, u64 line_no, TS[] styl } f32 parent_width = parent.size.x - (parent.border_thickness * 2); + Logf("w %f", parent_width); u64 chars; TextPart* tp = part;