From b364168d776f3e54f6107a9716d0a8bcf7845ba6 Mon Sep 17 00:00:00 2001 From: GarboMuffin Date: Sat, 29 Jul 2023 09:57:40 -0500 Subject: [PATCH] Allow custom blocks to return values - GUI part (#763) * Add extension library item to enable procedure returns * Don't warn about Scratch compatibility before showing custom extension modal regression * Implement return docs button --- src/containers/blocks.jsx | 11 ++++++++- src/containers/extension-library.jsx | 9 ++++++++ .../libraries/extensions/custom/return.svg | 1 + src/lib/libraries/extensions/index.jsx | 23 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/lib/libraries/extensions/custom/return.svg diff --git a/src/containers/blocks.jsx b/src/containers/blocks.jsx index 7fa9e5be142..26fdc3591ff 100644 --- a/src/containers/blocks.jsx +++ b/src/containers/blocks.jsx @@ -85,7 +85,8 @@ class Blocks extends React.Component { 'onWorkspaceUpdate', 'onWorkspaceMetricsChange', 'setBlocks', - 'setLocale' + 'setLocale', + 'handleEnableProcedureReturns' ]); this.ScratchBlocks.prompt = this.handlePromptStart; this.ScratchBlocks.statusButtonCallback = this.handleConnectionModalStart; @@ -138,6 +139,9 @@ class Blocks extends React.Component { window.open(docsURI, '_blank'); } }); + toolboxWorkspace.registerButtonCallback('OPEN_RETURN_DOCS', () => { + window.open('https://docs.turbowarp.org/return', '_blank'); + }); // Store the xml of the toolbox that is actually rendered. // This is used in componentDidUpdate instead of prevProps, because @@ -565,6 +569,10 @@ class Blocks extends React.Component { this.updateToolbox(); // To show new variables/custom blocks }); } + handleEnableProcedureReturns () { + this.workspace.enableProcedureReturns(); + this.requestToolboxUpdate(); + } render () { /* eslint-disable no-unused-vars */ const { @@ -617,6 +625,7 @@ class Blocks extends React.Component { diff --git a/src/containers/extension-library.jsx b/src/containers/extension-library.jsx index e502c667689..5b820a3cdb1 100644 --- a/src/containers/extension-library.jsx +++ b/src/containers/extension-library.jsx @@ -38,6 +38,8 @@ class ExtensionLibrary extends React.PureComponent { } const extensionId = item.extensionId; + + // Don't warn about Scratch compatibility before showing modal const isCustomURL = !item.disabled && !extensionId; if (isCustomURL) { this.props.onOpenCustomExtensionModal(); @@ -49,6 +51,12 @@ class ExtensionLibrary extends React.PureComponent { return; } + if (extensionId === 'procedures_enable_return') { + this.props.onEnableProcedureReturns(); + this.props.onCategorySelected('myBlocks'); + return; + } + const url = item.extensionURL ? item.extensionURL : extensionId; if (!item.disabled) { if (this.props.vm.extensionManager.isExtensionLoaded(extensionId)) { @@ -89,6 +97,7 @@ class ExtensionLibrary extends React.PureComponent { ExtensionLibrary.propTypes = { intl: intlShape.isRequired, onCategorySelected: PropTypes.func, + onEnableProcedureReturns: PropTypes.func, onOpenCustomExtensionModal: PropTypes.func, onRequestClose: PropTypes.func, visible: PropTypes.bool, diff --git a/src/lib/libraries/extensions/custom/return.svg b/src/lib/libraries/extensions/custom/return.svg new file mode 100644 index 00000000000..8aa2156c68b --- /dev/null +++ b/src/lib/libraries/extensions/custom/return.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/lib/libraries/extensions/index.jsx b/src/lib/libraries/extensions/index.jsx index 647cbdd1a51..7546e4297b3 100644 --- a/src/lib/libraries/extensions/index.jsx +++ b/src/lib/libraries/extensions/index.jsx @@ -73,6 +73,7 @@ import box2dIcon from './gallery/box2d.svg'; import localStorageIcon from './gallery/local-storage.svg'; import bigIntIcon from './gallery/bigint.svg'; import jsonIcon from './gallery/json.svg'; +import returnIcon from './custom/return.svg'; const galleryItem = object => ({ ...object, @@ -364,6 +365,28 @@ export default [ ), helpLink: 'https://scratch.mit.edu/vernier' }, + { + // not really an extension, but it's easiest to present it as one + name: ( + + ), + extensionId: 'procedures_enable_return', + iconURL: returnIcon, + description: ( + + ), + tags: ['tw'], + incompatibleWithScratch: true, + featured: true + }, { name: (