[etoys-dev] Etoys: MorphicExtras-kfr.77.mcz

karl ramberg karlramberg at gmail.com
Mon Feb 11 14:12:59 EST 2013


Hm, GraphMorph should not really be part of this...


On Mon, Feb 11, 2013 at 7:34 PM, <commits at source.squeak.org> wrote:

> Karl Ramberg uploaded a new version of MorphicExtras to project Etoys:
> http://source.squeak.org/etoys/MorphicExtras-kfr.77.mcz
>
> ==================== Summary ====================
>
> Name: MorphicExtras-kfr.77
> Author: kfr
> Time: 11 February 2013, 7:34:04 pm
> UUID: d5a59509-3afd-3c46-a1c3-4c4e804aeef9
> Ancestors: MorphicExtras-kfr.76
>
> Fixing issues with flexing FlapTab
>
> =============== Diff against MorphicExtras-kfr.75 ===============
>
> Item was changed:
>   ----- Method: FlapTab>>computeEdgeFraction (in category 'edge') -----
>   computeEdgeFraction
>         "Compute and remember the edge fraction"
>
>         | aBox aFraction |
>         self isCurrentlySolid ifTrue: [^ edgeFraction ifNil: [self
> edgeFraction: 0.5]].
>
> +       aBox := ((self pasteUpMorph ifNil: [self currentWorld]) bounds)
> insetBy: (self extent // 2).
> +       aFraction := self
> -       aBox _ ((self pasteUpMorph ifNil: [ActiveWorld]) bounds) insetBy:
> (self extent // 2).
> -       aFraction _ self
>                 ifVertical:
>                         [(self center y - aBox top) / (aBox height max: 1)]
>                 ifHorizontal:
>                         [(self center x - aBox left) / (aBox width max:
> 1)].
>         ^ self edgeFraction: aFraction!
>
> Item was changed:
>   ----- Method: FlapTab>>fitOnScreen (in category 'positioning') -----
>   fitOnScreen
>         "19 sept 2000 - allow flaps in any paste up"
>         | constrainer t l |
> +       constrainer := self pasteUpMorph ifNil: [self currentWorld].
> -       constrainer := self pasteUpMorph ifNil: [self].
>         self flapShowing "otherwise no point in doing this"
>                 ifTrue:[self spanWorld].
>         self orientation == #vertical ifTrue: [
> +               t := ((self top min: (constrainer bottom- self height))
> max: constrainer top).
> -               t _ ((self top min: (constrainer bottom- self height))
> max: constrainer top).
>                 t = self top ifFalse: [self top: t].
>         ] ifFalse: [
> +               l := ((self left min: (constrainer right - self width))
> max: constrainer left).
> -               l _ ((self left min: (constrainer right - self width))
> max: constrainer left).
>                 l = self left ifFalse: [self left: l].
>         ].
>         self flapShowing ifFalse: [self positionObject: self atEdgeOf:
> constrainer].
>   !
>
> Item was changed:
>   ----- Method: FlapTab>>hideFlap (in category 'show & hide') -----
>   hideFlap
>         | aWorld |
> +       aWorld := self world ifNil: [self currentWorld].
> +       self privateDeleteReferent.
> -       aWorld _ self world ifNil: [self currentWorld].
> -       referent privateDelete.
>         aWorld removeAccommodationForFlap: self.
> +       flapShowing := false.
> -       flapShowing _ false.
>         self isInWorld ifFalse: [aWorld addMorphFront: self].
>         self adjustPositionAfterHidingFlap.
>         aWorld haloMorphs do:
>                 [:m | m target isInWorld ifFalse: [m delete]]!
>
> Item was changed:
>   ----- Method: FlapTab>>maybeHideFlapOnMouseLeaveDragging (in category
> 'show & hide') -----
>   maybeHideFlapOnMouseLeaveDragging
>         | aWorld |
>         self hasHalo ifTrue: [^ self].
>         referent isInWorld ifFalse: [^ self].
>         (dragged or: [referent bounds containsPoint: self cursorPoint])
>                 ifTrue: [^ self].
>         aWorld _ self world.
> +       self privateDeleteReferent.  "could make me worldless if I'm
> inboard"
> -       referent privateDelete.  "could make me worldless if I'm inboard"
>         aWorld ifNotNil: [aWorld removeAccommodationForFlap: self].
> +       flapShowing := false.
> -       flapShowing _ false.
>         self isInWorld ifFalse: [aWorld addMorphFront: self].
>         self adjustPositionAfterHidingFlap!
>
> Item was changed:
>   ----- Method: FlapTab>>mouseMove: (in category 'event handling') -----
>   mouseMove: evt
>         "Handle a mouse-move event.   The event, a MorphicEvent, is passed
> in."
>
>         | aPosition newReferentThickness adjustedPosition thick |
>
> +       dragged ifFalse: [(thick := self referentThickness) > 0
> +                       ifTrue: [lastReferentThickness := thick]].
> +       ((self containsPoint: (aPosition := evt cursorPoint)) and:
> [dragged not])
> -       dragged ifFalse: [(thick _ self referentThickness) > 0
> -                       ifTrue: [lastReferentThickness _ thick]].
> -       ((self containsPoint: (aPosition _ evt cursorPoint)) and: [dragged
> not])
>                 ifFalse:
>                         [flapShowing ifFalse: [self showFlap].
> +                       adjustedPosition := aPosition - evt hand
> targetOffset.
> -                       adjustedPosition _ aPosition - evt hand
> targetOffset.
>                         (edgeToAdhereTo == #bottom)
>                                 ifTrue:
> +                                       [newReferentThickness := inboard
> -                                       [newReferentThickness _ inboard
>                                                 ifTrue:
>                                                         [self world height
> - adjustedPosition y]
>                                                 ifFalse:
>                                                         [self world height
> - adjustedPosition y - self height]].
>
>                         (edgeToAdhereTo == #left)
>                                         ifTrue:
> +                                               [newReferentThickness :=
> -                                               [newReferentThickness _
>                                                         inboard
>                                                                 ifTrue:
>
> [adjustedPosition x + self width]
>                                                                 ifFalse:
>
> [adjustedPosition x]].
>
>                         (edgeToAdhereTo == #right)
>                                         ifTrue:
> +                                               [newReferentThickness :=
> -                                               [newReferentThickness _
>                                                         inboard
>                                                                 ifTrue:
>
> [self world width - adjustedPosition x]
>                                                                 ifFalse:
>
> [self world width - adjustedPosition x - self width]].
>
>                         (edgeToAdhereTo == #top)
>                                         ifTrue:
> +                                               [newReferentThickness :=
> -                                               [newReferentThickness _
>                                                         inboard
>                                                                 ifTrue:
>
> [adjustedPosition y + self height]
>                                                                 ifFalse:
>
> [adjustedPosition y]].
>
>                         self isCurrentlySolid ifFalse:
>                                 [(#(left right) includes: edgeToAdhereTo)
>                                         ifFalse:
>                                                 [self left:
> adjustedPosition x]
>                                         ifTrue:
>                                                 [self top:
> adjustedPosition y]].
>
>                         ((edgeToAdhereTo == #left) and: [(self
>  valueOfProperty: #rigidThickness) notNil]) ifTrue:
>                                 [newReferentThickness := referent width].
>
>                         self applyThickness: newReferentThickness.
> +                       dragged := true.
> -                       dragged _ true.
>                         self fitOnScreen.
>                         self computeEdgeFraction]!
>
> Item was changed:
>   ----- Method: FlapTab>>mouseUp: (in category 'event handling') -----
>   mouseUp: evt
>         "The mouse came back up, presumably after having dragged the tab.
>  Caution: if not operating full-screen, this notification can easily be
> *missed*, which is why the edge-fraction-computation is also being done on
> mouseMove."
>
>         super mouseUp: evt.
>         (self referentThickness <= 0 or:
>                 [(referent isInWorld and: [(referent boundsInWorld
> intersects: referent owner boundsInWorld) not])]) ifTrue:
>                         [self hideFlap.
> +                       flapShowing := false].
> -                       flapShowing _ false].
>         self fitOnScreen.
>         dragged ifTrue:
>                 [self computeEdgeFraction.
> +               dragged := false].
> -               dragged _ false].
>         Flaps doAutomaticLayoutOfFlapsIfAppropriate!
>
> Item was removed:
> - ----- Method: FlapTab>>ownerChanged (in category 'change reporting')
> -----
> - ownerChanged
> -       self fitOnScreen.
> -       ^super ownerChanged.!
>
> Item was changed:
>   ----- Method: FlapTab>>positionObject: (in category 'positioning') -----
>   positionObject: anObject
>           "anObject could be myself or my referent"
>
> + "Could consider container := referent pasteUpMorph, to allow flaps on
> things other than the world, but for the moment, let's skip it!!"
> - "Could consider container _ referent pasteUpMorph, to allow flaps on
> things other than the world, but for the moment, let's skip it!!"
>
>         "19 sept 2000 - going for all paste ups"
> +
> -
>         ^self
>                 positionObject: anObject
> +               atEdgeOf: (self pasteUpMorph ifNil: [^ self currentWorld])!
> -               atEdgeOf: (self pasteUpMorph ifNil: [^ self])!
>
> Item was added:
> + ----- Method: FlapTab>>privateDeleteReferent (in category 'show & hide')
> -----
> + privateDeleteReferent
> +       referent isFlexed
> +               ifTrue: [referent owner privateDelete]
> +               ifFalse: [referent privateDelete]!
>
> Item was changed:
>   ----- Method: FlapTab>>spanWorld (in category 'positioning') -----
>   spanWorld
>         "Make the receiver's height or width commensurate with that of the
> container."
>
>         | container |
>
> +       container := self pasteUpMorph ifNil: [self currentWorld].
> -       container _ self pasteUpMorph ifNil: [self currentWorld].
>         (self orientation == #vertical) ifTrue: [
>                 referent vResizing == #rigid
>                         ifTrue:[referent spanContainerVertically:
> container height].
>                 referent hResizing == #rigid
>                         ifTrue:[referent width: (referent width min:
> container width - self width)].
>                 referent top: container top + self referentMargin y.
>         ] ifFalse: [
>                 referent hResizing == #rigid
>                         ifTrue:[referent width: container width].
>                 referent vResizing == #rigid
>                         ifTrue:[referent height: (referent height min:
> container height - self height)].
>                 referent left: container left + self referentMargin x.
> +       ]!
> -       ] !
>
> Item was changed:
>   RectangleMorph subclass: #GraphMorph
> +       instanceVariableNames: 'data dataColor cursor cursorColor
> cursorColorAtZeroCrossings startIndex minVal maxVal cachedForm hasChanged
> samplingRate'
> -       instanceVariableNames: 'data dataColor cursor cursorColor
> cursorColorAtZeroCrossings startIndex minVal maxVal cachedForm hasChanged'
>         classVariableNames: ''
>         poolDictionaries: ''
>         category: 'MorphicExtras-Widgets'!
>
>   !GraphMorph commentStamp: '<historical>' prior: 0!
>   I display a graph of numbers, normalized so the full range of values
> just fits my height. I support a movable cursor that can be dragged with
> the mouse.
>
>   Implementation notes: Some operations on me may be done at sound
> sampling rates (e.g. 11-44 thousand times/second). To allow such high
> bandwidth application, certain operations that change my appearance do not
> immediately report a damage rectangle. Instead, a flag is set indicating
> that my display needs to refreshed and a step method reports the damage
> rectangle if that flag is set. Also, I cache a bitmap of my graph to allow
> the cursor to be moved without redrawing the graph.
>   !
>
> Item was added:
> + ----- Method: GraphMorph>>elementCount (in category 'accessing') -----
> + elementCount
> +       ^data size!
>
> Item was added:
> + ----- Method: GraphMorph>>getSamplingRate (in category 'accessing') -----
> + getSamplingRate
> +       ^samplingRate asString asSymbol!
>
> Item was changed:
>   ----- Method: GraphMorph>>initialize (in category 'initialization') -----
>   initialize
>         "initialize the state of the receiver"
>         super initialize.
>         ""
>         self extent: 365 @ 80.
>
>         dataColor _ Color darkGray.
>         cursor _ 1.0.
> +       samplingRate := 11025.
>         "may be fractional"
>         cursorColor _ Color red.
>         cursorColorAtZeroCrossings _ Color red.
>         startIndex _ 1.
>         hasChanged _ false.
>         self
>                 data: ((0 to: 360 - 1)
>                                 collect: [:x | (100.0 * x degreesToRadians
> sin) asInteger])!
>
> Item was changed:
>   ----- Method: GraphMorph>>play (in category 'commands') -----
>   play
> +       self playOnce: data size!
> -       self playOnce!
>
> Item was changed:
>   ----- Method: GraphMorph>>playOnce (in category 'commands') -----
>   playOnce
>
>         | scale absV scaledData |
>         data isEmpty ifTrue: [^ self].  "nothing to play"
>         scale _ 1.
>         data do: [:v | (absV _ v abs) > scale ifTrue: [scale _ absV]].
>         scale _ 32767.0 / scale.
>         scaledData _ SoundBuffer newMonoSampleCount: data size.
> +       cursor to: data size do: [:i | scaledData at: i put: (scale *
> (data at: i)) truncated].
> +       SoundService default playSampledSound: scaledData rate:
> samplingRate.
> -       1 to: data size do: [:i | scaledData at: i put: (scale * (data at:
> i)) truncated].
> -       SoundService default playSampledSound: scaledData rate: 11025.
>   !
>
> Item was added:
> + ----- Method: GraphMorph>>playOnce: (in category 'commands') -----
> + playOnce: aSampleNumber
> +
> +       | scale absV scaledData |
> +       data isEmpty ifTrue: [^ self].  "nothing to play"
> +       scale _ 1.
> +       data do: [:v | (absV _ v abs) > scale ifTrue: [scale _ absV]].
> +       scale _ 32767.0 / scale.
> +       scaledData _ SoundBuffer newMonoSampleCount: data size.
> +       cursor to: aSampleNumber do: [:i | scaledData at: i put: (scale *
> (data at: i)) truncated].
> +       SoundService default playSampledSound: scaledData rate:
> samplingRate.
> + !
>
> Item was added:
> + ----- Method: GraphMorph>>playTo: (in category 'commands') -----
> + playTo: aSampleNumber
> +       self playOnce: aSampleNumber!
>
> Item was added:
> + ----- Method: GraphMorph>>samplingRate (in category 'accessing') -----
> + samplingRate
> +     ^samplingRate!
>
> Item was added:
> + ----- Method: GraphMorph>>samplingRate: (in category 'accessing') -----
> + samplingRate: aSamplingRate
> +       ((SamplingRate resolutions) includes:  aSamplingRate) ifFalse: [^
> self].
> +       samplingRate:= aSamplingRate!
>
> Item was added:
> + ----- Method: GraphMorph>>setSamplingRate: (in category 'accessing')
> -----
> + setSamplingRate: aSymbol
> +       samplingRate :=  aSymbol asString asNumber!
>
> Item was added:
> + ----- Method: Player>>getSamplingRate (in category
> '*MorphicExtras-Widgets') -----
> + getSamplingRate
> +       ^ self getValueFromCostume: #getSamplingRate!
>
> Item was added:
> + ----- Method: Player>>playTo: (in category '*MorphicExtras-Widgets')
> -----
> + playTo: aSampleNumber
> +       costume renderedMorph playTo: aSampleNumber!
>
> Item was added:
> + ----- Method: Player>>setSamplingRate: (in category
> '*MorphicExtras-Widgets') -----
> + setSamplingRate: aSymbol
> +       costume renderedMorph setSamplingRate: aSymbol!
>
> Item was added:
> + SymbolListType subclass: #SamplingRate
> +       instanceVariableNames: ''
> +       classVariableNames: ''
> +       poolDictionaries: ''
> +       category: 'MorphicExtras-Widgets'!
>
> Item was added:
> + ----- Method: SamplingRate>>initialize (in category 'as yet
> unclassified') -----
> + initialize
> +       "Vocabulary initialize"
> +       super initialize.
> +       self vocabularyName: #SamplingRate.
> +       symbols := #('11025' '22050' '44100')
> +
> + !
>
> Item was added:
> + ----- Method: SamplingRate>>representsAType (in category 'as yet
> unclassified') -----
> + representsAType
> +       ^true!
>
> _______________________________________________
> etoys-dev mailing list
> etoys-dev at squeakland.org
> http://lists.squeakland.org/mailman/listinfo/etoys-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakland.org/pipermail/etoys-dev/attachments/20130211/79121f6e/attachment-0001.html>


More information about the etoys-dev mailing list