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

commits at source.squeak.org commits at source.squeak.org
Fri Nov 19 17:13:00 UTC 2021


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

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

Name: Morphic-mt.1792
Author: mt
Time: 19 November 2021, 6:12:54.045971 pm
UUID: f8bfb597-a32a-074c-a660-b9e3d8f8dfb3
Ancestors: Morphic-mt.1791

Adds support for a default focus in windows when opened. The focus can be a #knownName, a morph, or a block. This improves keyboard navigation a little bit.

See http://lists.squeakfoundation.org/pipermail/squeak-dev/2021-October/216745.html

Adds and uses breadth-first search for submorph lookup because it matches the natural way widgets are organized in a window. The existing depth-first in #allMorphsDo: might take surprising paths.

=============== Diff against Morphic-mt.1791 ===============

Item was added:
+ ----- Method: Morph>>allMorphsBreadthFirstDo: (in category 'submorphs - enumerating') -----
+ allMorphsBreadthFirstDo: aBlock 
+ 
+ 	| remaining |
+ 	remaining := OrderedCollection with: self.
+ 	[remaining notEmpty] whileTrue: [
+ 		| next |
+ 		next := remaining removeFirst.
+ 		aBlock value: next.
+ 		remaining addAll: next submorphs].!

Item was added:
+ ----- Method: Morph>>allMorphsDepthFirstDo: (in category 'submorphs - enumerating') -----
+ allMorphsDepthFirstDo: aBlock 
+ 	"Evaluate the given block for all morphs in this composite morph (including the receiver)."
+ 
+ 	submorphs do: [:m | m allMorphsDepthFirstDo: aBlock].
+ 	aBlock value: self!

Item was changed:
  ----- Method: Morph>>allMorphsDo: (in category 'submorphs - enumerating') -----
  allMorphsDo: aBlock 
  	"Evaluate the given block for all morphs in this composite morph (including the receiver)."
  
+ 	self allMorphsDepthFirstDo: aBlock.!
- 	submorphs do: [:m | m allMorphsDo: aBlock].
- 	aBlock value: self!

Item was changed:
  ----- Method: SystemWindow>>beKeyWindow (in category 'top window') -----
  beKeyWindow
  	"Let me be the most important window on the screen. I am at the top and I can have a shadow to get more attention by the user. I am the window that is responsible for window keyboard shortcuts. Also see #isKeyWindow, #activate, and #lookFocused."
  
  	| oldKeyWindow |
  	self isKeyWindow ifTrue: [^ self].
  
  	oldKeyWindow := TopWindow.
  	TopWindow := self.
  
  	self
  		unlockWindowDecorations; "here, because all windows might be active anyway"
  		activate; "if not already active, activate now"
  		comeToFront. "key windows are on top"
  
  	"Change appearance to get noticed."
  	self hasDropShadow: Preferences menuAppearance3d.
  	(self valueOfProperty: #borderWidthWhenActive)
  		ifNotNil: [:bw | self acquireBorderWidth: bw].
  
  	oldKeyWindow ifNotNil: [:wnd |
  		wnd passivateIfNeeded.
  		
  		"Change appearance to not look prettier than the new key window."
  		wnd hasDropShadow: false.
  		(wnd valueOfProperty: #borderWidthWhenInactive)
  			ifNotNil: [:bw | wnd acquireBorderWidth: bw]].
+ 	
+ 	self currentEvent isKeyboard ifTrue: [
+ 		self currentHand newKeyboardFocus: self defaultFocusMorph].
+ 	
- 
  	"Synchronize focus look with position of current hand because any call could have made this window the new key window."
  	self updateFocusLookAtHand.!

Item was added:
+ ----- Method: SystemWindow>>defaultFocusMorph (in category 'focus') -----
+ defaultFocusMorph
+ 
+ 	| predicate |
+ 	predicate := (self hasProperty: #defaultFocusMorph)
+ 		ifFalse: [ [:morph | morph wantsKeyboardFocus] ]
+ 		ifTrue: [ | anObject |
+ 			anObject := (self valueOfProperty: #defaultFocusMorph) value.
+ 			anObject isMorph ifTrue: [^ anObject].
+ 			[:morph | morph knownName = anObject] ].
+ 
+ 	self allMorphsBreadthFirstDo: [:morph |
+ 		(predicate value: morph) ifTrue: [^ morph]].
+ 
+ 	^ nil!

Item was added:
+ ----- Method: SystemWindow>>defaultFocusMorph: (in category 'focus') -----
+ defaultFocusMorph: aMorphOrBlockOrNameOrNil
+ 
+ 	self setProperty: #defaultFocusMorph toValue: aMorphOrBlockOrNameOrNil.!



More information about the Squeak-dev mailing list