[squeak-dev] Small commits are [bad|good] (was: The Trunk: EToys-mt.368.mcz)

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Fri Nov 15 09:05:32 UTC 2019


Hi all,
I don't recommend mixing cosmetic changes with functional changes, unless
cosmetic changes are really scarce. My experience is that it is a recipe
for switching the attention focus out of the functional changes, and as
such it is parasiting at best or obstructing at worse the review process.
Also, we should not deny the value of cosmetic changes. They have some
value. They require attention and review too, even if they won't break
production.

We might want to amend tools. I hate loosing history, and I value the
contextual analysis of certain design decision. But the frequency of such
incursion into the past is gradually fading away. MC requires history for
merging, but merging a too distant branch is becoming close to impossible
anyway for human review. I tried it with Pharo some years ago, after
repairing the conscious erasing of history that happened at each Pharo
release (which is a very aggressive way to solve the problem, the
worse-is-better-way)..
So having the whole history in memory is questionable. It's not the whole
history, what about Smalltalk 72, 76, 80, the change-set and update stream
era... We have to set a limit.

For browsing the history, I don't know what is worse, having a long list of
small changes, or shorter list of squashed (in git parlance) unrelated
changes. But this should be handled in the interface IMO. If we prefer
grouping, this should be done by the browsing tool. For my own usage, it
would have helped if the tool could filter the list by date range, modified
class, method, pattern matching on commit message, ...

Somehow related, it happens that I group several changes in one commit, I
did it recently in VMMaker, one change for solving Newspeak generated code,
the other for avoiding generating variable named bool, which were
obstructing my attempt to compile legacy Mac OS  carbon VM. I did regret,
because the first change introduced a slip in generated code that made the
build fail in the branch dedicated to second change... Using CI automation
is another reason why we should value separation of concerns. If I want to
merge the compile_legacy_MacOS branch, one may ask in the future why the
hell the totally unrelated Newspeak change was introduced in this branch.
That's an anti-pattern, especially if we use explicitely named feature
branches (which we avoid currently in MC, partly for lack of tool support).

Last, MC does not behave so badly. I have far worse user experience using
sourcetree on windows for file based projects on a gitlab server where load
balancing configuration is not optimal, I can tell you that we should stop
bashing ourselves ;)

Le ven. 15 nov. 2019 à 04:39, David T. Lewis <lewis at mail.msen.com> a écrit :

