smalruby/smalruby-editor

View on GitHub
app/assets/javascripts/blocks/character.js.coffee.erb

Summary

Maintainability
Test Coverage
# 「キャラクター」ジャンル

<%
  category = 'character'
  require 'smalruby_editor'
  color = SmalrubyEditor::COLORS[category.to_sym]
%>

# キャラクター
<% n = "#{category}_new" %>
Blockly.Blocks['<%= n %>'] =
  init: ->
    @setHelpUrl('')
    @setColour(<%= color %>)

    size = Blockly.BlockSvg.FIELD_HEIGHT * 2
    imageField = new Blockly.FieldImage(null, size, size)

    nameField = new Blockly.FieldLabel('')
    # HACK: ラベルをXMLとして出力させるためにEDITABLEをtrueにしている
    nameField.EDITABLE = true
    nameField.setText = _.bind(@nameFieldSetText_, @)

    # HACK: 画像とラベルの縦位置を合わせる
    originalInit = nameField.init
    nameField.init = ->
      originalInit.apply(@, arguments)
      @getSvgRoot().setAttribute('y', size / 4)

    @appendDummyInput()
      .appendField(imageField, 'COSTUME')
      .appendField(nameField, 'NAME')
    @appendStatementInput('DO')
    @setPreviousStatement(true)
    @setNextStatement(true)
    @setTooltip('')

  dispose: (healStack, animate) ->
    @character.off 'change', @changeHandler
    @character.unlink?(@)
    @constructor.prototype.dispose.apply(@, arguments)

  nameFieldSetText_: (name) ->
    charSet = Smalruby.Collections.CharacterSet
    char = charSet.findWhere({ name: name })
    if char
      @setCharacter(char)
    else
      @fieldLableSetText_(@getField_('NAME'), name)

  fieldLableSetText_: (field, text) ->
    Blockly.FieldLabel.prototype.setText.call(field, text)

  setCharacter: (character) ->
    if @changeHandler
      @character.off 'change', @changeHandler

    @character = character
    @setFieldValue(character.costumeUrl(), 'COSTUME')
    @fieldLableSetText_(@getField_('NAME'), character.get('name'))
    character.link(@)

    @changeHandler = (model) =>
      @setFieldValue(model.costumeUrl(), 'COSTUME')
      @fieldLableSetText_(@getField_('NAME'), character.get('name'))

    character.on 'change', @changeHandler

    @

  getCharacter: ->
    @character

Blockly.Ruby['<%= n %>'] = (block) ->
  c = block.character
  Blockly.Ruby.defineCharacter(c)
  Blockly.Ruby.cs_().push(c)
  try
    targetBlock = block.getInputTargetBlock('DO')
    code = Blockly.Ruby.blockToCode(targetBlock) || '\n'
  finally
    Blockly.Ruby.cs_().pop()
  code