codecombat/app/views/editor/level/systems_tab_view.coffee
dpen2000 de69f740e4 Fix deltas referring to last system saved
If a system is added, it is added to treema at the end of the list of systems. Treema then raises it's changed event resulting in this order being set on the level. The next time a system is added, the first system is in it's correct position and so the delta shows it as moving. This changes ensures we save the correct order in the first instance.
2014-04-19 19:59:21 -04:00

179 lines
7 KiB
CoffeeScript

View = require 'views/kinds/CocoView'
template = require 'templates/editor/level/systems_tab'
Level = require 'models/Level'
LevelSystem = require 'models/LevelSystem'
LevelSystemEditView = require './system/edit'
LevelSystemNewView = require './system/new'
LevelSystemAddView = require './system/add'
{ThangTypeNode} = require './treema_nodes'
module.exports = class SystemsTabView extends View
id: "editor-level-systems-tab-view"
template: template
className: 'tab-pane'
startsLoading: true
subscriptions:
'level-system-added': 'onLevelSystemAdded'
'edit-level-system': 'editLevelSystem'
'level-system-edited': 'onLevelSystemEdited'
'level-system-editing-ended': 'onLevelSystemEditingEnded'
'level-loaded': 'onLevelLoaded'
events:
'click #add-system-button': 'addLevelSystem'
'click #create-new-system-button': 'createNewLevelSystem'
'click #create-new-system': 'createNewLevelSystem'
constructor: (options) ->
super options
@toLoad = 0
for system in @buildDefaultSystems()
url = "/db/level.system/#{system.original}/version/#{system.majorVersion}"
ls = new LevelSystem()
ls.saveBackups = true
do (url) -> ls.url = -> url
continue if @supermodel.getModelByURL ls.url
ls.fetch()
@listenToOnce ls, 'sync', @onSystemLoaded
++@toLoad
@onDefaultSystemsLoaded() unless @toLoad
onSystemLoaded: (ls) ->
@supermodel.addModel ls
--@toLoad
@onDefaultSystemsLoaded() unless @toLoad
onDefaultSystemsLoaded: ->
@startsLoading = false
@render() # do it again but without the loading screen
@onLevelLoaded level: @level if @level
onLevelLoaded: (e) ->
@level = e.level
return if @startsLoading
@buildSystemsTreema()
buildSystemsTreema: ->
systems = $.extend(true, [], @level.get('systems') ? [])
unless systems.length
systems = @buildDefaultSystems()
insertedDefaults = true
systems = @getSortedByName systems
treemaOptions =
# TODO: somehow get rid of the + button, or repurpose it to open the LevelSystemAddView instead
supermodel: @supermodel
schema: Level.schema.properties.systems
data: systems
readOnly: true unless me.isAdmin() or @level.hasWriteAccess(me)
callbacks:
change: @onSystemsChanged
select: @onSystemSelected
nodeClasses:
'level-system': LevelSystemNode
'level-system-configuration': LevelSystemConfigurationNode
'thang-type': ThangTypeNode # Not until we actually want CocoSprite IndieSprites
@systemsTreema = @$el.find('#systems-treema').treema treemaOptions
@systemsTreema.build()
@systemsTreema.open()
@onSystemsChanged() if insertedDefaults
onSystemsChanged: (e) =>
systems = @getSortedByName @systemsTreema.data
@level.set 'systems', systems
getSortedByName: (systems) =>
systemModels = @supermodel.getModels LevelSystem
systemModelMap = {}
systemModelMap[sys.get('original')] = sys.get('name') for sys in systemModels
_.sortBy systems, (sys) -> systemModelMap[sys.original]
onSystemSelected: (e, selected) =>
selected = if selected.length > 1 then selected[0].getLastSelectedTreema() else selected[0]
unless selected
@removeSubView @levelSystemEditView if @levelSystemEditView
@levelSystemEditView = null
return
until selected.data.original
selected = selected.parent
@editLevelSystem original: selected.data.original, majorVersion: selected.data.majorVersion
onLevelSystemAdded: (e) ->
@systemsTreema.insert '/', e.system
addLevelSystem: (e) ->
@openModalView new LevelSystemAddView supermodel: @supermodel, extantSystems: _.cloneDeep @systemsTreema.data
Backbone.Mediator.publish 'level:view-switched', e
createNewLevelSystem: (e) ->
@openModalView new LevelSystemNewView supermodel: @supermodel
Backbone.Mediator.publish 'level:view-switched', e
editLevelSystem: (e) ->
@levelSystemEditView = @insertSubView new LevelSystemEditView(original: e.original, majorVersion: e.majorVersion, supermodel: @supermodel)
onLevelSystemEdited: (e) ->
Backbone.Mediator.publish 'level-systems-changed', systemsData: @systemsTreema.data
onLevelSystemEditingEnded: (e) ->
@removeSubView @levelSystemEditView
@levelSystemEditView = null
buildDefaultSystems: ->
[
{original: "528112c00268d018e3000008", majorVersion: 0} # Event
{original: "5280f83b8ae1581b66000001", majorVersion: 0, config: {lifespan: 60}} # Existence
{original: "5281146f0268d018e3000014", majorVersion: 0} # Programming
{original: "528110f30268d018e3000001", majorVersion: 0} # AI
{original: "52810ffa33e01a6e86000012", majorVersion: 0} # Action
{original: "528114b20268d018e3000017", majorVersion: 0} # Targeting
{original: "528105f833e01a6e86000007", majorVersion: 0} # Collision
{original: "528113240268d018e300000c", majorVersion: 0, config: {gravity: 9.81}} # Movement
{original: "528112530268d018e3000007", majorVersion: 0} # Combat
{original: "52810f4933e01a6e8600000c", majorVersion: 0} # Hearing
{original: "528115040268d018e300001b", majorVersion: 0} # Vision
{original: "5280dc4d251616c907000001", majorVersion: 0} # Inventory
{original: "528111b30268d018e3000004", majorVersion: 0} # Alliance
{original: "528114e60268d018e300001a", majorVersion: 0} # UI
{original: "528114040268d018e3000011", majorVersion: 0} # Physics
]
class LevelSystemNode extends TreemaObjectNode
valueClass: 'treema-level-system'
constructor: ->
super(arguments...)
@grabDBComponent()
@collection = @system?.attributes?.configSchema?.properties?
grabDBComponent: ->
unless _.isString @data.original
return alert('Press the "Add System" button at the bottom instead of the "+". Sorry.')
@system = @settings.supermodel.getModelByOriginalAndMajorVersion LevelSystem, @data.original, @data.majorVersion
#@system = _.find @settings.supermodel.getModels(LevelSystem), (m) =>
# m.get('original') is @data.original and m.get('version').major is @data.majorVersion
console.error "Couldn't find system for", @data.original, @data.majorVersion, "from models", @settings.supermodel.models unless @system
getChildSchema: (key) ->
return @system.attributes.configSchema if key is 'config'
return super(key)
buildValueForDisplay: (valEl) ->
return super valEl unless @data.original and @system
name = "#{@system.get('name')} v#{@system.get('version').major}"
@buildValueForDisplaySimply valEl, "#{name}"
onEnterPressed: (e) ->
super e
Backbone.Mediator.publish 'edit-level-system', original: @data.original, majorVersion: @data.majorVersion
open: (depth) ->
super depth
cTreema = @childrenTreemas.config
if cTreema? and (cTreema.getChildren().length or cTreema.canAddChild())
cTreema.open()
# No easy way to flatten the config object, so for now just keep it longer than it needs to be
class LevelSystemConfigurationNode extends TreemaObjectNode
valueClass: 'treema-level-system-configuration'
buildValueForDisplay: (valEl) ->
return