/* date = May 5th 2023 10:12 am */ #ifndef VN_WORKSPACE_H #define VN_WORKSPACE_H //////////////////////////////// //~ sixten: Workspace Types // sixten(TODO): Remove this type entirely. enum workspace_toolbar_menu { W_ToolbarMenu_None = 0, W_ToolbarMenu_Panel, W_ToolbarMenu_View, W_ToolbarMenu_Window, }; struct workspace_panel_view { struct workspace_panel *Parent; workspace_panel_view *Next; workspace_panel_view *Prev; struct workspace_view *View; }; struct workspace_panel_view_list { workspace_panel_view *First; workspace_panel_view *Last; s64 Count; }; struct workspace_panel { workspace_panel *First; workspace_panel *Last; workspace_panel *Next; workspace_panel *Prev; workspace_panel *Parent; workspace_view *FirstView; workspace_view *LastView; workspace_view *CurrentView; axis2 SplitAxis; r32 PercentOfParent; }; #define WORKSPACE_COMMAND(name, ...) void name(u64 Argument) typedef WORKSPACE_COMMAND(workspace_command_sig); struct workspace_command { workspace_command_sig *Command; u64 Argument; workspace_command *Next; workspace_command *Prev; }; struct workspace_keybind { platform_key Key; platform_modifiers Modifiers; workspace_command_sig *Command; u64 Argument; }; enum workspace_drag_payload_state { W_DragPayload_Inactive = 0, W_DragPayload_Active, W_DragPayload_Released, }; struct workspace_drag_payload { ui_key Key; workspace_view *View; }; struct workspace { vn_input *Input; platform_event_list *EventList; // sixten: Command Allocation arena *CommandArena; arena *CommandDataArena; workspace_command *FirstFreeCommand; workspace_command *LastFreeCommand; // sixten: Command List workspace_command *FirstCommand; workspace_command *LastCommand; // sixten: Panels arena *PanelArena; workspace_panel *FirstFreePanel; workspace_panel *LastFreePanel; workspace_drag_payload_state DragPayloadState; workspace_drag_payload DragPayload; arena *PanelViewArena; workspace_panel_view_list PanelViewFreeList; workspace_toolbar_menu Menu; v2 MenuP; r32 MenuT; workspace_panel *RootPanel; workspace_panel *CurrentPanel; }; #include "vn_workspace_file_lister.h" #include "vn_workspace_text_editor.h" #include "vn_workspace_nav_editor.h" #include "vn_workspace_view.h" //////////////////////////////// //~ sixten: Workspace Functions //- sixten: State management static void W_SetState(workspace *Workspace); static workspace *W_GetState(void); //- sixten: Commands static void W_IssueCommand(workspace_command_sig *Sig, u64 Argument = 0); static void W_ProcessCommands(void); //- sixten: Panels static workspace_panel *W_CreateNewPanel(workspace_panel *Parent); static void W_DeletePanel(workspace_panel *Panel); static void W_SplitPanel(workspace_panel *Panel, axis2 Axis); //- sixten: Views static b32 W_ViewIsDragged(workspace_view *View); //- sixten: Panel Views static void W_PanelViewPush(workspace_panel_view_list *List, workspace_panel_view *PanelView); static void W_PanelViewRemove(workspace_panel_view_list *List, workspace_panel_view *PanelView); static workspace_panel_view *W_CreatePanelView(void); static void W_DeletePanelView(workspace_panel_view *PanelView); //- sixten: Builder code static ui_signal W_BuildToolbarButton(char *Text, workspace_toolbar_menu Menu); static ui_signal W_BuildMenuItem(u32 Icon, char *Text, char *Shortcut); static void W_BuildToolbar(void); //- sixten: Workspace static void W_Init(workspace *Workspace); static void W_Update(workspace *Workspace, vn_render_commands *RenderCommands, vn_input *Input, glyph_atlas *GlyphAtlas); #endif //VN_WORKSPACE_H