Look before you Leap - in Advanced Actions

Intro

Allen Partridge in a comment on a post suggested that I should blog about the work flow, the logic when setting up advanced actions. I find this a very difficult subject for a blog post, much easier when teaching face to face or online teaching. But this new question on the forum, that I tried to work out is a fine example to give you some tips, about shortening developing time by sitting down a while to reflect about the situations you want to create. And you'll not believe it but I do sit down, take a pencil and paper at that moment, or start to scribble in Evernote if I can't find those venerable tools immediately.

I will not explain the advanced actions in detail (some screenshots in the Gallery), but focus on the work flow and offer some timesaver tips. 

Question

 "Is  there anyway of taking a  series of variable controlled numbers say 0-9  that have been punched into a keypad, and formatting them so that the  ones that are clicked on the keypad are displayed in sequence. E.g.  if you click 1,5,8 and 9 on the keypad, then in the next slide I want  1,5,8 and 9 to be displayed as the keypad code so to speak." The complete thread can be found here: Push button lock theory
Those of you who visit the Captivate user forums frequently, will not be astonished that I asked more questions to have a clear idea about the goal. And the user kindly provided me with the image of that push lock. So I got these details:
  • the user chooses the code
  • the lock has 13 possible digits: numbers 0-9 and letters X,Y,Z
  • a C-button allows the user to reset the total code
  • the code has 5 digits
  • the code must not be validated but only shown on the next slide, and navigation to that slide is by a button Next

Example

Have a look at this movie to understand better what I tried to achieve. It has only 3 slides: Intro, EnterCode and ShowCode.


Look before...


For this particular (simple) use case, what did I write down? And you'll see that I mostly define labels for everything as well.

Situations - slides - events

Which situations will be possible and will I solve this in one slide or in multiple slides?
  1. User 'pushes' one of the buttons to enter a digit: which means I'll have 13 events that can trigger an action - all those actions will be similar
  2. User wants to change the code and clicks the C-button: event that is different from the 13 previous ones
  3. User has entered 5 digits and tries to push another button: has to be taken care off for each of the 13 actions described in 1.
  4. User clicks Next to confirm his code: special event, which will cause navigation IF the user has entered exactly 5 digits
  5. User clicks Next but has not entered 5 digits: should be taken care off, no navigation in that case
In this case I decided to have only one slide EnterCode with all the events/actions and a second slide ShowCode to navigate to with the Next button (situation 4).
There are 15 events to trigger actions by interactive objects:
  • 13 click boxes, each covering up a digit (0-9 and X,Y,Z), decided to label them as CB_0, CB_1..... CB_X, CB_Y, CB_Z
  • 1 click box covering the C-button CB_C
  • 1 button But_Next
If I want to make it possible to restart the process of entering the code on the slide EnterCode it is a good idea to use the event 'On Enter' for this slide to re-initialise everything.

Variables

Mostly I make a list of the variables I will need and create them separately from the advanced actions. This is only a personal preference, I do see a lot of tutorials where the possibility to open the Variables dialog box from the Advanced Actions box is used to create variables on the fly.
  • Since the goal is to show the entered code in ShowSlide I need 5 variables that will store the entered digits. This seems logical, but I did see that the user started by creating one variable for each digit? I suspect this is the result of just starting right away in Captivate before reflecting on the goal :-). Those five variables will be used on the second slide to show the code in a Text Caption. 
    Variables will be labeled: v_one, v_two, v_three, v_four, v_five

  • To use the C-button to reset the code, I'll need my favourite variable that is totally empty:
    v_void

  • To track the number of entered digits for situations 3-5 I need a counter:
    v_counter

  • The last variable I didn't add immediately, but saved me a lot of editing time when creating the 13 similar advanced actions for the click boxes (see Actions).
    v_current will store the digit of the current Click box (1 if the user clicked on the 1, X if he clicked on X..); and for all those genius-programmers here I really appreciate the fact that the Advanced Actions do not request me to make a difference between a number and a string when defining a variable  :-)

Objects

On the slide EnterCode, with the image of the push lock, I'll need (see Timeline in Gallery):
  • 13 click boxes on the 13 digits: do not create them all at once! Create one click box, configure it (inc. the attached advanced actions), and test it thoroughly. Only after that process duplicate it as many times as you need (and use my shortcut keys for aligning without a mouse Moving and Resizing Objects); believe me: that will save you a lot of clicks.
  • 1 click box over the C-button
  • 1 button Next
  • Text Caption Instruction explaining how to enter and confirm the code
  • Text Caption Warning to show up when the user enters more than 5 digits (in the same location as the previous caption)
  • Text Caption TooLess to show up when the user tries to confirm with the Next button and didn't enter 5 digits, also in the same location; in this text caption the user variable v_counter is embedded
On the slide ShowCode there is only a text caption to show the code. Beware: when embedding the user variables v_one....v_five be sure to set the length of each variable to 1 and no spaces between the variables in order to show the code as a sequence.

$$v_one$$$$v_two$$$$v_three$$$$v_four$$$$v_five$$

Actions

Tip: you can use the same label for an advanced action as the label for the object it is attached to, provided that you first label the object! If you try to label the object after you attributed the same label to an advanced action you'll get an error message! I forgot about this for the button Next, that is why you'll see there a different label for the action and the button, because I labeled the button after creating the action.

CB_1  and similar actions triggered by click box with same label (screenshots in Gallery)

