Changeset - a49ad994b467
[Not reviewed]
default
0 1 0
drewp@bigasterisk.com - 7 years ago 2018-06-08 11:08:34
drewp@bigasterisk.com
dead code rm, more debugging of settings corruption. i think it's from partially-loaded graphs
Ignore-this: 8d8f5e7367046b8e371b129b5bd1261d
1 file changed with 8 insertions and 9 deletions:
0 comments (0 inline, 0 general)
light9/web/live/live.coffee
Show inline comments
 
@@ -210,50 +210,53 @@ class ActiveSettings
 
    @keyForSetting.has(setting.value)
 

	
 
  setValue: (setting, value) ->
 
    row = @settings.get(@keyForSetting.get(setting.value))
 
    row.jsValue = value
 
    row.onChangeFunc(value) if row.onChangeFunc?
 

	
 
  registerWidget: (device, deviceAttr, graphValueChanged) ->
 
    key = device.value + " " + deviceAttr.value
 
    @onChanged[key] = graphValueChanged
 
    
 
    if @settings.has(key)
 
      row = @settings.get(key)
 
      row.onChangeFunc = graphValueChanged
 
      row.onChangeFunc(row.jsValue)
 

	
 
  effectSettingLookup: (device, attr) ->
 
    key = device.value + " " + attr.value
 
    if @settings.has(key)
 
      return @settings.get(key).setting
 

	
 
    return null
 

	
 
  deleteSetting: (setting) ->
 
    log('deleteSetting ' + setting.value)
 
    key = @keyForSetting.get(setting.value)
 
    row = @settings.get(key)
 
    if row? and not row.setting.equals(setting)
 
      throw new Error('corrupt row for ' + setting.value)
 
    row.onChangeFunc(null) if row?.onChangeFunc?
 
    @settings.delete(key)
 
    @keyForSetting.delete(setting)
 

	
 
  clear: ->
 
    new Map(@settings).forEach (row, key) ->
 
      row.onChangeFunc(null)
 
    @settings.clear()
 
    @keyForSetting.clear()
 

	
 
  forAll: (cb) ->
 
    all = Array.from(@keyForSetting.keys())
 
    for s in all
 
      cb(@graph.Uri(s))
 

	
 
  allSettingsStr: ->
 
    @keyForSetting.keys()
 

	
 
class GraphToControls
 
  # More efficient bridge between liveControl widgets and graph edits,
 
  # as opposed to letting each widget scan the graph and push lots of
 
  # tiny patches to it.
 
  constructor: (@graph) ->
 
    @activeSettings = new ActiveSettings(@graph)
 
