0.4.0: Release

This commit is contained in:
MatCat 2021-03-07 01:01:37 -08:00
parent e329ce684e
commit 131cf088db
8 changed files with 270 additions and 101 deletions

View File

@ -16,14 +16,15 @@ To be decided, but at this moment this code is open source and free to use for n
* You can now pan the work area, hold ctrl key while mouse dragging an empty area. * You can now pan the work area, hold ctrl key while mouse dragging an empty area.
* Right Click Menu * Right Click Menu
* If an item is selected you can delete or disconnect them (BUG WIP: Doesn't disconnect IC's) * If an item is selected you can delete or disconnect them
* Top menu * Top menu
* New / Open / Save moved to File menu * New / Open / Save moved to File menu
* You can now disable connection drawing, or put them above or below elements in View menu
* There is now a pan to center feature in View menu * There is now a pan to center feature in View menu
* Create IC has been moved to Tools menu * Create IC has been moved to Tools menu
* Help menu -> About opens the Welcome Window * Help menu -> About opens the Welcome Window
* Save dialog * Save dialog
* Fixed bug * Fixed various small bugs
### 0.3.10 ### 0.3.10
* Added BCD and Decimal options to the 4 bit output display, as well as bit labels in inputs * Added BCD and Decimal options to the 4 bit output display, as well as bit labels in inputs

View File

