vn/code/vn_workspace.h

123 lines
3.0 KiB
C

/* date = May 5th 2023 10:12 am */
#ifndef VN_WORKSPACE_H
#define VN_WORKSPACE_H
#include "vn_workspace_editor.h"
// 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;
};
#include "vn_workspace_view.h"
#define WORKSPACE_COMMAND(name, ...) void name(workspace *Workspace, 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
{
Workspace_DragPayload_Inactive = 0,
Workspace_DragPayload_Active,
Workspace_DragPayload_Released,
};
struct workspace_drag_payload
{
ui_key Key;
workspace_view *View;
};
struct workspace
{
vn_input *Input;
platform_event_list *EventList;
// sixten: Command Allocation
memory_arena CommandArena;
workspace_command *FirstFreeCommand;
workspace_command *LastFreeCommand;
// sixten: Command List
workspace_command *FirstCommand;
workspace_command *LastCommand;
// sixten: Keybinds
workspace_keybind Keybinds[256];
s32 KeybindCount;
// 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;
};
//- sixten: Commands
static void Workspace_IssueCommand(workspace *Workspace, workspace_command_sig *Sig, u64 Argument);
static void Workspace_ProcessCommands(workspace *Workspace);
//- sixten: Panels
static workspace_panel *Workspace_CreateNewPanel(workspace *Workspace, workspace_panel *Parent);
static void Workspace_DeletePanel(workspace *Workspace, workspace_panel *Panel);
static void Workspace_SplitPanel(workspace *Workspace, workspace_panel *Panel, axis2 Axis);
//- sixten: Builder code
static ui_signal Workspace_BuildToolbarButton(workspace *Workspace, char *Text, toolbar_menu Menu);
static ui_signal Workspace_BuildMenuItem(u32 Icon, char *Text, char *Shortcut);
static void Workspace_BuildToolbar(workspace *Workspace, r32 dtForFrame);
//- sixten: Workspace
static void Workspace_Init(workspace *Workspace);
static void Workspace_Update(workspace *Workspace, vn_render_commands *RenderCommands,
vn_input *Input, glyph_atlas *GlyphAtlas);
#endif //VN_WORKSPACE_H