The Trunk: MorphicExtras-mt.292.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: MorphicExtras-mt.292.mcz

commits-2
Marcel Taeumel uploaded a new version of MorphicExtras to project The Trunk:
http://source.squeak.org/trunk/MorphicExtras-mt.292.mcz

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

Name: MorphicExtras-mt.292
Author: mt
Time: 15 April 2021, 4:52:52.171792 pm
UUID: 5c15e20e-1712-4494-b519-18e3f9f6042b
Ancestors: MorphicExtras-mt.291, MorphicExtras-ct.264, MorphicExtras-ct.265, MorphicExtras-ct.266, MorphicExtras-ct.268, MorphicExtras-ct.269, MorphicExtras-ct.271, MorphicExtras-ct.272, MorphicExtras-ct.273, MorphicExtras-ct.274, MorphicExtras-ct.275, MorphicExtras-ct.283, MorphicExtras-ct.284

Merge, merge, merge. Christoph (ct) put a lot of effort into restoring the examples from older Squeak releases, which had rich multimedia content to show off Squeak's features.

Look out for the "*MorphicExtras-examples" protocol. And also take a look at the "MorphicExtras-Demo" class category.

Note that, in the long term, unloading MorphicExtras should be possible without breaking progamming tools and thus a way to free up some resources and shrink the image file.

This commit is part of reconstruction of Objectland (also known as "The Worlds of Squeak"). For more information, see: http://forum.world.st/The-Inbox-MorphicExtras-ct-267-mcz-td5104764.html

=============== Diff against MorphicExtras-mt.291 ===============

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

Item was changed:
+ ----- Method: AnimatedImageMorph>>images (in category 'accessing') -----
- ----- Method: AnimatedImageMorph>>images (in category 'private') -----
  images
  ^images!

Item was added:
+ ----- Method: Bag>>asMorph (in category '*MorphicExtras-converting') -----
+ asMorph
+ "
+ (Bag new in: [:bag | Smalltalk allClasses do: [:cls | bag add: cls name first]. bag])
+ asMorph openInHand.
+ "
+ ^ HistogramMorph on: self!

Item was added:
+ EllipseMorph subclass: #BannerMorph
+ instanceVariableNames: 'header contents'
+ classVariableNames: ''
+ poolDictionaries: ''
+ category: 'MorphicExtras-Demo'!
+
+ !BannerMorph commentStamp: 'ct 9/7/2019 10:43' prior: 0!
+ I display a header and a contents text, arranged in an EllipseMorph in a flamboyant way. I use a ScreeningMorph and a BackgroundMorph to hinder the user to avert his gaze from me.!

Item was added:
+ ----- Method: BannerMorph class>>example (in category 'examples') -----
+ example
+ "BannerMorph example openInWorld"
+
+ ^ self
+ header: 'Yes, <u>you</u> are ...' withCRs asTextFromHtml
+ contents: 'Live in Morphic' asUppercase asText!

Item was added:
+ ----- Method: BannerMorph class>>header:contents: (in category 'instance creation') -----
+ header: aStringOrText contents: anotherStringOrText
+
+ ^ self basicNew
+ header: aStringOrText contents: anotherStringOrText;
+ initialize;
+ yourself!

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

Item was added:
+ ----- Method: BannerMorph>>createBackground (in category 'initialize-release') -----
+ createBackground
+
+ | fillMorph fillStyle |
+ fillStyle := GradientFillStyle colors:
+ ({Color red. Color green. Color blue}
+ in: [:colors | colors, colors reverse]).
+ fillStyle
+ origin: 0 @ 0;
+ direction: 150 @ 50.
+ fillMorph := (Morph new
+ fillStyle: fillStyle;
+ yourself).
+ ^ BackgroundMorph new
+ extent: 300 @ 130;
+ addMorph: fillMorph;
+ yourself!

