{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-function-completion/src/components/halo/Connection.js"],"names":["Set","Connection","nextId","constructor","target","targetProperty","source","sourceProperty","isEvent","evt","connectionFunction","cleanProperty","makeSavingScript","property","split","each","camelCaseIfNeeded","propertyPart","includes","camelCase","ensureID","saveSerializedConnectionIntoWidget","serializedConnections","from","window","connection","serialize","sourceId","targetId","trackingCode","modifyingcode","label","deserialize","json","forEach","connectionData","connectionFromExistingData","deserializeFromObjectIfNeeded","object","hasAttribute","getJSONAttribute","modifyingCode","elementByID","undeadConnection","setModifyingCode","setTrackingCode","setLabel","activate","deactivate","activateEvent","activateAexpr","notify","addEventListener","myFunction","svalue","getTrackingCode","string","isActive","sourceValue","drawConnectionLine","line","getGlobalCenter","showPath","setActive","shouldBeActive","toggleDirection","oldTarget","copyAndActivate","newConnection","removeEventListener","destroy","getSource","setSource","getSourceId","getTarget","setTarget","getTargetId","getAexpr","getSourceProperty","setSourceProperty","newProperty","getModifyingCode","allConnections","allConnectionsFor","connections","objectId","getAttribute","push","getLabel","migrateTo"],"mappings":"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","file":"Connection.js","sourcesContent":["\"enable aexpr\";\n\nwindow.allConnections = window.allConnections || new Set()\n\nexport default class Connection {\n  \n  static nextId(){\n    this._currentId = this._currentId || 1\n    return this._currentId++\n  }\n  \n  constructor(target, targetProperty, source, sourceProperty, isEvent) {\n    this.id = Connection.nextId();\n    window.allConnections.add(this);\n    \n    this.target = target;\n    this._targetProperty = targetProperty;\n    this.source = source;\n    this._sourceProperty = sourceProperty;\n    this.isEvent = isEvent;\n    this.isActive = false\n    this._eventListener = evt => this.connectionFunction(evt)\n    this._targetProperty = this.cleanProperty(this._targetProperty)\n    if(isEvent){\n      this.valueModifyingCode = `(target, event) => {\n  target.${this._targetProperty} = 42;\n}`;\n      this.trackingCode = this._sourceProperty;\n    } else {\n      this.valueModifyingCode = `(target, sourceValue) => {\n  target.${this._targetProperty} = sourceValue;\n}`;\n      this._sourceProperty = this.cleanProperty(this._sourceProperty)\n      this.trackingCode = `(source) => {\n  return source.${this._sourceProperty};\n}`\n    }\n    \n    this.label = 'Connection ' + this.id\n    this.makeSavingScript();\n  }\n  \n  cleanProperty(property) {\n    return property.split(\".\").map(each => this.camelCaseIfNeeded(each)).join(\".\")\n  }\n  \n  camelCaseIfNeeded(propertyPart) {\n    if(propertyPart.includes('-')) {\n      return propertyPart.camelCase();\n    } else {\n      return propertyPart;\n    }\n  }\n  \n  makeSavingScript() {\n    this.targetId = lively.ensureID(this.target);\n    this.sourceId = lively.ensureID(this.source);\n    this.saveSerializedConnectionIntoWidget();\n  }\n  \n  saveSerializedConnectionIntoWidget() {\n    const serializedConnections = Array.from(window.allConnections)\n      .filter(connection => connection.source === this.source)\n      .map(connection => connection.serialize())\n    this.source.setJSONAttribute('data-connection', serializedConnections);\n  }\n  \n  serialize() {\n    return {\n      sourceId: this.sourceId,\n      targetId: this.targetId,\n      trackingCode: this.trackingCode,\n      modifyingcode: this.valueModifyingCode,\n      label: this.label,\n      isEvent: this.isEvent\n    }\n  }\n  \n  static deserialize(json) {\n    json.forEach(connectionData => {\n      this.connectionFromExistingData(connectionData.targetId, connectionData.modifyingcode, connectionData.sourceId, connectionData.trackingCode, connectionData.label, connectionData.isEvent)\n    })\n  }\n  \n  static deserializeFromObjectIfNeeded(object) {\n    if (object.hasAttribute && object.hasAttribute('data-connection')) {\n      this.deserialize(object.getJSONAttribute('data-connection'))\n    }\n  }\n  \n  static connectionFromExistingData(targetId, modifyingCode, sourceId, trackingCode, label, isEvent) {\n    const target = lively.elementByID(targetId);\n    const source = lively.elementByID(sourceId);\n    const undeadConnection = new Connection(target, 'something', source, 'something', isEvent);\n    undeadConnection.setModifyingCode(modifyingCode);\n    undeadConnection.setTrackingCode(trackingCode);\n    undeadConnection.setLabel(label);\n    undeadConnection.activate();\n  }\n  \n  activate() {\n    \n    if(this.isActive) {\n       this.deactivate()\n    }\n    \n    if(this.isEvent) {\n      this.activateEvent()\n    }\n    else {\n      this.activateAexpr()\n    }\n    this.isActive = true\n  }\n  \n  async activateEvent() {\n    lively.notify(this.trackingCode)\n    lively.addEventListener('Connections', this.source, this.trackingCode, this._eventListener);\n  }\n  \n  async activateAexpr() {\n    let myFunction = await this.trackingCode.boundEval()\n    this.ae = aexpr(() => myFunction(this.source));\n    this.ae.onChange(svalue => this.connectionFunction(svalue));\n  }\n  \n  getTrackingCode() {\n    return this.trackingCode\n  }\n  \n  setTrackingCode(string) {\n    const isActive = this.isActive\n    if(isActive){this.deactivate()}\n    this.trackingCode = string;\n    this.saveSerializedConnectionIntoWidget();\n    if(isActive){this.activate()}\n  }\n  \n  async connectionFunction(sourceValue) {  \n    let myFunction = await this.valueModifyingCode.boundEval()\n    myFunction(this.target, sourceValue)\n  }\n  \n  drawConnectionLine() {\n    let line = [lively.getGlobalCenter(this.source), lively.getGlobalCenter(this.target)];\n    lively.showPath(line, \"rgba(80,180,80,1)\", true);\n  }\n  \n  setActive(shouldBeActive) {\n    if(shouldBeActive){\n      this.activate()\n    }\n    else{\n       this.deactivate()\n    }\n  }\n  \n  toggleDirection() {\n    this.deactivate();\n    let oldTarget = this.target;\n    this.target = this.source;\n    this.source = oldTarget;\n    this.saveSerializedConnectionIntoWidget();\n    this.activate();\n  }\n  \n  copyAndActivate() {\n    let newConnection = new Connection(this.target, this._targetProperty, this.source, this.sourceProperty, this.isEvent);\n    newConnection.setModifyingCode(this.valueModifyingCode);\n    newConnection.activate();\n    return newConnection;\n  }\n  \n  deactivate() {\n    this.ae && this.ae.dispose()\n    if(this.isEvent){\n      lively.removeEventListener ('Connections', this.source, this.trackingCode, this._eventListener)\n    }\n    this.isActive = false\n  }\n  \n  destroy() {\n    this.deactivate()\n    window.allConnections.delete(this)\n  }\n  \n  getSource() {\n    return this.source\n  }\n  \n  setSource(object) {\n    this.source = object\n  }\n  \n  getSourceId() {\n    return this.sourceId\n  }\n  \n  getTarget() {\n    return this.target\n  }\n  \n  setTarget(object) {\n    this.target = object\n  }\n  \n  getTargetId() {\n    return this.targetId\n  }\n  \n  getAexpr() {\n    return this.ae\n  }\n  \n  getSourceProperty() {\n    return this.sourceProperty\n  }\n  \n  setSourceProperty(newProperty) {\n    this.sourceProperty = newProperty;\n    this.saveSerializedConnectionIntoWidget();\n    this.activate();\n  }\n  \n  getModifyingCode() {\n    return this.valueModifyingCode\n  }\n  \n  setModifyingCode(string) {\n    this.valueModifyingCode = string;\n    this.saveSerializedConnectionIntoWidget();\n  }\n  \n  static get allConnections() {\n    return window.allConnections\n  }\n  \n  static allConnectionsFor(object) {\n    let connections = [];\n    if (object.hasAttribute && object.hasAttribute('data-lively-id')) {\n      let objectId = object.getAttribute('data-lively-id');\n      this.allConnections.forEach(connection => {\n        if((connection.targetId == objectId) || (connection.sourceId == objectId)) {connections.push(connection)}\n      })\n    }\n    return connections\n  }\n  \n  getLabel() {\n    return this.label\n  }\n  \n  setLabel(string) {\n    this.label = string\n  }\n  \n}\n\nwindow.allConnections.forEach(connection => connection.migrateTo(Connection));"]}