Article
Difficulty Rating
2
The Basics: Understanding stacks, subStacks and mainStacks

.

.

.

 

A window in MetaCard is called a stack. Each stack can contain any number of screens, known as cards. Cards contain objects such as buttons, text fields, images, etc. By changing the card currently being displayed in a stack, you change the entire contents of the screen being displayed in that stack (window).

Stacks have a number of properties to control how they are displayed. These include basics such as width, location and height. There are also commands to control what mode stacks are opened in, i.e. whether they are displayed as palettes, normal (toplevel) windows or dialog boxes.

Not all stacks are created equal. There are two types: the mainStack and the subStack. The analogy is simple. A mainStack is stored in a file. SubStacks are stored in mainStacks. When you open a MetaCard "document" on disk, the mainStack will be displayed. Scripts in the mainStack can then open any subStack in that file. SubStacks are used to implement any other window in the application you are creating, for example dialog boxes, menus, or other program screens.

Lets walk through creating a new mainStack, and then the process of attaching a subStack to it. Open MetaCard, and create a stack by choosing "New stack" from the file menu. A new stack will appear, called something like "Stack 00000000". The stack properties palette for that stack is automatically opened when you create a new stack, so use it to rename the stack so that we can refer to it easily again.

Now choose Save from the file menu. You will be presented with a standard Save As dialog box, which allows you to give the stack a file name and save it on disk. Type in "My program.mc" and press the Save button.

Now, create a new stack. You could just save this stack into another file as another mainStack by choosing Save from the File menu again. However, this time, lets save it into the same file as the mainStack "My stack" we just created.

Tip:In case you're interested, the number given to a stack as part of its title when you first create it is the number of seconds that have elapsed since Thursday, 1st January, 1970. If you choose "Message box" from the Tools menu and type in:

convert (word 2 of the short name of this stack) to long time; put it
                                             

you'll get the time the stack was created. This system ensures that each stack created will start out with unique name. Because the name is the only way to refer to a stack in a script, it is a good habbit to make sure that whatever you name a stack is different from *all* other MetaCard stacks stored anywhere on your computer.

Note that the semi-colon in that example denotes a new line. It can be used to put multiple commands or even repeat loops in the message box. Simply use a semi-colon to separate lines.

Use the stack properties palette that is currently on screen to name this stack "My subStack". (If that palette has dissappeared for any reason, just choose "Stack properties" from the Edit menu to get it back). Click the Properties tab. Click the mainStack button. Choose "My stack" from the menu in the mainStack dialog that is now on screen. Press OK, and then choose Save from the file menu. This time, you won't be presented with a dialog box asking you where you want to save the stack. Thats because it is now part of the mainStack "My stack" and will be saved automatically into the same file you saved "My stack" into.

Whats special about a mainStack? Whenever you open a MetaCard document (e.g. from the desktop or using the MetaCard File menu) it will open the mainStack from inside that file and display it on screen. None of the other stacks in the file will be displayed, though they are all loaded into memory. If you want to go to other stacks each time you load a particular file, you'll need to add a script to do that. This makes a mainStack the ideal candidate for a splash screen or welcome screen.

Note that whenever you save any stack, all the other stacks in that file will be saved too. So, when MetaCard tells you its saving stack someName as a subStack of stack anotherName, what it really means is that its saving stack someName, anotherName and every other stack in the file. There is no way to perform a Save on an individual subStack.

Important Note: Beware that you can't alter which stack in a file is the mainStack. Once you have created a mainStack, your stuck with it. Whilst any other stacks can be called up or ignored as required, your mainStack will always open when the file is loaded. Deleting it will delete all subStacks in the same file. Short of saving each subStack out into an individual file, and reconstucting them in a different order, you are stuck with whatever mainStack you start out with.

Navigating around stacks

As already mentioned above, stacks can be opened as palettes and dialogs, as well as normal windows. To get to a stack, just type open stack, followed by the name of the stack:

open stack "My substack"
                                             

How do you open a stack as a dialog box then? Instead of using the open stack command, you use a command to specify that the stack is opened as a dialog box. This is known as a stack's mode. Typing:

modal "My substack"
                                             

in the message box, which would cause "My substack" to opens in dialog mode. Also useful are:

