From 59386209fe4c7d6dc1bc40a78534d2d36042c1d5 Mon Sep 17 00:00:00 2001 From: MatCat Date: Tue, 23 Feb 2021 00:46:04 -0800 Subject: [PATCH] 0.2.10: Better element placement, newly placed elements selected --- README.md | 5 ++++ js/logicengine.js | 42 +++++++++++++++++++++++++++++--- js/main.js | 61 +++++++++++------------------------------------ 3 files changed, 58 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index b44211e..3409625 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,11 @@ To be decided, but at this moment this code is open source and free to use for n ## Changelog +### 0.2.10 + +* New elements will now do overlap detection on placement +* Newly placed elements will now be selected + ### 0.2.9 * Active linking is now drawn with quadratic curves * Links can now be deleted by simply trying to link the same link again diff --git a/js/logicengine.js b/js/logicengine.js index a563343..c750213 100644 --- a/js/logicengine.js +++ b/js/logicengine.js @@ -2,6 +2,35 @@ First a few needed global functions */ +function addElement(refClass,props) { + let newElement = new refClass(logicEngine,...props); + + let x = Math.round(logicEngine.Canvas.width/2); + let y = Math.round(logicEngine.Canvas.height/2); + let width = newElement.Width; + let height = newElement.Height; + + let noclearspot = true; + while (noclearspot) { + if (!logicEngine.ActiveContainer.checkOverlayBounds(x,y,width,height)) { + noclearspot = false; + } else { + x += Math.floor(Math.random() * (width - (width - (width*2))) ) + (width - (width*2)); + y += Math.floor(Math.random() * (height - (height - (height*2))) ) + (height - (height*2)); + if (x < 0) x = 0; + if (y < 0) y = 0; + if (x + width > logicEngine.Canvas.width) x = logicEngine.Canvas.width - width; + if (y + height > logicEngine.Canvas.height) y = logicEngine.Canvas.height - height; + } + } + newElement.X = x; + newElement.Y = y; + + logicEngine.ActiveContainer.AddElement(newElement); + logicEngine.ActiveContainer.Select(newElement); + return newElement; +} + function setCookie(cname, cvalue, exdays) { let d = new Date(); d.setTime(d.getTime() + (exdays*24*60*60*1000)); @@ -1177,6 +1206,16 @@ class elementContainer { return false; } + checkOverlayBounds(x,y,width,height) { + for (let a = 0; a < this.Elements.length; a++) { + if ((x >= this.Elements[a].X) && (x <= (this.Elements[a].X + this.Elements[a].Width)) && (y >= this.Elements[a].Y) && (y <= (this.Elements[a].Y + this.Elements[a].Height))) return this.Elements[a]; + if (((x + width) >= this.Elements[a].X) && ((x + width) <= (this.Elements[a].X + this.Elements[a].Width)) && (y >= this.Elements[a].Y) && (y <= (this.Elements[a].Y + this.Elements[a].Height))) return this.Elements[a]; + if ((x >= this.Elements[a].X) && (x <= (this.Elements[a].X + this.Elements[a].Width)) && ((y + height) >= this.Elements[a].Y) && ((y + height) <= (this.Elements[a].Y + this.Elements[a].Height))) return this.Elements[a]; + if (((x + width) >= this.Elements[a].X) && ((x + width) <= (this.Elements[a].X + this.Elements[a].Width)) && ((y + height) >= this.Elements[a].Y) && ((y + height) <= (this.Elements[a].Y + this.Elements[a].Height))) return this.Elements[a]; + } + return false; + } + } class LogicEngine { @@ -1397,6 +1436,3 @@ class LogicEngine { this.DrawLoop(); } } - - - diff --git a/js/main.js b/js/main.js index 78496b7..74d4bdd 100644 --- a/js/main.js +++ b/js/main.js @@ -2,7 +2,7 @@ MatCat BrowserLogic Simulator */ -let Version = "0.2.9"; +let Version = "0.2.10"; let spanVersion = document.getElementById("version"); spanVersion.innerText = Version; // get the canvas and get the engine object going @@ -57,91 +57,58 @@ btn_Delete.addEventListener('click', function(evt) { let btn_AddAND = document.getElementById("btn_AddAND"); btn_AddAND.addEventListener('click', function(evt) { - let newAND = new LogicAND(logicEngine,2); - newAND.X = logicEngine.Canvas.width/2; - newAND.Y = logicEngine.Canvas.height/2; - logicEngine.ActiveContainer.AddElement(newAND); + addElement(LogicAND, [2]); }, false); let btn_AddNAND = document.getElementById("btn_AddNAND"); btn_AddNAND.addEventListener('click', function(evt) { - let newNAND = new LogicNAND(logicEngine,2); - newNAND.X = logicEngine.Canvas.width/2; - newNAND.Y = logicEngine.Canvas.height/2; - logicEngine.ActiveContainer.AddElement(newNAND); + addElement(LogicNAND, [2]); }, false); let btn_AddOR = document.getElementById("btn_AddOR"); btn_AddOR.addEventListener('click', function(evt) { - let newOR = new LogicOR(logicEngine,2); - newOR.X = logicEngine.Canvas.width/2; - newOR.Y = logicEngine.Canvas.height/2; - logicEngine.ActiveContainer.AddElement(newOR); + addElement(LogicOR, [2]); }, false); let btn_AddNOR = document.getElementById("btn_AddNOR"); btn_AddNOR.addEventListener('click', function(evt) { - let newNOR = new LogicNOR(logicEngine,2); - newNOR.X = logicEngine.Canvas.width/2; - newNOR.Y = logicEngine.Canvas.height/2; - logicEngine.ActiveContainer.AddElement(newNOR); + addElement(LogicNOR, [2]); }, false); let btn_AddXOR = document.getElementById("btn_AddXOR"); btn_AddXOR.addEventListener('click', function(evt) { - let newXOR = new LogicXOR(logicEngine); - newXOR.X = logicEngine.Canvas.width/2; - newXOR.Y = logicEngine.Canvas.height/2; - logicEngine.ActiveContainer.AddElement(newXOR); + addElement(LogicXOR,[]); }, false); let btn_AddXNOR = document.getElementById("btn_AddXNOR"); btn_AddXNOR.addEventListener('click', function(evt) { - let newXNOR = new LogicXNOR(logicEngine); - newXNOR.X = logicEngine.Canvas.width/2; - newXNOR.Y = logicEngine.Canvas.height/2; - logicEngine.ActiveContainer.AddElement(newXNOR); + addElement(LogicXNOR,[]); }, false); btn_AddNOT.addEventListener('click', function(evt) { - let newNOT = new LogicNOT(logicEngine); - newNOT.X = logicEngine.Canvas.width/2; - newNOT.Y = logicEngine.Canvas.height/2; - logicEngine.ActiveContainer.AddElement(newNOT); + addElement(LogicNOT,[]); }, false); let btn_AddSWITCH = document.getElementById("btn_AddSWITCH"); btn_AddSWITCH.addEventListener('click', function(evt) { - let newSWITCH = new InputSwitch(logicEngine); - newSWITCH.X = logicEngine.Canvas.width/2; - newSWITCH.Y = logicEngine.Canvas.height/2; - logicEngine.ActiveContainer.AddElement(newSWITCH); + addElement(InputSwitch,[]); }, false); let btn_AddBTN = document.getElementById("btn_AddBTN"); btn_AddBTN.addEventListener('click', function(evt) { - let newBTN = new InputButton(logicEngine); - newBTN.X = logicEngine.Canvas.width/2; - newBTN.Y = logicEngine.Canvas.height/2; - logicEngine.ActiveContainer.AddElement(newBTN); + addElement(InputButton,[]); }, false); let btn_AddCLK = document.getElementById("btn_AddCLK"); btn_AddCLK.addEventListener('click', function(evt) { - let newCLK = new ClockElement(logicEngine); - newCLK.X = logicEngine.Canvas.width/2; - newCLK.Y = logicEngine.Canvas.height/2; - logicEngine.ActiveContainer.AddElement(newCLK); - logicEngine.Scheduler.addTask(newCLK.Task); + let clk = addElement(ClockElement,[]); + logicEngine.Scheduler.addTask(clk.Task); }, false); let btn_AddPulse = document.getElementById("btn_AddPULSE"); btn_AddPulse.addEventListener('click', function(evt) { - let newPulse = new PulseElement(logicEngine); - newPulse.X = logicEngine.Canvas.width/2; - newPulse.Y = logicEngine.Canvas.height/2; - logicEngine.ActiveContainer.AddElement(newPulse); - logicEngine.Scheduler.addTask(newPulse.Task); + let pulse = addElement(PulseElement,[]); + logicEngine.Scheduler.addTask(pulse.Task); }, false); function CheckForWelcomeCookie() {