You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.2 KiB
CoffeeScript
118 lines
3.2 KiB
CoffeeScript
13 years ago
|
class AsciiIo.PlayerView extends Backbone.View
|
||
13 years ago
|
events:
|
||
|
'click .start-prompt': 'onStartPromptClick'
|
||
13 years ago
|
|
||
13 years ago
|
initialize: (options) ->
|
||
12 years ago
|
@createMainWorker()
|
||
13 years ago
|
@createRendererView()
|
||
12 years ago
|
@showLoadingIndicator()
|
||
12 years ago
|
@createHudView() if options.hud
|
||
12 years ago
|
@fetchModel()
|
||
13 years ago
|
|
||
|
createRendererView: ->
|
||
12 years ago
|
@rendererView = new @options.rendererClass(
|
||
|
cols: @options.cols
|
||
|
lines: @options.lines
|
||
13 years ago
|
)
|
||
|
|
||
13 years ago
|
@$el.append(@rendererView.$el)
|
||
|
@rendererView.afterInsertedToDom()
|
||
13 years ago
|
@rendererView.renderSnapshot @options.snapshot
|
||
13 years ago
|
|
||
|
createHudView: ->
|
||
12 years ago
|
@hudView = new AsciiIo.HudView(cols: @options.cols)
|
||
12 years ago
|
@$el.append @hudView.$el
|
||
13 years ago
|
|
||
12 years ago
|
fetchModel: ->
|
||
|
@model.fetch success: => @onModelFetched()
|
||
13 years ago
|
|
||
12 years ago
|
onModelFetched: ->
|
||
12 years ago
|
data = atob @model.get('escaped_stdout_data')
|
||
12 years ago
|
worker = new Worker(window.unpackWorkerPath)
|
||
12 years ago
|
|
||
|
worker.onmessage = (event) =>
|
||
|
@model.set stdout_data: event.data
|
||
|
@onModelReady()
|
||
|
|
||
|
worker.postMessage data
|
||
|
|
||
|
onModelReady: ->
|
||
|
@hideLoadingIndicator()
|
||
12 years ago
|
@hudView.setDuration @model.get('duration') if @options.hud
|
||
12 years ago
|
@setupMainWorker()
|
||
13 years ago
|
@bindEvents()
|
||
|
|
||
|
if @options.autoPlay
|
||
|
@movie.play()
|
||
|
else
|
||
13 years ago
|
@showToggleOverlay()
|
||
13 years ago
|
|
||
12 years ago
|
createMainWorker: ->
|
||
12 years ago
|
@worker = new Worker(window.mainWorkerPath)
|
||
12 years ago
|
|
||
12 years ago
|
setupMainWorker: ->
|
||
12 years ago
|
@worker.postMessage
|
||
|
cmd: 'init'
|
||
12 years ago
|
timing: @model.get 'stdout_timing_data'
|
||
|
stdout_data: @model.get 'stdout_data'
|
||
|
duration: @model.get 'duration'
|
||
12 years ago
|
speed: @options.speed
|
||
12 years ago
|
benchmark: @options.benchmark
|
||
|
cols: @options.cols
|
||
|
lines: @options.lines
|
||
|
|
||
12 years ago
|
@vt = new AsciiIo.VTWorkerProxy @worker, 'vt'
|
||
|
@movie = new AsciiIo.MovieWorkerProxy @worker, 'movie'
|
||
12 years ago
|
|
||
12 years ago
|
bindEvents: ->
|
||
12 years ago
|
@movie.on 'started', => @$el.addClass 'playing'
|
||
|
@movie.on 'finished', => @$el.removeClass 'playing'
|
||
|
|
||
|
@movie.on 'paused', =>
|
||
|
@$el.addClass 'paused'
|
||
|
@$el.removeClass 'playing'
|
||
|
@hudView.onPause() if @options.hud
|
||
|
|
||
|
@movie.on 'resumed', =>
|
||
|
@$el.addClass 'playing'
|
||
|
@$el.removeClass 'paused'
|
||
|
@hudView.onResume() if @options.hud
|
||
|
|
||
12 years ago
|
if @options.hud
|
||
|
@movie.on 'time', (time) => @hudView.updateTime(time)
|
||
|
|
||
12 years ago
|
@movie.on 'render', (state) => @rendererView.render state
|
||
12 years ago
|
|
||
|
@vt.on 'cursor:blink:restart', => @rendererView.restartCursorBlink()
|
||
|
@vt.on 'cursor:blink:stop', => @rendererView.stopCursorBlink()
|
||
|
@vt.on 'cursor:show', => @rendererView.showCursor true
|
||
|
@vt.on 'cursor:hide', => @rendererView.showCursor false
|
||
|
|
||
12 years ago
|
if @options.hud
|
||
|
@hudView.on 'play-click', => @movie.togglePlay()
|
||
|
@hudView.on 'seek-click', (percent) => @movie.seek(percent)
|
||
13 years ago
|
|
||
12 years ago
|
if @options.benchmark
|
||
|
@movie.on 'started', =>
|
||
|
@startedAt = (new Date).getTime()
|
||
|
|
||
|
@movie.on 'finished', =>
|
||
|
now = (new Date).getTime()
|
||
|
console.log "finished in #{(now - @startedAt) / 1000.0}s"
|
||
|
|
||
12 years ago
|
onStartPromptClick: ->
|
||
|
@hideToggleOverlay()
|
||
|
@movie.togglePlay()
|
||
|
|
||
13 years ago
|
showLoadingIndicator: ->
|
||
|
@$el.append('<div class="loading">')
|
||
|
|
||
|
hideLoadingIndicator: ->
|
||
|
@$('.loading').remove()
|
||
|
|
||
|
showToggleOverlay: ->
|
||
12 years ago
|
@$el.append('<div class="start-prompt"><div class="play-button"><div class="arrow">►</div></div></div>')
|
||
13 years ago
|
|
||
|
hideToggleOverlay: ->
|
||
|
@$('.start-prompt').remove()
|