diff web/timeline/inline-attrs.coffee @ 2376:4556eebe5d73

topdir reorgs; let pdm have its src/ dir; separate vite area from light9/
author drewp@bigasterisk.com
date Sun, 12 May 2024 19:02:10 -0700
parents light9/web/timeline/inline-attrs.coffee@7fe81130b735
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/timeline/inline-attrs.coffee	Sun May 12 19:02:10 2024 -0700
@@ -0,0 +1,88 @@
+log = debug('attrs')
+debug.enable('*')
+
+coffeeElementSetup(class InlineAttrs extends Polymer.Element
+  @is: "light9-timeline-note-inline-attrs"
+  @getter_properties:
+    graph: { type: Object, notify: true }
+    project: { type: Object, notify: true }
+    song: { type: String, notify: true }
+    config: { type: Object } # just for setup
+    uri: { type: Object, notify: true }  # the Note
+    effectStr: { type: String, notify: true }
+    colorScale: { type: String, notify: true }
+    noteLabel: { type: String, notify: true }
+    selection: { type: Object, notify: true }
+  @getter_observers: [
+    '_onConfig(config)'
+    'addHandler(graph, uri)'
+    'onColorScale(graph, uri, colorScale)'
+    ]
+
+  ready: ->
+    super.ready()
+    @$.effect.addEventListener 'edited', =>
+      @graph.patchObject(@uri, @graph.Uri(':effectClass'), @graph.Uri(@effectStr), @graph.Uri(@song))
+      
+  _onConfig: ->
+    @uri = @config.uri
+    for side in ['top', 'left', 'width', 'height']
+      @.style[side] = @config[side] + 'px'
+    
+  addHandler: ->
+    return unless @uri
+    @graph.runHandler(@update.bind(@), "update inline attrs #{@uri.value}")
+    
+  onColorScale: ->
+    return unless @uri? and @colorScale? and @colorScaleFromGraph?
+    U = (x) => @graph.Uri(x)
+    if @colorScale == @colorScaleFromGraph
+      return
+    @editAttr(@uri, U(':colorScale'), @graph.Literal(@colorScale))
+
+  editAttr: (note, attr, value) ->
+    U = (x) => @graph.Uri(x)
+    if not @song?
+      log("inline: can't edit inline attr yet, no song")
+      return
+
+    existingColorScaleSetting = null
+    for setting in @graph.objects(note, U(':setting'))
+      ea = @graph.uriValue(setting, U(':effectAttr'))
+      if ea.equals(attr)
+        existingColorScaleSetting = setting
+        
+    if existingColorScaleSetting
+      log('inline: update setting', existingColorScaleSetting.value)
+      @graph.patchObject(existingColorScaleSetting, U(':value'), value, U(@song))
+    else
+      log('inline: new setting')
+      setting = @graph.nextNumberedResource(note.value + 'set')
+      patch = {delQuads: [], addQuads: [
+        @graph.Quad(note, U(':setting'), setting, U(@song))
+        @graph.Quad(setting, U(':effectAttr'), attr, U(@song))
+        @graph.Quad(setting, U(':value'), value, U(@song))
+        ]}
+      @graph.applyAndSendPatch(patch)
+    
+  update: ->
+    console.time('attrs update')
+    U = (x) => @graph.Uri(x)
+    @effectStr = @graph.uriValue(@uri, U(':effectClass'))?.value
+    @noteLabel = @uri.value.replace(/.*\//, '')
+    existingColorScaleSetting = null
+    for setting in @graph.objects(@uri, U(':setting'))
+      ea = @graph.uriValue(setting, U(':effectAttr'))
+      value = @graph.stringValue(setting, U(':value'))
+      if ea.equals(U(':colorScale'))
+        @colorScaleFromGraph = value
+        @colorScale = value
+        existingColorScaleSetting = setting
+    if existingColorScaleSetting == null
+      @colorScaleFromGraph = '#ffffff'
+      @colorScale = '#ffffff'
+    console.timeEnd('attrs update')
+
+  onDel: ->
+    @project.deleteNote(@graph.Uri(@song), @uri, @selection)
+)