<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>