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,10 +1019,24 @@ 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 {
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;
}
if textedit_state.select_start >= i && textedit_state.select_end > i + row.num_chars {
j : s32;
while grapheme := i + j < textedit_state.select_start {
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 {
@ -1034,51 +1047,64 @@ ui_draw_text_input :: (using text_input: *TextInput) {
}
}
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};
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;
}
}
}
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;
if i + j >= textedit_state.select_end {
array_add(*select_rectangles, .{select_pos, select_size});
}
} 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;
}
}
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);
render_filled_rectangle(select_pos + v2(margin) + v2(border_size) + v2(padding), select_size, .{0.8, 0.2, 0.55, 0.4});
}
}
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
}