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);