Salvar e carregar ícones

Alguns ícones têm um estado que precisa ser salvo, enquanto outros são instanciados com base no estado já existente. Por exemplo, os ícones de comentários precisam salvar o texto, enquanto os ícones de aviso não, porque são instanciados com base na forma como os blocos estão conectados.

Se o ícone precisar salvar o estado, implemente a interface ISerializable e register.

O estado retornado pelo ícone é incluído na propriedade icons do estado do bloco:

{
  'blocks': {
    'languageVersion': 0,
    'blocks': [
      {
        'type': 'my_block',
        'icons': {
          // Your state goes here!
          'my_icon': 'some state',
        }
      }
    ]
  }
}

Salvar estado

Para salvar o estado do ícone, é necessário implementar o método saveState da interface ISerializable. que pode retornar um JSON arbitrário, que é transmitido ao método loadState.

saveState() {
  return this.state;  // Some arbirtary JSON-compatible data.
}

Serialização completa e dados de backup

saveState também recebe um parâmetro doFullSerialization opcional. É usado por ícones que fazem referência ao estado serializado por um serializador diferente (como modelos de dados de apoio). O parâmetro sinaliza que o estado referenciado não estará disponível quando o bloco for desserializado. Portanto, o ícone precisa serializar todo o próprio estado de apoio. Por exemplo, isso é verdadeiro quando um bloco individual é serializado ou quando um bloco é copiado e colado.

Dois casos de uso comuns para isso são:

  • Quando um bloco individual é carregado em um espaço de trabalho em que o modelo de dados de apoio não existe, o ícone tem informações suficientes no próprio estado para criar um novo modelo de dados.
  • Quando um bloco é copiado e colado, o ícone sempre cria um novo modelo de dados de apoio em vez de referenciar um existente.

Estado de carregamento

Para salvar o estado do ícone, é necessário implementar o método loadState da interface ISerializable. Esse método usa o JSON retornado pelo método saveState.

loadState(state) {
  this.state = state;
}

Registrar classes de ícones

Por fim, você precisa registrar o ícone para que o sistema de serialização possa instanciar. Lembre-se de que o IconType usado para registrar o ícone precisa ter a mesma string que o retornado pelo método getType.

class myIcon extends Blockly.icons.Icon {
  getType() {
    return new Blockly.icons.IconType('my_icon');
  }
}

Blockly.icons.registry.register(
    new Blockly.icons.IconType('my_icon'), myIcon);