Will need a combination of a standard action and a conditional action with multiple decisions:
  • increment v_counter and store the digit (1 for CB_1) in v_current (standard action) in decision Counter
  • store the digit in the appropriate variable v_one, v_two...., v_five  (conditional with 5 decisions First, Second, Third, Fourth, Fifth)
  • checks if the user didn't enter more than 5 digits, decision TooMuch
CB_Reset  (triggered by click box CB_C and eventually on Entering the slide EnterCode)
This is a standard action (see Gallery)
  • resets v_counter to 0
  • clears the variables v_one....v_five by using the variable v_void
  • shows text caption Instruction (that could have been made invisible by a previous advanced action)
  • hides text captions Warning and TooLess (that could have been made visible by a previous advanced action)
Bt_Next (triggered by button But_Next)
This is a conditional action, one decision with a Then/Next section (see Gallery)
  • checks if v_counter
  • if Yes the text caption Instruction is hidden and TooLess is made visible
  • if No the user is navigated to the next slide ShowCode

...you Leap


My work flow (had 2 slides with background and image on first slide), sequential:
  • created all the user variables and added comment to each variable
  • created click box CB_1, CB_C, button But_Next
  • created text caption Instruction and formatted it, used Duplicate to create captions Warning and TooLess on slide EnterCode
  • created text caption on slide ShowCode with the embedded variables (set each to length 1)
  • added a testing Text Caption on first slide that shows the variables v_counter, v_current, v_one......v_five;  it helps when testing to see those variables change in real time; this caption will be deleted later on
  • created advanced action CB_1 from Properties panel for click box CB_1: started with first 2 decisions (Counter and First), tested, then added decisions Second...Fifth, at last added TooMuch; here it was possible to test everything because the user can select the code "11111".
  • created advanced action CB_Reset from Properties panel click box CB_C and tested it in combination with CB_1
  • attached this action CB_Reset also to 'On Enter' for the slide EnterCode
  • created advanced action Bt_Next from Properties panel for button But_Next and tested it (still with only 1 as possible digit)
The following steps are the tedious, annoying ones because all the creative work is done. That is why often bugs will enter in this process, perhaps my tips will help to avoid some:
  1. duplicate click box CB_1 as many times as needed (here 12), label and position each click box over the appropriate digit
  2. open Advanced actions dialog box; duplicate action CB_1, change the label to CB_2
  3. because I used the variable v_current you only have to edit the first decision (Counter): change the statement "Assign v_current with 1" to "Assign v_current with 2" and that is it
  4. repeat that process (2-3) to create all the advanced actions CB_3....CB_Z; close Advanced Actions
  5. in the properties panel of the click boxes, change the attached action: because labels of the click box and the action are the same this would be easy.
  6. test again in all situations to detect possible bugs

Conclusion

This is the first time I tried to explain the way my 'advanced actions' brain is tackling the process, and I do not have any idea if this could help. That is why I really would appreciate if you take a minute to post your comment and suggestions. What do you think about a YouTube video to show how the extra user variable v_current did save me a lot of time while editing the similar duplicate actions for the 13 buttons.




 


Custom Play/Pause button in Captivate

Intro

This a quick tip, to avoid me having to answer this question again and again on the user forum. It is pretty easy to have custom buttons to navigate to previous, next or even last visited slides, or to toggle CC. But the play/pause button is a bit trickier. The reason is that for this button 'twin' system variables are involved: rdcmndPause and rdcmndResume. In this post I offer three solutions. Watch the movie to see the difference/
 

Example

 
Watch this movie to judge the difference between the solutions. I reused some slides from a previous post (Playtime with audio and widgets) that have a bit complex and long timelines to allow you to test the Pause/Play functionality. You'll experience the three solutions in this sequence:
  1. on the first slide, clicking the Pause button, will make it disappear and the Play button will show up: simplest solution with two buttons
  2. on the second slide, there is only one button with the text 'Play/Pause) that is already a real toggle, but its aspect will always be the same
  3. on the third and fourth slide you'll find also a toggle button, but the text will change to show you are now pausing or playing

Work flows

Solution 1: Play button and Pause button

On the first slide at the start only the Pause button, labeled BtPause is visible, whereas the second BtPlay is hidden. If you expect the user to return to this slide, you'd better set this situation on entering the slide by another standard advanced action. Both buttons trigger a standard advanced action, PauseBt/PlayBt (see screenshots in the Gallery) with these statements:
  • Assign rdcmndPause with 1 (for action PauseBt) or Assign rdcmndResume with 1 (for action PlayBt)
    here you see why I call those system variables 'twins'
  • Hide BtPause   (for action PauseBt)  or   Hide BtPlay  (for action PlayBt)
  • Show BtPlay  (for action PauseBt)   or   Show BtPause  (for action PlayBt))
The buttons I used are custom image buttons, of course you can use whatever you want; if you replace the button by an image with a click box, you have to show/hide the image as well of course.
If you use this action on more than one slide, you'll have to create a duplicate action for each slide, because of the ID's of the buttons that will be unique on each slide.
 
Warning: do not try to put those buttons on top of each other, perhaps to simulate the behavior of a toggle button, because this will not function!


Solution 2: Toggle button with text 'Play/Pause'

The second slide has an example of this toggle, with the disadvantage that the user doesn't see which state the movie has: paused or not.
Here a conditional action PlayPauseBt is needed, with one single decision (see screenshots: both Then and Else images are available). 
 
IF:     rdcmndPause is equal to 0
If this is the case, the movie is playing

