<body><div id="__MailbirdStyleContent" style="font-size: 12pt;font-family: Calibri;color: #000000">
Hey Chris,<div><br></div><div>I committed two changes to Connectors and FSM to address the issues for 5.2alpha:</div><div><a href="http://www.squeaksource.com/Connectors/FSM-mt.47.mcz">http://www.squeaksource.com/Connectors/FSM-mt.47.mcz</a></div><div><a href="http://www.squeaksource.com/Connectors/Connectors-mt.208.mcz">http://www.squeaksource.com/Connectors/Connectors-mt.208.mcz</a></div><div><br></div><div>Best,</div><div>Marcel</div><div class="mb_sig"></div><blockquote class="history_container" type="cite" style="border-left-style:solid;border-width:1px; margin-top:20px; margin-left:0px;padding-left:10px;">
<p style="color: #AAAAAA; margin-top: 10px;">Am 31.05.2018 07:21:18 schrieb Marcel Taeumel <marcel.taeumel@hpi.de>:</p><div id="__MailbirdStyleContent" style="font-size: 12pt;font-family: Calibri;color: #000000">
Hey Chris,<div><br></div><div>both #layoutChanged and #changed MUST work for all morphs even if the morph is not in a world or has no owner. Please revert this change and fix NCAAConnectorMorph instad. Otherwise, this could break test code easily.</div><div><br></div><div>Best,</div><div>Marcel</div><div class="mb_sig"></div><blockquote class="history_container" type="cite" style="border-left-style:solid;border-width:1px; margin-top:20px; margin-left:0px;padding-left:10px;">
<p style="color: #AAAAAA; margin-top: 10px;">Am 30.05.2018 23:51:51 schrieb commits@source.squeak.org <commits@source.squeak.org>:</p>Chris Muller uploaded a new version of Morphic to project The Trunk:<br>http://source.squeak.org/trunk/Morphic-cmm.1443.mcz<br><br>==================== Summary ====================<br><br>Name: Morphic-cmm.1443<br>Author: cmm<br>Time: 30 May 2018, 4:50:16.716113 pm<br>UUID: 2f269941-1afa-4615-9242-9e485ecd986e<br>Ancestors: Morphic-mt.1442<br><br>- When updating a borderStyle:, only signal changes if the receiver is in the world for them to be seen. This fixes:<br> NCAAConnectorMorph new<br>- When halo's are on a background Morph, and a foreground morph covering it is blue-clicked, transfer the halos to the clicked morph.<br>- Disable the new #balanceOffsets when Smart Splitters is enabled, unfortunately they currently don't play nicely together.<br><br>=============== Diff against Morphic-mt.1442 ===============<br><br>Item was changed:<br> ----- Method: Morph>>borderStyle: (in category 'accessing') -----<br> borderStyle: aBorderStyle<br>- <br> aBorderStyle = self borderStyle ifTrue: [^ self].<br>- <br> "If we cannot draw the new border, accept at least its color and width."<br> ((self canDrawBorder: aBorderStyle) or: [aBorderStyle isNil])<br> ifTrue: [self setProperty: #borderStyle toValue: aBorderStyle]<br> ifFalse: [<br> self borderStyle<br> width: aBorderStyle width;<br> baseColor: aBorderStyle baseColor].<br>- <br> self borderStyle trackColorFrom: self.<br>+ self isInWorld ifTrue:<br>+ [ self<br>+ layoutChanged;<br>+ changed ]!<br>- <br>- self<br>- layoutChanged;<br>- changed.!<br><br>Item was changed:<br> ----- Method: PasteUpMorph>>tryInvokeHalo: (in category 'events-processing') -----<br>+ tryInvokeHalo: aUserInputEvent<br>+ "Invoke halos around the top-most world container at aUserInputEvent's #position. If it was already halo'd, zero-in on its next inward component morph at that position. Holding Shift during the click reverses this traversal order."<br>+ | stack target owners |<br>+ Preferences noviceMode ifTrue: [^self ].<br>+ Morph haloForAll ifFalse: [^self].<br>+ "the stack is the top-most morph to bottom-most."<br>+ stack := (self morphsAt: aUserInputEvent position unlocked: true) select: [ : each | each wantsHaloFromClick ].<br>+ stack ifEmpty: [^self].<br>+ target :=<br>+ aUserInputEvent hand halo<br>+ ifNil: [ stack first ] <br>+ ifNotNil:<br>+ [ : existingHalo |<br>+ stack allButFirst "halo's are always topmost on the stack"<br>+ detect: [ : each | each owner == self ]<br>+ ifFound:<br>+ [ : topMostWhereClicked |<br>+ (existingHalo target withAllOwners includes: topMostWhereClicked) <br>+ ifTrue: [ "No invocation needed. Halo will handle transfer itself." ^self ] <br>+ ifFalse:<br>+ [ "Transfer halo to new world container."<br>+ aUserInputEvent hand removeHalo. <br>+ aUserInputEvent shiftPressed<br>+ ifTrue: [ stack second ]<br>+ ifFalse: [ topMostWhereClicked ] ] ] <br>+ ifNone: ["Okay, invoke halos on the world." self ] ].<br>+ "With a modifier, we want the innermost, otherwise the outermost."<br>+ owners := target withAllOwners select: [ : each | each wantsHaloFromClick ].<br>+ "the last owner is expected to be self."<br>+ target := aUserInputEvent shiftPressed ifTrue: [ owners first ] ifFalse: [ owners at: owners size-1 ifAbsent: [self] ].<br>+ "Now that we have the target, show the halo. Abort event dispatching, too, to avoid confusion."<br>+ aUserInputEvent hand newMouseFocus: target event: aUserInputEvent.<br>+ target invokeHaloOrMove: aUserInputEvent.<br>+ "aUserInputEvent has been consumed, don't let it cause any further side-effects."<br>+ aUserInputEvent ignore!<br>- tryInvokeHalo: anEvent<br>- <br>- | innerMost target |<br>- anEvent hand halo ifNotNil: [^ self "No invocation needed. Halo will handle transfer itself."].<br>- Preferences noviceMode ifTrue: [^ self "No halo in novice mode."].<br>- Morph haloForAll ifFalse: [^ self].<br>- <br>- innerMost := (self morphsAt: anEvent position unlocked: true) first.<br>- <br>- "1) Try to use innermost morph but skip all the ones that do not want to show a halo along the owner chain."<br>- target := innerMost.<br>- [target isNil or: [target wantsHaloFromClick]]<br>- whileFalse: [target := target owner].<br>- target ifNil: [^ self].<br>- <br>- "2) Without a modifier, which is normal, find the outermost container for that inner morph."<br>- (innerMost == self or: [anEvent shiftPressed]) ifFalse: [<br>- | previousTargets |<br>- previousTargets := OrderedCollection new.<br>- [target notNil and: [target owner ~~ self]] whileTrue: [<br>- previousTargets add: target.<br>- target := target owner].<br>- target ifNil: [^ self].<br>- [previousTargets isEmpty or: [target wantsHaloFromClick]] whileFalse: [<br>- target := previousTargets removeLast].<br>- target wantsHaloFromClick ifFalse: [^ self]].<br>- <br>- "3) Now that we have the target, show the halo. Abort event dispatching, too, to avoid confusion."<br>- anEvent hand newMouseFocus: target event: anEvent.<br>- target invokeHaloOrMove: anEvent.<br>- anEvent ignore.!<br><br>Item was changed:<br> ----- Method: ProportionalSplitterMorph>>mouseUp: (in category 'events') -----<br> mouseUp: anEvent <br>+ (self bounds containsPoint: anEvent cursorPoint) ifFalse: [ anEvent hand showTemporaryCursor: nil ].<br>+ self class fastSplitterResize ifTrue: [ self updateFromEvent: anEvent ].<br>+ traceMorph ifNotNil:<br>+ [ traceMorph delete.<br>+ traceMorph := nil ].<br>- (self bounds containsPoint: anEvent cursorPoint)<br>- ifFalse: [anEvent hand showTemporaryCursor: nil].<br>- self class fastSplitterResize<br>- ifTrue: [self updateFromEvent: anEvent].<br>- traceMorph ifNotNil: [traceMorph delete. traceMorph := nil].<br> self color: self getOldColor.<br>+ "balanceOffsets currently disrupts Smart Splitter behavior."<br>+ (ProportionalSplitterMorph smartVerticalSplitters or: [ ProportionalSplitterMorph smartHorizontalSplitters ]) ifFalse: [ self balanceOffsets ]!<br>- <br>- self balanceOffsets!<br><br>Item was changed:<br> ----- Method: ProportionalSplitterMorph>>step (in category 'events') -----<br> step<br> splitsTopAndBottom<br> ifTrue: [ self reduceTopBottomImbalance ]<br> ifFalse:<br> [ self reduceLeftRightImbalance abs > 1 ifTrue:<br> [ self splittersLeftDo:<br> [ : splitter | splitter reduceLeftRightImbalance ].<br> self splittersRightDo:<br>+ [ : splitter | splitter reduceLeftRightImbalance ] ] ]!<br>- [ : splitter | splitter reduceLeftRightImbalance ] ] ].<br>- self balanceOffsets!<br><br><br>
</blockquote>
</div>
</blockquote>
</div></body>