<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from text --><style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<meta content="text/html; charset=UTF-8">
<style type="text/css" style="">
<!--
p
{margin-top:0;
margin-bottom:0}
-->
</style>
<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><font size="2" color="#808080"></font></div>
</div>
</div>
</div>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><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</font>
<div> </div>
</div>
</div>
<font size="2"><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></font>
</body>
</html>