mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-11 00:02:19 -05:00
101 lines
3.8 KiB
CoffeeScript
101 lines
3.8 KiB
CoffeeScript
|
View = require 'views/kinds/RootView'
|
||
|
template = require 'templates/editor/level/edit'
|
||
|
Level = require 'models/Level'
|
||
|
LevelSystem = require 'models/LevelSystem'
|
||
|
World = require 'lib/world/world'
|
||
|
DocumentFiles = require 'collections/DocumentFiles'
|
||
|
|
||
|
ThangsTabView = require './thangs_tab_view'
|
||
|
SettingsTabView = require './settings_tab_view'
|
||
|
ScriptsTabView = require './scripts_tab_view'
|
||
|
ComponentsTabView = require './components_tab_view'
|
||
|
SystemsTabView = require './systems_tab_view'
|
||
|
LevelSaveView = require './save_view'
|
||
|
LevelForkView = require './fork_view'
|
||
|
|
||
|
module.exports = class EditorLevelView extends View
|
||
|
id: "editor-level-view"
|
||
|
template: template
|
||
|
startsLoading: true
|
||
|
cache: false
|
||
|
|
||
|
events:
|
||
|
'click #play-button': 'onPlayLevel'
|
||
|
'click #commit-level-start-button': 'startCommittingLevel'
|
||
|
'click #fork-level-start-button': 'startForkingLevel'
|
||
|
|
||
|
constructor: (options, @levelID) ->
|
||
|
super options
|
||
|
@supermodel.once 'loaded-all', @onAllLoaded
|
||
|
|
||
|
# load only the level itself and the one it points to, but no others
|
||
|
# TODO: this is duplicated in views/play/level_view.coffee; need cleaner method
|
||
|
@supermodel.shouldPopulate = (model) ->
|
||
|
@levelsLoaded ?= 0
|
||
|
@levelsLoaded += 1 if model.constructor.className is "Level"
|
||
|
return false if @levelsLoaded > 1
|
||
|
return true
|
||
|
|
||
|
@level = new Level _id: @levelID
|
||
|
@level.once 'sync', @onLevelLoaded
|
||
|
@supermodel.populateModel @level
|
||
|
|
||
|
showLoading: ($el) ->
|
||
|
$el ?= @$el.find('.tab-content')
|
||
|
super($el)
|
||
|
|
||
|
onLevelLoaded: =>
|
||
|
@files = new DocumentFiles(@level)
|
||
|
@files.fetch()
|
||
|
|
||
|
onAllLoaded: =>
|
||
|
@originalLevelAttributes = _.cloneDeep @level.attributes
|
||
|
@level.unset('nextLevel') if _.isString(@level.get('nextLevel'))
|
||
|
@initWorld()
|
||
|
@startsLoading = false
|
||
|
@render() # do it again but without the loading screen
|
||
|
|
||
|
initWorld: ->
|
||
|
@world = new World @level.name
|
||
|
|
||
|
getRenderData: (context={}) =>
|
||
|
context = super(context)
|
||
|
context.level = @level
|
||
|
context
|
||
|
|
||
|
afterRender: ->
|
||
|
return if @startsLoading
|
||
|
super()
|
||
|
new LevelSystem # temp; trigger the LevelSystem schema to be loaded, if it isn't already
|
||
|
@$el.find('a[data-toggle="tab"]').on 'shown', (e) =>
|
||
|
Backbone.Mediator.publish 'level:view-switched', e
|
||
|
@thangsTab = @insertSubView new ThangsTabView world: @world, supermodel: @supermodel
|
||
|
@settingsTab = @insertSubView new SettingsTabView world: @world, supermodel: @supermodel
|
||
|
@scriptsTab = @insertSubView new ScriptsTabView world: @world, supermodel: @supermodel, files: @files
|
||
|
@componentsTab = @insertSubView new ComponentsTabView supermodel: @supermodel
|
||
|
@systemsTab = @insertSubView new SystemsTabView supermodel: @supermodel
|
||
|
Backbone.Mediator.publish 'level-loaded', level: @level
|
||
|
|
||
|
onPlayLevel: (e) ->
|
||
|
sendLevel = =>
|
||
|
@childWindow.Backbone.Mediator.publish 'level-reload-from-data', level: @level, supermodel: @supermodel
|
||
|
if @childWindow and not @childWindow.closed
|
||
|
# Reset the LevelView's world, but leave the rest of the state alone
|
||
|
sendLevel()
|
||
|
else
|
||
|
# Create a new Window with a blank LevelView
|
||
|
scratchLevelID = @level.get('slug') + "?dev=true"
|
||
|
@childWindow = window.open("/play/level/#{scratchLevelID}", 'child_window', 'width=1024,height=560,left=10,top=10,location=0,menubar=0,scrollbars=0,status=0,titlebar=0,toolbar=0', true)
|
||
|
@childWindow.onPlayLevelViewLoaded = (e) => sendLevel() # still a hack
|
||
|
@childWindow.focus()
|
||
|
|
||
|
startCommittingLevel: (e) ->
|
||
|
levelSaveView = new LevelSaveView level: @level, supermodel: @supermodel, originalLevelAttributes: @originalLevelAttributes
|
||
|
@openModalView levelSaveView
|
||
|
Backbone.Mediator.publish 'level:view-switched', e
|
||
|
|
||
|
startForkingLevel: (e) ->
|
||
|
levelForkView = new LevelForkView level: @level
|
||
|
@openModalView levelForkView
|
||
|
Backbone.Mediator.publish 'level:view-switched', e
|