1
0
Fork 0
Univerxel/include/Remotery/typescript/WM_Serialisation.ts

125 lines
4.0 KiB
TypeScript

// TODO: Hidden state, z-index, just overwrites existing data, doesn't save new layouts
namespace WM
{
class SavedControl
{
ID: number;
Position: int2;
Size: int2;
ZIndex: number;
}
class SavedContainer extends SavedControl
{
Controls: SavedContainer[] = [ ];
}
class SavedWindow extends SavedContainer
{
Title: string;
}
function BuildSavedContainerList(container: Container, saved_container: SavedContainer)
{
for (let control of container.Controls)
{
if (control instanceof Window)
saved_container.Controls.push(BuildSavedWindow(control as Window));
else if (control instanceof Container)
saved_container.Controls.push(BuildSavedContainer(control as Container));
}
}
function BuildSavedControl(control: Control, saved_control: SavedControl) : void
{
saved_control.ID = control.ID;
saved_control.Position = control.Position;
saved_control.Size = control.Size;
saved_control.ZIndex = control.ZIndex;
}
function BuildSavedContainer(container: Container) : SavedContainer
{
let saved_container = new SavedContainer();
BuildSavedControl(container, saved_container);
BuildSavedContainerList(container, saved_container);
return saved_container;
}
function BuildSavedWindow(window: Window) : SavedWindow
{
let saved_window = new SavedWindow();
BuildSavedControl(window, saved_window);
saved_window.Title = window.Title;
BuildSavedContainerList(window, saved_window);
return saved_window;
}
export function SaveContainer(container: Container) : string
{
let saved_container = BuildSavedContainer(container);
return JSON.stringify(saved_container);
}
function ApplyContainerList(container: Container, saved_container: SavedContainer)
{
if (saved_container.Controls === undefined)
return;
for (let i = 0; i < saved_container.Controls.length; i++)
{
let child_saved_control = saved_container.Controls[i];
// Search for control with matching ID
for (let j = 0; j < container.Controls.length; j++)
{
let child_control = container.Controls[j];
if (child_control.ID == child_saved_control.ID)
{
if (child_control instanceof Window)
ApplyWindow(child_control as Window, <SavedWindow>child_saved_control);
else if (child_control instanceof Container)
ApplyContainer(child_control as Container, <SavedContainer>child_saved_control);
break;
}
}
}
}
function ApplyControl(control: Control, saved_control: SavedControl)
{
if (saved_control.Position !== undefined)
control.Position = new int2(saved_control.Position.x, saved_control.Position.y);
if (saved_control.Size !== undefined)
control.Size = new int2(saved_control.Size.x, saved_control.Size.y);
if (saved_control.ZIndex !== undefined && saved_control.ZIndex != null)
control.ZIndex = saved_control.ZIndex;
}
function ApplyWindow(window: Window, saved_window: SavedWindow)
{
ApplyControl(window, saved_window);
if (saved_window.Title !== undefined)
window.Title = <string>saved_window.Title;
ApplyContainerList(window, saved_window);
}
function ApplyContainer(container: Container, saved_container: SavedContainer)
{
ApplyControl(container, saved_container);
ApplyContainerList(container, saved_container);
}
export function LoadContainer(container: Container, input: string)
{
let saved_container = JSON.parse(input);
ApplyContainer(container, saved_container);
}
}