THEN:    Assign rdcmndPause with 1
the movie will be paused

ELSE:    Assign rdcmndResume with 1
the movie will resume playing


If you do not mind the fact that the button will always have the same aspect this is really the simplest solution, because the action has no reference whatever to an object. This means that you can use it multiple times without haveing to create duplicates or have editing work. 

Same remark: you can also replace this button with your custom button, perhaps replace the text by an icon etc.
 

Solution 3: Toggle button with text 'Play/Pause'

This button can be found on the third/fourth slide. This time I used a blank image button BtPlayOrPause1/BtPlayOrPause2 (one ID per slide), accompanied by two Text Captions: TCPause1 & TCPlay1 for slide 3, TCPause2 & TCPlay2 for slide 3. I need again a conditional advanced action, but reusing it will force you to make duplicates because object ID's are used in the action. In the Gallery you'll find screenshots for the action PlayOrPauseBt1 that is activated by the first toggle on slide 3. 
 
IF:     rdcmndPause is equal to 0
If this is the case, the movie is playing

THEN:    
Assign rdcmndPause with 1         the movie will be paused
Hide TCPause1                                 the text Pause will be hidden
Show TCPlay1                                  text Play will be visible
ELSE:    
Assign rdcmndResume with 1     the movie will resume playing
Hide TCPlay1
Show TCPause1

Conclusion

If you want me to create a template with the advanced actions, post a comment. These actions are pretty simple, only the labeling and editing part if you use them a lot in a project are bothersome. One of my secret hopes is that in a future version of CP it will be possible to insert interactive objects on a master slide and the issue with the unique ID's will be solved.

Playtime with Audio and Widgets

Intro

Holiday time means playtime, travelling to me. For personal reasons not travel for me this year. So thought it a good idea to offer you some information and fun about a small country that I visited several times being the home country of my husband. In this text I will not try to explain everything. If you want explanations about some of the techniques I have been using, please post a comment. Just know that I used of course Captivate but also enjoyed the roundtrip functionalities with Audition and Photoshop in the eLearning Suite 2.5 extensively. 

In several previous articles I have been using widgets that are included with Captivate. Those were all static widgets. But recently two great widgets were published by friends, and I had a lot of fun including them in this movie.

Since months I planned to offer some tips about audio, will try to keep them really simple (KISS) and as promised without long texts.

Playtime

Watch this movie and try to have a high score playing with the widgets described further. You'll need some patience, due to the many audio clips it is bigger than the files I normally add to these posts. You can also download it if you want.

Widgets

I used two widgets, one is an interactive widget and the other is a question widget. This means that both can be (and were) used to include scores in a quiz. Here is a short description of the widgets and of course a link to the sites where you can find them. Highly recommendable, both of them!

Drag and Drop Interactive Widget 
This interactive widget was released by InfoSemantics (by Rod and Tristan Ward) and can be found here: Drag and Drop Interactive Widget. Rod explains very well the functionalities of an interactive widget and offers also a comparison with their previously released Drag and Drop Lite Question Widget. Of course, I used Advanced actions to construct the Question slides created with this recent widget. Let me know if you want me to explain those actions in a more elaborate article. I love this widget for its great range of functionalities, especially in combination with advanced actions.

Jumbled Word Widget
This question widget was released by another Captivate-friend, Yves Riel (Flash-Factor) and can be found here: Jumbled Word Widget. Because it is a question widget, it takes over all functionalities of question slides. Just one example: here I used Captivate 5.5 and the new Review feature is automatically attached to the slide with the question widget. No need for advanced actions to add scores to the Quiz in this case. But of course you also get the limitations of question slides : no way to have a partial score (as I created with the other widget for dragging the names to the map). I love this widget for its great design and it confirmed what I suspected since a while: Yves is a perfectionist!

Audio

A lot of audio was used in this movie: background (drums music), slide audio (some of the Voice overs are attached as slide audio) but the most powerful way to add/control audio is using object audio. Some reasons with examples:
  • Object audio allows you to have more than one audio clip playing simultaneously without having to create a multi-track audio file. 
    Example: slide 8 with the rollover slidelets; each slidelet has two audio clips, the first is attached to the image, and the second (Voice over) is attached to the Text Caption that appears later. This allowed also to fade out the first music clip, without effect on the Voice over.

  • You can manipulate object audio by (advanced) actions: hiding the object results in the audio not playing, showing the object plays the audio. If you want an audio to play only the first time that a slide is visited, this is a solution: attach the audio to an object that is visible to Captivate but not to the user. To myself I call those audio clips "audio objects".
    Example: the question slides constructed with the widgets have a Voice over that plays when the user takes the quiz, but not when he is reviewing the quiz. Moreover some question slides have a music clip as well, that will only play during the Quiz time, but not when reviewing. This was realized by attaching each music clip (VO and music) to a rectangle with a stroke width of 0 and a Fill with Alpha=0, thus making it invisible to the user. With an advanced action I hide those rectangles when reviewing, resulting in not playing nor the VO nor the music.

  • Same technique can be used to play another music clip in different situations.
    Example: I did not imply it in the movie because it was already very heavy, but this can be used to replace the Text Captions (Review Messages) in the Question slides created with the Drag and Drop Interactive Widget by Voice overs, or to add a Voice Over to those text captions.

I do feel that you have more questions, but I promised a no-text-heavy post this time. If you want me to explain something more in depth, please post a comment.

Have fun! 

Be unique! (labeling actions)

