[squeak-dev] The Trunk: Morphic-mt.1524.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Sep 19 14:47:16 UTC 2019


Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.1524.mcz

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

Name: Morphic-mt.1524
Author: mt
Time: 19 September 2019, 4:47:08.121125 pm
UUID: 883ea759-a904-dd42-8549-8f2c64cae163
Ancestors: Morphic-mt.1523

Layout fixes and layout-configuration robustness:
- Makes ScrollPane compatible with #shrinkWrap
- Adds checks for common layout properties to guard against common mistakes such as "shrinkWrap" vs. "srinkWrap" and "spaceFill" vs. "spaceFIll".
- Adds missing #layoutChanged calls to ScrollPane
- Better commentary in TransformMorph >> #layoutBounds
- Makes the ScrollPane's TransformMorph (i.e. scroller) have the resizing properties (#shrinkWrap/#spaceFill) as applied in ScrollPane >> #doLayoutIn:, which is a custom layout strategy - not a policy.

=============== Diff against Morphic-mt.1523 ===============

Item was changed:
  ----- Method: Morph>>cellSpacing: (in category 'layout-properties') -----
  cellSpacing: aSymbol
  	"Layout specific. This property describes how the cell size for each element in a list should be computed.
  		#globalRect - globally equal rectangular cells
  		#globalSquare - globally equal square cells
  		#localRect - locally (e.g., per row/column) equal rectangular cells
  		#localSquare - locally (e.g., per row/column) equal square cells
  		#none - cells are sized based on available row/column constraints
  	"
+ 	self checkCellSpacingProperty: aSymbol.
- 	self assert: aSymbol isSymbol. "Guard against a common mistake."
  	self assureTableProperties cellSpacing: aSymbol.
  	self layoutChanged.!

Item was added:
+ ----- Method: Morph>>checkCellSpacingProperty: (in category 'layout') -----
+ checkCellSpacingProperty: aSymbol
+ 	
+ 	aSymbol == #none ifTrue: [^ self].
+ 	
+ 	aSymbol == #globalRect ifTrue: [^ self].
+ 	aSymbol == #globalSquare ifTrue: [^ self].
+ 	aSymbol == #localRect ifTrue: [^ self].
+ 	aSymbol == #localSquare ifTrue: [^ self].
+ 	
+ 	Error signal: 'Invalid cell-spacing property. Use #none, #globalRect, #globalSquare, #localRect, or #localSquare.'.!

Item was added:
+ ----- Method: Morph>>checkListSpacingProperty: (in category 'layout') -----
+ checkListSpacingProperty: aSymbol
+ 	
+ 	aSymbol == #none ifTrue: [^ self].
+ 	aSymbol == #equal ifTrue: [^ self].
+ 	
+ 	Error signal: 'Invalid value for list-spacing property. Use #none or #equal.'.!

Item was added:
+ ----- Method: Morph>>checkResizingProperty: (in category 'layout') -----
+ checkResizingProperty: aSymbol
+ 
+ 	aSymbol == #rigid ifTrue: [^ self].
+ 	aSymbol == #shrinkWrap ifTrue: [^ self].
+ 	aSymbol == #spaceFill ifTrue: [^ self].
+ 	
+ 	Error signal: 'Invalid value for resizing property. Use #rigid, #shrinkWrap, or #spaceFill.'.!

Item was changed:
  ----- Method: Morph>>hResizing: (in category 'layout-properties') -----
  hResizing: aSymbol
  	"Layout specific. This property describes how the receiver should be resized with respect to its owner and its children. Possible values are:
  		#rigid			-	do not resize the receiver
  		#spaceFill		-	resize to fill owner's available space
  		#shrinkWrap	- resize to fit children
  	"
+ 	self checkResizingProperty: aSymbol.
  	self assureLayoutProperties hResizing: aSymbol.
  	self layoutChanged.
  !

Item was changed:
  ----- Method: Morph>>listSpacing: (in category 'layout-properties') -----
  listSpacing: aSymbol
  	"Layout specific. This property describes how the heights for different rows in a table layout should be handled.
  		#equal - all rows have the same height
  		#none - all rows may have different heights
  	"
