In Blockpad, frames are the places you do work in. The 3 basic frames are reports, spreadsheets, and 2D canvas.
On the left side of any Blockpad window, there is a list of the top level frames in that file. These top level frames provide the basic organization for the file, and together contain everything in the file. You can think of them like sheets in a spreadsheet program.
Frames don't have to be top level though. In Blockpad, you can insert frames into other frames, depending on the type of each.
For example, tables and drawings are subframes inside of a report, and multiline cells are subframes inside of a table or spreadsheet.
Information can be shared between frames through formulas/dynamic equations. If there's a value defined in one frame, you can reference it in another frame.
It isn't necessary to understand the value container system in Blockpad because you can always use copy reference or click on a value to reference it in a formula. However, it can be helpful to understand how the reference name system works, so a brief explanation is given here.
In Blockpad, values are stored in Value Containers. All frames and sections are value containers. When you create a value inside of a value container, the value is stored in that container.
Value containers can also hold more value containers inside, like how frames can be inside of frames.
To reference values from different value containers you need to specify the location of the value using the names of the value containers. A dot notation is used for this. Below is the basic layout to reference a value in a different container in the same file.
You can always use this full reference name to reference a value, but it isn't always necessary.
Directly after the "first shared parent container" is the typical place to start a reference, and it is always required to have at least that.
Let's break that down.
Every value has parent containers. These are the value container that hold the value, and the containers that hold that container, going up to a top level frame. So, if Value1 is in Table2 and Table2 is in Report4, then Report4 and Table2 are parent containers to Value1.
A shared parent container between a value and a formula is any container that holds both, even if there are some containers between. From the last example, if a different formula is in a multiline cell in Table2, then Table2 and Report4 are both shared parent containers.
Finally, the first shared parent container is the shared parent container closest to the values. In our example, Table2 is the first shared parent container.
If a value is defined in the same container, only ValueName is needed.
If a value is defined in a container below, then SubContainer and ValueName are needed.
If a value is defined in the container above, then only ValueName is needed.
If a value is defined in a different sub container under the same container then only SubContainer and ValueName are needed.
If a value is defined several sub containers below, then all of them must be named.
The multiline cell is not part of the reference name because it has capture values set to no.
If a value is defined in a different top level frame, then the full reference name must be used.
It's good to keep value containers in mind when naming new values, because duplicate names generate an error in Blockpad.
For example, children containers should not duplicate names from the parent. This will generate an error when referencing that value name from inside the child.
Most containers are "closed" by default. However, you can change a frame or section to be an "open container", so that the values inside are shared with the container above.
Solver sections and multiline cells are open containers by default.
If a top level frame is an open container, all of the values in that frame are shared with the whole file. If a sub container is open, then it's like the values in the sub container were stored in the container above.
Compare the two tables below. The first has Capture Values set to "yes", so when referencing the values from outside, the container must be specified.
The second table has Capture Values set to "no", so the values can be referenced in the frame that contains it without specifying the table name.