Intro

 
OK, I already confessed about being a labeling freak. A while ago I have tried to list all the advantages of labeling slides, objects, variables, actions Some reasons for labeling. But I never imagined that this would cause me troubles one day, make me bumping my head because I couldn't figure out what was going wrong. I owe it to you, loyal reader and follower, to avoid the same pitfall and will try in this blog post explaining what I will hopefully never forget again.
 

Unique labels

As you can detect from the title, the issue I had was linked with a label not being unique. I will first list up the rules to keep in mind for this uniqueness, for the different categories of items. Do not forget as well that all labels are case sensitive: 'One' is considered different from 'one' and from 'ONE'.
  

Object labels

Each object needs a unique label, even though it has already a unique ID. That is not really a problem, because when trying to assign a label to an object that is already attributed, Captivate will show this message
is either a reserved keyword or is already assigned to another item. Provide a different name for the item.
This means that Captivate is checking object label uniqueness all the time, and I feel safe.
 

Slide labels

You can assign the same label to different slides, Captivate doesn't apply this rule to slides. You can even use a label that already has been used for an object, a variable or an action. No problem.
 

Variable labels

Trying to apply the same label to a second variable will also result in a checkup and message by Captivate:
This variable name is already in use. Enter a new name.
Fine, feeling safe again, isn't that what software is meant to do? And Yes, you can assign the same label to a variable that is already assigned to an object. A typical example is a Text Entry Box. If you keep the default labels assigned by Cp both the TEB itself as the associated variable have the same label: Text_Entry_Box_1
 

Action labels

If I assign an identical label to a second advanced action, at the moment I want to save or update the script, my guardian angel Captivate tells me politely :
The script name is already in use
It will stop the saving operation and leaves the script intact, I can change/edit the action name and save it successfully. This rule is applied to all actions, no difference between conditional or standard actions they all need a unique label. As for the variables, you can use a label that is already given to an object and/or a variable safely. That can help identifying them if you have a large bunch of actions. Examples:  if you need an advanced action for each slide on entering, you could assign the same label to the slide and the action; if the action has to be triggered by a button use the same label etc.
 

Decision labels

In a conditional action you can have different decisions, also called 'internal actions' in contrast with the complete advanced actions that are called 'external actions'. Default label here is Untitled, but I like to change that to a more meaningful one. And like for slide, apparently here it is possible to have identical labels, no checkup by Captivate. But why should one use identical labels?
 

External actions - internal actions

I'm smiling because now I see virtual question marks in your eyes: "What was the issue then?'. Let me try to explain, what I was told by the Adobe team as an answer.
 
The external actions are the total advanced actions, conditional actions as well as standard actions. Captivate will always check if a new label is unique and offer you the message I described above under 'Action labels'.
 
In a conditional action, each decision is considered an internal action. When you create a new decision in an conditional advanced action, and label it, Captivate will also check something:
 Captivate checks if the label attributed to a new internal action isn't already attributed to an external action !
This seems strange to me, because it doesn't even check the uniqueness for the different internal actions in one conditional action. It would have been OK however if I got a similar message as for the actions, that told me that 'the script name is already in use'.
 
BUT!!! Captivate doesn't tell you anything, from the second decision on it just deletes the internal action that you wanted to save without any warning. This is a bug, that is still there for the moment.
 
Two examples for you to try out and to understand the problem better :

Example 1 (if you are lazy, watch the recording of this scenario)

  1. Create a standard action, label it test
  1. Create a conditional action, label it TEST: no problem, due to the case sensitivity, Captivate will accept this label when saving.
    1. create a first decision, default label will be 'Untitled', save the action
    2. change the label of this decision to TEST,  same name as the total conditional action, try to save and you'll get a message (great!) "Script update is not successful", Captivate did his homework.
    3. since the label was rejected, change it again to test (which is already attributed to another external action); again message appears, change to another label and save.
    4. create a second decision with name test and fully script it, choose Update, you get the message 'Script update successful', you trust CP and clicks on OK: and your second decision disappears...Captivate when checking did detect that the name already existed for an external action, but gave you the wrong message and deleted without warning.
If you revert 1 and 2, create the conditional action before the standard action, everything will work fine: when creating the standard action test Captivate only checks the other external actions, not the internal action etest that already xists in the conditional action.
 

Example 2

  1. Create a standard action, and label it Untitled
  2. Create a conditional action, leave the default name for the decisions set to Untitled
    1. create the first decision (Untitled), save the action and you get the message 'The script name is already in use', change the decision name
    2. create a second decision (Untitled), try to update, you get the message 'Script update successful' and when clicking OK, second decision is deleted.

Conclusion - tips

  • Never create an advanced actions with the label Untitled
  • If you have to create a conditional action with multiple decisions - internal actions, be sure to have a list with the names of the already created actions ready. I tend to keep that list in the scratch area of Captivate.
  • If you can cope with it, do not have too much decisions, leave their labels to Untitled (do not like that as you know)
  • If you label decisions in a conditional action, starting with the second decisions PLEASE check your list with existing action labels before clicking on Update.

Update: new features in release 5.5 that I used

Since Captivate 5.5 has now been officially released, I can tell you that the splash screen of my video was created with the new Gradient feature of this release. This gradient tool is fully customizable and a great way to enhance objects. In the movie I also used the new Shadow and Rotate features that are now available for all kind of objects. Both of them were used on the end slide: the Text Animation 'Where is my internal action'? is rotated with the Transform Accordion and I applied a shadow to the characters. There is a screenshot below. BTW: in the SWF published in the post Extended widgets for custom MCQ and T/F Questions I used the shadow feature a lot of times, explore...
 
 
 

