{"version":3,"sources":["webpack:///src/assets/Shared/Extensions.js","webpack:///src/assets/Shared/MathEx.js","webpack:///src/assets/Shared/Color.js","webpack:///src/assets/Nodegraph/Geometry/Point.js","webpack:///src/assets/Nodegraph/Geometry/Size.js","webpack:///src/assets/Nodegraph/Geometry/Padding.js","webpack:///src/assets/Nodegraph/Geometry/Rectangle.js","webpack:///src/assets/Nodegraph/Path.js","webpack:///src/assets/Nodegraph/Enums.js","webpack:///src/assets/Nodegraph/Settings.js","webpack:///src/assets/Nodegraph/NodeElementPositionData.js","webpack:///src/assets/Nodegraph/Node.js","webpack:///src/assets/Nodegraph/NodeConnector.js","webpack:///src/assets/Nodegraph/NodeConnection.js","webpack:///src/assets/Nodegraph/NodeElement.js","webpack:///src/assets/Nodegraph/Nodegraph.js"],"names":["String","prototype","pad","len","padChar","charAt","this","length","format","args","arguments","replace","match","number","isUpperCase","toUpperCase","isLowerCase","toLowerCase","isDigit","addSpacesBetweenWords","preserveAcronyms","ret","trim","i","char","prev","next","replaceAll","find","replacement","RegExp","startsWith","lastIndexOf","StringHelper","instance","phoneRegEx","emailRegEx","TestRegEx","input","re","requireValue","test","IsValidEmail","IsValidPhone","Number","isBitSet","bit","window","CustomEvent","event","params","eventObj","bubbles","cancelable","detail","document","createEvent","initCustomEvent","Event","MathEx","_degToRad","Math","PI","_radToDeg","Object","defineProperty","get","radToDeg","radians","degToRad","degrees","approxEquals","a","b","tolerance","clamp","epsilon7","epsilon3","epsilon4","abs","value","min","max","clamp01","clampAngle","angle","lerp","from","to","t","distance2D","x1","y1","x2","y2","dx","dy","sqrt","distance2DSq","distance3D","z1","z2","dz","distance3DSq","roundTo","decimals","x","pow","round","EPSILON","smoothStep","wrap","inc","wrapAngle","Color","R","G","B","A","FromString","colorStr","c","Parse","FromHSL","h","s","l","HueToRGB","p","q","FromRGB","r","g","C","start","end","parts","hslColor","substring","parseInt","substr","Length","toFixed","split","parseFloat","ToHexStr","includeAlpha","toString","ToRGBStr","ToRGBAStr","alphaOverride","ToHSLStr","hsl","ToHSL","H","S","L","ToHSLAStr","d","Scale","Point","xVal","yVal","y","cachePt","set","newValue","Copy","CopyTo","dest","X","Y","CopyFrom","src","Equals","point","ApproxEquals","distMargin","Distance","Reset","IsZero","DistanceSq","IsOnLine","p1","p2","px","py","IsOnLineSegment","DistanceToLine","magnitudeSq","u","DistanceToLineSegment","p1Dist","p2Dist","Size","w","width","height","Width","Height","size","IsEmpty","Padding","left","top","right","bottom","Left","Top","Right","Bottom","padding","Inflate","val","Rectangle","position","cacheRect","rect","Intersects","Contains","UnionWith","IntersectWith","Empty","Stroke","context","color","strokeStyle","strokeRect","Fill","fillStyle","fillRect","ToPath","path","Path","AddRectangle","ToRoundedRectPath","radius","corners","AddRoundedRectangle","ToCirclePath","center","Center","maxRadius","AddArc","FromXYWH","xCoord","yCoord","FromLTRB","Union","rect1","rect2","Intersect","points","bounds","pathDirty","autoClose","CalculateBounds","AddPoint","AddPoints","AddLine","AddBezier","HitTest","StartClipToRegion","StartClipToBounds","EndClip","newPoint","push","AddPointsInternal","endPt","Corners","All","rightInset","bottomInset","leftInset","topInset","rSqr","rightLargeInset","bottomLargeInset","TopLeft","TopRight","BottomRight","BottomLeft","cp1","cp2","segments","Bezier","startAngle","endAngle","altSegCount","ceil","RotateAroundOrigin","rad","cos","sin","newPoints","Array","isArray","AddPathToContext","CanvasRenderingContext2D","beginPath","moveTo","lineTo","closePath","save","stroke","restore","fill","distance","paddedBounds","clip","AddBoundsToContext","None","SelectionState","Normal","Selected","Hover","ElementType","Display","Input","Output","Toggle","Default","InteractionState","Panning","Dragging","Selecting","Linking","Disconnecting","ScrollingNode","MouseButtons","Middle","Mouse4","Mouse5","BrowserBack","BrowserForward","MouseButton","SpecialKeys","Ctrl","Alt","Shift","Meta","Windows","Command","ConnectorType","ResizeFlag","Horizontal","Vertical","Both","NodeHitRegion","Node","Checkbox","ScrollbarUpper","ScrollbarLower","ScrollbarThumb","ResizeThumb","Header","InputConnector","OutputConnector","ScrollHighlightState","Background","Thumb","FontSettings","face","lineHeight","bold","italic","css","ColorSettings","HeaderColor","BodyColor","HeaderBGColor","BodyBGColor","BorderColor","SeparatorColor","CheckBorderColor","CheckBackColor","CheckColor","ConnectionColor","ConnectionOutlineColor","NodeSettings","CornerRadius","BorderWidth","CheckSize","CheckPadding","ConnectorSize","ConnectionWidth","ConnectionOutlineWidth","ConnectionHitTestWidth","SeparatorWidth","SeparatorOutset","MinVisibleElements","DefaultVisibleElements","ResizeFlags","ForcedFooterHeight","ScrollbarWidth","BodyPadding","RowPadding","ResizeThumbLineWidth","Colors","ScrollbarBGColor","ScrollbarBGHLColor","ScrollbarThumbColor","ScrollbarThumbHLColor","ScrollbarBorderColor","SelectionRectBGColor","SelectionRectBorderColor","HeaderPadding","HeaderSeparatorWidth","HeaderFont","LineHeight","Bold","BodyFont","NodeElementPositionData","OuterRect","InnerRect","CheckRect","FullTextRect","CheckTextRect","InputConnectorRect","OutputConnectorRect","SeparatorPath","CheckBGPath","CheckPath","FullTextClipPath","CheckTextClipPath","InputConnectorBGPath","InputConnectorPath","OutputConnectorBGPath","OutputConnectorPath","IncludeCheckSpacing","Calculate","nodeSettings","bodyRect","rowHeight","includeCheckSpacing","includeScrollSpacing","floor","AutoClose","parentNodeGraph","nodeId","nodeName","_this","id","name","parent","headerHeight","bodyHeight","hasCheckboxes","hasInputs","hasOutputs","hasScrollbar","headerRect","fullRect","outerRect","headerPath","fullPath","bodyPath","hdrSepPath","resizeThumbRenderPath","resizeThumbHitPath","scrollRect","scrollThumbRect","scrollPath","elements","selectionState","scrollIndex","visibleElements","elementPosData","scrollHighlightState","Invalidate","Position","connectorPath","connectorBGPath","Render","AddElement","GetElementById","GetHitRegion","ToggleCheckAt","GetHoverConnector","UpdateScrollThumb","CalculateNodeSize","preserveVisibleElements","elementTextHeight","maxTextWidth","resizeInset","resizeOffset","Get2DRenderingContext","MeasureString","Type","Name","CalculateVisibleText","color1","color2","colors","translate","lineWidth","textAlign","textBaseline","font","Css","fillText","HoverNode","ScrollCount","elementId","elementName","elementType","elementChecked","element","dispatchEvent","ElementId","FireNodeElementAddingEvent","NodeElement","Element","FireNodeElementAddedEvent","Id","hitPos","Checked","includeInput","includeOutput","offset","pos","index","Nodegraph","Initialize","NodeConnector","parentElement","connectorType","connections","type","Parent","NodeConnection","inputConnector","outputConnector","output","settings","GetPath","dist","hDist","node","graph","ElementPositionData","Bounds","Index","ScrollIndex","HeaderRect","VisibleElements","selState","selCon","GetSelectedConnections","HoverConnection","RenderPartialLink","connector","endPoint","conRect","Graph","parentNode","elementIndex","checked","renderText","FireNameChangedEvent","FireCheckChangingEvent","FireCheckChangedEvent","checkRect","prevName","PreviousName","maxWidth","textWidth","yOffset","renderSettings","conColors","textRect","textClip","HoverConnector","Connections","containerId","container","canvas","canvasRect","ctrlKey","shiftKey","interactionState","mousePos","lastMouse","translation","viewport","lastViewport","clearRect","selectStart","selectEnd","disconnectPt","selectionRect","suppressRendering","selectionDirty","eventListeners","nodes","selectedNodes","prevSelectedNodes","baseNodePositions","selectedConnections","prevSelectedConnections","hoverNode","hoverConnection","hoverConnector","linkStartConnector","currentNodeHitRegion","addEventListener","removeEventListener","AddNode","GetNodeById","GetSelectedNodes","AddConnection","RemoveConnection","GetGraphMetadata","PerformLayout","FireSelectionChangedEvent","attr","getElementById","createElement","createAttribute","setAttribute","clientWidth","clientHeight","appendChild","ConfigureEvents","OnWindowResize","NodeId","FireNodeAddingEvent","FireNodeAddedEvent","connection","ValidateConnection","FireConnectionAddingEvent","FireConnectionAddedEvent","FireValidateConnectionEvent","RemoveNode","cons","FireNodeRemovingEvent","slice","splice","ValidateDisconnection","getContext","str","fontSettings","prevFont","measureText","getBoundingClientRect","imageSmoothingEnabled","imageSmoothingQuality","lineJoin","setTransform","ClearSelection","suppressEvent","fireEvent","shouldInvalidate","SelectNode","keepExisting","DeselectNode","SetHoverNode","UpdateRectSelection","forceUpdate","transformed","UpdateSelection","selected","tmpNodes","metadata","nodeData","con","conData","ScrollOffset","NodeData","SelectedNodes","SelectedConnections","ZIndex","isRenderSuppressed","sort","aIdx","bIdx","OnKeyDown","OnKeyUp","ConsumeEvent","OnMouseMove","OnMouseDown","OnMouseUp","OnMouseEnter","OnMouseLeave","OnMouseWheel","e","preventDefault","stopImmediatePropagation","nc","newHoverConnector","found","clientX","clientY","snapped","DragSelection","ScrollNode","buttons","HasOutputs","focus","button","HasScrollbar","deltaY","key","sel","selectionCount","confirm","DeleteSelection","callback","stack","call","defaultPrevented"],"mappings":"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","file":"scripts.a17f6a476d69f553eb58.js","sourcesContent":["\"use strict\";\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// String\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nif (!String.prototype.pad)\r\n{\r\n String.prototype.pad = function (len, padChar)\r\n {\r\n if (typeof padChar !== \"string\")\r\n padChar = \" \";\r\n else\r\n padChar = padChar.charAt(0);\r\n\r\n return this.length < len ? (padChar + this).pad(len, padChar) : this;\r\n };\r\n}\r\n\r\nif (!String.prototype.format)\r\n{\r\n String.prototype.format = function ()\r\n {\r\n var args = arguments;\r\n return this.replace(/{(\\d+)}/g, function (match, number)\r\n {\r\n return typeof args[number] != \"undefined\" ? args[number] : match;\r\n });\r\n };\r\n}\r\n\r\nif (!String.prototype.isUpperCase)\r\n{\r\n String.prototype.isUpperCase = function ()\r\n {\r\n return this == this.toUpperCase();\r\n };\r\n}\r\n\r\nif (!String.prototype.isLowerCase)\r\n{\r\n String.prototype.isLowerCase = function ()\r\n {\r\n return this == this.toLowerCase();\r\n };\r\n}\r\n\r\nif (!String.prototype.isDigit)\r\n{\r\n String.prototype.isDigit = function ()\r\n {\r\n return (this >= \"0\" && this <= \"9\");\r\n };\r\n}\r\n\r\n// Adds spaces between proper cased words in a string, optionally preserving acronyms\r\nif (!String.prototype.addSpacesBetweenWords)\r\n{\r\n String.prototype.addSpacesBetweenWords = function (preserveAcronyms)\r\n {\r\n var ret;\r\n preserveAcronyms = typeof preserveAcronyms !== \"undefined\" ? preserveAcronyms : true;\r\n\r\n if (this.trim().length == 0)\r\n return \"\";\r\n\r\n ret = this.charAt(0);\r\n for (var i = 1; i < this.length; i++)\r\n {\r\n var char = this.charAt(i);\r\n var prev = this.charAt(i - 1);\r\n var next = i < this.length ? this.charAt(i + 1) : null;\r\n if (char.isUpperCase())\r\n {\r\n if ((prev != \" \" && !prev.isUpperCase())\r\n || (preserveAcronyms && prev.isUpperCase() && i < this.length - 1 && !next.isUpperCase()))\r\n ret += \" \";\r\n }\r\n else if (char.isDigit() && prev != \" \" && !prev.isDigit())\r\n ret += \" \";\r\n ret += char;\r\n }\r\n return ret;\r\n };\r\n}\r\n\r\nif (!String.prototype.replaceAll)\r\n{\r\n String.prototype.replaceAll = function (find, replacement)\r\n {\r\n return this.replace(new RegExp(find.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), 'g'), replacement);\r\n };\r\n}\r\n\r\nif (!String.prototype.startsWith)\r\n{\r\n String.prototype.startsWith = function (find)\r\n {\r\n return this.lastIndexOf(find) == 0;\r\n };\r\n}\r\n\r\nvar StringHelper = (function ()\r\n{\r\n var instance = {};\r\n\r\n var phoneRegEx = /^[\\+]?[(]?[0-9]{3}[)]?[-\\s\\.]?[0-9]{3}[-\\s\\.]?[0-9]{4,6}$/i;\r\n var emailRegEx = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n\r\n var TestRegEx = function (input, re, requireValue)\r\n {\r\n if (typeof re != \"object\")\r\n return false;\r\n if (typeof requireValue != \"boolean\")\r\n requireValue = false;\r\n if (requireValue)\r\n {\r\n if (typeof input != \"string\" || input == null || input.length == 0)\r\n return false;\r\n return re.test(input);\r\n }\r\n else\r\n {\r\n if (input == null || (typeof input == \"string\" && input.length > 0))\r\n return re.test(input);\r\n return true;\r\n }\r\n };\r\n\r\n instance.IsValidEmail = function (input, requireValue)\r\n {\r\n return TestRegEx(input, emailRegEx, requireValue);\r\n };\r\n\r\n instance.IsValidPhone = function (input, requireValue)\r\n {\r\n return TestRegEx(input, phoneRegEx, requireValue);\r\n };\r\n\r\n return instance;\r\n})();\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Number\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nif (!Number.prototype.isBitSet)\r\n{\r\n Number.prototype.isBitSet = function (bit)\r\n {\r\n if (typeof bit != \"number\")\r\n return false;\r\n return (this & bit) == bit;\r\n };\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// CustomEvent Polyfill for IE\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nif (typeof window.CustomEvent != \"function\")\r\n{\r\n const CustomEvent = function (event, params)\r\n {\r\n let eventObj;\r\n\r\n if (typeof params == \"undefined\" || params == null)\r\n {\r\n params = {};\r\n params.bubbles = false;\r\n params.cancelable = false;\r\n params.detail = null;\r\n }\r\n eventObj = document.createEvent(\"CustomEvent\");\r\n eventObj.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\r\n return eventObj;\r\n };\r\n\r\n CustomEvent.prototype = window.Event.prototype;\r\n window.CustomEvent = CustomEvent;\r\n}\r\n","\"use strict\";\r\n\r\nvar MathEx = (function ()\r\n{\r\n const _degToRad = Math.PI / 180.0;\r\n const _radToDeg = 180 / Math.PI;\r\n let instance = {};\r\n Object.defineProperty(instance, \"epsilon3\", { get: function () { return 0.001; } });\r\n Object.defineProperty(instance, \"epsilon4\", { get: function () { return 0.0001; } });\r\n Object.defineProperty(instance, \"epsilon5\", { get: function () { return 0.00001; } });\r\n Object.defineProperty(instance, \"epsilon6\", { get: function () { return 0.000001; } });\r\n Object.defineProperty(instance, \"epsilon7\", { get: function () { return 0.0000001; } });\r\n\r\n instance.radToDeg = function (radians) { return radians * _radToDeg; };\r\n instance.degToRad = function (degrees) { return degrees * _degToRad; };\r\n\r\n instance.approxEquals = function (a, b, tolerance)\r\n {\r\n tolerance = typeof tolerance == \"number\" ? MathEx.clamp(tolerance, MathEx.epsilon7, MathEx.epsilon3) : MathEx.epsilon4;\r\n return Math.abs(a - b) < tolerance;\r\n };\r\n\r\n instance.clamp = function (value, min, max)\r\n {\r\n if (max < min)\r\n throw \"Max cannot be < min\";\r\n\r\n if (value < min)\r\n return min;\r\n else if (value > max)\r\n return max;\r\n return value;\r\n };\r\n\r\n instance.clamp01 = function (value)\r\n {\r\n if (value < 0)\r\n return 0;\r\n else if (value > 1)\r\n return 1;\r\n return value;\r\n };\r\n\r\n instance.clampAngle = function (angle, min, max)\r\n {\r\n min = typeof min == \"number\" ? min : -360;\r\n max = typeof max == \"number\" ? max : 360;\r\n if (angle < -360.0)\r\n {\r\n while (angle < -360.0)\r\n angle += 360.0;\r\n }\r\n if (angle > 360.0)\r\n {\r\n while (angle > 360.0)\r\n angle -= 360.0;\r\n }\r\n return MathEx.clamp(angle, min, max);\r\n };\r\n\r\n instance.lerp = function (from, to, t)\r\n {\r\n return (from + ((to - from) * MathEx.clamp01(t)));\r\n };\r\n\r\n instance.distance2D = function (x1, y1, x2, y2)\r\n {\r\n let dx, dy;\r\n dx = x1 - x2;\r\n dy = y1 - y2;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n };\r\n\r\n instance.distance2DSq = function (x1, y1, x2, y2)\r\n {\r\n let dx, dy;\r\n dx = x1 - x2;\r\n dy = y1 - y2;\r\n return dx * dx + dy * dy;\r\n };\r\n\r\n instance.distance3D = function (x1, y1, z1, x2, y2, z2)\r\n {\r\n let dx, dy, dz;\r\n dx = x1 - x2;\r\n dy = y1 - y2;\r\n dz = z1 - z2;\r\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\r\n };\r\n\r\n instance.distance3DSq = function (x1, y1, z1, x2, y2, z2)\r\n {\r\n let dx, dy, dz;\r\n dx = x1 - x2;\r\n dy = y1 - y2;\r\n dz = z1 - z2;\r\n return dx * dx + dy * dy + dz * dz;\r\n };\r\n\r\n instance.roundTo = function (value, decimals)\r\n {\r\n decimals = typeof decimals == \"number\" ? MathEx.clamp(decimals, 0, 12) : 2;\r\n let x = Math.pow(10, decimals);\r\n return Math.round(value * x + Number.EPSILON) / x;\r\n };\r\n\r\n instance.smoothStep = function (from, to, t)\r\n {\r\n t = (t * t * (3.0 - 2.0 * t));\r\n return (from + ((to - from) * t));\r\n };\r\n\r\n instance.wrap = function (value, min, max)\r\n {\r\n let inc;\r\n if (max <= min)\r\n throw \"Max cannot be < min\";\r\n\r\n inc = max - min;\r\n while (value < min)\r\n value += inc;\r\n while (value > max)\r\n value -= inc;\r\n return value;\r\n };\r\n\r\n instance.wrapAngle = function (angle)\r\n {\r\n while (angle < 0)\r\n angle += 360;\r\n while (angle > 360)\r\n angle -= 360;\r\n return angle;\r\n };\r\n\r\n return instance;\r\n})();\r\n","\"use strict\";\r\n\r\nconst Color = function ()\r\n{\r\n this.R = this.G = this.B = 255;\r\n this.A = 1.0;\r\n};\r\n\r\nColor.prototype.R = 255;\r\nColor.prototype.G = 255;\r\nColor.prototype.B = 255;\r\nColor.prototype.A = 1.0;\r\n\r\nColor.FromString = function (colorStr)\r\n{\r\n let c = new Color();\r\n c.Parse(colorStr);\r\n return c;\r\n};\r\n\r\nColor.FromHSL = function (h, s, l, a)\r\n{\r\n const HueToRGB = function (p, q, t)\r\n {\r\n if (t < 0)\r\n t += 1;\r\n if (t > 1)\r\n t -= 1;\r\n if (t < 1 / 6)\r\n return p + (q - p) * 6 * t;\r\n if (t < 1 / 2)\r\n return q;\r\n if (t < 2 / 3)\r\n return p + (q - p) * (2 / 3 - t) * 6;\r\n return p;\r\n };\r\n\r\n a = typeof a == \"number\" ? MathEx.clamp01(a) : 1.0;\r\n\r\n h = MathEx.clamp(h, 0, 360) / 360.0;\r\n s = MathEx.clamp(s, 0, 100) / 100.0;\r\n l = MathEx.clamp(l, 0, 100) / 100.0;\r\n\r\n let c = new Color();\r\n c.A = a;\r\n\r\n if (s == 0)\r\n {\r\n c.R = c.G = c.B = l;\r\n return c;\r\n }\r\n\r\n let q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n let p = 2 * l - q;\r\n\r\n c.R = 255 * HueToRGB(p, q, h + 1 / 3);\r\n c.G = 255 * HueToRGB(p, q, h);\r\n c.B = 255 * HueToRGB(p, q, h - 1 / 3);\r\n return c;\r\n};\r\n\r\nColor.FromRGB = function (r, g, b, a)\r\n{\r\n a = typeof a == \"number\" ? MathEx.clamp01(a) : 1.0;\r\n\r\n let c = new Color();\r\n c.R = MathEx.clamp(r, 0, 255);\r\n c.G = MathEx.clamp(g, 0, 255);\r\n C.B = MathEx.clamp(b, 0, 255);\r\n c.A = a;\r\n return c;\r\n};\r\n\r\nColor.prototype.Parse = function (input)\r\n{\r\n let start, end, parts, h, s, l, hslColor;\r\n\r\n if (input == null || input.length == 0)\r\n return;\r\n\r\n if (input[0] == \"#\")\r\n input = input.substring(1);\r\n\r\n if (input.length < 3)\r\n return;\r\n\r\n input = input.toLowerCase().trim();\r\n\r\n if (input.length == 3)\r\n {\r\n this.R = parseInt(input[0], 16) * 0x11;\r\n this.G = parseInt(input[1], 16) * 0x11;\r\n this.B = parseInt(input[2], 16) * 0x11;\r\n this.A = 1.0;\r\n }\r\n else if (input.length == 6 || input.length == 8)\r\n {\r\n this.R = parseInt(input.substr(0, 2), 16);\r\n this.G = parseInt(input.substr(2, 2), 16);\r\n this.B = parseInt(input.substr(4, 2), 16);\r\n if (input.Length == 8)\r\n this.A = (parseInt(input.substr(6, 2), 16) / 255.0).toFixed(2);\r\n }\r\n else\r\n {\r\n if (input.substring(0, 3) == \"rgb\")\r\n {\r\n start = input.lastIndexOf(\"(\");\r\n end = input.lastIndexOf(\")\");\r\n if (start > -1 && end > start)\r\n {\r\n parts = input.substring(start + 1, end).split(\",\");\r\n if (parts != null || parts.length > 2)\r\n {\r\n this.R = parseInt(parts[0]);\r\n this.G = parseInt(parts[1]);\r\n this.B = parseInt(parts[2]);\r\n if (parts.length > 3)\r\n this.A = parseFloat(parts[3]);\r\n }\r\n }\r\n }\r\n else if (input.substring(0, 3) == \"hsl\")\r\n {\r\n start = input.lastIndexOf(\"(\");\r\n end = input.lastIndexOf(\")\");\r\n if (start > -1 && end > start)\r\n {\r\n parts = input.substring(start + 1, end).split(\",\");\r\n if (parts != null || parts.length > 2)\r\n {\r\n h = parseInt(parts[0]);\r\n s = parseInt(parts[1]);\r\n l = parseInt(parts[2]);\r\n if (parts.length > 3)\r\n this.A = parseFloat(parts[3]);\r\n hslColor = Color.FromHSL(h, s, l);\r\n this.R = hslColor.R;\r\n this.G = hslColor.G;\r\n this.B = hslColor.B;\r\n }\r\n }\r\n }\r\n }\r\n this.R = MathEx.clamp(this.R, 0, 255);\r\n this.G = MathEx.clamp(this.G, 0, 255);\r\n this.B = MathEx.clamp(this.B, 0, 255);\r\n this.A = MathEx.clamp01(this.A);\r\n};\r\n\r\nColor.prototype.ToHexStr = function (includeAlpha)\r\n{\r\n let a = includeAlpha ? (Math.round(this.A * 255)).toString(16).pad(2, \"0\") : \"\";\r\n return \"#{0}{1}{2}{3}\".format(this.R.toString(16).pad(2, \"0\"), this.G.toString(16).pad(2, \"0\"), this.B.toString(16).pad(2, \"0\"), a);\r\n};\r\n\r\nColor.prototype.ToRGBStr = function ()\r\n{\r\n return \"rgb({0},{1},{2})\".format(Math.round(this.R), Math.round(this.G), Math.round(this.B));\r\n};\r\n\r\nColor.prototype.ToRGBAStr = function (alphaOverride)\r\n{\r\n alphaOverride = typeof alphaOverride == \"number\" ? Math.clamp01(alphaOverride) : this.A;\r\n return \"rgba({0},{1},{2},{3})\".format(Math.round(this.R), Math.round(this.G), Math.round(this.B), alphaOverride.toFixed(2));\r\n};\r\n\r\nColor.prototype.ToHSLStr = function ()\r\n{\r\n var hsl = this.ToHSL();\r\n return \"hsl({0},{1}%,{2}%)\".format(hsl.H, hsl.S, hsl.L);\r\n};\r\n\r\nColor.prototype.ToHSLAStr = function (alphaOverride)\r\n{\r\n var hsl = this.ToHSL();\r\n alphaOverride = typeof alphaOverride == \"number\" ? MathEx.clamp01(alphaOverride) : this.A;\r\n return \"hsla({0},{1}%,{2}%,{3})\".format(hsl.H, hsl.S, hsl.L, alphaOverride.toFixed(2));\r\n};\r\n\r\nColor.prototype.ToHSL = function ()\r\n{\r\n let r, g, b, min, max, h, s, l, d;\r\n\r\n r = MathEx.clamp01(this.R / 255);\r\n g = MathEx.clamp01(this.G / 255);\r\n b = MathEx.clamp01(this.B / 255);\r\n\r\n min = Math.min(r, g, b);\r\n max = Math.max(r, g, b);\r\n\r\n l = (max + min) / 2;\r\n d = max - min;\r\n\r\n if (max != min)\r\n {\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max)\r\n {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n else\r\n h = s = 0;\r\n\r\n h = Math.round(MathEx.clamp01(h) * 360);\r\n s = Math.round(MathEx.clamp01(s) * 100);\r\n l = Math.round(MathEx.clamp01(l) * 100);\r\n return { H: h, S: s, L: l };\r\n};\r\n\r\nColor.prototype.Scale = function (h, s, l, a)\r\n{\r\n let hsl, c;\r\n\r\n hsl = this.ToHSL();\r\n\r\n h = MathEx.clamp01(h) * hsl.H;\r\n s = MathEx.clamp01(s) * hsl.S;\r\n l = MathEx.clamp01(l) * hsl.L;\r\n a = MathEx.clamp01(a) * this.A;\r\n\r\n c = Color.FromHSL(h, s, l, a);\r\n this.R = c.R;\r\n this.G = c.G;\r\n this.B = c.B;\r\n this.A = c.A;\r\n};\r\n\r\n","\"use strict\";\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Point\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nconst Point = function (xVal, yVal)\r\n{\r\n const _this = this;\r\n let cachePt = null;\r\n let x, y;\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Initialization\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n if (typeof xVal == \"undefined\")\r\n xVal = 0;\r\n if (typeof yVal == \"undefined\")\r\n yVal = 0;\r\n\r\n if (typeof xVal != \"number\" || typeof yVal != \"number\")\r\n throw \"Point constructor must be supplied with valid x and y values\";\r\n\r\n x = xVal;\r\n y = yVal;\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"X\",\r\n {\r\n get: function () { return x; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"X must be a number\";\r\n x = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Left\",\r\n {\r\n get: function () { return x; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"Left must be a number\";\r\n x = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Y\",\r\n {\r\n get: function () { return y; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"Y must be a number\";\r\n y = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Top\",\r\n {\r\n get: function () { return y; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"Top must be a number\";\r\n y = newValue;\r\n }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Public functions\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n this.Copy = function ()\r\n {\r\n return new Point(x, y);\r\n };\r\n\r\n this.CopyTo = function (dest)\r\n {\r\n if (!(dest instanceof Point))\r\n return;\r\n dest.X = x;\r\n dest.Y = y;\r\n };\r\n\r\n this.CopyFrom = function (src)\r\n {\r\n if (!(src instanceof Point))\r\n return;\r\n x = src.X;\r\n y = src.Y;\r\n };\r\n\r\n this.Equals = function (point)\r\n {\r\n if (!(point instanceof Point))\r\n return false;\r\n return x == point.X && y == point.Y;\r\n };\r\n\r\n this.ApproxEquals = function (point, distMargin)\r\n {\r\n distMargin = typeof distMargin != \"number\" ? 0.1 : distMargin;\r\n\r\n if (!(point instanceof Point))\r\n return false;\r\n if (Math.abs(x - point.X) < MathEx.epsilon4 && Math.abs(y - point.Y) < MathEx.epsilon4)\r\n return true;\r\n if (distMargin == 0)\r\n return false;\r\n else\r\n return this.Distance(point) <= distMargin;\r\n };\r\n\r\n this.Reset = function ()\r\n {\r\n x = y = 0;\r\n };\r\n\r\n this.IsZero = function()\r\n {\r\n return x == 0 && y == 0;\r\n };\r\n\r\n this.Distance = function (point)\r\n {\r\n if (!(point instanceof Point))\r\n return false;\r\n return MathEx.distance2D(x, y, point.X, point.Y);\r\n };\r\n\r\n this.DistanceSq = function (point)\r\n {\r\n if (!(point instanceof Point))\r\n return false;\r\n return MathEx.distance2DSq(x, y, point.X, point.Y);\r\n };\r\n\r\n this.IsOnLine = function (p1, p2)\r\n {\r\n let px, py;\r\n if (!(p1 instanceof Point) || !(p2 instanceof Point))\r\n return false;\r\n\r\n px = (x - p1.X) / (p2.X - p1.X);\r\n py = (y - p1.Y) / (p2.Y - p1.Y);\r\n return Math.abs(px - py) < MathEx.epsilon4;\r\n };\r\n\r\n this.IsOnLineSegment = function (p1, p2)\r\n {\r\n let px, py;\r\n if (!(p1 instanceof Point) || !(p2 instanceof Point))\r\n return false;\r\n\r\n px = (x - p1.X) / (p2.X - p1.X);\r\n py = (y - p1.Y) / (p2.Y - p1.Y);\r\n if (Math.abs(px - py) > MathEx.epsilon4)\r\n return false;\r\n return (Math.min(p1.X, p2.X) <= x && Math.max(p1.X, p2.X) >= x) || (Math.min(p1.Y, p2.Y) <= y && Math.max(p1.Y, p2.Y) >= y);\r\n };\r\n\r\n this.DistanceToLine = function (p1, p2)\r\n {\r\n let magnitudeSq, u;\r\n\r\n if (!(p1 instanceof Point) || !(p2 instanceof Point))\r\n throw \"p1 and p2 must be instances of Point\";\r\n\r\n magnitudeSq = p1.DistanceSq(p2);\r\n if (magnitudeSq < MathEx.epsilon4)\r\n throw \"Supplied points must be different\";\r\n\r\n u = (x - p1.X) * (p2.X - p1.X) + (y - p1.Y) * (p2.Y - p1.Y);\r\n u /= magnitudeSq;\r\n\r\n if (cachePt == null)\r\n cachePt = new Point();\r\n cachePt.X = p1.X + u * (p2.X - p1.X);\r\n cachePt.Y = p1.Y + u * (p2.Y - p1.Y);\r\n return this.Distance(cachePt);\r\n };\r\n\r\n this.DistanceToLineSegment = function (p1, p2)\r\n {\r\n let magnitudeSq, u, p1Dist, p2Dist;\r\n\r\n if (!(p1 instanceof Point) || !(p2 instanceof Point))\r\n throw \"p1 and p2 must be instances of Point\";\r\n\r\n magnitudeSq = p1.DistanceSq(p2);\r\n if (magnitudeSq < MathEx.epsilon4)\r\n throw \"Supplied points must be different\";\r\n\r\n u = (x - p1.X) * (p2.X - p1.X) + (y - p1.Y) * (p2.Y - p1.Y);\r\n u /= magnitudeSq;\r\n if (u < MathEx.epsilon4 || u > 1.0)\r\n {\r\n p1Dist = this.Distance(p1);\r\n p2Dist = this.Distance(p2);\r\n return Math.min(p1Dist, p2Dist);\r\n }\r\n\r\n if (cachePt == null)\r\n cachePt = new Point();\r\n cachePt.X = p1.X + u * (p2.X - p1.X);\r\n cachePt.Y = p1.Y + u * (p2.Y - p1.Y);\r\n return this.Distance(cachePt);\r\n };\r\n\r\n this.toString = function()\r\n {\r\n return \"(\" + x + \", \" + y + \")\";\r\n };\r\n};\r\n","\"use strict\";\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Size\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nconst Size = function (w, h)\r\n{\r\n const _this = this;\r\n\r\n let width, height;\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Initialization\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n if (typeof w == \"undefined\")\r\n w = 0;\r\n if (typeof h == \"undefined\")\r\n h = 0;\r\n\r\n if (typeof w != \"number\" || typeof h != \"number\")\r\n throw \"Size constructor must be supplied with valid width and height values\";\r\n\r\n if (w < 0 || h < 0)\r\n throw \"Width and height must be greater than or equal to 0\";\r\n\r\n width = w;\r\n height = h;\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"Width\",\r\n {\r\n get: function () { return width; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\" || newValue < 0)\r\n throw \"Width must be a number greater than or equal to 0\";\r\n width = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Height\",\r\n {\r\n get: function () { return height; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\" || newValue < 0)\r\n throw \"Height must be a number greater than or equal to 0\";\r\n height = newValue;\r\n }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Public functions\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n this.Copy = function ()\r\n {\r\n return new Size(width, height);\r\n };\r\n\r\n this.CopyFrom = function (src)\r\n {\r\n if (!(src instanceof Size))\r\n return;\r\n width = src.Width;\r\n height = src.Height;\r\n };\r\n\r\n this.Equals = function (size)\r\n {\r\n if (!(size instanceof Size))\r\n return false;\r\n return width == size.Width && height == size.Height;\r\n };\r\n\r\n this.Reset = function ()\r\n {\r\n width = height = 0;\r\n };\r\n\r\n this.IsEmpty = function ()\r\n {\r\n return width == 0 && height == 0;\r\n };\r\n\r\n this.toString = function ()\r\n {\r\n return \"(\" + width + \", \" + height + \")\";\r\n };\r\n};\r\n","\"use strict\";\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Padding\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nconst Padding = function (l, t, r, b)\r\n{\r\n const _this = this;\r\n\r\n let left, top, right, bottom;\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Initialization\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n if (typeof r == \"undefined\")\r\n r = l;\r\n if (typeof b == \"undefined\")\r\n b = t;\r\n\r\n if (typeof l != \"number\" || typeof t != \"number\" || typeof r != \"number\" || typeof b != \"number\")\r\n throw \"Padding constructor must be supplied with valid left, top, right and bottom values\";\r\n\r\n left = l;\r\n top = t;\r\n right = r;\r\n bottom = b;\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"X\",\r\n {\r\n get: function () { return left; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"X must be a number\";\r\n left = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Left\",\r\n {\r\n get: function () { return left; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"Left must be a number\";\r\n left = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Y\",\r\n {\r\n get: function () { return top; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"Y must be a number\";\r\n top = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Top\",\r\n {\r\n get: function () { return top; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"Top must be a number\";\r\n top = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Right\",\r\n {\r\n get: function () { return right; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"Right must be a number\";\r\n right = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Bottom\",\r\n {\r\n get: function () { return bottom; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"bottom must be a number\";\r\n bottom = newValue;\r\n }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Public functions\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n this.Copy = function ()\r\n {\r\n return new Padding(left, top, right, bottom);\r\n };\r\n\r\n this.CopyTo = function (dest)\r\n {\r\n if (!(dest instanceof Padding))\r\n return;\r\n dest.Left = left;\r\n dest.Top = top;\r\n dest.Right = right;\r\n dest.Bottom = bottom;\r\n };\r\n\r\n this.CopyFrom = function (src)\r\n {\r\n if (!(src instanceof Padding))\r\n return;\r\n left = src.Left;\r\n top = src.Top;\r\n right = src.Right;\r\n bottom = src.Bottom;\r\n };\r\n\r\n this.Equals = function (padding)\r\n {\r\n if (!(padding instanceof Padding))\r\n return false;\r\n return left == size.Left && top == size.Top && right == size.Right && bottom == size.Bottom;\r\n };\r\n\r\n this.Reset = function ()\r\n {\r\n left = top = right = bottom = 0;\r\n };\r\n\r\n this.IsEmpty = function ()\r\n {\r\n return left == 0 && top == 0 && right == 0 && bottom == 0;\r\n };\r\n\r\n this.Inflate = function (val)\r\n {\r\n if (typeof val == \"number\")\r\n {\r\n left += val;\r\n top += val;\r\n right += val * 2;\r\n bottom += val * 2;\r\n }\r\n else if (val instanceof Point)\r\n {\r\n left += val.X;\r\n top += val.Y;\r\n right += val.X * 2;\r\n bottom += val.Y * 2;\r\n }\r\n else if (val instanceof Size)\r\n {\r\n left += val.Width;\r\n top += val.Height;\r\n right += val.Width * 2;\r\n bottom += val.Height * 2;\r\n }\r\n else if (val instanceof Padding)\r\n {\r\n left += val.Left;\r\n top += val.Top;\r\n right += val.Left + val.Right;\r\n bottom += val.Top + val.Bottom;\r\n }\r\n };\r\n\r\n this.toString = function ()\r\n {\r\n return \"(\" + left + \", \" + top + \", \" + right + \", \" + bottom + \")\";\r\n };\r\n};\r\n\r\n","\"use strict\";\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Rectangle\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nconst Rectangle = function (x, y, w, h)\r\n{\r\n const _this = this;\r\n let cacheRect = null;\r\n let position, size;\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Initialization\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n if (typeof x == \"undefined\")\r\n x = 0;\r\n if (typeof y == \"undefined\")\r\n y = 0;\r\n if (typeof w == \"undefined\")\r\n w = 0;\r\n if (typeof h == \"undefined\")\r\n h = 0;\r\n\r\n if (typeof x != \"number\" || typeof y != \"number\" || typeof w != \"number\" || typeof h != \"number\")\r\n throw \"Rectangle constructor must be supplied with valid x, y, width and height values\";\r\n\r\n if (w < 0 || h < 0)\r\n throw \"Rectangle width and height must be greater than or equal to 0\";\r\n\r\n position = new Point(x, y);\r\n size = new Size(w, h);\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"X\",\r\n {\r\n get: function () { return position.X; },\r\n set: function (value)\r\n {\r\n if (typeof value != \"number\")\r\n throw \"X must be a number\";\r\n position.X = value;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Left\",\r\n {\r\n get: function () { return position.X; },\r\n set: function (value)\r\n {\r\n if (typeof value != \"number\")\r\n throw \"Left must be a number\";\r\n position.X = value;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Y\",\r\n {\r\n get: function () { return position.Y; },\r\n set: function (value)\r\n {\r\n if (typeof value != \"number\")\r\n throw \"Y must be a number\";\r\n position.Y = value;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Top\",\r\n {\r\n get: function () { return position.Y; },\r\n set: function (value)\r\n {\r\n if (typeof value != \"number\")\r\n throw \"Top must be a number\";\r\n position.Y = value;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Width\",\r\n {\r\n get: function () { return size.Width; },\r\n set: function (value)\r\n {\r\n if (typeof value != \"number\")\r\n throw \"Width must be a number\";\r\n size.Width = value;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Height\",\r\n {\r\n get: function () { return size.Height; },\r\n set: function (value)\r\n {\r\n if (typeof value != \"number\")\r\n throw \"Height must be a number\";\r\n size.Height = value;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Center\",\r\n {\r\n get: function () { return new Point(position.X + size.Width * 0.5, position.Y + size.Height * 0.5); },\r\n set: function (value)\r\n {\r\n if (typeof value.X != \"number\" || typeof value.Y != \"number\")\r\n throw \"Center must contain valid X and Y members\";\r\n position.X = value.X - size.Width * 0.5;\r\n position.Y = value.Y - size.Height * 0.5;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Position\",\r\n {\r\n get: function () { return position; },\r\n set: function (value)\r\n {\r\n if (typeof value.X != \"number\" || typeof value.Y != \"number\")\r\n throw \"Position must contain valid X and Y members\";\r\n position.X = value.X;\r\n position.Y = value.Y;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Size\",\r\n {\r\n get: function () { return size; },\r\n set: function (value)\r\n {\r\n if (typeof value.Width != \"number\" || typeof value.Height != \"number\")\r\n throw \"Size must contain valid Width and Height members\";\r\n if (value.Width < 0 || value.Height < 0)\r\n throw \"Size width and height must be greater than or equal to 0\";\r\n size.Width = value.Width;\r\n size.Height = value.Height;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Right\",\r\n {\r\n get: function () { return position.X + size.Width; },\r\n set: function (value)\r\n {\r\n if (typeof value != \"number\" || value < position.X)\r\n throw \"Right must be a valid number greater than or equal to the X value\";\r\n size.Width = value - position.X;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Bottom\",\r\n {\r\n get: function () { return position.Y + size.Height; },\r\n set: function (value)\r\n {\r\n if (typeof value != \"number\" || value < position.Y)\r\n throw \"Bottom must be a valid number greater than or equal to the Y value\";\r\n size.Height = value - position.Y;\r\n }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Public functions\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n this.Copy = function ()\r\n {\r\n return new Rectangle(position.X, position.Y, size.Width, size.Height);\r\n };\r\n\r\n this.CopyTo = function (dest)\r\n {\r\n if (!(dest instanceof Rectangle))\r\n return;\r\n dest.X = position.X;\r\n dest.Y = position.Y;\r\n dest.Width = size.Width;\r\n dest.Height = size.Height;\r\n };\r\n\r\n this.CopyFrom = function (src)\r\n {\r\n if (!(src instanceof Rectangle))\r\n return;\r\n position.X = src.X;\r\n position.Y = src.Y;\r\n size.Width = src.Width;\r\n size.Height = src.Height;\r\n };\r\n\r\n this.Equals = function (rect)\r\n {\r\n if (!(rect instanceof Rectangle))\r\n return false;\r\n return position.X == rect.X && position.Y == rect.Y && size.Width == rect.Width && size.Height == rect.Height;\r\n };\r\n\r\n this.IsEmpty = function ()\r\n {\r\n return size.IsEmpty();\r\n };\r\n\r\n this.Inflate = function (val)\r\n {\r\n if (typeof val == \"number\")\r\n {\r\n position.X -= val;\r\n position.Y -= val;\r\n size.Width += val * 2;\r\n size.Height += val * 2;\r\n }\r\n else if (val instanceof Point)\r\n {\r\n position.X -= val.X;\r\n position.Y -= val.Y;\r\n size.Width += val.X * 2;\r\n size.Height += val.Y * 2;\r\n }\r\n else if (val instanceof Size)\r\n {\r\n position.X -= val.Width;\r\n position.Y -= val.Height;\r\n size.Width += val.Width * 2;\r\n size.Height += val.Height * 2;\r\n }\r\n else if (val instanceof Rectangle)\r\n {\r\n position.X -= val.X;\r\n position.Y -= val.Y;\r\n size.Width += val.Width;\r\n size.Height += val.Height;\r\n }\r\n else if (val instanceof Padding)\r\n {\r\n position.X -= val.Left;\r\n position.Y -= val.Top;\r\n size.Width += val.Left + val.Right;\r\n size.Height += val.Top + val.Bottom;\r\n }\r\n if (size.Width < 0)\r\n size.Width = 0;\r\n if (size.Height < 0)\r\n size.Height = 0;\r\n };\r\n\r\n this.Intersects = function(rect)\r\n {\r\n if (size.IsEmpty() || rect.IsEmpty())\r\n return false;\r\n\r\n return rect.X <= this.Right && rect.Right >= this.Left && rect.Top <= this.Bottom && rect.Bottom >= this.Top;\r\n };\r\n\r\n this.Contains = function (val)\r\n {\r\n if (size.IsEmpty())\r\n return false;\r\n\r\n if (val instanceof Point)\r\n return position.X <= val.X && position.Y <= val.Y && this.Right >= val.X && this.Bottom >= val.Y;\r\n else if (val instanceof Rectangle)\r\n return position.X <= val.X && position.Y <= val.Y && this.Right >= val.Right && this.Bottom >= val.Bottom;\r\n else\r\n throw new \"Rectangle.Contains must be supplied with a valid point or rectangle\";\r\n };\r\n\r\n this.UnionWith = function (val)\r\n {\r\n if (val instanceof Rectangle)\r\n {\r\n if (cacheRect == null)\r\n cacheRect = new Rectangle();\r\n\r\n cacheRect.X = Math.min(position.X, val.X);\r\n cacheRect.Y = Math.min(position.Y, val.Y);\r\n cacheRect.Right = Math.max(this.Right, val.Right);\r\n cacheRect.Bottom = Math.max(this.Bottom, val.Bottom);\r\n this.CopyFrom(cacheRect);\r\n }\r\n else if (val instanceof Point)\r\n {\r\n if (cacheRect == null)\r\n cacheRect = new Rectangle();\r\n\r\n cacheRect.X = Math.min(position.X, val.X);\r\n cacheRect.Y = Math.min(position.Y, val.Y);\r\n cacheRect.Right = Math.max(this.Right, val.X);\r\n cacheRect.Bottom = Math.max(this.Bottom, val.Y);\r\n this.CopyFrom(cacheRect);\r\n }\r\n else\r\n throw new \"Rectangle.UnionWith must be supplied with a valid rectangle or point\";\r\n };\r\n\r\n this.IntersectWith = function (rect)\r\n {\r\n if (!(rect instanceof Rectangle))\r\n throw new \"Rectangle.IntersectWith must be supplied with a valid rectangle\";\r\n if (!this.Intersects(rect))\r\n this.CopyFrom(Rectangle.Empty);\r\n\r\n if (cacheRect == null)\r\n cacheRect = new Rectangle();\r\n\r\n cacheRect.X = Math.max(position.X, rect.X);\r\n cacheRect.Y = Math.max(position.Y, rect.Y);\r\n cacheRect.Right = Math.min(this.Right, rect.Right);\r\n cacheRect.Bottom = Math.min(this.Bottom, rect.Bottom);\r\n this.CopyFrom(cacheRect);\r\n };\r\n\r\n this.Reset = function ()\r\n {\r\n position.X = position.Y = size.Width = size.Height = 0;\r\n };\r\n\r\n this.Stroke = function (context, color)\r\n {\r\n if (context == null)\r\n return;\r\n context.strokeStyle = color;\r\n context.strokeRect(position.X, position.Y, size.Width, size.Height);\r\n };\r\n\r\n this.Fill = function (context, color)\r\n {\r\n if (context == null)\r\n return;\r\n context.fillStyle = color;\r\n context.fillRect(position.X, position.Y, size.Width, size.Height);\r\n };\r\n\r\n this.ToPath = function ()\r\n {\r\n let path = new Path();\r\n path.AddRectangle(this);\r\n return path;\r\n };\r\n\r\n this.ToRoundedRectPath = function (radius, corners)\r\n {\r\n let path = new Path();\r\n path.AddRoundedRectangle(this, radius, corners);\r\n return path;\r\n };\r\n\r\n this.ToCirclePath = function (radius)\r\n {\r\n let path;\r\n let center = this.Center;\r\n let maxRadius = Math.min(size.Width * 0.5, size.Height * 0.5);\r\n\r\n radius = typeof radius != \"number\" ? maxRadius : radius;\r\n if (radius < MathEx.epsilon4)\r\n throw \"Cannot create a circle with a 0 or negative radius\";\r\n\r\n path = new Path();\r\n path.AddArc(center, radius, 0, 360);\r\n return path;\r\n };\r\n};\r\n\r\nRectangle.Empty = new Rectangle(0, 0, 0, 0);\r\n\r\nRectangle.prototype.toString = function ()\r\n{\r\n return \"(\" + this.X + \", \" + this.Y + \", \" + this.Width + \", \" + this.Height + \")\";\r\n};\r\n\r\nRectangle.FromXYWH = function (xCoord, yCoord, width, height)\r\n{\r\n if (typeof xCoord != \"number\" || typeof yCoord != \"number\" || typeof width != \"number\" || typeof height != \"number\")\r\n throw new \"Rectangle constructor must be supplied with valid x, y, width and height values\";\r\n return new Rectangle(xCoord, yCoord, width, height);\r\n};\r\n\r\nRectangle.FromLTRB = function (left, top, right, bottom)\r\n{\r\n if (typeof left != \"number\" || typeof top != \"number\" || typeof right != \"number\" || typeof bottom != \"number\")\r\n throw new \"Rectangle constructor must be supplied with valid x, y, right and bottom values\";\r\n return new Rectangle(left, top, right - left, bottom - top);\r\n};\r\n\r\nRectangle.Union = function (rect1, rect2)\r\n{\r\n if (!(rect1 instanceof Rectangle) || !(rect2 instanceof Rectangle))\r\n throw new \"Rectangle.Union must be supplied with 2 valid rectangles\";\r\n\r\n let ret = new Rectangle();\r\n ret.X = Math.min(rect1.X, rect2.X);\r\n ret.Y = Math.min(rect1.Y, rect2.Y);\r\n ret.Right = Math.max(rect1.Right, rect2.Right);\r\n ret.Bottom = Math.max(rect1.Bottom, rect2.Bottom);\r\n return ret;\r\n};\r\n\r\nRectangle.Intersect = function (rect1, rect2)\r\n{\r\n if (!(rect1 instanceof Rectangle) || !(rect2 instanceof Rectangle))\r\n throw new \"Rectangle.Intersect must be supplied with 2 valid rectangles\";\r\n if (!rect1.Intersects(rect2))\r\n return Rectangle.Empty;\r\n\r\n let ret = new Rectangle();\r\n ret.X = Math.max(rect1.X, rect2.X);\r\n ret.Y = Math.max(rect1.Y, rect2.Y);\r\n ret.Right = Math.min(rect1.Right, rect2.Right);\r\n ret.Bottom = Math.min(rect1.Bottom, rect2.Bottom);\r\n return ret;\r\n};\r\n","\"use strict\";\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Path\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nconst Path = function ()\r\n{\r\n const _this = this;\r\n\r\n //FIXME - Add better support for non-contiguous lines/paths\r\n const duplicatePointRange = 0.25;\r\n\r\n let points = []; // Array of points that make up this path\r\n let bounds = new Rectangle(); // Bounding rectangle for the path\r\n let pathDirty = true; // Is the path dirty, needing bounds recalculation?\r\n let autoClose = false; // Should the path automatically close, creating a line from the last point to the first\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"Bounds\",\r\n {\r\n get: function ()\r\n {\r\n if (bounds == null || pathDirty)\r\n CalculateBounds();\r\n return bounds.Copy();\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"AutoClose\",\r\n {\r\n get: function () { return autoClose; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"boolean\")\r\n throw \"AutoClose must be a boolean value\";\r\n autoClose = newValue;\r\n }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Function pointer properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"AddPoint\",\r\n {\r\n get: function () { return AddPoint; }\r\n });\r\n\r\n Object.defineProperty(this, \"AddPoints\",\r\n {\r\n get: function () { return AddPoints; }\r\n });\r\n\r\n Object.defineProperty(this, \"AddLine\",\r\n {\r\n get: function () { return AddLine; }\r\n });\r\n\r\n Object.defineProperty(this, \"AddRectangle\",\r\n {\r\n get: function () { return AddRectangle; }\r\n });\r\n\r\n Object.defineProperty(this, \"AddRoundedRectangle\",\r\n {\r\n get: function () { return AddRoundedRectangle; }\r\n });\r\n\r\n Object.defineProperty(this, \"AddBezier\",\r\n {\r\n get: function () { return AddBezier; }\r\n });\r\n\r\n Object.defineProperty(this, \"AddArc\",\r\n {\r\n get: function () { return AddArc; }\r\n });\r\n\r\n Object.defineProperty(this, \"Stroke\",\r\n {\r\n get: function () { return Stroke; }\r\n });\r\n\r\n Object.defineProperty(this, \"Fill\",\r\n {\r\n get: function () { return Fill; }\r\n });\r\n\r\n Object.defineProperty(this, \"HitTest\",\r\n {\r\n get: function () { return HitTest; }\r\n });\r\n\r\n Object.defineProperty(this, \"StartClipToRegion\",\r\n {\r\n get: function () { return StartClipToRegion; }\r\n });\r\n\r\n Object.defineProperty(this, \"StartClipToBounds\",\r\n {\r\n get: function () { return StartClipToBounds; }\r\n });\r\n\r\n Object.defineProperty(this, \"EndClip\",\r\n {\r\n get: function () { return EndClip; }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Functions\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n let AddPoint = function (newPoint)\r\n {\r\n let point;\r\n\r\n if (!(newPoint instanceof Point))\r\n throw \"Only instances of Point can be added via the AddPoint function\";\r\n\r\n if (points.length > 0 && newPoint.ApproxEquals(points[points.length - 1], duplicatePointRange))\r\n return;\r\n points.push(newPoint.Copy());\r\n pathDirty = true;\r\n };\r\n\r\n let AddPoints = function ()\r\n {\r\n AddPointsInternal(arguments);\r\n };\r\n\r\n let AddLine = function (p1, p2)\r\n {\r\n if (!(p1 instanceof Point) || !(p2 instanceof Point))\r\n throw \"Lines must consist of 2 Point instances\";\r\n\r\n if (points.length == 0 || !p1.ApproxEquals(points[points.length - 1]))\r\n {\r\n if (points.length > 0)\r\n points.push(null);\r\n points.push(p1);\r\n }\r\n points.push(p2);\r\n };\r\n\r\n let AddRectangle = function (rect)\r\n {\r\n let endPt;\r\n if (!(rect instanceof Rectangle))\r\n throw \"AddRectangle requires rect be instances of Rectangle\";\r\n\r\n if (points.length == 0)\r\n {\r\n points.push(new Point(rect.Left, rect.Top));\r\n points.push(new Point(rect.Right, rect.Top));\r\n points.push(new Point(rect.Right, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Top));\r\n }\r\n else\r\n {\r\n endPt = points[points.length - 1];\r\n if (endPt.X == rect.Left && endPt.Y == rect.Top)\r\n {\r\n points.push(new Point(rect.Right, rect.Top));\r\n points.push(new Point(rect.Right, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Top));\r\n points.push(new Point(rect.Right, rect.Top));\r\n }\r\n else if (endPt.X == rect.Right && endPt.Y == rect.Top)\r\n {\r\n points.push(new Point(rect.Right, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Top));\r\n points.push(new Point(rect.Right, rect.Top));\r\n points.push(new Point(rect.Right, rect.Bottom));\r\n }\r\n else if (endPt.X == rect.Right && endPt.Y == rect.Bottom)\r\n {\r\n points.push(new Point(rect.Left, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Top));\r\n points.push(new Point(rect.Right, rect.Top));\r\n points.push(new Point(rect.Right, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Bottom));\r\n }\r\n else if (endPt.X == rect.Left && endPt.Y == rect.Bottom)\r\n {\r\n points.push(new Point(rect.Left, rect.Top));\r\n points.push(new Point(rect.Right, rect.Top));\r\n points.push(new Point(rect.Right, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Top));\r\n }\r\n else\r\n {\r\n points.push(null);\r\n points.push(new Point(rect.Left, rect.Top));\r\n points.push(new Point(rect.Right, rect.Top));\r\n points.push(new Point(rect.Right, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Bottom));\r\n points.push(new Point(rect.Left, rect.Top));\r\n }\r\n }\r\n pathDirty = true;\r\n };\r\n\r\n let AddRoundedRectangle = function (rect, radius, corners)\r\n {\r\n if (!(rect instanceof Rectangle))\r\n throw \"AddRectangle requires rect be instances of Rectangle\";\r\n radius = typeof radius != \"number\" ? 0 : radius;\r\n corners = typeof corners != \"number\" ? Corners.All : corners;\r\n\r\n if (radius < MathEx.epsilon4)\r\n {\r\n AddRectangle(rect);\r\n return;\r\n }\r\n\r\n let rightInset = rect.Right - radius;\r\n let bottomInset = rect.Bottom - radius;\r\n let leftInset = rect.X + radius;\r\n let topInset = rect.Y + radius;\r\n let rSqr = radius * 2;\r\n let rightLargeInset = rect.Right - rSqr;\r\n let bottomLargeInset = rect.Bottom - rSqr;\r\n\r\n if (points.length > 0)\r\n points.push(null);\r\n if ((Corners.TopLeft & corners) == Corners.TopLeft)\r\n AddArc(new Point(leftInset, topInset), radius, 180, 270);\r\n else\r\n {\r\n points.push(new Point(rect.X, topInset));\r\n points.push(new Point(rect.X, rect.Y));\r\n points.push(new Point(leftInset, rect.Y));\r\n }\r\n\r\n //Top Edge\r\n points.push(new Point(rightInset, rect.Y));\r\n\r\n if ((Corners.TopRight & corners) == Corners.TopRight)\r\n AddArc(new Point(rightLargeInset + radius, rect.Y + radius), radius, -90, 0);\r\n else\r\n {\r\n points.push(new Point(rect.Right, rect.Y));\r\n points.push(new Point(rect.Right, topInset));\r\n }\r\n\r\n //Right Edge\r\n points.push(new Point(rect.Right, bottomInset));\r\n\r\n if ((Corners.BottomRight & corners) == Corners.BottomRight)\r\n AddArc(new Point(rightLargeInset + radius, bottomLargeInset + radius), radius, 0, 90);\r\n else\r\n {\r\n points.push(new Point(rect.Right, rect.Bottom));\r\n points.push(new Point(rightInset, rect.Bottom));\r\n }\r\n\r\n //Bottom Edge\r\n points.push(new Point(leftInset, rect.Bottom));\r\n\r\n if ((Corners.BottomLeft & corners) == Corners.BottomLeft)\r\n AddArc(new Point(rect.X + radius, bottomLargeInset + radius), radius, 90, 180);\r\n else\r\n {\r\n points.push(new Point(leftInset, rect.Bottom, rect.X, rect.Bottom));\r\n points.push(new Point(rect.X, rect.Bottom, rect.X, bottomInset));\r\n }\r\n\r\n //Left Edge\r\n points.push(new Point(rect.X, topInset));\r\n pathDirty = true;\r\n };\r\n\r\n let AddBezier = function (p1, cp1, cp2, p2, segments)\r\n {\r\n if (!(p1 instanceof Point) || !(p2 instanceof Point) || !(cp1 instanceof Point) || !(cp2 instanceof Point))\r\n throw \"AddBezier requires p1, p2, cp1 and cp2 be instances of Point\";\r\n\r\n segments = typeof segments != \"number\" ? 20 : segments;\r\n\r\n if (points.length > 0)\r\n {\r\n if (!point.ApproxEquals(points[points.length - 1]))\r\n points.push(null);\r\n }\r\n if (points.length == 0 || !point.ApproxEquals(points[points.length - 1]))\r\n {\r\n if (points.length > 0)\r\n points.push(null);\r\n points.push(Bezier(p1, cp1, cp2, p2, 0.0));\r\n }\r\n for (let i = 1; i <= segments; i++)\r\n points.push(Bezier(p1, cp1, cp2, p2, i / segments));\r\n\r\n pathDirty = true;\r\n };\r\n\r\n let Bezier = function (p1, cp1, cp2, p2, t)\r\n {\r\n let u;\r\n if (!(p1 instanceof Point) || !(p2 instanceof Point) || !(cp1 instanceof Point) || !(cp2 instanceof Point) || typeof t != \"number\")\r\n throw \"Bezier requires p1, p2, cp1 and cp2 be instances of Point and t be a number\";\r\n\r\n u = 1.0 - t;\r\n return new Point(u * u * u * p1.X + 3.0 * u * u * t * cp1.X + 3.0 * u * t * t * cp2.X + t * t * t * p2.X,\r\n u * u * u * p1.Y + 3.0 * u * u * t * cp1.Y + 3.0 * u * t * t * cp2.Y + t * t * t * p2.Y);\r\n };\r\n\r\n let AddArc = function (center, radius, startAngle, endAngle, segments)\r\n {\r\n //FIXME - This needs benchmarked against using beziers or other methods to generate the arc segments\r\n let point, angle, inc, altSegCount;\r\n if (typeof radius != \"number\" || typeof startAngle != \"number\" || typeof endAngle != \"number\")\r\n throw \"Invalid radius, start or end angle\";\r\n\r\n if (!(center instanceof Point))\r\n throw \"Center must be an instance of Point\";\r\n if (radius < MathEx.epsilon4)\r\n throw \"Radius must be greater than 0\";\r\n\r\n startAngle = MathEx.clampAngle(startAngle, -360, 360);\r\n endAngle = MathEx.clampAngle(endAngle, -360, 360);\r\n\r\n if (endAngle <= startAngle)\r\n throw \"End angle must be greater than start angle\";\r\n\r\n if (typeof segments != \"number\")\r\n {\r\n segments = Math.round((radius * 2.0 * Math.PI) / 10);\r\n altSegCount = Math.ceil((endAngle - startAngle) / 20);\r\n segments = Math.max(segments, altSegCount, 5);\r\n }\r\n\r\n angle = startAngle;\r\n point = RotateAroundOrigin(radius, 0, angle);\r\n point.X += center.X;\r\n point.Y += center.Y;\r\n\r\n if (points.length == 0 || !point.ApproxEquals(points[points.length - 1]))\r\n {\r\n if (points.length > 0)\r\n points.push(null);\r\n points.push(point);\r\n }\r\n\r\n inc = (endAngle - startAngle) / segments;\r\n angle = angle + inc;\r\n for (let i = 0; i < segments; i++)\r\n {\r\n point = RotateAroundOrigin(radius, 0, angle);\r\n point.X += center.X;\r\n point.Y += center.Y;\r\n points.push(point);\r\n angle += inc;\r\n }\r\n pathDirty = true;\r\n };\r\n\r\n let RotateAroundOrigin = function (x, y, angle)\r\n {\r\n let rad;\r\n \r\n if (typeof x != \"number\" || typeof y != \"number\" || typeof angle != \"number\")\r\n throw \"RotateAroundPoint requires x, y and angle to be numeric\";\r\n\r\n rad = MathEx.degToRad(angle);\r\n return new Point(Math.cos(rad) * x - Math.sin(rad) * y, Math.sin(rad) * x + Math.cos(rad) * y);\r\n };\r\n\r\n let AddPointsInternal = function (newPoints)\r\n {\r\n let point;\r\n\r\n if (newPoints.length == 0)\r\n return;\r\n\r\n for (let i = 0; i < newPoints.length; i++)\r\n {\r\n if (newPoints[i] instanceof Point)\r\n point = newPoints[i].Copy();\r\n else if (typeof newPoints[i].X == \"number\" && typeof newPoints[i].Y == \"number\")\r\n point = new Point(newPoints[i].X, newPoints[i].Y);\r\n else if (Array.isArray(newPoints[i]) && newPoints[i].length >= 2 && typeof newPoints[i][0] == \"number\" && typeof newPoints[i][1] == \"number\")\r\n point = new Point(newPoints[i][0], newPoints[i][1]);\r\n\r\n if (points.length > 0)\r\n {\r\n // Don't add points < duplicatePointRange unit away from previous point\r\n if (point.ApproxEquals(points[points.length - 1], duplicatePointRange))\r\n continue;\r\n }\r\n points.push(point);\r\n }\r\n pathDirty = true;\r\n };\r\n\r\n let AddBoundsToContext = function (context)\r\n {\r\n if (context == null || !(context instanceof CanvasRenderingContext2D))\r\n return;\r\n\r\n if (pathDirty)\r\n CalculateBounds();\r\n context.beginPath();\r\n context.moveTo(bounds.X, bounds.Y);\r\n context.lineTo(bounds.X, bounds.Bottom);\r\n context.lineTo(bounds.Right, bounds.Bottom);\r\n context.lineTo(bounds.Right, bounds.Y);\r\n context.closePath();\r\n };\r\n\r\n let AddPathToContext = function (context)\r\n {\r\n if (context == null || !(context instanceof CanvasRenderingContext2D))\r\n return;\r\n\r\n context.beginPath();\r\n if (points.length > 0)\r\n {\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n if (points[i] == null)\r\n continue;\r\n\r\n if (i == 0 || points[i - 1] == null)\r\n context.moveTo(points[i].X, points[i].Y);\r\n else if (i < points.length - 1)\r\n context.lineTo(points[i].X, points[i].Y);\r\n else\r\n {\r\n if (autoClose)\r\n {\r\n if (!points[i].ApproxEquals(points[0], duplicatePointRange))\r\n context.lineTo(points[i].X, points[i].Y);\r\n context.closePath();\r\n }\r\n else\r\n context.lineTo(points[i].X, points[i].Y);\r\n }\r\n }\r\n }\r\n };\r\n\r\n let CalculateBounds = function ()\r\n {\r\n bounds.Reset();\r\n if (points.length > 0)\r\n {\r\n for (let i = 0; i < points.length; i++)\r\n bounds.UnionWith(points[i]);\r\n }\r\n pathDirty = false;\r\n };\r\n\r\n let Stroke = function (context, color)\r\n {\r\n if (context == null || !(context instanceof CanvasRenderingContext2D))\r\n return;\r\n\r\n context.save();\r\n AddPathToContext(context);\r\n context.strokeStyle = color;\r\n context.stroke();\r\n context.restore();\r\n };\r\n\r\n let Fill = function (context, color)\r\n {\r\n if (context == null || !(context instanceof CanvasRenderingContext2D))\r\n return;\r\n\r\n context.save();\r\n AddPathToContext(context);\r\n\r\n context.fillStyle = color;\r\n context.fill();\r\n context.restore();\r\n };\r\n\r\n let HitTest = function (point, distance)\r\n {\r\n let paddedBounds;\r\n if (!(point instanceof Point))\r\n throw \"HitTest requires point be an instance of Point\";\r\n\r\n if (points.length == 0)\r\n return false;\r\n\r\n distance = Math.max(0, typeof distance != \"number\" ? 0 : distance);\r\n\r\n if (pathDirty)\r\n CalculateBounds();\r\n\r\n paddedBounds = bounds.Copy();\r\n if (distance > 0)\r\n paddedBounds.Inflate(distance);\r\n if (!paddedBounds.Contains(point))\r\n return false;\r\n\r\n for (let i = 0; i < points.length - 1; i++)\r\n {\r\n if (point.ApproxEquals(points[i], distance) || point.ApproxEquals(points[i + 1], distance))\r\n return true;\r\n if (distance < MathEx.epsilon4)\r\n {\r\n if (point.IsOnLineSegment(points[i], points[i + 1]))\r\n return true;\r\n }\r\n else\r\n {\r\n if (point.DistanceToLineSegment(points[i], points[i + 1]) <= distance)\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n let StartClipToRegion = function (context)\r\n {\r\n if (context == null || !(context instanceof CanvasRenderingContext2D))\r\n return;\r\n\r\n if (pathDirty)\r\n CalculateBounds();\r\n context.save();\r\n AddPathToContext(context);\r\n context.clip();\r\n };\r\n\r\n let StartClipToBounds = function (context)\r\n {\r\n if (context == null || !(context instanceof CanvasRenderingContext2D))\r\n return;\r\n context.save();\r\n AddBoundsToContext(context);\r\n context.clip();\r\n };\r\n\r\n let EndClip = function (context)\r\n {\r\n if (context == null || !(context instanceof CanvasRenderingContext2D))\r\n return;\r\n context.restore();\r\n };\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Initialization\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n AddPointsInternal(arguments);\r\n};\r\n\r\n//Path.FromLine = function (p1, p2)\r\n//{\r\n// let path = new Path();\r\n// path.AddPoint(p1);\r\n// path.AddPoint(p2);\r\n// path.CalculateBounds();\r\n// return path;\r\n//};\r\n\r\n//Path.FromRectangle = function (rect)\r\n//{\r\n// let path = new Path();\r\n// path.AddRectangle(rect);\r\n// path.CalculateBounds();\r\n// return path;\r\n//};\r\n\r\n//Path.FromRoundedRectangle = function (rect, radius, corners)\r\n//{\r\n// let path = new Path();\r\n// path.AddRoundedRectangle(rect, radius, corners);\r\n// path.CalculateBounds();\r\n// return path;\r\n//};\r\n\r\n//Path.FromArc = function (center, radius, startAngle, endAngle)\r\n//{\r\n// let path = new Path();\r\n// path.AddArc(center, radius, startAngle, endAngle);\r\n// path.CalculateBounds();\r\n// return path;\r\n//};\r\n\r\n//Path.FromCircle = function (center, radius)\r\n//{\r\n// let path = new Path();\r\n// path.AddArc(center, radius, 0, 360);\r\n// path.CalculateBounds();\r\n// return path;\r\n//};\r\n\r\n//Path.FromBezier = function (p1, cp1, cp2, p2, segments)\r\n//{\r\n// let path = new Path();\r\n// path.AddBezier(p1, cp1, cp2, p2, segments);\r\n// path.CalculateBounds();\r\n// return path;\r\n//};\r\n","// Bit flags\r\nconst Corners =\r\n{\r\n TopLeft: 1,\r\n TopRight: 2,\r\n BottomLeft: 4,\r\n BottomRight: 8,\r\n Top: 1 | 2,\r\n Bottom: 4 | 8,\r\n Left: 1 | 4,\r\n Right: 2 | 8,\r\n All: 1 | 2 | 4 | 8,\r\n None: 0\r\n};\r\n\r\nconst SelectionState = \r\n{\r\n Normal: 1,\r\n Selected: 2,\r\n Hover: 3\r\n};\r\n\r\n// Bit flags\r\nconst ElementType =\r\n{\r\n Display: 1,\r\n Input: 2,\r\n Output: 4,\r\n Toggle: 8,\r\n Default: 1 | 2 | 4 | 8\r\n};\r\n\r\nconst InteractionState =\r\n{\r\n None: 0,\r\n Panning: 1,\r\n Dragging: 2,\r\n Selecting: 3,\r\n Linking: 4,\r\n Disconnecting: 5,\r\n ScrollingNode: 6\r\n};\r\n\r\n// Bit flags\r\nconst MouseButtons = \r\n{\r\n None: 0,\r\n Left: 1,\r\n Right: 2,\r\n Middle: 4,\r\n Mouse4: 8,\r\n Mouse5: 16,\r\n\r\n BrowserBack: 8,\r\n BrowserForward: 16\r\n};\r\n\r\nconst MouseButton = \r\n{\r\n Left: 0,\r\n Middle: 1,\r\n Right: 2,\r\n Mouse4: 3,\r\n Mouse5: 4,\r\n\r\n BrowserBack: 3,\r\n BrowserForward: 4\r\n};\r\n\r\n// Bit flags\r\nconst SpecialKeys = \r\n{\r\n None: 0,\r\n Ctrl: 1,\r\n Alt: 2,\r\n Shift: 4,\r\n Meta: 8,\r\n Windows: 8,\r\n Command: 8\r\n};\r\n\r\nconst ConnectorType =\r\n{\r\n Input: 1,\r\n Output: 2\r\n};\r\n\r\n// Bit flags\r\nconst ResizeFlag =\r\n{\r\n None: 0,\r\n Horizontal: 1,\r\n Vertical: 2,\r\n Both: 1 | 2\r\n};\r\n\r\nconst NodeHitRegion =\r\n{\r\n None: 0,\r\n Node: 1,\r\n Checkbox: 2,\r\n ScrollbarUpper: 3,\r\n ScrollbarLower: 4,\r\n ScrollbarThumb: 5,\r\n ResizeThumb: 6,\r\n Header: 7,\r\n InputConnector: 8,\r\n OutputConnector: 9\r\n};\r\n\r\nconst ScrollHighlightState =\r\n{\r\n None: 0,\r\n Background: 1,\r\n Thumb: 2,\r\n Both: 3\r\n};\r\n","\"use strict\";\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Font Settings\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nconst FontSettings = function ()\r\n{\r\n let face = \"Arial, 'Open Sans', sans-serif\";\r\n let size = 16;\r\n let lineHeight = 20;\r\n let bold = false;\r\n let italic = false;\r\n let css = null;\r\n\r\n Object.defineProperty(this, \"Face\",\r\n {\r\n get: function () { return face; },\r\n set: function (newValue)\r\n {\r\n face = newValue;\r\n css = null;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Size\",\r\n {\r\n get: function () { return size; },\r\n set: function (newValue)\r\n {\r\n size = newValue;\r\n css = null;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"LineHeight\",\r\n {\r\n get: function () { return lineHeight; },\r\n set: function (newValue)\r\n {\r\n lineHeight = newValue;\r\n css = null;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Bold\",\r\n {\r\n get: function () { return bold; },\r\n set: function (newValue)\r\n {\r\n bold = newValue;\r\n css = null;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Italic\",\r\n {\r\n get: function () { return italic; },\r\n set: function (newValue)\r\n {\r\n italic = newValue;\r\n css = null;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Css\",\r\n {\r\n get: function ()\r\n {\r\n if (css == null)\r\n css = \"{0}{1}{2}px {3}\".format(bold ? \"bold \" : \"\", italic ? \"italic \" : \"\", size, face);\r\n return css;\r\n }\r\n });\r\n};\r\n\r\nconst ColorSettings = function ()\r\n{\r\n this.HeaderColor = \"hsla(0, 0%, 85%, 1.0)\";\r\n this.BodyColor = \"hsla(0, 0%, 80%, 1.0)\";\r\n this.HeaderBGColor = \"hsla(219, 70%, 30%, 1.0)\";\r\n this.BodyBGColor = \"hsla(219, 60%, 40%, 1.0)\";\r\n this.BorderColor = \"hsla(219, 40%, 60%, 1.0)\";\r\n this.SeparatorColor = \"hsla(219, 40%, 50%, 1.0)\";\r\n this.CheckBorderColor = \"hsla(219, 40%, 55%, 1.0)\";\r\n this.CheckBackColor = \"hsla(219, 73%, 30%, 1.0)\";\r\n this.CheckColor = \"hsla(0, 0%, 85%, 1.0)\";\r\n this.ConnectionColor = \"hsla(0, 0%, 80%, 1.0)\";\r\n this.ConnectionOutlineColor = null;\r\n};\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Node Settings\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nconst NodeSettings = function ()\r\n{\r\n let hslColor;\r\n //FIXME Recalc node size on setting change\r\n\r\n this.CornerRadius = 6;\r\n this.BorderWidth = 1;\r\n this.CheckSize = 14;\r\n this.CheckPadding = 5;\r\n this.ConnectorSize = 12;\r\n this.ConnectionWidth = 2;\r\n this.ConnectionOutlineWidth = 3;\r\n this.ConnectionHitTestWidth = 4;\r\n this.SeparatorWidth = 1;\r\n this.SeparatorOutset = 2;\r\n this.MinVisibleElements = 2;\r\n this.DefaultVisibleElements = 10;\r\n this.ResizeFlags = ResizeFlag.Vertical;\r\n this.ForcedFooterHeight = 5;\r\n this.ScrollbarWidth = 10;\r\n\r\n this.BodyPadding = new Padding(0, 4, 0, 4);\r\n this.RowPadding = new Padding(12, 4, 12, 4);\r\n\r\n this.ResizeThumbLineWidth = 1;\r\n\r\n this.Colors = {};\r\n this.Colors[SelectionState.Normal] = new ColorSettings();\r\n this.Colors[SelectionState.Normal].HeaderColor = \"hsla(0, 0%, 85%, 1.0)\";\r\n this.Colors[SelectionState.Normal].BodyColor = \"hsla(0, 0%, 80%, 1.0)\";\r\n this.Colors[SelectionState.Normal].HeaderBGColor = \"hsla(219, 70%, 30%, 1.0)\";\r\n this.Colors[SelectionState.Normal].BodyBGColor = \"hsla(219, 60%, 40%, 1.0)\";\r\n this.Colors[SelectionState.Normal].BorderColor = \"hsla(219, 40%, 60%, 1.0)\";\r\n this.Colors[SelectionState.Normal].SeparatorColor = \"hsla(219, 40%, 50%, 1.0)\";\r\n this.Colors[SelectionState.Normal].CheckBorderColor = \"hsla(219, 40%, 55%, 1.0)\";\r\n this.Colors[SelectionState.Normal].CheckBackColor = \"hsla(219, 73%, 30%, 1.0)\";\r\n this.Colors[SelectionState.Normal].CheckColor = \"hsla(0, 0%, 85%, 1.0)\";\r\n this.Colors[SelectionState.Normal].ScrollbarBGColor = \"hsla(219, 70%, 30%, 1.0)\";\r\n this.Colors[SelectionState.Normal].ScrollbarBGHLColor = \"hsla(219, 70%, 35%, 1.0)\";\r\n this.Colors[SelectionState.Normal].ScrollbarThumbColor = \"hsla(219, 60%, 45%, 1.0)\";\r\n this.Colors[SelectionState.Normal].ScrollbarThumbHLColor = \"hsla(219, 60%, 50%, 1.0)\";\r\n this.Colors[SelectionState.Normal].ScrollbarBorderColor = \"hsla(219, 40%, 55%, 1.0)\";\r\n this.Colors[SelectionState.Normal].ConnectionColor = \"hsla(0, 0%, 80%, 1.0)\";\r\n this.Colors[SelectionState.Normal].ConnectionOutlineColor = null;\r\n\r\n this.Colors[SelectionState.Hover] = new ColorSettings();\r\n this.Colors[SelectionState.Hover].HeaderColor = \"hsla(0, 0%, 85%, 1.0)\";\r\n this.Colors[SelectionState.Hover].BodyColor = \"hsla(0, 0%, 80%, 1.0)\";\r\n this.Colors[SelectionState.Hover].HeaderBGColor = \"hsla(140, 70%, 30%, 1.0)\";\r\n this.Colors[SelectionState.Hover].BodyBGColor = \"hsla(140, 60%, 40%, 1.0)\";\r\n this.Colors[SelectionState.Hover].BorderColor = \"hsla(140, 40%, 60%, 1.0)\";\r\n this.Colors[SelectionState.Hover].SeparatorColor = \"hsla(140, 40%, 50%, 1.0)\";\r\n this.Colors[SelectionState.Hover].CheckBorderColor = \"hsla(140, 40%, 55%, 1.0)\";\r\n this.Colors[SelectionState.Hover].CheckBackColor = \"hsla(140, 73%, 30%, 1.0)\";\r\n this.Colors[SelectionState.Hover].CheckColor = \"hsla(0, 0%, 85%, 1.0)\";\r\n this.Colors[SelectionState.Hover].ScrollbarBGColor = \"hsla(140, 70%, 30%, 1.0)\";\r\n this.Colors[SelectionState.Hover].ScrollbarBGHLColor = \"hsla(140, 70%, 35%, 1.0)\";\r\n this.Colors[SelectionState.Hover].ScrollbarThumbColor = \"hsla(140, 60%, 45%, 1.0)\";\r\n this.Colors[SelectionState.Hover].ScrollbarThumbHLColor = \"hsla(140, 60%, 50%, 1.0)\";\r\n this.Colors[SelectionState.Hover].ScrollbarBorderColor = \"hsla(140, 40%, 55%, 1.0)\";\r\n this.Colors[SelectionState.Hover].ConnectionColor = \"hsla(300, 100%, 45%, 1.0)\";\r\n this.Colors[SelectionState.Hover].ConnectionOutlineColor = null;\r\n\r\n this.Colors[SelectionState.Selected] = new ColorSettings();\r\n this.Colors[SelectionState.Selected].HeaderColor = \"hsla(0, 0%, 85%, 1.0)\";\r\n this.Colors[SelectionState.Selected].BodyColor = \"hsla(0, 0%, 80%, 1.0)\";\r\n this.Colors[SelectionState.Selected].HeaderBGColor = \"hsla(330, 70%, 30%, 1.0)\";\r\n this.Colors[SelectionState.Selected].BodyBGColor = \"hsla(330, 60%, 40%, 1.0)\";\r\n this.Colors[SelectionState.Selected].BorderColor = \"hsla(330, 40%, 60%, 1.0)\";\r\n this.Colors[SelectionState.Selected].SeparatorColor = \"hsla(330, 40%, 50%, 1.0)\";\r\n this.Colors[SelectionState.Selected].CheckBorderColor = \"hsla(330, 40%, 55%, 1.0)\";\r\n this.Colors[SelectionState.Selected].CheckBackColor = \"hsla(330, 73%, 30%, 1.0)\";\r\n this.Colors[SelectionState.Selected].CheckColor = \"hsla(0, 0%, 85%, 1.0)\";\r\n this.Colors[SelectionState.Selected].ScrollbarBGColor = \"hsla(330, 70%, 30%, 1.0)\";\r\n this.Colors[SelectionState.Selected].ScrollbarBGHLColor = \"hsla(330, 70%, 35%, 1.0)\";\r\n this.Colors[SelectionState.Selected].ScrollbarThumbColor = \"hsla(330, 60%, 45%, 1.0)\";\r\n this.Colors[SelectionState.Selected].ScrollbarThumbHLColor = \"hsla(330, 60%, 50%, 1.0)\";\r\n this.Colors[SelectionState.Selected].ScrollbarBorderColor = \"hsla(330, 40%, 55%, 1.0)\";\r\n this.Colors[SelectionState.Selected].ConnectionColor = \"hsla(60, 100%, 45%, 1.0)\";\r\n this.Colors[SelectionState.Selected].ConnectionOutlineColor = \"hsla(140, 100%, 45%, 1.0)\";\r\n\r\n hslColor = Color.FromHSL(220, 100, 65, 0.25);\r\n this.SelectionRectBGColor = hslColor.ToHSLAStr();\r\n hslColor.A = 0.5;\r\n this.SelectionRectBorderColor = hslColor.ToHSLAStr();\r\n\r\n this.HeaderPadding = new Size(16, 6);\r\n this.HeaderSeparatorWidth = 1;\r\n\r\n this.HeaderFont = new FontSettings();\r\n this.HeaderFont.Size = 13;\r\n this.HeaderFont.LineHeight = 16;\r\n this.HeaderFont.Bold = false;\r\n\r\n this.BodyFont = new FontSettings();\r\n this.BodyFont.Size = 12;\r\n this.BodyFont.LineHeight = 15;\r\n};\r\n","\"use strict\";\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Node Element Position Data\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nconst NodeElementPositionData = function ()\r\n{\r\n this.OuterRect = new Rectangle();\r\n this.InnerRect = new Rectangle();\r\n this.CheckRect = new Rectangle();\r\n this.FullTextRect = new Rectangle();\r\n this.CheckTextRect = new Rectangle();\r\n this.InputConnectorRect = new Rectangle();\r\n this.OutputConnectorRect = new Rectangle();\r\n\r\n this.SeparatorPath = null;\r\n this.CheckBGPath = null;\r\n this.CheckPath = null;\r\n this.FullTextClipPath = null;\r\n this.CheckTextClipPath = null;\r\n this.InputConnectorBGPath = null;\r\n this.InputConnectorPath = null;\r\n this.OutputConnectorBGPath = null;\r\n this.OutputConnectorPath = null;\r\n\r\n this.IncludeCheckSpacing = false;\r\n this.NodeSettings = null;\r\n\r\n this.Calculate = function (nodeSettings, bodyRect, rowHeight, includeCheckSpacing, includeScrollSpacing, context)\r\n {\r\n let padding, center;\r\n\r\n this.IncludeCheckSpacing = includeCheckSpacing;\r\n this.NodeSettings = nodeSettings;\r\n\r\n padding = new Padding(0, 0, 0, 0);\r\n\r\n this.OuterRect.Width = bodyRect.Width;\r\n this.OuterRect.Height = rowHeight;\r\n center = this.OuterRect.Center;\r\n\r\n padding.Left = -nodeSettings.BodyPadding.Left - nodeSettings.RowPadding.Left;\r\n padding.Right = -nodeSettings.BodyPadding.Right - nodeSettings.RowPadding.Right - (includeScrollSpacing ? nodeSettings.ScrollbarWidth + 2 : 0);\r\n padding.Top = -nodeSettings.RowPadding.Top;\r\n padding.Bottom = -nodeSettings.RowPadding.Bottom;\r\n\r\n this.InnerRect.CopyFrom(this.OuterRect);\r\n this.InnerRect.Inflate(padding);\r\n\r\n this.CheckRect.X = this.InnerRect.X;\r\n this.CheckRect.Y = Math.round(center.Y - nodeSettings.CheckSize * 0.5);\r\n this.CheckRect.Width = nodeSettings.CheckSize;\r\n this.CheckRect.Height = nodeSettings.CheckSize;\r\n\r\n this.FullTextRect.CopyFrom(this.InnerRect);\r\n this.CheckTextRect.CopyFrom(this.InnerRect);\r\n this.CheckTextRect.X += nodeSettings.CheckSize + nodeSettings.CheckPadding;\r\n this.CheckTextRect.Width -= nodeSettings.CheckSize + nodeSettings.CheckPadding;\r\n\r\n this.InputConnectorRect.X = -Math.floor(nodeSettings.ConnectorSize * 0.5);\r\n this.InputConnectorRect.Y = Math.round(center.Y - nodeSettings.ConnectorSize * 0.5);\r\n this.InputConnectorRect.Width = nodeSettings.ConnectorSize;\r\n this.InputConnectorRect.Height = nodeSettings.ConnectorSize;\r\n\r\n this.OutputConnectorRect.X = this.OuterRect.Right - Math.ceil(nodeSettings.ConnectorSize * 0.5);\r\n this.OutputConnectorRect.Y = Math.round(center.Y - nodeSettings.ConnectorSize * 0.5);\r\n this.OutputConnectorRect.Width = nodeSettings.ConnectorSize;\r\n this.OutputConnectorRect.Height = nodeSettings.ConnectorSize;\r\n\r\n this.CheckBGPath = this.CheckRect.ToRoundedRectPath(2, Corners.All);\r\n\r\n this.CheckPath = new Path();\r\n this.CheckPath.AutoClose = true;\r\n this.CheckPath.AddPoint(new Point(this.CheckRect.X + Math.round(nodeSettings.CheckSize * 0.15), this.CheckRect.Y + Math.round(nodeSettings.CheckSize * 0.55)));\r\n this.CheckPath.AddPoint(new Point(this.CheckRect.X + Math.round(nodeSettings.CheckSize * 0.40), this.CheckRect.Y + Math.round(nodeSettings.CheckSize * 0.85)));\r\n this.CheckPath.AddPoint(new Point(this.CheckRect.X + Math.round(nodeSettings.CheckSize * 0.85), this.CheckRect.Y + Math.round(nodeSettings.CheckSize * 0.30)));\r\n this.CheckPath.AddPoint(new Point(this.CheckRect.X + Math.round(nodeSettings.CheckSize * 0.70), this.CheckRect.Y + Math.round(nodeSettings.CheckSize * 0.15)));\r\n this.CheckPath.AddPoint(new Point(this.CheckRect.X + Math.round(nodeSettings.CheckSize * 0.45), this.CheckRect.Y + Math.round(nodeSettings.CheckSize * 0.60)));\r\n this.CheckPath.AddPoint(new Point(this.CheckRect.X + Math.round(nodeSettings.CheckSize * 0.30), this.CheckRect.Y + Math.round(nodeSettings.CheckSize * 0.45)));\r\n\r\n this.FullTextClipPath = this.FullTextRect.ToPath();\r\n this.CheckTextClipPath = this.CheckTextRect.ToPath();\r\n\r\n this.InputConnectorBGPath = this.InputConnectorRect.ToCirclePath();\r\n this.InputConnectorPath = this.InputConnectorRect.ToCirclePath(Math.round(nodeSettings.ConnectorSize * 0.25));\r\n\r\n this.OutputConnectorBGPath = this.OutputConnectorRect.ToCirclePath();\r\n this.OutputConnectorPath = this.OutputConnectorRect.ToCirclePath(Math.round(nodeSettings.ConnectorSize * 0.25));\r\n\r\n this.SeparatorPath = new Path();\r\n this.SeparatorPath.AddPoint(new Point(this.InnerRect.X - nodeSettings.SeparatorOutset, this.OuterRect.Bottom + Math.floor(nodeSettings.SeparatorWidth * 0.5)));\r\n this.SeparatorPath.AddPoint(new Point(this.InnerRect.Right + nodeSettings.SeparatorOutset, this.OuterRect.Bottom + Math.floor(nodeSettings.SeparatorWidth * 0.5)));\r\n };\r\n};\r\n","\"use strict\";\r\n\r\nconst Node = function (parentNodeGraph, nodeId, nodeName, x, y)\r\n{\r\n const _this = this;\r\n\r\n const noElementPadding = 5;\r\n const maxWidth = 250, minWidth = 120;\r\n\r\n let id, name, parent;\r\n let elements = [];\r\n let nameChangedEvent, elementAddingEvent, elementAddedEvent;\r\n let selectionState = SelectionState.Normal;\r\n let bounds = new Rectangle();\r\n let scrollIndex = 0, visibleElements = 0;\r\n let headerHeight, bodyHeight, hasCheckboxes, hasInputs, hasOutputs, hasScrollbar;\r\n let elementPosData = new NodeElementPositionData();\r\n let headerRect, fullRect, bodyRect, outerRect;\r\n let headerPath, fullPath, bodyPath, hdrSepPath, resizeThumbRenderPath, resizeThumbHitPath;\r\n let scrollRect, scrollThumbRect, scrollPath;\r\n let scrollHighlightState = ScrollHighlightState.None;\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"Parent\",\r\n {\r\n get: function () { return parent; }\r\n });\r\n\r\n Object.defineProperty(this, \"Graph\",\r\n {\r\n get: function () { return parent; }\r\n });\r\n\r\n Object.defineProperty(this, \"Name\",\r\n {\r\n get: function () { return name; },\r\n set: function (newValue)\r\n {\r\n if (newValue == null || typeof newValue != \"string\" || newValue.length == 0)\r\n throw \"Node requires valid name\";\r\n name = newValue;\r\n parent.Invalidate();\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Id\",\r\n {\r\n get: function () { return id; },\r\n set: function (newValue)\r\n {\r\n if (newValue == null)\r\n throw \"Node requires valid id\";\r\n id = newValue;\r\n parent.Invalidate();\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Elements\",\r\n {\r\n get: function () { return elements; }\r\n });\r\n\r\n Object.defineProperty(this, \"ElementPositionData\",\r\n {\r\n get: function () { return elementPosData; }\r\n });\r\n\r\n Object.defineProperty(this, \"Position\",\r\n {\r\n get: function () { return bounds.Position.Copy(); },\r\n set: function (newValue)\r\n {\r\n if (!(newValue instanceof Point))\r\n throw \"Node position must be an instance of Point\";\r\n bounds.Position = newValue;\r\n parent.Invalidate();\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Bounds\",\r\n {\r\n get: function () { return bounds; }\r\n });\r\n\r\n Object.defineProperty(this, \"SelectionState\",\r\n {\r\n get: function () { return selectionState; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"SelectionState must be a valid SelectionState enum value\";\r\n selectionState = newValue;\r\n parent.Invalidate();\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"ScrollIndex\",\r\n {\r\n get: function () { return scrollIndex; },\r\n set: function (newValue)\r\n {\r\n if (elements.length == 0)\r\n {\r\n scrollIndex = 0;\r\n return;\r\n }\r\n\r\n if (typeof newValue != \"number\")\r\n throw \"ScrollIndex must be a valid SelectionState enum value\";\r\n scrollIndex = MathEx.clamp(Math.floor(newValue), 0, Math.max(0, elements.length - visibleElements));\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"ScrollCount\",\r\n {\r\n get: function () { return elements.length - visibleElements; }\r\n });\r\n\r\n Object.defineProperty(this, \"ScrollHighlightState\",\r\n {\r\n get: function () { return scrollHighlightState; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"ScrollHighlightState must be a valid SelectionState enum value\";\r\n scrollHighlightState = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"VisibleElements\",\r\n {\r\n get: function () { return visibleElements; }\r\n });\r\n\r\n Object.defineProperty(this, \"ConnectorPath\",\r\n {\r\n get: function () { return connectorPath; }\r\n });\r\n\r\n Object.defineProperty(this, \"ConnectorBGPath\",\r\n {\r\n get: function () { return connectorBGPath; }\r\n });\r\n\r\n Object.defineProperty(this, \"HeaderRect\",\r\n {\r\n get: function () { return headerRect; }\r\n });\r\n\r\n Object.defineProperty(this, \"FullRect\",\r\n {\r\n get: function () { return fullRect; }\r\n });\r\n\r\n Object.defineProperty(this, \"OuterRect\",\r\n {\r\n get: function () { return outerRect; }\r\n });\r\n\r\n Object.defineProperty(this, \"HasCheckboxes\",\r\n {\r\n get: function () { return hasCheckboxes; }\r\n });\r\n\r\n Object.defineProperty(this, \"HasInputs\",\r\n {\r\n get: function () { return hasInputs; }\r\n });\r\n\r\n Object.defineProperty(this, \"HasOutputs\",\r\n {\r\n get: function () { return hasOutputs; }\r\n });\r\n\r\n Object.defineProperty(this, \"HasScrollbar\",\r\n {\r\n get: function () { return hasScrollbar; }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Function pointer properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"Render\",\r\n {\r\n get: function () { return Render; }\r\n });\r\n\r\n Object.defineProperty(this, \"AddElement\",\r\n {\r\n get: function () { return AddElement; }\r\n });\r\n\r\n Object.defineProperty(this, \"GetElementById\",\r\n {\r\n get: function () { return GetElementById; }\r\n });\r\n \r\n Object.defineProperty(this, \"GetHitRegion\",\r\n {\r\n get: function () { return GetHitRegion; }\r\n });\r\n\r\n Object.defineProperty(this, \"ToggleCheckAt\",\r\n {\r\n get: function () { return ToggleCheckAt; }\r\n });\r\n\r\n Object.defineProperty(this, \"GetHoverConnector\",\r\n {\r\n get: function () { return GetHoverConnector; }\r\n });\r\n\r\n Object.defineProperty(this, \"UpdateScrollThumb\",\r\n {\r\n get: function () { return UpdateScrollThumb; }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Event triggers\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n let FireNameChangedEvent = function (prevName)\r\n {\r\n let ret = parent.dispatchEvent(new CustomEvent(\"NodeNameChanged\",\r\n {\r\n detail: { Node: _this, PreviousName: prevName },\r\n bubbles: true,\r\n cancelable: false\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireNodeElementAddingEvent = function (elementId)\r\n {\r\n let ret = parent.dispatchEvent(new CustomEvent(\"NodeElementAdding\",\r\n {\r\n detail: { Node: _this, ElementId: elementId },\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireNodeElementAddedEvent = function (element)\r\n {\r\n let ret = parent.dispatchEvent(new CustomEvent(\"NodeElementAdded\",\r\n {\r\n detail: { Node: _this, Element: element },\r\n bubbles: true,\r\n cancelable: false\r\n }));\r\n return ret;\r\n };\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Functions\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n let Initialize = function (parentNodeGraph, nodeId, nodeName, x, y)\r\n {\r\n let size;\r\n if (parentNodeGraph == null || !(parentNodeGraph instanceof Nodegraph))\r\n throw \"Node requires handle to parent node graph\";\r\n\r\n if (nodeId == null)\r\n throw \"Node requires valid id\";\r\n\r\n if (nodeName == null || typeof nodeName != \"string\" || nodeName.length == 0)\r\n throw \"Node requires valid name\";\r\n\r\n parent = parentNodeGraph;\r\n id = nodeId;\r\n name = nodeName;\r\n\r\n bounds.X = x;\r\n bounds.Y = y;\r\n\r\n CalculateNodeSize(false);\r\n };\r\n\r\n let CalculateNodeSize = function (preserveVisibleElements)\r\n {\r\n let context, elementTextHeight, i, maxTextWidth, size, p1, p2, resizeInset, resizeOffset, rowHeight;\r\n let nodeSettings = parent.NodeSettings;\r\n\r\n context = parent.Get2DRenderingContext();\r\n size = parent.MeasureString(name, nodeSettings.HeaderFont, context);\r\n headerHeight = Math.ceil(size.Height + nodeSettings.HeaderPadding.Height * 2);\r\n bounds.Width = Math.ceil(size.Width + nodeSettings.HeaderPadding.Width * 2);\r\n elementTextHeight = parent.MeasureString(\"[wXyZ)\", nodeSettings.BodyFont, context).Height;\r\n rowHeight = Math.ceil(elementTextHeight + nodeSettings.RowPadding.Top + nodeSettings.RowPadding.Bottom);\r\n hasCheckboxes = hasInputs = hasOutputs = false;\r\n\r\n if (elements.length > 0)\r\n {\r\n if (!preserveVisibleElements)\r\n visibleElements = Math.min(elements.length, nodeSettings.DefaultVisibleElements);\r\n\r\n for (i = 0; i < elements.length; i++)\r\n {\r\n if (elements[i].Type.isBitSet(ElementType.Toggle))\r\n hasCheckboxes = true;\r\n if (elements[i].Type.isBitSet(ElementType.Input))\r\n hasInputs = true;\r\n if (elements[i].Type.isBitSet(ElementType.Output))\r\n hasOutputs = true;\r\n }\r\n bodyHeight = visibleElements * rowHeight + nodeSettings.BodyPadding.Top + nodeSettings.BodyPadding.Bottom;\r\n if (bounds.Width < maxWidth)\r\n {\r\n for (i = 0; i < elements.length; i++)\r\n {\r\n size = parent.MeasureString(elements[i].Name, nodeSettings.BodyFont);\r\n size.Width += nodeSettings.RowPadding.Left + nodeSettings.RowPadding.Right + nodeSettings.BodyPadding.Left + nodeSettings.BodyPadding.Right;\r\n if (hasCheckboxes)\r\n size.Width += nodeSettings.CheckSize + nodeSettings.CheckPadding;\r\n\r\n if (size.Width > bounds.Width)\r\n bounds.Width = size.Width;\r\n }\r\n }\r\n }\r\n else\r\n {\r\n visibleElements = 0;\r\n bodyHeight = 0;\r\n }\r\n\r\n bounds.Width = MathEx.clamp(bounds.Width, minWidth, maxWidth);\r\n bodyHeight = Math.max(bodyHeight, noElementPadding, nodeSettings.CornerRadius + 2);\r\n if (nodeSettings.ResizeFlags != ResizeFlag.None)\r\n {\r\n resizeInset = Math.ceil(nodeSettings.CornerRadius * 0.65);\r\n resizeOffset = nodeSettings.ResizeThumbLineWidth + 3;\r\n bodyHeight += resizeInset * 2 + resizeOffset * 3;\r\n }\r\n else\r\n bodyHeight += nodeSettings.CornerRadius + nodeSettings.ForcedFooterHeight;\r\n\r\n headerRect = new Rectangle(0, 0, bounds.Width, headerHeight);\r\n bodyRect = new Rectangle(0, headerRect.Bottom, bounds.Width, bodyHeight);\r\n fullRect = new Rectangle(0, 0, bounds.Width, headerRect.Height + bodyRect.Height);\r\n outerRect = fullRect.Copy();\r\n outerRect.Inflate(Math.ceil(nodeSettings.ConnectorSize * 0.5), 0);\r\n bounds.Height = fullRect.Height;\r\n\r\n hasScrollbar = elements.length > visibleElements;\r\n if (hasScrollbar)\r\n {\r\n //FIXME increase hit rect of scrollbar to avoid accidental node drag ops\r\n scrollRect = new Rectangle();\r\n scrollRect.X = bodyRect.Right + (-nodeSettings.RowPadding.Right - nodeSettings.ScrollbarWidth + 4);\r\n scrollRect.Y = bodyRect.Top + nodeSettings.BodyPadding.Top;\r\n scrollRect.Width = nodeSettings.ScrollbarWidth;\r\n scrollRect.Height = visibleElements * rowHeight + 1;\r\n scrollPath = scrollRect.ToRoundedRectPath(2);\r\n scrollThumbRect = scrollRect.Copy();\r\n scrollThumbRect.Height = rowHeight;\r\n scrollThumbRect.Inflate(-1);\r\n }\r\n else\r\n scrollRect = scrollPath = scrollThumbRect = null;\r\n\r\n elementPosData.Calculate(nodeSettings, bodyRect, rowHeight, hasCheckboxes, hasScrollbar, context);\r\n if (elements.length > 0)\r\n {\r\n for (i = 0; i < elements.length; i++)\r\n {\r\n maxTextWidth = elements[i].Type.isBitSet(ElementType.Toggle) ? elementPosData.CheckTextRect.Width : elementPosData.FullTextRect.Width;\r\n elements[i].CalculateVisibleText(maxTextWidth, context);\r\n }\r\n }\r\n\r\n if (nodeSettings.CornerRadius < 2.0)\r\n {\r\n headerPath = headerRect.ToPath();\r\n bodyPath = bodyRect.ToPath();\r\n fullPath = fullRect.ToPath();\r\n }\r\n else\r\n {\r\n headerPath = headerRect.ToRoundedRectPath(nodeSettings.CornerRadius, Corners.Top);\r\n bodyPath = bodyRect.ToRoundedRectPath(nodeSettings.CornerRadius, Corners.Bottom);\r\n fullPath = fullRect.ToRoundedRectPath(nodeSettings.CornerRadius, Corners.All);\r\n }\r\n\r\n hdrSepPath = new Path();\r\n\r\n hdrSepPath.AddPoint(new Point(0, headerHeight));\r\n hdrSepPath.AddPoint(new Point(bounds.Width, headerHeight));\r\n\r\n if (nodeSettings.ResizeFlags != ResizeFlag.None)\r\n {\r\n resizeThumbRenderPath = new Path();\r\n\r\n p1 = new Point(bodyRect.Right - resizeInset, bodyRect.Bottom - 2);\r\n p2 = new Point(bodyRect.Right - 2, bodyRect.Bottom - resizeInset);\r\n p1.X -= resizeOffset;\r\n p2.Y -= resizeOffset;\r\n resizeThumbRenderPath.AddLine(p1.Copy(), p2.Copy());\r\n p1.X -= resizeOffset;\r\n p2.Y -= resizeOffset;\r\n resizeThumbRenderPath.AddLine(p1.Copy(), p2.Copy());\r\n p1.X -= resizeOffset;\r\n p2.Y -= resizeOffset;\r\n resizeThumbRenderPath.AddLine(p1.Copy(), p2.Copy());\r\n\r\n resizeThumbHitPath = new Path();\r\n resizeThumbHitPath.AutoClose = true;\r\n\r\n p1 = new Point(bodyRect.Right, bodyRect.Bottom - (resizeInset + resizeOffset * 3 + nodeSettings.ResizeThumbLineWidth));\r\n resizeThumbHitPath.AddPoint(p1.Copy());\r\n p1 = new Point(bodyRect.Right - (resizeInset + resizeOffset * 3 + nodeSettings.ResizeThumbLineWidth), bodyRect.Bottom);\r\n resizeThumbHitPath.AddPoint(p1.Copy());\r\n if (nodeSettings.CornerRadius > 0)\r\n {\r\n //FIXME - Calculate corner once connections are working\r\n }\r\n else\r\n resizeThumbHitPath.AddPoint(new Point(bodyRect.Right, bodyRect.Bottom));\r\n }\r\n };\r\n\r\n let Render = function (context)\r\n {\r\n let color1, color2;\r\n let nodeSettings = parent.NodeSettings;\r\n let colors = nodeSettings.Colors[selectionState];\r\n\r\n context.save();\r\n {\r\n context.translate(bounds.X, bounds.Y);\r\n headerPath.Fill(context, colors.HeaderBGColor);\r\n bodyPath.Fill(context, colors.BodyBGColor);\r\n if (nodeSettings.BorderWidth > 0)\r\n {\r\n context.lineWidth = nodeSettings.BorderWidth;\r\n fullPath.Stroke(context, colors.BorderColor);\r\n }\r\n if (nodeSettings.HeaderSeparatorWidth > 0)\r\n {\r\n context.lineWidth = nodeSettings.HeaderSeparatorWidth;\r\n hdrSepPath.Stroke(context, colors.SeparatorColor);\r\n }\r\n\r\n headerPath.StartClipToBounds(context);\r\n {\r\n context.textAlign = \"center\";\r\n context.textBaseline = \"middle\";\r\n context.font = nodeSettings.HeaderFont.Css;\r\n context.fillStyle = colors.HeaderColor;\r\n context.fillText(name, Math.round(bounds.Width * 0.5), Math.ceil(nodeSettings.HeaderPadding.Height + nodeSettings.HeaderFont.LineHeight * 0.5) + 1);\r\n }\r\n headerPath.EndClip(context);\r\n\r\n y = headerHeight + nodeSettings.BodyPadding.Top;\r\n if (elements.length > 0)\r\n {\r\n for (let i = 0; i < visibleElements; i++)\r\n {\r\n elements[i + scrollIndex].Render(context, y, elementPosData);\r\n y += elementPosData.OuterRect.Height;\r\n }\r\n }\r\n\r\n if (nodeSettings.ResizeFlags != ResizeFlag.None && resizeThumbRenderPath != null)\r\n {\r\n context.lineWidth = nodeSettings.ResizeThumbLineWidth;\r\n resizeThumbRenderPath.Stroke(context, colors.BorderColor);\r\n }\r\n\r\n if (hasScrollbar)\r\n {\r\n switch (scrollHighlightState)\r\n {\r\n case ScrollHighlightState.Both:\r\n color1 = colors.ScrollbarBGHLColor;\r\n color2 = colors.ScrollbarThumbHLColor;\r\n break;\r\n case ScrollHighlightState.Background:\r\n color1 = colors.ScrollbarBGHLColor;\r\n color2 = colors.ScrollbarThumbColor;\r\n break;\r\n case ScrollHighlightState.Thumb:\r\n color1 = colors.ScrollbarBGColor;\r\n color2 = colors.ScrollbarThumbHLColor;\r\n break;\r\n default:\r\n color1 = colors.ScrollbarBGColor;\r\n color2 = colors.ScrollbarThumbColor;\r\n break;\r\n }\r\n\r\n scrollPath.Fill(context, color1);\r\n if (parent.HoverNode != _this || parent.InteractionState != InteractionState.ScrollingNode)\r\n scrollThumbRect.Y = scrollRect.Top + (scrollIndex / _this.ScrollCount) * (scrollRect.Height - scrollThumbRect.Height);\r\n scrollThumbRect.Fill(context, color2);\r\n scrollPath.Stroke(context, colors.ScrollbarBorderColor);\r\n }\r\n }\r\n context.restore();\r\n };\r\n\r\n let AddElement = function (elementId, elementName, elementType, elementChecked)\r\n {\r\n let element;\r\n\r\n if (elements.lastIndexOf(elementId) > 0)\r\n throw \"Node already contains an element with id '{0}'.\".format(elementId);\r\n\r\n if (FireNodeElementAddingEvent(elementId))\r\n {\r\n element = new NodeElement(this, elementId, elementName, elementType, elementChecked, elements.length);\r\n elements.push(element);\r\n FireNodeElementAddedEvent(element);\r\n CalculateNodeSize(false);\r\n parent.Invalidate();\r\n return element;\r\n }\r\n return null;\r\n };\r\n\r\n let GetElementById = function (id)\r\n {\r\n if (elements.length == 0 || id == null)\r\n return null;\r\n for (let i = 0; i < elements.length; i++)\r\n {\r\n if (elements[i].Id == id)\r\n return elements[i];\r\n }\r\n return null;\r\n };\r\n\r\n let GetHitRegion = function (point)\r\n {\r\n // Transform the hit test point to be in local node space\r\n let hitPos = new Point(point.X - bounds.X, point.Y - bounds.Y);\r\n\r\n if (hasScrollbar && scrollRect.Contains(hitPos))\r\n {\r\n if (scrollThumbRect.Contains(hitPos))\r\n return NodeHitRegion.ScrollbarThumb;\r\n else if (hitPos.Y < scrollThumbRect.Y)\r\n return NodeHitRegion.ScrollbarUpper;\r\n else\r\n return NodeHitRegion.ScrollbarLower;\r\n }\r\n if (elements.length > 0)\r\n {\r\n // The following is a bit non-intuitive.\r\n // Bounding boxes for individual elements and their children are not stored due to scroll and resize requirements.\r\n // Rather than transforming the local element coordinates into node space, we adjust the hit location so that it falls\r\n // within the local coordinate space of the element. This effectively means that the y position of the hit location gets\r\n // decremented as the element list is enumerated.\r\n hitPos.Y -= headerRect.Bottom + parent.NodeSettings.BodyPadding.Top;\r\n for (let i = 0; i < visibleElements; i++)\r\n {\r\n // Check to see if the hit falls within the current element bounds\r\n if (elementPosData.OuterRect.Contains(hitPos))\r\n {\r\n if (elements[i + scrollIndex].Type.isBitSet(ElementType.Toggle))\r\n {\r\n if (elementPosData.CheckRect.Contains(hitPos))\r\n return NodeHitRegion.Checkbox;\r\n }\r\n }\r\n hitPos.Y -= elementPosData.OuterRect.Height;\r\n }\r\n }\r\n return NodeHitRegion.Node;\r\n };\r\n\r\n let ToggleCheckAt = function (point)\r\n {\r\n let element;\r\n // Transform the hit test point to be in local node space\r\n let hitPos = new Point(point.X - bounds.X, point.Y - bounds.Y);\r\n\r\n if (elements.length > 0)\r\n {\r\n // See note in GetHitRegion\r\n hitPos.Y -= headerRect.Bottom + parent.NodeSettings.BodyPadding.Top;\r\n for (let i = 0; i < visibleElements; i++)\r\n {\r\n element = elements[i + scrollIndex];\r\n if (elementPosData.OuterRect.Contains(hitPos))\r\n {\r\n if (element.Type.isBitSet(ElementType.Toggle))\r\n {\r\n if (elementPosData.CheckRect.Contains(hitPos))\r\n {\r\n element.Checked = !element.Checked;\r\n return;\r\n }\r\n }\r\n }\r\n hitPos.Y -= elementPosData.OuterRect.Height;\r\n }\r\n }\r\n };\r\n\r\n let GetHoverConnector = function (point, includeInput, includeOutput)\r\n {\r\n let element;\r\n includeInput = typeof includeInput != \"boolean\" ? true : includeInput;\r\n includeOutput = typeof includeOutput != \"boolean\" ? true : includeOutput;\r\n // Transform the hit test point to be in local node space\r\n let hitPos = new Point(point.X - bounds.X, point.Y - bounds.Y);\r\n\r\n if (elements.length > 0)\r\n {\r\n // See note in GetHitRegion\r\n hitPos.Y -= headerRect.Bottom + parent.NodeSettings.BodyPadding.Top;\r\n for (let i = 0; i < visibleElements; i++)\r\n {\r\n element = elements[i + scrollIndex];\r\n\r\n if (includeInput && element.Type.isBitSet(ElementType.Input))\r\n {\r\n if (elementPosData.InputConnectorRect.Contains(hitPos))\r\n return element.InputConnector;\r\n }\r\n if (includeOutput && element.Type.isBitSet(ElementType.Output))\r\n {\r\n if (elementPosData.OutputConnectorRect.Contains(hitPos))\r\n return element.OutputConnector;\r\n }\r\n hitPos.Y -= elementPosData.OuterRect.Height;\r\n }\r\n }\r\n };\r\n\r\n let UpdateScrollThumb = function (offset)\r\n {\r\n let pos, index;\r\n if (offset != 0)\r\n {\r\n pos = MathEx.clamp(scrollThumbRect.Y + offset - scrollRect.Y, 0, scrollRect.Height - scrollThumbRect.Height);\r\n index = Math.round(pos / (scrollRect.Height - scrollThumbRect.Height) * _this.ScrollCount);\r\n if (index != scrollIndex)\r\n scrollIndex = index;\r\n scrollThumbRect.Y = scrollRect.Top + pos;\r\n }\r\n };\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Initialization\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Initialize(parentNodeGraph, nodeId, nodeName, x, y);\r\n};\r\n","\"use strict\";\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Node Connector\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nconst NodeConnector = function (parentElement, connectorType)\r\n{\r\n const _this = this;\r\n let connections, parent, type;\r\n\r\n if (parentElement == null || !(parentElement instanceof NodeElement))\r\n throw \"Node connector requires a valid parent element\";\r\n\r\n connections = [];\r\n parent = parentElement;\r\n type = connectorType;\r\n\r\n Object.defineProperty(this, \"Parent\",\r\n {\r\n get: function () { return parent; }\r\n });\r\n\r\n Object.defineProperty(this, \"Element\",\r\n {\r\n get: function () { return parent; }\r\n });\r\n\r\n Object.defineProperty(this, \"Node\",\r\n {\r\n get: function () { return parent.Parent; }\r\n });\r\n\r\n Object.defineProperty(this, \"Graph\",\r\n {\r\n get: function () { return parent.Parent.Parent; }\r\n });\r\n\r\n Object.defineProperty(this, \"Type\",\r\n {\r\n get: function () { return type; }\r\n });\r\n\r\n Object.defineProperty(this, \"Connections\",\r\n {\r\n get: function () { return connections; }\r\n });\r\n};\r\n","\"use strict\";\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Node Connection\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nconst NodeConnection = function (inputConnector, outputConnector)\r\n{\r\n const _this = this;\r\n const segmentCount = 25;\r\n\r\n let input, output;\r\n\r\n // FIXME - Implement connection locking behavior\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"Input\",\r\n {\r\n get: function () { return input; },\r\n set: function (newValue)\r\n {\r\n if (newValue != null && !(newValue instanceof NodeConnector))\r\n throw \"Node connections can only be made between NodeConnector instances\";\r\n input = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Output\",\r\n {\r\n get: function () { return output; },\r\n set: function (newValue)\r\n {\r\n if (newValue != null && !(newValue instanceof NodeConnector))\r\n throw \"Node connections can only be made between NodeConnector instances\";\r\n output = newValue;\r\n }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Function pointer properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"HitTest\",\r\n {\r\n get: function () { return HitTest; }\r\n });\r\n\r\n Object.defineProperty(this, \"Render\",\r\n {\r\n get: function () { return Render; }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Functions\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n let HitTest = function (point)\r\n {\r\n let path, hit;\r\n let graph = input.Parent.Parent.Parent;\r\n let settings = graph.NodeSettings;\r\n\r\n path = GetPath();\r\n return path.HitTest(point, Math.round(settings.ConnectionHitTestWidth * 0.5));\r\n };\r\n\r\n let GetPath = function ()\r\n {\r\n let path, start, end, cp1, cp2, dist, hDist, center;\r\n let element, node;\r\n let graph = input.Parent.Parent.Parent;\r\n\r\n element = output.Parent;\r\n node = element.Parent;\r\n center = node.ElementPositionData.OutputConnectorRect.Center;\r\n start = center.Copy();\r\n start.X += node.Bounds.X;\r\n if (element.Index < node.ScrollIndex)\r\n start.Y = node.Bounds.Y + node.HeaderRect.Center.Y;\r\n else if (element.Index > node.ScrollIndex + node.VisibleElements)\r\n start.Y = node.Bounds.Bottom - (graph.NodeSettings.CornerRadius + graph.NodeSettings.ForcedFooterHeight * 0.5);\r\n else\r\n start.Y = node.Bounds.Y + node.HeaderRect.Bottom + graph.NodeSettings.BodyPadding.Top + node.ElementPositionData.OuterRect.Height * (element.Index - node.ScrollIndex + 1) - center.Y;\r\n start.Y = Math.round(start.Y);\r\n\r\n element = input.Parent;\r\n node = element.Parent;\r\n center = node.ElementPositionData.InputConnectorRect.Center;\r\n end = center.Copy();\r\n end.X += node.Bounds.X;\r\n if (element.Index < node.ScrollIndex)\r\n end.Y = node.Bounds.Y + node.HeaderRect.Center.Y;\r\n else if (element.Index > node.ScrollIndex + node.VisibleElements)\r\n end.Y = node.Bounds.Bottom - (graph.NodeSettings.CornerRadius + graph.NodeSettings.ForcedFooterHeight * 0.5);\r\n else\r\n end.Y = node.Bounds.Y + node.HeaderRect.Bottom + graph.NodeSettings.BodyPadding.Top + node.ElementPositionData.OuterRect.Height * (element.Index - node.ScrollIndex + 1) - center.Y;\r\n end.Y = Math.round(end.Y);\r\n\r\n hDist = Math.abs(start.X - end.X);\r\n dist = start.Distance(end);\r\n\r\n cp1 = start.Copy();\r\n cp1.X += Math.max(hDist * 0.75, dist * 0.33);\r\n cp2 = end.Copy();\r\n cp2.X -= Math.max(hDist * 0.75, dist * 0.33);\r\n\r\n path = new Path();\r\n path.AddBezier(start, cp1, cp2, end, segmentCount);\r\n return path;\r\n };\r\n\r\n let Render = function (context)\r\n {\r\n let selState, selCon, path;\r\n\r\n let graph = input.Parent.Parent.Parent;\r\n let settings = graph.NodeSettings;\r\n\r\n selCon = graph.GetSelectedConnections();\r\n if (_this == graph.HoverConnection)\r\n selState = SelectionState.Hover;\r\n else if (selCon.length > 0 && selCon.lastIndexOf(_this) > -1)\r\n selState = SelectionState.Selected;\r\n else\r\n selState = SelectionState.Normal;\r\n\r\n path = GetPath();\r\n context.save();\r\n if (settings.Colors[selState].ConnectionOutlineColor != null)\r\n {\r\n context.lineWidth = settings.ConnectionOutlineWidth;\r\n path.Stroke(settings.Colors[selState].ConnectionOutlineColor);\r\n }\r\n context.lineWidth = settings.ConnectionWidth;\r\n path.Stroke(context, settings.Colors[selState].ConnectionColor);\r\n context.restore();\r\n };\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Initialization\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n if (inputConnector == null || outputConnector == null || !(inputConnector instanceof NodeConnector) || !(outputConnector instanceof NodeConnector))\r\n throw \"AddConnection requires a valid input and output connector\";\r\n\r\n if (inputConnector.Type != ConnectorType.Input && inputConnector.Type != ConnectorType.Output)\r\n throw \"Input connector does not have a valid connector type\";\r\n\r\n if (outputConnector.Type != ConnectorType.Input && outputConnector.Type != ConnectorType.Output)\r\n throw \"Output connector does not have a valid connector type\";\r\n\r\n if (inputConnector.Type == outputConnector.Type)\r\n throw \"Input and output connectors cannot have the same connector type\";\r\n\r\n if (inputConnector.Parent == outputConnector.Parent)\r\n throw \"A node element cannot connect to itself\";\r\n\r\n if (inputConnector.Parent.Parent == outputConnector.Parent.Parent)\r\n throw \"A node cannot connect to itself\";\r\n\r\n input = inputConnector;\r\n output = outputConnector;\r\n};\r\n\r\nNodeConnection.RenderPartialLink = function (context, connector, endPoint)\r\n{\r\n let node, start, path, dist, hDist, cp1, cp2, conRect;\r\n let nodeSettings = connector.Graph.NodeSettings;\r\n\r\n if (context == null || connector == null)\r\n return;\r\n\r\n node = connector.Node;\r\n\r\n conRect = connector.Type == ConnectorType.Input ? node.ElementPositionData.InputConnectorRect : node.ElementPositionData.OutputConnectorRect;\r\n\r\n start = node.Bounds.Position.Copy();\r\n start.X += conRect.Center.X;\r\n start.Y += node.HeaderRect.Height + nodeSettings.BodyPadding.Top;\r\n start.Y += node.ElementPositionData.OuterRect.Height * (connector.Element.Index - node.ScrollIndex);\r\n start.Y += conRect.Center.Y;\r\n\r\n hDist = Math.abs(start.X - endPoint.X);\r\n dist = start.Distance(endPoint);\r\n\r\n cp1 = start.Copy();\r\n cp2 = endPoint.Copy();\r\n if (connector.Type == ConnectorType.Input)\r\n {\r\n cp1.X -= Math.max(hDist * 0.75, dist * 0.33);\r\n cp2.X += Math.max(hDist * 0.75, dist * 0.33);\r\n }\r\n else\r\n {\r\n cp1.X += Math.max(hDist * 0.75, dist * 0.33);\r\n cp2.X -= Math.max(hDist * 0.75, dist * 0.33);\r\n }\r\n path = new Path();\r\n path.AddBezier(start, cp1, cp2, endPoint);\r\n\r\n context.save();\r\n context.lineWidth = nodeSettings.ConnectionOutlineWidth;\r\n if (nodeSettings.Colors[SelectionState.Selected].ConnectionOutlineColor != null)\r\n path.Stroke(nodeSettings.Colors[SelectionState.Selected].ConnectionOutlineColor);\r\n context.lineWidth = nodeSettings.ConnectionWidth;\r\n path.Stroke(context, nodeSettings.Colors[SelectionState.Selected].ConnectionColor);\r\n context.restore();\r\n};\r\n","\"use strict\";\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Node Element\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\nconst NodeElement = function (parentNode, elementId, elementName, elementType, elementChecked, elementIndex)\r\n{\r\n const _this = this;\r\n\r\n let parent, index, id, name, type, checked, renderText;\r\n let inputConnector = null, outputConnector = null;\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"Parent\",\r\n {\r\n get: function () { return parent; }\r\n });\r\n\r\n Object.defineProperty(this, \"Node\",\r\n {\r\n get: function () { return parent; }\r\n });\r\n\r\n Object.defineProperty(this, \"Graph\",\r\n {\r\n get: function () { return parent.Parent; }\r\n });\r\n\r\n Object.defineProperty(this, \"Id\",\r\n {\r\n get: function () { return id; }\r\n });\r\n\r\n Object.defineProperty(this, \"Name\",\r\n {\r\n get: function () { return name; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"string\" || newValue == null || newValue.length == 0)\r\n throw \"Node element requires a valid element name\";\r\n name = newValue;\r\n FireNameChangedEvent();\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Checked\",\r\n {\r\n get: function ()\r\n {\r\n if (type.isBitSet(ElementType.Toggle))\r\n return checked;\r\n return false;\r\n },\r\n set: function (newValue)\r\n {\r\n if (!type.isBitSet(ElementType.Toggle))\r\n return;\r\n if (typeof newValue != \"boolean\")\r\n throw \"Checked must be a boolean value\";\r\n if (FireCheckChangingEvent())\r\n {\r\n checked = newValue;\r\n FireCheckChangedEvent();\r\n parent.Parent.Invalidate();\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Type\",\r\n {\r\n get: function () { return type; },\r\n set: function (newValue)\r\n {\r\n if (typeof newValue != \"number\")\r\n throw \"Type must be an number\";\r\n type = newValue;\r\n }\r\n });\r\n\r\n Object.defineProperty(this, \"Bounds\",\r\n {\r\n get: function () { return bounds; }\r\n });\r\n\r\n Object.defineProperty(this, \"InputConnector\",\r\n {\r\n get: function () { return inputConnector; }\r\n });\r\n\r\n Object.defineProperty(this, \"OutputConnector\",\r\n {\r\n get: function () { return outputConnector; }\r\n });\r\n\r\n Object.defineProperty(this, \"CheckRect\",\r\n {\r\n get: function () { return checkRect; }\r\n });\r\n\r\n Object.defineProperty(this, \"Index\",\r\n {\r\n get: function () { return index; }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Function pointer properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"Render\",\r\n {\r\n get: function () { return Render; }\r\n });\r\n\r\n Object.defineProperty(this, \"CalculateVisibleText\",\r\n {\r\n get: function () { return CalculateVisibleText; }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Event triggers\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n let FireNameChangedEvent = function (prevName)\r\n {\r\n let ret = parent.Parent.dispatchEvent(new CustomEvent(\"ElementNameChanged\",\r\n {\r\n detail: { Node: parent, NodeElement: _this, PreviousName: prevName },\r\n bubbles: true,\r\n cancelable: false\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireCheckChangingEvent = function ()\r\n {\r\n let ret = parent.Parent.dispatchEvent(new CustomEvent(\"ElementCheckChanging\",\r\n {\r\n detail: { Node: parent, NodeElement: _this },\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireCheckChangedEvent = function ()\r\n {\r\n let ret = parent.Parent.dispatchEvent(new CustomEvent(\"ElementCheckChanged\",\r\n {\r\n detail: { Node: parent, NodeElement: _this },\r\n bubbles: true,\r\n cancelable: false\r\n }));\r\n return ret;\r\n };\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Functions\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n let Initialize = function (parentNode, elementId, elementName, elementType, elementChecked, elementIndex)\r\n {\r\n if (parentNode == null || !(parentNode instanceof Node))\r\n throw \"Node element requires a valid parent node\";\r\n\r\n if (elementId == null)\r\n throw \"Node element requires a non-null element id\";\r\n\r\n if (typeof elementName != \"string\" || elementName == null || elementName.length == 0)\r\n throw \"Node element requires a valid element name\";\r\n\r\n if (typeof elementType != \"number\")\r\n elementType = ElementType.Default;\r\n\r\n if (typeof elementChecked != \"boolean\")\r\n elementChecked = false;\r\n\r\n parent = parentNode;\r\n index = elementIndex;\r\n id = elementId;\r\n name = elementName;\r\n type = elementType;\r\n checked = type.isBitSet(ElementType.Toggle) && elementChecked;\r\n if (type.isBitSet(ElementType.Input))\r\n inputConnector = new NodeConnector(_this, ConnectorType.Input);\r\n if (type.isBitSet(ElementType.Output))\r\n outputConnector = new NodeConnector(_this, ConnectorType.Output);\r\n };\r\n\r\n let CalculateVisibleText = function (maxWidth, context)\r\n {\r\n let textWidth, graph;\r\n\r\n graph = parent.Parent;\r\n textWidth = graph.MeasureString(name, graph.NodeSettings.BodyFont, context).Width;\r\n renderText = \"\";\r\n\r\n //FIXME - Visible text calculation could probably be more efficient\r\n if (textWidth > maxWidth)\r\n {\r\n for (let i = 0; i < name.length; i++)\r\n {\r\n textWidth = graph.MeasureString(renderText + name[i] + \"...\", graph.NodeSettings.BodyFont, context).Width;\r\n if (textWidth > maxWidth)\r\n {\r\n renderText += \"...\";\r\n break;\r\n }\r\n renderText += name[i];\r\n }\r\n }\r\n else\r\n renderText = name;\r\n };\r\n\r\n let Render = function (context, yOffset, renderSettings)\r\n {\r\n let selectionState, colors, conColors, textRect, textClip;\r\n let graph = parent.Parent;\r\n\r\n colors = renderSettings.NodeSettings.Colors[parent.SelectionState];\r\n context.save();\r\n {\r\n context.translate(0, yOffset);\r\n if (type.isBitSet(ElementType.Toggle))\r\n {\r\n context.lineWidth = 1.0;\r\n renderSettings.CheckBGPath.Fill(context, colors.CheckBackColor);\r\n renderSettings.CheckBGPath.Stroke(context, colors.CheckBorderColor);\r\n if (checked)\r\n renderSettings.CheckPath.Fill(context, colors.CheckColor);\r\n }\r\n\r\n if (type.isBitSet(ElementType.Input))\r\n {\r\n selectionState = inputConnector == parent.Parent.HoverConnector ? SelectionState.Hover : parent.SelectionState;\r\n conColors = renderSettings.NodeSettings.Colors[selectionState];\r\n context.lineWidth = 1.0;\r\n renderSettings.InputConnectorBGPath.Fill(context, conColors.CheckBackColor);\r\n renderSettings.InputConnectorBGPath.Stroke(context, conColors.CheckBorderColor);\r\n if (inputConnector.Connections.length > 0)\r\n {\r\n if (graph.HoverConnection != null && graph.HoverConnection.Input == inputConnector)\r\n renderSettings.InputConnectorPath.Fill(context, renderSettings.NodeSettings.Colors[SelectionState.Hover].ConnectionColor);\r\n else\r\n renderSettings.InputConnectorPath.Fill(context, conColors.CheckColor);\r\n }\r\n }\r\n\r\n if (type.isBitSet(ElementType.Output))\r\n {\r\n selectionState = outputConnector == parent.Parent.HoverConnector ? SelectionState.Hover : parent.SelectionState;\r\n conColors = renderSettings.NodeSettings.Colors[selectionState];\r\n context.lineWidth = 1.0;\r\n renderSettings.OutputConnectorBGPath.Fill(context, conColors.CheckBackColor);\r\n renderSettings.OutputConnectorBGPath.Stroke(context, conColors.CheckBorderColor);\r\n if (outputConnector.Connections.length > 0)\r\n {\r\n if (graph.HoverConnection != null && graph.HoverConnection.Output == outputConnector)\r\n renderSettings.OutputConnectorPath.Fill(context, renderSettings.NodeSettings.Colors[SelectionState.Hover].ConnectionColor);\r\n else\r\n renderSettings.OutputConnectorPath.Fill(context, conColors.CheckColor);\r\n }\r\n }\r\n\r\n context.lineWidth = renderSettings.NodeSettings.SeparatorWidth;\r\n renderSettings.SeparatorPath.Stroke(context, colors.SeparatorColor);\r\n\r\n if (renderSettings.IncludeCheckSpacing)\r\n {\r\n textRect = renderSettings.CheckTextRect;\r\n textClip = renderSettings.CheckTextClipPath;\r\n }\r\n else\r\n {\r\n textRect = renderSettings.FullTextRect;\r\n textClip = renderSettings.FullTextClipPath;\r\n }\r\n\r\n textClip.StartClipToBounds(context);\r\n {\r\n context.textAlign = \"left\";\r\n context.textBaseline = \"bottom\";\r\n context.font = renderSettings.NodeSettings.BodyFont.Css;\r\n context.fillStyle = colors.BodyColor;\r\n context.fillText(renderText, textRect.X, textRect.Bottom);\r\n }\r\n textClip.EndClip(context);\r\n }\r\n context.restore();\r\n };\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Initialization\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Initialize(parentNode, elementId, elementName, elementType, elementChecked, elementIndex);\r\n};\r\n","\"use strict\";\r\n\r\nconst Nodegraph = function ()\r\n{\r\n const _this = this; // ¯\\_(ツ)_/¯, javascript OOP FTW!\r\n\r\n // TODO\r\n // When multiple nodes are selecting starting a drag operation resets the selection to the node clicked\r\n\r\n // FIXME - Convert the below to vars when grid/snap is implemented\r\n const showGridLines = false;\r\n const snapToGrid = false;\r\n const gridSpacing = 50;\r\n const gridSubDivisions = 5;\r\n\r\n const disconnectDistanceSq = 2.0 * 2.0;\r\n\r\n let containerId, container, canvas;\r\n let canvasRect;\r\n let interactionState = InteractionState.None;\r\n let mousePos = new Point(0, 0), lastMouse = new Point(0, 0);\r\n let ctrlKey, shiftKey;\r\n let translation = new Point(0, 0);\r\n let viewport = new Rectangle(), lastViewport = new Rectangle(), clearRect = new Rectangle();\r\n let selectStart = new Point(0, 0), selectEnd = new Point(0, 0), disconnectPt = new Point(0, 0);\r\n let selectionRect = new Rectangle(0, 0, 0, 0);\r\n let zoom = 1.0;\r\n let suppressRendering = false;\r\n let selectionDirty = false;\r\n let eventListeners = {};\r\n let nodes = [], selectedNodes = [], prevSelectedNodes = [];\r\n let baseNodePositions = [];\r\n let connections = [], selectedConnections = [], prevSelectedConnections = [];\r\n let hoverNode = null, hoverConnection = null, hoverConnector = null, linkStartConnector = null;\r\n let currentNodeHitRegion = NodeHitRegion.None;\r\n let nodeSettings = null;\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n Object.defineProperty(this, \"SuppressRendering\",\r\n {\r\n get: function () { return suppressRendering; },\r\n set: function (newValue) { suppressRendering = newValue; }\r\n });\r\n\r\n Object.defineProperty(this, \"CursorPos\",\r\n {\r\n get: function () { return mousePos; }\r\n });\r\n\r\n Object.defineProperty(this, \"InteractionState\",\r\n {\r\n get: function () { return interactionState; }\r\n });\r\n\r\n Object.defineProperty(this, \"Translation\",\r\n {\r\n get: function () { return translation; }\r\n });\r\n\r\n Object.defineProperty(this, \"HoverNode\",\r\n {\r\n get: function () { return hoverNode; }\r\n });\r\n\r\n Object.defineProperty(this, \"HoverConnector\",\r\n {\r\n get: function () { return hoverConnector; }\r\n });\r\n\r\n Object.defineProperty(this, \"HoverConnection\",\r\n {\r\n get: function () { return hoverConnection; }\r\n });\r\n\r\n Object.defineProperty(this, \"NodeSettings\",\r\n {\r\n get: function () { return nodeSettings; }\r\n });\r\n\r\n Object.defineProperty(this, \"Nodes\",\r\n {\r\n get: function () { return nodes; }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Function pointer properties\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n Object.defineProperty(this, \"dispatchEvent\",\r\n {\r\n get: function () { return dispatchEvent; }\r\n });\r\n\r\n Object.defineProperty(this, \"addEventListener\",\r\n {\r\n get: function () { return addEventListener; }\r\n });\r\n\r\n Object.defineProperty(this, \"removeEventListener\",\r\n {\r\n get: function () { return removeEventListener; }\r\n });\r\n\r\n Object.defineProperty(this, \"Invalidate\",\r\n {\r\n get: function () { return Invalidate; }\r\n });\r\n\r\n Object.defineProperty(this, \"MeasureString\",\r\n {\r\n get: function () { return MeasureString; }\r\n });\r\n\r\n Object.defineProperty(this, \"AddNode\",\r\n {\r\n get: function () { return AddNode; }\r\n });\r\n\r\n Object.defineProperty(this, \"Initialize\",\r\n {\r\n get: function () { return Initialize; }\r\n });\r\n\r\n Object.defineProperty(this, \"GetNodeById\",\r\n {\r\n get: function () { return GetNodeById; }\r\n });\r\n\r\n Object.defineProperty(this, \"GetSelectedNodes\",\r\n {\r\n get: function () { return GetSelectedNodes; }\r\n });\r\n\r\n Object.defineProperty(this, \"GetSelectedConnections\",\r\n {\r\n get: function () { return GetSelectedConnections; }\r\n });\r\n\r\n Object.defineProperty(this, \"AddConnection\",\r\n {\r\n get: function () { return AddConnection; }\r\n });\r\n\r\n Object.defineProperty(this, \"RemoveConnection\",\r\n {\r\n get: function () { return RemoveConnection; }\r\n });\r\n\r\n Object.defineProperty(this, \"Get2DRenderingContext\",\r\n {\r\n get: function () { return Get2DRenderingContext; }\r\n });\r\n\r\n Object.defineProperty(this, \"GetGraphMetadata\",\r\n {\r\n get: function () { return GetGraphMetadata; }\r\n });\r\n\r\n Object.defineProperty(this, \"PerformLayout\",\r\n {\r\n get: function () { return PerformLayout; }\r\n });\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Event triggers\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n let FireNodeAddingEvent = function (nodeId)\r\n {\r\n let ret = dispatchEvent(new CustomEvent(\"NodeAdding\",\r\n {\r\n detail: { NodeId: nodeId },\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireNodeAddedEvent = function (node)\r\n {\r\n let ret = dispatchEvent(new CustomEvent(\"NodeAdded\",\r\n {\r\n detail: { Node: node },\r\n bubbles: true,\r\n cancelable: false\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireNodeRemovingEvent = function (node)\r\n {\r\n let ret = dispatchEvent(new CustomEvent(\"NodeRemoving\",\r\n {\r\n detail: { Node: node },\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireNodeRemovedEvent = function (nodeId)\r\n {\r\n let ret = dispatchEvent(new CustomEvent(\"NodeRemoved\",\r\n {\r\n detail: { NodeId: nodeId },\r\n bubbles: true,\r\n cancelable: false\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireSelectionChangedEvent = function ()\r\n {\r\n let ret = dispatchEvent(new CustomEvent(\"SelectionChanged\",\r\n {\r\n bubbles: true,\r\n cancelable: false\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireValidateConnectionEvent = function (inputConnector, outputConnector)\r\n {\r\n let ret = dispatchEvent(new CustomEvent(\"ValidateConnection\",\r\n {\r\n detail: { Input: inputConnector, Output: outputConnector },\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireConnectionAddingEvent = function (inputConnector, outputConnector)\r\n {\r\n let ret = dispatchEvent(new CustomEvent(\"ConnectionAdding\",\r\n {\r\n detail: { Input: inputConnector, Output: outputConnector },\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireConnectionAddedEvent = function (inputConnector, outputConnector)\r\n {\r\n let ret = dispatchEvent(new CustomEvent(\"ConnectionAdded\",\r\n {\r\n detail: { Input: inputConnector, Output: outputConnector },\r\n bubbles: true,\r\n cancelable: false\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireValidateDisconnectionEvent = function (inputConnector, outputConnector)\r\n {\r\n let ret = dispatchEvent(new CustomEvent(\"ValidateDisconnection\",\r\n {\r\n detail: { Input: inputConnector, Output: outputConnector },\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireConnectionRemovingEvent = function (inputConnector, outputConnector)\r\n {\r\n let ret = dispatchEvent(new CustomEvent(\"ConnectionRemoving\",\r\n {\r\n detail: { Input: inputConnector, Output: outputConnector },\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n return ret;\r\n };\r\n\r\n let FireConnectionRemovedEvent = function (inputConnector, outputConnector)\r\n {\r\n let ret = dispatchEvent(new CustomEvent(\"ConnectionRemoved\",\r\n {\r\n detail: { Input: inputConnector, Output: outputConnector },\r\n bubbles: true,\r\n cancelable: false\r\n }));\r\n return ret;\r\n };\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Functions\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n let Initialize = function (elementId, settings)\r\n {\r\n let attr;\r\n\r\n if (typeof elementId != \"string\" || elementId.length == 0)\r\n throw \"Invalid node graph container id\";\r\n\r\n containerId = elementId;\r\n container = document.getElementById(containerId);\r\n if (!container)\r\n throw \"Could not find node graph element '{0}'\".format(containerId);\r\n canvas = document.createElement(\"canvas\");\r\n attr = document.createAttribute(\"id\");\r\n canvas.setAttribute(\"id\", containerId + \"_canvas\");\r\n canvas.setAttribute(\"width\", container.clientWidth);\r\n canvas.setAttribute(\"height\", container.clientHeight);\r\n canvas.setAttribute(\"tabindex\", -1);\r\n container.appendChild(canvas);\r\n\r\n if (settings instanceof NodeSettings)\r\n nodeSettings = settings;\r\n else\r\n nodeSettings = new NodeSettings();\r\n\r\n ConfigureEvents();\r\n\r\n OnWindowResize();\r\n };\r\n\r\n let AddNode = function (nodeId, nodeName, x, y)\r\n {\r\n let node;\r\n\r\n if (nodes.length > 0)\r\n {\r\n for (let i = 0; i < length; i++)\r\n {\r\n if (nodes[i].Id == nodeId)\r\n throw \"Graph already contains a node with id '{0}'.\".format(nodeId);\r\n }\r\n }\r\n\r\n if (FireNodeAddingEvent(nodeId))\r\n {\r\n node = new Node(_this, nodeId, nodeName, x, y);\r\n nodes.push(node);\r\n FireNodeAddedEvent(node);\r\n Invalidate();\r\n return node;\r\n }\r\n return null;\r\n };\r\n\r\n let AddConnection = function (inputConnector, outputConnector)\r\n {\r\n let connection;\r\n\r\n if (!ValidateConnection(inputConnector, outputConnector))\r\n return null;\r\n if (!FireConnectionAddingEvent(inputConnector, outputConnector))\r\n return null;\r\n\r\n connection = new NodeConnection(inputConnector, outputConnector);\r\n\r\n inputConnector.Connections.push(connection);\r\n outputConnector.Connections.push(connection);\r\n connections.push(connection);\r\n\r\n FireConnectionAddedEvent(inputConnector, outputConnector);\r\n return connection;\r\n };\r\n\r\n let ValidateConnection = function (inputConnector, outputConnector)\r\n {\r\n // FIXME - Update to return a numeric validation error code instead of boolean\r\n if (inputConnector == null || outputConnector == null || !(inputConnector instanceof NodeConnector) || !(outputConnector instanceof NodeConnector))\r\n throw \"AddConnection requires a valid input and output connector\";\r\n\r\n if (inputConnector.Type != ConnectorType.Input && inputConnector.Type != ConnectorType.Output)\r\n throw \"Input connector does not have a valid connector type\";\r\n\r\n if (outputConnector.Type != ConnectorType.Input && outputConnector.Type != ConnectorType.Output)\r\n throw \"Output connector does not have a valid connector type\";\r\n\r\n // Input and output connectors cannot have the same connector type\r\n if (inputConnector.Type == outputConnector.Type)\r\n return false;\r\n\r\n // A node element cannot connect to itself\r\n if (inputConnector.Parent == outputConnector.Parent)\r\n return false;\r\n\r\n // A node cannot connect to itself\r\n if (inputConnector.Parent.Parent == outputConnector.Parent.Parent)\r\n return false;\r\n\r\n // Check to see if a connection between the specified connectors already exists\r\n if (inputConnector.Connections.length > 0)\r\n {\r\n for (let i = 0; i < inputConnector.Connections.length; i++)\r\n {\r\n // No need to test the input connector as it should always be inputConnector\r\n if (inputConnector.Connections[i].Output == outputConnector)\r\n return false;\r\n }\r\n }\r\n return FireValidateConnectionEvent(inputConnector, outputConnector);\r\n };\r\n\r\n let RemoveNode = function (node)\r\n {\r\n let i, index, cons;\r\n if (!FireNodeRemovingEvent(node))\r\n return false;\r\n if (connections.length > 0)\r\n {\r\n cons = connections.slice();\r\n for (i = 0; i < cons.length; i++)\r\n {\r\n if (cons[i].Input.Node == node || cons[i].Output.Node == 0)\r\n {\r\n if (!RemoveConnection(cons[i]))\r\n return;\r\n }\r\n }\r\n }\r\n // Remove from graph\r\n index = nodes.lastIndexOf(node);\r\n nodes.splice(index, 1);\r\n\r\n if (selectedNodes.length > 0)\r\n {\r\n // Remove from graph\r\n index = selectedNodes.lastIndexOf(node);\r\n if (index > -1)\r\n selectedNodes.splice(index, 1);\r\n }\r\n FireNodeRemovedEvent(node.Id);\r\n Invalidate();\r\n\r\n return true;\r\n };\r\n\r\n let RemoveConnection = function (connection)\r\n {\r\n let index;\r\n if (!ValidateDisconnection(connection))\r\n return false;\r\n if (!FireConnectionRemovingEvent(connection.Input, connection.Output))\r\n return false;\r\n // Remove from input connector\r\n index = connection.Input.Connections.lastIndexOf(connection);\r\n connection.Input.Connections.splice(index, 1);\r\n\r\n // Remove from output connector\r\n index = connection.Output.Connections.lastIndexOf(connection);\r\n connection.Output.Connections.splice(index, 1);\r\n\r\n // Remove from graph\r\n index = connections.lastIndexOf(connection);\r\n connections.splice(index, 1);\r\n\r\n // Remove from graph\r\n index = selectedConnections.lastIndexOf(connection);\r\n if (index > -1)\r\n selectedConnections.splice(index, 1);\r\n FireConnectionRemovedEvent(connection.Input, connection.Output);\r\n Invalidate();\r\n\r\n return true;\r\n };\r\n\r\n let ValidateDisconnection = function (connection)\r\n {\r\n if (connection == null || !(connection instanceof NodeConnection))\r\n throw \"Supplied connection is not a valid NodeCollection instance\";\r\n if (connection.Input == null || connection.Output == null || !(connection.Input instanceof NodeConnector) || !(connection.Output instanceof NodeConnector))\r\n throw \"Supplied connection does not have a populated input and output connector\";\r\n\r\n return FireValidateDisconnectionEvent(connection.Input, connection.Output);\r\n };\r\n\r\n let Get2DRenderingContext = function ()\r\n {\r\n return canvas.getContext(\"2d\");\r\n };\r\n\r\n let MeasureString = function (str, fontSettings, context)\r\n {\r\n let prevFont = null, size = new Size(0, 0);\r\n\r\n if (typeof str != \"string\" || str == null || str.length == 0)\r\n return new Size();\r\n\r\n if (fontSettings == null || !(fontSettings instanceof FontSettings))\r\n fontSettings = new FontSettings();\r\n\r\n if (context == null)\r\n context = canvas.getContext(\"2d\");\r\n else\r\n prevFont = context.font;\r\n\r\n context.font = fontSettings.Css;\r\n size.Width = context.measureText(str).width;\r\n size.Height = fontSettings.LineHeight;\r\n\r\n if (prevFont != null)\r\n context.font = prevFont;\r\n\r\n return size;\r\n };\r\n\r\n let Invalidate = function ()\r\n {\r\n if (suppressRendering)\r\n return;\r\n Render();\r\n };\r\n\r\n let Render = function ()\r\n {\r\n // FIXME viewport & mouse calculations are off by 1 or 2 pixels. This is likely due to some padding/margin/border\r\n // not being included in the size calculations. Figure it out & remove mitigation hackery\r\n let i, offset, context;\r\n\r\n //FIXME Determine if getting the bounding rect each rendering call has a performance overhead\r\n canvasRect = canvas.getBoundingClientRect();\r\n offset = new Point(0, 0);\r\n context = canvas.getContext(\"2d\");\r\n\r\n // Enable image smoothing. Is this necessary? Canvas has no means to control line & text antialiasing\r\n // so this only affects image rendering.\r\n context.imageSmoothingEnabled = true;\r\n if (context.imageSmoothingQuality)\r\n context.imageSmoothingQuality = \"high\";\r\n\r\n context.lineJoin = \"round\";\r\n\r\n // Rest the transformation back to identity just in case the context wasn't fully restored\r\n // Canvas is \"helpful\" in that it doesn't automatically reset the identity on each rendering pass\r\n context.setTransform(1, 0, 0, 1, 0, 0);\r\n\r\n // Set translation to match current viewport & offset everything by half a pixel\r\n // It appears that canvas performs all calculations based on pixel center instead of pixel edge, so\r\n // offsetting everything by half a pixel ensures that as long as we're using integer based coordinates\r\n // we won't get inconsistent & fuzzy lines/text.\r\n context.translate(translation.X + 0.5, translation.Y + 0.5);\r\n context.save();\r\n\r\n // Canvas has no built in means to clear the \"viewport\" so we have to manually track\r\n // the possible viewable region, then manually clear it. This isn't an ideal approach\r\n // but should be good enough since we aren't dealing with rapid viewport region changes.\r\n clearRect.CopyFrom(lastViewport);\r\n clearRect.UnionWith(viewport);\r\n // Inflate the clear area by 2 just to make sure there are no edge artifacts\r\n clearRect.Inflate(2);\r\n context.clearRect(clearRect.X, clearRect.Y, clearRect.Width, clearRect.Height);\r\n\r\n // Render debug axis, left in place until after graph scrolling is functional\r\n //RenderAxis(context);\r\n\r\n if (connections.length > 0)\r\n {\r\n for (i = 0; i < connections.length; i++)\r\n {\r\n context.save();\r\n connections[i].Render(context);\r\n context.restore();\r\n }\r\n }\r\n\r\n if (nodes.length > 0)\r\n {\r\n // Render each node, resetting the context after each, this way each node starts out in the same\r\n // rendering state as its siblings\r\n for (i = 0; i < nodes.length; i++)\r\n {\r\n context.save();\r\n nodes[i].Render(context);\r\n context.restore();\r\n }\r\n }\r\n\r\n if (interactionState == InteractionState.Linking && linkStartConnector != null)\r\n NodeConnection.RenderPartialLink(context, linkStartConnector, new Point(mousePos.X - translation.X + 0.5, mousePos.Y - translation.Y + 0.5));\r\n\r\n if (interactionState == InteractionState.Selecting)\r\n {\r\n context.lineWidth = 1.0;\r\n selectionRect.Fill(context, nodeSettings.SelectionRectBGColor);\r\n selectionRect.Stroke(context, nodeSettings.SelectionRectBorderColor);\r\n context.restore();\r\n }\r\n };\r\n\r\n // FIXME Remove this after basic view management is complete\r\n // Debug method to render the typical red/blue origin axis\r\n let RenderAxis = function (context)\r\n {\r\n let i, path;\r\n\r\n context.lineWidth = 1.0;\r\n context.save();\r\n\r\n context.beginPath();\r\n context.moveTo(-2000, 0);\r\n context.lineTo(2000, 0);\r\n\r\n for (i = -2000; i <= 2000; i += 50)\r\n {\r\n if (i != 0)\r\n {\r\n context.moveTo(i, -25);\r\n context.lineTo(i, 25);\r\n }\r\n }\r\n context.strokeStyle = \"red\";\r\n context.stroke();\r\n\r\n context.beginPath();\r\n context.moveTo(0, -2000);\r\n context.lineTo(0, 2000);\r\n for (i = -2000; i <= 2000; i += 50)\r\n {\r\n if (i != 0)\r\n {\r\n context.moveTo(-25, i);\r\n context.lineTo(25, i);\r\n }\r\n }\r\n context.strokeStyle = \"blue\";\r\n context.stroke();\r\n context.restore();\r\n };\r\n\r\n let GetNodeById = function (id)\r\n {\r\n if (nodes.length == 0 || id == null)\r\n return null;\r\n for (let i = 0; i < nodes.length; i++)\r\n {\r\n if (nodes[i].Id == id)\r\n return nodes[i];\r\n }\r\n return null;\r\n };\r\n\r\n // Clears the selection tracking arrays, optionally suppressing the selection changed event\r\n let ClearSelection = function (suppressEvent)\r\n {\r\n let i, fireEvent = false, shouldInvalidate = false;\r\n\r\n if (typeof suppressEvent != \"boolean\")\r\n suppressEvent = false;\r\n\r\n if (selectedNodes.length > 0)\r\n {\r\n // Reset node selected flag & clear the array\r\n for (i = 0; i < selectedNodes.length; i++)\r\n selectedNodes[i].SelectionState = SelectionState.Normal;\r\n selectedNodes.length = 0;\r\n shouldInvalidate = true;\r\n\r\n if (!suppressEvent)\r\n fireEvent = true;\r\n }\r\n\r\n // Connections have no internal selection state tracking, so just dump the array\r\n if (selectedConnections.length > 0)\r\n {\r\n selectedConnections.length = 0;\r\n shouldInvalidate = true;\r\n\r\n if (!suppressEvent)\r\n fireEvent = true;\r\n }\r\n if (fireEvent)\r\n {\r\n if (interactionState != InteractionState.Selecting)\r\n FireSelectionChangedEvent();\r\n else\r\n selectionDirty = true;\r\n }\r\n if (shouldInvalidate)\r\n Invalidate();\r\n };\r\n\r\n let DeleteSelection = function ()\r\n {\r\n let sel, i;\r\n let selectionCount = selectedNodes.length + selectedConnections.length;\r\n\r\n if (selectionCount == 0)\r\n return;\r\n\r\n //FIXME use something other than confirm & allow for customizable message\r\n if (selectionCount > 1)\r\n {\r\n if (!confirm(\"Are you sure you wish to remove the selected items?\"))\r\n return;\r\n }\r\n\r\n suppressRendering = true;\r\n if (selectedConnections.length > 0)\r\n {\r\n sel = GetSelectedConnections();\r\n for (i = 0; i < sel.length; i++)\r\n RemoveConnection(sel[i]);\r\n }\r\n selectedConnections.length = 0;\r\n prevSelectedConnections.length = 0;\r\n\r\n if (selectedNodes.length > 0)\r\n {\r\n sel = GetSelectedNodes();\r\n for (i = 0; i < sel.length; i++)\r\n RemoveNode(sel[i]);\r\n }\r\n selectedNodes.length = 0;\r\n prevSelectedNodes.length = 0;\r\n suppressRendering = false;\r\n Invalidate();\r\n\r\n };\r\n\r\n let SelectNode = function (node, keepExisting)\r\n {\r\n let index;\r\n\r\n if (node == null || (selectedNodes.length == 1 && selectedNodes[0] == node))\r\n return false;\r\n\r\n keepExisting == typeof keepExisting == \"boolean\" ? keepExisting : false;\r\n\r\n if (!keepExisting)\r\n ClearSelection(true);\r\n\r\n if (selectedNodes.length == 0 || selectedNodes.lastIndexOf(node) == -1)\r\n {\r\n // Move node to end of node array\r\n index = nodes.lastIndexOf(node);\r\n nodes.splice(index, 1);\r\n nodes.push(node);\r\n\r\n // Add node to selected array\r\n selectedNodes.push(node);\r\n\r\n if (node.SelectionState != SelectionState.Hover)\r\n node.SelectionState = SelectionState.Selected;\r\n\r\n if (interactionState != InteractionState.Selecting)\r\n FireSelectionChangedEvent();\r\n else\r\n selectionDirty = true;\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n let SelectConnection = function (connection, keepExisting)\r\n {\r\n if (connection == null || (selectedConnections.length == 1 && selectedConnections[0] == connection))\r\n return false;\r\n\r\n keepExisting == typeof keepExisting == \"boolean\" ? keepExisting : false;\r\n\r\n if (!keepExisting)\r\n ClearSelection(true);\r\n\r\n if (selectedConnections.length == 0 || selectedConnections.lastIndexOf(connection) == -1)\r\n {\r\n selectedConnections.push(connection);\r\n if (interactionState != InteractionState.Selecting)\r\n FireSelectionChangedEvent();\r\n else\r\n selectionDirty = true;\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n let DeselectNode = function (node)\r\n {\r\n let index;\r\n\r\n if (selectedNodes.length > 0 && selectedNodes.lastIndexOf(node) > -1)\r\n {\r\n index = selectedNodes.lastIndexOf(node);\r\n selectedNodes.splice(index, 1);\r\n node.SelectionState = SelectionState.Normal;\r\n if (interactionState != InteractionState.Selecting)\r\n FireSelectionChangedEvent();\r\n else\r\n selectionDirty = true;\r\n }\r\n };\r\n\r\n let GetSelectedNodes = function ()\r\n {\r\n // Return a copy of the selection array to help mitigate external changes\r\n return selectedNodes.slice();\r\n };\r\n\r\n let GetSelectedConnections = function ()\r\n {\r\n // Return a copy of the selection array to help mitigate external changes\r\n return selectedConnections.slice();\r\n };\r\n\r\n let SetHoverNode = function (node)\r\n {\r\n if (node != hoverNode)\r\n {\r\n if (hoverNode != null)\r\n {\r\n hoverNode.ScrollHighlightState = ScrollHighlightState.None;\r\n if (selectedNodes.lastIndexOf(hoverNode) > -1)\r\n hoverNode.SelectionState = SelectionState.Selected;\r\n else\r\n hoverNode.SelectionState = SelectionState.Normal;\r\n }\r\n hoverNode = node;\r\n if (node != null)\r\n hoverNode.SelectionState = SelectionState.Hover;\r\n }\r\n };\r\n\r\n let PanView = function ()\r\n {\r\n // if the interaction state is panning, update the translation position\r\n // based on the change in mouse position.\r\n translation.X += Math.round((mousePos.X - lastMouse.X) / zoom);\r\n translation.Y += Math.round((mousePos.Y - lastMouse.Y) / zoom);\r\n return true;\r\n };\r\n\r\n let ScrollNode = function ()\r\n {\r\n let offset;\r\n\r\n if (hoverNode == null || currentNodeHitRegion != NodeHitRegion.ScrollbarThumb)\r\n return false;\r\n\r\n offset = Math.round((mousePos.Y - lastMouse.Y) / zoom);\r\n if (offset == 0)\r\n return false;\r\n\r\n hoverNode.UpdateScrollThumb(offset);\r\n return true;\r\n };\r\n\r\n let DragSelection = function ()\r\n {\r\n let offset, snapped, node;\r\n let shouldInvalidate = false;\r\n\r\n if (selectedNodes.length == 0)\r\n return false;\r\n\r\n offset = new Point(Math.round((mousePos.X - lastMouse.X) / zoom), Math.round((mousePos.Y - lastMouse.Y) / zoom));\r\n if (offset.IsZero())\r\n return false;\r\n\r\n for (let i = 0; i < selectedNodes.length; i++)\r\n {\r\n node = selectedNodes[i];\r\n baseNodePositions[i].X += offset.X;\r\n baseNodePositions[i].Y += offset.Y;\r\n\r\n if (snapToGrid && showGridLines)\r\n {\r\n gridSDSpacing = Math.round(gridSpacing / gridSubDivisions);\r\n snapped = new Point(Math.round(baseNodePositions[i].X / gridSDSpacing) * gridSDSpacing, \r\n Math.round(baseNodePositions[i].Y / gridSDSpacing) * gridSDSpacing);\r\n }\r\n else\r\n snapped = baseNodePositions[i].Copy();\r\n\r\n if (!node.Bounds.Position.Equals(snapped))\r\n {\r\n node.Bounds.Position.CopyFrom(snapped);\r\n shouldInvalidate = true;\r\n }\r\n }\r\n return shouldInvalidate;\r\n };\r\n\r\n let UpdateRectSelection = function (forceUpdate)\r\n {\r\n let transformed;\r\n\r\n forceUpdate = typeof forceUpdate != \"boolean\" ? false : forceUpdate;\r\n\r\n transformed = new Point(Math.round(mousePos.X / zoom) - translation.X, Math.round(mousePos.Y / zoom) - translation.Y);\r\n if (!forceUpdate && transformed.Equals(selectEnd))\r\n return false;\r\n selectEnd.CopyFrom(transformed);\r\n\r\n selectionRect.X = Math.min(selectStart.X, selectEnd.X);\r\n selectionRect.Y = Math.min(selectStart.Y, selectEnd.Y);\r\n selectionRect.Width = Math.abs(selectStart.X - selectEnd.X);\r\n selectionRect.Height = Math.abs(selectStart.Y - selectEnd.Y);\r\n\r\n UpdateSelection();\r\n return true;\r\n };\r\n\r\n let EndRectSelection = function ()\r\n {\r\n if (selectionDirty)\r\n {\r\n FireSelectionChangedEvent();\r\n selectionDirty = false;\r\n }\r\n prevSelectedNodes.length = 0;\r\n prevSelectedConnections.length = 0;\r\n interactionState = InteractionState.None;\r\n return true;\r\n };\r\n\r\n let UpdateSelection = function ()\r\n {\r\n let selected, node;\r\n let tmpNodes = nodes.slice();\r\n\r\n for (let i = 0; i < tmpNodes.length; i++)\r\n {\r\n let node = tmpNodes[i];\r\n selected = false;\r\n\r\n if (ctrlKey)\r\n selected = selectionRect.Contains(node.Bounds);\r\n else\r\n selected = selectionRect.Intersects(node.Bounds);\r\n\r\n if (selected)\r\n SelectNode(node, true);\r\n else\r\n {\r\n if (!shiftKey && !ctrlKey)\r\n DeselectNode(node);\r\n else if (prevSelectedNodes.lastIndexOf(node) == -1)\r\n DeselectNode(node);\r\n }\r\n }\r\n };\r\n\r\n let GetGraphMetadata = function ()\r\n {\r\n let i, metadata, node, nodeData, con, conData;\r\n\r\n metadata =\r\n {\r\n ScrollOffset: { X: 0, Y: 0 },\r\n NodeData: {},\r\n SelectedNodes: [],\r\n SelectedConnections: []\r\n };\r\n\r\n for (i = 0; i < nodes.length; i++)\r\n {\r\n node = nodes[i];\r\n nodeData =\r\n {\r\n Bounds:\r\n {\r\n X: node.Bounds.X,\r\n Y: node.Bounds.Y,\r\n Width: node.Bounds.Width,\r\n Height: node.Bounds.Height\r\n },\r\n ZIndex: i,\r\n ScrollIndex: node.ScrollIndex\r\n };\r\n metadata.NodeData[node.Id] = nodeData;\r\n }\r\n\r\n for (i = 0; i < selectedNodes.length; i++)\r\n metadata.SelectedNodes.push(selectedNodes[i].Id);\r\n\r\n for (i = 0; i < selectedConnections.length; i++)\r\n {\r\n con = selectedConnections[i];\r\n conData =\r\n {\r\n Input:\r\n {\r\n NodeId: con.Input.Node.Id,\r\n ElementId: con.Input.Element.Id\r\n },\r\n Output:\r\n {\r\n NodeId: con.Output.Node.Id,\r\n ElementId: con.Output.Element.Id\r\n }\r\n };\r\n metadata.SelectedConnections.push(conData);\r\n }\r\n\r\n return metadata;\r\n };\r\n\r\n let PerformLayout = function (metadata)\r\n {\r\n let i, isRenderSuppressed, nodeData;\r\n\r\n if (metadata == null || metadata.NodeData == null)\r\n return;\r\n\r\n isRenderSuppressed = suppressRendering;\r\n suppressRendering = true;\r\n\r\n for (i = 0; i < nodes.length; i++)\r\n {\r\n nodeData = metadata.NodeData[nodes[i].Id];\r\n if (nodeData == null)\r\n continue;\r\n nodes[i].Position = new Point(nodeData.Bounds.X, nodeData.Bounds.Y);\r\n }\r\n nodes.sort(function (a, b)\r\n {\r\n let aIdx, bIdx;\r\n aIdx = metadata.NodeData[a.Id].ZIndex;\r\n if (typeof aIdx != \"number\")\r\n aIdx = nodes.length;\r\n bIdx = metadata.NodeData[b.Id].ZIndex;\r\n if (typeof bIdx != \"number\")\r\n bIdx = nodes.length;\r\n return aIdx - bIdx;\r\n });\r\n\r\n suppressRendering = isRenderSuppressed;\r\n Invalidate();\r\n };\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Event handlers\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n let ConfigureEvents = function ()\r\n {\r\n window.addEventListener(\"resize\", OnWindowResize);\r\n\r\n canvas.addEventListener(\"keydown\", OnKeyDown);\r\n canvas.addEventListener(\"keyup\", OnKeyUp);\r\n\r\n canvas.addEventListener(\"auxclick\", ConsumeEvent);\r\n canvas.addEventListener(\"click\", ConsumeEvent);\r\n canvas.addEventListener(\"dblclick\", ConsumeEvent);\r\n canvas.addEventListener(\"contextmenu\", ConsumeEvent);\r\n canvas.addEventListener(\"mousemove\", OnMouseMove);\r\n canvas.addEventListener(\"mousedown\", OnMouseDown);\r\n canvas.addEventListener(\"mouseup\", OnMouseUp);\r\n canvas.addEventListener(\"mouseenter\", OnMouseEnter);\r\n canvas.addEventListener(\"mouseleave\", OnMouseLeave);\r\n canvas.addEventListener(\"wheel\", OnMouseWheel);\r\n };\r\n\r\n // If the window gets resize, update the canvas attributes to match.\r\n // This avoids the canvas trying to automatically scale the content\r\n let OnWindowResize = function ()\r\n {\r\n if (canvas == null)\r\n return;\r\n\r\n canvas.setAttribute(\"width\", container.clientWidth);\r\n canvas.setAttribute(\"height\", container.clientHeight);\r\n canvasRect = canvas.getBoundingClientRect();\r\n\r\n // Once canvas size is recalculated, reset the viewport definition\r\n viewport.X = -translation.X;\r\n viewport.Y = -translation.Y;\r\n viewport.Width = canvas.clientWidth;\r\n viewport.Height = canvas.clientHeight;\r\n\r\n Invalidate();\r\n };\r\n\r\n // This is fired any time we want to ensure an even doesn't get propagated outside the current handler.\r\n // Mostly used to ensure mouse events don't trigger automatic scrolling, context menus and the like.\r\n let ConsumeEvent = function (e)\r\n {\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n };\r\n\r\n let OnMouseMove = function (e)\r\n {\r\n let i, j, offset, pos, transformed, hitPos, snapped, node, gridSDSpacing, nc, rect, element, elements;\r\n let newHoverConnector = null;\r\n let shouldInvalidate = false;\r\n let found = false;\r\n\r\n // FIXME - Consuming this event may have an impact on scrolling mechanics\r\n ConsumeEvent(e);\r\n\r\n // Get the mouse position relative to the control\r\n mousePos.X = MathEx.clamp(e.clientX - canvasRect.left, 0, canvasRect.width);\r\n mousePos.Y = MathEx.clamp(e.clientY - canvasRect.top, 0, canvasRect.height);\r\n\r\n // Store modifier key values\r\n shiftKey = e.shiftKey;\r\n ctrlKey = e.ctrlKey;\r\n\r\n // Multiple actions triggered by mouse move can invalidate the control, so suppress\r\n // rendering for the duration & trigger a single repaint at the end\r\n suppressRendering = true;\r\n switch (interactionState)\r\n {\r\n case InteractionState.Panning:\r\n shouldInvalidate = PanView() || shouldInvalidate;\r\n break;\r\n case InteractionState.Dragging:\r\n shouldInvalidate = DragSelection() || shouldInvalidate;\r\n break;\r\n case InteractionState.Selecting:\r\n shouldInvalidate = UpdateRectSelection() || shouldInvalidate;\r\n break;\r\n case InteractionState.ScrollingNode:\r\n shouldInvalidate = ScrollNode() || shouldInvalidate;\r\n break;\r\n case InteractionState.Disconnecting:\r\n\r\n // To avoid twitchy behavior, only trigger the disconnect once the mouse\r\n // as moved past a certain threshold. For performance reasons, and since\r\n // the actual number we compare against isn't significant, we use distance\r\n // squared to avoid repeated square root calculations\r\n if (disconnectPt.DistanceSq(mousePos) > disconnectDistanceSq)\r\n {\r\n nc = hoverConnection;\r\n hoverConnection = null;\r\n hoverConnector = null;\r\n ClearSelection(true);\r\n RemoveConnection(nc);\r\n linkStartConnector = nc.Output;\r\n interactionState = InteractionState.Linking;\r\n shouldInvalidate = true;\r\n }\r\n break;\r\n case InteractionState.Linking:\r\n if (!e.buttons.isBitSet(MouseButtons.Left))\r\n break;\r\n\r\n currentNodeHitRegion = NodeHitRegion.None;\r\n\r\n transformed = new Point(0, 0);\r\n transformed.X = Math.round(mousePos.X / zoom) - translation.X;\r\n transformed.Y = Math.round(mousePos.Y / zoom) - translation.Y;\r\n\r\n hoverConnector = null;\r\n hoverConnection = null;\r\n newHoverConnector = null;\r\n found = false;\r\n\r\n for (i = nodes.length - 1; i >= 0; i--)\r\n {\r\n if (nodes[i] == linkStartConnector.Node)\r\n continue;\r\n\r\n node = nodes[i];\r\n if (linkStartConnector.Type == ConnectorType.Input)\r\n {\r\n if (hoverConnector == null && node.HasOutputs)\r\n {\r\n newHoverConnector = node.GetHoverConnector(transformed, false, true);\r\n if (newHoverConnector != null && newHoverConnector != linkStartConnector)\r\n {\r\n if (ValidateConnection(linkStartConnector, newHoverConnector))\r\n {\r\n hoverConnector = newHoverConnector;\r\n shouldInvalidate = true;\r\n }\r\n }\r\n if (found)\r\n break;\r\n }\r\n }\r\n else\r\n {\r\n newHoverConnector = node.GetHoverConnector(transformed, true, false);\r\n if (newHoverConnector != null && newHoverConnector != linkStartConnector)\r\n {\r\n if (ValidateConnection(newHoverConnector, linkStartConnector))\r\n {\r\n hoverConnector = newHoverConnector;\r\n shouldInvalidate = true;\r\n }\r\n }\r\n if (found)\r\n break;\r\n }\r\n }\r\n shouldInvalidate = true;\r\n break;\r\n default:\r\n case InteractionState.None:\r\n if (e.buttons != 0)\r\n break;\r\n transformed = new Point(0, 0);\r\n transformed.X = Math.round(mousePos.X / zoom) - translation.X;\r\n transformed.Y = Math.round(mousePos.Y / zoom) - translation.Y;\r\n\r\n found = false;\r\n for (i = 0; i < nodes.length; i++)\r\n {\r\n node = nodes[i];\r\n newHoverConnector = node.GetHoverConnector(transformed);\r\n if (newHoverConnector != null)\r\n break;\r\n if (node.Bounds.Contains(transformed))\r\n {\r\n if (node != hoverNode)\r\n {\r\n SetHoverNode(node);\r\n shouldInvalidate = true;\r\n }\r\n currentNodeHitRegion = node.GetHitRegion(transformed);\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (hoverConnector != newHoverConnector)\r\n {\r\n hoverConnector = newHoverConnector;\r\n if (hoverConnector != null)\r\n currentNodeHitRegion = hoverConnector.Type == ConnectorType.Input ? NodeHitRegion.InputConnector : NodeHitRegion.OutputConnector;\r\n shouldInvalidate = true;\r\n }\r\n if (!found)\r\n {\r\n if (hoverNode != null)\r\n {\r\n SetHoverNode(null);\r\n shouldInvalidate = true;\r\n }\r\n for (i = 0; i < connections.length; i++)\r\n {\r\n if (connections[i].HitTest(transformed))\r\n {\r\n found = true;\r\n hoverConnection = connections[i];\r\n shouldInvalidate = true;\r\n break;\r\n }\r\n }\r\n if (!found && hoverConnection != null)\r\n {\r\n hoverConnection = null;\r\n shouldInvalidate = true;\r\n }\r\n }\r\n else if (hoverConnection != null)\r\n {\r\n hoverConnection = null;\r\n shouldInvalidate = true;\r\n }\r\n break;\r\n }\r\n // Store the mouse pos & viewport\r\n lastMouse.X = mousePos.X;\r\n lastMouse.Y = mousePos.Y;\r\n\r\n lastViewport.CopyFrom(viewport);\r\n viewport.X = -translation.X;\r\n viewport.Y = -translation.Y;\r\n suppressRendering = false;\r\n if (shouldInvalidate)\r\n Invalidate();\r\n };\r\n\r\n let OnMouseDown = function (e)\r\n {\r\n let i, transformed;\r\n let shouldInvalidate = false;\r\n let found = false;\r\n\r\n ConsumeEvent(e);\r\n\r\n // Force focus since we're blocking the event to ensure auto-scroll and other aspects don't get triggered\r\n canvas.focus();\r\n\r\n // Get the mouse position relative to the control\r\n mousePos.X = MathEx.clamp(e.clientX - canvasRect.left, 0, canvasRect.width);\r\n mousePos.Y = MathEx.clamp(e.clientY - canvasRect.top, 0, canvasRect.height);\r\n\r\n // Store modifier key values\r\n shiftKey = e.shiftKey;\r\n ctrlKey = e.ctrlKey;\r\n\r\n // Multiple actions triggered by mouse move can invalidate the control, so suppress\r\n // rendering for the duration & trigger a single repaint at the end\r\n suppressRendering = true;\r\n\r\n switch (e.button)\r\n {\r\n case MouseButton.Left:\r\n switch (interactionState)\r\n {\r\n case InteractionState.None:\r\n if (hoverConnector != null)\r\n {\r\n linkStartConnector = hoverConnector;\r\n interactionState = InteractionState.Linking;\r\n shouldInvalidate = true;\r\n }\r\n else if (hoverNode != null)\r\n {\r\n // if we're already hovering a node, select it\r\n if (SelectNode(hoverNode, e.ctrlKey))\r\n shouldInvalidate = true;\r\n\r\n switch (currentNodeHitRegion)\r\n {\r\n case NodeHitRegion.Node:\r\n case NodeHitRegion.Header:\r\n baseNodePositions.length = 0;\r\n for (i = 0; i < selectedNodes.length; i++)\r\n baseNodePositions.push(selectedNodes[i].Bounds.Position.Copy());\r\n interactionState = InteractionState.Dragging;\r\n break;\r\n case NodeHitRegion.ScrollbarLower:\r\n case NodeHitRegion.ScrollbarUpper:\r\n if (hoverNode.ScrollHighlightState != ScrollHighlightState.Background)\r\n {\r\n hoverNode.ScrollHighlightState = ScrollHighlightState.Background;\r\n shouldInvalidate = true;\r\n }\r\n break;\r\n case NodeHitRegion.ScrollbarThumb:\r\n if (hoverNode.ScrollHighlightState != ScrollHighlightState.Thumb)\r\n {\r\n hoverNode.ScrollHighlightState = ScrollHighlightState.Thumb;\r\n shouldInvalidate = true;\r\n }\r\n interactionState = InteractionState.ScrollingNode;\r\n hoverNode.UpdateScrollThumb(0);\r\n break;\r\n }\r\n }\r\n else if (hoverConnection != null)\r\n {\r\n if (SelectConnection(hoverConnection, ctrlKey))\r\n shouldInvalidate = true;\r\n\r\n //FIXME - Update disconnect start logic to factor multiple selections\r\n if (!ctrlKey)\r\n {\r\n interactionState = InteractionState.Disconnecting;\r\n disconnectPt.X = mousePos.X;\r\n disconnectPt.Y = mousePos.Y;\r\n shouldInvalidate = true;\r\n }\r\n }\r\n else\r\n {\r\n prevSelectedNodes.length = 0;\r\n prevSelectedConnections.length = 0;\r\n if (selectedNodes.length > 0 || selectedConnections.length > 0)\r\n {\r\n if (!e.shiftKey && !e.ctrlKey)\r\n ClearSelection();\r\n else\r\n {\r\n\r\n for (i = 0; i < selectedNodes.length; i++)\r\n prevSelectedNodes.push(selectedNodes[i]);\r\n for (i = 0; i < selectedConnections.length; i++)\r\n prevSelectedConnections.push(selectedConnections[i]);\r\n }\r\n shouldInvalidate = true;\r\n }\r\n transformed = new Point(0, 0);\r\n transformed.X = Math.round(mousePos.X / zoom) - translation.X;\r\n transformed.Y = Math.round(mousePos.Y / zoom) - translation.Y;\r\n //FIXME - Re-enable selection rect\r\n //interactionState = InteractionState.Selecting;\r\n //selectStart.X = selectEnd.X = transformed.X;\r\n //selectStart.Y = selectEnd.Y = transformed.Y;\r\n //selectionRect.Reset();\r\n }\r\n break;\r\n }\r\n break;\r\n case MouseButton.Right:\r\n break;\r\n case MouseButton.Middle:\r\n if (interactionState == InteractionState.None)\r\n interactionState = InteractionState.Panning;\r\n break;\r\n }\r\n suppressRendering = false;\r\n if (shouldInvalidate)\r\n Invalidate();\r\n };\r\n\r\n let OnMouseUp = function (e)\r\n {\r\n let shouldInvalidate = false;\r\n let transformed;\r\n ConsumeEvent(e);\r\n\r\n // Get the mouse position relative to the control\r\n mousePos.X = MathEx.clamp(e.clientX - canvasRect.left, 0, canvasRect.width);\r\n mousePos.Y = MathEx.clamp(e.clientY - canvasRect.top, 0, canvasRect.height);\r\n\r\n // Store modifier key values\r\n shiftKey = e.shiftKey;\r\n ctrlKey = e.ctrlKey;\r\n\r\n switch (interactionState)\r\n {\r\n case InteractionState.Selecting:\r\n shouldInvalidate = EndRectSelection() || shouldInvalidate;\r\n interactionState = InteractionState.None;\r\n break;\r\n case InteractionState.Linking:\r\n if (linkStartConnector != null && hoverConnector != null && linkStartConnector != hoverConnector)\r\n {\r\n if (linkStartConnector.Type == ConnectorType.Input)\r\n AddConnection(linkStartConnector, hoverConnector);\r\n else\r\n AddConnection(hoverConnector, linkStartConnector);\r\n }\r\n interactionState = InteractionState.None;\r\n linkStartConnector = null;\r\n hoverConnector = null;\r\n shouldInvalidate = true;\r\n break;\r\n default:\r\n interactionState = InteractionState.None;\r\n if (hoverNode != null)\r\n {\r\n transformed = new Point(0, 0);\r\n transformed.X = Math.round(mousePos.X / zoom) - translation.X;\r\n transformed.Y = Math.round(mousePos.Y / zoom) - translation.Y;\r\n if (hoverNode.Bounds.Contains(transformed))\r\n {\r\n switch (currentNodeHitRegion)\r\n {\r\n case NodeHitRegion.Checkbox:\r\n hoverNode.ToggleCheckAt(transformed);\r\n shouldInvalidate = true;\r\n break;\r\n case NodeHitRegion.ScrollbarThumb:\r\n // Snap scroll thumb & adjust scrollindex\r\n shouldInvalidate = true;\r\n break;\r\n case NodeHitRegion.ScrollbarUpper:\r\n if (hoverNode.ScrollIndex > 0)\r\n {\r\n hoverNode.ScrollIndex--;\r\n shouldInvalidate = true;\r\n }\r\n break;\r\n case NodeHitRegion.ScrollbarLower:\r\n if (hoverNode.ScrollIndex <= hoverNode.ScrollCount)\r\n {\r\n hoverNode.ScrollIndex++;\r\n shouldInvalidate = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n\r\n if (hoverNode != null && hoverNode.ScrollHighlightState != ScrollHighlightState.None)\r\n hoverNode.ScrollHighlightState = ScrollHighlightState.None;\r\n\r\n if (shouldInvalidate)\r\n Invalidate();\r\n };\r\n\r\n let OnMouseEnter = function (e)\r\n {\r\n };\r\n\r\n let OnMouseLeave = function (e)\r\n {\r\n interactionState = InteractionState.None;\r\n };\r\n\r\n let OnMouseWheel = function (e)\r\n {\r\n let shouldInvalidate = false;\r\n ConsumeEvent(e);\r\n\r\n // Get the mouse position relative to the control\r\n mousePos.X = MathEx.clamp(e.clientX - canvasRect.left, 0, canvasRect.width);\r\n mousePos.Y = MathEx.clamp(e.clientY - canvasRect.top, 0, canvasRect.height);\r\n\r\n // Store modifier key values\r\n shiftKey = e.shiftKey;\r\n ctrlKey = e.ctrlKey;\r\n\r\n switch (interactionState)\r\n {\r\n case InteractionState.None:\r\n default:\r\n if (hoverNode != null)\r\n {\r\n if (hoverNode.HasScrollbar)\r\n {\r\n if (e.deltaY < 0 && hoverNode.ScrollIndex > 0)\r\n {\r\n hoverNode.ScrollIndex--;\r\n shouldInvalidate = true;\r\n }\r\n else if (e.deltaY > 0 && hoverNode.ScrollIndex <= hoverNode.ScrollCount)\r\n {\r\n hoverNode.ScrollIndex++;\r\n shouldInvalidate = true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n\r\n if (shouldInvalidate)\r\n Invalidate();\r\n };\r\n\r\n let OnKeyDown = function (e)\r\n {\r\n switch (interactionState)\r\n {\r\n case InteractionState.Selecting:\r\n if (ctrlKey != e.ctrlKey || shiftKey != e.shiftKey)\r\n ctrlKey = e.ctrlKey;\r\n shiftKey = e.shiftKey;\r\n if (UpdateRectSelection(true))\r\n Invalidate();\r\n break;\r\n case InteractionState.None:\r\n break;\r\n }\r\n };\r\n\r\n let OnKeyUp = function (e)\r\n {\r\n let i, sel;\r\n switch (interactionState)\r\n {\r\n case InteractionState.Selecting:\r\n if (ctrlKey != e.ctrlKey || shiftKey != e.shiftKey)\r\n ctrlKey = e.ctrlKey;\r\n shiftKey = e.shiftKey;\r\n if (UpdateRectSelection(true))\r\n Invalidate();\r\n break;\r\n case InteractionState.None:\r\n switch (e.key)\r\n {\r\n case \"Delete\":\r\n DeleteSelection();\r\n break;\r\n }\r\n break;\r\n }\r\n };\r\n\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n // Event target implementation\r\n ///////////////////////////////////////////////////////////////////////////////////////////////////\r\n let addEventListener = function (type, callback)\r\n {\r\n if (!(type in eventListeners))\r\n eventListeners[type] = [];\r\n eventListeners[type].push(callback);\r\n };\r\n\r\n let removeEventListener = function (type, callback)\r\n {\r\n if (!(type in eventListeners))\r\n return;\r\n\r\n let stack = eventListeners[type];\r\n for (let i = 0, l = stack.length; i < l; i++)\r\n {\r\n if (stack[i] === callback)\r\n {\r\n stack.splice(i, 1);\r\n return;\r\n }\r\n }\r\n };\r\n\r\n let dispatchEvent = function (event)\r\n {\r\n if (!(event.type in eventListeners))\r\n return true;\r\n\r\n var stack = eventListeners[event.type].slice();\r\n\r\n for (let i = 0, l = stack.length; i < l; i++)\r\n stack[i].call(_this, event);\r\n return !event.defaultPrevented;\r\n };\r\n};\r\n"],"sourceRoot":""}