Chris Muller uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-cmm.1463.mcz
==================== Summary ====================
Name: Morphic-cmm.1463 Author: cmm Time: 7 September 2018, 2:37:21.377647 pm UUID: c11ac7b7-0b5b-4814-87d3-9c8eb2b62bce Ancestors: Morphic-cmm.1462
- Fix halo-invocation on a rotated Morph when halos are on the World. - Provide access to the TextIndent attribute on the alignment menu. - Fix a NonBooleanReceiver error that appeared when pressing backspace on a read-only text field.
=============== Diff against Morphic-cmm.1462 ===============
Item was changed: ----- Method: PasteUpMorph>>tryInvokeHalo: (in category 'events-processing') ----- tryInvokeHalo: aUserInputEvent "Invoke halos around the top-most world container at aUserInputEvent's #position. If it was already halo'd, zero-in on its next inward component morph at that position. Holding Shift during the click reverses this traversal order." | stack innermost haloTarget | Preferences noviceMode ifTrue: [ ^ self ]. Morph haloForAll ifFalse: [ ^ self ]. "the stack is the top-most morph to bottom-most." stack := (self morphsAt: aUserInputEvent position unlocked: true) select: [ : each | each wantsHaloFromClick or: [ each handlesMouseDown: aUserInputEvent ] ]. innermost := aUserInputEvent hand halo ifNil: [ stack first ] ifNotNil: [ : existingHalo | stack allButFirst "existingHalo is first on the stack, not a target" detect: [ : each | each owner == self ] ifFound: [ : worldContainer | "Is existingHalo's target part of the same worldContainer as the morph clicked?" (existingHalo target withAllOwners includes: worldContainer) + ifTrue: [ "same hierarchy, let #transferHalo: continue to handle it for now." ^self ] - ifTrue: [ "same hierarchy, let #transferHalo: continue to handle it for now." ^ self ] ifFalse: [ "different hierarchy, remove + add." aUserInputEvent hand removeHalo. aUserInputEvent shiftPressed ifTrue: [ stack second "first is still the just removed halo" ] ifFalse: [ worldContainer ] ] ] + ifNone: [ "existingHalo is on the World, defer to #transferHalo: for now." ^self ] ]. - ifNone: [ "Shouldn't get here, but defensive code." self ] ]. "If modifier key is pressed, start at innermost (the target), otherwise the outermost (direct child of the world (self))." haloTarget := (innermost == self or: [aUserInputEvent shiftPressed]) ifTrue: [ innermost ] ifFalse: [ "Find the outermost owner that wants it." innermost withAllOwners reversed allButFirst detect: [ : each | each wantsHaloFromClick ] ifNone: [ "haloTarget has its own mouseDown handler, don't halo." ^ self ] ]. "Now that we have the haloTarget, show the halo." aUserInputEvent hand newMouseFocus: haloTarget event: aUserInputEvent. haloTarget invokeHaloOrMove: aUserInputEvent. "aUserInputEvent has been consumed, don't let it cause any further side-effects." aUserInputEvent ignore!
Item was changed: ----- Method: TextEditor>>backTo: (in category 'typing support') ----- backTo: startIndex "During typing, backspace to startIndex. If there already is a selection, just delete that selection. Otherwise, check if we did something else than backward-deletion and start a new command if so."
+ morph readOnly ifTrue: [^ false]. - morph readOnly ifTrue: [^ self].
self hasSelection ifTrue: [ "Add checkpoint in undo history." self replaceSelectionWith: self nullText. ^ true].
startIndex > self text size ifTrue: [^ false].
self selectInvisiblyFrom: startIndex to: self stopIndex-1. self isTypingIn ifTrue: [ self history current type = #backward ifFalse: [self closeTypeIn] ifTrue: [ "Accumulate all deleted characters in current undo command." self history current contentsBefore replaceFrom: 1 to: 0 with: self selection. self history current intervalBefore in: [:i | self history current intervalBefore: (startIndex to: i last)]]]. self openTypeInFor: #backward. self zapSelectionWith: self nullText. ^ false!
Item was changed: ----- Method: TextEditor>>changeAlignment (in category 'menu messages') ----- changeAlignment + | options reply | + options := self existingIndentation + caseOf: + {[0]-> [ #('leftFlush' 'indented' 'centered' 'justified' 'rightFlush') ]. + [1] -> [ #('leftFlush' 'indented more' 'centered' 'justified' 'rightFlush') ]} + otherwise: [ #('leftFlush' 'indented less' 'indented more' 'centered' 'justified' 'rightFlush') ]. + reply := UIManager default chooseFrom: options values: options. + reply ifNil: [ ^ self ]. - | aList reply | - aList := #(leftFlush centered justified rightFlush). - reply := UIManager default chooseFrom: aList values: aList. - reply ifNil:[^self]. self setAlignment: reply. paragraph composeAll. self recomputeSelection. ^ true!
Item was added: + ----- Method: TextEditor>>existingIndentation (in category 'private') ----- + existingIndentation + ^ paragraph text indentationAmountAt: (self encompassLine: self selectionInterval)!
Item was changed: ----- Method: TextEditor>>setAlignment: (in category 'menu messages') ----- + setAlignment: selectionString + | attr interval | + attr := selectionString + caseOf: + { [ 'indented' ] -> [ TextIndent amount: 1 ]. + [ 'indented more' ] -> [ TextIndent amount: self existingIndentation+1 ]. + [ 'indented less' ] -> [ TextIndent amount: (self existingIndentation-1 max: 0) ]} + otherwise: + [ TextAlignment perform: selectionString asSymbol ]. - setAlignment: aSymbol - | attr interval | - attr := TextAlignment perform: aSymbol. interval := self encompassLine: self selectionInterval. + paragraph - paragraph replaceFrom: interval first to: interval last with: ((paragraph text copyFrom: interval first to: interval last) addAttribute: attr)!
Nice, halo activation works again :-D
Best, Karl
On Fri, Sep 7, 2018 at 9:38 PM commits@source.squeak.org wrote:
Chris Muller uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-cmm.1463.mcz
==================== Summary ====================
Name: Morphic-cmm.1463 Author: cmm Time: 7 September 2018, 2:37:21.377647 pm UUID: c11ac7b7-0b5b-4814-87d3-9c8eb2b62bce Ancestors: Morphic-cmm.1462
- Fix halo-invocation on a rotated Morph when halos are on the World.
- Provide access to the TextIndent attribute on the alignment menu.
- Fix a NonBooleanReceiver error that appeared when pressing backspace on
a read-only text field.
=============== Diff against Morphic-cmm.1462 ===============
Item was changed: ----- Method: PasteUpMorph>>tryInvokeHalo: (in category 'events-processing') ----- tryInvokeHalo: aUserInputEvent "Invoke halos around the top-most world container at aUserInputEvent's #position. If it was already halo'd, zero-in on its next inward component morph at that position. Holding Shift during the click reverses this traversal order." | stack innermost haloTarget | Preferences noviceMode ifTrue: [ ^ self ]. Morph haloForAll ifFalse: [ ^ self ]. "the stack is the top-most morph to bottom-most." stack := (self morphsAt: aUserInputEvent position unlocked: true) select: [ : each | each wantsHaloFromClick or: [ each handlesMouseDown: aUserInputEvent ] ]. innermost := aUserInputEvent hand halo ifNil: [ stack first ] ifNotNil: [ : existingHalo | stack allButFirst "existingHalo is first on the stack, not a target" detect: [ : each | each owner == self ] ifFound: [ : worldContainer | "Is existingHalo's target part of the same worldContainer as the morph clicked?" (existingHalo target withAllOwners includes: worldContainer)
ifTrue: [ "same hierarchy,
let #transferHalo: continue to handle it for now." ^self ]
ifTrue: [ "same hierarchy,
let #transferHalo: continue to handle it for now." ^ self ] ifFalse: [ "different hierarchy, remove + add." aUserInputEvent hand removeHalo. aUserInputEvent shiftPressed ifTrue: [ stack second "first is still the just removed halo" ] ifFalse: [ worldContainer ] ] ]
ifNone: [ "existingHalo is on the World,
defer to #transferHalo: for now." ^self ] ].
ifNone: [ "Shouldn't get here, but
defensive code." self ] ]. "If modifier key is pressed, start at innermost (the target), otherwise the outermost (direct child of the world (self))." haloTarget := (innermost == self or: [aUserInputEvent shiftPressed]) ifTrue: [ innermost ] ifFalse: [ "Find the outermost owner that wants it." innermost withAllOwners reversed allButFirst detect: [ : each | each wantsHaloFromClick ] ifNone: [ "haloTarget has its own mouseDown handler, don't halo." ^ self ] ]. "Now that we have the haloTarget, show the halo." aUserInputEvent hand newMouseFocus: haloTarget event: aUserInputEvent. haloTarget invokeHaloOrMove: aUserInputEvent. "aUserInputEvent has been consumed, don't let it cause any further side-effects." aUserInputEvent ignore!
Item was changed: ----- Method: TextEditor>>backTo: (in category 'typing support') ----- backTo: startIndex "During typing, backspace to startIndex. If there already is a selection, just delete that selection. Otherwise, check if we did something else than backward-deletion and start a new command if so."
morph readOnly ifTrue: [^ false].
morph readOnly ifTrue: [^ self]. self hasSelection ifTrue: [ "Add checkpoint in undo history." self replaceSelectionWith: self nullText. ^ true]. startIndex > self text size ifTrue: [^ false]. self selectInvisiblyFrom: startIndex to: self stopIndex-1. self isTypingIn ifTrue: [ self history current type = #backward ifFalse: [self closeTypeIn] ifTrue: [ "Accumulate all deleted characters in
current undo command." self history current contentsBefore replaceFrom: 1 to: 0 with: self selection. self history current intervalBefore in: [:i | self history current intervalBefore: (startIndex to: i last)]]].
self openTypeInFor: #backward. self zapSelectionWith: self nullText. ^ false!
Item was changed:
----- Method: TextEditor>>changeAlignment (in category 'menu messages')
changeAlignment
| options reply |
options := self existingIndentation
caseOf:
{[0]-> [ #('leftFlush' 'indented' 'centered'
'justified' 'rightFlush') ].
[1] -> [ #('leftFlush' 'indented more' 'centered'
'justified' 'rightFlush') ]}
otherwise: [ #('leftFlush' 'indented less' 'indented more'
'centered' 'justified' 'rightFlush') ].
reply := UIManager default chooseFrom: options values: options.
reply ifNil: [ ^ self ].
| aList reply |
aList := #(leftFlush centered justified rightFlush).
reply := UIManager default chooseFrom: aList values: aList.
reply ifNil:[^self]. self setAlignment: reply. paragraph composeAll. self recomputeSelection. ^ true!
Item was added:
- ----- Method: TextEditor>>existingIndentation (in category 'private')
- existingIndentation
^ paragraph text indentationAmountAt: (self encompassLine: self
selectionInterval)!
Item was changed:
----- Method: TextEditor>>setAlignment: (in category 'menu messages')
- setAlignment: selectionString
| attr interval |
attr := selectionString
caseOf:
{ [ 'indented' ] -> [ TextIndent amount: 1 ].
[ 'indented more' ] -> [ TextIndent amount: self
existingIndentation+1 ].
[ 'indented less' ] -> [ TextIndent amount: (self
existingIndentation-1 max: 0) ]}
otherwise:
[ TextAlignment perform: selectionString asSymbol
].
- setAlignment: aSymbol
| attr interval |
attr := TextAlignment perform: aSymbol. interval := self encompassLine: self selectionInterval.
paragraph
paragraph replaceFrom: interval first to: interval last with: ((paragraph text copyFrom: interval first to:
interval last) addAttribute: attr)!
squeak-dev@lists.squeakfoundation.org