Customized Progress Indicator

Intro

Do you use the Progress Indicator for Quizzes? I'm very frustrated about that indicator: you have the choice between a Relative or an Absolute indicator, you can adjust the style using the Object Style Manager, but... no way to change the phrasing of that indicator. It is always 'Question X of Y'. If you are an unhappy Captivate-user that needs to localize a lot of courses, this is really annoying. My Dutch-speaking students want a Dutch indicator, my French students want a French indicator etc.
 
It is really not so hard to create your own Progress indicator for Question slides, using rather simple advanced actions and a dedicated Master slide. In this tip I will explain the work flow step by step
 

Example

Play this movie to check the result. In this Quiz I do have 6 question slides. The first 3 questions use a master slide with a progress indicator in English, the last 3 use a similar master slide but with an indicator in Dutch. Do not panic: all questions are in English.

Work Flow

  • User variables: create 2 user variables, I labeled them
    • v_begin  to store the slide number of the last slide immediately before the first question slide 
    • v_current  to store the number of the question; since there is no accessible system variable for this information I will have to detect it from the current slide number

  • Advanced actions: create 2 advanced (standard) actions, I labeled them:
    • IndBegin: to be triggered on entering the last normal slide before the first question. It has only one real statement: to store the current slide number (system variable rdinfoCurrentSlide) in the user variable v_begin. First image in the Gallery shows this action.
    • IndCurrent; to be triggered on entering each question slide, it calculates the question number and stores it in the variable v_current. I do use the system variable rdinfoCurrentSlide again combined with the fixed  number stored in v_begin. Second image in the Gallery shows this action.

  • Attach the actions IndBegin to On Enter for the last slide before the questions and IndCurrent to all Question slides as the same On Enter action (can be done in one operation, select all the Question slides and use the Properties panel, Action accordion)

  • Master slide: create the master slide to be applied to all the Question slides. In this example I created 2 Master slides for the English and the Dutch questions, both based on the General master slide (for the background). Insert the text caption that shows the sentence to be used for the Progress indicator. The used variables in my Progress Indicator (see third image in the Gallery) were:
    • v_current the current question slide number, calculated with IndCurrent action
    • cpQuizInfoTotalQuestionsPerProject is a Quizzing system variable that shows the total number of questions in the project, you can of course also introduce this manually but I do not like to count myself
    • cpQuizInfoPointsPerQuestionSlice this is a bonus, not necessary but extra information for the learner, a Quizzing system variable as well. 

Conclusion

Hope you liked this small tip, and will be inspired to use variables on master slides.
 
 
 

 

Extended widgets for Custom MCQ and T/F questions

Intro

A while ago first part of my soap about using Widgets to create customized Question slides, types Multiple True/False and Multiple Choice: Widgets and Custom Question - part 1 was published. The used widgets (included in Captivate 5) were the Radiobuttons and the Checkboxes widgets. Second part was about using the TextArea widget: Widgets and Custom Questions - part 2 for Short Answer and Fill-in-the-Blank questions. Those default widgets cannot be 'reset', which means that you can change their associated variables using advanced actions, but the change will not be reflected on the stage for the user. If you want to offer the user multiple attempts that can be annoying. One of "our" great widget developers, Jim Leichliter offered an extended version of the TextArea widget as an answer to my complaint. This proves (again) how friendly and dynamic our Captivate Community is. In my last post I blogged about the improved functionality of this extended widget. And I got a positive answer on my request if he would be willing to extend the Radiobuttons and Checkboxes widgets as well. Again, he offers those extended widgets for free on his blog site:

RadioButtons Enhanced
CheckBoxes Enhanced

Both enhancements were created using the 'awesome cpGears widget framework' (citation of Jim), by another Captivate friend, Yves Riels. Find him on his blog, I love his InteractiveLabel and NotePad widgets a lot, but he has a lot more widgets to offer: Flash-factor

As promised to Jim, in this blog I'll try to explain the added functionality of those enhanced Radiobuttons and Checkboxes widgets. And watch out for an important warning later on. For those contaminated with AAAD (Advanced Actions Addiction Disease) detailed explanation of the actions are explained in this companion article:

Extended Radiobuttons and Checkboxes Widgets for Custom Questions


Example

Play this SWF to get an idea of the enhanced Retry options. I did use the same quiz as in the original blog post (part 1 - see link in the Intro). But in the original version there was only a Review option, this time I added a Retry option with 3 possibilities: either change the entered answers, or start from scratch (default work flow when choosing Retake in a regular Captivate Quiz), or preserve the correct answers and only retake the incorrect ones. Explore, and would love to hear what you think about it.


Widgets and variables

