wip fixing line wrapping and cursor position

This commit is contained in:
Matthew 2025-10-06 07:56:01 +11:00
parent 342e342a50
commit 1855da659a
4 changed files with 47 additions and 12 deletions

@ -1 +1 @@
Subproject commit 92c4f8eb665e9fc7a58dc9631bb6f26a0828a638 Subproject commit 4f3082f71d5a877dc34163dac5f1b12a02d5a02c

View File

@ -23,6 +23,7 @@ void main(string[] argv)
EditorCtx ctx = InitEditorCtx(&window); EditorCtx ctx = InitEditorCtx(&window);
u64 no_ev_count;
while (true) while (true)
{ {
Inputs* inputs = GetEvents(&window); Inputs* inputs = GetEvents(&window);
@ -31,6 +32,18 @@ void main(string[] argv)
break; break;
} }
if(inputs.list.first == null)
{
no_ev_count += 1;
Pause();
if(no_ev_count >= 5)
{
no_ev_count = 0;
Yield();
}
}
Cycle(&ctx, inputs); Cycle(&ctx, inputs);
} }
} }

View File

@ -770,7 +770,8 @@ PrintNodes(UIItem* item)
void void
FixViolations(UIItem* item) FixViolations(UIItem* item)
{ {
A2D axis = A2D.Y; // TODO: Fix this
Axis2D axis = A2D.Y;
for(UIItem* i = item; !Nil(i); i = Recurse(i)) for(UIItem* i = item; !Nil(i); i = Recurse(i))
{ {
if(!Nil(i.parent)) if(!Nil(i.parent))
@ -779,12 +780,15 @@ FixViolations(UIItem* item)
if(i.rect.vec0.v[axis] < bounds_start) if(i.rect.vec0.v[axis] < bounds_start)
{ {
i.culling.vec0.v[axis] = bounds_start - i.rect.vec0.v[axis]; i.culling.vec0.v[axis] = bounds_start - i.rect.vec0.v[axis];
i.rect.vec0.v[axis] -= i.culling.vec0.v[axis];
//Logf("cull start %f", i.culling.vec0.v[axis]);
} }
f32 bounds_end = i.parent.rect.vec1.v[axis] - i.parent.culling.vec1.v[axis]; f32 bounds_end = i.parent.rect.vec1.v[axis] - i.parent.culling.vec1.v[axis];
if(i.rect.vec1.v[axis] > bounds_end) if(i.rect.vec1.v[axis] > bounds_end)
{ {
i.culling.vec1.v[axis] = i.rect.vec1.v[axis] - bounds_end; i.culling.vec1.v[axis] = i.rect.vec1.v[axis] - bounds_end;
i.rect.vec1.v[axis] -= i.culling.vec1.v[axis];
} }
} }
} }
@ -815,7 +819,7 @@ CalcPercentageSizes(UIItem* item)
{ {
if(i.size_info[axis].type == ST.Percentage) if(i.size_info[axis].type == ST.Percentage)
{ {
i.size.v[axis] = (i.parent.size.v[axis]*i.size_info[axis].value) + fabsf(i.adjustment.v[axis]); i.size.v[axis] = (i.parent.size.v[axis]*i.size_info[axis].value) + i.adjustment.v[axis];
assert(!isNaN(i.size.v[axis])); assert(!isNaN(i.size.v[axis]));
} }
} }
@ -1242,7 +1246,7 @@ MakeMultiline(u8[] text, f32 width, u8[] parent_id, u64 line_no, TS[] style = []
{ {
f32 scaled_width = width * (g_ui_ctx.atlas_buf.atlas.size/g_ui_ctx.text_size); f32 scaled_width = width * (g_ui_ctx.atlas_buf.atlas.size/g_ui_ctx.text_size);
f32 text_width = CalcTextWidth(text); f32 text_width = CalcTextWidth(text);
u64 line_count = cast(u64)(ceil(text_width/scaled_width)); u64 line_count = cast(u64)(ceil(text_width/scaled_width));
Node!(TextBuffer)* node = null; Node!(TextBuffer)* node = null;
if(line_count > 0) if(line_count > 0)

View File

@ -374,7 +374,7 @@ EditorView(UIPanel* panel)
GetLines(&ed.buf, &ed.linebufs, rows); GetLines(&ed.buf, &ed.linebufs, rows);
} }
LineCounter(panel.id, &panel.ed.buf, offset, line_offset, line_offset+line_rows, focused); UIItem* lc = LineCounter(panel.id, &panel.ed.buf, offset, line_offset, line_offset+line_rows, focused);
Container(ScratchName(panel.id, "lines"), UISize(ST.Percentage, 1.0), UISize(ST.Percentage, 1.0), A2D.Y); Container(ScratchName(panel.id, "lines"), UISize(ST.Percentage, 1.0), UISize(ST.Percentage, 1.0), A2D.Y);
{ {
@ -399,23 +399,18 @@ EditorView(UIPanel* panel)
if(buf.text.length > 0) if(buf.text.length > 0)
{ {
i64 line_no = i+line_offset; i64 line_no = i+line_offset;
if(pos.y == line_no && focused)
{
Push!("highlighted_char")(pos.x);
}
if(sm == SM.Line && line_no >= sel.x && line_no <= sel.y) if(sm == SM.Line && line_no >= sel.x && line_no <= sel.y)
{ {
} }
TextPart* tp = WrappedTextLine(buf.text, panel.id, text_size, line_no, buf.style); TextPart* tp = WrappedTextLine(buf.text, panel.id, text_size, line_no, buf.style, &pos);
height += (text_size * tp.count); height += (text_size * tp.count);
if(TextClicked(tp)) if(TextClicked(tp))
{ {
SetFocusedPanel(panel); SetFocusedPanel(panel);
} }
} }
Push!("highlighted_char")(-1);
if(buf == ed.linebufs.first) if(buf == ed.linebufs.first)
{ {
@ -455,7 +450,7 @@ TextClicked(TextPart* text_part)
} }
TextPart* TextPart*
WrappedTextLine(u8[] text, u8[] parent_id, f32 text_size, u64 line_no, TS[] style = []) WrappedTextLine(u8[] text, u8[] parent_id, f32 text_size, u64 line_no, TS[] style = [], U64Vec2* hl_pos)
{ {
Push!("color")(Vec4(1.0)); Push!("color")(Vec4(1.0));
Push!("text_size")(text_size); Push!("text_size")(text_size);
@ -464,6 +459,13 @@ WrappedTextLine(u8[] text, u8[] parent_id, f32 text_size, u64 line_no, TS[] styl
TextPart* part = ScratchAlloc!(TextPart)(); TextPart* part = ScratchAlloc!(TextPart)();
part.item = g_UI_NIL; part.item = g_UI_NIL;
i64 hl = -1;
if(hl_pos.y == line_no)
{
hl = hl_pos.x;
}
u64 chars;
TextPart* tp = part; TextPart* tp = part;
Node!(TextBuffer)* lines = MakeMultiline(text, parent.size.x, parent_id, line_no, style); Node!(TextBuffer)* lines = MakeMultiline(text, parent.size.x, parent_id, line_no, style);
for(Node!(TextBuffer)* line = lines; line != null; line = line.next, tp = tp.next) for(Node!(TextBuffer)* line = lines; line != null; line = line.next, tp = tp.next)
@ -476,6 +478,20 @@ WrappedTextLine(u8[] text, u8[] parent_id, f32 text_size, u64 line_no, TS[] styl
tp.item.token_styles = line.value.style; tp.item.token_styles = line.value.style;
if(hl >= 0 && hl < tp.item.key.text.length+chars)
{
//Logf("hl %s %s %s", hl, tp.item.key.text.length, chars);
if(hl < tp.item.key.text.length+chars)
{
Push!("highlighted_char")(hl-chars);
hl = -1;
}
else
{
chars += tp.item.key.text.length;
}
}
Signal(tp.item); Signal(tp.item);
if(tp.item.signal & UIS.Clicked) if(tp.item.signal & UIS.Clicked)
@ -484,6 +500,8 @@ WrappedTextLine(u8[] text, u8[] parent_id, f32 text_size, u64 line_no, TS[] styl
} }
BuildItem(tp.item, UISize(ST.Percentage, 1.0), UISize(ST.Pixels, text_size), UIF.DrawText|UIF.Clickable|UIF.Draggable); BuildItem(tp.item, UISize(ST.Percentage, 1.0), UISize(ST.Pixels, text_size), UIF.DrawText|UIF.Clickable|UIF.Draggable);
Push!("highlighted_char")(-1);
} }
Pop!("color"); Pop!("color");