@@ -302,69 +305,66 @@ class GraphToControls
 
      pred = valuePred(@graph, devAttr)
 
      try
 
        value = @graph.uriValue(setting, pred)
 
        if not value.id.match(/^http/)
 
          throw new Error("not uri")
 
      catch
 
        try
 
          value = @graph.floatValue(setting, pred)
 
        catch
 
          value = @graph.stringValue(setting, pred)
 
      log('change: graph contains', devAttr, value)
 

	
 
      if @activeSettings.has(setting)
 
        @activeSettings.setValue(setting, value)
 
        toClear.delete(setting.value)
 
      else
 
        @activeSettings.addSettingsRow(dev, devAttr, setting, value)
 
          
 
    for settingStr in Array.from(toClear)
 
      @activeSettings.deleteSetting(U(settingStr))
 

	
 
  clearSettings: ->
 
    @activeSettings.clear()
 

	
 
  effectSettingLookup: (device, attr) ->
 
    @activeSettings.effectSettingLookup(device, attr)
 

	
 
  register: (device, deviceAttr, graphValueChanged) ->
 
    @activeSettings.registerWidget(device, deviceAttr, graphValueChanged)
 

	
 
  shouldBeStored: (deviceAttr, value) ->
 
    # this is a bug for zoom=0, since collector will default it to
 
    # stick at the last setting if we don't explicitly send the
 
    # 0. rx/ry similar though not the exact same deal because of
 
    # their remap.
 
    return value? and value != 0 and value != '#000000'
 

	
 
  emptyEffect: ->
 
    @activeSettings.forAll(@_removeEffectSetting.bind(@))
 

	
 
  controlChanged: (device, deviceAttr, value) ->
 
    # value is float or #color or (Uri or null)
 
    if (value == undefined or (typeof value == "number" and isNaN(value)) or (typeof value == "object" and value != null and not value.id))
 
      throw new Error("controlChanged sent bad value " + value)
 
    effectSetting = @effectSettingLookup(device, deviceAttr)
 
    effectSetting = @activeSettings.effectSettingLookup(device, deviceAttr)
 
    if @shouldBeStored(deviceAttr, value)
 
      if not effectSetting?
 
        @_addEffectSetting(device, deviceAttr, value)
 
      else
 
        @_patchExistingEffectSetting(effectSetting, deviceAttr, value)
 
    else
 
      @_removeEffectSetting(effectSetting)
 

	
 
  _nodeForValue: (value) ->
 
    if value.id?
 
      return value
 
    return @graph.prettyLiteral(value)
 

	
 
  _addEffectSetting: (device, deviceAttr, value) ->
 
    log('change: _addEffectSetting', deviceAttr.value, value)
 
    U = (x) => @graph.Uri(x)
 
    quad = (s, p, o) => @graph.Quad(s, p, o, @ctx)
 
    effectSetting = @graph.nextNumberedResource(@effect.value + '_set')
 
    @activeSettings.addSettingsRow(device, deviceAttr, effectSetting, value)
 
    addQuads = [
 
      quad(@effect, U(':setting'), effectSetting),
 
      quad(effectSetting, U(':device'),  device),
 
      quad(effectSetting, U(':deviceAttr'), deviceAttr),
 
      quad(effectSetting, valuePred(@graph, deviceAttr), @_nodeForValue(value))
 
@@ -395,57 +395,56 @@ coffeeElementSetup(class Light9LiveContr
 
  @getter_properties:
 
    graph: { type: Object, notify: true }
 
    devices: { type: Array, notify: true, value: [] }
 
    # string uri of the effect being edited, or null. This is the
 
    # master value; GraphToControls follows.
 
    effectChoice: { type: String, notify: true, value: null }
 
    graphToControls: { type: Object }
 
  @getter_observers: [
 
    'onGraph(graph)'
 
    'onEffectChoice(effectChoice)'
 
    ]
 

	
 
  constructor: ->
 
    super()
 
    @graphToControls = null
 

	
 
  ready: ->
 
    super.ready()
 
    @currentSettings = {}
 

	
 
  onGraph: ->
 
    @graphToControls = new GraphToControls(@graph)
 
    @graph.runHandler(@update.bind(@), 'Light9LiveControls update')
 

	
 
    # need graph to be loaded, so we don't make double settings? not sure.
 
    setTimeout(@setFromUrl.bind(@), 1)
 

	
 
  setFromUrl: ->
 
    effect = new URL(window.location.href).searchParams.get('effect')
 
    if effect?
 
      @effectChoice = effect
 

	
 
  effectSettingLookup: (device, attr) ->
 
    if @graphToControls == null
 
      throw new Error('not ready')
 
    return @graphToControls.effectSettingLookup(device, attr)
 

	
 
  newEffect: ->
 
    @effectChoice = @graphToControls.newEffect().value
 
      
 
  onEffectChoice: ->
 
    U = (x) => @graph.Uri(x)
 
    if not @effectChoice?
 
      # unlink
 
      @graphToControls.setEffect(null) if @graphToControls?
 
    else
 
      log('load', @effectChoice)
 
      @graphToControls.setEffect(@graph.Uri(@effectChoice)) if @graphToControls?
 
 
 
  clearAll: ->
 
    # clears the effect!
 
    @graphToControls.emptyEffect()
 
    
 
  update: ->
 
    U = (x) => @graph.Uri(x)
 

	
 
    newDevs = []
 
    for dc in @graph.sortedUris(@graph.subjects(U('rdf:type'), U(':DeviceClass')))
 
      for dev in @graph.sortedUris(@graph.subjects(U('rdf:type'), dc))
 
        newDevs.push({uri: dev})
 

	
0 comments (0 inline, 0 general)