Item was added:
+ ----- Method: BannerMorph>>createContents (in category 'initialize-release') -----
+ createContents
+
+ | text |
+ text := self contents asText
+ addAttribute: TextEmphasis bold;
+ addAttribute: (TextFontReference toFont:
+ (StrikeFont familyName: #ComicPlain size: 39));
+ asMorph.
+ text readOnly: true; flag: #ct. "We're no *that* life, yet :("
+ ^ ScreeningMorph new
+ addMorph: (self createBackground
+ extent: text extent;
+ yourself);
+ addMorph: text;
+ showScreened;
+ cellPositioning: #center;
+ yourself!

Item was added:
+ ----- Method: BannerMorph>>createHeader (in category 'initialize-release') -----
+ createHeader
+
+ | text |
+ text := (self header copyWithFirst: Character cr) asText
+ addAttribute: TextEmphasis bold;
+ addAttribute: (TextFontReference toFont:
+ (StrikeFont familyName: #Accula size: 29));
+ yourself.
+ ^ text asMorph
+ centered;
+ fillsOwner: true;
+ yourself!

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

Item was added:
+ ----- Method: BannerMorph>>header:contents: (in category 'accessing') -----
+ header: aStringOrText contents: anotherStringOrText
+
+ header := aStringOrText.
+ contents := anotherStringOrText.!

Item was added:
+ ----- Method: BannerMorph>>initialize (in category 'initialize-release') -----
+ initialize
+
+ super initialize.
+ self extent: 300 @ 200.
+ self
+ changeProportionalLayout;
+ addMorph: (Morph new
+ color: Color transparent;
+ changeTableLayout;
+ listCentering: #center; wrapCentering: #center;
+ addMorph: self createContents;
+ yourself)
+ fullFrame: LayoutFrame fullFrame;
+ addMorph: self createHeader.!

Item was added:
+ ----- Method: BannerMorph>>initializeToStandAlone (in category 'initialize-release') -----
+ initializeToStandAlone
+
+ self header: 'Introducing' contents: self class name.
+ super initializeToStandAlone.!

Item was added:
+ ----- Method: CurveMorph class>>extraExampleArrow (in category '*MorphicExtras-examples') -----
+ extraExampleArrow
+ "CurveMorph extraExampleArrow openInHand"
+
+ | arrow |
+ arrow := CurveMorph
+ vertices: {200 @ 75. 35 @ 0. 40 @ 55. -55 @ 30}
+ color: Color veryDarkGray
+ borderWidth: 5
+ borderColor: Color veryDarkGray.
+ arrow makeOpen; makeForwardArrow; beSmoothCurve.
+ arrow addHandles.
+ ^ arrow!

Item was added:
+ ----- Method: CurveMorph class>>extraExampleTextFlow (in category '*MorphicExtras-examples') -----
+ extraExampleTextFlow
+ "CurveMorph extraExampleTextFlow openInHand"
+
+ | curve text |
+ curve := CurveMorph
+ vertices: {135 @ 270. 75 @ 200. 50 @ 150. 100 @ 100. 125 @ 150. 175 @ 100. 200 @ 150. 175 @ 200 . 115 @ 340} * RealEstateAgent scaleFactor
+ color: Color cyan
+ borderWidth: 25 * RealEstateAgent scaleFactor
+ borderColor: Color salmon.
+ curve makeOpen; beSmoothCurve.
+ text := ('Texts can also follow ........................................ an open curve. ' asText
+ , ('So morphic!!' asText
+ addAttribute: TextEmphasis italic;
+ addAttribute: (TextColor color: Color blue);
+ yourself))
+ addAttribute: (TextFontChange fontNumber: (3.4 * RealEstateAgent scaleFactor) rounded);
+ asMorph.
+ text textColor: Color yellow.
+ curve addMorph: text.
+ text followCurve.
+ ^ curve!

Item was changed:
  ----- Method: Flaps class>>newPaintingFlap (in category 'predefined flaps') -----
  newPaintingFlap
  "Add a flap with the paint palette in it"
 
  | aFlap aFlapTab  |
+ "Flaps reinstateDefaultFlaps. Flaps newPaintingFlap"
- "Flaps reinstateDefaultFlaps. Flaps addPaintingFlap"
 
  aFlap := PasteUpMorph new borderWidth: 0.
  aFlap color: Color transparent.
  aFlap layoutPolicy: TableLayout new.
  aFlap hResizing: #shrinkWrap.
  aFlap vResizing: #shrinkWrap.
  aFlap cellPositioning: #topLeft.
  aFlap clipSubmorphs: false.
 
  aFlap beSticky. "really?!!"
  aFlap addMorphFront: PaintBoxMorph new.
  aFlap beFlap: true.
  aFlap fullBounds. "force layout"
 
  aFlapTab := FlapTab new referent: aFlap.
  aFlapTab setNameTo: 'Painting' translated.
  aFlapTab setProperty: #priorWording toValue: 'Paint' translated.
  aFlapTab useGraphicalTab.
  aFlapTab removeAllMorphs.
  aFlapTab setProperty: #paintingFlap toValue: true.
  aFlapTab addMorphFront:
  "(SketchMorph withForm: (ScriptingSystem formAtKey: #PaintingFlapPic))"
  self paintFlapButton.
  aFlapTab cornerStyle: #rounded.
  aFlapTab edgeToAdhereTo: #right.
  aFlapTab setToPopOutOnDragOver: false.
  aFlapTab setToPopOutOnMouseOver: false.
  aFlapTab on: #mouseUp send: #startOrFinishDrawing: to: aFlapTab.
  aFlapTab setBalloonText:'Click here to start or finish painting.' translated.
 
  aFlapTab fullBounds. "force layout"
  aFlapTab position: (0@6).
  self currentWorld addMorphFront: aFlapTab.  
  ^ aFlapTab!

Item was added:
+ ----- Method: Form class>>extraCook (in category '*MorphicExtras-sprites') -----
+ extraCook
+
+ ^ Imports default imports
+ at: #extraCook
+ ifAbsentPut: [ Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes: self extraCookContents readStream) ]!

Item was added:
+ ----- Method: Form class>>extraCookContents (in category '*MorphicExtras-sprites') -----
(excessive size, no diff calculated)

Item was added:
+ ----- Method: Form class>>extraWizard (in category '*MorphicExtras-sprites') -----
+ extraWizard
+
+ ^ Imports default imports
+ at: #extraWizard
+ ifAbsentPut: [ Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes: self extraWizardContents readStream) ]!

Item was added:
+ ----- Method: Form class>>extraWizardContents (in category '*MorphicExtras-sprites') -----
+ extraWizardContents
+
+ ^ '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
+ QmCC'!

Item was added:
+ ----- Method: MIDIScore class>>extraExample (in category '*MorphicExtras-examples') -----
+ extraExample
+ "(ScorePlayerMorph on: MIDIScore extraExample) openInWorld"
+
+ | tracks |
+ tracks := self extraExampleTrackData collect: [:track | (ReferenceStream on:
+ (Base64MimeConverter mimeDecodeToBytes: track readStream)) next].
+ ^ self new
+ tracks: tracks values trackInfo: tracks keys;
+ ticksPerQuarterNote: 96;
+ tempoMap: self extraExampleTempoMap;
+ yourself!

Item was added:
+ ----- Method: MIDIScore class>>extraExampleTempoMap (in category '*MorphicExtras-examples') -----
+ extraExampleTempoMap
+
+ ^ {0->750000 . 26496->769230 . 26592->789473 . 26688->810810 . 26784->833333 . 26880->857142 . 26976->882352 . 27072->909090}
+ collect: [:tempoData | TempoEvent time: tempoData key tempo: tempoData value]!

Item was added:
+ ----- Method: MIDIScore class>>extraExampleTrackData (in category '*MorphicExtras-examples') -----
(excessive size, no diff calculated)

Item was added:
+ EllipseMorph subclass: #MovingEyeMorph
+ instanceVariableNames: 'inner iris'
+ classVariableNames: 'IrisSize'
+ poolDictionaries: ''
+ category: 'MorphicExtras-Demo'!

Item was added:
+ ----- Method: MovingEyeMorph class>>color:irisColor: (in category 'instance creation') -----
+ color: aColor irisColor: anotherColor
+
+ ^ self new color: aColor irisColor: anotherColor!

Item was added:
+ ----- Method: MovingEyeMorph class>>descriptionForPartsBin (in category 'parts bin') -----
+ descriptionForPartsBin
+ ^ self partName: 'MovingEye' translatedNoop
+ categories: {'Just for Fun' translatedNoop}
+ documentation: 'An eye which follows the cursor' translatedNoop!

Item was added:
+ ----- Method: MovingEyeMorph class>>extraExampleSqueakIsWatchingYou (in category 'examples') -----
+ extraExampleSqueakIsWatchingYou
+ "MovingEyeMorph extraExampleSqueakIsWatchingYou openInHand"
+
+ | logoMorph leftEye rightEye |
+ logoMorph := Form squeakLogo asMorph.
+ leftEye := self new
+ extent: logoMorph extent * (0.1 @ 0.15);
+ center: (logoMorph pointAtFraction: 0.39 @ 0.55);
+ yourself.
+ rightEye := self new
+ extent: logoMorph extent * (0.1 @ 0.15);
+ center: (logoMorph pointAtFraction: 0.59 @ 0.56);
+ yourself.
+ logoMorph addAllMorphs: {leftEye. rightEye}.
+ ^ logoMorph.!

Item was added:
+ ----- Method: MovingEyeMorph class>>initialize (in category 'class initialization') -----
+ initialize
+ "
+ MovingEyeMorph initialize
+ "
+ IrisSize := (0.42@0.50).!

Item was added:
+ ----- Method: MovingEyeMorph>>color: (in category 'accessing') -----
+ color: aColor
+
+ super color: aColor.
+
+ "Migrate old instances."
+ inner color: Color transparent.
+
+ self keepIrisVisible.!

Item was added:
+ ----- Method: MovingEyeMorph>>color:irisColor: (in category 'accessing') -----
+ color: aColor irisColor: anotherColor
+
+ self color: aColor.
+ self irisColor: anotherColor.!

Item was added:
+ ----- Method: MovingEyeMorph>>defaultBorderWidth (in category 'accessing') -----
+ defaultBorderWidth
+
+ ^ 0!

Item was added:
+ ----- Method: MovingEyeMorph>>defaultColor (in category 'initialization') -----
+ defaultColor
+ "answer the default color/fill style for the receiver"
+ ^ Color black!

Item was added:
+ ----- Method: MovingEyeMorph>>extent: (in category 'geometry') -----
+ extent: aPoint
+
+ super extent: aPoint.
+ inner extent: (self extent * ((1.0@1.0)-IrisSize)) asIntegerPoint.
+ iris extent: (self extent * IrisSize) asIntegerPoint.
+ inner position: (self center - (inner extent // 2)) asIntegerPoint.
+ !

Item was added:
+ ----- Method: MovingEyeMorph>>initialize (in category 'initialization') -----
+ initialize
+ "initialize the state of the receiver"
+ super initialize.
+ ""
+ inner := EllipseMorph new.
+ inner color: Color transparent.
+ inner extent: (self extent * (1.0 @ 1.0 - IrisSize)) asIntegerPoint.
+ inner borderWidth: 0.
+ ""
+ iris := EllipseMorph new.
+ iris color: Color white.
+ iris extent: (self extent * IrisSize) asIntegerPoint.
+ ""
+ self addMorphCentered: inner.
+ inner addMorphCentered: iris.
+ ""
+ self extent: 26 @ 33!

Item was added:
+ ----- Method: MovingEyeMorph>>irisColor (in category 'accessing') -----
+ irisColor
+
+ ^ iris color!

Item was added:
+ ----- Method: MovingEyeMorph>>irisColor: (in category 'accessing') -----
+ irisColor: aColor
+
+ iris color: aColor.
+
+ self keepIrisVisible.!

Item was added:
+ ----- Method: MovingEyeMorph>>irisPos (in category 'accessing') -----
+ irisPos
+
+ ^ iris position!

Item was added:
+ ----- Method: MovingEyeMorph>>irisPos: (in category 'accessing') -----
+ irisPos: cp
+
+ | a b theta x y |
+ theta := (cp - self center) theta.
+ a := inner width // 2.
+ b := inner height // 2.
+ x := a * (theta cos).
+ y := b * (theta sin).
+ iris position: ((x@y) asIntegerPoint) + self center - (iris extent // 2).!

Item was added:
+ ----- Method: MovingEyeMorph>>keepIrisVisible (in category 'private') -----
+ keepIrisVisible
+
+ self color = self irisColor
+ ifTrue: [
+ iris borderWidth: 1;
+ borderColor: self color makeForegroundColor]
+ ifFalse: [
+ iris borderWidth: 0].!

Item was added:
+ ----- Method: MovingEyeMorph>>step (in category 'stepping and presenter') -----
+ step
+ | cp |
+ cp := self globalPointToLocal: self world primaryHand position.
+ (inner containsPoint: cp)
+ ifTrue: [iris position: (cp - (iris extent // 2))]
+ ifFalse: [self irisPos: cp].!

Item was added:
+ ----- Method: MovingEyeMorph>>stepTime (in category 'testing') -----
+ stepTime
+
+ ^ 100.!

Item was changed:
  ----- Method: PianoKeyboardMorph>>initialize (in category 'initialization') -----
  initialize
  "initialize the state of the receiver"
  super initialize.
  ""
 
  whiteKeyColor := Color gray: 0.95.
  blackKeyColor := Color black.
  playingKeyColor := Color red.
  nOctaves := 6.
  self buildKeyboard.
+ soundPrototype := FMSound new.!
- soundPrototype := FMSound brass1 duration: 9.9.
- soundPrototype := FMSound new.
- !

Item was added:
+ ----- Method: PianoKeyboardMorph>>initializeToStandAlone (in category 'initialization') -----
+ initializeToStandAlone
+
+ super initializeToStandAlone.
+ soundPrototype := FMSound brass1 duration: 9.9.!

Item was added:
+ ----- Method: PolygonMorph class>>extraCircularVertices (in category '*MorphicExtras-examples') -----
+ extraCircularVertices
+
+ ^ ((Circle center: 400 @ 300 radius: 200 quadrant: 1) computeVertices: 5) reverse
+ , ((Circle center: 400 @ 300 radius: 200 quadrant: 4) computeVertices: 5) reverse
+ , ((Circle center: 400 @ 400 radius: 100 quadrant: 4) computeVertices: 5)
+ , ((Circle center: 400 @ 400 radius: 100 quadrant: 1) computeVertices: 5)
+ , ((Circle center: 400 @ 200 radius: 100 quadrant: 3) computeVertices: 5) reverse
+ , ((Circle center: 400 @ 200 radius: 100 quadrant: 2) computeVertices: 5) reverse!

Item was added:
+ ----- Method: PolygonMorph class>>extraExampleTextFlow (in category '*MorphicExtras-examples') -----
+ extraExampleTextFlow
+ "PolygonMorph extraExampleTextFlow openInHand"
+
+ | polygon text obstacle |
+ polygon := self new.
+ polygon
+ setVertices: self extraCircularVertices;
+ extent: 309 asPoint;
+ beSmoothCurve;
+ color: Color lightGray;
+ addHandles.
+
+ text := (TextMorph
+ string: 'TextMorphs can be chained together, causing their contents to flow between containers as either the contents or the containers change. If a TextMorph is embedded in another Morph, you can ask it to have fill the shape of that Morph. Moreover, you can ask it to avoid occlusions, in which case it will do its best to avoid collisions with siblings being in front of it. If a TextMorph is embedded in a CurveMorph, you can ask it to have the text follow the curve, as illustrated here.' asTextMorph
+ fontName: #BitstreamVeraSans
+ size: 14)
+ textColor: Color white;
+ fillsOwner: true;
+ yourself.
+ obstacle := StarMorph new
+ center: polygon center - (50 @ 25);
+ extent: 81 asPoint;
+ color: Color orchid;
+ yourself.
+
+ polygon
+ addMorph: text;
+ addMorph: obstacle.
+ text centered.
+ text container avoidsOcclusions: true.
+ ^ polygon!

Item was added:
+ ----- Method: PolygonMorph class>>extraExampleTrapeze (in category '*MorphicExtras-examples') -----
+ extraExampleTrapeze
+ "PolygonMorph extraExampleTrapeze openInHand"
+
+ | polygon text |
+ polygon := self new.
+ polygon
+ setVertices: {0 @ 100. 275 @ 100. 200 @ 0. 75 @ 0};
+ addHandles ;
+ balloonText: 'Click and drag the handles to change my shape'.
+ text := '<b>Polygons</b> can be closed or open, filled or empty as well as lined or convex and can have directed arrows, bevelled borders and last but not least adapted handles.' asTextFromHtml asMorph
+ beAllFont: (TextStyle default fontOfSize: 14);
+ fillsOwner: true;
+ yourself.
+ polygon addMorph: text.
+ text centered.
+ ^ polygon!

Item was added:
+ ----- Method: PolygonMorph class>>extraExampleTrapezePlus (in category '*MorphicExtras-examples') -----
+ extraExampleTrapezePlus
+ "PolygonMorph extraExampleTrapezePlus openInHand"
+ "Some additional decoration"
+
+ ^ self extraExampleTrapeze
+ fillStyle: ((GradientFillStyle
+ ramp: { 0.0 -> Color orange. 0.7 -> Color magenta twiceLighter. 1.0 -> Color red muchLighter })
+ origin: 0 @ 0; direction: 275 @ 100;
+ yourself);
+ borderWidth: 2;
+ borderColor: Color blue;
+ dashedBorder: {35. 20. Color yellow};
+ yourself!

Item was added:
+ ----- Method: RecordingControlsMorph class>>extraExample (in category '*MorphicExtras-examples') -----
+ extraExample
+ "RecordingControlsMorph extraExample openInWorld"
+
+ | example |
+ example := self new.
+ example recorder clearRecordedSound.
+ example recorder recordedSound add: SampledSound exampleBach.
+ ^ example!

Item was added:
+ ----- Method: SampledSound class>>exampleBach (in category '*MorphicExtras-examples') -----
+ exampleBach
+ "SampledSound exampleBach"
+
+ | url |
+ url := 'http://upload.wikimedia.org/wikipedia/commons/4/4e/Bach_Brandenburg_4_coda_to_the_3rd_movement.wav'.
+
+ ^ Imports default imports
+ at: #exampleBach
+ ifAbsentPut: [
+ self notify: ('This action will download the following content:\\{1}\\Do you want to proceed?' translated withCRs format: {url}).
+ self fromWaveStream: (HTTPSocket httpGet: url)]!

Item was added:
+ ----- Method: ScorePlayerMorph class>>extraExample (in category '*MorphicExtras-examples') -----
+ extraExample
+ "ScorePlayerMorph extraExample openInHand"
+
+ ^ self on: MIDIScore extraExample!

Item was added:
+ ----- Method: ScorePlayerMorph class>>on: (in category 'system hookup') -----
+ on: aScore
+
+ | player |
+ player := ScorePlayer onScore: aScore.
+ ^ self new onScorePlayer: player!

Item was added:
+ ----- Method: ScorePlayerMorph class>>openOn: (in category 'system hookup') -----
+ openOn: aScore
+
+ (self on: aScore) openInWorld.!

Item was changed:
  ----- Method: ScorePlayerMorph>>addNewScore (in category 'menu') -----
  addNewScore
  "Open a MIDI score and re-init controls..."
  | score player |
 
  score := MIDIScore new.
  score tracks: (Array with: Array new).
  score trackInfo: #('Instrument').
  player := ScorePlayer onScore: score.
+ ^self onScorePlayer: player!
- ^self onScorePlayer: player title: 'new'!

Item was changed:
  ----- Method: ScorePlayerMorph>>addTrackToScore (in category 'menu') -----
  addTrackToScore
  "add a instrument track to the current score"
  | score tracks trackInfo player |
  score := scorePlayer score.
        tracks := score tracks copyWith:#().
  score tracks: tracks.
        trackInfo := score trackInfo copyWith: 'Instrument'.
  score trackInfo: trackInfo.
  player := ScorePlayer onScore: score.
+ ^self onScorePlayer: player!
- ^self onScorePlayer: player title: 'new'!

Item was changed:
  ----- Method: ScorePlayerMorph>>initialize (in category 'initialization') -----
  initialize
  "initialize the state of the receiver"
  super initialize.
  ""
  self listDirection: #topToBottom;
  wrapCentering: #center;
  cellPositioning: #topCenter;
  hResizing: #shrinkWrap;
  vResizing: #shrinkWrap;
  layoutInset: 3;
+ onScorePlayer: ScorePlayer new initialize;
- onScorePlayer: ScorePlayer new initialize title: ' ';
  extent: 20 @ 20 !

Item was added:
+ ----- Method: ScorePlayerMorph>>onScorePlayer: (in category 'initialization') -----
+ onScorePlayer: aScorePlayer
+
+ self onScorePlayer: aScorePlayer title: 'untitled'.!

Item was added:
+ ----- Method: SketchMorph class>>extraExampleCook (in category '*MorphicExtras-examples') -----
+ extraExampleCook
+ "SketchMorph extraExampleCook openInWorld"
+
+ ^ (self withForm: Form extraCook)
+ addMouseUpActionWith: 'Form toothpaste: 30';
+ balloonText: 'Click me and then drag the cursor over the screen';
+ yourself!

Item was added:
+ ----- Method: SketchMorph class>>extraExampleWizard (in category '*MorphicExtras-examples') -----
+ extraExampleWizard
+ "SketchMorph extraExampleWizard openInWorld"
+
+ ^ (self withForm: Form extraWizard)
+ addMouseUpActionWith:
+ (MessageSend receiver: Pen new selector: #web);
+ balloonText: 'Click me and then drag the cursor over the screen\(Trust me, I won''t turn you into a toad!!)' withCRs;
+ yourself!

Item was added:
+ PolygonMorph subclass: #TetrisPieceMorph
+ instanceVariableNames: ''
+ classVariableNames: 'Colors Shapes Vertices'
+ poolDictionaries: ''
+ category: 'MorphicExtras-Demo'!
+
+ !TetrisPieceMorph commentStamp: 'ct 10/1/2019 23:34' prior: 0!
+ I display a Tetris piece. By calling TetrisPieceMorph random, you can generate a new instance of me that is random in terms of shape, color, and rotation.
+
+ My shapes are: #(i j l o s t z).!

Item was added:
+ ----- Method: TetrisPieceMorph class>>initialize (in category 'class initialization') -----
+ initialize
+
+ super initialize.
+ Vertices := Dictionary new
+ at: #i put: { 0 @ 0. 0 @ 4. 1 @ 4. 1 @ 0 };
+ at: #j put: { 1 @ 0. 1 @ 2. 0 @ 2. 0 @ 3. 2 @ 3. 2 @ 0 };
+ at: #o put: { 0 @ 0. 0 @ 2. 2 @ 2. 2 @ 0 };
+ at: #s put: { 0 @ 0. 0 @ 2. 1 @ 2. 1 @ 3. 2 @ 3. 2 @ 1. 1 @ 1. 1 @ 0 };
+ at: #t put: { 1 @ 0. 1 @ 1. 0 @ 1. 0 @ 2. 3 @ 2. 3 @ 1. 2 @ 1. 2 @ 0 };
+ yourself.
+ Vertices
+ at: #l put: ((Vertices at: #j) * (-1 @ 1));
+ at: #z put: ((Vertices at: #s) * (-1 @ 1)).
+ Shapes := Vertices keys.
+ Colors := #(red green blue orange grape yellow)
+ collect: [:color | color -> (Color in: color) lighter paler]
+ as: Dictionary.!

Item was added:
+ ----- Method: TetrisPieceMorph class>>random (in category 'instance creation') -----
+ random
+ "TetrisPieceMorph random openInHand"
+
+ ^ self
+ shape: Shapes atRandom
+ color: Colors atRandom
+ rotationDegrees: Random new next * 360!

Item was added:
+ ----- Method: TetrisPieceMorph class>>shape:color:rotationDegrees: (in category 'instance creation') -----
+ shape: aShapeSymbol color: aColor rotationDegrees: degrees
+
+ ^ self new
+ shape: aShapeSymbol;
+ color: aColor;
+ rotationDegrees: degrees;
+ yourself!

Item was added:
+ ----- Method: TetrisPieceMorph>>initialize (in category 'initialize-release') -----
+ initialize
+
+ super initialize.
+ self borderStyle: (RaisedBorder new width: 3).!

Item was added:
+ ----- Method: TetrisPieceMorph>>shape: (in category 'initialize-release') -----
+ shape: aShapeSymbol
+
+ self setVertices: (Vertices at: aShapeSymbol) * 20 * RealEstateAgent scaleFactor.!



Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: MorphicExtras-mt.292.mcz

David T. Lewis
On Thu, Apr 15, 2021 at 02:52:55PM +0000, [hidden email] wrote:

> Marcel Taeumel uploaded a new version of MorphicExtras to project The Trunk:
> http://source.squeak.org/trunk/MorphicExtras-mt.292.mcz
>
> ==================== Summary ====================
>
> Name: MorphicExtras-mt.292
> Author: mt
> Time: 15 April 2021, 4:52:52.171792 pm
> UUID: 5c15e20e-1712-4494-b519-18e3f9f6042b
> Ancestors: MorphicExtras-mt.291, MorphicExtras-ct.264, MorphicExtras-ct.265, MorphicExtras-ct.266, MorphicExtras-ct.268, MorphicExtras-ct.269, MorphicExtras-ct.271, MorphicExtras-ct.272, MorphicExtras-ct.273, MorphicExtras-ct.274, MorphicExtras-ct.275, MorphicExtras-ct.283, MorphicExtras-ct.284
>
> Merge, merge, merge. Christoph (ct) put a lot of effort into restoring
> the examples from older Squeak releases, which had rich multimedia content
> to show off Squeak's features.
>


This is really great! Thank you Christoph, and thank you Marcel for merging into trunk.

:-))

Dave


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: MorphicExtras-mt.292.mcz

Nicolas Cellier
Wow, the record merge!
Thanks Christoph & Marcel!

Le jeu. 15 avr. 2021 à 17:54, David T. Lewis <[hidden email]> a écrit :

>
> On Thu, Apr 15, 2021 at 02:52:55PM +0000, [hidden email] wrote:
> > Marcel Taeumel uploaded a new version of MorphicExtras to project The Trunk:
> > http://source.squeak.org/trunk/MorphicExtras-mt.292.mcz
> >
> > ==================== Summary ====================
> >
> > Name: MorphicExtras-mt.292
> > Author: mt
> > Time: 15 April 2021, 4:52:52.171792 pm
> > UUID: 5c15e20e-1712-4494-b519-18e3f9f6042b
> > Ancestors: MorphicExtras-mt.291, MorphicExtras-ct.264, MorphicExtras-ct.265, MorphicExtras-ct.266, MorphicExtras-ct.268, MorphicExtras-ct.269, MorphicExtras-ct.271, MorphicExtras-ct.272, MorphicExtras-ct.273, MorphicExtras-ct.274, MorphicExtras-ct.275, MorphicExtras-ct.283, MorphicExtras-ct.284
> >
> > Merge, merge, merge. Christoph (ct) put a lot of effort into restoring
> > the examples from older Squeak releases, which had rich multimedia content
> > to show off Squeak's features.
> >
>
>
> This is really great! Thank you Christoph, and thank you Marcel for merging into trunk.
>
> :-))
>
> Dave
>
>

Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: MorphicExtras-mt.292.mcz

Christoph Thiede
In reply to this post by commits-2
Thank you, Marcel! :-)

To browse all example methods, you can use this snippet:

self systemNavigation browseMessageList: [(PackageInfo named:
'MorphicExtras') extensionMethods select: [:m | m category
includesSubstring: 'example']] name: 'Objectland examples'

Nevertheless, soon, you will also get a visual collection of all the
examples, so stay tuned ... :-)

Best,
Christoph



-----
Carpe Squeak!
--
Sent from: http://forum.world.st/Squeak-Dev-f45488.html

Carpe Squeak!
Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: MorphicExtras-mt.292.mcz

marcel.taeumel
Toothpaste! *scnr* 

Am 16.04.2021 15:51:25 schrieb Christoph Thiede <[hidden email]>:

Thank you, Marcel! :-)

To browse all example methods, you can use this snippet:

self systemNavigation browseMessageList: [(PackageInfo named:
'MorphicExtras') extensionMethods select: [:m | m category
includesSubstring: 'example']] name: 'Objectland examples'

Nevertheless, soon, you will also get a visual collection of all the
examples, so stay tuned ... :-)

Best,
Christoph



-----
Carpe Squeak!
--
Sent from: http://forum.world.st/Squeak-Dev-f45488.html