Steph,�
Hi fernando
May be you know more than me on MorphicEventHandler.
Gofer new
� � � � �squeaksource: 'PharoNonCorePackages';
� � � � package: 'Sound';
� � � � package: 'SoundMorphicUserInterface';
� � � � load.
While trying to make
� � � � PianoKeyboardMorph new openInWorld
� � � � (which works in 1.4 and does not in 20).
It breaks here:
-------------
mouseUpPitch: pitch event: event noteMorph: noteMorph
� � � � noteMorph color: ((#(0 1 3 5 6 8 10) includes: pitch \\12)
� � � � � � � � � � � � � � � � � � � � ifTrue: [whiteKeyColor]
� � � � � � � � � � � � � � � � � � � � ifFalse: [blackKeyColor]).
� � � � soundPlaying ifNotNil: [soundPlaying stopGracefully].
pitch is nil because notify:from: uses valueParameter which is nil.
-------------
mouseUpPitch is invoked by notify: anEvent from: sourceMorph which is invoked by notifyMorphsOfEvent: anEvent ofType: eventType from: sourceMorph
notify: anEvent from: sourceMorph
� � � � | arity |
� � � � recipient ifNil: [^ self].
� � � � arity := selector numArgs.
� � � � arity = 0 ifTrue:
� � � � � � � � [^ recipient perform: selector].
� � � � arity = 1 ifTrue:
� � � � � � � � [^ recipient perform: selector with: anEvent].
� � � � arity = 2 ifTrue:
� � � � � � � � [^ recipient perform: selector with: anEvent with: sourceMorph].
� � � � arity = 3 ifTrue:
� � � � � � � � [^ recipient perform: selector with: valueParameter with: anEvent with: sourceMorph].
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ^^^^^^^^^^^^^^^^^^^^^^^
� � � � self error: 'Event handling selectors must be Symbols and take 0-3 arguments'
notifyMorphsOfEvent: anEvent ofType: eventType from: sourceMorph
� � � � | result |
� � � � result := false.
� � � � ((subscriptions includesKey: eventType) not or: [ (subscriptions at: eventType) isEmpty ])
� � � � � � � � ifTrue: [ ^false ].
� � � � (subscriptions at: eventType) do: [ :s | result := result | ((s notify: anEvent from: sourceMorph) == true) ].
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
� � � � ^result
The idea is that morphs get notified when a certain event occurs so when we look at the morph creation and event registry we get:
The buildKeyboard create morph and define event with a given value that will be used
� � � � on: #mouseDown send: #mouseDownPitch:event:noteMorph: to: self withValue: i-1*12 + (#(2 4 7 9 11) at: j)
below:
buildKeyboard
� � � � | wtWid bkWid keyRect octavePt nWhite nBlack |
� � � � self removeAllMorphs.
� � � � wtWid := 8. bkWid := 5.
� � � � self extent: 10@10.
� � � � 1 to: nOctaves+1 do:
� � � � � � � � [:i | i <= nOctaves ifTrue: [nWhite := 7. �nBlack := 5]
� � � � � � � � � � � � � � � � � � � � � � � � ifFalse: [nWhite := 1. �nBlack := 0 "High C"].
� � � � � � � � octavePt := self innerBounds topLeft + ((7*wtWid*(i-1)-1) @ -1).
� � � � � � � � 1 to: nWhite do:
� � � � � � � � � � � � [:j | keyRect := octavePt + (j-1*wtWid@0) extent: (wtWid+1)@36.
� � � � � � � � � � � � self addMorph: ((RectangleMorph newBounds: keyRect color: whiteKeyColor)
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � borderWidth: 1;
� � � � � � � � � � � � � � � � on: #mouseDown send: #mouseDownPitch:event:noteMorph: to: self
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � withValue: i-1*12 + (#(1 3 5 6 8 10 12) at: j))].
� � � � � � � � 1 to: nBlack do:
� � � � � � � � � � � � [:j | keyRect := octavePt + ((#(6 15 29 38 47) at: j)@1) extent: bkWid@21.
� � � � � � � � � � � � self addMorph: ((Morph newBounds: keyRect color: blackKeyColor)
� � � � � � � � � � � � � � � � on: #mouseDown send: #mouseDownPitch:event:noteMorph: to: self
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � withValue: i-1*12 + (#(2 4 7 9 11) at: j))]].
� � � � self submorphsDo:
� � � � � � � � [:m | m on: #mouseMove send: #mouseMovePitch:event:noteMorph: to: self;
� � � � � � � � � � � � � � � � on: #mouseUp send: #mouseUpPitch:event:noteMorph: to: self;
� � � � � � � � � � � � � � � � on: #mouseEnterDragging send: #mouseDownPitch:event:noteMorph: to: self;
� � � � � � � � � � � � � � � � on: #mouseLeaveDragging send: #mouseUpPitch:event:noteMorph: to: self].
� � � � self extent: (self fullBounds extent + borderWidth - 1)
Now I can understand that
� � � � #mouseDownPitch:event:noteMorph: get notified with a value because this is what is written.
But I do not get why this would be the case with #mouseUpPitch:event:noteMorph:
since we simply get
� � � � on: #mouseUp send: #mouseUpPitch:event:noteMorph: to: self;
And I do not get why this was working in 1.4