<div dir="ltr">Hm,<div>Bogus ancestry for this commit :-(</div><div>Can it be deleted ?</div><div><br></div><div>Best,</div><div>Karl</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Apr 22, 2018 at 11:31 AM,  <span dir="ltr"><<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Karl Ramberg uploaded a new version of Morphic to project The Trunk:<br>
<a href="http://source.squeak.org/trunk/Morphic-kfr.1418.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/<wbr>trunk/Morphic-kfr.1418.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: Morphic-kfr.1418<br>
Author: kfr<br>
Time: 22 April 2018, 11:30:41.518937 am<br>
UUID: d6dd46c1-fa46-5043-bf0d-<wbr>8b4542cf733d<br>
Ancestors: Morphic-kfr.1416, Morphic-cmm.1417<br>
<br>
Some maintenance to ScorePlayerMorph. <br>
Fixing some layout issues.<br>
Add menu options to make a new score and add tracks to the score.<br>
<br>
=============== Diff against Morphic-kfr.1416 ===============<br>
<br>
Item was changed:<br>
  ----- Method: ProportionalSplitterMorph>><wbr>balanceOffsets (in category 'layout') -----<br>
  balanceOffsets<br>
+       (self valueOfProperty: #fullDelta) ifNil: [self setProperty: #fullDelta toValue: (0@0)] .<br>
<br>
        self layoutFrame hasFixedHeight ifTrue: [<br>
                | otop obot ctop cbot topf |<br>
<br>
                otop := (owner submorphs detect: [:m | <br>
                                        m layoutFrame topFraction isZero] ifNone: [^ self]) in: [:tm | <br>
                                                tm top - (tm layoutFrame topOffset ifNil: [0])].<br>
<br>
                obot := (owner submorphs detect: [:m | <br>
                                        m layoutFrame bottomFraction = 1] ifNone: [^ self]) in: [:tm | <br>
                                                tm bottom - (tm layoutFrame bottomOffset ifNil: [0])].<br>
<br>
                ctop := (self layoutFrame topFraction * (obot - otop)) rounded <br>
                                        + otop + (self layoutFrame topOffset ifNil: [0]).<br>
                cbot := (self layoutFrame bottomFraction * (obot - otop)) rounded <br>
                                        + otop + (self layoutFrame bottomOffset ifNil: [0]).<br>
<br>
                topf := self layoutFrame topFraction.<br>
                self layoutFrame topFraction:  ((ctop + cbot) * 0.5 - otop) / (obot - otop) asFloat.<br>
                self layoutFrame bottomFraction: self layoutFrame topFraction.<br>
                self layoutFrame topOffset: ctop - <br>
                        (self layoutFrame topFraction * (obot - otop) + otop) rounded.<br>
                self layoutFrame bottomOffset: cbot - <br>
                        (self layoutFrame bottomFraction * (obot - otop) + otop) rounded..<br>
<br>
                (leftOrTop copy union: rightOrBottom) do: [:m |<br>
                        (m layoutFrame topFraction closeTo: topf) ifTrue: [<br>
                                m layoutFrame topFraction: self layoutFrame topFraction.<br>
                                m layoutFrame topOffset: <br>
                                        m layoutFrame topOffset - (self valueOfProperty: #fullDelta) y].<br>
                        (m layoutFrame bottomFraction closeTo: topf) ifTrue: [<br>
                                m layoutFrame bottomFraction: self layoutFrame topFraction.<br>
                                m layoutFrame bottomOffset: <br>
                                        m layoutFrame bottomOffset - (self valueOfProperty: #fullDelta) y.]]] .<br>
<br>
        self layoutFrame hasFixedWidth ifTrue: [<br>
                | oleft oright cleft cright leftf |<br>
<br>
                oleft := (owner submorphs detect: [:m | <br>
                        m layoutFrame leftFraction isZero] ifNone: [^ self]) in: [:tm | <br>
                                tm left - (tm layoutFrame leftOffset ifNil: [0])].<br>
<br>
                oright := (owner submorphs detect: [:m | <br>
                        m layoutFrame rightFraction = 1] ifNone: [^ self]) in: [:tm | <br>
                                tm right - (tm layoutFrame rightOffset ifNil: [0])].<br>
<br>
                cleft := (self layoutFrame leftFraction * (oright - oleft)) rounded <br>
                                        + oleft + (self layoutFrame leftOffset ifNil: [0]).<br>
                cright := (self layoutFrame rightFraction * (oright - oleft)) rounded <br>
                                        + oleft + (self layoutFrame rightOffset ifNil: [0]).<br>
<br>
                leftf := self layoutFrame leftFraction.<br>
                self layoutFrame leftFraction: ((cleft + cright) * 0.5 - oleft) / (oright - oleft) asFloat.<br>
                self layoutFrame rightFraction: self layoutFrame leftFraction.<br>
<br>
                self layoutFrame leftOffset: cleft - <br>
                        (self layoutFrame leftFraction * (oright - oleft) + oleft) rounded.<br>
                self layoutFrame rightOffset: cright - <br>
                        (self layoutFrame rightFraction * (oright - oleft) + oleft) rounded.<br>
<br>
                (leftOrTop copy union: rightOrBottom) do: [:m |<br>
                        (m layoutFrame leftFraction closeTo: leftf) ifTrue: [<br>
                                m layoutFrame leftFraction: self layoutFrame leftFraction.<br>
                                m layoutFrame leftOffset: <br>
                                        m layoutFrame leftOffset - (self valueOfProperty: #fullDelta) x].<br>
                        (m layoutFrame rightFraction closeTo: leftf) ifTrue: [<br>
                                m layoutFrame rightFraction: self layoutFrame leftFraction.<br>
                                m layoutFrame rightOffset: <br>
                                        m layoutFrame rightOffset - (self valueOfProperty: #fullDelta) x.]]] .<br>
<br>
        self removeProperty: #fullDelta.<br>
        owner layoutChanged<br>
  !<br>
<br>
Item was changed:<br>
  ----- Method: ProportionalSplitterMorph>><wbr>step (in category 'events') -----<br>
  step<br>
        splitsTopAndBottom<br>
                ifTrue: [ self reduceTopBottomImbalance ]<br>
                ifFalse:<br>
                        [ self reduceLeftRightImbalance abs > 1 ifTrue:<br>
                                [ self splittersLeftDo:<br>
                                        [ : splitter | splitter reduceLeftRightImbalance ].<br>
                                self splittersRightDo:<br>
+                                       [ : splitter | splitter reduceLeftRightImbalance ] ] ].<br>
+       self balanceOffsets!<br>
-                                       [ : splitter | splitter reduceLeftRightImbalance ] ] ]!<br>
<br>
Item was added:<br>
+ ----- Method: ScorePlayerMorph>>addNewScore (in category 'menu') -----<br>
+ addNewScore<br>
+       "Open a MIDI score and re-init controls..."<br>
+       | score player |<br>
+ <br>
+       score := MIDIScore new.<br>
+       score tracks: (Array with: Array new).<br>
+       score trackInfo: #('Instrument').<br>
+       player := ScorePlayer onScore: score.<br>
+       ^self onScorePlayer: player title: 'new'!<br>
<br>
Item was added:<br>
+ ----- Method: ScorePlayerMorph>><wbr>addTrackToScore (in category 'menu') -----<br>
+ addTrackToScore<br>
+       "add a instrument track to the current score"<br>
+       | score tracks trackInfo player |<br>
+       score := scorePlayer score.<br>
+       tracks := score tracks copyWith:#().<br>
+       score tracks: tracks.<br>
+       trackInfo := score trackInfo copyWith: 'Instrument'.<br>
+       score trackInfo: trackInfo.<br>
+       player := ScorePlayer onScore: score.<br>
+       ^self onScorePlayer: player title: 'new'!<br>
<br>
Item was changed:<br>
  ----- Method: ScorePlayerMorph>>invokeMenu (in category 'menu') -----<br>
  invokeMenu<br>
        "Invoke a menu of additonal functions for this ScorePlayer."<br>
- <br>
        | aMenu |<br>
        aMenu := MenuMorph new defaultTarget: self.<br>
+       aMenu add: 'add a new score' translated action: #addNewScore.<br>
+       aMenu add: 'add a new track to score' translated action: #addTrackToScore.<br>
        aMenu add: 'open a MIDI file' translated action: #openMIDIFile.<br>
+       aMenu addList: {#-. {'save as AIFF file' translated. #saveAsAIFF}. {'save as WAV file' translated. #saveAsWAV}. {'save as Sun AU file' translated. #saveAsSunAudio}. #-}.<br>
+       aMenu<br>
+               add: 'reload instruments' translated<br>
+               target: AbstractSound<br>
+               selector: #updateScorePlayers.<br>
-       aMenu addList: {<br>
-               #-.<br>
-               {'save as AIFF file' translated.        #saveAsAIFF}.<br>
-               {'save as WAV file' translated.         #saveAsWAV}.<br>
-               {'save as Sun AU file' translated.      #saveAsSunAudio}.<br>
-               #-}.<br>
-       aMenu add: 'reload instruments' translated target: AbstractSound selector: #updateScorePlayers.<br>
        aMenu addLine.<br>
        scorePlayer midiPort<br>
+               ifNil: [aMenu add: 'play via MIDI' translated action: #openMIDIPort]<br>
+               ifNotNil: [aMenu add: 'play via built in synth' translated action: #closeMIDIPort.<br>
-               ifNil: [<br>
-                       aMenu add: 'play via MIDI' translated action: #openMIDIPort]<br>
-               ifNotNil: [<br>
-                       aMenu add: 'play via built in synth' translated action: #closeMIDIPort.<br>
                        aMenu add: 'new MIDI controller' translated action: #makeMIDIController:].<br>
        aMenu addLine.<br>
        aMenu add: 'make a pause marker' translated action: #makeAPauseEvent:.<br>
+       aMenu popUpInWorld: self world!<br>
- <br>
-       aMenu popUpInWorld: self world.<br>
- !<br>
<br>
Item was changed:<br>
  ----- Method: ScorePlayerMorph>><wbr>onScorePlayer:title: (in category 'initialization') -----<br>
  onScorePlayer: aScorePlayer title: scoreName<br>
        | divider col r |<br>
        scorePlayer := aScorePlayer.<br>
        scorePlayer ifNotNil:<br>
                [scorePlayer  reset.<br>
                instrumentSelector := Array new: scorePlayer score tracks size].<br>
<br>
        self removeAllMorphs.<br>
        self addMorphBack: self makeControls.<br>
        scorePlayer ifNil: [^ self].<br>
<br>
        r := self makeRow<br>
+               hResizing: #spaceFill;<br>
-               hResizing: #shrinkWrap;<br>
                vResizing: #shrinkWrap.<br>
        r addMorphBack: self rateControl;<br>
                addMorphBack: (Morph newBounds: (0@0 extent: 20@0) color: Color transparent);<br>
                addMorphBack: self volumeControl.<br>
        self addMorphBack: r.<br>
        self addMorphBack: self scrollControl.<br>
<br>
        col := AlignmentMorph newColumn color: color; layoutInset: 0.<br>
        self addMorphBack: col.<br>
        1 to: scorePlayer trackCount do: [:trackIndex |<br>
                divider := AlignmentMorph new<br>
                        extent: 10@1;<br>
                        borderWidth: 1;<br>
                        layoutInset: 0;<br>
                        borderColor: #raised;<br>
                        color: color;<br>
                        hResizing: #spaceFill;<br>
                        vResizing: #rigid.<br>
                col addMorphBack: divider.<br>
                col addMorphBack: (self trackControlsFor: trackIndex)].<br>
<br>
        LastMIDIPort ifNotNil: [<br>
                "use the most recently set MIDI port"<br>
                scorePlayer openMIDIPort: LastMIDIPort].<br>
  !<br>
<br>
Item was changed:<br>
  ----- Method: ScorePlayerMorph>>rateControl (in category 'layout') -----<br>
  rateControl<br>
<br>
        | rateSlider middleLine r |<br>
        rateSlider := SimpleSliderMorph new<br>
                color: color;<br>
                sliderColor: Color gray;<br>
+               extent: 180@12;<br>
-               extent: 180@6;<br>
                target: self;<br>
                actionSelector: #setLogRate:;<br>
                minVal: -1.0;<br>
                maxVal: 1.0;<br>
                adjustToValue: 0.0.<br>
        middleLine := Morph new  "center indicator for pan slider"<br>
                color: (Color r: 0.4 g: 0.4 b: 0.4);<br>
                extent: 1@(rateSlider height - 4);<br>
                position: rateSlider center x@(rateSlider top + 2).<br>
        rateSlider addMorphBack: middleLine.<br>
        r := self makeRow<br>
+               hResizing: #spaceFill;<br>
-               hResizing: #shrinkWrap;<br>
                vResizing: #rigid;<br>
                height: 24.<br>
        r addMorphBack: (StringMorph contents: 'slow ' translated).<br>
        r addMorphBack: rateSlider.<br>
        r addMorphBack: (StringMorph contents: ' fast' translated).<br>
        ^ r<br>
  !<br>
<br>
Item was changed:<br>
  ----- Method: ScorePlayerMorph>><wbr>scrollControl (in category 'layout') -----<br>
  scrollControl<br>
<br>
        | r |<br>
        scrollSlider := SimpleSliderMorph new<br>
                color: color;<br>
                sliderColor: Color gray;<br>
+               extent: 360@12;<br>
-               extent: 360@6;<br>
                target: scorePlayer;<br>
                actionSelector: #positionInScore:;<br>
                adjustToValue: scorePlayer positionInScore.<br>
        r := self makeRow<br>
+               hResizing: #spaceFill;<br>
-               hResizing: #shrinkWrap;<br>
                vResizing: #rigid;<br>
                height: 24.<br>
        r addMorphBack: (StringMorph contents: 'start ' translated).<br>
        r addMorphBack: scrollSlider.<br>
        r addMorphBack: (StringMorph contents: ' end' translated).<br>
        ^ r<br>
  !<br>
<br>
Item was changed:<br>
  ----- Method: ScorePlayerMorph>><wbr>trackNumAndMuteButtonFor: (in category 'layout') -----<br>
  trackNumAndMuteButtonFor: trackIndex<br>
<br>
        | muteButton instSelector pianoRollColor r |<br>
        muteButton := SimpleSwitchMorph new<br>
                onColor: (Color r: 1.0 g: 0.6 b: 0.6);<br>
                offColor: color;<br>
                color: color;<br>
                label: 'Mute' translated;<br>
                target: scorePlayer;<br>
                actionSelector: #mutedForTrack:put:;<br>
                arguments: (Array with: trackIndex).<br>
        instSelector := PopUpChoiceMorph new<br>
                extent: 95@14;<br>
                contentsClipped: 'oboe1';<br>
                target: self;<br>
                actionSelector: #atTrack:from:<wbr>selectInstrument:;<br>
                getItemsSelector: #instrumentChoicesForTrack:;<br>
                getItemsArgs: (Array with: trackIndex).<br>
        instSelector arguments:<br>
                (Array with: trackIndex with: instSelector).<br>
        instrumentSelector at: trackIndex put: instSelector.<br>
<br>
        "select track color using same color list as PianoRollScoreMorph"<br>
        pianoRollColor := (Color wheel: scorePlayer score tracks size) at: trackIndex. <br>
<br>
        r := self makeRow<br>
                hResizing: #spaceFill;<br>
                vResizing: #spaceFill;<br>
                extent: 70@10.<br>
        r addMorphBack:<br>
                ((StringMorph<br>
                        contents: trackIndex printString<br>
                        font: (TextStyle default fontOfSize: 24)) color: pianoRollColor).<br>
        trackIndex < 10<br>
                ifTrue: [r addMorphBack: (Morph new color: color; extent: 19@8)]  "spacer"<br>
                ifFalse: [r addMorphBack: (Morph new color: color; extent: 8@8)].  "spacer"<br>
        r addMorphBack:<br>
                (StringMorph new<br>
+                       extent: 80@14;<br>
-                       extent: 140@14;<br>
                        contentsClipped: (scorePlayer infoForTrack: trackIndex)).<br>
        r addMorphBack: (Morph new color: color; extent: 8@8).  "spacer"<br>
        r addMorphBack: instSelector.<br>
        r addMorphBack: (AlignmentMorph newRow color: color).  "spacer"<br>
        r addMorphBack: muteButton.<br>
        ^ r<br>
  !<br>
<br>
Item was changed:<br>
  ----- Method: ScorePlayerMorph>><wbr>volumeControl (in category 'layout') -----<br>
  volumeControl<br>
<br>
        | volumeSlider r |<br>
        volumeSlider := SimpleSliderMorph new<br>
                color: color;<br>
                sliderColor: Color gray;<br>
+               extent: 80@12;<br>
-               extent: 80@6;<br>
                target: scorePlayer;<br>
                actionSelector: #overallVolume:;<br>
                adjustToValue: scorePlayer overallVolume.<br>
        r := self makeRow<br>
+               hResizing: #spaceFill;<br>
-               hResizing: #shrinkWrap;<br>
                vResizing: #rigid;<br>
                height: 24.<br>
        r addMorphBack: (StringMorph contents: 'soft  ' translated).<br>
        r addMorphBack: volumeSlider.<br>
        r addMorphBack: (StringMorph contents: ' loud' translated).<br>
        ^ r<br>
  !<br>
<br>
<br>
</blockquote></div><br></div>