From 26fad996c88dd2483d815673bb752e87b92c7cfa Mon Sep 17 00:00:00 2001 From: Stephen Smith Date: Fri, 10 Apr 2026 14:29:07 -0400 Subject: [PATCH 1/3] Add screencap to ButtonDemo --- chapter-04/contents.texinfo | 4 +++- chapter-04/img/ch04-buttondemo-window.png | Bin 0 -> 20771 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 chapter-04/img/ch04-buttondemo-window.png diff --git a/chapter-04/contents.texinfo b/chapter-04/contents.texinfo index 3f00844..aa66f8c 100644 --- a/chapter-04/contents.texinfo +++ b/chapter-04/contents.texinfo @@ -70,7 +70,7 @@ layout := window layoutMorph. layout padding: 10. window openInWorld; - morphExtent: 300 @@ layout minimumExtent y.} + morphExtent: 400 @@ layout minimumExtent y.} @smalltalkMethod{toggleColor, layout color: ( @@ -84,6 +84,8 @@ to see its tooltip (a.k.a balloon text). Click the "Toggle" button several times and note how the window background color changes. +@figure{ButtomDemo window, ch04-buttondemo-window, 4} + @cindex widget @subentry menu @node Menu @section Menu diff --git a/chapter-04/img/ch04-buttondemo-window.png b/chapter-04/img/ch04-buttondemo-window.png new file mode 100644 index 0000000000000000000000000000000000000000..8fefdacde171f31d2bdcb951259fb81eede8ce74 GIT binary patch literal 20771 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 Date: Fri, 10 Apr 2026 15:32:51 -0400 Subject: [PATCH 2/3] Change order of presentation of SelectionMenu options --- chapter-04/contents.texinfo | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/chapter-04/contents.texinfo b/chapter-04/contents.texinfo index aa66f8c..36f3cd8 100644 --- a/chapter-04/contents.texinfo +++ b/chapter-04/contents.texinfo @@ -111,13 +111,13 @@ PopUpMenu inform: 'Something interesting just happened.'.} @figure{A pop up menu to answer Yes or No, ch04-popupmenu-confirm, 4} -@smalltalkExampleCaption{Yes or No pop up menu,popupMenu2, +@smalltalkExampleCaption{Yes or No pop up menu, popupMenu2, likesIceCream := PopUpMenu confirm: 'Do you like ice cream?'. likesIceCream print. "prints true or false"} @figure{A pop up menu to select among two choices, ch04-popupmenu-confirm-truechoice-falsechoice, 4} -@smalltalkExampleCaption{Two choices pop up menu,popupMenu3, +@smalltalkExampleCaption{Two choices pop up menu, popupMenu3, likesIceCream := PopUpMenu confirm: 'Do you like ice cream?' trueChoice: 'Love it!' @@ -128,7 +128,7 @@ likesIceCream print. "prints true or false"} @smalltalkExampleCaption{Many choices pop up menu, popupMenu4, color := PopUpMenu withCaption: 'Choose a color.' chooseFrom: #('red' 'green' 'blue'). -color print. "prints choice index 1@comma{} 2@comma{} or 3"} +color print. "prints choice to the Transcript as an index 1@comma{} 2@comma{} or 3"} @cindex widget @subentry menu @subentry selection @subsection Selection menu @@ -136,34 +136,33 @@ color print. "prints choice index 1@comma{} 2@comma{} or 3"} The @class{SelectionMenu} class is a subclass of @class{PopupMenu}; it gives a bit more flexibility to the developer. Indeed, once the user selects a menu entry, instead of returning this index entry as -@class{PopUp Menu} does, it returns an associated object to this +@class{PopUpMenu} does, it can return an associated object to this entry. It is therefore more flexible. +In our example we want a color object instead of an index. To do so, we tell +@class{SelectionMenu} about a collection of colors from which to obtain the +returned value depending on the user-selected menu entry. + For example: -@smalltalkExampleCaption{Selection menu@comma{} index answer,popupMenu5, +@smalltalkExampleCaption{Selection menu with object answer, popupMenu5, labels := #('Red sky at sunset' 'A Clockwork Orange' 'Yellow submarine' 'Green peace' 'The Blue dot' 'Purple rain'). lines := #(3 6). "draw lines after these indexes" -menu := SelectionMenu labels: labels lines: lines. +colors := @{Color red . Color orange . Color yellow . Color green . Color blue . Color purple@}. +menu := SelectionMenu labels: labels lines: lines selections: colors. selection := menu startUpMenu. -selection print. "prints the selected menu entry index"} - -Still returns the index of the selected menu entry, which may not be very -helpful. +selection print. "prints the selected menu entry's object"} @figure{A selection menu without title, ch04-selectionmenu, 3} -What we want is a color object instead of an index. To do so, we tell -@class{SelectionMenu} about a collection of colors from which to obtain the -returned value depending on the user-selected menu entry. +If you would rather return the index of the selected menu entry, simply call +the @class{SelectionMenu} class's instance creation method @method{labels:lines:} +instead. To do so, remove the line beginning with 'colors' in our example above +and replace the line beginning with 'menu' with this line: -@smalltalkExampleCaption{Selection menu@comma{} value answer,popupMenu6, -@dots{} -colors := @{Color red . Color orange. Color yellow . Color green . Color blue . Color purple@}. -menu := SelectionMenu labels: labels lines: lines selections: colors. -selection := menu startUpMenu. -selection print. "prints the selected color"} +@smalltalkExampleCaption{Selection menu with index answer, popupMenu6, +menu := SelectionMenu labels: labels lines: lines. "replaces previous menu line"} In the following example, we demonstrate a use case of @class{SelectionMenu} in a @class{MenuDemo} class. From 3e3f802cfe1cbb94186388aea73a0f74267e1548 Mon Sep 17 00:00:00 2001 From: Stephen Smith Date: Fri, 10 Apr 2026 16:52:01 -0400 Subject: [PATCH 3/3] Fix missing space in color collection --- chapter-04/contents.texinfo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapter-04/contents.texinfo b/chapter-04/contents.texinfo index 36f3cd8..4586400 100644 --- a/chapter-04/contents.texinfo +++ b/chapter-04/contents.texinfo @@ -200,7 +200,7 @@ appropriate selection of colors from which to pick an answer. @return{} SelectionMenu labels: #('Red sky at sunset' 'A Clockwork Orange' 'Yellow submarine' 'Green peace' 'The Blue dot' 'Purple rain') - selections: @{Color red . Color orange. Color yellow . Color green . Color blue . Color purple@}} + selections: @{Color red . Color orange . Color yellow . Color green . Color blue . Color purple@}} @figure{A selection menu open, ch04-selectionmenu2, 6}