Mercurial > code > home > repos > light9
changeset 1319:a6259ab66885
another pass at adjusters making rdf patches.
Ignore-this: dcb7b1081c90bbf3dfa9ed17cd02226a
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Fri, 03 Jun 2016 21:43:22 +0000 |
parents | 0bda9a9282c2 |
children | f40b1796d956 |
files | light9/web/timeline-elements.html light9/web/timeline.coffee show/dance2016/timelinedemo.n3 |
diffstat | 3 files changed, 120 insertions(+), 49 deletions(-) [+] |
line wrap: on
line diff
--- a/light9/web/timeline-elements.html Fri Jun 03 21:42:04 2016 +0000 +++ b/light9/web/timeline-elements.html Fri Jun 03 21:43:22 2016 +0000 @@ -378,9 +378,9 @@ -webkit-user-select: none; } </style> - <table id="top" style$="left: {{centerStyle.x}}px; top: {{centerStyle.y}}px"> + <table id="top" style$="left: [[centerStyle.x]]px; top: [[centerStyle.y]]px"> <tr><td></td><td>↑</td><td></td></tr> - <tr><td>←</td><td><span id="label">{{value}}</span></td><td>→</td></tr> + <tr><td>←</td><td><span id="label">[[displayValue]]</span></td><td>→</td></tr> <tr><td></td><td>↓</td><td></td></tr> </table> @@ -402,7 +402,7 @@ </dom-module> <script src="/lib/sylvester/sylvester.js"></script> -<script src="/lib/d3/d3.js"></script> +<script src="/lib/d3/build/d3.js"></script> <script src="/lib/N3.js/browser/n3-browser.js"></script> <script src="graph.js"></script> <script src="timeline.js"></script>
--- a/light9/web/timeline.coffee Fri Jun 03 21:42:04 2016 +0000 +++ b/light9/web/timeline.coffee Fri Jun 03 21:43:22 2016 +0000 @@ -1,4 +1,4 @@ - +log = console.log window.graph = new SyncedGraph('noServerYet', { '': 'http://light9.bigasterisk.com/', 'xsd', 'http://www.w3.org/2001/XMLSchema#', @@ -9,16 +9,71 @@ @prefix dev: <http://light9.bigasterisk.com/device/> . <http://example.com/> { - :demoResource :startTime 0.5 . + :demoResource :startTime 0.5; :endTime 1.6 . } ") class Adjustable - # + # Some value you can edit in the UI, probably by dragging stuff. May + # have a <light9-timeline-adjuster> associated. This object does the + # layout and positioning. constructor: (@config) -> - @center = @config.getTarget().add(@config.getSuggestedTargetOffset()) - @getValue = @config.getValue + @_center = @config.getTarget().add(@config.getSuggestedTargetOffset()) + + getDisplayValue: () -> + # todo + d3.format(".4g")(@config.getValue()) + + getCenter: () -> # vec2 of pixels + @_center + + getTarget: () -> # vec2 of pixels + @config.getTarget() + + subscribe: (onChange) -> + # change could be displayValue or center or target. This likely + # calls onChange right away if there's any data yet. + + + startDrag: () -> + # todo + @dragStartValue = @getValue() + + continueDrag: (pos) -> + # pos is vec2 of pixels relative to the drag start + + # todo + newValue = @dragStartValue + pos.e(0) * .1 + graph.patchObject(@_subj, @_pred, graph.Literal(newValue), @_ctx) + + endDrag: () -> + 0 + +class AdjustableFloatObject extends Adjustable + constructor: (@config) -> + # config has graph, subj, pred, ctx + super(@config) + + getValue: () -> # for drag math + @config.graph.floatValue(@config.subj, @config.pred) + + getCenter: () -> + + $V([100 + 200 * @getValue(), 200]) + + getDisplayValue: () -> + d3.format(".4g")(@getValue()) + + subscribe: (onChange) -> + @config.graph.subscribe @config.subj, @config.pred, null, (patch) => + onChange() + + continueDrag: (pos) -> + # pos is vec2 of pixels relative to the drag start + + newValue = @dragStartValue + pos.e(1) / 200 + @config.graph.patchObject(@config.subj, @config.pred, @config.graph.Literal(newValue), @_ctx) Polymer @@ -35,7 +90,7 @@ cursor: t: 105 - @fullZoomX = d3.scale.linear().domain([0, @viewState.zoomSpec.duration]).range([0, @offsetWidth]) + @fullZoomX = d3.scaleLinear().domain([0, @viewState.zoomSpec.duration]).range([0, @offsetWidth]) animCursor = () => @viewState.cursor.t = 130 + 20 * Math.sin(Date.now() / 2000) @@ -48,21 +103,29 @@ setInterval(animCursor, 50) setTimeout(() => - @adjs = @persistDemo() #@makeZoomAdjs().concat(@persistDemo()) - , 3000) - + @adjs = @persistDemo()#@makeZoomAdjs().concat(@persistDemo()) + , 100) persistDemo: -> - adj = new Adjustable({ - getValue: () => (graph.floatValue( - graph.Uri(':demoResource'), - graph.Uri(':startTime'))) - getTarget: () => $V([200, 300]) - getSuggestedTargetOffset: () => $V([-30, 0]) + ctx = graph.Uri('http://example.com/') + return [ + new AdjustableFloatObject({ + graph: graph + subj: graph.Uri(':demoResource') + pred: graph.Uri(':startTime') + ctx: ctx + getTarget: () => $V([200, 300]) + getSuggestedTargetOffset: () => $V([-30, 0]) }) - console.log(adj.config.getValue()) - - return [adj] + new AdjustableFloatObject({ + graph: graph + subj: graph.Uri(':demoResource') + pred: graph.Uri(':endTime') + ctx: ctx + getTarget: () => $V([300, 300]) + getSuggestedTargetOffset: () => $V([30, 0]) + }) + ] makeZoomAdjs: -> left = new Adjustable({ @@ -85,40 +148,30 @@ adj: type: Object notify: true + observer: 'onAdj' target: type: Object notify: true - value: + displayValue: type: String - computed: '_value(adj.value)' centerStyle: - computed: '_centerStyle(adj.center)' + type: Object - _value: (adjValue) -> - d3.format(".4g")(adjValue) - - _centerStyle: (center) -> - { - x: center.e(1) - y: center.e(2) - } - - ready: -> - subj = graph.Uri(':demoResource') - pred = graph.Uri(':startTime') - ctx = graph.Uri('http://example.com/') - graph.subscribe subj, pred, null, (patch) => - for q in patch.addQuads - @set('adj.value', graph.toJs(q.object)) - - drag = d3.behavior.drag() + onAdj: (adj) -> + console.log('adj is here', adj, @adj) + @adj.subscribe () => + @displayValue = @adj.getDisplayValue() + center = @adj.getCenter() + @centerStyle = {x: center.e(1), y: center.e(2)} + + attached: -> + drag = d3.drag() sel = d3.select(@$.label) sel.call(drag) - drag.origin((d) -> {x: @offsetLeft, y: @offsetTop}) - drag.on 'dragstart', () => - drag._startValue = @adj.getValue() - + drag.subject((d) -> {x: @offsetLeft, y: @offsetTop}) + drag.container(@offsetParent) + drag.on('start', () => @adj?.startDrag()) drag.on 'drag', () => - console.log('drag', d3.event) - newValue = drag._startValue + d3.event.x * .1 - graph.patchObject(subj, pred, graph.Literal(newValue), ctx) + @adj?.continueDrag($V([d3.event.x, d3.event.y])) + drag.on('end', () => @adj?.endDrag()) + \ No newline at end of file
--- a/show/dance2016/timelinedemo.n3 Fri Jun 03 21:42:04 2016 +0000 +++ b/show/dance2016/timelinedemo.n3 Fri Jun 03 21:43:22 2016 +0000 @@ -0,0 +1,18 @@ +@prefix : <http://light9.bigasterisk.com/> . +@prefix effect: <http://light9.bigasterisk.com/effect/> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix dev: <http://light9.bigasterisk.com/device/> . + +:song1 a :Timeline; + :note :n1 . +:n1 + :fadeIn 1.3; + :start 1.5; + :endSustain 2.0; + :endRelease 2.4; + :effectClass :usa; + :attrOverride :ao0, :ao1 . +:ao0 :effectAttr :chaseTempo; :value 100 . +:a01 :effectAttr :chaseOffset; :value 0.12 . + +