multi line select progress

This commit is contained in:
Vicente Ferrari Smith 2025-09-15 21:58:15 +02:00
parent 7be01af7bf
commit 406a8a3a71
12 changed files with 102 additions and 58 deletions

View File

@ -6,7 +6,7 @@
NAME :: "mexplore";
VERSION :: "0.1";
JAI_VERSION :: "beta 0.2.016, built on 19 July 2025";
RELEASE_DATE :: "30 August 2025, 17:16:50";
RELEASE_DATE :: "15 September 2025, 21:57:10";
GIT_BRANCH :: "main";
GIT_REVISION :: "0f5d7d612591fbcf39e818c9076d28dc422ca635";
GIT_REVISION :: "7be01af7bf0025806f36ad7c938655e432d8b81e";
DEBUG :: true;

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -385,7 +385,7 @@ STB_TEXTEDIT_GETWIDTH :: (obj: *STB_TEXTEDIT_STRING, n: s32, i: s32) -> float {
width : float;
CodepointIndex : u64;
while CodepointIndex < xx i {
while CodepointIndex <= xx i {
kbts_BreakAddCodepoint(*BreakState, Codepoints[CodepointIndex], 1, xx ((CodepointIndex + 1) == xx CodepointCount));
Break : kbts_break;
while kbts_Break(*BreakState, *Break) {

View File

@ -991,23 +991,22 @@ ui_draw_text_input :: (using text_input: *TextInput) {
pos : Vector2;
size : Vector2;
}
select_rectangles : [..]Rectangle;
defer array_free(select_rectangles);
select_pos : Vector2 = pos + .{0.0, size.y - font.face.size.metrics.height >> 6 - 2 * (margin + border_size + padding)};
select_size : Vector2 = .{0.0, xx font.face.size.metrics.height >> 6};
if text_input.text.count > 0 {
//midline : Vector2 = pos + Vector2.{cast(float, margin + border_size + padding), xx (size.y / 2.0)};
draw_pos : Vector2 = pos + .{0.0, size.y - font.face.size.metrics.height >> 6 - (margin + border_size + padding)} + v2(margin) + v2(border_size) + v2(padding);
i : s32;
select_pos : Vector2 = pos + .{0.0, size.y - font.face.size.metrics.height >> 6 - 2 * (margin + border_size + padding)};
while i < text_input.text.count {
row : StbTexteditRow;
STB_TEXTEDIT_LAYOUTROW(*row, text_input, i);
select_rectangle : Rectangle;
if i + xx row.num_chars >= textedit_state.cursor {
j : s32;
while grapheme := i + j < textedit_state.cursor {
@ -1020,65 +1019,92 @@ ui_draw_text_input :: (using text_input: *TextInput) {
cursor_pos.y -= font.face.size.metrics.height >> 6;
}
render_text(font, .{row.num_chars, text_input.text.data + i},
.{draw_pos.x, draw_pos.y + row.ymin}, text_input.size,
colour = font_colour);
if textedit_state.select_start < textedit_state.select_end {
if i + xx row.num_chars >= textedit_state.select_start {
j : s32;
while grapheme := i + j < textedit_state.select_start {
size, max_descent, read, segment_type := next_segment_size(font, text, i + j, 0.0, .GRAPHEME | .LINE_HARD);
if segment_type & .GRAPHEME {
select_pos.x += size.x;
j += read;
} else {
select_pos.y -= font.face.size.metrics.height >> 6;
}
if !(textedit_state.select_end < i || textedit_state.select_start > i + row.num_chars) {
select_size : Vector2 = .{0.0, xx font.face.size.metrics.height >> 6};
if textedit_state.select_start < i && textedit_state.select_end > i + row.num_chars {
select_pos.x = 0.0;
select_size.x = row.x1 - row.x0;
}
while grapheme := i + j < textedit_state.select_end {
if i + j < row.num_chars {
array_add(*select_rectangles, .{select_pos, select_size});
select_pos.y -= font.face.size.metrics.height >> 6;
select_pos.x = pos.x;
select_size = .{0.0, 0.0};
}
size, max_descent, read, segment_type := next_segment_size(font, text, i + j, 0.0, .GRAPHEME | .LINE_HARD);
if textedit_state.select_start >= i && textedit_state.select_end > i + row.num_chars {
j : s32;
while grapheme := i + j < textedit_state.select_start && i + j < i + row.num_chars {
size, max_descent, read, segment_type := next_segment_size(font, text, i + j, 0.0, .GRAPHEME | .LINE_HARD);
if segment_type & .GRAPHEME {
select_size.x += size.x;
j += read;
if i + j >= textedit_state.select_end {
array_add(*select_rectangles, .{select_pos, select_size});
if segment_type & .GRAPHEME {
select_pos.x += size.x;
j += read;
} else {
select_pos.y -= font.face.size.metrics.height >> 6;
}
}
select_size.x = row.x1 - select_pos.x;
}
if textedit_state.select_start < i && textedit_state.select_end <= i + row.num_chars {
select_pos.x = 0.0;
j : s32;
while grapheme := i + j < textedit_state.select_end && i + j < i + row.num_chars {
size, max_descent, read, segment_type := next_segment_size(font, text, i + j, 0.0, .GRAPHEME | .LINE_HARD);
if segment_type & .GRAPHEME {
select_size.x += size.x;
j += read;
}
} else {
array_add(*select_rectangles, .{select_pos, select_size});
select_pos.y -= font.face.size.metrics.height >> 6;
select_pos.x = pos.x;
select_size = .{0.0, 0.0};
}
}
} else {
select_pos.y -= font.face.size.metrics.height >> 6;
if textedit_state.select_start >= i && textedit_state.select_end <= i + row.num_chars {
j : s32;
while grapheme := i + j < textedit_state.select_start && i + j < i + row.num_chars {
size, max_descent, read, segment_type := next_segment_size(font, text, i + j, 0.0, .GRAPHEME | .LINE_HARD);
if segment_type & .GRAPHEME {
select_pos.x += size.x;
j += read;
}
}
while grapheme := i + j < textedit_state.select_end && i + j < i + row.num_chars {
size, max_descent, read, segment_type := next_segment_size(font, text, i + j, 0.0, .GRAPHEME | .LINE_HARD);
if segment_type & .GRAPHEME {
select_size.x += size.x;
j += read;
}
}
}
render_filled_rectangle(select_pos + v2(margin) + v2(border_size) + v2(padding), select_size, .{0.8, 0.2, 0.55, 0.4});
}
}
render_text(font, .{row.num_chars, text_input.text.data + i},
.{draw_pos.x, draw_pos.y + row.ymin /*+ line.max_descent*/}, text_input.size,
colour = font_colour);
draw_pos.y -= font.face.size.metrics.height >> 6;
select_pos.y -= font.face.size.metrics.height >> 6;
i += xx row.num_chars;
}
}
if textedit_state.select_end != textedit_state.select_start {
if textedit_state.select_end > textedit_state.select_start {
for select_rectangles {
render_filled_rectangle(it.pos + v2(margin) + v2(border_size) + v2(padding), it.size, .{0.8, 0.2, 0.55, 0.4});
}
}
}
// if textedit_state.select_end != textedit_state.select_start {
// if textedit_state.select_end > textedit_state.select_start {
// for select_rectangles {
// render_filled_rectangle(it.pos + v2(margin) + v2(border_size) + v2(padding), it.size, .{0.8, 0.2, 0.55, 0.4});
// }
// }
// }
if cursor_time < 0.5 {
render_filled_rectangle(cursor_pos + v2(margin) + v2(border_size) + v2(padding), .{5.0, xx font.face.size.metrics.height >> 6});

34
ui.rad
View File

@ -1,9 +1,9 @@
// raddbg 0.9.21 project file
recent_file: path: "src/stb_textedit.jai"
recent_file: path: "src/ui.jai"
recent_file: path: "../../../../jai/modules/runtime_support.jai"
recent_file: path: "src/main.jai"
recent_file: path: "src/ui.jai"
recent_file: path: "src/text.jai"
recent_file: path: "../../../../jai/modules/basic/array.jai"
recent_file: path: "../../../../jai/modules/default_allocator/module.jai"
@ -13,15 +13,33 @@ recent_file: path: "modules/SDL3/src/SDL-release-3.2.16/src/events/sdl_keyboard.
recent_file: path: "modules/SDL3/src/SDL-release-3.2.16/src/video/windows/SDL_windowsevents.c"
recent_file: path: "src/math/math.jai"
recent_file: path: "../../../../jai/modules/basic/module.jai"
breakpoint:
{
source_location: "src/ui.jai:1024:1"
hit_count: 0
enabled: 0
}
target:
{
executable: "bin/mexplore-debug.exe"
working_directory: "bin/"
working_directory: bin
enabled: 1
}
breakpoint:
{
source_location: "src/ui.jai:1032:1"
hit_count: 0
enabled: 0
}
breakpoint:
{
source_location: "src/stb_textedit.jai:995:1"
hit_count: 0
enabled: 0
}
breakpoint:
{
source_location: "src/stb_textedit.jai:1016:1"
hit_count: 0
enabled: 0
}
breakpoint:
{
source_location: "src/stb_textedit.jai:1030:1"
enabled: 0
hit_count: 0
}