multi line select progress
This commit is contained in:
parent
7be01af7bf
commit
406a8a3a71
@ -6,7 +6,7 @@
|
|||||||
NAME :: "mexplore";
|
NAME :: "mexplore";
|
||||||
VERSION :: "0.1";
|
VERSION :: "0.1";
|
||||||
JAI_VERSION :: "beta 0.2.016, built on 19 July 2025";
|
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_BRANCH :: "main";
|
||||||
GIT_REVISION :: "0f5d7d612591fbcf39e818c9076d28dc422ca635";
|
GIT_REVISION :: "7be01af7bf0025806f36ad7c938655e432d8b81e";
|
||||||
DEBUG :: true;
|
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;
|
width : float;
|
||||||
|
|
||||||
CodepointIndex : u64;
|
CodepointIndex : u64;
|
||||||
while CodepointIndex < xx i {
|
while CodepointIndex <= xx i {
|
||||||
kbts_BreakAddCodepoint(*BreakState, Codepoints[CodepointIndex], 1, xx ((CodepointIndex + 1) == xx CodepointCount));
|
kbts_BreakAddCodepoint(*BreakState, Codepoints[CodepointIndex], 1, xx ((CodepointIndex + 1) == xx CodepointCount));
|
||||||
Break : kbts_break;
|
Break : kbts_break;
|
||||||
while kbts_Break(*BreakState, *Break) {
|
while kbts_Break(*BreakState, *Break) {
|
||||||
|
|||||||
94
src/ui.jai
94
src/ui.jai
@ -991,23 +991,22 @@ ui_draw_text_input :: (using text_input: *TextInput) {
|
|||||||
pos : Vector2;
|
pos : Vector2;
|
||||||
size : 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 {
|
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);
|
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;
|
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 {
|
while i < text_input.text.count {
|
||||||
row : StbTexteditRow;
|
row : StbTexteditRow;
|
||||||
STB_TEXTEDIT_LAYOUTROW(*row, text_input, i);
|
STB_TEXTEDIT_LAYOUTROW(*row, text_input, i);
|
||||||
|
|
||||||
|
select_rectangle : Rectangle;
|
||||||
|
|
||||||
if i + xx row.num_chars >= textedit_state.cursor {
|
if i + xx row.num_chars >= textedit_state.cursor {
|
||||||
j : s32;
|
j : s32;
|
||||||
while grapheme := i + j < textedit_state.cursor {
|
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;
|
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 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;
|
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);
|
size, max_descent, read, segment_type := next_segment_size(font, text, i + j, 0.0, .GRAPHEME | .LINE_HARD);
|
||||||
|
|
||||||
if segment_type & .GRAPHEME {
|
if segment_type & .GRAPHEME {
|
||||||
@ -1034,51 +1047,64 @@ ui_draw_text_input :: (using text_input: *TextInput) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while grapheme := i + j < textedit_state.select_end {
|
select_size.x = row.x1 - select_pos.x;
|
||||||
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};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
size, max_descent, read, segment_type := next_segment_size(font, text, i + j, 0.0, .GRAPHEME | .LINE_HARD);
|
||||||
|
|
||||||
if segment_type & .GRAPHEME {
|
if segment_type & .GRAPHEME {
|
||||||
select_size.x += size.x;
|
select_size.x += size.x;
|
||||||
j += read;
|
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},
|
render_filled_rectangle(select_pos + v2(margin) + v2(border_size) + v2(padding), select_size, .{0.8, 0.2, 0.55, 0.4});
|
||||||
.{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;
|
draw_pos.y -= font.face.size.metrics.height >> 6;
|
||||||
|
select_pos.y -= font.face.size.metrics.height >> 6;
|
||||||
|
|
||||||
i += xx row.num_chars;
|
i += xx row.num_chars;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if textedit_state.select_end != textedit_state.select_start {
|
// if textedit_state.select_end != textedit_state.select_start {
|
||||||
if textedit_state.select_end > textedit_state.select_start {
|
// if textedit_state.select_end > textedit_state.select_start {
|
||||||
for select_rectangles {
|
// 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});
|
// 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 {
|
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});
|
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
|
// raddbg 0.9.21 project file
|
||||||
|
|
||||||
recent_file: path: "src/stb_textedit.jai"
|
recent_file: path: "src/stb_textedit.jai"
|
||||||
|
recent_file: path: "src/ui.jai"
|
||||||
recent_file: path: "../../../../jai/modules/runtime_support.jai"
|
recent_file: path: "../../../../jai/modules/runtime_support.jai"
|
||||||
recent_file: path: "src/main.jai"
|
recent_file: path: "src/main.jai"
|
||||||
recent_file: path: "src/ui.jai"
|
|
||||||
recent_file: path: "src/text.jai"
|
recent_file: path: "src/text.jai"
|
||||||
recent_file: path: "../../../../jai/modules/basic/array.jai"
|
recent_file: path: "../../../../jai/modules/basic/array.jai"
|
||||||
recent_file: path: "../../../../jai/modules/default_allocator/module.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: "modules/SDL3/src/SDL-release-3.2.16/src/video/windows/SDL_windowsevents.c"
|
||||||
recent_file: path: "src/math/math.jai"
|
recent_file: path: "src/math/math.jai"
|
||||||
recent_file: path: "../../../../jai/modules/basic/module.jai"
|
recent_file: path: "../../../../jai/modules/basic/module.jai"
|
||||||
breakpoint:
|
|
||||||
{
|
|
||||||
source_location: "src/ui.jai:1024:1"
|
|
||||||
hit_count: 0
|
|
||||||
enabled: 0
|
|
||||||
}
|
|
||||||
target:
|
target:
|
||||||
{
|
{
|
||||||
executable: "bin/mexplore-debug.exe"
|
executable: "bin/mexplore-debug.exe"
|
||||||
working_directory: "bin/"
|
working_directory: bin
|
||||||
enabled: 1
|
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