From f1c772258e31da4a6cd94ce9995d9e128aeaba1d Mon Sep 17 00:00:00 2001 From: Grant Horner Date: Wed, 22 Apr 2026 15:32:35 -0400 Subject: [PATCH] can save files --- edit.jai | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/edit.jai b/edit.jai index d6914d9..5b0ec96 100644 --- a/edit.jai +++ b/edit.jai @@ -15,6 +15,8 @@ first_line := 0; cursor_x := 0; cursor_y := 0; +file_name: string; + White :: Vector4.{1, 1, 1, 1}; Special_Character_Lookup : [10]u8 : .[ @@ -34,8 +36,8 @@ main :: () { args := get_command_line_arguments(); assert(args.count == 2, "The file name must be passed as a CLI argument"); - - window_name := ifx args.count == 1 then "edit" else args[1]; + file_name = args[1]; + window_name := file_name; window := create_window(window_width, window_height, window_name); my_init_fonts(); @@ -45,7 +47,7 @@ main :: () { should_quit := false; prev := get_time(); - assert(read_file_lines(args[1]), "Must be able to read file!"); + assert(read_file_lines(file_name), "Must be able to read file!"); while !should_quit { reset_temporary_storage(); @@ -81,7 +83,15 @@ main :: () { if !event.shift_pressed { key += #char "a" - #char "A"; } - insert_character_at_cursor(cast(u8) key); + + if event.ctrl_pressed { + if event.key_code == { + case #char "S"; #through; + case #char "s"; handle_save(); + } + } else { + insert_character_at_cursor(cast(u8) key); + } } else if 33 <= event.key_code && event.key_code <= 126 { // NOTE: this doesn't quite work for some keys, like ` or [] key := event.key_code; @@ -149,6 +159,23 @@ insert_character_at_cursor :: (char: u8) { cursor_x += 1; } +handle_save :: () { + out_builder: String_Builder; + init_string_builder(*out_builder); + + for line: lines { + line_str := string.{count=line.count, data=line.data}; + append(*out_builder, line_str); + if it_index != lines.count - 1 { + append(*out_builder, "\n"); + } + } + + content := builder_to_string(*out_builder); + out_file_name := tprint("%.new", file_name); + write_entire_file(out_file_name, content); +} + handle_window_resizes :: (window: Window_Type) { for Input.get_window_resizes() { Simp.update_window(it.window);