Some of us, including me, will need to see the changes in the next
release so that we can apply them to the Etoys Reference Manual.
Others who want to take a look should speak up.
When can we download and test this version?
I have just wrapped up another manual, and can come back to this one now.
On Wed, January 22, 2014 3:39 pm, Bert Freudenberg wrote:
> (moving to etoys-dev)
>
> Awesome! :)
>
> - Bert -
>
> On 22.01.2014, at 20:49, karl ramberg <karlramberg(a)gmail.com> wrote:
>
>>
>>
>>
>> On Wed, Jan 22, 2014 at 12:44 PM, Bert Freudenberg
>> <bert(a)freudenbergs.de> wrote:
>> Karl: do you want to take a stab at doing an Etoys release? I don't have
>> the time to actually do it, but I am willing to do some hand-holding :)
>>
>> I will try. Must read up on this stuff, because it is easy to mess up.
>>
>> I think I will start by collecting the changes since last release.
>>
>> Hand holding and maybe some help with passwords is needed.
>> I have changed computers a few times and I'm not sure I the subversion
>> password.
>>
>> Cheers,
>> Karl
>>
>> - Bert -
>>
>> On 21.01.2014, at 21:52, karl ramberg <karlramberg(a)gmail.com> wrote:
>>
>>> We have release process but it's a little complicated.
>>> http://etoys.squeak.org/svn/trunk/Documentation/Release-HowTo.txt
>>>
>>> Karl
>>>
>>>
>>> On Mon, Jan 20, 2014 at 5:34 PM, Gustavo Duarte
>>> <gduarte(a)activitycentral.com> wrote:
>>> Bert,
>>>
>>> I saw the commit to fix the sugar interaction was done.
>>>
>>> To generate the deb package of Etoys with the last changes, without
>>> wait for the upsream release: It is right the following procedure ?:
>>>
>>> 1) Run Etoys, and from unnamed project, update from server code.
>>> 2) Save the changes
>>> 3) Copy etoys.image and etoys.changes to my source code tree
>>> 4) Generate the deb package.
>>>
>>>
>>> My doubt, is meanly if only etoys.image and etoys.changes are needed to
>>> copy ?
>>>
>>>
>>> Thanks.
>>> Gustavo.
>>>
>>>
>>>
>>>
>>> On Fri, Jan 17, 2014 at 5:52 PM, Gustavo Duarte
>>> <gduarte(a)activitycentral.com> wrote:
>>> Bert, thank a ton for the fix.
>>>
>>> I added the bug to the tracker and upload the fix.
>>>
>>> http://tracker.squeakland.org/browse/SQ-1200
>>>
>>> I gonna wait, to be included on upstream.
>>>
>>> I hope procedure followed was be right.
>>>
>>> Thanks.
>>> Gustavo
>>>
>>>
>>> On Fri, Jan 17, 2014 at 9:51 AM, Bert Freudenberg
>>> <bert(a)freudenbergs.de> wrote:
>>> Hi Gustavo,
>>>
>>> the problem is not in the XMLDomParser, but how it it used. Apparently
>>> the way gconf stores its values changed. Previously both numeric and
>>> string values had a separate entity inside, like you discovered. Now it
>>> appears int values are stored in a more compact way.
>>>
>>> The problem is in the SugarLauncher>>gconfPropertiesAt: method. It
>>> treats strings and int properties the same way.
>>>
>>> Instead of "entry elements first contentString" it might use "entry
>>> attributeAt: 'value' ifAbsent: [entry elements first contentString]".
>>> This should work with both the old and the new format. Here's the full
>>> method, patched (but untested):
>>>
>>> gconfPropertiesAt: aString
>>> | dir |
>>> "search up tree to guess home dir"
>>> dir := Project squeakletDirectory.
>>> [dir pathName = '/'] whileFalse: [
>>> dir := dir containingDirectory.
>>> [FileStream
>>> readOnlyFileNamed: dir pathName, '/.gconf', aString, '/%gconf.xml'
>>> do: [:f |
>>> | props |
>>> props := Dictionary new.
>>> (XMLDOMParser parseDocumentFrom: f)
>>> tagsNamed: #entry do: [:entry |
>>> props at: (entry attributeAt: 'name')
>>> put: (entry attributeAt: 'value'
>>> ifAbsent: [entry elements first contentString])].
>>> ^props].
>>> ] on: FileDoesNotExistException do: [:ignore | ].
>>> ].
>>> ^self error: 'cannot find gconf path ', aString
>>>
>>> This document describes how to publish a fix for Etoys:
>>>
>>> http://etoys.squeak.org/svn/trunk/Documentation/Developer-HowTo.txt
>>>
>>> If you just want to fix it in the distro rather than waiting for an
>>> upstream release, you should be able to change the method, enter the
>>> hidden unnamed top-level project, and save the image from that project
>>> (it is important to be in that project when saving the image).
>>>
>>> - Bert -
>>>
>>> On 16.01.2014, at 15:54, Gustavo Duarte <gduarte(a)activitycentral.com>
>>> wrote:
>>>
>>>> Hi Georg,
>>>>
>>>> The xml file content is:
>>>>
>>>> <?xml version="1.0"?>
>>>> <gconf>
>>>> <entry name="color" mtime="1389708067" type="string">
>>>> <stringvalue>#9A5200,#FF2B34</stringvalue>
>>>> </entry>
>>>>
>>>> <entry name="birth_timestamp" mtime="1389708044" type="int"
>>>> value="-849347955"/>
>>>>
>>>> <entry name="ip" mtime="1389708044" type="string">
>>>> <stringvalue>1.2.3.4</stringvalue>
>>>> </entry>
>>>>
>>>> <entry name="SugarBuddyOwner" mtime="1389708044"
>>>> type="string">
>>>> <stringvalue>1234</stringvalue>
>>>> </entry>
>>>>
>>>> <entry name="nick" mtime="1389708044" type="string">
>>>> <stringvalue>estudiante</stringvalue>
>>>> </entry>
>>>> </gconf>
>>>>
>>>> I don't know much about xml format, but seemingly it hasn't XML schema
>>>> specification, right ?
>>>>
>>>>
>>>> On Thu, Jan 16, 2014 at 11:11 AM, Georg Gollmann
>>>> <gollmann(a)zid.tuwien.ac.at> wrote:
>>>>
>>>> Am 16.01.2014 um 13:10 schrieb Gustavo Duarte
>>>> <gduarte(a)activitycentral.com>:
>>>>
>>>>> I guess that XMLDOMParser doesn't support the xml line format:
>>>>> <entry name="birth_timestamp" mtime="1389708044" type="int"
>>>>> value="-849347955"/>.
>>>>>
>>>>> I don't know much about xml format, but i think that is valid format
>>>>> entry, so XMLDOMParser has bug.
>>>>
>>>>
>>>> Whether the bug is in the parser or the file depends on the XML schema
>>>> specified in the file.
>>>>
>>>> Kind regards
>>>> Georg
>>>
>>> - Bert -
--
Edward Mokurai (默雷/निशब्दगर्ज/نشبدگرج) Cherlin
Silent Thunder is my name, and Children are my nation.
The Cosmos is my dwelling place, the Truth my destination.
http://wiki.sugarlabs.org/go/Replacing_Textbooks
(moving to etoys-dev)
Awesome! :)
- Bert -
On 22.01.2014, at 20:49, karl ramberg <karlramberg(a)gmail.com> wrote:
>
>
>
> On Wed, Jan 22, 2014 at 12:44 PM, Bert Freudenberg <bert(a)freudenbergs.de> wrote:
> Karl: do you want to take a stab at doing an Etoys release? I don't have the time to actually do it, but I am willing to do some hand-holding :)
>
> I will try. Must read up on this stuff, because it is easy to mess up.
>
> I think I will start by collecting the changes since last release.
>
> Hand holding and maybe some help with passwords is needed.
> I have changed computers a few times and I'm not sure I the subversion password.
>
> Cheers,
> Karl
>
> - Bert -
>
> On 21.01.2014, at 21:52, karl ramberg <karlramberg(a)gmail.com> wrote:
>
>> We have release process but it's a little complicated.
>> http://etoys.squeak.org/svn/trunk/Documentation/Release-HowTo.txt
>>
>> Karl
>>
>>
>> On Mon, Jan 20, 2014 at 5:34 PM, Gustavo Duarte <gduarte(a)activitycentral.com> wrote:
>> Bert,
>>
>> I saw the commit to fix the sugar interaction was done.
>>
>> To generate the deb package of Etoys with the last changes, without wait for the upsream release: It is right the following procedure ?:
>>
>> 1) Run Etoys, and from unnamed project, update from server code.
>> 2) Save the changes
>> 3) Copy etoys.image and etoys.changes to my source code tree
>> 4) Generate the deb package.
>>
>>
>> My doubt, is meanly if only etoys.image and etoys.changes are needed to copy ?
>>
>>
>> Thanks.
>> Gustavo.
>>
>>
>>
>>
>> On Fri, Jan 17, 2014 at 5:52 PM, Gustavo Duarte <gduarte(a)activitycentral.com> wrote:
>> Bert, thank a ton for the fix.
>>
>> I added the bug to the tracker and upload the fix.
>>
>> http://tracker.squeakland.org/browse/SQ-1200
>>
>> I gonna wait, to be included on upstream.
>>
>> I hope procedure followed was be right.
>>
>> Thanks.
>> Gustavo
>>
>>
>> On Fri, Jan 17, 2014 at 9:51 AM, Bert Freudenberg <bert(a)freudenbergs.de> wrote:
>> Hi Gustavo,
>>
>> the problem is not in the XMLDomParser, but how it it used. Apparently the way gconf stores its values changed. Previously both numeric and string values had a separate entity inside, like you discovered. Now it appears int values are stored in a more compact way.
>>
>> The problem is in the SugarLauncher>>gconfPropertiesAt: method. It treats strings and int properties the same way.
>>
>> Instead of "entry elements first contentString" it might use "entry attributeAt: 'value' ifAbsent: [entry elements first contentString]". This should work with both the old and the new format. Here's the full method, patched (but untested):
>>
>> gconfPropertiesAt: aString
>> | dir |
>> "search up tree to guess home dir"
>> dir := Project squeakletDirectory.
>> [dir pathName = '/'] whileFalse: [
>> dir := dir containingDirectory.
>> [FileStream
>> readOnlyFileNamed: dir pathName, '/.gconf', aString, '/%gconf.xml'
>> do: [:f |
>> | props |
>> props := Dictionary new.
>> (XMLDOMParser parseDocumentFrom: f)
>> tagsNamed: #entry do: [:entry |
>> props at: (entry attributeAt: 'name')
>> put: (entry attributeAt: 'value'
>> ifAbsent: [entry elements first contentString])].
>> ^props].
>> ] on: FileDoesNotExistException do: [:ignore | ].
>> ].
>> ^self error: 'cannot find gconf path ', aString
>>
>> This document describes how to publish a fix for Etoys:
>>
>> http://etoys.squeak.org/svn/trunk/Documentation/Developer-HowTo.txt
>>
>> If you just want to fix it in the distro rather than waiting for an upstream release, you should be able to change the method, enter the hidden unnamed top-level project, and save the image from that project (it is important to be in that project when saving the image).
>>
>> - Bert -
>>
>> On 16.01.2014, at 15:54, Gustavo Duarte <gduarte(a)activitycentral.com> wrote:
>>
>>> Hi Georg,
>>>
>>> The xml file content is:
>>>
>>> <?xml version="1.0"?>
>>> <gconf>
>>> <entry name="color" mtime="1389708067" type="string">
>>> <stringvalue>#9A5200,#FF2B34</stringvalue>
>>> </entry>
>>>
>>> <entry name="birth_timestamp" mtime="1389708044" type="int" value="-849347955"/>
>>>
>>> <entry name="ip" mtime="1389708044" type="string">
>>> <stringvalue>1.2.3.4</stringvalue>
>>> </entry>
>>>
>>> <entry name="SugarBuddyOwner" mtime="1389708044" type="string">
>>> <stringvalue>1234</stringvalue>
>>> </entry>
>>>
>>> <entry name="nick" mtime="1389708044" type="string">
>>> <stringvalue>estudiante</stringvalue>
>>> </entry>
>>> </gconf>
>>>
>>> I don't know much about xml format, but seemingly it hasn't XML schema specification, right ?
>>>
>>>
>>> On Thu, Jan 16, 2014 at 11:11 AM, Georg Gollmann <gollmann(a)zid.tuwien.ac.at> wrote:
>>>
>>> Am 16.01.2014 um 13:10 schrieb Gustavo Duarte <gduarte(a)activitycentral.com>:
>>>
>>>> I guess that XMLDOMParser doesn't support the xml line format:
>>>> <entry name="birth_timestamp" mtime="1389708044" type="int" value="-849347955"/>.
>>>>
>>>> I don't know much about xml format, but i think that is valid format entry, so XMLDOMParser has bug.
>>>
>>>
>>> Whether the bug is in the parser or the file depends on the XML schema specified in the file.
>>>
>>> Kind regards
>>> Georg
>>>
>>
>>
>>
>>
>> - Bert -
A new version of Etoys was added to project Etoys Inbox:
http://source.squeak.org/etoysinbox/Etoys-kfr.158.mcz
==================== Summary ====================
Name: Etoys-kfr.158
Author: kfr
Time: 5 January 2014, 9:06:36 pm
UUID: ef47111e-5096-d34a-9621-777c7e4bc04b
Ancestors: Etoys-kfr.151
Turtleform moves by a vektor. Enables continued drawing of graphs with one axis movment of a turtle
=============== Diff against Etoys-kfr.151 ===============
Item was changed:
----- Method: PasteUpMorph class>>additionsToViewerCategories (in category '*eToys-scripting') -----
additionsToViewerCategories
"Answer a list of (<categoryName> <list of category specs>) pairs that characterize the phrases this kind of morph wishes to add to various Viewer categories."
^ # (
(playfield (
(command initiatePainting 'Initiate painting of a new object in the standard playfield.')
(slot mouseX 'The x coordinate of the mouse pointer' Number readWrite Player getMouseX unused unused)
(slot mouseY 'The y coordinate of the mouse pointer' Number readWrite Player getMouseY unused unused)
(command roundUpStrays 'Bring all out-of-container subparts back into view.')
(slot graphic 'The graphic shown in the background of this object' Graphic readWrite Player getGraphic Player setGraphic:)
(command unhideHiddenObjects 'Unhide all hidden objects.')))
(scripting (
(command tellAllContents: 'Send a message to all the objects inside the playfield' ScriptName)))
(collections (
(slot cursor 'The index of the chosen element' Number readWrite Player getCursor Player setCursorWrapped:)
(slot count 'How many elements are within me' Number readOnly Player getCount unused unused)
(slot stringContents 'The characters of the objects inside me, laid end to end' String readOnly Player getStringContents unused unused)
(slot playerAtCursor 'the object currently at the cursor' Player readWrite Player getValueAtCursor unused unused)
(slot firstElement 'The first object in my contents' Player readWrite Player getFirstElement Player setFirstElement:)
(slot numberAtCursor 'the number at the cursor' Number readWrite Player getNumberAtCursor Player setNumberAtCursor: )
(slot graphicAtCursor 'the graphic worn by the object at the cursor' Graphic readOnly Player getGraphicAtCursor unused unused)
(command tellAllContents: 'Send a message to all the objects inside the playfield' ScriptName)
(command removeAll 'Remove all elements from the playfield')
(command shuffleContents 'Shuffle the contents of the playfield')
(command append: 'Add the object to the end of my contents list.' Player)
(command prepend: 'Add the object at the beginning of my contents list.' Player)
(command includeAtCursor: 'Add the object to my contents at my current cursor position' Player)
(command include: 'Add the object to my contents' Player)
))
(#'stack navigation' (
(command goToNextCardInStack 'Go to the next card')
(command goToPreviousCardInStack 'Go to the previous card')
(command goToFirstCardInBackground 'Go to the first card of the current background')
(command goToFirstCardOfStack 'Go to the first card of the entire stack')
(command goToLastCardInBackground 'Go to the last card of the current background')
(command goToLastCardOfStack 'Go to the last card of the entire stack')
(command deleteCard 'Delete the current card')
(command insertCard 'Create a new card')))
"(viewing (
(slot viewingNormally 'whether contents are viewed normally' Boolean readWrite Player getViewingByIcon Player setViewingByIcon: )))"
(#'pen trails' (
(command liftAllPens 'Lift the pens on all the objects in my interior.')
(command lowerAllPens 'Lower the pens on all the objects in my interior.')
(command trailStyleForAllPens: 'Set the trail style for pens of all objects within' TrailStyle)
+ (command moveTrailsForm: 'Moves the trails within the playfield using a point. Negative x is motion left and opposite. Negative y is down and opposite ' Point)
- (command moveTrailsForm: 'Moves the trails within the playfield ' Point)
(command clearTurtleTrails 'Clear all the pen trails in the interior.'))))
!
Item was changed:
----- Method: PasteUpMorph>>moveTrailsForm: (in category '*Etoys-pen') -----
moveTrailsForm: aPoint
| newForm down left right up |
left := up := right := down := 0.
aPoint x < 0 ifTrue: [left := aPoint x]
ifFalse:[right := aPoint x negated].
aPoint y < 0 ifTrue:[up := aPoint y negated]
ifFalse:[down := aPoint y].
newForm := Form extent: self extent depth: Display depth.
turtleTrailsForm ifNotNil: [
newForm copy: (left@up extent: self extent) from: turtleTrailsForm
to: (right@down) rule: Form over].
turtleTrailsForm := newForm.
turtlePen := nil.
"Recreate Pen for this form"
turtlePen ifNil: [turtlePen := Pen newOnForm: turtleTrailsForm].
+ self updateMovedTrailsForm: aPoint.
self changed!
Item was added:
+ ----- Method: PasteUpMorph>>updateMovedTrailsForm: (in category '*Etoys-pen') -----
+ updateMovedTrailsForm: delta
+ "Update the turtle-trails form using the current positions of all pens i corelation with delta.
+ Best results used in conjunction with Preferences batchPenTrails."
+
+
+
+ | morph oldPoint newPoint removals player tfm deltaPoint |
+ self flag: #bob. "transformations WRONG here"
+ (lastTurtlePositions isNil or: [lastTurtlePositions isEmpty])
+ ifTrue: [^self].
+ removals := OrderedCollection new.
+ lastTurtlePositions associationsDo:
+ [:assoc |
+ player := assoc key.
+ morph := player costume.
+ (player getPenDown and: [morph trailMorph == self])
+ ifTrue:
+ [deltaPoint := (delta x@ delta y negated).
+ oldPoint := assoc value - deltaPoint .
+ tfm := morph owner transformFrom: self.
+ newPoint := tfm localPointToGlobal: morph referencePosition.
+
+ newPoint = oldPoint
+ ifFalse:
+ [assoc value: newPoint.
+ self
+ drawPenTrailFor: morph
+ from: oldPoint
+ to: newPoint]]
+ ifFalse: [removals add: player]].
+ removals do: [:key | lastTurtlePositions removeKey: key ifAbsent: []]!
Item was changed:
----- Method: Player>>moveTrailsForm: (in category 'pen') -----
moveTrailsForm: aPoint
"Move the trails form"
-
self costume renderedMorph moveTrailsForm: aPoint.!
A new version of Etoys was added to project Etoys Inbox:
http://source.squeak.org/etoysinbox/Etoys-kfr.151.mcz
==================== Summary ====================
Name: Etoys-kfr.151
Author: kfr
Time: 5 January 2014, 5:00:43 pm
UUID: 5cf22bf3-e0bb-3344-b503-fc584fbe77bc
Ancestors: Etoys-bf.142
Turtleform moves by a vektor. Enables continued drawing of graphs with one axis movment of a turtle
=============== Diff against Etoys-bf.142 ===============
Item was changed:
----- Method: PasteUpMorph class>>additionsToViewerCategories (in category '*eToys-scripting') -----
additionsToViewerCategories
"Answer a list of (<categoryName> <list of category specs>) pairs that characterize the phrases this kind of morph wishes to add to various Viewer categories."
^ # (
(playfield (
(command initiatePainting 'Initiate painting of a new object in the standard playfield.')
(slot mouseX 'The x coordinate of the mouse pointer' Number readWrite Player getMouseX unused unused)
(slot mouseY 'The y coordinate of the mouse pointer' Number readWrite Player getMouseY unused unused)
- (slot timer 'The elapsed time in seconds' Number readWrite Player getTimer Player setTimer:)
(command roundUpStrays 'Bring all out-of-container subparts back into view.')
+ (slot graphic 'The graphic shown in the background of this object' Graphic readWrite Player getGraphic Player setGraphic:)
- (slot graphic 'The graphic shown in the background of this object' Graphic readWrite Player getPasteUpGraphic Player setGraphic:)
(command unhideHiddenObjects 'Unhide all hidden objects.')))
(scripting (
(command tellAllContents: 'Send a message to all the objects inside the playfield' ScriptName)))
(collections (
+ (slot cursor 'The index of the chosen element' Number readWrite Player getCursor Player setCursorWrapped:)
- (slot cursor 'The index of the chosen element' Number readWrite Player getPasteUpCursor Player setCursorWrapped:)
(slot count 'How many elements are within me' Number readOnly Player getCount unused unused)
(slot stringContents 'The characters of the objects inside me, laid end to end' String readOnly Player getStringContents unused unused)
(slot playerAtCursor 'the object currently at the cursor' Player readWrite Player getValueAtCursor unused unused)
(slot firstElement 'The first object in my contents' Player readWrite Player getFirstElement Player setFirstElement:)
(slot numberAtCursor 'the number at the cursor' Number readWrite Player getNumberAtCursor Player setNumberAtCursor: )
(slot graphicAtCursor 'the graphic worn by the object at the cursor' Graphic readOnly Player getGraphicAtCursor unused unused)
(command tellAllContents: 'Send a message to all the objects inside the playfield' ScriptName)
(command removeAll 'Remove all elements from the playfield')
(command shuffleContents 'Shuffle the contents of the playfield')
(command append: 'Add the object to the end of my contents list.' Player)
(command prepend: 'Add the object at the beginning of my contents list.' Player)
(command includeAtCursor: 'Add the object to my contents at my current cursor position' Player)
(command include: 'Add the object to my contents' Player)
))
- "
(#'stack navigation' (
(command goToNextCardInStack 'Go to the next card')
(command goToPreviousCardInStack 'Go to the previous card')
(command goToFirstCardInBackground 'Go to the first card of the current background')
(command goToFirstCardOfStack 'Go to the first card of the entire stack')
(command goToLastCardInBackground 'Go to the last card of the current background')
(command goToLastCardOfStack 'Go to the last card of the entire stack')
(command deleteCard 'Delete the current card')
+ (command insertCard 'Create a new card')))
- (command insertCard 'Create a new card')))"
"(viewing (
(slot viewingNormally 'whether contents are viewed normally' Boolean readWrite Player getViewingByIcon Player setViewingByIcon: )))"
(#'pen trails' (
(command liftAllPens 'Lift the pens on all the objects in my interior.')
(command lowerAllPens 'Lower the pens on all the objects in my interior.')
(command trailStyleForAllPens: 'Set the trail style for pens of all objects within' TrailStyle)
+ (command moveTrailsForm: 'Moves the trails within the playfield ' Point)
+ (command clearTurtleTrails 'Clear all the pen trails in the interior.'))))
+ !
- (command clearTurtleTrails 'Clear all the pen trails in the interior.')
- (slot batchPenTrails 'Whether pen trails should reflect small movements within the same tick or only should integrate all movement between ticks' Boolean readWrite Player getBatchPenTrails Player setBatchPenTrails:)
- ))
-
- (#sound (
- (slot soundPitch 'pitch of sound' Number readOnly Player getPitch unused unused)
- (slot soundLevel 'level of sound' Number readOnly Player getLevel unused unused)
- (slot dialNumber 'dial number of sound' String readOnly Player getDialNumber unused unused)
- (slot soundListening 'whether the stethoscope is listening' Boolean readWrite Player getListening Player setListening:)))
- )!
Item was added:
+ ----- Method: PasteUpMorph>>moveTrailsForm: (in category '*Etoys-pen') -----
+ moveTrailsForm: aPoint
+
+
+ | newForm down left right up |
+ left := up := right := down := 0.
+ aPoint x < 0 ifTrue: [left := aPoint x]
+ ifFalse:[right := aPoint x negated].
+ aPoint y < 0 ifTrue:[up := aPoint y negated]
+ ifFalse:[down := aPoint y].
+ newForm := Form extent: self extent depth: Display depth.
+ turtleTrailsForm ifNotNil: [
+ newForm copy: (left@up extent: self extent) from: turtleTrailsForm
+ to: (right@down) rule: Form over].
+ turtleTrailsForm := newForm.
+ turtlePen := nil.
+
+ "Recreate Pen for this form"
+ turtlePen ifNil: [turtlePen := Pen newOnForm: turtleTrailsForm].
+ self changed!
Item was added:
+ ----- Method: Player>>moveTrailsForm: (in category 'pen') -----
+ moveTrailsForm: aPoint
+ "Move the trails form"
+
+ self costume renderedMorph moveTrailsForm: aPoint.!