WORKSPACE_COMMAND(W_Command_SplitPanelHorizontal) { workspace *Workspace = W_GetState(); W_SplitPanel(Workspace->CurrentPanel, Axis2_X); } WORKSPACE_COMMAND(W_Command_SplitPanelVertical) { workspace *Workspace = W_GetState(); W_SplitPanel(Workspace->CurrentPanel, Axis2_Y); } WORKSPACE_COMMAND(W_Command_ClosePanel) { workspace *Workspace = W_GetState(); workspace_panel *Panel = (workspace_panel *)Argument; if(!Panel) { Panel = Workspace->CurrentPanel; } workspace_panel *Parent = Panel->Parent; Assert(Parent); Assert(Panel != Workspace->RootPanel); DLLRemove(Parent->First, Parent->Last, Panel); b32 OneChildRemains = (Parent->First == Parent->Last); if(OneChildRemains) { workspace_panel *Child = Parent->First; Assert(DLLIsEmpty(Parent->FirstView)); Parent->FirstView = Child->FirstView; Parent->LastView = Child->LastView; Parent->First = Child->First; Parent->Last = Child->Last; Parent->SplitAxis = Child->SplitAxis; // sixten: Update the parents of the children. for(workspace_view *View = Parent->FirstView; View != 0; View = View->Next) { View->Parent = Parent; } for(workspace_panel *ParentChild = Parent->First; ParentChild != 0; ParentChild = ParentChild->Next) { ParentChild->Parent = Parent; } DLLRemove(Parent->First, Parent->Last, Child); W_DeletePanel(Child); } else { s32 ChildCount = 0; for(workspace_panel *Child = Parent->First; Child != 0; Child = Child->Next) { ++ChildCount; } r32 ToAppend = Panel->PercentOfParent / ChildCount; for(workspace_panel *Child = Parent->First; Child != 0; Child = Child->Next) { Child->PercentOfParent += ToAppend; } } // sixten: Delete all child views. workspace_view *NextChild = 0; for(workspace_view *Child = Panel->FirstView; Child != 0; Child = NextChild) { NextChild = Child->Next; W_DestroyView(Child); } W_DeletePanel(Panel); } WORKSPACE_COMMAND(W_Command_OpenView) { workspace *Workspace = W_GetState(); W_CreateNewView((workspace_view_type)Argument, Workspace->CurrentPanel); } WORKSPACE_COMMAND(W_Command_CloseView) { workspace_view *View = (workspace_view *)U64ToPointer(Argument); workspace_panel *Panel = View->Parent; DLLRemove(Panel->FirstView, Panel->LastView, View); if(Panel->CurrentView == View) { Panel->CurrentView = Panel->FirstView; } W_DestroyView(View); } #if VN_INTERNAL WORKSPACE_COMMAND(W_Command_ToggleRenderUIDebugRects) { DEBUG_DebugSettings->RenderUIDebugRects = !DEBUG_DebugSettings->RenderUIDebugRects; } #endif WORKSPACE_COMMAND(W_Command_Test) { for(s32 Index = 0; Index < 10000; Index += 1) { W_IssueCommand(W_Command_OpenView, W_View_TextEditor); W_IssueCommand(W_Command_CloseView, 0); } }