<body><div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000">
Hi Christoph,<div><br></div><div>yeah, that decision has to be made on a case-by-case basis. It's still a long way to go to improve (or even fix) the modularity issues of Etoys. Still, it's nothing to be worried about for the upcoming 5.3 release. :-)</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 07.12.2019 19:13:19 schrieb Thiede, Christoph <christoph.thiede@student.hpi.uni-potsdam.de>:</p><div style="font-family:Arial,Helvetica,sans-serif">
<div dir="ltr">
<div id="x_divtagdefaultwrapper" dir="ltr" style="font-size: 12pt;color: #000000;font-family: Calibri,Helvetica,sans-serif">
<p>Just when you're moving things from Etoys into Morphic, what's about the other way around?</p>
<p><br>
</p>
<p>In Morph category classification:</p>
<p>Wouldn't #demandsBoolean belong into Etoys?</p>
<p>What was #modalTile for and is it obsolete now?</p>
<p>Then all the #is*Tile selectors: Shouldn't they be moved into an Etoys extension category and their senders too? That looks terribly coupled ...</p>
<p><br>
</p>
<p>Best,</p>
<p>Christoph</p>
<div id="x_Signature">
<div id="x_divtagdefaultwrapper" dir="ltr" style="font-size: 12pt;color: rgb(0,0,0);font-family: Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="x_divtagdefaultwrapper" style="font-family: Calibri,Arial,Helvetica,sans-serif;font-size: ;margin: 0">
<div><span style="font-size: 10pt;color: #808080"></span></div>
</div>
</div>
</div>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><span style="font-family: Calibri, sans-serif;color: #000000"><b>Von:</b> Squeak-dev <squeak-dev-bounces@lists.squeakfoundation.org> im Auftrag von commits@source.squeak.org <commits@source.squeak.org><br>
<b>Gesendet:</b> Freitag, 22. November 2019 17:39:01<br>
<b>An:</b> squeak-dev@lists.squeakfoundation.org; packages@lists.squeakfoundation.org<br>
<b>Betreff:</b> [squeak-dev] The Trunk: Morphic-mt.1592.mcz</span>
<div> </div>
</div>
</div>
<span style="font-size: 10pt"><span style="font-size: 10pt">
<div class="PlainText">Marcel Taeumel uploaded a new version of Morphic to project The Trunk:<br>
<a href="http://source.squeak.org/trunk/Morphic-mt.1592.mcz">http://source.squeak.org/trunk/Morphic-mt.1592.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: Morphic-mt.1592<br>
Author: mt<br>
Time: 22 November 2019, 5:38:54.489669 pm<br>
UUID: 7611ae0c-a1d0-ea42-84c5-0d2474fe2643<br>
Ancestors: Morphic-mt.1591<br>
<br>
Move rotation-specific stuff from Etoys to Morphic. It is used in Morphic anyway.<br>
<br>
#heading, #heading:<br>
#rotationDegrees, #rotationDegrees:<br>
#referencePosition, #referencePosition:<br>
#forwardDirection, #forwardDirection:<br>
<br>
=============== Diff against Morphic-mt.1591 ===============<br>
<br>
Item was added:<br>
+ ----- Method: CircleMorph>>heading (in category 'rotate scale and flex') -----<br>
+ heading<br>
+ "Overwritten to store the angle in #forwardDirection."<br>
+ <br>
+ ^ self rotationDegrees!<br>
<br>
Item was changed:<br>
+ ----- Method: CircleMorph>>heading: (in category 'rotate scale and flex') -----<br>
- ----- Method: CircleMorph>>heading: (in category 'geometry eToy') -----<br>
heading: newHeading<br>
+ "Overwritten to store the angle in #forwardDirection."<br>
+ <br>
- "Set the receiver's heading (in eToy terms).<br>
- Note that circles never use flex shells."<br>
self rotationDegrees: newHeading.!<br>
<br>
Item was changed:<br>
+ ----- Method: MatrixTransformMorph>>heading (in category 'rotate scale and flex') -----<br>
- ----- Method: MatrixTransformMorph>>heading (in category 'geometry eToy') -----<br>
heading<br>
"Return the receiver's heading (in eToy terms)"<br>
^ self forwardDirection + self innerAngle!<br>
<br>
Item was added:<br>
+ ----- Method: MatrixTransformMorph>>heading: (in category 'rotate scale and flex') -----<br>
+ heading: newHeading<br>
+ "Set the receiver's heading (in eToy terms)"<br>
+ self rotateBy: ((newHeading - self forwardDirection) - self innerAngle).!<br>
<br>
Item was changed:<br>
+ ----- Method: MatrixTransformMorph>>setDirectionFrom: (in category 'rotate scale and flex') -----<br>
- ----- Method: MatrixTransformMorph>>setDirectionFrom: (in category 'geometry eToy') -----<br>
setDirectionFrom: aPoint<br>
| delta degrees |<br>
delta := (self transformFromWorld globalPointToLocal: aPoint) - super rotationCenter.<br>
degrees := delta degrees + 90.0.<br>
self forwardDirection: (degrees \\ 360) rounded.<br>
!<br>
<br>
Item was changed:<br>
+ ----- Method: Morph>>forwardDirection (in category 'rotate scale and flex') -----<br>
- ----- Method: Morph>>forwardDirection (in category 'accessing') -----<br>
forwardDirection<br>
+ "Return the receiver's offset to distinguish #heading from #rotationDegrees."<br>
+ <br>
+ ^ self valueOfProperty: #forwardDirection ifAbsent: [0.0]!<br>
- "Return the receiver's forward direction (in eToy terms)"<br>
- ^self valueOfProperty: #forwardDirection ifAbsent:[0.0]!<br>
<br>
Item was added:<br>
+ ----- Method: Morph>>forwardDirection: (in category 'rotate scale and flex') -----<br>
+ forwardDirection: newDirection<br>
+ <br>
+ self setProperty: #forwardDirection toValue: newDirection.!<br>
<br>
Item was added:<br>
+ ----- Method: Morph>>heading (in category 'rotate scale and flex') -----<br>
+ heading<br>
+ "Answer the current heading, which is #rotationDegrees relative to the #forwardDirection."<br>
+ <br>
+ ^ self rotationDegrees + self forwardDirection!<br>
<br>
Item was added:<br>
+ ----- Method: Morph>>heading: (in category 'rotate scale and flex') -----<br>
+ heading: newHeading<br>
+ <br>
+ self rotationDegrees: (newHeading - self forwardDirection).!<br>
<br>
Item was changed:<br>
----- Method: Morph>>rotationDegrees (in category 'rotate scale and flex') -----<br>
rotationDegrees<br>
- "Default implementation."<br>
<br>
+ self isFlexed ifFalse: [^ 0.0].<br>
+ self owner in: [:flexShell | ^ flexShell rotationDegrees].!<br>
- ^ 0.0<br>
- !<br>
<br>
Item was added:<br>
+ ----- Method: Morph>>rotationDegrees: (in category 'rotate scale and flex') -----<br>
+ rotationDegrees: degrees<br>
+ <br>
+ self isFlexed ifFalse: [self addFlexShell].<br>
+ self owner in: [:flexShell | flexShell rotationDegrees: degrees].!<br>
<br>
Item was added:<br>
+ ----- Method: Morph>>setDirectionFrom: (in category 'rotate scale and flex') -----<br>
+ setDirectionFrom: aPoint<br>
+ | delta degrees |<br>
+ delta := (self transformFromWorld globalPointToLocal: aPoint) - self referencePosition.<br>
+ degrees := delta degrees + 90.0.<br>
+ self forwardDirection: (degrees \\ 360) rounded.<br>
+ !<br>
<br>
Item was added:<br>
+ ----- Method: PolygonMorph>>heading (in category 'rotate scale and flex') -----<br>
+ heading<br>
+ "Overwritten to store the angle in #forwardDirection."<br>
+ <br>
+ ^ self rotationDegrees!<br>
<br>
Item was added:<br>
+ ----- Method: PolygonMorph>>heading: (in category 'rotate scale and flex') -----<br>
+ heading: newHeading<br>
+ "Overwritten to store the angle in #forwardDirection."<br>
+ <br>
+ self rotationDegrees: newHeading.!<br>
<br>
Item was changed:<br>
+ ----- Method: PolygonMorph>>rotationDegrees: (in category 'rotate scale and flex') -----<br>
- ----- Method: PolygonMorph>>rotationDegrees: (in category 'halo control') -----<br>
rotationDegrees: degrees <br>
| flex center |<br>
(center := self valueOfProperty: #referencePosition) ifNil:<br>
[self setProperty: #referencePosition toValue: (center := self bounds center)].<br>
flex := (MorphicTransform offset: center negated)<br>
withAngle: (degrees - self forwardDirection) degreesToRadians.<br>
self setVertices: (vertices collect: [:v | (flex transform: v) - flex offset]).<br>
self forwardDirection: degrees.<br>
<br>
!<br>
<br>
Item was added:<br>
+ ----- Method: SketchMorph>>heading: (in category 'rotate scale and flex') -----<br>
+ heading: newHeading<br>
+ "If not rotating normally, change forward direction rather than heading"<br>
+ rotationStyle == #normal ifTrue:[^super heading: newHeading].<br>
+ self isFlexed<br>
+ ifTrue:[self forwardDirection: newHeading - owner rotationDegrees]<br>
+ ifFalse:[self forwardDirection: newHeading].<br>
+ self layoutChanged!<br>
<br>
Item was removed:<br>
- ----- Method: TransformationMorph>>degreesOfFlex (in category 'geometry eToy') -----<br>
- degreesOfFlex<br>
- "Return any rotation due to flexing"<br>
- ^ self rotationDegrees!<br>
<br>
Item was changed:<br>
+ ----- Method: TransformationMorph>>forwardDirection (in category 'rotate scale and flex') -----<br>
- ----- Method: TransformationMorph>>forwardDirection (in category 'accessing') -----<br>
forwardDirection<br>
"Return the rendee's forward direction. <br>
If I have no rendee then return 0.0 degrees "<br>
| rendee |<br>
( rendee := self renderedMorph) == self ifTrue: [ ^ 0.0 ] .<br>
<br>
^ rendee forwardDirection!<br>
<br>
Item was changed:<br>
+ ----- Method: TransformationMorph>>forwardDirection: (in category 'rotate scale and flex') -----<br>
- ----- Method: TransformationMorph>>forwardDirection: (in category 'geometry eToy') -----<br>
forwardDirection: degrees<br>
"If we have a rendee set its forward direction. Else do nothing." <br>
<br>
| rendee |<br>
( rendee := self renderedMorph) == self ifTrue: [ ^ self ] .<br>
^rendee forwardDirection: degrees!<br>
<br>
Item was changed:<br>
+ ----- Method: TransformationMorph>>heading (in category 'rotate scale and flex') -----<br>
- ----- Method: TransformationMorph>>heading (in category 'geometry eToy') -----<br>
heading<br>
"End recusion when necessary."<br>
| rendee |<br>
(rendee := self renderedMorph) == self ifTrue: [ ^0.0 ] .<br>
^ rendee heading!<br>
<br>
Item was changed:<br>
+ ----- Method: TransformationMorph>>heading: (in category 'rotate scale and flex') -----<br>
- ----- Method: TransformationMorph>>heading: (in category 'geometry eToy') -----<br>
heading: newHeading<br>
"If we have a rendee set its heading. Else do nothing." <br>
<br>
| rendee |<br>
( rendee := self renderedMorph) == self ifTrue: [ ^ self ] .<br>
^rendee heading: newHeading!<br>
<br>
Item was changed:<br>
----- Method: TransformationMorph>>rotationDegrees (in category 'rotate scale and flex') -----<br>
rotationDegrees<br>
+ "Overwritten because we can directly inform about the rotation."<br>
+ <br>
^ self angle radiansToDegrees negated!<br>
<br>
Item was changed:<br>
+ ----- Method: TransformationMorph>>rotationDegrees: (in category 'rotate scale and flex') -----<br>
- ----- Method: TransformationMorph>>rotationDegrees: (in category 'accessing') -----<br>
rotationDegrees: degrees<br>
+ "Overwritten because we know how to rotate our submorphs."<br>
+ <br>
self adjustAfter:[self angle: degrees degreesToRadians negated]!<br>
<br>
Item was changed:<br>
+ ----- Method: TransformationMorph>>setDirectionFrom: (in category 'rotate scale and flex') -----<br>
- ----- Method: TransformationMorph>>setDirectionFrom: (in category 'geometry eToy') -----<br>
setDirectionFrom: aPoint<br>
| delta degrees inner |<br>
inner := self renderedMorph.<br>
inner == self ifTrue:[^self].<br>
delta := (inner transformFromWorld globalPointToLocal: aPoint) - inner referencePosition.<br>
degrees := delta degrees + 90.0.<br>
self forwardDirection: (degrees \\ 360) rounded.<br>
!<br>
<br>
<br>
</div>
</span></span>
</div></blockquote>
</div></body>