[squeak-dev] The Inbox: Morphic-laza.573.mcz

Alexander Lazarević laza at blobworks.com
Wed Sep 14 10:55:52 UTC 2011


I was just looking for something quick and easy like this. Can't say
if this is of general interest and could be added to the trunk.

A limitation is, that there is no hint for the user, that the dialog
will be closed after a timeout or that the timeout got canceled
because of the user interacting with the dialog.
Some minor glitch is also, that the dialog gets auto closed even when
the user clicks _and_ holds a button.

But anyway here it is in the Inbox!

Alex

2011/9/14  <commits at source.squeak.org>:
> Alexander Lazarevi&#263; uploaded a new version of Morphic to project The Inbox:
> http://source.squeak.org/inbox/Morphic-laza.573.mcz
>
> ==================== Summary ====================
>
> Name: Morphic-laza.573
> Author: laza
> Time: 14 September 2011, 12:38:56.543 pm
> UUID: 49ca38c3-194b-4085-8fee-3f96c328c73f
> Ancestors: Morphic-nice.572
>
> Adds the option of a timeout to UserDialogBoxMorph. This lets you do things like:
>
> UserDialogBoxMorph inform: 'Squeak is great' timeout: 5.
>
> =============== Diff against Morphic-nice.572 ===============
>
> Item was changed:
>  AlignmentMorph subclass: #UserDialogBoxMorph
> +       instanceVariableNames: 'titleMorph labelMorph buttonRow value selectedButton cancelButton timeout autoCloseProcess'
> -       instanceVariableNames: 'titleMorph labelMorph buttonRow value selectedButton cancelButton'
>        classVariableNames: ''
>        poolDictionaries: ''
>        category: 'Morphic-Windows'!
>
>  !UserDialogBoxMorph commentStamp: 'ar 12/11/2009 22:33' prior: 0!
>  A DialogBoxMorph is Morph used in simple yes/no/confirm dialogs. Strongly modal.!
>
> Item was changed:
>  ----- Method: UserDialogBoxMorph class>>confirm:orCancel: (in category 'utilities') -----
>  confirm: aString orCancel: cancelBlock
> +       "UserDialogBoxMorph
> +               confirm: 'Do you like chocolate?'
> +               orCancel: [UserDialogBoxMorph inform: 'I''ll ask you later then']"
> -       "UserDialogBoxMorph confirm: 'Do you like chocolate?'"
>        ^self confirm: aString orCancel: cancelBlock at: nil!
>
> Item was changed:
>  ----- Method: UserDialogBoxMorph class>>confirm:orCancel:at: (in category 'utilities') -----
>  confirm: aString orCancel: cancelBlock at: aPointOrNil
> +       "UserDialogBoxMorph
> +               confirm: 'Do you like chocolate?'
> +               orCancel: [UserDialogBoxMorph inform: 'I''ll ask you later then']
> +               at: (Display width // 2)@(Display height * 0.38) rounded"
>
>        ^(self new
>                title: 'Please confirm:';
>                label: aString;
>                addSelectedButton: '       Yes       ' translated value: true;
>                addButton: '        No        ' translated  value: false;
>                addCancelButton: '     Cancel     ' translated  value: nil;
>                runModalIn: ActiveWorld forHand: ActiveHand at: aPointOrNil)
>                        ifNil: [ cancelBlock value ]!
>
> Item was added:
> + ----- Method: UserDialogBoxMorph class>>confirm:timeout: (in category 'utilities') -----
> + confirm: aString timeout: seconds
> +       "UserDialogBoxMorph confirm: 'Do you like chocolate?' timeout: 5"
> +       ^self confirm: aString title: 'Please confirm:' timeout: seconds!
>
> Item was added:
> + ----- Method: UserDialogBoxMorph class>>confirm:title:timeout: (in category 'utilities') -----
> + confirm: aString title: titleString timeout: seconds
> +       "UserDialogBoxMorph confirm: 'Make your choice carefully' withCRs title: 'Do you like chocolate?' timeout: 3"
> +       ^self confirm: aString title: titleString timeout: seconds at: nil!
>
> Item was added:
> + ----- Method: UserDialogBoxMorph class>>confirm:title:timeout:at: (in category 'utilities') -----
> + confirm: aString title: titleString timeout: seconds at: aPointOrNil
> +       "UserDialogBoxMorph confirm: 'Make your choice carefully' withCRs title: 'Do you like chocolate?' timeout: 3 at: 200 at 200"
> +       ^self new
> +               title: titleString;
> +               label: aString;
> +               timeout: seconds;
> +               addSelectedButton: '       Yes       ' translated value: true;
> +               addCancelButton: '        No        ' translated  value: false;
> +               runModalIn: ActiveWorld forHand: ActiveHand at: aPointOrNil!
>
> Item was changed:
>  ----- Method: UserDialogBoxMorph class>>inform: (in category 'utilities') -----
>  inform: aString
>        "UserDialogBoxMorph inform: 'Squeak is great!!'"
> +       ^self inform: aString timeout: nil!
> -       ^self inform: aString title: 'Note:'!
>
> Item was added:
> + ----- Method: UserDialogBoxMorph class>>inform:timeout: (in category 'utilities') -----
> + inform: aString timeout: seconds
> +       "UserDialogBoxMorph inform: 'Squeak is great!!' timeout: 5"
> +       ^self inform: aString title: 'Note:' timeout: seconds!
>
> Item was changed:
>  ----- Method: UserDialogBoxMorph class>>inform:title:at: (in category 'utilities') -----
>  inform: aString title: titleString at: aPointOrNil
>        "UserDialogBoxMorph inform: 'Squeak is great!!' title: 'Will you look at this:'"
> +       ^self inform: aString title: titleString timeout: nil at: aPointOrNil!
> -
> -       ^self new
> -               title: titleString;
> -               label: aString;
> -               addSelectedCancelButton: '       OK       ' translated value: nil;
> -               runModalIn: ActiveWorld forHand: ActiveHand at: aPointOrNil!
>
> Item was added:
> + ----- Method: UserDialogBoxMorph class>>inform:title:timeout: (in category 'utilities') -----
> + inform: aString title: titleString timeout: seconds
> +       "UserDialogBoxMorph inform: 'Squeak is great!!' title: 'Will you look at this:' timeout: 5"
> +       ^self inform: aString title: titleString timeout: seconds at: nil!
>
> Item was added:
> + ----- Method: UserDialogBoxMorph class>>inform:title:timeout:at: (in category 'utilities') -----
> + inform: aString title: titleString timeout: seconds at: aPointOrNil
> +       "UserDialogBoxMorph inform: 'Squeak is great!!' title: 'Will you look at this:' timeout: 3 at: 50 at 50"
> +
> +       ^self new
> +               title: titleString;
> +               label: aString;
> +               timeout: seconds;
> +               addSelectedCancelButton: '       OK       ' translated value: nil;
> +               runModalIn: ActiveWorld forHand: ActiveHand at: aPointOrNil!
>
> Item was added:
> + ----- Method: UserDialogBoxMorph>>autoCloseBlock (in category 'running') -----
> + autoCloseBlock
> +       ^[
> +               (Delay forSeconds: self timeout) wait.
> +               selectedButton ifNotNil: [selectedButton performAction]
> +       ]!
>
> Item was changed:
>  ----- Method: UserDialogBoxMorph>>closeDialog: (in category 'running') -----
>  closeDialog: returnValue
>        value := returnValue.
> +       self delete.
> +       "Make sure the autoCloseProcess will be terminated.
> +       This needs to happen at the end of this method since our sender could be just inside the autoCloseProcess"
> +       self stopAutoClose!
> -       self delete.!
>
> Item was changed:
>  ----- Method: UserDialogBoxMorph>>keyStroke: (in category 'events') -----
>  keyStroke: evt
> -
>        | evtCharacter |
> +       self stopAutoClose.
>        evtCharacter := evt keyCharacter.
>        evtCharacter = Character escape ifTrue: [
>                ^cancelButton ifNotNil: [ cancelButton performAction ] ].
>        evtCharacter = Character cr ifTrue: [
>                ^selectedButton ifNotNil: [ selectedButton performAction ] ].
>        (evtCharacter = Character arrowLeft or: [
>                evt shiftPressed and: [ evtCharacter = Character tab ] ]) ifTrue: [
>                        ^self selectPreviousButton ].
>        (evtCharacter = Character arrowRight or: [
>                evtCharacter = Character tab ]) ifTrue: [
> +                       ^self selectNextButton ]!
> -                       ^self selectNextButton ].!
>
> Item was changed:
>  ----- Method: UserDialogBoxMorph>>mouseDown: (in category 'events') -----
>  mouseDown: event
> +       self stopAutoClose.
>        "Always bring me to the front since I am modal"
>        self comeToFront.
>        (self containsPoint: event position) ifFalse:[
>                Beeper beepPrimitive.
>                ^self flash].
> +       event hand grabMorph: self!
> -       event hand grabMorph: self.!
>
> Item was changed:
>  ----- Method: UserDialogBoxMorph>>mouseUp: (in category 'events') -----
>  mouseUp: event
> +       self stopAutoClose.
>        "aggressively preserve focus"
> +       event hand newMouseFocus: self!
> -       event hand newMouseFocus: self.!
>
> Item was changed:
>  ----- Method: UserDialogBoxMorph>>runModalIn:forHand:at: (in category 'running') -----
>  runModalIn: aWorld forHand: aHand at: aPointOrNil
>        "Ensure that we have a reasonable minimum size"
>        | oldFocus pos |
>        (ProvideAnswerNotification signal: self label asString) ifNotNil:[:answer| ^answer].
>        self openInWorld: aWorld.
>        pos := (aPointOrNil ifNil:[aHand position]) - (self fullBounds extent // 2).
>        self setConstrainedPosition: pos hangOut: false.
>        oldFocus := aHand keyboardFocus.
>        aHand newMouseFocus: self.
>        aHand newKeyboardFocus: self.
> +       self timeout ifNotNil: [autoCloseProcess := self autoCloseBlock fork].
>        [self isInWorld] whileTrue:[aWorld doOneSubCycle].
>        oldFocus ifNotNil:[aHand keyboardFocus: oldFocus].
>        ^value!
>
> Item was added:
> + ----- Method: UserDialogBoxMorph>>stopAutoClose (in category 'running') -----
> + stopAutoClose
> +       autoCloseProcess ifNotNil: [autoCloseProcess terminate]!
>
> Item was added:
> + ----- Method: UserDialogBoxMorph>>timeout (in category 'constructing') -----
> + timeout
> +       ^timeout!
>
> Item was added:
> + ----- Method: UserDialogBoxMorph>>timeout: (in category 'constructing') -----
> + timeout: seconds
> +       timeout := seconds!
>
>
>



More information about the Squeak-dev mailing list