vn/code/vn_workspace.h

133 lines
3.1 KiB
C

/* 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 toolbar_menu
{
ToolbarMenu_None = 0,
ToolbarMenu_Panel,
ToolbarMenu_View,
ToolbarMenu_Window,
};
struct workspace_panel
{
workspace_panel *First;
workspace_panel *Last;
workspace_panel *Next;
workspace_panel *Prev;
workspace_panel *Parent;
struct workspace_view *FirstView;
struct workspace_view *LastView;
struct 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: General Purpose Allocation
memory_arena *FrameArena;
// sixten: Command Allocation
memory_arena *CommandArena;
workspace_command *FirstFreeCommand;
workspace_command *LastFreeCommand;
// sixten: Command List
workspace_command *FirstCommand;
workspace_command *LastCommand;
// sixten: Panels
memory_arena *PanelArena;
workspace_panel *FirstFreePanel;
workspace_panel *LastFreePanel;
workspace_drag_payload_state DragPayloadState;
workspace_drag_payload DragPayload;
toolbar_menu Menu;
v2 MenuP;
r32 MenuTransition;
workspace_panel *RootPanel;
workspace_panel *CurrentPanel;
};
#include "vn_workspace_editor.h"
#include "vn_workspace_text_editor.h"
#include "vn_workspace_character_editor.h"
#include "vn_workspace_view.h"
////////////////////////////////
//~ sixten: Workspace Functions
//- sixten: State management
static void W_SetState(workspace *Workspace);
static workspace *W_GetState(void);
static memory_arena *W_FrameArena(void);
//- sixten: Commands
static void W_IssueCommand(workspace_command_sig *Sig, u64 Argument);
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: Builder code
static ui_signal W_BuildToolbarButton(char *Text, toolbar_menu Menu);
static ui_signal W_BuildMenuItem(u32 Icon, char *Text, char *Shortcut);
static void W_BuildToolbar(r32 dtForFrame);
//- 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