mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-27 17:45:40 -05:00
Working on the Tome displaying the proper syntax for the selected programming language. Fixed #1225.
This commit is contained in:
parent
1e9b403ce5
commit
04976a7b14
14 changed files with 113 additions and 20 deletions
|
@ -63,9 +63,6 @@ module.exports =
|
||||||
"next-game-pressed":
|
"next-game-pressed":
|
||||||
{} # TODO schema
|
{} # TODO schema
|
||||||
|
|
||||||
"focus-editor":
|
|
||||||
{} # TODO schema
|
|
||||||
|
|
||||||
"end-current-script":
|
"end-current-script":
|
||||||
{} # TODO schema
|
{} # TODO schema
|
||||||
|
|
||||||
|
@ -87,14 +84,14 @@ module.exports =
|
||||||
scriptRunning: { type: 'string' }
|
scriptRunning: { type: 'string' }
|
||||||
noteGroupRunning: { type: 'string' }
|
noteGroupRunning: { type: 'string' }
|
||||||
timeSinceLastScriptEnded: { type: 'number' }
|
timeSinceLastScriptEnded: { type: 'number' }
|
||||||
scriptStates:
|
scriptStates:
|
||||||
type: 'object'
|
type: 'object'
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
title: 'Script State'
|
title: 'Script State'
|
||||||
type: 'object'
|
type: 'object'
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
properties:
|
properties:
|
||||||
timeSinceLastEnded:
|
timeSinceLastEnded:
|
||||||
type: 'number'
|
type: 'number'
|
||||||
description: 'seconds since this script ended last'
|
description: 'seconds since this script ended last'
|
||||||
timeSinceLastTriggered:
|
timeSinceLastTriggered:
|
||||||
|
@ -143,7 +140,7 @@ module.exports =
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
properties:
|
properties:
|
||||||
showModal: { type: 'boolean' }
|
showModal: { type: 'boolean' }
|
||||||
|
|
||||||
"level-highlight-dom":
|
"level-highlight-dom":
|
||||||
type: 'object'
|
type: 'object'
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
|
@ -67,7 +67,27 @@ module.exports =
|
||||||
"tome:spell-shown":
|
"tome:spell-shown":
|
||||||
{} # TODO schema
|
{} # TODO schema
|
||||||
|
|
||||||
# TODO proposition: add tome to name
|
"tome:focus-editor":
|
||||||
"focus-editor":
|
|
||||||
{} # TODO schema
|
{} # TODO schema
|
||||||
|
|
||||||
|
"tome:change-language":
|
||||||
|
title: "Tome Change Language"
|
||||||
|
$schema: "http://json-schema.org/draft-04/schema#"
|
||||||
|
description: "Published when the Tome should update its programming language."
|
||||||
|
type: "object"
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
language:
|
||||||
|
type: "string"
|
||||||
|
required: ["language"]
|
||||||
|
|
||||||
|
"tome:spell-changed-language":
|
||||||
|
title: "Spell Changed Language"
|
||||||
|
$schema: "http://json-schema.org/draft-04/schema#"
|
||||||
|
description: "Published when an individual spell has updated its code language."
|
||||||
|
type: "object"
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
spell:
|
||||||
|
type: "object"
|
||||||
|
required: ["spell"]
|
||||||
|
|
|
@ -60,3 +60,29 @@
|
||||||
display: inline-block
|
display: inline-block
|
||||||
margin-right: 3px
|
margin-right: 3px
|
||||||
vertical-align: top
|
vertical-align: top
|
||||||
|
|
||||||
|
.code-language-logo
|
||||||
|
position: absolute
|
||||||
|
width: 20px
|
||||||
|
height: 20px
|
||||||
|
left: 12px
|
||||||
|
top: 34px
|
||||||
|
z-index: 10
|
||||||
|
background-color: transparent
|
||||||
|
background-repeat: no-repeat
|
||||||
|
background-size: contain
|
||||||
|
cursor: pointer
|
||||||
|
|
||||||
|
&.javascript
|
||||||
|
background-image: url(/images/pages/home/language_logo_javascript.png)
|
||||||
|
&.python
|
||||||
|
background-image: url(/images/pages/home/language_logo_python.png)
|
||||||
|
&.coffeescript
|
||||||
|
background-image: url(/images/pages/home/language_logo_coffeescript.png)
|
||||||
|
&.clojure
|
||||||
|
background-image: url(/images/pages/home/language_logo_clojure.png)
|
||||||
|
&.lua
|
||||||
|
background-image: url(/images/pages/home/language_logo_lua.png)
|
||||||
|
&.io
|
||||||
|
background-image: url(/images/pages/home/language_logo_io.png)
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
i.icon-chevron-down
|
i.icon-chevron-down
|
||||||
.thang-avatar-placeholder
|
.thang-avatar-placeholder
|
||||||
|
|
||||||
code #{spell.name}(#{parameters})
|
code #{methodSignature}
|
||||||
|
|
||||||
.btn.btn-small.reload-code(title="Reload original code for " + spell.name)
|
.btn.btn-small.reload-code(title="Reload original code for " + spell.name)
|
||||||
i.icon-repeat
|
i.icon-repeat
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
img(src="/images/level/code_palette_background.png").code-palette-background
|
img(src="/images/level/code_palette_background.png").code-palette-background
|
||||||
|
.code-language-logo
|
||||||
ul(class="nav nav-pills" + (tabbed ? ' multiple-tabs' : ''))
|
ul(class="nav nav-pills" + (tabbed ? ' multiple-tabs' : ''))
|
||||||
each slug, group in entryGroupSlugs
|
each slug, group in entryGroupSlugs
|
||||||
li(class=group == "this" || slug == "available-spells" ? "active" : "")
|
li(class=group == "this" || slug == "available-spells" ? "active" : "")
|
||||||
|
|
|
@ -28,7 +28,7 @@ module.exports = class ControlBarView extends View
|
||||||
'click #next-game-button': ->
|
'click #next-game-button': ->
|
||||||
Backbone.Mediator.publish 'next-game-pressed'
|
Backbone.Mediator.publish 'next-game-pressed'
|
||||||
|
|
||||||
'click': -> Backbone.Mediator.publish 'focus-editor'
|
'click': -> Backbone.Mediator.publish 'tome:focus-editor'
|
||||||
|
|
||||||
constructor: (options) ->
|
constructor: (options) ->
|
||||||
@worldName = options.worldName
|
@worldName = options.worldName
|
||||||
|
|
|
@ -31,7 +31,7 @@ module.exports = class HUDView extends View
|
||||||
@$el.addClass 'no-selection'
|
@$el.addClass 'no-selection'
|
||||||
|
|
||||||
onClick: (e) ->
|
onClick: (e) ->
|
||||||
Backbone.Mediator.publish 'focus-editor' unless $(e.target).parents('.thang-props').length
|
Backbone.Mediator.publish 'tome:focus-editor' unless $(e.target).parents('.thang-props').length
|
||||||
|
|
||||||
onFrameChanged: (e) ->
|
onFrameChanged: (e) ->
|
||||||
@timeProgress = e.progress
|
@timeProgress = e.progress
|
||||||
|
|
|
@ -36,7 +36,7 @@ module.exports = class PlaybackView extends View
|
||||||
'click #zoom-out-button': -> Backbone.Mediator.publish('camera-zoom-out') unless @shouldIgnore()
|
'click #zoom-out-button': -> Backbone.Mediator.publish('camera-zoom-out') unless @shouldIgnore()
|
||||||
'click #volume-button': 'onToggleVolume'
|
'click #volume-button': 'onToggleVolume'
|
||||||
'click #play-button': 'onTogglePlay'
|
'click #play-button': 'onTogglePlay'
|
||||||
'click': -> Backbone.Mediator.publish 'focus-editor'
|
'click': -> Backbone.Mediator.publish 'tome:focus-editor'
|
||||||
'mouseenter #timeProgress': 'onProgressEnter'
|
'mouseenter #timeProgress': 'onProgressEnter'
|
||||||
'mouseleave #timeProgress': 'onProgressLeave'
|
'mouseleave #timeProgress': 'onProgressLeave'
|
||||||
'mousemove #timeProgress': 'onProgressHover'
|
'mousemove #timeProgress': 'onProgressHover'
|
||||||
|
|
|
@ -46,7 +46,7 @@ module.exports = class CastButtonView extends View
|
||||||
Backbone.Mediator.publish 'tome:manual-cast', {}
|
Backbone.Mediator.publish 'tome:manual-cast', {}
|
||||||
|
|
||||||
onCastOptionsClick: (e) =>
|
onCastOptionsClick: (e) =>
|
||||||
Backbone.Mediator.publish 'focus-editor'
|
Backbone.Mediator.publish 'tome:focus-editor'
|
||||||
@castButtonGroup.removeClass 'open'
|
@castButtonGroup.removeClass 'open'
|
||||||
@setAutocastDelay $(e.target).attr 'data-delay'
|
@setAutocastDelay $(e.target).attr 'data-delay'
|
||||||
false
|
false
|
||||||
|
|
|
@ -146,6 +146,7 @@ module.exports = class Spell
|
||||||
for thangId, spellThang of @thangs
|
for thangId, spellThang of @thangs
|
||||||
spellThang.aether?.setLanguage @language
|
spellThang.aether?.setLanguage @language
|
||||||
spellThang.castAether = null
|
spellThang.castAether = null
|
||||||
|
Backbone.Mediator.publish 'tome:spell-changed-language', spell: @
|
||||||
workerMessage =
|
workerMessage =
|
||||||
function: "updateLanguageAether"
|
function: "updateLanguageAether"
|
||||||
newLanguage: @language
|
newLanguage: @language
|
||||||
|
|
|
@ -13,6 +13,7 @@ module.exports = class SpellListEntryView extends View
|
||||||
|
|
||||||
subscriptions:
|
subscriptions:
|
||||||
'tome:problems-updated': "onProblemsUpdated"
|
'tome:problems-updated': "onProblemsUpdated"
|
||||||
|
'tome:spell-changed-language': 'onSpellChangedLanguage'
|
||||||
'level-disable-controls': 'onDisableControls'
|
'level-disable-controls': 'onDisableControls'
|
||||||
'level-enable-controls': 'onEnableControls'
|
'level-enable-controls': 'onEnableControls'
|
||||||
'god:new-world-created': 'onNewWorld'
|
'god:new-world-created': 'onNewWorld'
|
||||||
|
@ -30,11 +31,38 @@ module.exports = class SpellListEntryView extends View
|
||||||
getRenderData: (context={}) ->
|
getRenderData: (context={}) ->
|
||||||
context = super context
|
context = super context
|
||||||
context.spell = @spell
|
context.spell = @spell
|
||||||
context.parameters = (@spell.parameters or []).join ', '
|
context.methodSignature = @createMethodSignature()
|
||||||
context.thangNames = (thangID for thangID, spellThang of @spell.thangs when spellThang.thang.exists).join(', ') # + ", Marcus, Robert, Phoebe, Will Smith, Zap Brannigan, You, Gandaaaaalf"
|
context.thangNames = (thangID for thangID, spellThang of @spell.thangs when spellThang.thang.exists).join(', ') # + ", Marcus, Robert, Phoebe, Will Smith, Zap Brannigan, You, Gandaaaaalf"
|
||||||
context.showTopDivider = @showTopDivider
|
context.showTopDivider = @showTopDivider
|
||||||
context
|
context
|
||||||
|
|
||||||
|
createMethodSignature: ->
|
||||||
|
parameters = (@spell.parameters or []).slice()
|
||||||
|
if @spell.language in ['python', 'lua']
|
||||||
|
parameters.unshift 'self'
|
||||||
|
else if @spell.language is 'io'
|
||||||
|
parameters.unshift '...'
|
||||||
|
paramString = parameters.join ', '
|
||||||
|
name = @spell.name
|
||||||
|
switch @spell.language
|
||||||
|
when 'io'
|
||||||
|
"#{name} := method(#{paramString})"
|
||||||
|
when 'clojure'
|
||||||
|
"(defn #{name} [#{paramString}] ...)"
|
||||||
|
when 'python'
|
||||||
|
"def #{name}(#{paramString}):"
|
||||||
|
when 'lua'
|
||||||
|
"function #{name}(#{paramString}) ... end"
|
||||||
|
when 'coffeescript'
|
||||||
|
if parameters.length
|
||||||
|
"@#{name} = (#{paramString}) ->"
|
||||||
|
else
|
||||||
|
"@#{name} = ->"
|
||||||
|
when 'javascript'
|
||||||
|
"function #{name}(#{paramString}) { ... }"
|
||||||
|
else
|
||||||
|
"#{name}(#{paramString})"
|
||||||
|
|
||||||
getPrimarySpellThang: ->
|
getPrimarySpellThang: ->
|
||||||
if @lastSelectedThang
|
if @lastSelectedThang
|
||||||
spellThang = _.find @spell.thangs, (spellThang) => spellThang.thang.id is @lastSelectedThang.id
|
spellThang = _.find @spell.thangs, (spellThang) => spellThang.thang.id is @lastSelectedThang.id
|
||||||
|
@ -42,7 +70,7 @@ module.exports = class SpellListEntryView extends View
|
||||||
for thangID, spellThang of @spell.thangs
|
for thangID, spellThang of @spell.thangs
|
||||||
continue unless spellThang.thang.exists
|
continue unless spellThang.thang.exists
|
||||||
return spellThang # Just do the first one else
|
return spellThang # Just do the first one else
|
||||||
|
|
||||||
afterRender: ->
|
afterRender: ->
|
||||||
super()
|
super()
|
||||||
return unless @options.showTopDivider # Don't repeat Thang avatars when not changed from previous entry
|
return unless @options.showTopDivider # Don't repeat Thang avatars when not changed from previous entry
|
||||||
|
@ -92,6 +120,10 @@ module.exports = class SpellListEntryView extends View
|
||||||
return unless e.spell is @spell
|
return unless e.spell is @spell
|
||||||
@$el.toggleClass "user-code-problem", e.problems.length
|
@$el.toggleClass "user-code-problem", e.problems.length
|
||||||
|
|
||||||
|
onSpellChangedLanguage: (e) ->
|
||||||
|
return unless e.spell is @spell
|
||||||
|
@render() # So that we can update parameters if needed
|
||||||
|
|
||||||
onDisableControls: (e) -> @toggleControls e, false
|
onDisableControls: (e) -> @toggleControls e, false
|
||||||
onEnableControls: (e) -> @toggleControls e, true
|
onEnableControls: (e) -> @toggleControls e, true
|
||||||
toggleControls: (e, enabled) ->
|
toggleControls: (e, enabled) ->
|
||||||
|
@ -105,7 +137,7 @@ module.exports = class SpellListEntryView extends View
|
||||||
|
|
||||||
onNewWorld: (e) ->
|
onNewWorld: (e) ->
|
||||||
@lastSelectedThang = e.world.thangMap[@lastSelectedThang.id] if @lastSelectedThang
|
@lastSelectedThang = e.world.thangMap[@lastSelectedThang.id] if @lastSelectedThang
|
||||||
|
|
||||||
destroy: ->
|
destroy: ->
|
||||||
@avatar?.destroy()
|
@avatar?.destroy()
|
||||||
super()
|
super()
|
||||||
|
|
|
@ -4,6 +4,7 @@ template = require 'templates/play/level/tome/spell_palette'
|
||||||
filters = require 'lib/image_filter'
|
filters = require 'lib/image_filter'
|
||||||
SpellPaletteEntryView = require './spell_palette_entry_view'
|
SpellPaletteEntryView = require './spell_palette_entry_view'
|
||||||
LevelComponent = require 'models/LevelComponent'
|
LevelComponent = require 'models/LevelComponent'
|
||||||
|
EditorConfigModal = require '../modal/editor_config_modal'
|
||||||
|
|
||||||
N_ROWS = 4
|
N_ROWS = 4
|
||||||
|
|
||||||
|
@ -16,6 +17,10 @@ module.exports = class SpellPaletteView extends View
|
||||||
'level-disable-controls': 'onDisableControls'
|
'level-disable-controls': 'onDisableControls'
|
||||||
'level-enable-controls': 'onEnableControls'
|
'level-enable-controls': 'onEnableControls'
|
||||||
'surface:frame-changed': "onFrameChanged"
|
'surface:frame-changed': "onFrameChanged"
|
||||||
|
'tome:change-language': 'onTomeChangedLanguage'
|
||||||
|
|
||||||
|
events:
|
||||||
|
'click .code-language-logo': 'onEditEditorConfig'
|
||||||
|
|
||||||
constructor: (options) ->
|
constructor: (options) ->
|
||||||
super options
|
super options
|
||||||
|
@ -39,7 +44,12 @@ module.exports = class SpellPaletteView extends View
|
||||||
for entry in entryColumn
|
for entry in entryColumn
|
||||||
col.append entry.el
|
col.append entry.el
|
||||||
entry.render() # Render after appending so that we can access parent container for popover
|
entry.render() # Render after appending so that we can access parent container for popover
|
||||||
$('.nano').nanoScroller()
|
$('.nano').nanoScroller()
|
||||||
|
@updateCodeLanguage @options.language
|
||||||
|
|
||||||
|
updateCodeLanguage: (language) ->
|
||||||
|
@options.language = language
|
||||||
|
@$el.find('.code-language-logo').removeClass().addClass 'code-language-logo ' + language
|
||||||
|
|
||||||
createPalette: ->
|
createPalette: ->
|
||||||
lcs = @supermodel.getModels LevelComponent
|
lcs = @supermodel.getModels LevelComponent
|
||||||
|
@ -128,6 +138,12 @@ module.exports = class SpellPaletteView extends View
|
||||||
return unless e.selectedThang?.id is @thang.id
|
return unless e.selectedThang?.id is @thang.id
|
||||||
@options.thang = @thang = e.selectedThang # Update our thang to the current version
|
@options.thang = @thang = e.selectedThang # Update our thang to the current version
|
||||||
|
|
||||||
|
onTomeChangedLanguage: (e) ->
|
||||||
|
@updateCodeLanguage e.language
|
||||||
|
|
||||||
|
onEditEditorConfig: (e) ->
|
||||||
|
@openModalView new EditorConfigModal session: @options.session
|
||||||
|
|
||||||
destroy: ->
|
destroy: ->
|
||||||
entry.destroy() for entry in @entries
|
entry.destroy() for entry in @entries
|
||||||
@toggleBackground = null
|
@toggleBackground = null
|
||||||
|
|
|
@ -41,7 +41,7 @@ module.exports = class SpellView extends View
|
||||||
'tome:spell-changed': 'onSpellChanged'
|
'tome:spell-changed': 'onSpellChanged'
|
||||||
'level:session-will-save': 'onSessionWillSave'
|
'level:session-will-save': 'onSessionWillSave'
|
||||||
'modal-closed': 'focus'
|
'modal-closed': 'focus'
|
||||||
'focus-editor': 'focus'
|
'tome:focus-editor': 'focus'
|
||||||
'tome:spell-statement-index-updated': 'onStatementIndexUpdated'
|
'tome:spell-statement-index-updated': 'onStatementIndexUpdated'
|
||||||
'tome:change-language': 'onChangeLanguage'
|
'tome:change-language': 'onChangeLanguage'
|
||||||
'tome:change-config': 'onChangeEditorConfig'
|
'tome:change-config': 'onChangeEditorConfig'
|
||||||
|
|
|
@ -162,7 +162,7 @@ module.exports = class TomeView extends View
|
||||||
@spellList.$el.hide()
|
@spellList.$el.hide()
|
||||||
|
|
||||||
onClick: (e) ->
|
onClick: (e) ->
|
||||||
Backbone.Mediator.publish 'focus-editor' unless $(e.target).parents('.popover').length
|
Backbone.Mediator.publish 'tome:focus-editor' unless $(e.target).parents('.popover').length
|
||||||
|
|
||||||
clearSpellView: ->
|
clearSpellView: ->
|
||||||
@spellView?.dismiss()
|
@spellView?.dismiss()
|
||||||
|
@ -201,7 +201,7 @@ module.exports = class TomeView extends View
|
||||||
|
|
||||||
updateSpellPalette: (thang, spell) ->
|
updateSpellPalette: (thang, spell) ->
|
||||||
return unless thang and @spellPaletteView?.thang isnt thang and thang.programmableProperties or thang.apiProperties
|
return unless thang and @spellPaletteView?.thang isnt thang and thang.programmableProperties or thang.apiProperties
|
||||||
@spellPaletteView = @insertSubView new SpellPaletteView thang: thang, supermodel: @supermodel, programmable: spell?.canRead()
|
@spellPaletteView = @insertSubView new SpellPaletteView thang: thang, supermodel: @supermodel, programmable: spell?.canRead(), language: spell.language, session: @options.session
|
||||||
@spellPaletteView.toggleControls {}, spell.view.controlsEnabled if spell # TODO: know when palette should have been disabled but didn't exist
|
@spellPaletteView.toggleControls {}, spell.view.controlsEnabled if spell # TODO: know when palette should have been disabled but didn't exist
|
||||||
|
|
||||||
spellFor: (thang, spellName) ->
|
spellFor: (thang, spellName) ->
|
||||||
|
|
Loading…
Reference in a new issue