Three images in the Gallery do show the configuration of the widgets I used:

  • MCQ1: is a RadioButtons Widget used for a Multiple Choice Question with only one correct answer (second question in the movie); the associated variable is labeled MCQ1Answer (case sensitive) and the possible values are different app names. The configuration is the same as for the widget coming with Captivate. Difference is that when you change the value of the variable MCQ1Answer, it will be visible on the slide. If you choose the option Retry Totally, where you can start from scratch, an advanced actions will assign the value 0 (zero) to MCQ1Answer and the result will be that none of the radio buttons is checked on stage.

  • MCQM: is a CheckBoxes Widget used for a Multiple Choice Question with multiple correct answers (third question in the movie); the associated variables (one per option) are labeled CP,SB,PS,RH,Ac (case sensitive) and have to appear in the same sequence as the values Captivate 5,Soundbooth CS5,Photoshop,RoboHelp 9,Acrobat X. By resetting the variables to the value 0 (zero) all check boxes will be unchecked on the stage as is the case for the Retry option 'Totally.

  • Radio1: is one of the 4 RadioButtons Widgets used for the slide with multiple True/False questions (first question in the movie) - the others are labeled Radio2, Radio3 and Radio4; each had an associated variable, labeled TF1 (TF2, TF3, TF4); assigning the value 0 (zero) to a variable will deselect the radio buttons on stage.


