[squeak-dev] The Inbox: MorphicExtras-ct.260.mcz

Thiede, Christoph Christoph.Thiede at student.hpi.uni-potsdam.de
Wed Sep 4 22:42:46 UTC 2019


Thank you very much for the tutorial!


I would not assume that all morphs are currently stepping. What would be the best way to pass information (a list of stopped morphs) from prescript to postscript?

A class var? SmalltalkImage? Is there any Metacello cache for things like that?


Best,

Christoph

________________________________
Von: Squeak-dev <squeak-dev-bounces at lists.squeakfoundation.org> im Auftrag von Chris Cunningham <cunningham.cb at gmail.com>
Gesendet: Mittwoch, 4. September 2019 23:27:15
An: The general-purpose Squeak developers list
Betreff: Re: [squeak-dev] The Inbox: MorphicExtras-ct.260.mcz

A nicer way to do this is to use the preamble and postscript.  With your version loaded (and changed to use DateAndTime), in the Morphic browser, choose the Scripts button (
[image.png]).  Then choose "edit preamble" to edit the preamble script.

Then, add the script to the window that pops up and save it.

The script might look something like:
FrameRateMorph allInstances do: [:frm|
   frm stopStepping.
   frm instVarNamed: #lastDisplayTime put: DateAndTime now.
   ].

Then, choose scripts again and edit postscript.  In that editor, add code that start the stepping again.  (Also, you'll need to remove the old postscript - it actively fails.)

Then, save the new version and test it.

Scripts are nice for one-shot updates.

-cbc

On Wed, Sep 4, 2019 at 12:06 PM Thiede, Christoph <Christoph.Thiede at student.hpi.uni-potsdam.de<mailto:Christoph.Thiede at student.hpi.uni-potsdam.de>> wrote:

Hi, thanks for feedback!


I have no experience with upgrade scripts, how can we keep the code clean? Is it possible to have Metacello load a temporary version first and then load the final version, or are there any better patterns?


For a temporary version, we could prepend the following code to the #step method:


self updateInterval ifNil: [

"Upgrade existing instance"
lastDisplayTime := DateAndTime new.
self updateInterval: 500 milliSeconds].

Probably it would be a bad idea to have the method recompile itself after executing the upgrade part? ;)


Best,

Christoph


PS: Yes, there was no special reason to use TimeStamp, except of [TimeStamp name size < DateAndTime name size] :)

________________________________
Von: Squeak-dev <squeak-dev-bounces at lists.squeakfoundation.org<mailto:squeak-dev-bounces at lists.squeakfoundation.org>> im Auftrag von Chris Cunningham <cunningham.cb at gmail.com<mailto:cunningham.cb at gmail.com>>
Gesendet: Mittwoch, 4. September 2019 18:39:13
An: The general-purpose Squeak developers list
Betreff: Re: [squeak-dev] The Inbox: MorphicExtras-ct.260.mcz

Hi.

I like the changes (especially the switch to DateAndTime), however, if you have a FrameRateMorph open when updating, it raises errors and fails to work (the time to timestamp gives it issues).

Any chance you could prescript to fix this?  Maybe either update existing instances with DateAndTimes and stop/start stepping around the update, or closing all instances (although I'm not sure if that is advisable with the comments about 'stand-alone entity' in initializeToStandAlone, which implies there are embedded instances).

-cbc

On Wed, Sep 4, 2019 at 6:54 AM <commits at source.squeak.org<mailto:commits at source.squeak.org>> wrote:
A new version of MorphicExtras was added to project The Inbox:
http://source.squeak.org/inbox/MorphicExtras-ct.260.mcz

==================== Summary ====================

Name: MorphicExtras-ct.260
Author: ct
Time: 4 September 2019, 3:53:54.175698 pm
UUID: cab65f78-e646-cc40-9d0f-c16114d1bb44
Ancestors: MorphicExtras-mt.259

Refactor FrameRateMorph: Add accessors for updateInterval and expose measure data. Use TimeStamp instead of Time to avoid clock wrap around.

=============== Diff against MorphicExtras-mt.259 ===============

Item was changed:
  StringMorph subclass: #FrameRateMorph
+       instanceVariableNames: 'lastDisplayTime framesSinceLastDisplay updateInterval mSecsPerFrame framesPerSec'
-       instanceVariableNames: 'lastDisplayTime framesSinceLastDisplay'
        classVariableNames: ''
        poolDictionaries: ''
        category: 'MorphicExtras-Demo'!

Item was added:
+ ----- Method: FrameRateMorph>>framesPerSec (in category 'accessing') -----
+ framesPerSec
+
+       ^ framesPerSec!

Item was changed:
  ----- Method: FrameRateMorph>>initialize (in category 'initialization') -----
  initialize
  "initialize the state of the receiver"
        super initialize.
  ""
+       lastDisplayTime := TimeStamp new.
-       lastDisplayTime := 0.
        framesSinceLastDisplay := 0.
+       self updateInterval: 500 milliSeconds.
        self font: (Preferences standardMenuFont emphasized: 1).
  !

Item was added:
+ ----- Method: FrameRateMorph>>mSecsPerFrame (in category 'accessing') -----
+ mSecsPerFrame
+
+       ^ mSecsPerFrame!

Item was changed:
  ----- Method: FrameRateMorph>>step (in category 'stepping and presenter') -----
  step
        "Compute and display (every half second or so) the current framerate"

+       | now timePassed newContents |
-       | now mSecs mSecsPerFrame framesPerSec newContents |
        framesSinceLastDisplay := framesSinceLastDisplay + 1.
+       now := TimeStamp now.
+       timePassed := now - lastDisplayTime.
+       (timePassed > self updateInterval) ifTrue:
+               [| mSecs |
+               mSecs := timePassed asMilliSeconds.
+               mSecsPerFrame := mSecs // framesSinceLastDisplay.
-       now := Time millisecondClockValue.
-       mSecs := now - lastDisplayTime.
-       (mSecs > 500 or: [mSecs < 0 "clock wrap-around"]) ifTrue:
-               [mSecsPerFrame := mSecs // framesSinceLastDisplay.
                framesPerSec := (framesSinceLastDisplay * 1000) // mSecs.
                newContents := mSecsPerFrame printString, ' mSecs (', framesPerSec printString, ' frame', (framesPerSec = 1 ifTrue: [''] ifFalse: ['s']), '/sec)'.
                self contents: newContents.
                lastDisplayTime := now.
                framesSinceLastDisplay := 0]
        ifFalse:
                ["Ensure at least one pixel is drawn per frame"
                Preferences higherPerformance ifTrue: [self invalidRect: (self position extent: 1 at 1)]]!

Item was added:
+ ----- Method: FrameRateMorph>>updateInterval (in category 'accessing') -----
+ updateInterval
+
+       ^ updateInterval!

Item was added:
+ ----- Method: FrameRateMorph>>updateInterval: (in category 'accessing') -----
+ updateInterval: aNumber
+
+       updateInterval := aNumber!



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20190904/4c96f83d/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 1158 bytes
Desc: image.png
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20190904/4c96f83d/attachment.png>


More information about the Squeak-dev mailing list