+ 	self checkListSpacingProperty: aSymbol.
- 	self assert: aSymbol isSymbol. "Guard against a common mistake."
  	self assureTableProperties listSpacing: aSymbol.
  	self layoutChanged.!

Item was changed:
  ----- Method: Morph>>vResizing: (in category 'layout-properties') -----
  vResizing: aSymbol
  	"Layout specific. This property describes how the receiver should be resized with respect to its owner and its children. Possible values are:
  		#rigid			-	do not resize the receiver
  		#spaceFill		-	resize to fill owner's available space
  		#shrinkWrap	- resize to fit children
  	"
+ 	self checkResizingProperty: aSymbol.
  	self assureLayoutProperties vResizing: aSymbol.
  	self layoutChanged.
  !

Item was changed:
  ----- Method: ScrollPane>>alwaysShowHScrollBar (in category 'accessing options') -----
  alwaysShowHScrollBar
  
  	self hScrollBarPolicy: #always.
- 	self hHideOrShowScrollBar.
  !

Item was changed:
  ----- Method: ScrollPane>>alwaysShowVScrollBar (in category 'accessing options') -----
  alwaysShowVScrollBar
  
  	self vScrollBarPolicy: #always.
- 	self vHideOrShowScrollBar.
  !

Item was added:
+ ----- Method: ScrollPane>>checkScrollBarPolicy: (in category 'layout') -----
+ checkScrollBarPolicy: aSymbol
+ 
+ 	aSymbol == #never ifTrue: [^ self].
+ 	aSymbol == #whenNeeded ifTrue: [^ self].
+ 	aSymbol == #always ifTrue: [^ self].
+ 	
+ 	Error signal: 'Invalid value for scrollbar policy. Use #never, #whenNeeded, or #always.'.!

Item was changed:
  ----- Method: ScrollPane>>doLayoutIn: (in category 'layout') -----
  doLayoutIn: layoutBounds
  	"Manually layout my submorphs. Maybe we can find a proper layout policy in the future."
  	
+ 	"1) Let submorph's #shrinkWrap first if they want to."
+ 	self submorphsDo: [:m | m fullBounds].
+ 
  	self removeProperty: #doLayoutAgain.
  	self updateLayout.