palette "My substack" -- to open in palette mode
modeless "My substack" -- to open a window in a non-blocking but 
                         -- non-editable mode for presenting information
toplevel "My substack" -- to re-open "my substack" in normal window mode
                                    

"Toplevel" is the term given to stacks opened in the normal mode. Its usually the same as saying:

open stack "My substack"
                                             

The toplevel version of that command will cause a stack that is already open in another mode (e.g as a dialog or palette) to be reopened as a normal stack.

Creating and navigating between cards

Whenever you create a stack, it gets created with a single card. The card is the contents area inside the window frame, onto which you draw the actual objects that make up your application or presentation.

So far, we've talked about creating separate stacks and navigating between them. Now lets suppose you want to display similar information and navigate between it inside the same stack. Examples include presentations, slide shows, multiple panels in a preferences dialog, topics in a reference or training guide, etc., etc. An easy way to do this is to create more cards in the stack.

Draw out a couple of objects (using the Tools Palette in the Tools menu), then choose Create Card from the Edit menu. The area inside the stack will empty, as the new card does not contain any objects. Draw out some objects on this card. Now choose Navigator from the Tools menu. Use the arrows to go forward and backwards between the two cards you created. Create a button and put the following script into it:

on mouseUp
  visual effect dissolve
  go next card
end mouseUp
                                             

Choose the Browse tool to switch from editing mode to run time mode. Click the button you just created. You should change card with a dissolve effect. See our article on Groups and Backgrounds for information on creating objects that appear on multiple cards.

So what if you want to go to another card in another stack?

go card 3 of stack "my substack"
                                             

We recommend you give cards names to make them easier to remember. Choose Card Properties from the Edit menu, and name each card you create in the same way you name a stack.

If you want to go to a card in another stack, whilst opening that stack in a different mode (e.g. go card 5 of a stack opened as a palette):

go card 5 of stack "example stack" as palette
                                             

Finally, if you want to go to another card in a stack but use the same window frame as the stack you are in:

go card 3 of stack "another stack" in the window of this stack
                                             

The two stacks must be the same width and height. The user will not know that you have changed stack - as the new card will appear in the same window.

Tip:There is an alternative way of specifying the mode (dialog box/palette/etc.) that a MetaCard stack is opened in. Its called the "style" property. This property *over-rides* any commands you use to force a stack to open in a particular mode. For example:

set the style of stack "my stack" to palette
                                             

will cause "my stack" to always open as a palette, even if you specify:

toplevel "my stack"
                                             

This is occasionally useful, for example if you want a mainStack to be opened as a modal dialog box, you'll need to set the style property (the mainStack will otherwise be loaded by MetaCard as toplevel).

Let's step back and take a look at the structure of a typical MetaCard program.

You can't edit a stack opened in any mode other than toplevel. However, there will be many applications where you want to create palettes or dialog boxes, and want to tweak them.

Its easy to use the message box to change the mode, first by opening as a modal to preview, then as a toplevel to edit, then as a modal again. However, you may find this process inconvenient, because it causes the stack's scripts to operate every time you do it. For example, you may have scripts that move run every time a card is opened, and you don't want these to operate again. Type:

lock messages; toplevel "My stack"
                                             

in the message box.

Finally, you can change the appearance of any stack without changing its mode. All stacks ,no matter what mode the are opened, in have a decorations property. This can be used to override the default decorations that a stack displays (which are determined by what mode the stack was opened in). Decorations include the close box, resize boxes, etc. Note that setting the decorations is the only way to create a completely borderless stack, as there are no modes to open stacks without a border. To make "My stack" a borderless window:

set the decorations of stack "My stack" to empty
                                             

This will work regardless of whether the stack is opened as a palette, toplevel, dialog, etc.

Tip:If you don't know the name of a particular stack that you want to edit, simply bring the stack into a position on screen where it is visible then move the mouse over it then type:

toplevel the mouseStack
                                             

into the message box. If you are still having difficulties, move the mouse back over the stack and type:

set the cantModify of the mouseStack to false
                                             

If you still can't edit the stack, the style must be set.

set the style of the mouseStack to "default"
                                             

You'll find that this will let you edit even the most stubborn stacks.

Did you find this article useful? Have any ideas for future topics? Email Us!