Files
@ ac55319a2eac
Branch filter:
Location: light9/web/timeline/Project.coffee - annotation
ac55319a2eac
3.2 KiB
text/coffeescript
don't drop patches that arrive before we get WS connected
4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 | log = debug('timeline')
debug.enable('*')
Drawing = window.Drawing
ROW_COUNT = 7
class Project
constructor: (@graph) ->
makeEffect: (uri) ->
U = (x) => @graph.Uri(x)
effect = U(uri.value + '/effect')
quad = (s, p, o) => @graph.Quad(s, p, o, effect)
quads = [
quad(effect, U('rdf:type'), U(':Effect')),
quad(effect, U(':copiedFrom'), uri),
quad(effect, U('rdfs:label'), @graph.Literal(uri.replace(/.*capture\//, ''))),
quad(effect, U(':publishAttr'), U(':strength')),
]
fromSettings = @graph.objects(uri, U(':setting'))
toSettings = @graph.nextNumberedResources(effect + '_set', fromSettings.length)
for fs in fromSettings
ts = toSettings.pop()
# full copies of these since I may have to delete captures
quads.push(quad(effect, U(':setting'), ts))
quads.push(quad(ts, U(':device'), @graph.uriValue(fs, U(':device'))))
quads.push(quad(ts, U(':deviceAttr'), @graph.uriValue(fs, U(':deviceAttr'))))
try
quads.push(quad(ts, U(':value'), @graph.uriValue(fs, U(':value'))))
catch
quads.push(quad(ts, U(':scaledValue'), @graph.uriValue(fs, U(':scaledValue'))))
@graph.applyAndSendPatch({delQuads: [], addQuads: quads})
return effect
makeNewNote: (song, effect, dropTime, desiredWidthT) ->
U = (x) => @graph.Uri(x)
quad = (s, p, o) => @graph.Quad(s, p, o, song)
newNote = @graph.nextNumberedResource("#{song.value}/n")
newCurve = @graph.nextNumberedResource("#{newNote.value}c")
points = @graph.nextNumberedResources("#{newCurve.value}p", 4)
curveQuads = [
quad(song, U(':note'), newNote)
quad(newNote, U('rdf:type'), U(':Note'))
quad(newNote, U(':originTime'), @graph.LiteralRoundedFloat(dropTime))
quad(newNote, U(':effectClass'), effect)
quad(newNote, U(':curve'), newCurve)
quad(newCurve, U('rdf:type'), U(':Curve'))
# todo: maybe shoudl be :effectAttr?
quad(newCurve, U(':attr'), U(':strength'))
]
pointQuads = []
for i in [0...4]
pt = points[i]
pointQuads.push(quad(newCurve, U(':point'), pt))
pointQuads.push(quad(pt, U(':time'), @graph.LiteralRoundedFloat(i/3 * desiredWidthT)))
pointQuads.push(quad(pt, U(':value'), @graph.LiteralRoundedFloat(i == 1 or i == 2)))
patch = {
delQuads: []
addQuads: curveQuads.concat(pointQuads)
}
@graph.applyAndSendPatch(patch)
getCurvePoints: (curve, xOffset) ->
worldPts = []
uris = @graph.objects(curve, @graph.Uri(':point'))
for pt in uris
tm = @graph.floatValue(pt, @graph.Uri(':time'))
val = @graph.floatValue(pt, @graph.Uri(':value'))
v = $V([xOffset + tm, val])
v.uri = pt
worldPts.push(v)
worldPts.sort((a,b) -> a.e(1) - b.e(1))
return [uris, worldPts]
curveWidth: (worldPts) ->
tMin = @graph.floatValue(worldPts[0].uri, @graph.Uri(':time'))
tMax = @graph.floatValue(worldPts[3].uri, @graph.Uri(':time'))
tMax - tMin
deleteNote: (song, note, selection) ->
patch = {delQuads: [@graph.Quad(song, graph.Uri(':note'), note, song)], addQuads: []}
@graph.applyAndSendPatch(patch)
if note in selection.selected()
selection.selected(_.without(selection.selected(), note))
|