Starting more work on integrating additional languages. Improved Component code editing performance with a trusty debounce.

This commit is contained in:
Nick Winter 2014-06-17 22:17:44 -07:00
parent 4bd02ba6dc
commit 59654da24b
4 changed files with 30 additions and 15 deletions

View file

@ -25,6 +25,7 @@ module.exports = class LevelComponentEditView extends View
super options
@levelComponent = @supermodel.getModelByOriginalAndMajorVersion LevelComponent, options.original, options.majorVersion or 0
console.log "Couldn't get levelComponent for", options, "from", @supermodel.models unless @levelComponent
@onEditorChange = _.debounce @onEditorChange, 1500
getRenderData: (context={}) ->
context = super(context)
@ -95,6 +96,7 @@ module.exports = class LevelComponentEditView extends View
@editor.on('change', @onEditorChange)
onEditorChange: =>
return if @destroyed
@levelComponent.set 'code', @editor.getValue()
Backbone.Mediator.publish 'level-component-edited', levelComponent: @levelComponent
null

View file

@ -35,13 +35,13 @@ module.exports = class ComponentsTabView extends View
componentModels = @supermodel.getModels LevelComponent
componentModelMap = {}
componentModelMap[comp.get('original')] = comp for comp in componentModels
componentModelMap[comp.get('original')] = comp for comp in componentModels
components = ({original: key.split('.')[0], majorVersion: parseInt(key.split('.')[1], 10), thangs: value, count: value.length} for key, value of @presentComponents)
treemaData = _.sortBy components, (comp) ->
comp = componentModelMap[comp.original]
res = [comp.get('system'), comp.get('name')]
return res
treemaOptions =
supermodel: @supermodel
schema: {type: 'array', items: {type: 'object', format: 'level-component'}}

View file

@ -18,23 +18,19 @@ module.exports = class Spell
@supermodel = options.supermodel
@skipProtectAPI = options.skipProtectAPI
@worker = options.worker
p = options.programmableMethod
p = options.programmableMethod
@languages = p.languages ? {}
@languages.javascript ?= p.source
@name = p.name
@permissions = read: p.permissions?.read ? [], readwrite: p.permissions?.readwrite ? [] # teams
teamSpells = @session.get('teamSpells')
team = @session.get('team') ? 'humans'
@useTranspiledCode = @permissions.readwrite.length and ((teamSpells and not _.contains(teamSpells[team], @spellKey)) or (@session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions'))) or @spectateView)
if @useTranspiledCode
console.log "#{@spellKey} is using transpiled code because permissions.readwrite is #{@permissions.readwrite}
#{if @spectateView then ', we are spectating' else ''}
#{if teamSpells and not _.contains(teamSpells[team], @spellKey) then ', teamSpells[' + team + '] does not have ' + @spellKey + ' (just ' + teamSpells[team] + ')' else ''}
#{if @session.get('creator') isnt me.id then ', and the session was created by ' + @session.get('creator') + ' but I am ' + me.id else ''}"
@source = @originalSource = p.source
@setLanguage if @canWrite() then options.language else 'javascript'
@useTranspiledCode = @shouldUseTranspiledCode()
@source = @originalSource
@parameters = p.parameters
if @permissions.readwrite.length and sessionSource = @session.getSourceFor(@spellKey)
@source = sessionSource
@language = if @canWrite() then options.language else 'javascript'
@thangs = {}
@view = new SpellView {spell: @, session: @session, worker: @worker}
@view.render() # Get it ready and code loaded in advance
@ -49,6 +45,9 @@ module.exports = class Spell
@thangs = null
@worker = null
setLanguage: (@language) ->
@originalSource = @languages[language] ? @languages.javascript
addThang: (thang) ->
if @thangs[thang.id]
@thangs[thang.id].thang = thang
@ -155,3 +154,14 @@ module.exports = class Spell
toString: ->
"<Spell: #{@spellKey}>"
shouldUseTranspiledCode: ->
# Determine whether this code has already been transpiled, or whether it's raw source needing transpilation.
return false unless @permissions.readwrite.length # Only player-writable code will be stored transpiled.
return true if @spectateView # Use transpiled code for both teams if we're just spectating.
teamSpells = @session.get('teamSpells')
team = @session.get('team') ? 'humans'
return true if teamSpells and not _.contains(teamSpells[team], @spellKey) # Use transpiled for enemy spells.
# Players without permissions can't view the raw code.
return true if @session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions'))
false

View file

@ -619,8 +619,11 @@ module.exports = class SpellView extends View
@ace.setKeyboardHandler @keyBindings[aceConfig.keyBindings ? 'default']
onChangeLanguage: (e) ->
if @spell.canWrite()
@aceSession.setMode @editModes[e.language]
return unless @spell.canWrite()
@aceSession.setMode @editModes[e.language]
wasDefault = @getSource() is @spell.originalSource
@spell.setLanguage e.language
@reloadCode true if wasDefault
dismiss: ->
@spell.hasChangedSignificantly @getSource(), null, (hasChanged) =>