/* date = July 11th 2023 0:34 pm */ #ifndef VN_WORKSPACE_TEXT_EDITOR_H #define VN_WORKSPACE_TEXT_EDITOR_H //////////////////////////////// //~ sixten: Mutable String Types struct mutable_string { memory_arena *Arena; string String; }; //////////////////////////////// //~ sixten: History & Undo Types struct history_entry { range1_s64 Range; string ReplaceString; }; struct history_node { history_node *Next; history_node *Prev; history_entry Forward; history_entry Backward; }; struct history_list { history_node *At; history_node Sentinel; }; //////////////////////////////// //~ sixten: Workspace Text Editor Types struct workspace_text_data { token_array Tokens; range1_s64_array Lines; }; struct workspace_view_text_editor { // sixten: processed text memory_arena *ProcessingArena; token_array Tokens; range1_s64_array Lines; // sixten: text being edited mutable_string Text; // sixten: text editing text_edit_state EditState; text_point LastTextPoint; // sixten: history memory_arena *HistoryArena; history_list History; // sixten: ui building & rendering ui_box *ContainerBox; v2 TextDim; v2 Offset; }; //////////////////////////////// //~ sixten: Mutable String Functions static mutable_string MutableStringAllocate(u64 Size); static void MutableStringRelease(mutable_string *String); static void MutableStringReplaceRange(mutable_string *String, string ReplaceString, range1_s64 Range); //////////////////////////////// //~ sixten: History & Undo Functions static history_entry HistoryEntry(memory_arena *Arena, string ReplaceString, range1_s64 Range); static void AppendToHistory(memory_arena *Arena, history_list *List, history_entry Forward, history_entry Backward); //////////////////////////////// //~ sixten: Workspace Text Editor Functions static workspace_text_data Workspace_TextDataFromStringChunkList(memory_arena *Arena, string Text); static UI_CUSTOM_DRAW_CALLBACK(Workspace_TextEditorDrawCallback); static void Workspace_BuildTextEditor(workspace_view *View); #endif //VN_WORKSPACE_TEXT_EDITOR_H