Christoph Thiede uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-ct.482.mcz
==================== Summary ====================
Name: EToys-ct.482 Author: ct Time: 13 September 2022, 9:00:07.422523 am UUID: 5c9ae0b6-6679-e448-a2bc-54572f1904b8 Ancestors: EToys-ct.481
Gradually improves high-dpi support for Etoys (TileMorph, ScriptEditorMorph, FileList2). Complements Tools-ct.1176.
=============== Diff against EToys-ct.481 ===============
Item was changed: ----- Method: FileList2 class>>buildFileTypeButtons:actionRow:fileList: (in category '*Etoys-Squeakland-blue ui') ----- buildFileTypeButtons: window actionRow: actionRow fileList: aFileList | fileTypeInfo fileTypeButtons fileTypeRow aButton | fileTypeInfo := self endingSpecs. fileTypeRow := window addARowCentered: #(). fileTypeRow color: ScriptingSystem paneColor. + fileTypeRow layoutInset: 3 px @ 3 px. + fileTypeRow cellInset: 2 px @ 0 px. - fileTypeRow layoutInset: 3 @ 3. - fileTypeRow cellInset: 2 @ 0. fileTypeRow hResizing: #spaceFill. fileTypeButtons := fileTypeInfo collect: [:each | aButton := self buildButtonText: each first balloonText: nil receiver: aFileList selector: #update:fileTypeRow:morphUp:. aButton arguments: {actionRow. fileTypeRow. aButton}. aButton setProperty: #enabled toValue: true. aButton setProperty: #buttonText toValue: each first. aButton]. fileTypeRow addAllMorphs: fileTypeButtons. aFileList directoryChangeBlock: [:newDir | self enableTypeButtons: fileTypeButtons info: fileTypeInfo + forDir: newDir].! - forDir: newDir]. - !
Item was changed: ----- Method: FileList2 class>>buildLoadButtons:fileList:reallyLoad: (in category '*Etoys-Squeakland-blue ui') ----- buildLoadButtons: window fileList: aFileList reallyLoad: aBoolean | aRow okButton cancelButton | okButton := self buildButtonText: 'OK' translated balloonText: nil receiver: aFileList selector: (aBoolean ifTrue: [#okHitForProjectLoader] ifFalse: [#okHit]). + okButton width: 150 px. - okButton width: 150. cancelButton := self buildButtonText: 'Cancel' translated balloonText: nil receiver: aFileList selector: #cancelHit. + cancelButton width: 150 px. - cancelButton width: 150.
"aFileList updateLoginButtonAppearance."
aRow := window addARow: {aFileList loginButton. aFileList loginField. okButton. cancelButton}. aRow color: ScriptingSystem paneColor. aRow listCentering: #bottomRight. + aRow layoutInset: 3 px @ 3 px. + aRow cellInset: 6 px @ 3 px. - aRow layoutInset: 3 @ 3. - aRow cellInset: 6 @ 3. ^ aRow!
Item was changed: ----- Method: FileList2 class>>buildPane:fileList:window:dirFilterType: (in category '*Etoys-Squeakland-blue ui') ----- buildPane: aWorld fileList: aFileList window: window dirFilterType: aSymbol | treeExtent filesExtent treePane fileListPane pane2a pane2b aRow | + aWorld width < 800 px + ifTrue: [treeExtent := 150 px @ 300 px. + filesExtent := 350 px @ 300 px] + ifFalse: [treeExtent := 250 px @ 300 px. + filesExtent := 350 px @ 300 px]. - aWorld width < 800 - ifTrue: [treeExtent := 150 @ 300. - filesExtent := 350 @ 300] - ifFalse: [treeExtent := 250 @ 300. - filesExtent := 350 @ 300]. (treePane := aFileList morphicDirectoryTreePaneFiltered: aSymbol) extent: treeExtent; retractable: false; borderWidth: 0. fileListPane := aFileList morphicFileListPane extent: filesExtent; retractable: false; borderWidth: 0. + aRow := window addARow: {(window inAColumn: {(pane2a := window inARow: {window inAColumn: {treePane}}) useRoundedCornersInEtoys; layoutInset: 3 px}) + layoutInset: 3 px. (window inAColumn: {(pane2b := window inARow: {window inAColumn: {fileListPane}}) useRoundedCornersInEtoys; layoutInset: 3 px}) + layoutInset: 3 px}. - aRow := window addARow: {(window inAColumn: {(pane2a := window inARow: {window inAColumn: {treePane}}) useRoundedCornersInEtoys; layoutInset: 3}) - layoutInset: 3. (window inAColumn: {(pane2b := window inARow: {window inAColumn: {fileListPane}}) useRoundedCornersInEtoys; layoutInset: 3}) - layoutInset: 3}. aRow color: ScriptingSystem paneColor. window fullBounds. {pane2a. pane2b} do: [:each | + each borderWidth: 1 px. - each borderWidth: 1. each borderColor: ScriptingSystem borderColor]. ^ treePane.!
Item was changed: ----- Method: FileList2 class>>buildSaveButtons:fileList: (in category '*Etoys-Squeakland-blue ui') ----- buildSaveButtons: window fileList: aFileList | buttonData buttons aRow | buttonData := Preferences enableLocalSave ifTrue: [#(#('Save' #okHit 'Save in the place specified above') #('Save on local disk only' #saveLocalOnlyHit 'saves in the Squeaklets folder') #('Cancel' #cancelHit 'return without saving') ) translatedNoop] ifFalse: [#(#('Save' #okHit 'Save in the place specified above') #('Cancel' #cancelHit 'return without saving') ) translatedNoop]. buttons := buttonData collect: [:each | self buildButtonText: each first translated balloonText: each third translated receiver: aFileList selector: each second]. aFileList updateLoginButtonAppearance. buttons := {aFileList loginButton. aFileList loginField. Morph new color: Color transparent; width: 50}, buttons. aRow := window addARow: buttons. aRow color: ScriptingSystem paneColor. aRow listCentering: #bottomRight. + aRow layoutInset: 3 px @ 3 px. + aRow cellInset: 6 px @ 3 px. - aRow layoutInset: 3 @ 3. - aRow cellInset: 6 @ 3. ^ aRow!
Item was changed: ----- Method: FileList2 class>>fontForBlueFileListButtons (in category '*Etoys-Squeakland-blue ui') ----- fontForBlueFileListButtons "Answer the font to use in the buttons of the blue file-list dialogs used by olpc users of etoys."
+ ^ Preferences standardButtonFont! - ^ Preferences standardEToysFont!
Item was changed: ----- Method: FileList2>>updateLoginButtonAppearance (in category '*Etoys-Squeakland-private') ----- updateLoginButtonAppearance
| old oldField notLoggedInMessage | notLoggedInMessage := '(not logged in)' translated. old := self loginButton. oldField := self loginField. self loginField: (Morph new color: Color white). + self loginField borderWidth: 2 px. - self loginField borderWidth: 2. self loginField borderColor: ScriptingSystem baseColor. self loginField beSticky. + self loginField width: 150 px. + self loginField height: 30 px. - self loginField width: 150. - self loginField height: 30. self loginField clipSubmorphs: true. EtoysUtilities loggedIn ifTrue: [ self loginButton: (self class buildButtonText: 'Logout' translated balloonText: nil receiver: self selector: #logoutHit). self loginButton color: ScriptingSystem baseColor. self loginField addMorphCentered: (StringMorph contents: (Utilities authorNamePerSe ifNil: [notLoggedInMessage]) font: Preferences standardEToysButtonFont). self loginButton setBalloonText: 'Log out from the Squeakland server' translated. self loginField setBalloonText: 'Your Squeakland user name' translated. ] ifFalse: [ self loginButton: (self class buildButtonText: 'Login' translated balloonText: nil receiver: self selector: #loginHit). self loginButton color: ScriptingSystem baseColor. self loginField addMorphCentered: (StringMorph contents: notLoggedInMessage font: Preferences standardEToysButtonFont). self loginButton setBalloonText: 'Log in to share projects on the Squeakland server' translated. self loginField setBalloonText: 'Your Squeakland user name' translated ]. self loginButton setNamePropertyTo: 'login'. + self loginButton width: 150 px. - self loginButton width: 150. old ifNotNil: [ old owner addMorph: self loginButton inFrontOf: old. old delete]. oldField ifNotNil: [ oldField owner addMorph: self loginField inFrontOf: oldField. + oldField delete].! - oldField delete]. - !
Item was changed: ----- Method: ScriptEditorMorph>>buttonRowForEditor (in category 'buttons') ----- buttonRowForEditor "Answer a row of buttons that comprise the header at the top of the Scriptor"
| aRow aString aStatusMorph aButton aTile aMorph goldBoxButton aBox | + aRow := AlignmentMorph newRow color: ScriptingSystem baseColor; layoutInset: 1 px. - aRow := AlignmentMorph newRow color: ScriptingSystem baseColor; layoutInset: 1. aRow hResizing: #spaceFill. aRow vResizing: #shrinkWrap. self addDismissButtonTo: aRow. + aRow addTransparentSpacerOfSize: 9 px. - aRow addTransparentSpacerOfSize: 9.
"Player's name" aString := playerScripted externalName. aMorph := StringMorph contents: aString font: ScriptingSystem fontForTiles. aMorph setNameTo: 'title'. aRow addMorphBack: aMorph. + aRow addTransparentSpacerOfSize: 6 px. - aRow addTransparentSpacerOfSize: 6.
"Script's name" aBox := AlignmentMorph newRow. aBox hResizing: #shrinkWrap; vResizing: #shrinkWrap. aBox color: (Color r: 0.839 g: 1.0 b: 0.806). + aBox borderWidth: 1 px. - aBox borderWidth: 1. aBox borderColor: (Color r: 0.645 g: 0.774 b: 0.613). aButton := UpdatingStringMorph new. aButton useStringFormat; target: self; getSelector: #scriptTitle; setNameTo: 'script name'; font: ScriptingSystem fontForNameEditingInScriptor; putSelector: #setScriptNameTo:; setProperty: #okToTextEdit toValue: true; step; yourself. aBox addMorph: aButton. aRow addMorphBack: aBox. aBox setBalloonText: 'Click here to edit the name of the script.' translated. "aRow addTransparentSpacerOfSize: 9." aRow addVariableTransparentSpacer.
"Try It button" self hasParameter ifFalse: [aRow addMorphBack: ((ThreePhaseButtonMorph labelSymbol: #TryIt target: self actionSelector: #tryMe arguments: #()) actWhen: #whilePressed; balloonTextSelector: #tryMe). + aRow addTransparentSpacerOfSize: 3 px]. - aRow addTransparentSpacerOfSize: 3].
"Step button, only for non-Kedama" (self playerScripted isPrototypeTurtlePlayer or: [self hasParameter]) ifFalse: [aRow addMorphBack: (aButton := ThreePhaseButtonMorph labelSymbol: #StepMe target: self actionSelector: #stepMe arguments: #()). aButton balloonTextSelector: #stepMe. + aRow addTransparentSpacerOfSize: 3 px]. - aRow addTransparentSpacerOfSize: 3].
"Status controller" self hasParameter ifTrue: [aTile := TypeListTile new choices: Vocabulary typeChoicesForUserVariables dataType: nil. aTile addArrows. aTile setLiteral: self typeForParameter. aRow addMorphBack: aTile. aTile borderColor: Color red. aTile color: ScriptingSystem uniformTileInteriorColor. aTile setBalloonText: 'Drag from here to get a parameter tile' translated. aTile addCaretsAsAppropriate: true] ifFalse: [aRow addMorphBack: (aStatusMorph := self scriptInstantiation statusControlMorph)].
+ "aRow addTransparentSpacerOfSize: 3 px." - "aRow addTransparentSpacerOfSize: 3." aRow addVariableTransparentSpacer.
"Gold-box" aRow addMorphBack: (goldBoxButton := IconicButton new). goldBoxButton borderWidth: 0; labelGraphic: (ScriptingSystem formAtKey: 'RoundGoldBox'); color: Color transparent; actWhen: #buttonDown; target: self; actionSelector: #offerGoldBoxMenu; shedSelvedge; setBalloonText: 'click here to get a palette of useful tiles to use in your script.' translated. + aRow addTransparentSpacerOfSize: 6 px @ 1 px. - aRow addTransparentSpacerOfSize: 6@1.
"Menu Button" aButton := self menuButton. aButton actionSelector: #offerScriptorMenu. aRow addMorphBack: aButton.
(playerScripted existingScriptInstantiationForSelector: scriptName) ifNotNil: [:inst | inst updateStatusMorph: aStatusMorph]. ^ aRow!
Item was changed: ----- Method: ScriptEditorMorph>>createThreadShowing (in category 'menu commands') ----- createThreadShowing
| vertices | self deleteThreadShowing. vertices := OrderedCollection new. self tileRows do: [:row | | b | row first isTurtleRow ifTrue: [ b := row first bounds. + vertices add: ((b topLeft + (4 px @ 0)) + ((0 * 0.1 * b width) @ 0)). - vertices add: ((b topLeft + (4 @ 0)) + ((0 * 0.1 * b width) @ 0)). 0 to: 9 do: [:i | + vertices add: ((b topLeft + (4 px @ 4 px))+ ((i * 0.1 * b width ) @ 0)). + vertices add: ((b bottomLeft + (4 px @ -4 px)) + ((i * 0.1 * b width) @ 0)). - vertices add: ((b topLeft + (4 @ 4))+ ((i * 0.1 * b width ) @ 0)). - vertices add: ((b bottomLeft + (4 @ -4)) + ((i * 0.1 * b width) @ 0)). ]. + vertices add: ((b bottomLeft + (4 px @ 0)) + ((9 * 0.1 * b width) @ 0)). - vertices add: ((b bottomLeft + (4 @ 0)) + ((9 * 0.1 * b width) @ 0)). ] ifFalse: [ b := row first bounds. vertices add: ((b origin x + b corner x) // 2) @ (b origin y). + vertices add: ((b origin x + b corner x) // 2) @ (b origin y + 4 px). + vertices add: ((b origin x + b corner x) // 2) @ (b corner y - 4 px). - vertices add: ((b origin x + b corner x) // 2) @ (b origin y + 4). - vertices add: ((b origin x + b corner x) // 2) @ (b corner y - 4). vertices add: ((b origin x + b corner x) // 2) @ (b corner y). ]. ]. + threadPolygon := PolygonMorph vertices: vertices color: Color black borderWidth: 2 px borderColor: Color black. - threadPolygon := PolygonMorph vertices: vertices color: Color black borderWidth: 2 borderColor: Color black. threadPolygon makeOpen. + threadPolygon openInWorld.! - threadPolygon openInWorld. - !
Item was changed: ----- Method: ScriptEditorMorph>>defaultBorderWidth (in category 'initialization') ----- defaultBorderWidth "answer the default border width for the receiver" + ^ 1 px! - ^ 1!
Item was changed: ----- Method: ScriptEditorMorph>>explainStatusAlternatives (in category 'customevents-other') ----- explainStatusAlternatives "Explain the scripting-status alternatives."
+ ScriptingSystem putUpInfoPanelFor:(ScriptingSystem statusHelpStringFor: playerScripted) title: 'Script Status' translated extent: 800 px @ 500 px! - ScriptingSystem putUpInfoPanelFor:(ScriptingSystem statusHelpStringFor: playerScripted) title: 'Script Status' translated extent: 800@500!
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: ["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 px @ -4 px). "inset?" - @ (newExtent y - self firstSubmorph height)) - (self borderWidth * 2) + (-4 @ -4). "inset?" ^ super extent: newExtent!
Item was changed: ----- Method: ScriptEditorMorph>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" super initialize. "" self listDirection: #topToBottom; hResizing: #shrinkWrap; vResizing: #shrinkWrap; cellPositioning: #topLeft; setProperty: #autoFitContents toValue: true; minHeight: TileMorph defaultH; + layoutInset: 2 px. - layoutInset: 2. self useRoundedCornersInEtoys. self borderColor: ScriptingSystem borderColor. self setNameTo: 'Script Editor' translated. firstTileRow := 1. "index of first tile-carrying submorph" self addNewRow. + showingMethodPane := false.! - showingMethodPane := false. - !
Item was changed: ----- Method: ScriptEditorMorph>>setupMethodMorph (in category '*Etoys-Squeakland-buttons') ----- setupMethodMorph "create textual source instead"
| aCodePane |
aCodePane := MethodHolder isolatedCodePaneForClass: playerScripted class selector: scriptName.
aCodePane hResizing: #spaceFill; vResizing: #spaceFill; + minHeight: 100 px. - minHeight: 100. self hResizing: #shrinkWrap; vResizing: #shrinkWrap. self addMorphBack: aCodePane. self fullBounds. self listDirection: #topToBottom; hResizing: #rigid; vResizing: #rigid; rubberBandCells: true; minWidth: self width.
showingMethodPane := true. self currentWorld startSteppingSubmorphsOf: self!
Item was changed: ----- Method: TileMorph>>arrowDelta (in category 'mouse handling') ----- arrowDelta "Answer the amount by which a number I display should increase at a time"
| readout | (readout := self findA: UpdatingStringMorph) ifNotNil: [^readout floatPrecision ]. + ^ 1 px! - ^ 1!
Item was changed: ----- Method: TileMorph>>basicWidth (in category 'misc') ----- basicWidth "Provide a nominal minimum, exclusive of arrows and independent of label width"
^ operatorOrExpression + ifNotNil: [3 px] + ifNil: [18 px]! - ifNotNil: [3] - ifNil: [18]!
Item was changed: ----- Method: TileMorph>>buildHPopArrows (in category '*Etoys-Squeakland-arrows popup') ----- buildHPopArrows | panel left right | self outmostScriptEditor ifNil: [^ nil]. (retractArrow isNil and: [suffixArrow isNil]) ifTrue: [^ nil]. panel := Morph new. panel cornerStyle: #rounded. left := SketchMorph new form: (ScriptingSystem formAtKey: #LargeLeftArrow). right := SketchMorph new form: (ScriptingSystem formAtKey: #LargeRightArrow). panel color: color. panel sticky: true. panel layoutPolicy: TableLayout new. panel listDirection: #leftToRight. panel hResizing: #shrinkWrap. panel vResizing: #shrinkWrap. + panel cellInset: 4 px. + panel layoutInset: 2 px. - panel cellInset: 4. - panel layoutInset: 2. retractArrow ifNotNil: [panel addMorphBack: left]. suffixArrow ifNotNil: [panel addMorphBack: right]. panel on: #mouseLeave send: #hidePopArrows to: self. left on: #mouseUp send: #popArrowRetractArrowHit: to: self. right on: #mouseUp send: #popArrowSuffixArrowHit: to: self. ^ panel!
Item was changed: ----- Method: TileMorph>>buildVPopArrows (in category '*Etoys-Squeakland-arrows popup') ----- buildVPopArrows | panel up down | upArrow ifNil: [^ nil]. panel := Morph new. panel cornerStyle: #rounded. up := SketchMorph new form: (ScriptingSystem formAtKey: #LargeUpArrow). down := SketchMorph new form: (ScriptingSystem formAtKey: #LargeDownArrow). panel color: color. panel sticky: true. panel layoutPolicy: TableLayout new. panel listDirection: #topToBottom. panel hResizing: #shrinkWrap. panel vResizing: #shrinkWrap. + panel cellInset: 4 px. + panel layoutInset: 2 px. - panel cellInset: 4. - panel layoutInset: 2. panel addMorphBack: up. panel addMorphBack: down. panel on: #mouseLeave send: #hidePopArrows to: self. up on: #mouseDown send: #popArrowUp: to: self. up on: #mouseMove send: #popArrowMouseMove: to: self. down on: #mouseDown send: #popArrowDown: to: self. down on: #mouseMove send: #popArrowMouseMove: to: self. ^ panel!
Item was changed: ----- Method: TileMorph>>convertAlignment (in category 'private') ----- convertAlignment "Convert the receiver's alignment rules" | where frame | owner ifNotNil:[ owner class == TilePadMorph ifTrue:[ owner layoutPolicy: TableLayout new. owner hResizing: #shrinkWrap. owner vResizing: #spaceFill. ]. ]. self layoutPolicy: TableLayout new. + self cellInset: 2 px @ 0. + self layoutInset: 1 px @ 0. - self cellInset: 2@0. - self layoutInset: 1@0. self listDirection: #leftToRight. self wrapCentering: #center. self hResizing: #shrinkWrap. self vResizing: #spaceFill. "Now convert up and down arrow" (upArrow notNil and:[upArrow owner == self "e.g., not converted" and:[downArrow notNil and:[downArrow owner == self]]]) ifTrue:[ "where to insert the frame" where := (submorphs indexOf: upArrow) min: (submorphs indexOf: downArrow). frame := Morph new color: Color transparent. frame layoutPolicy: TableLayout new; listDirection: #topToBottom; hResizing: #shrinkWrap; vResizing: #shrinkWrap; + cellInset: 0 @ 1 px; + layoutInset: 0 @ 1 px. - cellInset: 0@1; - layoutInset: 0@1. self privateAddMorph: frame atIndex: where. frame addMorphBack: upArrow; addMorphBack: downArrow. + ].! - ]. - !
Item was changed: ----- Method: TileMorph>>defaultBorderWidth (in category 'initialization') ----- defaultBorderWidth "answer the default border width for the receiver" + ^ 1 px! - ^ 1!
Item was changed: ----- Method: TileMorph>>emblazonPlayerNameOnReferenceTileWithin: (in category '*Etoys-Squeakland-initialization') ----- emblazonPlayerNameOnReferenceTileWithin: scriptorOrViewer "Make the string within the receiver be the right thing."
| newLabel usePad | newLabel := actualObject externalName. Preferences implicitSelfInTiles ifTrue: [scriptorOrViewer ifNotNil: [scriptorOrViewer playerScripted == actualObject ifTrue: [newLabel := '']]]. (newLabel notEmpty and: [self isPossessive]) ifTrue: [newLabel := newLabel, '''s' translated].
self line1: newLabel.
usePad := owner isKindOf: TilePadMorph. newLabel ifEmpty: [usePad ifTrue: [owner hResizing: #rigid; width: 0; clipSubmorphs: true]. self hResizing: #rigid; width: 0; borderWidth: 0] ifNotEmpty: [usePad ifTrue: [owner hResizing: #shrinkWrap; clipSubmorphs: false]. + self hResizing: #shrinkWrap; borderWidth: 1 px] - self hResizing: #shrinkWrap; borderWidth: 1] !
Item was changed: ----- Method: TileMorph>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" super initialize. "" + self extent: 1 px @ 1 px. - self extent: 1 @ 1. self typeColor: (Color r: 0.8 g: 1.0 b: 0.6).
type := #literal. "#literal, #slotRef, #objRef, #operator, #expression" slotName := ''. literal := 1. self layoutPolicy: TableLayout new. self minCellSize: 0 @ TileMorph defaultH. + self cellInset: 2 px @ 0. + self layoutInset: 1 px @ 0. - self cellInset: 2 @ 0. - self layoutInset: 1 @ 0. self listDirection: #leftToRight. self wrapCentering: #center. self hResizing: #shrinkWrap. self vResizing: #spaceFill!
Item was changed: ----- Method: TileMorph>>layoutChanged (in category 'layout') ----- layoutChanged | vpanel hpanel popArrows | super layoutChanged. self labelMorph ifNil: [^ self]. popArrows := self activeHand ifNil: [^ self] ifNotNil: [:ac | ac valueOfProperty: #popArrows ifAbsent: [^ self]]. popArrows first == self ifFalse: [^ self]. vpanel := popArrows second. hpanel := popArrows third. vpanel ifNotNil: [vpanel openInWorld. vpanel center: self labelMorph center. + vpanel right: self labelMorph left - 2 px]. - vpanel right: self labelMorph left - 2]. hpanel ifNotNil: [hpanel openInWorld. hpanel center: self labelMorph center. + hpanel left: self labelMorph right + 2 px]! - hpanel left: self labelMorph right + 2]!
Item was changed: ----- Method: TileMorph>>line1: (in category 'private') ----- line1: line1 "Emblazon the receiver with the requested label. If the receiver already has a label, make the new label be of the same class"
| m desiredW classToUse lab f | classToUse := (lab := self labelMorph) ifNotNil: [lab class] ifNil: [StringMorph]. self removeAllMorphs. f := ScriptingSystem fontForTiles. (type = #operator and: [#(+ - * / // \ < <= > >= = ~=) includes: operatorOrExpression]) ifTrue: [ f := f emphasized: 1]. m := classToUse contents: line1 font: f. + desiredW := m width + 6 px. - desiredW := m width + 6. self extent: (desiredW max: self minimumWidth) @ self class defaultH. m position: self center - (m extent // 2). self addMorph: m. !
Item was changed: ----- Method: TileMorph>>setVisibilityOfUpDownCarets: (in category '*Etoys-Squeakland-arrows') ----- setVisibilityOfUpDownCarets: showCarets "If the argument is true, make all the 'up and down' carets, such as those that let you change the value of a number or of a boolean constant, visible; if false, remove them from sight. "
(submorphs detect: [:m | m hasProperty: #arrows] ifNone: [nil]) ifNotNil: [:wrapper | showCarets + ifTrue: [wrapper width: 9 px] - ifTrue: [wrapper width: 9] ifFalse: [wrapper width: 0]]!
Item was changed: ----- Method: TileMorph>>test (in category 'private') ----- test | pos | "Set the position of all my submorphs. Compute my bounds. Caller must call layoutChanged or set fullBounds to nil."
fullBounds ifNil: [ pos := self topLeft. self submorphsDo: [:sub | | hh | hh := (self class defaultH - sub height) // 2. "center in Y" + sub privateBounds: (pos + (2 px @ hh) extent: sub extent). + pos x: (sub right min: 1200 px)]. "2 pixels spacing on left" + bounds := bounds topLeft corner: pos + (2 px @ self class defaultH). - sub privateBounds: (pos + (2@hh) extent: sub extent). - pos x: (sub right min: 1200)]. "2 pixels spacing on left" - bounds := bounds topLeft corner: pos + (2 @ self class defaultH). fullBounds := bounds. ]. owner class == TilePadMorph ifTrue: [owner bounds: bounds]. ^ fullBounds!
packages@lists.squeakfoundation.org