+ 	super doLayoutIn: layoutBounds.
- 	
- 	"Do one additional run if required."
- 	(self hasProperty: #doLayoutAgain)
- 		ifTrue: [self updateLayout].
  
+ 	"Do one additional run if required."
+ 	(self hasProperty: #doLayoutAgain) ifTrue: [
+ 		self updateLayout.
+ 		super doLayoutIn: layoutBounds].!
- 	super doLayoutIn: layoutBounds.!

Item was changed:
  ----- Method: ScrollPane>>extentToFit (in category 'geometry') -----
  extentToFit
  	"Resize scroll pane to exactly fit its contents."
  	
  	| offset |
  	offset := 0 at 0.
  	(retractableScrollBar not and: [self vScrollBarPolicy == #always])
  		ifTrue: [offset := (self scrollBarThickness - self borderWidth) @ offset y].
  	(retractableScrollBar not and: [self hScrollBarPolicy == #always])
  		ifTrue: [offset := offset x @ (self scrollBarThickness - self borderWidth)].
  		
+ 	^ scroller submorphBounds extent + offset + (2* (self borderWidth @ self borderWidth))!
- 	^ scroller submorphBoundsForShrinkWrap extent + offset + (2* (self borderWidth @ self borderWidth))!

Item was added:
+ ----- Method: ScrollPane>>hResizing: (in category 'layout') -----
+ hResizing: aSymbol
+ 	"Pass #shrinkWrap property to scroller to make this scroll pane's layout work. See #doLayoutIn:."
+ 
+ 	super hResizing: aSymbol.
+ 	
+ 	scroller hResizing: (aSymbol == #shrinkWrap
+ 		ifTrue: [#shrinkWrap]
+ 		ifFalse: [#spaceFill]).!

Item was changed:
  ----- Method: ScrollPane>>hScrollBarPolicy: (in category 'accessing') -----
  hScrollBarPolicy: aSymbol
  	"#always, #never, #whenNeeded"
  
+ 	hScrollBarPolicy = aSymbol ifTrue: [^ self].
+ 	self checkScrollBarPolicy: aSymbol.
+ 	
+ 	hScrollBarPolicy := aSymbol.
+ 	self layoutChanged.!
- 	hScrollBarPolicy := aSymbol.!

Item was changed:
  ----- Method: ScrollPane>>initializeScrollBars (in category 'initialization') -----
  initializeScrollBars
  	"Initialize vertical and horizontal scroll bars."
  
  	(scrollBar := ScrollBar on: self getValue: nil setValue: #vScrollBarValue:)
  			menuSelector: #vScrollBarMenuButtonPressed:;
  			orientation: #vertical;
  			extent: 1 at 1.
  	(hScrollBar := ScrollBar on: self getValue: nil setValue: #hScrollBarValue:)
  			menuSelector: #hScrollBarMenuButtonPressed:;
  			orientation: #horizontal;
  			extent: 1 at 1.
  
  	""
+ 	scroller := TransformMorph new
+ 		color: Color transparent;
+ 		hResizing: #spaceFill;
+ 		vResizing: #spaceFill.
- 	scroller := TransformMorph new color: Color transparent.
  	scroller offset: 0 @ 0.
  	self addMorph: scroller.
  	""
  	retractableScrollBar ifFalse: 
  			[self 
  				addMorph: scrollBar;
  				addMorph: hScrollBar].
  	self updateMinimumExtent.!

Item was added:
+ ----- Method: ScrollPane>>submorphBoundsForShrinkWrap (in category 'layout') -----
+ submorphBoundsForShrinkWrap
+ 	"No need to consider scrollbars because those are placed outside the #innerBounds like a border. See #resizeScroller."
+ 	
+ 	^ scroller bounds!

Item was changed:
  ----- Method: ScrollPane>>updateLayout (in category 'layout') -----
  updateLayout
  	"Manually layout my submorphs. Maybe we can find a proper layout policy in the future."
  	
+ 	"If the scroller happens to have a layout policy, we should compute its layout before updating the scroll bars"
+ 	self resizeScroller.
+ 	self scroller fullBounds.
+ 
  	self
  		resizeScrollBars;
- 		resizeScroller;
  		adjustOffset;
  		setScrollDeltas.
+ 
+ 
+ !
- 	
- 	"If the scroller happens to have a layout policy, we should compute its layout before any additional run."
- 	self scroller fullBounds.!

Item was added:
+ ----- Method: ScrollPane>>vResizing: (in category 'layout') -----
+ vResizing: aSymbol
+ 	"Pass #shrinkWrap property to scroller to make this scroll pane's layout work. See #doLayoutIn:."
+ 
+ 	super vResizing: aSymbol.
+ 	
+ 	scroller vResizing: (aSymbol == #shrinkWrap
+ 		ifTrue: [#shrinkWrap]
+ 		ifFalse: [#spaceFill]).!

Item was changed:
  ----- Method: ScrollPane>>vScrollBarPolicy: (in category 'accessing') -----
  vScrollBarPolicy: aSymbol
  	"#always, #never, #whenNeeded"
  
+ 	vScrollBarPolicy = aSymbol ifTrue: [^ self].
+ 	self checkScrollBarPolicy: aSymbol.
+ 	
+ 	vScrollBarPolicy := aSymbol.
+ 	self layoutChanged.!
- 	vScrollBarPolicy := aSymbol.!

Item was changed:
  ----- Method: TransformMorph>>layoutBounds (in category 'layout') -----
  layoutBounds
+ 	"Ignore scaling and offset but move to local origin for my children as reference point. Note that we do not have to adapt #submorphBoundsForShrinkWrap because those are already in local coordinates."
- 	"Ignore scaling and offset but move to local origin for my children as reference point."
  	
  	^ super layoutBounds translateBy: self topLeft negated!



More information about the Squeak-dev mailing list