> Changing the subject line.
>
> Small commits do generate more noise, but I find that it is
> easier to read, assess, and manage the changes if the commits
> are small. I have spent a good deal of time doing this for
> http://www.squeaksource.com/TrunkUpdateStreamV3 and my perspective
> is based largely on that experience.
>
> If I were to point to something in need of improvement, I would say
> that is the performance of our Monticello tools.
>
> I *love* having the MC change management directly in the image where
> everything is directly accessible, browseable, and minimally dependent
> on external tools. But I have to admit that the tools are slow.
> Processing the update stream is slow, comparing versions is slow,
> and reading packages is slow. And I strongly suspect that if all of
> these things were instantaniously fast, then none of us would care
> about how big or small the commits were.
>
> I may be wrong, but I have to suspect that some profiling of common
> use cases, such as updating Squeak from the server, might identify
> some huge opportunities for improvement.
>
> But even if those improvements never happen, I think that small
> commits are a good thing.
>
> Dave
>
>
> On Thu, Nov 14, 2019 at 09:32:51AM +0100, Marcel Taeumel wrote:
> > > ...??piddly little fixes ...
> > > ... such small changes are not worth burdening everyone's life ...
> > > ...????tiny improvements ...
> >
> > Since I merged those commits and had to read and asses them, I can say
> that the granularity of them was fine. Except for that one duplication for
> the help in Freecell.
> >
> > Let's focus on "recategorize methods". Yes, one could easily do that
> when fixing another issue. Unless it is a bigger quest such as Patrick's
> (pre) recent efforts to clean up lots of categories across classes.
> >
> > Best,
> > Marcel
> > Am 13.11.2019 20:20:41 schrieb Chris Muller <asqueaker at gmail.com>:
> > Guys, would you please consider "batching up" piddly little fixes like
> "recatgorized one method" this into fewer, chunkier commits with other
> fixes??? Such small changes are not worth burdening everyone's life with an
> additional 2MB of memory, disk, network and CPU overhead -- in *every
> single image* they use going forward, forever.?? ??Please let that sink in
> for a moment.
> >
> > Even ignoring that, it also bloats the readability of the history.??
> There's no use case where timestamping and versioning tiny improvements
> like this is useful, only micro harmful.
> >
> > Best,
> > ?? Chris
> >
> > On Wed, Nov 13, 2019 at 6:33 AM Marcel Taeumel <marcel.taeumel at hpi.de
> [mailto:marcel.taeumel at hpi.de]> wrote:
> >
> > Hi Christoph,
> >
> > I know. We should come up with a solution for that. Maybe re-print the
> commit messages of all ancestors as soon as the number of ancestors is > 1.
> >
> > Best,
> > Marcel
> > Am 13.11.2019 12:51:06 schrieb Thiede, Christoph <
> christoph.thiede at student.hpi.uni-potsdam.de [mailto:
> christoph.thiede at student.hpi.uni-potsdam.de]>:
> > Just for interest, is it usual & desired behavior that when installing
> these updates, the update??log does not include??any of my commit messages?
> > Von: Squeak-dev <squeak-dev-bounces at lists.squeakfoundation.org [mailto:
> squeak-dev-bounces at lists.squeakfoundation.org]> im Auftrag von
> commits at source.squeak.org [mailto:commits at source.squeak.org] <
> commits at source.squeak.org [mailto:commits at source.squeak.org]>
> > Gesendet: Mittwoch, 13. November 2019 12:15:14
> > An: squeak-dev at lists.squeakfoundation.org [mailto:
> squeak-dev at lists.squeakfoundation.org];
> packages at lists.squeakfoundation.org [mailto:
> packages at lists.squeakfoundation.org]
> > Betreff: [squeak-dev] The Trunk: EToys-mt.368.mcz
> > ??
> > Marcel Taeumel uploaded a new version of EToys to project The Trunk:
> > http://source.squeak.org/trunk/EToys-mt.368.mcz [
> http://source.squeak.org/trunk/EToys-mt.368.mcz]
> >
> > ==================== Summary ====================
> >
> > Name: EToys-mt.368
> > Author: mt
> > Time: 13 November 2019, 12:15:07.673043 pm
> > UUID: 3f6873fa-5111-ac4a-a108-9031e19e5f40
> > Ancestors: EToys-kfr.363, EToys-ct.354, EToys-ct.355, EToys-ct.356,
> EToys-ct.357, EToys-ct.358, EToys-ct.359, EToys-ct.360, EToys-ct.364,
> EToys-ct.365, EToys-ct.367
> >
> > Merge! Merge! Merge! Various fixes in Etoys-related places.
> >
> > =============== Diff against EToys-kfr.363 ===============
> >
> > Item was added:
> > + ----- Method: Form>>scaledToWidth: (in category
> '*Etoys-Squeakland-scaling, rotation') -----
> > + scaledToWidth: newWidth
> > +?????????????? "Answer the receiver, scaled such that it has the
> desired width."
> > +
> > +?????????????? newWidth = self width ifTrue: [^ self].
> > +?????????????? ^self magnify: self boundingBox by: (newWidth / self
> width) smoothing: 2.
> > + !
> >
> > Item was changed:
> > ?? ----- Method: FreeCell>>help (in category 'actions') -----
> > ?? help
> > +
> > +?????????????? self helpText editWithLabel: 'FreeCell Help'.!
> > -?????????????? | window helpMorph |
> > -?????????????? window := SystemWindow labelled: 'FreeCell Help'
> translated.
> > -?????????????? window model: self.
> > -?????????????? helpMorph := (PluggableTextMorph new editString: self
> helpText) lock.
> > -?????????????? window
> > -?????????????????????????????? addMorph: helpMorph
> > -?????????????????????????????? frame: (0 @ 0 extent: 1 @ 1).
> > -?????????????? window openInWorld!
> >
> > Item was added:
> > + ----- Method: MovingEyeMorph>>color: (in category 'accessing') -----
> > + color: aColor
> > +
> > +?????????????? super color: aColor.
> > +??????????????
> > +?????????????? "Migrate old instances."
> > +?????????????? inner color: Color transparent.
> > +??????????????
> > +?????????????? "Keep iris visible."
> > +?????????????? aColor = iris color
> > +?????????????????????????????? ifTrue: [iris borderWidth: 1;
> borderColor: aColor negated]
> > +?????????????????????????????? ifFalse: [iris borderWidth: 0].!
> >
> > Item was changed:
> > ?? ----- Method: MovingEyeMorph>>initialize (in category
> 'initialization') -----
> > ?? initialize
> > ???????????????? "initialize the state of the receiver"
> > ???????????????? super initialize.
> > ???????????????? ""
> > ???????????????? inner := EllipseMorph new.
> > +?????????????? inner color: Color transparent.
> > -?????????????? inner color: self color.
> > ???????????????? inner extent: (self extent * (1.0 @ 1.0 - IrisSize))
> asIntegerPoint.
> > -?????????????? inner borderColor: self color.
> > ???????????????? 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.
> > +??????????????
> > +?????????????? "Keep iris visible."
> > +?????????????? aColor = self color
> > +?????????????????????????????? ifTrue: [iris borderWidth: 1;
> borderColor: aColor negated]
> > +?????????????????????????????? ifFalse: [iris borderWidth: 0].!
> >
> > Item was added:
> > + ----- Method: MovingEyeMorph>>irisPos (in category 'accessing') -----
> > + irisPos
> > +
> > +?????????????? ^ iris position!
> >
> > Item was changed:
> > + ----- Method: MovingEyeMorph>>irisPos: (in category 'accessing') -----
> > - ----- Method: MovingEyeMorph>>irisPos: (in category 'as yet
> unclassified') -----
> > ?? 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 at y) asIntegerPoint) + self center -
> (iris extent // 2).!
> >
> > Item was changed:
> > ?? ----- 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].!
> > -?????????????????????????????? ifFalse: [self irisPos: cp].
> > -?????????????? self changed "cover up gribblies if embedded in Flash"!
> >
> > Item was changed:
> > ?? ----- Method: NewVariableDialogMorph>>decimalPlaces (in category
> 'accessing') -----
> > ?? decimalPlaces
> > ???????????????? ^ decimalPlacesButton
> > ???????????????????????????????? ifNil: [Utilities
> > ????????????????????????????????????????????????????????????????
> decimalPlacesForFloatPrecision: (self targetPlayer
> >
> +??????????????????????????????????????????????????????????????????????????????
> defaultFloatPrecisionFor: self varAcceptableName asSetterSelector)]
> >
> -??????????????????????????????????????????????????????????????????????????????
> defaultFloatPrecisionFor: (Utilities getterSelectorFor: self
> varAcceptableName))]
> > ???????????????????????????????? ifNotNil: [:button| button label
> asNumber]!
> >
> > Item was changed:
> > ?? ----- Method: Player>>newScriptorAround: (in category 'viewer') -----
> > ?? newScriptorAround: aPhrase
> > ???????????????? "Sprout a scriptor around aPhrase, thus making a new
> script.?? aPhrase may either be a PhraseTileMorph (classic tiles 1997-2001)
> or a SyntaxMorph (2001 onward)"
> > ??
> > ???????????????? | aScriptEditor aUniclassScript tw blk |
> > ?? Cursor wait showWhile: [
> > ???????????????? aUniclassScript := self class permanentUserScriptFor:
> self unusedScriptName player: self.
> > ???????????????? aScriptEditor := aUniclassScript
> instantiatedScriptEditorForPlayer: self.
> > ??
> > ???????????????? Preferences universalTiles ifTrue: [
> > ???????????????????????????????? aScriptEditor install.
> > ???????????????????????????????? "aScriptEditor hResizing: #shrinkWrap;
> > ???????????????????????????????????????????????? vResizing: #shrinkWrap;
> > ???????????????????????????????????????????????? cellPositioning:
> #topLeft;
> > ???????????????????????????????????????????????? setProperty:
> #autoFitContents toValue: true."
> > ???????????????????????????????? aScriptEditor insertUniversalTiles.??
> "Gets an empty SyntaxMorph for a MethodNode"
> > +?????????????????????????????? tw := aScriptEditor findA: ScrollPane.
> > -?????????????????????????????? tw := aScriptEditor findA:
> TwoWayScrollPane.
> > ???????????????????????????????? aPhrase ifNotNil:
> > ???????????????????????????????????????????????? [blk := (tw scroller
> findA: SyntaxMorph "MethodNode") findA: BlockNode.
> > ???????????????????????????????????????????????? blk addMorphFront:
> aPhrase.
> > ???????????????????????????????????????????????? aPhrase accept.
> > ???????????????????????????????? ].
> > ???????????????????????????????? SyntaxMorph setSize: nil
> andMakeResizable: aScriptEditor.
> > ???????????????? ] ifFalse: [
> > ???????????????????????????????? aPhrase
> > ????????????????????????????????????????????????????????????????
> ifNotNil: [aScriptEditor phrase: aPhrase]???????????? "does an install"
> > ???????????????????????????????????????????????????????????????? ifNil:
> [aScriptEditor install]
> > ???????????????? ].
> > ???????????????? self class allSubInstancesDo: [:anInst | anInst
> scriptInstantiationForSelector: aUniclassScript selector].
> > ???????????????????????????????? "The above assures the presence of a
> ScriptInstantiation for the new selector in all siblings"
> > ???????????????? self updateScriptsCategoryOfViewers.
> > ?? ].
> > ???????????????? ^ aScriptEditor!
> >
> > Item was changed:
> > ?? ----- Method: Preferences class>>initializePreferencePanel:in: (in
> category '*Etoys-Squeakland-preferences panel') -----
> > ?? initializePreferencePanel: aPanel in: aPasteUpMorph
> > ???????????????? "Initialize the given Preferences panel. in the given
> pasteup, which is the top-level panel installed in the container window.??
> Also used to reset it after some change requires reformulation"
> > ??
> > ???????????????? | tabbedPalette controlPage aColor aFont
> maxEntriesPerCategory tabsMorph anExtent?? prefObjects |
> > ???????????????? aPasteUpMorph removeAllMorphs.
> > ??
> > ???????????????? aFont := Preferences standardListFont.
> > +?????????????? aColor := aPanel windowColorToUse.
> > -?????????????? aColor := aPanel defaultBackgroundColor.
> > ???????????????? tabbedPalette := TabbedPalette newSticky.
> > ???????????????? tabbedPalette dropEnabled: false.
> > ???????????????? (tabsMorph := tabbedPalette tabsMorph) color: aColor
> darker;
> > ?????????????????????????????????? highlightColor: Color red
> regularColor: Color brown darker darker.
> > ???????????????? tabbedPalette on: #mouseDown send: #yourself to: #().
> > ???????????????? maxEntriesPerCategory := 0.
> > ???????????????? self listOfCategories do:
> > ???????????????????????????????? [:aCat |
> > ???????????????????????????????????????????????? controlPage :=
> AlignmentMorph newColumn beSticky color: aColor.
> > ???????????????????????????????????????????????? controlPage on:
> #mouseDown send: #yourself to: #().
> > ???????????????????????????????????????????????? controlPage
> dropEnabled: false.
> > ???????????????????????????????????????????????? controlPage
> borderColor: aColor;
> > ??????????????????????????????????????????????????????????????????
> layoutInset: 4.
> > ???????????????????????????????????????????????? (prefObjects := self
> preferenceObjectsInCategory: aCat) do:
> > ????????????????????????????????????????????????????????????????
> [:aPreference | | button |
> >
> ????????????????????????????????????????????????????????????????????????????????
> button := aPreference representativeButtonWithColor: Color white inPanel:
> aPanel.
> >
> ????????????????????????????????????????????????????????????????????????????????
> button ifNotNil: [controlPage addMorphBack: button]].
> > ???????????????????????????????????????????????? controlPage setNameTo:
> aCat asString.
> > ???????????????????????????????????????????????? aCat = #?
> > ???????????????????????????????????????????????????????????????? ifTrue:
> [aPanel addHelpItemsTo: controlPage].
> > ???????????????????????????????????????????????? tabbedPalette
> addTabFor: controlPage font: aFont.
> > ???????????????????????????????????????????????? aCat = 'search results'
> ifTrue:
> > ????????????????????????????????????????????????????????????????
> [(tabbedPalette tabNamed: aCat) setBalloonText:
> >
> ????????????????????????????????????????????????????????????????????????????????
> 'Use the ? category to find preferences by keyword; the results of your
> search will show up here' translated].
> > ???????????????????????????????? maxEntriesPerCategory :=
> maxEntriesPerCategory max: prefObjects size].
> > ???????????????? tabbedPalette selectTabNamed: '?'.
> > ???????????????? tabsMorph rowsNoWiderThan: aPasteUpMorph width.
> > ???????????????? aPasteUpMorph on: #mouseDown send: #yourself to: #().
> > ???????????????? anExtent := aPasteUpMorph width @ (490 max: (25 +
> tabsMorph height + (24 * maxEntriesPerCategory))).
> > ???????????????? aPasteUpMorph extent: anExtent.
> > ???????????????? aPasteUpMorph color: aColor.
> > ???????????????? aPasteUpMorph???????? addMorphBack: tabbedPalette.!
> >
> > Item was changed:
> > ?? ----- Method: ScriptEditorMorph>>autoFitOnOff (in category 'menu')
> -----
> > ?? autoFitOnOff
> > ???????????????? "Toggle between auto fit to size of code and manual
> resize with scrolling"
> > ???????????????? | tw |
> > +?????????????? (tw := self findA: ScrollPane) ifNil: [^ self].
> > -?????????????? (tw := self findA: TwoWayScrollPane) ifNil: [^ self].
> > ???????????????? (self hasProperty: #autoFitContents)
> > ???????????????????????????????? ifTrue: [self removeProperty:
> #autoFitContents.
> > ???????????????????????????????????????????????? self hResizing: #rigid;
> vResizing: #rigid]
> > ???????????????????????????????? ifFalse: [self setProperty:
> #autoFitContents toValue: true.
> > ???????????????????????????????????????????????? self hResizing:
> #shrinkWrap; vResizing: #shrinkWrap].
> > ???????????????? tw layoutChanged!
> >
> > Item was changed:
> > ?? ----- Method: ScriptEditorMorph>>extent: (in category 'other') -----
> > ?? extent: x
> > ??
> > ???????????????? | newExtent tw menu |
> > ???????????????? newExtent := x max: self minWidth @ self minHeight.
> > +?????????????? (tw := self findA: ScrollPane) ifNil:
> > -?????????????? (tw := self findA: TwoWayScrollPane) ifNil:
> > ???????????????????????????????? ["This was the old behavior"
> > ???????????????????????????????? ^ super extent: newExtent].
> > ??
> > ???????????????? (self hasProperty: #autoFitContents) ifTrue: [
> > ???????????????????????????????? menu := MenuMorph new defaultTarget:
> self.
> > ???????????????????????????????? menu addUpdating: #autoFitString
> target: self action: #autoFitOnOff.
> > ???????????????????????????????? menu addTitle: 'To resize the script,
> uncheck the box below' translated.
> > ???????????????????????????????? menu popUpEvent: nil in: self
> world???????? .
> > ???????????????????????????????? ^ self].
> > ??
> > ???????????????? "Allow the user to resize to any size"
> > ???????????????? tw extent: ((newExtent x max: self firstSubmorph width)
> > ???????????????????????????????????????????????????????????????? @
> (newExtent y - self firstSubmorph height)) - (self borderWidth * 2) + (-4 @
> -4).?? "inset?"
> > ???????????????? ^ super extent: newExtent!
> >
> > Item was changed:
> > ?? ----- Method: ScriptEditorMorph>>hibernate (in category 'other') -----
> > ?? hibernate
> > ???????????????? "Possibly delete the tiles, but only if using universal
> tiles."
> > ??
> > ???????????????? | tw |
> > ???????????????? Preferences universalTiles ifFalse: [^self].
> > +?????????????? (tw := self findA: ScrollPane) isNil
> > -?????????????? (tw := self findA: TwoWayScrollPane) isNil
> > ???????????????????????????????? ifFalse:
> > ???????????????????????????????????????????????? [self setProperty:
> #sizeAtHibernate toValue: self extent.???????????? "+ tw xScrollerHeight"
> > ???????????????????????????????????????????????? submorphs size > 1
> ifTrue: [tw delete]]!
> >
> > Item was added:
> > + ----- Method: SpectrumAnalyzerMorph>>fftSize: (in category
> 'accessing') -----
> > + fftSize: aSize
> > +
> > +?????????????? | on |
> > +?????????????? on := soundInput isRecording.
> > +?????????????? self stop.
> > +?????????????? fft := FFT new: aSize.
> > +?????????????? self resetDisplay.
> > +?????????????? on ifTrue: [self start].!
> >
> > Item was changed:
> > ?? ----- Method: SpectrumAnalyzerMorph>>setFFTSize (in category 'menu
> and buttons') -----
> > ?? setFFTSize
> > ???????????????? "Set the size of the FFT used for frequency analysis."
> > ??
> > +?????????????? | aMenu sz |
> > -?????????????? | aMenu sz on |
> > ???????????????? aMenu := CustomMenu new title: ('FFT size (currently
> {1})' translated format:{fft n}).
> > ???????????????? ((7 to: 10) collect: [:n | 2 raisedTo: n]) do:[:r |
> aMenu add: r printString action: r].
> > ???????????????? sz := aMenu startUp.
> > ???????????????? sz ifNil: [^ self].
> > +?????????????? self fftSize: sz.!
> > -?????????????? on := soundInput isRecording.
> > -?????????????? self stop.
> > -?????????????? fft := FFT new: sz.
> > -?????????????? self resetDisplay.
> > -?????????????? on ifTrue: [self start].
> > - !
> >
> > Item was changed:
> > ?? ----- Method: SyntaxMorph class>>setSize:andMakeResizable: (in
> category 'as yet unclassified') -----
> > ?? setSize: oldExtent andMakeResizable: outerMorph
> > ???????????????? | tw |
> > +?????????????? (tw := outerMorph findA: ScrollPane) ifNil: [^self].
> > -?????????????? (tw := outerMorph findA: TwoWayScrollPane) ifNil:
> [^self].
> > ???????????????? tw hResizing: #spaceFill;
> > ???????????????????????????????? vResizing: #spaceFill;
> > ???????????????????????????????? color: Color transparent;
> > ???????????????????????????????? setProperty: #hideUnneededScrollbars
> toValue: true.
> > ???????????????? outerMorph
> > ???????????????????????????????? hResizing: #shrinkWrap;
> > ???????????????????????????????? vResizing: #shrinkWrap;
> > ???????????????????????????????? cellPositioning: #topLeft.
> > ???????????????? outerMorph fullBounds.
> > ?? !
> >
> > Item was changed:
> > ?? ----- Method: SyntaxMorph>>enclosingPane (in category 'accessing')
> -----
> > ?? enclosingPane
> > ???????????????? "The object that owns this script layout"
> > ??
> > ???????????????? | oo higher |
> > ???????????????? oo := self owner.
> > ???????????????? [higher := oo isSyntaxMorph.
> > ???????????????? higher := higher or: [oo class == TransformMorph].
> > +?????????????? higher := higher or: [oo class == ScrollPane].
> > -?????????????? higher := higher or: [oo class == TwoWayScrollPane].
> > ???????????????? higher ifFalse: [^ oo].
> > ???????????????? higher] whileTrue: [oo := oo owner].
> > ?? !
> >
> > Item was removed:
> > - ----- Method: SyntaxMorph>>inAScrollPane (in category
> 'initialization') -----
> > - inAScrollPane
> > -?????????????? "Answer a scroll pane in which the receiver is
> scrollable"
> > -
> > -?????????????? ^ self inATwoWayScrollPane!
> >
> > Item was changed:
> > ?? ----- Method: SyntaxMorph>>openInWindow (in category
> 'initialization') -----
> > ?? openInWindow
> > ??
> > +?????????????? | sel |
> > -?????????????? | window widget sel |
> > ???????????????? sel := ''.
> > ???????????????? self firstSubmorph allMorphs do: [:rr |
> > +?????????????????????????????? (rr isKindOf: StringMorph) ifTrue: [sel
> := sel, rr contents]].
> > -?????????????????????????????????????????????? (rr isKindOf:
> StringMorph) ifTrue: [sel := sel, rr contents]].
> > -?????????????? window := (SystemWindow labelled: 'Tiles for ', self
> parsedInClass printString, '>>',sel).
> > -?????????????? widget := self inAScrollPane.
> > -?????????????? widget color: Color paleOrange.
> > -?????????????? window
> > -?????????????????????????????? addMorph: widget
> > -?????????????????????????????? frame: (0 at 0 extent: 1.0 at 1.0).
> > -?????????????? window openInWorldExtent: (
> > -?????????????????????????????? self extent + (20 at 40) min: (Display
> boundingBox extent * 0.8) rounded
> > -?????????????? )
> > ??
> > +?????????????? ^ self inAScrollPane
> > +?????????????????????????????? color: Color paleOrange;
> > +?????????????????????????????? openInWindowLabeled: 'Tiles for ', self
> parsedInClass printString, '>>', sel!
> > - !
> >
> > Item was added:
> > + ----- Method: SyntaxMorph>>parseNodeWith:asStatement: (in category
> '*Etoys-Squeakland-code generation') -----
> > + parseNodeWith: encoder asStatement: aBoolean
> > +
> > +?????????????? ^ self parseNode!
> >
> > Item was changed:
> > ?? ----- Method: SyntaxMorph>>unhighlightBorder (in category
> 'highlighting') -----
> > ?? unhighlightBorder
> > ??
> > ???????????????? self currentSelectionDo: [:innerMorph :mouseDownLoc
> :outerMorph |
> > +?????????????????????????????? (self == outerMorph or: [owner notNil
> and: [owner isSyntaxMorph not]])
> > +?????????????????????????????????????????????? ifFalse: [self
> borderColor: self stdBorderColor]
> > +?????????????????????????????????????????????? ifTrue: [
> > +?????????????????????????????????????????????????????????????? (self
> hasProperty: #deselectedBorderColor)
> >
> +??????????????????????????????????????????????????????????????????????????????
> ifTrue: [self borderColor: (self valueOfProperty: #deselectedBorderColor)]
> >
> +??????????????????????????????????????????????????????????????????????????????
> ifFalse: [self borderStyle: (BorderStyle raised width: self borderWidth)]]
> ].!
> > -?????????????????????????????? self borderColor: (
> > -?????????????????????????????????????????????? (self == outerMorph or:
> [owner notNil and: [owner isSyntaxMorph not]])
> > -?????????????????????????????????????????????????????????????? ifFalse:
> [self borderColor: self stdBorderColor]
> > -?????????????????????????????????????????????????????????????? ifTrue: [
> >
> -??????????????????????????????????????????????????????????????????????????????
> (self hasProperty: #deselectedBorderColor)
> >
> -??????????????????????????????????????????????????????????????????????????????????????????????
> ifTrue: [self borderColor: (self valueOfProperty: #deselectedBorderColor)]
> >
> -??????????????????????????????????????????????????????????????????????????????????????????????
> ifFalse: [self borderStyle: (BorderStyle raised width: self borderWidth)]]
> )].!
> >
> > Item was changed:
> > ?? ----- Method: TileMorph>>wrapPhraseInFunction (in category
> '*Etoys-Squeakland-arrows') -----
> > ?? wrapPhraseInFunction
> > ???????????????? "The user made a gesture requesting that the phrase for
> which the receiver bears the widget hit be wrapped in a function.?? This
> applies for the moment only to numeric functions"
> > ??
> > ???????????????? | pad newPad functionPhrase |
> > ???????????????? pad := self ownerThatIsA: TilePadMorph.?? "Or something
> higher than that???"
> > ???????????????? (pad isNil or: [pad type ~= #Number]) ifTrue: [^ Beeper
> beep].
> > ???????????????? newPad := TilePadMorph new setType: #Number.
> > +?????????????? newPad hResizing: #shrinkWrap; vResizing: #spaceFill.
> > -?????????????? newPad hResizing: #shrinkWrap; vResizing: #spacefill.
> > ???????????????? functionPhrase := FunctionTile new.
> > ???????????????? newPad addMorphBack: functionPhrase.
> > ???????????????? pad owner replaceSubmorph: pad by: newPad.
> > ???????????????? functionPhrase operator: #abs pad: pad.
> > ???????????????? functionPhrase addSuffixArrow.
> > ???????????????? self scriptEdited
> > ?? !
> >
> > Item was changed:
> > ?? ----- Method: TilePadMorph>>wrapInFunction (in category
> '*Etoys-Squeakland-miscellaneous') -----
> > ?? wrapInFunction
> > ???????????????? "The user made a gesture requesting that the receiver
> be wrapped in a (numeric) function."
> > ??
> > ???????????????? | newPad functionPhrase |
> > ???????????????? newPad := TilePadMorph new setType: #Number.
> > +?????????????? newPad hResizing: #shrinkWrap; vResizing: #spaceFill.
> > -?????????????? newPad hResizing: #shrinkWrap; vResizing: #spacefill.
> > ???????????????? functionPhrase := FunctionTile new.
> > ???????????????? newPad addMorphBack: functionPhrase.
> > ???????????????? owner replaceSubmorph: self by: newPad.
> > ???????????????? functionPhrase operator: #abs pad: self.
> > ???????????????? self scriptEdited!
> >
> > Item was changed:
> > ?? ----- Method: VariableNode>>asMorphicSyntaxIn: (in category
> '*Etoys-tiles') -----
> > ?? asMorphicSyntaxIn: parent
> > ??
> > ???????????????? ^ parent addToken: self name
> > ???????????????????????????????????????????????? type: #variable
> > +?????????????????????????????????????????????? on: self
> shallowCopy?????? "don't hand out the prototype!! See
> VariableNode>>initialize"
> > -?????????????????????????????????????????????? on: self clone?? "don't
> hand out the prototype!! See VariableNode>>initialize"
> > ?? !
> >
> > Item was changed:
> > + ----- Method: WatchMorph class>>fontName:bgColor:centerColor: (in
> category 'instance creation') -----
> > - ----- Method: WatchMorph class>>fontName:bgColor:centerColor: (in
> category 'as yet unclassified') -----
> > ?? fontName: aString bgColor: aColor centerColor: otherColor
> > ???????????????? ^ self new
> > ???????????????????????????????? fontName: aString;
> > ???????????????????????????????? color: aColor;
> > ???????????????????????????????? centerColor: otherColor!
> >
> > Item was changed:
> > ?? ----- Method: WorldWindow class>>test2 (in category 'as yet
> unclassified') -----
> > ?? test2
> > ???????????????? "WorldWindow test2."
> > ??
> > ???????????????? | window world scrollPane |
> > ???????????????? world := WiWPasteUpMorph newWorldForProject: nil.
> > ???????????????? window := (WorldWindow labelled: 'Scrollable World')
> model: world.
> > +?????????????? window addMorph: (scrollPane := ScrollPane new model:
> world)
> > -?????????????? window addMorph: (scrollPane := TwoWayScrollPane new
> model: world)
> > ???????????????????????????????? frame: (0 at 0 extent: 1.0 at 1.0).
> > ???????????????? scrollPane scroller addMorph: world.
> > ???????????????? world hostWindow: window.
> > ???????????????? window openInWorld
> > ?? !
> >
> >
> >
>
> >
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20191115/d0eb81ea/attachment.html>


More information about the Squeak-dev mailing list