[squeak-dev] The Trunk: System-nice.645.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Dec 15 21:51:26 UTC 2013


Nicolas Cellier uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-nice.645.mcz

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

Name: System-nice.645
Author: nice
Time: 15 December 2013, 10:50:27.921 pm
UUID: ea3ee480-795b-447a-921d-869e1c77704e
Ancestors: System-cmm.644

Take presence of Flaps (if any) directly into account in RealEstateAgent maximumUsableArea, rather than using 2 steps.

The reasons why it's better to centralize handling of Flaps' consumed space are:
- for having less code to maintain
  (a lot of logic was duplicated and that ain't good)
- for having a uniform handling of available Screen space
  (some methods did not take this consumed space into account and that ain't good)
- for handling absence of Flaps class and possibly unload MorphicExtras 
  (a lot of protection would have been required, and that ain't good)
- for re-integrating methods for strictlyStaggered policy in the System
  (those were moved to MorphicExtras just because they used Flaps, and that ain't good)

=============== Diff against System-cmm.644 ===============

Item was changed:
  ----- Method: RealEstateAgent class>>assignCollapseFrameFor: (in category 'utilities') -----
  assignCollapseFrameFor: aSSView 
  	"Offer up a location along the left edge of the screen for a collapsed SSView. Make sure it doesn't overlap any other collapsed frames."
  
  	| grid otherFrames topLeft viewBox collapsedFrame extent newFrame verticalBorderDistance top |
  	grid := 8.
  	verticalBorderDistance := 8.
  	aSSView isMorph
  		ifTrue: [otherFrames := (SystemWindow windowsIn: aSSView world satisfying: [:w | w ~= aSSView])
  						collect: [:w | w collapsedFrame]
  						thenSelect: [:rect | rect notNil].
+ 				viewBox := self maximumUsableAreaInWorld: aSSView world]
- 				viewBox := self reduceByFlaps: aSSView world viewBox]
  		ifFalse: [otherFrames := ScheduledControllers scheduledWindowControllers
  						collect: [:aController | aController view ~= aSSView ifTrue: [aController view collapsedFrame]]
  						thenSelect: [:rect | rect notNil].
  				viewBox := Display boundingBox].
  	collapsedFrame := aSSView collapsedFrame.
  	extent := collapsedFrame notNil
  				ifTrue: [collapsedFrame extent]
  				ifFalse: [aSSView isMorph
  					ifTrue: [aSSView getRawLabel width + aSSView labelWidgetAllowance @ (aSSView labelHeight + 2)]
  					ifFalse: [(aSSView labelText extent x + 70) @ aSSView labelHeight
  							min: aSSView labelDisplayBox extent]].
  	collapsedFrame notNil
  		ifTrue: [(otherFrames anySatisfy: [:f | collapsedFrame intersects: f])
  				ifFalse: ["non overlapping"
  					^ collapsedFrame]].
  	top := viewBox top + verticalBorderDistance.
  	[topLeft := viewBox left @ top.
  	newFrame := topLeft extent: extent.
  	newFrame bottom <= (viewBox height - verticalBorderDistance)]
  		whileTrue: 
  			[(otherFrames anySatisfy: [:w | newFrame intersects: w])
  				ifFalse: ["no overlap"
  					^ newFrame].
  			top := top + grid].
  	"If all else fails... (really to many wins here)"
  	^ 0 @ 0 extent: extent!

Item was changed:
  ----- Method: RealEstateAgent class>>assignCollapsePointFor: (in category 'utilities') -----
  assignCollapsePointFor: aSSView
  	"Offer up a location along the left edge of the screen for a collapsed SSView.
  	Make sure it doesn't overlap any other collapsed frames."
  
  	| grid otherFrames y free topLeft viewBox |
  	grid := 24.  "should be mult of 8, since manual move is gridded by 8"
  	aSSView isMorph
  		ifTrue: [otherFrames := (SystemWindow windowsIn: aSSView world satisfying: [:w | true])
  					collect: [:w | w collapsedFrame]
  					thenSelect: [:rect | rect notNil].
+ 				viewBox := self maximumUsableAreaInWorld: aSSView world]
- 				viewBox := self reduceByFlaps: aSSView world viewBox]
  		ifFalse: [otherFrames := ScheduledControllers scheduledWindowControllers
  					collect: [:aController | aController view collapsedFrame]
  					thenSelect: [:rect | rect notNil].
  				viewBox := Display boundingBox].
  	y := viewBox top.
  	[(y := y + grid) <= (viewBox height - grid)]
  		whileTrue:
  		[topLeft := viewBox left at y.
  		free := true.
  		otherFrames do: [:w | free := free & (topLeft ~= w topLeft)].
  		free ifTrue: [^ topLeft]].
  	"If all else fails..."
  	^ 0 @ 0!

Item was changed:
  ----- Method: RealEstateAgent class>>maximumUsableArea (in category 'accessing') -----
  maximumUsableArea
+ 	^self maximumUsableAreaInWorld: ActiveWorld!
- 
- 	| allowedArea |
- 	allowedArea := Display usableArea.
- 	Smalltalk isMorphic ifTrue: [
- 		allowedArea := allowedArea intersect: ActiveWorld visibleClearArea.
- 	].
- 	^allowedArea!

Item was changed:
  ----- Method: RealEstateAgent class>>maximumUsableAreaInWorld: (in category 'accessing') -----
  maximumUsableAreaInWorld: aWorldOrNil
  
  	| allowedArea |
  	allowedArea := Display usableArea.
  	aWorldOrNil ifNotNil: [
  		allowedArea := allowedArea intersect: aWorldOrNil visibleClearArea.
  	].
+ 	(Smalltalk isMorphic and: [self respondsTo: #reduceByFlaps:]) ifTrue:
+ 		[allowedArea := self reduceByFlaps: allowedArea].
  	^allowedArea!

Item was added:
+ ----- Method: RealEstateAgent class>>strictlyStaggeredInitialFrameFor:initialExtent: (in category 'framing') -----
+ strictlyStaggeredInitialFrameFor: aStandardSystemView initialExtent: initialExtent
+ 
+ 	self error: 'please use #strictlyStaggeredInitialFrameFor:initialExtent:world:'!

Item was added:
+ ----- Method: RealEstateAgent class>>strictlyStaggeredInitialFrameFor:initialExtent:world: (in category 'framing') -----
+ strictlyStaggeredInitialFrameFor: aStandardSystemView initialExtent: initialExtent world: aWorld
+ 	"This method implements a staggered window placement policy that I (di) like.
+ 	Basically it provides for up to 4 windows, staggered from each of the 4 corners.
+ 	The windows are staggered so that there will always be a corner visible."
+ 
+ 	| allowedArea grid initialFrame otherFrames cornerSel corner delta putativeCorner free maxLevel |
+ 
+ 	allowedArea :=(self maximumUsableAreaInWorld: aWorld)
+ 		insetBy: (self scrollBarSetback @ self screenTopSetback extent: 0 at 0).
+ 	"Number to be staggered at each corner (less on small screens)"
+ 	maxLevel := allowedArea area > 300000 ifTrue: [3] ifFalse: [2].
+ 	"Amount by which to stagger (less on small screens)"
+ 	grid := allowedArea area > 500000 ifTrue: [40] ifFalse: [20].
+ 	initialFrame := 0 at 0 extent: ((initialExtent
+ 							"min: (allowedArea extent - (grid*(maxLevel+1*2) + (grid//2))))
+ 							min: 600 at 400")).
+ 	otherFrames := Smalltalk isMorphic
+ 		ifTrue: [(SystemWindow windowsIn: aWorld satisfying: [:w | w isCollapsed not])
+ 					collect: [:w | w bounds]]
+ 		ifFalse: [ScheduledControllers scheduledWindowControllers
+ 				select: [:aController | aController view ~~ nil]
+ 				thenCollect: [:aController | aController view isCollapsed
+ 								ifTrue: [aController view expandedFrame]
+ 								ifFalse: [aController view displayBox]]].
+ 	0 to: maxLevel do:
+ 		[:level | 
+ 		1 to: 4 do:
+ 			[:ci | cornerSel := #(topLeft topRight bottomRight bottomLeft) at: ci.
+ 			corner := allowedArea perform: cornerSel.
+ 			"The extra grid//2 in delta helps to keep title tabs distinct"
+ 			delta := (maxLevel-level*grid+(grid//2)) @ (level*grid).
+ 			1 to: ci-1 do: [:i | delta := delta rotateBy: #right centerAt: 0 at 0]. "slow way"
+ 			putativeCorner := corner + delta.
+ 			free := true.
+ 			otherFrames do:
+ 				[:w |
+ 				free := free & ((w perform: cornerSel) ~= putativeCorner)].
+ 			free ifTrue:
+ 				[^ (initialFrame align: (initialFrame perform: cornerSel)
+ 								with: putativeCorner)
+ 						 translatedAndSquishedToBeWithin: allowedArea]]].
+ 	"If all else fails..."
+ 	^ (self scrollBarSetback @ self screenTopSetback extent: initialFrame extent)
+ 		translatedAndSquishedToBeWithin: allowedArea!



More information about the Squeak-dev mailing list