Files
HalbearNetDesktopSite/WindowManager.js
2026-01-26 08:49:11 +00:00

221 lines
8.9 KiB
JavaScript

class AppWindow{
ID;
Title;
Window;
WindowElement;
TaskbarApp;
DesktopApp;
constructor(IdIn, Source, Title, X, Y) {
this.Title = Title;
this.ID = IdIn;
this.DesktopApp = Source.cloneNode(true);
this.GenerateTaskBarApp()
this.GenerateWindow(this);
//setTimeout(this.InitWin(this), 1000)
var checkExist = setInterval( function(Element){
//console.log("Interval")
if (document.getElementById(Element.ID)){
clearInterval(checkExist);
Element.WindowElement = document.getElementById(Element.ID);
Element.InitWin(Element, X, Y);
}
}, 100,this);
}
InitWin (element, X, Y){
//console.log(element.WindowElement);
element.init(element, X, Y);
element.DragWindow(element.WindowElement, element.TaskbarApp);
//WinManager.CalibrateWindows();
element.DesktopApp = null;
}
GenerateTaskBarApp(){
this.TaskbarApp = this.DesktopApp.cloneNode(true);
this.TaskbarApp.classList.replace("windowIcon","windowApp")
this.TaskbarApp.id = ("App" + this.ID);
this.TaskbarApp.setAttribute("onClick", "");
taskbar.appendChild(this.TaskbarApp);
}
GenerateWindow(self){
var NewAppBody = new XMLHttpRequest();
NewAppBody.open('GET', Page + "Apps/" + self.Title + '.html', true);
NewAppBody.onreadystatechange = function () {
if (NewAppBody.readyState !== 4) return;
if (NewAppBody.status !== 200) return;
self.WindowContent = NewAppBody.responseText;
var NewAppLoaded = new XMLHttpRequest();
NewAppLoaded.open('GET', "AppAssets/App.html", true);
NewAppLoaded.onreadystatechange = function () {
if (NewAppLoaded.readyState !== 4) return;
if (NewAppLoaded.status !== 200) return;
self.Window = NewAppLoaded.responseText;
self.Window = self.Window.replaceAll("{id}", "" + self.ID);
self.Window = self.Window.replace("{x}", self.DesktopApp.classList[3]);
self.Window = self.Window.replace("{y}", self.DesktopApp.classList[4]);
self.Window = self.Window.replace("{ApplicationName}", self.Title + "Name");
self.Window = self.Window.replace("Application", self.Title);
self.Window = self.Window.replace("{WindowIconImage}", self.DesktopApp.children[0].src);
self.Window = self.Window.replace("{body}", self.WindowContent);
document.getElementById("AppContainer").insertAdjacentHTML("beforeend",self.Window);
};
NewAppLoaded.send();
}
NewAppBody.send();
}
init(element, X, Y) {
element.WindowElement.style.width = element.WindowElement.classList[1] + "vh";
element.WindowElement.style.height = element.WindowElement.classList[2] + "vh";
element.WindowElement.style.left = (X-(((element.WindowElement.offsetWidth/2)/innerWidth)*100)) + "vw";
element.WindowElement.style.top = (Y-(((element.WindowElement.offsetHeight/2)/innerHeight)*100)) + "vh";
element.WindowElement.classList.remove("minimised")
}
DragWindow(Window, WindowTaskBarApp){
if (Window.classList.contains(".Initialised")) AppInit(Window);
var Touchscreen = false;
var CalculatedLeft = 0, CalculatedTop = 0, OldLeft = 0, OldTop = 0;
Window.children[0].addEventListener('mousedown', mouseDown);
Window.children[0].addEventListener('touchstart', mouseDown);
WindowTaskBarApp.addEventListener('mousedown', AppMinimise)
WindowTaskBarApp.addEventListener('touchstart', AppMinimise)
document.getElementById(Window.id + "ExitBtn").addEventListener('mousedown', ExitApp);
document.getElementById(Window.id + "MinimiseBtn").addEventListener('mousedown', AppMinimise);
document.getElementById(Window.id + "ExitBtn").addEventListener('touchstart', ExitApp);
document.getElementById(Window.id + "MinimiseBtn").addEventListener('touchstart', AppMinimise);
function mouseDown(mouse) {
console.log("mouseDown");
Touchscreen = mouse.type === "touchstart";
mouse.preventDefault();
if (!Window.classList.contains('DraggingActive')){
Window.style.zIndex = ""+55;
if (Touchscreen) {
document.addEventListener('touchmove', mouseMove);
document.addEventListener('touchend', mouseUp);
} else {
document.addEventListener('mousemove', mouseMove);
document.addEventListener('mouseup', mouseUp);
}
Window.classList.add('DraggingActive');
Window.children[1].classList.add("Dragging");
OldLeft = mouse.clientX;
OldTop = mouse.clientY;
Window.children[1].style.transition = '0.5s';
setTimeout(function(){
Window.children[1].style.transition = '0.0s';
}, 500);
}
}
function mouseMove(mouse){
mouse.preventDefault();
if (!Touchscreen) {
CalculatedLeft = OldLeft - mouse.clientX;
CalculatedTop = OldTop - mouse.clientY;
OldLeft = mouse.clientX;
OldTop = mouse.clientY;
Window.style.top = clamp(((Window.offsetTop - CalculatedTop)/innerHeight)*100,0,(((innerHeight - Window.offsetHeight)/innerHeight)*100)- 5) + 'vh';
Window.style.left =clamp(((Window.offsetLeft - CalculatedLeft)/innerWidth)*100,0,(((innerWidth - Window.offsetWidth)/innerWidth)*100)- 0.5) + 'vw';
} else {
Window.style.top = clamp((mouse.changedTouches[0].clientY/innerHeight)*100,0,(((innerHeight - Window.offsetHeight)/innerHeight)*100)- 5) + 'vh';
Window.style.left = clamp((mouse.changedTouches[0].clientX/innerWidth)*100,0,(((innerWidth - Window.offsetWidth)/innerWidth)*100) - 0.5) + 'vw';
}
}
function mouseUp(mouse){
Window.children[1].classList.remove('Dragging');
//Window.removeEventListener('mousedown', mouseDown);
//Window.removeEventListener('touchstart', mouseDown);
Window.classList.remove('DraggingActive');
if (Touchscreen){
document.removeEventListener('touchmove', mouseMove);
document.removeEventListener('touchend', mouseUp);
Touchscreen = false;
}
else {
document.removeEventListener('mousemove', mouseMove);
document.removeEventListener('mouseup', mouseUp);
}
Window.children[1].style.transition = '0.5s';
Window.style.zIndex = ""+50;
setTimeout(function(){
Window.children[1].style.transition = '0.0s';
}, 500);
}
function AppMinimise(mouse){
if (Window.classList.contains("minimised")) {
Window.classList.add("animationTransition");
Window.classList.remove("minimised");
setTimeout(()=>{
Window.classList.remove("animationTransition");
},500)
} else {
Window.classList.add("minimised");
}
}
function ExitApp(mouse) {
var TaskbarApp = document.getElementById("App" + Window.id);
TaskbarApp.remove();
Window.remove();
}
}
}
class WindowManager{
Windows = [];
constructor(){
this.Windows = [];
}
NewWindow(IdIn, Source, Title, X, Y){
let newWindow = new AppWindow(IdIn, Source, Title, X, Y);
this.Windows.push(newWindow);
return newWindow;
}
CalibrateWindows(){
for (let i = 0; i < this.Windows.length; i++){
this.Windows[i].DragWindow(this.Windows[i].WindowElement, this.Windows[i].TaskbarApp);
}
}
get WindowCount(){
return this.Windows.length;
}
}
let WinManager = new WindowManager();
var SelectedApp;
var AppIdCounter = 0;
var click = false;
const taskbar = document.getElementById("taskbar");
//console.log(WinManager.WindowCount);
function clamp(number, lower, upper) {
if (number > upper) {
return upper;
}
if (number < lower) {
return lower;
}
return number;
}
function OpenApp(Source, skip, X, Y){
if (SelectedApp !== Source && !skip){
if (SelectedApp != null){
SelectedApp.classList.remove("selectedIcon");
}
SelectedApp = Source;
Source.classList.add("selectedIcon");
} else{
SelectedApp = null;
Source.classList.remove("selectedIcon");
let Title = Source.children[1].innerHTML;
WinManager.NewWindow(AppIdCounter, Source, Title, X, Y);
AppIdCounter++;
}
}