Custom Blocks
Size: (weeks of effort)
Summary:
As a user of the coding environment, I can create custom blocks of reusable sequences.
Details:
The following pages in the Prototype Design show the Custom Blocks interface:
Description of changes and new functionality:
The command palette has a new tab called "Custom Blocks", with contents:
"Create A Block" button
One block for each previously created custom block
The "Create A Block" button opens an overlay with similar functionality to the block editor, enabling the user to create a sequence
The custom block overlay includes:
A text control for setting the block name
Buttons to Save or Cancel the creation of the custom block
Design Questions:
Accessibility design
What is the keyboard interaction for the Custom Block editor?
What ARIA attributes do we need?
How can one edit a Custom Block after it has been created?
Vocabulary question:
What is the Program plus Custom Commands called?
A Project?
If it's a "Program", what is the main sequence called?
Redefinition of built-in commands
It would be possible to create a Custom Block with a name the same as an existing built-in block, such as "forward"; options:
Disallow it
Allow it and treat them as 2 distinct things
Allow it and have the new Custom Block replace the built-in one (Simon: this is powerful in the right programming contexts, but I don't think it's a good idea in our coding environment right now, without more supports to explain what is happening and how to manage it)
How does having the same name as a built-in command interact with localization of the commands names, where they might have different names depending on the language?
Recursion
In the current design, where we cannot edit a Custom Command, recursion isn't possible (I think), but when we add editing, recursion becomes possible
Simon: my thinking is that we terminate program execution on recursion as we have no conditionals in our language and all recursion is therefore infinite
There could be potential designs where we block recursion at the editing stage
Some examples of recursion:
MyCustomBlock: MyCustomBlock (the block sequence contains itself)
MuCustomBlock1: MyCustomBlock2, MyCustomBlock2: MyCustomBlock1 (mutual recursion where 2 blocks refer to each other)
Interaction with other components
In the current design, when the custom command window is open, preview window gets blocked by it and won't be able to see the preview window
Not only for viewing purpose, but would be better if users can pre-run their custom command before saving them, which means interaction with preview window is required
Technical notes:
I'd like to see if we can get rid of the programVer state variable from App.js and from our Editors. It was introduced to manage state in the ProgramTextEditor (https://github.com/codelearncreate/c2lc-coding-environment/blob/master/src/ProgramTextEditor.js) but it's going to be some hassle to keep it when we introduce a richer program model. Let's see if we can just store a reference to the program (will be commandSequence after C2LC-21 above) and test object reference equality instead of the version number.
Acceptance:
Dependencies: