<body><div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000">
Hi Christoph,<div><br></div><div>I know. We should come up with a solution for that. Maybe re-print the commit messages of all ancestors as soon as the number of ancestors is > 1.</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 13.11.2019 12:51:06 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 for interest, is it usual & desired behavior that when installing these updates, the update log does not include any of my commit messages?</p>
<div id="x_Signature">
<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>
<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> Mittwoch, 13. November 2019 12:15:14<br>
<b>An:</b> squeak-dev@lists.squeakfoundation.org; packages@lists.squeakfoundation.org<br>
<b>Betreff:</b> [squeak-dev] The Trunk: EToys-mt.368.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 EToys to project The Trunk:<br>
<a href="http://source.squeak.org/trunk/EToys-mt.368.mcz">http://source.squeak.org/trunk/EToys-mt.368.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: EToys-mt.368<br>
Author: mt<br>
Time: 13 November 2019, 12:15:07.673043 pm<br>
UUID: 3f6873fa-5111-ac4a-a108-9031e19e5f40<br>
Ancestors: EToys-kfr.363, EToys-ct.354, EToys-ct.355, EToys-ct.356, EToys-ct.357, EToys-ct.358, EToys-ct.359, EToys-ct.360, EToys-ct.364, EToys-ct.365, EToys-ct.367<br>
<br>
Merge! Merge! Merge! Various fixes in Etoys-related places.<br>
<br>
=============== Diff against EToys-kfr.363 ===============<br>
<br>
Item was added:<br>
+ ----- Method: Form>>scaledToWidth: (in category '*Etoys-Squeakland-scaling, rotation') -----<br>
+ scaledToWidth: newWidth<br>
+ "Answer the receiver, scaled such that it has the desired width."<br>
+ <br>
+ newWidth = self width ifTrue: [^ self].<br>
+ ^self magnify: self boundingBox by: (newWidth / self width) smoothing: 2.<br>
+ !<br>
<br>
Item was changed:<br>
----- Method: FreeCell>>help (in category 'actions') -----<br>
help<br>
+ <br>
+ self helpText editWithLabel: 'FreeCell Help'.!<br>
- | window helpMorph |<br>
- window := SystemWindow labelled: 'FreeCell Help' translated.<br>
- window model: self.<br>
- helpMorph := (PluggableTextMorph new editString: self helpText) lock.<br>
- window<br>
- addMorph: helpMorph<br>
- frame: (0 @ 0 extent: 1 @ 1).<br>
- window openInWorld!<br>
<br>
Item was added:<br>
+ ----- Method: MovingEyeMorph>>color: (in category 'accessing') -----<br>
+ color: aColor<br>
+ <br>
+ super color: aColor.<br>
+ <br>
+ "Migrate old instances."<br>
+ inner color: Color transparent.<br>
+ <br>
+ "Keep iris visible."<br>
+ aColor = iris color<br>
+ ifTrue: [iris borderWidth: 1; borderColor: aColor negated]<br>
+ ifFalse: [iris borderWidth: 0].!<br>
<br>
Item was changed:<br>
----- Method: MovingEyeMorph>>initialize (in category 'initialization') -----<br>
initialize<br>
"initialize the state of the receiver"<br>
super initialize.<br>
""<br>
inner := EllipseMorph new.<br>
+ inner color: Color transparent.<br>
- inner color: self color.<br>
inner extent: (self extent * (1.0 @ 1.0 - IrisSize)) asIntegerPoint.<br>
- inner borderColor: self color.<br>
inner borderWidth: 0.<br>
""<br>
iris := EllipseMorph new.<br>
iris color: Color white.<br>
iris extent: (self extent * IrisSize) asIntegerPoint.<br>
""<br>
self addMorphCentered: inner.<br>
inner addMorphCentered: iris.<br>
""<br>
self extent: 26 @ 33!<br>
<br>
Item was added:<br>
+ ----- Method: MovingEyeMorph>>irisColor (in category 'accessing') -----<br>
+ irisColor<br>
+ <br>
+ ^ iris color!<br>
<br>
Item was added:<br>
+ ----- Method: MovingEyeMorph>>irisColor: (in category 'accessing') -----<br>
+ irisColor: aColor<br>
+ <br>
+ iris color: aColor.<br>
+ <br>
+ "Keep iris visible."<br>
+ aColor = self color<br>
+ ifTrue: [iris borderWidth: 1; borderColor: aColor negated]<br>
+ ifFalse: [iris borderWidth: 0].!<br>
<br>
Item was added:<br>
+ ----- Method: MovingEyeMorph>>irisPos (in category 'accessing') -----<br>
+ irisPos<br>
+ <br>
+ ^ iris position!<br>
<br>
Item was changed:<br>
+ ----- Method: MovingEyeMorph>>irisPos: (in category 'accessing') -----<br>
- ----- Method: MovingEyeMorph>>irisPos: (in category 'as yet unclassified') -----<br>
irisPos: cp<br>
<br>
| a b theta x y |<br>
theta := (cp - self center) theta.<br>
a := inner width // 2.<br>
b := inner height // 2.<br>
x := a * (theta cos).<br>
y := b * (theta sin).<br>
iris position: ((x@y) asIntegerPoint) + self center - (iris extent // 2).!<br>
<br>
Item was changed:<br>
----- Method: MovingEyeMorph>>step (in category 'stepping and presenter') -----<br>
step<br>
| cp |<br>
cp := self globalPointToLocal: self world primaryHand position.<br>
(inner containsPoint: cp)<br>
ifTrue: [iris position: (cp - (iris extent // 2))]<br>
+ ifFalse: [self irisPos: cp].!<br>
- ifFalse: [self irisPos: cp].<br>
- self changed "cover up gribblies if embedded in Flash"!<br>
<br>
Item was changed:<br>
----- Method: NewVariableDialogMorph>>decimalPlaces (in category 'accessing') -----<br>
decimalPlaces<br>
^ decimalPlacesButton<br>
ifNil: [Utilities <br>
decimalPlacesForFloatPrecision: (self targetPlayer<br>
+ defaultFloatPrecisionFor: self varAcceptableName asSetterSelector)]<br>
- defaultFloatPrecisionFor: (Utilities getterSelectorFor: self varAcceptableName))]<br>
ifNotNil: [:button| button label asNumber]!<br>
<br>
Item was changed:<br>
----- Method: Player>>newScriptorAround: (in category 'viewer') -----<br>
newScriptorAround: aPhrase<br>
"Sprout a scriptor around aPhrase, thus making a new script. aPhrase may either be a PhraseTileMorph (classic tiles 1997-2001) or a SyntaxMorph (2001 onward)"<br>
<br>
| aScriptEditor aUniclassScript tw blk |<br>
Cursor wait showWhile: [<br>
aUniclassScript := self class permanentUserScriptFor: self unusedScriptName player: self.<br>
aScriptEditor := aUniclassScript instantiatedScriptEditorForPlayer: self.<br>
<br>
Preferences universalTiles ifTrue: [<br>
aScriptEditor install.<br>
"aScriptEditor hResizing: #shrinkWrap;<br>
vResizing: #shrinkWrap;<br>
cellPositioning: #topLeft;<br>
setProperty: #autoFitContents toValue: true."<br>
aScriptEditor insertUniversalTiles. "Gets an empty SyntaxMorph for a MethodNode"<br>
+ tw := aScriptEditor findA: ScrollPane.<br>
- tw := aScriptEditor findA: TwoWayScrollPane.<br>
aPhrase ifNotNil:<br>
[blk := (tw scroller findA: SyntaxMorph "MethodNode") findA: BlockNode.<br>
blk addMorphFront: aPhrase.<br>
aPhrase accept.<br>
].<br>
SyntaxMorph setSize: nil andMakeResizable: aScriptEditor.<br>
] ifFalse: [<br>
aPhrase <br>
ifNotNil: [aScriptEditor phrase: aPhrase] "does an install"<br>
ifNil: [aScriptEditor install]<br>
].<br>
self class allSubInstancesDo: [:anInst | anInst scriptInstantiationForSelector: aUniclassScript selector].<br>
"The above assures the presence of a ScriptInstantiation for the new selector in all siblings"<br>
self updateScriptsCategoryOfViewers.<br>
].<br>
^ aScriptEditor!<br>
<br>
Item was changed:<br>
----- Method: Preferences class>>initializePreferencePanel:in: (in category '*Etoys-Squeakland-preferences panel') -----<br>
initializePreferencePanel: aPanel in: aPasteUpMorph<br>
"Initialize the given Preferences panel. in the given pasteup, which is the top-level panel installed in the container window. Also used to reset it after some change requires reformulation"<br>
<br>
| tabbedPalette controlPage aColor aFont maxEntriesPerCategory tabsMorph anExtent prefObjects |<br>
aPasteUpMorph removeAllMorphs.<br>
<br>
aFont := Preferences standardListFont.<br>
+ aColor := aPanel windowColorToUse.<br>
- aColor := aPanel defaultBackgroundColor.<br>
tabbedPalette := TabbedPalette newSticky.<br>
tabbedPalette dropEnabled: false.<br>
(tabsMorph := tabbedPalette tabsMorph) color: aColor darker;<br>
highlightColor: Color red regularColor: Color brown darker darker.<br>
tabbedPalette on: #mouseDown send: #yourself to: #().<br>
maxEntriesPerCategory := 0.<br>
self listOfCategories do: <br>
[:aCat | <br>
controlPage := AlignmentMorph newColumn beSticky color: aColor.<br>
controlPage on: #mouseDown send: #yourself to: #().<br>
controlPage dropEnabled: false.<br>
controlPage borderColor: aColor;<br>
layoutInset: 4.<br>
(prefObjects := self preferenceObjectsInCategory: aCat) do:<br>
[:aPreference | | button |<br>
button := aPreference representativeButtonWithColor: Color white inPanel: aPanel.<br>
button ifNotNil: [controlPage addMorphBack: button]].<br>
controlPage setNameTo: aCat asString.<br>
aCat = #?<br>
ifTrue: [aPanel addHelpItemsTo: controlPage].<br>
tabbedPalette addTabFor: controlPage font: aFont.<br>
aCat = 'search results' ifTrue:<br>
[(tabbedPalette tabNamed: aCat) setBalloonText:<br>
'Use the ? category to find preferences by keyword; the results of your search will show up here' translated].<br>
maxEntriesPerCategory := maxEntriesPerCategory max: prefObjects size].<br>
tabbedPalette selectTabNamed: '?'.<br>
tabsMorph rowsNoWiderThan: aPasteUpMorph width.<br>
aPasteUpMorph on: #mouseDown send: #yourself to: #().<br>
anExtent := aPasteUpMorph width @ (490 max: (25 + tabsMorph height + (24 * maxEntriesPerCategory))).<br>
aPasteUpMorph extent: anExtent.<br>
aPasteUpMorph color: aColor.<br>
aPasteUpMorph addMorphBack: tabbedPalette.!<br>
<br>
Item was changed:<br>
----- Method: ScriptEditorMorph>>autoFitOnOff (in category 'menu') -----<br>
autoFitOnOff<br>
"Toggle between auto fit to size of code and manual resize with scrolling"<br>
| tw |<br>
+ (tw := self findA: ScrollPane) ifNil: [^ self].<br>
- (tw := self findA: TwoWayScrollPane) ifNil: [^ self].<br>
(self hasProperty: #autoFitContents)<br>
ifTrue: [self removeProperty: #autoFitContents.<br>
self hResizing: #rigid; vResizing: #rigid]<br>
ifFalse: [self setProperty: #autoFitContents toValue: true.<br>
self hResizing: #shrinkWrap; vResizing: #shrinkWrap].<br>
tw layoutChanged!<br>
<br>
Item was changed:<br>
----- Method: ScriptEditorMorph>>extent: (in category 'other') -----<br>
extent: x<br>
<br>
| newExtent tw menu |<br>
newExtent := x max: self minWidth @ self minHeight.<br>
+ (tw := self findA: ScrollPane) ifNil:<br>
- (tw := self findA: TwoWayScrollPane) ifNil:<br>
["This was the old behavior"<br>
^ super extent: newExtent].<br>
<br>
(self hasProperty: #autoFitContents) ifTrue: [<br>
menu := MenuMorph new defaultTarget: self.<br>
menu addUpdating: #autoFitString target: self action: #autoFitOnOff.<br>
menu addTitle: 'To resize the script, uncheck the box below' translated.<br>
menu popUpEvent: nil in: self world .<br>
^ self].<br>
<br>
"Allow the user to resize to any size"<br>
tw extent: ((newExtent x max: self firstSubmorph width)<br>
@ (newExtent y - self firstSubmorph height)) - (self borderWidth * 2) + (-4 @ -4). "inset?"<br>
^ super extent: newExtent!<br>
<br>
Item was changed:<br>
----- Method: ScriptEditorMorph>>hibernate (in category 'other') -----<br>
hibernate<br>
"Possibly delete the tiles, but only if using universal tiles."<br>
<br>
| tw |<br>
Preferences universalTiles ifFalse: [^self].<br>
+ (tw := self findA: ScrollPane) isNil <br>
- (tw := self findA: TwoWayScrollPane) isNil <br>
ifFalse: <br>
[self setProperty: #sizeAtHibernate toValue: self extent. "+ tw xScrollerHeight"<br>
submorphs size > 1 ifTrue: [tw delete]]!<br>
<br>
Item was added:<br>
+ ----- Method: SpectrumAnalyzerMorph>>fftSize: (in category 'accessing') -----<br>
+ fftSize: aSize<br>
+ <br>
+ | on |<br>
+ on := soundInput isRecording.<br>
+ self stop.<br>
+ fft := FFT new: aSize.<br>
+ self resetDisplay.<br>
+ on ifTrue: [self start].!<br>
<br>
Item was changed:<br>
----- Method: SpectrumAnalyzerMorph>>setFFTSize (in category 'menu and buttons') -----<br>
setFFTSize<br>
"Set the size of the FFT used for frequency analysis."<br>
<br>
+ | aMenu sz |<br>
- | aMenu sz on |<br>
aMenu := CustomMenu new title: ('FFT size (currently {1})' translated format:{fft n}).<br>
((7 to: 10) collect: [:n | 2 raisedTo: n]) do:[:r | aMenu add: r printString action: r].<br>
sz := aMenu startUp.<br>
sz ifNil: [^ self].<br>
+ self fftSize: sz.!<br>
- on := soundInput isRecording.<br>
- self stop.<br>
- fft := FFT new: sz.<br>
- self resetDisplay.<br>
- on ifTrue: [self start].<br>
- !<br>
<br>
Item was changed:<br>
----- Method: SyntaxMorph class>>setSize:andMakeResizable: (in category 'as yet unclassified') -----<br>
setSize: oldExtent andMakeResizable: outerMorph<br>
| tw |<br>
+ (tw := outerMorph findA: ScrollPane) ifNil: [^self].<br>
- (tw := outerMorph findA: TwoWayScrollPane) ifNil: [^self].<br>
tw hResizing: #spaceFill;<br>
vResizing: #spaceFill;<br>
color: Color transparent;<br>
setProperty: #hideUnneededScrollbars toValue: true.<br>
outerMorph <br>
hResizing: #shrinkWrap;<br>
vResizing: #shrinkWrap;<br>
cellPositioning: #topLeft.<br>
outerMorph fullBounds.<br>
!<br>
<br>
Item was changed:<br>
----- Method: SyntaxMorph>>enclosingPane (in category 'accessing') -----<br>
enclosingPane<br>
"The object that owns this script layout"<br>
<br>
| oo higher |<br>
oo := self owner.<br>
[higher := oo isSyntaxMorph.<br>
higher := higher or: [oo class == TransformMorph].<br>
+ higher := higher or: [oo class == ScrollPane].<br>
- higher := higher or: [oo class == TwoWayScrollPane].<br>
higher ifFalse: [^ oo].<br>
higher] whileTrue: [oo := oo owner].<br>
!<br>
<br>
Item was removed:<br>
- ----- Method: SyntaxMorph>>inAScrollPane (in category 'initialization') -----<br>
- inAScrollPane<br>
- "Answer a scroll pane in which the receiver is scrollable"<br>
- <br>
- ^ self inATwoWayScrollPane!<br>
<br>
Item was changed:<br>
----- Method: SyntaxMorph>>openInWindow (in category 'initialization') -----<br>
openInWindow<br>
<br>
+ | sel |<br>
- | window widget sel |<br>
sel := ''.<br>
self firstSubmorph allMorphs do: [:rr | <br>
+ (rr isKindOf: StringMorph) ifTrue: [sel := sel, rr contents]].<br>
- (rr isKindOf: StringMorph) ifTrue: [sel := sel, rr contents]].<br>
- window := (SystemWindow labelled: 'Tiles for ', self parsedInClass printString, '>>',sel).<br>
- widget := self inAScrollPane.<br>
- widget color: Color paleOrange.<br>
- window<br>
- addMorph: widget<br>
- frame: (0@0 extent: 1.0@1.0).<br>
- window openInWorldExtent: (<br>
- self extent + (20@40) min: (Display boundingBox extent * 0.8) rounded<br>
- )<br>
<br>
+ ^ self inAScrollPane<br>
+ color: Color paleOrange;<br>
+ openInWindowLabeled: 'Tiles for ', self parsedInClass printString, '>>', sel!<br>
- !<br>
<br>
Item was added:<br>
+ ----- Method: SyntaxMorph>>parseNodeWith:asStatement: (in category '*Etoys-Squeakland-code generation') -----<br>
+ parseNodeWith: encoder asStatement: aBoolean<br>
+ <br>
+ ^ self parseNode!<br>
<br>
Item was changed:<br>
----- Method: SyntaxMorph>>unhighlightBorder (in category 'highlighting') -----<br>
unhighlightBorder<br>
<br>
self currentSelectionDo: [:innerMorph :mouseDownLoc :outerMorph |<br>
+ (self == outerMorph or: [owner notNil and: [owner isSyntaxMorph not]])<br>
+ ifFalse: [self borderColor: self stdBorderColor]<br>
+ ifTrue: [<br>
+ (self hasProperty: #deselectedBorderColor)<br>
+ ifTrue: [self borderColor: (self valueOfProperty: #deselectedBorderColor)]<br>
+ ifFalse: [self borderStyle: (BorderStyle raised width: self borderWidth)]] ].!<br>
- self borderColor: (<br>
- (self == outerMorph or: [owner notNil and: [owner isSyntaxMorph not]])<br>
- ifFalse: [self borderColor: self stdBorderColor]<br>
- ifTrue: [<br>
- (self hasProperty: #deselectedBorderColor)<br>
- ifTrue: [self borderColor: (self valueOfProperty: #deselectedBorderColor)]<br>
- ifFalse: [self borderStyle: (BorderStyle raised width: self borderWidth)]] )].!<br>
<br>
Item was changed:<br>
----- Method: TileMorph>>wrapPhraseInFunction (in category '*Etoys-Squeakland-arrows') -----<br>
wrapPhraseInFunction<br>
"The user made a gesture requesting that the phrase for which the receiver bears the widget hit be wrapped in a function. This applies for the moment only to numeric functions"<br>
<br>
| pad newPad functionPhrase |<br>
pad := self ownerThatIsA: TilePadMorph. "Or something higher than that???"<br>
(pad isNil or: [pad type ~= #Number]) ifTrue: [^ Beeper beep].<br>
newPad := TilePadMorph new setType: #Number.<br>
+ newPad hResizing: #shrinkWrap; vResizing: #spaceFill.<br>
- newPad hResizing: #shrinkWrap; vResizing: #spacefill.<br>
functionPhrase := FunctionTile new.<br>
newPad addMorphBack: functionPhrase.<br>
pad owner replaceSubmorph: pad by: newPad.<br>
functionPhrase operator: #abs pad: pad.<br>
functionPhrase addSuffixArrow.<br>
self scriptEdited<br>
!<br>
<br>
Item was changed:<br>
----- Method: TilePadMorph>>wrapInFunction (in category '*Etoys-Squeakland-miscellaneous') -----<br>
wrapInFunction<br>
"The user made a gesture requesting that the receiver be wrapped in a (numeric) function."<br>
<br>
| newPad functionPhrase |<br>
newPad := TilePadMorph new setType: #Number.<br>
+ newPad hResizing: #shrinkWrap; vResizing: #spaceFill.<br>
- newPad hResizing: #shrinkWrap; vResizing: #spacefill.<br>
functionPhrase := FunctionTile new.<br>
newPad addMorphBack: functionPhrase.<br>
owner replaceSubmorph: self by: newPad.<br>
functionPhrase operator: #abs pad: self.<br>
self scriptEdited!<br>
<br>
Item was changed:<br>
----- Method: VariableNode>>asMorphicSyntaxIn: (in category '*Etoys-tiles') -----<br>
asMorphicSyntaxIn: parent<br>
<br>
^ parent addToken: self name<br>
type: #variable <br>
+ on: self shallowCopy "don't hand out the prototype!! See VariableNode>>initialize"<br>
- on: self clone "don't hand out the prototype!! See VariableNode>>initialize"<br>
!<br>
<br>
Item was changed:<br>
+ ----- Method: WatchMorph class>>fontName:bgColor:centerColor: (in category 'instance creation') -----<br>
- ----- Method: WatchMorph class>>fontName:bgColor:centerColor: (in category 'as yet unclassified') -----<br>
fontName: aString bgColor: aColor centerColor: otherColor<br>
^ self new<br>
fontName: aString;<br>
color: aColor;<br>
centerColor: otherColor!<br>
<br>
Item was changed:<br>
----- Method: WorldWindow class>>test2 (in category 'as yet unclassified') -----<br>
test2<br>
"WorldWindow test2."<br>
<br>
| window world scrollPane |<br>
world := WiWPasteUpMorph newWorldForProject: nil.<br>
window := (WorldWindow labelled: 'Scrollable World') model: world.<br>
+ window addMorph: (scrollPane := ScrollPane new model: world)<br>
- window addMorph: (scrollPane := TwoWayScrollPane new model: world)<br>
frame: (0@0 extent: 1.0@1.0).<br>
scrollPane scroller addMorph: world.<br>
world hostWindow: window.<br>
window openInWorld<br>
!<br>
<br>
<br>
</div>
</span></span>
</div></blockquote>
</div></body>