@ -339,6 +339,21 @@ textarea {
padding: 5px; padding: 5px;
} }
.TOOLBOX_CATEGORY_BODY input {
font-size: 0.9em;
padding: 1px;
text-shadow: 0 1px 0 rgba(180, 180, 180, 0.4),
1px 0 0 rgba(180, 180, 180, 0.4);
/* Permalink - use to edit and share this gradient: https://colorzilla.com/gradient-editor/#f5f6f6+0,dbdce2+21,b8bac6+49,dddfe3+80,f5f6f6+100;Grey+Pipe */
background: rgb(245,246,246); /* Old browsers */
background: -moz-linear-gradient(top, rgba(245,246,246,1) 0%, rgba(219,220,226,1) 21%, rgba(184,186,198,1) 49%, rgba(221,223,227,1) 80%, rgba(245,246,246,1) 100%); /* FF3.6-15 */
background: -webkit-linear-gradient(top, rgba(245,246,246,1) 0%,rgba(219,220,226,1) 21%,rgba(184,186,198,1) 49%,rgba(221,223,227,1) 80%,rgba(245,246,246,1) 100%); /* Chrome10-25,Safari5.1-6 */
background: linear-gradient(to bottom, rgba(245,246,246,1) 0%,rgba(219,220,226,1) 21%,rgba(184,186,198,1) 49%,rgba(221,223,227,1) 80%,rgba(245,246,246,1) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f6f6', endColorstr='#f5f6f6',GradientType=0 ); /* IE6-9 */
}
#darkout-overlay { #darkout-overlay {
position: absolute; position: absolute;
left: 0px; left: 0px;

View File

@ -26,6 +26,7 @@
<div id="WelcomeWindow"> <div id="WelcomeWindow">
<h2>MatCat BrowserLogic Engine</h2> <h2>MatCat BrowserLogic Engine</h2>
<p>Welcome to logic.parts, a free to use logic simulator for anyone to use. This is opensource software, you can find the project at <a href="https://www.mygit.space/MatCat.OpenSource/BrowserLogic">https://www.mygit.space/MatCat.OpenSource/BrowserLogic</a>. This is an early development project, so expect bugs and some things to not work :) If you would like to contribute please feel free to find me on IRC on Freenode in channel #LogicParts.</p> <p>Welcome to logic.parts, a free to use logic simulator for anyone to use. This is opensource software, you can find the project at <a href="https://www.mygit.space/MatCat.OpenSource/BrowserLogic">https://www.mygit.space/MatCat.OpenSource/BrowserLogic</a>. This is an early development project, so expect bugs and some things to not work :) If you would like to contribute please feel free to find me on IRC on Freenode in channel #LogicParts.</p>
<p><span style="font-weight: bold; font-size: 1.2em;">Now on Version 0.4!</span> This new version brings an improved UI, panning, more settings options, and much more!</p>
<input type="button" id="btn_CloseWelcome" value="Simulate Some Logic!"><br /> <input type="button" id="btn_CloseWelcome" value="Simulate Some Logic!"><br />
<input type="checkbox" id="chk_dontDisplayWelcome" name="chk_dontDisplayWelcome" value="1"> <input type="checkbox" id="chk_dontDisplayWelcome" name="chk_dontDisplayWelcome" value="1">
<label for="chk_dontDisplayWelcome">Don't show welcome window again</label> <label for="chk_dontDisplayWelcome">Don't show welcome window again</label>
@ -42,24 +43,24 @@
<li id="tfm_New">New</li> <li id="tfm_New">New</li>
<li id="tfm_Open">Open</li> <li id="tfm_Open">Open</li>
<li id="tfm_Save">Save</li> <li id="tfm_Save">Save</li>
<li id="tfm_SaveAs" class="disabled">Save As</li> <li id="tfm_SaveAs" class="disabled" title="Feature coming soon">Save As</li>
</ul> </ul>
</div> </div>
</li> </li>
<li id="tm_Edit" class="top-menu-item">Edit <li id="tm_Edit" class="top-menu-item">Edit
<div id="tm_EditMenu" class="top-menu-div"> <div id="tm_EditMenu" class="top-menu-div">
<ul> <ul>
<li id="tfm_Undo" class="disabled">Undo</li> <li id="tfm_Undo" class="disabled" title="Feature coming soon">Undo</li>
<li id="tfm_Redo" class="disabled">Redo</li> <li id="tfm_Redo" class="disabled" title="Feature coming soon">Redo</li>
<li class="tfm_seperator"></li> <li class="tfm_seperator"></li>
<li id="tfm_Cut" class="disabled">Cut</li> <li id="tfm_Cut" class="disabled" title="Feature coming soon">Cut</li>
<li id="tfm_Copy" class="disabled">Copy</li> <li id="tfm_Copy" class="disabled" title="Feature coming soon">Copy</li>
<li id="tfm_Paste" class="disabled">Paste</li> <li id="tfm_Paste" class="disabled" title="Feature coming soon">Paste</li>
<li class="tfm_seperator"></li> <li class="tfm_seperator"></li>
<li id="tfm_Delete" class="disabled">Delete</li> <li id="tfm_Delete" class="disabled">Delete</li>
<li id="tfm_Disconnect" class="disabled">Disconnect</li> <li id="tfm_Disconnect" class="disabled">Disconnect</li>
<li class="tfm_seperator"></li> <li class="tfm_seperator"></li>
<li id="tfm_SelectAll">Select All</li> <li id="tfm_SelectAll" class="disabled" title="Feature coming soon">Select All</li>
</ul> </ul>
</div> </div>
</li> </li>
@ -68,16 +69,21 @@
<ul> <ul>
<li id="tfm_Pan2Center">Pan to Center</li> <li id="tfm_Pan2Center">Pan to Center</li>
<li class="tfm_seperator"></li> <li class="tfm_seperator"></li>
<li id="tfm_ShowConnections">Show Connections <span></span></li>
<li id="tfm_ConnectionLayer">Connections Below</li>
<li class="tfm_seperator"></li>
<li id="tfm_ShowGrid">Show Grid <span></span></li> <li id="tfm_ShowGrid">Show Grid <span></span></li>
<li id="tfm_SnapGrid">Snap to Grid <span></span></li> <li id="tfm_SnapGrid">Snap to Grid <span></span></li>
<li id="tfm_GridSize">Grid Size <input type="number" id="in_GridSize" value="20" min="2" max="100" style="margin-left: 10px; width: 40px;"></li> <li id="tfm_GridSize">Grid Size <input type="number" id="in_GridSize" value="20" min="2" max="100" style="margin-left: 10px; width: 40px;"></li>
<li class="tfm_seperator"></li>
<li id="tfm_ShowFPS">Show FPS <span></span></li>
</ul> </ul>
</div> </div>
</li> </li>
<li id="tm_Tools" class="top-menu-item">Tools <li id="tm_Tools" class="top-menu-item">Tools
<div id="tm_ToolsMenu" class="top-menu-div"> <div id="tm_ToolsMenu" class="top-menu-div">
<ul> <ul>
<li id="tfm_CreateIC" class="disabled">Create IC</li> <li id="tfm_CreateIC" class="disabled" title="Turn the current design into an IC, must have atleast one IC Output to create">Create IC</li>
</ul> </ul>
</div> </div>
</li> </li>

View File

@ -80,6 +80,17 @@ class elementContainer {
this.ICOutputs = 0; this.ICOutputs = 0;
} }
isHigh(element,input) {
let isHigh = false;
for (let a = 0; a < this.Elements.length; a++) {
let conn = this.Elements[a].ConnectsTo(element,input);
if (conn !== false) {
if (this.Elements[a].getOutput(conn)) isHigh = true;
}
}
return isHigh;
}
toJSON(key) { toJSON(key) {
let elements = new Array(); let elements = new Array();
for (let a = 0; a < this.Elements.length; a++) { for (let a = 0; a < this.Elements.length; a++) {
@ -140,6 +151,14 @@ class elementContainer {
DrawAll(ctx,settings) { DrawAll(ctx,settings) {
let ICOuts = 0; let ICOuts = 0;
if (!logicEngine.Settings.TopConnections && !logicEngine.Settings.HideConnections) {
for (let a = 0; a < this.Elements.length; a++) {
// Not ideal to loop twice but we need the connections drawn all at once to prevent layer issues
this.Elements[a].drawConnections(ctx, settings);
}
}
for (let a = 0; a < this.Elements.length; a++) { for (let a = 0; a < this.Elements.length; a++) {
if (this.Elements[a] instanceof ICOutput) ICOuts++; if (this.Elements[a] instanceof ICOutput) ICOuts++;
if (this.Elements[a].isVisible()) { if (this.Elements[a].isVisible()) {
@ -156,9 +175,11 @@ class elementContainer {
if (PropertiesBox.style.display != "none") PropertiesBox.style.display = "none"; if (PropertiesBox.style.display != "none") PropertiesBox.style.display = "none";
} }
for (let a = 0; a < this.Elements.length; a++) { if (logicEngine.Settings.TopConnections && !logicEngine.Settings.HideConnections) {
// Not ideal to loop twice but we need the connections drawn all at once to prevent layer issues for (let a = 0; a < this.Elements.length; a++) {
this.Elements[a].drawConnections(ctx, settings); // Not ideal to loop twice but we need the connections drawn all at once to prevent layer issues
this.Elements[a].drawConnections(ctx, settings);
}
} }
} }

View File

@ -76,7 +76,7 @@ class ElementConnection {
class Element extends CanvasTools { class Element extends CanvasTools {
constructor(RestoreData = null,logicengine,Inputs) { constructor(_Container,RestoreData = null,logicengine,Inputs) {
super(); super();
this.Name = "Element"; this.Name = "Element";
this.Designator = ""; this.Designator = "";
@ -97,6 +97,7 @@ class Element extends CanvasTools {
this.OutputLabels = new Array(1); this.OutputLabels = new Array(1);
this.NoOutput = false; this.NoOutput = false;
this.OutputLink = 0; this.OutputLink = 0;
this._Container = _Container;
let inputProperty = new ElementProperty("Inputs","int",{CBObject: this,CBFunction: "ChangeInputs"},2,Inputs,false,2); let inputProperty = new ElementProperty("Inputs","int",{CBObject: this,CBFunction: "ChangeInputs"},2,Inputs,false,2);
this.Properties.push(inputProperty); this.Properties.push(inputProperty);
@ -120,25 +121,42 @@ class Element extends CanvasTools {
} }
} }
ConnectsTo(element,input = false) {
for (let a = 0; a < this.OutputConnections.length; a++) {
if (this.OutputConnections[a].Element == element || this.OutputConnections[a].Element.Designator == element) {
if (input !== false) {
if (this.OutputConnections[a].Input == input) return this.OutputConnections[a].Output;
} else {
return 0;
}
}
}
return false;
}
isVisible() { isVisible() {
let isvisible = false; let isvisible = false;
let LeftX = this.LogicEngine.Panning.OffsetX; if (this.LogicEngine) {
if (LeftX < 0) { let LeftX = this.LogicEngine.Panning.OffsetX;
LeftX = Math.abs(LeftX); if (LeftX < 0) {
} else { LeftX = Math.abs(LeftX);
LeftX = -Math.abs(LeftX); } else {
LeftX = -Math.abs(LeftX);
}
let RightX = LeftX + this.LogicEngine.Canvas.width;
let TopY = this.LogicEngine.Panning.OffsetY;
if (TopY < 0) {
TopY = Math.abs(TopY);
} else {
TopY = -Math.abs(TopY);
}
let BottomY = TopY + this.LogicEngine.Canvas.height;
if (((this.X + this.Width) >= LeftX) && ((this.X) <= RightX) && ((this.Y + this.Height) >= TopY) && ((this.Y) <= BottomY)) isvisible = true;
} }
let RightX = LeftX + this.LogicEngine.Canvas.width;
let TopY = this.LogicEngine.Panning.OffsetY;
if (TopY < 0) {
TopY = Math.abs(TopY);
} else {
TopY = -Math.abs(TopY);
}
let BottomY = TopY + this.LogicEngine.Canvas.height;
if (((this.X + this.Width) >= LeftX) && ((this.X) <= RightX) && ((this.Y + this.Height) >= TopY) && ((this.Y) <= BottomY)) isvisible = true;
return isvisible; return isvisible;
} }
toJSON(key) { toJSON(key) {
return { return {
Name: this.Name, Name: this.Name,
@ -195,8 +213,10 @@ class Element extends CanvasTools {
for (let a = 0; a < this.OutputConnections.length; a++) { for (let a = 0; a < this.OutputConnections.length; a++) {
if (this.OutputConnections[a].Element == element) { if (this.OutputConnections[a].Element == element) {
this.LogicEngine.RecursionCount = 0; this.LogicEngine.RecursionCount = 0;
this.OutputConnections[a].Element.setInput(this.OutputConnections[a].Input, false); let element = this.OutputConnections[a].Element;
let input = this.OutputConnections[a].Input;
this.OutputConnections.splice(a,1); this.OutputConnections.splice(a,1);
element.setInput(input, false);
a--; a--;
} }
} }
@ -259,7 +279,6 @@ class Element extends CanvasTools {
firstY+ (a*24), firstY+ (a*24),
ctxMousePos.x, ctxMousePos.x,
ctxMousePos.y); ctxMousePos.y);
console.log("Distance from " + a + ": " + mouseDist);
if (mouseDist <= (this.outputCircleRadius)) { if (mouseDist <= (this.outputCircleRadius)) {
this.OutputLink = {Output: a,x: this.X+(this.Width-10), y: firstY+ (a*24)}; this.OutputLink = {Output: a,x: this.X+(this.Width-10), y: firstY+ (a*24)};
this.LogicEngine.Link(); this.LogicEngine.Link();
@ -414,6 +433,9 @@ class Element extends CanvasTools {
} else { } else {
return; return;
} }
let isHigh = this._Container.isHigh(this,Input);
if (isHigh !== false) this.Inputs[Input] = true;
if (isHigh === false) this.Inputs[Input] = false;
this.setConnections(); this.setConnections();
} }
@ -437,8 +459,8 @@ class Element extends CanvasTools {
} }
class LabelElement extends Element { class LabelElement extends Element {
constructor(RestoreData = null,logicengine) { constructor(_Container, RestoreData = null,logicengine) {
super(RestoreData,logicengine,0); super(_Container, RestoreData,logicengine,0);
this.removeProperty("Inputs"); this.removeProperty("Inputs");
this.Name = "Label"; this.Name = "Label";
this.Font = "48px Console"; this.Font = "48px Console";
@ -485,7 +507,7 @@ class LabelElement extends Element {
this.drawTextCentered(ctx,x,y,textWidth.width,textWidth.height,this.Label,this.Font,this.FontStyle); this.drawTextCentered(ctx,x,y,textWidth.width,textWidth.height,this.Label,this.Font,this.FontStyle);
} }
} }
let ElementCatalog_Label = new ElementCatalog_Element("Label","Allows you to place a label","abc",LabelElement,[]); let ElementCatalog_Label = new ElementCatalog_Element("Label","Allows you to place a label","🏷",LabelElement,[]);
ElementReferenceTable.push(ElementCatalog_Label); ElementReferenceTable.push(ElementCatalog_Label);
ElementCategory_Other.addElement(ElementCatalog_Label); ElementCategory_Other.addElement(ElementCatalog_Label);
@ -497,8 +519,8 @@ class ICInput extends Element {
this.Output = false; this.Output = false;
} }
constructor(RestoreData = null,logicengine) { constructor(_Container, RestoreData = null,logicengine) {
super(RestoreData ,logicengine,0); super(_Container, RestoreData ,logicengine,0);
this.removeProperty("Inputs"); this.removeProperty("Inputs");
this.Task = new Task("ICInputTask","CLOCK",0,1,this.ClockTick.bind(this)); this.Task = new Task("ICInputTask","CLOCK",0,1,this.ClockTick.bind(this));
this.Name = "ICInput"; this.Name = "ICInput";
@ -526,8 +548,9 @@ class ICInput extends Element {
setInput(notused = 0,value) { setInput(notused = 0,value) {
if (notused > 0) return; if (notused > 0) return;
if (!value) this.Input = false;
if (value) this.Input = true; if (value === false) this.Input = false;
if (value !== false) this.Input = true;
if (!this.Task.Enabled) { if (!this.Task.Enabled) {
this.Task.LastCall = 0; this.Task.LastCall = 0;
@ -577,8 +600,8 @@ class ICOutput extends Element {
this.Output = false; this.Output = false;
} }
constructor(RestoreData = null,logicengine) { constructor(_Container, RestoreData = null,logicengine) {
super(RestoreData ,logicengine,1); super(_Container, RestoreData ,logicengine,1);
this.removeProperty("Inputs"); this.removeProperty("Inputs");
this.Task = new Task("ICOutputTask","CLOCK",0,1,this.ClockTick.bind(this)); this.Task = new Task("ICOutputTask","CLOCK",0,1,this.ClockTick.bind(this));
this.Name = "ICOutput"; this.Name = "ICOutput";
@ -607,12 +630,12 @@ class ICOutput extends Element {
setInput(notused = 0,value) { setInput(notused = 0,value) {
if (notused > 0) return; if (notused > 0) return;
if (!value) this.Input = false; value = this._Container.isHigh(this,0);
if (value) this.Input = true; if (value === false) this.Input = false;
if (value !== false) this.Input = true;
this.Inputs[0] = this.Input; this.Inputs[0] = this.Input;
if (!this.Task.Enabled) { if (!this.Task.Enabled) {
console.log("Starting timer");
this.Task.LastCall = 0; this.Task.LastCall = 0;
this.Task.Enabled = true; this.Task.Enabled = true;
} }
@ -657,7 +680,7 @@ ElementReferenceTable.push(ElementCatalog_ICOutput);
ElementCategory_ICs.addElement(ElementCatalog_ICOutput); ElementCategory_ICs.addElement(ElementCatalog_ICOutput);
class ICElement extends Element { class ICElement extends Element {
constructor(RestoreData = null, logicengine,ICSettings = null) { constructor(_Container, RestoreData = null, logicengine,ICSettings = null) {
let newContainer = false; let newContainer = false;
@ -686,7 +709,7 @@ class ICElement extends Element {
let totalInputs = ICSettings.Inputs.length; let totalInputs = ICSettings.Inputs.length;
let totalOutputs = ICSettings.Outputs.length; let totalOutputs = ICSettings.Outputs.length;
super(RestoreData, logicengine, totalInputs); super(_Container, RestoreData, logicengine, totalInputs);
this.removeProperty("Inputs"); this.removeProperty("Inputs");
this.ICBlueprint = icContainer; this.ICBlueprint = icContainer;
this.Outputs = ICSettings.Outputs; this.Outputs = ICSettings.Outputs;
@ -715,10 +738,28 @@ class ICElement extends Element {
return superjson; return superjson;
} }
Disconnect(element = false) {
super.Disconnect(element);
if (element) {
for (let a = 0; a < this.Outputs.length; a++) {
if (this.Outputs[a].toElement == element || this.Outputs[a].fromElement == element) {
if (this.Outputs[a].toElement == element) {
// It's a too element, we need to tell it we are not high anymore
} else {
// Its a from element, we need to tell it's too element
}
}
}
} else {
// We are disconnecting all of our own connections
for (let a = 0; a < this.Outputs.length; a++) {
}
}
}
addConnection(container, element, input, output = 0) { addConnection(container, element, input, output = 0) {
console.log("IC Add Connection " + element.Designator + " I:" + input + " O:"+output);
super.addConnection(container, element, input, output); super.addConnection(container, element, input, output);
console.log(this.OutputConnections);
this.Outputs[output].toElementContainer = container; this.Outputs[output].toElementContainer = container;
this.Outputs[output].toElement = element; this.Outputs[output].toElement = element;
this.Outputs[output].Input = input; this.Outputs[output].Input = input;
@ -728,7 +769,7 @@ class ICElement extends Element {
setInput(Input, Value) { setInput(Input, Value) {
if (this.InputConnections.length >= Input) { if (this.InputConnections.length >= Input) {
// No need to worry about recursion as this goes to an input element which is buffered // No need to worry about recursion as this goes to an input element which is buffered
this.Inputs[Input] = Value; this.Inputs[Input] = (Value === false) ? false : true;
//console.log("Calling " + this.InputConnections[Input].toElement.Designator); //console.log("Calling " + this.InputConnections[Input].toElement.Designator);
this.InputConnections[Input].toElement.setInput(this.InputConnections[Input].Input,Value); this.InputConnections[Input].toElement.setInput(this.InputConnections[Input].Input,Value);
} }
@ -824,7 +865,9 @@ class ClockElement extends Element {
} }
setInput(Input, Value) { setInput(Input, Value) {
console.log(this.Designator + " got told to set " + Input + " to value " + Value);
super.setInput(Input, Value); super.setInput(Input, Value);
if (!this.Inputs[0]) { if (!this.Inputs[0]) {
this.Output = false; this.Output = false;
this.Task.LastCall = 0; this.Task.LastCall = 0;
@ -838,8 +881,8 @@ class ClockElement extends Element {
} }
} }
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine,1); super(_Container, RestoreData,logicengine,1);
this.removeProperty("Inputs"); this.removeProperty("Inputs");
this.Name = "Clock"; this.Name = "Clock";
this.Period = 1000; this.Period = 1000;
@ -937,8 +980,10 @@ class PulseElement extends Element {
setInput(Input, Value) { setInput(Input, Value) {
if (Input > 0) return; if (Input > 0) return;
Value = this._Container.isHigh(this,Input);
//super.setInput(Input, Value); //super.setInput(Input, Value);
this.Inputs[Input] = Value; this.Inputs[Input] = (Value === false) ? false : true;
if (this.Inputs[0] && !this.Task.Enabled) { if (this.Inputs[0] && !this.Task.Enabled) {
this.Output = true; this.Output = true;
for (let a = 0; a < this.OutputConnections.length;a++) { for (let a = 0; a < this.OutputConnections.length;a++) {
@ -950,8 +995,8 @@ class PulseElement extends Element {
} }
} }
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine,1); super(_Container, RestoreData,logicengine,1);
this.removeProperty("Inputs"); this.removeProperty("Inputs");
this.Name = "Pulse"; this.Name = "Pulse";
this.Period = 100; this.Period = 100;
@ -1058,7 +1103,8 @@ class DelayElement extends Element {
setInput(Input, Value) { setInput(Input, Value) {
if (Input > 0) return; if (Input > 0) return;
if (this.Inputs[Input] == Value) return; Value = this._Container.isHigh(this,Input);
if (this.Inputs[Input] == (Value === false) ? false : true) return;
//super.setInput(Input, Value); //super.setInput(Input, Value);
this.Inputs[Input] = Value; this.Inputs[Input] = Value;
if (this.Inputs[0] && !this.Task.Enabled) { if (this.Inputs[0] && !this.Task.Enabled) {
@ -1094,8 +1140,8 @@ class DelayElement extends Element {
} }
} }
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine,1); super(_Container, RestoreData,logicengine,1);
this.removeProperty("Inputs"); this.removeProperty("Inputs");
this.Name = "Delay"; this.Name = "Delay";
this.Period = 100; this.Period = 100;
@ -1164,8 +1210,8 @@ ElementReferenceTable.push(ElementCatalog_DELAY);
ElementCategory_Timing.addElement(ElementCatalog_DELAY); ElementCategory_Timing.addElement(ElementCatalog_DELAY);
class output4bitDisplay extends Element { class output4bitDisplay extends Element {
constructor(RestoreData = null,logicengine) { constructor(_Container, RestoreData = null,logicengine) {
super(RestoreData,logicengine,4); super(_Container, RestoreData,logicengine,4);
this.Name = "4B Display"; this.Name = "4B Display";
this.Output = false; this.Output = false;
this.OutputChar = "0"; this.OutputChar = "0";
@ -1206,7 +1252,8 @@ class output4bitDisplay extends Element {
} }
setInput(Input, Value) { setInput(Input, Value) {
this.Inputs[Input] = (Value) ? 1 : 0; Value = this._Container.isHigh(this,Input);
this.Inputs[Input] = (Value !== false) ? 1 : 0;
let outchar = (this.Inputs[0] << 3) + (this.Inputs[1] << 2) + (this.Inputs[2] << 1) + (this.Inputs[3]); let outchar = (this.Inputs[0] << 3) + (this.Inputs[1] << 2) + (this.Inputs[2] << 1) + (this.Inputs[3]);
this.OutputChar = (outchar); this.OutputChar = (outchar);
@ -1259,8 +1306,8 @@ ElementCategory_Outputs.addElement(ElementCatalog_Output_4BDisplay);
class inputElement extends Element { class inputElement extends Element {
constructor(RestoreData = null,logicengine) { constructor(_Container, RestoreData = null,logicengine) {
super(RestoreData,logicengine,0); super(_Container, RestoreData,logicengine,0);
this.Name = "InputElement"; this.Name = "InputElement";
this.Output = false; this.Output = false;
this.Width = 100; this.Width = 100;
@ -1279,8 +1326,8 @@ class inputElement extends Element {
} }
class InputSwitch extends inputElement { class InputSwitch extends inputElement {
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine); super(_Container, RestoreData,logicengine);
this.Name = "Switch"; this.Name = "Switch";
this.Height = 70; this.Height = 70;
if (RestoreData) this.Output = RestoreData.Output; if (RestoreData) this.Output = RestoreData.Output;
@ -1318,8 +1365,8 @@ ElementReferenceTable.push(ElementCatalog_SWITCH);
ElementCategory_Inputs.addElement(ElementCatalog_SWITCH); ElementCategory_Inputs.addElement(ElementCatalog_SWITCH);
class InputButton extends inputElement { class InputButton extends inputElement {
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine); super(_Container, RestoreData,logicengine);
this.Name = "Button"; this.Name = "Button";
this.Height = 70; this.Height = 70;
} }
@ -1362,8 +1409,8 @@ ElementReferenceTable.push(ElementCatalog_BUTTON);
ElementCategory_Inputs.addElement(ElementCatalog_BUTTON); ElementCategory_Inputs.addElement(ElementCatalog_BUTTON);
class FlipFlopJK extends Element { class FlipFlopJK extends Element {
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine,3); super(_Container, RestoreData,logicengine,3);
this.Name = "JK-FF"; this.Name = "JK-FF";
this.Outputs = new Array(2); this.Outputs = new Array(2);
this.InputLabels = new Array("J","CLK","K"); this.InputLabels = new Array("J","CLK","K");
@ -1385,6 +1432,8 @@ class FlipFlopJK extends Element {
setInput(Input, Value) { setInput(Input, Value) {
if (Input >= this.Inputs.length) return false; if (Input >= this.Inputs.length) return false;
Value = this._Container.isHigh(this,Input);
if (Value !== false) Value = true;
let oldOutput = this.Outputs[0]; let oldOutput = this.Outputs[0];
let oldOutput2 = this.Outputs[1]; let oldOutput2 = this.Outputs[1];
this.Inputs[Input] = Value; this.Inputs[Input] = Value;
@ -1419,13 +1468,13 @@ class FlipFlopJK extends Element {
this.drawOutputs(ctx,x,y); this.drawOutputs(ctx,x,y);
} }
} }
let ElementCatalog_JKFlipFlop = new ElementCatalog_Element("JK-FF","The JK Flip-Flop is a common type of flip-flop that allows for either setting in a specific state, or toggling state.","JK",FlipFlopJK,[]); let ElementCatalog_JKFlipFlop = new ElementCatalog_Element("JK-FF","The JK Flip-Flop is a common type of flip-flop that allows for either setting in a specific state, or toggling state.","",FlipFlopJK,[]);
ElementReferenceTable.push(ElementCatalog_JKFlipFlop); ElementReferenceTable.push(ElementCatalog_JKFlipFlop);
ElementCategory_FlipFlop.addElement(ElementCatalog_JKFlipFlop); ElementCategory_FlipFlop.addElement(ElementCatalog_JKFlipFlop);
class FlipFlopSR extends Element { class FlipFlopSR extends Element {
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine,3); super(_Container, RestoreData,logicengine,3);
this.Name = "SR-FF"; this.Name = "SR-FF";
this.Outputs = new Array(2); this.Outputs = new Array(2);
this.InputLabels = new Array("S","CLK","R"); this.InputLabels = new Array("S","CLK","R");
@ -1447,6 +1496,8 @@ class FlipFlopSR extends Element {
setInput(Input, Value) { setInput(Input, Value) {
if (Input >= this.Inputs.length) return false; if (Input >= this.Inputs.length) return false;
Value = this._Container.isHigh(this,Input);
if (Value !== false) Value = true;
let oldOutput = this.Outputs[0]; let oldOutput = this.Outputs[0];
let oldOutput2 = this.Outputs[1]; let oldOutput2 = this.Outputs[1];
this.Inputs[Input] = Value; this.Inputs[Input] = Value;
@ -1477,13 +1528,13 @@ class FlipFlopSR extends Element {
this.drawOutputs(ctx,x,y); this.drawOutputs(ctx,x,y);
} }
} }
let ElementCatalog_SRFlipFlop = new ElementCatalog_Element("SR-FF","The SR Flip-Flop is a common type of flip-flop that allows for either setting, or resetting the output state.","SR",FlipFlopSR,[]); let ElementCatalog_SRFlipFlop = new ElementCatalog_Element("SR-FF","The SR Flip-Flop is a common type of flip-flop that allows for either setting, or resetting the output state.","",FlipFlopSR,[]);
ElementReferenceTable.push(ElementCatalog_SRFlipFlop); ElementReferenceTable.push(ElementCatalog_SRFlipFlop);
ElementCategory_FlipFlop.addElement(ElementCatalog_SRFlipFlop); ElementCategory_FlipFlop.addElement(ElementCatalog_SRFlipFlop);
class FlipFlopT extends Element { class FlipFlopT extends Element {
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine,2); super(_Container, RestoreData,logicengine,2);
this.Name = "T-FF"; this.Name = "T-FF";
this.Outputs = new Array(2); this.Outputs = new Array(2);
this.InputLabels = new Array("T","CLK"); this.InputLabels = new Array("T","CLK");
@ -1505,6 +1556,8 @@ class FlipFlopT extends Element {
setInput(Input, Value) { setInput(Input, Value) {
if (Input >= this.Inputs.length) return false; if (Input >= this.Inputs.length) return false;
Value = this._Container.isHigh(this,Input);
if (Value !== false) Value = true;
let oldOutput = this.Outputs[0]; let oldOutput = this.Outputs[0];
let oldOutput2 = this.Outputs[1]; let oldOutput2 = this.Outputs[1];
this.Inputs[Input] = Value; this.Inputs[Input] = Value;
@ -1528,13 +1581,13 @@ class FlipFlopT extends Element {
this.drawOutputs(ctx,x,y); this.drawOutputs(ctx,x,y);
} }
} }
let ElementCatalog_TFlipFlop = new ElementCatalog_Element("T-FF","The T Flip-Flop is a common type of flip-flop that toggles the output when T is high and CLK goes high.","T",FlipFlopT,[]); let ElementCatalog_TFlipFlop = new ElementCatalog_Element("T-FF","The T Flip-Flop is a common type of flip-flop that toggles the output when T is high and CLK goes high.","",FlipFlopT,[]);
ElementReferenceTable.push(ElementCatalog_TFlipFlop); ElementReferenceTable.push(ElementCatalog_TFlipFlop);
ElementCategory_FlipFlop.addElement(ElementCatalog_TFlipFlop); ElementCategory_FlipFlop.addElement(ElementCatalog_TFlipFlop);
class FlipFlopD extends Element { class FlipFlopD extends Element {
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine,2); super(_Container, RestoreData,logicengine,2);
this.Name = "D-FF"; this.Name = "D-FF";
this.Outputs = new Array(2); this.Outputs = new Array(2);
this.InputLabels = new Array("D","CLK"); this.InputLabels = new Array("D","CLK");
@ -1556,6 +1609,8 @@ class FlipFlopD extends Element {
setInput(Input, Value) { setInput(Input, Value) {
if (Input >= this.Inputs.length) return false; if (Input >= this.Inputs.length) return false;
Value = this._Container.isHigh(this,Input);
if (Value !== false) Value = true;
let oldOutput = this.Outputs[0]; let oldOutput = this.Outputs[0];
let oldOutput2 = this.Outputs[1]; let oldOutput2 = this.Outputs[1];
let oldInput = this.Inputs[1]; let oldInput = this.Inputs[1];
@ -1580,14 +1635,14 @@ class FlipFlopD extends Element {
this.drawOutputs(ctx,x,y); this.drawOutputs(ctx,x,y);
} }
} }
let ElementCatalog_DFlipFlop = new ElementCatalog_Element("D-FF","The D Flip-Flop is a common type of flip-flop that sets the output to equal D if the clock goes high","D",FlipFlopD,[]); let ElementCatalog_DFlipFlop = new ElementCatalog_Element("D-FF","The D Flip-Flop is a common type of flip-flop that sets the output to equal D if the clock goes high","",FlipFlopD,[]);
ElementReferenceTable.push(ElementCatalog_DFlipFlop); ElementReferenceTable.push(ElementCatalog_DFlipFlop);
ElementCategory_FlipFlop.addElement(ElementCatalog_DFlipFlop); ElementCategory_FlipFlop.addElement(ElementCatalog_DFlipFlop);
class LogicAND extends Element { class LogicAND extends Element {
constructor(RestoreData = null, logicengine,Inputs) { constructor(_Container, RestoreData = null, logicengine,Inputs) {
super(RestoreData,logicengine,Inputs); super(_Container, RestoreData,logicengine,Inputs);
this.Name = "AND"; this.Name = "AND";
} }
@ -1629,8 +1684,8 @@ ElementReferenceTable.push(ElementCatalog_AND);
ElementCategory_LOGIC.addElement(ElementCatalog_AND); ElementCategory_LOGIC.addElement(ElementCatalog_AND);
class LogicNAND extends LogicAND { class LogicNAND extends LogicAND {
constructor(RestoreData = null, logicengine,Inputs) { constructor(_Container, RestoreData = null, logicengine,Inputs) {
super(RestoreData,logicengine,Inputs); super(_Container, RestoreData,logicengine,Inputs);
this.Name = "NAND"; this.Name = "NAND";
this.Width = this.Width + 10; this.Width = this.Width + 10;
} }
@ -1681,8 +1736,8 @@ ElementReferenceTable.push(ElementCatalog_NAND);
ElementCategory_LOGIC.addElement(ElementCatalog_NAND); ElementCategory_LOGIC.addElement(ElementCatalog_NAND);
class LogicOR extends Element { class LogicOR extends Element {
constructor(RestoreData = null, logicengine,Inputs) { constructor(_Container, RestoreData = null, logicengine,Inputs) {
super(RestoreData,logicengine,Inputs); super(_Container, RestoreData,logicengine,Inputs);
this.Name = "OR"; this.Name = "OR";
} }
@ -1728,8 +1783,8 @@ ElementReferenceTable.push(ElementCatalog_OR);
ElementCategory_LOGIC.addElement(ElementCatalog_OR); ElementCategory_LOGIC.addElement(ElementCatalog_OR);
class LogicNOR extends LogicOR { class LogicNOR extends LogicOR {
constructor(RestoreData = null, logicengine,Inputs) { constructor(_Container, RestoreData = null, logicengine,Inputs) {
super(RestoreData,logicengine,Inputs); super(_Container, RestoreData,logicengine,Inputs);
this.Name = "NOR"; this.Name = "NOR";
this.Width = this.Width + 10; this.Width = this.Width + 10;
} }
@ -1782,8 +1837,8 @@ ElementReferenceTable.push(ElementCatalog_NOR);
ElementCategory_LOGIC.addElement(ElementCatalog_NOR); ElementCategory_LOGIC.addElement(ElementCatalog_NOR);
class LogicXOR extends Element { class LogicXOR extends Element {
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine,2); // Only 2 inputs on XOR super(_Container, RestoreData,logicengine,2); // Only 2 inputs on XOR
this.Name = "XOR"; this.Name = "XOR";
this.removeProperty("Inputs"); this.removeProperty("Inputs");
} }
@ -1844,8 +1899,8 @@ ElementReferenceTable.push(ElementCatalog_XOR);
ElementCategory_LOGIC.addElement(ElementCatalog_XOR); ElementCategory_LOGIC.addElement(ElementCatalog_XOR);
class LogicXNOR extends Element { class LogicXNOR extends Element {
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine,2); // Only 2 inputs on XOR super(_Container, RestoreData,logicengine,2); // Only 2 inputs on XOR
this.Name = "XNOR"; this.Name = "XNOR";
this.removeProperty("Inputs"); this.removeProperty("Inputs");
this.Width += 10; this.Width += 10;
@ -1918,8 +1973,8 @@ ElementReferenceTable.push(ElementCatalog_XNOR);
ElementCategory_LOGIC.addElement(ElementCatalog_XNOR); ElementCategory_LOGIC.addElement(ElementCatalog_XNOR);
class LogicNOT extends Element { class LogicNOT extends Element {
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine,1); // Only 1 inputs on NOT super(_Container, RestoreData,logicengine,1); // Only 1 inputs on NOT
this.Name = "NOT"; this.Name = "NOT";
this.removeProperty("Inputs"); this.removeProperty("Inputs");
this.Width += 10; this.Width += 10;
@ -1994,6 +2049,8 @@ class LogicBuffer extends Element {
setInput(Input, Value) { setInput(Input, Value) {
if (Input > 0) return; if (Input > 0) return;
//super.setInput(Input, Value); //super.setInput(Input, Value);
Value = this._Container.isHigh(this,Input);
if (Value !== false) Value = true;
this.Inputs[Input] = Value; this.Inputs[Input] = Value;
if (!this.Task.Enabled) { if (!this.Task.Enabled) {
this.Task.LastCall = 0; this.Task.LastCall = 0;
@ -2001,8 +2058,8 @@ class LogicBuffer extends Element {
} }
} }
constructor(RestoreData = null, logicengine) { constructor(_Container, RestoreData = null, logicengine) {
super(RestoreData,logicengine,1); super(_Container, RestoreData,logicengine,1);
this.removeProperty("Inputs"); this.removeProperty("Inputs");
this.Output = false; this.Output = false;
this.Name = "Buffer"; this.Name = "Buffer";

View File

@ -1,5 +1,5 @@
function addElement(RestoreData = null,refClass,props) { function addElement(RestoreData = null,refClass,props) {
let newElement = new refClass(RestoreData,logicEngine,...props); let newElement = new refClass(logicEngine.ActiveContainer,RestoreData,logicEngine,...props);
if (!RestoreData) { if (!RestoreData) {
let x = Math.round(logicEngine.Canvas.width / 2) - (newElement.Width/2); let x = Math.round(logicEngine.Canvas.width / 2) - (newElement.Width/2);
@ -32,6 +32,7 @@ function addElement(RestoreData = null,refClass,props) {
} }
logicEngine.ActiveContainer.AddElement(newElement); logicEngine.ActiveContainer.AddElement(newElement);
logicEngine.ActiveContainer.Select(newElement); logicEngine.ActiveContainer.Select(newElement);
disableSelectedRCMs(false);
return newElement; return newElement;
} }
@ -173,13 +174,19 @@ function isVersionNewer(version1,version2,orEqual = true) {
function disableSelectedRCMs(bool) { function disableSelectedRCMs(bool) {
let rcm_Delete = document.getElementById("rcm_Delete"); let rcm_Delete = document.getElementById("rcm_Delete");
let rcm_Disconnect = document.getElementById("rcm_Disconnect"); let rcm_Disconnect = document.getElementById("rcm_Disconnect");
let tfm_Delete = document.getElementById("tfm_Delete");
let tfm_Disconnect = document.getElementById("tfm_Disconnect");
if (bool) { if (bool) {
rcm_Delete.classList.add("disabled"); rcm_Delete.classList.add("disabled");
rcm_Disconnect.classList.add("disabled"); rcm_Disconnect.classList.add("disabled");
tfm_Delete.classList.add("disabled");
tfm_Disconnect.classList.add("disabled");
} else { } else {
rcm_Delete.classList.remove("disabled"); rcm_Delete.classList.remove("disabled");
rcm_Disconnect.classList.remove("disabled"); rcm_Disconnect.classList.remove("disabled");
tfm_Delete.classList.remove("disabled");
tfm_Disconnect.classList.remove("disabled");
} }
} }
@ -234,7 +241,7 @@ function loadContainer(Elements) {
} }
let classRef = getElementInfo(Elements[a].Name).Class; let classRef = getElementInfo(Elements[a].Name).Class;
let newElement = new classRef(Elements[a],logicEngine,getElementInfo(Elements[a].Name).Args[0]); let newElement = new classRef(newContainer,Elements[a],logicEngine,getElementInfo(Elements[a].Name).Args[0]);
newContainer.AddElement(newElement); newContainer.AddElement(newElement);
newElement.Designator = Elements[a].Designator; newElement.Designator = Elements[a].Designator;

View File

@ -12,7 +12,10 @@ class LogicEngineSettings {
this.OutputCircleSize = 10; this.OutputCircleSize = 10;
this.ShowGrid = true; this.ShowGrid = true;
this.SnapGrid = true; this.SnapGrid = true;
this.TopConnections = true;
this.HideConnections = false;
this.GridSize = 20; this.GridSize = 20;
this.ShowFPS = true;
} }
} }
@ -57,7 +60,6 @@ class LogicEngine {
} }
Ctx.restore(); Ctx.restore();
} }
console.log("Resized");
} }
PropertyChange(property) { PropertyChange(property) {
@ -274,9 +276,11 @@ class LogicEngine {
this.Ctx.restore(); this.Ctx.restore();
} }
let ct = new CanvasTools(); let ct = new CanvasTools();
let FPSOffset = (this.Canvas.width - 150) - this.Panning.OffsetX; let FPSOffset = 5 - this.Panning.OffsetX;
ct.drawText(this.Ctx,FPSOffset,650- this.Panning.OffsetY,"FPS: " + this.FPS,"12px console", "#00ff00"); if (this.Settings.ShowFPS) {
ct.drawText(this.Ctx,FPSOffset,670- this.Panning.OffsetY,"Potential FPS: " + this.PotentialFPS,"12px console", "#00ff00"); ct.drawText(this.Ctx, FPSOffset, 15 - this.Panning.OffsetY, "FPS: " + this.FPS, "12px console", "#00ff00");
ct.drawText(this.Ctx, FPSOffset, 29 - this.Panning.OffsetY, "Potential FPS: " + Math.floor(this.PotentialFPS), "12px console", "#00ff00");
}
let timeCheck = performance.now(); let timeCheck = performance.now();
this.FPSCounter++; this.FPSCounter++;

View File

@ -132,14 +132,30 @@ rcm_New.addEventListener('click', function(evt) {
let rcm_Delete = document.getElementById("rcm_Delete"); let rcm_Delete = document.getElementById("rcm_Delete");
rcm_Delete.addEventListener('click', function(evt) { rcm_Delete.addEventListener('click', function(evt) {
logicEngine.Key_Press({ctrlKey: false, key: "Delete"}); logicEngine.Key_Press({ctrlKey: false, key: "Delete"});
disableSelectedRCMs(true);
}); });
let tfm_Delete = document.getElementById("tfm_Delete");
tfm_Delete.addEventListener('click', function(evt) {
logicEngine.Key_Press({ctrlKey: false, key: "Delete"});
disableSelectedRCMs(true);
setTimeout(function(){hideMenus()},10);
});
let rcm_Disconect = document.getElementById("rcm_Disconnect"); let rcm_Disconect = document.getElementById("rcm_Disconnect");
rcm_Disconect.addEventListener('click', function(evt) { rcm_Disconect.addEventListener('click', function(evt) {
logicEngine.ActiveContainer.Selected.Disconnect(); logicEngine.ActiveContainer.Selected.Disconnect();
logicEngine.ActiveContainer.Disconnect(logicEngine.ActiveContainer.Selected); logicEngine.ActiveContainer.Disconnect(logicEngine.ActiveContainer.Selected);
}); });
let tfm_Disconect = document.getElementById("tfm_Disconnect");
tfm_Disconect.addEventListener('click', function(evt) {
logicEngine.ActiveContainer.Selected.Disconnect();
logicEngine.ActiveContainer.Disconnect(logicEngine.ActiveContainer.Selected);
setTimeout(function(){hideMenus()},10);
});
let tfm_Save = document.getElementById("tfm_Save"); let tfm_Save = document.getElementById("tfm_Save");
tfm_Save.addEventListener('click', function(evt) { tfm_Save.addEventListener('click', function(evt) {
@ -178,7 +194,7 @@ file_Load.addEventListener('change', function(evt) {
return function (e) { return function (e) {
try { try {
let restoredata = JSON.parse(e.target.result); let restoredata = JSON.parse(e.target.result);
console.log(restoredata);
loadresult = loadsave(restoredata); loadresult = loadsave(restoredata);
if (!loadresult) { if (!loadresult) {
switch(loadresult) { switch(loadresult) {
@ -220,6 +236,48 @@ tfm_About.addEventListener("click", function (evt) {
setTimeout(function(){hideMenus()},10); setTimeout(function(){hideMenus()},10);
}); });
let tfm_ShowConns = document.getElementById("tfm_ShowConnections");
tfm_ShowConns.addEventListener("click", function (evt) {
if (logicEngine.Settings.HideConnections) {
let sgSpan = tfm_ShowConns.getElementsByTagName("span")[0];
sgSpan.innerText = "✓";
logicEngine.Settings.HideConnections = false;
} else {
let sgSpan = tfm_ShowConns.getElementsByTagName("span")[0];
sgSpan.innerText = "";
logicEngine.Settings.HideConnections = true;
}
setTimeout(function(){hideMenus()},10);
});
let tfm_ConnLayer = document.getElementById("tfm_ConnectionLayer");
tfm_ConnLayer.addEventListener("click", function (evt) {
if (logicEngine.Settings.TopConnections) {
tfm_ConnLayer.innerText = "Connections Above";
logicEngine.Settings.TopConnections = false;
} else {
tfm_ConnLayer.innerText = "Connections Below";
logicEngine.Settings.TopConnections = true;
}
setTimeout(function(){hideMenus()},10);
});
let tfm_ShowFPS = document.getElementById("tfm_ShowFPS");
tfm_ShowFPS.addEventListener("click", function (evt) {
if (logicEngine.Settings.ShowFPS) {
let sgSpan = tfm_ShowFPS.getElementsByTagName("span")[0];
sgSpan.innerText = "";
logicEngine.Settings.ShowFPS = false;
} else {
let sgSpan = tfm_ShowFPS.getElementsByTagName("span")[0];
sgSpan.innerText = "✓";
logicEngine.Settings.ShowFPS = true;
}
logicEngine.Resize("");
setTimeout(function(){hideMenus()},10);
});
let tfm_Pan2Center = document.getElementById("tfm_Pan2Center"); let tfm_Pan2Center = document.getElementById("tfm_Pan2Center");
tfm_Pan2Center.addEventListener("click", function (evt) { tfm_Pan2Center.addEventListener("click", function (evt) {
logicEngine.Ctx.setTransform(1,0,0,1,0,0); logicEngine.Ctx.setTransform(1,0,0,1,0,0);
@ -240,7 +298,7 @@ tfm_ShowGrid.addEventListener("click", function (evt) {
logicEngine.Settings.ShowGrid = true; logicEngine.Settings.ShowGrid = true;
} }
logicEngine.Resize(""); logicEngine.Resize("");
//setTimeout(function(){hideMenus()},10); setTimeout(function(){hideMenus()},10);
}); });
let tfm_SnapGrid = document.getElementById("tfm_SnapGrid"); let tfm_SnapGrid = document.getElementById("tfm_SnapGrid");
@ -255,7 +313,7 @@ tfm_SnapGrid.addEventListener("click", function (evt) {
logicEngine.Settings.SnapGrid = true; logicEngine.Settings.SnapGrid = true;
} }
logicEngine.Resize(""); logicEngine.Resize("");
//setTimeout(function(){hideMenus()},10); setTimeout(function(){hideMenus()},10);
}); });
let in_GridSize = document.getElementById("in_GridSize"); let in_GridSize = document.getElementById("in_GridSize");