[squeak-dev] The Inbox: Morphic-cmm.1408.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Apr 2 23:35:18 UTC 2018


Chris Muller uploaded a new version of Morphic to project The Inbox:
http://source.squeak.org/inbox/Morphic-cmm.1408.mcz

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

Name: Morphic-cmm.1408
Author: cmm
Time: 2 April 2018, 6:34:32.944359 pm
UUID: 1b84680b-ad85-4d86-a6d4-29fb3c2f8193
Ancestors: Morphic-cmm.1407

Integrate fix from Stéphane Rollandin that keeps ProportionalSplitter bars in their proportionally-assigned place after resizing windows.

=============== Diff against Morphic-cmm.1407 ===============

Item was added:
+ ----- Method: ProportionalSplitterMorph>>balanceOffsets (in category 'layout') -----
+ balanceOffsets
+ 
+ 	self layoutFrame hasFixedHeight ifTrue: [
+ 		| otop obot ctop cbot topf |
+ 
+ 		otop := (owner submorphs detect: [:m | 
+ 					m layoutFrame topFraction isZero] ifNone: [^ self]) in: [:tm | 
+ 						tm top - (tm layoutFrame topOffset ifNil: [0])].
+ 
+ 		obot := (owner submorphs detect: [:m | 
+ 					m layoutFrame bottomFraction = 1] ifNone: [^ self]) in: [:tm | 
+ 						tm bottom - (tm layoutFrame bottomOffset ifNil: [0])].
+ 
+ 		ctop := (self layoutFrame topFraction * (obot - otop)) rounded 
+ 					+ otop + (self layoutFrame topOffset ifNil: [0]).
+ 		cbot := (self layoutFrame bottomFraction * (obot - otop)) rounded 
+ 					+ otop + (self layoutFrame bottomOffset ifNil: [0]).
+ 
+ 		topf := self layoutFrame topFraction.
+ 		self layoutFrame topFraction:  ((ctop + cbot) * 0.5 - otop) / (obot - otop) asFloat.
+ 		self layoutFrame bottomFraction: self layoutFrame topFraction.
+ 		self layoutFrame topOffset: ctop - 
+ 			(self layoutFrame topFraction * (obot - otop) + otop) rounded.
+ 		self layoutFrame bottomOffset: cbot - 
+ 			(self layoutFrame bottomFraction * (obot - otop) + otop) rounded..
+ 
+ 		(leftOrTop copy union: rightOrBottom) do: [:m |
+ 			(m layoutFrame topFraction closeTo: topf) ifTrue: [
+ 				m layoutFrame topFraction: self layoutFrame topFraction.
+ 				m layoutFrame topOffset: 
+ 					m layoutFrame topOffset - (self valueOfProperty: #fullDelta) y].
+ 			(m layoutFrame bottomFraction closeTo: topf) ifTrue: [
+ 				m layoutFrame bottomFraction: self layoutFrame topFraction.
+ 				m layoutFrame bottomOffset: 
+ 					m layoutFrame bottomOffset - (self valueOfProperty: #fullDelta) y.]]] .
+ 
+ 	self layoutFrame hasFixedWidth ifTrue: [
+ 		| oleft oright cleft cright leftf |
+ 
+ 		oleft := (owner submorphs detect: [:m | 
+ 			m layoutFrame leftFraction isZero] ifNone: [^ self]) in: [:tm | 
+ 				tm left - (tm layoutFrame leftOffset ifNil: [0])].
+ 
+ 		oright := (owner submorphs detect: [:m | 
+ 			m layoutFrame rightFraction = 1] ifNone: [^ self]) in: [:tm | 
+ 				tm right - (tm layoutFrame rightOffset ifNil: [0])].
+ 
+ 		cleft := (self layoutFrame leftFraction * (oright - oleft)) rounded 
+ 					+ oleft + (self layoutFrame leftOffset ifNil: [0]).
+ 		cright := (self layoutFrame rightFraction * (oright - oleft)) rounded 
+ 					+ oleft + (self layoutFrame rightOffset ifNil: [0]).
+ 
+ 		leftf := self layoutFrame leftFraction.
+ 		self layoutFrame leftFraction: ((cleft + cright) * 0.5 - oleft) / (oright - oleft) asFloat.
+ 		self layoutFrame rightFraction: self layoutFrame leftFraction.
+ 
+ 		self layoutFrame leftOffset: cleft - 
+ 			(self layoutFrame leftFraction * (oright - oleft) + oleft) rounded.
+ 		self layoutFrame rightOffset: cright - 
+ 			(self layoutFrame rightFraction * (oright - oleft) + oleft) rounded.
+ 
+ 		(leftOrTop copy union: rightOrBottom) do: [:m |
+ 			(m layoutFrame leftFraction closeTo: leftf) ifTrue: [
+ 				m layoutFrame leftFraction: self layoutFrame leftFraction.
+ 				m layoutFrame leftOffset: 
+ 					m layoutFrame leftOffset - (self valueOfProperty: #fullDelta) x].
+ 			(m layoutFrame rightFraction closeTo: leftf) ifTrue: [
+ 				m layoutFrame rightFraction: self layoutFrame leftFraction.
+ 				m layoutFrame rightOffset: 
+ 					m layoutFrame rightOffset - (self valueOfProperty: #fullDelta) x.]]] .
+ 
+ 	self removeProperty: #fullDelta.
+ 	owner layoutChanged
+ !

Item was changed:
  ----- Method: ProportionalSplitterMorph>>mouseDown: (in category 'events') -----
  mouseDown: anEvent 
  	"If the user manually drags me, don't override him with auto positioning."
  
+ 	self setProperty: #fullDelta toValue: 0 at 0.
+ 
  	anEvent redButtonChanged
  		ifTrue: [ self withSiblingSplittersDo: [ : each | each stopStepping ] ]
  		ifFalse:
  			[ anEvent shiftPressed
  				ifTrue: [ self startStepping ]
  				ifFalse:
  					[ self startStepping.
  					self withSiblingSplittersDo: [ : each | each startStepping ] ] ].
  	(self class showSplitterHandles not and: [ self bounds containsPoint: anEvent cursorPoint ]) ifTrue:
  		[ oldColor := self color.
  		self color: Color black ].
  	^ super mouseDown: anEvent!

Item was changed:
  ----- Method: ProportionalSplitterMorph>>mouseUp: (in category 'events') -----
  mouseUp: anEvent 
  	(self bounds containsPoint: anEvent cursorPoint)
  		ifFalse: [anEvent hand showTemporaryCursor: nil].
  	self class fastSplitterResize
  		ifTrue: [self updateFromEvent: anEvent].
  	traceMorph ifNotNil: [traceMorph delete. traceMorph := nil].
+ 	self color: self getOldColor.
+ 
+ 	self balanceOffsets!
- 	self color: self getOldColor!

Item was changed:
  ----- Method: ProportionalSplitterMorph>>reduceLeftRightImbalance (in category 'layout') -----
  reduceLeftRightImbalance
  	| correction |
  	correction := self leftRightImbalance.
  	correction abs > 1
  		ifTrue:
  			[ (self proposedCorrectionWouldCauseFocusChange: correction) ifFalse:
  				[ self repositionBy:
  					(correction abs > 4
  						ifTrue: [ correction sign * 2 @ 0 ]
  						ifFalse: [ correction sign @ 0 ]) ] ]
  		ifFalse:
+ 			[ self class smartVerticalSplitters ifFalse:
+ 				[ self
+ 					 stopStepping ;
+ 					 balanceOffsets ] ].
- 			[ self class smartVerticalSplitters ifFalse: [ self stopStepping ] ].
  	^ correction!

Item was changed:
  ----- Method: ProportionalSplitterMorph>>reduceTopBottomImbalance (in category 'layout') -----
  reduceTopBottomImbalance
  	| correction |
  	(correction := self topBottomCorrection) isZero
  		ifTrue:
+ 			[ self class smartHorizontalSplitters ifFalse:
+ 				[ self
+ 					 stopStepping ;
+ 					 balanceOffsets ] ]
- 			[ self class smartHorizontalSplitters ifFalse: [ self stopStepping ] ]
  		ifFalse:
  			[ (self proposedCorrectionWouldCauseFocusChange: correction) ifFalse: [ self repositionBy: 0 @ correction ] ].
  	^ correction!

Item was changed:
  ----- Method: ProportionalSplitterMorph>>repositionBy: (in category 'layout') -----
  repositionBy: delta
  	| selfTop selfBottom selfLeft selfRight |
+ 
+ 	self setProperty: #fullDelta toValue: ((self valueOfProperty: #fullDelta) ifNil: [0 at 0]) + delta.
+ 
  	leftOrTop do:
  		[ : each | | firstRight firstBottom firstLeft firstTop |
  		firstRight := each layoutFrame rightOffset ifNil: [ 0 ].
  		firstBottom := each layoutFrame bottomOffset ifNil: [ 0 ].
  		each layoutFrame rightOffset: firstRight + delta x.
  		each layoutFrame bottomOffset: firstBottom + delta y.
  		each layoutFrame hasFixedHeight ifTrue: [
  			firstTop := each layoutFrame topOffset ifNil: [ 0 ].
  			each layoutFrame topOffset: firstTop + delta y ].
  		each layoutFrame hasFixedWidth ifTrue: [
  			firstLeft := each layoutFrame leftOffset ifNil: [ 0 ].
  			each layoutFrame leftOffset: firstLeft + delta x. ] ].
  	rightOrBottom do:
  		[ : each | | secondLeft secondTop secondRight secondBottom |
  		secondLeft := each layoutFrame leftOffset ifNil: [ 0 ].
  		secondTop := each layoutFrame topOffset ifNil: [ 0 ].
  		each layoutFrame leftOffset: secondLeft + delta x.
  		each layoutFrame topOffset: secondTop + delta y.
  		each layoutFrame hasFixedHeight ifTrue: [
  			secondBottom := each layoutFrame bottomOffset ifNil: [ 0 ].
  			each layoutFrame bottomOffset: secondBottom + delta y. ].
  		each layoutFrame hasFixedWidth ifTrue: [
  			secondRight := each layoutFrame rightOffset ifNil: [ 0 ].
  			each layoutFrame rightOffset: secondRight + delta x. ] ].
  
  	selfTop := self layoutFrame topOffset ifNil: [ 0 ].
  	selfBottom := self layoutFrame bottomOffset ifNil: [ 0 ].
  	selfLeft := self layoutFrame leftOffset ifNil: [ 0 ].
  	selfRight := self layoutFrame rightOffset ifNil: [ 0 ].
  	self layoutFrame
  		 topOffset: selfTop + delta y ;
  		 bottomOffset: selfBottom + delta y ;
  		 leftOffset: selfLeft + delta x ;
  		 rightOffset: selfRight + delta x.
  	self owner layoutChanged.
  	self movements removeFirst; add: (splitsTopAndBottom ifTrue: [ delta y sign ] ifFalse: [ delta x sign ])!



More information about the Squeak-dev mailing list