dragonroll/client/src/services/Windows.js
2024-09-22 23:57:15 +02:00

416 lines
11 KiB
JavaScript

import { reactive, ref } from 'vue'
import { Disconnect } from './Campaign';
const windows = ref([])
// Presets
const defValues = {
'test': {
id: "example",
title: "Example",
close: () => ClearWindow('example')
},
'login': {
id: 'login',
title: 'Login',
},
'register': {
id: 'register',
title: 'Register admin account',
},
'main_menu': {
id: 'main_menu',
title: 'main-menu.title',
create: () => {
// CreateChildWindow('main_menu', 'welcome');
}
},
'welcome': {
id: 'welcome',
title: "Welcome",
close: () => ClearWindow('welcome')
},
'edit_profile': {
id: 'edit_profile',
title: "Edit Profile",
close: () => ClearWindow('edit_profile')
},
'settings': {
id: 'settings',
title: 'settings.title',
close: () => ClearWindow('settings')
},
'campaign_list': {
id: 'campaign_list',
title: 'campaigns.title',
back: () => {
ClearWindow('campaign_list');
CreateWindow('main_menu');
}
},
'new_campaign': {
id: 'new_campaign',
title: 'campaigns.create.title',
parent: 'campaign_list',
close: () => ClearWindow('new_campaign')
},
'join_campaign': {
id: 'join_campaign',
title: 'campaigns.join.title',
parent: 'campaign_list',
close: () => ClearWindow('join_campaign')
},
'campaign_preview': {
id: 'campaign_preview',
title: "campaigns.preview.title",
back: () => {
Disconnect();
ClearWindow('campaign_preview');
CreateWindow('campaign_list');
}
},
'chat': {
id: 'chat',
title: 'Chat',
close: () => ClearWindow('chat')
},
'dice_menu': {
id: 'dice_menu',
title: 'Dice roll',
close: () => ClearWindow('dice_menu')
},
'map_buttons': {
id: 'map_buttons',
title: '',
close: () => ClearWindow('map_buttons')
},
'environment': {
id: 'environment',
title: 'Edit environment',
close: () => ClearWindow('environment')
},
'system_selector': {
id: 'system-selector',
title: 'systems.title',
close: () => ClearWindow('system-selector')
},
'map_window': {
id: 'map_window',
title: 'Maps',
close: () => ClearWindow('map_window')
},
'combat_window': {
id: 'combat_window',
title: "Combat",
close: () => ClearWindow('combat_window')
},
'entity_window': {
id: 'entity_window',
title: "Entities",
close: () => ClearWindow('entity_window')
},
'characters_window': {
id: 'characters_window',
title: "Characters",
close: () => ClearWindow('characters_window')
},
'compendium_window': {
id: 'compendium_window',
title: "Compendium",
close: () => ClearWindow('compendium_window')
},
'character_sheet': {
id: 'character_sheet',
title: 'Character Sheet',
close: () => ClearWindow('character_sheet')
},
'book_anvil_window': {
id: 'book_anvil_window',
title: "Book Anvil",
back: () => {
ClearWindow('book_anvil_window');
CreateWindow('main_menu');
}
},
'icon_selector': {
id: 'icon-selector',
title: "Select an Icon",
},
'database': {
id: 'database',
title: "Database",
close: () => ClearWindow('database')
}
}
const reload = ref(0);
let ReloadRef = () => { return reload };
let Windows = () => { return windows };
let currentIndex = 10;
function SetupHandle(id, handle){
// Update window info with handle info
let win = GetWindowWithId(id);
let currentWindowId = "window-wrapper-" + id;
let currentWindowHandleId = "window-handle-" + id;
let currentWindowResizerId = "window-resize-handle-" + id;
let draggingWindow = false;
let resizingWindow = false;
let currentWindow = document.getElementById(currentWindowId);
let handler = document.getElementById(currentWindowHandleId);
let resizer = document.getElementById(currentWindowResizerId);
let offsetX = 0;
let offsetY = 0;
let resizeOffsetX = 0;
let resizeOffsetY = 0;
// Programar un resizer mitjanament competent
currentWindow.addEventListener("mousedown", (event) => {
SetOnTop(id);
});
handler.addEventListener("mousedown", (event) => {
draggingWindow = true;
let windowRect = currentWindow.getBoundingClientRect();
offsetX = windowRect.left - event.clientX;
offsetY = windowRect.top - event.clientY;
})
// Move window listeners
document.addEventListener("mousemove", (event) => {
if(!draggingWindow) return;
if(event.clientX + offsetX < -currentWindow.getBoundingClientRect().width + 20) currentWindow.style.left = (-currentWindow.getBoundingClientRect().width + 20) + "px";
else if(event.clientX + offsetX > window.innerWidth - 20) currentWindow.style.left = (window.innerWidth - 20) + "px";
else currentWindow.style.left = (event.clientX + offsetX) + "px";
if(event.clientY + offsetY < 0) currentWindow.style.top = (0) + "px";
else if(event.clientY + offsetY > window.innerHeight - 20) currentWindow.style.top = (window.innerHeight - 20) + "px";
else currentWindow.style.top = (event.clientY + offsetY) + "px";
})
document.addEventListener("mouseup", (event) => {
draggingWindow = false;
// ummm suposo que no pots tancar mentres mous?
SaveWindowPos({id, x: parseInt(currentWindow.style.left, 10), y: parseInt(currentWindow.style.top, 10)});
});
// Resize window listeners
resizer.addEventListener("mousedown", (event) => {
resizingWindow = true;
let windowRect = currentWindow.getBoundingClientRect();
resizeOffsetX = parseInt(currentWindow.style.width) - event.clientX;
resizeOffsetY = parseInt(currentWindow.style.height) - event.clientY;
});
document.addEventListener("mousemove", (event) => {
if(!resizingWindow) return;
let newWidth = event.clientX + resizeOffsetX;
let newHeight = event.clientY + resizeOffsetY;
if(win.minHeight) if(win.minHeight > newHeight) newHeight = win.minHeight;
if(win.maxHeight) if(win.maxHeight < newHeight) newHeight = win.maxHeight;
if(win.minWidth) if(win.minWidth > newWidth) newWidth = win.minWidth;
if(win.maxWidth) if(win.maxWidth < newWidth) newWidth = win.maxWidth;
currentWindow.style.width = newWidth + "px";
currentWindow.style.height = newHeight + "px";
});
document.addEventListener("mouseup", (event) => {
resizingWindow = false;
win.width = parseInt(currentWindow.style.width, 10);
win.height = parseInt(currentWindow.style.height, 10);
});
handle.value.setupHandle();
}
function SetResizable(id, resizable){
let win = GetWindowWithId(id);
win.resizable = resizable;
}
function SetSize(id, size){
let currentWindowId = "window-wrapper-" + id;
let currentWindow = document.getElementById(currentWindowId);
let win = GetWindowWithId(id);
currentWindow.style.width = size.width + "px";
currentWindow.style.height = size.height + "px";
win.width = size.width;
}
function SetMaxSize(id, maxSize){
let win = GetWindowWithId(id);
if(maxSize.width) win.maxWidth = maxSize.width;
else win.maxWidth = win.width;
if(maxSize.height) win.maxHeight = maxSize.height;
else win.maxHeight = win.height;
}
function SetMinSize(id, minSize){
let win = GetWindowWithId(id);
if(minSize.width) win.minWidth = minSize.width;
else win.minWidth = win.width;
if(minSize.height) win.minHeight = minSize.height;
else win.minHeight = win.height;
}
function SetPosition(id, pos){
let currentWindowId = "window-wrapper-" + id;
let currentWindow = document.getElementById(currentWindowId);
if(pos == "center"){
let x = window.innerWidth / 2;
let y = window.innerHeight / 2;
currentWindow.style.left = (x - currentWindow.getBoundingClientRect().width / 2) + "px";
currentWindow.style.top = (y - currentWindow.getBoundingClientRect().height / 2) + "px";
return;
}
currentWindow.style.top = pos.y + "px";
currentWindow.style.left = pos.x + "px";
SaveWindowPos({id, x: pos.x, y: pos.y})
}
function GetPosition(id){
let win = GetWindowWithId(id);
return {x: win.x, y: win.y};
}
function ResetPosition(id, pos){
let win = GetWindowWithId(id);
let data = {x: win.x, y: win.y};
if(data.x && data.y){
SetPosition(id, data);
return;
}
SetPosition(id, pos);
}
function CreateWindow(type, data = {}){
let finalData = {...{type}, ...defValues[type], ...data}
let contains = false;
for (let i = 0; i < windows.value.length; i++) {
if(windows.value[i].id == finalData.id){
contains = true;
break;
}
}
if(!contains) {
windows.value.push(finalData);
// reload.value += 1;
setTimeout(() => {
SetOnTop(finalData.id);
if(finalData.create) finalData.create();
}, 0);
}
}
function CreateChildWindow(parentId, type, data = {}){
let finalData = {...{type}, ...defValues[type], ...data}
let parent = GetWindowWithId(parentId);
if(parent.children) parent.children.push(finalData.id);
else parent.children = [finalData.id];
CreateWindow(type, data);
}
function ClearAll(){
Object.keys(windows).forEach((key) => {
windows.value = [];
});
}
function ClearWindows(data){
for (let i = 0; i < windows.value.length; i++) {
ClearWindow(windows.value[i].id);
}
// reload.value += 1;
}
function ClearWindow(id){
let win = GetWindowWithId(id);
if(!win) return;
if(win.children) for(let i = 0; i < win.children.length; i++) ClearWindow(win.children[i]);
windows.value = windows.value.filter((e) => {return e.id !== id});
// reload.value += 1;
}
function GetWindowWithId(id){
for(let i = 0; i < windows.value.length; i++){
if(windows.value[i].id == id){
return windows.value[i];
}
}
}
function CallWindow(id, callableName, arg){
let win = GetWindowWithId(id);
win[callableName](arg);
}
function SaveWindowPos(data){
let win = GetWindowWithId(data.id);
if(win === undefined) return;
win.x = data.x;
win.y = data.y;
}
function SetOnTop(id){
let currentWindowId = "window-wrapper-" + id;
let currentWindow = document.getElementById(currentWindowId);
currentIndex += 1;
currentWindow.style.zIndex = currentIndex;
}
export {
SetupHandle,
SetSize,
SetResizable,
SetMaxSize,
SetMinSize,
SetPosition,
ResetPosition,
Windows,
ReloadRef,
ClearWindows,
CreateWindow,
CreateChildWindow,
CallWindow,
GetWindowWithId,
SaveWindowPos,
GetPosition,
ClearWindow,
ClearAll
}