Tips

  • Do not stack an interactive object on top of the widget(s) or they will not be functional. An example: if you put a click box over a widget that covers it all up, the widget will not work.

  • You can have multiple widgets on a slide, and they can cover up partially; this is the case for the slide with the multiple True/False questions as you can see in the image in the Gallery.

  • Do not bother to resize the widgets if they seem not to display everything, on review or after publishing everything will be OK! Look at the fourth image in the Gallery: the word False seems to be cut off, but shows up all right in the movie.

  • Formatting can be tedious: have a look at the Radio1 widget: I changed the font, font size, color (Dark blue #270067) and the 'highlight' color to the same color as the blueish grey of my background (#E3E3E3) to have it blend in. Why do I tell you the color code? If you are not using one of the sample colors in the color palette, the only way to have consistent colors is to type in the code. An example: to search for the code of the background I had to sample that color using the Pick Color tool that is available in the color palette for the Fill color in the Toolbox (vertical toolbar normally at the left of the stage). Because that color will not be automatically added to the samples in the color palette in the Widget dialog box, and since there is no Pick Color available in that box, the 'simplest' way to have the correct color is typing it in. You imagine some of my feature requests ;-)

  • NEVER DUPLICATE A WIDGET. Yes I'm shouting, because trying to reduce the formatting labour for the 4 RadioButtons widgets on the True/False slide, I did duplicate a widget. Every formatting was kept, and thought I only had to change the associated variable, because all other settings are the same. This will not work! The variable in the duplicate will never get a value. Do not follow my example this time, always insert the widget again and again and again. Change the formatting settings again and again and again. After a while you'll know all the color codes by heart.... 

And now...

waiting for the third episode: using dropdown and combobox widgets to create custom questions...


 

Extended TextArea Widget: more functionality

Intro

 
A couple of days ago, I "talked" about the TextArea widget coming for free with Captivate 5 for creating custom Fill-in-the-Blank and Short Answer Question slides. At that moment I told you that I did regret that it was not possible to change the associated user variable by an advanced action and have this visible in the TextArea Widget. Just when I was wondering if I would dare to ask some of the Widget princes of the Captivate Community to extend the functionality of this widget, Jim Leichliter simply offered such an extended version on his website: TextArea Widget with variables. It is a wonderful example of our dynamic community, and I'm so grateful to be part of it.
 
In this blog post I will show the added possibilities for the same Quiz as in the previous post. The changes to the advanced actions and the new to be created variables are be explained in this article published with the Adobe Community Publishing app. Please check my conclusion:


 

Example movie

Play this movie with the same 4 Question slides, described in the previous movie. It has an extra slide after the score slide with new functionalities:  3 possibilities to Retry the quiz, please try them out. This was not possible with the original CP-widget. And I remember questions on the user forum: is it possible to have users only retaking the incorrect questions? That is possibility 3 in this movie.
 

Extension of the widget

This extension allowed me to manipulate the content of the TextArea visible on the slides. With the standard Widget, the text entered in the TextArea is stored in the associated user variable, but if you change that user variable this will not be reflected on the slide. If you watched the movie in the previous blog post, and tested the Retry work flow, you'll have noticed that the answers introduced before remained on the slides. You were able to change them manually, but I couldn't clear the text or replace it.
 
With the extension this is possible. Here is my work flow for each of the 3 possibilities for Retrying:
 

Possibility 1:

The answer given the first time remain on the slides, the user can edit them - this was the only workflow possible with the default TextArea Widget, the user variable has not been changed.
 

Possibility 2:

All answers are cleared. I created extra user variables:
  • v_pos: will store the value 1, 2, 3 corresponding with the Retry possibility chosen, will be used in a conditional action
  • Start: has the text 'My answer: ' as content; in an advanced action the variables associated with the Short Answer TextArea widgets on the first 3 question slides will get this content, replacing the text input by the user, thus clearing the previous answer
  • Null:  is a user variable that is empty: in an advanced action the variables associated with the 3 widgets in the FIB Question will get this content, thus creating empty fields again.

Possibility 3:

Only incorrect answers are cleared, using the same user variables and technique as in possibility 2; correct answers with the given score will remain, using similar statements as for the Review work flow.
 

What next - Ideas?

One comment was about possibility to report to a LMS with custom questions: this is partly possible, will try to post my experiences shortly. But there are more widgets in the treasure box coming with Captivate to explore too. Please do not hesitate to comment or let me know your ideas.

Widgets and Custom Questions - part 2

Intro

As promised, here is the second but not last part of my soap about using (free) widgets to create customized questions. One of the most versatile widgets for this goal is the TextArea widget, it will be the only 'star' today. Not only is it a very fine alternative for Text Entry Boxes because it allows for better formatting, text wrapping and if necessary the appearance of a vertical scroll bar, but it can be associated with a variable, which makes it accessible ...for advanced actions!

I will illustrate the use of the TextArea widget for Short Answer questions with a lot more scoring options than the default Short Answer question and for Fill-in-the-Blank questions.

In this blog post I will explain how to use this widget and its possibilities, In detail explanation of the advanced actions can be found in this article

Using TextArea widget for Custom Questions 

Example movie

Explore the TextArea widget by playing this movie. It has and intro-slide, 4 question slides and a score slide:
  1. Short answer question (roundtripping): score will be based on keywords, all keywords have to be in the answer to get the score.
  2. Short answer question (languages): partial scoring but also on keywords, each correct keyword adds to the score
  3. Short answer question (web apps): only one out of 2 keywords needed to get the score
  4. Fill-in-the-Blank question (twitter): with partial scoring, each correct word adds to the score

On the score slide you will be able either to Review the questions or to Retry all questions and increment your score.

TextArea widget

This widget can be associated with a user variable, but you will have to define that variable separately (Project, Variables), same way I described for the Radiobuttons and Checkboxes widgets in part 1 (Widgets and Custom Questions - part 1). The first image of the Gallery shows the properties of the widget used on the first question slide (about roundtripping), WidgetRound, . Those properties are easy to configure, and the user variable is v_roundtrip. When exploring this widget I was excited by the fact that this variable will store the complete text that is entered. This looked like a promise for multiple possibilities in Short Answer questions. I never used the default Short Answer question because the score can only be attributed if the Short Answer is totally correct! And this is rarely necessary as I heard as well from other users on the forum. Usually the short answer should get a score when it mentions some keywords, not when it is exactly the same as the "correct entry".

Tip: while exploring this widget I detected that it will only be functional if it has its place in the Z-order (stack order) on the timeline above all interactive objects. In the Gallery the second image shows the Timeline of the first question slide about roundtripping. On this slide ShortAn1 you'll see the stack order from bottom to top:
  • TitleSA1 = title of the slide (text caption)
  • Quest1 = question (text caption)
  • BtSubmitRT = button Submit (interactive)
  • BtContRT = button Continue (interactive)
  • WidgetRound = TextArea Widget
  • RTFeedback = text caption with Feedback (non interactive)
  • ScoreRT = text caption showing the score (non interactive)
  • RetryRT = text caption that will show up if the question is retaken (non interactive)

If you switch the place of the Widget with one of the buttons, it will not be functional! I had to put the three last captions on top of the widget because they are partially covering up the widget's text box when they appear. They do not interfere with the widget's functionality because they are not interactive.


Question slides - description 

1. Short answer - all keywords necessary

This question has a score of 5 points. This score will be attributed if the answer contains both the keywords Photoshop AND Soundbooth. Probably some users will also add Powerpoint, but this will not be taken into account for the score.  It is annoying that not only the names of user variables are case sensitive but also the values! I assumed that users could type both Soundbooth and soundbooth, Photoshop and photoshop to create the unique but complex condition for the Submit button. You can see the settings for the Widget and the objects on the timeline in the Gallery.
The Buttons Submit and Continue are timed, the Continue button will only appear after the Submit button has been clicked, same setup as described for the custom questions in Part 1.


2. Short answer- partial scoring

Up to 4 keywords can result in a score, each keyword adds 2 points, the max. score thus being 8 points.
Setup of the widget and the objects on the timeline are the same as for the first question. The big difference is of course the advanced conditional action attached to the Submit button. Here it is a combination of 4 different decisions, one for each keyword.


3. Short answer - one out of two keywords

Two possible correct keywords (Flash + Dreamweaver), but the user needs only to have one mentioned in his short answer. The situation is the same as for the first Short Answer, with one condition in the setting 'Any of the conditions true', but again taking into account the case sensitivity. Widget Properties and objects on the timeline are similar to the first question.


4. Fill-in-the-Blank - 3 fields with partial scoring

In the third image of the Gallery you will see the Timeline of this slide, that uses 3 instances of the TextArea Widget. Perhaps you wonder why I prefer TextArea to Text Entry boxes? The user input in a TEB has to be confirmed, either by  a Submit button or by a shortcut, which is not the case for TextArea. The user can change his input if he wants and the value of the associated user variable will be adapted in real time.
Possible issues: you'll have to try a little bit to have the right size and position for the widgets. I first typed the correct terms and positioned the widget on top of those, but had to adapt the position even with the same font/fontsize.
In this FIB you cannot give the user the possibility to choose from a dropdown list, only to type the answer.

Partial scoring is however possible, the advanced conditional action attached to the Submit button is rather similar to the one used for the second question (Short answer with partial scoring). Again you have to take into account the case sensitivity.


Results Slide

The results slide has the same setup as described in my first blog post about Widgets and custom questions. To allow the Review/Retry I used a user variable v_try that will have 3 possible values:
  • v_try = 0  is inital value, when the user takes the quiz for the first time
  • v_try = 1  when he retakes the quiz
  • v_try = 2  when he reviews the quiz

Those values will be used to re-initialize each question slide (see article).

One drawback of the used widget: it is not possible to reset the value of the variable to void/null/empty! You can reset the associated variable to a Null value, but this will not be reflected in the display of the TextArea on the slides. Once the user has entered something, it will stay there until he changes it himself. You can watch this with the Retry functionality in the sample SWF.

Timer widget... to stress your learners

Intro

Perhaps a coincidence, but I answered this week twice a question about having a timer for a learner while taking a Quiz. It is possible to have a time limit and appropriate action set up in a LMS, but with the Timer widget that you get out of the box you can also provide this (stressful) information. Once I wrote about using the system variable cpInfoElapsedTimeMS (Quiz showing elapsed time) to display info about time spent on a slide. In this post I will try to explain the possible uses of the Timer widget. It is a small but useful widget that is associated with a user variable which allows to create advanced actions.
  

Use cases for Timer widget 

As is the case for most of the widgets coming with Captivate, the Timer is a static widget. As I explained in the post about the Button widget (Using the button widget) this is great news, because you can use the widget on master slides and on question slides. In the example movie you will that I used the widget twice:

  1. In its digital appearance (left at the bottom) it is counting down from the maximum allowed time for the total time on the question slides
  2. In its analog appearance (right at the bottom) it is counting up to the maximum time allowed per question slide
I will explain the workflow for both timers. Watch the movie first, I provided 10 sec for each question slide, but without any consequence if this limit is passed. For the total time the limit is 30sec and once you pass that limit you will not be able to continue with the next question but will be navigated immediately to the score slide. I re-used the questions described in the blog post (link).

Timer for total time - workflow

  • Create a user variable, I labeled it v_time;  it is not possible to create this from the dialog box with the widget properties.

  • Insert the widget on the first question slide and configure it as in the first picture of the Gallery: digital version, count down, with a message when count gets to zero and I formatted the characters;I labeled this widget 'TimerWidget'

  • Set the timing of this widget to diplay for the rest of the project (Properties panel, Timing accordion)

Because I do not want this Timer widget to stay visible on the last slide, the score slide, I created an advanced action EnterScore (screenshot in Gallery) that is executed on entering this slide with 3 statements.
Hide TimerWidget        (digital countdown timer for total Quiz time)
Hide TextTime             (text caption before the digital timer)
Assign v_time with 0    (to reset the variable and allow the user to review the quiz)
Limitation: it is impossible to restart the timer widget  Since I did hide this TimerWidget (total quiz time) the widget will be invisible during review.
  

Timer for individual Question time - workflow

Since  I did not want to have an action based on this second timer in this example, it is not necessary to create a user variable, nor to point to such a variable in the Properties dialog box.

  • Insert a second instance of the widget on the master slide that is used for the question slides
  • I configured this widget to be analog, to count up (to the maximum of 10sec) and changed the colors (see third screenshot)
I did not hide this timer during review. You cannot hide an object that is on the applied master slide. If you want to hide it, you will have to insert this widget on each question slide and use a condtional action to test and hide the widget on second visit. Remember: you can execute an advanced action on entering a default question slide, but not on exiting that slide. Moreover you cannot trigger advanced actions by the buttons on the default question slides. If you create custom question slides you do not have those limitations, but in this post I only want to demonstrate the use of the Timer widget.
  

Advanced action TimeCheck

Each advanced action has to be triggered by an event. Here I chose to have this action triggered on entering each question slide. This is not really necessary for the first question slide, because the timer sits on that slide and the user variable will always be set to 0 (False). This is a real simple conditional action: if the user variable contains the value 0, the user will be navigated immediately to the scored slide (see fourth screenshot in the gallery), if not (Else action - no screenshot) the statement Continue is executed.
  
This means that the learner gets a little bonus: his time is not exactly limited to 30secs, if he has entered a question slide before the counter got to 0, he will be able to answer that question, but the message will pop up. 
  
Mystery of the user variable: Want to warn you that the associated user variable doesn't store the time left, but only boolean values 0 or 1. And it took me a while to discover this. If you show the value of the user variable in a text caption (my way of debugging) it will show 'false' as long as the timer did not reach its limit and the value 'true' when time is up. So I tried out the condition 'If v_time is equal to true' but this did not work. You have to use the numerical values 1 (true) or 0 (false). This explains the decision:
if v_time is equal to 1
  


Captivate 6 users - warning

If you use the described work flow in version 6, there are possibly some problems:

  • when trying to associate a variable to the widget, not all characters will be accepted (like underscore) and some characters will be turned automatically into capitals; be sure to check that the defined variable has exactly the same name as the one you enter in the widget properties: Vtime will be accepted, but v_time not;
  • the values to check for the user variable Vtime are not 0 and 1 but true and false
  • having an action that on exceeding time will jump to another slide will not be functional if you use the new feature 'Submit all'

And for 6.1 users:  try using the new Countdown widget, it allows you to have an action immediately after the countdown reaches 0, contrary to the Timer widget that needs an extra event (like On Enter slide) to trigger an action. Will blog soon about the new widgets in 6.1.

More ideas?

Try this out with customized question slides, gives you a lot more control.
You can also create a more complex condition: if a user exceeds the time allowed for one question slide, jump immediately to the score slide or skip one or more question slides.

 

Articles on Advanced actions

Sorry, this is not a 'normal' blog post!

One of the reasons I started with this blog (September 2010) was my frustration that the articles I published with the Adobe Community Publishing did not reach users easily. Those articles try to explain in depth the basic rules of variables and advanced actions in Adobe Captivate 5 (and sometimes also for version 4) and mostly I offer a practice file. In this blog you will find some links to those articles.

Perhaps this list with links to all the published articles, and a small explanation could be useful. The list is posted on workspaces.acrobat.com, I published it and you can download it anonymously. As usual, I appreciate any comment or suggestion:

Lilybiri