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.
asciinema.org/app/assets/javascripts/player/views/player_view.js.coffee

118 lines
3.2 KiB
CoffeeScript

class AsciiIo.PlayerView extends Backbone.View
events:
'click .start-prompt': 'onStartPromptClick'
initialize: (options) ->
@createMainWorker()
@createRendererView()
@showLoadingIndicator()
@createHudView() if options.hud
12 years ago
@fetchModel()
createRendererView: ->
@rendererView = new @options.rendererClass(
cols: @options.cols
lines: @options.lines
)
@$el.append(@rendererView.$el)
@rendererView.afterInsertedToDom()
@rendererView.renderSnapshot @options.snapshot
createHudView: ->
@hudView = new AsciiIo.HudView(cols: @options.cols)
@$el.append @hudView.$el
12 years ago
fetchModel: ->
@model.fetch success: => @onModelFetched()
12 years ago
onModelFetched: ->
data = atob @model.get('escaped_stdout_data')
worker = new Worker(window.unpackWorkerPath)
12 years ago
worker.onmessage = (event) =>
@model.set stdout_data: event.data
@onModelReady()
worker.postMessage data
onModelReady: ->
@hideLoadingIndicator()
@hudView.setDuration @model.get('duration') if @options.hud
@setupMainWorker()
@bindEvents()
if @options.autoPlay
12 years ago
@movie.call 'play'
else
@showToggleOverlay()
createMainWorker: ->
12 years ago
@workerProxy = new AsciiIo.WorkerProxy(window.mainWorkerPath)
12 years ago
setupMainWorker: ->
12 years ago
@workerProxy.init
12 years ago
timing: @model.get 'stdout_timing_data'
stdout_data: @model.get 'stdout_data'
duration: @model.get 'duration'
speed: @options.speed
12 years ago
benchmark: @options.benchmark
cols: @options.cols
lines: @options.lines
12 years ago
@movie = @workerProxy.getObjectProxy 'movie'
@vt = @workerProxy.getObjectProxy 'vt'
bindEvents: ->
@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
if @options.hud
@movie.on 'time', (time) => @hudView.updateTime(time)
@movie.on 'render', (state) => @rendererView.render state
@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
<<<<<<< HEAD
if @options.hud
@hudView.on 'play-click', => @movie.call 'togglePlay'
12 years ago
@hudView.on 'seek-click', (percent) => @movie.call 'seek', percent
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.call 'togglePlay'
12 years ago
showLoadingIndicator: ->
@$el.append('<div class="loading">')
hideLoadingIndicator: ->
@$('.loading').remove()
showToggleOverlay: ->
@$el.append('<div class="start-prompt"><div class="play-button"><div class="arrow">►</div></div></div>')
hideToggleOverlay: ->
@$('.start-prompt').remove()