multi line select progress
This commit is contained in:
parent
7be01af7bf
commit
406a8a3a71
@ -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.
@ -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) {
|
||||
|
||||
120
src/ui.jai
120
src/ui.jai
@ -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
34
ui.rad
@ -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
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user