From c4ae964a3eb088dc1977a9f738072ad874e022ca Mon Sep 17 00:00:00 2001 From: Eric Rosenbaum Date: Tue, 7 Feb 2017 17:23:11 -0500 Subject: [PATCH] monkeypatch dynamic sound menu into scratchblocks /ht @rschamp --- src/containers/blocks.jsx | 13 +++++++------ src/lib/blocks.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 src/lib/blocks.js diff --git a/src/containers/blocks.jsx b/src/containers/blocks.jsx index ecafed937..e77cf3cc7 100644 --- a/src/containers/blocks.jsx +++ b/src/containers/blocks.jsx @@ -1,7 +1,7 @@ const bindAll = require('lodash.bindall'); const defaultsDeep = require('lodash.defaultsdeep'); const React = require('react'); -const ScratchBlocks = require('scratch-blocks'); +const VMScratchBlocks = require('../lib/blocks'); const VM = require('scratch-vm'); const BlocksComponent = require('../components/blocks/blocks.jsx'); @@ -9,6 +9,7 @@ const BlocksComponent = require('../components/blocks/blocks.jsx'); class Blocks extends React.Component { constructor (props) { super(props); + this.ScratchBlocks = VMScratchBlocks(props.vm); bindAll(this, [ 'attachVM', 'detachVM', @@ -23,7 +24,7 @@ class Blocks extends React.Component { } componentDidMount () { const workspaceConfig = defaultsDeep({}, Blocks.defaultOptions, this.props.options); - this.workspace = ScratchBlocks.inject(this.blocks, workspaceConfig); + this.workspace = this.ScratchBlocks.inject(this.blocks, workspaceConfig); this.attachVM(); } componentWillUnmount () { @@ -67,11 +68,11 @@ class Blocks extends React.Component { this.workspace.reportValue(data.id, data.value); } onWorkspaceUpdate (data) { - ScratchBlocks.Events.disable(); + this.ScratchBlocks.Events.disable(); this.workspace.clear(); - const dom = ScratchBlocks.Xml.textToDom(data.xml); - ScratchBlocks.Xml.domToWorkspace(dom, this.workspace); - ScratchBlocks.Events.enable(); + const dom = this.ScratchBlocks.Xml.textToDom(data.xml); + this.ScratchBlocks.Xml.domToWorkspace(dom, this.workspace); + this.ScratchBlocks.Events.enable(); } setBlocks (blocks) { this.blocks = blocks; diff --git a/src/lib/blocks.js b/src/lib/blocks.js new file mode 100644 index 000000000..10791bc14 --- /dev/null +++ b/src/lib/blocks.js @@ -0,0 +1,28 @@ +const ScratchBlocks = require('scratch-blocks'); + +module.exports = function (vm) { + ScratchBlocks.Blocks.sound_sounds_menu.init = function () { + this.jsonInit( + { + message0: '%1', + args0: [ + { + type: 'field_dropdown', + name: 'SOUND_MENU', + options: function () { + const menu = vm.editingTarget.sprite.sounds.map(sound => [sound.name, sound.name]); + menu.unshift(['select...', '0']); + return menu; + } + } + ], + inputsInline: true, + output: 'String', + colour: ScratchBlocks.Colours.sounds.secondary, + colourSecondary: ScratchBlocks.Colours.sounds.secondary, + colourTertiary: ScratchBlocks.Colours.sounds.tertiary, + outputShape: ScratchBlocks.OUTPUT_SHAPE_ROUND + }); + }; + return ScratchBlocks; +};