diff --git a/.build/.added_strings_w3.jai b/.build/.added_strings_w3.jai index 9ca03fa..f08fdbd 100644 --- a/.build/.added_strings_w3.jai +++ b/.build/.added_strings_w3.jai @@ -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; diff --git a/.build/mexplore-debug.lib b/.build/mexplore-debug.lib index 8069cf8..cbb51d7 100644 Binary files a/.build/mexplore-debug.lib and b/.build/mexplore-debug.lib differ diff --git a/.build/mexplore-debug_0_w3.obj b/.build/mexplore-debug_0_w3.obj index 8565602..be79542 100644 Binary files a/.build/mexplore-debug_0_w3.obj and b/.build/mexplore-debug_0_w3.obj differ diff --git a/.build/mexplore-debug_1_w3.obj b/.build/mexplore-debug_1_w3.obj index ad3bcab..351c312 100644 Binary files a/.build/mexplore-debug_1_w3.obj and b/.build/mexplore-debug_1_w3.obj differ diff --git a/.build/mexplore-debug_2_w3.obj b/.build/mexplore-debug_2_w3.obj index 24bbc48..66142a2 100644 Binary files a/.build/mexplore-debug_2_w3.obj and b/.build/mexplore-debug_2_w3.obj differ diff --git a/.build/mexplore-debug_3_w3.obj b/.build/mexplore-debug_3_w3.obj index 9b028d3..067923d 100644 Binary files a/.build/mexplore-debug_3_w3.obj and b/.build/mexplore-debug_3_w3.obj differ diff --git a/bin/mexplore-debug.exe b/bin/mexplore-debug.exe index 346771d..3e6bbda 100644 Binary files a/bin/mexplore-debug.exe and b/bin/mexplore-debug.exe differ diff --git a/bin/mexplore-debug.pdb b/bin/mexplore-debug.pdb index 209ed56..3579fab 100644 Binary files a/bin/mexplore-debug.pdb and b/bin/mexplore-debug.pdb differ diff --git a/bin/mexplore-debug.rdi b/bin/mexplore-debug.rdi index 8d9590e..3440b2e 100644 Binary files a/bin/mexplore-debug.rdi and b/bin/mexplore-debug.rdi differ diff --git a/src/stb_textedit.jai b/src/stb_textedit.jai index c8e21b1..d3ac63c 100644 --- a/src/stb_textedit.jai +++ b/src/stb_textedit.jai @@ -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) { diff --git a/src/ui.jai b/src/ui.jai index 75c486a..c340b8a 100644 --- a/src/ui.jai +++ b/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}); diff --git a/ui.rad b/ui.rad index b7ace89..0b6adfc 100644 --- a/ui.rad +++ b/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 +}