[squeak-dev] The Trunk: Morphic-cmm.1454.mcz
karl ramberg
karlramberg at gmail.com
Sun Dec 30 23:45:00 UTC 2018
I have a couple of more issues with this change:
I can't get a halo on a submorph with drawing error.
It is also hard to get a halo on a submorph that is outside of the bounds
of the owner morph.
Cheers,
Karl
On Tue, Sep 4, 2018 at 4:00 AM Chris Muller <asqueaker at gmail.com> wrote:
> Fixed by Morphic-cmm.1462.
> On Sun, Sep 2, 2018 at 5:00 AM karl ramberg <karlramberg at gmail.com> wrote:
> >
> > This change breaks blue clicks for rotated morphs in
> PasteUpMorph>>tryInvokeHalo:
> > It does not bring up a halo anymore.
> > The variable stack is just #().
> >
> > stack := (self morphsAt: aUserInputEvent position unlocked: true) select:
> > [ : each | each wantsHaloFromClick or: [ each
> handlesMouseDown: aUserInputEvent ] ].
> >
> > Best,
> > Karl
> >
> > On Sat, Jun 23, 2018 at 11:25 PM <commits at source.squeak.org> wrote:
> >>
> >> Chris Muller uploaded a new version of Morphic to project The Trunk:
> >> http://source.squeak.org/trunk/Morphic-cmm.1454.mcz
> >>
> >> ==================== Summary ====================
> >>
> >> Name: Morphic-cmm.1454
> >> Author: cmm
> >> Time: 23 June 2018, 4:23:51.324266 pm
> >> UUID: 7bd5a7a9-4493-4cf4-849f-be6d8f8bb991
> >> Ancestors: Morphic-hjh.1453
> >>
> >> - Fix ability of border styles of veryDeepCopied Morphs to be
> independently set.
> >> - Fix dispatch regression for Morphs that leave world based on
> mouseLeave.
> >> - Fix three UI-gesture inconsistencies related to invoking halos,
> depending on the position of existing halos:
> >> 1) halo activation was sometimes on mouseUp instead of
> mouseDown,
> >> 2) blue move/resize gestures sometimes operated on the
> background window instead of the foreground, and,
> >> 3) even with the (Shift) modifier key, it was sometimes
> selecting the outermost instead of the innermost.
> >> All three are fixed while reverting the increased dependence on
> #transferHalo:, putting us closer to considerations like multiple,
> independent, and custom halos.
> >> - Restore splitter bar thicknesses from 2 back to 4 pixels.
> >> - Restore blue-click functionality of splitters when Smart Splitters is
> off.
> >> - Let SystemWindows dismiss halos with any button, mouse or keyboard.
> >>
> >> =============== Diff against Morphic-hjh.1453 ===============
> >>
> >> Item was added:
> >> + ----- Method: ComplexBorder>>veryDeepInner: (in category 'copying')
> -----
> >> + veryDeepInner: aDeepCopier
> >> + super veryDeepInner: aDeepCopier.
> >> + style := style veryDeepCopyWith: aDeepCopier.
> >> + colors := colors veryDeepCopyWith: aDeepCopier.
> >> + lineStyles := lineStyles veryDeepCopyWith: aDeepCopier.!
> >>
> >> Item was changed:
> >> ----- Method: Editor class>>dumbbellCursor (in category
> 'preferences') -----
> >> dumbbellCursor
> >> + <preference: 'Dumbbell Text Cursor'
> >> - <preference: 'Dumbbell-shaped Text Cursor'
> >> category: 'Morphic'
> >> + description: 'When enabled, the text cursor assumes the
> shape of a dumbbell, otherwise a vertical bar.'
> >> - description: 'When true, the text cursor assumes the
> shape of a dumbbell, otherwise a vertical bar..'
> >> type: #Boolean>
> >> ^ DumbbellCursor ifNil: [ false ]!
> >>
> >> Item was changed:
> >> ----- Method: MorphicEventDispatcher>>dispatchFocusEventAllOver:with:
> (in category 'focus events') -----
> >> dispatchFocusEventAllOver: evt with: focusMorph
> >> "Like a full event dispatch BUT adds regular dispatch if the
> focus morph did nothing with the event. This is useful for letting the
> focusMorph's siblings handle the events instead. Take halo invocation as an
> example. See senders of me."
> >>
> >> | result hand mouseFocus |
> >> result := self dispatchFocusEventFully: evt with: focusMorph.
> >>
> >> result == #rejected ifTrue: [^ result].
> >> result wasIgnored ifTrue: [^ result].
> >> result wasHandled ifTrue: [^ result].
> >> + focusMorph world ifNil: [ ^ result ].
> >>
> >> hand := evt hand.
> >> mouseFocus := hand mouseFocus.
> >>
> >> [
> >> "Avoid re-dispatching the event to the focus morph. See
> Morph >> #rejectsEvent:."
> >> focusMorph lock.
> >>
> >> "Handle side effect for mouse-enter and mouse-leave
> events."
> >> self flag: #hacky. "mt: Maybe we find a better way to
> synthesize enter/leave events in the future."
> >> hand newMouseFocus: nil.
> >> hand mouseOverHandler processMouseOver: hand lastEvent.
> >>
> >> "Give the morph's world a chance to normally dispatch
> the event."
> >> + ^ focusMorph world ifNotNil: [ : world | world
> processEvent: evt using: self]
> >> - ^ focusMorph world processEvent: evt using: self
> >> ] ensure: [
> >> focusMorph unlock.
> >> evt hand newMouseFocus: mouseFocus].!
> >>
> >> 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 ]
> >> + ifFalse:
> >> + [ "different
> hierarchy, remove + add."
> >> + aUserInputEvent
> hand removeHalo.
> >> + aUserInputEvent
> shiftPressed
> >> + ifTrue:
> [ stack second "first is still the just removed halo" ]
> >> +
> ifFalse: [ worldContainer ] ] ]
> >> + 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 := aUserInputEvent shiftPressed
> >> + ifTrue: [ innermost ]
> >> + ifFalse: [ innermost == self ifTrue: [innermost]
> ifFalse: [(innermost withAllOwners copyWithout: self) last] ].
> >> + haloTarget wantsHaloFromClick ifFalse: [ "haloTarget has its
> own event handler." ^ 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!
> >> - tryInvokeHalo: anEvent
> >> -
> >> - | innerMost target |
> >> - anEvent hand halo ifNotNil: [^ self "No invocation needed. Halo
> will handle transfer itself."].
> >> - Preferences noviceMode ifTrue: [^ self "No halo in novice
> mode."].
> >> - Morph haloForAll ifFalse: [^ self].
> >> -
> >> - innerMost := (self morphsAt: anEvent position unlocked: true)
> first.
> >> -
> >> - "1) Try to use innermost morph but skip all the ones that do
> not want to show a halo along the owner chain."
> >> - target := innerMost.
> >> - [target isNil or: [target wantsHaloFromClick]]
> >> - whileFalse: [target := target owner].
> >> - target ifNil: [^ self].
> >> -
> >> - "2) Without a modifier, which is normal, find the outermost
> container for that inner morph."
> >> - (innerMost == self or: [anEvent shiftPressed]) ifFalse: [
> >> - | previousTargets |
> >> - previousTargets := OrderedCollection new.
> >> - [target notNil and: [target owner ~~ self]] whileTrue: [
> >> - previousTargets add: target.
> >> - target := target owner].
> >> - target ifNil: [^ self].
> >> - [previousTargets isEmpty or: [target
> wantsHaloFromClick]] whileFalse: [
> >> - target := previousTargets removeLast].
> >> - target wantsHaloFromClick ifFalse: [^ self]].
> >> -
> >> - "3) Now that we have the target, show the halo. Abort event
> dispatching, too, to avoid confusion."
> >> - anEvent hand newMouseFocus: target event: anEvent.
> >> - target invokeHaloOrMove: anEvent.
> >> - anEvent ignore.!
> >>
> >> Item was changed:
> >> ----- Method: ProportionalSplitterMorph>>balanceOffsets (in category
> 'layout') -----
> >> balanceOffsets
> >>
> >> + | fdx fdy |
> >> +
> >> (self hasProperty: #fullDelta) ifFalse: [^ self].
> >>
> >> + fdx := (self valueOfProperty: #fullDelta) x.
> >> + fdy := (self valueOfProperty: #fullDelta) y.
> >> +
> >> 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: self layoutFrame topOffset
> - fdy.
> >> + self layoutFrame bottomOffset: self layoutFrame
> bottomOffset - fdy.
> >> - self layoutFrame topOffset: ctop -
> >> - (self layoutFrame topFraction * (obot - otop) +
> otop) truncated.
> >> - 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 - fdy].
> >> - 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 - fdy]]] .
> >> - 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) truncated.
> >> - self layoutFrame rightOffset: cright -
> >> - (self layoutFrame rightFraction * (oright -
> oleft) + oleft) rounded.
> >>
> >> + self layoutFrame leftOffset: self layoutFrame
> leftOffset - fdx.
> >> + self layoutFrame rightOffset: self layoutFrame
> rightOffset - fdx.
> >> +
> >> (leftOrTop copy union: rightOrBottom) do: [:m |
> >> (m layoutFrame leftFraction closeTo: leftf)
> ifTrue: [
> >> m layoutFrame leftFraction: self
> layoutFrame leftFraction.
> >> + m layoutFrame leftOffset: m layoutFrame
> leftOffset - fdx].
> >> - 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 - fdx.]]] .
> >> +
> >> - m layoutFrame rightOffset:
> >> - m layoutFrame rightOffset -
> (self valueOfProperty: #fullDelta) x.]]] .
> >> -
> >> self removeProperty: #fullDelta.
> >> owner layoutChanged
> >> !
> >>
> >> Item was added:
> >> + ----- Method: ProportionalSplitterMorph>>stopStepping (in category
> 'events') -----
> >> + stopStepping
> >> + super stopStepping.
> >> + (self class smartVerticalSplitters or: [ self class
> smartHorizontalSplitters ]) ifFalse: [ self balanceOffsets ]!
> >>
> >> Item was changed:
> >> ----- Method: SimpleHaloMorph>>transferHalo: (in category 'pop up')
> -----
> >> transferHalo: event
> >> + "Transfer the halo to the next likely recipient"
> >> - "Transfer the halo to the next likely recipient. Switch between
> siblings if overlapping."
> >>
> >> - (self target world morphsAt: event position) allButFirst "...
> the halo itself"
> >> - detect: [:morph |
> >> - "Sibling found?"
> >> - (morph owner == self target owner
> >> - and: [morph ~~ self target])
> >> - ifTrue: [
> >> - ^ morph
> invokeHaloOrMove: event].
> >> - "No sibling possible anymore?"
> >> - morph == self target].
> >> -
> >> self target
> >> transferHalo: (event transformedBy: (self target
> transformedFrom: self))
> >> from: self target.!
> >>
> >> Item was changed:
> >> ----- Method: SystemWindow>>filterEvent:for: (in category 'events')
> -----
> >> filterEvent: aKeyboardEvent for: anObject
> >> "Provide keyboard shortcuts."
> >> +
> >> -
> >> aKeyboardEvent isKeystroke
> >> ifFalse: [^ aKeyboardEvent].
> >> +
> >> + aKeyboardEvent hand halo ifNotNil: [ : halo | halo target
> isSystemWindow ifTrue: [ aKeyboardEvent hand removeHalo ] ].
> >>
> >> aKeyboardEvent commandKeyPressed ifTrue: [
> >> + aKeyboardEvent keyCharacter caseOf: {
> >> - aKeyboardEvent keyCharacter caseOf: {
> >> [$\] -> [self class sendTopWindowToBack].
> >> [Character escape] -> [self class
> deleteTopWindow].
> >> [$/] -> [self class
> bringWindowUnderHandToFront].
> >> } otherwise: [^ aKeyboardEvent "no hit"].
> >> ^ aKeyboardEvent ignore "hit!!"].
> >>
> >> aKeyboardEvent controlKeyPressed ifTrue: [
> >> aKeyboardEvent keyCharacter caseOf: {
> >> [Character escape] -> [self world findWindow:
> aKeyboardEvent].
> >> } otherwise: [^ aKeyboardEvent "no hit"].
> >> ^ aKeyboardEvent ignore "hit!!"].
> >>
> >> ^ aKeyboardEvent "no hit"!
> >>
> >>
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20181231/58ec0dac/attachment-0001.html>
More information about the Squeak-dev
mailing list
|