diff --git a/README.md b/README.md index 483c6a4..280e324 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.8 +* New elements now spawn in the center +* Added button element +* Changed switch graphical look + ### 0.2.7 * Added welcome screen window diff --git a/index.html b/index.html index 65001e0..33be2e5 100644 --- a/index.html +++ b/index.html @@ -43,6 +43,7 @@


+

diff --git a/js/logicengine.js b/js/logicengine.js index 3a3f687..002be1e 100644 --- a/js/logicengine.js +++ b/js/logicengine.js @@ -280,6 +280,15 @@ class Element extends CanvasTools { this.OutputConnections[a].Element.setInput(this.OutputConnections[a].Input,false); } } + + MouseDown(mousePos) { + return; + } + + MouseUp(mousePos) { + return; + } + MouseClick(mousePos) { let mouseDistOutput = length2D(this.X+(this.Width-10), @@ -317,7 +326,7 @@ class Element extends CanvasTools { this.MouseOver = false; if (((mousePos.x >= this.X ) && (mousePos.x <= (this.X + this.Width))) & ((mousePos.y >= this.Y ) && (mousePos.y <= (this.Y + this.Height)))) this.MouseOver = true; this.MousePosition = mousePos; - return this.MouseOver; + return this.MouseOver; } addConnection(container, element, input) { @@ -569,6 +578,54 @@ class InputSwitch extends inputElement { } } + drawElement(x, y, ctx) { + this.drawBorderBox(ctx, x,y,this.Width-20,this.Height,1,"#000","#f7e979",this.LogicEngine.Settings.ShadowColor); + //this.drawBorderBox(ctx,x+5,y+5,50,50,1,"#ccc","#777"); + this.drawBorderBox(ctx,x+5,y+25,50,10,1,"#ccc","#777"); + if (this.getOutput()) { + this.drawBorderBox(ctx,x+15,y+5,30,25,1,"#ccc","#777"); + this.drawTextCentered(ctx,x,y+this.Height - 30,this.Width-(this.outputCircleRadius*2)-20,12,"OFF","12px Console","#000"); + } else { + this.drawBorderBox(ctx,x+15,y+30,30,25,1,"#ccc","#777"); + this.drawTextCentered(ctx,x,y+7,this.Width-(this.outputCircleRadius*2)-20,12,"ON","12px Console","#000"); + } + this.drawTextCentered(ctx,x,y+(this.Height-14),this.Width-(this.outputCircleRadius*2),12,this.Designator,"12px Console","#000"); + this.drawOutputs(ctx,x,y); + } +} + +class InputButton extends inputElement { + constructor(logicengine) { + super(logicengine); + this.Name = "Button"; + this.Height = 70; + } + + MouseDown(mousePos) { + if ((mousePos.x >= (this.X + 5)) && (mousePos.x <= (this.X + 55)) && (mousePos.y >= (this.Y + 5)) && (mousePos.y <= (this.Y + 55))) { + let old_output = this.Output; + this.Output = true; + this.LogicEngine.MouseDown = false; // Prevent movement on the button when its being pushed + if (old_output != this.Output) { + for (let a = 0; a < this.OutputConnections.length; a++) { + this.LogicEngine.RecursionCount = 0; + this.OutputConnections[a].Element.setInput(this.OutputConnections[a].Input, this.getOutput()); + } + } + } + } + + MouseUp(mousePos) { + let old_output = this.Output; + this.Output = false; + if (old_output != this.Output) { + for (let a = 0; a < this.OutputConnections.length; a++) { + this.LogicEngine.RecursionCount = 0; + this.OutputConnections[a].Element.setInput(this.OutputConnections[a].Input, this.getOutput()); + } + } + } + drawElement(x, y, ctx) { this.drawBorderBox(ctx, x,y,this.Width-20,this.Height,1,"#000","#f7e979",this.LogicEngine.Settings.ShadowColor); this.drawBorderBox(ctx,x+5,y+5,50,50,1,"#ccc","#777"); @@ -1090,15 +1147,17 @@ class LogicEngine { Mouse_Down(evt) { let mousePos = getMousePos(this.Canvas, evt); - this.MouseDown = true; this.MouseDownTime = performance.now(); let element = this.ActiveContainer.checkMouseBounds(mousePos); if (element) { + this.MouseDown = true; + this.ActiveContainer.Select(element); this.MovingElement = element; this.MovingElementStartX = element.X; this.MovingElementStartY = element.Y; this.MovingElementMouseStartX = mousePos.x; this.MovingElementMouseStartY = mousePos.y; + element.MouseDown(mousePos); } else { this.ActiveLink = false; } @@ -1106,28 +1165,27 @@ class LogicEngine { Mouse_Up(evt) { let mousePos = getMousePos(this.Canvas, evt); - this.MouseDown = false; + if (this.MovingElement) this.MovingElement.MouseUp(mousePos); if (this.MovingElement && (this.MovingElement.X == this.MovingElementStartX) && (this.MovingElement.Y == this.MovingElementStartY)) { if ((performance.now() - this.MouseDownTime) < 3000) { // Presume this was a click - this.ActiveContainer.Select(this.MovingElement); this.MovingElement.MouseClick(mousePos); } //console.log("Mouse Up"); } if (!this.MovingElement) this.ActiveContainer.Selected = false; this.MovingElement = false; + this.MouseDown = false; } Mouse_Move(evt) { - this.Canvas.focus(); + //this.Canvas.focus(); let mousePos = getMousePos(this.Canvas, evt); this.Mouse = mousePos; if(this.MouseDown) { //console.log('Mouse at position: ' + mousePos.x + ',' + mousePos.y); if (this.MovingElement) { if ((performance.now() - this.MouseDownTime) > 100) { - this.ActiveContainer.Select(this.MovingElement); let xOffset = mousePos.x - this.MovingElementMouseStartX; let yOffset = mousePos.y - this.MovingElementMouseStartY; let diffxOffset = this.MovingElementMouseStartX - this.MovingElementStartX; diff --git a/js/main.js b/js/main.js index e5b218d..f330c14 100644 --- a/js/main.js +++ b/js/main.js @@ -2,7 +2,7 @@ MatCat BrowserLogic Simulator */ -let Version = "0.2.7"; +let Version = "0.2.8"; let spanVersion = document.getElementById("version"); spanVersion.innerText = Version; // get the canvas and get the engine object going @@ -18,7 +18,7 @@ window.addEventListener('resize', function(evt) { logicEngine.Resize(evt); }, false); -lCanvasElement.addEventListener('keydown', function(evt) { +window.addEventListener('keydown', function(evt) { logicEngine.Key_Press(evt); }, false); @@ -30,7 +30,7 @@ lCanvasElement.addEventListener('mouseup', function(evt) { logicEngine.Mouse_Up(evt); }, false); -lCanvasElement.addEventListener('mousemove', function(evt) { +window.addEventListener('mousemove', function(evt) { logicEngine.Mouse_Move(evt); }, false); @@ -58,71 +58,79 @@ 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 = 20; - newAND.Y = 20; + newAND.X = logicEngine.Canvas.width/2; + newAND.Y = logicEngine.Canvas.height/2; logicEngine.ActiveContainer.AddElement(newAND); }, false); let btn_AddNAND = document.getElementById("btn_AddNAND"); btn_AddNAND.addEventListener('click', function(evt) { let newNAND = new LogicNAND(logicEngine,2); - newNAND.X = 20; - newNAND.Y = 20; + newNAND.X = logicEngine.Canvas.width/2; + newNAND.Y = logicEngine.Canvas.height/2; logicEngine.ActiveContainer.AddElement(newNAND); }, false); let btn_AddOR = document.getElementById("btn_AddOR"); btn_AddOR.addEventListener('click', function(evt) { let newOR = new LogicOR(logicEngine,2); - newOR.X = 20; - newOR.Y = 20; + newOR.X = logicEngine.Canvas.width/2; + newOR.Y = logicEngine.Canvas.height/2; logicEngine.ActiveContainer.AddElement(newOR); }, false); let btn_AddNOR = document.getElementById("btn_AddNOR"); btn_AddNOR.addEventListener('click', function(evt) { let newNOR = new LogicNOR(logicEngine,2); - newNOR.X = 20; - newNOR.Y = 20; + newNOR.X = logicEngine.Canvas.width/2; + newNOR.Y = logicEngine.Canvas.height/2; logicEngine.ActiveContainer.AddElement(newNOR); }, false); let btn_AddXOR = document.getElementById("btn_AddXOR"); btn_AddXOR.addEventListener('click', function(evt) { let newXOR = new LogicXOR(logicEngine); - newXOR.X = 20; - newXOR.Y = 20; + newXOR.X = logicEngine.Canvas.width/2; + newXOR.Y = logicEngine.Canvas.height/2; logicEngine.ActiveContainer.AddElement(newXOR); }, false); let btn_AddXNOR = document.getElementById("btn_AddXNOR"); btn_AddXNOR.addEventListener('click', function(evt) { let newXNOR = new LogicXNOR(logicEngine); - newXNOR.X = 20; - newXNOR.Y = 20; + newXNOR.X = logicEngine.Canvas.width/2; + newXNOR.Y = logicEngine.Canvas.height/2; logicEngine.ActiveContainer.AddElement(newXNOR); }, false); btn_AddNOT.addEventListener('click', function(evt) { let newNOT = new LogicNOT(logicEngine); - newNOT.X = 20; - newNOT.Y = 20; + newNOT.X = logicEngine.Canvas.width/2; + newNOT.Y = logicEngine.Canvas.height/2; logicEngine.ActiveContainer.AddElement(newNOT); }, false); let btn_AddSWITCH = document.getElementById("btn_AddSWITCH"); btn_AddSWITCH.addEventListener('click', function(evt) { let newSWITCH = new InputSwitch(logicEngine); - newSWITCH.X = 20; - newSWITCH.Y = 20; + newSWITCH.X = logicEngine.Canvas.width/2; + newSWITCH.Y = logicEngine.Canvas.height/2; logicEngine.ActiveContainer.AddElement(newSWITCH); }, 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); +}, false); + let btn_AddCLK = document.getElementById("btn_AddCLK"); btn_AddCLK.addEventListener('click', function(evt) { let newCLK = new ClockElement(logicEngine); - newCLK.X = 20; - newCLK.Y = 20; + newCLK.X = logicEngine.Canvas.width/2; + newCLK.Y = logicEngine.Canvas.height/2; logicEngine.ActiveContainer.AddElement(newCLK); logicEngine.Scheduler.addTask(newCLK.Task); }, false);