@elicdavis/node-flow 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.d.mts +18 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.js +143 -31
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +141 -31
- package/dist/index.mjs.map +1 -1
- package/index.html +9 -0
- package/package.json +1 -1
- package/src/graph.ts +1 -1
- package/src/index.ts +2 -4
- package/src/node.ts +79 -1
- package/src/theme.ts +5 -0
- package/src/types/text.ts +53 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/theme.ts","../src/styles/text.ts","../src/types/pool.ts","../src/types/vector2.ts","../src/types/box.ts","../src/types/list.ts","../src/contextMenu.ts","../src/input.ts","../src/elements/interfaces.ts","../src/elements/base.ts","../src/elements/container.ts","../src/elements/text.ts","../src/utils/string.ts","../src/types/text.ts","../src/utils/math.ts","../src/utils/color.ts","../src/port.ts","../src/styles/stroke.ts","../src/styles/box.ts","../src/popup.ts","../src/styles/textBox.ts","../src/widgets/widget.ts","../src/widgets/number.ts","../src/widgets/button.ts","../src/widgets/color.ts","../src/widgets/slider.ts","../src/popups/string.ts","../src/widgets/string.ts","../src/widgets/toggle.ts","../src/widgets/image.ts","../src/widgets/text.ts","../src/widgets/factory.ts","../src/connection.ts","../src/camera.ts","../src/organize.ts","../src/performance.ts","../src/nodes/publisher.ts","../src/nodes/factory.ts","../src/nodes/subsystem.ts","../src/popups/form.ts","../src/node.ts","../src/markdown/token.ts","../src/markdown/lexicalParser.ts","../src/markdown/entry.ts","../src/markdown/syntaxParser.ts","../src/markdown/markdown.ts","../src/notes/note.ts","../src/notes/subsystem.ts","../src/pass/subsystem.ts","../src/quickMenu.ts","../src/graph.ts"],"sourcesContent":["import { NodeFlowGraph } from './graph';\r\nimport { FlowNode, FlowNodeConfig } from './node';\r\n\r\nexport { NodeFlowGraph, FlowNode, FlowNodeConfig };\r\n\r\nimport { Theme } from './theme';\r\nexport { Theme };\r\n\r\nimport { Publisher, PublisherConfig } from './nodes/publisher';\r\nexport { Publisher, PublisherConfig };\r\n\r\nimport { FlowNote } from './notes/note';\r\nexport { FlowNote };\r\n\r\n// Widgets\r\nimport { NumberWidget } from './widgets/number';\r\nimport { ColorWidget } from './widgets/color';\r\nimport { StringWidget } from './widgets/string';\r\nimport { ButtonWidget } from './widgets/button';\r\nimport { ToggleWidget } from './widgets/toggle';\r\nimport { SliderWidget } from './widgets/slider';\r\nimport { ImageWidget } from './widgets/image';\r\nexport {\r\n NumberWidget, ColorWidget, StringWidget, ButtonWidget, ToggleWidget, SliderWidget, ImageWidget\r\n};\r\n\r\nimport { GlobalWidgetFactory } from './widgets/factory';\r\nexport { GlobalWidgetFactory };\r\n","export const Theme = {\r\n FontFamily: \"Courier New\",\r\n Graph: {\r\n BackgroundColor: \"#07212a\",\r\n },\r\n Node: {\r\n FontColor: \"#afb9bb\",\r\n BackgroundColor: \"#0c2b35\",\r\n Title: {\r\n Color: \"#154050\",\r\n FontColor: \"#afb9bb\",\r\n Padding: 5\r\n },\r\n BorderRadius: 15,\r\n Border: {\r\n Idle: \"#1c1c1c\",\r\n MouseOver: \"#8e8e8e\",\r\n Grabbed: \"white\",\r\n Selected: \"#6e6e6e\"\r\n },\r\n Port: {\r\n FontColor: \"#afb9bb\"\r\n }\r\n },\r\n BoxSelect: {\r\n Color: \"white\",\r\n Size: 1,\r\n Radius: 2,\r\n LineDashLength: 5,\r\n },\r\n Widget: {\r\n FontColor: \"#afb9bb\",\r\n BackgroundColor: \"#0f313c\",\r\n Border: {\r\n Color: \"#154050\",\r\n Size: 2,\r\n Radius: 2\r\n },\r\n Hover: {\r\n BackgroundColor: \"#195366\"\r\n },\r\n Slider: {\r\n FillColor: \"#07212A\",\r\n },\r\n Button: {\r\n Click: {\r\n BackgroundColor: \"#1f637a\"\r\n },\r\n }\r\n },\r\n ContextMenu: {\r\n BackgroundColor: \"#07212A\",\r\n HighlightColor: \"#205A6D\",\r\n FontColor: \"#afb9bb\",\r\n },\r\n Note: {\r\n FontColor: \"#afb9bb\",\r\n FontSize: 16,\r\n EntrySpacing: 20,\r\n LineSpacing: 5,\r\n DotSize: 3,\r\n HeaderLineWidth: 2,\r\n H1: {\r\n FontSize: 32,\r\n },\r\n H2: {\r\n FontSize: 16,\r\n },\r\n H3: {\r\n FontSize: 16,\r\n },\r\n CodeBlock: {\r\n BackgroundColor: \"#0c2b35\",\r\n Padding: 16,\r\n BorderRadius: 4,\r\n }\r\n }\r\n}","import { Theme } from \"../theme\";\r\nimport { Vector2 } from \"../types/vector2\";\r\n\r\nexport enum FontWeight {\r\n Normal = \"\",\r\n Bold = \"bold\"\r\n}\r\n\r\nexport enum FontStyle {\r\n Normal = \"\",\r\n Italic = \"italic\"\r\n}\r\n\r\nexport interface TextStyleConfig {\r\n size?: number;\r\n color?: string;\r\n font?: string;\r\n weight?: FontWeight;\r\n style?: FontStyle;\r\n}\r\n\r\nconst DefaultSize: number = 16;\r\nconst DefaultColor: string = \"black\";\r\n\r\nexport function TextStyleFallback(input?: TextStyleConfig, fallback?: TextStyleConfig): TextStyleConfig {\r\n return {\r\n color: input?.color === undefined ? fallback?.color : input?.color,\r\n size: input?.size === undefined ? fallback?.size : input?.size,\r\n font: input?.font === undefined ? fallback?.font : input?.font,\r\n style: input?.style === undefined ? fallback?.style : input?.style,\r\n weight: input?.weight === undefined ? fallback?.weight : input?.weight,\r\n };\r\n}\r\n\r\nexport class TextStyle {\r\n\r\n #size: number;\r\n\r\n #color: string;\r\n\r\n #font: string;\r\n\r\n #weight: FontWeight;\r\n\r\n #fontStyle: FontStyle;\r\n\r\n constructor(config: TextStyleConfig | undefined) {\r\n this.#size = config?.size === undefined ? DefaultSize : config.size;\r\n this.#color = config?.color === undefined ? DefaultColor : config.color;\r\n this.#font = config?.font === undefined ? Theme.FontFamily : config.font;\r\n this.#weight = config?.weight === undefined ? FontWeight.Normal : config.weight;\r\n this.#fontStyle = config?.style === undefined ? FontStyle.Normal : config.style;\r\n }\r\n\r\n setupStyle(ctx: CanvasRenderingContext2D, scale: number): void {\r\n ctx.fillStyle = this.#color;\r\n ctx.font = this.#fontStyle + \" \" + this.#weight + \" \" + (this.#size * scale) + \"px \" + this.#font;\r\n }\r\n\r\n getSize(): number {\r\n return this.#size;\r\n }\r\n\r\n getFont(): string {\r\n return this.#font;\r\n }\r\n\r\n measure(ctx: CanvasRenderingContext2D, scale: number, text: string, out: Vector2): void {\r\n this.setupStyle(ctx, scale);\r\n const measurements = ctx.measureText(text)\r\n out.x = measurements.width;\r\n out.y = measurements.actualBoundingBoxAscent + measurements.actualBoundingBoxDescent;\r\n }\r\n\r\n setColor(color: string): void {\r\n this.#color = color;\r\n }\r\n\r\n getColor(): string {\r\n return this.#color ;\r\n }\r\n\r\n setSize(size: number): void {\r\n this.#size = size;\r\n }\r\n\r\n setWeight(weight: FontWeight): void {\r\n this.#weight = weight;\r\n }\r\n}","import { Vector2 } from \"./vector2\";\r\n\r\n\r\n\r\nexport class Pool<Type> {\r\n\r\n #arr: Array<Type>;\r\n\r\n #count: number;\r\n\r\n #builder: () => Type;\r\n\r\n #reset: (v: Type) => void;\r\n\r\n #runningDepth: number;\r\n\r\n constructor(builder: () => Type, reset: (v: Type) => void) {\r\n this.#arr = new Array<Type>();\r\n this.#count = 0;\r\n this.#builder = builder;\r\n this.#reset = reset;\r\n this.#runningDepth = 0;\r\n }\r\n\r\n public runIf(condition: boolean, fn: () => void) {\r\n if (condition) {\r\n this.run(fn);\r\n }\r\n }\r\n\r\n #running(): boolean {\r\n return this.#runningDepth > 0;\r\n }\r\n\r\n public run(fn: () => void) {\r\n const start = this.#count;\r\n this.#runningDepth += 1;\r\n fn();\r\n this.#runningDepth -= 1;\r\n this.#count = start;\r\n // console.log(this.#arr.length);\r\n }\r\n\r\n get(): Type {\r\n if(!this.#running()) {\r\n throw new Error(\"can't use pool outside of running context\");\r\n }\r\n\r\n let value: Type;\r\n if (this.#arr.length === this.#count) {\r\n value = this.#builder();\r\n this.#arr.push(this.#builder());\r\n } else {\r\n value = this.#arr[this.#count];\r\n this.#reset(value);\r\n }\r\n this.#count++;\r\n return value;\r\n }\r\n\r\n}\r\n\r\nexport const VectorPool = new Pool<Vector2>(\r\n () => ({ x: 0, y: 0 }),\r\n (v) => { v.x = 0; v.y = 0; }\r\n)\r\n","export interface Vector2 {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport function CopyVector2(dst: Vector2, src: Vector2): void {\r\n dst.x = src.x;\r\n dst.y = src.y;\r\n}\r\n\r\nexport function SubVector2(dst: Vector2, a: Vector2, b: Vector2): void {\r\n dst.x = a.x - b.x;\r\n dst.y = a.y - b.y;\r\n}\r\n\r\nexport function AddVector2(dst: Vector2, a: Vector2, b: Vector2): void {\r\n dst.x = a.x + b.x;\r\n dst.y = a.y + b.y;\r\n}\r\n\r\nexport function ScaleVector(dst: Vector2, scale: number): void {\r\n dst.x *= scale;\r\n dst.y *= scale;\r\n}\r\n\r\nexport function Zero(): Vector2 {\r\n return { x: 0, y: 0 };\r\n}\r\n\r\nexport function Distance(a: Vector2, b: Vector2): number { \r\n const xd = b.x - a.x\r\n const yd = b.y - a.y\r\n return Math.sqrt((xd*xd)+(yd*yd))\r\n}\r\n","import { VectorPool } from \"./pool\";\r\nimport { AddVector2, CopyVector2, SubVector2, Vector2, Zero } from \"./vector2\";\r\n\r\nexport interface Box {\r\n Position: Vector2\r\n Size: Vector2\r\n}\r\n\r\nexport function CopyBox(dst: Box, src: Box): void {\r\n dst.Position.x = src.Position.x;\r\n dst.Position.y = src.Position.y;\r\n dst.Size.x = src.Size.x;\r\n dst.Size.y = src.Size.y;\r\n}\r\n\r\nfunction normalizeMinMax(min: Vector2, max: Vector2) {\r\n if (min.x > max.x) {\r\n let temp = max.x;\r\n max.x = min.x;\r\n min.x = temp;\r\n }\r\n\r\n if (min.y > max.y) {\r\n let temp = max.y;\r\n max.y = min.y;\r\n min.y = temp;\r\n }\r\n}\r\n\r\nexport function BoxIntersection(a: Box, b: Box): boolean {\r\n let intersects = false;\r\n\r\n VectorPool.run(() => {\r\n const aMin = VectorPool.get();\r\n const aMax = VectorPool.get();\r\n CopyVector2(aMin, a.Position);\r\n AddVector2(aMax, aMin, a.Size);\r\n normalizeMinMax(aMin, aMax);\r\n\r\n const bMin = VectorPool.get();\r\n const bMax = VectorPool.get();\r\n CopyVector2(bMin, b.Position);\r\n AddVector2(bMax, bMin, b.Size);\r\n normalizeMinMax(bMin, bMax);\r\n\r\n intersects = (aMin.x <= bMax.x) && (aMax.x >= bMin.x) &&\r\n (aMin.y <= bMax.y) && (aMax.y >= bMin.y);\r\n })\r\n\r\n return intersects;\r\n}\r\n\r\n// TODO: This is probably incorrect. Needs more testing\r\n// export function ExpandBox(boxToExpand: Box, box: Box): void {\r\n// const newPos: Vector2 = Zero();\r\n// const newSize: Vector2 = Zero();\r\n\r\n// CopyVector2(newPos, boxToExpand.Position);\r\n// CopyVector2(newSize, boxToExpand.Size);\r\n\r\n\r\n// const positionOffset: Vector2 = Zero();\r\n\r\n// // Get Position Adjustment\r\n// SubVector2(positionOffset, box.Position, boxToExpand.Position);\r\n\r\n// // We only care about adjustments that make us bigger.\r\n// positionOffset.x = Math.min(positionOffset.x, 0);\r\n// positionOffset.y = Math.min(positionOffset.y, 0);\r\n\r\n// // Adjust our position \r\n// AddVector2(boxToExpand.Position, boxToExpand.Position, positionOffset);\r\n\r\n// // Increase our size to take into account new position\r\n// SubVector2(newSize, newSize, positionOffset);\r\n\r\n// const sizeIncrease: Vector2 = Zero();\r\n\r\n// const curEndPos: Vector2 = {\r\n// x: boxToExpand.Position.x + boxToExpand.Size.x,\r\n// y: boxToExpand.Position.y + boxToExpand.Size.y,\r\n// };\r\n\r\n// const boxEndPos: Vector2 = {\r\n// x: box.Position.x + box.Size.x,\r\n// y: box.Position.y + box.Size.y,\r\n// };\r\n\r\n// SubVector2(sizeIncrease, boxEndPos, curEndPos);\r\n\r\n// // We only care about increases to our size\r\n// sizeIncrease.x = Math.max(sizeIncrease.x, 0);\r\n// sizeIncrease.y = Math.max(sizeIncrease.y, 0);\r\n\r\n// // Increase our size to take into account new position\r\n// SubVector2(newSize, newSize, sizeIncrease)\r\n\r\n// // Finally, Set result\r\n// CopyVector2(boxToExpand.Position, newPos)\r\n// CopyVector2(boxToExpand.Size, newSize)\r\n// }\r\n\r\nexport function BoxCenter(box: Box, out: Vector2): Vector2 {\r\n out.x = box.Position.x + (box.Size.x / 2);\r\n out.y = box.Position.y + (box.Size.y / 2);\r\n return out\r\n}\r\n\r\nexport function InBox(box: Box, position: Vector2): boolean {\r\n const min = box.Position\r\n if (position.x < min.x) {\r\n return false\r\n }\r\n if (position.y < min.y) {\r\n return false\r\n }\r\n\r\n if (position.x > min.x + box.Size.x) {\r\n return false\r\n }\r\n if (position.y > min.y + box.Size.y) {\r\n return false\r\n }\r\n\r\n return true\r\n}","export class List<Type> {\r\n\r\n #arr: Array<Type>;\r\n\r\n #count: number;\r\n\r\n constructor() {\r\n this.#arr = new Array<Type>();\r\n this.#count = 0;\r\n }\r\n\r\n public Count(): number {\r\n return this.#count;\r\n }\r\n\r\n public Clear(): void {\r\n this.#count = 0;\r\n }\r\n\r\n public At(index: number): Type {\r\n return this.#arr[index];\r\n }\r\n\r\n public Push(value: Type): void {\r\n if (this.#arr.length === this.#count) {\r\n this.#arr.push(value);\r\n } else {\r\n this.#arr[this.#count] = value;\r\n }\r\n this.#count++;\r\n }\r\n\r\n public ToArray(): Array<Type> {\r\n let arr = new Array<Type>(this.Count());\r\n for(let i = 0; i < this.#count; i ++) {\r\n arr[i] = this.#arr[i]\r\n }\r\n return arr;\r\n }\r\n\r\n}","import { Theme } from './theme';\r\nimport { TextAlign } from './styles/canvasTextAlign';\r\nimport { TextStyle, TextStyleConfig, TextStyleFallback } from './styles/text';\r\nimport { Box, InBox } from './types/box';\r\nimport { List } from './types/list';\r\nimport { CopyVector2, Vector2, Zero } from './types/vector2';\r\n\r\nconst contextEntryHeight = 30;\r\nconst contextEntryWidth = 250;\r\n\r\nexport interface ContextMenuItemConfig {\r\n name?: string;\r\n textStyle?: TextStyleConfig;\r\n group?: string;\r\n\r\n callback?: () => void;\r\n}\r\n\r\nexport interface ContextMenuConfig {\r\n name?: string;\r\n textStyle?: TextStyleConfig;\r\n group?: string;\r\n\r\n subMenus?: Array<ContextMenuConfig>;\r\n items?: Array<ContextMenuItemConfig>;\r\n}\r\n\r\n\r\nexport class ContextMenuItem {\r\n #name: string;\r\n\r\n #callback?: () => void;\r\n\r\n #textStyle: TextStyle;\r\n\r\n public group?: string;\r\n\r\n constructor(config?: ContextMenuItemConfig) {\r\n this.#name = config?.name === undefined ? \"item\" : config.name;\r\n this.#callback = config?.callback;\r\n this.#textStyle = new TextStyle(config?.textStyle);\r\n this.group = config?.group;\r\n }\r\n\r\n getName(): string {\r\n return this.#name;\r\n }\r\n\r\n execute(): void {\r\n if (this.#callback === undefined) {\r\n return;\r\n }\r\n this.#callback();\r\n }\r\n}\r\n\r\nclass ContextGroup {\r\n\r\n #calculatedHeight: number;\r\n\r\n constructor(public entries: Array<ContextEntry>) {\r\n this.#calculatedHeight = entries.length * contextEntryHeight\r\n }\r\n\r\n height() {\r\n return this.#calculatedHeight;\r\n }\r\n\r\n}\r\n\r\nexport class ContextEntry {\r\n constructor(public text: string, public subMenu: ContextMenu | undefined, public item: ContextMenuItem | undefined) {\r\n }\r\n\r\n click(): void {\r\n this.item?.execute();\r\n }\r\n}\r\n\r\nexport function CombineContextMenus(...contextMenus: Array<ContextMenuConfig | undefined>): ContextMenuConfig {\r\n const finalConfig: ContextMenuConfig = {\r\n items: new Array<ContextMenuItemConfig>,\r\n subMenus: new Array<ContextMenuConfig>,\r\n }\r\n\r\n for (let i = 0; i < contextMenus.length; i++) {\r\n const config = contextMenus[i];\r\n if (config === undefined) {\r\n continue;\r\n }\r\n\r\n if (config.items !== undefined) {\r\n finalConfig.items = finalConfig.items?.concat(config.items);\r\n }\r\n\r\n if (config.subMenus !== undefined) {\r\n finalConfig.subMenus = finalConfig.subMenus?.concat(config.subMenus);\r\n }\r\n }\r\n\r\n return finalConfig;\r\n}\r\n\r\nexport class ContextMenu {\r\n\r\n #name: string;\r\n\r\n #items: Array<ContextMenuItem>;\r\n\r\n #subMenus: Array<ContextMenu>;\r\n\r\n #textStyle: TextStyle;\r\n\r\n #groups: List<ContextGroup>;\r\n\r\n #group?: string;\r\n\r\n #submenuPosition: Vector2;\r\n\r\n constructor(config?: ContextMenuConfig) {\r\n this.#submenuPosition = Zero();\r\n this.#groups = new List<ContextGroup>();\r\n this.#name = config?.name === undefined ? \"menu\" : config?.name;\r\n this.#items = new Array<ContextMenuItem>();\r\n this.#subMenus = new Array<ContextMenu>();\r\n this.#textStyle = new TextStyle(TextStyleFallback(config?.textStyle, {\r\n color: Theme.ContextMenu.FontColor\r\n }));\r\n this.#group = config?.group;\r\n\r\n if (config?.subMenus !== undefined) {\r\n for (let i = 0; i < config?.subMenus.length; i++) {\r\n this.#subMenus.push(new ContextMenu(config?.subMenus[i]));\r\n }\r\n }\r\n\r\n if (config?.items !== undefined) {\r\n for (let i = 0; i < config?.items.length; i++) {\r\n this.#items.push(new ContextMenuItem(config?.items[i]));\r\n }\r\n }\r\n\r\n this.#calculateEntries();\r\n }\r\n\r\n #calculateEntries(): void {\r\n\r\n const groupLUT = new Map<string, number>();\r\n const workingGroups = new Array<Array<ContextEntry>>();\r\n\r\n // Initialize first group for undefined entries\r\n workingGroups.push(new Array<ContextEntry>());\r\n\r\n for (let i = 0; i < this.#items.length; i++) {\r\n let group = 0; // index to undefined entries\r\n\r\n // Find collection that this entry belongs too\r\n const sub = this.#items[i]\r\n if (sub.group !== undefined) {\r\n const groupIndex = groupLUT.get(sub.group)\r\n if (groupIndex !== undefined) {\r\n group = groupIndex\r\n } else {\r\n group = workingGroups.length\r\n groupLUT.set(sub.group, group)\r\n workingGroups.push(new Array<ContextEntry>());\r\n }\r\n }\r\n\r\n workingGroups[group].push(new ContextEntry(\r\n this.#items[i].getName(),\r\n undefined,\r\n this.#items[i]\r\n ));\r\n }\r\n\r\n for (let i = 0; i < this.#subMenus.length; i++) {\r\n let group = 0; // index to undefined entries\r\n\r\n // Find collection that this entry belongs too\r\n const sub = this.#subMenus[i]\r\n if (sub.#group !== undefined) {\r\n const groupIndex = groupLUT.get(sub.#group)\r\n if (groupIndex !== undefined) {\r\n group = groupIndex\r\n } else {\r\n group = workingGroups.length\r\n groupLUT.set(sub.#group, group)\r\n workingGroups.push(new Array<ContextEntry>());\r\n }\r\n }\r\n\r\n workingGroups[group].push(new ContextEntry(\r\n this.#subMenus[i].getName(),\r\n this.#subMenus[i],\r\n undefined\r\n ));\r\n }\r\n\r\n this.#groups.Clear();\r\n for (let i = 0; i < workingGroups.length; i++) {\r\n const groupContent = workingGroups[i];\r\n if (groupContent.length === 0) {\r\n continue;\r\n }\r\n this.#groups.Push(new ContextGroup(groupContent));\r\n }\r\n }\r\n\r\n #calculatedWidth: number = 0;\r\n\r\n #getMaxWidthForText(ctx: CanvasRenderingContext2D, scale: number): number {\r\n if (this.#calculatedWidth > 0) {\r\n return this.#calculatedWidth;\r\n }\r\n\r\n const tempVec = Zero();\r\n for (let groupIndex = 0; groupIndex < this.#groups.Count(); groupIndex++) {\r\n const group = this.#groups.At(groupIndex);\r\n for (let entryIndex = 0; entryIndex < group.entries.length; entryIndex++) {\r\n this.#textStyle.measure(ctx, scale, group.entries[entryIndex].text, tempVec);\r\n this.#calculatedWidth = Math.max(tempVec.x, this.#calculatedWidth);\r\n }\r\n }\r\n return this.#calculatedWidth;\r\n }\r\n\r\n getName(): string {\r\n return this.#name;\r\n }\r\n\r\n #tempBox: Box = { Position: Zero(), Size: Zero() };\r\n\r\n #openSubMenu: ContextMenu | undefined;\r\n\r\n\r\n public render(ctx: CanvasRenderingContext2D, pppp: Vector2, graphScale: number, mousePosition: Vector2 | undefined, openRight: boolean): ContextEntry | null {\r\n const menuScale = 1.25;\r\n const scaledEntryHeight = menuScale * contextEntryHeight;\r\n const scaledEntryWidth = (menuScale * 40) + (this.#getMaxWidthForText(ctx, menuScale)); // contextEntryWidth;\r\n\r\n let totalScaledHeight = 0\r\n for (let i = 0; i < this.#groups.Count(); i++) {\r\n totalScaledHeight += this.#groups.At(i).height();\r\n }\r\n totalScaledHeight *= menuScale;\r\n\r\n const position = { x: 0, y: 0 };\r\n CopyVector2(position, pppp)\r\n\r\n if (!openRight) {\r\n position.x -= scaledEntryWidth;\r\n }\r\n\r\n // Clamp the position so it's not spilling off the canvas\r\n if (position.y + totalScaledHeight > ctx.canvas.clientHeight) {\r\n position.y = ctx.canvas.clientHeight - totalScaledHeight;\r\n }\r\n\r\n let submenuOpenRight = openRight;\r\n if (openRight && position.x + scaledEntryWidth > ctx.canvas.clientWidth) {\r\n position.x = ctx.canvas.clientWidth - scaledEntryWidth;\r\n submenuOpenRight = !submenuOpenRight;\r\n }\r\n\r\n this.#tempBox.Size.x = scaledEntryWidth;\r\n this.#tempBox.Size.y = scaledEntryHeight;\r\n CopyVector2(this.#tempBox.Position, position)\r\n\r\n\r\n\r\n ctx.textAlign = TextAlign.Left;\r\n ctx.fillStyle = Theme.ContextMenu.BackgroundColor;\r\n ctx.shadowColor = \"#000000\";\r\n ctx.shadowBlur = 5 * menuScale;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x,\r\n this.#tempBox.Position.y,\r\n scaledEntryWidth,\r\n totalScaledHeight,\r\n 5 * menuScale\r\n );\r\n ctx.fill();\r\n ctx.shadowBlur = 0;\r\n\r\n let mouseIsOver: ContextEntry | null = null;\r\n let subOpenedThisFrame = false;\r\n\r\n let optionsRendered = 0;\r\n for (let groupIndex = 0; groupIndex < this.#groups.Count(); groupIndex++) {\r\n const group = this.#groups.At(groupIndex);\r\n for (let entryIndex = 0; entryIndex < group.entries.length; entryIndex++) {\r\n const entry = group.entries[entryIndex];\r\n\r\n this.#tempBox.Position.y = position.y + (scaledEntryHeight * optionsRendered);\r\n\r\n let entryMousedOver = false;\r\n if (mousePosition !== undefined && InBox(this.#tempBox, mousePosition)) {\r\n mouseIsOver = entry;\r\n entryMousedOver = true\r\n if (entry.subMenu !== undefined) {\r\n this.#openSubMenu = entry.subMenu;\r\n this.#submenuPosition.x = position.x\r\n this.#submenuPosition.y = this.#tempBox.Position.y;\r\n if (submenuOpenRight) {\r\n this.#submenuPosition.x += scaledEntryWidth\r\n }\r\n subOpenedThisFrame = true;\r\n } else {\r\n this.#openSubMenu = undefined;\r\n }\r\n }\r\n\r\n if (entryMousedOver || (this.#openSubMenu !== undefined && entry.subMenu === this.#openSubMenu)) {\r\n ctx.fillStyle = Theme.ContextMenu.HighlightColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x + (scaledEntryHeight / 10),\r\n this.#tempBox.Position.y + (scaledEntryHeight / 10),\r\n scaledEntryWidth - (scaledEntryHeight / 5),\r\n scaledEntryHeight - (scaledEntryHeight / 5),\r\n 5 * menuScale\r\n );\r\n ctx.fill();\r\n }\r\n\r\n this.#textStyle.setupStyle(ctx, menuScale);\r\n ctx.fillText(entry.text, position.x + (scaledEntryHeight / 5), this.#tempBox.Position.y + (scaledEntryHeight / 2))\r\n\r\n // Render arrows\r\n if (entry.subMenu !== undefined) {\r\n ctx.beginPath()\r\n ctx.strokeStyle = Theme.ContextMenu.FontColor;\r\n ctx.lineWidth = 1 * menuScale;\r\n ctx.lineTo(position.x + scaledEntryWidth - (scaledEntryHeight / 2.5), this.#tempBox.Position.y + (scaledEntryHeight / 3))\r\n ctx.lineTo(position.x + scaledEntryWidth - (scaledEntryHeight / 4), this.#tempBox.Position.y + (scaledEntryHeight / 2))\r\n ctx.lineTo(position.x + scaledEntryWidth - (scaledEntryHeight / 2.5), this.#tempBox.Position.y + scaledEntryHeight - (scaledEntryHeight / 3))\r\n ctx.stroke();\r\n }\r\n\r\n optionsRendered++;\r\n }\r\n\r\n // Draw a line seperating the groups\r\n if (groupIndex !== this.#groups.Count() - 1) {\r\n ctx.strokeStyle = Theme.ContextMenu.FontColor;\r\n ctx.lineWidth = .5 * menuScale;\r\n ctx.beginPath();\r\n const startX = position.x + (scaledEntryHeight / 10);\r\n const y = this.#tempBox.Position.y + scaledEntryHeight\r\n ctx.lineTo(startX, y);\r\n ctx.lineTo(startX + scaledEntryWidth - (scaledEntryHeight / 5), y);\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n if (this.#openSubMenu !== undefined) {\r\n const mouseOverSub = this.#openSubMenu.render(ctx, this.#submenuPosition, menuScale, mousePosition, submenuOpenRight)\r\n if (mouseOverSub !== null) {\r\n mouseIsOver = mouseOverSub;\r\n }\r\n }\r\n\r\n return mouseIsOver;\r\n }\r\n}","import { CopyVector2, SubVector2, Vector2, Zero } from \"./types/vector2\";\r\n\r\nexport class MouseObserver {\r\n\r\n #clicked: boolean;\r\n\r\n #lastTouch: Vector2;\r\n\r\n #ele: HTMLElement\r\n\r\n #lastMousePosition: Vector2;\r\n\r\n #dragCallback: (delta: Vector2) => void\r\n #moveCallback: (position: Vector2) => void\r\n #clickStart: (position: Vector2, shiftOrCtrl: boolean) => void\r\n #clickStop: () => void\r\n #contextMenu: (position: Vector2) => void\r\n\r\n constructor(\r\n ele: HTMLElement,\r\n dragCallback: (delta: Vector2) => void,\r\n moveCallback: (position: Vector2) => void,\r\n clickStart: (position: Vector2, shiftOrCtrl: boolean) => void,\r\n clickStop: () => void,\r\n contextMenu: (position: Vector2) => void,\r\n fileDrop: (file: File) => void\r\n ) {\r\n this.#ele = ele;\r\n this.#dragCallback = dragCallback;\r\n this.#moveCallback = moveCallback;\r\n this.#clickStart = clickStart;\r\n this.#clickStop = clickStop;\r\n this.#contextMenu = contextMenu;\r\n\r\n this.#clicked = false;\r\n this.#lastTouch = Zero();\r\n this.#lastMousePosition = Zero();\r\n\r\n // Down\r\n ele.addEventListener('mousedown', this.#down.bind(this), false);\r\n ele.addEventListener('touchstart', this.#touchDown.bind(this), false);\r\n\r\n // Up\r\n document.addEventListener('mouseup', this.#up.bind(this), false);\r\n document.addEventListener('touchend', this.#up.bind(this), false);\r\n\r\n // Move\r\n ele.addEventListener('mousemove', this.#move.bind(this), false);\r\n ele.addEventListener('touchmove', this.#moveTouch.bind(this), false);\r\n\r\n ele.addEventListener('drop', (ev) => {\r\n ev.preventDefault();\r\n console.log(ev)\r\n\r\n if (ev.dataTransfer?.items) {\r\n // Use DataTransferItemList interface to access the file(s)\r\n [...ev.dataTransfer.items].forEach((item, i) => {\r\n // If dropped items aren't files, reject them\r\n if (item.kind === \"file\") {\r\n const file = item.getAsFile();\r\n if (file) {\r\n fileDrop(file);\r\n console.log(file)\r\n console.log(`… file[${i}].name = ${file.name}`);\r\n }\r\n }\r\n });\r\n } else if (ev.dataTransfer) {\r\n // Use DataTransfer interface to access the file(s)\r\n [...ev.dataTransfer.files].forEach((file, i) => {\r\n console.log(`… file[${i}].name = ${file.name}`);\r\n });\r\n }\r\n });\r\n\r\n ele.addEventListener('dragover', (ev) => {\r\n ev.preventDefault();\r\n this.#moveCallback(this.#mousePosition(ev));\r\n // console.log(ev)\r\n });\r\n\r\n // Context\r\n ele.addEventListener('contextmenu', (evt) => {\r\n contextMenu(this.#mousePosition(evt));\r\n evt.preventDefault()\r\n }, false);\r\n }\r\n\r\n #mousePosition(event: MouseEvent | DragEvent): Vector2 {\r\n var rect = this.#ele.getBoundingClientRect();\r\n return {\r\n x: event.clientX - rect.left,\r\n y: event.clientY - rect.top\r\n }\r\n }\r\n\r\n #move(event: MouseEvent): void {\r\n const pos = this.#mousePosition(event);\r\n\r\n if (this.#clicked) {\r\n const delta = Zero();\r\n SubVector2(delta, pos, this.#lastMousePosition);\r\n this.#dragCallback(delta)\r\n }\r\n\r\n this.#moveCallback(pos);\r\n CopyVector2(this.#lastMousePosition, pos);\r\n }\r\n\r\n #moveTouch(event: TouchEvent): void {\r\n const rect = this.#ele.getBoundingClientRect();\r\n const pos = {\r\n x: event.touches[0].clientX - rect.left,\r\n y: event.touches[0].clientY - rect.top\r\n }\r\n this.#moveCallback(pos);\r\n\r\n if (this.#clicked) {\r\n this.#dragCallback({\r\n x: pos.x - this.#lastTouch.x,\r\n y: pos.y - this.#lastTouch.y,\r\n });\r\n }\r\n\r\n CopyVector2(this.#lastTouch, pos);\r\n }\r\n\r\n #down(event: MouseEvent): void {\r\n // Only register left clicks\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n this.#clicked = true;\r\n this.#clickStart(this.#mousePosition(event), event.ctrlKey || event.shiftKey);\r\n }\r\n\r\n #touchDown(event: TouchEvent) {\r\n this.#clicked = true;\r\n const rect = this.#ele.getBoundingClientRect();\r\n this.#lastTouch.x = event.touches[0].clientX - rect.left;\r\n this.#lastTouch.y = event.touches[0].clientY - rect.top;\r\n this.#clickStart(this.#lastTouch, false);\r\n }\r\n\r\n #up(event: MouseEvent): void {\r\n // Only register left clicks\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n this.#clicked = false\r\n this.#clickStop();\r\n }\r\n}","import { Vector2 } from \"../types/vector2\"\r\n\r\n\r\nexport interface RenderElementSidesStyling {\r\n Left?: number\r\n Right?: number\r\n Top?: number\r\n Bottom?: number\r\n}\r\n\r\nexport interface RenderElementSides {\r\n Left: number\r\n Right: number\r\n Top: number\r\n Bottom: number\r\n}\r\n\r\nexport function InstantiateRenderElementSidesStyling(config?: RenderElementSidesStyling | number): RenderElementSides {\r\n if (typeof config === 'number') {\r\n return {\r\n Bottom: config,\r\n Right: config,\r\n Top: config,\r\n Left: config,\r\n }\r\n }\r\n return {\r\n Bottom: config?.Bottom === undefined ? 0 : config?.Bottom,\r\n Right: config?.Right === undefined ? 0 : config?.Right,\r\n Left: config?.Left === undefined ? 0 : config?.Left,\r\n Top: config?.Top === undefined ? 0 : config?.Top,\r\n }\r\n}\r\n\r\nexport interface IRenderElement {\r\n size(ctx: CanvasRenderingContext2D, out: Vector2): void;\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void;\r\n}\r\n\r\nexport interface Border {\r\n Color: string;\r\n Thickness: number;\r\n Radius: number;\r\n}\r\n\r\nexport interface BorderStyling {\r\n Color?: string;\r\n Thickness?: number;\r\n Radius?: number;\r\n}\r\n","import { Vector2 } from \"../types/vector2\";\r\nimport { Border, BorderStyling, InstantiateRenderElementSidesStyling, IRenderElement, RenderElementSides, RenderElementSidesStyling } from \"./interfaces\";\r\n\r\nexport enum Display {\r\n Flex = \"flex\",\r\n None = \"none\"\r\n}\r\n\r\nexport interface RenderElementBaseStyling {\r\n Margin?: RenderElementSidesStyling | number;\r\n Padding?: RenderElementSidesStyling | number;\r\n Border?: BorderStyling;\r\n BackgroundColor?: string;\r\n MinWidth?: number;\r\n MaxWidth?: number;\r\n MaxHeight?: number;\r\n MinHeight?: number;\r\n Grow?: number;\r\n Display?: Display;\r\n}\r\n\r\nexport abstract class RenderElementBase implements IRenderElement {\r\n\r\n #margin: RenderElementSides;\r\n\r\n #padding: RenderElementSides;\r\n\r\n #border: Border;\r\n\r\n #backgroundColor?: string;\r\n\r\n #minWidth?: number;\r\n\r\n #maxWidth?: number;\r\n\r\n #minHeight?: number;\r\n\r\n #maxHeight?: number;\r\n\r\n #grow?: number;\r\n\r\n #display: Display;\r\n\r\n constructor(config?: RenderElementBaseStyling) {\r\n this.#margin = InstantiateRenderElementSidesStyling(config?.Margin);\r\n this.#padding = InstantiateRenderElementSidesStyling(config?.Padding);\r\n this.#backgroundColor = config?.BackgroundColor;\r\n this.#border = {\r\n Color: config?.Border?.Color ?? \"black\",\r\n Thickness: config?.Border?.Thickness ?? 0,\r\n Radius: config?.Border?.Radius ?? 0,\r\n }\r\n this.#minWidth = config?.MinWidth;\r\n this.#maxWidth = config?.MaxWidth;\r\n this.#minHeight = config?.MinHeight;\r\n this.#maxHeight = config?.MaxHeight;\r\n this.#grow = config?.Grow;\r\n this.#display = config?.Display ?? Display.Flex;\r\n }\r\n\r\n setBackgroundColor(newColor: string): void {\r\n this.#backgroundColor = newColor;\r\n }\r\n\r\n abstract doRender(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void;\r\n\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void {\r\n if (this.#display === Display.None) {\r\n return;\r\n }\r\n\r\n const scaledSize = { x: 0, y: 0 };\r\n this.size(ctx, scaledSize);\r\n\r\n scaledSize.x = scaledSize.x * graphScale;\r\n scaledSize.y = scaledSize.y * graphScale;\r\n scaledSize.x = Math.max(scaledSize.x, scaledFillableSpace.x);\r\n scaledSize.y = Math.max(scaledSize.y, scaledFillableSpace.y);\r\n\r\n if (this.#backgroundColor) {\r\n ctx.fillStyle = this.#backgroundColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x + (this.#margin.Left * graphScale),\r\n position.y + (this.#margin.Right * graphScale),\r\n scaledSize.x - ((this.#margin.Left + this.#margin.Right) * graphScale),\r\n scaledSize.y - ((this.#margin.Top + this.#margin.Bottom) * graphScale),\r\n this.#border.Radius * graphScale\r\n );\r\n ctx.fill();\r\n }\r\n\r\n if (this.#border.Thickness > 0) {\r\n ctx.lineWidth = this.#border.Thickness * graphScale;\r\n ctx.strokeStyle = this.#border.Color;\r\n ctx.stroke();\r\n }\r\n\r\n const offsetPosition = {\r\n x: position.x + (this.#totalLeftOffset() * graphScale),\r\n y: position.y + (this.#totalTopOffset() * graphScale),\r\n };\r\n const elementSize = {\r\n x: scaledSize.x - (this.#horizontalOffset() * graphScale),\r\n y: scaledSize.y - (this.#verticalOffset() * graphScale)\r\n }\r\n this.doRender(ctx, offsetPosition, graphScale, elementSize);\r\n }\r\n\r\n // todo: Remove limitations argument?\r\n abstract calcSize(ctx: CanvasRenderingContext2D, out: Vector2, limitations: Vector2): void;\r\n\r\n protected maxLimitations(out: Vector2): void {\r\n out.x = -1;\r\n out.y = -1;\r\n\r\n if (this.#maxWidth) {\r\n out.x = this.#maxWidth;\r\n }\r\n\r\n if (this.#maxHeight) {\r\n out.y = this.#maxHeight;\r\n }\r\n }\r\n\r\n setDisplay(display: Display): void {\r\n this.#display = display;\r\n }\r\n\r\n getDisplay(): Display {\r\n return this.#display;\r\n }\r\n\r\n size(ctx: CanvasRenderingContext2D, out: Vector2): void {\r\n out.x = 0;\r\n out.y = 0;\r\n if (this.#display === Display.None) {\r\n return;\r\n }\r\n\r\n const maxLimits = { x: -1, y: -1 }\r\n this.maxLimitations(maxLimits);\r\n\r\n this.calcSize(ctx, out, maxLimits);\r\n\r\n out.x += this.#horizontalOffset();\r\n out.y += this.#verticalOffset();\r\n\r\n if (this.#minWidth) {\r\n out.x = Math.max(out.x, this.#minWidth)\r\n }\r\n\r\n if (this.#maxWidth) {\r\n out.x = Math.min(this.#maxWidth, out.x);\r\n }\r\n\r\n if (this.#maxHeight) {\r\n out.y = Math.min(this.#maxHeight, out.y);\r\n }\r\n\r\n if (this.#minHeight) {\r\n out.y = Math.max(this.#minHeight, out.y);\r\n }\r\n }\r\n\r\n #horizontalOffset(): number {\r\n return (this.#border.Thickness) +\r\n this.#margin.Left +\r\n this.#margin.Right +\r\n this.#padding.Left +\r\n this.#padding.Right;\r\n }\r\n\r\n #verticalOffset(): number {\r\n return (this.#border.Thickness) +\r\n this.#margin.Top +\r\n this.#margin.Bottom +\r\n this.#padding.Top +\r\n this.#padding.Bottom;\r\n }\r\n\r\n #totalTopOffset(): number {\r\n return (this.#border.Thickness / 2) +\r\n this.#margin.Top +\r\n this.#padding.Top;\r\n }\r\n\r\n #totalLeftOffset(): number {\r\n return (this.#border.Thickness / 2) +\r\n this.#margin.Left +\r\n this.#padding.Left;\r\n }\r\n}\r\n","import { ScaleVector, Vector2 } from '../types/vector2';\r\nimport { RenderElementBase, RenderElementBaseStyling } from \"./base\";\r\nimport { IRenderElement } from \"./interfaces\";\r\n\r\n\r\ninterface ContainerRenderElementConfig extends RenderElementBaseStyling {\r\n\r\n}\r\n\r\nexport enum LayoutDirection {\r\n Column = \"column\",\r\n Row = \"row\"\r\n}\r\n\r\nexport enum AlignItems {\r\n Stretch = \"stretch\",\r\n Start = \"start\",\r\n Center = \"center\",\r\n End = \"end\"\r\n}\r\n\r\nexport class ContainerRenderElement extends RenderElementBase {\r\n\r\n #elements: Array<IRenderElement>;\r\n\r\n #layout: LayoutDirection;\r\n\r\n #alignment: AlignItems;\r\n\r\n constructor(elements: Array<IRenderElement>, config?: ContainerRenderElementConfig) {\r\n super(config);\r\n this.#elements = elements;\r\n this.#layout = LayoutDirection.Column;\r\n this.#alignment = AlignItems.Stretch;\r\n }\r\n\r\n calcSize(ctx: CanvasRenderingContext2D, out: Vector2, limitations: Vector2): void {\r\n out.x = 0;\r\n out.y = 0;\r\n\r\n const eleSize = { x: 0, y: 0 };\r\n\r\n switch (this.#layout) {\r\n case LayoutDirection.Column:\r\n for (let i = 0; i < this.#elements.length; i++) {\r\n this.#elements[i].size(ctx, eleSize);\r\n out.x = Math.max(out.x, eleSize.x);\r\n out.y += eleSize.y;\r\n }\r\n break;\r\n\r\n case LayoutDirection.Row:\r\n for (let i = 0; i < this.#elements.length; i++) {\r\n this.#elements[i].size(ctx, eleSize);\r\n out.y = Math.max(out.y, eleSize.y);\r\n out.x += eleSize.x;\r\n }\r\n break;\r\n\r\n default:\r\n throw new Error(\"unknown layout: \" + this.#layout);\r\n }\r\n\r\n }\r\n\r\n doRender(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void {\r\n // const size = { x: 0, y: 0 };\r\n // const limitations = { x: 0, y: 0 };\r\n // this.limitations(limitations)\r\n // this.calcSize(ctx, size, limitations);\r\n switch (this.#layout) {\r\n case LayoutDirection.Column:\r\n this.#renderColumn(ctx, position, graphScale, scaledFillableSpace);\r\n break;\r\n\r\n default:\r\n throw new Error(\"unimplemented layout direction: \" + this.#layout);\r\n }\r\n }\r\n\r\n #renderColumn(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void {\r\n const currnetPos = { x: position.x, y: position.y };\r\n const scaledEleSize = { x: 0, y: 0 };\r\n for (let i = 0; i < this.#elements.length; i++) {\r\n const ele = this.#elements[i];\r\n\r\n ele.size(ctx, scaledEleSize);\r\n ScaleVector(scaledEleSize, graphScale);\r\n\r\n switch (this.#alignment) {\r\n\r\n case AlignItems.Stretch:\r\n currnetPos.x = position.x;\r\n scaledEleSize.x = scaledFillableSpace.x;\r\n break;\r\n\r\n // I'm not sure if this is even needed, I feel like this should\r\n // already be the case.\r\n case AlignItems.Start: //garney flarney <---- silly goose steenky feet\r\n currnetPos.x = position.x;\r\n break\r\n\r\n case AlignItems.End:\r\n currnetPos.x = scaledFillableSpace.x - scaledEleSize.x\r\n break;\r\n\r\n case AlignItems.Center:\r\n currnetPos.x = scaledFillableSpace.x - (scaledEleSize.x / 2)\r\n break;\r\n\r\n default:\r\n throw new Error(\"unimplmeneted alignment: \" + this.#alignment)\r\n }\r\n\r\n ele.render(ctx, currnetPos, graphScale, scaledEleSize);\r\n currnetPos.y += scaledEleSize.y;\r\n }\r\n }\r\n}","import { Text } from \"../types/text\";\r\nimport { CopyVector2, ScaleVector, Vector2, Zero } from \"../types/vector2\";\r\nimport { RenderElementBase, RenderElementBaseStyling } from \"./base\";\r\n\r\nexport enum TextAlign {\r\n Left = \"left\",\r\n Right = \"right\",\r\n Center = \"center\",\r\n}\r\n\r\nexport enum VerticalAlign {\r\n Top = \"top\",\r\n Center = \"center\",\r\n Bottom = \"bottom\"\r\n}\r\n\r\nexport interface TextElementStyling extends RenderElementBaseStyling {\r\n Align?: TextAlign\r\n VerticalAlign?: VerticalAlign\r\n LineHeight?: number\r\n}\r\n\r\nexport class TextElement extends RenderElementBase {\r\n #text: Text;\r\n\r\n #align: TextAlign;\r\n\r\n #verticalAlign: VerticalAlign;\r\n\r\n #lineHeight: number;\r\n\r\n constructor(text: Text, styling?: TextElementStyling) {\r\n super(styling);\r\n this.#text = text;\r\n this.#align = styling?.Align ?? TextAlign.Left;\r\n this.#verticalAlign = styling?.VerticalAlign ?? VerticalAlign.Top;\r\n this.#lineHeight = styling?.LineHeight ?? 1;\r\n }\r\n\r\n doRender(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void {\r\n const scale = Zero();\r\n this.calcSize(ctx, scale, scaledFillableSpace);\r\n ScaleVector(scale, graphScale);\r\n\r\n const justifiedPosition = Zero();\r\n CopyVector2(justifiedPosition, position)\r\n\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\"\r\n\r\n switch (this.#align) {\r\n case TextAlign.Left:\r\n // Do nothing. This is default\r\n break;\r\n\r\n case TextAlign.Right:\r\n justifiedPosition.x += scaledFillableSpace.x - scale.x;\r\n break;\r\n\r\n case TextAlign.Center:\r\n justifiedPosition.x += (scaledFillableSpace.x - scale.x) / 2;\r\n break;\r\n\r\n default:\r\n throw new Error(\"unimplemented justification: \" + this.#align);\r\n }\r\n\r\n switch (this.#verticalAlign) {\r\n case VerticalAlign.Top:\r\n // Do nothing. This is default\r\n break;\r\n\r\n case VerticalAlign.Bottom:\r\n justifiedPosition.y += scaledFillableSpace.y - scale.y;\r\n break;\r\n\r\n case VerticalAlign.Center:\r\n justifiedPosition.y += (scaledFillableSpace.y - scale.y) / 2;\r\n break;\r\n\r\n default:\r\n throw new Error(\"unimplemented justification: \" + this.#align);\r\n }\r\n\r\n if (scaledFillableSpace.x <= 0) {\r\n this.#text.render(ctx, graphScale, justifiedPosition);\r\n } else {\r\n const eles = this.#text.breakIntoLines(ctx, scaledFillableSpace.x);\r\n\r\n const tempSize = { x: 0, y: 0 };\r\n for (let i = 0; i < eles.length; i++) {\r\n eles[i].render(ctx, graphScale, justifiedPosition);\r\n eles[i].size(ctx, 1, tempSize)\r\n justifiedPosition.y += this.#text.style().getSize() * this.#lineHeight\r\n }\r\n }\r\n }\r\n\r\n calcSize(ctx: CanvasRenderingContext2D, out: Vector2, limitations: Vector2): void {\r\n if (limitations.x <= 0) {\r\n this.#text.size(ctx, 1, out);\r\n return;\r\n }\r\n\r\n const eles = this.#text.breakIntoLines(ctx, limitations.x);\r\n const tempSize = { x: 0, y: 0 };\r\n out.x = 0;\r\n out.y = this.#text.style().getSize() * eles.length * this.#lineHeight;\r\n for (let i = 0; i < eles.length; i++) {\r\n eles[i].size(ctx, 1, tempSize)\r\n out.x = Math.max(tempSize.x, out.x);\r\n }\r\n }\r\n}\r\n","const binarySearch = ({ max, getValue, match }) => {\r\n let min = 0;\r\n\r\n while (min <= max) {\r\n let guess = Math.floor((min + max) / 2);\r\n const compareVal = getValue(guess);\r\n\r\n if (compareVal === match) return guess;\r\n if (compareVal < match) min = guess + 1;\r\n else max = guess - 1;\r\n }\r\n\r\n return max;\r\n};\r\n\r\nexport function fitString(ctx: CanvasRenderingContext2D, str: string, maxWidth: number): string {\r\n let width = ctx.measureText(str).width;\r\n const ellipsis = '…';\r\n const ellipsisWidth = ctx.measureText(ellipsis).width;\r\n if (width <= maxWidth || width <= ellipsisWidth) {\r\n return str;\r\n }\r\n\r\n const index = binarySearch({\r\n max: str.length,\r\n getValue: guess => ctx.measureText(str.substring(0, guess)).width,\r\n match: maxWidth - ellipsisWidth,\r\n });\r\n\r\n return str.substring(0, index) + ellipsis;\r\n};\r\n\r\nexport function splitString(ctx: CanvasRenderingContext2D, str: string, maxWidth: number): Array<string> {\r\n let width = ctx.measureText(str).width;\r\n if (width <= maxWidth) {\r\n return [str];\r\n }\r\n\r\n let index = binarySearch({\r\n max: str.length,\r\n getValue: guess => ctx.measureText(str.substring(0, guess)).width,\r\n match: maxWidth,\r\n });\r\n\r\n for (let backward = index - 1; backward >= 1; backward--) {\r\n if (str.charAt(backward) === \" \") {\r\n index = backward + 1;\r\n break;\r\n }\r\n }\r\n\r\n return [str.substring(0, index), str.substring(index)];\r\n};\r\n\r\n\r\nexport function splitStringIntoLines(ctx: CanvasRenderingContext2D, str: string, maxWidth: number): Array<string> {\r\n let width = ctx.measureText(str).width;\r\n if (width <= maxWidth) {\r\n return [str];\r\n }\r\n\r\n const strings = new Array<string>;\r\n let remaining = str;\r\n while (remaining !== \"\") {\r\n let index = binarySearch({\r\n max: remaining.length,\r\n getValue: guess => ctx.measureText(remaining.substring(0, guess)).width,\r\n match: maxWidth,\r\n });\r\n\r\n if (index === remaining.length) {\r\n strings.push(remaining.substring(0, index))\r\n break;\r\n }\r\n\r\n for (let backward = index - 1; backward >= 1; backward--) {\r\n if (remaining.charAt(backward) === \" \") {\r\n index = backward + 1;\r\n break;\r\n }\r\n }\r\n\r\n strings.push(remaining.substring(0, index))\r\n remaining = remaining.substring(index)\r\n }\r\n\r\n return strings;\r\n};\r\n\r\n// https://stackoverflow.com/a/18234317/4974261\r\nexport function Format(str: string, ...args: Array<string>): string {\r\n if (arguments.length) {\r\n for (let key in args) {\r\n str = str.replace(new RegExp(\"\\\\{\" + key + \"\\\\}\", \"gi\"), args[key]);\r\n }\r\n }\r\n return str;\r\n};","import { FontWeight, TextStyle, TextStyleConfig } from \"../styles/text\";\r\nimport { splitString, splitStringIntoLines } from \"../utils/string\";\r\nimport { CopyVector2, ScaleVector, Vector2, Zero } from \"./vector2\";\r\n\r\nexport class Text {\r\n\r\n #measured: boolean\r\n\r\n #size: Vector2;\r\n\r\n #style: TextStyle;\r\n\r\n #value: string\r\n\r\n constructor(value: string, style?: TextStyleConfig) {\r\n this.#value = value;\r\n this.#measured = false;\r\n this.#size = Zero();\r\n this.#style = new TextStyle(style);\r\n\r\n if (!document.fonts.check(`16px \"${this.#style.getFont()}\"`)) {\r\n document.fonts.addEventListener(\"loadingdone\", (event) => {\r\n this.#measured = false;\r\n });\r\n }\r\n }\r\n\r\n set(newValue: string): void {\r\n this.#value = newValue;\r\n this.#measured = false;\r\n }\r\n\r\n get(): string {\r\n return this.#value;\r\n }\r\n\r\n breakIntoLines(ctx: CanvasRenderingContext2D, maxWidth: number): Array<Text> {\r\n const results = new Array<Text>();\r\n\r\n this.#style.setupStyle(ctx, 1);\r\n const entries = splitStringIntoLines(ctx, this.#value, maxWidth);\r\n if (entries.length === 1) {\r\n return [this];\r\n }\r\n for (let i = 0; i < entries.length; i++) {\r\n const text = new Text(entries[i])\r\n text.#style = this.#style;\r\n results.push(text)\r\n }\r\n\r\n return results;\r\n }\r\n\r\n split(char: string): Array<Text> {\r\n const entries = this.#value.split(char)\r\n const results = new Array<Text>();\r\n for (let i = 0; i < entries.length; i++) {\r\n const text = new Text(entries[i])\r\n text.#style = this.#style;\r\n results.push(text)\r\n }\r\n return results;\r\n }\r\n\r\n splitAtIndex(index: number): Array<Text> {\r\n const results = [\r\n new Text(this.#value.substring(0, index)),\r\n new Text(this.#value.substring(index, 0)),\r\n ];\r\n\r\n\r\n for (let i = 0; i < results.length; i++) {\r\n results[i].#style = this.#style;\r\n }\r\n return results;\r\n }\r\n\r\n splitAtWidth(ctx: CanvasRenderingContext2D, maxWidth: number): Array<Text> {\r\n this.#style.setupStyle(ctx, 1);\r\n const entries = splitString(ctx, this.#value, maxWidth);\r\n if (entries.length === 1) {\r\n return [this];\r\n }\r\n\r\n const results = new Array<Text>();\r\n for (let i = 0; i < entries.length; i++) {\r\n const text = new Text(entries[i])\r\n text.#style = this.#style;\r\n results.push(text)\r\n }\r\n return results;\r\n }\r\n\r\n #measure(ctx: CanvasRenderingContext2D): void {\r\n if (this.#measured) {\r\n return;\r\n }\r\n\r\n this.#style.setupStyle(ctx, 1);\r\n const measurements = ctx.measureText(this.#value);\r\n this.#size.x = measurements.width;\r\n this.#size.y = measurements.actualBoundingBoxAscent + measurements.actualBoundingBoxDescent;\r\n this.#measured = true;\r\n }\r\n\r\n size(ctx: CanvasRenderingContext2D, scale: number, out: Vector2): void {\r\n this.#measure(ctx);\r\n CopyVector2(out, this.#size);\r\n ScaleVector(out, scale);\r\n }\r\n\r\n setColor(color: string): void {\r\n this.#style.setColor(color);\r\n }\r\n \r\n getColor(): string {\r\n return this.#style.getColor();\r\n }\r\n\r\n setSize(size: number): void {\r\n this.#style.setSize(size);\r\n }\r\n\r\n setWeight(weight: FontWeight): void {\r\n this.#style.setWeight(weight);\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, scale: number, position: Vector2): void {\r\n this.#style.setupStyle(ctx, scale)\r\n ctx.fillText(this.#value, position.x, position.y);\r\n }\r\n\r\n style(): TextStyle {\r\n return this.#style;\r\n }\r\n}","export function Clamp(v: number, min: number, max: number): number {\r\n return Math.min(Math.max(v, min), max)\r\n}\r\n\r\nexport function Clamp01(v: number): number {\r\n return Clamp(v, 0, 1);\r\n}\r\n\r\n","import { Clamp01 } from './math';\r\n\r\nexport interface Color {\r\n r: number, // 0 - 1\r\n g: number, // 0 - 1\r\n b: number, // 0 - 1\r\n}\r\n\r\nexport interface HSV {\r\n h: number, // angle in degrees\r\n s: number, // 0 - 1\r\n v: number, // 0 - 1\r\n}\r\n\r\nfunction componentToHex(c: number) {\r\n var hex = c.toString(16);\r\n return hex.length == 1 ? \"0\" + hex : hex;\r\n}\r\n\r\nexport function RgbToHex(c: Color): string {\r\n return \"#\" + componentToHex(Math.round(c.r * 255)) + componentToHex(Math.round(c.g * 255)) + componentToHex(Math.round(c.b * 255));\r\n}\r\n\r\nexport function HexToColor(hex: string): Color | null {\r\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result ? {\r\n r: parseInt(result[1], 16) / 255,\r\n g: parseInt(result[2], 16) / 255,\r\n b: parseInt(result[3], 16) / 255\r\n } : null;\r\n}\r\n\r\n\r\nexport function HSV2RGB(hsv: HSV, out: Color): void {\r\n if (hsv.s <= 0.0) { // < is bogus, just shuts up warnings\r\n out.r = hsv.v;\r\n out.g = hsv.v;\r\n out.b = hsv.v;\r\n return;\r\n }\r\n let hh = hsv.h;\r\n if (hh >= 360.0) {\r\n hh = 0.0;\r\n }\r\n hh /= 60.0;\r\n\r\n const i = Math.round(hh);\r\n const ff = hh - i;\r\n const p = hsv.v * (1.0 - hsv.s);\r\n const q = hsv.v * (1.0 - (hsv.s * ff));\r\n const t = hsv.v * (1.0 - (hsv.s * (1.0 - ff)));\r\n\r\n switch (i) {\r\n case 0:\r\n out.r = hsv.v;\r\n out.g = t;\r\n out.b = p;\r\n break;\r\n case 1:\r\n out.r = q;\r\n out.g = hsv.v;\r\n out.b = p;\r\n break;\r\n case 2:\r\n out.r = p;\r\n out.g = hsv.v;\r\n out.b = t;\r\n break;\r\n\r\n case 3:\r\n out.r = p;\r\n out.g = q;\r\n out.b = hsv.v;\r\n break;\r\n case 4:\r\n out.r = t;\r\n out.g = p;\r\n out.b = hsv.v;\r\n break;\r\n // case 5:\r\n default:\r\n out.r = hsv.v;\r\n out.g = p;\r\n out.b = q;\r\n break;\r\n }\r\n\r\n out.r = Clamp01(out.r)\r\n out.g = Clamp01(out.g)\r\n out.b = Clamp01(out.b)\r\n}\r\n\r\nexport function RGB2HSV(rgb: Color, out: HSV): void {\r\n out.h = 0;\r\n out.s = 0;\r\n out.v = 0;\r\n let min: number = 0;\r\n let max: number = 0;\r\n let delta: number = 0;\r\n\r\n min = rgb.r < rgb.g ? rgb.r : rgb.g;\r\n min = min < rgb.b ? min : rgb.b;\r\n\r\n max = rgb.r > rgb.g ? rgb.r : rgb.g;\r\n max = max > rgb.b ? max : rgb.b;\r\n\r\n out.v = max; // v\r\n delta = max - min;\r\n if (delta < 0.00001) {\r\n out.s = 0;\r\n out.h = 0; // undefined, maybe nan?\r\n return;\r\n }\r\n if (max > 0.0) { // NOTE: if Max is == 0, this divide would cause a crash\r\n out.s = (delta / max); // s\r\n } else {\r\n // if max is 0, then r = g = b = 0 \r\n // s = 0, h is undefined\r\n out.s = 0.0;\r\n out.h = NaN; // its now undefined\r\n return;\r\n }\r\n if (rgb.r >= max) // > is bogus, just keeps compilor happy\r\n out.h = (rgb.g - rgb.b) / delta; // between yellow & magenta\r\n else\r\n if (rgb.g >= max)\r\n out.h = 2.0 + (rgb.b - rgb.r) / delta; // between cyan & yellow\r\n else\r\n out.h = 4.0 + (rgb.r - rgb.g) / delta; // between magenta & cyan\r\n\r\n out.h *= 60.0; // degrees\r\n\r\n if (out.h < 0.0)\r\n out.h += 360.0;\r\n\r\n}\r\n","import { Camera } from \"./camera\";\r\nimport { Connection } from './connection';\r\nimport { RenderElementBase } from \"./elements/base\";\r\nimport { ContainerRenderElement, AlignItems } from './elements/container';\r\nimport { TextAlign, TextElement } from \"./elements/text\";\r\nimport { FlowNode } from \"./node\";\r\nimport { PassSubsystem } from \"./pass/subsystem\";\r\nimport { FontStyle } from \"./styles/text\";\r\nimport { Box, InBox } from \"./types/box\";\r\nimport { Text } from \"./types/text\";\r\nimport { Vector2 } from \"./types/vector2\";\r\nimport { Color, HSV, HSV2RGB, RgbToHex } from './utils/color';\r\n\r\nexport enum PortType {\r\n Input = \"INPUT\",\r\n Output = \"OUTPUT\",\r\n InputArray = \"INPUTARRAY\",\r\n}\r\n\r\nexport interface PortStyle {\r\n size?: number;\r\n fillColor?: string;\r\n borderColor?: string;\r\n borderSize?: number;\r\n}\r\n\r\ntype ConnectionChangeCallback = (connection: Connection, connectionIndex: number, port: Port, portType: PortType, node: FlowNode) => void\r\n\r\nexport interface PortConfig {\r\n name?: string;\r\n type?: string;\r\n description?: string;\r\n array?: boolean;\r\n emptyStyle?: PortStyle;\r\n filledStyle?: PortStyle;\r\n onConnectionAdded?: ConnectionChangeCallback;\r\n onConnectionRemoved?: ConnectionChangeCallback;\r\n};\r\n\r\n// Calculate a color hash for an arbirary type\r\nfunction fallbackColor(type: string, s: number): string {\r\n let value = 0;\r\n for (var i = 0; i < type.length; i++) {\r\n value += type.charCodeAt(i) * (i + 1);\r\n }\r\n\r\n const mod = 24;\r\n value = Math.round(value) % mod;\r\n\r\n const hsv: HSV = { h: (value / (mod - 1)) * 360, s: s, v: 1 };\r\n const color: Color = { r: 0, g: 0, b: 0 };\r\n HSV2RGB(hsv, color);\r\n return RgbToHex(color);\r\n}\r\n\r\nexport class Port {\r\n\r\n #node: FlowNode;\r\n\r\n #displayName: string;\r\n\r\n #emptyStyle: PortStyle;\r\n\r\n #filledStyle: PortStyle;\r\n\r\n #connections: Array<Connection>;\r\n\r\n #portType: PortType\r\n\r\n #dataType: string;\r\n\r\n #dataTypePopupElement: RenderElementBase;\r\n\r\n #onConnectionAdded: Array<ConnectionChangeCallback>;\r\n\r\n #onConnectionRemoved: Array<ConnectionChangeCallback>;\r\n\r\n constructor(node: FlowNode, portType: PortType, config?: PortConfig) {\r\n this.#node = node;\r\n this.#connections = new Array<Connection>();\r\n this.#portType = portType;\r\n this.#displayName = config?.name === undefined ? \"Port\" : config?.name;\r\n this.#dataType = config?.type === undefined ? \"\" : config?.type;\r\n\r\n this.#emptyStyle = {\r\n borderColor: config?.emptyStyle?.borderColor === undefined ? \"#1c1c1c\" : config.emptyStyle?.borderColor,\r\n fillColor: config?.emptyStyle?.fillColor === undefined ? fallbackColor(this.#dataType, 0.3) : config.emptyStyle?.fillColor,\r\n borderSize: config?.emptyStyle?.borderSize === undefined ? 1 : config.emptyStyle?.borderSize,\r\n size: config?.emptyStyle?.size === undefined ? 4 : config.emptyStyle?.size\r\n }\r\n\r\n this.#filledStyle = {\r\n borderColor: config?.filledStyle?.borderColor === undefined ? \"#1c1c1c\" : config.filledStyle?.borderColor,\r\n fillColor: config?.filledStyle?.fillColor === undefined ? fallbackColor(this.#dataType, 1) : config.filledStyle?.fillColor,\r\n borderSize: config?.filledStyle?.borderSize === undefined ? 1 : config.filledStyle?.borderSize,\r\n size: config?.filledStyle?.size === undefined ? 5 : config.filledStyle?.size\r\n }\r\n\r\n this.#onConnectionAdded = new Array<ConnectionChangeCallback>();\r\n if (config?.onConnectionAdded) {\r\n this.#onConnectionAdded.push(config?.onConnectionAdded);\r\n }\r\n\r\n this.#onConnectionRemoved = new Array<ConnectionChangeCallback>();\r\n if (config?.onConnectionRemoved) {\r\n this.#onConnectionRemoved.push(config?.onConnectionRemoved);\r\n }\r\n\r\n const containerElements = new Array<RenderElementBase>();\r\n let dataTypeDisplay = this.#dataType;\r\n if (config?.array === true) {\r\n dataTypeDisplay = \"Array<\" + dataTypeDisplay + \">\"\r\n }\r\n containerElements.push(new TextElement(\r\n new Text(dataTypeDisplay, {\r\n color: \"white\",\r\n }),\r\n {\r\n Align: TextAlign.Center,\r\n }\r\n ));\r\n\r\n const description = config?.description;\r\n if (description && description !== \"\") {\r\n containerElements.push(new TextElement(\r\n new Text(description, { color: \"white\", style: FontStyle.Italic }),\r\n {\r\n Align: TextAlign.Center,\r\n Padding: { Top: 16 },\r\n MaxWidth: 400,\r\n LineHeight: 1.5\r\n }\r\n ));\r\n }\r\n\r\n this.#dataTypePopupElement = new ContainerRenderElement(\r\n containerElements,\r\n {\r\n BackgroundColor: \"rgba(0, 0, 0, 0.85)\",\r\n Border: {\r\n Radius: 6,\r\n },\r\n Padding: 13,\r\n }\r\n );\r\n }\r\n\r\n addConnection(connection: Connection): void {\r\n const c = this.#connections.length;\r\n this.#connections.push(connection);\r\n for (let i = 0; i < this.#onConnectionAdded.length; i++) {\r\n this.#onConnectionAdded[i](connection, c, this, this.#portType, this.#node);\r\n }\r\n }\r\n\r\n replaceConnection(connection: Connection, index: number): void {\r\n const c = this.#connections.length;\r\n this.#connections[index] = connection;\r\n for (let i = 0; i < this.#onConnectionAdded.length; i++) {\r\n this.#onConnectionAdded[i](connection, c, this, this.#portType, this.#node);\r\n }\r\n }\r\n\r\n addConnectionAddedListener(callback: ConnectionChangeCallback) {\r\n if (callback === undefined) {\r\n return;\r\n }\r\n this.#onConnectionAdded.push(callback);\r\n }\r\n\r\n connections(): Array<Connection> {\r\n return this.#connections;\r\n }\r\n\r\n addConnectionRemovedListener(callback: ConnectionChangeCallback) {\r\n if (callback === undefined) {\r\n return;\r\n }\r\n this.#onConnectionRemoved.push(callback);\r\n }\r\n\r\n clearConnection(connection: Connection): void {\r\n const index = this.#connections.indexOf(connection);\r\n if (index > -1) {\r\n this.#connections.splice(index, 1);\r\n for (let i = 0; i < this.#onConnectionRemoved.length; i++) {\r\n this.#onConnectionRemoved[i](connection, index, this, this.#portType, this.#node);\r\n }\r\n } else {\r\n console.error(\"no connection found to remove\");\r\n }\r\n }\r\n\r\n getDataType(): string {\r\n return this.#dataType;\r\n }\r\n\r\n getPortType(): PortType {\r\n return this.#portType;\r\n }\r\n\r\n getDisplayName(): string {\r\n return this.#displayName;\r\n }\r\n\r\n filledStyleColor(): string {\r\n if (this.#filledStyle.fillColor === undefined) {\r\n console.error(\"There's no fill color!!!!!!!!!\")\r\n return \"black\";\r\n }\r\n return this.#filledStyle.fillColor;\r\n }\r\n\r\n #box: Box = { Position: { x: 0, y: 0 }, Size: { x: 0, y: 0 } };\r\n\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, camera: Camera, mousePosition: Vector2 | undefined, postProcess: PassSubsystem): Box {\r\n let style = this.#emptyStyle;\r\n if (this.#connections.length > 0) {\r\n style = this.#filledStyle;\r\n }\r\n\r\n let scaledRadius = style.size as number * camera.zoom\r\n\r\n if (mousePosition && InBox(this.#box, mousePosition)) {\r\n scaledRadius *= 1.25;\r\n\r\n // Redeclare so lambda is ensured to use these values\r\n const xPos = position.x;\r\n const yPos = position.y;\r\n\r\n // TODO: Make it so we're not creating a new lambda each frame\r\n postProcess.queue(() => {\r\n const size = { x: 0, y: 0 }\r\n this.#dataTypePopupElement.calcSize(ctx, size, { x: -1, y: -1 });\r\n // size.x = Math.min(150, size.x)\r\n this.#dataTypePopupElement.render(ctx, { x: xPos - (size.x / 2), y: yPos }, 1, size)\r\n })\r\n }\r\n\r\n this.#box.Position.x = position.x - scaledRadius;\r\n this.#box.Position.y = position.y - scaledRadius;\r\n this.#box.Size.x = scaledRadius * 2;\r\n this.#box.Size.y = scaledRadius * 2;\r\n\r\n ctx.strokeStyle = style.borderColor as string;\r\n ctx.fillStyle = style.fillColor as string;\r\n\r\n ctx.beginPath();\r\n if (this.#portType === PortType.InputArray) {\r\n ctx.rect(position.x - scaledRadius, position.y - scaledRadius, scaledRadius * 2, scaledRadius * 2)\r\n } else {\r\n ctx.arc(position.x, position.y, scaledRadius, 0, 2 * Math.PI);\r\n }\r\n ctx.fill();\r\n ctx.stroke();\r\n\r\n\r\n return this.#box;\r\n }\r\n}","export interface StrokeStyleConfig {\r\n size?: number;\r\n color?: string;\r\n}\r\n\r\nexport function StrokeStyleWithFallback(input?: StrokeStyleConfig, fallback?: StrokeStyleConfig): StrokeStyleConfig {\r\n return {\r\n color: input?.color === undefined ? fallback?.color : input?.color,\r\n size: input?.size === undefined ? fallback?.size : input?.size,\r\n };\r\n}\r\n\r\nexport class StrokeStyle {\r\n #size: number;\r\n\r\n #color: string;\r\n\r\n constructor(config?: StrokeStyleConfig) {\r\n this.#size = config?.size === undefined ? 0.5 : config.size;\r\n this.#color = config?.color === undefined ? \"black\" : config.color;\r\n }\r\n\r\n setupStyle(ctx: CanvasRenderingContext2D, scale: number): void {\r\n ctx.strokeStyle = this.#color;\r\n ctx.lineWidth = scale * this.#size;\r\n }\r\n\r\n setColor(newColor: string): void {\r\n this.#color = newColor;\r\n }\r\n\r\n setSize(newSize: number): void {\r\n this.#size = newSize;\r\n }\r\n\r\n size(): number {\r\n return this.#size;\r\n }\r\n}","import { Box } from \"../types/box\";\r\nimport { StrokeStyle, StrokeStyleConfig, StrokeStyleWithFallback } from \"./stroke\";\r\n\r\nexport interface BoxStyleConfig {\r\n border?: StrokeStyleConfig;\r\n color?: string;\r\n radius?: number;\r\n}\r\n\r\nexport function BoxStyleWithFallback(input?: BoxStyleConfig, fallback?: BoxStyleConfig): BoxStyleConfig {\r\n return {\r\n radius: input?.radius === undefined ? fallback?.radius : input?.radius,\r\n color: input?.color === undefined ? fallback?.color : input?.color,\r\n border: StrokeStyleWithFallback(input?.border, fallback?.border)\r\n };\r\n}\r\n\r\nexport class BoxStyle {\r\n #border: StrokeStyle | null;\r\n\r\n #color: string;\r\n\r\n #radius: number;\r\n\r\n constructor(config?: BoxStyleConfig) {\r\n this.#color = config?.color === undefined ? \"#CCCCCC\" : config.color;\r\n this.#border = config?.border === undefined ? null : new StrokeStyle(config.border);\r\n this.#radius = config?.radius === undefined ? 2 : config.radius;\r\n }\r\n\r\n #box(ctx: CanvasRenderingContext2D, box: Box, scale: number, radius: any): void {\r\n ctx.fillStyle = this.#color\r\n this.#border?.setupStyle(ctx, scale);\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n box.Position.x,\r\n box.Position.y,\r\n box.Size.x,\r\n box.Size.y,\r\n radius\r\n );\r\n ctx.fill();\r\n }\r\n\r\n #draw(ctx: CanvasRenderingContext2D, box: Box, scale: number, radius: any): void {\r\n this.#box(ctx, box, scale, radius);\r\n ctx.stroke();\r\n }\r\n\r\n Outline(ctx: CanvasRenderingContext2D, box: Box, scale: number, radius: any): void {\r\n this.#border?.setupStyle(ctx, scale);\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n box.Position.x,\r\n box.Position.y,\r\n box.Size.x,\r\n box.Size.y,\r\n radius\r\n );\r\n ctx.stroke();\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, box: Box, scale: number): void {\r\n this.#draw(ctx, box, scale, this.#radius * scale)\r\n }\r\n\r\n DrawRoundedTopOnly(ctx: CanvasRenderingContext2D, box: Box, scale: number): void {\r\n this.#draw(ctx, box, scale, [this.#radius * scale * 2, this.#radius * scale * 2, 0, 0])\r\n }\r\n\r\n DrawUnderline(ctx: CanvasRenderingContext2D, box: Box, scale: number): void {\r\n this.#box(ctx, box, scale, [this.#radius * scale * 2, this.#radius * scale * 2, 0, 0]);\r\n ctx.beginPath();\r\n ctx.moveTo(box.Position.x, box.Position.y + box.Size.y)\r\n ctx.lineTo(box.Position.x + box.Size.x, box.Position.y + box.Size.y);\r\n ctx.stroke();\r\n }\r\n\r\n borderSize(): number {\r\n if (this.#border === null) {\r\n return 0;\r\n }\r\n return this.#border.size();\r\n }\r\n\r\n radius(): number {\r\n return this.#radius;\r\n }\r\n\r\n setColor(color: string): void {\r\n this.#color = color;\r\n }\r\n\r\n setBorderColor(color: string): void {\r\n if (this.#border === null) {\r\n this.#border = new StrokeStyle({\r\n color: color\r\n })\r\n } else {\r\n this.#border.setColor(color);\r\n }\r\n }\r\n\r\n}","export interface PopupConfig {\r\n title: string;\r\n options: Array<string>;\r\n\r\n onClose?: (button: string | null) => void;\r\n content?: () => Element;\r\n buttonCSS?: string;\r\n}\r\n\r\nexport class Popup {\r\n\r\n #title: string;\r\n\r\n #options: Array<string>;\r\n\r\n #content?: () => Element;\r\n\r\n #onClose?: (button: string | null) => void;\r\n\r\n // Styling ================================================================\r\n\r\n #buttonCSS: string;\r\n\r\n // Runtime ================================================================\r\n\r\n #popup: HTMLDivElement | null;\r\n\r\n constructor(config: PopupConfig) {\r\n this.#title = config.title;\r\n this.#options = config.options;\r\n this.#content = config.content;\r\n this.#onClose = config.onClose;\r\n this.#buttonCSS = config.buttonCSS === undefined ? \"flex-grow: 1; margin-right: 8px;\" : config.buttonCSS;\r\n this.#popup = null;\r\n }\r\n\r\n Hide(): void {\r\n if (this.#popup === null) {\r\n return;\r\n }\r\n document.body.removeChild(this.#popup);\r\n this.#popup = null;\r\n }\r\n\r\n Show(): void {\r\n this.#popup = document.createElement('div');\r\n this.#popup.style.cssText = 'position:absolute;top:0;width:100%;display:flex;height:100%;justify-content:center;align-items:center;background-color:#00000070;';\r\n document.body.appendChild(this.#popup);\r\n\r\n const container = document.createElement('div');\r\n container.style.cssText = 'background-color:#000;color:white;font-family:Verdana;border-radius:8px;padding:16px;';\r\n this.#popup.appendChild(container);\r\n\r\n const title = document.createElement(\"h2\");\r\n title.textContent = this.#title;\r\n title.style.cssText = \"margin-top:0;margin-bottom:16px;\";\r\n container.appendChild(title)\r\n\r\n if (this.#content !== undefined) {\r\n container.appendChild(this.#content());\r\n }\r\n\r\n const buttonContainer = document.createElement(\"div\");\r\n buttonContainer.style.cssText = 'margin-top:16px;justify-content:space-around;align-items:center;flex-direction:row;display:flex;';\r\n container.appendChild(buttonContainer);\r\n\r\n for (let i = 0; i < this.#options.length; i++) {\r\n const button = document.createElement(\"button\");\r\n button.style.cssText = this.#buttonCSS;\r\n button.textContent = this.#options[i];\r\n button.onclick = () => {\r\n this.Hide();\r\n if (this.#onClose !== undefined) {\r\n this.#onClose(this.#options[i]);\r\n }\r\n };\r\n buttonContainer.appendChild(button);\r\n }\r\n }\r\n\r\n} ","import { Box } from \"../types/box\";\r\nimport { BoxStyle, BoxStyleConfig, BoxStyleWithFallback } from \"./box\";\r\nimport { TextAlign } from \"./canvasTextAlign\";\r\nimport { TextBaseline } from \"./canvasTextBaseline\";\r\nimport { TextStyle, TextStyleConfig, TextStyleFallback } from './text';\r\n\r\n\r\nexport interface TextBoxStyleConfig {\r\n box?: BoxStyleConfig;\r\n text?: TextStyleConfig;\r\n\r\n textAlign?: CanvasTextAlign;\r\n textBaseline?: CanvasTextBaseline;\r\n}\r\n\r\nexport function TextBoxStyleWithFallback(input?: TextBoxStyleConfig, fallback?: TextBoxStyleConfig): TextBoxStyleConfig {\r\n return {\r\n box: BoxStyleWithFallback(input?.box, fallback?.box),\r\n text: TextStyleFallback(input?.text, fallback?.text),\r\n \r\n textAlign: input?.textAlign === undefined ? fallback?.textAlign : input?.textAlign,\r\n textBaseline: input?.textBaseline === undefined ? fallback?.textBaseline : input?.textBaseline,\r\n };\r\n}\r\n\r\nexport class TextBoxStyle {\r\n #box: BoxStyle;\r\n\r\n #text: TextStyle;\r\n\r\n #textAlign: CanvasTextAlign;\r\n\r\n #textBaseline: CanvasTextBaseline;\r\n\r\n constructor(config?: TextBoxStyleConfig) {\r\n this.#box = new BoxStyle(config?.box);\r\n this.#text = new TextStyle(config?.text);\r\n\r\n this.#textAlign = config?.textAlign === undefined ? TextAlign.Center : config.textAlign;\r\n this.#textBaseline = config?.textBaseline === undefined ? TextBaseline.Middle : config.textBaseline;\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, box: Box, scale: number, text: string) {\r\n this.#box.Draw(ctx, box, scale);\r\n\r\n ctx.textAlign = this.#textAlign;\r\n ctx.textBaseline = this.#textBaseline;\r\n this.#text.setupStyle(ctx, scale);\r\n\r\n ctx.fillText(\r\n text,\r\n box.Position.x + (box.Size.x / 2),\r\n box.Position.y + (box.Size.y / 2),\r\n );\r\n }\r\n\r\n DrawUnderline(ctx: CanvasRenderingContext2D, box: Box, scale: number, text: string) {\r\n this.#box.DrawUnderline(ctx, box, scale);\r\n\r\n ctx.textAlign = this.#textAlign;\r\n ctx.textBaseline = this.#textBaseline;\r\n this.#text.setupStyle(ctx, scale);\r\n\r\n ctx.fillText(\r\n text,\r\n box.Position.x + (box.Size.x / 2),\r\n box.Position.y + (box.Size.y / 2),\r\n );\r\n }\r\n\r\n setTextColor(color: string): void {\r\n this.#text.setColor(color);\r\n }\r\n\r\n setBoxColor(color: string): void {\r\n this.#box.setColor(color);\r\n }\r\n\r\n setBorderColor(color: string): void {\r\n this.#box.setBorderColor(color);\r\n }\r\n}","import { Box } from '../types/box';\r\nimport { Vector2 } from '../types/vector2';\r\n\r\nexport const width = 150;\r\nexport const height = 25;\r\n\r\nexport interface Widget {\r\n Size(): Vector2\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box\r\n ClickStart(): void\r\n ClickEnd(): void\r\n}","import { Theme } from \"../theme\";\r\nimport { Popup } from \"../popup\";\r\nimport { TextBoxStyle, TextBoxStyleConfig, TextBoxStyleWithFallback } from \"../styles/textBox\";\r\nimport { Box, InBox } from '../types/box';\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\nimport { height, width } from \"./widget\";\r\nimport { FlowNode } from \"../node\";\r\n\r\nexport interface NumberWidgetConfig {\r\n value?: number;\r\n\r\n property?: string;\r\n\r\n idleBoxStyle?: TextBoxStyleConfig;\r\n\r\n highlightBoxStyle?: TextBoxStyleConfig;\r\n\r\n callback?: (newNumber: number) => void;\r\n}\r\n\r\nexport class NumberWidget {\r\n\r\n #node: FlowNode;\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n #value: number;\r\n\r\n #idleBoxStyle: TextBoxStyle;\r\n\r\n #highlightBoxStyle: TextBoxStyle;\r\n\r\n #text: string;\r\n\r\n #callback?: (newNumber: number) => void;\r\n\r\n constructor(node: FlowNode, config?: NumberWidgetConfig) {\r\n this.#value = 0;\r\n this.#text = \"0\";\r\n\r\n this.#node = node;\r\n this.#nodeProperty = config?.property;\r\n this.#idleBoxStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.idleBoxStyle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n },\r\n radius: Theme.Widget.Border.Radius\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.#highlightBoxStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.highlightBoxStyle, {\r\n box: {\r\n color: Theme.Widget.Hover.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n },\r\n radius: Theme.Widget.Border.Radius\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.Set(config?.value === undefined ? 0 : config?.value);\r\n this.#callback = config?.callback;\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.addPropertyChangeListener(this.#nodeProperty, (oldVal, newVal) => {\r\n this.Set(newVal);\r\n });\r\n }\r\n\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n Set(newNumber: number): void {\r\n if (this.#value === newNumber) {\r\n return;\r\n }\r\n\r\n this.#value = newNumber;\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.setProperty(this.#nodeProperty, this.#value);\r\n }\r\n\r\n if (this.#callback !== undefined) {\r\n this.#callback(this.#value);\r\n }\r\n\r\n // https://stackoverflow.com/questions/5765398/whats-the-best-way-to-convert-a-number-to-a-string-in-javascript\r\n this.#text = '' + parseFloat(this.#value.toPrecision(6));\r\n }\r\n\r\n ClickStart(): void {\r\n }\r\n\r\n ClickEnd(): void {\r\n let input: HTMLInputElement | null = null;\r\n\r\n const setOption = \"Set\";\r\n const cancelOption = \"Cancel\";\r\n const popup = new Popup({\r\n title: \"Set Number\",\r\n options: [setOption, cancelOption],\r\n content: () => {\r\n const container = document.createElement('div');\r\n input = document.createElement('input')\r\n input.type = \"number\";\r\n input.valueAsNumber = this.#value;\r\n container.append(input);\r\n return container;\r\n },\r\n onClose: (button: string | null): void => {\r\n if (button !== setOption || input === null) {\r\n return;\r\n }\r\n\r\n this.Set(input.valueAsNumber);\r\n },\r\n });\r\n\r\n popup.Show();\r\n }\r\n\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const box = {\r\n Position: { x: 0, y: 0 },\r\n Size: {\r\n x: width * scale,\r\n y: height * scale\r\n }\r\n };\r\n CopyVector2(box.Position, position);\r\n\r\n let style: TextBoxStyle = this.#idleBoxStyle;\r\n\r\n if (mousePosition !== undefined) {\r\n if (InBox(box, mousePosition)) {\r\n style = this.#highlightBoxStyle;\r\n }\r\n }\r\n\r\n style.DrawUnderline(ctx, box, scale, this.#text)\r\n\r\n return box;\r\n }\r\n}","import { Theme } from \"../theme\";\r\nimport { TextBoxStyle, TextBoxStyleConfig, TextBoxStyleWithFallback } from \"../styles/textBox\";\r\nimport { Box, InBox } from \"../types/box\";\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\nimport { height, width } from \"./widget\";\r\n\r\n\r\nexport interface ButtonWidgetConfig {\r\n text?: string;\r\n callback?: () => void;\r\n idleStyle?: TextBoxStyleConfig;\r\n hoverStyle?: TextBoxStyleConfig;\r\n clickStyle?: TextBoxStyleConfig;\r\n}\r\n\r\nexport class ButtonWidget {\r\n\r\n #text: string;\r\n\r\n #idleStyle: TextBoxStyle;\r\n\r\n #hoverStyle: TextBoxStyle;\r\n\r\n #clickStyle: TextBoxStyle;\r\n\r\n #callback?: () => void;\r\n\r\n #gettingClicked: boolean;\r\n\r\n constructor(config?: ButtonWidgetConfig) {\r\n this.#text = config?.text === undefined ? \"Button\" : config?.text;\r\n this.#callback = config?.callback\r\n this.#gettingClicked = false;\r\n\r\n this.#idleStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.idleStyle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.#hoverStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.hoverStyle, {\r\n box: {\r\n color: Theme.Widget.Hover.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.#clickStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.clickStyle, {\r\n box: { \r\n color: Theme.Widget.Button.Click.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }))\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const box = {\r\n Position: { x: 0, y: 0 },\r\n Size: {\r\n x: width * scale,\r\n y: height * scale\r\n }\r\n };\r\n CopyVector2(box.Position, position);\r\n\r\n let style: TextBoxStyle = this.#idleStyle;\r\n\r\n if (mousePosition !== undefined && !this.#gettingClicked) {\r\n if (InBox(box, mousePosition)) {\r\n style = this.#hoverStyle;\r\n }\r\n }\r\n\r\n if (this.#gettingClicked) {\r\n style = this.#clickStyle;\r\n }\r\n style.Draw(ctx, box, scale, this.#text);\r\n\r\n return box\r\n }\r\n\r\n ClickStart(): void {\r\n this.#gettingClicked = true;\r\n }\r\n\r\n ClickEnd(): void {\r\n this.#gettingClicked = false;\r\n if (this.#callback !== undefined) {\r\n this.#callback();\r\n }\r\n }\r\n}","import { HexToColor } from \"../utils/color\";\r\nimport { TextStyleConfig } from \"../styles/text\";\r\nimport { Box } from \"../types/box\";\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\nimport { height, width } from \"./widget\";\r\nimport { Popup } from \"../popup\";\r\nimport { TextBoxStyle } from '../styles/textBox';\r\nimport { Theme } from \"../theme\";\r\nimport { FlowNode } from \"../node\";\r\n\r\nexport interface ColorWidgetConfig {\r\n value?: string;\r\n\r\n property?: string;\r\n\r\n textStyle?: TextStyleConfig;\r\n\r\n callback?: (newColor: string) => void;\r\n}\r\n\r\nfunction contrastColor(color: string): string {\r\n const c = HexToColor(color);\r\n if (c === null) {\r\n return \"black\";\r\n }\r\n\r\n if ((c.r + c.g + c.b) / 3 > 0.5) {\r\n return \"black\"\r\n }\r\n\r\n return \"white\";\r\n}\r\n\r\nexport class ColorWidget {\r\n\r\n #node: FlowNode;\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n #value: string;\r\n\r\n #contrast: string;\r\n\r\n #textBoxStyle: TextBoxStyle;\r\n\r\n #callback?: (newColor: string) => void;\r\n\r\n constructor(node: FlowNode, config?: ColorWidgetConfig) {\r\n this.#value = \"#000000\"\r\n this.#contrast = contrastColor(this.#value);\r\n this.Set(config?.value === undefined ? \"#000000\" : config?.value);\r\n \r\n this.#node = node;\r\n this.#nodeProperty = config?.property;\r\n this.#textBoxStyle = new TextBoxStyle({\r\n box: {\r\n color: this.#value,\r\n border: {\r\n color: this.#contrast,\r\n size: Theme.Widget.Border.Size\r\n }\r\n },\r\n text: config?.textStyle\r\n });\r\n this.#callback = config?.callback;\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.addPropertyChangeListener(this.#nodeProperty, (oldVal, newVal) => {\r\n this.Set(newVal);\r\n });\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n Set(value: string): void {\r\n if (this.#value === value) {\r\n return;\r\n }\r\n\r\n this.#value = value;\r\n\r\n if (this.#callback !== undefined) {\r\n this.#callback(this.#value);\r\n }\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.setProperty(this.#nodeProperty, this.#value);\r\n }\r\n\r\n // Update Styling\r\n this.#contrast = contrastColor(this.#value);\r\n this.#textBoxStyle.setBoxColor(this.#value);\r\n this.#textBoxStyle.setBorderColor(this.#contrast);\r\n this.#textBoxStyle.setTextColor(this.#contrast);\r\n }\r\n\r\n ClickStart(): void {\r\n }\r\n\r\n ClickEnd(): void {\r\n let input: HTMLInputElement | null = null;\r\n\r\n const popup = new Popup({\r\n title: \"Set Color\",\r\n options: [\"Set\", \"Cancel\"],\r\n content: () => {\r\n const container = document.createElement('div');\r\n\r\n input = document.createElement('input')\r\n input.type = \"color\";\r\n input.value = this.#value;\r\n input.name = \"color\"\r\n container.append(input);\r\n\r\n const label = document.createElement(\"label\");\r\n label.htmlFor = \"color\";\r\n label.textContent = \"Color\";\r\n container.append(label);\r\n\r\n return container;\r\n },\r\n onClose: (button: string | null): void => {\r\n if (button !== \"Set\" || input === null) {\r\n return;\r\n }\r\n\r\n this.Set(input.value);\r\n },\r\n });\r\n\r\n popup.Show();\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const box = {\r\n Position: { x: 0, y: 0 },\r\n Size: {\r\n x: width * scale,\r\n y: height * scale\r\n }\r\n };\r\n CopyVector2(box.Position, position);\r\n\r\n this.#textBoxStyle.Draw(ctx, box, scale, this.#value)\r\n\r\n return box;\r\n }\r\n}","import { Theme } from \"../theme\";\r\nimport { TextAlign } from \"../styles/canvasTextAlign\";\r\nimport { TextStyle, TextStyleConfig, TextStyleFallback } from \"../styles/text\";\r\nimport { Box } from '../types/box';\r\nimport { CopyVector2, Vector2, Zero } from \"../types/vector2\";\r\nimport { Clamp, Clamp01 } from \"../utils/math\";\r\nimport { height, width } from \"./widget\";\r\nimport { TextBaseline } from \"../styles/canvasTextBaseline\";\r\nimport { FlowNode } from \"../node\";\r\n\r\nexport interface SliderWidgetConfig {\r\n\r\n property?: string;\r\n\r\n min?: number;\r\n\r\n max?: number;\r\n\r\n value?: number;\r\n\r\n backgroundColor?: string;\r\n\r\n borderColor?: string;\r\n\r\n fillColor?: string;\r\n\r\n textStyle?: TextStyleConfig;\r\n\r\n change?: (newValue: number) => void;\r\n\r\n release?: (newValue: number) => void;\r\n\r\n snapIncrement?: number;\r\n\r\n}\r\n\r\nexport class SliderWidget {\r\n\r\n // Data Variables =========================================================\r\n\r\n #min: number;\r\n\r\n #max: number;\r\n\r\n #value: number;\r\n\r\n #text: string;\r\n\r\n #snapIncrement?: number;\r\n\r\n #node: FlowNode;\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n // Callbacks ==============================================================\r\n\r\n #change?: (newValue: number) => void;\r\n\r\n #release?: (newValue: number) => void;\r\n\r\n // Styling Variables ======================================================\r\n\r\n #textStyle: TextStyle\r\n\r\n #backgroundColor: string;\r\n\r\n #borderColor: string;\r\n\r\n #fillColor: string;\r\n\r\n // Runtime Variables ======================================================\r\n\r\n #lastMousePosition: Vector2;\r\n\r\n #clickStartMousePosition: Vector2;\r\n\r\n #clicking: boolean;\r\n\r\n constructor(node: FlowNode, config?: SliderWidgetConfig) {\r\n this.#node = node;\r\n this.#value = 0;\r\n this.#min = config?.min === undefined ? 0 : config?.min;\r\n this.#max = config?.max === undefined ? 1 : config?.max;\r\n this.#snapIncrement = config?.snapIncrement;\r\n this.#nodeProperty = config?.property;\r\n this.#text = \"\";\r\n \r\n this.#release = config?.release;\r\n\r\n this.#backgroundColor = config?.backgroundColor === undefined ? Theme.Widget.BackgroundColor : config?.backgroundColor;\r\n this.#fillColor = config?.fillColor === undefined ? Theme.Widget.Slider.FillColor : config?.fillColor;\r\n this.#borderColor = config?.borderColor === undefined ? Theme.Widget.Border.Color : config?.borderColor;\r\n this.#textStyle = new TextStyle(TextStyleFallback(config?.textStyle, {\r\n color: Theme.Widget.FontColor,\r\n }));\r\n this.#lastMousePosition = Zero();\r\n this.#clickStartMousePosition = Zero();\r\n this.#clicking = false;\r\n\r\n\r\n if (config?.property !== undefined && config?.property !== null) {\r\n node.addPropertyChangeListener(config.property, (oldVal, newVal) => {\r\n this.SetValue(newVal);\r\n });\r\n }\r\n\r\n this.SetValue(config?.value === undefined ? 0 : config?.value);\r\n\r\n // Setup change callback after we set the initial value to prevent the callback from being \r\n this.#change = config?.change;\r\n }\r\n\r\n SetValue(newValue: number): void {\r\n const cleanedValue = Clamp(newValue, this.#min, this.#max);\r\n if (this.#value === cleanedValue) {\r\n return;\r\n }\r\n\r\n this.#value = cleanedValue;\r\n\r\n if (this.#nodeProperty) {\r\n this.#node.setProperty(this.#nodeProperty, this.#value);\r\n }\r\n\r\n this.#text = this.#value.toFixed(3);\r\n if (this.#change !== undefined) {\r\n this.#change(this.#value);\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n ClickStart(): void {\r\n this.#clicking = true;\r\n CopyVector2(this.#clickStartMousePosition, this.#lastMousePosition)\r\n }\r\n\r\n ClickEnd(): void {\r\n this.#clicking = false;\r\n if (this.#release !== undefined) {\r\n this.#release(this.#value);\r\n }\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const scaledWidth = width * scale;\r\n const scaledHeight = height * scale;\r\n\r\n const scaledBorderThickness = Theme.Widget.Border.Size * scale;\r\n\r\n // Render background\r\n ctx.fillStyle = this.#backgroundColor;\r\n ctx.strokeStyle = this.#borderColor;\r\n ctx.lineWidth = scaledBorderThickness;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x,\r\n position.y,\r\n scaledWidth,\r\n scaledHeight,\r\n Theme.Widget.Border.Radius * scale\r\n );\r\n ctx.fill();\r\n ctx.stroke();\r\n\r\n // Render Fill\r\n const fill = Clamp01((this.#value - this.#min) / (this.#max - this.#min));\r\n ctx.fillStyle = this.#fillColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x + (scaledBorderThickness / 2),\r\n position.y + (scaledBorderThickness / 2),\r\n (scaledWidth * fill) - scaledBorderThickness,\r\n scaledHeight - scaledBorderThickness,\r\n Theme.Widget.Border.Radius * scale\r\n );\r\n ctx.fill();\r\n\r\n // Render Number\r\n ctx.textAlign = TextAlign.Center;\r\n ctx.textBaseline = TextBaseline.Middle;\r\n this.#textStyle.setupStyle(ctx, scale);\r\n ctx.fillText(\r\n this.#text,\r\n position.x + (scaledWidth / 2),\r\n position.y + (scaledHeight / 2),\r\n );\r\n\r\n // Update value based on mouse position\r\n if (mousePosition !== undefined) {\r\n CopyVector2(this.#lastMousePosition, mousePosition);\r\n if (this.#clicking) {\r\n const min = position.x + (scaledBorderThickness / 2);\r\n const max = min + scaledWidth - scaledBorderThickness;\r\n const p = Clamp01((this.#lastMousePosition.x - min) / (max - min));\r\n\r\n let value = (p * (this.#max - this.#min)) + this.#min;\r\n if (this.#snapIncrement !== undefined) {\r\n value = Math.round(value / this.#snapIncrement) * this.#snapIncrement;\r\n }\r\n\r\n this.SetValue(value);\r\n }\r\n }\r\n\r\n return {\r\n Position: { x: position.x, y: position.y },\r\n Size: {\r\n x: scaledWidth,\r\n y: scaledHeight\r\n }\r\n };\r\n }\r\n}","import { Popup } from \"../popup\";\r\n\r\ninterface Config {\r\n title: string;\r\n startingValue: string;\r\n onUpdate: (newValue: string) => void;\r\n onCancel?: () => void;\r\n}\r\n\r\nexport function SetStringPopup(config: Config): Popup {\r\n let input: HTMLInputElement | null = null;\r\n\r\n return new Popup({\r\n title: config.title,\r\n options: [\"Set\", \"Cancel\"],\r\n content: () => {\r\n const container = document.createElement('div');\r\n input = document.createElement('input')\r\n input.value = config.startingValue;\r\n container.append(input);\r\n return container;\r\n },\r\n onClose: (button: string | null): void => {\r\n if (button !== \"Set\" || input === null) {\r\n if(config.onCancel) {\r\n config.onCancel();\r\n }\r\n return;\r\n }\r\n config.onUpdate(input.value);\r\n },\r\n });\r\n}","import { Theme } from \"../theme\";\r\nimport { TextBoxStyle, TextBoxStyleConfig, TextBoxStyleWithFallback } from \"../styles/textBox\";\r\nimport { Box, InBox } from \"../types/box\";\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\nimport { fitString } from \"../utils/string\";\r\nimport { height, width } from \"./widget\";\r\nimport { FlowNode } from '../node';\r\nimport { SetStringPopup } from \"../popups/string\";\r\n\r\nexport interface StringWidgetConfig {\r\n property?: string;\r\n\r\n value?: string;\r\n\r\n textBoxStyle?: TextBoxStyleConfig;\r\n\r\n callback?: (newString: string) => void;\r\n}\r\n\r\nexport class StringWidget {\r\n\r\n #value: string;\r\n\r\n #idleStyle: TextBoxStyle;\r\n\r\n #hoverStyle: TextBoxStyle;\r\n\r\n #callback?: (newString: string) => void;\r\n\r\n #node: FlowNode\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n constructor(node: FlowNode, config?: StringWidgetConfig) {\r\n this.#value = \"\";\r\n \r\n this.#node = node;\r\n this.#nodeProperty = config?.property;\r\n this.#idleStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.textBoxStyle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n },\r\n radius: Theme.Widget.Border.Radius\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n\r\n this.#hoverStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.textBoxStyle, {\r\n box: {\r\n color: Theme.Widget.Hover.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n },\r\n radius: Theme.Widget.Border.Radius\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n\r\n this.Set(config?.value === undefined ? \"\" : config?.value);\r\n this.#callback = config?.callback;\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.addPropertyChangeListener(this.#nodeProperty, (oldVal, newVal) => {\r\n this.Set(newVal);\r\n });\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n Set(value: string): void {\r\n if (this.#value === value) {\r\n return;\r\n }\r\n this.#value = value;\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.setProperty(this.#nodeProperty, this.#value)\r\n }\r\n\r\n if (this.#callback !== undefined) {\r\n this.#callback(this.#value);\r\n }\r\n }\r\n\r\n ClickStart(): void {\r\n }\r\n\r\n ClickEnd(): void {\r\n const popup = SetStringPopup({\r\n title: \"Set String\",\r\n startingValue: this.#value,\r\n onUpdate: (value: string): void => {\r\n this.Set(value);\r\n },\r\n });\r\n popup.Show();\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const box = {\r\n Position: { x: 0, y: 0 },\r\n Size: {\r\n x: width * scale,\r\n y: height * scale\r\n }\r\n };\r\n CopyVector2(box.Position, position);\r\n\r\n\r\n let style: TextBoxStyle = this.#idleStyle;\r\n\r\n if (mousePosition !== undefined) {\r\n if (InBox(box, mousePosition)) {\r\n style = this.#hoverStyle;\r\n }\r\n }\r\n\r\n style.DrawUnderline(ctx, box, scale, fitString(ctx, this.#value, box.Size.x - (20 * scale)))\r\n\r\n return box;\r\n }\r\n}","import { Theme } from \"../theme\";\r\nimport { Box, InBox } from \"../types/box\";\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\nimport { height, width } from \"./widget\";\r\nimport { TextBoxStyle, TextBoxStyleConfig, TextBoxStyleWithFallback } from \"../styles/textBox\";\r\nimport { FlowNode } from \"../node\";\r\n\r\nexport interface ToggleStyleConfig {\r\n idle?: TextBoxStyleConfig,\r\n hover?: TextBoxStyleConfig,\r\n lightColor?: string;\r\n lightBorderColor?: string;\r\n lightBlur?: number;\r\n}\r\n\r\nexport interface ToggleWidgetConfig {\r\n property?: string;\r\n value?: boolean;\r\n text?: string;\r\n callback?: () => void;\r\n enabledStyle?: ToggleStyleConfig;\r\n disabledStyle?: ToggleStyleConfig;\r\n}\r\n\r\nclass ToggleStyle {\r\n\r\n #idleStyle: TextBoxStyle;\r\n\r\n #hoverStyle: TextBoxStyle;\r\n\r\n #lightColor: string;\r\n\r\n #lightBorderColor: string;\r\n\r\n #lightBlur?: number;\r\n\r\n #box: Box;\r\n\r\n constructor(config?: ToggleStyleConfig) {\r\n this.#idleStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.idle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.#hoverStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.hover, {\r\n box: {\r\n color: Theme.Widget.Hover.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.#lightColor = config?.lightColor === undefined ? \"#222222\" : config.lightColor;\r\n this.#lightBorderColor = config?.lightBorderColor === undefined ? \"black\" : config.lightBorderColor;\r\n this.#lightBlur = config?.lightBlur;\r\n\r\n this.#box = {Position: { x: 0, y: 0 }, Size: { x: 0, y: 0 } };\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, pos: Vector2, scale: number, text: string, mousePosition: Vector2 | undefined): Box {\r\n const scaledWidth = width * scale;\r\n const scaledHeight = height * scale;\r\n this.#box.Size.x = scaledWidth;\r\n this.#box.Size.y = scaledHeight;\r\n CopyVector2(this.#box.Position, pos);\r\n\r\n // Background\r\n let style: TextBoxStyle = this.#idleStyle;\r\n if (mousePosition !== undefined) {\r\n if (InBox(this.#box, mousePosition)) {\r\n style = this.#hoverStyle;\r\n }\r\n }\r\n style.Draw(ctx, this.#box, scale, text);\r\n\r\n // Light\r\n const lightScale = Math.min(scaledWidth, scaledHeight);\r\n ctx.strokeStyle = this.#lightBorderColor;\r\n ctx.fillStyle = this.#lightColor\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n pos.x + (lightScale * .2),\r\n pos.y + (lightScale * .2),\r\n lightScale * .6,\r\n lightScale * .6,\r\n Theme.Widget.Border.Radius * scale\r\n );\r\n if (this.#lightBlur) {\r\n ctx.shadowBlur = this.#lightBlur * scale;\r\n ctx.shadowColor = this.#lightColor;\r\n }\r\n ctx.fill();\r\n if (this.#lightBlur) {\r\n ctx.shadowBlur = 0;\r\n }\r\n // ctx.stroke();\r\n\r\n return this.#box\r\n }\r\n}\r\n\r\nexport class ToggleWidget {\r\n\r\n #node: FlowNode;\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n #value: boolean;\r\n\r\n #text: string;\r\n\r\n #enabledStyle: ToggleStyle;\r\n\r\n #disabledStyle: ToggleStyle;\r\n\r\n #callback?: (value: boolean) => void;\r\n\r\n constructor(node: FlowNode, config?: ToggleWidgetConfig) {\r\n this.#value = false;\r\n\r\n this.#node = node;\r\n this.#nodeProperty = config?.property;\r\n this.#text = config?.text === undefined ? \"Toggle\" : config?.text;\r\n\r\n this.#enabledStyle = new ToggleStyle({\r\n idle: TextBoxStyleWithFallback(config?.enabledStyle?.idle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }),\r\n lightBorderColor: config?.enabledStyle?.lightBorderColor,\r\n lightColor: config?.enabledStyle?.lightColor === undefined ? \"#00FF00\" : config?.enabledStyle?.lightColor,\r\n lightBlur: config?.enabledStyle?.lightBlur === undefined ? 15 : config?.enabledStyle?.lightBlur\r\n });\r\n this.#disabledStyle = new ToggleStyle({\r\n idle: TextBoxStyleWithFallback(config?.disabledStyle?.idle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }),\r\n lightBorderColor: config?.disabledStyle?.lightBorderColor,\r\n lightColor: config?.disabledStyle?.lightColor === undefined ? \"#004400\" : config?.enabledStyle?.lightColor,\r\n });\r\n\r\n this.Set(config?.value === undefined ? false : config?.value);\r\n this.#callback = config?.callback;\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.addPropertyChangeListener(this.#nodeProperty, (oldVal, newVal) => {\r\n this.Set(newVal);\r\n });\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n let style = this.#value ? this.#enabledStyle : this.#disabledStyle;\r\n return style.Draw(ctx, position, scale, this.#text, mousePosition);\r\n }\r\n\r\n Toggle(): void {\r\n this.Set(!this.#value);\r\n }\r\n\r\n Set(value: boolean): void {\r\n if (this.#value === value) {\r\n return;\r\n }\r\n this.#value = value;\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.setProperty(this.#nodeProperty, this.#value);\r\n }\r\n\r\n if (this.#callback !== undefined) {\r\n this.#callback(this.#value);\r\n }\r\n }\r\n\r\n ClickStart(): void {\r\n this.Toggle();\r\n }\r\n\r\n ClickEnd(): void {\r\n }\r\n}","import { Box } from \"../types/box\";\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\n\r\nconst margin = 15;\r\n\r\nexport interface ImageWidgetConfig {\r\n image?: string;\r\n maxWidth?: number\r\n maxHeight?: number\r\n blob?: Blob;\r\n}\r\n\r\n/**\r\n * constructor(lightNode, nodeManager, id, parameterData, app) {\r\n this.lightNode = lightNode;\r\n this.id = id;\r\n this.app = app;\r\n this.lightNode.title = parameterData.name;\r\n\r\n this.lightNode.onDropFile = (file) => {\r\n // console.log(file)\r\n var reader = new FileReader();\r\n reader.onload = (evt) => {\r\n console.log(evt.target.result)\r\n nodeManager.nodeParameterChanged({\r\n id: id,\r\n data: evt.target.result,\r\n binary: true\r\n });\r\n }\r\n reader.readAsArrayBuffer(file);\r\n\r\n const url = URL.createObjectURL(file);\r\n // this.loadImage(this._url, function (img) {\r\n // that.size[1] = (img.height / img.width) * that.size[0];\r\n // });\r\n this.loadImgFromURL(url);\r\n }\r\n }\r\n\r\n loadImgFromURL(url) {\r\n const img = document.createElement(\"img\");\r\n img.src = url;\r\n img.onload = () => {\r\n // if (callback) {\r\n // callback(this);\r\n // }\r\n // console.log(\"Image loaded, size: \" + img.width + \"x\" + img.height);\r\n // this.dirty = true;\r\n // that.boxcolor = \"#9F9\";f\r\n // that.setDirtyCanvas(true);\r\n this.lightNode.widgets[0].image = img\r\n this.lightNode.setSize(this.lightNode.computeSize());\r\n };\r\n img.onerror = () => {\r\n console.log(\"error loading the image:\" + url);\r\n }\r\n }\r\n\r\n update(parameterData) {\r\n console.log(\"image parameter\", parameterData)\r\n const curVal = parameterData.currentValue;\r\n this.app.RequestManager.getParameterValue(this.id, (response) => {\r\n const url = URL.createObjectURL(response);\r\n this.loadImgFromURL(url)\r\n })\r\n }\r\n */\r\n\r\nexport class ImageWidget {\r\n\r\n #url: string | undefined;\r\n\r\n #image: HTMLImageElement | undefined;\r\n\r\n #maxWidth: number;\r\n\r\n #maxHeight: number;\r\n\r\n constructor(config?: ImageWidgetConfig) {\r\n this.#maxWidth = config?.maxWidth === undefined ? 150 : config?.maxWidth;\r\n this.#maxHeight = config?.maxHeight === undefined ? 150 : config?.maxHeight;\r\n if (config?.image) {\r\n this.SetUrl(config?.image);\r\n } else if (config?.blob) {\r\n this.SetBlob(config?.blob);\r\n }\r\n }\r\n\r\n SetBlob(blob: Blob) {\r\n const urlCreator = window.URL || window.webkitURL;\r\n const imageUrl = urlCreator.createObjectURL(blob);\r\n this.SetUrl(imageUrl);\r\n }\r\n\r\n SetUrl(url: string) {\r\n this.#image = undefined;\r\n this.#url = url;\r\n\r\n const img = document.createElement(\"img\");\r\n img.src = url;\r\n img.onload = () => {\r\n this.#image = img;\r\n };\r\n img.onerror = (event) => {\r\n console.log(\"error loading image:\", url, event);\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n if (this.#image === undefined) {\r\n return { \"x\": 0, \"y\": 0 }\r\n }\r\n\r\n let adjust = 1;\r\n if (this.#image.width > this.#maxWidth) {\r\n adjust = this.#maxWidth / this.#image.width\r\n }\r\n\r\n if (this.#image.height > this.#maxHeight) {\r\n let heightAdjust = this.#maxHeight / this.#image.height\r\n if (heightAdjust < adjust) {\r\n adjust = heightAdjust;\r\n }\r\n }\r\n\r\n return {\r\n \"x\": adjust * this.#image.width,\r\n \"y\": adjust * this.#image.height\r\n }\r\n }\r\n\r\n ClickStart(): void {\r\n }\r\n\r\n ClickEnd(): void {\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const size = this.Size();\r\n const box: Box = {\r\n Position: { x: 0, y: 0 },\r\n Size: {\r\n x: size.x * scale,\r\n y: size.y * scale,\r\n }\r\n }\r\n CopyVector2(box.Position, position);\r\n\r\n if (!this.#image) {\r\n return box;\r\n }\r\n\r\n ctx.drawImage(\r\n this.#image,\r\n position.x,\r\n position.y,\r\n box.Size.x,\r\n box.Size.y\r\n );\r\n return box;\r\n }\r\n}","import { Theme } from \"../theme\";\r\nimport { Box, InBox } from \"../types/box\";\r\nimport { CopyVector2, Vector2, Zero } from \"../types/vector2\";\r\nimport { FlowNode } from '../node';\r\nimport { Text } from \"../types/text\";\r\nimport { TextStyle, TextStyleConfig, TextStyleFallback } from \"../styles/text\";\r\n\r\nexport interface TextWidgetConfig {\r\n property?: string;\r\n\r\n value?: string;\r\n\r\n textBoxStyle?: TextStyleConfig;\r\n\r\n callback?: (newString: string) => void;\r\n}\r\n\r\nexport class TextWidget {\r\n\r\n #value: Text;\r\n\r\n #callback?: (newString: string) => void;\r\n\r\n #node: FlowNode\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n #size: Vector2;\r\n\r\n constructor(node: FlowNode, config?: TextWidgetConfig) {\r\n this.#size = Zero();\r\n this.#node = node;\r\n this.#nodeProperty = config?.property;\r\n this.#value = new Text(\"\", TextStyleFallback(config?.textBoxStyle, {\r\n font: Theme.FontFamily,\r\n color: Theme.Widget.FontColor,\r\n size: Theme.Note.FontSize,\r\n }))\r\n\r\n this.Set(config?.value === undefined ? \"\" : config?.value);\r\n this.#callback = config?.callback;\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.addPropertyChangeListener(this.#nodeProperty, (oldVal, newVal) => {\r\n this.Set(newVal);\r\n });\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n return this.#size;\r\n }\r\n\r\n Set(value: string): void {\r\n if (this.#value.get() === value) {\r\n return;\r\n }\r\n this.#value.set(value);\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.setProperty(this.#nodeProperty, value)\r\n }\r\n\r\n if (this.#callback !== undefined) {\r\n this.#callback(value);\r\n }\r\n }\r\n\r\n ClickStart(): void {\r\n // Left blank for implementing Widget interface\r\n }\r\n\r\n ClickEnd(): void {\r\n // Left blank for implementing Widget interface\r\n }\r\n\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n this.#value.size(ctx, scale, this.#size);\r\n const box = {\r\n Position: { x: 0, y: 0 },\r\n Size: this.#size\r\n };\r\n CopyVector2(box.Position, position);\r\n this.#value.size(ctx, 1, this.#size);\r\n \r\n ctx.textAlign = \"left\";\r\n this.#value.render(ctx, scale, box.Position);\r\n // this.#idleStyle.DrawUnderline(ctx, box, scale, fitString(ctx, this.#value, box.Size.x - (20 * scale)))\r\n\r\n return box;\r\n }\r\n}","import { Widget } from \"./widget\";\r\nimport { NumberWidget, NumberWidgetConfig } from './number';\r\nimport { ButtonWidget, ButtonWidgetConfig } from './button';\r\nimport { ColorWidget, ColorWidgetConfig } from './color';\r\nimport { SliderWidget, SliderWidgetConfig } from './slider';\r\nimport { StringWidget, StringWidgetConfig } from './string';\r\nimport { ToggleWidget, ToggleWidgetConfig } from './toggle';\r\nimport { FlowNode } from \"../node\";\r\nimport { ImageWidget, ImageWidgetConfig } from \"./image\";\r\nimport { TextWidget, TextWidgetConfig } from \"./text\";\r\n\r\nexport type WidgetBuilder = (node: FlowNode, confg?: any) => Widget;\r\n\r\nclass WidgetFactory {\r\n\r\n #registeredWidgets: Map<string, WidgetBuilder>\r\n\r\n constructor() {\r\n this.#registeredWidgets = new Map<string, WidgetBuilder>();\r\n }\r\n\r\n register(widgetType: string, builder: WidgetBuilder): void {\r\n this.#registeredWidgets.set(widgetType, builder);\r\n }\r\n\r\n create(node: FlowNode, widgetType: string, config: any): Widget {\r\n const builder = this.#registeredWidgets.get(widgetType)\r\n if (builder === undefined) {\r\n throw new Error(\"no builder registered for widget: \" + widgetType);\r\n }\r\n return builder(node, config);\r\n }\r\n}\r\n\r\nconst GlobalWidgetFactory = new WidgetFactory();\r\n\r\nGlobalWidgetFactory.register(\"button\", (node: FlowNode, config?: ButtonWidgetConfig) => new ButtonWidget(config));\r\nGlobalWidgetFactory.register(\"number\", (node: FlowNode, config?: NumberWidgetConfig) => new NumberWidget(node, config));\r\nGlobalWidgetFactory.register(\"color\", (node: FlowNode, config?: ColorWidgetConfig) => new ColorWidget(node, config));\r\nGlobalWidgetFactory.register(\"slider\", (node: FlowNode, config?: SliderWidgetConfig) => new SliderWidget(node, config));\r\nGlobalWidgetFactory.register(\"string\", (node: FlowNode, config?: StringWidgetConfig) => new StringWidget(node, config));\r\nGlobalWidgetFactory.register(\"toggle\", (node: FlowNode, config?: ToggleWidgetConfig) => new ToggleWidget(node, config));\r\nGlobalWidgetFactory.register(\"image\", (node: FlowNode, config?: ImageWidgetConfig) => new ImageWidget(config));\r\nGlobalWidgetFactory.register(\"text\", (node: FlowNode, config?: TextWidgetConfig) => new TextWidget(node, config));\r\n\r\nexport { GlobalWidgetFactory };","import { FlowNode } from \"./node\";\r\nimport { Port } from \"./port\";\r\nimport { BoxCenter, InBox } from \"./types/box\";\r\nimport { Vector2, Zero } from \"./types/vector2\";\r\n\r\nexport interface ConnectionRendererParams {\r\n ctx: CanvasRenderingContext2D;\r\n start: Vector2;\r\n end: Vector2;\r\n graphScale: number;\r\n mouseOver: boolean;\r\n\r\n inNode: FlowNode | null;\r\n inPort: Port | null;\r\n outNode: FlowNode | null;\r\n outPort: Port | null;\r\n}\r\n\r\nexport type ConnectionRenderer = (params: ConnectionRendererParams) => void\r\n\r\nexport function DefaultConnectionRenderer(connectionSize: number, connectionColor: string | undefined, mouseOverSize: number, mouseOverColor: string | undefined): ConnectionRenderer {\r\n return (params: ConnectionRendererParams) => {\r\n\r\n let color = \"#00FF00\";\r\n if (params.outPort !== null) {\r\n color = params.outPort.filledStyleColor()\r\n } else if (params.inPort !== null) {\r\n color = params.inPort.filledStyleColor()\r\n }\r\n\r\n let lineSize = connectionSize * params.graphScale;\r\n if (connectionColor !== undefined) {\r\n color = connectionColor;\r\n }\r\n\r\n if (params.mouseOver || params.inNode?.selected() || params.outNode?.selected()) {\r\n lineSize = mouseOverSize * params.graphScale;\r\n params.ctx.shadowBlur = 25 * params.graphScale;\r\n\r\n if (mouseOverColor !== undefined) {\r\n color = mouseOverColor;\r\n }\r\n\r\n params.ctx.shadowColor = color;\r\n }\r\n\r\n params.ctx.strokeStyle = color;\r\n params.ctx.lineWidth = lineSize;\r\n\r\n // Draw\r\n params.ctx.beginPath();\r\n params.ctx.moveTo(params.start.x, params.start.y);\r\n const midX = (params.start.x + params.end.x) / 2;\r\n params.ctx.bezierCurveTo(midX, params.start.y, midX, params.end.y, params.end.x, params.end.y);\r\n params.ctx.stroke();\r\n params.ctx.shadowBlur = 0;\r\n }\r\n}\r\n\r\nexport class Connection {\r\n\r\n // Variables for holding temp data, preventing object allocations each\r\n // frame\r\n #inPos: Vector2;\r\n #outPos: Vector2;\r\n\r\n #inNode: FlowNode | null;\r\n #inNodePortIndex: number;\r\n #outNode: FlowNode | null;\r\n #outNodePortIndex: number;\r\n #renderer: ConnectionRenderer;\r\n\r\n constructor(\r\n inNode: FlowNode | null,\r\n inNodePortIndex: number,\r\n outNode: FlowNode | null,\r\n outNodePortIndex: number,\r\n renderer: ConnectionRenderer,\r\n ) {\r\n\r\n this.#inNode = inNode;\r\n this.#inNodePortIndex = inNodePortIndex;\r\n this.#outNode = outNode;\r\n this.#outNodePortIndex = outNodePortIndex;\r\n this.#renderer = renderer;\r\n \r\n this.#inPos = Zero();\r\n this.#outPos = Zero();\r\n\r\n if (inNode !== null) {\r\n inNode.inputPort(this.#inNodePortIndex).addConnection(this);\r\n }\r\n\r\n if (outNode !== null) {\r\n outNode.outputPort(this.#outNodePortIndex).addConnection(this);\r\n }\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, graphScale: number, mouseOver: boolean, mousePosition: Vector2 | undefined): void {\r\n\r\n // Not sure what to do here? Maybe we should throw an error in the \r\n // future?\r\n if (this.#inNode === null && this.#outNode === null) {\r\n return;\r\n }\r\n\r\n if (this.#inNode !== null) {\r\n const inPortBox = this.#inNode.inputPortPosition(this.#inNodePortIndex)\r\n if (inPortBox === undefined) {\r\n return;\r\n }\r\n BoxCenter(inPortBox, this.#inPos);\r\n } else if (mousePosition !== undefined) {\r\n this.#inPos.x = mousePosition.x;\r\n this.#inPos.y = mousePosition.y;\r\n } else {\r\n return;\r\n }\r\n\r\n if (this.#outNode !== null) {\r\n const outPortBox = this.#outNode.outputPortPosition(this.#outNodePortIndex);\r\n if (outPortBox === undefined) {\r\n return;\r\n }\r\n BoxCenter(outPortBox, this.#outPos);\r\n } else if (mousePosition !== undefined) {\r\n this.#outPos.x = mousePosition.x;\r\n this.#outPos.y = mousePosition.y;\r\n } else {\r\n return;\r\n }\r\n\r\n this.#renderer({\r\n ctx: ctx,\r\n start: this.#inPos,\r\n end: this.#outPos,\r\n graphScale: graphScale,\r\n mouseOver: mouseOver,\r\n\r\n inPort: this.inPort(),\r\n inNode: this.#inNode,\r\n outPort: this.outPort(),\r\n outNode: this.#outNode,\r\n });\r\n }\r\n\r\n inNode(): FlowNode | null {\r\n return this.#inNode;\r\n }\r\n\r\n outNode(): FlowNode | null {\r\n return this.#outNode;\r\n }\r\n\r\n clearPort(mousePosition: Vector2): void {\r\n if (this.#inNode !== null) {\r\n const inPortBox = this.#inNode.inputPortPosition(this.#inNodePortIndex)\r\n if (inPortBox !== undefined && InBox(inPortBox, mousePosition)) {\r\n this.clearInput();\r\n }\r\n }\r\n\r\n if (this.#outNode !== null) {\r\n const outPortBox = this.#outNode.outputPortPosition(this.#outNodePortIndex);\r\n if (outPortBox !== undefined && InBox(outPortBox, mousePosition)) {\r\n this.clearOutput();\r\n }\r\n }\r\n }\r\n\r\n clearPorts(): void {\r\n this.clearInput();\r\n this.clearOutput();\r\n }\r\n\r\n setInput(node: FlowNode, portIndex: number, replace?: boolean): void {\r\n this.#inNode = node;\r\n this.#inNodePortIndex = portIndex;\r\n\r\n const port = this.#inNode.inputPort(portIndex);\r\n if(!!replace && port.connections().length > 0) {\r\n port.replaceConnection(this, 0);\r\n } else {\r\n port.addConnection(this);\r\n }\r\n }\r\n\r\n setOutput(node: FlowNode, portIndex: number): void {\r\n this.#outNode = node;\r\n this.#outNodePortIndex = portIndex;\r\n this.#outNode.outputPort(portIndex).addConnection(this);\r\n }\r\n\r\n clearInput() {\r\n this.#inNode?.inputPort(this.#inNodePortIndex).clearConnection(this);\r\n this.#inNode = null;\r\n this.#inNodePortIndex = -1;\r\n }\r\n\r\n clearOutput() {\r\n this.#outNode?.outputPort(this.#outNodePortIndex).clearConnection(this);\r\n this.#outNode = null;\r\n this.#outNodePortIndex = -1;\r\n }\r\n\r\n mouseOverPort(mousePosition: Vector2): Port | null {\r\n if (this.#inNode !== null) {\r\n const inPortBox = this.#inNode.inputPortPosition(this.#inNodePortIndex)\r\n if (inPortBox !== undefined && InBox(inPortBox, mousePosition)) {\r\n return this.#inNode.inputPort(this.#inNodePortIndex)\r\n }\r\n }\r\n\r\n if (this.#outNode !== null) {\r\n const outPortBox = this.#outNode.outputPortPosition(this.#outNodePortIndex);\r\n if (outPortBox !== undefined && InBox(outPortBox, mousePosition)) {\r\n return this.#outNode.outputPort(this.#outNodePortIndex)\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n outPort(): Port | null {\r\n if (this.#outNode === null) {\r\n return null;\r\n }\r\n return this.#outNode.outputPort(this.#outNodePortIndex);\r\n }\r\n\r\n inPort(): Port | null {\r\n if (this.#inNode === null) {\r\n return null;\r\n }\r\n return this.#inNode.inputPort(this.#inNodePortIndex);\r\n }\r\n\r\n referencesNode(node: FlowNode): boolean {\r\n if (this.#inNode === node) {\r\n return true;\r\n }\r\n\r\n if (this.#outNode === node) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}","import { Vector2, Zero } from \"./types/vector2\";\r\n\r\nexport class Camera {\r\n\r\n zoom: number;\r\n\r\n position: Vector2;\r\n\r\n constructor() {\r\n this.zoom = 1;\r\n this.position = Zero();\r\n }\r\n\r\n screenSpaceToGraphSpace(screenPosition: Vector2, out: Vector2): void {\r\n const scale = this.zoom;\r\n out.x = (screenPosition.x / scale) - (this.position.x / scale);\r\n out.y = (screenPosition.y / scale) - (this.position.y / scale);\r\n }\r\n\r\n graphSpaceToScreenSpace(graphPosition: Vector2, out: Vector2): void {\r\n out.x = this.position.x + (graphPosition.x * this.zoom);\r\n out.y = this.position.y + (graphPosition.y * this.zoom);\r\n }\r\n\r\n reset(): void {\r\n this.zoom = 1;\r\n this.position.x = 0;\r\n this.position.y = 0;\r\n }\r\n}","import { Camera } from \"./camera\";\r\nimport { NodeFlowGraph } from \"./graph\";\r\nimport { FlowNode } from \"./node\";\r\nimport { NodeSubsystem } from \"./nodes/subsystem\";\r\nimport { Box } from \"./types/box\";\r\n\r\n// TODO: Cyclical dependencies will end our life\r\n\r\nfunction MarkInputs(graph: NodeSubsystem, positions: Array<number>, nodeLUT: Map<FlowNode, number>, node: number, depth: number, shouldSort: Map<FlowNode, boolean>) {\r\n const inputs = graph.connectedInputsNodeReferencesByIndex(node);\r\n for (let i = 0; i < inputs.length; i++) {\r\n const nodeIndex = nodeLUT.get(inputs[i]) as number;\r\n\r\n if (!shouldSort.has(inputs[i])) {\r\n continue;\r\n }\r\n\r\n positions[nodeIndex] = depth;\r\n MarkInputs(graph, positions, nodeLUT, nodeIndex, depth - 1, shouldSort);\r\n }\r\n}\r\n\r\nfunction MarkOutputs(graph: NodeSubsystem, positions: Array<number>, nodeLUT: Map<FlowNode, number>, node: number, depth: number, shouldSort: Map<FlowNode, boolean>) {\r\n const outputs = graph.connectedInputsNodeReferencesByIndex(node);\r\n for (let i = 0; i < outputs.length; i++) {\r\n const nodeIndex = nodeLUT.get(outputs[i]) as number;\r\n\r\n if (!shouldSort.has(outputs[i])) {\r\n continue;\r\n }\r\n\r\n positions[nodeIndex] = depth;\r\n MarkOutputs(graph, positions, nodeLUT, nodeIndex, depth + 1, shouldSort);\r\n }\r\n}\r\n\r\nexport function Organize(ctx: CanvasRenderingContext2D, graph: NodeSubsystem, nodesToSort?: Array<number>): void {\r\n const nodes = graph.getNodes();\r\n const nodeLUT = new Map<FlowNode, number>();\r\n const bounds = new Array<Box>(nodes.length);\r\n const relativePosition = new Array<Array<number>>(nodes.length);\r\n const claimed = new Array<boolean>(nodes.length);\r\n const shouldSort = new Map<FlowNode, boolean>(); // TODO: we don't really need a Map, is their a Set data structure?\r\n\r\n if (nodesToSort) {\r\n if (nodesToSort.length < 2) {\r\n return;\r\n }\r\n for (let i = 0; i < nodesToSort.length; i++) {\r\n shouldSort.set(nodes[nodesToSort[i]], true);\r\n }\r\n } else {\r\n for (let i = 0; i < nodes.length; i++) {\r\n shouldSort.set(nodes[i], true);\r\n }\r\n }\r\n\r\n const camera = new Camera();\r\n\r\n // Initialize everything\r\n for (let i = 0; i < nodes.length; i++) {\r\n bounds[i] = nodes[i].calculateBounds(ctx, camera);\r\n relativePosition[i] = new Array<number>(nodes.length);\r\n nodeLUT.set(nodes[i], i);\r\n claimed[i] = false;\r\n }\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n relativePosition[i][i] = 0;\r\n MarkInputs(graph, relativePosition[i], nodeLUT, i, -1, shouldSort);\r\n MarkOutputs(graph, relativePosition[i], nodeLUT, i, 1, shouldSort);\r\n }\r\n\r\n interface entry {\r\n node: number;\r\n length: number;\r\n min: number;\r\n max: number\r\n }\r\n\r\n let entries = new Array<entry>(shouldSort.size);\r\n\r\n let nodeIndex = 0;\r\n for (let i = 0; i < nodes.length; i++) {\r\n if (!shouldSort.has(nodes[i])) {\r\n continue;\r\n }\r\n\r\n let min = 0;\r\n let max = 0;\r\n for (let x = 0; x < nodes.length; x++) {\r\n const val = relativePosition[i][x];\r\n if (val === undefined) {\r\n continue;\r\n }\r\n\r\n min = Math.min(min, val);\r\n max = Math.max(max, val);\r\n }\r\n entries[nodeIndex] = {\r\n length: max - min,\r\n node: i,\r\n min: min,\r\n max: max\r\n }\r\n nodeIndex++\r\n }\r\n\r\n\r\n entries.sort((a, b) => b.length - a.length);\r\n\r\n interface Column {\r\n Nodes: Array<FlowNode>;\r\n Width: number;\r\n }\r\n\r\n const columns = Array<Column>(entries[0].length + 1);\r\n for (let i = 0; i < columns.length; i++) {\r\n columns[i] = {\r\n Nodes: new Array<FlowNode>(),\r\n Width: 0\r\n };\r\n }\r\n\r\n for (let i = 0; i < entries.length; i++) {\r\n const entry = entries[i];\r\n if (claimed[entry.node] === true) {\r\n continue;\r\n }\r\n\r\n const positions = relativePosition[entry.node];\r\n\r\n for (let p = 0; p < positions.length; p++) {\r\n const position = positions[p];\r\n if (position === undefined) {\r\n continue;\r\n }\r\n\r\n if (claimed[p] === true) {\r\n continue;\r\n }\r\n\r\n const nodeBounds = bounds[p];\r\n const column = columns[position - entry.min];\r\n column.Nodes.push(nodes[p])\r\n column.Width = Math.max(column.Width, nodeBounds.Size.x)\r\n\r\n claimed[p] = true;\r\n }\r\n }\r\n\r\n let allColumnsWidths = 0;\r\n for (let c = 0; c < columns.length; c++) {\r\n allColumnsWidths += columns[c].Width;\r\n }\r\n\r\n const widthSpacing = 100;\r\n const heightSpacing = 50;\r\n\r\n let widthOffset = 0;\r\n for (let c = 0; c < columns.length; c++) {\r\n var column = columns[c];\r\n let heightOffset = 0;\r\n\r\n widthOffset -= widthSpacing + column.Width;\r\n\r\n for (let n = 0; n < column.Nodes.length; n++) {\r\n const node = column.Nodes[n];\r\n const nodeBounds = bounds[nodeLUT.get(node) as number];\r\n\r\n let pos = {\r\n x: widthOffset + allColumnsWidths + (columns.length * widthSpacing),\r\n y: heightOffset\r\n }\r\n\r\n heightOffset += nodeBounds.Size.y + heightSpacing\r\n node.setPosition(pos);\r\n }\r\n }\r\n\r\n}","export function TimeExecution(name: string, callback: Function) {\r\n const start = name + \"_Start\";\r\n const end = name + \"_End\";\r\n\r\n performance.mark(start);\r\n callback();\r\n performance.mark(end);\r\n performance.measure(name, start, end);\r\n}","import { ContextMenuConfig, ContextMenuItemConfig } from \"../contextMenu\";\r\nimport { FlowNode, FlowNodeConfig } from '../node';\r\nimport { Vector2 } from \"../types/vector2\";\r\nimport { NodeSubsystem } from \"./subsystem\";\r\n\r\ninterface PublisherNodes {\r\n [name: string]: FlowNodeConfig\r\n}\r\n\r\nexport interface PublisherConfig {\r\n name?: string;\r\n description?: string;\r\n version?: string;\r\n nodes?: PublisherNodes\r\n}\r\n\r\nexport class Publisher {\r\n\r\n #name: string;\r\n\r\n #description: string;\r\n\r\n #version: string;\r\n\r\n #registeredNodes: Map<string, FlowNodeConfig>\r\n\r\n constructor(config?: PublisherConfig) {\r\n this.#name = config?.name === undefined ? \"Unknown\" : config.name;\r\n this.#description = config?.description === undefined ? \"\" : config.description;\r\n this.#version = config?.version === undefined ? \"v0.0.0\" : config.version;\r\n\r\n this.#registeredNodes = new Map<string, FlowNodeConfig>();\r\n\r\n if (config?.nodes !== undefined) {\r\n for (const nodeKey in config.nodes) {\r\n this.register(nodeKey, config.nodes[nodeKey]);\r\n }\r\n }\r\n }\r\n\r\n nodes(): Map<string, FlowNodeConfig> {\r\n return this.#registeredNodes;\r\n }\r\n\r\n register(nodeType: string, config: FlowNodeConfig): void {\r\n this.#registeredNodes.set(nodeType, config);\r\n }\r\n\r\n unregister(nodeType: string): boolean {\r\n return this.#registeredNodes.delete(nodeType);\r\n }\r\n\r\n #recurseBuildMenu(graph: NodeSubsystem, name: string, subMenu: Map<string, FlowNodeConfig>, position: Vector2): ContextMenuConfig {\r\n const items: Array<ContextMenuItemConfig> = [];\r\n const subMenus = new Map<string, Map<string, FlowNodeConfig>>();\r\n\r\n for (let [key, nodeConfig] of subMenu) {\r\n const slashIndex = key.indexOf(\"/\")\r\n const bracketIndex = key.indexOf(\"[\")\r\n\r\n if (slashIndex === -1 || (bracketIndex !== -1 && bracketIndex < slashIndex)) {\r\n items.push({\r\n name: key,\r\n callback: () => {\r\n const node = new FlowNode(nodeConfig);\r\n node.setPosition(position);\r\n graph.addNode(node);\r\n },\r\n });\r\n } else {\r\n const elements = key.split(\"/\");\r\n if (!subMenus.has(elements[0])) {\r\n subMenus.set(elements[0], new Map<string, FlowNodeConfig>());\r\n }\r\n\r\n const menu = subMenus.get(elements[0]);\r\n elements.shift();\r\n menu?.set(elements.join(\"/\"), nodeConfig)\r\n }\r\n }\r\n\r\n const menus: Array<ContextMenuConfig> = [];\r\n for (let [key, nodes] of subMenus) {\r\n menus.push(this.#recurseBuildMenu(graph, key, nodes, position))\r\n }\r\n\r\n return {\r\n name: name,\r\n items: items,\r\n subMenus: menus\r\n }\r\n }\r\n\r\n contextMenu(graph: NodeSubsystem, position: Vector2): ContextMenuConfig {\r\n return this.#recurseBuildMenu(graph, this.#name, this.#registeredNodes, position);\r\n }\r\n\r\n create(nodeType: string): FlowNode {\r\n const config = this.#registeredNodes.get(nodeType)\r\n if (config === undefined) {\r\n throw new Error(\"no builder registered for node: \" + nodeType);\r\n }\r\n return new FlowNode(config);\r\n }\r\n}","import { FlowNode } from \"../node\";\r\nimport { Publisher, PublisherConfig } from \"./publisher\";\r\nimport { ContextMenuConfig } from \"../contextMenu\";\r\nimport { Vector2 } from \"../types/vector2\";\r\nimport { nodeFlowGroup as nodeFlowContextMenuGroup, NodeSubsystem } from \"./subsystem\";\r\n\r\nexport type NodeCreatedCallback = (publisher: string, nodeType: string, node: FlowNode) => void;\r\n\r\ninterface NodeFactoryPublishers {\r\n [name: string]: PublisherConfig\r\n}\r\n\r\nexport interface NodeFactoryConfig {\r\n publishers?: NodeFactoryPublishers\r\n onNodeCreated?: NodeCreatedCallback;\r\n}\r\n\r\nexport class NodeFactory {\r\n #registeredPublishers: Map<string, Publisher>;\r\n\r\n #registeredCallbacks: Array<NodeCreatedCallback>;\r\n\r\n constructor(config?: NodeFactoryConfig) {\r\n this.#registeredPublishers = new Map<string, Publisher>();\r\n this.#registeredCallbacks = new Array<NodeCreatedCallback>();\r\n\r\n if (config?.onNodeCreated) {\r\n this.#registeredCallbacks.push(config?.onNodeCreated);\r\n }\r\n\r\n if (config?.publishers !== undefined) {\r\n for (let entry in config.publishers) {\r\n this.addPublisher(entry, new Publisher(config.publishers[entry]));\r\n }\r\n }\r\n }\r\n\r\n public addOnNodeCreatedListener(callback: NodeCreatedCallback): void {\r\n this.#registeredCallbacks.push(callback);\r\n }\r\n\r\n public addPublisher(identifier: string, publisher: Publisher): void {\r\n this.#registeredPublishers.set(identifier, publisher);\r\n }\r\n\r\n // I'm not even sure if I want this here? You can register on Publishers...\r\n // So why not just make people register with the publisher.\r\n // public register(publisher: string, nodeType: string, config: FlowNodeConfiguration): void {\r\n // const foundPublisher = this.#registeredPublishers.get(publisher);\r\n // if (foundPublisher === undefined) {\r\n // console.error(\"no publisher registered with identifier:\" + publisher);\r\n // return;\r\n // }\r\n\r\n // foundPublisher.register(nodeType, config);\r\n // }\r\n\r\n public create(publisher: string, nodeType: string): FlowNode {\r\n const publisherIdentifier = this.#registeredPublishers.get(publisher)\r\n if (publisherIdentifier === undefined) {\r\n throw new Error(\"no publisher registered with identifier: \" + publisher);\r\n }\r\n const node = publisherIdentifier.create(nodeType);\r\n\r\n for (let i = 0; i < this.#registeredCallbacks.length; i++) {\r\n const callback = this.#registeredCallbacks[i];\r\n callback(publisher, nodeType, node);\r\n }\r\n return node;\r\n }\r\n\r\n public newNodeSubmenus(graph: NodeSubsystem, position: Vector2): Array<ContextMenuConfig> {\r\n const menus: Array<ContextMenuConfig> = [];\r\n for (let [_, publisher] of this.#registeredPublishers) {\r\n menus.push(publisher.contextMenu(graph, position))\r\n }\r\n return menus;\r\n }\r\n\r\n public openMenu(graph: NodeSubsystem, position: Vector2): ContextMenuConfig {\r\n return {\r\n name: \"New Node\",\r\n group: nodeFlowContextMenuGroup,\r\n subMenus: this.newNodeSubmenus(graph, position),\r\n };\r\n }\r\n} \r\n","import { Camera } from \"../camera\";\r\nimport { Connection, ConnectionRenderer, DefaultConnectionRenderer } from \"../connection\";\r\nimport { CombineContextMenus, ContextMenuConfig } from \"../contextMenu\";\r\nimport { RenderResults } from \"../graphSubsystem\";\r\nimport { FlowNode, NodeState } from \"../node\";\r\nimport { Organize } from \"../organize\";\r\nimport { PassSubsystem } from \"../pass/subsystem\";\r\nimport { TimeExecution } from \"../performance\";\r\nimport { Port, PortType } from \"../port\";\r\nimport { BoxStyle } from \"../styles/box\";\r\nimport { CursorStyle } from \"../styles/cursor\";\r\nimport { Theme } from \"../theme\";\r\nimport { Box, BoxIntersection } from \"../types/box\";\r\nimport { List } from \"../types/list\";\r\nimport { Pool, VectorPool } from \"../types/pool\";\r\nimport { AddVector2, CopyVector2, SubVector2, Vector2, Zero } from \"../types/vector2\";\r\nimport { Widget } from \"../widgets/widget\";\r\nimport { NodeCreatedCallback, NodeFactory, NodeFactoryConfig } from \"./factory\";\r\nimport { Publisher } from \"./publisher\";\r\n\r\nexport type NodeAddedCallback = (node: FlowNode) => void;\r\nexport type NodeRemovedCallback = (node: FlowNode) => void;\r\n\r\nexport const nodeFlowGroup = \"node-flow-graph-node-menu\";\r\n\r\nexport interface ConnectionRendererConfiguration {\r\n size?: number;\r\n color?: string;\r\n\r\n mouseOverSize?: number;\r\n mouseOverColor?: string;\r\n\r\n renderer?: ConnectionRenderer;\r\n}\r\n\r\nfunction BuildConnectionRenderer(config: ConnectionRendererConfiguration | undefined): ConnectionRenderer {\r\n if (config?.renderer !== undefined) {\r\n return config.renderer;\r\n }\r\n\r\n return DefaultConnectionRenderer(\r\n config?.size === undefined ? 2 : config.size,\r\n undefined, // config?.color === undefined ? \"#00FF00\" : config.color,\r\n config?.mouseOverSize === undefined ? 4 : config.mouseOverSize,\r\n undefined, // config?.mouseOverColor === undefined ? \"#00FF22\" : config.mouseOverColor\r\n );\r\n}\r\n\r\ninterface PortIntersection {\r\n Node: FlowNode;\r\n Port: Port;\r\n Index: number;\r\n InputPort: boolean;\r\n}\r\n\r\ninterface NodeSubsystemConfig {\r\n idleConnection?: ConnectionRendererConfiguration\r\n nodes?: NodeFactoryConfig\r\n}\r\n\r\nexport class NodeSubsystem {\r\n\r\n #postProcessPass: PassSubsystem;\r\n\r\n #nodes: Array<FlowNode>;\r\n\r\n #connections: Array<Connection>;\r\n\r\n #nodeHovering: number;\r\n\r\n #nodesGrabbed: List<number>;\r\n\r\n #connectionSelected: Connection | null;\r\n\r\n #idleConnectionRenderer: ConnectionRenderer\r\n\r\n #portHovering: PortIntersection | null;\r\n\r\n #widgetHovering: Widget | null;\r\n\r\n #widgetCurrentlyClicking: Widget | null;\r\n\r\n #cursor: CursorStyle;\r\n\r\n #nodeFactory: NodeFactory;\r\n\r\n #boxSelect: boolean;\r\n\r\n #boxSelectStart_graphSpace: Vector2;\r\n\r\n #boxSelectEnd_graphSpace: Vector2;\r\n\r\n #boxSelectionNodes: List<number>;\r\n\r\n #boxSelectStyle: BoxStyle;\r\n\r\n // LISTENERS ==============================================================\r\n\r\n #nodeRemovedCallbacks: Array<NodeRemovedCallback>;\r\n\r\n #registeredNodeAddedCallbacks: Array<NodeAddedCallback>;\r\n\r\n // ========================================================================\r\n\r\n constructor(postProcessPass: PassSubsystem, config?: NodeSubsystemConfig) {\r\n this.#postProcessPass = postProcessPass;\r\n this.#nodes = [];\r\n this.#nodeHovering = -1;\r\n this.#nodesGrabbed = new List<number>();\r\n this.#connectionSelected = null;\r\n this.#portHovering = null;\r\n this.#widgetHovering = null;\r\n this.#widgetCurrentlyClicking = null;\r\n this.#connections = new Array<Connection>();\r\n this.#nodeFactory = new NodeFactory(config?.nodes);\r\n this.#idleConnectionRenderer = BuildConnectionRenderer(config?.idleConnection);\r\n this.#registeredNodeAddedCallbacks = new Array<NodeAddedCallback>();\r\n this.#nodeRemovedCallbacks = new Array<NodeRemovedCallback>();\r\n this.#cursor = CursorStyle.Default;\r\n\r\n this.#boxSelect = false;\r\n this.#boxSelectStart_graphSpace = Zero();\r\n this.#boxSelectEnd_graphSpace = Zero();\r\n this.#boxSelectionNodes = new List<number>();\r\n this.#boxSelectStyle = new BoxStyle({\r\n border: {\r\n color: Theme.BoxSelect.Color,\r\n size: Theme.BoxSelect.Size,\r\n },\r\n color: \"rgba(0,0,0,0)\",\r\n radius: Theme.BoxSelect.Radius\r\n });\r\n }\r\n\r\n public addPublisher(identifier: string, publisher: Publisher): void {\r\n this.#nodeFactory.addPublisher(identifier, publisher);\r\n }\r\n\r\n public addOnNodeCreatedListener(callback: NodeCreatedCallback): void {\r\n this.#nodeFactory.addOnNodeCreatedListener(callback);\r\n }\r\n\r\n public nodeFactory(): NodeFactory {\r\n return this.#nodeFactory;\r\n }\r\n\r\n public addOnNodeAddedListener(callback: NodeAddedCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#registeredNodeAddedCallbacks.push(callback);\r\n }\r\n\r\n public addOnNodeRemovedListener(callback: NodeRemovedCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#nodeRemovedCallbacks.push(callback);\r\n }\r\n\r\n clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean): boolean {\r\n this.#boxSelect = false;\r\n\r\n let hoveringSomething = false;\r\n if (this.#nodeHovering > -1) {\r\n this.#selectNodeByIndex(this.#nodeHovering, !ctrlKey);\r\n\r\n for (let i = 0; i < this.#nodes.length; i++) {\r\n if (this.#nodes[i].selected()) {\r\n this.#nodesGrabbed.Push(i);\r\n }\r\n }\r\n\r\n hoveringSomething = true;\r\n }\r\n\r\n if (this.#widgetHovering !== null) {\r\n this.#widgetHovering.ClickStart();\r\n this.#widgetCurrentlyClicking = this.#widgetHovering;\r\n hoveringSomething = true;\r\n }\r\n\r\n if (this.#portHovering === null) {\r\n\r\n if (ctrlKey && !hoveringSomething) {\r\n camera.screenSpaceToGraphSpace(mousePosition, this.#boxSelectStart_graphSpace)\r\n CopyVector2(this.#boxSelectEnd_graphSpace, this.#boxSelectStart_graphSpace);\r\n this.#boxSelect = true;\r\n }\r\n\r\n return hoveringSomething || ctrlKey;\r\n }\r\n\r\n if (this.#portHovering.InputPort) {\r\n for (let i = 0; i < this.#connections.length; i++) {\r\n if (this.#connections[i].inPort() === this.#portHovering.Port) {\r\n this.#connections[i].clearInput();\r\n this.#connectionSelected = this.#connections[i];\r\n break;\r\n }\r\n }\r\n } else {\r\n let inNode: FlowNode | null = this.#portHovering.Node\r\n let inNodeIndex = this.#portHovering.Index\r\n let outNode: FlowNode | null = this.#portHovering.Node\r\n let outNodeIndex = this.#portHovering.Index\r\n\r\n if (this.#portHovering.InputPort) {\r\n outNode = null;\r\n outNodeIndex = -1;\r\n } else {\r\n inNode = null;\r\n inNodeIndex = -1;\r\n }\r\n\r\n const connection = new Connection(inNode, inNodeIndex, outNode, outNodeIndex, this.#idleConnectionRenderer);\r\n this.#connectionSelected = connection;\r\n this.#connections.push(connection);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n mouseDragEvent(delta: Vector2, scale: number): boolean {\r\n let nodeMoved = false;\r\n\r\n VectorPool.run(() => {\r\n const scaledDelta = VectorPool.get();\r\n scaledDelta.x = delta.x / scale;\r\n scaledDelta.y = delta.y / scale;\r\n AddVector2(this.#boxSelectEnd_graphSpace, this.#boxSelectEnd_graphSpace, scaledDelta);\r\n\r\n if (this.#interactingWithNode()) {\r\n for (let i = 0; i < this.#nodesGrabbed.Count(); i++) {\r\n const node = this.#nodes[this.#nodesGrabbed.At(i)];\r\n if (node.locked()) {\r\n continue;\r\n }\r\n node.translate(scaledDelta);\r\n nodeMoved = true;\r\n }\r\n }\r\n });\r\n\r\n if (nodeMoved) {\r\n return true;\r\n }\r\n return this.#interactingWithConnection() || this.#interactingWithWidget() || this.#boxSelect;\r\n }\r\n\r\n clearNodeInputConnection(node: FlowNode, index: number): void {\r\n const port = node.inputPort(index);\r\n for (let i = this.#connections.length - 1; i >= 0; i--) {\r\n if (this.#connections[i].inPort() === port) {\r\n this.#removeConnection(this.#connections[i], true);\r\n }\r\n }\r\n }\r\n\r\n clickEnd(): void {\r\n\r\n for (let i = 0; i < this.#nodesGrabbed.Count(); i++) {\r\n const node = this.#nodes[this.#nodesGrabbed.At(i)];\r\n node.raiseDragStoppedEvent();\r\n }\r\n this.#nodesGrabbed.Clear();\r\n\r\n if (this.#boxSelect) {\r\n for (let i = 0; i < this.#boxSelectionNodes.Count(); i++) {\r\n this.#selectNode(this.#nodes[this.#boxSelectionNodes.At(i)], false);\r\n }\r\n\r\n this.#boxSelectionNodes.Clear();\r\n this.#boxSelect = false;\r\n }\r\n\r\n if (this.#widgetCurrentlyClicking !== null) {\r\n this.#widgetCurrentlyClicking.ClickEnd();\r\n this.#widgetCurrentlyClicking = null;\r\n }\r\n\r\n if (this.#connectionSelected === null) {\r\n return;\r\n }\r\n\r\n if (this.#portHovering === null) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n const port = this.#portHovering.Port;\r\n const conn = this.#connectionSelected;\r\n\r\n // If the port we're hovering is the one we started the connection \r\n // with...\r\n if (port === conn.inPort() || port === conn.outPort()) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n // If the port we're hoving is input, and also we started the \r\n // connection with an input, we can't do anything. We can't connect\r\n // input to input\r\n if (this.#portHovering.InputPort && conn.inPort() !== null) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n // Same with out. Can't connect output to output\r\n if (!this.#portHovering.InputPort && conn.outPort() !== null) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n // Different types, can't connect\r\n if (this.#portHovering.InputPort && this.#portHovering.Port.getDataType() !== conn.outPort()?.getDataType()) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n // Different types, can't connect\r\n if (!this.#portHovering.InputPort && this.#portHovering.Port.getDataType() !== conn.inPort()?.getDataType()) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n // Ight. Let's make the connection.\r\n if (this.#portHovering.InputPort) {\r\n let replace = false;\r\n const inputPort = this.#portHovering.Node.inputPort(this.#portHovering.Index);\r\n if (this.#portHovering.Port.getPortType() !== PortType.InputArray && inputPort.connections().length > 0) {\r\n replace = true;\r\n }\r\n\r\n if (replace) {\r\n // Remove input port's connection's output\r\n inputPort.connections()[0].clearOutput();\r\n\r\n // Remove connection from this subsystem\r\n this.#removeConnection(inputPort.connections()[0], false);\r\n }\r\n conn.setInput(this.#portHovering.Node, this.#portHovering.Index, replace);\r\n\r\n } else {\r\n conn.setOutput(this.#portHovering.Node, this.#portHovering.Index);\r\n }\r\n\r\n this.#connectionSelected = null;\r\n }\r\n\r\n connectNodes(nodeOut: FlowNode, outPort: number, nodeIn: FlowNode, inPort: number): Connection | undefined {\r\n const outType = nodeOut.outputPort(outPort).getDataType();\r\n const inType = nodeIn.inputPort(inPort).getDataType();\r\n if (outType !== inType) {\r\n console.error(\"can't connect nodes of different types\", outType, inType);\r\n return;\r\n }\r\n\r\n // Check and make sure the nodes aren't already connected\r\n const existingInputConnections = nodeIn.inputPort(inPort).connections();\r\n for (let i = 0; i < existingInputConnections.length; i++) {\r\n const connection = existingInputConnections[i];\r\n\r\n\r\n if (connection.outNode() !== nodeOut) {\r\n continue;\r\n }\r\n\r\n if (connection.outPort() !== nodeOut.outputPort(outPort)) {\r\n continue;\r\n }\r\n\r\n // This kind of connection already *exists*. Let's not add a duplicate\r\n return;\r\n }\r\n\r\n const connection = new Connection(\r\n nodeIn, inPort,\r\n nodeOut, outPort,\r\n this.#idleConnectionRenderer,\r\n );\r\n this.#connections.push(connection);\r\n return connection;\r\n }\r\n\r\n getNodes(): Array<FlowNode> {\r\n return this.#nodes;\r\n }\r\n\r\n /**\r\n * Returns all nodes who are connected to the inputs of the \r\n * node in question\r\n * \r\n * @param nodeIndex index of the node to examine inputs to\r\n */\r\n connectedInputsNodeReferencesByIndex(nodeIndex: number): Array<FlowNode> {\r\n return this.connectedInputsNodeReferences(this.#nodes[nodeIndex]);\r\n }\r\n\r\n connectedInputsNodeReferences(node: FlowNode): Array<FlowNode> {\r\n const connections = new Array<FlowNode>();\r\n for (let i = 0; i < this.#connections.length; i++) {\r\n const connection = this.#connections[i];\r\n if (node !== connection.inNode()) {\r\n continue;\r\n }\r\n\r\n const outNode = connection.outNode();\r\n if (outNode === null) {\r\n continue;\r\n }\r\n\r\n connections.push(outNode);\r\n }\r\n return connections;\r\n }\r\n\r\n connectedOutputsNodeReferences(nodeIndex: number): Array<FlowNode> {\r\n const node = this.#nodes[nodeIndex]\r\n const connections = new Array<FlowNode>();\r\n for (let i = 0; i < this.#connections.length; i++) {\r\n const connection = this.#connections[i];\r\n if (node !== connection.outNode()) {\r\n continue;\r\n }\r\n\r\n const inNode = connection.inNode();\r\n if (inNode === null) {\r\n continue;\r\n }\r\n\r\n connections.push(inNode);\r\n }\r\n return connections;\r\n }\r\n\r\n addNode(node: FlowNode): void {\r\n this.#nodes.push(node);\r\n for (let i = 0; i < this.#registeredNodeAddedCallbacks.length; i++) {\r\n const callback = this.#registeredNodeAddedCallbacks[i];\r\n if (!callback) {\r\n continue;\r\n }\r\n callback(node);\r\n }\r\n }\r\n\r\n fileDrop(file: File): boolean {\r\n if (this.#nodeHovering === -1) {\r\n return false;\r\n }\r\n this.#nodes[this.#nodeHovering].dropFile(file);\r\n return true;\r\n }\r\n\r\n #removeNodeConnections(nodeIndex: number): void {\r\n if (nodeIndex >= this.#nodes.length || nodeIndex < 0) {\r\n console.error(\"invalid node connection\");\r\n return;\r\n }\r\n for (let i = this.#connections.length - 1; i >= 0; i--) {\r\n if (this.#connections[i].referencesNode(this.#nodes[nodeIndex])) {\r\n this.#removeConnectionByIndex(i, true);\r\n }\r\n }\r\n }\r\n\r\n #interactingWithNode(): boolean {\r\n return this.#nodesGrabbed.Count() > 0;\r\n }\r\n\r\n #interactingWithConnection(): boolean {\r\n return this.#connectionSelected !== null;\r\n }\r\n\r\n #interactingWithWidget(): boolean {\r\n return this.#widgetCurrentlyClicking !== null;\r\n }\r\n\r\n removeNode(node: FlowNode): void {\r\n for (let i = 0; i < this.#nodes.length; i++) {\r\n if (this.#nodes[i] === node) {\r\n this.#removeNodeByIndex(i);\r\n }\r\n }\r\n }\r\n\r\n #removeNodeByIndex(nodeIndex: number): void {\r\n this.#removeNodeConnections(nodeIndex);\r\n const node = this.#nodes[nodeIndex];\r\n this.#nodes.splice(nodeIndex, 1);\r\n for (let i = 0; i < this.#nodeRemovedCallbacks.length; i++) {\r\n this.#nodeRemovedCallbacks[i](node);\r\n }\r\n }\r\n\r\n #removeConnectionByIndex(index: number, clearPorts: boolean): void {\r\n if (clearPorts) {\r\n this.#connections[index].clearPorts();\r\n }\r\n this.#connections.splice(index, 1);\r\n }\r\n\r\n #removeConnection(connection: Connection, clearPorts: boolean): void {\r\n const index = this.#connections.indexOf(connection);\r\n if (index > -1) {\r\n this.#removeConnectionByIndex(index, clearPorts);\r\n } else {\r\n console.error(\"no connection found to remove\");\r\n }\r\n }\r\n\r\n organize(ctx: CanvasRenderingContext2D): void {\r\n Organize(ctx, this);\r\n }\r\n\r\n #nodesSelected(): Array<number> {\r\n const selected = new Array<number>();\r\n for (let i = 0; i < this.#nodes.length; i++) {\r\n if (this.#nodes[i].selected()) {\r\n selected.push(i);\r\n }\r\n }\r\n return selected;\r\n }\r\n\r\n #organizeSelected(ctx: CanvasRenderingContext2D): void {\r\n Organize(ctx, this, this.#nodesSelected());\r\n }\r\n\r\n openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig | null {\r\n\r\n const organizeNodesSubMenu: ContextMenuConfig = {\r\n name: \"Organize\",\r\n group: nodeFlowGroup,\r\n items: [\r\n {\r\n name: \"All Nodes\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.organize(ctx);\r\n }\r\n }\r\n ]\r\n }\r\n\r\n let config: ContextMenuConfig = {\r\n items: [],\r\n subMenus: [\r\n organizeNodesSubMenu,\r\n this.#nodeFactory.openMenu(this, position)\r\n ]\r\n }\r\n\r\n if (this.#nodesSelected().length > 0) {\r\n organizeNodesSubMenu.items?.push({\r\n name: \"Selected Nodes\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.#organizeSelected(ctx)\r\n }\r\n })\r\n }\r\n\r\n if (this.#nodeHovering > -1) {\r\n const nodeToReview = this.#nodeHovering;\r\n const nodeToReviewNode = this.#nodes[nodeToReview];\r\n\r\n config.subMenus?.push({\r\n group: nodeFlowGroup,\r\n name: \"Select\",\r\n items: [\r\n {\r\n name: \"Direct Connected Nodes\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.#selectConnectedNodes(nodeToReview);\r\n }\r\n },\r\n {\r\n name: \"Input Nodes + Descendents\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.#selectInputNodesAndDescendents(nodeToReviewNode);\r\n }\r\n },\r\n ]\r\n })\r\n\r\n config.subMenus?.push({\r\n group: nodeFlowGroup,\r\n name: \"Delete\",\r\n items: [\r\n {\r\n name: \"Node\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.#removeNodeByIndex(nodeToReview);\r\n }\r\n },\r\n {\r\n name: \"Connections\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.#removeNodeConnections(nodeToReview);\r\n }\r\n }\r\n ]\r\n })\r\n config = CombineContextMenus(config, nodeToReviewNode.contextMenu());\r\n }\r\n return config;\r\n }\r\n\r\n #selectInputNodesAndDescendents(node: FlowNode): void {\r\n if (node === undefined) {\r\n return;\r\n }\r\n this.#selectNode(node, false);\r\n\r\n const inputs = this.connectedInputsNodeReferences(node);\r\n for (let i = 0; i < inputs.length; i++) {\r\n this.#selectInputNodesAndDescendents(inputs[i]);\r\n }\r\n }\r\n\r\n #selectConnectedNodes(nodeIndex: number): void {\r\n const node = this.#nodes[nodeIndex];\r\n if (node === undefined) {\r\n return;\r\n }\r\n this.#selectNode(node, false);\r\n\r\n const outputs = this.connectedOutputsNodeReferences(nodeIndex);\r\n for (let i = 0; i < outputs.length; i++) {\r\n this.#selectNode(outputs[i], false);\r\n }\r\n\r\n const inputs = this.connectedInputsNodeReferencesByIndex(nodeIndex);\r\n for (let i = 0; i < inputs.length; i++) {\r\n this.#selectNode(inputs[i], false);\r\n }\r\n }\r\n\r\n #selectNodeByIndex(nodeIndex: number, unselectOthers: boolean): void {\r\n this.#selectNode(this.#nodes[nodeIndex], unselectOthers);\r\n }\r\n\r\n #selectNode(node: FlowNode, unselectOthers: boolean): void {\r\n node.select();\r\n\r\n if (!unselectOthers) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this.#nodes.length; i++) {\r\n if (node === this.#nodes[i]) {\r\n continue\r\n }\r\n this.#nodes[i].unselect();\r\n }\r\n }\r\n\r\n #clearCurrentlySelectedConnection(): void {\r\n if (this.#connectionSelected === null) {\r\n return;\r\n }\r\n this.#removeConnection(this.#connectionSelected, true);\r\n this.#connectionSelected = null;\r\n }\r\n\r\n #renderConnections(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): void {\r\n for (let i = 0; i < this.#connections.length; i++) {\r\n let portMousedOver = false;\r\n if (mousePosition !== undefined) {\r\n portMousedOver = this.#connections[i].mouseOverPort(mousePosition) !== null;\r\n }\r\n this.#connections[i].render(ctx, camera.zoom, portMousedOver, mousePosition);\r\n }\r\n }\r\n\r\n #renderNodes(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined) {\r\n this.#portHovering = null;\r\n this.#widgetHovering = null;\r\n this.#nodeHovering = -1;\r\n this.#boxSelectionNodes.Clear();\r\n\r\n const selectedBox_Screenspace = this.#boxSelectionScreenspaceBox(camera);\r\n\r\n for (let i = 0; i < this.#nodes.length; i++) {\r\n let state = NodeState.Idle;\r\n\r\n if (mousePosition !== undefined && !this.#boxSelect) {\r\n const intersection = this.#nodes[i].inBounds(ctx, camera, mousePosition);\r\n\r\n if (intersection.Node !== undefined && intersection.PortIndex === undefined && intersection.Widget === undefined) {\r\n state = NodeState.MouseOver;\r\n this.#nodeHovering = i;\r\n this.#cursor = CursorStyle.Grab;\r\n }\r\n\r\n if (intersection.Widget !== undefined) {\r\n // console.log(i, this.#nodes[i].title(), \"widget\")\r\n this.#widgetHovering = intersection.Widget\r\n this.#cursor = CursorStyle.Pointer;\r\n }\r\n\r\n if (intersection.Port !== undefined && intersection.Node !== undefined && intersection.PortIndex !== undefined && intersection.PortIsInput !== undefined) {\r\n this.#portHovering = {\r\n Index: intersection.PortIndex,\r\n Node: intersection.Node,\r\n Port: intersection.Port,\r\n InputPort: intersection.PortIsInput\r\n };\r\n }\r\n } else if (this.#boxSelect) {\r\n const nodeBounds = this.#nodes[i].calculateBounds(ctx, camera);\r\n\r\n if (BoxIntersection(selectedBox_Screenspace, nodeBounds)) {\r\n state = NodeState.MouseOver;\r\n this.#boxSelectionNodes.Push(i);\r\n }\r\n }\r\n\r\n // if (i === this.#nodeSelected) {\r\n // state = NodeState.Selected;\r\n // }\r\n\r\n if (this.#nodes[i].selected() && this.#nodesGrabbed.Count() > 0) {\r\n state = NodeState.Grabbed;\r\n this.#cursor = CursorStyle.Grabbing;\r\n }\r\n\r\n this.#nodes[i].render(ctx, camera, state, mousePosition, this.#postProcessPass);\r\n }\r\n }\r\n\r\n #boxSelectionScreenspaceBox(camera: Camera): Box {\r\n const box = { Position: Zero(), Size: Zero() }\r\n\r\n camera.graphSpaceToScreenSpace(this.#boxSelectStart_graphSpace, box.Position);\r\n camera.graphSpaceToScreenSpace(this.#boxSelectEnd_graphSpace, box.Size);\r\n\r\n SubVector2(box.Size, box.Size, box.Position);\r\n\r\n return box;\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults | undefined {\r\n this.#cursor = CursorStyle.Default;\r\n TimeExecution(\"Render_Connections\", () => {\r\n this.#renderConnections(ctx, camera, mousePosition);\r\n })\r\n TimeExecution(\"Render_Nodes\", () => {\r\n this.#renderNodes(ctx, camera, mousePosition);\r\n })\r\n\r\n if (this.#boxSelect) {\r\n const box = this.#boxSelectionScreenspaceBox(camera);\r\n ctx.setLineDash([Theme.BoxSelect.LineDashLength]);\r\n this.#boxSelectStyle.Draw(ctx, box, 1);\r\n ctx.setLineDash([]);\r\n }\r\n\r\n return { cursorStyle: this.#cursor }\r\n }\r\n\r\n}","import { Popup } from \"../popup\";\r\n\r\ninterface FormValue {\r\n name: string;\r\n\r\n // https://html.spec.whatwg.org/multipage/input.html#dom-input-type\r\n type: string;\r\n\r\n startingValue: any;\r\n}\r\n\r\ninterface Config {\r\n title: string;\r\n form: Array<FormValue>;\r\n onUpdate: (newValue: Array<any>) => void;\r\n onCancel?: () => void;\r\n}\r\n\r\nexport function FormPopup(config: Config): Popup {\r\n let input = new Array<HTMLInputElement | null>();\r\n\r\n const setOption = \"Set\";\r\n const cancelOption = \"Cancel\";\r\n\r\n return new Popup({\r\n title: config.title,\r\n options: [setOption, cancelOption],\r\n content: () => {\r\n const container = document.createElement('div');\r\n container.style.flexDirection = \"column\";\r\n container.style.display = \"flex\";\r\n\r\n for (let i = 0; i < config.form.length; i++) {\r\n const title = document.createElement(\"h4\");\r\n title.innerText = config.form[i].name;\r\n container.append(title);\r\n\r\n const ele = document.createElement('input');\r\n ele.value = config.form[i].startingValue;\r\n ele.type = config.form[i].type;\r\n container.append(ele);\r\n input.push(ele);\r\n container.append(document.createElement(\"br\"));\r\n }\r\n\r\n return container;\r\n },\r\n onClose: (button: string | null): void => {\r\n if (button !== setOption || input === null) {\r\n if (config.onCancel) {\r\n config.onCancel();\r\n }\r\n return;\r\n }\r\n\r\n const values = new Array<any>();\r\n for (let i = 0; i < config.form.length; i++) {\r\n values[i] = input[i]?.value;\r\n }\r\n config.onUpdate(values);\r\n },\r\n });\r\n}\r\n","import { Port, PortConfig, PortType } from \"./port\";\r\nimport { FontWeight, TextStyle, TextStyleConfig, TextStyleFallback } from \"./styles/text\";\r\nimport { Box, InBox } from \"./types/box\";\r\nimport { CopyVector2, Distance, ScaleVector, Vector2, Zero } from \"./types/vector2\";\r\nimport { Widget } from './widgets/widget';\r\nimport { List } from './types/list';\r\nimport { BoxStyle, BoxStyleConfig, BoxStyleWithFallback } from \"./styles/box\";\r\nimport { Text } from \"./types/text\";\r\nimport { GlobalWidgetFactory } from \"./widgets/factory\";\r\nimport { Theme } from \"./theme\";\r\nimport { TextAlign } from \"./styles/canvasTextAlign\";\r\nimport { TextBaseline } from \"./styles/canvasTextBaseline\";\r\nimport { CombineContextMenus, ContextMenuConfig, ContextMenuItemConfig } from \"./contextMenu\";\r\nimport { nodeFlowGroup } from \"./nodes/subsystem\";\r\nimport { SetStringPopup } from \"./popups/string\";\r\nimport { ButtonWidget } from \"./widgets/button\";\r\nimport { FormPopup } from \"./popups/form\";\r\nimport { NumberWidget } from \"./widgets/number\";\r\nimport { StringWidget } from \"./widgets/string\";\r\nimport { ToggleWidget } from \"./widgets/toggle\";\r\nimport { ColorWidget } from \"./widgets/color\";\r\nimport { SliderWidget } from \"./widgets/slider\";\r\nimport { ImageWidget } from \"./widgets/image\";\r\nimport { VectorPool } from \"./types/pool\";\r\nimport { Camera } from \"./camera\";\r\nimport { PassSubsystem } from \"./pass/subsystem\";\r\nimport { splitString, splitStringIntoLines } from \"./utils/string\";\r\nimport { Metadata } from './metadata';\r\n\r\nconst MINIMUM_NODE_WIDTH = 150;\r\n\r\ntype AnyPropertyChangeCallback = (propertyName: string, oldValue: any, newValue: any) => void\r\ntype PropertyChangeCallback = (oldValue: any, newValue: any) => void\r\ntype TitleChangeCallback = (node: FlowNode, oldTitle: string, newTitle: string) => void\r\ntype InfoChangeCallback = (node: FlowNode, oldInfo: string, newInfo: string) => void\r\n\r\n\r\n\r\nexport interface WidgetConfig {\r\n type?: string,\r\n config?: any\r\n}\r\n\r\nexport interface FlowNodeTitleConfig {\r\n textStyle?: TextStyleConfig;\r\n color?: string;\r\n padding?: number;\r\n}\r\n\r\nexport interface FlowNodeStyle {\r\n title?: FlowNodeTitleConfig;\r\n idle?: BoxStyleConfig;\r\n mouseOver?: BoxStyleConfig;\r\n grabbed?: BoxStyleConfig;\r\n selected?: BoxStyleConfig;\r\n portText?: TextStyleConfig;\r\n}\r\n\r\nexport interface FlowNodeConfig {\r\n position?: Vector2;\r\n title?: string;\r\n subTitle?: string;\r\n info?: string;\r\n locked?: boolean;\r\n data?: Metadata;\r\n contextMenu?: ContextMenuConfig;\r\n metadata?: any;\r\n\r\n canEditTitle?: boolean;\r\n canEditInfo?: boolean;\r\n canEditPorts?: boolean;\r\n\r\n // Ports\r\n inputs?: Array<PortConfig>;\r\n outputs?: Array<PortConfig>;\r\n\r\n // Callbacks\r\n onGrab?: () => void;\r\n onRelease?: () => void;\r\n onSelect?: () => void;\r\n onUnselect?: () => void;\r\n onDragStop?: (FlowNode: FlowNode) => void;\r\n onFileDrop?: (file: File) => void;\r\n onTitleChange?: TitleChangeCallback;\r\n onInfoChange?: InfoChangeCallback;\r\n\r\n // Widgets\r\n widgets?: Array<WidgetConfig>;\r\n\r\n // Styling\r\n style?: FlowNodeStyle;\r\n}\r\n\r\nexport enum NodeState {\r\n Idle,\r\n MouseOver,\r\n Grabbed\r\n}\r\n\r\nexport interface NodeIntersection {\r\n Node?: FlowNode\r\n\r\n // Port\r\n Port?: Port\r\n PortIndex?: number\r\n PortIsInput?: boolean\r\n\r\n // Widget\r\n Widget?: Widget\r\n WidgetIndex?: number\r\n\r\n}\r\n\r\nexport class FlowNode {\r\n\r\n #position: Vector2;\r\n\r\n #title: Text;\r\n\r\n #subTitle: Text;\r\n\r\n #infoSymbol: Text;\r\n\r\n #infoText: string;\r\n\r\n #input: Array<Port>;\r\n\r\n #output: Array<Port>;\r\n\r\n #widgets: Array<Widget>;\r\n\r\n #locked: boolean;\r\n\r\n #canEditTitle: boolean;\r\n\r\n #canEditInfo: boolean;\r\n\r\n #canEditPorts: boolean;\r\n\r\n #contextMenu: ContextMenuConfig | null;\r\n\r\n #metadata: any;\r\n\r\n // Callbacks\r\n\r\n #onSelect: Array<() => void>;\r\n\r\n #onUnselect: Array<() => void>;\r\n\r\n #onFiledrop: Array<(file: File) => void>;\r\n\r\n #onDragStop: Array<(node: FlowNode) => void>;\r\n\r\n #titleChangeCallback: Array<TitleChangeCallback>;\r\n\r\n #infoChangeCallback: Array<InfoChangeCallback>;\r\n\r\n // Styling ================================================================\r\n\r\n #titleColor: string;\r\n\r\n #selectedStyle: BoxStyle;\r\n\r\n #stateStyles: Map<NodeState, BoxStyle>;\r\n\r\n #padding: number;\r\n\r\n #portTextStyle: TextStyle;\r\n\r\n #elementSpacing: number;\r\n\r\n // Runtime ================================================================\r\n\r\n #selected: boolean;\r\n\r\n #inputPortPositions: List<Box>;\r\n\r\n #outputPortPositions: List<Box>;\r\n\r\n #widgetPositions: List<Box>;\r\n\r\n #data: Metadata;\r\n\r\n #registeredAnyPropertyChangeCallbacks: Array<AnyPropertyChangeCallback>;\r\n\r\n #registeredPropertyChangeCallbacks: Map<string, Array<PropertyChangeCallback>>;\r\n\r\n constructor(config?: FlowNodeConfig) {\r\n this.#input = new Array<Port>();\r\n this.#output = new Array<Port>();\r\n this.#widgets = new Array<Widget>();\r\n this.#inputPortPositions = new List<Box>();\r\n this.#outputPortPositions = new List<Box>();\r\n this.#widgetPositions = new List<Box>();\r\n this.#elementSpacing = 15;\r\n this.#locked = config?.locked === undefined ? false : config.locked;\r\n this.#data = config?.data === undefined ? {} : config?.data;\r\n this.#registeredPropertyChangeCallbacks = new Map<string, Array<PropertyChangeCallback>>();\r\n this.#registeredAnyPropertyChangeCallbacks = new Array<AnyPropertyChangeCallback>();\r\n this.#canEditPorts = config?.canEditPorts === undefined ? false : config.canEditPorts;\r\n this.#canEditTitle = config?.canEditTitle === undefined ? false : config.canEditTitle;\r\n this.#canEditInfo = config?.canEditInfo === undefined ? false : config.canEditInfo;\r\n this.#contextMenu = config?.contextMenu === undefined ? null : config.contextMenu;\r\n this.#metadata = config?.metadata;\r\n\r\n this.#selected = false;\r\n this.#onSelect = new Array<() => void>();\r\n this.#onUnselect = new Array<() => void>();\r\n this.#onFiledrop = new Array<(file: File) => void>();\r\n this.#onDragStop = new Array<() => void>();\r\n this.#titleChangeCallback = new Array<TitleChangeCallback>();\r\n this.#infoChangeCallback = new Array<InfoChangeCallback>();\r\n\r\n if (config?.onSelect) {\r\n this.#onSelect.push(config?.onSelect);\r\n }\r\n\r\n if (config?.onUnselect) {\r\n this.#onUnselect.push(config?.onUnselect);\r\n }\r\n\r\n if (config?.onFileDrop) {\r\n this.#onFiledrop.push(config?.onFileDrop);\r\n }\r\n\r\n if (config?.onDragStop) {\r\n this.#onDragStop.push(config.onDragStop);\r\n }\r\n\r\n if (config?.onTitleChange) {\r\n this.#titleChangeCallback.push(config.onTitleChange);\r\n }\r\n\r\n if (config?.onInfoChange) {\r\n this.#infoChangeCallback.push(config.onInfoChange);\r\n }\r\n\r\n this.#position = config?.position === undefined ? { x: 0, y: 0 } : config.position;\r\n this.#title = new Text(\r\n config?.title === undefined ? \"\" : config.title,\r\n TextStyleFallback(config?.style?.title?.textStyle, {\r\n size: 16,\r\n weight: FontWeight.Bold,\r\n color: Theme.Node.FontColor\r\n })\r\n );\r\n\r\n this.#subTitle = new Text(\r\n config?.subTitle === undefined ? \"\" : config.subTitle,\r\n TextStyleFallback(config?.style?.title?.textStyle, {\r\n size: 10,\r\n weight: FontWeight.Bold,\r\n color: Theme.Node.FontColor\r\n })\r\n );\r\n\r\n this.#infoSymbol = new Text(\r\n \"i\",\r\n {\r\n size: 13,\r\n weight: FontWeight.Bold,\r\n color: Theme.Node.FontColor\r\n }\r\n );\r\n this.#infoText = config?.info ? config?.info : \"\";\r\n\r\n this.#titleColor = config?.style?.title?.color === undefined ? \"#154050\" : config?.style?.title?.color;\r\n\r\n this.#padding = config?.style?.title?.padding === undefined ? 15 : config?.style?.title?.padding;\r\n\r\n this.#stateStyles = new Map<NodeState, BoxStyle>();\r\n this.#stateStyles.set(NodeState.Idle, new BoxStyle(BoxStyleWithFallback(config?.style?.idle, {\r\n border: { color: Theme.Node.Border.Idle, size: 1 },\r\n radius: Theme.Node.BorderRadius,\r\n color: Theme.Node.BackgroundColor,\r\n })));\r\n this.#stateStyles.set(NodeState.MouseOver, new BoxStyle(BoxStyleWithFallback(config?.style?.mouseOver, {\r\n border: { color: Theme.Node.Border.MouseOver, size: 1.1, },\r\n radius: Theme.Node.BorderRadius,\r\n color: Theme.Node.BackgroundColor,\r\n })));\r\n this.#stateStyles.set(NodeState.Grabbed, new BoxStyle(BoxStyleWithFallback(config?.style?.grabbed, {\r\n border: { color: Theme.Node.Border.Grabbed, size: 2, },\r\n radius: Theme.Node.BorderRadius,\r\n color: Theme.Node.BackgroundColor,\r\n })));\r\n\r\n this.#selectedStyle = new BoxStyle(BoxStyleWithFallback(config?.style?.selected, {\r\n border: { color: Theme.Node.Border.Selected, size: 1, },\r\n radius: Theme.Node.BorderRadius,\r\n color: Theme.Node.BackgroundColor,\r\n }));\r\n\r\n this.#portTextStyle = new TextStyle({\r\n size: config?.style?.portText?.size === undefined ? 14 : config?.style?.portText?.size,\r\n color: config?.style?.portText?.color === undefined ? Theme.Node.Port.FontColor : config?.style?.portText?.color,\r\n font: config?.style?.portText?.font,\r\n weight: config?.style?.portText?.weight,\r\n });\r\n\r\n if (config?.inputs !== undefined) {\r\n for (let i = 0; i < config.inputs.length; i++) {\r\n this.addInput(config.inputs[i]);\r\n }\r\n }\r\n\r\n if (config?.outputs !== undefined) {\r\n for (let i = 0; i < config.outputs.length; i++) {\r\n this.addOutput(config.outputs[i]);\r\n }\r\n }\r\n\r\n if (config?.widgets !== undefined) {\r\n for (let i = 0; i < config.widgets.length; i++) {\r\n const widget = config.widgets[i];\r\n if (widget.type === undefined) {\r\n continue;\r\n }\r\n this.addWidget(GlobalWidgetFactory.create(this, widget.type, widget.config))\r\n }\r\n }\r\n }\r\n\r\n public metadata(): any {\r\n return this.#metadata;\r\n }\r\n\r\n public selected(): boolean {\r\n return this.#selected;\r\n }\r\n\r\n public select(): void {\r\n if (this.#selected) {\r\n return;\r\n }\r\n this.#selected = true;\r\n for (let i = 0; i < this.#onSelect.length; i++) {\r\n this.#onSelect[i]();\r\n }\r\n }\r\n\r\n public raiseDragStoppedEvent() {\r\n for (let i = 0; i < this.#onDragStop.length; i++) {\r\n this.#onDragStop[i](this);\r\n }\r\n }\r\n\r\n public addTitleChangeListener(callback: TitleChangeCallback): void {\r\n if (callback === undefined || callback === null) {\r\n }\r\n this.#titleChangeCallback.push(callback);\r\n }\r\n\r\n public addInfoChangeListener(callback: InfoChangeCallback): void {\r\n if (callback === undefined || callback === null) {\r\n }\r\n this.#infoChangeCallback.push(callback);\r\n }\r\n\r\n\r\n public addDragStoppedListener(callback: (node: FlowNode) => void): void {\r\n if (callback === undefined || callback === null) {\r\n }\r\n this.#onDragStop.push(callback);\r\n }\r\n\r\n public addAnyPropertyChangeListener(callback: AnyPropertyChangeCallback): void {\r\n if (callback === undefined || callback === null) {\r\n }\r\n this.#registeredAnyPropertyChangeCallbacks.push(callback);\r\n }\r\n\r\n public addPropertyChangeListener(name: string, callback: PropertyChangeCallback): void {\r\n if (!this.#registeredPropertyChangeCallbacks.has(name)) {\r\n this.#registeredPropertyChangeCallbacks.set(name, []);\r\n }\r\n\r\n const callbacks = this.#registeredPropertyChangeCallbacks.get(name);\r\n if (callbacks === undefined) {\r\n return;\r\n }\r\n callbacks.push(callback);\r\n }\r\n\r\n public setProperty(name: string, value: any): void {\r\n const oldValue = this.#data[name];\r\n if (oldValue === value) {\r\n return;\r\n }\r\n\r\n this.#data[name] = value;\r\n\r\n for (let i = 0; i < this.#registeredAnyPropertyChangeCallbacks.length; i++) {\r\n this.#registeredAnyPropertyChangeCallbacks[i](name, oldValue, value);\r\n }\r\n\r\n const callbacks = this.#registeredPropertyChangeCallbacks.get(name);\r\n if (callbacks === undefined) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < callbacks.length; i++) {\r\n callbacks[i](oldValue, value);\r\n }\r\n }\r\n\r\n public getProperty(name: string): any {\r\n return this.#data[name];\r\n }\r\n\r\n #popupNodeTitleSelection(): void {\r\n SetStringPopup({\r\n title: \"Set Node Title\",\r\n startingValue: this.title(),\r\n onUpdate: (value: string): void => {\r\n this.setTitle(value);\r\n },\r\n }).Show();\r\n }\r\n\r\n #popupNodeInfoSelection(): void {\r\n SetStringPopup({\r\n title: \"Set Node Info\",\r\n startingValue: this.#infoText,\r\n onUpdate: (value: string): void => {\r\n this.setInfo(value);\r\n },\r\n }).Show();\r\n }\r\n\r\n #popupNewButtonWidget(): void {\r\n SetStringPopup({\r\n title: \"New Button Widget Text\",\r\n startingValue: \"My Button\",\r\n onUpdate: (value: string): void => {\r\n this.addWidget(new ButtonWidget({\r\n text: value\r\n }));\r\n },\r\n }).Show()\r\n }\r\n\r\n #widgetSubmenu(): ContextMenuConfig {\r\n return {\r\n name: \"Widget\",\r\n items: [\r\n {\r\n name: \"Button\",\r\n callback: this.#popupNewButtonWidget.bind(this),\r\n },\r\n {\r\n name: \"Number\",\r\n callback: () => {\r\n this.addWidget(new NumberWidget(this))\r\n }\r\n },\r\n {\r\n name: \"Color\",\r\n callback: () => {\r\n this.addWidget(new ColorWidget(this))\r\n }\r\n },\r\n {\r\n name: \"Slider\",\r\n callback: () => {\r\n FormPopup({\r\n title: \"New Slider\",\r\n form: [\r\n {\r\n name: \"min\",\r\n type: \"number\",\r\n startingValue: 0\r\n },\r\n {\r\n name: \"max\",\r\n type: \"number\",\r\n startingValue: 100\r\n }\r\n ],\r\n onUpdate: (data: Array<any>) => {\r\n this.addWidget(new SliderWidget(this, {\r\n min: data[0],\r\n max: data[1],\r\n }));\r\n }\r\n }).Show();\r\n }\r\n },\r\n {\r\n name: \"String\",\r\n callback: () => {\r\n this.addWidget(new StringWidget(this))\r\n }\r\n },\r\n {\r\n name: \"Toggle\",\r\n callback: () => {\r\n this.addWidget(new ToggleWidget(this))\r\n }\r\n },\r\n {\r\n name: \"Image\",\r\n callback: () => {\r\n FormPopup({\r\n title: \"New Image\",\r\n form: [\r\n {\r\n name: \"URL\",\r\n type: \"text\",\r\n startingValue: \"https://pbs.twimg.com/media/GYabtu6bsAA7m99?format=jpg&name=medium\"\r\n },\r\n {\r\n name: \"Max Width\",\r\n type: \"number\",\r\n startingValue: MINIMUM_NODE_WIDTH\r\n },\r\n {\r\n name: \"Max Height\",\r\n type: \"number\",\r\n startingValue: MINIMUM_NODE_WIDTH\r\n }\r\n ],\r\n onUpdate: (data: Array<any>) => {\r\n this.addWidget(new ImageWidget({\r\n image: data[0],\r\n maxWidth: data[1],\r\n maxHeight: data[2],\r\n }));\r\n }\r\n }).Show();\r\n }\r\n }\r\n ]\r\n };\r\n }\r\n\r\n public contextMenu(): ContextMenuConfig {\r\n let config: ContextMenuConfig = {\r\n group: nodeFlowGroup,\r\n items: [\r\n // {\r\n // name: \"Debug\",\r\n // callback: () => {\r\n // console.log(this);\r\n // }\r\n // }\r\n ],\r\n subMenus: [],\r\n }\r\n\r\n if (this.canEditPorts() || this.canEditTitle() || this.#canEditInfo) {\r\n\r\n const items = new Array<ContextMenuItemConfig>();\r\n if (this.canEditTitle()) {\r\n items.push({\r\n name: \"Title\",\r\n callback: () => {\r\n this.#popupNodeTitleSelection();\r\n }\r\n })\r\n }\r\n\r\n if (this.#canEditInfo) {\r\n items.push({\r\n name: \"Info\",\r\n callback: () => {\r\n this.#popupNodeInfoSelection();\r\n }\r\n })\r\n }\r\n\r\n const submenus = new Array<ContextMenuConfig>();\r\n if (this.canEditPorts()) {\r\n submenus.push({\r\n name: \"Add\",\r\n items: [\r\n {\r\n name: \"Input\",\r\n callback: () => {\r\n FormPopup({\r\n title: \"New Input\",\r\n form: [\r\n {\r\n name: \"name\",\r\n type: \"text\",\r\n startingValue: \"input\"\r\n },\r\n {\r\n name: \"type\",\r\n type: \"text\",\r\n startingValue: \"string\"\r\n }\r\n ],\r\n onUpdate: (data: Array<any>) => {\r\n this.addInput({\r\n name: data[0],\r\n type: data[1]\r\n })\r\n }\r\n }).Show();\r\n }\r\n },\r\n {\r\n name: \"Output\",\r\n callback: () => {\r\n FormPopup({\r\n title: \"New Output\",\r\n form: [\r\n {\r\n name: \"name\",\r\n type: \"text\",\r\n startingValue: \"output\"\r\n },\r\n {\r\n name: \"type\",\r\n type: \"text\",\r\n startingValue: \"string\"\r\n }\r\n ],\r\n onUpdate: (data: Array<any>) => {\r\n this.addOutput({\r\n name: data[0],\r\n type: data[1]\r\n })\r\n }\r\n }).Show();\r\n }\r\n },\r\n ],\r\n subMenus: [\r\n this.#widgetSubmenu(),\r\n ]\r\n });\r\n }\r\n\r\n config.subMenus?.push({\r\n group: nodeFlowGroup,\r\n name: \"Edit\",\r\n items: items,\r\n subMenus: submenus,\r\n })\r\n }\r\n\r\n if (this.locked()) {\r\n config.items?.push({\r\n name: \"Unlock Node Position\",\r\n group: nodeFlowGroup,\r\n callback: this.unlock.bind(this),\r\n });\r\n } else {\r\n config.items?.push({\r\n name: \"Lock Node Position\",\r\n group: nodeFlowGroup,\r\n callback: this.lock.bind(this),\r\n })\r\n }\r\n\r\n if (this.#contextMenu !== null) {\r\n config = CombineContextMenus(config, this.#contextMenu)\r\n }\r\n\r\n return config;\r\n }\r\n\r\n public unselect(): void {\r\n if (!this.#selected) {\r\n return;\r\n }\r\n this.#selected = false;\r\n for (let i = 0; i < this.#onUnselect.length; i++) {\r\n this.#onUnselect[i]();\r\n }\r\n }\r\n\r\n public addUnselectListener(callback: () => void): void {\r\n this.#onUnselect.push(callback);\r\n }\r\n\r\n public addSelectListener(callback: () => void): void {\r\n this.#onSelect.push(callback);\r\n }\r\n\r\n public dropFile(file: File): void {\r\n for (let i = 0; i < this.#onFiledrop.length; i++) {\r\n this.#onFiledrop[i](file);\r\n }\r\n }\r\n\r\n public addFileDropListener(callback: (file: File) => void): void {\r\n this.#onFiledrop.push(callback);\r\n }\r\n\r\n public locked(): boolean {\r\n return this.#locked;\r\n }\r\n\r\n public lock(): void {\r\n this.#locked = true;\r\n }\r\n\r\n public unlock(): void {\r\n this.#locked = false;\r\n }\r\n\r\n public setPosition(position: Vector2): void {\r\n CopyVector2(this.#position, position);\r\n }\r\n\r\n public getPosition(): Vector2 {\r\n return this.#position;\r\n }\r\n\r\n // #measureTitleText(ctx: CanvasRenderingContext2D, scale: number): Vector2 {\r\n // return this.#titleTextStyle.measure(ctx, scale, this.#title);\r\n // }\r\n\r\n public calculateBounds(ctx: CanvasRenderingContext2D, camera: Camera): Box {\r\n const tempMeasurement = Zero();\r\n\r\n const doublePadding = this.#padding * 2;\r\n\r\n const screenSpacePosition = Zero();\r\n camera.graphSpaceToScreenSpace(this.#position, screenSpacePosition);\r\n\r\n const size = Zero();\r\n this.#title.size(ctx, 1, size);\r\n\r\n const subtitleSize = Zero();\r\n this.#subTitle.size(ctx, 1, subtitleSize);\r\n size.x = Math.max(size.x, subtitleSize.x);\r\n\r\n if (this.#infoText !== \"\") {\r\n size.x += (size.y * 4);\r\n }\r\n\r\n size.x += doublePadding;\r\n size.y += doublePadding + (this.#elementSpacing * this.#input.length);\r\n\r\n for (let i = 0; i < this.#input.length; i++) {\r\n const port = this.#input[i];\r\n this.#portTextStyle.measure(ctx, 1, port.getDisplayName(), tempMeasurement);\r\n size.y += tempMeasurement.y;\r\n size.x = Math.max(size.x, tempMeasurement.x + doublePadding)\r\n }\r\n\r\n size.y += (this.#elementSpacing * this.#output.length);\r\n\r\n for (let i = 0; i < this.#output.length; i++) {\r\n const port = this.#output[i];\r\n this.#portTextStyle.measure(ctx, 1, port.getDisplayName(), tempMeasurement);\r\n size.y += tempMeasurement.y;\r\n size.x = Math.max(size.x, tempMeasurement.x + doublePadding)\r\n }\r\n\r\n size.y += (this.#elementSpacing * this.#widgets.length);\r\n for (let i = 0; i < this.#widgets.length; i++) {\r\n const element = this.#widgets[i];\r\n const eleSize = element.Size();\r\n size.y += eleSize.y\r\n size.x = Math.max(size.x, (eleSize.x) + doublePadding)\r\n }\r\n\r\n // Add some padding at the end!\r\n size.y += this.#elementSpacing\r\n\r\n size.x = Math.max(size.x, MINIMUM_NODE_WIDTH)\r\n ScaleVector(size, camera.zoom);\r\n\r\n return {\r\n Position: screenSpacePosition,\r\n Size: size,\r\n }\r\n }\r\n\r\n addInput(config: PortConfig): Port {\r\n const port = new Port(this, config.array ? PortType.InputArray : PortType.Input, config);\r\n this.#input.push(port);\r\n return port;\r\n }\r\n\r\n addOutput(config: PortConfig): Port {\r\n const port = new Port(this, PortType.Output, config);\r\n this.#output.push(port);\r\n return port;\r\n }\r\n\r\n addWidget(widget: Widget): void {\r\n this.#widgets.push(widget);\r\n }\r\n\r\n getWidget(index: number): Widget {\r\n return this.#widgets[index];\r\n }\r\n\r\n widgetCount(): number {\r\n return this.#widgets.length;\r\n }\r\n\r\n translate(delta: Vector2): void {\r\n this.#position.x += delta.x;\r\n this.#position.y += delta.y;\r\n }\r\n\r\n inBounds(ctx: CanvasRenderingContext2D, camera: Camera, position: Vector2): NodeIntersection {\r\n var intersection: NodeIntersection = {}\r\n\r\n const box = this.calculateBounds(ctx, camera);\r\n if (InBox(box, position)) {\r\n intersection.Node = this;\r\n }\r\n\r\n for (let i = 0; i < this.#inputPortPositions.Count(); i++) {\r\n if (InBox(this.#inputPortPositions.At(i), position)) {\r\n intersection.Node = this;\r\n intersection.PortIndex = i;\r\n intersection.PortIsInput = true;\r\n intersection.Port = this.#input[i]\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.#outputPortPositions.Count(); i++) {\r\n if (InBox(this.#outputPortPositions.At(i), position)) {\r\n intersection.Node = this;\r\n intersection.PortIndex = i;\r\n intersection.PortIsInput = false;\r\n intersection.Port = this.#output[i];\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.#widgetPositions.Count(); i++) {\r\n if (InBox(this.#widgetPositions.At(i), position)) {\r\n intersection.Node = this;\r\n intersection.WidgetIndex = i;\r\n intersection.Widget = this.#widgets[i];\r\n }\r\n }\r\n\r\n return intersection;\r\n }\r\n\r\n canEditTitle(): boolean {\r\n return this.#canEditTitle;\r\n }\r\n\r\n canEditPorts(): boolean {\r\n return this.#canEditPorts;\r\n }\r\n\r\n title(): string {\r\n return this.#title.get();\r\n }\r\n\r\n setTitle(newTitle: string): void {\r\n if (!this.#canEditTitle) {\r\n console.warn(\"setTitle instruction ignored, as node has been marked un-editable\");\r\n return;\r\n }\r\n\r\n let cleaned = newTitle;\r\n if (cleaned === null || cleaned === undefined) {\r\n cleaned = \"\";\r\n }\r\n\r\n const old = this.title();\r\n if (cleaned === old) {\r\n return;\r\n }\r\n\r\n this.#title.set(cleaned);\r\n\r\n for (let i = 0; i < this.#titleChangeCallback.length; i++) {\r\n const callback = this.#titleChangeCallback[i];\r\n callback(this, old, cleaned);\r\n }\r\n }\r\n\r\n setInfo(newInfo: string): void {\r\n if (!this.#canEditInfo) {\r\n console.warn(\"setInfo instruction ignored, as node has been marked un-editable\");\r\n }\r\n\r\n\r\n let cleaned = newInfo;\r\n if (cleaned === null || cleaned === undefined) {\r\n cleaned = \"\";\r\n }\r\n\r\n if (cleaned === this.#infoText) {\r\n return;\r\n }\r\n\r\n const old = this.#infoText;\r\n this.#infoText = cleaned;\r\n\r\n for (let i = 0; i < this.#infoChangeCallback.length; i++) {\r\n const callback = this.#infoChangeCallback[i];\r\n callback(this, old, cleaned);\r\n }\r\n }\r\n\r\n inputPortPosition(index: number): Box {\r\n return this.#inputPortPositions.At(index);\r\n }\r\n\r\n inputPort(index: number): Port {\r\n return this.#input[index];\r\n }\r\n\r\n inputs(): number {\r\n return this.#input.length;\r\n }\r\n\r\n outputPortPosition(index: number): Box {\r\n return this.#outputPortPositions.At(index);\r\n }\r\n\r\n outputPort(index: number): Port {\r\n return this.#output[index];\r\n }\r\n\r\n outputs(): number {\r\n return this.#output.length;\r\n }\r\n\r\n #calculateStyle(state: NodeState): BoxStyle {\r\n // Let the node being selected override the idle style\r\n if (this.#selected && state === NodeState.Idle) {\r\n return this.#selectedStyle;\r\n }\r\n\r\n let boxStyle = this.#stateStyles.get(state);\r\n if (boxStyle === undefined) {\r\n throw new Error(\"no registered border style for state: \" + state)\r\n }\r\n return boxStyle;\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, state: NodeState, mousePosition: Vector2 | undefined, postProcess: PassSubsystem): void {\r\n VectorPool.run(() => {\r\n const tempMeasurement = VectorPool.get();\r\n\r\n this.#inputPortPositions.Clear();\r\n this.#outputPortPositions.Clear();\r\n this.#widgetPositions.Clear();\r\n const scaledPadding = this.#padding * camera.zoom;\r\n const scaledElementSpacing = this.#elementSpacing * camera.zoom;\r\n\r\n const nodeBounds = this.calculateBounds(ctx, camera);\r\n\r\n // Background\r\n const nodeStyle = this.#calculateStyle(state);\r\n nodeStyle.Draw(ctx, nodeBounds, camera.zoom);\r\n\r\n // Title\r\n const borderSize = nodeStyle.borderSize();\r\n ctx.textAlign = TextAlign.Center;\r\n ctx.textBaseline = TextBaseline.Middle;\r\n\r\n const titleSize = VectorPool.get();\r\n this.#title.size(ctx, camera.zoom, titleSize);\r\n\r\n const subtitleSize = VectorPool.get();\r\n this.#subTitle.size(ctx, camera.zoom, subtitleSize);\r\n\r\n const titleBoxSize = VectorPool.get();\r\n titleBoxSize.x = nodeBounds.Size.x;\r\n titleBoxSize.y = titleSize.y + (scaledPadding * 2);\r\n\r\n ctx.fillStyle = this.#titleColor;\r\n ctx.beginPath();\r\n const titleX = nodeBounds.Position.x + (borderSize * camera.zoom * 0.5)\r\n const titleY = nodeBounds.Position.y + (borderSize * camera.zoom * 0.5)\r\n const titleWidth = titleBoxSize.x - (borderSize * camera.zoom);\r\n const titleHeight = titleBoxSize.y - (borderSize * camera.zoom * 0.5);\r\n ctx.roundRect(\r\n titleX, titleY, titleWidth, titleHeight,\r\n [nodeStyle.radius() * camera.zoom, nodeStyle.radius() * camera.zoom, 0, 0]\r\n );\r\n ctx.fill();\r\n // ctx.stroke();\r\n\r\n const titlePosition = VectorPool.get();\r\n titlePosition.x = nodeBounds.Position.x + (nodeBounds.Size.x / 2)\r\n titlePosition.y = nodeBounds.Position.y + scaledPadding + (titleSize.y / 2)\r\n\r\n if (this.#subTitle.get() !== \"\") {\r\n const subtitlePosition = VectorPool.get();\r\n CopyVector2(subtitlePosition, titlePosition);\r\n\r\n // TODO: I'm fudging a bunch of numbers ot make it fit nicely \r\n // together. \r\n // \r\n // Need to come up with like, proper logic about how we ensure \r\n // title and subtitle fit together\r\n subtitlePosition.y -= titleSize.y / 1.5;\r\n titlePosition.y += scaledPadding / 2\r\n\r\n this.#subTitle.render(ctx, camera.zoom, subtitlePosition);\r\n }\r\n\r\n this.#title.render(ctx, camera.zoom, titlePosition);\r\n\r\n // Info symbol\r\n if (this.#infoText !== \"\") {\r\n const infoRadius = titleHeight * .25;\r\n const centerX = titleX + titleWidth - (titleHeight * .25) - infoRadius;\r\n const centerY = titleY + (titleHeight * .25) + infoRadius;\r\n\r\n const infoPosition = VectorPool.get();\r\n infoPosition.x = centerX;\r\n infoPosition.y = centerY + (titleHeight * .025);\r\n\r\n let infoLineThickness = 1.5 * camera.zoom;\r\n\r\n if (mousePosition && Distance(infoPosition, mousePosition) <= infoRadius) {\r\n infoLineThickness *= 1.5;\r\n\r\n // This is a slightly expensive function if we're not \r\n // caching, but it only executes while we're mousing over \r\n // the info symbol, so I'm not particularly obligated to\r\n // optimize it. \r\n //\r\n // If you're just bored, def cache the split string method,\r\n // and figure out a system to recalculate as a node has its\r\n // title, port, or widgets change.\r\n //\r\n // Should probably break out the lambda into a proper \r\n // function as well. I think as it is, we're creating a new\r\n // lambda function per frame?\r\n postProcess.queue(() => {\r\n this.#infoSymbol.style().setupStyle(ctx, camera.zoom);\r\n ctx.textAlign = TextAlign.Center;\r\n\r\n const infoBoxWidth = titleWidth * 1.5;\r\n const textEntries = splitStringIntoLines(ctx, this.#infoText, infoBoxWidth);\r\n\r\n const lineHeight = (this.#infoSymbol.style().getSize() + 2);\r\n const infoBoxHeight = lineHeight * textEntries.length * camera.zoom;\r\n const scaledLineHeight = lineHeight * camera.zoom;\r\n const start = titleY - infoBoxHeight - (scaledLineHeight / 2);\r\n\r\n // Draw box\r\n ctx.fillStyle = this.#titleColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n centerX - (infoBoxWidth / 2) - (scaledLineHeight / 2),\r\n start - scaledLineHeight,\r\n infoBoxWidth + scaledLineHeight,\r\n infoBoxHeight + scaledLineHeight,\r\n nodeStyle.radius() * camera.zoom\r\n );\r\n ctx.fill();\r\n\r\n // Render Text\r\n this.#infoSymbol.style().setupStyle(ctx, camera.zoom);\r\n for (let i = 0; i < textEntries.length; i++) {\r\n const entry = textEntries[i];\r\n ctx.fillText(entry, centerX, start + (i * lineHeight * camera.zoom));\r\n }\r\n });\r\n }\r\n\r\n ctx.beginPath();\r\n ctx.arc(centerX, centerY, infoRadius, 0, 2 * Math.PI, false);\r\n ctx.lineWidth = infoLineThickness;\r\n ctx.strokeStyle = this.#infoSymbol.getColor();\r\n ctx.stroke();\r\n\r\n ctx.textAlign = TextAlign.Center;\r\n this.#infoSymbol.render(ctx, camera.zoom, infoPosition);\r\n }\r\n\r\n\r\n // Input Ports\r\n let startY = nodeBounds.Position.y + (scaledPadding * 2) + titleSize.y + scaledElementSpacing;\r\n const leftSide = nodeBounds.Position.x + scaledPadding;\r\n for (let i = 0; i < this.#input.length; i++) {\r\n ctx.textAlign = TextAlign.Left;\r\n const port = this.#input[i];\r\n this.#portTextStyle.measure(ctx, camera.zoom, port.getDisplayName(), tempMeasurement);\r\n const position = VectorPool.get();\r\n\r\n position.x = nodeBounds.Position.x;\r\n position.y = startY + (tempMeasurement.y / 2);\r\n\r\n // Text\r\n this.#portTextStyle.setupStyle(ctx, camera.zoom);\r\n ctx.fillText(port.getDisplayName(), leftSide, position.y);\r\n\r\n // Port\r\n this.#inputPortPositions.Push(port.render(ctx, position, camera, mousePosition, postProcess));\r\n\r\n startY += tempMeasurement.y + scaledElementSpacing;\r\n }\r\n\r\n // Output Ports\r\n const rightSide = nodeBounds.Position.x + nodeBounds.Size.x;\r\n ctx.textAlign = TextAlign.Right;\r\n for (let i = 0; i < this.#output.length; i++) {\r\n const port = this.#output[i];\r\n this.#portTextStyle.measure(ctx, camera.zoom, port.getDisplayName(), tempMeasurement);\r\n const position = VectorPool.get();\r\n position.x = rightSide;\r\n position.y = startY + (tempMeasurement.y / 2);\r\n\r\n // Text\r\n this.#portTextStyle.setupStyle(ctx, camera.zoom);\r\n ctx.fillText(port.getDisplayName(), rightSide - scaledPadding, position.y);\r\n\r\n // Port\r\n this.#outputPortPositions.Push(port.render(ctx, position, camera, mousePosition, postProcess));\r\n\r\n startY += tempMeasurement.y + scaledElementSpacing;\r\n }\r\n\r\n for (let i = 0; i < this.#widgets.length; i++) {\r\n const widget = this.#widgets[i];\r\n const widgetSize = widget.Size();\r\n const scaledWidgetWidth = widgetSize.x * camera.zoom;\r\n\r\n const position = VectorPool.get();\r\n position.x = nodeBounds.Position.x + ((nodeBounds.Size.x - scaledWidgetWidth) / 2);\r\n position.y = startY;\r\n\r\n this.#widgetPositions.Push(widget.Draw(ctx, position, camera.zoom, mousePosition));\r\n startY += (widgetSize.y * camera.zoom) + scaledElementSpacing;\r\n }\r\n })\r\n }\r\n}\r\n","export enum MarkdownTokenType {\r\n Text = \"Text\",\r\n H1 = \"H1\",\r\n H2 = \"H2\",\r\n H3 = \"H3\",\r\n NewLine = \"New Line\",\r\n Star = \"Star\",\r\n Space = \"Space\",\r\n BackTick = \"`\"\r\n}\r\n\r\nexport class MarkdownToken {\r\n\r\n #type: MarkdownTokenType;\r\n\r\n #lexeme: string\r\n\r\n #tokenStart: number\r\n\r\n #tokenEnd: number\r\n\r\n constructor(type: MarkdownTokenType, lexeme: string, tokenStart: number, tokenEnd: number) {\r\n this.#type = type;\r\n this.#lexeme = lexeme;\r\n this.#tokenStart = tokenStart;\r\n this.#tokenEnd = tokenEnd;\r\n }\r\n\r\n type(): MarkdownTokenType {\r\n return this.#type;\r\n }\r\n\r\n lexeme(): string {\r\n return this.#lexeme;\r\n }\r\n\r\n tokenStart(): number {\r\n return this.#tokenStart;\r\n }\r\n tokenEnd(): number {\r\n return this.#tokenEnd;\r\n }\r\n}\r\n","import { MarkdownToken, MarkdownTokenType } from \"./token\";\r\n\r\nexport class MarkdownLexicalParser {\r\n\r\n #body: string;\r\n\r\n #index: number\r\n\r\n #tokens: Array<MarkdownToken>;\r\n\r\n constructor(body: string) {\r\n this.#index = 0;\r\n this.#body = body;\r\n this.#tokens = new Array<MarkdownToken>();\r\n }\r\n\r\n tokens(): Array<MarkdownToken> {\r\n return this.#tokens;\r\n }\r\n\r\n #current(): string {\r\n if (this.#index > this.#body.length - 1) {\r\n return \"\"\r\n }\r\n return this.#body.charAt(this.#index);\r\n }\r\n\r\n #inc(): void {\r\n this.#index++\r\n }\r\n\r\n #next(): string {\r\n this.#index++\r\n if (this.#index > this.#body.length - 1) {\r\n return \"\"\r\n }\r\n return this.#body.charAt(this.#index);\r\n }\r\n\r\n #lastToken = 0;\r\n \r\n #addToken(token: MarkdownTokenType, lexeme: string): void {\r\n this.#tokens.push(new MarkdownToken(token, lexeme, this.#lastToken, this.#index));\r\n this.#lastToken = this.#index;\r\n }\r\n\r\n #h2(): void {\r\n let char = this.#next();\r\n if (char === \"#\") {\r\n this.#addToken(MarkdownTokenType.H3, \"###\");\r\n\r\n // Move it off the character for the next reading\r\n this.#inc();\r\n } else {\r\n this.#addToken(MarkdownTokenType.H2, \"##\");\r\n }\r\n }\r\n\r\n #h1(): void {\r\n let char = this.#next();\r\n if (char === \"#\") {\r\n this.#h2();\r\n } else {\r\n this.#addToken(MarkdownTokenType.H1, \"#\");\r\n }\r\n }\r\n\r\n #whiteSpace(): void {\r\n let char = this.#current();\r\n\r\n while (char !== \"\") {\r\n if (char !== \" \" && char !== \"\\t\") {\r\n break;\r\n }\r\n char = this.#next();\r\n }\r\n\r\n this.#addToken(MarkdownTokenType.Space, \" \")\r\n }\r\n\r\n #text(): void {\r\n let char = this.#current();\r\n\r\n let started = -1;\r\n\r\n while (char !== \"\") {\r\n if (char === \" \" || char === \"\\t\") {\r\n\r\n // Eat white space if we haven't seen anything yet!\r\n if (started === -1) {\r\n this.#inc();\r\n continue;\r\n }\r\n }\r\n\r\n // End of the line!\r\n if (char === \"\\n\" || char === \"*\" || char === \"`\") {\r\n if (started != -1) {\r\n this.#addToken(MarkdownTokenType.Text, this.#body.substring(started, this.#index))\r\n }\r\n return;\r\n }\r\n\r\n\r\n if (started === -1) {\r\n started = this.#index;\r\n }\r\n\r\n char = this.#next();\r\n }\r\n\r\n if (started != -1) {\r\n this.#addToken(MarkdownTokenType.Text, this.#body.substring(started, this.#index))\r\n }\r\n }\r\n\r\n // S( ) => S\r\n // S(\\t) => S\r\n // S(#) => H1\r\n // H1(#) => H2\r\n // H1(!#) => S\r\n // H2(#) => H3\r\n // H2(#) => H3\r\n parse(): void {\r\n let char = this.#current();\r\n\r\n while (char !== \"\") {\r\n if (char === \" \" || char === \"\\t\") {\r\n this.#whiteSpace();\r\n } else if (char === \"#\") {\r\n this.#h1();\r\n } else if (char === \"\\n\") {\r\n this.#addToken(MarkdownTokenType.NewLine, \"\\n\");\r\n this.#inc();\r\n } else if (char === \"*\") {\r\n this.#addToken(MarkdownTokenType.Star, \"*\");\r\n this.#inc();\r\n } else if (char === \"`\") {\r\n this.#addToken(MarkdownTokenType.BackTick, \"`\");\r\n this.#inc();\r\n } else {\r\n this.#text();\r\n }\r\n\r\n char = this.#current();\r\n }\r\n }\r\n}\r\n","import { Theme } from \"../theme\";\r\nimport { List } from \"../types/list\";\r\nimport { Text } from \"../types/text\";\r\nimport { CopyVector2, Vector2, Zero } from \"../types/vector2\";\r\n\r\nexport interface MarkdownEntry {\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, maxWidth: number): number\r\n}\r\n\r\nexport class CodeBlockEntry {\r\n\r\n #text: Text\r\n\r\n #calculatedPositions: List<Vector2>\r\n\r\n #calculatedEntries: List<Text>\r\n\r\n #calculatedForWidth: number;\r\n\r\n constructor(text: Text) {\r\n this.#text = text;\r\n this.#calculatedForWidth = -1\r\n\r\n this.#calculatedEntries = new List<Text>();\r\n this.#calculatedPositions = new List<Vector2>();\r\n\r\n document.fonts.addEventListener(\"loadingdone\", (event) => {\r\n this.#calculatedForWidth = -1\r\n });\r\n }\r\n\r\n #calculateLayout(ctx: CanvasRenderingContext2D, maxWidth: number): void {\r\n if (this.#calculatedForWidth === maxWidth) {\r\n return;\r\n }\r\n\r\n let adjustedWith = maxWidth;\r\n adjustedWith -= Theme.Note.CodeBlock.Padding * 2;\r\n\r\n this.#calculatedEntries.Clear();\r\n this.#calculatedPositions.Clear();\r\n\r\n let curHeight = 0;\r\n const lineInc = this.#text.style().getSize() + Theme.Note.LineSpacing;\r\n\r\n let entries = this.#text.split(\"\\n\")\r\n\r\n for (let entryIndex = 0; entryIndex < entries.length; entryIndex++) {\r\n const entry = entries[entryIndex];\r\n\r\n let lines = entry.breakIntoLines(ctx, adjustedWith);\r\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\r\n\r\n this.#calculatedEntries.Push(lines[lineIndex])\r\n this.#calculatedPositions.Push({\r\n x: 0,\r\n y: curHeight,\r\n })\r\n \r\n curHeight += lineInc;\r\n }\r\n }\r\n\r\n this.#calculatedForWidth = maxWidth;\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, maxWidth: number): number {\r\n this.#calculateLayout(ctx, maxWidth);\r\n\r\n let padding = Theme.Note.CodeBlock.Padding * scale;\r\n\r\n let max = 0;\r\n for (let i = 0; i < this.#calculatedEntries.Count(); i++) {\r\n const pos = this.#calculatedPositions.At(i);\r\n max = Math.max(max, pos.y * scale)\r\n }\r\n\r\n const y = position.y + max + (scale * 5)\r\n ctx.fillStyle = Theme.Note.CodeBlock.BackgroundColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x,\r\n position.y,\r\n maxWidth * scale,\r\n max + (padding * 2),\r\n Theme.Note.CodeBlock.BorderRadius * scale\r\n );\r\n ctx.fill();\r\n\r\n\r\n for (let i = 0; i < this.#calculatedEntries.Count(); i++) {\r\n const entry = this.#calculatedEntries.At(i);\r\n const pos = this.#calculatedPositions.At(i);\r\n\r\n entry.render(ctx, scale, {\r\n x: (pos.x * scale) + position.x + padding,\r\n y: (pos.y * scale) + position.y + padding\r\n });\r\n\r\n max = Math.max(max, pos.y * scale)\r\n }\r\n\r\n\r\n return max + (padding * 2);\r\n }\r\n}\r\n\r\nexport class UnorderedListMarkdownEntry {\r\n\r\n #entries: Array<BasicMarkdownEntry>;\r\n\r\n constructor(entries: Array<BasicMarkdownEntry>) {\r\n this.#entries = entries;\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, maxWidth: number): number {\r\n let offset = 0;\r\n let shift = 20;\r\n\r\n let pos = {\r\n x: position.x + (shift * scale),\r\n y: position.y\r\n }\r\n\r\n let dot = Theme.Note.DotSize * scale;\r\n\r\n for (let i = 0; i < this.#entries.length; i++) {\r\n\r\n ctx.beginPath();\r\n ctx.arc(position.x + dot, pos.y + (dot * 3), dot, 0, 2 * Math.PI);\r\n ctx.fill();\r\n\r\n offset += this.#entries[i].render(ctx, pos, scale, maxWidth - shift) + (scale * Theme.Note.LineSpacing * 2);\r\n pos.y = position.y + offset;\r\n }\r\n\r\n return offset;\r\n }\r\n}\r\n\r\nexport class BasicMarkdownEntry {\r\n\r\n #underline: boolean;\r\n\r\n #background: boolean;\r\n\r\n #entries: Array<Text>\r\n\r\n #calculatedPositions: List<Vector2>\r\n\r\n #calculatedEntries: List<Text>\r\n\r\n #calculatedForWidth: number;\r\n\r\n constructor(lines: Array<Text>, underline: boolean, background: boolean) {\r\n this.#entries = lines;\r\n this.#underline = underline;\r\n this.#background = background;\r\n this.#calculatedForWidth = -1\r\n\r\n this.#calculatedEntries = new List<Text>();\r\n this.#calculatedPositions = new List<Vector2>();\r\n\r\n document.fonts.addEventListener(\"loadingdone\", (event) => {\r\n this.#calculatedForWidth = -1\r\n });\r\n }\r\n\r\n #calculateLayout(ctx: CanvasRenderingContext2D, maxWidth: number): void {\r\n if (this.#calculatedForWidth === maxWidth) {\r\n return;\r\n }\r\n\r\n let adjustedWith = maxWidth;\r\n if (this.#background) {\r\n adjustedWith -= Theme.Note.CodeBlock.Padding * 2;\r\n }\r\n\r\n this.#calculatedEntries.Clear();\r\n this.#calculatedPositions.Clear();\r\n\r\n const curPosition: Vector2 = Zero();\r\n const texSize: Vector2 = Zero();\r\n\r\n let currentLineHeight = 0;\r\n const currentLineText = new List<Text>();\r\n const currentLineWidths = new List<number>();\r\n\r\n for (let entryIndex = 0; entryIndex < this.#entries.length; entryIndex++) {\r\n const entry = this.#entries[entryIndex];\r\n\r\n let lines = entry.splitAtWidth(ctx, adjustedWith - curPosition.x);\r\n let i = 0;\r\n while (lines.length > 1 && i < 100) {\r\n i++\r\n\r\n // We can't collapse this thing any further. Break out of the \r\n // while loop before we have infinite loop on our hands\r\n // if (lines[0].get() === \"\" && lines[1].get().length === 1) {\r\n // lines[0] = lines[1];\r\n // break;\r\n // }\r\n\r\n // We can't collapse this thing any further. Break out of the \r\n // while loop before we have infinite loop on our hands\r\n if (lines[0].get() === \"\" && currentLineText.Count() === 0) {\r\n\r\n if (lines[1].get().length === 1) {\r\n lines[0] = lines[1];\r\n break;\r\n } else {\r\n lines = lines[1].splitAtIndex(1);\r\n }\r\n\r\n }\r\n\r\n // This effectiviely finishes off the line we're currenly working on.\r\n if (lines[0].get() !== \"\") {\r\n lines[0].size(ctx, 1, texSize);\r\n currentLineHeight = Math.max(currentLineHeight, texSize.y);\r\n\r\n currentLineText.Push(lines[0]);\r\n currentLineWidths.Push(curPosition.x);\r\n }\r\n\r\n curPosition.y += currentLineHeight;\r\n\r\n // Take everything we're working with and finalize it\r\n for (let i = 0; i < currentLineText.Count(); i++) {\r\n this.#calculatedEntries.Push(currentLineText.At(i));\r\n this.#calculatedPositions.Push({ x: currentLineWidths.At(i), y: curPosition.y })\r\n }\r\n\r\n currentLineText.Clear();\r\n currentLineWidths.Clear();\r\n\r\n curPosition.y += Theme.Note.LineSpacing;\r\n currentLineHeight = 0;\r\n curPosition.x = 0;\r\n\r\n lines = lines[1].splitAtWidth(ctx, adjustedWith);\r\n }\r\n if (i === 100) {\r\n console.log(lines)\r\n }\r\n\r\n lines[0].size(ctx, 1, texSize);\r\n currentLineHeight = Math.max(currentLineHeight, texSize.y)\r\n\r\n currentLineText.Push(lines[0]);\r\n currentLineWidths.Push(curPosition.x);\r\n\r\n curPosition.x += texSize.x;\r\n }\r\n\r\n curPosition.y += currentLineHeight;\r\n\r\n // Take everything we're working with and finalize it\r\n for (let i = 0; i < currentLineText.Count(); i++) {\r\n this.#calculatedEntries.Push(currentLineText.At(i));\r\n this.#calculatedPositions.Push({ x: currentLineWidths.At(i), y: curPosition.y })\r\n }\r\n\r\n this.#calculatedForWidth = maxWidth;\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, maxWidth: number): number {\r\n this.#calculateLayout(ctx, maxWidth);\r\n\r\n let padding = 0;\r\n if (this.#background) {\r\n padding += Theme.Note.CodeBlock.Padding * scale;\r\n }\r\n\r\n\r\n if (this.#background) {\r\n let max = 0;\r\n for (let i = 0; i < this.#calculatedEntries.Count(); i++) {\r\n const pos = this.#calculatedPositions.At(i);\r\n max = Math.max(max, pos.y * scale)\r\n }\r\n\r\n const y = position.y + max + (scale * 5)\r\n ctx.fillStyle = Theme.Note.CodeBlock.BackgroundColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x,\r\n position.y,\r\n maxWidth * scale,\r\n max + (padding * 2),\r\n Theme.Note.CodeBlock.BorderRadius * scale\r\n );\r\n ctx.fill();\r\n }\r\n\r\n\r\n let max = 0;\r\n for (let i = 0; i < this.#calculatedEntries.Count(); i++) {\r\n const entry = this.#calculatedEntries.At(i);\r\n const pos = this.#calculatedPositions.At(i);\r\n\r\n entry.render(ctx, scale, {\r\n x: (pos.x * scale) + position.x + padding,\r\n y: (pos.y * scale) + position.y + padding\r\n });\r\n\r\n max = Math.max(max, pos.y * scale)\r\n }\r\n\r\n // Add underline \r\n if (this.#underline) {\r\n const y = position.y + max + (scale * 5)\r\n ctx.strokeStyle = Theme.Note.FontColor;\r\n ctx.lineWidth = Theme.Note.HeaderLineWidth * scale;\r\n ctx.beginPath();\r\n ctx.moveTo(position.x, y);\r\n ctx.lineTo(position.x + (maxWidth * scale), y);\r\n ctx.stroke();\r\n }\r\n\r\n return max + (padding * 2);\r\n }\r\n}\r\n","import { FontStyle, FontWeight, TextStyleConfig } from \"../styles/text\";\r\nimport { Theme } from \"../theme\";\r\nimport { Text } from \"../types/text\";\r\nimport { BasicMarkdownEntry, CodeBlockEntry, MarkdownEntry, UnorderedListMarkdownEntry } from \"./entry\";\r\nimport { MarkdownToken, MarkdownTokenType } from \"./token\";\r\n\r\nexport class MarkdownSyntaxParser {\r\n\r\n #tokens: Array<MarkdownToken>;\r\n\r\n #index: number;\r\n\r\n #originalText: string;\r\n\r\n constructor(originalText: string, tokens: Array<MarkdownToken>) {\r\n this.#originalText = originalText;\r\n this.#index = 0;\r\n this.#tokens = tokens;\r\n }\r\n\r\n #current(): MarkdownToken | null {\r\n if (this.#index > this.#tokens.length - 1) {\r\n return null\r\n }\r\n return this.#tokens[this.#index];\r\n }\r\n\r\n #inc(): void {\r\n this.#index++\r\n }\r\n\r\n #next(): MarkdownToken | null {\r\n this.#index++\r\n if (this.#index >= this.#tokens.length - 1) {\r\n return null\r\n }\r\n return this.#tokens[this.#index];\r\n }\r\n\r\n #peak(): MarkdownToken | null {\r\n if (this.#index + 1 >= this.#tokens.length - 1) {\r\n return null\r\n }\r\n return this.#tokens[this.#index + 1];\r\n }\r\n\r\n #peakInto(amount: number): MarkdownToken | null {\r\n if (this.#index + amount >= this.#tokens.length - 1) {\r\n return null\r\n }\r\n return this.#tokens[this.#index + amount];\r\n }\r\n\r\n #emphasis(): Array<Text> {\r\n\r\n // Cases to consider\r\n // =================\r\n // 1. *a*: <i>a</i>\r\n // 2. **a**: <b>a</b>\r\n // 3. **a*: *<i>a</i> <----- fuck this one\r\n // 4. ***a**: *<b>a</b> <----- fuck this one\r\n // 5. *a**: <i>a</i>*\r\n // 6. **a***: <b>a</b>*\r\n // 7. * a *: * a *\r\n // 8. ** a **: ** a **\r\n // 9. **a **: **a **\r\n // 10. **a f**: <b>a f<b>\r\n // 11. * Test: <ul>Test</ul> \r\n\r\n let token = this.#next();\r\n if (token?.type() === MarkdownTokenType.Space) {\r\n return [new Text(\"*\")];\r\n }\r\n\r\n let bold = false;\r\n // Read off all leading stars\r\n while (token !== null && token.type() === MarkdownTokenType.Star) {\r\n bold = true;\r\n token = this.#next();\r\n }\r\n\r\n let textContent = \"\";\r\n\r\n let boldClosed = false;\r\n let startingClose = false;\r\n let validClose = false;\r\n while (token !== null && token.type() !== MarkdownTokenType.NewLine) {\r\n if (token.type() === MarkdownTokenType.Star) {\r\n\r\n // This is the second star we've seen in a row. We're done!\r\n if (startingClose) {\r\n boldClosed = true;\r\n break;\r\n }\r\n\r\n // If we're not bold, we just need a single star to close this off.\r\n startingClose = true;\r\n if (bold === false) {\r\n break;\r\n }\r\n }\r\n\r\n if (startingClose && token.type() !== MarkdownTokenType.Star) {\r\n break;\r\n }\r\n\r\n // Add to string content...\r\n if (token.type() === MarkdownTokenType.Text) {\r\n textContent += token.lexeme();\r\n validClose = true;\r\n }\r\n\r\n if (token.type() === MarkdownTokenType.Space) {\r\n textContent += token.lexeme();\r\n validClose = false;\r\n }\r\n\r\n token = this.#next();\r\n }\r\n\r\n const style: TextStyleConfig = {}\r\n\r\n if (validClose && startingClose) {\r\n if (boldClosed) {\r\n style.weight = FontWeight.Bold;\r\n } else {\r\n style.style = FontStyle.Italic;\r\n }\r\n }\r\n\r\n return [new Text(textContent, style)]\r\n }\r\n\r\n #text(): Array<Text> {\r\n let contents: Array<Text> = new Array<Text>();\r\n let textContent = \"\";\r\n\r\n let token = this.#current();\r\n\r\n // Read off all starting whitespace \r\n while (token !== null && token.type() === MarkdownTokenType.Space) {\r\n token = this.#next();\r\n }\r\n\r\n while (token !== null && token.type() !== MarkdownTokenType.NewLine) {\r\n switch (token.type()) {\r\n case MarkdownTokenType.Text:\r\n case MarkdownTokenType.H1:\r\n case MarkdownTokenType.H2:\r\n case MarkdownTokenType.H3:\r\n case MarkdownTokenType.Space:\r\n textContent += token.lexeme();\r\n break;\r\n\r\n case MarkdownTokenType.Star:\r\n if (textContent !== \"\") {\r\n contents.push(new Text(textContent))\r\n textContent = \"\";\r\n }\r\n let starText = this.#emphasis()\r\n for (let i = 0; i < starText.length; i++) {\r\n contents.push(starText[i]);\r\n }\r\n break;\r\n }\r\n\r\n token = this.#next();\r\n }\r\n\r\n if (textContent !== \"\") {\r\n contents.push(new Text(textContent))\r\n }\r\n\r\n return contents;\r\n }\r\n\r\n #h1(): BasicMarkdownEntry {\r\n // Move off of the header token\r\n this.#inc();\r\n\r\n const text = this.#text();\r\n for (let i = 0; i < text.length; i++) {\r\n text[i].setColor(Theme.Note.FontColor);\r\n text[i].setSize(Theme.Note.H1.FontSize);\r\n text[i].setWeight(FontWeight.Bold);\r\n }\r\n\r\n return new BasicMarkdownEntry(text, true, false);\r\n }\r\n\r\n #h2(): BasicMarkdownEntry {\r\n // Move off of the header token\r\n this.#inc();\r\n\r\n const text = this.#text();\r\n for (let i = 0; i < text.length; i++) {\r\n text[i].setColor(Theme.Note.FontColor);\r\n text[i].setSize(Theme.Note.H2.FontSize);\r\n text[i].setWeight(FontWeight.Bold);\r\n }\r\n\r\n return new BasicMarkdownEntry(text, true, false);\r\n }\r\n\r\n #h3(): BasicMarkdownEntry {\r\n // Move off of the header token\r\n this.#inc();\r\n\r\n const text = this.#text();\r\n for (let i = 0; i < text.length; i++) {\r\n text[i].setColor(Theme.Note.FontColor);\r\n text[i].setSize(Theme.Note.H3.FontSize);\r\n text[i].setWeight(FontWeight.Bold);\r\n }\r\n\r\n return new BasicMarkdownEntry(text, false, false);\r\n }\r\n\r\n #starLineStart(): MarkdownEntry {\r\n if (this.#peak()?.type() !== MarkdownTokenType.Space) {\r\n const starEntries = this.#text();\r\n this.#assignStandardStyling(starEntries);\r\n return new BasicMarkdownEntry(starEntries, false, false);\r\n }\r\n\r\n // We've begun with a space, which means unordered list!\r\n\r\n const entries = new Array<BasicMarkdownEntry>();\r\n\r\n while (this.#current()?.type() === MarkdownTokenType.Star && this.#peak()?.type() === MarkdownTokenType.Space) {\r\n this.#inc();\r\n const starEntries = this.#text();\r\n this.#assignStandardStyling(starEntries);\r\n entries.push(new BasicMarkdownEntry(starEntries, false, false));\r\n\r\n // Text reads to the end of the line, which means we're at the new\r\n // line character. Move forward 1. \r\n this.#inc();\r\n }\r\n\r\n return new UnorderedListMarkdownEntry(entries);\r\n\r\n }\r\n\r\n #assignStandardStyling(textEntries: Array<Text>): void {\r\n for (let i = 0; i < textEntries.length; i++) {\r\n textEntries[i].setColor(Theme.Note.FontColor);\r\n textEntries[i].setSize(Theme.Note.FontSize);\r\n }\r\n }\r\n\r\n #backtickLineStart(): MarkdownEntry {\r\n\r\n // If we're not a ```, just treat as regular text\r\n if (this.#peak()?.type() !== MarkdownTokenType.BackTick || this.#peakInto(2)?.type() !== MarkdownTokenType.BackTick) {\r\n const starEntries = this.#text();\r\n this.#assignStandardStyling(starEntries);\r\n return new BasicMarkdownEntry(starEntries, false, false);\r\n }\r\n this.#inc();\r\n this.#inc();\r\n\r\n let token = this.#next();\r\n\r\n // Eat the first new line character\r\n if (token?.type() === MarkdownTokenType.NewLine) {\r\n token = this.#next();\r\n }\r\n\r\n let start = token?.tokenStart();\r\n let end = start;\r\n\r\n // Read until we hit another ``` \r\n while (token !== null) {\r\n\r\n if (\r\n token.type() === MarkdownTokenType.BackTick &&\r\n this.#peak()?.type() === MarkdownTokenType.BackTick &&\r\n this.#peakInto(2)?.type() === MarkdownTokenType.BackTick\r\n ) {\r\n end = token.tokenEnd() - 1;\r\n break;\r\n }\r\n\r\n token = this.#next();\r\n }\r\n\r\n this.#inc(); // puts us on the 2nd\r\n this.#inc(); // puts us on the 3rd\r\n this.#inc(); // puts us on the next token\r\n\r\n const codeBlockText = this.#originalText.substring(start as number, end);\r\n const entryText = new Text(codeBlockText);\r\n this.#assignStandardStyling([entryText])\r\n return new CodeBlockEntry(entryText)\r\n }\r\n\r\n parse(): Array<MarkdownEntry> {\r\n let token = this.#current();\r\n\r\n const entries = new Array<MarkdownEntry>();\r\n\r\n while (token !== null) {\r\n switch (token.type()) {\r\n case MarkdownTokenType.H1:\r\n entries.push(this.#h1());\r\n break;\r\n\r\n case MarkdownTokenType.H2:\r\n entries.push(this.#h2());\r\n break;\r\n\r\n case MarkdownTokenType.H3:\r\n entries.push(this.#h3());\r\n break;\r\n\r\n case MarkdownTokenType.Text:\r\n const textEntries = this.#text();\r\n this.#assignStandardStyling(textEntries);\r\n entries.push(new BasicMarkdownEntry(textEntries, false, false));\r\n break;\r\n\r\n case MarkdownTokenType.Star:\r\n entries.push(this.#starLineStart());\r\n break;\r\n\r\n case MarkdownTokenType.NewLine:\r\n this.#inc();\r\n break;\r\n\r\n case MarkdownTokenType.BackTick:\r\n entries.push(this.#backtickLineStart());\r\n break;\r\n\r\n default:\r\n this.#inc();\r\n }\r\n\r\n token = this.#current();\r\n }\r\n\r\n return entries;\r\n }\r\n}\r\n","import { MarkdownEntry } from \"./entry\";\r\nimport { MarkdownLexicalParser } from \"./lexicalParser\";\r\nimport { MarkdownSyntaxParser } from \"./syntaxParser\";\r\n\r\nexport function BuildMarkdown(data: string): Array<MarkdownEntry> {\r\n const lexicalParser = new MarkdownLexicalParser(data);\r\n lexicalParser.parse();\r\n // console.log(lexicalParser.tokens());\r\n\r\n const syntaxParser = new MarkdownSyntaxParser(data, lexicalParser.tokens());\r\n const contents = syntaxParser.parse()\r\n // console.log(contents);\r\n return contents;\r\n}","import { BuildMarkdown } from \"../markdown/markdown\";\r\nimport { MarkdownEntry } from \"../markdown/entry\";\r\nimport { Popup } from \"../popup\";\r\nimport { BoxStyle } from \"../styles/box\";\r\nimport { TextAlign } from \"../styles/canvasTextAlign\";\r\nimport { TextBaseline } from \"../styles/canvasTextBaseline\";\r\nimport { TextStyleConfig } from \"../styles/text\";\r\nimport { Theme } from \"../theme\";\r\nimport { Box } from \"../types/box\";\r\nimport { CopyVector2, Vector2, Zero } from \"../types/vector2\";\r\nimport { Camera } from \"../camera\";\r\nimport { Metadata } from \"../metadata\";\r\n\r\nexport type NoteContentChangeCallback = (node: FlowNote, newContents: string) => void\r\nexport type NoteWidthChangeCallback = (node: FlowNote, newWidth: number) => void\r\n\r\nexport interface FlowNoteConfig {\r\n text?: string;\r\n style?: TextStyleConfig;\r\n metadata?: Metadata;\r\n position?: Vector2;\r\n width?: number;\r\n locked?: boolean;\r\n onWidthChange?: NoteWidthChangeCallback;\r\n onContentChange?: NoteContentChangeCallback;\r\n}\r\n\r\nexport enum DragHandle {\r\n None,\r\n Left,\r\n Right\r\n};\r\n\r\nconst BOUNDS_SPACING = 20;\r\nconst BOX_SIZE = 10;\r\n\r\nexport class FlowNote {\r\n\r\n #originalText: string;\r\n\r\n #document: Array<MarkdownEntry>;\r\n\r\n #width: number;\r\n\r\n #edittingStyle: BoxStyle;\r\n\r\n // Runtime ================================================================\r\n\r\n #data: Metadata;\r\n\r\n #position: Vector2;\r\n\r\n #handleSelected: DragHandle;\r\n\r\n #edittingLayout: boolean;\r\n\r\n #lastRenderedBox: Box;\r\n\r\n #hovering: boolean;\r\n\r\n // Callbacks ==============================================================\r\n\r\n #widthChangeCallbacks: Array<NoteWidthChangeCallback>;\r\n\r\n #contentChangeCallbacks: Array<NoteContentChangeCallback>;\r\n\r\n // ========================================================================\r\n\r\n constructor(config?: FlowNoteConfig) {\r\n this.#widthChangeCallbacks = new Array<NoteWidthChangeCallback>();\r\n this.#contentChangeCallbacks = new Array<NoteContentChangeCallback>();\r\n this.#data = config?.metadata === undefined ? {} : config?.metadata;\r\n this.#document = [];\r\n this.#originalText = \"\";\r\n this.#hovering = false;\r\n this.#edittingLayout = config?.locked === undefined ? true : !config?.locked;\r\n this.#width = config?.width === undefined ? 500 : config.width;\r\n this.#position = config?.position === undefined ? { x: 0, y: 0 } : config.position;\r\n this.setText(config?.text === undefined ? \"\" : config?.text);\r\n this.#lastRenderedBox = { Position: { x: 0, y: 0 }, Size: { x: 0, y: 0 } };\r\n this.#handleSelected = DragHandle.None;\r\n\r\n this.#edittingStyle = new BoxStyle({\r\n border: {\r\n color: \"white\",\r\n size: 1\r\n },\r\n })\r\n\r\n if (config?.onWidthChange) {\r\n this.#widthChangeCallbacks.push(config.onWidthChange);\r\n }\r\n\r\n if (config?.onContentChange) {\r\n this.#contentChangeCallbacks.push(config.onContentChange);\r\n }\r\n }\r\n\r\n setText(text: string): void {\r\n this.#originalText = text;\r\n this.#document = BuildMarkdown(this.#originalText);\r\n for (let i = 0; i < this.#contentChangeCallbacks.length; i++) {\r\n this.#contentChangeCallbacks[i](this, text);\r\n }\r\n }\r\n\r\n public setMetadataProperty(name: string, value: any): void {\r\n this.#data[name] = value;\r\n }\r\n\r\n public getMetadataProperty(name: string): any {\r\n return this.#data[name];\r\n }\r\n\r\n text(): string {\r\n return this.#originalText;\r\n }\r\n\r\n width(): number {\r\n return this.#width;\r\n }\r\n\r\n position(): Vector2 {\r\n return this.#position;\r\n }\r\n\r\n translate(delta: Vector2): void {\r\n this.#position.x += delta.x;\r\n this.#position.y += delta.y;\r\n }\r\n\r\n setPosition(position: Vector2): void {\r\n CopyVector2(this.#position, position);\r\n }\r\n\r\n handleSelected(): DragHandle {\r\n return this.#handleSelected;\r\n }\r\n\r\n selectHandle(handle: DragHandle): void {\r\n this.#handleSelected = handle;\r\n }\r\n\r\n #tempPosition: Vector2 = Zero();\r\n\r\n public setWidth(newWidth: number): void {\r\n if (newWidth === undefined) {\r\n console.error(\"Attempted to set note's width to undefined\");\r\n }\r\n this.#width = newWidth;\r\n for (let i = 0; i < this.#widthChangeCallbacks.length; i++) {\r\n this.#widthChangeCallbacks[i](this, newWidth);\r\n }\r\n }\r\n\r\n public addWidthChangeListener(callback: NoteWidthChangeCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#widthChangeCallbacks.push(callback);\r\n }\r\n\r\n public addContentChangeListener(callback: NoteContentChangeCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#contentChangeCallbacks.push(callback);\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): void {\r\n if (this.#edittingLayout && (this.#hovering || this.#handleSelected !== DragHandle.None)) {\r\n\r\n if (mousePosition) {\r\n if (this.#handleSelected === DragHandle.Right) {\r\n\r\n const leftPosition = (this.#position.x * camera.zoom) + camera.position.x;\r\n this.setWidth(Math.max((mousePosition.x - leftPosition) / camera.zoom, 1));\r\n\r\n } else if (this.#handleSelected === DragHandle.Left) {\r\n\r\n const scaledWidth = this.#width * camera.zoom;\r\n const rightPosition = (this.#position.x * camera.zoom) + camera.position.x + scaledWidth;\r\n this.setWidth(Math.max((rightPosition - mousePosition.x) / camera.zoom, 1));\r\n this.#position.x = rightPosition - (this.#width * camera.zoom) - camera.position.x;\r\n this.#position.x /= camera.zoom;\r\n }\r\n }\r\n\r\n this.#edittingStyle.Outline(ctx, this.leftResizeHandleBox(), camera.zoom, 2);\r\n this.#edittingStyle.Outline(ctx, this.rightResizeHandleBox(), camera.zoom, 2);\r\n\r\n ctx.beginPath();\r\n const left = this.#lastRenderedBox.Position.x;\r\n const right = this.#lastRenderedBox.Position.x + this.#lastRenderedBox.Size.x;\r\n const bottom = this.#lastRenderedBox.Position.y;\r\n const top = this.#lastRenderedBox.Position.y + this.#lastRenderedBox.Size.y;\r\n ctx.moveTo(left, bottom + (this.#lastRenderedBox.Size.y / 2) - (BOX_SIZE));\r\n ctx.lineTo(left, bottom);\r\n ctx.lineTo(right, bottom);\r\n ctx.lineTo(right, bottom + (this.#lastRenderedBox.Size.y / 2) - (BOX_SIZE));\r\n\r\n ctx.moveTo(left, top - (this.#lastRenderedBox.Size.y / 2) + (BOX_SIZE));\r\n ctx.lineTo(left, top);\r\n ctx.lineTo(right, top);\r\n ctx.lineTo(right, top - (this.#lastRenderedBox.Size.y / 2) + (BOX_SIZE));\r\n ctx.stroke();\r\n // this.#edittingStyle.Outline(ctx, bigBox, camera.zoom, 2);\r\n }\r\n\r\n camera.graphSpaceToScreenSpace(this.#position, this.#tempPosition);\r\n CopyVector2(this.#lastRenderedBox.Position, this.#tempPosition)\r\n\r\n const startY = this.#tempPosition.y;\r\n const lineSpacing = Theme.Note.EntrySpacing * camera.zoom;\r\n\r\n ctx.textAlign = TextAlign.Left;\r\n ctx.textBaseline = TextBaseline.Alphabetic;\r\n for (let i = 0; i < this.#document.length; i++) {\r\n const text = this.#document[i];\r\n this.#tempPosition.y += text.render(ctx, this.#tempPosition, camera.zoom, this.#width) + lineSpacing;\r\n }\r\n\r\n this.#lastRenderedBox.Position.x -= BOUNDS_SPACING\r\n this.#lastRenderedBox.Position.y -= BOUNDS_SPACING\r\n this.#lastRenderedBox.Size.x = camera.zoom * this.#width + (BOUNDS_SPACING * 2);\r\n this.#lastRenderedBox.Size.y = this.#tempPosition.y - startY + (BOUNDS_SPACING * 2);\r\n }\r\n\r\n leftResizeHandleBox(): Box {\r\n return {\r\n Position: {\r\n x: this.#lastRenderedBox.Position.x - (BOX_SIZE / 2),\r\n y: this.#lastRenderedBox.Position.y + (this.#lastRenderedBox.Size.y / 2) - (BOX_SIZE / 2),\r\n },\r\n Size: { x: BOX_SIZE, y: BOX_SIZE, }\r\n };\r\n }\r\n\r\n rightResizeHandleBox(): Box {\r\n return {\r\n Position: {\r\n x: this.#lastRenderedBox.Position.x - (BOX_SIZE / 2) + this.#lastRenderedBox.Size.x,\r\n y: this.#lastRenderedBox.Position.y + (this.#lastRenderedBox.Size.y / 2) - (BOX_SIZE / 2),\r\n },\r\n Size: { x: BOX_SIZE, y: BOX_SIZE, }\r\n };\r\n }\r\n\r\n edittingLayout(): boolean {\r\n return this.#edittingLayout;\r\n }\r\n\r\n setHovering(hovering: boolean): void {\r\n this.#hovering = hovering;\r\n }\r\n\r\n editContent(): void {\r\n let input: HTMLTextAreaElement | null = null;\r\n let saveText = \"Save\";\r\n\r\n const popup = new Popup({\r\n title: \"Edit Note\",\r\n options: [saveText, \"Cancel\"],\r\n content: () => {\r\n const container = document.createElement('div');\r\n input = document.createElement('textarea')\r\n input.rows = 8;\r\n input.cols = 50;\r\n input.value = this.#originalText;\r\n container.append(input);\r\n return container;\r\n },\r\n onClose: (button: string | null): void => {\r\n if (button !== saveText || input === null) {\r\n return;\r\n }\r\n this.setText(input.value);\r\n },\r\n });\r\n\r\n popup.Show();\r\n }\r\n\r\n lock(): void {\r\n this.#edittingLayout = false;\r\n }\r\n\r\n unlock(): void {\r\n this.#edittingLayout = true;\r\n }\r\n\r\n bounds(): Box {\r\n return this.#lastRenderedBox;\r\n }\r\n}","import { Camera } from \"../camera\";\r\nimport { ContextMenuConfig } from \"../contextMenu\";\r\nimport { RenderResults } from \"../graphSubsystem\";\r\nimport { InBox } from \"../types/box\";\r\nimport { Vector2 } from \"../types/vector2\";\r\nimport { DragHandle, FlowNote, FlowNoteConfig } from './note';\r\n\r\n\r\nexport type NoteAddedCallback = (addedNote: FlowNote) => void\r\nexport type NoteRemovedCallback = (noteRemoved: FlowNote) => void\r\n\r\nexport type NoteDragStartCallback = (nodeDragged: FlowNote) => void\r\nexport type NoteDragStopCallback = (nodeDragged: FlowNote) => void\r\n\r\n\r\nexport interface NoteSubsystemConfig {\r\n onNoteAdded?: NoteAddedCallback;\r\n onNoteRemoved?: NoteRemovedCallback;\r\n onNoteDragStop?: NoteDragStopCallback\r\n onNoteDragStart?: NoteDragStartCallback\r\n notes?: Array<FlowNoteConfig>\r\n}\r\n\r\nexport class NoteSubsystem {\r\n\r\n #notes: Array<FlowNote>;\r\n\r\n #noteHovering: FlowNote | null;\r\n\r\n #noteSelected: FlowNote | null;\r\n\r\n #hoveringHandle: DragHandle;\r\n\r\n #onNoteAddedCallbacks: Array<NoteAddedCallback>;\r\n\r\n #onNoteRemovedCallbacks: Array<NoteRemovedCallback>;\r\n\r\n #onNoteDragStartCallbacks: Array<NoteDragStartCallback>;\r\n\r\n #onNoteDragStopCallbacks: Array<NoteDragStopCallback>;\r\n\r\n constructor(config?: NoteSubsystemConfig) {\r\n this.#hoveringHandle = DragHandle.None;\r\n this.#notes = [];\r\n this.#noteHovering = null;\r\n this.#noteSelected = null;\r\n\r\n // Callbacks\r\n this.#onNoteAddedCallbacks = new Array<NoteAddedCallback>();\r\n this.#onNoteRemovedCallbacks = new Array<NoteRemovedCallback>();\r\n this.#onNoteDragStartCallbacks = new Array<NoteDragStartCallback>();\r\n this.#onNoteDragStopCallbacks = new Array<NoteDragStopCallback>();\r\n\r\n if (config?.notes !== undefined) {\r\n for (let i = 0; i < config?.notes.length; i++) {\r\n this.addNote(new FlowNote(config?.notes[i]));\r\n }\r\n }\r\n\r\n // Add callback *after* we added all the initial notes\r\n if (config?.onNoteAdded !== undefined) {\r\n this.#onNoteAddedCallbacks.push(config?.onNoteAdded);\r\n }\r\n\r\n if (config?.onNoteDragStop !== undefined) {\r\n this.#onNoteDragStopCallbacks.push(config?.onNoteDragStop);\r\n }\r\n\r\n if (config?.onNoteDragStart !== undefined) {\r\n this.#onNoteDragStartCallbacks.push(config?.onNoteDragStart);\r\n }\r\n\r\n if (config?.onNoteRemoved !== undefined) {\r\n this.#onNoteRemovedCallbacks.push(config?.onNoteRemoved);\r\n }\r\n }\r\n\r\n addNote(note: FlowNote): void {\r\n if (note === null || note === undefined) {\r\n return;\r\n }\r\n\r\n this.#notes.push(note);\r\n for (let i = 0; i < this.#onNoteAddedCallbacks.length; i++) {\r\n this.#onNoteAddedCallbacks[i](note);\r\n }\r\n }\r\n\r\n public addNoteAddedListener(callback: NoteAddedCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#onNoteAddedCallbacks.push(callback);\r\n }\r\n\r\n public addNoteRemovedListener(callback: NoteRemovedCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#onNoteRemovedCallbacks.push(callback);\r\n }\r\n\r\n public addNoteDragStartListener(callback: NoteDragStartCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#onNoteDragStartCallbacks.push(callback);\r\n }\r\n\r\n public addNoteDragStopListener(callback: NoteDragStopCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#onNoteDragStopCallbacks.push(callback);\r\n }\r\n\r\n openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig | null {\r\n const group = \"node-flow-graph-note-menu\";\r\n\r\n const result: ContextMenuConfig = {\r\n items: [\r\n {\r\n name: \"New Note\",\r\n group: group,\r\n callback: () => {\r\n this.addNote(new FlowNote({\r\n text: \"#Note\\n\\nRight-click this note and select \\\"edit note\\\" to put what you want here.\",\r\n width: 300,\r\n position: position\r\n }))\r\n }\r\n }\r\n ],\r\n subMenus: [],\r\n }\r\n\r\n if (this.#noteHovering !== null) {\r\n const noteToReview = this.#noteHovering;\r\n result.items?.push(\r\n {\r\n name: \"Delete Note\",\r\n group: group,\r\n callback: () => {\r\n this.removeNote(noteToReview);\r\n }\r\n },\r\n {\r\n name: \"Edit Note\",\r\n group: group,\r\n callback: noteToReview.editContent.bind(noteToReview),\r\n },\r\n );\r\n\r\n if (!noteToReview.edittingLayout()) {\r\n result.items?.push({\r\n name: \"Unlock Note\",\r\n group: group,\r\n callback: noteToReview.unlock.bind(noteToReview),\r\n })\r\n } else {\r\n result.items?.push({\r\n name: \"Lock Note\",\r\n group: group,\r\n callback: noteToReview.lock.bind(noteToReview),\r\n })\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean): boolean {\r\n if (this.#noteHovering !== null && this.#noteHovering.edittingLayout()) {\r\n this.#noteSelected = this.#noteHovering;\r\n this.#noteSelected.selectHandle(this.#hoveringHandle);\r\n\r\n for (let i = 0; i < this.#onNoteDragStartCallbacks.length; i++) {\r\n this.#onNoteDragStartCallbacks[i](this.#noteSelected);\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n clickEnd(): void {\r\n if (this.#noteSelected !== null) {\r\n this.#noteSelected.selectHandle(DragHandle.None);\r\n for (let i = 0; i < this.#onNoteDragStopCallbacks.length; i++) {\r\n this.#onNoteDragStopCallbacks[i](this.#noteSelected);\r\n }\r\n }\r\n this.#noteSelected = null;\r\n }\r\n\r\n mouseDragEvent(delta: Vector2, scale: number): boolean {\r\n if (this.#noteSelected === null) {\r\n return false;\r\n }\r\n\r\n // Return early so we don't translate since we're moving a drag handle\r\n if (this.#noteSelected.handleSelected()) {\r\n return true;\r\n }\r\n\r\n this.#noteSelected.translate({\r\n x: delta.x * (1 / scale),\r\n y: delta.y * (1 / scale)\r\n });\r\n return true;\r\n }\r\n\r\n fileDrop(file: File): boolean {\r\n return false;\r\n }\r\n\r\n removeNote(note: FlowNote): void {\r\n const index = this.#notes.indexOf(note);\r\n if (index > -1) {\r\n const noteRemoved = this.#notes[index];\r\n this.#notes.splice(index, 1);\r\n\r\n for (let i = 0; i < this.#onNoteRemovedCallbacks.length; i++) {\r\n this.#onNoteRemovedCallbacks[i](noteRemoved)\r\n }\r\n } else {\r\n console.error(\"no note found to remove\");\r\n }\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults | undefined {\r\n this.#noteHovering = null;\r\n this.#hoveringHandle = DragHandle.None;\r\n\r\n // Set hovering to false on everything\r\n if (mousePosition) {\r\n for (let i = 0; i < this.#notes.length; i++) {\r\n this.#notes[i].setHovering(false);\r\n if (InBox(this.#notes[i].bounds(), mousePosition)) {\r\n this.#noteHovering = this.#notes[i];\r\n }\r\n }\r\n }\r\n\r\n // The note on top of everything is the one that get's to be in a \r\n // hover state\r\n if (this.#noteHovering != null) {\r\n this.#noteHovering.setHovering(true);\r\n if (mousePosition) {\r\n if (InBox(this.#noteHovering.leftResizeHandleBox(), mousePosition)) {\r\n this.#hoveringHandle = DragHandle.Left;\r\n } else if (InBox(this.#noteHovering.rightResizeHandleBox(), mousePosition)) {\r\n this.#hoveringHandle = DragHandle.Right;\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.#notes.length; i++) {\r\n this.#notes[i].render(ctx, camera, mousePosition);\r\n }\r\n return;\r\n }\r\n}","import { Camera } from \"../camera\";\r\nimport { ContextMenuConfig } from \"../contextMenu\";\r\nimport { RenderResults } from \"../graphSubsystem\";\r\nimport { List } from \"../types/list\";\r\nimport { Vector2 } from \"../types/vector2\";\r\n\r\ntype RenderLambda = () => void\r\n\r\n\r\n/**\r\n * Generic subsystem meant for other sybsystems to pass whatever to to render \r\n * at a certain time.\r\n * \r\n * Initial inspriation is for a subsytem to submit something to render on top \r\n * of all other subsystems.\r\n */\r\nexport class PassSubsystem {\r\n\r\n #queue: List<RenderLambda>\r\n\r\n constructor() {\r\n this.#queue = new List<RenderLambda>();\r\n }\r\n\r\n queue(lambda: RenderLambda): void {\r\n if(!lambda) {\r\n return;\r\n }\r\n this.#queue.Push(lambda);\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults | undefined {\r\n for (let i = 0; i < this.#queue.Count(); i++) {\r\n this.#queue.At(i)();\r\n }\r\n this.#queue.Clear();\r\n return;\r\n }\r\n\r\n openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig | null {\r\n // Left intentionally blank\r\n return null;\r\n }\r\n\r\n clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean): boolean {\r\n // Left intentionally blank\r\n return false;\r\n }\r\n\r\n mouseDragEvent(delta: Vector2, scale: number): boolean {\r\n // Left intentionally blank\r\n return false;\r\n }\r\n\r\n fileDrop(file: File): boolean {\r\n // Left intentionally blank\r\n return false;\r\n }\r\n\r\n clickEnd(): void {\r\n // Left intentionally blank\r\n }\r\n\r\n}","import { ContextMenuConfig, ContextMenuItemConfig } from \"./contextMenu\";\r\nimport { ContainerRenderElement as ContainerElement } from \"./elements/container\";\r\nimport { IRenderElement } from \"./elements/interfaces\";\r\nimport { TextAlign, TextElement as TextElement, VerticalAlign } from \"./elements/text\";\r\nimport { FontWeight } from \"./styles/text\";\r\nimport { Theme } from \"./theme\";\r\nimport { Text } from './types/text';\r\nimport { ScaleVector, Vector2 } from './types/vector2';\r\nimport { Display } from './elements/base';\r\n\r\nclass QuickMenuGroup {\r\n\r\n #text: TextElement;\r\n\r\n public items: Array<QuickMenuItem>;\r\n\r\n constructor(text: TextElement, items: Array<QuickMenuItem>) {\r\n this.#text = text;\r\n this.items = items;\r\n }\r\n\r\n updateRendering(terms: Array<string>): void {\r\n let shouldRender = false;\r\n for (let i = 0; i < this.items.length; i++) {\r\n const kept = this.items[i].filter(terms);\r\n this.items[i].render(kept);\r\n if (kept) {\r\n shouldRender = true;\r\n }\r\n }\r\n\r\n this.#text.setDisplay(shouldRender ? Display.Flex : Display.None);\r\n }\r\n\r\n}\r\n\r\nclass QuickMenuItem {\r\n #searchText: string;\r\n #text: TextElement;\r\n #context: ContextMenuItemConfig\r\n\r\n constructor(searchText: string, text: TextElement, context: ContextMenuItemConfig) {\r\n this.#searchText = searchText.toLowerCase();\r\n this.#text = text;\r\n this.#context = context;\r\n }\r\n\r\n filter(terms: Array<string>): boolean {\r\n if (terms.length === 0) {\r\n return true;\r\n }\r\n for (let i = 0; i < terms.length; i++) {\r\n if (terms[i] === \"\") {\r\n continue;\r\n }\r\n\r\n if (this.#searchText.indexOf(terms[i]) === -1) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n render(render: boolean): void {\r\n this.#text.setDisplay(render ? Display.Flex : Display.None);\r\n }\r\n\r\n rendering(): boolean {\r\n return this.#text.getDisplay() === Display.Flex;\r\n }\r\n\r\n highlight(highlight: boolean): void {\r\n this.#text.setBackgroundColor(highlight ? Theme.ContextMenu.HighlightColor : \"\");\r\n }\r\n\r\n select(): void {\r\n if (this.#context.callback) {\r\n this.#context.callback()\r\n }\r\n }\r\n}\r\n\r\nfunction RecurseBuildContainers(\r\n path: string,\r\n config: ContextMenuConfig,\r\n renderElements: Array<IRenderElement>,\r\n groups: Array<QuickMenuGroup>\r\n): void {\r\n\r\n let currentPath = config?.name ?? \"\";\r\n if (path !== \"\") {\r\n currentPath = path + \" / \" + currentPath;\r\n }\r\n\r\n if (config?.items && config.items.length > 0) {\r\n const titleText = new TextElement(\r\n new Text(\r\n currentPath,\r\n {\r\n color: Theme.ContextMenu.FontColor,\r\n weight: FontWeight.Bold,\r\n size: 12,\r\n }\r\n ),\r\n {\r\n Align: TextAlign.Center,\r\n VerticalAlign: VerticalAlign.Center,\r\n Padding: 16\r\n }\r\n );\r\n renderElements.push(titleText);\r\n\r\n const quickItems = new Array<QuickMenuItem>();\r\n\r\n for (let i = 0; i < config.items.length; i++) {\r\n const configItem = config.items[i];\r\n\r\n const itemText = new TextElement(\r\n new Text(\r\n configItem.name ?? \"Item\",\r\n {\r\n color: Theme.ContextMenu.FontColor,\r\n }\r\n ),\r\n {\r\n Padding: 8\r\n }\r\n );\r\n\r\n quickItems.push(new QuickMenuItem(\r\n currentPath + (configItem.name ?? \"\"),\r\n itemText,\r\n configItem\r\n ));\r\n\r\n renderElements.push(itemText);\r\n }\r\n\r\n groups.push(new QuickMenuGroup(titleText, quickItems));\r\n }\r\n\r\n if (config?.subMenus) {\r\n for (let i = 0; i < config?.subMenus.length; i++) {\r\n const configItem = config?.subMenus[i];\r\n RecurseBuildContainers(currentPath, configItem, renderElements, groups);\r\n }\r\n }\r\n}\r\n\r\nexport class QuickMenu {\r\n\r\n #menuGroups: Array<QuickMenuGroup>\r\n\r\n #container: ContainerElement\r\n\r\n #searchText: Text;\r\n\r\n #currentSelection: number;\r\n\r\n constructor(config?: ContextMenuConfig) {\r\n this.#menuGroups = [];\r\n this.#currentSelection = 0;\r\n\r\n this.#searchText = new Text(\r\n \"\",\r\n {\r\n color: Theme.ContextMenu.FontColor,\r\n }\r\n );\r\n\r\n const elements = [\r\n new TextElement(\r\n new Text(\r\n \"Search\",\r\n {\r\n color: Theme.ContextMenu.FontColor,\r\n }\r\n ),\r\n {\r\n Padding: {\r\n Bottom: 0,\r\n Left: 8,\r\n Right: 8,\r\n Top: 8\r\n },\r\n }\r\n ),\r\n\r\n // Search Box...\r\n new ContainerElement(\r\n [\r\n new TextElement(\r\n this.#searchText,\r\n undefined\r\n ),\r\n ],\r\n {\r\n Border: {\r\n Radius: 2,\r\n },\r\n BackgroundColor: \"#003847\",\r\n Padding: 8,\r\n Margin: 8,\r\n MinHeight: 46,\r\n }\r\n ),\r\n ]\r\n\r\n if (config) {\r\n RecurseBuildContainers(\"\", config, elements, this.#menuGroups);\r\n }\r\n\r\n this.#container = new ContainerElement(\r\n elements,\r\n {\r\n BackgroundColor: Theme.ContextMenu.BackgroundColor,\r\n Border: {\r\n Thickness: 1,\r\n Radius: 4\r\n }\r\n }\r\n )\r\n\r\n this.#updateHighlighting();\r\n }\r\n\r\n execute(): void {\r\n let selection = this.#currentSelection;\r\n\r\n for (let groupIndex = 0; groupIndex < this.#menuGroups.length; groupIndex++) {\r\n const group = this.#menuGroups[groupIndex];\r\n\r\n for (let itemIndex = 0; itemIndex < group.items.length; itemIndex++) {\r\n if (group.items[itemIndex].rendering()) {\r\n if (selection === 0) {\r\n group.items[itemIndex].select();\r\n return;\r\n }\r\n selection--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n #updateHighlighting(): void {\r\n const searchText = this.#searchText\r\n .get()\r\n .trim()\r\n .toLowerCase();\r\n\r\n let terms = new Array<string>();\r\n if (searchText !== \"\") {\r\n var potentialTerms = searchText.split(\" \");\r\n for (let i = 0; i < potentialTerms.length; i++) {\r\n const cleaned = potentialTerms[i].trim();\r\n if (cleaned !== \"\") {\r\n terms.push(cleaned);\r\n }\r\n }\r\n }\r\n\r\n let selection = this.#currentSelection;\r\n\r\n for (let groupIndex = 0; groupIndex < this.#menuGroups.length; groupIndex++) {\r\n const group = this.#menuGroups[groupIndex];\r\n group.updateRendering(terms);\r\n\r\n for (let itemIndex = 0; itemIndex < group.items.length; itemIndex++) {\r\n if (group.items[itemIndex].rendering()) {\r\n group.items[itemIndex].highlight(selection === 0)\r\n selection--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n keyboardEvent(event: KeyboardEvent): void {\r\n\r\n let intercepted = true;\r\n\r\n if (event.code === \"Backspace\") {\r\n this.#currentSelection = 0;\r\n const text = this.#searchText.get();\r\n this.#searchText.set(text.slice(0, text.length - 1));\r\n } else if (/^[a-zA-Z0-9]$/.test(event.key) || event.key === \" \") {\r\n this.#currentSelection = 0;\r\n this.#searchText.set(this.#searchText.get() + event.key);\r\n } else if (event.key === \"ArrowUp\") {\r\n this.#currentSelection = Math.max(0, this.#currentSelection - 1);\r\n } else if (event.key === \"ArrowDown\") {\r\n this.#currentSelection ++;\r\n } else {\r\n intercepted = false;\r\n }\r\n\r\n if (intercepted) {\r\n this.#updateHighlighting();\r\n event.preventDefault();\r\n }\r\n\r\n // console.log(event);\r\n }\r\n\r\n renderSize = { x: 0, y: 0 };\r\n\r\n public render(ctx: CanvasRenderingContext2D, pos: Vector2, graphScale: number, mousePosition: Vector2 | undefined): null {\r\n this.#container.calcSize(ctx, this.renderSize, { x: -1, y: -1 });\r\n // ScaleVector(this.renderSize, graphScale);\r\n\r\n // Clamp the position so it's not spilling off the canvas\r\n if (pos.y + Math.min(this.renderSize.y, 400) > ctx.canvas.clientHeight) {\r\n pos.y = ctx.canvas.clientHeight - Math.min(this.renderSize.y, 400);\r\n }\r\n\r\n if (pos.x + this.renderSize.x > ctx.canvas.clientWidth) {\r\n pos.x = ctx.canvas.clientWidth - this.renderSize.x;\r\n }\r\n\r\n if (pos.y < 0) {\r\n pos.y = 0;\r\n }\r\n\r\n if (pos.x < 0) {\r\n pos.x = 0;\r\n }\r\n\r\n this.#container.render(ctx, pos, 1, this.renderSize);\r\n return null;\r\n }\r\n}\r\n","import { CombineContextMenus, ContextEntry, ContextMenu, ContextMenuConfig } from './contextMenu';\r\nimport { Theme } from \"./theme\";\r\nimport { MouseObserver } from \"./input\";\r\nimport { FlowNode } from \"./node\";\r\nimport { NodeCreatedCallback, NodeFactoryConfig } from \"./nodes/factory\";\r\nimport { TimeExecution } from \"./performance\";\r\nimport { CursorStyle } from \"./styles/cursor\";\r\nimport { CopyVector2, Vector2, Zero } from './types/vector2';\r\nimport { Clamp01 } from \"./utils/math\";\r\nimport { GraphSubsystem, RenderResults } from './graphSubsystem';\r\nimport { FlowNote } from \"./notes/note\";\r\nimport { NoteAddedCallback, NoteDragStartCallback, NoteDragStopCallback, NoteRemovedCallback, NoteSubsystem, NoteSubsystemConfig } from \"./notes/subsystem\";\r\nimport { ConnectionRendererConfiguration, NodeAddedCallback, NodeRemovedCallback, NodeSubsystem } from \"./nodes/subsystem\";\r\nimport { Connection } from './connection';\r\nimport { Publisher } from './nodes/publisher';\r\nimport { VectorPool } from './types/pool';\r\nimport { Camera } from './camera';\r\nimport { PassSubsystem } from './pass/subsystem';\r\nimport { QuickMenu } from './quickMenu';\r\n\r\nexport type GraphRenderer = (canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D, position: Vector2, scale: number) => void;\r\n\r\nfunction BuildBackgroundRenderer(backgroundColor: string): GraphRenderer {\r\n return (canvas: HTMLCanvasElement, context: CanvasRenderingContext2D, position: Vector2, scale: number) => {\r\n context.fillStyle = backgroundColor;\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n const alpha = Math.round(Clamp01(scale - 0.3) * 255)\r\n if (alpha <= 0) {\r\n return;\r\n }\r\n\r\n context.fillStyle = `rgba(41, 54, 57, ${alpha})`;\r\n const spacing = 100;\r\n const pi2 = 2 * Math.PI\r\n const dotScale = 2 * scale;\r\n for (let x = -50; x < 50; x++) {\r\n const xPos = (x * spacing * scale) + position.x;\r\n for (let y = -50; y < 50; y++) {\r\n const yPos = (y * spacing * scale) + position.y;\r\n context.beginPath();\r\n context.arc(xPos, yPos, dotScale, 0, pi2);\r\n context.fill();\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst contextMenuGroup = \"graph-context-menu\";\r\n\r\nexport interface FlowNodeGraphConfiguration {\r\n backgroundRenderer?: GraphRenderer;\r\n backgroundColor?: string;\r\n idleConnection?: ConnectionRendererConfiguration\r\n contextMenu?: ContextMenuConfig\r\n nodes?: NodeFactoryConfig\r\n board?: NoteSubsystemConfig\r\n}\r\n\r\ninterface OpenContextMenu {\r\n Menu: ContextMenu\r\n Position: Vector2\r\n}\r\n\r\ninterface OpenQuickMenu {\r\n Menu: QuickMenu\r\n Position: Vector2\r\n}\r\n\r\nclass GraphView {\r\n\r\n #subsystems: Array<GraphSubsystem>;\r\n\r\n constructor(subsystems: Array<GraphSubsystem>) {\r\n this.#subsystems = subsystems;\r\n }\r\n\r\n clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean) {\r\n // Since the graph is rendered from 0 => n, n is the last thing \r\n // rendererd and is always shown to the user. So if their clicking on\r\n // two things technically, we need to make sure it's whatever was most \r\n // recently rendered. So we traverse n => 0. \r\n for (let i = this.#subsystems.length - 1; i >= 0; i--) {\r\n // If the user sucesfully clicked on something in this layer, don't\r\n // check any more layers.\r\n if (this.#subsystems[i].clickStart(mousePosition, camera, ctrlKey)) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n fileDrop(file: File): boolean {\r\n for (let i = this.#subsystems.length - 1; i >= 0; i--) {\r\n if (this.#subsystems[i].fileDrop(file)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig {\r\n let finalConfig: ContextMenuConfig = {};\r\n\r\n for (let i = 0; i < this.#subsystems.length; i++) {\r\n const subSystemMenu = this.#subsystems[i].openContextMenu(ctx, position);\r\n if (subSystemMenu !== null) {\r\n finalConfig = CombineContextMenus(finalConfig, subSystemMenu);\r\n }\r\n }\r\n\r\n return finalConfig;\r\n }\r\n\r\n clickEnd(): void {\r\n for (let i = 0; i < this.#subsystems.length; i++) {\r\n this.#subsystems[i].clickEnd();\r\n }\r\n }\r\n\r\n mouseDragEvent(delta: Vector2, scale: number): boolean {\r\n for (let i = 0; i < this.#subsystems.length; i++) {\r\n if (this.#subsystems[i].mouseDragEvent(delta, scale)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults {\r\n const results: RenderResults = {};\r\n for (let i = 0; i < this.#subsystems.length; i++) {\r\n TimeExecution(\"Render_Subsystem_\" + i, () => {\r\n let results = this.#subsystems[i].render(ctx, camera, mousePosition);\r\n if (results?.cursorStyle) {\r\n results.cursorStyle = results?.cursorStyle;\r\n }\r\n })\r\n }\r\n return results;\r\n }\r\n}\r\n\r\nexport class NodeFlowGraph {\r\n\r\n #ctx: CanvasRenderingContext2D;\r\n\r\n #canvas: HTMLCanvasElement;\r\n\r\n #backgroundRenderer: GraphRenderer\r\n\r\n #contextMenuConfig: ContextMenuConfig;\r\n\r\n #mousePosition: Vector2 | undefined;\r\n\r\n #camera: Camera;\r\n\r\n #openedContextMenu: OpenContextMenu | null;\r\n\r\n #openQuickMenu: OpenQuickMenu | null;\r\n\r\n #contextMenuEntryHovering: ContextEntry | null;\r\n\r\n #views: Array<GraphView>;\r\n\r\n #currentView: number;\r\n\r\n #mainNodeSubsystem: NodeSubsystem;\r\n\r\n #mainNoteSubsystem: NoteSubsystem;\r\n\r\n constructor(canvas: HTMLCanvasElement, config?: FlowNodeGraphConfiguration) {\r\n const postProcessPass = new PassSubsystem();\r\n\r\n this.#mainNodeSubsystem = new NodeSubsystem(postProcessPass, {\r\n nodes: config?.nodes,\r\n idleConnection: config?.idleConnection\r\n });\r\n\r\n this.#lastFrameCursor = CursorStyle.Default;\r\n this.#cursor = CursorStyle.Default;\r\n\r\n this.#mainNoteSubsystem = new NoteSubsystem(config?.board);\r\n\r\n this.#views = [\r\n new GraphView([\r\n this.#mainNoteSubsystem,\r\n this.#mainNodeSubsystem,\r\n postProcessPass\r\n ])\r\n ];\r\n this.#currentView = 0;\r\n\r\n this.#camera = new Camera();\r\n\r\n this.#contextMenuConfig = CombineContextMenus({\r\n items: [\r\n {\r\n name: \"Reset View\",\r\n group: contextMenuGroup,\r\n callback: this.#camera.reset.bind(this.#camera)\r\n },\r\n ],\r\n }, config?.contextMenu);\r\n\r\n this.#openedContextMenu = null;\r\n this.#openQuickMenu = null;\r\n this.#contextMenuEntryHovering = null;\r\n\r\n this.#canvas = canvas;\r\n const ctx = canvas.getContext(\"2d\")\r\n if (ctx === null) {\r\n throw new Error(\"could not create canvas context\")\r\n }\r\n this.#ctx = ctx;\r\n\r\n if (config?.backgroundRenderer !== undefined) {\r\n this.#backgroundRenderer = config?.backgroundRenderer\r\n } else {\r\n const backgroundColor = config?.backgroundColor === undefined ? Theme.Graph.BackgroundColor : config.backgroundColor;\r\n this.#backgroundRenderer = BuildBackgroundRenderer(backgroundColor);\r\n }\r\n\r\n window.requestAnimationFrame(this.#render.bind(this));\r\n\r\n this.#canvas.addEventListener('wheel', (event) => {\r\n event.preventDefault();\r\n this.zoom(Math.sign(event.deltaY));\r\n }, false);\r\n\r\n new MouseObserver(this.#canvas,\r\n this.#mouseDragEvent.bind(this),\r\n\r\n // Mouse move event\r\n (mousePosition) => {\r\n this.#mousePosition = mousePosition;\r\n },\r\n\r\n this.#clickStart.bind(this),\r\n this.#clickEnd.bind(this),\r\n this.#openContextMenu.bind(this),\r\n this.#fileDrop.bind(this)\r\n );\r\n\r\n document.addEventListener(\r\n \"keydown\",\r\n (e) => {\r\n if (document.activeElement) {\r\n if ([\"INPUT\", \"TEXTAREA\"].includes(document.activeElement.tagName)) return;\r\n }\r\n\r\n if (this.#openQuickMenu) {\r\n if (e.code === \"Escape\") {\r\n this.#openQuickMenu = null;\r\n return;\r\n }\r\n\r\n if (e.code === \"Enter\") {\r\n this.#openQuickMenu.Menu.execute();\r\n this.#openQuickMenu = null;\r\n return;\r\n }\r\n\r\n this.#openQuickMenu.Menu.keyboardEvent(e);\r\n return\r\n }\r\n\r\n const spacePressed = e.key == \" \" || e.code == \"Space\";\r\n if (!spacePressed) {\r\n return;\r\n }\r\n\r\n if (!this.#mousePosition) {\r\n return;\r\n }\r\n const contextMenuPosition = this.#sceenPositionToGraphPosition(this.#mousePosition);\r\n\r\n let items = this.#mainNodeSubsystem.nodeFactory().newNodeSubmenus(this.#mainNodeSubsystem, contextMenuPosition);\r\n this.#openQuickMenu = {\r\n Menu: new QuickMenu({\r\n subMenus: items,\r\n }),\r\n Position: contextMenuPosition\r\n }\r\n }\r\n );\r\n }\r\n\r\n #fileDrop(file: File): void {\r\n\r\n if (this.currentView().fileDrop(file)) {\r\n return;\r\n }\r\n\r\n const contents = file.name.split('.');\r\n const extension = contents[contents.length - 1];\r\n if (extension !== \"jpg\" && extension !== \"jpeg\" && extension !== \"png\") {\r\n return;\r\n }\r\n\r\n let pos = Zero();\r\n if (this.#mousePosition) {\r\n CopyVector2(pos, this.#sceenPositionToGraphPosition(this.#mousePosition));\r\n }\r\n\r\n this.#mainNodeSubsystem.addNode(new FlowNode({\r\n title: contents[0],\r\n position: pos,\r\n widgets: [{\r\n type: \"image\",\r\n config: {\r\n blob: file,\r\n }\r\n }]\r\n }));\r\n }\r\n\r\n public addNoteAddedListener(callback: NoteAddedCallback): void {\r\n this.#mainNoteSubsystem.addNoteAddedListener(callback);\r\n }\r\n\r\n public addNoteRemovedListener(callback: NoteRemovedCallback): void {\r\n this.#mainNoteSubsystem.addNoteRemovedListener(callback);\r\n }\r\n\r\n public addNoteDragStartListener(callback: NoteDragStartCallback): void {\r\n this.#mainNoteSubsystem.addNoteDragStartListener(callback);\r\n }\r\n\r\n public addNoteDragStopListener(callback: NoteDragStopCallback): void {\r\n this.#mainNoteSubsystem.addNoteDragStopListener(callback);\r\n }\r\n\r\n\r\n zoom(amount: number): void {\r\n\r\n let oldPos: Vector2 | undefined = undefined;\r\n if (this.#mousePosition) {\r\n oldPos = this.#sceenPositionToGraphPosition(this.#mousePosition);;\r\n }\r\n\r\n this.#camera.zoom += amount * this.#camera.zoom * 0.05;\r\n\r\n if (!oldPos || !this.#mousePosition) {\r\n return;\r\n }\r\n // Attempt zoom around where the current mouse is.\r\n const newPos = this.#sceenPositionToGraphPosition(this.#mousePosition);\r\n this.#camera.position.x += (newPos.x - oldPos.x) * this.#camera.zoom;\r\n this.#camera.position.y += (newPos.y - oldPos.y) * this.#camera.zoom;\r\n }\r\n\r\n #clickStart(mousePosition: Vector2, ctrlKey: boolean): void {\r\n if (this.#contextMenuEntryHovering !== null) {\r\n this.#contextMenuEntryHovering.click();\r\n this.#openedContextMenu = null;\r\n this.#contextMenuEntryHovering = null;\r\n return;\r\n }\r\n this.#openedContextMenu = null;\r\n this.#openQuickMenu = null;\r\n this.#contextMenuEntryHovering = null;\r\n\r\n this.#mousePosition = mousePosition;\r\n this.currentView().clickStart(mousePosition, this.#camera, ctrlKey);\r\n }\r\n\r\n currentView(): GraphView {\r\n return this.#views[this.#currentView];\r\n }\r\n\r\n organize(): void {\r\n this.#mainNodeSubsystem.organize(this.#ctx);\r\n }\r\n\r\n addPublisher(identifier: string, publisher: Publisher): void {\r\n this.#mainNodeSubsystem.addPublisher(identifier, publisher);\r\n }\r\n\r\n getNodes(): Array<FlowNode> {\r\n return this.#mainNodeSubsystem.getNodes();\r\n }\r\n\r\n connectedInputsNodeReferences(nodeIndex: number): Array<FlowNode> {\r\n return this.#mainNodeSubsystem.connectedInputsNodeReferencesByIndex(nodeIndex);\r\n }\r\n\r\n connectedOutputsNodeReferences(nodeIndex: number): Array<FlowNode> {\r\n return this.#mainNodeSubsystem.connectedOutputsNodeReferences(nodeIndex);\r\n }\r\n\r\n connectNodes(nodeOut: FlowNode, outPort: number, nodeIn: FlowNode, inPort: number): Connection | undefined {\r\n return this.#mainNodeSubsystem.connectNodes(nodeOut, outPort, nodeIn, inPort);\r\n }\r\n\r\n addNode(node: FlowNode): void {\r\n this.#mainNodeSubsystem.addNode(node);\r\n }\r\n\r\n removeNode(node: FlowNode): void {\r\n this.#mainNodeSubsystem.removeNode(node);\r\n }\r\n\r\n addNote(note: FlowNote): void {\r\n this.#mainNoteSubsystem.addNote(note);\r\n }\r\n\r\n public addOnNodeCreatedListener(callback: NodeCreatedCallback): void {\r\n this.#mainNodeSubsystem.addOnNodeCreatedListener(callback);\r\n }\r\n\r\n public addOnNodeAddedListener(callback: NodeAddedCallback): void {\r\n this.#mainNodeSubsystem.addOnNodeAddedListener(callback);\r\n }\r\n\r\n public addOnNodeRemovedListener(callback: NodeRemovedCallback): void {\r\n this.#mainNodeSubsystem.addOnNodeRemovedListener(callback);\r\n }\r\n\r\n #sceenPositionToGraphPosition(screenPosition: Vector2): Vector2 {\r\n const out = Zero();\r\n this.#camera.screenSpaceToGraphSpace(screenPosition, out);\r\n return out;\r\n }\r\n\r\n #openContextMenu(position: Vector2): void {\r\n let finalConfig = this.#contextMenuConfig;\r\n\r\n const contextMenuPosition = this.#sceenPositionToGraphPosition(position);\r\n\r\n finalConfig = CombineContextMenus(finalConfig, this.currentView().openContextMenu(this.#ctx, contextMenuPosition));\r\n\r\n this.#openedContextMenu = {\r\n Menu: new ContextMenu(finalConfig),\r\n Position: contextMenuPosition,\r\n };\r\n }\r\n\r\n\r\n // Somethings wrong here. Needs more testing\r\n // #fitView(): void {\r\n // if (this.#nodes.length === 0) {\r\n // return;\r\n // }\r\n\r\n // const curBox: Box = {\r\n // Position: { x: 0, y: 0 },\r\n // Size: { x: 0, y: 0 }\r\n // };\r\n // CopyBox(curBox, this.#nodes[0].calculateBounds(this.#ctx, this.#graphState.position, this.#graphState.scale));\r\n\r\n // for (let i = 1; i < this.#nodes.length; i++) {\r\n // ExpandBox(curBox, this.#nodes[i].calculateBounds(this.#ctx, this.#graphState.position, this.#graphState.scale));\r\n // }\r\n\r\n // CopyVector2(this.#graphState.position, curBox.Position);\r\n // }\r\n\r\n #clickEnd(): void {\r\n this.currentView().clickEnd();\r\n }\r\n\r\n #mouseDragEvent(delta: Vector2): void {\r\n let draggingSomething = this.currentView().mouseDragEvent(delta, this.#camera.zoom);\r\n if (!draggingSomething) {\r\n this.#camera.position.x += delta.x;\r\n this.#camera.position.y += delta.y;\r\n }\r\n }\r\n\r\n #lastFrameCursor: CursorStyle;\r\n\r\n #cursor: CursorStyle;\r\n\r\n #render(): void {\r\n if (this.#canvas.parentNode !== null) {\r\n // Stupid as any because typescript doesn't think it exists\r\n var rect = (this.#canvas.parentNode as any).getBoundingClientRect();\r\n this.#canvas.width = rect.width;\r\n this.#canvas.height = rect.height;\r\n }\r\n\r\n\r\n this.#cursor = CursorStyle.Default;\r\n\r\n TimeExecution(\"Render_Background\", this.#renderBackground.bind(this));\r\n\r\n TimeExecution(\"Render_View_\" + this.#currentView, () => {\r\n let results = this.currentView().render(this.#ctx, this.#camera, this.#mousePosition);\r\n if (results?.cursorStyle) {\r\n this.#cursor = results?.cursorStyle;\r\n }\r\n });\r\n\r\n TimeExecution(\"Render_Context\", this.#renderContextMenu.bind(this));\r\n\r\n TimeExecution(\"Render_QuickMenu\", this.#renderQuickMenu.bind(this))\r\n\r\n // Only update CSS style if things have changed\r\n // TODO: Does this actually have any measurable performance savings?\r\n if (this.#lastFrameCursor !== this.#cursor) {\r\n this.#canvas.style.cursor = this.#cursor;\r\n }\r\n this.#lastFrameCursor = this.#cursor;\r\n\r\n window.requestAnimationFrame(this.#render.bind(this));\r\n }\r\n\r\n #renderBackground(): void {\r\n this.#backgroundRenderer(this.#canvas, this.#ctx, this.#camera.position, this.#camera.zoom);\r\n }\r\n\r\n #renderContextMenu(): void {\r\n VectorPool.run(() => {\r\n if (this.#openedContextMenu !== null) {\r\n const pos = VectorPool.get();\r\n this.#camera.graphSpaceToScreenSpace(this.#openedContextMenu.Position, pos)\r\n this.#contextMenuEntryHovering = this.#openedContextMenu.Menu.render(this.#ctx, pos, this.#camera.zoom, this.#mousePosition, true);\r\n\r\n if (this.#contextMenuEntryHovering !== null) {\r\n this.#cursor = CursorStyle.Pointer;\r\n }\r\n }\r\n });\r\n }\r\n\r\n #renderQuickMenu(): void {\r\n VectorPool.run(() => {\r\n if (this.#openQuickMenu !== null) {\r\n const pos = VectorPool.get();\r\n this.#camera.graphSpaceToScreenSpace(this.#openQuickMenu.Position, pos)\r\n this.#contextMenuEntryHovering = this.#openQuickMenu.Menu.render(this.#ctx, pos, this.#camera.zoom, this.#mousePosition);\r\n\r\n if (this.#contextMenuEntryHovering !== null) {\r\n this.#cursor = CursorStyle.Pointer;\r\n }\r\n }\r\n });\r\n }\r\n}"],"mappings":"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","names":["_arr","_count","_name","_textStyle","width","width","width","_size","_size","_color","_border","_color","_box","_text","_node","_value","_text","_callback","_text","_callback","_node","_nodeProperty","_value","_callback","_value","_text","_node","_nodeProperty","_textStyle","_backgroundColor","_lastMousePosition","_value","_idleStyle","_hoverStyle","_callback","_node","_nodeProperty","_idleStyle","_hoverStyle","_box","_node","_nodeProperty","_value","_text","_callback","_maxWidth","_maxHeight","_value","_callback","_node","_nodeProperty","_size","column","_name","_connections","NodeSubsystem","connection","_title","_contextMenu","_padding","_text","_entries","_calculatedPositions","_calculatedEntries","_calculatedForWidth","calculateLayout_fn","max","i","_tokens","_index","current_fn","inc_fn","next_fn","text_fn","h1_fn","h2_fn","_originalText","_data","_position","_text","_searchText","results","_cursor","NodeSubsystem"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/theme.ts","../src/styles/text.ts","../src/types/pool.ts","../src/types/vector2.ts","../src/types/box.ts","../src/types/list.ts","../src/contextMenu.ts","../src/input.ts","../src/elements/interfaces.ts","../src/elements/base.ts","../src/elements/container.ts","../src/elements/text.ts","../src/utils/string.ts","../src/types/text.ts","../src/utils/math.ts","../src/utils/color.ts","../src/port.ts","../src/styles/stroke.ts","../src/styles/box.ts","../src/popup.ts","../src/styles/textBox.ts","../src/widgets/widget.ts","../src/widgets/number.ts","../src/widgets/button.ts","../src/widgets/color.ts","../src/widgets/slider.ts","../src/popups/string.ts","../src/widgets/string.ts","../src/widgets/toggle.ts","../src/widgets/image.ts","../src/widgets/text.ts","../src/widgets/factory.ts","../src/connection.ts","../src/camera.ts","../src/organize.ts","../src/performance.ts","../src/nodes/publisher.ts","../src/nodes/factory.ts","../src/nodes/subsystem.ts","../src/popups/form.ts","../src/node.ts","../src/markdown/token.ts","../src/markdown/lexicalParser.ts","../src/markdown/entry.ts","../src/markdown/syntaxParser.ts","../src/markdown/markdown.ts","../src/notes/note.ts","../src/notes/subsystem.ts","../src/pass/subsystem.ts","../src/quickMenu.ts","../src/graph.ts"],"sourcesContent":["export * from './graph';\r\nexport * from './node';\r\n\r\nimport { Theme } from './theme';\r\nexport { Theme };\r\n\r\nimport { Publisher, PublisherConfig } from './nodes/publisher';\r\nexport { Publisher, PublisherConfig };\r\n\r\nimport { FlowNote } from './notes/note';\r\nexport { FlowNote };\r\n\r\n// Widgets\r\nimport { NumberWidget } from './widgets/number';\r\nimport { ColorWidget } from './widgets/color';\r\nimport { StringWidget } from './widgets/string';\r\nimport { ButtonWidget } from './widgets/button';\r\nimport { ToggleWidget } from './widgets/toggle';\r\nimport { SliderWidget } from './widgets/slider';\r\nimport { ImageWidget } from './widgets/image';\r\nexport {\r\n NumberWidget, ColorWidget, StringWidget, ButtonWidget, ToggleWidget, SliderWidget, ImageWidget\r\n};\r\n\r\nimport { GlobalWidgetFactory } from './widgets/factory';\r\nexport { GlobalWidgetFactory };\r\n","export const Theme = {\r\n FontFamily: \"Courier New\",\r\n Graph: {\r\n BackgroundColor: \"#07212a\",\r\n },\r\n Node: {\r\n FontColor: \"#afb9bb\",\r\n BackgroundColor: \"#0c2b35\",\r\n Title: {\r\n Color: \"#154050\",\r\n FontColor: \"#afb9bb\",\r\n Padding: 5\r\n },\r\n BorderRadius: 15,\r\n Border: {\r\n Idle: \"#1c1c1c\",\r\n MouseOver: \"#8e8e8e\",\r\n Grabbed: \"white\",\r\n Selected: \"#6e6e6e\"\r\n },\r\n Port: {\r\n FontColor: \"#afb9bb\"\r\n },\r\n Message: {\r\n InfoColor: \"#afb9bb\",\r\n WarnColor: \"#f1f663ff\",\r\n ErrorColor: \"#FF0000\"\r\n }\r\n },\r\n BoxSelect: {\r\n Color: \"white\",\r\n Size: 1,\r\n Radius: 2,\r\n LineDashLength: 5,\r\n },\r\n Widget: {\r\n FontColor: \"#afb9bb\",\r\n BackgroundColor: \"#0f313c\",\r\n Border: {\r\n Color: \"#154050\",\r\n Size: 2,\r\n Radius: 2\r\n },\r\n Hover: {\r\n BackgroundColor: \"#195366\"\r\n },\r\n Slider: {\r\n FillColor: \"#07212A\",\r\n },\r\n Button: {\r\n Click: {\r\n BackgroundColor: \"#1f637a\"\r\n },\r\n }\r\n },\r\n ContextMenu: {\r\n BackgroundColor: \"#07212A\",\r\n HighlightColor: \"#205A6D\",\r\n FontColor: \"#afb9bb\",\r\n },\r\n Note: {\r\n FontColor: \"#afb9bb\",\r\n FontSize: 16,\r\n EntrySpacing: 20,\r\n LineSpacing: 5,\r\n DotSize: 3,\r\n HeaderLineWidth: 2,\r\n H1: {\r\n FontSize: 32,\r\n },\r\n H2: {\r\n FontSize: 16,\r\n },\r\n H3: {\r\n FontSize: 16,\r\n },\r\n CodeBlock: {\r\n BackgroundColor: \"#0c2b35\",\r\n Padding: 16,\r\n BorderRadius: 4,\r\n }\r\n }\r\n}","import { Theme } from \"../theme\";\r\nimport { Vector2 } from \"../types/vector2\";\r\n\r\nexport enum FontWeight {\r\n Normal = \"\",\r\n Bold = \"bold\"\r\n}\r\n\r\nexport enum FontStyle {\r\n Normal = \"\",\r\n Italic = \"italic\"\r\n}\r\n\r\nexport interface TextStyleConfig {\r\n size?: number;\r\n color?: string;\r\n font?: string;\r\n weight?: FontWeight;\r\n style?: FontStyle;\r\n}\r\n\r\nconst DefaultSize: number = 16;\r\nconst DefaultColor: string = \"black\";\r\n\r\nexport function TextStyleFallback(input?: TextStyleConfig, fallback?: TextStyleConfig): TextStyleConfig {\r\n return {\r\n color: input?.color === undefined ? fallback?.color : input?.color,\r\n size: input?.size === undefined ? fallback?.size : input?.size,\r\n font: input?.font === undefined ? fallback?.font : input?.font,\r\n style: input?.style === undefined ? fallback?.style : input?.style,\r\n weight: input?.weight === undefined ? fallback?.weight : input?.weight,\r\n };\r\n}\r\n\r\nexport class TextStyle {\r\n\r\n #size: number;\r\n\r\n #color: string;\r\n\r\n #font: string;\r\n\r\n #weight: FontWeight;\r\n\r\n #fontStyle: FontStyle;\r\n\r\n constructor(config: TextStyleConfig | undefined) {\r\n this.#size = config?.size === undefined ? DefaultSize : config.size;\r\n this.#color = config?.color === undefined ? DefaultColor : config.color;\r\n this.#font = config?.font === undefined ? Theme.FontFamily : config.font;\r\n this.#weight = config?.weight === undefined ? FontWeight.Normal : config.weight;\r\n this.#fontStyle = config?.style === undefined ? FontStyle.Normal : config.style;\r\n }\r\n\r\n setupStyle(ctx: CanvasRenderingContext2D, scale: number): void {\r\n ctx.fillStyle = this.#color;\r\n ctx.font = this.#fontStyle + \" \" + this.#weight + \" \" + (this.#size * scale) + \"px \" + this.#font;\r\n }\r\n\r\n getSize(): number {\r\n return this.#size;\r\n }\r\n\r\n getFont(): string {\r\n return this.#font;\r\n }\r\n\r\n measure(ctx: CanvasRenderingContext2D, scale: number, text: string, out: Vector2): void {\r\n this.setupStyle(ctx, scale);\r\n const measurements = ctx.measureText(text)\r\n out.x = measurements.width;\r\n out.y = measurements.actualBoundingBoxAscent + measurements.actualBoundingBoxDescent;\r\n }\r\n\r\n setColor(color: string): void {\r\n this.#color = color;\r\n }\r\n\r\n getColor(): string {\r\n return this.#color ;\r\n }\r\n\r\n setSize(size: number): void {\r\n this.#size = size;\r\n }\r\n\r\n setWeight(weight: FontWeight): void {\r\n this.#weight = weight;\r\n }\r\n}","import { Vector2 } from \"./vector2\";\r\n\r\n\r\n\r\nexport class Pool<Type> {\r\n\r\n #arr: Array<Type>;\r\n\r\n #count: number;\r\n\r\n #builder: () => Type;\r\n\r\n #reset: (v: Type) => void;\r\n\r\n #runningDepth: number;\r\n\r\n constructor(builder: () => Type, reset: (v: Type) => void) {\r\n this.#arr = new Array<Type>();\r\n this.#count = 0;\r\n this.#builder = builder;\r\n this.#reset = reset;\r\n this.#runningDepth = 0;\r\n }\r\n\r\n public runIf(condition: boolean, fn: () => void) {\r\n if (condition) {\r\n this.run(fn);\r\n }\r\n }\r\n\r\n #running(): boolean {\r\n return this.#runningDepth > 0;\r\n }\r\n\r\n public run(fn: () => void) {\r\n const start = this.#count;\r\n this.#runningDepth += 1;\r\n fn();\r\n this.#runningDepth -= 1;\r\n this.#count = start;\r\n // console.log(this.#arr.length);\r\n }\r\n\r\n get(): Type {\r\n if(!this.#running()) {\r\n throw new Error(\"can't use pool outside of running context\");\r\n }\r\n\r\n let value: Type;\r\n if (this.#arr.length === this.#count) {\r\n value = this.#builder();\r\n this.#arr.push(this.#builder());\r\n } else {\r\n value = this.#arr[this.#count];\r\n this.#reset(value);\r\n }\r\n this.#count++;\r\n return value;\r\n }\r\n\r\n}\r\n\r\nexport const VectorPool = new Pool<Vector2>(\r\n () => ({ x: 0, y: 0 }),\r\n (v) => { v.x = 0; v.y = 0; }\r\n)\r\n","export interface Vector2 {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport function CopyVector2(dst: Vector2, src: Vector2): void {\r\n dst.x = src.x;\r\n dst.y = src.y;\r\n}\r\n\r\nexport function SubVector2(dst: Vector2, a: Vector2, b: Vector2): void {\r\n dst.x = a.x - b.x;\r\n dst.y = a.y - b.y;\r\n}\r\n\r\nexport function AddVector2(dst: Vector2, a: Vector2, b: Vector2): void {\r\n dst.x = a.x + b.x;\r\n dst.y = a.y + b.y;\r\n}\r\n\r\nexport function ScaleVector(dst: Vector2, scale: number): void {\r\n dst.x *= scale;\r\n dst.y *= scale;\r\n}\r\n\r\nexport function Zero(): Vector2 {\r\n return { x: 0, y: 0 };\r\n}\r\n\r\nexport function Distance(a: Vector2, b: Vector2): number { \r\n const xd = b.x - a.x\r\n const yd = b.y - a.y\r\n return Math.sqrt((xd*xd)+(yd*yd))\r\n}\r\n","import { VectorPool } from \"./pool\";\r\nimport { AddVector2, CopyVector2, SubVector2, Vector2, Zero } from \"./vector2\";\r\n\r\nexport interface Box {\r\n Position: Vector2\r\n Size: Vector2\r\n}\r\n\r\nexport function CopyBox(dst: Box, src: Box): void {\r\n dst.Position.x = src.Position.x;\r\n dst.Position.y = src.Position.y;\r\n dst.Size.x = src.Size.x;\r\n dst.Size.y = src.Size.y;\r\n}\r\n\r\nfunction normalizeMinMax(min: Vector2, max: Vector2) {\r\n if (min.x > max.x) {\r\n let temp = max.x;\r\n max.x = min.x;\r\n min.x = temp;\r\n }\r\n\r\n if (min.y > max.y) {\r\n let temp = max.y;\r\n max.y = min.y;\r\n min.y = temp;\r\n }\r\n}\r\n\r\nexport function BoxIntersection(a: Box, b: Box): boolean {\r\n let intersects = false;\r\n\r\n VectorPool.run(() => {\r\n const aMin = VectorPool.get();\r\n const aMax = VectorPool.get();\r\n CopyVector2(aMin, a.Position);\r\n AddVector2(aMax, aMin, a.Size);\r\n normalizeMinMax(aMin, aMax);\r\n\r\n const bMin = VectorPool.get();\r\n const bMax = VectorPool.get();\r\n CopyVector2(bMin, b.Position);\r\n AddVector2(bMax, bMin, b.Size);\r\n normalizeMinMax(bMin, bMax);\r\n\r\n intersects = (aMin.x <= bMax.x) && (aMax.x >= bMin.x) &&\r\n (aMin.y <= bMax.y) && (aMax.y >= bMin.y);\r\n })\r\n\r\n return intersects;\r\n}\r\n\r\n// TODO: This is probably incorrect. Needs more testing\r\n// export function ExpandBox(boxToExpand: Box, box: Box): void {\r\n// const newPos: Vector2 = Zero();\r\n// const newSize: Vector2 = Zero();\r\n\r\n// CopyVector2(newPos, boxToExpand.Position);\r\n// CopyVector2(newSize, boxToExpand.Size);\r\n\r\n\r\n// const positionOffset: Vector2 = Zero();\r\n\r\n// // Get Position Adjustment\r\n// SubVector2(positionOffset, box.Position, boxToExpand.Position);\r\n\r\n// // We only care about adjustments that make us bigger.\r\n// positionOffset.x = Math.min(positionOffset.x, 0);\r\n// positionOffset.y = Math.min(positionOffset.y, 0);\r\n\r\n// // Adjust our position \r\n// AddVector2(boxToExpand.Position, boxToExpand.Position, positionOffset);\r\n\r\n// // Increase our size to take into account new position\r\n// SubVector2(newSize, newSize, positionOffset);\r\n\r\n// const sizeIncrease: Vector2 = Zero();\r\n\r\n// const curEndPos: Vector2 = {\r\n// x: boxToExpand.Position.x + boxToExpand.Size.x,\r\n// y: boxToExpand.Position.y + boxToExpand.Size.y,\r\n// };\r\n\r\n// const boxEndPos: Vector2 = {\r\n// x: box.Position.x + box.Size.x,\r\n// y: box.Position.y + box.Size.y,\r\n// };\r\n\r\n// SubVector2(sizeIncrease, boxEndPos, curEndPos);\r\n\r\n// // We only care about increases to our size\r\n// sizeIncrease.x = Math.max(sizeIncrease.x, 0);\r\n// sizeIncrease.y = Math.max(sizeIncrease.y, 0);\r\n\r\n// // Increase our size to take into account new position\r\n// SubVector2(newSize, newSize, sizeIncrease)\r\n\r\n// // Finally, Set result\r\n// CopyVector2(boxToExpand.Position, newPos)\r\n// CopyVector2(boxToExpand.Size, newSize)\r\n// }\r\n\r\nexport function BoxCenter(box: Box, out: Vector2): Vector2 {\r\n out.x = box.Position.x + (box.Size.x / 2);\r\n out.y = box.Position.y + (box.Size.y / 2);\r\n return out\r\n}\r\n\r\nexport function InBox(box: Box, position: Vector2): boolean {\r\n const min = box.Position\r\n if (position.x < min.x) {\r\n return false\r\n }\r\n if (position.y < min.y) {\r\n return false\r\n }\r\n\r\n if (position.x > min.x + box.Size.x) {\r\n return false\r\n }\r\n if (position.y > min.y + box.Size.y) {\r\n return false\r\n }\r\n\r\n return true\r\n}","export class List<Type> {\r\n\r\n #arr: Array<Type>;\r\n\r\n #count: number;\r\n\r\n constructor() {\r\n this.#arr = new Array<Type>();\r\n this.#count = 0;\r\n }\r\n\r\n public Count(): number {\r\n return this.#count;\r\n }\r\n\r\n public Clear(): void {\r\n this.#count = 0;\r\n }\r\n\r\n public At(index: number): Type {\r\n return this.#arr[index];\r\n }\r\n\r\n public Push(value: Type): void {\r\n if (this.#arr.length === this.#count) {\r\n this.#arr.push(value);\r\n } else {\r\n this.#arr[this.#count] = value;\r\n }\r\n this.#count++;\r\n }\r\n\r\n public ToArray(): Array<Type> {\r\n let arr = new Array<Type>(this.Count());\r\n for(let i = 0; i < this.#count; i ++) {\r\n arr[i] = this.#arr[i]\r\n }\r\n return arr;\r\n }\r\n\r\n}","import { Theme } from './theme';\r\nimport { TextAlign } from './styles/canvasTextAlign';\r\nimport { TextStyle, TextStyleConfig, TextStyleFallback } from './styles/text';\r\nimport { Box, InBox } from './types/box';\r\nimport { List } from './types/list';\r\nimport { CopyVector2, Vector2, Zero } from './types/vector2';\r\n\r\nconst contextEntryHeight = 30;\r\nconst contextEntryWidth = 250;\r\n\r\nexport interface ContextMenuItemConfig {\r\n name?: string;\r\n textStyle?: TextStyleConfig;\r\n group?: string;\r\n\r\n callback?: () => void;\r\n}\r\n\r\nexport interface ContextMenuConfig {\r\n name?: string;\r\n textStyle?: TextStyleConfig;\r\n group?: string;\r\n\r\n subMenus?: Array<ContextMenuConfig>;\r\n items?: Array<ContextMenuItemConfig>;\r\n}\r\n\r\n\r\nexport class ContextMenuItem {\r\n #name: string;\r\n\r\n #callback?: () => void;\r\n\r\n #textStyle: TextStyle;\r\n\r\n public group?: string;\r\n\r\n constructor(config?: ContextMenuItemConfig) {\r\n this.#name = config?.name === undefined ? \"item\" : config.name;\r\n this.#callback = config?.callback;\r\n this.#textStyle = new TextStyle(config?.textStyle);\r\n this.group = config?.group;\r\n }\r\n\r\n getName(): string {\r\n return this.#name;\r\n }\r\n\r\n execute(): void {\r\n if (this.#callback === undefined) {\r\n return;\r\n }\r\n this.#callback();\r\n }\r\n}\r\n\r\nclass ContextGroup {\r\n\r\n #calculatedHeight: number;\r\n\r\n constructor(public entries: Array<ContextEntry>) {\r\n this.#calculatedHeight = entries.length * contextEntryHeight\r\n }\r\n\r\n height() {\r\n return this.#calculatedHeight;\r\n }\r\n\r\n}\r\n\r\nexport class ContextEntry {\r\n constructor(public text: string, public subMenu: ContextMenu | undefined, public item: ContextMenuItem | undefined) {\r\n }\r\n\r\n click(): void {\r\n this.item?.execute();\r\n }\r\n}\r\n\r\nexport function CombineContextMenus(...contextMenus: Array<ContextMenuConfig | undefined>): ContextMenuConfig {\r\n const finalConfig: ContextMenuConfig = {\r\n items: new Array<ContextMenuItemConfig>,\r\n subMenus: new Array<ContextMenuConfig>,\r\n }\r\n\r\n for (let i = 0; i < contextMenus.length; i++) {\r\n const config = contextMenus[i];\r\n if (config === undefined) {\r\n continue;\r\n }\r\n\r\n if (config.items !== undefined) {\r\n finalConfig.items = finalConfig.items?.concat(config.items);\r\n }\r\n\r\n if (config.subMenus !== undefined) {\r\n finalConfig.subMenus = finalConfig.subMenus?.concat(config.subMenus);\r\n }\r\n }\r\n\r\n return finalConfig;\r\n}\r\n\r\nexport class ContextMenu {\r\n\r\n #name: string;\r\n\r\n #items: Array<ContextMenuItem>;\r\n\r\n #subMenus: Array<ContextMenu>;\r\n\r\n #textStyle: TextStyle;\r\n\r\n #groups: List<ContextGroup>;\r\n\r\n #group?: string;\r\n\r\n #submenuPosition: Vector2;\r\n\r\n constructor(config?: ContextMenuConfig) {\r\n this.#submenuPosition = Zero();\r\n this.#groups = new List<ContextGroup>();\r\n this.#name = config?.name === undefined ? \"menu\" : config?.name;\r\n this.#items = new Array<ContextMenuItem>();\r\n this.#subMenus = new Array<ContextMenu>();\r\n this.#textStyle = new TextStyle(TextStyleFallback(config?.textStyle, {\r\n color: Theme.ContextMenu.FontColor\r\n }));\r\n this.#group = config?.group;\r\n\r\n if (config?.subMenus !== undefined) {\r\n for (let i = 0; i < config?.subMenus.length; i++) {\r\n this.#subMenus.push(new ContextMenu(config?.subMenus[i]));\r\n }\r\n }\r\n\r\n if (config?.items !== undefined) {\r\n for (let i = 0; i < config?.items.length; i++) {\r\n this.#items.push(new ContextMenuItem(config?.items[i]));\r\n }\r\n }\r\n\r\n this.#calculateEntries();\r\n }\r\n\r\n #calculateEntries(): void {\r\n\r\n const groupLUT = new Map<string, number>();\r\n const workingGroups = new Array<Array<ContextEntry>>();\r\n\r\n // Initialize first group for undefined entries\r\n workingGroups.push(new Array<ContextEntry>());\r\n\r\n for (let i = 0; i < this.#items.length; i++) {\r\n let group = 0; // index to undefined entries\r\n\r\n // Find collection that this entry belongs too\r\n const sub = this.#items[i]\r\n if (sub.group !== undefined) {\r\n const groupIndex = groupLUT.get(sub.group)\r\n if (groupIndex !== undefined) {\r\n group = groupIndex\r\n } else {\r\n group = workingGroups.length\r\n groupLUT.set(sub.group, group)\r\n workingGroups.push(new Array<ContextEntry>());\r\n }\r\n }\r\n\r\n workingGroups[group].push(new ContextEntry(\r\n this.#items[i].getName(),\r\n undefined,\r\n this.#items[i]\r\n ));\r\n }\r\n\r\n for (let i = 0; i < this.#subMenus.length; i++) {\r\n let group = 0; // index to undefined entries\r\n\r\n // Find collection that this entry belongs too\r\n const sub = this.#subMenus[i]\r\n if (sub.#group !== undefined) {\r\n const groupIndex = groupLUT.get(sub.#group)\r\n if (groupIndex !== undefined) {\r\n group = groupIndex\r\n } else {\r\n group = workingGroups.length\r\n groupLUT.set(sub.#group, group)\r\n workingGroups.push(new Array<ContextEntry>());\r\n }\r\n }\r\n\r\n workingGroups[group].push(new ContextEntry(\r\n this.#subMenus[i].getName(),\r\n this.#subMenus[i],\r\n undefined\r\n ));\r\n }\r\n\r\n this.#groups.Clear();\r\n for (let i = 0; i < workingGroups.length; i++) {\r\n const groupContent = workingGroups[i];\r\n if (groupContent.length === 0) {\r\n continue;\r\n }\r\n this.#groups.Push(new ContextGroup(groupContent));\r\n }\r\n }\r\n\r\n #calculatedWidth: number = 0;\r\n\r\n #getMaxWidthForText(ctx: CanvasRenderingContext2D, scale: number): number {\r\n if (this.#calculatedWidth > 0) {\r\n return this.#calculatedWidth;\r\n }\r\n\r\n const tempVec = Zero();\r\n for (let groupIndex = 0; groupIndex < this.#groups.Count(); groupIndex++) {\r\n const group = this.#groups.At(groupIndex);\r\n for (let entryIndex = 0; entryIndex < group.entries.length; entryIndex++) {\r\n this.#textStyle.measure(ctx, scale, group.entries[entryIndex].text, tempVec);\r\n this.#calculatedWidth = Math.max(tempVec.x, this.#calculatedWidth);\r\n }\r\n }\r\n return this.#calculatedWidth;\r\n }\r\n\r\n getName(): string {\r\n return this.#name;\r\n }\r\n\r\n #tempBox: Box = { Position: Zero(), Size: Zero() };\r\n\r\n #openSubMenu: ContextMenu | undefined;\r\n\r\n\r\n public render(ctx: CanvasRenderingContext2D, pppp: Vector2, graphScale: number, mousePosition: Vector2 | undefined, openRight: boolean): ContextEntry | null {\r\n const menuScale = 1.25;\r\n const scaledEntryHeight = menuScale * contextEntryHeight;\r\n const scaledEntryWidth = (menuScale * 40) + (this.#getMaxWidthForText(ctx, menuScale)); // contextEntryWidth;\r\n\r\n let totalScaledHeight = 0\r\n for (let i = 0; i < this.#groups.Count(); i++) {\r\n totalScaledHeight += this.#groups.At(i).height();\r\n }\r\n totalScaledHeight *= menuScale;\r\n\r\n const position = { x: 0, y: 0 };\r\n CopyVector2(position, pppp)\r\n\r\n if (!openRight) {\r\n position.x -= scaledEntryWidth;\r\n }\r\n\r\n // Clamp the position so it's not spilling off the canvas\r\n if (position.y + totalScaledHeight > ctx.canvas.clientHeight) {\r\n position.y = ctx.canvas.clientHeight - totalScaledHeight;\r\n }\r\n\r\n let submenuOpenRight = openRight;\r\n if (openRight && position.x + scaledEntryWidth > ctx.canvas.clientWidth) {\r\n position.x = ctx.canvas.clientWidth - scaledEntryWidth;\r\n submenuOpenRight = !submenuOpenRight;\r\n }\r\n\r\n this.#tempBox.Size.x = scaledEntryWidth;\r\n this.#tempBox.Size.y = scaledEntryHeight;\r\n CopyVector2(this.#tempBox.Position, position)\r\n\r\n\r\n\r\n ctx.textAlign = TextAlign.Left;\r\n ctx.fillStyle = Theme.ContextMenu.BackgroundColor;\r\n ctx.shadowColor = \"#000000\";\r\n ctx.shadowBlur = 5 * menuScale;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x,\r\n this.#tempBox.Position.y,\r\n scaledEntryWidth,\r\n totalScaledHeight,\r\n 5 * menuScale\r\n );\r\n ctx.fill();\r\n ctx.shadowBlur = 0;\r\n\r\n let mouseIsOver: ContextEntry | null = null;\r\n let subOpenedThisFrame = false;\r\n\r\n let optionsRendered = 0;\r\n for (let groupIndex = 0; groupIndex < this.#groups.Count(); groupIndex++) {\r\n const group = this.#groups.At(groupIndex);\r\n for (let entryIndex = 0; entryIndex < group.entries.length; entryIndex++) {\r\n const entry = group.entries[entryIndex];\r\n\r\n this.#tempBox.Position.y = position.y + (scaledEntryHeight * optionsRendered);\r\n\r\n let entryMousedOver = false;\r\n if (mousePosition !== undefined && InBox(this.#tempBox, mousePosition)) {\r\n mouseIsOver = entry;\r\n entryMousedOver = true\r\n if (entry.subMenu !== undefined) {\r\n this.#openSubMenu = entry.subMenu;\r\n this.#submenuPosition.x = position.x\r\n this.#submenuPosition.y = this.#tempBox.Position.y;\r\n if (submenuOpenRight) {\r\n this.#submenuPosition.x += scaledEntryWidth\r\n }\r\n subOpenedThisFrame = true;\r\n } else {\r\n this.#openSubMenu = undefined;\r\n }\r\n }\r\n\r\n if (entryMousedOver || (this.#openSubMenu !== undefined && entry.subMenu === this.#openSubMenu)) {\r\n ctx.fillStyle = Theme.ContextMenu.HighlightColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x + (scaledEntryHeight / 10),\r\n this.#tempBox.Position.y + (scaledEntryHeight / 10),\r\n scaledEntryWidth - (scaledEntryHeight / 5),\r\n scaledEntryHeight - (scaledEntryHeight / 5),\r\n 5 * menuScale\r\n );\r\n ctx.fill();\r\n }\r\n\r\n this.#textStyle.setupStyle(ctx, menuScale);\r\n ctx.fillText(entry.text, position.x + (scaledEntryHeight / 5), this.#tempBox.Position.y + (scaledEntryHeight / 2))\r\n\r\n // Render arrows\r\n if (entry.subMenu !== undefined) {\r\n ctx.beginPath()\r\n ctx.strokeStyle = Theme.ContextMenu.FontColor;\r\n ctx.lineWidth = 1 * menuScale;\r\n ctx.lineTo(position.x + scaledEntryWidth - (scaledEntryHeight / 2.5), this.#tempBox.Position.y + (scaledEntryHeight / 3))\r\n ctx.lineTo(position.x + scaledEntryWidth - (scaledEntryHeight / 4), this.#tempBox.Position.y + (scaledEntryHeight / 2))\r\n ctx.lineTo(position.x + scaledEntryWidth - (scaledEntryHeight / 2.5), this.#tempBox.Position.y + scaledEntryHeight - (scaledEntryHeight / 3))\r\n ctx.stroke();\r\n }\r\n\r\n optionsRendered++;\r\n }\r\n\r\n // Draw a line seperating the groups\r\n if (groupIndex !== this.#groups.Count() - 1) {\r\n ctx.strokeStyle = Theme.ContextMenu.FontColor;\r\n ctx.lineWidth = .5 * menuScale;\r\n ctx.beginPath();\r\n const startX = position.x + (scaledEntryHeight / 10);\r\n const y = this.#tempBox.Position.y + scaledEntryHeight\r\n ctx.lineTo(startX, y);\r\n ctx.lineTo(startX + scaledEntryWidth - (scaledEntryHeight / 5), y);\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n if (this.#openSubMenu !== undefined) {\r\n const mouseOverSub = this.#openSubMenu.render(ctx, this.#submenuPosition, menuScale, mousePosition, submenuOpenRight)\r\n if (mouseOverSub !== null) {\r\n mouseIsOver = mouseOverSub;\r\n }\r\n }\r\n\r\n return mouseIsOver;\r\n }\r\n}","import { CopyVector2, SubVector2, Vector2, Zero } from \"./types/vector2\";\r\n\r\nexport class MouseObserver {\r\n\r\n #clicked: boolean;\r\n\r\n #lastTouch: Vector2;\r\n\r\n #ele: HTMLElement\r\n\r\n #lastMousePosition: Vector2;\r\n\r\n #dragCallback: (delta: Vector2) => void\r\n #moveCallback: (position: Vector2) => void\r\n #clickStart: (position: Vector2, shiftOrCtrl: boolean) => void\r\n #clickStop: () => void\r\n #contextMenu: (position: Vector2) => void\r\n\r\n constructor(\r\n ele: HTMLElement,\r\n dragCallback: (delta: Vector2) => void,\r\n moveCallback: (position: Vector2) => void,\r\n clickStart: (position: Vector2, shiftOrCtrl: boolean) => void,\r\n clickStop: () => void,\r\n contextMenu: (position: Vector2) => void,\r\n fileDrop: (file: File) => void\r\n ) {\r\n this.#ele = ele;\r\n this.#dragCallback = dragCallback;\r\n this.#moveCallback = moveCallback;\r\n this.#clickStart = clickStart;\r\n this.#clickStop = clickStop;\r\n this.#contextMenu = contextMenu;\r\n\r\n this.#clicked = false;\r\n this.#lastTouch = Zero();\r\n this.#lastMousePosition = Zero();\r\n\r\n // Down\r\n ele.addEventListener('mousedown', this.#down.bind(this), false);\r\n ele.addEventListener('touchstart', this.#touchDown.bind(this), false);\r\n\r\n // Up\r\n document.addEventListener('mouseup', this.#up.bind(this), false);\r\n document.addEventListener('touchend', this.#up.bind(this), false);\r\n\r\n // Move\r\n ele.addEventListener('mousemove', this.#move.bind(this), false);\r\n ele.addEventListener('touchmove', this.#moveTouch.bind(this), false);\r\n\r\n ele.addEventListener('drop', (ev) => {\r\n ev.preventDefault();\r\n console.log(ev)\r\n\r\n if (ev.dataTransfer?.items) {\r\n // Use DataTransferItemList interface to access the file(s)\r\n [...ev.dataTransfer.items].forEach((item, i) => {\r\n // If dropped items aren't files, reject them\r\n if (item.kind === \"file\") {\r\n const file = item.getAsFile();\r\n if (file) {\r\n fileDrop(file);\r\n console.log(file)\r\n console.log(`… file[${i}].name = ${file.name}`);\r\n }\r\n }\r\n });\r\n } else if (ev.dataTransfer) {\r\n // Use DataTransfer interface to access the file(s)\r\n [...ev.dataTransfer.files].forEach((file, i) => {\r\n console.log(`… file[${i}].name = ${file.name}`);\r\n });\r\n }\r\n });\r\n\r\n ele.addEventListener('dragover', (ev) => {\r\n ev.preventDefault();\r\n this.#moveCallback(this.#mousePosition(ev));\r\n // console.log(ev)\r\n });\r\n\r\n // Context\r\n ele.addEventListener('contextmenu', (evt) => {\r\n contextMenu(this.#mousePosition(evt));\r\n evt.preventDefault()\r\n }, false);\r\n }\r\n\r\n #mousePosition(event: MouseEvent | DragEvent): Vector2 {\r\n var rect = this.#ele.getBoundingClientRect();\r\n return {\r\n x: event.clientX - rect.left,\r\n y: event.clientY - rect.top\r\n }\r\n }\r\n\r\n #move(event: MouseEvent): void {\r\n const pos = this.#mousePosition(event);\r\n\r\n if (this.#clicked) {\r\n const delta = Zero();\r\n SubVector2(delta, pos, this.#lastMousePosition);\r\n this.#dragCallback(delta)\r\n }\r\n\r\n this.#moveCallback(pos);\r\n CopyVector2(this.#lastMousePosition, pos);\r\n }\r\n\r\n #moveTouch(event: TouchEvent): void {\r\n const rect = this.#ele.getBoundingClientRect();\r\n const pos = {\r\n x: event.touches[0].clientX - rect.left,\r\n y: event.touches[0].clientY - rect.top\r\n }\r\n this.#moveCallback(pos);\r\n\r\n if (this.#clicked) {\r\n this.#dragCallback({\r\n x: pos.x - this.#lastTouch.x,\r\n y: pos.y - this.#lastTouch.y,\r\n });\r\n }\r\n\r\n CopyVector2(this.#lastTouch, pos);\r\n }\r\n\r\n #down(event: MouseEvent): void {\r\n // Only register left clicks\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n this.#clicked = true;\r\n this.#clickStart(this.#mousePosition(event), event.ctrlKey || event.shiftKey);\r\n }\r\n\r\n #touchDown(event: TouchEvent) {\r\n this.#clicked = true;\r\n const rect = this.#ele.getBoundingClientRect();\r\n this.#lastTouch.x = event.touches[0].clientX - rect.left;\r\n this.#lastTouch.y = event.touches[0].clientY - rect.top;\r\n this.#clickStart(this.#lastTouch, false);\r\n }\r\n\r\n #up(event: MouseEvent): void {\r\n // Only register left clicks\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n this.#clicked = false\r\n this.#clickStop();\r\n }\r\n}","import { Vector2 } from \"../types/vector2\"\r\n\r\n\r\nexport interface RenderElementSidesStyling {\r\n Left?: number\r\n Right?: number\r\n Top?: number\r\n Bottom?: number\r\n}\r\n\r\nexport interface RenderElementSides {\r\n Left: number\r\n Right: number\r\n Top: number\r\n Bottom: number\r\n}\r\n\r\nexport function InstantiateRenderElementSidesStyling(config?: RenderElementSidesStyling | number): RenderElementSides {\r\n if (typeof config === 'number') {\r\n return {\r\n Bottom: config,\r\n Right: config,\r\n Top: config,\r\n Left: config,\r\n }\r\n }\r\n return {\r\n Bottom: config?.Bottom === undefined ? 0 : config?.Bottom,\r\n Right: config?.Right === undefined ? 0 : config?.Right,\r\n Left: config?.Left === undefined ? 0 : config?.Left,\r\n Top: config?.Top === undefined ? 0 : config?.Top,\r\n }\r\n}\r\n\r\nexport interface IRenderElement {\r\n size(ctx: CanvasRenderingContext2D, out: Vector2): void;\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void;\r\n}\r\n\r\nexport interface Border {\r\n Color: string;\r\n Thickness: number;\r\n Radius: number;\r\n}\r\n\r\nexport interface BorderStyling {\r\n Color?: string;\r\n Thickness?: number;\r\n Radius?: number;\r\n}\r\n","import { Vector2 } from \"../types/vector2\";\r\nimport { Border, BorderStyling, InstantiateRenderElementSidesStyling, IRenderElement, RenderElementSides, RenderElementSidesStyling } from \"./interfaces\";\r\n\r\nexport enum Display {\r\n Flex = \"flex\",\r\n None = \"none\"\r\n}\r\n\r\nexport interface RenderElementBaseStyling {\r\n Margin?: RenderElementSidesStyling | number;\r\n Padding?: RenderElementSidesStyling | number;\r\n Border?: BorderStyling;\r\n BackgroundColor?: string;\r\n MinWidth?: number;\r\n MaxWidth?: number;\r\n MaxHeight?: number;\r\n MinHeight?: number;\r\n Grow?: number;\r\n Display?: Display;\r\n}\r\n\r\nexport abstract class RenderElementBase implements IRenderElement {\r\n\r\n #margin: RenderElementSides;\r\n\r\n #padding: RenderElementSides;\r\n\r\n #border: Border;\r\n\r\n #backgroundColor?: string;\r\n\r\n #minWidth?: number;\r\n\r\n #maxWidth?: number;\r\n\r\n #minHeight?: number;\r\n\r\n #maxHeight?: number;\r\n\r\n #grow?: number;\r\n\r\n #display: Display;\r\n\r\n constructor(config?: RenderElementBaseStyling) {\r\n this.#margin = InstantiateRenderElementSidesStyling(config?.Margin);\r\n this.#padding = InstantiateRenderElementSidesStyling(config?.Padding);\r\n this.#backgroundColor = config?.BackgroundColor;\r\n this.#border = {\r\n Color: config?.Border?.Color ?? \"black\",\r\n Thickness: config?.Border?.Thickness ?? 0,\r\n Radius: config?.Border?.Radius ?? 0,\r\n }\r\n this.#minWidth = config?.MinWidth;\r\n this.#maxWidth = config?.MaxWidth;\r\n this.#minHeight = config?.MinHeight;\r\n this.#maxHeight = config?.MaxHeight;\r\n this.#grow = config?.Grow;\r\n this.#display = config?.Display ?? Display.Flex;\r\n }\r\n\r\n setBackgroundColor(newColor: string): void {\r\n this.#backgroundColor = newColor;\r\n }\r\n\r\n abstract doRender(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void;\r\n\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void {\r\n if (this.#display === Display.None) {\r\n return;\r\n }\r\n\r\n const scaledSize = { x: 0, y: 0 };\r\n this.size(ctx, scaledSize);\r\n\r\n scaledSize.x = scaledSize.x * graphScale;\r\n scaledSize.y = scaledSize.y * graphScale;\r\n scaledSize.x = Math.max(scaledSize.x, scaledFillableSpace.x);\r\n scaledSize.y = Math.max(scaledSize.y, scaledFillableSpace.y);\r\n\r\n if (this.#backgroundColor) {\r\n ctx.fillStyle = this.#backgroundColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x + (this.#margin.Left * graphScale),\r\n position.y + (this.#margin.Right * graphScale),\r\n scaledSize.x - ((this.#margin.Left + this.#margin.Right) * graphScale),\r\n scaledSize.y - ((this.#margin.Top + this.#margin.Bottom) * graphScale),\r\n this.#border.Radius * graphScale\r\n );\r\n ctx.fill();\r\n }\r\n\r\n if (this.#border.Thickness > 0) {\r\n ctx.lineWidth = this.#border.Thickness * graphScale;\r\n ctx.strokeStyle = this.#border.Color;\r\n ctx.stroke();\r\n }\r\n\r\n const offsetPosition = {\r\n x: position.x + (this.#totalLeftOffset() * graphScale),\r\n y: position.y + (this.#totalTopOffset() * graphScale),\r\n };\r\n const elementSize = {\r\n x: scaledSize.x - (this.#horizontalOffset() * graphScale),\r\n y: scaledSize.y - (this.#verticalOffset() * graphScale)\r\n }\r\n this.doRender(ctx, offsetPosition, graphScale, elementSize);\r\n }\r\n\r\n // todo: Remove limitations argument?\r\n abstract calcSize(ctx: CanvasRenderingContext2D, out: Vector2, limitations: Vector2): void;\r\n\r\n protected maxLimitations(out: Vector2): void {\r\n out.x = -1;\r\n out.y = -1;\r\n\r\n if (this.#maxWidth) {\r\n out.x = this.#maxWidth;\r\n }\r\n\r\n if (this.#maxHeight) {\r\n out.y = this.#maxHeight;\r\n }\r\n }\r\n\r\n setDisplay(display: Display): void {\r\n this.#display = display;\r\n }\r\n\r\n getDisplay(): Display {\r\n return this.#display;\r\n }\r\n\r\n size(ctx: CanvasRenderingContext2D, out: Vector2): void {\r\n out.x = 0;\r\n out.y = 0;\r\n if (this.#display === Display.None) {\r\n return;\r\n }\r\n\r\n const maxLimits = { x: -1, y: -1 }\r\n this.maxLimitations(maxLimits);\r\n\r\n this.calcSize(ctx, out, maxLimits);\r\n\r\n out.x += this.#horizontalOffset();\r\n out.y += this.#verticalOffset();\r\n\r\n if (this.#minWidth) {\r\n out.x = Math.max(out.x, this.#minWidth)\r\n }\r\n\r\n if (this.#maxWidth) {\r\n out.x = Math.min(this.#maxWidth, out.x);\r\n }\r\n\r\n if (this.#maxHeight) {\r\n out.y = Math.min(this.#maxHeight, out.y);\r\n }\r\n\r\n if (this.#minHeight) {\r\n out.y = Math.max(this.#minHeight, out.y);\r\n }\r\n }\r\n\r\n #horizontalOffset(): number {\r\n return (this.#border.Thickness) +\r\n this.#margin.Left +\r\n this.#margin.Right +\r\n this.#padding.Left +\r\n this.#padding.Right;\r\n }\r\n\r\n #verticalOffset(): number {\r\n return (this.#border.Thickness) +\r\n this.#margin.Top +\r\n this.#margin.Bottom +\r\n this.#padding.Top +\r\n this.#padding.Bottom;\r\n }\r\n\r\n #totalTopOffset(): number {\r\n return (this.#border.Thickness / 2) +\r\n this.#margin.Top +\r\n this.#padding.Top;\r\n }\r\n\r\n #totalLeftOffset(): number {\r\n return (this.#border.Thickness / 2) +\r\n this.#margin.Left +\r\n this.#padding.Left;\r\n }\r\n}\r\n","import { ScaleVector, Vector2 } from '../types/vector2';\r\nimport { RenderElementBase, RenderElementBaseStyling } from \"./base\";\r\nimport { IRenderElement } from \"./interfaces\";\r\n\r\n\r\ninterface ContainerRenderElementConfig extends RenderElementBaseStyling {\r\n\r\n}\r\n\r\nexport enum LayoutDirection {\r\n Column = \"column\",\r\n Row = \"row\"\r\n}\r\n\r\nexport enum AlignItems {\r\n Stretch = \"stretch\",\r\n Start = \"start\",\r\n Center = \"center\",\r\n End = \"end\"\r\n}\r\n\r\nexport class ContainerRenderElement extends RenderElementBase {\r\n\r\n #elements: Array<IRenderElement>;\r\n\r\n #layout: LayoutDirection;\r\n\r\n #alignment: AlignItems;\r\n\r\n constructor(elements: Array<IRenderElement>, config?: ContainerRenderElementConfig) {\r\n super(config);\r\n this.#elements = elements;\r\n this.#layout = LayoutDirection.Column;\r\n this.#alignment = AlignItems.Stretch;\r\n }\r\n\r\n calcSize(ctx: CanvasRenderingContext2D, out: Vector2, limitations: Vector2): void {\r\n out.x = 0;\r\n out.y = 0;\r\n\r\n const eleSize = { x: 0, y: 0 };\r\n\r\n switch (this.#layout) {\r\n case LayoutDirection.Column:\r\n for (let i = 0; i < this.#elements.length; i++) {\r\n this.#elements[i].size(ctx, eleSize);\r\n out.x = Math.max(out.x, eleSize.x);\r\n out.y += eleSize.y;\r\n }\r\n break;\r\n\r\n case LayoutDirection.Row:\r\n for (let i = 0; i < this.#elements.length; i++) {\r\n this.#elements[i].size(ctx, eleSize);\r\n out.y = Math.max(out.y, eleSize.y);\r\n out.x += eleSize.x;\r\n }\r\n break;\r\n\r\n default:\r\n throw new Error(\"unknown layout: \" + this.#layout);\r\n }\r\n\r\n }\r\n\r\n doRender(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void {\r\n // const size = { x: 0, y: 0 };\r\n // const limitations = { x: 0, y: 0 };\r\n // this.limitations(limitations)\r\n // this.calcSize(ctx, size, limitations);\r\n switch (this.#layout) {\r\n case LayoutDirection.Column:\r\n this.#renderColumn(ctx, position, graphScale, scaledFillableSpace);\r\n break;\r\n\r\n default:\r\n throw new Error(\"unimplemented layout direction: \" + this.#layout);\r\n }\r\n }\r\n\r\n #renderColumn(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void {\r\n const currnetPos = { x: position.x, y: position.y };\r\n const scaledEleSize = { x: 0, y: 0 };\r\n for (let i = 0; i < this.#elements.length; i++) {\r\n const ele = this.#elements[i];\r\n\r\n ele.size(ctx, scaledEleSize);\r\n ScaleVector(scaledEleSize, graphScale);\r\n\r\n switch (this.#alignment) {\r\n\r\n case AlignItems.Stretch:\r\n currnetPos.x = position.x;\r\n scaledEleSize.x = scaledFillableSpace.x;\r\n break;\r\n\r\n // I'm not sure if this is even needed, I feel like this should\r\n // already be the case.\r\n case AlignItems.Start: //garney flarney <---- silly goose steenky feet\r\n currnetPos.x = position.x;\r\n break\r\n\r\n case AlignItems.End:\r\n currnetPos.x = scaledFillableSpace.x - scaledEleSize.x\r\n break;\r\n\r\n case AlignItems.Center:\r\n currnetPos.x = scaledFillableSpace.x - (scaledEleSize.x / 2)\r\n break;\r\n\r\n default:\r\n throw new Error(\"unimplmeneted alignment: \" + this.#alignment)\r\n }\r\n\r\n ele.render(ctx, currnetPos, graphScale, scaledEleSize);\r\n currnetPos.y += scaledEleSize.y;\r\n }\r\n }\r\n}","import { Text } from \"../types/text\";\r\nimport { CopyVector2, ScaleVector, Vector2, Zero } from \"../types/vector2\";\r\nimport { RenderElementBase, RenderElementBaseStyling } from \"./base\";\r\n\r\nexport enum TextAlign {\r\n Left = \"left\",\r\n Right = \"right\",\r\n Center = \"center\",\r\n}\r\n\r\nexport enum VerticalAlign {\r\n Top = \"top\",\r\n Center = \"center\",\r\n Bottom = \"bottom\"\r\n}\r\n\r\nexport interface TextElementStyling extends RenderElementBaseStyling {\r\n Align?: TextAlign\r\n VerticalAlign?: VerticalAlign\r\n LineHeight?: number\r\n}\r\n\r\nexport class TextElement extends RenderElementBase {\r\n #text: Text;\r\n\r\n #align: TextAlign;\r\n\r\n #verticalAlign: VerticalAlign;\r\n\r\n #lineHeight: number;\r\n\r\n constructor(text: Text, styling?: TextElementStyling) {\r\n super(styling);\r\n this.#text = text;\r\n this.#align = styling?.Align ?? TextAlign.Left;\r\n this.#verticalAlign = styling?.VerticalAlign ?? VerticalAlign.Top;\r\n this.#lineHeight = styling?.LineHeight ?? 1;\r\n }\r\n\r\n doRender(ctx: CanvasRenderingContext2D, position: Vector2, graphScale: number, scaledFillableSpace: Vector2): void {\r\n const scale = Zero();\r\n this.calcSize(ctx, scale, scaledFillableSpace);\r\n ScaleVector(scale, graphScale);\r\n\r\n const justifiedPosition = Zero();\r\n CopyVector2(justifiedPosition, position)\r\n\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\"\r\n\r\n switch (this.#align) {\r\n case TextAlign.Left:\r\n // Do nothing. This is default\r\n break;\r\n\r\n case TextAlign.Right:\r\n justifiedPosition.x += scaledFillableSpace.x - scale.x;\r\n break;\r\n\r\n case TextAlign.Center:\r\n justifiedPosition.x += (scaledFillableSpace.x - scale.x) / 2;\r\n break;\r\n\r\n default:\r\n throw new Error(\"unimplemented justification: \" + this.#align);\r\n }\r\n\r\n switch (this.#verticalAlign) {\r\n case VerticalAlign.Top:\r\n // Do nothing. This is default\r\n break;\r\n\r\n case VerticalAlign.Bottom:\r\n justifiedPosition.y += scaledFillableSpace.y - scale.y;\r\n break;\r\n\r\n case VerticalAlign.Center:\r\n justifiedPosition.y += (scaledFillableSpace.y - scale.y) / 2;\r\n break;\r\n\r\n default:\r\n throw new Error(\"unimplemented justification: \" + this.#align);\r\n }\r\n\r\n if (scaledFillableSpace.x <= 0) {\r\n this.#text.render(ctx, graphScale, justifiedPosition);\r\n } else {\r\n const eles = this.#text.breakIntoLines(ctx, scaledFillableSpace.x);\r\n\r\n const tempSize = { x: 0, y: 0 };\r\n for (let i = 0; i < eles.length; i++) {\r\n eles[i].render(ctx, graphScale, justifiedPosition);\r\n eles[i].size(ctx, 1, tempSize)\r\n justifiedPosition.y += this.#text.style().getSize() * this.#lineHeight\r\n }\r\n }\r\n }\r\n\r\n calcSize(ctx: CanvasRenderingContext2D, out: Vector2, limitations: Vector2): void {\r\n if (limitations.x <= 0) {\r\n this.#text.size(ctx, 1, out);\r\n return;\r\n }\r\n\r\n const eles = this.#text.breakIntoLines(ctx, limitations.x);\r\n const tempSize = { x: 0, y: 0 };\r\n out.x = 0;\r\n out.y = this.#text.style().getSize() * eles.length * this.#lineHeight;\r\n for (let i = 0; i < eles.length; i++) {\r\n eles[i].size(ctx, 1, tempSize)\r\n out.x = Math.max(tempSize.x, out.x);\r\n }\r\n }\r\n}\r\n","const binarySearch = ({ max, getValue, match }) => {\r\n let min = 0;\r\n\r\n while (min <= max) {\r\n let guess = Math.floor((min + max) / 2);\r\n const compareVal = getValue(guess);\r\n\r\n if (compareVal === match) return guess;\r\n if (compareVal < match) min = guess + 1;\r\n else max = guess - 1;\r\n }\r\n\r\n return max;\r\n};\r\n\r\nexport function fitString(ctx: CanvasRenderingContext2D, str: string, maxWidth: number): string {\r\n let width = ctx.measureText(str).width;\r\n const ellipsis = '…';\r\n const ellipsisWidth = ctx.measureText(ellipsis).width;\r\n if (width <= maxWidth || width <= ellipsisWidth) {\r\n return str;\r\n }\r\n\r\n const index = binarySearch({\r\n max: str.length,\r\n getValue: guess => ctx.measureText(str.substring(0, guess)).width,\r\n match: maxWidth - ellipsisWidth,\r\n });\r\n\r\n return str.substring(0, index) + ellipsis;\r\n};\r\n\r\nexport function splitString(ctx: CanvasRenderingContext2D, str: string, maxWidth: number): Array<string> {\r\n let width = ctx.measureText(str).width;\r\n if (width <= maxWidth) {\r\n return [str];\r\n }\r\n\r\n let index = binarySearch({\r\n max: str.length,\r\n getValue: guess => ctx.measureText(str.substring(0, guess)).width,\r\n match: maxWidth,\r\n });\r\n\r\n for (let backward = index - 1; backward >= 1; backward--) {\r\n if (str.charAt(backward) === \" \") {\r\n index = backward + 1;\r\n break;\r\n }\r\n }\r\n\r\n return [str.substring(0, index), str.substring(index)];\r\n};\r\n\r\n\r\nexport function splitStringIntoLines(ctx: CanvasRenderingContext2D, str: string, maxWidth: number): Array<string> {\r\n let width = ctx.measureText(str).width;\r\n if (width <= maxWidth) {\r\n return [str];\r\n }\r\n\r\n const strings = new Array<string>;\r\n let remaining = str;\r\n while (remaining !== \"\") {\r\n let index = binarySearch({\r\n max: remaining.length,\r\n getValue: guess => ctx.measureText(remaining.substring(0, guess)).width,\r\n match: maxWidth,\r\n });\r\n\r\n if (index === remaining.length) {\r\n strings.push(remaining.substring(0, index))\r\n break;\r\n }\r\n\r\n for (let backward = index - 1; backward >= 1; backward--) {\r\n if (remaining.charAt(backward) === \" \") {\r\n index = backward + 1;\r\n break;\r\n }\r\n }\r\n\r\n strings.push(remaining.substring(0, index))\r\n remaining = remaining.substring(index)\r\n }\r\n\r\n return strings;\r\n};\r\n\r\n// https://stackoverflow.com/a/18234317/4974261\r\nexport function Format(str: string, ...args: Array<string>): string {\r\n if (arguments.length) {\r\n for (let key in args) {\r\n str = str.replace(new RegExp(\"\\\\{\" + key + \"\\\\}\", \"gi\"), args[key]);\r\n }\r\n }\r\n return str;\r\n};","import { FontWeight, TextStyle, TextStyleConfig } from \"../styles/text\";\r\nimport { splitString, splitStringIntoLines } from \"../utils/string\";\r\nimport { CopyVector2, ScaleVector, Vector2, Zero } from \"./vector2\";\r\n\r\nexport interface MultilineTextConfig {\r\n MaxWidth?: number;\r\n LineSpacing?: number;\r\n}\r\n\r\nexport class Text {\r\n\r\n #measured: boolean\r\n\r\n #size: Vector2;\r\n\r\n #style: TextStyle;\r\n\r\n #value: string\r\n\r\n #maxWidth: number;\r\n\r\n #lineSpacing: number;\r\n\r\n #textToRender: Array<string>;\r\n\r\n constructor(value: string, style?: TextStyleConfig, config?: MultilineTextConfig) {\r\n this.#value = value;\r\n this.#measured = false;\r\n this.#size = Zero();\r\n this.#style = new TextStyle(style);\r\n this.#maxWidth = config?.MaxWidth ? config?.MaxWidth : -1;\r\n this.#lineSpacing = config?.LineSpacing ? config?.LineSpacing : 5;\r\n this.#textToRender = [value];\r\n\r\n if (!document.fonts.check(`16px \"${this.#style.getFont()}\"`)) {\r\n document.fonts.addEventListener(\"loadingdone\", (event) => {\r\n this.#measured = false;\r\n });\r\n }\r\n }\r\n\r\n set(newValue: string): void {\r\n this.#value = newValue;\r\n this.#measured = false;\r\n }\r\n\r\n get(): string {\r\n return this.#value;\r\n }\r\n\r\n breakIntoLines(ctx: CanvasRenderingContext2D, maxWidth: number): Array<Text> {\r\n const results = new Array<Text>();\r\n\r\n this.#style.setupStyle(ctx, 1);\r\n const entries = splitStringIntoLines(ctx, this.#value, maxWidth);\r\n if (entries.length === 1) {\r\n return [this];\r\n }\r\n for (let i = 0; i < entries.length; i++) {\r\n const text = new Text(entries[i])\r\n text.#style = this.#style;\r\n results.push(text)\r\n }\r\n\r\n return results;\r\n }\r\n\r\n split(char: string): Array<Text> {\r\n const entries = this.#value.split(char)\r\n const results = new Array<Text>();\r\n for (let i = 0; i < entries.length; i++) {\r\n const text = new Text(entries[i])\r\n text.#style = this.#style;\r\n results.push(text)\r\n }\r\n return results;\r\n }\r\n\r\n splitAtIndex(index: number): Array<Text> {\r\n const results = [\r\n new Text(this.#value.substring(0, index)),\r\n new Text(this.#value.substring(index, 0)),\r\n ];\r\n\r\n\r\n for (let i = 0; i < results.length; i++) {\r\n results[i].#style = this.#style;\r\n }\r\n return results;\r\n }\r\n\r\n splitAtWidth(ctx: CanvasRenderingContext2D, maxWidth: number): Array<Text> {\r\n this.#style.setupStyle(ctx, 1);\r\n const entries = splitString(ctx, this.#value, maxWidth);\r\n if (entries.length === 1) {\r\n return [this];\r\n }\r\n\r\n const results = new Array<Text>();\r\n for (let i = 0; i < entries.length; i++) {\r\n const text = new Text(entries[i])\r\n text.#style = this.#style;\r\n results.push(text)\r\n }\r\n return results;\r\n }\r\n\r\n #measure(ctx: CanvasRenderingContext2D): void {\r\n if (this.#measured) {\r\n return;\r\n }\r\n\r\n\r\n this.#style.setupStyle(ctx, 1);\r\n\r\n if (this.#maxWidth == -1) {\r\n const measurements = ctx.measureText(this.#value);\r\n this.#size.x = measurements.width;\r\n this.#size.y = measurements.actualBoundingBoxAscent + measurements.actualBoundingBoxDescent;\r\n this.#textToRender = [this.#value];\r\n this.#measured = true;\r\n return;\r\n }\r\n\r\n this.#textToRender = splitStringIntoLines(ctx, this.#value, this.#maxWidth);\r\n\r\n this.#size.x = 0;\r\n this.#size.y = 0;\r\n for (let i = 0; i < this.#textToRender.length; i++) {\r\n const measurements = ctx.measureText(this.#textToRender[i]);\r\n this.#size.x = Math.max(this.#size.x, measurements.width);\r\n }\r\n\r\n this.#size.y += ((this.#textToRender.length - 1) * this.#lineSpacing) + (this.#style.getSize() * this.#textToRender.length);\r\n this.#measured = true;\r\n }\r\n\r\n size(ctx: CanvasRenderingContext2D, scale: number, out: Vector2): void {\r\n this.#measure(ctx);\r\n CopyVector2(out, this.#size);\r\n ScaleVector(out, scale);\r\n }\r\n\r\n height(ctx: CanvasRenderingContext2D): number {\r\n this.#measure(ctx);\r\n return this.#size.y;\r\n }\r\n\r\n setColor(color: string): void {\r\n this.#style.setColor(color);\r\n }\r\n\r\n getColor(): string {\r\n return this.#style.getColor();\r\n }\r\n\r\n setSize(size: number): void {\r\n this.#style.setSize(size);\r\n }\r\n\r\n setWeight(weight: FontWeight): void {\r\n this.#style.setWeight(weight);\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, scale: number, position: Vector2): void {\r\n this.#measure(ctx);\r\n this.#style.setupStyle(ctx, scale);\r\n let yOffset = 0;\r\n for (let i = 0; i < this.#textToRender.length; i++) {\r\n ctx.fillText(\r\n this.#textToRender[i],\r\n position.x,\r\n position.y + yOffset\r\n );\r\n yOffset += (this.#style.getSize() + this.#lineSpacing) * scale\r\n }\r\n }\r\n\r\n style(): TextStyle {\r\n return this.#style;\r\n }\r\n}","export function Clamp(v: number, min: number, max: number): number {\r\n return Math.min(Math.max(v, min), max)\r\n}\r\n\r\nexport function Clamp01(v: number): number {\r\n return Clamp(v, 0, 1);\r\n}\r\n\r\n","import { Clamp01 } from './math';\r\n\r\nexport interface Color {\r\n r: number, // 0 - 1\r\n g: number, // 0 - 1\r\n b: number, // 0 - 1\r\n}\r\n\r\nexport interface HSV {\r\n h: number, // angle in degrees\r\n s: number, // 0 - 1\r\n v: number, // 0 - 1\r\n}\r\n\r\nfunction componentToHex(c: number) {\r\n var hex = c.toString(16);\r\n return hex.length == 1 ? \"0\" + hex : hex;\r\n}\r\n\r\nexport function RgbToHex(c: Color): string {\r\n return \"#\" + componentToHex(Math.round(c.r * 255)) + componentToHex(Math.round(c.g * 255)) + componentToHex(Math.round(c.b * 255));\r\n}\r\n\r\nexport function HexToColor(hex: string): Color | null {\r\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result ? {\r\n r: parseInt(result[1], 16) / 255,\r\n g: parseInt(result[2], 16) / 255,\r\n b: parseInt(result[3], 16) / 255\r\n } : null;\r\n}\r\n\r\n\r\nexport function HSV2RGB(hsv: HSV, out: Color): void {\r\n if (hsv.s <= 0.0) { // < is bogus, just shuts up warnings\r\n out.r = hsv.v;\r\n out.g = hsv.v;\r\n out.b = hsv.v;\r\n return;\r\n }\r\n let hh = hsv.h;\r\n if (hh >= 360.0) {\r\n hh = 0.0;\r\n }\r\n hh /= 60.0;\r\n\r\n const i = Math.round(hh);\r\n const ff = hh - i;\r\n const p = hsv.v * (1.0 - hsv.s);\r\n const q = hsv.v * (1.0 - (hsv.s * ff));\r\n const t = hsv.v * (1.0 - (hsv.s * (1.0 - ff)));\r\n\r\n switch (i) {\r\n case 0:\r\n out.r = hsv.v;\r\n out.g = t;\r\n out.b = p;\r\n break;\r\n case 1:\r\n out.r = q;\r\n out.g = hsv.v;\r\n out.b = p;\r\n break;\r\n case 2:\r\n out.r = p;\r\n out.g = hsv.v;\r\n out.b = t;\r\n break;\r\n\r\n case 3:\r\n out.r = p;\r\n out.g = q;\r\n out.b = hsv.v;\r\n break;\r\n case 4:\r\n out.r = t;\r\n out.g = p;\r\n out.b = hsv.v;\r\n break;\r\n // case 5:\r\n default:\r\n out.r = hsv.v;\r\n out.g = p;\r\n out.b = q;\r\n break;\r\n }\r\n\r\n out.r = Clamp01(out.r)\r\n out.g = Clamp01(out.g)\r\n out.b = Clamp01(out.b)\r\n}\r\n\r\nexport function RGB2HSV(rgb: Color, out: HSV): void {\r\n out.h = 0;\r\n out.s = 0;\r\n out.v = 0;\r\n let min: number = 0;\r\n let max: number = 0;\r\n let delta: number = 0;\r\n\r\n min = rgb.r < rgb.g ? rgb.r : rgb.g;\r\n min = min < rgb.b ? min : rgb.b;\r\n\r\n max = rgb.r > rgb.g ? rgb.r : rgb.g;\r\n max = max > rgb.b ? max : rgb.b;\r\n\r\n out.v = max; // v\r\n delta = max - min;\r\n if (delta < 0.00001) {\r\n out.s = 0;\r\n out.h = 0; // undefined, maybe nan?\r\n return;\r\n }\r\n if (max > 0.0) { // NOTE: if Max is == 0, this divide would cause a crash\r\n out.s = (delta / max); // s\r\n } else {\r\n // if max is 0, then r = g = b = 0 \r\n // s = 0, h is undefined\r\n out.s = 0.0;\r\n out.h = NaN; // its now undefined\r\n return;\r\n }\r\n if (rgb.r >= max) // > is bogus, just keeps compilor happy\r\n out.h = (rgb.g - rgb.b) / delta; // between yellow & magenta\r\n else\r\n if (rgb.g >= max)\r\n out.h = 2.0 + (rgb.b - rgb.r) / delta; // between cyan & yellow\r\n else\r\n out.h = 4.0 + (rgb.r - rgb.g) / delta; // between magenta & cyan\r\n\r\n out.h *= 60.0; // degrees\r\n\r\n if (out.h < 0.0)\r\n out.h += 360.0;\r\n\r\n}\r\n","import { Camera } from \"./camera\";\r\nimport { Connection } from './connection';\r\nimport { RenderElementBase } from \"./elements/base\";\r\nimport { ContainerRenderElement, AlignItems } from './elements/container';\r\nimport { TextAlign, TextElement } from \"./elements/text\";\r\nimport { FlowNode } from \"./node\";\r\nimport { PassSubsystem } from \"./pass/subsystem\";\r\nimport { FontStyle } from \"./styles/text\";\r\nimport { Box, InBox } from \"./types/box\";\r\nimport { Text } from \"./types/text\";\r\nimport { Vector2 } from \"./types/vector2\";\r\nimport { Color, HSV, HSV2RGB, RgbToHex } from './utils/color';\r\n\r\nexport enum PortType {\r\n Input = \"INPUT\",\r\n Output = \"OUTPUT\",\r\n InputArray = \"INPUTARRAY\",\r\n}\r\n\r\nexport interface PortStyle {\r\n size?: number;\r\n fillColor?: string;\r\n borderColor?: string;\r\n borderSize?: number;\r\n}\r\n\r\ntype ConnectionChangeCallback = (connection: Connection, connectionIndex: number, port: Port, portType: PortType, node: FlowNode) => void\r\n\r\nexport interface PortConfig {\r\n name?: string;\r\n type?: string;\r\n description?: string;\r\n array?: boolean;\r\n emptyStyle?: PortStyle;\r\n filledStyle?: PortStyle;\r\n onConnectionAdded?: ConnectionChangeCallback;\r\n onConnectionRemoved?: ConnectionChangeCallback;\r\n};\r\n\r\n// Calculate a color hash for an arbirary type\r\nfunction fallbackColor(type: string, s: number): string {\r\n let value = 0;\r\n for (var i = 0; i < type.length; i++) {\r\n value += type.charCodeAt(i) * (i + 1);\r\n }\r\n\r\n const mod = 24;\r\n value = Math.round(value) % mod;\r\n\r\n const hsv: HSV = { h: (value / (mod - 1)) * 360, s: s, v: 1 };\r\n const color: Color = { r: 0, g: 0, b: 0 };\r\n HSV2RGB(hsv, color);\r\n return RgbToHex(color);\r\n}\r\n\r\nexport class Port {\r\n\r\n #node: FlowNode;\r\n\r\n #displayName: string;\r\n\r\n #emptyStyle: PortStyle;\r\n\r\n #filledStyle: PortStyle;\r\n\r\n #connections: Array<Connection>;\r\n\r\n #portType: PortType\r\n\r\n #dataType: string;\r\n\r\n #dataTypePopupElement: RenderElementBase;\r\n\r\n #onConnectionAdded: Array<ConnectionChangeCallback>;\r\n\r\n #onConnectionRemoved: Array<ConnectionChangeCallback>;\r\n\r\n constructor(node: FlowNode, portType: PortType, config?: PortConfig) {\r\n this.#node = node;\r\n this.#connections = new Array<Connection>();\r\n this.#portType = portType;\r\n this.#displayName = config?.name === undefined ? \"Port\" : config?.name;\r\n this.#dataType = config?.type === undefined ? \"\" : config?.type;\r\n\r\n this.#emptyStyle = {\r\n borderColor: config?.emptyStyle?.borderColor === undefined ? \"#1c1c1c\" : config.emptyStyle?.borderColor,\r\n fillColor: config?.emptyStyle?.fillColor === undefined ? fallbackColor(this.#dataType, 0.3) : config.emptyStyle?.fillColor,\r\n borderSize: config?.emptyStyle?.borderSize === undefined ? 1 : config.emptyStyle?.borderSize,\r\n size: config?.emptyStyle?.size === undefined ? 4 : config.emptyStyle?.size\r\n }\r\n\r\n this.#filledStyle = {\r\n borderColor: config?.filledStyle?.borderColor === undefined ? \"#1c1c1c\" : config.filledStyle?.borderColor,\r\n fillColor: config?.filledStyle?.fillColor === undefined ? fallbackColor(this.#dataType, 1) : config.filledStyle?.fillColor,\r\n borderSize: config?.filledStyle?.borderSize === undefined ? 1 : config.filledStyle?.borderSize,\r\n size: config?.filledStyle?.size === undefined ? 5 : config.filledStyle?.size\r\n }\r\n\r\n this.#onConnectionAdded = new Array<ConnectionChangeCallback>();\r\n if (config?.onConnectionAdded) {\r\n this.#onConnectionAdded.push(config?.onConnectionAdded);\r\n }\r\n\r\n this.#onConnectionRemoved = new Array<ConnectionChangeCallback>();\r\n if (config?.onConnectionRemoved) {\r\n this.#onConnectionRemoved.push(config?.onConnectionRemoved);\r\n }\r\n\r\n const containerElements = new Array<RenderElementBase>();\r\n let dataTypeDisplay = this.#dataType;\r\n if (config?.array === true) {\r\n dataTypeDisplay = \"Array<\" + dataTypeDisplay + \">\"\r\n }\r\n containerElements.push(new TextElement(\r\n new Text(dataTypeDisplay, {\r\n color: \"white\",\r\n }),\r\n {\r\n Align: TextAlign.Center,\r\n }\r\n ));\r\n\r\n const description = config?.description;\r\n if (description && description !== \"\") {\r\n containerElements.push(new TextElement(\r\n new Text(description, { color: \"white\", style: FontStyle.Italic }),\r\n {\r\n Align: TextAlign.Center,\r\n Padding: { Top: 16 },\r\n MaxWidth: 400,\r\n LineHeight: 1.5\r\n }\r\n ));\r\n }\r\n\r\n this.#dataTypePopupElement = new ContainerRenderElement(\r\n containerElements,\r\n {\r\n BackgroundColor: \"rgba(0, 0, 0, 0.85)\",\r\n Border: {\r\n Radius: 6,\r\n },\r\n Padding: 13,\r\n }\r\n );\r\n }\r\n\r\n addConnection(connection: Connection): void {\r\n const c = this.#connections.length;\r\n this.#connections.push(connection);\r\n for (let i = 0; i < this.#onConnectionAdded.length; i++) {\r\n this.#onConnectionAdded[i](connection, c, this, this.#portType, this.#node);\r\n }\r\n }\r\n\r\n replaceConnection(connection: Connection, index: number): void {\r\n const c = this.#connections.length;\r\n this.#connections[index] = connection;\r\n for (let i = 0; i < this.#onConnectionAdded.length; i++) {\r\n this.#onConnectionAdded[i](connection, c, this, this.#portType, this.#node);\r\n }\r\n }\r\n\r\n addConnectionAddedListener(callback: ConnectionChangeCallback) {\r\n if (callback === undefined) {\r\n return;\r\n }\r\n this.#onConnectionAdded.push(callback);\r\n }\r\n\r\n connections(): Array<Connection> {\r\n return this.#connections;\r\n }\r\n\r\n addConnectionRemovedListener(callback: ConnectionChangeCallback) {\r\n if (callback === undefined) {\r\n return;\r\n }\r\n this.#onConnectionRemoved.push(callback);\r\n }\r\n\r\n clearConnection(connection: Connection): void {\r\n const index = this.#connections.indexOf(connection);\r\n if (index > -1) {\r\n this.#connections.splice(index, 1);\r\n for (let i = 0; i < this.#onConnectionRemoved.length; i++) {\r\n this.#onConnectionRemoved[i](connection, index, this, this.#portType, this.#node);\r\n }\r\n } else {\r\n console.error(\"no connection found to remove\");\r\n }\r\n }\r\n\r\n getDataType(): string {\r\n return this.#dataType;\r\n }\r\n\r\n getPortType(): PortType {\r\n return this.#portType;\r\n }\r\n\r\n getDisplayName(): string {\r\n return this.#displayName;\r\n }\r\n\r\n filledStyleColor(): string {\r\n if (this.#filledStyle.fillColor === undefined) {\r\n console.error(\"There's no fill color!!!!!!!!!\")\r\n return \"black\";\r\n }\r\n return this.#filledStyle.fillColor;\r\n }\r\n\r\n #box: Box = { Position: { x: 0, y: 0 }, Size: { x: 0, y: 0 } };\r\n\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, camera: Camera, mousePosition: Vector2 | undefined, postProcess: PassSubsystem): Box {\r\n let style = this.#emptyStyle;\r\n if (this.#connections.length > 0) {\r\n style = this.#filledStyle;\r\n }\r\n\r\n let scaledRadius = style.size as number * camera.zoom\r\n\r\n if (mousePosition && InBox(this.#box, mousePosition)) {\r\n scaledRadius *= 1.25;\r\n\r\n // Redeclare so lambda is ensured to use these values\r\n const xPos = position.x;\r\n const yPos = position.y;\r\n\r\n // TODO: Make it so we're not creating a new lambda each frame\r\n postProcess.queue(() => {\r\n const size = { x: 0, y: 0 }\r\n this.#dataTypePopupElement.calcSize(ctx, size, { x: -1, y: -1 });\r\n // size.x = Math.min(150, size.x)\r\n this.#dataTypePopupElement.render(ctx, { x: xPos - (size.x / 2), y: yPos }, 1, size)\r\n })\r\n }\r\n\r\n this.#box.Position.x = position.x - scaledRadius;\r\n this.#box.Position.y = position.y - scaledRadius;\r\n this.#box.Size.x = scaledRadius * 2;\r\n this.#box.Size.y = scaledRadius * 2;\r\n\r\n ctx.strokeStyle = style.borderColor as string;\r\n ctx.fillStyle = style.fillColor as string;\r\n\r\n ctx.beginPath();\r\n if (this.#portType === PortType.InputArray) {\r\n ctx.rect(position.x - scaledRadius, position.y - scaledRadius, scaledRadius * 2, scaledRadius * 2)\r\n } else {\r\n ctx.arc(position.x, position.y, scaledRadius, 0, 2 * Math.PI);\r\n }\r\n ctx.fill();\r\n ctx.stroke();\r\n\r\n\r\n return this.#box;\r\n }\r\n}","export interface StrokeStyleConfig {\r\n size?: number;\r\n color?: string;\r\n}\r\n\r\nexport function StrokeStyleWithFallback(input?: StrokeStyleConfig, fallback?: StrokeStyleConfig): StrokeStyleConfig {\r\n return {\r\n color: input?.color === undefined ? fallback?.color : input?.color,\r\n size: input?.size === undefined ? fallback?.size : input?.size,\r\n };\r\n}\r\n\r\nexport class StrokeStyle {\r\n #size: number;\r\n\r\n #color: string;\r\n\r\n constructor(config?: StrokeStyleConfig) {\r\n this.#size = config?.size === undefined ? 0.5 : config.size;\r\n this.#color = config?.color === undefined ? \"black\" : config.color;\r\n }\r\n\r\n setupStyle(ctx: CanvasRenderingContext2D, scale: number): void {\r\n ctx.strokeStyle = this.#color;\r\n ctx.lineWidth = scale * this.#size;\r\n }\r\n\r\n setColor(newColor: string): void {\r\n this.#color = newColor;\r\n }\r\n\r\n setSize(newSize: number): void {\r\n this.#size = newSize;\r\n }\r\n\r\n size(): number {\r\n return this.#size;\r\n }\r\n}","import { Box } from \"../types/box\";\r\nimport { StrokeStyle, StrokeStyleConfig, StrokeStyleWithFallback } from \"./stroke\";\r\n\r\nexport interface BoxStyleConfig {\r\n border?: StrokeStyleConfig;\r\n color?: string;\r\n radius?: number;\r\n}\r\n\r\nexport function BoxStyleWithFallback(input?: BoxStyleConfig, fallback?: BoxStyleConfig): BoxStyleConfig {\r\n return {\r\n radius: input?.radius === undefined ? fallback?.radius : input?.radius,\r\n color: input?.color === undefined ? fallback?.color : input?.color,\r\n border: StrokeStyleWithFallback(input?.border, fallback?.border)\r\n };\r\n}\r\n\r\nexport class BoxStyle {\r\n #border: StrokeStyle | null;\r\n\r\n #color: string;\r\n\r\n #radius: number;\r\n\r\n constructor(config?: BoxStyleConfig) {\r\n this.#color = config?.color === undefined ? \"#CCCCCC\" : config.color;\r\n this.#border = config?.border === undefined ? null : new StrokeStyle(config.border);\r\n this.#radius = config?.radius === undefined ? 2 : config.radius;\r\n }\r\n\r\n #box(ctx: CanvasRenderingContext2D, box: Box, scale: number, radius: any): void {\r\n ctx.fillStyle = this.#color\r\n this.#border?.setupStyle(ctx, scale);\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n box.Position.x,\r\n box.Position.y,\r\n box.Size.x,\r\n box.Size.y,\r\n radius\r\n );\r\n ctx.fill();\r\n }\r\n\r\n #draw(ctx: CanvasRenderingContext2D, box: Box, scale: number, radius: any): void {\r\n this.#box(ctx, box, scale, radius);\r\n ctx.stroke();\r\n }\r\n\r\n Outline(ctx: CanvasRenderingContext2D, box: Box, scale: number, radius: any): void {\r\n this.#border?.setupStyle(ctx, scale);\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n box.Position.x,\r\n box.Position.y,\r\n box.Size.x,\r\n box.Size.y,\r\n radius\r\n );\r\n ctx.stroke();\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, box: Box, scale: number): void {\r\n this.#draw(ctx, box, scale, this.#radius * scale)\r\n }\r\n\r\n DrawRoundedTopOnly(ctx: CanvasRenderingContext2D, box: Box, scale: number): void {\r\n this.#draw(ctx, box, scale, [this.#radius * scale * 2, this.#radius * scale * 2, 0, 0])\r\n }\r\n\r\n DrawUnderline(ctx: CanvasRenderingContext2D, box: Box, scale: number): void {\r\n this.#box(ctx, box, scale, [this.#radius * scale * 2, this.#radius * scale * 2, 0, 0]);\r\n ctx.beginPath();\r\n ctx.moveTo(box.Position.x, box.Position.y + box.Size.y)\r\n ctx.lineTo(box.Position.x + box.Size.x, box.Position.y + box.Size.y);\r\n ctx.stroke();\r\n }\r\n\r\n borderSize(): number {\r\n if (this.#border === null) {\r\n return 0;\r\n }\r\n return this.#border.size();\r\n }\r\n\r\n radius(): number {\r\n return this.#radius;\r\n }\r\n\r\n setColor(color: string): void {\r\n this.#color = color;\r\n }\r\n\r\n setBorderColor(color: string): void {\r\n if (this.#border === null) {\r\n this.#border = new StrokeStyle({\r\n color: color\r\n })\r\n } else {\r\n this.#border.setColor(color);\r\n }\r\n }\r\n\r\n}","export interface PopupConfig {\r\n title: string;\r\n options: Array<string>;\r\n\r\n onClose?: (button: string | null) => void;\r\n content?: () => Element;\r\n buttonCSS?: string;\r\n}\r\n\r\nexport class Popup {\r\n\r\n #title: string;\r\n\r\n #options: Array<string>;\r\n\r\n #content?: () => Element;\r\n\r\n #onClose?: (button: string | null) => void;\r\n\r\n // Styling ================================================================\r\n\r\n #buttonCSS: string;\r\n\r\n // Runtime ================================================================\r\n\r\n #popup: HTMLDivElement | null;\r\n\r\n constructor(config: PopupConfig) {\r\n this.#title = config.title;\r\n this.#options = config.options;\r\n this.#content = config.content;\r\n this.#onClose = config.onClose;\r\n this.#buttonCSS = config.buttonCSS === undefined ? \"flex-grow: 1; margin-right: 8px;\" : config.buttonCSS;\r\n this.#popup = null;\r\n }\r\n\r\n Hide(): void {\r\n if (this.#popup === null) {\r\n return;\r\n }\r\n document.body.removeChild(this.#popup);\r\n this.#popup = null;\r\n }\r\n\r\n Show(): void {\r\n this.#popup = document.createElement('div');\r\n this.#popup.style.cssText = 'position:absolute;top:0;width:100%;display:flex;height:100%;justify-content:center;align-items:center;background-color:#00000070;';\r\n document.body.appendChild(this.#popup);\r\n\r\n const container = document.createElement('div');\r\n container.style.cssText = 'background-color:#000;color:white;font-family:Verdana;border-radius:8px;padding:16px;';\r\n this.#popup.appendChild(container);\r\n\r\n const title = document.createElement(\"h2\");\r\n title.textContent = this.#title;\r\n title.style.cssText = \"margin-top:0;margin-bottom:16px;\";\r\n container.appendChild(title)\r\n\r\n if (this.#content !== undefined) {\r\n container.appendChild(this.#content());\r\n }\r\n\r\n const buttonContainer = document.createElement(\"div\");\r\n buttonContainer.style.cssText = 'margin-top:16px;justify-content:space-around;align-items:center;flex-direction:row;display:flex;';\r\n container.appendChild(buttonContainer);\r\n\r\n for (let i = 0; i < this.#options.length; i++) {\r\n const button = document.createElement(\"button\");\r\n button.style.cssText = this.#buttonCSS;\r\n button.textContent = this.#options[i];\r\n button.onclick = () => {\r\n this.Hide();\r\n if (this.#onClose !== undefined) {\r\n this.#onClose(this.#options[i]);\r\n }\r\n };\r\n buttonContainer.appendChild(button);\r\n }\r\n }\r\n\r\n} ","import { Box } from \"../types/box\";\r\nimport { BoxStyle, BoxStyleConfig, BoxStyleWithFallback } from \"./box\";\r\nimport { TextAlign } from \"./canvasTextAlign\";\r\nimport { TextBaseline } from \"./canvasTextBaseline\";\r\nimport { TextStyle, TextStyleConfig, TextStyleFallback } from './text';\r\n\r\n\r\nexport interface TextBoxStyleConfig {\r\n box?: BoxStyleConfig;\r\n text?: TextStyleConfig;\r\n\r\n textAlign?: CanvasTextAlign;\r\n textBaseline?: CanvasTextBaseline;\r\n}\r\n\r\nexport function TextBoxStyleWithFallback(input?: TextBoxStyleConfig, fallback?: TextBoxStyleConfig): TextBoxStyleConfig {\r\n return {\r\n box: BoxStyleWithFallback(input?.box, fallback?.box),\r\n text: TextStyleFallback(input?.text, fallback?.text),\r\n \r\n textAlign: input?.textAlign === undefined ? fallback?.textAlign : input?.textAlign,\r\n textBaseline: input?.textBaseline === undefined ? fallback?.textBaseline : input?.textBaseline,\r\n };\r\n}\r\n\r\nexport class TextBoxStyle {\r\n #box: BoxStyle;\r\n\r\n #text: TextStyle;\r\n\r\n #textAlign: CanvasTextAlign;\r\n\r\n #textBaseline: CanvasTextBaseline;\r\n\r\n constructor(config?: TextBoxStyleConfig) {\r\n this.#box = new BoxStyle(config?.box);\r\n this.#text = new TextStyle(config?.text);\r\n\r\n this.#textAlign = config?.textAlign === undefined ? TextAlign.Center : config.textAlign;\r\n this.#textBaseline = config?.textBaseline === undefined ? TextBaseline.Middle : config.textBaseline;\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, box: Box, scale: number, text: string) {\r\n this.#box.Draw(ctx, box, scale);\r\n\r\n ctx.textAlign = this.#textAlign;\r\n ctx.textBaseline = this.#textBaseline;\r\n this.#text.setupStyle(ctx, scale);\r\n\r\n ctx.fillText(\r\n text,\r\n box.Position.x + (box.Size.x / 2),\r\n box.Position.y + (box.Size.y / 2),\r\n );\r\n }\r\n\r\n DrawUnderline(ctx: CanvasRenderingContext2D, box: Box, scale: number, text: string) {\r\n this.#box.DrawUnderline(ctx, box, scale);\r\n\r\n ctx.textAlign = this.#textAlign;\r\n ctx.textBaseline = this.#textBaseline;\r\n this.#text.setupStyle(ctx, scale);\r\n\r\n ctx.fillText(\r\n text,\r\n box.Position.x + (box.Size.x / 2),\r\n box.Position.y + (box.Size.y / 2),\r\n );\r\n }\r\n\r\n setTextColor(color: string): void {\r\n this.#text.setColor(color);\r\n }\r\n\r\n setBoxColor(color: string): void {\r\n this.#box.setColor(color);\r\n }\r\n\r\n setBorderColor(color: string): void {\r\n this.#box.setBorderColor(color);\r\n }\r\n}","import { Box } from '../types/box';\r\nimport { Vector2 } from '../types/vector2';\r\n\r\nexport const width = 150;\r\nexport const height = 25;\r\n\r\nexport interface Widget {\r\n Size(): Vector2\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box\r\n ClickStart(): void\r\n ClickEnd(): void\r\n}","import { Theme } from \"../theme\";\r\nimport { Popup } from \"../popup\";\r\nimport { TextBoxStyle, TextBoxStyleConfig, TextBoxStyleWithFallback } from \"../styles/textBox\";\r\nimport { Box, InBox } from '../types/box';\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\nimport { height, width } from \"./widget\";\r\nimport { FlowNode } from \"../node\";\r\n\r\nexport interface NumberWidgetConfig {\r\n value?: number;\r\n\r\n property?: string;\r\n\r\n idleBoxStyle?: TextBoxStyleConfig;\r\n\r\n highlightBoxStyle?: TextBoxStyleConfig;\r\n\r\n callback?: (newNumber: number) => void;\r\n}\r\n\r\nexport class NumberWidget {\r\n\r\n #node: FlowNode;\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n #value: number;\r\n\r\n #idleBoxStyle: TextBoxStyle;\r\n\r\n #highlightBoxStyle: TextBoxStyle;\r\n\r\n #text: string;\r\n\r\n #callback?: (newNumber: number) => void;\r\n\r\n constructor(node: FlowNode, config?: NumberWidgetConfig) {\r\n this.#value = 0;\r\n this.#text = \"0\";\r\n\r\n this.#node = node;\r\n this.#nodeProperty = config?.property;\r\n this.#idleBoxStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.idleBoxStyle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n },\r\n radius: Theme.Widget.Border.Radius\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.#highlightBoxStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.highlightBoxStyle, {\r\n box: {\r\n color: Theme.Widget.Hover.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n },\r\n radius: Theme.Widget.Border.Radius\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.Set(config?.value === undefined ? 0 : config?.value);\r\n this.#callback = config?.callback;\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.addPropertyChangeListener(this.#nodeProperty, (oldVal, newVal) => {\r\n this.Set(newVal);\r\n });\r\n }\r\n\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n Set(newNumber: number): void {\r\n if (this.#value === newNumber) {\r\n return;\r\n }\r\n\r\n this.#value = newNumber;\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.setProperty(this.#nodeProperty, this.#value);\r\n }\r\n\r\n if (this.#callback !== undefined) {\r\n this.#callback(this.#value);\r\n }\r\n\r\n // https://stackoverflow.com/questions/5765398/whats-the-best-way-to-convert-a-number-to-a-string-in-javascript\r\n this.#text = '' + parseFloat(this.#value.toPrecision(6));\r\n }\r\n\r\n ClickStart(): void {\r\n }\r\n\r\n ClickEnd(): void {\r\n let input: HTMLInputElement | null = null;\r\n\r\n const setOption = \"Set\";\r\n const cancelOption = \"Cancel\";\r\n const popup = new Popup({\r\n title: \"Set Number\",\r\n options: [setOption, cancelOption],\r\n content: () => {\r\n const container = document.createElement('div');\r\n input = document.createElement('input')\r\n input.type = \"number\";\r\n input.valueAsNumber = this.#value;\r\n container.append(input);\r\n return container;\r\n },\r\n onClose: (button: string | null): void => {\r\n if (button !== setOption || input === null) {\r\n return;\r\n }\r\n\r\n this.Set(input.valueAsNumber);\r\n },\r\n });\r\n\r\n popup.Show();\r\n }\r\n\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const box = {\r\n Position: { x: 0, y: 0 },\r\n Size: {\r\n x: width * scale,\r\n y: height * scale\r\n }\r\n };\r\n CopyVector2(box.Position, position);\r\n\r\n let style: TextBoxStyle = this.#idleBoxStyle;\r\n\r\n if (mousePosition !== undefined) {\r\n if (InBox(box, mousePosition)) {\r\n style = this.#highlightBoxStyle;\r\n }\r\n }\r\n\r\n style.DrawUnderline(ctx, box, scale, this.#text)\r\n\r\n return box;\r\n }\r\n}","import { Theme } from \"../theme\";\r\nimport { TextBoxStyle, TextBoxStyleConfig, TextBoxStyleWithFallback } from \"../styles/textBox\";\r\nimport { Box, InBox } from \"../types/box\";\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\nimport { height, width } from \"./widget\";\r\n\r\n\r\nexport interface ButtonWidgetConfig {\r\n text?: string;\r\n callback?: () => void;\r\n idleStyle?: TextBoxStyleConfig;\r\n hoverStyle?: TextBoxStyleConfig;\r\n clickStyle?: TextBoxStyleConfig;\r\n}\r\n\r\nexport class ButtonWidget {\r\n\r\n #text: string;\r\n\r\n #idleStyle: TextBoxStyle;\r\n\r\n #hoverStyle: TextBoxStyle;\r\n\r\n #clickStyle: TextBoxStyle;\r\n\r\n #callback?: () => void;\r\n\r\n #gettingClicked: boolean;\r\n\r\n constructor(config?: ButtonWidgetConfig) {\r\n this.#text = config?.text === undefined ? \"Button\" : config?.text;\r\n this.#callback = config?.callback\r\n this.#gettingClicked = false;\r\n\r\n this.#idleStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.idleStyle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.#hoverStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.hoverStyle, {\r\n box: {\r\n color: Theme.Widget.Hover.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.#clickStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.clickStyle, {\r\n box: { \r\n color: Theme.Widget.Button.Click.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }))\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const box = {\r\n Position: { x: 0, y: 0 },\r\n Size: {\r\n x: width * scale,\r\n y: height * scale\r\n }\r\n };\r\n CopyVector2(box.Position, position);\r\n\r\n let style: TextBoxStyle = this.#idleStyle;\r\n\r\n if (mousePosition !== undefined && !this.#gettingClicked) {\r\n if (InBox(box, mousePosition)) {\r\n style = this.#hoverStyle;\r\n }\r\n }\r\n\r\n if (this.#gettingClicked) {\r\n style = this.#clickStyle;\r\n }\r\n style.Draw(ctx, box, scale, this.#text);\r\n\r\n return box\r\n }\r\n\r\n ClickStart(): void {\r\n this.#gettingClicked = true;\r\n }\r\n\r\n ClickEnd(): void {\r\n this.#gettingClicked = false;\r\n if (this.#callback !== undefined) {\r\n this.#callback();\r\n }\r\n }\r\n}","import { HexToColor } from \"../utils/color\";\r\nimport { TextStyleConfig } from \"../styles/text\";\r\nimport { Box } from \"../types/box\";\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\nimport { height, width } from \"./widget\";\r\nimport { Popup } from \"../popup\";\r\nimport { TextBoxStyle } from '../styles/textBox';\r\nimport { Theme } from \"../theme\";\r\nimport { FlowNode } from \"../node\";\r\n\r\nexport interface ColorWidgetConfig {\r\n value?: string;\r\n\r\n property?: string;\r\n\r\n textStyle?: TextStyleConfig;\r\n\r\n callback?: (newColor: string) => void;\r\n}\r\n\r\nfunction contrastColor(color: string): string {\r\n const c = HexToColor(color);\r\n if (c === null) {\r\n return \"black\";\r\n }\r\n\r\n if ((c.r + c.g + c.b) / 3 > 0.5) {\r\n return \"black\"\r\n }\r\n\r\n return \"white\";\r\n}\r\n\r\nexport class ColorWidget {\r\n\r\n #node: FlowNode;\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n #value: string;\r\n\r\n #contrast: string;\r\n\r\n #textBoxStyle: TextBoxStyle;\r\n\r\n #callback?: (newColor: string) => void;\r\n\r\n constructor(node: FlowNode, config?: ColorWidgetConfig) {\r\n this.#value = \"#000000\"\r\n this.#contrast = contrastColor(this.#value);\r\n this.Set(config?.value === undefined ? \"#000000\" : config?.value);\r\n \r\n this.#node = node;\r\n this.#nodeProperty = config?.property;\r\n this.#textBoxStyle = new TextBoxStyle({\r\n box: {\r\n color: this.#value,\r\n border: {\r\n color: this.#contrast,\r\n size: Theme.Widget.Border.Size\r\n }\r\n },\r\n text: config?.textStyle\r\n });\r\n this.#callback = config?.callback;\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.addPropertyChangeListener(this.#nodeProperty, (oldVal, newVal) => {\r\n this.Set(newVal);\r\n });\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n Set(value: string): void {\r\n if (this.#value === value) {\r\n return;\r\n }\r\n\r\n this.#value = value;\r\n\r\n if (this.#callback !== undefined) {\r\n this.#callback(this.#value);\r\n }\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.setProperty(this.#nodeProperty, this.#value);\r\n }\r\n\r\n // Update Styling\r\n this.#contrast = contrastColor(this.#value);\r\n this.#textBoxStyle.setBoxColor(this.#value);\r\n this.#textBoxStyle.setBorderColor(this.#contrast);\r\n this.#textBoxStyle.setTextColor(this.#contrast);\r\n }\r\n\r\n ClickStart(): void {\r\n }\r\n\r\n ClickEnd(): void {\r\n let input: HTMLInputElement | null = null;\r\n\r\n const popup = new Popup({\r\n title: \"Set Color\",\r\n options: [\"Set\", \"Cancel\"],\r\n content: () => {\r\n const container = document.createElement('div');\r\n\r\n input = document.createElement('input')\r\n input.type = \"color\";\r\n input.value = this.#value;\r\n input.name = \"color\"\r\n container.append(input);\r\n\r\n const label = document.createElement(\"label\");\r\n label.htmlFor = \"color\";\r\n label.textContent = \"Color\";\r\n container.append(label);\r\n\r\n return container;\r\n },\r\n onClose: (button: string | null): void => {\r\n if (button !== \"Set\" || input === null) {\r\n return;\r\n }\r\n\r\n this.Set(input.value);\r\n },\r\n });\r\n\r\n popup.Show();\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const box = {\r\n Position: { x: 0, y: 0 },\r\n Size: {\r\n x: width * scale,\r\n y: height * scale\r\n }\r\n };\r\n CopyVector2(box.Position, position);\r\n\r\n this.#textBoxStyle.Draw(ctx, box, scale, this.#value)\r\n\r\n return box;\r\n }\r\n}","import { Theme } from \"../theme\";\r\nimport { TextAlign } from \"../styles/canvasTextAlign\";\r\nimport { TextStyle, TextStyleConfig, TextStyleFallback } from \"../styles/text\";\r\nimport { Box } from '../types/box';\r\nimport { CopyVector2, Vector2, Zero } from \"../types/vector2\";\r\nimport { Clamp, Clamp01 } from \"../utils/math\";\r\nimport { height, width } from \"./widget\";\r\nimport { TextBaseline } from \"../styles/canvasTextBaseline\";\r\nimport { FlowNode } from \"../node\";\r\n\r\nexport interface SliderWidgetConfig {\r\n\r\n property?: string;\r\n\r\n min?: number;\r\n\r\n max?: number;\r\n\r\n value?: number;\r\n\r\n backgroundColor?: string;\r\n\r\n borderColor?: string;\r\n\r\n fillColor?: string;\r\n\r\n textStyle?: TextStyleConfig;\r\n\r\n change?: (newValue: number) => void;\r\n\r\n release?: (newValue: number) => void;\r\n\r\n snapIncrement?: number;\r\n\r\n}\r\n\r\nexport class SliderWidget {\r\n\r\n // Data Variables =========================================================\r\n\r\n #min: number;\r\n\r\n #max: number;\r\n\r\n #value: number;\r\n\r\n #text: string;\r\n\r\n #snapIncrement?: number;\r\n\r\n #node: FlowNode;\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n // Callbacks ==============================================================\r\n\r\n #change?: (newValue: number) => void;\r\n\r\n #release?: (newValue: number) => void;\r\n\r\n // Styling Variables ======================================================\r\n\r\n #textStyle: TextStyle\r\n\r\n #backgroundColor: string;\r\n\r\n #borderColor: string;\r\n\r\n #fillColor: string;\r\n\r\n // Runtime Variables ======================================================\r\n\r\n #lastMousePosition: Vector2;\r\n\r\n #clickStartMousePosition: Vector2;\r\n\r\n #clicking: boolean;\r\n\r\n constructor(node: FlowNode, config?: SliderWidgetConfig) {\r\n this.#node = node;\r\n this.#value = 0;\r\n this.#min = config?.min === undefined ? 0 : config?.min;\r\n this.#max = config?.max === undefined ? 1 : config?.max;\r\n this.#snapIncrement = config?.snapIncrement;\r\n this.#nodeProperty = config?.property;\r\n this.#text = \"\";\r\n \r\n this.#release = config?.release;\r\n\r\n this.#backgroundColor = config?.backgroundColor === undefined ? Theme.Widget.BackgroundColor : config?.backgroundColor;\r\n this.#fillColor = config?.fillColor === undefined ? Theme.Widget.Slider.FillColor : config?.fillColor;\r\n this.#borderColor = config?.borderColor === undefined ? Theme.Widget.Border.Color : config?.borderColor;\r\n this.#textStyle = new TextStyle(TextStyleFallback(config?.textStyle, {\r\n color: Theme.Widget.FontColor,\r\n }));\r\n this.#lastMousePosition = Zero();\r\n this.#clickStartMousePosition = Zero();\r\n this.#clicking = false;\r\n\r\n\r\n if (config?.property !== undefined && config?.property !== null) {\r\n node.addPropertyChangeListener(config.property, (oldVal, newVal) => {\r\n this.SetValue(newVal);\r\n });\r\n }\r\n\r\n this.SetValue(config?.value === undefined ? 0 : config?.value);\r\n\r\n // Setup change callback after we set the initial value to prevent the callback from being \r\n this.#change = config?.change;\r\n }\r\n\r\n SetValue(newValue: number): void {\r\n const cleanedValue = Clamp(newValue, this.#min, this.#max);\r\n if (this.#value === cleanedValue) {\r\n return;\r\n }\r\n\r\n this.#value = cleanedValue;\r\n\r\n if (this.#nodeProperty) {\r\n this.#node.setProperty(this.#nodeProperty, this.#value);\r\n }\r\n\r\n this.#text = this.#value.toFixed(3);\r\n if (this.#change !== undefined) {\r\n this.#change(this.#value);\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n ClickStart(): void {\r\n this.#clicking = true;\r\n CopyVector2(this.#clickStartMousePosition, this.#lastMousePosition)\r\n }\r\n\r\n ClickEnd(): void {\r\n this.#clicking = false;\r\n if (this.#release !== undefined) {\r\n this.#release(this.#value);\r\n }\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const scaledWidth = width * scale;\r\n const scaledHeight = height * scale;\r\n\r\n const scaledBorderThickness = Theme.Widget.Border.Size * scale;\r\n\r\n // Render background\r\n ctx.fillStyle = this.#backgroundColor;\r\n ctx.strokeStyle = this.#borderColor;\r\n ctx.lineWidth = scaledBorderThickness;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x,\r\n position.y,\r\n scaledWidth,\r\n scaledHeight,\r\n Theme.Widget.Border.Radius * scale\r\n );\r\n ctx.fill();\r\n ctx.stroke();\r\n\r\n // Render Fill\r\n const fill = Clamp01((this.#value - this.#min) / (this.#max - this.#min));\r\n ctx.fillStyle = this.#fillColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x + (scaledBorderThickness / 2),\r\n position.y + (scaledBorderThickness / 2),\r\n (scaledWidth * fill) - scaledBorderThickness,\r\n scaledHeight - scaledBorderThickness,\r\n Theme.Widget.Border.Radius * scale\r\n );\r\n ctx.fill();\r\n\r\n // Render Number\r\n ctx.textAlign = TextAlign.Center;\r\n ctx.textBaseline = TextBaseline.Middle;\r\n this.#textStyle.setupStyle(ctx, scale);\r\n ctx.fillText(\r\n this.#text,\r\n position.x + (scaledWidth / 2),\r\n position.y + (scaledHeight / 2),\r\n );\r\n\r\n // Update value based on mouse position\r\n if (mousePosition !== undefined) {\r\n CopyVector2(this.#lastMousePosition, mousePosition);\r\n if (this.#clicking) {\r\n const min = position.x + (scaledBorderThickness / 2);\r\n const max = min + scaledWidth - scaledBorderThickness;\r\n const p = Clamp01((this.#lastMousePosition.x - min) / (max - min));\r\n\r\n let value = (p * (this.#max - this.#min)) + this.#min;\r\n if (this.#snapIncrement !== undefined) {\r\n value = Math.round(value / this.#snapIncrement) * this.#snapIncrement;\r\n }\r\n\r\n this.SetValue(value);\r\n }\r\n }\r\n\r\n return {\r\n Position: { x: position.x, y: position.y },\r\n Size: {\r\n x: scaledWidth,\r\n y: scaledHeight\r\n }\r\n };\r\n }\r\n}","import { Popup } from \"../popup\";\r\n\r\ninterface Config {\r\n title: string;\r\n startingValue: string;\r\n onUpdate: (newValue: string) => void;\r\n onCancel?: () => void;\r\n}\r\n\r\nexport function SetStringPopup(config: Config): Popup {\r\n let input: HTMLInputElement | null = null;\r\n\r\n return new Popup({\r\n title: config.title,\r\n options: [\"Set\", \"Cancel\"],\r\n content: () => {\r\n const container = document.createElement('div');\r\n input = document.createElement('input')\r\n input.value = config.startingValue;\r\n container.append(input);\r\n return container;\r\n },\r\n onClose: (button: string | null): void => {\r\n if (button !== \"Set\" || input === null) {\r\n if(config.onCancel) {\r\n config.onCancel();\r\n }\r\n return;\r\n }\r\n config.onUpdate(input.value);\r\n },\r\n });\r\n}","import { Theme } from \"../theme\";\r\nimport { TextBoxStyle, TextBoxStyleConfig, TextBoxStyleWithFallback } from \"../styles/textBox\";\r\nimport { Box, InBox } from \"../types/box\";\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\nimport { fitString } from \"../utils/string\";\r\nimport { height, width } from \"./widget\";\r\nimport { FlowNode } from '../node';\r\nimport { SetStringPopup } from \"../popups/string\";\r\n\r\nexport interface StringWidgetConfig {\r\n property?: string;\r\n\r\n value?: string;\r\n\r\n textBoxStyle?: TextBoxStyleConfig;\r\n\r\n callback?: (newString: string) => void;\r\n}\r\n\r\nexport class StringWidget {\r\n\r\n #value: string;\r\n\r\n #idleStyle: TextBoxStyle;\r\n\r\n #hoverStyle: TextBoxStyle;\r\n\r\n #callback?: (newString: string) => void;\r\n\r\n #node: FlowNode\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n constructor(node: FlowNode, config?: StringWidgetConfig) {\r\n this.#value = \"\";\r\n \r\n this.#node = node;\r\n this.#nodeProperty = config?.property;\r\n this.#idleStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.textBoxStyle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n },\r\n radius: Theme.Widget.Border.Radius\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n\r\n this.#hoverStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.textBoxStyle, {\r\n box: {\r\n color: Theme.Widget.Hover.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n },\r\n radius: Theme.Widget.Border.Radius\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n\r\n this.Set(config?.value === undefined ? \"\" : config?.value);\r\n this.#callback = config?.callback;\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.addPropertyChangeListener(this.#nodeProperty, (oldVal, newVal) => {\r\n this.Set(newVal);\r\n });\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n Set(value: string): void {\r\n if (this.#value === value) {\r\n return;\r\n }\r\n this.#value = value;\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.setProperty(this.#nodeProperty, this.#value)\r\n }\r\n\r\n if (this.#callback !== undefined) {\r\n this.#callback(this.#value);\r\n }\r\n }\r\n\r\n ClickStart(): void {\r\n }\r\n\r\n ClickEnd(): void {\r\n const popup = SetStringPopup({\r\n title: \"Set String\",\r\n startingValue: this.#value,\r\n onUpdate: (value: string): void => {\r\n this.Set(value);\r\n },\r\n });\r\n popup.Show();\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const box = {\r\n Position: { x: 0, y: 0 },\r\n Size: {\r\n x: width * scale,\r\n y: height * scale\r\n }\r\n };\r\n CopyVector2(box.Position, position);\r\n\r\n\r\n let style: TextBoxStyle = this.#idleStyle;\r\n\r\n if (mousePosition !== undefined) {\r\n if (InBox(box, mousePosition)) {\r\n style = this.#hoverStyle;\r\n }\r\n }\r\n\r\n style.DrawUnderline(ctx, box, scale, fitString(ctx, this.#value, box.Size.x - (20 * scale)))\r\n\r\n return box;\r\n }\r\n}","import { Theme } from \"../theme\";\r\nimport { Box, InBox } from \"../types/box\";\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\nimport { height, width } from \"./widget\";\r\nimport { TextBoxStyle, TextBoxStyleConfig, TextBoxStyleWithFallback } from \"../styles/textBox\";\r\nimport { FlowNode } from \"../node\";\r\n\r\nexport interface ToggleStyleConfig {\r\n idle?: TextBoxStyleConfig,\r\n hover?: TextBoxStyleConfig,\r\n lightColor?: string;\r\n lightBorderColor?: string;\r\n lightBlur?: number;\r\n}\r\n\r\nexport interface ToggleWidgetConfig {\r\n property?: string;\r\n value?: boolean;\r\n text?: string;\r\n callback?: () => void;\r\n enabledStyle?: ToggleStyleConfig;\r\n disabledStyle?: ToggleStyleConfig;\r\n}\r\n\r\nclass ToggleStyle {\r\n\r\n #idleStyle: TextBoxStyle;\r\n\r\n #hoverStyle: TextBoxStyle;\r\n\r\n #lightColor: string;\r\n\r\n #lightBorderColor: string;\r\n\r\n #lightBlur?: number;\r\n\r\n #box: Box;\r\n\r\n constructor(config?: ToggleStyleConfig) {\r\n this.#idleStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.idle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.#hoverStyle = new TextBoxStyle(TextBoxStyleWithFallback(config?.hover, {\r\n box: {\r\n color: Theme.Widget.Hover.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }));\r\n this.#lightColor = config?.lightColor === undefined ? \"#222222\" : config.lightColor;\r\n this.#lightBorderColor = config?.lightBorderColor === undefined ? \"black\" : config.lightBorderColor;\r\n this.#lightBlur = config?.lightBlur;\r\n\r\n this.#box = {Position: { x: 0, y: 0 }, Size: { x: 0, y: 0 } };\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, pos: Vector2, scale: number, text: string, mousePosition: Vector2 | undefined): Box {\r\n const scaledWidth = width * scale;\r\n const scaledHeight = height * scale;\r\n this.#box.Size.x = scaledWidth;\r\n this.#box.Size.y = scaledHeight;\r\n CopyVector2(this.#box.Position, pos);\r\n\r\n // Background\r\n let style: TextBoxStyle = this.#idleStyle;\r\n if (mousePosition !== undefined) {\r\n if (InBox(this.#box, mousePosition)) {\r\n style = this.#hoverStyle;\r\n }\r\n }\r\n style.Draw(ctx, this.#box, scale, text);\r\n\r\n // Light\r\n const lightScale = Math.min(scaledWidth, scaledHeight);\r\n ctx.strokeStyle = this.#lightBorderColor;\r\n ctx.fillStyle = this.#lightColor\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n pos.x + (lightScale * .2),\r\n pos.y + (lightScale * .2),\r\n lightScale * .6,\r\n lightScale * .6,\r\n Theme.Widget.Border.Radius * scale\r\n );\r\n if (this.#lightBlur) {\r\n ctx.shadowBlur = this.#lightBlur * scale;\r\n ctx.shadowColor = this.#lightColor;\r\n }\r\n ctx.fill();\r\n if (this.#lightBlur) {\r\n ctx.shadowBlur = 0;\r\n }\r\n // ctx.stroke();\r\n\r\n return this.#box\r\n }\r\n}\r\n\r\nexport class ToggleWidget {\r\n\r\n #node: FlowNode;\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n #value: boolean;\r\n\r\n #text: string;\r\n\r\n #enabledStyle: ToggleStyle;\r\n\r\n #disabledStyle: ToggleStyle;\r\n\r\n #callback?: (value: boolean) => void;\r\n\r\n constructor(node: FlowNode, config?: ToggleWidgetConfig) {\r\n this.#value = false;\r\n\r\n this.#node = node;\r\n this.#nodeProperty = config?.property;\r\n this.#text = config?.text === undefined ? \"Toggle\" : config?.text;\r\n\r\n this.#enabledStyle = new ToggleStyle({\r\n idle: TextBoxStyleWithFallback(config?.enabledStyle?.idle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }),\r\n lightBorderColor: config?.enabledStyle?.lightBorderColor,\r\n lightColor: config?.enabledStyle?.lightColor === undefined ? \"#00FF00\" : config?.enabledStyle?.lightColor,\r\n lightBlur: config?.enabledStyle?.lightBlur === undefined ? 15 : config?.enabledStyle?.lightBlur\r\n });\r\n this.#disabledStyle = new ToggleStyle({\r\n idle: TextBoxStyleWithFallback(config?.disabledStyle?.idle, {\r\n box: {\r\n color: Theme.Widget.BackgroundColor,\r\n border: {\r\n size: Theme.Widget.Border.Size,\r\n color: Theme.Widget.Border.Color,\r\n }\r\n },\r\n text: { color: Theme.Widget.FontColor },\r\n }),\r\n lightBorderColor: config?.disabledStyle?.lightBorderColor,\r\n lightColor: config?.disabledStyle?.lightColor === undefined ? \"#004400\" : config?.enabledStyle?.lightColor,\r\n });\r\n\r\n this.Set(config?.value === undefined ? false : config?.value);\r\n this.#callback = config?.callback;\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.addPropertyChangeListener(this.#nodeProperty, (oldVal, newVal) => {\r\n this.Set(newVal);\r\n });\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n return { \"x\": width, \"y\": height }\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n let style = this.#value ? this.#enabledStyle : this.#disabledStyle;\r\n return style.Draw(ctx, position, scale, this.#text, mousePosition);\r\n }\r\n\r\n Toggle(): void {\r\n this.Set(!this.#value);\r\n }\r\n\r\n Set(value: boolean): void {\r\n if (this.#value === value) {\r\n return;\r\n }\r\n this.#value = value;\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.setProperty(this.#nodeProperty, this.#value);\r\n }\r\n\r\n if (this.#callback !== undefined) {\r\n this.#callback(this.#value);\r\n }\r\n }\r\n\r\n ClickStart(): void {\r\n this.Toggle();\r\n }\r\n\r\n ClickEnd(): void {\r\n }\r\n}","import { Box } from \"../types/box\";\r\nimport { CopyVector2, Vector2 } from \"../types/vector2\";\r\n\r\nconst margin = 15;\r\n\r\nexport interface ImageWidgetConfig {\r\n image?: string;\r\n maxWidth?: number\r\n maxHeight?: number\r\n blob?: Blob;\r\n}\r\n\r\n/**\r\n * constructor(lightNode, nodeManager, id, parameterData, app) {\r\n this.lightNode = lightNode;\r\n this.id = id;\r\n this.app = app;\r\n this.lightNode.title = parameterData.name;\r\n\r\n this.lightNode.onDropFile = (file) => {\r\n // console.log(file)\r\n var reader = new FileReader();\r\n reader.onload = (evt) => {\r\n console.log(evt.target.result)\r\n nodeManager.nodeParameterChanged({\r\n id: id,\r\n data: evt.target.result,\r\n binary: true\r\n });\r\n }\r\n reader.readAsArrayBuffer(file);\r\n\r\n const url = URL.createObjectURL(file);\r\n // this.loadImage(this._url, function (img) {\r\n // that.size[1] = (img.height / img.width) * that.size[0];\r\n // });\r\n this.loadImgFromURL(url);\r\n }\r\n }\r\n\r\n loadImgFromURL(url) {\r\n const img = document.createElement(\"img\");\r\n img.src = url;\r\n img.onload = () => {\r\n // if (callback) {\r\n // callback(this);\r\n // }\r\n // console.log(\"Image loaded, size: \" + img.width + \"x\" + img.height);\r\n // this.dirty = true;\r\n // that.boxcolor = \"#9F9\";f\r\n // that.setDirtyCanvas(true);\r\n this.lightNode.widgets[0].image = img\r\n this.lightNode.setSize(this.lightNode.computeSize());\r\n };\r\n img.onerror = () => {\r\n console.log(\"error loading the image:\" + url);\r\n }\r\n }\r\n\r\n update(parameterData) {\r\n console.log(\"image parameter\", parameterData)\r\n const curVal = parameterData.currentValue;\r\n this.app.RequestManager.getParameterValue(this.id, (response) => {\r\n const url = URL.createObjectURL(response);\r\n this.loadImgFromURL(url)\r\n })\r\n }\r\n */\r\n\r\nexport class ImageWidget {\r\n\r\n #url: string | undefined;\r\n\r\n #image: HTMLImageElement | undefined;\r\n\r\n #maxWidth: number;\r\n\r\n #maxHeight: number;\r\n\r\n constructor(config?: ImageWidgetConfig) {\r\n this.#maxWidth = config?.maxWidth === undefined ? 150 : config?.maxWidth;\r\n this.#maxHeight = config?.maxHeight === undefined ? 150 : config?.maxHeight;\r\n if (config?.image) {\r\n this.SetUrl(config?.image);\r\n } else if (config?.blob) {\r\n this.SetBlob(config?.blob);\r\n }\r\n }\r\n\r\n SetBlob(blob: Blob) {\r\n const urlCreator = window.URL || window.webkitURL;\r\n const imageUrl = urlCreator.createObjectURL(blob);\r\n this.SetUrl(imageUrl);\r\n }\r\n\r\n SetUrl(url: string) {\r\n this.#image = undefined;\r\n this.#url = url;\r\n\r\n const img = document.createElement(\"img\");\r\n img.src = url;\r\n img.onload = () => {\r\n this.#image = img;\r\n };\r\n img.onerror = (event) => {\r\n console.log(\"error loading image:\", url, event);\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n if (this.#image === undefined) {\r\n return { \"x\": 0, \"y\": 0 }\r\n }\r\n\r\n let adjust = 1;\r\n if (this.#image.width > this.#maxWidth) {\r\n adjust = this.#maxWidth / this.#image.width\r\n }\r\n\r\n if (this.#image.height > this.#maxHeight) {\r\n let heightAdjust = this.#maxHeight / this.#image.height\r\n if (heightAdjust < adjust) {\r\n adjust = heightAdjust;\r\n }\r\n }\r\n\r\n return {\r\n \"x\": adjust * this.#image.width,\r\n \"y\": adjust * this.#image.height\r\n }\r\n }\r\n\r\n ClickStart(): void {\r\n }\r\n\r\n ClickEnd(): void {\r\n }\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n const size = this.Size();\r\n const box: Box = {\r\n Position: { x: 0, y: 0 },\r\n Size: {\r\n x: size.x * scale,\r\n y: size.y * scale,\r\n }\r\n }\r\n CopyVector2(box.Position, position);\r\n\r\n if (!this.#image) {\r\n return box;\r\n }\r\n\r\n ctx.drawImage(\r\n this.#image,\r\n position.x,\r\n position.y,\r\n box.Size.x,\r\n box.Size.y\r\n );\r\n return box;\r\n }\r\n}","import { Theme } from \"../theme\";\r\nimport { Box, InBox } from \"../types/box\";\r\nimport { CopyVector2, Vector2, Zero } from \"../types/vector2\";\r\nimport { FlowNode } from '../node';\r\nimport { Text } from \"../types/text\";\r\nimport { TextStyle, TextStyleConfig, TextStyleFallback } from \"../styles/text\";\r\n\r\nexport interface TextWidgetConfig {\r\n property?: string;\r\n\r\n value?: string;\r\n\r\n textBoxStyle?: TextStyleConfig;\r\n\r\n callback?: (newString: string) => void;\r\n}\r\n\r\nexport class TextWidget {\r\n\r\n #value: Text;\r\n\r\n #callback?: (newString: string) => void;\r\n\r\n #node: FlowNode\r\n\r\n #nodeProperty: string | undefined;\r\n\r\n #size: Vector2;\r\n\r\n constructor(node: FlowNode, config?: TextWidgetConfig) {\r\n this.#size = Zero();\r\n this.#node = node;\r\n this.#nodeProperty = config?.property;\r\n this.#value = new Text(\"\", TextStyleFallback(config?.textBoxStyle, {\r\n font: Theme.FontFamily,\r\n color: Theme.Widget.FontColor,\r\n size: Theme.Note.FontSize,\r\n }))\r\n\r\n this.Set(config?.value === undefined ? \"\" : config?.value);\r\n this.#callback = config?.callback;\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.addPropertyChangeListener(this.#nodeProperty, (oldVal, newVal) => {\r\n this.Set(newVal);\r\n });\r\n }\r\n }\r\n\r\n Size(): Vector2 {\r\n return this.#size;\r\n }\r\n\r\n Set(value: string): void {\r\n if (this.#value.get() === value) {\r\n return;\r\n }\r\n this.#value.set(value);\r\n\r\n if (this.#nodeProperty !== undefined) {\r\n this.#node.setProperty(this.#nodeProperty, value)\r\n }\r\n\r\n if (this.#callback !== undefined) {\r\n this.#callback(value);\r\n }\r\n }\r\n\r\n ClickStart(): void {\r\n // Left blank for implementing Widget interface\r\n }\r\n\r\n ClickEnd(): void {\r\n // Left blank for implementing Widget interface\r\n }\r\n\r\n\r\n Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box {\r\n this.#value.size(ctx, scale, this.#size);\r\n const box = {\r\n Position: { x: 0, y: 0 },\r\n Size: this.#size\r\n };\r\n CopyVector2(box.Position, position);\r\n this.#value.size(ctx, 1, this.#size);\r\n \r\n ctx.textAlign = \"left\";\r\n this.#value.render(ctx, scale, box.Position);\r\n // this.#idleStyle.DrawUnderline(ctx, box, scale, fitString(ctx, this.#value, box.Size.x - (20 * scale)))\r\n\r\n return box;\r\n }\r\n}","import { Widget } from \"./widget\";\r\nimport { NumberWidget, NumberWidgetConfig } from './number';\r\nimport { ButtonWidget, ButtonWidgetConfig } from './button';\r\nimport { ColorWidget, ColorWidgetConfig } from './color';\r\nimport { SliderWidget, SliderWidgetConfig } from './slider';\r\nimport { StringWidget, StringWidgetConfig } from './string';\r\nimport { ToggleWidget, ToggleWidgetConfig } from './toggle';\r\nimport { FlowNode } from \"../node\";\r\nimport { ImageWidget, ImageWidgetConfig } from \"./image\";\r\nimport { TextWidget, TextWidgetConfig } from \"./text\";\r\n\r\nexport type WidgetBuilder = (node: FlowNode, confg?: any) => Widget;\r\n\r\nclass WidgetFactory {\r\n\r\n #registeredWidgets: Map<string, WidgetBuilder>\r\n\r\n constructor() {\r\n this.#registeredWidgets = new Map<string, WidgetBuilder>();\r\n }\r\n\r\n register(widgetType: string, builder: WidgetBuilder): void {\r\n this.#registeredWidgets.set(widgetType, builder);\r\n }\r\n\r\n create(node: FlowNode, widgetType: string, config: any): Widget {\r\n const builder = this.#registeredWidgets.get(widgetType)\r\n if (builder === undefined) {\r\n throw new Error(\"no builder registered for widget: \" + widgetType);\r\n }\r\n return builder(node, config);\r\n }\r\n}\r\n\r\nconst GlobalWidgetFactory = new WidgetFactory();\r\n\r\nGlobalWidgetFactory.register(\"button\", (node: FlowNode, config?: ButtonWidgetConfig) => new ButtonWidget(config));\r\nGlobalWidgetFactory.register(\"number\", (node: FlowNode, config?: NumberWidgetConfig) => new NumberWidget(node, config));\r\nGlobalWidgetFactory.register(\"color\", (node: FlowNode, config?: ColorWidgetConfig) => new ColorWidget(node, config));\r\nGlobalWidgetFactory.register(\"slider\", (node: FlowNode, config?: SliderWidgetConfig) => new SliderWidget(node, config));\r\nGlobalWidgetFactory.register(\"string\", (node: FlowNode, config?: StringWidgetConfig) => new StringWidget(node, config));\r\nGlobalWidgetFactory.register(\"toggle\", (node: FlowNode, config?: ToggleWidgetConfig) => new ToggleWidget(node, config));\r\nGlobalWidgetFactory.register(\"image\", (node: FlowNode, config?: ImageWidgetConfig) => new ImageWidget(config));\r\nGlobalWidgetFactory.register(\"text\", (node: FlowNode, config?: TextWidgetConfig) => new TextWidget(node, config));\r\n\r\nexport { GlobalWidgetFactory };","import { FlowNode } from \"./node\";\r\nimport { Port } from \"./port\";\r\nimport { BoxCenter, InBox } from \"./types/box\";\r\nimport { Vector2, Zero } from \"./types/vector2\";\r\n\r\nexport interface ConnectionRendererParams {\r\n ctx: CanvasRenderingContext2D;\r\n start: Vector2;\r\n end: Vector2;\r\n graphScale: number;\r\n mouseOver: boolean;\r\n\r\n inNode: FlowNode | null;\r\n inPort: Port | null;\r\n outNode: FlowNode | null;\r\n outPort: Port | null;\r\n}\r\n\r\nexport type ConnectionRenderer = (params: ConnectionRendererParams) => void\r\n\r\nexport function DefaultConnectionRenderer(connectionSize: number, connectionColor: string | undefined, mouseOverSize: number, mouseOverColor: string | undefined): ConnectionRenderer {\r\n return (params: ConnectionRendererParams) => {\r\n\r\n let color = \"#00FF00\";\r\n if (params.outPort !== null) {\r\n color = params.outPort.filledStyleColor()\r\n } else if (params.inPort !== null) {\r\n color = params.inPort.filledStyleColor()\r\n }\r\n\r\n let lineSize = connectionSize * params.graphScale;\r\n if (connectionColor !== undefined) {\r\n color = connectionColor;\r\n }\r\n\r\n if (params.mouseOver || params.inNode?.selected() || params.outNode?.selected()) {\r\n lineSize = mouseOverSize * params.graphScale;\r\n params.ctx.shadowBlur = 25 * params.graphScale;\r\n\r\n if (mouseOverColor !== undefined) {\r\n color = mouseOverColor;\r\n }\r\n\r\n params.ctx.shadowColor = color;\r\n }\r\n\r\n params.ctx.strokeStyle = color;\r\n params.ctx.lineWidth = lineSize;\r\n\r\n // Draw\r\n params.ctx.beginPath();\r\n params.ctx.moveTo(params.start.x, params.start.y);\r\n const midX = (params.start.x + params.end.x) / 2;\r\n params.ctx.bezierCurveTo(midX, params.start.y, midX, params.end.y, params.end.x, params.end.y);\r\n params.ctx.stroke();\r\n params.ctx.shadowBlur = 0;\r\n }\r\n}\r\n\r\nexport class Connection {\r\n\r\n // Variables for holding temp data, preventing object allocations each\r\n // frame\r\n #inPos: Vector2;\r\n #outPos: Vector2;\r\n\r\n #inNode: FlowNode | null;\r\n #inNodePortIndex: number;\r\n #outNode: FlowNode | null;\r\n #outNodePortIndex: number;\r\n #renderer: ConnectionRenderer;\r\n\r\n constructor(\r\n inNode: FlowNode | null,\r\n inNodePortIndex: number,\r\n outNode: FlowNode | null,\r\n outNodePortIndex: number,\r\n renderer: ConnectionRenderer,\r\n ) {\r\n\r\n this.#inNode = inNode;\r\n this.#inNodePortIndex = inNodePortIndex;\r\n this.#outNode = outNode;\r\n this.#outNodePortIndex = outNodePortIndex;\r\n this.#renderer = renderer;\r\n \r\n this.#inPos = Zero();\r\n this.#outPos = Zero();\r\n\r\n if (inNode !== null) {\r\n inNode.inputPort(this.#inNodePortIndex).addConnection(this);\r\n }\r\n\r\n if (outNode !== null) {\r\n outNode.outputPort(this.#outNodePortIndex).addConnection(this);\r\n }\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, graphScale: number, mouseOver: boolean, mousePosition: Vector2 | undefined): void {\r\n\r\n // Not sure what to do here? Maybe we should throw an error in the \r\n // future?\r\n if (this.#inNode === null && this.#outNode === null) {\r\n return;\r\n }\r\n\r\n if (this.#inNode !== null) {\r\n const inPortBox = this.#inNode.inputPortPosition(this.#inNodePortIndex)\r\n if (inPortBox === undefined) {\r\n return;\r\n }\r\n BoxCenter(inPortBox, this.#inPos);\r\n } else if (mousePosition !== undefined) {\r\n this.#inPos.x = mousePosition.x;\r\n this.#inPos.y = mousePosition.y;\r\n } else {\r\n return;\r\n }\r\n\r\n if (this.#outNode !== null) {\r\n const outPortBox = this.#outNode.outputPortPosition(this.#outNodePortIndex);\r\n if (outPortBox === undefined) {\r\n return;\r\n }\r\n BoxCenter(outPortBox, this.#outPos);\r\n } else if (mousePosition !== undefined) {\r\n this.#outPos.x = mousePosition.x;\r\n this.#outPos.y = mousePosition.y;\r\n } else {\r\n return;\r\n }\r\n\r\n this.#renderer({\r\n ctx: ctx,\r\n start: this.#inPos,\r\n end: this.#outPos,\r\n graphScale: graphScale,\r\n mouseOver: mouseOver,\r\n\r\n inPort: this.inPort(),\r\n inNode: this.#inNode,\r\n outPort: this.outPort(),\r\n outNode: this.#outNode,\r\n });\r\n }\r\n\r\n inNode(): FlowNode | null {\r\n return this.#inNode;\r\n }\r\n\r\n outNode(): FlowNode | null {\r\n return this.#outNode;\r\n }\r\n\r\n clearPort(mousePosition: Vector2): void {\r\n if (this.#inNode !== null) {\r\n const inPortBox = this.#inNode.inputPortPosition(this.#inNodePortIndex)\r\n if (inPortBox !== undefined && InBox(inPortBox, mousePosition)) {\r\n this.clearInput();\r\n }\r\n }\r\n\r\n if (this.#outNode !== null) {\r\n const outPortBox = this.#outNode.outputPortPosition(this.#outNodePortIndex);\r\n if (outPortBox !== undefined && InBox(outPortBox, mousePosition)) {\r\n this.clearOutput();\r\n }\r\n }\r\n }\r\n\r\n clearPorts(): void {\r\n this.clearInput();\r\n this.clearOutput();\r\n }\r\n\r\n setInput(node: FlowNode, portIndex: number, replace?: boolean): void {\r\n this.#inNode = node;\r\n this.#inNodePortIndex = portIndex;\r\n\r\n const port = this.#inNode.inputPort(portIndex);\r\n if(!!replace && port.connections().length > 0) {\r\n port.replaceConnection(this, 0);\r\n } else {\r\n port.addConnection(this);\r\n }\r\n }\r\n\r\n setOutput(node: FlowNode, portIndex: number): void {\r\n this.#outNode = node;\r\n this.#outNodePortIndex = portIndex;\r\n this.#outNode.outputPort(portIndex).addConnection(this);\r\n }\r\n\r\n clearInput() {\r\n this.#inNode?.inputPort(this.#inNodePortIndex).clearConnection(this);\r\n this.#inNode = null;\r\n this.#inNodePortIndex = -1;\r\n }\r\n\r\n clearOutput() {\r\n this.#outNode?.outputPort(this.#outNodePortIndex).clearConnection(this);\r\n this.#outNode = null;\r\n this.#outNodePortIndex = -1;\r\n }\r\n\r\n mouseOverPort(mousePosition: Vector2): Port | null {\r\n if (this.#inNode !== null) {\r\n const inPortBox = this.#inNode.inputPortPosition(this.#inNodePortIndex)\r\n if (inPortBox !== undefined && InBox(inPortBox, mousePosition)) {\r\n return this.#inNode.inputPort(this.#inNodePortIndex)\r\n }\r\n }\r\n\r\n if (this.#outNode !== null) {\r\n const outPortBox = this.#outNode.outputPortPosition(this.#outNodePortIndex);\r\n if (outPortBox !== undefined && InBox(outPortBox, mousePosition)) {\r\n return this.#outNode.outputPort(this.#outNodePortIndex)\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n outPort(): Port | null {\r\n if (this.#outNode === null) {\r\n return null;\r\n }\r\n return this.#outNode.outputPort(this.#outNodePortIndex);\r\n }\r\n\r\n inPort(): Port | null {\r\n if (this.#inNode === null) {\r\n return null;\r\n }\r\n return this.#inNode.inputPort(this.#inNodePortIndex);\r\n }\r\n\r\n referencesNode(node: FlowNode): boolean {\r\n if (this.#inNode === node) {\r\n return true;\r\n }\r\n\r\n if (this.#outNode === node) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}","import { Vector2, Zero } from \"./types/vector2\";\r\n\r\nexport class Camera {\r\n\r\n zoom: number;\r\n\r\n position: Vector2;\r\n\r\n constructor() {\r\n this.zoom = 1;\r\n this.position = Zero();\r\n }\r\n\r\n screenSpaceToGraphSpace(screenPosition: Vector2, out: Vector2): void {\r\n const scale = this.zoom;\r\n out.x = (screenPosition.x / scale) - (this.position.x / scale);\r\n out.y = (screenPosition.y / scale) - (this.position.y / scale);\r\n }\r\n\r\n graphSpaceToScreenSpace(graphPosition: Vector2, out: Vector2): void {\r\n out.x = this.position.x + (graphPosition.x * this.zoom);\r\n out.y = this.position.y + (graphPosition.y * this.zoom);\r\n }\r\n\r\n reset(): void {\r\n this.zoom = 1;\r\n this.position.x = 0;\r\n this.position.y = 0;\r\n }\r\n}","import { Camera } from \"./camera\";\r\nimport { NodeFlowGraph } from \"./graph\";\r\nimport { FlowNode } from \"./node\";\r\nimport { NodeSubsystem } from \"./nodes/subsystem\";\r\nimport { Box } from \"./types/box\";\r\n\r\n// TODO: Cyclical dependencies will end our life\r\n\r\nfunction MarkInputs(graph: NodeSubsystem, positions: Array<number>, nodeLUT: Map<FlowNode, number>, node: number, depth: number, shouldSort: Map<FlowNode, boolean>) {\r\n const inputs = graph.connectedInputsNodeReferencesByIndex(node);\r\n for (let i = 0; i < inputs.length; i++) {\r\n const nodeIndex = nodeLUT.get(inputs[i]) as number;\r\n\r\n if (!shouldSort.has(inputs[i])) {\r\n continue;\r\n }\r\n\r\n positions[nodeIndex] = depth;\r\n MarkInputs(graph, positions, nodeLUT, nodeIndex, depth - 1, shouldSort);\r\n }\r\n}\r\n\r\nfunction MarkOutputs(graph: NodeSubsystem, positions: Array<number>, nodeLUT: Map<FlowNode, number>, node: number, depth: number, shouldSort: Map<FlowNode, boolean>) {\r\n const outputs = graph.connectedInputsNodeReferencesByIndex(node);\r\n for (let i = 0; i < outputs.length; i++) {\r\n const nodeIndex = nodeLUT.get(outputs[i]) as number;\r\n\r\n if (!shouldSort.has(outputs[i])) {\r\n continue;\r\n }\r\n\r\n positions[nodeIndex] = depth;\r\n MarkOutputs(graph, positions, nodeLUT, nodeIndex, depth + 1, shouldSort);\r\n }\r\n}\r\n\r\nexport function Organize(ctx: CanvasRenderingContext2D, graph: NodeSubsystem, nodesToSort?: Array<number>): void {\r\n const nodes = graph.getNodes();\r\n const nodeLUT = new Map<FlowNode, number>();\r\n const bounds = new Array<Box>(nodes.length);\r\n const relativePosition = new Array<Array<number>>(nodes.length);\r\n const claimed = new Array<boolean>(nodes.length);\r\n const shouldSort = new Map<FlowNode, boolean>(); // TODO: we don't really need a Map, is their a Set data structure?\r\n\r\n if (nodesToSort) {\r\n if (nodesToSort.length < 2) {\r\n return;\r\n }\r\n for (let i = 0; i < nodesToSort.length; i++) {\r\n shouldSort.set(nodes[nodesToSort[i]], true);\r\n }\r\n } else {\r\n for (let i = 0; i < nodes.length; i++) {\r\n shouldSort.set(nodes[i], true);\r\n }\r\n }\r\n\r\n const camera = new Camera();\r\n\r\n // Initialize everything\r\n for (let i = 0; i < nodes.length; i++) {\r\n bounds[i] = nodes[i].calculateBounds(ctx, camera);\r\n relativePosition[i] = new Array<number>(nodes.length);\r\n nodeLUT.set(nodes[i], i);\r\n claimed[i] = false;\r\n }\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n relativePosition[i][i] = 0;\r\n MarkInputs(graph, relativePosition[i], nodeLUT, i, -1, shouldSort);\r\n MarkOutputs(graph, relativePosition[i], nodeLUT, i, 1, shouldSort);\r\n }\r\n\r\n interface entry {\r\n node: number;\r\n length: number;\r\n min: number;\r\n max: number\r\n }\r\n\r\n let entries = new Array<entry>(shouldSort.size);\r\n\r\n let nodeIndex = 0;\r\n for (let i = 0; i < nodes.length; i++) {\r\n if (!shouldSort.has(nodes[i])) {\r\n continue;\r\n }\r\n\r\n let min = 0;\r\n let max = 0;\r\n for (let x = 0; x < nodes.length; x++) {\r\n const val = relativePosition[i][x];\r\n if (val === undefined) {\r\n continue;\r\n }\r\n\r\n min = Math.min(min, val);\r\n max = Math.max(max, val);\r\n }\r\n entries[nodeIndex] = {\r\n length: max - min,\r\n node: i,\r\n min: min,\r\n max: max\r\n }\r\n nodeIndex++\r\n }\r\n\r\n\r\n entries.sort((a, b) => b.length - a.length);\r\n\r\n interface Column {\r\n Nodes: Array<FlowNode>;\r\n Width: number;\r\n }\r\n\r\n const columns = Array<Column>(entries[0].length + 1);\r\n for (let i = 0; i < columns.length; i++) {\r\n columns[i] = {\r\n Nodes: new Array<FlowNode>(),\r\n Width: 0\r\n };\r\n }\r\n\r\n for (let i = 0; i < entries.length; i++) {\r\n const entry = entries[i];\r\n if (claimed[entry.node] === true) {\r\n continue;\r\n }\r\n\r\n const positions = relativePosition[entry.node];\r\n\r\n for (let p = 0; p < positions.length; p++) {\r\n const position = positions[p];\r\n if (position === undefined) {\r\n continue;\r\n }\r\n\r\n if (claimed[p] === true) {\r\n continue;\r\n }\r\n\r\n const nodeBounds = bounds[p];\r\n const column = columns[position - entry.min];\r\n column.Nodes.push(nodes[p])\r\n column.Width = Math.max(column.Width, nodeBounds.Size.x)\r\n\r\n claimed[p] = true;\r\n }\r\n }\r\n\r\n let allColumnsWidths = 0;\r\n for (let c = 0; c < columns.length; c++) {\r\n allColumnsWidths += columns[c].Width;\r\n }\r\n\r\n const widthSpacing = 100;\r\n const heightSpacing = 50;\r\n\r\n let widthOffset = 0;\r\n for (let c = 0; c < columns.length; c++) {\r\n var column = columns[c];\r\n let heightOffset = 0;\r\n\r\n widthOffset -= widthSpacing + column.Width;\r\n\r\n for (let n = 0; n < column.Nodes.length; n++) {\r\n const node = column.Nodes[n];\r\n const nodeBounds = bounds[nodeLUT.get(node) as number];\r\n\r\n let pos = {\r\n x: widthOffset + allColumnsWidths + (columns.length * widthSpacing),\r\n y: heightOffset\r\n }\r\n\r\n heightOffset += nodeBounds.Size.y + heightSpacing\r\n node.setPosition(pos);\r\n }\r\n }\r\n\r\n}","export function TimeExecution(name: string, callback: Function) {\r\n const start = name + \"_Start\";\r\n const end = name + \"_End\";\r\n\r\n performance.mark(start);\r\n callback();\r\n performance.mark(end);\r\n performance.measure(name, start, end);\r\n}","import { ContextMenuConfig, ContextMenuItemConfig } from \"../contextMenu\";\r\nimport { FlowNode, FlowNodeConfig } from '../node';\r\nimport { Vector2 } from \"../types/vector2\";\r\nimport { NodeSubsystem } from \"./subsystem\";\r\n\r\ninterface PublisherNodes {\r\n [name: string]: FlowNodeConfig\r\n}\r\n\r\nexport interface PublisherConfig {\r\n name?: string;\r\n description?: string;\r\n version?: string;\r\n nodes?: PublisherNodes\r\n}\r\n\r\nexport class Publisher {\r\n\r\n #name: string;\r\n\r\n #description: string;\r\n\r\n #version: string;\r\n\r\n #registeredNodes: Map<string, FlowNodeConfig>\r\n\r\n constructor(config?: PublisherConfig) {\r\n this.#name = config?.name === undefined ? \"Unknown\" : config.name;\r\n this.#description = config?.description === undefined ? \"\" : config.description;\r\n this.#version = config?.version === undefined ? \"v0.0.0\" : config.version;\r\n\r\n this.#registeredNodes = new Map<string, FlowNodeConfig>();\r\n\r\n if (config?.nodes !== undefined) {\r\n for (const nodeKey in config.nodes) {\r\n this.register(nodeKey, config.nodes[nodeKey]);\r\n }\r\n }\r\n }\r\n\r\n nodes(): Map<string, FlowNodeConfig> {\r\n return this.#registeredNodes;\r\n }\r\n\r\n register(nodeType: string, config: FlowNodeConfig): void {\r\n this.#registeredNodes.set(nodeType, config);\r\n }\r\n\r\n unregister(nodeType: string): boolean {\r\n return this.#registeredNodes.delete(nodeType);\r\n }\r\n\r\n #recurseBuildMenu(graph: NodeSubsystem, name: string, subMenu: Map<string, FlowNodeConfig>, position: Vector2): ContextMenuConfig {\r\n const items: Array<ContextMenuItemConfig> = [];\r\n const subMenus = new Map<string, Map<string, FlowNodeConfig>>();\r\n\r\n for (let [key, nodeConfig] of subMenu) {\r\n const slashIndex = key.indexOf(\"/\")\r\n const bracketIndex = key.indexOf(\"[\")\r\n\r\n if (slashIndex === -1 || (bracketIndex !== -1 && bracketIndex < slashIndex)) {\r\n items.push({\r\n name: key,\r\n callback: () => {\r\n const node = new FlowNode(nodeConfig);\r\n node.setPosition(position);\r\n graph.addNode(node);\r\n },\r\n });\r\n } else {\r\n const elements = key.split(\"/\");\r\n if (!subMenus.has(elements[0])) {\r\n subMenus.set(elements[0], new Map<string, FlowNodeConfig>());\r\n }\r\n\r\n const menu = subMenus.get(elements[0]);\r\n elements.shift();\r\n menu?.set(elements.join(\"/\"), nodeConfig)\r\n }\r\n }\r\n\r\n const menus: Array<ContextMenuConfig> = [];\r\n for (let [key, nodes] of subMenus) {\r\n menus.push(this.#recurseBuildMenu(graph, key, nodes, position))\r\n }\r\n\r\n return {\r\n name: name,\r\n items: items,\r\n subMenus: menus\r\n }\r\n }\r\n\r\n contextMenu(graph: NodeSubsystem, position: Vector2): ContextMenuConfig {\r\n return this.#recurseBuildMenu(graph, this.#name, this.#registeredNodes, position);\r\n }\r\n\r\n create(nodeType: string): FlowNode {\r\n const config = this.#registeredNodes.get(nodeType)\r\n if (config === undefined) {\r\n throw new Error(\"no builder registered for node: \" + nodeType);\r\n }\r\n return new FlowNode(config);\r\n }\r\n}","import { FlowNode } from \"../node\";\r\nimport { Publisher, PublisherConfig } from \"./publisher\";\r\nimport { ContextMenuConfig } from \"../contextMenu\";\r\nimport { Vector2 } from \"../types/vector2\";\r\nimport { nodeFlowGroup as nodeFlowContextMenuGroup, NodeSubsystem } from \"./subsystem\";\r\n\r\nexport type NodeCreatedCallback = (publisher: string, nodeType: string, node: FlowNode) => void;\r\n\r\ninterface NodeFactoryPublishers {\r\n [name: string]: PublisherConfig\r\n}\r\n\r\nexport interface NodeFactoryConfig {\r\n publishers?: NodeFactoryPublishers\r\n onNodeCreated?: NodeCreatedCallback;\r\n}\r\n\r\nexport class NodeFactory {\r\n #registeredPublishers: Map<string, Publisher>;\r\n\r\n #registeredCallbacks: Array<NodeCreatedCallback>;\r\n\r\n constructor(config?: NodeFactoryConfig) {\r\n this.#registeredPublishers = new Map<string, Publisher>();\r\n this.#registeredCallbacks = new Array<NodeCreatedCallback>();\r\n\r\n if (config?.onNodeCreated) {\r\n this.#registeredCallbacks.push(config?.onNodeCreated);\r\n }\r\n\r\n if (config?.publishers !== undefined) {\r\n for (let entry in config.publishers) {\r\n this.addPublisher(entry, new Publisher(config.publishers[entry]));\r\n }\r\n }\r\n }\r\n\r\n public addOnNodeCreatedListener(callback: NodeCreatedCallback): void {\r\n this.#registeredCallbacks.push(callback);\r\n }\r\n\r\n public addPublisher(identifier: string, publisher: Publisher): void {\r\n this.#registeredPublishers.set(identifier, publisher);\r\n }\r\n\r\n // I'm not even sure if I want this here? You can register on Publishers...\r\n // So why not just make people register with the publisher.\r\n // public register(publisher: string, nodeType: string, config: FlowNodeConfiguration): void {\r\n // const foundPublisher = this.#registeredPublishers.get(publisher);\r\n // if (foundPublisher === undefined) {\r\n // console.error(\"no publisher registered with identifier:\" + publisher);\r\n // return;\r\n // }\r\n\r\n // foundPublisher.register(nodeType, config);\r\n // }\r\n\r\n public create(publisher: string, nodeType: string): FlowNode {\r\n const publisherIdentifier = this.#registeredPublishers.get(publisher)\r\n if (publisherIdentifier === undefined) {\r\n throw new Error(\"no publisher registered with identifier: \" + publisher);\r\n }\r\n const node = publisherIdentifier.create(nodeType);\r\n\r\n for (let i = 0; i < this.#registeredCallbacks.length; i++) {\r\n const callback = this.#registeredCallbacks[i];\r\n callback(publisher, nodeType, node);\r\n }\r\n return node;\r\n }\r\n\r\n public newNodeSubmenus(graph: NodeSubsystem, position: Vector2): Array<ContextMenuConfig> {\r\n const menus: Array<ContextMenuConfig> = [];\r\n for (let [_, publisher] of this.#registeredPublishers) {\r\n menus.push(publisher.contextMenu(graph, position))\r\n }\r\n return menus;\r\n }\r\n\r\n public openMenu(graph: NodeSubsystem, position: Vector2): ContextMenuConfig {\r\n return {\r\n name: \"New Node\",\r\n group: nodeFlowContextMenuGroup,\r\n subMenus: this.newNodeSubmenus(graph, position),\r\n };\r\n }\r\n} \r\n","import { Camera } from \"../camera\";\r\nimport { Connection, ConnectionRenderer, DefaultConnectionRenderer } from \"../connection\";\r\nimport { CombineContextMenus, ContextMenuConfig } from \"../contextMenu\";\r\nimport { RenderResults } from \"../graphSubsystem\";\r\nimport { FlowNode, NodeState } from \"../node\";\r\nimport { Organize } from \"../organize\";\r\nimport { PassSubsystem } from \"../pass/subsystem\";\r\nimport { TimeExecution } from \"../performance\";\r\nimport { Port, PortType } from \"../port\";\r\nimport { BoxStyle } from \"../styles/box\";\r\nimport { CursorStyle } from \"../styles/cursor\";\r\nimport { Theme } from \"../theme\";\r\nimport { Box, BoxIntersection } from \"../types/box\";\r\nimport { List } from \"../types/list\";\r\nimport { Pool, VectorPool } from \"../types/pool\";\r\nimport { AddVector2, CopyVector2, SubVector2, Vector2, Zero } from \"../types/vector2\";\r\nimport { Widget } from \"../widgets/widget\";\r\nimport { NodeCreatedCallback, NodeFactory, NodeFactoryConfig } from \"./factory\";\r\nimport { Publisher } from \"./publisher\";\r\n\r\nexport type NodeAddedCallback = (node: FlowNode) => void;\r\nexport type NodeRemovedCallback = (node: FlowNode) => void;\r\n\r\nexport const nodeFlowGroup = \"node-flow-graph-node-menu\";\r\n\r\nexport interface ConnectionRendererConfiguration {\r\n size?: number;\r\n color?: string;\r\n\r\n mouseOverSize?: number;\r\n mouseOverColor?: string;\r\n\r\n renderer?: ConnectionRenderer;\r\n}\r\n\r\nfunction BuildConnectionRenderer(config: ConnectionRendererConfiguration | undefined): ConnectionRenderer {\r\n if (config?.renderer !== undefined) {\r\n return config.renderer;\r\n }\r\n\r\n return DefaultConnectionRenderer(\r\n config?.size === undefined ? 2 : config.size,\r\n undefined, // config?.color === undefined ? \"#00FF00\" : config.color,\r\n config?.mouseOverSize === undefined ? 4 : config.mouseOverSize,\r\n undefined, // config?.mouseOverColor === undefined ? \"#00FF22\" : config.mouseOverColor\r\n );\r\n}\r\n\r\ninterface PortIntersection {\r\n Node: FlowNode;\r\n Port: Port;\r\n Index: number;\r\n InputPort: boolean;\r\n}\r\n\r\ninterface NodeSubsystemConfig {\r\n idleConnection?: ConnectionRendererConfiguration\r\n nodes?: NodeFactoryConfig\r\n}\r\n\r\nexport class NodeSubsystem {\r\n\r\n #postProcessPass: PassSubsystem;\r\n\r\n #nodes: Array<FlowNode>;\r\n\r\n #connections: Array<Connection>;\r\n\r\n #nodeHovering: number;\r\n\r\n #nodesGrabbed: List<number>;\r\n\r\n #connectionSelected: Connection | null;\r\n\r\n #idleConnectionRenderer: ConnectionRenderer\r\n\r\n #portHovering: PortIntersection | null;\r\n\r\n #widgetHovering: Widget | null;\r\n\r\n #widgetCurrentlyClicking: Widget | null;\r\n\r\n #cursor: CursorStyle;\r\n\r\n #nodeFactory: NodeFactory;\r\n\r\n #boxSelect: boolean;\r\n\r\n #boxSelectStart_graphSpace: Vector2;\r\n\r\n #boxSelectEnd_graphSpace: Vector2;\r\n\r\n #boxSelectionNodes: List<number>;\r\n\r\n #boxSelectStyle: BoxStyle;\r\n\r\n // LISTENERS ==============================================================\r\n\r\n #nodeRemovedCallbacks: Array<NodeRemovedCallback>;\r\n\r\n #registeredNodeAddedCallbacks: Array<NodeAddedCallback>;\r\n\r\n // ========================================================================\r\n\r\n constructor(postProcessPass: PassSubsystem, config?: NodeSubsystemConfig) {\r\n this.#postProcessPass = postProcessPass;\r\n this.#nodes = [];\r\n this.#nodeHovering = -1;\r\n this.#nodesGrabbed = new List<number>();\r\n this.#connectionSelected = null;\r\n this.#portHovering = null;\r\n this.#widgetHovering = null;\r\n this.#widgetCurrentlyClicking = null;\r\n this.#connections = new Array<Connection>();\r\n this.#nodeFactory = new NodeFactory(config?.nodes);\r\n this.#idleConnectionRenderer = BuildConnectionRenderer(config?.idleConnection);\r\n this.#registeredNodeAddedCallbacks = new Array<NodeAddedCallback>();\r\n this.#nodeRemovedCallbacks = new Array<NodeRemovedCallback>();\r\n this.#cursor = CursorStyle.Default;\r\n\r\n this.#boxSelect = false;\r\n this.#boxSelectStart_graphSpace = Zero();\r\n this.#boxSelectEnd_graphSpace = Zero();\r\n this.#boxSelectionNodes = new List<number>();\r\n this.#boxSelectStyle = new BoxStyle({\r\n border: {\r\n color: Theme.BoxSelect.Color,\r\n size: Theme.BoxSelect.Size,\r\n },\r\n color: \"rgba(0,0,0,0)\",\r\n radius: Theme.BoxSelect.Radius\r\n });\r\n }\r\n\r\n public addPublisher(identifier: string, publisher: Publisher): void {\r\n this.#nodeFactory.addPublisher(identifier, publisher);\r\n }\r\n\r\n public addOnNodeCreatedListener(callback: NodeCreatedCallback): void {\r\n this.#nodeFactory.addOnNodeCreatedListener(callback);\r\n }\r\n\r\n public nodeFactory(): NodeFactory {\r\n return this.#nodeFactory;\r\n }\r\n\r\n public addOnNodeAddedListener(callback: NodeAddedCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#registeredNodeAddedCallbacks.push(callback);\r\n }\r\n\r\n public addOnNodeRemovedListener(callback: NodeRemovedCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#nodeRemovedCallbacks.push(callback);\r\n }\r\n\r\n clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean): boolean {\r\n this.#boxSelect = false;\r\n\r\n let hoveringSomething = false;\r\n if (this.#nodeHovering > -1) {\r\n this.#selectNodeByIndex(this.#nodeHovering, !ctrlKey);\r\n\r\n for (let i = 0; i < this.#nodes.length; i++) {\r\n if (this.#nodes[i].selected()) {\r\n this.#nodesGrabbed.Push(i);\r\n }\r\n }\r\n\r\n hoveringSomething = true;\r\n }\r\n\r\n if (this.#widgetHovering !== null) {\r\n this.#widgetHovering.ClickStart();\r\n this.#widgetCurrentlyClicking = this.#widgetHovering;\r\n hoveringSomething = true;\r\n }\r\n\r\n if (this.#portHovering === null) {\r\n\r\n if (ctrlKey && !hoveringSomething) {\r\n camera.screenSpaceToGraphSpace(mousePosition, this.#boxSelectStart_graphSpace)\r\n CopyVector2(this.#boxSelectEnd_graphSpace, this.#boxSelectStart_graphSpace);\r\n this.#boxSelect = true;\r\n }\r\n\r\n return hoveringSomething || ctrlKey;\r\n }\r\n\r\n if (this.#portHovering.InputPort) {\r\n for (let i = 0; i < this.#connections.length; i++) {\r\n if (this.#connections[i].inPort() === this.#portHovering.Port) {\r\n this.#connections[i].clearInput();\r\n this.#connectionSelected = this.#connections[i];\r\n break;\r\n }\r\n }\r\n } else {\r\n let inNode: FlowNode | null = this.#portHovering.Node\r\n let inNodeIndex = this.#portHovering.Index\r\n let outNode: FlowNode | null = this.#portHovering.Node\r\n let outNodeIndex = this.#portHovering.Index\r\n\r\n if (this.#portHovering.InputPort) {\r\n outNode = null;\r\n outNodeIndex = -1;\r\n } else {\r\n inNode = null;\r\n inNodeIndex = -1;\r\n }\r\n\r\n const connection = new Connection(inNode, inNodeIndex, outNode, outNodeIndex, this.#idleConnectionRenderer);\r\n this.#connectionSelected = connection;\r\n this.#connections.push(connection);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n mouseDragEvent(delta: Vector2, scale: number): boolean {\r\n let nodeMoved = false;\r\n\r\n VectorPool.run(() => {\r\n const scaledDelta = VectorPool.get();\r\n scaledDelta.x = delta.x / scale;\r\n scaledDelta.y = delta.y / scale;\r\n AddVector2(this.#boxSelectEnd_graphSpace, this.#boxSelectEnd_graphSpace, scaledDelta);\r\n\r\n if (this.#interactingWithNode()) {\r\n for (let i = 0; i < this.#nodesGrabbed.Count(); i++) {\r\n const node = this.#nodes[this.#nodesGrabbed.At(i)];\r\n if (node.locked()) {\r\n continue;\r\n }\r\n node.translate(scaledDelta);\r\n nodeMoved = true;\r\n }\r\n }\r\n });\r\n\r\n if (nodeMoved) {\r\n return true;\r\n }\r\n return this.#interactingWithConnection() || this.#interactingWithWidget() || this.#boxSelect;\r\n }\r\n\r\n clearNodeInputConnection(node: FlowNode, index: number): void {\r\n const port = node.inputPort(index);\r\n for (let i = this.#connections.length - 1; i >= 0; i--) {\r\n if (this.#connections[i].inPort() === port) {\r\n this.#removeConnection(this.#connections[i], true);\r\n }\r\n }\r\n }\r\n\r\n clickEnd(): void {\r\n\r\n for (let i = 0; i < this.#nodesGrabbed.Count(); i++) {\r\n const node = this.#nodes[this.#nodesGrabbed.At(i)];\r\n node.raiseDragStoppedEvent();\r\n }\r\n this.#nodesGrabbed.Clear();\r\n\r\n if (this.#boxSelect) {\r\n for (let i = 0; i < this.#boxSelectionNodes.Count(); i++) {\r\n this.#selectNode(this.#nodes[this.#boxSelectionNodes.At(i)], false);\r\n }\r\n\r\n this.#boxSelectionNodes.Clear();\r\n this.#boxSelect = false;\r\n }\r\n\r\n if (this.#widgetCurrentlyClicking !== null) {\r\n this.#widgetCurrentlyClicking.ClickEnd();\r\n this.#widgetCurrentlyClicking = null;\r\n }\r\n\r\n if (this.#connectionSelected === null) {\r\n return;\r\n }\r\n\r\n if (this.#portHovering === null) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n const port = this.#portHovering.Port;\r\n const conn = this.#connectionSelected;\r\n\r\n // If the port we're hovering is the one we started the connection \r\n // with...\r\n if (port === conn.inPort() || port === conn.outPort()) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n // If the port we're hoving is input, and also we started the \r\n // connection with an input, we can't do anything. We can't connect\r\n // input to input\r\n if (this.#portHovering.InputPort && conn.inPort() !== null) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n // Same with out. Can't connect output to output\r\n if (!this.#portHovering.InputPort && conn.outPort() !== null) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n // Different types, can't connect\r\n if (this.#portHovering.InputPort && this.#portHovering.Port.getDataType() !== conn.outPort()?.getDataType()) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n // Different types, can't connect\r\n if (!this.#portHovering.InputPort && this.#portHovering.Port.getDataType() !== conn.inPort()?.getDataType()) {\r\n this.#clearCurrentlySelectedConnection();\r\n return;\r\n }\r\n\r\n // Ight. Let's make the connection.\r\n if (this.#portHovering.InputPort) {\r\n let replace = false;\r\n const inputPort = this.#portHovering.Node.inputPort(this.#portHovering.Index);\r\n if (this.#portHovering.Port.getPortType() !== PortType.InputArray && inputPort.connections().length > 0) {\r\n replace = true;\r\n }\r\n\r\n if (replace) {\r\n // Remove input port's connection's output\r\n inputPort.connections()[0].clearOutput();\r\n\r\n // Remove connection from this subsystem\r\n this.#removeConnection(inputPort.connections()[0], false);\r\n }\r\n conn.setInput(this.#portHovering.Node, this.#portHovering.Index, replace);\r\n\r\n } else {\r\n conn.setOutput(this.#portHovering.Node, this.#portHovering.Index);\r\n }\r\n\r\n this.#connectionSelected = null;\r\n }\r\n\r\n connectNodes(nodeOut: FlowNode, outPort: number, nodeIn: FlowNode, inPort: number): Connection | undefined {\r\n const outType = nodeOut.outputPort(outPort).getDataType();\r\n const inType = nodeIn.inputPort(inPort).getDataType();\r\n if (outType !== inType) {\r\n console.error(\"can't connect nodes of different types\", outType, inType);\r\n return;\r\n }\r\n\r\n // Check and make sure the nodes aren't already connected\r\n const existingInputConnections = nodeIn.inputPort(inPort).connections();\r\n for (let i = 0; i < existingInputConnections.length; i++) {\r\n const connection = existingInputConnections[i];\r\n\r\n\r\n if (connection.outNode() !== nodeOut) {\r\n continue;\r\n }\r\n\r\n if (connection.outPort() !== nodeOut.outputPort(outPort)) {\r\n continue;\r\n }\r\n\r\n // This kind of connection already *exists*. Let's not add a duplicate\r\n return;\r\n }\r\n\r\n const connection = new Connection(\r\n nodeIn, inPort,\r\n nodeOut, outPort,\r\n this.#idleConnectionRenderer,\r\n );\r\n this.#connections.push(connection);\r\n return connection;\r\n }\r\n\r\n getNodes(): Array<FlowNode> {\r\n return this.#nodes;\r\n }\r\n\r\n /**\r\n * Returns all nodes who are connected to the inputs of the \r\n * node in question\r\n * \r\n * @param nodeIndex index of the node to examine inputs to\r\n */\r\n connectedInputsNodeReferencesByIndex(nodeIndex: number): Array<FlowNode> {\r\n return this.connectedInputsNodeReferences(this.#nodes[nodeIndex]);\r\n }\r\n\r\n connectedInputsNodeReferences(node: FlowNode): Array<FlowNode> {\r\n const connections = new Array<FlowNode>();\r\n for (let i = 0; i < this.#connections.length; i++) {\r\n const connection = this.#connections[i];\r\n if (node !== connection.inNode()) {\r\n continue;\r\n }\r\n\r\n const outNode = connection.outNode();\r\n if (outNode === null) {\r\n continue;\r\n }\r\n\r\n connections.push(outNode);\r\n }\r\n return connections;\r\n }\r\n\r\n connectedOutputsNodeReferences(nodeIndex: number): Array<FlowNode> {\r\n const node = this.#nodes[nodeIndex]\r\n const connections = new Array<FlowNode>();\r\n for (let i = 0; i < this.#connections.length; i++) {\r\n const connection = this.#connections[i];\r\n if (node !== connection.outNode()) {\r\n continue;\r\n }\r\n\r\n const inNode = connection.inNode();\r\n if (inNode === null) {\r\n continue;\r\n }\r\n\r\n connections.push(inNode);\r\n }\r\n return connections;\r\n }\r\n\r\n addNode(node: FlowNode): void {\r\n this.#nodes.push(node);\r\n for (let i = 0; i < this.#registeredNodeAddedCallbacks.length; i++) {\r\n const callback = this.#registeredNodeAddedCallbacks[i];\r\n if (!callback) {\r\n continue;\r\n }\r\n callback(node);\r\n }\r\n }\r\n\r\n fileDrop(file: File): boolean {\r\n if (this.#nodeHovering === -1) {\r\n return false;\r\n }\r\n this.#nodes[this.#nodeHovering].dropFile(file);\r\n return true;\r\n }\r\n\r\n #removeNodeConnections(nodeIndex: number): void {\r\n if (nodeIndex >= this.#nodes.length || nodeIndex < 0) {\r\n console.error(\"invalid node connection\");\r\n return;\r\n }\r\n for (let i = this.#connections.length - 1; i >= 0; i--) {\r\n if (this.#connections[i].referencesNode(this.#nodes[nodeIndex])) {\r\n this.#removeConnectionByIndex(i, true);\r\n }\r\n }\r\n }\r\n\r\n #interactingWithNode(): boolean {\r\n return this.#nodesGrabbed.Count() > 0;\r\n }\r\n\r\n #interactingWithConnection(): boolean {\r\n return this.#connectionSelected !== null;\r\n }\r\n\r\n #interactingWithWidget(): boolean {\r\n return this.#widgetCurrentlyClicking !== null;\r\n }\r\n\r\n removeNode(node: FlowNode): void {\r\n for (let i = 0; i < this.#nodes.length; i++) {\r\n if (this.#nodes[i] === node) {\r\n this.#removeNodeByIndex(i);\r\n }\r\n }\r\n }\r\n\r\n #removeNodeByIndex(nodeIndex: number): void {\r\n this.#removeNodeConnections(nodeIndex);\r\n const node = this.#nodes[nodeIndex];\r\n this.#nodes.splice(nodeIndex, 1);\r\n for (let i = 0; i < this.#nodeRemovedCallbacks.length; i++) {\r\n this.#nodeRemovedCallbacks[i](node);\r\n }\r\n }\r\n\r\n #removeConnectionByIndex(index: number, clearPorts: boolean): void {\r\n if (clearPorts) {\r\n this.#connections[index].clearPorts();\r\n }\r\n this.#connections.splice(index, 1);\r\n }\r\n\r\n #removeConnection(connection: Connection, clearPorts: boolean): void {\r\n const index = this.#connections.indexOf(connection);\r\n if (index > -1) {\r\n this.#removeConnectionByIndex(index, clearPorts);\r\n } else {\r\n console.error(\"no connection found to remove\");\r\n }\r\n }\r\n\r\n organize(ctx: CanvasRenderingContext2D): void {\r\n Organize(ctx, this);\r\n }\r\n\r\n #nodesSelected(): Array<number> {\r\n const selected = new Array<number>();\r\n for (let i = 0; i < this.#nodes.length; i++) {\r\n if (this.#nodes[i].selected()) {\r\n selected.push(i);\r\n }\r\n }\r\n return selected;\r\n }\r\n\r\n #organizeSelected(ctx: CanvasRenderingContext2D): void {\r\n Organize(ctx, this, this.#nodesSelected());\r\n }\r\n\r\n openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig | null {\r\n\r\n const organizeNodesSubMenu: ContextMenuConfig = {\r\n name: \"Organize\",\r\n group: nodeFlowGroup,\r\n items: [\r\n {\r\n name: \"All Nodes\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.organize(ctx);\r\n }\r\n }\r\n ]\r\n }\r\n\r\n let config: ContextMenuConfig = {\r\n items: [],\r\n subMenus: [\r\n organizeNodesSubMenu,\r\n this.#nodeFactory.openMenu(this, position)\r\n ]\r\n }\r\n\r\n if (this.#nodesSelected().length > 0) {\r\n organizeNodesSubMenu.items?.push({\r\n name: \"Selected Nodes\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.#organizeSelected(ctx)\r\n }\r\n })\r\n }\r\n\r\n if (this.#nodeHovering > -1) {\r\n const nodeToReview = this.#nodeHovering;\r\n const nodeToReviewNode = this.#nodes[nodeToReview];\r\n\r\n config.subMenus?.push({\r\n group: nodeFlowGroup,\r\n name: \"Select\",\r\n items: [\r\n {\r\n name: \"Direct Connected Nodes\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.#selectConnectedNodes(nodeToReview);\r\n }\r\n },\r\n {\r\n name: \"Input Nodes + Descendents\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.#selectInputNodesAndDescendents(nodeToReviewNode);\r\n }\r\n },\r\n ]\r\n })\r\n\r\n config.subMenus?.push({\r\n group: nodeFlowGroup,\r\n name: \"Delete\",\r\n items: [\r\n {\r\n name: \"Node\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.#removeNodeByIndex(nodeToReview);\r\n }\r\n },\r\n {\r\n name: \"Connections\",\r\n group: nodeFlowGroup,\r\n callback: () => {\r\n this.#removeNodeConnections(nodeToReview);\r\n }\r\n }\r\n ]\r\n })\r\n config = CombineContextMenus(config, nodeToReviewNode.contextMenu());\r\n }\r\n return config;\r\n }\r\n\r\n #selectInputNodesAndDescendents(node: FlowNode): void {\r\n if (node === undefined) {\r\n return;\r\n }\r\n this.#selectNode(node, false);\r\n\r\n const inputs = this.connectedInputsNodeReferences(node);\r\n for (let i = 0; i < inputs.length; i++) {\r\n this.#selectInputNodesAndDescendents(inputs[i]);\r\n }\r\n }\r\n\r\n #selectConnectedNodes(nodeIndex: number): void {\r\n const node = this.#nodes[nodeIndex];\r\n if (node === undefined) {\r\n return;\r\n }\r\n this.#selectNode(node, false);\r\n\r\n const outputs = this.connectedOutputsNodeReferences(nodeIndex);\r\n for (let i = 0; i < outputs.length; i++) {\r\n this.#selectNode(outputs[i], false);\r\n }\r\n\r\n const inputs = this.connectedInputsNodeReferencesByIndex(nodeIndex);\r\n for (let i = 0; i < inputs.length; i++) {\r\n this.#selectNode(inputs[i], false);\r\n }\r\n }\r\n\r\n #selectNodeByIndex(nodeIndex: number, unselectOthers: boolean): void {\r\n this.#selectNode(this.#nodes[nodeIndex], unselectOthers);\r\n }\r\n\r\n #selectNode(node: FlowNode, unselectOthers: boolean): void {\r\n node.select();\r\n\r\n if (!unselectOthers) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this.#nodes.length; i++) {\r\n if (node === this.#nodes[i]) {\r\n continue\r\n }\r\n this.#nodes[i].unselect();\r\n }\r\n }\r\n\r\n #clearCurrentlySelectedConnection(): void {\r\n if (this.#connectionSelected === null) {\r\n return;\r\n }\r\n this.#removeConnection(this.#connectionSelected, true);\r\n this.#connectionSelected = null;\r\n }\r\n\r\n #renderConnections(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): void {\r\n for (let i = 0; i < this.#connections.length; i++) {\r\n let portMousedOver = false;\r\n if (mousePosition !== undefined) {\r\n portMousedOver = this.#connections[i].mouseOverPort(mousePosition) !== null;\r\n }\r\n this.#connections[i].render(ctx, camera.zoom, portMousedOver, mousePosition);\r\n }\r\n }\r\n\r\n #renderNodes(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined) {\r\n this.#portHovering = null;\r\n this.#widgetHovering = null;\r\n this.#nodeHovering = -1;\r\n this.#boxSelectionNodes.Clear();\r\n\r\n const selectedBox_Screenspace = this.#boxSelectionScreenspaceBox(camera);\r\n\r\n for (let i = 0; i < this.#nodes.length; i++) {\r\n let state = NodeState.Idle;\r\n\r\n if (mousePosition !== undefined && !this.#boxSelect) {\r\n const intersection = this.#nodes[i].inBounds(ctx, camera, mousePosition);\r\n\r\n if (intersection.Node !== undefined && intersection.PortIndex === undefined && intersection.Widget === undefined) {\r\n state = NodeState.MouseOver;\r\n this.#nodeHovering = i;\r\n this.#cursor = CursorStyle.Grab;\r\n }\r\n\r\n if (intersection.Widget !== undefined) {\r\n // console.log(i, this.#nodes[i].title(), \"widget\")\r\n this.#widgetHovering = intersection.Widget\r\n this.#cursor = CursorStyle.Pointer;\r\n }\r\n\r\n if (intersection.Port !== undefined && intersection.Node !== undefined && intersection.PortIndex !== undefined && intersection.PortIsInput !== undefined) {\r\n this.#portHovering = {\r\n Index: intersection.PortIndex,\r\n Node: intersection.Node,\r\n Port: intersection.Port,\r\n InputPort: intersection.PortIsInput\r\n };\r\n }\r\n } else if (this.#boxSelect) {\r\n const nodeBounds = this.#nodes[i].calculateBounds(ctx, camera);\r\n\r\n if (BoxIntersection(selectedBox_Screenspace, nodeBounds)) {\r\n state = NodeState.MouseOver;\r\n this.#boxSelectionNodes.Push(i);\r\n }\r\n }\r\n\r\n // if (i === this.#nodeSelected) {\r\n // state = NodeState.Selected;\r\n // }\r\n\r\n if (this.#nodes[i].selected() && this.#nodesGrabbed.Count() > 0) {\r\n state = NodeState.Grabbed;\r\n this.#cursor = CursorStyle.Grabbing;\r\n }\r\n\r\n this.#nodes[i].render(ctx, camera, state, mousePosition, this.#postProcessPass);\r\n }\r\n }\r\n\r\n #boxSelectionScreenspaceBox(camera: Camera): Box {\r\n const box = { Position: Zero(), Size: Zero() }\r\n\r\n camera.graphSpaceToScreenSpace(this.#boxSelectStart_graphSpace, box.Position);\r\n camera.graphSpaceToScreenSpace(this.#boxSelectEnd_graphSpace, box.Size);\r\n\r\n SubVector2(box.Size, box.Size, box.Position);\r\n\r\n return box;\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults | undefined {\r\n this.#cursor = CursorStyle.Default;\r\n TimeExecution(\"Render_Connections\", () => {\r\n this.#renderConnections(ctx, camera, mousePosition);\r\n })\r\n TimeExecution(\"Render_Nodes\", () => {\r\n this.#renderNodes(ctx, camera, mousePosition);\r\n })\r\n\r\n if (this.#boxSelect) {\r\n const box = this.#boxSelectionScreenspaceBox(camera);\r\n ctx.setLineDash([Theme.BoxSelect.LineDashLength]);\r\n this.#boxSelectStyle.Draw(ctx, box, 1);\r\n ctx.setLineDash([]);\r\n }\r\n\r\n return { cursorStyle: this.#cursor }\r\n }\r\n\r\n}","import { Popup } from \"../popup\";\r\n\r\ninterface FormValue {\r\n name: string;\r\n\r\n // https://html.spec.whatwg.org/multipage/input.html#dom-input-type\r\n type: string;\r\n\r\n startingValue: any;\r\n}\r\n\r\ninterface Config {\r\n title: string;\r\n form: Array<FormValue>;\r\n onUpdate: (newValue: Array<any>) => void;\r\n onCancel?: () => void;\r\n}\r\n\r\nexport function FormPopup(config: Config): Popup {\r\n let input = new Array<HTMLInputElement | null>();\r\n\r\n const setOption = \"Set\";\r\n const cancelOption = \"Cancel\";\r\n\r\n return new Popup({\r\n title: config.title,\r\n options: [setOption, cancelOption],\r\n content: () => {\r\n const container = document.createElement('div');\r\n container.style.flexDirection = \"column\";\r\n container.style.display = \"flex\";\r\n\r\n for (let i = 0; i < config.form.length; i++) {\r\n const title = document.createElement(\"h4\");\r\n title.innerText = config.form[i].name;\r\n container.append(title);\r\n\r\n const ele = document.createElement('input');\r\n ele.value = config.form[i].startingValue;\r\n ele.type = config.form[i].type;\r\n container.append(ele);\r\n input.push(ele);\r\n container.append(document.createElement(\"br\"));\r\n }\r\n\r\n return container;\r\n },\r\n onClose: (button: string | null): void => {\r\n if (button !== setOption || input === null) {\r\n if (config.onCancel) {\r\n config.onCancel();\r\n }\r\n return;\r\n }\r\n\r\n const values = new Array<any>();\r\n for (let i = 0; i < config.form.length; i++) {\r\n values[i] = input[i]?.value;\r\n }\r\n config.onUpdate(values);\r\n },\r\n });\r\n}\r\n","import { Port, PortConfig, PortType } from \"./port\";\r\nimport { FontWeight, TextStyle, TextStyleConfig, TextStyleFallback } from \"./styles/text\";\r\nimport { Box, InBox } from \"./types/box\";\r\nimport { CopyVector2, Distance, ScaleVector, Vector2, Zero } from \"./types/vector2\";\r\nimport { Widget } from './widgets/widget';\r\nimport { List } from './types/list';\r\nimport { BoxStyle, BoxStyleConfig, BoxStyleWithFallback } from \"./styles/box\";\r\nimport { Text } from \"./types/text\";\r\nimport { GlobalWidgetFactory } from \"./widgets/factory\";\r\nimport { Theme } from \"./theme\";\r\nimport { TextAlign } from \"./styles/canvasTextAlign\";\r\nimport { TextBaseline } from \"./styles/canvasTextBaseline\";\r\nimport { CombineContextMenus, ContextMenuConfig, ContextMenuItemConfig } from \"./contextMenu\";\r\nimport { nodeFlowGroup } from \"./nodes/subsystem\";\r\nimport { SetStringPopup } from \"./popups/string\";\r\nimport { ButtonWidget } from \"./widgets/button\";\r\nimport { FormPopup } from \"./popups/form\";\r\nimport { NumberWidget } from \"./widgets/number\";\r\nimport { StringWidget } from \"./widgets/string\";\r\nimport { ToggleWidget } from \"./widgets/toggle\";\r\nimport { ColorWidget } from \"./widgets/color\";\r\nimport { SliderWidget } from \"./widgets/slider\";\r\nimport { ImageWidget } from \"./widgets/image\";\r\nimport { VectorPool } from \"./types/pool\";\r\nimport { Camera } from \"./camera\";\r\nimport { PassSubsystem } from \"./pass/subsystem\";\r\nimport { splitString, splitStringIntoLines } from \"./utils/string\";\r\nimport { Metadata } from './metadata';\r\n\r\nconst MINIMUM_NODE_WIDTH = 150;\r\n\r\ntype AnyPropertyChangeCallback = (propertyName: string, oldValue: any, newValue: any) => void\r\ntype PropertyChangeCallback = (oldValue: any, newValue: any) => void\r\ntype TitleChangeCallback = (node: FlowNode, oldTitle: string, newTitle: string) => void\r\ntype InfoChangeCallback = (node: FlowNode, oldInfo: string, newInfo: string) => void\r\n\r\n\r\n\r\nexport interface WidgetConfig {\r\n type?: string,\r\n config?: any\r\n}\r\n\r\nexport interface FlowNodeTitleConfig {\r\n textStyle?: TextStyleConfig;\r\n color?: string;\r\n padding?: number;\r\n}\r\n\r\nexport interface FlowNodeStyle {\r\n title?: FlowNodeTitleConfig;\r\n idle?: BoxStyleConfig;\r\n mouseOver?: BoxStyleConfig;\r\n grabbed?: BoxStyleConfig;\r\n selected?: BoxStyleConfig;\r\n portText?: TextStyleConfig;\r\n}\r\n\r\nexport enum MessageType {\r\n Info = \"info\",\r\n Warning = \"warning\",\r\n Error = \"error\"\r\n};\r\n\r\nfunction MessageTypeColor(messageType: MessageType): string {\r\n switch (messageType) {\r\n case MessageType.Info:\r\n return Theme.Node.Message.InfoColor;\r\n\r\n case MessageType.Warning:\r\n return Theme.Node.Message.WarnColor;\r\n\r\n case MessageType.Error:\r\n return Theme.Node.Message.ErrorColor;\r\n\r\n default:\r\n throw new Error(`unrecognized message type ${messageType}`)\r\n }\r\n}\r\n\r\nexport interface NodeMessageConfig {\r\n message: string;\r\n type?: MessageType;\r\n}\r\n\r\nexport interface FlowNodeConfig {\r\n position?: Vector2;\r\n title?: string;\r\n subTitle?: string;\r\n info?: string;\r\n messages?: Array<NodeMessageConfig>\r\n locked?: boolean;\r\n data?: Metadata;\r\n contextMenu?: ContextMenuConfig;\r\n metadata?: any;\r\n\r\n canEditTitle?: boolean;\r\n canEditInfo?: boolean;\r\n canEditPorts?: boolean;\r\n\r\n // Ports\r\n inputs?: Array<PortConfig>;\r\n outputs?: Array<PortConfig>;\r\n\r\n // Callbacks\r\n onGrab?: () => void;\r\n onRelease?: () => void;\r\n onSelect?: () => void;\r\n onUnselect?: () => void;\r\n onDragStop?: (FlowNode: FlowNode) => void;\r\n onFileDrop?: (file: File) => void;\r\n onTitleChange?: TitleChangeCallback;\r\n onInfoChange?: InfoChangeCallback;\r\n\r\n // Widgets\r\n widgets?: Array<WidgetConfig>;\r\n\r\n // Styling\r\n style?: FlowNodeStyle;\r\n}\r\n\r\nexport enum NodeState {\r\n Idle,\r\n MouseOver,\r\n Grabbed\r\n}\r\n\r\nexport interface NodeIntersection {\r\n Node?: FlowNode\r\n\r\n // Port\r\n Port?: Port\r\n PortIndex?: number\r\n PortIsInput?: boolean\r\n\r\n // Widget\r\n Widget?: Widget\r\n WidgetIndex?: number\r\n\r\n}\r\n\r\nclass MessageRenderer {\r\n\r\n #text: Text;\r\n\r\n constructor(config: NodeMessageConfig) {\r\n this.#text = new Text(config.message,\r\n {\r\n color: MessageTypeColor(config.type ? config.type : MessageType.Info),\r\n },\r\n {\r\n LineSpacing: 2.5,\r\n MaxWidth: 200\r\n }\r\n );\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, scale: number, position: Vector2): number {\r\n ctx.textAlign = TextAlign.Center;\r\n this.#text.render(ctx, scale, position);\r\n return this.#text.height(ctx) * scale;\r\n }\r\n}\r\n\r\nexport class FlowNode {\r\n\r\n #position: Vector2;\r\n\r\n #title: Text;\r\n\r\n #subTitle: Text;\r\n\r\n #infoSymbol: Text;\r\n\r\n #infoText: string;\r\n\r\n #messages: Array<MessageRenderer>\r\n\r\n #input: Array<Port>;\r\n\r\n #output: Array<Port>;\r\n\r\n #widgets: Array<Widget>;\r\n\r\n #locked: boolean;\r\n\r\n #canEditTitle: boolean;\r\n\r\n #canEditInfo: boolean;\r\n\r\n #canEditPorts: boolean;\r\n\r\n #contextMenu: ContextMenuConfig | null;\r\n\r\n #metadata: any;\r\n\r\n // Callbacks\r\n\r\n #onSelect: Array<() => void>;\r\n\r\n #onUnselect: Array<() => void>;\r\n\r\n #onFiledrop: Array<(file: File) => void>;\r\n\r\n #onDragStop: Array<(node: FlowNode) => void>;\r\n\r\n #titleChangeCallback: Array<TitleChangeCallback>;\r\n\r\n #infoChangeCallback: Array<InfoChangeCallback>;\r\n\r\n // Styling ================================================================\r\n\r\n #titleColor: string;\r\n\r\n #selectedStyle: BoxStyle;\r\n\r\n #stateStyles: Map<NodeState, BoxStyle>;\r\n\r\n #padding: number;\r\n\r\n #portTextStyle: TextStyle;\r\n\r\n #elementSpacing: number;\r\n\r\n // Runtime ================================================================\r\n\r\n #selected: boolean;\r\n\r\n #inputPortPositions: List<Box>;\r\n\r\n #outputPortPositions: List<Box>;\r\n\r\n #widgetPositions: List<Box>;\r\n\r\n #data: Metadata;\r\n\r\n #registeredAnyPropertyChangeCallbacks: Array<AnyPropertyChangeCallback>;\r\n\r\n #registeredPropertyChangeCallbacks: Map<string, Array<PropertyChangeCallback>>;\r\n\r\n constructor(config?: FlowNodeConfig) {\r\n this.#input = new Array<Port>();\r\n this.#output = new Array<Port>();\r\n this.#widgets = new Array<Widget>();\r\n this.#inputPortPositions = new List<Box>();\r\n this.#outputPortPositions = new List<Box>();\r\n this.#widgetPositions = new List<Box>();\r\n this.#elementSpacing = 15;\r\n this.#locked = config?.locked === undefined ? false : config.locked;\r\n this.#data = config?.data === undefined ? {} : config?.data;\r\n this.#registeredPropertyChangeCallbacks = new Map<string, Array<PropertyChangeCallback>>();\r\n this.#registeredAnyPropertyChangeCallbacks = new Array<AnyPropertyChangeCallback>();\r\n this.#canEditPorts = config?.canEditPorts === undefined ? false : config.canEditPorts;\r\n this.#canEditTitle = config?.canEditTitle === undefined ? false : config.canEditTitle;\r\n this.#canEditInfo = config?.canEditInfo === undefined ? false : config.canEditInfo;\r\n this.#contextMenu = config?.contextMenu === undefined ? null : config.contextMenu;\r\n this.#metadata = config?.metadata;\r\n\r\n this.#messages = [];\r\n if (config?.messages) {\r\n for (let i = 0; i < config.messages.length; i++) {\r\n const message = config.messages[i];\r\n this.#messages.push(new MessageRenderer(message));\r\n }\r\n }\r\n\r\n this.#selected = false;\r\n this.#onSelect = new Array<() => void>();\r\n this.#onUnselect = new Array<() => void>();\r\n this.#onFiledrop = new Array<(file: File) => void>();\r\n this.#onDragStop = new Array<() => void>();\r\n this.#titleChangeCallback = new Array<TitleChangeCallback>();\r\n this.#infoChangeCallback = new Array<InfoChangeCallback>();\r\n\r\n if (config?.onSelect) {\r\n this.#onSelect.push(config?.onSelect);\r\n }\r\n\r\n if (config?.onUnselect) {\r\n this.#onUnselect.push(config?.onUnselect);\r\n }\r\n\r\n if (config?.onFileDrop) {\r\n this.#onFiledrop.push(config?.onFileDrop);\r\n }\r\n\r\n if (config?.onDragStop) {\r\n this.#onDragStop.push(config.onDragStop);\r\n }\r\n\r\n if (config?.onTitleChange) {\r\n this.#titleChangeCallback.push(config.onTitleChange);\r\n }\r\n\r\n if (config?.onInfoChange) {\r\n this.#infoChangeCallback.push(config.onInfoChange);\r\n }\r\n\r\n this.#position = config?.position === undefined ? { x: 0, y: 0 } : config.position;\r\n this.#title = new Text(\r\n config?.title === undefined ? \"\" : config.title,\r\n TextStyleFallback(config?.style?.title?.textStyle, {\r\n size: 16,\r\n weight: FontWeight.Bold,\r\n color: Theme.Node.FontColor\r\n })\r\n );\r\n\r\n this.#subTitle = new Text(\r\n config?.subTitle === undefined ? \"\" : config.subTitle,\r\n TextStyleFallback(config?.style?.title?.textStyle, {\r\n size: 10,\r\n weight: FontWeight.Bold,\r\n color: Theme.Node.FontColor\r\n })\r\n );\r\n\r\n this.#infoSymbol = new Text(\r\n \"i\",\r\n {\r\n size: 13,\r\n weight: FontWeight.Bold,\r\n color: Theme.Node.FontColor\r\n }\r\n );\r\n this.#infoText = config?.info ? config?.info : \"\";\r\n\r\n this.#titleColor = config?.style?.title?.color === undefined ? \"#154050\" : config?.style?.title?.color;\r\n\r\n this.#padding = config?.style?.title?.padding === undefined ? 15 : config?.style?.title?.padding;\r\n\r\n this.#stateStyles = new Map<NodeState, BoxStyle>();\r\n this.#stateStyles.set(NodeState.Idle, new BoxStyle(BoxStyleWithFallback(config?.style?.idle, {\r\n border: { color: Theme.Node.Border.Idle, size: 1 },\r\n radius: Theme.Node.BorderRadius,\r\n color: Theme.Node.BackgroundColor,\r\n })));\r\n this.#stateStyles.set(NodeState.MouseOver, new BoxStyle(BoxStyleWithFallback(config?.style?.mouseOver, {\r\n border: { color: Theme.Node.Border.MouseOver, size: 1.1, },\r\n radius: Theme.Node.BorderRadius,\r\n color: Theme.Node.BackgroundColor,\r\n })));\r\n this.#stateStyles.set(NodeState.Grabbed, new BoxStyle(BoxStyleWithFallback(config?.style?.grabbed, {\r\n border: { color: Theme.Node.Border.Grabbed, size: 2, },\r\n radius: Theme.Node.BorderRadius,\r\n color: Theme.Node.BackgroundColor,\r\n })));\r\n\r\n this.#selectedStyle = new BoxStyle(BoxStyleWithFallback(config?.style?.selected, {\r\n border: { color: Theme.Node.Border.Selected, size: 1, },\r\n radius: Theme.Node.BorderRadius,\r\n color: Theme.Node.BackgroundColor,\r\n }));\r\n\r\n this.#portTextStyle = new TextStyle({\r\n size: config?.style?.portText?.size === undefined ? 14 : config?.style?.portText?.size,\r\n color: config?.style?.portText?.color === undefined ? Theme.Node.Port.FontColor : config?.style?.portText?.color,\r\n font: config?.style?.portText?.font,\r\n weight: config?.style?.portText?.weight,\r\n });\r\n\r\n if (config?.inputs !== undefined) {\r\n for (let i = 0; i < config.inputs.length; i++) {\r\n this.addInput(config.inputs[i]);\r\n }\r\n }\r\n\r\n if (config?.outputs !== undefined) {\r\n for (let i = 0; i < config.outputs.length; i++) {\r\n this.addOutput(config.outputs[i]);\r\n }\r\n }\r\n\r\n if (config?.widgets !== undefined) {\r\n for (let i = 0; i < config.widgets.length; i++) {\r\n const widget = config.widgets[i];\r\n if (widget.type === undefined) {\r\n continue;\r\n }\r\n this.addWidget(GlobalWidgetFactory.create(this, widget.type, widget.config))\r\n }\r\n }\r\n }\r\n\r\n public metadata(): any {\r\n return this.#metadata;\r\n }\r\n\r\n public selected(): boolean {\r\n return this.#selected;\r\n }\r\n\r\n public select(): void {\r\n if (this.#selected) {\r\n return;\r\n }\r\n this.#selected = true;\r\n for (let i = 0; i < this.#onSelect.length; i++) {\r\n this.#onSelect[i]();\r\n }\r\n }\r\n\r\n public raiseDragStoppedEvent() {\r\n for (let i = 0; i < this.#onDragStop.length; i++) {\r\n this.#onDragStop[i](this);\r\n }\r\n }\r\n\r\n public addTitleChangeListener(callback: TitleChangeCallback): void {\r\n if (callback === undefined || callback === null) {\r\n }\r\n this.#titleChangeCallback.push(callback);\r\n }\r\n\r\n public addInfoChangeListener(callback: InfoChangeCallback): void {\r\n if (callback === undefined || callback === null) {\r\n }\r\n this.#infoChangeCallback.push(callback);\r\n }\r\n\r\n\r\n public addDragStoppedListener(callback: (node: FlowNode) => void): void {\r\n if (callback === undefined || callback === null) {\r\n }\r\n this.#onDragStop.push(callback);\r\n }\r\n\r\n public addAnyPropertyChangeListener(callback: AnyPropertyChangeCallback): void {\r\n if (callback === undefined || callback === null) {\r\n }\r\n this.#registeredAnyPropertyChangeCallbacks.push(callback);\r\n }\r\n\r\n public addPropertyChangeListener(name: string, callback: PropertyChangeCallback): void {\r\n if (!this.#registeredPropertyChangeCallbacks.has(name)) {\r\n this.#registeredPropertyChangeCallbacks.set(name, []);\r\n }\r\n\r\n const callbacks = this.#registeredPropertyChangeCallbacks.get(name);\r\n if (callbacks === undefined) {\r\n return;\r\n }\r\n callbacks.push(callback);\r\n }\r\n\r\n public setProperty(name: string, value: any): void {\r\n const oldValue = this.#data[name];\r\n if (oldValue === value) {\r\n return;\r\n }\r\n\r\n this.#data[name] = value;\r\n\r\n for (let i = 0; i < this.#registeredAnyPropertyChangeCallbacks.length; i++) {\r\n this.#registeredAnyPropertyChangeCallbacks[i](name, oldValue, value);\r\n }\r\n\r\n const callbacks = this.#registeredPropertyChangeCallbacks.get(name);\r\n if (callbacks === undefined) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < callbacks.length; i++) {\r\n callbacks[i](oldValue, value);\r\n }\r\n }\r\n\r\n public getProperty(name: string): any {\r\n return this.#data[name];\r\n }\r\n\r\n #popupNodeTitleSelection(): void {\r\n SetStringPopup({\r\n title: \"Set Node Title\",\r\n startingValue: this.title(),\r\n onUpdate: (value: string): void => {\r\n this.setTitle(value);\r\n },\r\n }).Show();\r\n }\r\n\r\n #popupNodeInfoSelection(): void {\r\n SetStringPopup({\r\n title: \"Set Node Info\",\r\n startingValue: this.#infoText,\r\n onUpdate: (value: string): void => {\r\n this.setInfo(value);\r\n },\r\n }).Show();\r\n }\r\n\r\n #popupNewButtonWidget(): void {\r\n SetStringPopup({\r\n title: \"New Button Widget Text\",\r\n startingValue: \"My Button\",\r\n onUpdate: (value: string): void => {\r\n this.addWidget(new ButtonWidget({\r\n text: value\r\n }));\r\n },\r\n }).Show()\r\n }\r\n\r\n #widgetSubmenu(): ContextMenuConfig {\r\n return {\r\n name: \"Widget\",\r\n items: [\r\n {\r\n name: \"Button\",\r\n callback: this.#popupNewButtonWidget.bind(this),\r\n },\r\n {\r\n name: \"Number\",\r\n callback: () => {\r\n this.addWidget(new NumberWidget(this))\r\n }\r\n },\r\n {\r\n name: \"Color\",\r\n callback: () => {\r\n this.addWidget(new ColorWidget(this))\r\n }\r\n },\r\n {\r\n name: \"Slider\",\r\n callback: () => {\r\n FormPopup({\r\n title: \"New Slider\",\r\n form: [\r\n {\r\n name: \"min\",\r\n type: \"number\",\r\n startingValue: 0\r\n },\r\n {\r\n name: \"max\",\r\n type: \"number\",\r\n startingValue: 100\r\n }\r\n ],\r\n onUpdate: (data: Array<any>) => {\r\n this.addWidget(new SliderWidget(this, {\r\n min: data[0],\r\n max: data[1],\r\n }));\r\n }\r\n }).Show();\r\n }\r\n },\r\n {\r\n name: \"String\",\r\n callback: () => {\r\n this.addWidget(new StringWidget(this))\r\n }\r\n },\r\n {\r\n name: \"Toggle\",\r\n callback: () => {\r\n this.addWidget(new ToggleWidget(this))\r\n }\r\n },\r\n {\r\n name: \"Image\",\r\n callback: () => {\r\n FormPopup({\r\n title: \"New Image\",\r\n form: [\r\n {\r\n name: \"URL\",\r\n type: \"text\",\r\n startingValue: \"https://pbs.twimg.com/media/GYabtu6bsAA7m99?format=jpg&name=medium\"\r\n },\r\n {\r\n name: \"Max Width\",\r\n type: \"number\",\r\n startingValue: MINIMUM_NODE_WIDTH\r\n },\r\n {\r\n name: \"Max Height\",\r\n type: \"number\",\r\n startingValue: MINIMUM_NODE_WIDTH\r\n }\r\n ],\r\n onUpdate: (data: Array<any>) => {\r\n this.addWidget(new ImageWidget({\r\n image: data[0],\r\n maxWidth: data[1],\r\n maxHeight: data[2],\r\n }));\r\n }\r\n }).Show();\r\n }\r\n }\r\n ]\r\n };\r\n }\r\n\r\n public contextMenu(): ContextMenuConfig {\r\n let config: ContextMenuConfig = {\r\n group: nodeFlowGroup,\r\n items: [\r\n // {\r\n // name: \"Debug\",\r\n // callback: () => {\r\n // console.log(this);\r\n // }\r\n // }\r\n ],\r\n subMenus: [],\r\n }\r\n\r\n if (this.canEditPorts() || this.canEditTitle() || this.#canEditInfo) {\r\n\r\n const items = new Array<ContextMenuItemConfig>();\r\n if (this.canEditTitle()) {\r\n items.push({\r\n name: \"Title\",\r\n callback: () => {\r\n this.#popupNodeTitleSelection();\r\n }\r\n })\r\n }\r\n\r\n if (this.#canEditInfo) {\r\n items.push({\r\n name: \"Info\",\r\n callback: () => {\r\n this.#popupNodeInfoSelection();\r\n }\r\n })\r\n }\r\n\r\n const submenus = new Array<ContextMenuConfig>();\r\n if (this.canEditPorts()) {\r\n submenus.push({\r\n name: \"Add\",\r\n items: [\r\n {\r\n name: \"Input\",\r\n callback: () => {\r\n FormPopup({\r\n title: \"New Input\",\r\n form: [\r\n {\r\n name: \"name\",\r\n type: \"text\",\r\n startingValue: \"input\"\r\n },\r\n {\r\n name: \"type\",\r\n type: \"text\",\r\n startingValue: \"string\"\r\n }\r\n ],\r\n onUpdate: (data: Array<any>) => {\r\n this.addInput({\r\n name: data[0],\r\n type: data[1]\r\n })\r\n }\r\n }).Show();\r\n }\r\n },\r\n {\r\n name: \"Output\",\r\n callback: () => {\r\n FormPopup({\r\n title: \"New Output\",\r\n form: [\r\n {\r\n name: \"name\",\r\n type: \"text\",\r\n startingValue: \"output\"\r\n },\r\n {\r\n name: \"type\",\r\n type: \"text\",\r\n startingValue: \"string\"\r\n }\r\n ],\r\n onUpdate: (data: Array<any>) => {\r\n this.addOutput({\r\n name: data[0],\r\n type: data[1]\r\n })\r\n }\r\n }).Show();\r\n }\r\n },\r\n ],\r\n subMenus: [\r\n this.#widgetSubmenu(),\r\n ]\r\n });\r\n }\r\n\r\n config.subMenus?.push({\r\n group: nodeFlowGroup,\r\n name: \"Edit\",\r\n items: items,\r\n subMenus: submenus,\r\n })\r\n }\r\n\r\n if (this.locked()) {\r\n config.items?.push({\r\n name: \"Unlock Node Position\",\r\n group: nodeFlowGroup,\r\n callback: this.unlock.bind(this),\r\n });\r\n } else {\r\n config.items?.push({\r\n name: \"Lock Node Position\",\r\n group: nodeFlowGroup,\r\n callback: this.lock.bind(this),\r\n })\r\n }\r\n\r\n if (this.#contextMenu !== null) {\r\n config = CombineContextMenus(config, this.#contextMenu)\r\n }\r\n\r\n return config;\r\n }\r\n\r\n public unselect(): void {\r\n if (!this.#selected) {\r\n return;\r\n }\r\n this.#selected = false;\r\n for (let i = 0; i < this.#onUnselect.length; i++) {\r\n this.#onUnselect[i]();\r\n }\r\n }\r\n\r\n public addUnselectListener(callback: () => void): void {\r\n this.#onUnselect.push(callback);\r\n }\r\n\r\n public addSelectListener(callback: () => void): void {\r\n this.#onSelect.push(callback);\r\n }\r\n\r\n public dropFile(file: File): void {\r\n for (let i = 0; i < this.#onFiledrop.length; i++) {\r\n this.#onFiledrop[i](file);\r\n }\r\n }\r\n\r\n public addFileDropListener(callback: (file: File) => void): void {\r\n this.#onFiledrop.push(callback);\r\n }\r\n\r\n public locked(): boolean {\r\n return this.#locked;\r\n }\r\n\r\n public lock(): void {\r\n this.#locked = true;\r\n }\r\n\r\n public unlock(): void {\r\n this.#locked = false;\r\n }\r\n\r\n public setPosition(position: Vector2): void {\r\n CopyVector2(this.#position, position);\r\n }\r\n\r\n public getPosition(): Vector2 {\r\n return this.#position;\r\n }\r\n\r\n // #measureTitleText(ctx: CanvasRenderingContext2D, scale: number): Vector2 {\r\n // return this.#titleTextStyle.measure(ctx, scale, this.#title);\r\n // }\r\n\r\n public calculateBounds(ctx: CanvasRenderingContext2D, camera: Camera): Box {\r\n const tempMeasurement = Zero();\r\n\r\n const doublePadding = this.#padding * 2;\r\n\r\n const screenSpacePosition = Zero();\r\n camera.graphSpaceToScreenSpace(this.#position, screenSpacePosition);\r\n\r\n const size = Zero();\r\n this.#title.size(ctx, 1, size);\r\n\r\n const subtitleSize = Zero();\r\n this.#subTitle.size(ctx, 1, subtitleSize);\r\n size.x = Math.max(size.x, subtitleSize.x);\r\n\r\n if (this.#infoText !== \"\") {\r\n size.x += (size.y * 4);\r\n }\r\n\r\n size.x += doublePadding;\r\n size.y += doublePadding + (this.#elementSpacing * this.#input.length);\r\n\r\n for (let i = 0; i < this.#input.length; i++) {\r\n const port = this.#input[i];\r\n this.#portTextStyle.measure(ctx, 1, port.getDisplayName(), tempMeasurement);\r\n size.y += tempMeasurement.y;\r\n size.x = Math.max(size.x, tempMeasurement.x + doublePadding)\r\n }\r\n\r\n size.y += (this.#elementSpacing * this.#output.length);\r\n\r\n for (let i = 0; i < this.#output.length; i++) {\r\n const port = this.#output[i];\r\n this.#portTextStyle.measure(ctx, 1, port.getDisplayName(), tempMeasurement);\r\n size.y += tempMeasurement.y;\r\n size.x = Math.max(size.x, tempMeasurement.x + doublePadding)\r\n }\r\n\r\n size.y += (this.#elementSpacing * this.#widgets.length);\r\n for (let i = 0; i < this.#widgets.length; i++) {\r\n const element = this.#widgets[i];\r\n const eleSize = element.Size();\r\n size.y += eleSize.y\r\n size.x = Math.max(size.x, (eleSize.x) + doublePadding)\r\n }\r\n\r\n // Add some padding at the end!\r\n size.y += this.#elementSpacing\r\n\r\n size.x = Math.max(size.x, MINIMUM_NODE_WIDTH)\r\n ScaleVector(size, camera.zoom);\r\n\r\n return {\r\n Position: screenSpacePosition,\r\n Size: size,\r\n }\r\n }\r\n\r\n addInput(config: PortConfig): Port {\r\n const port = new Port(this, config.array ? PortType.InputArray : PortType.Input, config);\r\n this.#input.push(port);\r\n return port;\r\n }\r\n\r\n addOutput(config: PortConfig): Port {\r\n const port = new Port(this, PortType.Output, config);\r\n this.#output.push(port);\r\n return port;\r\n }\r\n\r\n addWidget(widget: Widget): void {\r\n this.#widgets.push(widget);\r\n }\r\n\r\n getWidget(index: number): Widget {\r\n return this.#widgets[index];\r\n }\r\n\r\n widgetCount(): number {\r\n return this.#widgets.length;\r\n }\r\n\r\n translate(delta: Vector2): void {\r\n this.#position.x += delta.x;\r\n this.#position.y += delta.y;\r\n }\r\n\r\n inBounds(ctx: CanvasRenderingContext2D, camera: Camera, position: Vector2): NodeIntersection {\r\n var intersection: NodeIntersection = {}\r\n\r\n const box = this.calculateBounds(ctx, camera);\r\n if (InBox(box, position)) {\r\n intersection.Node = this;\r\n }\r\n\r\n for (let i = 0; i < this.#inputPortPositions.Count(); i++) {\r\n if (InBox(this.#inputPortPositions.At(i), position)) {\r\n intersection.Node = this;\r\n intersection.PortIndex = i;\r\n intersection.PortIsInput = true;\r\n intersection.Port = this.#input[i]\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.#outputPortPositions.Count(); i++) {\r\n if (InBox(this.#outputPortPositions.At(i), position)) {\r\n intersection.Node = this;\r\n intersection.PortIndex = i;\r\n intersection.PortIsInput = false;\r\n intersection.Port = this.#output[i];\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.#widgetPositions.Count(); i++) {\r\n if (InBox(this.#widgetPositions.At(i), position)) {\r\n intersection.Node = this;\r\n intersection.WidgetIndex = i;\r\n intersection.Widget = this.#widgets[i];\r\n }\r\n }\r\n\r\n return intersection;\r\n }\r\n\r\n canEditTitle(): boolean {\r\n return this.#canEditTitle;\r\n }\r\n\r\n canEditPorts(): boolean {\r\n return this.#canEditPorts;\r\n }\r\n\r\n title(): string {\r\n return this.#title.get();\r\n }\r\n\r\n setTitle(newTitle: string): void {\r\n if (!this.#canEditTitle) {\r\n console.warn(\"setTitle instruction ignored, as node has been marked un-editable\");\r\n return;\r\n }\r\n\r\n let cleaned = newTitle;\r\n if (cleaned === null || cleaned === undefined) {\r\n cleaned = \"\";\r\n }\r\n\r\n const old = this.title();\r\n if (cleaned === old) {\r\n return;\r\n }\r\n\r\n this.#title.set(cleaned);\r\n\r\n for (let i = 0; i < this.#titleChangeCallback.length; i++) {\r\n const callback = this.#titleChangeCallback[i];\r\n callback(this, old, cleaned);\r\n }\r\n }\r\n\r\n setInfo(newInfo: string): void {\r\n if (!this.#canEditInfo) {\r\n console.warn(\"setInfo instruction ignored, as node has been marked un-editable\");\r\n }\r\n\r\n let cleaned = newInfo;\r\n if (cleaned === null || cleaned === undefined) {\r\n cleaned = \"\";\r\n }\r\n\r\n if (cleaned === this.#infoText) {\r\n return;\r\n }\r\n\r\n const old = this.#infoText;\r\n this.#infoText = cleaned;\r\n\r\n for (let i = 0; i < this.#infoChangeCallback.length; i++) {\r\n const callback = this.#infoChangeCallback[i];\r\n callback(this, old, cleaned);\r\n }\r\n }\r\n\r\n inputPortPosition(index: number): Box {\r\n return this.#inputPortPositions.At(index);\r\n }\r\n\r\n inputPort(index: number): Port {\r\n return this.#input[index];\r\n }\r\n\r\n inputs(): number {\r\n return this.#input.length;\r\n }\r\n\r\n outputPortPosition(index: number): Box {\r\n return this.#outputPortPositions.At(index);\r\n }\r\n\r\n outputPort(index: number): Port {\r\n return this.#output[index];\r\n }\r\n\r\n outputs(): number {\r\n return this.#output.length;\r\n }\r\n\r\n #calculateStyle(state: NodeState): BoxStyle {\r\n // Let the node being selected override the idle style\r\n if (this.#selected && state === NodeState.Idle) {\r\n return this.#selectedStyle;\r\n }\r\n\r\n let boxStyle = this.#stateStyles.get(state);\r\n if (boxStyle === undefined) {\r\n throw new Error(\"no registered border style for state: \" + state)\r\n }\r\n return boxStyle;\r\n }\r\n\r\n addMessage(message: NodeMessageConfig): void {\r\n this.#messages.push(new MessageRenderer(message));\r\n }\r\n\r\n clearMessages(): void {\r\n this.#messages = [];\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, state: NodeState, mousePosition: Vector2 | undefined, postProcess: PassSubsystem): void {\r\n VectorPool.run(() => {\r\n const tempMeasurement = VectorPool.get();\r\n\r\n this.#inputPortPositions.Clear();\r\n this.#outputPortPositions.Clear();\r\n this.#widgetPositions.Clear();\r\n const scaledPadding = this.#padding * camera.zoom;\r\n const scaledElementSpacing = this.#elementSpacing * camera.zoom;\r\n\r\n const nodeBounds = this.calculateBounds(ctx, camera);\r\n\r\n // Background\r\n const nodeStyle = this.#calculateStyle(state);\r\n nodeStyle.Draw(ctx, nodeBounds, camera.zoom);\r\n\r\n // Title\r\n const borderSize = nodeStyle.borderSize();\r\n ctx.textAlign = TextAlign.Center;\r\n ctx.textBaseline = TextBaseline.Middle;\r\n\r\n const titleSize = VectorPool.get();\r\n this.#title.size(ctx, camera.zoom, titleSize);\r\n\r\n const subtitleSize = VectorPool.get();\r\n this.#subTitle.size(ctx, camera.zoom, subtitleSize);\r\n\r\n const titleBoxSize = VectorPool.get();\r\n titleBoxSize.x = nodeBounds.Size.x;\r\n titleBoxSize.y = titleSize.y + (scaledPadding * 2);\r\n\r\n ctx.fillStyle = this.#titleColor;\r\n ctx.beginPath();\r\n const titleX = nodeBounds.Position.x + (borderSize * camera.zoom * 0.5)\r\n const titleY = nodeBounds.Position.y + (borderSize * camera.zoom * 0.5)\r\n const titleWidth = titleBoxSize.x - (borderSize * camera.zoom);\r\n const titleHeight = titleBoxSize.y - (borderSize * camera.zoom * 0.5);\r\n ctx.roundRect(\r\n titleX, titleY, titleWidth, titleHeight,\r\n [nodeStyle.radius() * camera.zoom, nodeStyle.radius() * camera.zoom, 0, 0]\r\n );\r\n ctx.fill();\r\n // ctx.stroke();\r\n\r\n const titlePosition = VectorPool.get();\r\n titlePosition.x = nodeBounds.Position.x + (nodeBounds.Size.x / 2)\r\n titlePosition.y = nodeBounds.Position.y + scaledPadding + (titleSize.y / 2)\r\n\r\n if (this.#subTitle.get() !== \"\") {\r\n const subtitlePosition = VectorPool.get();\r\n CopyVector2(subtitlePosition, titlePosition);\r\n\r\n // TODO: I'm fudging a bunch of numbers ot make it fit nicely \r\n // together. \r\n // \r\n // Need to come up with like, proper logic about how we ensure \r\n // title and subtitle fit together\r\n subtitlePosition.y -= titleSize.y / 1.5;\r\n titlePosition.y += scaledPadding / 2\r\n\r\n this.#subTitle.render(ctx, camera.zoom, subtitlePosition);\r\n }\r\n\r\n this.#title.render(ctx, camera.zoom, titlePosition);\r\n\r\n // Info symbol\r\n if (this.#infoText !== \"\") {\r\n const infoRadius = titleHeight * .25;\r\n const centerX = titleX + titleWidth - (titleHeight * .25) - infoRadius;\r\n const centerY = titleY + (titleHeight * .25) + infoRadius;\r\n\r\n const infoPosition = VectorPool.get();\r\n infoPosition.x = centerX;\r\n infoPosition.y = centerY + (titleHeight * .025);\r\n\r\n let infoLineThickness = 1.5 * camera.zoom;\r\n\r\n if (mousePosition && Distance(infoPosition, mousePosition) <= infoRadius) {\r\n infoLineThickness *= 1.5;\r\n\r\n // This is a slightly expensive function if we're not \r\n // caching, but it only executes while we're mousing over \r\n // the info symbol, so I'm not particularly obligated to\r\n // optimize it. \r\n //\r\n // If you're just bored, def cache the split string method,\r\n // and figure out a system to recalculate as a node has its\r\n // title, port, or widgets change.\r\n //\r\n // Should probably break out the lambda into a proper \r\n // function as well. I think as it is, we're creating a new\r\n // lambda function per frame?\r\n postProcess.queue(() => {\r\n this.#infoSymbol.style().setupStyle(ctx, camera.zoom);\r\n ctx.textAlign = TextAlign.Center;\r\n\r\n const infoBoxWidth = titleWidth * 1.5;\r\n const textEntries = splitStringIntoLines(ctx, this.#infoText, infoBoxWidth);\r\n\r\n const lineHeight = (this.#infoSymbol.style().getSize() + 2);\r\n const infoBoxHeight = lineHeight * textEntries.length * camera.zoom;\r\n const scaledLineHeight = lineHeight * camera.zoom;\r\n const start = titleY - infoBoxHeight - (scaledLineHeight / 2);\r\n\r\n // Draw box\r\n ctx.fillStyle = this.#titleColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n centerX - (infoBoxWidth / 2) - (scaledLineHeight / 2),\r\n start - scaledLineHeight,\r\n infoBoxWidth + scaledLineHeight,\r\n infoBoxHeight + scaledLineHeight,\r\n nodeStyle.radius() * camera.zoom\r\n );\r\n ctx.fill();\r\n\r\n // Render Text\r\n this.#infoSymbol.style().setupStyle(ctx, camera.zoom);\r\n for (let i = 0; i < textEntries.length; i++) {\r\n const entry = textEntries[i];\r\n ctx.fillText(entry, centerX, start + (i * lineHeight * camera.zoom));\r\n }\r\n });\r\n }\r\n\r\n ctx.beginPath();\r\n ctx.arc(centerX, centerY, infoRadius, 0, 2 * Math.PI, false);\r\n ctx.lineWidth = infoLineThickness;\r\n ctx.strokeStyle = this.#infoSymbol.getColor();\r\n ctx.stroke();\r\n\r\n ctx.textAlign = TextAlign.Center;\r\n this.#infoSymbol.render(ctx, camera.zoom, infoPosition);\r\n }\r\n\r\n\r\n // Input Ports\r\n let startY = nodeBounds.Position.y + (scaledPadding * 2) + titleSize.y + scaledElementSpacing;\r\n const leftSide = nodeBounds.Position.x + scaledPadding;\r\n for (let i = 0; i < this.#input.length; i++) {\r\n ctx.textAlign = TextAlign.Left;\r\n const port = this.#input[i];\r\n this.#portTextStyle.measure(ctx, camera.zoom, port.getDisplayName(), tempMeasurement);\r\n const position = VectorPool.get();\r\n\r\n position.x = nodeBounds.Position.x;\r\n position.y = startY + (tempMeasurement.y / 2);\r\n\r\n // Text\r\n this.#portTextStyle.setupStyle(ctx, camera.zoom);\r\n ctx.fillText(port.getDisplayName(), leftSide, position.y);\r\n\r\n // Port\r\n this.#inputPortPositions.Push(port.render(ctx, position, camera, mousePosition, postProcess));\r\n\r\n startY += tempMeasurement.y + scaledElementSpacing;\r\n }\r\n\r\n // Output Ports\r\n const rightSide = nodeBounds.Position.x + nodeBounds.Size.x;\r\n ctx.textAlign = TextAlign.Right;\r\n for (let i = 0; i < this.#output.length; i++) {\r\n const port = this.#output[i];\r\n this.#portTextStyle.measure(ctx, camera.zoom, port.getDisplayName(), tempMeasurement);\r\n const position = VectorPool.get();\r\n position.x = rightSide;\r\n position.y = startY + (tempMeasurement.y / 2);\r\n\r\n // Text\r\n this.#portTextStyle.setupStyle(ctx, camera.zoom);\r\n ctx.fillText(port.getDisplayName(), rightSide - scaledPadding, position.y);\r\n\r\n // Port\r\n this.#outputPortPositions.Push(port.render(ctx, position, camera, mousePosition, postProcess));\r\n\r\n startY += tempMeasurement.y + scaledElementSpacing;\r\n }\r\n\r\n // Widgets\r\n for (let i = 0; i < this.#widgets.length; i++) {\r\n const widget = this.#widgets[i];\r\n const widgetSize = widget.Size();\r\n const scaledWidgetWidth = widgetSize.x * camera.zoom;\r\n\r\n const position = VectorPool.get();\r\n position.x = nodeBounds.Position.x + ((nodeBounds.Size.x - scaledWidgetWidth) / 2);\r\n position.y = startY;\r\n\r\n this.#widgetPositions.Push(widget.Draw(ctx, position, camera.zoom, mousePosition));\r\n startY += (widgetSize.y * camera.zoom) + scaledElementSpacing;\r\n }\r\n\r\n // Messages\r\n const messageStart = VectorPool.get();\r\n messageStart.x = nodeBounds.Position.x + (nodeBounds.Size.x / 2);\r\n messageStart.y = nodeBounds.Position.y + nodeBounds.Size.y + (15 * camera.zoom);\r\n for (let i = 0; i < this.#messages.length; i++) {\r\n const message = this.#messages[i];\r\n messageStart.y += message.render(ctx, camera.zoom, messageStart) + (10 * camera.zoom);\r\n }\r\n })\r\n }\r\n}\r\n","export enum MarkdownTokenType {\r\n Text = \"Text\",\r\n H1 = \"H1\",\r\n H2 = \"H2\",\r\n H3 = \"H3\",\r\n NewLine = \"New Line\",\r\n Star = \"Star\",\r\n Space = \"Space\",\r\n BackTick = \"`\"\r\n}\r\n\r\nexport class MarkdownToken {\r\n\r\n #type: MarkdownTokenType;\r\n\r\n #lexeme: string\r\n\r\n #tokenStart: number\r\n\r\n #tokenEnd: number\r\n\r\n constructor(type: MarkdownTokenType, lexeme: string, tokenStart: number, tokenEnd: number) {\r\n this.#type = type;\r\n this.#lexeme = lexeme;\r\n this.#tokenStart = tokenStart;\r\n this.#tokenEnd = tokenEnd;\r\n }\r\n\r\n type(): MarkdownTokenType {\r\n return this.#type;\r\n }\r\n\r\n lexeme(): string {\r\n return this.#lexeme;\r\n }\r\n\r\n tokenStart(): number {\r\n return this.#tokenStart;\r\n }\r\n tokenEnd(): number {\r\n return this.#tokenEnd;\r\n }\r\n}\r\n","import { MarkdownToken, MarkdownTokenType } from \"./token\";\r\n\r\nexport class MarkdownLexicalParser {\r\n\r\n #body: string;\r\n\r\n #index: number\r\n\r\n #tokens: Array<MarkdownToken>;\r\n\r\n constructor(body: string) {\r\n this.#index = 0;\r\n this.#body = body;\r\n this.#tokens = new Array<MarkdownToken>();\r\n }\r\n\r\n tokens(): Array<MarkdownToken> {\r\n return this.#tokens;\r\n }\r\n\r\n #current(): string {\r\n if (this.#index > this.#body.length - 1) {\r\n return \"\"\r\n }\r\n return this.#body.charAt(this.#index);\r\n }\r\n\r\n #inc(): void {\r\n this.#index++\r\n }\r\n\r\n #next(): string {\r\n this.#index++\r\n if (this.#index > this.#body.length - 1) {\r\n return \"\"\r\n }\r\n return this.#body.charAt(this.#index);\r\n }\r\n\r\n #lastToken = 0;\r\n \r\n #addToken(token: MarkdownTokenType, lexeme: string): void {\r\n this.#tokens.push(new MarkdownToken(token, lexeme, this.#lastToken, this.#index));\r\n this.#lastToken = this.#index;\r\n }\r\n\r\n #h2(): void {\r\n let char = this.#next();\r\n if (char === \"#\") {\r\n this.#addToken(MarkdownTokenType.H3, \"###\");\r\n\r\n // Move it off the character for the next reading\r\n this.#inc();\r\n } else {\r\n this.#addToken(MarkdownTokenType.H2, \"##\");\r\n }\r\n }\r\n\r\n #h1(): void {\r\n let char = this.#next();\r\n if (char === \"#\") {\r\n this.#h2();\r\n } else {\r\n this.#addToken(MarkdownTokenType.H1, \"#\");\r\n }\r\n }\r\n\r\n #whiteSpace(): void {\r\n let char = this.#current();\r\n\r\n while (char !== \"\") {\r\n if (char !== \" \" && char !== \"\\t\") {\r\n break;\r\n }\r\n char = this.#next();\r\n }\r\n\r\n this.#addToken(MarkdownTokenType.Space, \" \")\r\n }\r\n\r\n #text(): void {\r\n let char = this.#current();\r\n\r\n let started = -1;\r\n\r\n while (char !== \"\") {\r\n if (char === \" \" || char === \"\\t\") {\r\n\r\n // Eat white space if we haven't seen anything yet!\r\n if (started === -1) {\r\n this.#inc();\r\n continue;\r\n }\r\n }\r\n\r\n // End of the line!\r\n if (char === \"\\n\" || char === \"*\" || char === \"`\") {\r\n if (started != -1) {\r\n this.#addToken(MarkdownTokenType.Text, this.#body.substring(started, this.#index))\r\n }\r\n return;\r\n }\r\n\r\n\r\n if (started === -1) {\r\n started = this.#index;\r\n }\r\n\r\n char = this.#next();\r\n }\r\n\r\n if (started != -1) {\r\n this.#addToken(MarkdownTokenType.Text, this.#body.substring(started, this.#index))\r\n }\r\n }\r\n\r\n // S( ) => S\r\n // S(\\t) => S\r\n // S(#) => H1\r\n // H1(#) => H2\r\n // H1(!#) => S\r\n // H2(#) => H3\r\n // H2(#) => H3\r\n parse(): void {\r\n let char = this.#current();\r\n\r\n while (char !== \"\") {\r\n if (char === \" \" || char === \"\\t\") {\r\n this.#whiteSpace();\r\n } else if (char === \"#\") {\r\n this.#h1();\r\n } else if (char === \"\\n\") {\r\n this.#addToken(MarkdownTokenType.NewLine, \"\\n\");\r\n this.#inc();\r\n } else if (char === \"*\") {\r\n this.#addToken(MarkdownTokenType.Star, \"*\");\r\n this.#inc();\r\n } else if (char === \"`\") {\r\n this.#addToken(MarkdownTokenType.BackTick, \"`\");\r\n this.#inc();\r\n } else {\r\n this.#text();\r\n }\r\n\r\n char = this.#current();\r\n }\r\n }\r\n}\r\n","import { Theme } from \"../theme\";\r\nimport { List } from \"../types/list\";\r\nimport { Text } from \"../types/text\";\r\nimport { CopyVector2, Vector2, Zero } from \"../types/vector2\";\r\n\r\nexport interface MarkdownEntry {\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, maxWidth: number): number\r\n}\r\n\r\nexport class CodeBlockEntry {\r\n\r\n #text: Text\r\n\r\n #calculatedPositions: List<Vector2>\r\n\r\n #calculatedEntries: List<Text>\r\n\r\n #calculatedForWidth: number;\r\n\r\n constructor(text: Text) {\r\n this.#text = text;\r\n this.#calculatedForWidth = -1\r\n\r\n this.#calculatedEntries = new List<Text>();\r\n this.#calculatedPositions = new List<Vector2>();\r\n\r\n document.fonts.addEventListener(\"loadingdone\", (event) => {\r\n this.#calculatedForWidth = -1\r\n });\r\n }\r\n\r\n #calculateLayout(ctx: CanvasRenderingContext2D, maxWidth: number): void {\r\n if (this.#calculatedForWidth === maxWidth) {\r\n return;\r\n }\r\n\r\n let adjustedWith = maxWidth;\r\n adjustedWith -= Theme.Note.CodeBlock.Padding * 2;\r\n\r\n this.#calculatedEntries.Clear();\r\n this.#calculatedPositions.Clear();\r\n\r\n let curHeight = 0;\r\n const lineInc = this.#text.style().getSize() + Theme.Note.LineSpacing;\r\n\r\n let entries = this.#text.split(\"\\n\")\r\n\r\n for (let entryIndex = 0; entryIndex < entries.length; entryIndex++) {\r\n const entry = entries[entryIndex];\r\n\r\n let lines = entry.breakIntoLines(ctx, adjustedWith);\r\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\r\n\r\n this.#calculatedEntries.Push(lines[lineIndex])\r\n this.#calculatedPositions.Push({\r\n x: 0,\r\n y: curHeight,\r\n })\r\n \r\n curHeight += lineInc;\r\n }\r\n }\r\n\r\n this.#calculatedForWidth = maxWidth;\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, maxWidth: number): number {\r\n this.#calculateLayout(ctx, maxWidth);\r\n\r\n let padding = Theme.Note.CodeBlock.Padding * scale;\r\n\r\n let max = 0;\r\n for (let i = 0; i < this.#calculatedEntries.Count(); i++) {\r\n const pos = this.#calculatedPositions.At(i);\r\n max = Math.max(max, pos.y * scale)\r\n }\r\n\r\n const y = position.y + max + (scale * 5)\r\n ctx.fillStyle = Theme.Note.CodeBlock.BackgroundColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x,\r\n position.y,\r\n maxWidth * scale,\r\n max + (padding * 2),\r\n Theme.Note.CodeBlock.BorderRadius * scale\r\n );\r\n ctx.fill();\r\n\r\n\r\n for (let i = 0; i < this.#calculatedEntries.Count(); i++) {\r\n const entry = this.#calculatedEntries.At(i);\r\n const pos = this.#calculatedPositions.At(i);\r\n\r\n entry.render(ctx, scale, {\r\n x: (pos.x * scale) + position.x + padding,\r\n y: (pos.y * scale) + position.y + padding\r\n });\r\n\r\n max = Math.max(max, pos.y * scale)\r\n }\r\n\r\n\r\n return max + (padding * 2);\r\n }\r\n}\r\n\r\nexport class UnorderedListMarkdownEntry {\r\n\r\n #entries: Array<BasicMarkdownEntry>;\r\n\r\n constructor(entries: Array<BasicMarkdownEntry>) {\r\n this.#entries = entries;\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, maxWidth: number): number {\r\n let offset = 0;\r\n let shift = 20;\r\n\r\n let pos = {\r\n x: position.x + (shift * scale),\r\n y: position.y\r\n }\r\n\r\n let dot = Theme.Note.DotSize * scale;\r\n\r\n for (let i = 0; i < this.#entries.length; i++) {\r\n\r\n ctx.beginPath();\r\n ctx.arc(position.x + dot, pos.y + (dot * 3), dot, 0, 2 * Math.PI);\r\n ctx.fill();\r\n\r\n offset += this.#entries[i].render(ctx, pos, scale, maxWidth - shift) + (scale * Theme.Note.LineSpacing * 2);\r\n pos.y = position.y + offset;\r\n }\r\n\r\n return offset;\r\n }\r\n}\r\n\r\nexport class BasicMarkdownEntry {\r\n\r\n #underline: boolean;\r\n\r\n #background: boolean;\r\n\r\n #entries: Array<Text>\r\n\r\n #calculatedPositions: List<Vector2>\r\n\r\n #calculatedEntries: List<Text>\r\n\r\n #calculatedForWidth: number;\r\n\r\n constructor(lines: Array<Text>, underline: boolean, background: boolean) {\r\n this.#entries = lines;\r\n this.#underline = underline;\r\n this.#background = background;\r\n this.#calculatedForWidth = -1\r\n\r\n this.#calculatedEntries = new List<Text>();\r\n this.#calculatedPositions = new List<Vector2>();\r\n\r\n document.fonts.addEventListener(\"loadingdone\", (event) => {\r\n this.#calculatedForWidth = -1\r\n });\r\n }\r\n\r\n #calculateLayout(ctx: CanvasRenderingContext2D, maxWidth: number): void {\r\n if (this.#calculatedForWidth === maxWidth) {\r\n return;\r\n }\r\n\r\n let adjustedWith = maxWidth;\r\n if (this.#background) {\r\n adjustedWith -= Theme.Note.CodeBlock.Padding * 2;\r\n }\r\n\r\n this.#calculatedEntries.Clear();\r\n this.#calculatedPositions.Clear();\r\n\r\n const curPosition: Vector2 = Zero();\r\n const texSize: Vector2 = Zero();\r\n\r\n let currentLineHeight = 0;\r\n const currentLineText = new List<Text>();\r\n const currentLineWidths = new List<number>();\r\n\r\n for (let entryIndex = 0; entryIndex < this.#entries.length; entryIndex++) {\r\n const entry = this.#entries[entryIndex];\r\n\r\n let lines = entry.splitAtWidth(ctx, adjustedWith - curPosition.x);\r\n let i = 0;\r\n while (lines.length > 1 && i < 100) {\r\n i++\r\n\r\n // We can't collapse this thing any further. Break out of the \r\n // while loop before we have infinite loop on our hands\r\n // if (lines[0].get() === \"\" && lines[1].get().length === 1) {\r\n // lines[0] = lines[1];\r\n // break;\r\n // }\r\n\r\n // We can't collapse this thing any further. Break out of the \r\n // while loop before we have infinite loop on our hands\r\n if (lines[0].get() === \"\" && currentLineText.Count() === 0) {\r\n\r\n if (lines[1].get().length === 1) {\r\n lines[0] = lines[1];\r\n break;\r\n } else {\r\n lines = lines[1].splitAtIndex(1);\r\n }\r\n\r\n }\r\n\r\n // This effectiviely finishes off the line we're currenly working on.\r\n if (lines[0].get() !== \"\") {\r\n lines[0].size(ctx, 1, texSize);\r\n currentLineHeight = Math.max(currentLineHeight, texSize.y);\r\n\r\n currentLineText.Push(lines[0]);\r\n currentLineWidths.Push(curPosition.x);\r\n }\r\n\r\n curPosition.y += currentLineHeight;\r\n\r\n // Take everything we're working with and finalize it\r\n for (let i = 0; i < currentLineText.Count(); i++) {\r\n this.#calculatedEntries.Push(currentLineText.At(i));\r\n this.#calculatedPositions.Push({ x: currentLineWidths.At(i), y: curPosition.y })\r\n }\r\n\r\n currentLineText.Clear();\r\n currentLineWidths.Clear();\r\n\r\n curPosition.y += Theme.Note.LineSpacing;\r\n currentLineHeight = 0;\r\n curPosition.x = 0;\r\n\r\n lines = lines[1].splitAtWidth(ctx, adjustedWith);\r\n }\r\n if (i === 100) {\r\n console.log(lines)\r\n }\r\n\r\n lines[0].size(ctx, 1, texSize);\r\n currentLineHeight = Math.max(currentLineHeight, texSize.y)\r\n\r\n currentLineText.Push(lines[0]);\r\n currentLineWidths.Push(curPosition.x);\r\n\r\n curPosition.x += texSize.x;\r\n }\r\n\r\n curPosition.y += currentLineHeight;\r\n\r\n // Take everything we're working with and finalize it\r\n for (let i = 0; i < currentLineText.Count(); i++) {\r\n this.#calculatedEntries.Push(currentLineText.At(i));\r\n this.#calculatedPositions.Push({ x: currentLineWidths.At(i), y: curPosition.y })\r\n }\r\n\r\n this.#calculatedForWidth = maxWidth;\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, maxWidth: number): number {\r\n this.#calculateLayout(ctx, maxWidth);\r\n\r\n let padding = 0;\r\n if (this.#background) {\r\n padding += Theme.Note.CodeBlock.Padding * scale;\r\n }\r\n\r\n\r\n if (this.#background) {\r\n let max = 0;\r\n for (let i = 0; i < this.#calculatedEntries.Count(); i++) {\r\n const pos = this.#calculatedPositions.At(i);\r\n max = Math.max(max, pos.y * scale)\r\n }\r\n\r\n const y = position.y + max + (scale * 5)\r\n ctx.fillStyle = Theme.Note.CodeBlock.BackgroundColor;\r\n ctx.beginPath();\r\n ctx.roundRect(\r\n position.x,\r\n position.y,\r\n maxWidth * scale,\r\n max + (padding * 2),\r\n Theme.Note.CodeBlock.BorderRadius * scale\r\n );\r\n ctx.fill();\r\n }\r\n\r\n\r\n let max = 0;\r\n for (let i = 0; i < this.#calculatedEntries.Count(); i++) {\r\n const entry = this.#calculatedEntries.At(i);\r\n const pos = this.#calculatedPositions.At(i);\r\n\r\n entry.render(ctx, scale, {\r\n x: (pos.x * scale) + position.x + padding,\r\n y: (pos.y * scale) + position.y + padding\r\n });\r\n\r\n max = Math.max(max, pos.y * scale)\r\n }\r\n\r\n // Add underline \r\n if (this.#underline) {\r\n const y = position.y + max + (scale * 5)\r\n ctx.strokeStyle = Theme.Note.FontColor;\r\n ctx.lineWidth = Theme.Note.HeaderLineWidth * scale;\r\n ctx.beginPath();\r\n ctx.moveTo(position.x, y);\r\n ctx.lineTo(position.x + (maxWidth * scale), y);\r\n ctx.stroke();\r\n }\r\n\r\n return max + (padding * 2);\r\n }\r\n}\r\n","import { FontStyle, FontWeight, TextStyleConfig } from \"../styles/text\";\r\nimport { Theme } from \"../theme\";\r\nimport { Text } from \"../types/text\";\r\nimport { BasicMarkdownEntry, CodeBlockEntry, MarkdownEntry, UnorderedListMarkdownEntry } from \"./entry\";\r\nimport { MarkdownToken, MarkdownTokenType } from \"./token\";\r\n\r\nexport class MarkdownSyntaxParser {\r\n\r\n #tokens: Array<MarkdownToken>;\r\n\r\n #index: number;\r\n\r\n #originalText: string;\r\n\r\n constructor(originalText: string, tokens: Array<MarkdownToken>) {\r\n this.#originalText = originalText;\r\n this.#index = 0;\r\n this.#tokens = tokens;\r\n }\r\n\r\n #current(): MarkdownToken | null {\r\n if (this.#index > this.#tokens.length - 1) {\r\n return null\r\n }\r\n return this.#tokens[this.#index];\r\n }\r\n\r\n #inc(): void {\r\n this.#index++\r\n }\r\n\r\n #next(): MarkdownToken | null {\r\n this.#index++\r\n if (this.#index >= this.#tokens.length - 1) {\r\n return null\r\n }\r\n return this.#tokens[this.#index];\r\n }\r\n\r\n #peak(): MarkdownToken | null {\r\n if (this.#index + 1 >= this.#tokens.length - 1) {\r\n return null\r\n }\r\n return this.#tokens[this.#index + 1];\r\n }\r\n\r\n #peakInto(amount: number): MarkdownToken | null {\r\n if (this.#index + amount >= this.#tokens.length - 1) {\r\n return null\r\n }\r\n return this.#tokens[this.#index + amount];\r\n }\r\n\r\n #emphasis(): Array<Text> {\r\n\r\n // Cases to consider\r\n // =================\r\n // 1. *a*: <i>a</i>\r\n // 2. **a**: <b>a</b>\r\n // 3. **a*: *<i>a</i> <----- fuck this one\r\n // 4. ***a**: *<b>a</b> <----- fuck this one\r\n // 5. *a**: <i>a</i>*\r\n // 6. **a***: <b>a</b>*\r\n // 7. * a *: * a *\r\n // 8. ** a **: ** a **\r\n // 9. **a **: **a **\r\n // 10. **a f**: <b>a f<b>\r\n // 11. * Test: <ul>Test</ul> \r\n\r\n let token = this.#next();\r\n if (token?.type() === MarkdownTokenType.Space) {\r\n return [new Text(\"*\")];\r\n }\r\n\r\n let bold = false;\r\n // Read off all leading stars\r\n while (token !== null && token.type() === MarkdownTokenType.Star) {\r\n bold = true;\r\n token = this.#next();\r\n }\r\n\r\n let textContent = \"\";\r\n\r\n let boldClosed = false;\r\n let startingClose = false;\r\n let validClose = false;\r\n while (token !== null && token.type() !== MarkdownTokenType.NewLine) {\r\n if (token.type() === MarkdownTokenType.Star) {\r\n\r\n // This is the second star we've seen in a row. We're done!\r\n if (startingClose) {\r\n boldClosed = true;\r\n break;\r\n }\r\n\r\n // If we're not bold, we just need a single star to close this off.\r\n startingClose = true;\r\n if (bold === false) {\r\n break;\r\n }\r\n }\r\n\r\n if (startingClose && token.type() !== MarkdownTokenType.Star) {\r\n break;\r\n }\r\n\r\n // Add to string content...\r\n if (token.type() === MarkdownTokenType.Text) {\r\n textContent += token.lexeme();\r\n validClose = true;\r\n }\r\n\r\n if (token.type() === MarkdownTokenType.Space) {\r\n textContent += token.lexeme();\r\n validClose = false;\r\n }\r\n\r\n token = this.#next();\r\n }\r\n\r\n const style: TextStyleConfig = {}\r\n\r\n if (validClose && startingClose) {\r\n if (boldClosed) {\r\n style.weight = FontWeight.Bold;\r\n } else {\r\n style.style = FontStyle.Italic;\r\n }\r\n }\r\n\r\n return [new Text(textContent, style)]\r\n }\r\n\r\n #text(): Array<Text> {\r\n let contents: Array<Text> = new Array<Text>();\r\n let textContent = \"\";\r\n\r\n let token = this.#current();\r\n\r\n // Read off all starting whitespace \r\n while (token !== null && token.type() === MarkdownTokenType.Space) {\r\n token = this.#next();\r\n }\r\n\r\n while (token !== null && token.type() !== MarkdownTokenType.NewLine) {\r\n switch (token.type()) {\r\n case MarkdownTokenType.Text:\r\n case MarkdownTokenType.H1:\r\n case MarkdownTokenType.H2:\r\n case MarkdownTokenType.H3:\r\n case MarkdownTokenType.Space:\r\n textContent += token.lexeme();\r\n break;\r\n\r\n case MarkdownTokenType.Star:\r\n if (textContent !== \"\") {\r\n contents.push(new Text(textContent))\r\n textContent = \"\";\r\n }\r\n let starText = this.#emphasis()\r\n for (let i = 0; i < starText.length; i++) {\r\n contents.push(starText[i]);\r\n }\r\n break;\r\n }\r\n\r\n token = this.#next();\r\n }\r\n\r\n if (textContent !== \"\") {\r\n contents.push(new Text(textContent))\r\n }\r\n\r\n return contents;\r\n }\r\n\r\n #h1(): BasicMarkdownEntry {\r\n // Move off of the header token\r\n this.#inc();\r\n\r\n const text = this.#text();\r\n for (let i = 0; i < text.length; i++) {\r\n text[i].setColor(Theme.Note.FontColor);\r\n text[i].setSize(Theme.Note.H1.FontSize);\r\n text[i].setWeight(FontWeight.Bold);\r\n }\r\n\r\n return new BasicMarkdownEntry(text, true, false);\r\n }\r\n\r\n #h2(): BasicMarkdownEntry {\r\n // Move off of the header token\r\n this.#inc();\r\n\r\n const text = this.#text();\r\n for (let i = 0; i < text.length; i++) {\r\n text[i].setColor(Theme.Note.FontColor);\r\n text[i].setSize(Theme.Note.H2.FontSize);\r\n text[i].setWeight(FontWeight.Bold);\r\n }\r\n\r\n return new BasicMarkdownEntry(text, true, false);\r\n }\r\n\r\n #h3(): BasicMarkdownEntry {\r\n // Move off of the header token\r\n this.#inc();\r\n\r\n const text = this.#text();\r\n for (let i = 0; i < text.length; i++) {\r\n text[i].setColor(Theme.Note.FontColor);\r\n text[i].setSize(Theme.Note.H3.FontSize);\r\n text[i].setWeight(FontWeight.Bold);\r\n }\r\n\r\n return new BasicMarkdownEntry(text, false, false);\r\n }\r\n\r\n #starLineStart(): MarkdownEntry {\r\n if (this.#peak()?.type() !== MarkdownTokenType.Space) {\r\n const starEntries = this.#text();\r\n this.#assignStandardStyling(starEntries);\r\n return new BasicMarkdownEntry(starEntries, false, false);\r\n }\r\n\r\n // We've begun with a space, which means unordered list!\r\n\r\n const entries = new Array<BasicMarkdownEntry>();\r\n\r\n while (this.#current()?.type() === MarkdownTokenType.Star && this.#peak()?.type() === MarkdownTokenType.Space) {\r\n this.#inc();\r\n const starEntries = this.#text();\r\n this.#assignStandardStyling(starEntries);\r\n entries.push(new BasicMarkdownEntry(starEntries, false, false));\r\n\r\n // Text reads to the end of the line, which means we're at the new\r\n // line character. Move forward 1. \r\n this.#inc();\r\n }\r\n\r\n return new UnorderedListMarkdownEntry(entries);\r\n\r\n }\r\n\r\n #assignStandardStyling(textEntries: Array<Text>): void {\r\n for (let i = 0; i < textEntries.length; i++) {\r\n textEntries[i].setColor(Theme.Note.FontColor);\r\n textEntries[i].setSize(Theme.Note.FontSize);\r\n }\r\n }\r\n\r\n #backtickLineStart(): MarkdownEntry {\r\n\r\n // If we're not a ```, just treat as regular text\r\n if (this.#peak()?.type() !== MarkdownTokenType.BackTick || this.#peakInto(2)?.type() !== MarkdownTokenType.BackTick) {\r\n const starEntries = this.#text();\r\n this.#assignStandardStyling(starEntries);\r\n return new BasicMarkdownEntry(starEntries, false, false);\r\n }\r\n this.#inc();\r\n this.#inc();\r\n\r\n let token = this.#next();\r\n\r\n // Eat the first new line character\r\n if (token?.type() === MarkdownTokenType.NewLine) {\r\n token = this.#next();\r\n }\r\n\r\n let start = token?.tokenStart();\r\n let end = start;\r\n\r\n // Read until we hit another ``` \r\n while (token !== null) {\r\n\r\n if (\r\n token.type() === MarkdownTokenType.BackTick &&\r\n this.#peak()?.type() === MarkdownTokenType.BackTick &&\r\n this.#peakInto(2)?.type() === MarkdownTokenType.BackTick\r\n ) {\r\n end = token.tokenEnd() - 1;\r\n break;\r\n }\r\n\r\n token = this.#next();\r\n }\r\n\r\n this.#inc(); // puts us on the 2nd\r\n this.#inc(); // puts us on the 3rd\r\n this.#inc(); // puts us on the next token\r\n\r\n const codeBlockText = this.#originalText.substring(start as number, end);\r\n const entryText = new Text(codeBlockText);\r\n this.#assignStandardStyling([entryText])\r\n return new CodeBlockEntry(entryText)\r\n }\r\n\r\n parse(): Array<MarkdownEntry> {\r\n let token = this.#current();\r\n\r\n const entries = new Array<MarkdownEntry>();\r\n\r\n while (token !== null) {\r\n switch (token.type()) {\r\n case MarkdownTokenType.H1:\r\n entries.push(this.#h1());\r\n break;\r\n\r\n case MarkdownTokenType.H2:\r\n entries.push(this.#h2());\r\n break;\r\n\r\n case MarkdownTokenType.H3:\r\n entries.push(this.#h3());\r\n break;\r\n\r\n case MarkdownTokenType.Text:\r\n const textEntries = this.#text();\r\n this.#assignStandardStyling(textEntries);\r\n entries.push(new BasicMarkdownEntry(textEntries, false, false));\r\n break;\r\n\r\n case MarkdownTokenType.Star:\r\n entries.push(this.#starLineStart());\r\n break;\r\n\r\n case MarkdownTokenType.NewLine:\r\n this.#inc();\r\n break;\r\n\r\n case MarkdownTokenType.BackTick:\r\n entries.push(this.#backtickLineStart());\r\n break;\r\n\r\n default:\r\n this.#inc();\r\n }\r\n\r\n token = this.#current();\r\n }\r\n\r\n return entries;\r\n }\r\n}\r\n","import { MarkdownEntry } from \"./entry\";\r\nimport { MarkdownLexicalParser } from \"./lexicalParser\";\r\nimport { MarkdownSyntaxParser } from \"./syntaxParser\";\r\n\r\nexport function BuildMarkdown(data: string): Array<MarkdownEntry> {\r\n const lexicalParser = new MarkdownLexicalParser(data);\r\n lexicalParser.parse();\r\n // console.log(lexicalParser.tokens());\r\n\r\n const syntaxParser = new MarkdownSyntaxParser(data, lexicalParser.tokens());\r\n const contents = syntaxParser.parse()\r\n // console.log(contents);\r\n return contents;\r\n}","import { BuildMarkdown } from \"../markdown/markdown\";\r\nimport { MarkdownEntry } from \"../markdown/entry\";\r\nimport { Popup } from \"../popup\";\r\nimport { BoxStyle } from \"../styles/box\";\r\nimport { TextAlign } from \"../styles/canvasTextAlign\";\r\nimport { TextBaseline } from \"../styles/canvasTextBaseline\";\r\nimport { TextStyleConfig } from \"../styles/text\";\r\nimport { Theme } from \"../theme\";\r\nimport { Box } from \"../types/box\";\r\nimport { CopyVector2, Vector2, Zero } from \"../types/vector2\";\r\nimport { Camera } from \"../camera\";\r\nimport { Metadata } from \"../metadata\";\r\n\r\nexport type NoteContentChangeCallback = (node: FlowNote, newContents: string) => void\r\nexport type NoteWidthChangeCallback = (node: FlowNote, newWidth: number) => void\r\n\r\nexport interface FlowNoteConfig {\r\n text?: string;\r\n style?: TextStyleConfig;\r\n metadata?: Metadata;\r\n position?: Vector2;\r\n width?: number;\r\n locked?: boolean;\r\n onWidthChange?: NoteWidthChangeCallback;\r\n onContentChange?: NoteContentChangeCallback;\r\n}\r\n\r\nexport enum DragHandle {\r\n None,\r\n Left,\r\n Right\r\n};\r\n\r\nconst BOUNDS_SPACING = 20;\r\nconst BOX_SIZE = 10;\r\n\r\nexport class FlowNote {\r\n\r\n #originalText: string;\r\n\r\n #document: Array<MarkdownEntry>;\r\n\r\n #width: number;\r\n\r\n #edittingStyle: BoxStyle;\r\n\r\n // Runtime ================================================================\r\n\r\n #data: Metadata;\r\n\r\n #position: Vector2;\r\n\r\n #handleSelected: DragHandle;\r\n\r\n #edittingLayout: boolean;\r\n\r\n #lastRenderedBox: Box;\r\n\r\n #hovering: boolean;\r\n\r\n // Callbacks ==============================================================\r\n\r\n #widthChangeCallbacks: Array<NoteWidthChangeCallback>;\r\n\r\n #contentChangeCallbacks: Array<NoteContentChangeCallback>;\r\n\r\n // ========================================================================\r\n\r\n constructor(config?: FlowNoteConfig) {\r\n this.#widthChangeCallbacks = new Array<NoteWidthChangeCallback>();\r\n this.#contentChangeCallbacks = new Array<NoteContentChangeCallback>();\r\n this.#data = config?.metadata === undefined ? {} : config?.metadata;\r\n this.#document = [];\r\n this.#originalText = \"\";\r\n this.#hovering = false;\r\n this.#edittingLayout = config?.locked === undefined ? true : !config?.locked;\r\n this.#width = config?.width === undefined ? 500 : config.width;\r\n this.#position = config?.position === undefined ? { x: 0, y: 0 } : config.position;\r\n this.setText(config?.text === undefined ? \"\" : config?.text);\r\n this.#lastRenderedBox = { Position: { x: 0, y: 0 }, Size: { x: 0, y: 0 } };\r\n this.#handleSelected = DragHandle.None;\r\n\r\n this.#edittingStyle = new BoxStyle({\r\n border: {\r\n color: \"white\",\r\n size: 1\r\n },\r\n })\r\n\r\n if (config?.onWidthChange) {\r\n this.#widthChangeCallbacks.push(config.onWidthChange);\r\n }\r\n\r\n if (config?.onContentChange) {\r\n this.#contentChangeCallbacks.push(config.onContentChange);\r\n }\r\n }\r\n\r\n setText(text: string): void {\r\n this.#originalText = text;\r\n this.#document = BuildMarkdown(this.#originalText);\r\n for (let i = 0; i < this.#contentChangeCallbacks.length; i++) {\r\n this.#contentChangeCallbacks[i](this, text);\r\n }\r\n }\r\n\r\n public setMetadataProperty(name: string, value: any): void {\r\n this.#data[name] = value;\r\n }\r\n\r\n public getMetadataProperty(name: string): any {\r\n return this.#data[name];\r\n }\r\n\r\n text(): string {\r\n return this.#originalText;\r\n }\r\n\r\n width(): number {\r\n return this.#width;\r\n }\r\n\r\n position(): Vector2 {\r\n return this.#position;\r\n }\r\n\r\n translate(delta: Vector2): void {\r\n this.#position.x += delta.x;\r\n this.#position.y += delta.y;\r\n }\r\n\r\n setPosition(position: Vector2): void {\r\n CopyVector2(this.#position, position);\r\n }\r\n\r\n handleSelected(): DragHandle {\r\n return this.#handleSelected;\r\n }\r\n\r\n selectHandle(handle: DragHandle): void {\r\n this.#handleSelected = handle;\r\n }\r\n\r\n #tempPosition: Vector2 = Zero();\r\n\r\n public setWidth(newWidth: number): void {\r\n if (newWidth === undefined) {\r\n console.error(\"Attempted to set note's width to undefined\");\r\n }\r\n this.#width = newWidth;\r\n for (let i = 0; i < this.#widthChangeCallbacks.length; i++) {\r\n this.#widthChangeCallbacks[i](this, newWidth);\r\n }\r\n }\r\n\r\n public addWidthChangeListener(callback: NoteWidthChangeCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#widthChangeCallbacks.push(callback);\r\n }\r\n\r\n public addContentChangeListener(callback: NoteContentChangeCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#contentChangeCallbacks.push(callback);\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): void {\r\n if (this.#edittingLayout && (this.#hovering || this.#handleSelected !== DragHandle.None)) {\r\n\r\n if (mousePosition) {\r\n if (this.#handleSelected === DragHandle.Right) {\r\n\r\n const leftPosition = (this.#position.x * camera.zoom) + camera.position.x;\r\n this.setWidth(Math.max((mousePosition.x - leftPosition) / camera.zoom, 1));\r\n\r\n } else if (this.#handleSelected === DragHandle.Left) {\r\n\r\n const scaledWidth = this.#width * camera.zoom;\r\n const rightPosition = (this.#position.x * camera.zoom) + camera.position.x + scaledWidth;\r\n this.setWidth(Math.max((rightPosition - mousePosition.x) / camera.zoom, 1));\r\n this.#position.x = rightPosition - (this.#width * camera.zoom) - camera.position.x;\r\n this.#position.x /= camera.zoom;\r\n }\r\n }\r\n\r\n this.#edittingStyle.Outline(ctx, this.leftResizeHandleBox(), camera.zoom, 2);\r\n this.#edittingStyle.Outline(ctx, this.rightResizeHandleBox(), camera.zoom, 2);\r\n\r\n ctx.beginPath();\r\n const left = this.#lastRenderedBox.Position.x;\r\n const right = this.#lastRenderedBox.Position.x + this.#lastRenderedBox.Size.x;\r\n const bottom = this.#lastRenderedBox.Position.y;\r\n const top = this.#lastRenderedBox.Position.y + this.#lastRenderedBox.Size.y;\r\n ctx.moveTo(left, bottom + (this.#lastRenderedBox.Size.y / 2) - (BOX_SIZE));\r\n ctx.lineTo(left, bottom);\r\n ctx.lineTo(right, bottom);\r\n ctx.lineTo(right, bottom + (this.#lastRenderedBox.Size.y / 2) - (BOX_SIZE));\r\n\r\n ctx.moveTo(left, top - (this.#lastRenderedBox.Size.y / 2) + (BOX_SIZE));\r\n ctx.lineTo(left, top);\r\n ctx.lineTo(right, top);\r\n ctx.lineTo(right, top - (this.#lastRenderedBox.Size.y / 2) + (BOX_SIZE));\r\n ctx.stroke();\r\n // this.#edittingStyle.Outline(ctx, bigBox, camera.zoom, 2);\r\n }\r\n\r\n camera.graphSpaceToScreenSpace(this.#position, this.#tempPosition);\r\n CopyVector2(this.#lastRenderedBox.Position, this.#tempPosition)\r\n\r\n const startY = this.#tempPosition.y;\r\n const lineSpacing = Theme.Note.EntrySpacing * camera.zoom;\r\n\r\n ctx.textAlign = TextAlign.Left;\r\n ctx.textBaseline = TextBaseline.Alphabetic;\r\n for (let i = 0; i < this.#document.length; i++) {\r\n const text = this.#document[i];\r\n this.#tempPosition.y += text.render(ctx, this.#tempPosition, camera.zoom, this.#width) + lineSpacing;\r\n }\r\n\r\n this.#lastRenderedBox.Position.x -= BOUNDS_SPACING\r\n this.#lastRenderedBox.Position.y -= BOUNDS_SPACING\r\n this.#lastRenderedBox.Size.x = camera.zoom * this.#width + (BOUNDS_SPACING * 2);\r\n this.#lastRenderedBox.Size.y = this.#tempPosition.y - startY + (BOUNDS_SPACING * 2);\r\n }\r\n\r\n leftResizeHandleBox(): Box {\r\n return {\r\n Position: {\r\n x: this.#lastRenderedBox.Position.x - (BOX_SIZE / 2),\r\n y: this.#lastRenderedBox.Position.y + (this.#lastRenderedBox.Size.y / 2) - (BOX_SIZE / 2),\r\n },\r\n Size: { x: BOX_SIZE, y: BOX_SIZE, }\r\n };\r\n }\r\n\r\n rightResizeHandleBox(): Box {\r\n return {\r\n Position: {\r\n x: this.#lastRenderedBox.Position.x - (BOX_SIZE / 2) + this.#lastRenderedBox.Size.x,\r\n y: this.#lastRenderedBox.Position.y + (this.#lastRenderedBox.Size.y / 2) - (BOX_SIZE / 2),\r\n },\r\n Size: { x: BOX_SIZE, y: BOX_SIZE, }\r\n };\r\n }\r\n\r\n edittingLayout(): boolean {\r\n return this.#edittingLayout;\r\n }\r\n\r\n setHovering(hovering: boolean): void {\r\n this.#hovering = hovering;\r\n }\r\n\r\n editContent(): void {\r\n let input: HTMLTextAreaElement | null = null;\r\n let saveText = \"Save\";\r\n\r\n const popup = new Popup({\r\n title: \"Edit Note\",\r\n options: [saveText, \"Cancel\"],\r\n content: () => {\r\n const container = document.createElement('div');\r\n input = document.createElement('textarea')\r\n input.rows = 8;\r\n input.cols = 50;\r\n input.value = this.#originalText;\r\n container.append(input);\r\n return container;\r\n },\r\n onClose: (button: string | null): void => {\r\n if (button !== saveText || input === null) {\r\n return;\r\n }\r\n this.setText(input.value);\r\n },\r\n });\r\n\r\n popup.Show();\r\n }\r\n\r\n lock(): void {\r\n this.#edittingLayout = false;\r\n }\r\n\r\n unlock(): void {\r\n this.#edittingLayout = true;\r\n }\r\n\r\n bounds(): Box {\r\n return this.#lastRenderedBox;\r\n }\r\n}","import { Camera } from \"../camera\";\r\nimport { ContextMenuConfig } from \"../contextMenu\";\r\nimport { RenderResults } from \"../graphSubsystem\";\r\nimport { InBox } from \"../types/box\";\r\nimport { Vector2 } from \"../types/vector2\";\r\nimport { DragHandle, FlowNote, FlowNoteConfig } from './note';\r\n\r\n\r\nexport type NoteAddedCallback = (addedNote: FlowNote) => void\r\nexport type NoteRemovedCallback = (noteRemoved: FlowNote) => void\r\n\r\nexport type NoteDragStartCallback = (nodeDragged: FlowNote) => void\r\nexport type NoteDragStopCallback = (nodeDragged: FlowNote) => void\r\n\r\n\r\nexport interface NoteSubsystemConfig {\r\n onNoteAdded?: NoteAddedCallback;\r\n onNoteRemoved?: NoteRemovedCallback;\r\n onNoteDragStop?: NoteDragStopCallback\r\n onNoteDragStart?: NoteDragStartCallback\r\n notes?: Array<FlowNoteConfig>\r\n}\r\n\r\nexport class NoteSubsystem {\r\n\r\n #notes: Array<FlowNote>;\r\n\r\n #noteHovering: FlowNote | null;\r\n\r\n #noteSelected: FlowNote | null;\r\n\r\n #hoveringHandle: DragHandle;\r\n\r\n #onNoteAddedCallbacks: Array<NoteAddedCallback>;\r\n\r\n #onNoteRemovedCallbacks: Array<NoteRemovedCallback>;\r\n\r\n #onNoteDragStartCallbacks: Array<NoteDragStartCallback>;\r\n\r\n #onNoteDragStopCallbacks: Array<NoteDragStopCallback>;\r\n\r\n constructor(config?: NoteSubsystemConfig) {\r\n this.#hoveringHandle = DragHandle.None;\r\n this.#notes = [];\r\n this.#noteHovering = null;\r\n this.#noteSelected = null;\r\n\r\n // Callbacks\r\n this.#onNoteAddedCallbacks = new Array<NoteAddedCallback>();\r\n this.#onNoteRemovedCallbacks = new Array<NoteRemovedCallback>();\r\n this.#onNoteDragStartCallbacks = new Array<NoteDragStartCallback>();\r\n this.#onNoteDragStopCallbacks = new Array<NoteDragStopCallback>();\r\n\r\n if (config?.notes !== undefined) {\r\n for (let i = 0; i < config?.notes.length; i++) {\r\n this.addNote(new FlowNote(config?.notes[i]));\r\n }\r\n }\r\n\r\n // Add callback *after* we added all the initial notes\r\n if (config?.onNoteAdded !== undefined) {\r\n this.#onNoteAddedCallbacks.push(config?.onNoteAdded);\r\n }\r\n\r\n if (config?.onNoteDragStop !== undefined) {\r\n this.#onNoteDragStopCallbacks.push(config?.onNoteDragStop);\r\n }\r\n\r\n if (config?.onNoteDragStart !== undefined) {\r\n this.#onNoteDragStartCallbacks.push(config?.onNoteDragStart);\r\n }\r\n\r\n if (config?.onNoteRemoved !== undefined) {\r\n this.#onNoteRemovedCallbacks.push(config?.onNoteRemoved);\r\n }\r\n }\r\n\r\n addNote(note: FlowNote): void {\r\n if (note === null || note === undefined) {\r\n return;\r\n }\r\n\r\n this.#notes.push(note);\r\n for (let i = 0; i < this.#onNoteAddedCallbacks.length; i++) {\r\n this.#onNoteAddedCallbacks[i](note);\r\n }\r\n }\r\n\r\n public addNoteAddedListener(callback: NoteAddedCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#onNoteAddedCallbacks.push(callback);\r\n }\r\n\r\n public addNoteRemovedListener(callback: NoteRemovedCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#onNoteRemovedCallbacks.push(callback);\r\n }\r\n\r\n public addNoteDragStartListener(callback: NoteDragStartCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#onNoteDragStartCallbacks.push(callback);\r\n }\r\n\r\n public addNoteDragStopListener(callback: NoteDragStopCallback): void {\r\n if (callback === null || callback === undefined) {\r\n return;\r\n }\r\n this.#onNoteDragStopCallbacks.push(callback);\r\n }\r\n\r\n openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig | null {\r\n const group = \"node-flow-graph-note-menu\";\r\n\r\n const result: ContextMenuConfig = {\r\n items: [\r\n {\r\n name: \"New Note\",\r\n group: group,\r\n callback: () => {\r\n this.addNote(new FlowNote({\r\n text: \"#Note\\n\\nRight-click this note and select \\\"edit note\\\" to put what you want here.\",\r\n width: 300,\r\n position: position\r\n }))\r\n }\r\n }\r\n ],\r\n subMenus: [],\r\n }\r\n\r\n if (this.#noteHovering !== null) {\r\n const noteToReview = this.#noteHovering;\r\n result.items?.push(\r\n {\r\n name: \"Delete Note\",\r\n group: group,\r\n callback: () => {\r\n this.removeNote(noteToReview);\r\n }\r\n },\r\n {\r\n name: \"Edit Note\",\r\n group: group,\r\n callback: noteToReview.editContent.bind(noteToReview),\r\n },\r\n );\r\n\r\n if (!noteToReview.edittingLayout()) {\r\n result.items?.push({\r\n name: \"Unlock Note\",\r\n group: group,\r\n callback: noteToReview.unlock.bind(noteToReview),\r\n })\r\n } else {\r\n result.items?.push({\r\n name: \"Lock Note\",\r\n group: group,\r\n callback: noteToReview.lock.bind(noteToReview),\r\n })\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean): boolean {\r\n if (this.#noteHovering !== null && this.#noteHovering.edittingLayout()) {\r\n this.#noteSelected = this.#noteHovering;\r\n this.#noteSelected.selectHandle(this.#hoveringHandle);\r\n\r\n for (let i = 0; i < this.#onNoteDragStartCallbacks.length; i++) {\r\n this.#onNoteDragStartCallbacks[i](this.#noteSelected);\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n clickEnd(): void {\r\n if (this.#noteSelected !== null) {\r\n this.#noteSelected.selectHandle(DragHandle.None);\r\n for (let i = 0; i < this.#onNoteDragStopCallbacks.length; i++) {\r\n this.#onNoteDragStopCallbacks[i](this.#noteSelected);\r\n }\r\n }\r\n this.#noteSelected = null;\r\n }\r\n\r\n mouseDragEvent(delta: Vector2, scale: number): boolean {\r\n if (this.#noteSelected === null) {\r\n return false;\r\n }\r\n\r\n // Return early so we don't translate since we're moving a drag handle\r\n if (this.#noteSelected.handleSelected()) {\r\n return true;\r\n }\r\n\r\n this.#noteSelected.translate({\r\n x: delta.x * (1 / scale),\r\n y: delta.y * (1 / scale)\r\n });\r\n return true;\r\n }\r\n\r\n fileDrop(file: File): boolean {\r\n return false;\r\n }\r\n\r\n removeNote(note: FlowNote): void {\r\n const index = this.#notes.indexOf(note);\r\n if (index > -1) {\r\n const noteRemoved = this.#notes[index];\r\n this.#notes.splice(index, 1);\r\n\r\n for (let i = 0; i < this.#onNoteRemovedCallbacks.length; i++) {\r\n this.#onNoteRemovedCallbacks[i](noteRemoved)\r\n }\r\n } else {\r\n console.error(\"no note found to remove\");\r\n }\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults | undefined {\r\n this.#noteHovering = null;\r\n this.#hoveringHandle = DragHandle.None;\r\n\r\n // Set hovering to false on everything\r\n if (mousePosition) {\r\n for (let i = 0; i < this.#notes.length; i++) {\r\n this.#notes[i].setHovering(false);\r\n if (InBox(this.#notes[i].bounds(), mousePosition)) {\r\n this.#noteHovering = this.#notes[i];\r\n }\r\n }\r\n }\r\n\r\n // The note on top of everything is the one that get's to be in a \r\n // hover state\r\n if (this.#noteHovering != null) {\r\n this.#noteHovering.setHovering(true);\r\n if (mousePosition) {\r\n if (InBox(this.#noteHovering.leftResizeHandleBox(), mousePosition)) {\r\n this.#hoveringHandle = DragHandle.Left;\r\n } else if (InBox(this.#noteHovering.rightResizeHandleBox(), mousePosition)) {\r\n this.#hoveringHandle = DragHandle.Right;\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.#notes.length; i++) {\r\n this.#notes[i].render(ctx, camera, mousePosition);\r\n }\r\n return;\r\n }\r\n}","import { Camera } from \"../camera\";\r\nimport { ContextMenuConfig } from \"../contextMenu\";\r\nimport { RenderResults } from \"../graphSubsystem\";\r\nimport { List } from \"../types/list\";\r\nimport { Vector2 } from \"../types/vector2\";\r\n\r\ntype RenderLambda = () => void\r\n\r\n\r\n/**\r\n * Generic subsystem meant for other sybsystems to pass whatever to to render \r\n * at a certain time.\r\n * \r\n * Initial inspriation is for a subsytem to submit something to render on top \r\n * of all other subsystems.\r\n */\r\nexport class PassSubsystem {\r\n\r\n #queue: List<RenderLambda>\r\n\r\n constructor() {\r\n this.#queue = new List<RenderLambda>();\r\n }\r\n\r\n queue(lambda: RenderLambda): void {\r\n if(!lambda) {\r\n return;\r\n }\r\n this.#queue.Push(lambda);\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults | undefined {\r\n for (let i = 0; i < this.#queue.Count(); i++) {\r\n this.#queue.At(i)();\r\n }\r\n this.#queue.Clear();\r\n return;\r\n }\r\n\r\n openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig | null {\r\n // Left intentionally blank\r\n return null;\r\n }\r\n\r\n clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean): boolean {\r\n // Left intentionally blank\r\n return false;\r\n }\r\n\r\n mouseDragEvent(delta: Vector2, scale: number): boolean {\r\n // Left intentionally blank\r\n return false;\r\n }\r\n\r\n fileDrop(file: File): boolean {\r\n // Left intentionally blank\r\n return false;\r\n }\r\n\r\n clickEnd(): void {\r\n // Left intentionally blank\r\n }\r\n\r\n}","import { ContextMenuConfig, ContextMenuItemConfig } from \"./contextMenu\";\r\nimport { ContainerRenderElement as ContainerElement } from \"./elements/container\";\r\nimport { IRenderElement } from \"./elements/interfaces\";\r\nimport { TextAlign, TextElement as TextElement, VerticalAlign } from \"./elements/text\";\r\nimport { FontWeight } from \"./styles/text\";\r\nimport { Theme } from \"./theme\";\r\nimport { Text } from './types/text';\r\nimport { ScaleVector, Vector2 } from './types/vector2';\r\nimport { Display } from './elements/base';\r\n\r\nclass QuickMenuGroup {\r\n\r\n #text: TextElement;\r\n\r\n public items: Array<QuickMenuItem>;\r\n\r\n constructor(text: TextElement, items: Array<QuickMenuItem>) {\r\n this.#text = text;\r\n this.items = items;\r\n }\r\n\r\n updateRendering(terms: Array<string>): void {\r\n let shouldRender = false;\r\n for (let i = 0; i < this.items.length; i++) {\r\n const kept = this.items[i].filter(terms);\r\n this.items[i].render(kept);\r\n if (kept) {\r\n shouldRender = true;\r\n }\r\n }\r\n\r\n this.#text.setDisplay(shouldRender ? Display.Flex : Display.None);\r\n }\r\n\r\n}\r\n\r\nclass QuickMenuItem {\r\n #searchText: string;\r\n #text: TextElement;\r\n #context: ContextMenuItemConfig\r\n\r\n constructor(searchText: string, text: TextElement, context: ContextMenuItemConfig) {\r\n this.#searchText = searchText.toLowerCase();\r\n this.#text = text;\r\n this.#context = context;\r\n }\r\n\r\n filter(terms: Array<string>): boolean {\r\n if (terms.length === 0) {\r\n return true;\r\n }\r\n for (let i = 0; i < terms.length; i++) {\r\n if (terms[i] === \"\") {\r\n continue;\r\n }\r\n\r\n if (this.#searchText.indexOf(terms[i]) === -1) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n render(render: boolean): void {\r\n this.#text.setDisplay(render ? Display.Flex : Display.None);\r\n }\r\n\r\n rendering(): boolean {\r\n return this.#text.getDisplay() === Display.Flex;\r\n }\r\n\r\n highlight(highlight: boolean): void {\r\n this.#text.setBackgroundColor(highlight ? Theme.ContextMenu.HighlightColor : \"\");\r\n }\r\n\r\n select(): void {\r\n if (this.#context.callback) {\r\n this.#context.callback()\r\n }\r\n }\r\n}\r\n\r\nfunction RecurseBuildContainers(\r\n path: string,\r\n config: ContextMenuConfig,\r\n renderElements: Array<IRenderElement>,\r\n groups: Array<QuickMenuGroup>\r\n): void {\r\n\r\n let currentPath = config?.name ?? \"\";\r\n if (path !== \"\") {\r\n currentPath = path + \" / \" + currentPath;\r\n }\r\n\r\n if (config?.items && config.items.length > 0) {\r\n const titleText = new TextElement(\r\n new Text(\r\n currentPath,\r\n {\r\n color: Theme.ContextMenu.FontColor,\r\n weight: FontWeight.Bold,\r\n size: 12,\r\n }\r\n ),\r\n {\r\n Align: TextAlign.Center,\r\n VerticalAlign: VerticalAlign.Center,\r\n Padding: 16\r\n }\r\n );\r\n renderElements.push(titleText);\r\n\r\n const quickItems = new Array<QuickMenuItem>();\r\n\r\n for (let i = 0; i < config.items.length; i++) {\r\n const configItem = config.items[i];\r\n\r\n const itemText = new TextElement(\r\n new Text(\r\n configItem.name ?? \"Item\",\r\n {\r\n color: Theme.ContextMenu.FontColor,\r\n }\r\n ),\r\n {\r\n Padding: 8\r\n }\r\n );\r\n\r\n quickItems.push(new QuickMenuItem(\r\n currentPath + (configItem.name ?? \"\"),\r\n itemText,\r\n configItem\r\n ));\r\n\r\n renderElements.push(itemText);\r\n }\r\n\r\n groups.push(new QuickMenuGroup(titleText, quickItems));\r\n }\r\n\r\n if (config?.subMenus) {\r\n for (let i = 0; i < config?.subMenus.length; i++) {\r\n const configItem = config?.subMenus[i];\r\n RecurseBuildContainers(currentPath, configItem, renderElements, groups);\r\n }\r\n }\r\n}\r\n\r\nexport class QuickMenu {\r\n\r\n #menuGroups: Array<QuickMenuGroup>\r\n\r\n #container: ContainerElement\r\n\r\n #searchText: Text;\r\n\r\n #currentSelection: number;\r\n\r\n constructor(config?: ContextMenuConfig) {\r\n this.#menuGroups = [];\r\n this.#currentSelection = 0;\r\n\r\n this.#searchText = new Text(\r\n \"\",\r\n {\r\n color: Theme.ContextMenu.FontColor,\r\n }\r\n );\r\n\r\n const elements = [\r\n new TextElement(\r\n new Text(\r\n \"Search\",\r\n {\r\n color: Theme.ContextMenu.FontColor,\r\n }\r\n ),\r\n {\r\n Padding: {\r\n Bottom: 0,\r\n Left: 8,\r\n Right: 8,\r\n Top: 8\r\n },\r\n }\r\n ),\r\n\r\n // Search Box...\r\n new ContainerElement(\r\n [\r\n new TextElement(\r\n this.#searchText,\r\n undefined\r\n ),\r\n ],\r\n {\r\n Border: {\r\n Radius: 2,\r\n },\r\n BackgroundColor: \"#003847\",\r\n Padding: 8,\r\n Margin: 8,\r\n MinHeight: 46,\r\n }\r\n ),\r\n ]\r\n\r\n if (config) {\r\n RecurseBuildContainers(\"\", config, elements, this.#menuGroups);\r\n }\r\n\r\n this.#container = new ContainerElement(\r\n elements,\r\n {\r\n BackgroundColor: Theme.ContextMenu.BackgroundColor,\r\n Border: {\r\n Thickness: 1,\r\n Radius: 4\r\n }\r\n }\r\n )\r\n\r\n this.#updateHighlighting();\r\n }\r\n\r\n execute(): void {\r\n let selection = this.#currentSelection;\r\n\r\n for (let groupIndex = 0; groupIndex < this.#menuGroups.length; groupIndex++) {\r\n const group = this.#menuGroups[groupIndex];\r\n\r\n for (let itemIndex = 0; itemIndex < group.items.length; itemIndex++) {\r\n if (group.items[itemIndex].rendering()) {\r\n if (selection === 0) {\r\n group.items[itemIndex].select();\r\n return;\r\n }\r\n selection--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n #updateHighlighting(): void {\r\n const searchText = this.#searchText\r\n .get()\r\n .trim()\r\n .toLowerCase();\r\n\r\n let terms = new Array<string>();\r\n if (searchText !== \"\") {\r\n var potentialTerms = searchText.split(\" \");\r\n for (let i = 0; i < potentialTerms.length; i++) {\r\n const cleaned = potentialTerms[i].trim();\r\n if (cleaned !== \"\") {\r\n terms.push(cleaned);\r\n }\r\n }\r\n }\r\n\r\n let selection = this.#currentSelection;\r\n\r\n for (let groupIndex = 0; groupIndex < this.#menuGroups.length; groupIndex++) {\r\n const group = this.#menuGroups[groupIndex];\r\n group.updateRendering(terms);\r\n\r\n for (let itemIndex = 0; itemIndex < group.items.length; itemIndex++) {\r\n if (group.items[itemIndex].rendering()) {\r\n group.items[itemIndex].highlight(selection === 0)\r\n selection--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n keyboardEvent(event: KeyboardEvent): void {\r\n\r\n let intercepted = true;\r\n\r\n if (event.code === \"Backspace\") {\r\n this.#currentSelection = 0;\r\n const text = this.#searchText.get();\r\n this.#searchText.set(text.slice(0, text.length - 1));\r\n } else if (/^[a-zA-Z0-9]$/.test(event.key) || event.key === \" \") {\r\n this.#currentSelection = 0;\r\n this.#searchText.set(this.#searchText.get() + event.key);\r\n } else if (event.key === \"ArrowUp\") {\r\n this.#currentSelection = Math.max(0, this.#currentSelection - 1);\r\n } else if (event.key === \"ArrowDown\") {\r\n this.#currentSelection ++;\r\n } else {\r\n intercepted = false;\r\n }\r\n\r\n if (intercepted) {\r\n this.#updateHighlighting();\r\n event.preventDefault();\r\n }\r\n\r\n // console.log(event);\r\n }\r\n\r\n renderSize = { x: 0, y: 0 };\r\n\r\n public render(ctx: CanvasRenderingContext2D, pos: Vector2, graphScale: number, mousePosition: Vector2 | undefined): null {\r\n this.#container.calcSize(ctx, this.renderSize, { x: -1, y: -1 });\r\n // ScaleVector(this.renderSize, graphScale);\r\n\r\n // Clamp the position so it's not spilling off the canvas\r\n if (pos.y + Math.min(this.renderSize.y, 400) > ctx.canvas.clientHeight) {\r\n pos.y = ctx.canvas.clientHeight - Math.min(this.renderSize.y, 400);\r\n }\r\n\r\n if (pos.x + this.renderSize.x > ctx.canvas.clientWidth) {\r\n pos.x = ctx.canvas.clientWidth - this.renderSize.x;\r\n }\r\n\r\n if (pos.y < 0) {\r\n pos.y = 0;\r\n }\r\n\r\n if (pos.x < 0) {\r\n pos.x = 0;\r\n }\r\n\r\n this.#container.render(ctx, pos, 1, this.renderSize);\r\n return null;\r\n }\r\n}\r\n","import { CombineContextMenus, ContextEntry, ContextMenu, ContextMenuConfig } from './contextMenu';\r\nimport { Theme } from \"./theme\";\r\nimport { MouseObserver } from \"./input\";\r\nimport { FlowNode } from \"./node\";\r\nimport { NodeCreatedCallback, NodeFactoryConfig } from \"./nodes/factory\";\r\nimport { TimeExecution } from \"./performance\";\r\nimport { CursorStyle } from \"./styles/cursor\";\r\nimport { CopyVector2, Vector2, Zero } from './types/vector2';\r\nimport { Clamp01 } from \"./utils/math\";\r\nimport { GraphSubsystem, RenderResults } from './graphSubsystem';\r\nimport { FlowNote } from \"./notes/note\";\r\nimport { NoteAddedCallback, NoteDragStartCallback, NoteDragStopCallback, NoteRemovedCallback, NoteSubsystem, NoteSubsystemConfig } from \"./notes/subsystem\";\r\nimport { ConnectionRendererConfiguration, NodeAddedCallback, NodeRemovedCallback, NodeSubsystem } from \"./nodes/subsystem\";\r\nimport { Connection } from './connection';\r\nimport { Publisher } from './nodes/publisher';\r\nimport { VectorPool } from './types/pool';\r\nimport { Camera } from './camera';\r\nimport { PassSubsystem } from './pass/subsystem';\r\nimport { QuickMenu } from './quickMenu';\r\n\r\nexport type GraphRenderer = (canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D, position: Vector2, scale: number) => void;\r\n\r\nfunction BuildBackgroundRenderer(backgroundColor: string): GraphRenderer {\r\n return (canvas: HTMLCanvasElement, context: CanvasRenderingContext2D, position: Vector2, scale: number): void => {\r\n context.fillStyle = backgroundColor;\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n const alpha = Math.round(Clamp01(scale - 0.3) * 255)\r\n if (alpha <= 0) {\r\n return;\r\n }\r\n\r\n context.fillStyle = `rgba(41, 54, 57, ${alpha})`;\r\n const spacing = 100;\r\n const pi2 = 2 * Math.PI\r\n const dotScale = 2 * scale;\r\n for (let x = -50; x < 50; x++) {\r\n const xPos = (x * spacing * scale) + position.x;\r\n for (let y = -50; y < 50; y++) {\r\n const yPos = (y * spacing * scale) + position.y;\r\n context.beginPath();\r\n context.arc(xPos, yPos, dotScale, 0, pi2);\r\n context.fill();\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst contextMenuGroup = \"graph-context-menu\";\r\n\r\nexport interface FlowNodeGraphConfiguration {\r\n backgroundRenderer?: GraphRenderer;\r\n backgroundColor?: string;\r\n idleConnection?: ConnectionRendererConfiguration\r\n contextMenu?: ContextMenuConfig\r\n nodes?: NodeFactoryConfig\r\n board?: NoteSubsystemConfig\r\n}\r\n\r\ninterface OpenContextMenu {\r\n Menu: ContextMenu\r\n Position: Vector2\r\n}\r\n\r\ninterface OpenQuickMenu {\r\n Menu: QuickMenu\r\n Position: Vector2\r\n}\r\n\r\nclass GraphView {\r\n\r\n #subsystems: Array<GraphSubsystem>;\r\n\r\n constructor(subsystems: Array<GraphSubsystem>) {\r\n this.#subsystems = subsystems;\r\n }\r\n\r\n clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean) {\r\n // Since the graph is rendered from 0 => n, n is the last thing \r\n // rendererd and is always shown to the user. So if their clicking on\r\n // two things technically, we need to make sure it's whatever was most \r\n // recently rendered. So we traverse n => 0. \r\n for (let i = this.#subsystems.length - 1; i >= 0; i--) {\r\n // If the user sucesfully clicked on something in this layer, don't\r\n // check any more layers.\r\n if (this.#subsystems[i].clickStart(mousePosition, camera, ctrlKey)) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n fileDrop(file: File): boolean {\r\n for (let i = this.#subsystems.length - 1; i >= 0; i--) {\r\n if (this.#subsystems[i].fileDrop(file)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig {\r\n let finalConfig: ContextMenuConfig = {};\r\n\r\n for (let i = 0; i < this.#subsystems.length; i++) {\r\n const subSystemMenu = this.#subsystems[i].openContextMenu(ctx, position);\r\n if (subSystemMenu !== null) {\r\n finalConfig = CombineContextMenus(finalConfig, subSystemMenu);\r\n }\r\n }\r\n\r\n return finalConfig;\r\n }\r\n\r\n clickEnd(): void {\r\n for (let i = 0; i < this.#subsystems.length; i++) {\r\n this.#subsystems[i].clickEnd();\r\n }\r\n }\r\n\r\n mouseDragEvent(delta: Vector2, scale: number): boolean {\r\n for (let i = 0; i < this.#subsystems.length; i++) {\r\n if (this.#subsystems[i].mouseDragEvent(delta, scale)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults {\r\n const results: RenderResults = {};\r\n for (let i = 0; i < this.#subsystems.length; i++) {\r\n TimeExecution(\"Render_Subsystem_\" + i, () => {\r\n let results = this.#subsystems[i].render(ctx, camera, mousePosition);\r\n if (results?.cursorStyle) {\r\n results.cursorStyle = results?.cursorStyle;\r\n }\r\n })\r\n }\r\n return results;\r\n }\r\n}\r\n\r\nexport class NodeFlowGraph {\r\n\r\n #ctx: CanvasRenderingContext2D;\r\n\r\n #canvas: HTMLCanvasElement;\r\n\r\n #backgroundRenderer: GraphRenderer\r\n\r\n #contextMenuConfig: ContextMenuConfig;\r\n\r\n #mousePosition: Vector2 | undefined;\r\n\r\n #camera: Camera;\r\n\r\n #openedContextMenu: OpenContextMenu | null;\r\n\r\n #openQuickMenu: OpenQuickMenu | null;\r\n\r\n #contextMenuEntryHovering: ContextEntry | null;\r\n\r\n #views: Array<GraphView>;\r\n\r\n #currentView: number;\r\n\r\n #mainNodeSubsystem: NodeSubsystem;\r\n\r\n #mainNoteSubsystem: NoteSubsystem;\r\n\r\n constructor(canvas: HTMLCanvasElement, config?: FlowNodeGraphConfiguration) {\r\n const postProcessPass = new PassSubsystem();\r\n\r\n this.#mainNodeSubsystem = new NodeSubsystem(postProcessPass, {\r\n nodes: config?.nodes,\r\n idleConnection: config?.idleConnection\r\n });\r\n\r\n this.#lastFrameCursor = CursorStyle.Default;\r\n this.#cursor = CursorStyle.Default;\r\n\r\n this.#mainNoteSubsystem = new NoteSubsystem(config?.board);\r\n\r\n this.#views = [\r\n new GraphView([\r\n this.#mainNoteSubsystem,\r\n this.#mainNodeSubsystem,\r\n postProcessPass\r\n ])\r\n ];\r\n this.#currentView = 0;\r\n\r\n this.#camera = new Camera();\r\n\r\n this.#contextMenuConfig = CombineContextMenus({\r\n items: [\r\n {\r\n name: \"Reset View\",\r\n group: contextMenuGroup,\r\n callback: this.#camera.reset.bind(this.#camera)\r\n },\r\n ],\r\n }, config?.contextMenu);\r\n\r\n this.#openedContextMenu = null;\r\n this.#openQuickMenu = null;\r\n this.#contextMenuEntryHovering = null;\r\n\r\n this.#canvas = canvas;\r\n const ctx = canvas.getContext(\"2d\")\r\n if (ctx === null) {\r\n throw new Error(\"could not create canvas context\")\r\n }\r\n this.#ctx = ctx;\r\n\r\n if (config?.backgroundRenderer !== undefined) {\r\n this.#backgroundRenderer = config?.backgroundRenderer\r\n } else {\r\n const backgroundColor = config?.backgroundColor === undefined ? Theme.Graph.BackgroundColor : config.backgroundColor;\r\n this.#backgroundRenderer = BuildBackgroundRenderer(backgroundColor);\r\n }\r\n\r\n window.requestAnimationFrame(this.#render.bind(this));\r\n\r\n this.#canvas.addEventListener('wheel', (event) => {\r\n event.preventDefault();\r\n this.zoom(Math.sign(event.deltaY));\r\n }, false);\r\n\r\n new MouseObserver(this.#canvas,\r\n this.#mouseDragEvent.bind(this),\r\n\r\n // Mouse move event\r\n (mousePosition) => {\r\n this.#mousePosition = mousePosition;\r\n },\r\n\r\n this.#clickStart.bind(this),\r\n this.#clickEnd.bind(this),\r\n this.#openContextMenu.bind(this),\r\n this.#fileDrop.bind(this)\r\n );\r\n\r\n document.addEventListener(\r\n \"keydown\",\r\n (e) => {\r\n if (document.activeElement) {\r\n if ([\"INPUT\", \"TEXTAREA\"].includes(document.activeElement.tagName)) return;\r\n }\r\n\r\n if (this.#openQuickMenu) {\r\n if (e.code === \"Escape\") {\r\n this.#openQuickMenu = null;\r\n return;\r\n }\r\n\r\n if (e.code === \"Enter\") {\r\n this.#openQuickMenu.Menu.execute();\r\n this.#openQuickMenu = null;\r\n return;\r\n }\r\n\r\n this.#openQuickMenu.Menu.keyboardEvent(e);\r\n return\r\n }\r\n\r\n const spacePressed = e.key == \" \" || e.code == \"Space\";\r\n if (!spacePressed) {\r\n return;\r\n }\r\n\r\n if (!this.#mousePosition) {\r\n return;\r\n }\r\n const contextMenuPosition = this.#sceenPositionToGraphPosition(this.#mousePosition);\r\n\r\n let items = this.#mainNodeSubsystem.nodeFactory().newNodeSubmenus(this.#mainNodeSubsystem, contextMenuPosition);\r\n this.#openQuickMenu = {\r\n Menu: new QuickMenu({\r\n subMenus: items,\r\n }),\r\n Position: contextMenuPosition\r\n }\r\n }\r\n );\r\n }\r\n\r\n #fileDrop(file: File): void {\r\n\r\n if (this.currentView().fileDrop(file)) {\r\n return;\r\n }\r\n\r\n const contents = file.name.split('.');\r\n const extension = contents[contents.length - 1];\r\n if (extension !== \"jpg\" && extension !== \"jpeg\" && extension !== \"png\") {\r\n return;\r\n }\r\n\r\n let pos = Zero();\r\n if (this.#mousePosition) {\r\n CopyVector2(pos, this.#sceenPositionToGraphPosition(this.#mousePosition));\r\n }\r\n\r\n this.#mainNodeSubsystem.addNode(new FlowNode({\r\n title: contents[0],\r\n position: pos,\r\n widgets: [{\r\n type: \"image\",\r\n config: {\r\n blob: file,\r\n }\r\n }]\r\n }));\r\n }\r\n\r\n public addNoteAddedListener(callback: NoteAddedCallback): void {\r\n this.#mainNoteSubsystem.addNoteAddedListener(callback);\r\n }\r\n\r\n public addNoteRemovedListener(callback: NoteRemovedCallback): void {\r\n this.#mainNoteSubsystem.addNoteRemovedListener(callback);\r\n }\r\n\r\n public addNoteDragStartListener(callback: NoteDragStartCallback): void {\r\n this.#mainNoteSubsystem.addNoteDragStartListener(callback);\r\n }\r\n\r\n public addNoteDragStopListener(callback: NoteDragStopCallback): void {\r\n this.#mainNoteSubsystem.addNoteDragStopListener(callback);\r\n }\r\n\r\n\r\n zoom(amount: number): void {\r\n\r\n let oldPos: Vector2 | undefined = undefined;\r\n if (this.#mousePosition) {\r\n oldPos = this.#sceenPositionToGraphPosition(this.#mousePosition);;\r\n }\r\n\r\n this.#camera.zoom += amount * this.#camera.zoom * 0.05;\r\n\r\n if (!oldPos || !this.#mousePosition) {\r\n return;\r\n }\r\n // Attempt zoom around where the current mouse is.\r\n const newPos = this.#sceenPositionToGraphPosition(this.#mousePosition);\r\n this.#camera.position.x += (newPos.x - oldPos.x) * this.#camera.zoom;\r\n this.#camera.position.y += (newPos.y - oldPos.y) * this.#camera.zoom;\r\n }\r\n\r\n #clickStart(mousePosition: Vector2, ctrlKey: boolean): void {\r\n if (this.#contextMenuEntryHovering !== null) {\r\n this.#contextMenuEntryHovering.click();\r\n this.#openedContextMenu = null;\r\n this.#contextMenuEntryHovering = null;\r\n return;\r\n }\r\n this.#openedContextMenu = null;\r\n this.#openQuickMenu = null;\r\n this.#contextMenuEntryHovering = null;\r\n\r\n this.#mousePosition = mousePosition;\r\n this.currentView().clickStart(mousePosition, this.#camera, ctrlKey);\r\n }\r\n\r\n currentView(): GraphView {\r\n return this.#views[this.#currentView];\r\n }\r\n\r\n organize(): void {\r\n this.#mainNodeSubsystem.organize(this.#ctx);\r\n }\r\n\r\n addPublisher(identifier: string, publisher: Publisher): void {\r\n this.#mainNodeSubsystem.addPublisher(identifier, publisher);\r\n }\r\n\r\n getNodes(): Array<FlowNode> {\r\n return this.#mainNodeSubsystem.getNodes();\r\n }\r\n\r\n connectedInputsNodeReferences(nodeIndex: number): Array<FlowNode> {\r\n return this.#mainNodeSubsystem.connectedInputsNodeReferencesByIndex(nodeIndex);\r\n }\r\n\r\n connectedOutputsNodeReferences(nodeIndex: number): Array<FlowNode> {\r\n return this.#mainNodeSubsystem.connectedOutputsNodeReferences(nodeIndex);\r\n }\r\n\r\n connectNodes(nodeOut: FlowNode, outPort: number, nodeIn: FlowNode, inPort: number): Connection | undefined {\r\n return this.#mainNodeSubsystem.connectNodes(nodeOut, outPort, nodeIn, inPort);\r\n }\r\n\r\n addNode(node: FlowNode): void {\r\n this.#mainNodeSubsystem.addNode(node);\r\n }\r\n\r\n removeNode(node: FlowNode): void {\r\n this.#mainNodeSubsystem.removeNode(node);\r\n }\r\n\r\n addNote(note: FlowNote): void {\r\n this.#mainNoteSubsystem.addNote(note);\r\n }\r\n\r\n public addOnNodeCreatedListener(callback: NodeCreatedCallback): void {\r\n this.#mainNodeSubsystem.addOnNodeCreatedListener(callback);\r\n }\r\n\r\n public addOnNodeAddedListener(callback: NodeAddedCallback): void {\r\n this.#mainNodeSubsystem.addOnNodeAddedListener(callback);\r\n }\r\n\r\n public addOnNodeRemovedListener(callback: NodeRemovedCallback): void {\r\n this.#mainNodeSubsystem.addOnNodeRemovedListener(callback);\r\n }\r\n\r\n #sceenPositionToGraphPosition(screenPosition: Vector2): Vector2 {\r\n const out = Zero();\r\n this.#camera.screenSpaceToGraphSpace(screenPosition, out);\r\n return out;\r\n }\r\n\r\n #openContextMenu(position: Vector2): void {\r\n let finalConfig = this.#contextMenuConfig;\r\n\r\n const contextMenuPosition = this.#sceenPositionToGraphPosition(position);\r\n\r\n finalConfig = CombineContextMenus(finalConfig, this.currentView().openContextMenu(this.#ctx, contextMenuPosition));\r\n\r\n this.#openedContextMenu = {\r\n Menu: new ContextMenu(finalConfig),\r\n Position: contextMenuPosition,\r\n };\r\n }\r\n\r\n\r\n // Somethings wrong here. Needs more testing\r\n // #fitView(): void {\r\n // if (this.#nodes.length === 0) {\r\n // return;\r\n // }\r\n\r\n // const curBox: Box = {\r\n // Position: { x: 0, y: 0 },\r\n // Size: { x: 0, y: 0 }\r\n // };\r\n // CopyBox(curBox, this.#nodes[0].calculateBounds(this.#ctx, this.#graphState.position, this.#graphState.scale));\r\n\r\n // for (let i = 1; i < this.#nodes.length; i++) {\r\n // ExpandBox(curBox, this.#nodes[i].calculateBounds(this.#ctx, this.#graphState.position, this.#graphState.scale));\r\n // }\r\n\r\n // CopyVector2(this.#graphState.position, curBox.Position);\r\n // }\r\n\r\n #clickEnd(): void {\r\n this.currentView().clickEnd();\r\n }\r\n\r\n #mouseDragEvent(delta: Vector2): void {\r\n let draggingSomething = this.currentView().mouseDragEvent(delta, this.#camera.zoom);\r\n if (!draggingSomething) {\r\n this.#camera.position.x += delta.x;\r\n this.#camera.position.y += delta.y;\r\n }\r\n }\r\n\r\n #lastFrameCursor: CursorStyle;\r\n\r\n #cursor: CursorStyle;\r\n\r\n #render(): void {\r\n if (this.#canvas.parentNode !== null) {\r\n // Stupid as any because typescript doesn't think it exists\r\n var rect = (this.#canvas.parentNode as any).getBoundingClientRect();\r\n this.#canvas.width = rect.width;\r\n this.#canvas.height = rect.height;\r\n }\r\n\r\n\r\n this.#cursor = CursorStyle.Default;\r\n\r\n TimeExecution(\"Render_Background\", this.#renderBackground.bind(this));\r\n\r\n TimeExecution(\"Render_View_\" + this.#currentView, () => {\r\n let results = this.currentView().render(this.#ctx, this.#camera, this.#mousePosition);\r\n if (results?.cursorStyle) {\r\n this.#cursor = results?.cursorStyle;\r\n }\r\n });\r\n\r\n TimeExecution(\"Render_Context\", this.#renderContextMenu.bind(this));\r\n\r\n TimeExecution(\"Render_QuickMenu\", this.#renderQuickMenu.bind(this))\r\n\r\n // Only update CSS style if things have changed\r\n // TODO: Does this actually have any measurable performance savings?\r\n if (this.#lastFrameCursor !== this.#cursor) {\r\n this.#canvas.style.cursor = this.#cursor;\r\n }\r\n this.#lastFrameCursor = this.#cursor;\r\n\r\n window.requestAnimationFrame(this.#render.bind(this));\r\n }\r\n\r\n #renderBackground(): void {\r\n this.#backgroundRenderer(this.#canvas, this.#ctx, this.#camera.position, this.#camera.zoom);\r\n }\r\n\r\n #renderContextMenu(): void {\r\n VectorPool.run(() => {\r\n if (this.#openedContextMenu !== null) {\r\n const pos = VectorPool.get();\r\n this.#camera.graphSpaceToScreenSpace(this.#openedContextMenu.Position, pos)\r\n this.#contextMenuEntryHovering = this.#openedContextMenu.Menu.render(this.#ctx, pos, this.#camera.zoom, this.#mousePosition, true);\r\n\r\n if (this.#contextMenuEntryHovering !== null) {\r\n this.#cursor = CursorStyle.Pointer;\r\n }\r\n }\r\n });\r\n }\r\n\r\n #renderQuickMenu(): void {\r\n VectorPool.run(() => {\r\n if (this.#openQuickMenu !== null) {\r\n const pos = VectorPool.get();\r\n this.#camera.graphSpaceToScreenSpace(this.#openQuickMenu.Position, pos)\r\n this.#contextMenuEntryHovering = this.#openQuickMenu.Menu.render(this.#ctx, pos, this.#camera.zoom, this.#mousePosition);\r\n\r\n if (this.#contextMenuEntryHovering !== null) {\r\n this.#cursor = CursorStyle.Pointer;\r\n }\r\n }\r\n });\r\n }\r\n}"],"mappings":"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","names":["_arr","_count","_name","_textStyle","width","width","width","_size","_maxWidth","_size","_color","_border","_color","_box","_text","_node","_value","_text","_callback","_text","_callback","_node","_nodeProperty","_value","_callback","_value","_text","_node","_nodeProperty","_textStyle","_backgroundColor","_lastMousePosition","_value","_idleStyle","_hoverStyle","_callback","_node","_nodeProperty","_idleStyle","_hoverStyle","_box","_node","_nodeProperty","_value","_text","_callback","_maxWidth","_maxHeight","_value","_callback","_node","_nodeProperty","_size","column","_name","_connections","NodeSubsystem","connection","MessageType","NodeState","_text","_title","_contextMenu","_padding","_text","_entries","_calculatedPositions","_calculatedEntries","_calculatedForWidth","calculateLayout_fn","max","i","_tokens","_index","current_fn","inc_fn","next_fn","text_fn","h1_fn","h2_fn","_originalText","_data","_position","_text","_searchText","results","_cursor","NodeSubsystem"]}
|