The Inbox: Morphic-ct.1617.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

The Inbox: Morphic-ct.1617.mcz

commits-2
Christoph Thiede uploaded a new version of Morphic to project The Inbox:
http://source.squeak.org/inbox/Morphic-ct.1617.mcz

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

Name: Morphic-ct.1617
Author: ct
Time: 12 January 2020, 3:34:20.453555 am
UUID: d75dd5ad-8420-c443-9314-c01d96409fae
Ancestors: Morphic-tpr.1616

Fixes #applyUserInterfaceTheme on SystemProgressMorph really!

Explanation: Resetting the ProgressMorph from the class side is definively bad, because it deletes the progress morph if currently visible. The current instance-side implementation was not reliable either, because if the UniqueInstance is not in world, it cannot apply the new UI theme. Thus we need to override #canApplyUserInterfaceTheme from Morph.

This commit replaces Morphic-ct.1615. See also: http://forum.world.st/SystemProgressMorph-applyUserInterfaceTheme-td5108129.html

=============== Diff against Morphic-tpr.1616 ===============

Item was added:
+ ----- Method: AlternatePluggableListMorphOfMany>>mouseLeaveDragging: (in category 'event handling') -----
+ mouseLeaveDragging: anEvent
+ "Dragging means changing the list's multi-selection state. Thus, there is no support for drag-and-drop of elements within a selection."
+
+ self hoverRow: nil.
+ self resetPotentialDropRow.!

Item was changed:
  ----- Method: FontChooserTool>>selectedPointSizeIndex: (in category 'point size') -----
  selectedPointSizeIndex: anIndex
 
  anIndex = 0 ifTrue: [^self].
  pointSize := (self pointSizeList at: anIndex) withBlanksTrimmed asNumber.
+ self changed: #selectedPointSizeIndex.
  self changed: #pointSizeList.
  self changed: #contents.!

Item was changed:
  Morph subclass: #HandMorph
+ instanceVariableNames: 'mouseFocus keyboardFocus eventListeners mouseListeners keyboardListeners eventCaptureFilters mouseCaptureFilters keyboardCaptureFilters mouseClickState mouseOverHandler mouseWheelState lastMouseEvent targetOffset damageRecorder cacheCanvas cachedCanvasHasHoles temporaryCursor temporaryCursorOffset hardwareCursor hasChanged savedPatch userInitials lastEventBuffer genieGestureProcessor keyboardInterpreter'
+ classVariableNames: 'CompositionWindowManager DoubleClickTime DragThreshold EventStats NewEventRules NormalCursor PasteBuffer SendMouseWheelToKeyboardFocus ShowEvents SynthesizeMouseWheelEvents'
- instanceVariableNames: 'mouseFocus keyboardFocus eventListeners mouseListeners keyboardListeners eventCaptureFilters mouseCaptureFilters keyboardCaptureFilters mouseClickState mouseOverHandler targetOffset lastMouseEvent damageRecorder cacheCanvas cachedCanvasHasHoles temporaryCursor temporaryCursorOffset hardwareCursor hasChanged savedPatch userInitials lastEventBuffer genieGestureProcessor keyboardInterpreter'
- classVariableNames: 'CompositionWindowManager DoubleClickTime DragThreshold EventStats MinimalWheelDelta NewEventRules NormalCursor PasteBuffer SendMouseWheelToKeyboardFocus ShowEvents SynthesizeMouseWheelEvents'
  poolDictionaries: 'EventSensorConstants'
  category: 'Morphic-Kernel'!
 
  !HandMorph commentStamp: '<historical>' prior: 0!
  The cursor may be thought of as the HandMorph.  The hand's submorphs hold anything being carried by dragging.  
 
  There is some minimal support for multiple hands in the same world.!

Item was removed:
- ----- Method: HandMorph class>>minimumWheelDelta (in category 'preferences') -----
- minimumWheelDelta
- <preference: 'Minimal Mouse Wheel Scroll Delta'
- categoryList: #(Morphic mouse)
- description: 'Answer the minimal scroll increment taken into account
- Defaults to 120, corresponding to a single mouse wheel notch.
- Use a lower value (20) if wanting smoother scrolling with trackpads.'
- type: #Number>
- ^MinimalWheelDelta ifNil: [120].!

Item was removed:
- ----- Method: HandMorph class>>minimumWheelDelta: (in category 'preferences') -----
- minimumWheelDelta: anInteger
- MinimalWheelDelta := anInteger ifNotNil: [anInteger clampLow: 20 high: 120]!

Item was changed:
  ----- Method: HandMorph>>generateMouseWheelEvent: (in category 'private events') -----
  generateMouseWheelEvent: evtBuf
  "Generate the appropriate mouse wheel event for the given raw event buffer"
 
+ | buttons modifiers deltaX deltaY stamp |
- | buttons modifiers deltaX deltaY stamp nextEvent |
  stamp := evtBuf second.
  stamp = 0 ifTrue: [stamp := Time eventMillisecondClock].
  deltaX := evtBuf third.
  deltaY := evtBuf fourth.
+ modifiers := evtBuf fifth.
+ buttons := (modifiers bitShift: 3) bitOr: (lastMouseEvent buttons bitAnd: 7).
- buttons := evtBuf fifth.
- modifiers := evtBuf sixth.
- [(deltaX abs + deltaY abs < self class minimumWheelDelta)
- and: [(nextEvent := Sensor peekEvent) notNil
- and: [nextEvent first = evtBuf first
- and: [nextEvent fifth = evtBuf fifth
- and: [nextEvent sixth = evtBuf sixth]
- and: [nextEvent third isZero = evtBuf third isZero "both horizontal or vertical"]]]]]
- whileTrue:
- ["nextEvent is similar.  Remove it from the queue, and check the next."
- nextEvent := Sensor nextEvent.
- deltaX := deltaX + nextEvent third.
- deltaY := deltaY + nextEvent fourth].
  ^ MouseWheelEvent new
  setType: #mouseWheel
  position: self position
  delta: deltaX@deltaY
+ direction: 2r0000
  buttons: buttons
  hand: self
  stamp: stamp!

Item was changed:
  ----- Method: HandMorph>>handleEvent: (in category 'events-processing') -----
  handleEvent: unfilteredEvent
 
  | filteredEvent |
  owner ifNil: [^ unfilteredEvent  "not necessary but good style -- see Morph >> #handleEvent:"].
 
  self logEvent: unfilteredEvent.
 
  "Mouse-over events occur really, really, really often. They are kind of the heart beat of the Morphic UI process."
  unfilteredEvent isMouseOver ifTrue: [^ self sendMouseEvent: unfilteredEvent].
 
  self showEvent: unfilteredEvent.
  self sendListenEvents: unfilteredEvent.
 
  filteredEvent := self sendFilterEventCapture: unfilteredEvent for: nil.
  "filteredEvent := unfilteredEvent" " <-- use this to disable global capture filters"
 
  filteredEvent wasIgnored ifTrue: [
  self mouseOverHandler processMouseOver: lastMouseEvent.
  ^ filteredEvent].
 
  filteredEvent isWindowEvent ifTrue: [
  self sendEvent: filteredEvent focus: nil.
  self mouseOverHandler processMouseOver: lastMouseEvent.
  ^ filteredEvent].
 
  filteredEvent isKeyboard ifTrue:[
  self sendKeyboardEvent: filteredEvent.
  self mouseOverHandler processMouseOver: lastMouseEvent.
  ^ filteredEvent].
 
  filteredEvent isDropEvent ifTrue:[
  self sendEvent: filteredEvent focus: nil.
  self mouseOverHandler processMouseOver: lastMouseEvent.
  ^ filteredEvent].
 
  filteredEvent isMouse ifFalse: [
  self mouseOverHandler processMouseOver: lastMouseEvent.
  ^ filteredEvent].
 
  " ********** MOUSE EVENT *********** "
 
  lastMouseEvent := filteredEvent.
 
  "Check for pending drag or double click operations."
  mouseClickState ifNotNil:[
  (mouseClickState handleEvent: filteredEvent from: self) ifFalse:[
  "Possibly dispatched #click: or something and will not re-establish otherwise"
  self mouseOverHandler processMouseOver: lastMouseEvent.
  ^ filteredEvent]].
 
  filteredEvent isMouseWheel ifTrue: [
+ mouseWheelState ifNil: [mouseWheelState := MouseWheelState new].
+ mouseWheelState handleEvent: filteredEvent from: self.
- self class sendMouseWheelToKeyboardFocus
- ifFalse: [self sendMouseEvent: filteredEvent]
- ifTrue: [self sendEvent: filteredEvent focus: self keyboardFocus clear: [self keyboardFocus: nil]].
  self mouseOverHandler processMouseOver: lastMouseEvent.
  ^ filteredEvent].
 
  filteredEvent isMove ifTrue:[
  self position: filteredEvent position.
  self sendMouseEvent: filteredEvent.
  self mouseOverHandler processMouseOver: lastMouseEvent.
  ^ filteredEvent].
 
  "Issue a synthetic move event if we're not at the position of the event"
  filteredEvent position = self position
  ifFalse: [self moveToEvent: filteredEvent].
 
  "Drop submorphs on button events"
  self hasSubmorphs
  ifTrue:[self dropMorphs: filteredEvent]
  ifFalse:[self sendMouseEvent: filteredEvent].
 
  self mouseOverHandler processMouseOver: lastMouseEvent.
  ^ filteredEvent "not necessary but good style -- see Morph >> #handleEvent:" !

Item was removed:
- ----- Method: MouseWheelEvent>>setDirection (in category 'initialization') -----
- setDirection
- delta x > 0 ifTrue: [self setWheelRight].
- delta x < 0 ifTrue: [self setWheelLeft].
-
- delta y > 0 ifTrue: [self setWheelUp].
- delta y < 0 ifTrue: [self setWheelDown].!

Item was removed:
- ----- Method: MouseWheelEvent>>setType:position:delta:buttons:hand:stamp: (in category 'private') -----
- setType: evtType position: evtPos delta: evtDelta buttons: evtButtons hand: evtHand stamp: stamp
- type := evtType.
- position := evtPos.
- buttons := evtButtons.
- source := evtHand.
- wasHandled := false.
- direction := 2r0000.
- delta := evtDelta.
- timeStamp := stamp.
- self setDirection!

Item was added:
+ Object subclass: #MouseWheelState
+ instanceVariableNames: 'currentDelta'
+ classVariableNames: ''
+ poolDictionaries: ''
+ category: 'Morphic-Events'!

Item was added:
+ ----- Method: MouseWheelState>>handleEvent:from: (in category 'event processing') -----
+ handleEvent: aMouseWheelEvent from: aHand
+ "Every 120 units, raise the wheel flags for convenient mouse wheel programming. We choose not to send multiple mouse-wheel events for multiples of 120 because applications can always react to the actual delta values if they want to do more scrolling or zooming."
+
+ | sign |
+ currentDelta := currentDelta + aMouseWheelEvent wheelDelta.
+
+ sign := currentDelta sign.
+ currentDelta := currentDelta abs.
+
+ (currentDelta x // 120) > 0 ifTrue: [
+ sign x = 1
+ ifTrue: [aMouseWheelEvent setWheelRight]
+ ifFalse: [aMouseWheelEvent setWheelLeft]].
+
+ (currentDelta y // 120) > 0 ifTrue: [
+ sign y = 1
+ ifTrue: [aMouseWheelEvent setWheelUp]
+ ifFalse: [aMouseWheelEvent setWheelDown]].
+
+ currentDelta := currentDelta \\ 120.
+ currentDelta := currentDelta * sign.
+
+ "Finally, send the event."
+ HandMorph sendMouseWheelToKeyboardFocus
+ ifFalse: [aHand sendMouseEvent: aMouseWheelEvent]
+ ifTrue: [aHand sendEvent: aMouseWheelEvent focus: aHand keyboardFocus clear: [aHand keyboardFocus: nil]].
+ !

Item was added:
+ ----- Method: MouseWheelState>>initialize (in category 'initialize-release') -----
+ initialize
+
+ super initialize.
+ currentDelta := 0@0.!

Item was changed:
  ----- Method: PluggableListMorph>>mouseUp: (in category 'event handling') -----
  mouseUp: event
 
  | row |
  model okToChange ifFalse: [^ self].
+ (self containsPoint: event position) ifFalse: [^ self].
 
  row := self rowAtLocation: event position.
  row = self selectionIndex
  ifTrue: [(autoDeselect ifNil: [true]) ifTrue: [row = 0 ifFalse: [self changeModelSelection: 0] ]]
  ifFalse: [self changeModelSelection: (self modelIndexFor: row)].
 
  event hand newKeyboardFocus: self.
  hasFocus := true.
  Cursor normal show.!

Item was changed:
  ----- Method: ScrollPane>>mouseWheel: (in category 'event handling') -----
  mouseWheel: evt
 
+ evt isWheelUp ifTrue: [scrollBar scrollUp: 3].
+ evt isWheelDown ifTrue: [scrollBar scrollDown: 3].!
- evt isWheelUp ifTrue: [scrollBar scrollUp: (3 * evt wheelDelta y abs // 120 max: 1)].
- evt isWheelDown ifTrue: [scrollBar scrollDown: (3 * evt wheelDelta y abs // 120 max: 1)].
- evt isWheelLeft ifTrue: [hScrollBar scrollUp: (3 * evt wheelDelta x abs // 120 max: 1)].
- evt isWheelRight ifTrue: [hScrollBar scrollDown: (3 * evt wheelDelta x abs // 120 max: 1)].!

Item was changed:
  ----- Method: StringMorph>>contents: (in category 'accessing') -----
  contents: newContents
 
  newContents isText
  ifTrue: [^ self initializeFromText: newContents].
 
  contents = newContents
+ ifTrue: [^ self "No substantive change."].
- ifTrue: [^ self "no substantive change"].
 
  contents := newContents.
+ self changed. "New contents need to be drawn."
+
+ self fitContents. "Resize if necessary."!
-
- self fitContents.!

Item was changed:
  ----- Method: StringMorph>>fitContents (in category 'layout') -----
  fitContents
 
+ self extent: self measureContents.!
- | newBounds boundsChanged |
- newBounds := self measureContents.
- boundsChanged := bounds extent ~= newBounds.
- self extent: newBounds. "default short-circuits if bounds not changed"
- boundsChanged ifFalse: [self changed]!

Item was removed:
- ----- Method: SystemProgressMorph class>>applyUserInterfaceTheme (in category 'preferences') -----
- applyUserInterfaceTheme
-
- self reset.!

Item was added:
+ ----- Method: SystemProgressMorph>>canApplyUserInterfaceTheme (in category 'updating') -----
+ canApplyUserInterfaceTheme
+
+ ^ true!

Item was changed:
  ----- Method: UpdatingStringMorph>>fitContents (in category 'layout') -----
  fitContents
+ "Overridden to respect minimum and maximum widfth."
+
-
  | newExtent |
+ newExtent :=  self measureContents.
+ self extent: ((newExtent x max: self minimumWidth) min: self maximumWidth) @ newExtent y.!
- newExtent := self measureContents.
- newExtent := ((newExtent x max: self minimumWidth) min: self maximumWidth) @ newExtent y.
- (self extent = newExtent) ifFalse:
- [self extent: newExtent.
- self changed]
- !

Item was changed:
  ----- Method: UpdatingStringMorph>>updateContentsFrom: (in category 'stepping') -----
  updateContentsFrom: aValue
  self growable
  ifTrue:
+ [self contentsFitted: aValue]
- [self contents: aValue]
  ifFalse:
  [self contentsClipped: aValue]!


Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Morphic-ct.1617.mcz

Christoph Thiede

Hm, the diff looks weird again. Did I make some mistake or is this some issue with the "diff server" (unknowing any details on how this online stuff works)? Chris, could you maybe enlighten me? :)


Best,
Christoph

Von: Squeak-dev <[hidden email]> im Auftrag von [hidden email] <[hidden email]>
Gesendet: Sonntag, 12. Januar 2020 03:34:33
An: [hidden email]
Betreff: [squeak-dev] The Inbox: Morphic-ct.1617.mcz
 
Christoph Thiede uploaded a new version of Morphic to project The Inbox:
http://source.squeak.org/inbox/Morphic-ct.1617.mcz

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

Name: Morphic-ct.1617
Author: ct
Time: 12 January 2020, 3:34:20.453555 am
UUID: d75dd5ad-8420-c443-9314-c01d96409fae
Ancestors: Morphic-tpr.1616

Fixes #applyUserInterfaceTheme on SystemProgressMorph really!

Explanation: Resetting the ProgressMorph from the class side is definively bad, because it deletes the progress morph if currently visible. The current instance-side implementation was not reliable either, because if the UniqueInstance is not in world, it cannot apply the new UI theme. Thus we need to override #canApplyUserInterfaceTheme from Morph.

This commit replaces Morphic-ct.1615. See also: http://forum.world.st/SystemProgressMorph-applyUserInterfaceTheme-td5108129.html

=============== Diff against Morphic-tpr.1616 ===============

Item was added:
+ ----- Method: AlternatePluggableListMorphOfMany>>mouseLeaveDragging: (in category 'event handling') -----
+ mouseLeaveDragging: anEvent
+        "Dragging means changing the list's multi-selection state. Thus, there is no support for drag-and-drop of elements within a selection."
+       
+        self hoverRow: nil.
+        self resetPotentialDropRow.!

Item was changed:
  ----- Method: FontChooserTool>>selectedPointSizeIndex: (in category 'point size') -----
  selectedPointSizeIndex: anIndex
 
         anIndex = 0 ifTrue: [^self].
         pointSize := (self pointSizeList at: anIndex) withBlanksTrimmed asNumber.
+        self changed: #selectedPointSizeIndex.
         self changed: #pointSizeList.
         self changed: #contents.!

Item was changed:
  Morph subclass: #HandMorph
+        instanceVariableNames: 'mouseFocus keyboardFocus eventListeners mouseListeners keyboardListeners eventCaptureFilters mouseCaptureFilters keyboardCaptureFilters mouseClickState mouseOverHandler mouseWheelState lastMouseEvent targetOffset damageRecorder cacheCanvas cachedCanvasHasHoles temporaryCursor temporaryCursorOffset hardwareCursor hasChanged savedPatch userInitials lastEventBuffer genieGestureProcessor keyboardInterpreter'
+        classVariableNames: 'CompositionWindowManager DoubleClickTime DragThreshold EventStats NewEventRules NormalCursor PasteBuffer SendMouseWheelToKeyboardFocus ShowEvents SynthesizeMouseWheelEvents'
-        instanceVariableNames: 'mouseFocus keyboardFocus eventListeners mouseListeners keyboardListeners eventCaptureFilters mouseCaptureFilters keyboardCaptureFilters mouseClickState mouseOverHandler targetOffset lastMouseEvent damageRecorder cacheCanvas cachedCanvasHasHoles temporaryCursor temporaryCursorOffset hardwareCursor hasChanged savedPatch userInitials lastEventBuffer genieGestureProcessor keyboardInterpreter'
-        classVariableNames: 'CompositionWindowManager DoubleClickTime DragThreshold EventStats MinimalWheelDelta NewEventRules NormalCursor PasteBuffer SendMouseWheelToKeyboardFocus ShowEvents SynthesizeMouseWheelEvents'
         poolDictionaries: 'EventSensorConstants'
         category: 'Morphic-Kernel'!
 
  !HandMorph commentStamp: '<historical>' prior: 0!
  The cursor may be thought of as the HandMorph.  The hand's submorphs hold anything being carried by dragging. 
 
  There is some minimal support for multiple hands in the same world.!

Item was removed:
- ----- Method: HandMorph class>>minimumWheelDelta (in category 'preferences') -----
- minimumWheelDelta
-        <preference: 'Minimal Mouse Wheel Scroll Delta'
-                categoryList: #(Morphic mouse)
-                description: 'Answer the minimal scroll increment taken into account
- Defaults to 120, corresponding to a single mouse wheel notch.
- Use a lower value (20) if wanting smoother scrolling with trackpads.'
-                type: #Number>
-        ^MinimalWheelDelta ifNil: [120].!

Item was removed:
- ----- Method: HandMorph class>>minimumWheelDelta: (in category 'preferences') -----
- minimumWheelDelta: anInteger
-        MinimalWheelDelta := anInteger ifNotNil: [anInteger clampLow: 20 high: 120]!

Item was changed:
  ----- Method: HandMorph>>generateMouseWheelEvent: (in category 'private events') -----
  generateMouseWheelEvent: evtBuf
         "Generate the appropriate mouse wheel event for the given raw event buffer"
 
+        | buttons modifiers deltaX deltaY stamp |
-        | buttons modifiers deltaX deltaY stamp nextEvent |
         stamp := evtBuf second.
         stamp = 0 ifTrue: [stamp := Time eventMillisecondClock].
         deltaX := evtBuf third.
         deltaY := evtBuf fourth.
+        modifiers := evtBuf fifth.
+        buttons := (modifiers bitShift: 3) bitOr: (lastMouseEvent buttons bitAnd: 7).
-        buttons := evtBuf fifth.
-        modifiers := evtBuf sixth.
-        [(deltaX abs + deltaY abs < self class minimumWheelDelta)
-                        and: [(nextEvent := Sensor peekEvent) notNil
-                        and: [nextEvent first = evtBuf first
-                        and: [nextEvent fifth = evtBuf fifth
-                        and: [nextEvent sixth = evtBuf sixth]
-                        and: [nextEvent third isZero = evtBuf third isZero "both horizontal or vertical"]]]]]
-                whileTrue:
-                        ["nextEvent is similar.  Remove it from the queue, and check the next."
-                        nextEvent := Sensor nextEvent.
-                        deltaX := deltaX + nextEvent third.
-                        deltaY := deltaY + nextEvent fourth].
         ^ MouseWheelEvent new
                 setType: #mouseWheel
                 position: self position
                 delta: deltaX@deltaY
+                direction: 2r0000
                 buttons: buttons       
                 hand: self
                 stamp: stamp!

Item was changed:
  ----- Method: HandMorph>>handleEvent: (in category 'events-processing') -----
  handleEvent: unfilteredEvent
 
         | filteredEvent |
         owner ifNil: [^ unfilteredEvent  "not necessary but good style -- see Morph >> #handleEvent:"].
        
         self logEvent: unfilteredEvent.
 
         "Mouse-over events occur really, really, really often. They are kind of the heart beat of the Morphic UI process."
         unfilteredEvent isMouseOver ifTrue: [^ self sendMouseEvent: unfilteredEvent].
 
         self showEvent: unfilteredEvent.
         self sendListenEvents: unfilteredEvent.
        
         filteredEvent := self sendFilterEventCapture: unfilteredEvent for: nil.
         "filteredEvent := unfilteredEvent" " <-- use this to disable global capture filters"
        
         filteredEvent wasIgnored ifTrue: [
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
        
         filteredEvent isWindowEvent ifTrue: [
                 self sendEvent: filteredEvent focus: nil.
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
 
         filteredEvent isKeyboard ifTrue:[
                 self sendKeyboardEvent: filteredEvent.
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
                        
         filteredEvent isDropEvent ifTrue:[
                 self sendEvent: filteredEvent focus: nil.
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
 
         filteredEvent isMouse ifFalse: [
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
 
         " ********** MOUSE EVENT *********** "
 
         lastMouseEvent := filteredEvent.
 
         "Check for pending drag or double click operations."
         mouseClickState ifNotNil:[
                 (mouseClickState handleEvent: filteredEvent from: self) ifFalse:[
                         "Possibly dispatched #click: or something and will not re-establish otherwise"
                         self mouseOverHandler processMouseOver: lastMouseEvent.
                         ^ filteredEvent]].
 
         filteredEvent isMouseWheel ifTrue: [
+                mouseWheelState ifNil: [mouseWheelState := MouseWheelState new].
+                mouseWheelState handleEvent: filteredEvent from: self.
-                self class sendMouseWheelToKeyboardFocus
-                        ifFalse: [self sendMouseEvent: filteredEvent]
-                        ifTrue: [self sendEvent: filteredEvent focus: self keyboardFocus clear: [self keyboardFocus: nil]].
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
 
         filteredEvent isMove ifTrue:[
                 self position: filteredEvent position.
                 self sendMouseEvent: filteredEvent.
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
 
         "Issue a synthetic move event if we're not at the position of the event"
         filteredEvent position = self position
                 ifFalse: [self moveToEvent: filteredEvent].
        
         "Drop submorphs on button events"
         self hasSubmorphs
                 ifTrue:[self dropMorphs: filteredEvent]
                 ifFalse:[self sendMouseEvent: filteredEvent].
 
         self mouseOverHandler processMouseOver: lastMouseEvent.
         ^ filteredEvent "not necessary but good style -- see Morph >> #handleEvent:"    !

Item was removed:
- ----- Method: MouseWheelEvent>>setDirection (in category 'initialization') -----
- setDirection
-        delta x > 0 ifTrue: [self setWheelRight].
-        delta x < 0 ifTrue: [self setWheelLeft].
-
-        delta y > 0 ifTrue: [self setWheelUp].
-        delta y < 0 ifTrue: [self setWheelDown].!

Item was removed:
- ----- Method: MouseWheelEvent>>setType:position:delta:buttons:hand:stamp: (in category 'private') -----
- setType: evtType position: evtPos delta: evtDelta buttons: evtButtons hand: evtHand stamp: stamp
-        type := evtType.
-        position := evtPos.
-        buttons := evtButtons.
-        source := evtHand.
-        wasHandled := false.
-        direction := 2r0000.
-        delta := evtDelta.
-        timeStamp := stamp.
-        self setDirection!

Item was added:
+ Object subclass: #MouseWheelState
+        instanceVariableNames: 'currentDelta'
+        classVariableNames: ''
+        poolDictionaries: ''
+        category: 'Morphic-Events'!

Item was added:
+ ----- Method: MouseWheelState>>handleEvent:from: (in category 'event processing') -----
+ handleEvent: aMouseWheelEvent from: aHand
+        "Every 120 units, raise the wheel flags for convenient mouse wheel programming. We choose not to send multiple mouse-wheel events for multiples of 120 because applications can always react to the actual delta values if they want to do more scrolling or zooming."
+       
+        | sign |
+        currentDelta := currentDelta + aMouseWheelEvent wheelDelta.
+
+        sign := currentDelta sign.
+        currentDelta := currentDelta abs.
+
+        (currentDelta x // 120) > 0 ifTrue: [
+                sign x = 1
+                        ifTrue: [aMouseWheelEvent setWheelRight]
+                        ifFalse: [aMouseWheelEvent setWheelLeft]].
+
+        (currentDelta y // 120) > 0 ifTrue: [
+                sign y = 1
+                        ifTrue: [aMouseWheelEvent setWheelUp]
+                        ifFalse: [aMouseWheelEvent setWheelDown]].
+               
+        currentDelta := currentDelta \\ 120.
+        currentDelta := currentDelta * sign.
+
+        "Finally, send the event."
+        HandMorph sendMouseWheelToKeyboardFocus
+                ifFalse: [aHand sendMouseEvent: aMouseWheelEvent]
+                ifTrue: [aHand sendEvent: aMouseWheelEvent focus: aHand keyboardFocus clear: [aHand keyboardFocus: nil]].
+ !

Item was added:
+ ----- Method: MouseWheelState>>initialize (in category 'initialize-release') -----
+ initialize
+
+        super initialize.
+        currentDelta := 0@0.!

Item was changed:
  ----- Method: PluggableListMorph>>mouseUp: (in category 'event handling') -----
  mouseUp: event
 
         | row |
         model okToChange ifFalse: [^ self].
+        (self containsPoint: event position) ifFalse: [^ self].
 
         row := self rowAtLocation: event position.
         row = self selectionIndex
                 ifTrue: [(autoDeselect ifNil: [true]) ifTrue: [row = 0 ifFalse: [self changeModelSelection: 0] ]]
                 ifFalse: [self changeModelSelection: (self modelIndexFor: row)].
                
         event hand newKeyboardFocus: self.
         hasFocus := true.
         Cursor normal show.!

Item was changed:
  ----- Method: ScrollPane>>mouseWheel: (in category 'event handling') -----
  mouseWheel: evt
 
+        evt isWheelUp ifTrue: [scrollBar scrollUp: 3].
+        evt isWheelDown ifTrue: [scrollBar scrollDown: 3].!
-        evt isWheelUp ifTrue: [scrollBar scrollUp: (3 * evt wheelDelta y abs // 120 max: 1)].
-        evt isWheelDown ifTrue: [scrollBar scrollDown: (3 * evt wheelDelta y abs // 120 max: 1)].
-        evt isWheelLeft ifTrue: [hScrollBar scrollUp: (3 * evt wheelDelta x abs // 120 max: 1)].
-        evt isWheelRight ifTrue: [hScrollBar scrollDown: (3 * evt wheelDelta x abs // 120 max: 1)].!

Item was changed:
  ----- Method: StringMorph>>contents: (in category 'accessing') -----
  contents: newContents
 
         newContents isText
                 ifTrue: [^ self initializeFromText: newContents].
 
         contents = newContents
+                ifTrue: [^ self "No substantive change."].
-                ifTrue: [^ self "no substantive change"].
 
         contents := newContents.
+        self changed. "New contents need to be drawn."
+               
+        self fitContents. "Resize if necessary."!
-       
-        self fitContents.!

Item was changed:
  ----- Method: StringMorph>>fitContents (in category 'layout') -----
  fitContents
 
+        self extent: self measureContents.!
-        | newBounds boundsChanged |
-        newBounds := self measureContents.
-        boundsChanged := bounds extent ~= newBounds.
-        self extent: newBounds.         "default short-circuits if bounds not changed"
-        boundsChanged ifFalse: [self changed]!

Item was removed:
- ----- Method: SystemProgressMorph class>>applyUserInterfaceTheme (in category 'preferences') -----
- applyUserInterfaceTheme
-
-        self reset.!

Item was added:
+ ----- Method: SystemProgressMorph>>canApplyUserInterfaceTheme (in category 'updating') -----
+ canApplyUserInterfaceTheme
+
+        ^ true!

Item was changed:
  ----- Method: UpdatingStringMorph>>fitContents (in category 'layout') -----
  fitContents
+        "Overridden to respect minimum and maximum widfth."
+       
-
         | newExtent |
+        newExtent :=  self measureContents.
+        self extent: ((newExtent x max: self minimumWidth) min: self maximumWidth) @ newExtent y.!
-        newExtent := self measureContents.
-        newExtent := ((newExtent x max: self minimumWidth) min: self maximumWidth) @ newExtent y.
-        (self extent = newExtent) ifFalse:
-                [self extent: newExtent.
-                self changed]
- !

Item was changed:
  ----- Method: UpdatingStringMorph>>updateContentsFrom: (in category 'stepping') -----
  updateContentsFrom: aValue
         self growable
                 ifTrue:
+                        [self contentsFitted: aValue]
-                        [self contents: aValue]
                 ifFalse:
                         [self contentsClipped: aValue]!




Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Morphic-ct.1617.mcz

Chris Muller-3
I noticed it, too, on one of my commits, which also had Morphic-tpr.1616 as the ancestor.  Very strange.

Not sure the cause at the moment, as always I'd be happy if you or anyone wants to take a look!  :)

On Sun, Jan 12, 2020 at 12:09 PM Thiede, Christoph <[hidden email]> wrote:

Hm, the diff looks weird again. Did I make some mistake or is this some issue with the "diff server" (unknowing any details on how this online stuff works)? Chris, could you maybe enlighten me? :)


Best,
Christoph

Von: Squeak-dev <[hidden email]> im Auftrag von [hidden email] <[hidden email]>
Gesendet: Sonntag, 12. Januar 2020 03:34:33
An: [hidden email]
Betreff: [squeak-dev] The Inbox: Morphic-ct.1617.mcz
 
Christoph Thiede uploaded a new version of Morphic to project The Inbox:
http://source.squeak.org/inbox/Morphic-ct.1617.mcz

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

Name: Morphic-ct.1617
Author: ct
Time: 12 January 2020, 3:34:20.453555 am
UUID: d75dd5ad-8420-c443-9314-c01d96409fae
Ancestors: Morphic-tpr.1616

Fixes #applyUserInterfaceTheme on SystemProgressMorph really!

Explanation: Resetting the ProgressMorph from the class side is definively bad, because it deletes the progress morph if currently visible. The current instance-side implementation was not reliable either, because if the UniqueInstance is not in world, it cannot apply the new UI theme. Thus we need to override #canApplyUserInterfaceTheme from Morph.

This commit replaces Morphic-ct.1615. See also: http://forum.world.st/SystemProgressMorph-applyUserInterfaceTheme-td5108129.html

=============== Diff against Morphic-tpr.1616 ===============

Item was added:
+ ----- Method: AlternatePluggableListMorphOfMany>>mouseLeaveDragging: (in category 'event handling') -----
+ mouseLeaveDragging: anEvent
+        "Dragging means changing the list's multi-selection state. Thus, there is no support for drag-and-drop of elements within a selection."
+       
+        self hoverRow: nil.
+        self resetPotentialDropRow.!

Item was changed:
  ----- Method: FontChooserTool>>selectedPointSizeIndex: (in category 'point size') -----
  selectedPointSizeIndex: anIndex
 
         anIndex = 0 ifTrue: [^self].
         pointSize := (self pointSizeList at: anIndex) withBlanksTrimmed asNumber.
+        self changed: #selectedPointSizeIndex.
         self changed: #pointSizeList.
         self changed: #contents.!

Item was changed:
  Morph subclass: #HandMorph
+        instanceVariableNames: 'mouseFocus keyboardFocus eventListeners mouseListeners keyboardListeners eventCaptureFilters mouseCaptureFilters keyboardCaptureFilters mouseClickState mouseOverHandler mouseWheelState lastMouseEvent targetOffset damageRecorder cacheCanvas cachedCanvasHasHoles temporaryCursor temporaryCursorOffset hardwareCursor hasChanged savedPatch userInitials lastEventBuffer genieGestureProcessor keyboardInterpreter'
+        classVariableNames: 'CompositionWindowManager DoubleClickTime DragThreshold EventStats NewEventRules NormalCursor PasteBuffer SendMouseWheelToKeyboardFocus ShowEvents SynthesizeMouseWheelEvents'
-        instanceVariableNames: 'mouseFocus keyboardFocus eventListeners mouseListeners keyboardListeners eventCaptureFilters mouseCaptureFilters keyboardCaptureFilters mouseClickState mouseOverHandler targetOffset lastMouseEvent damageRecorder cacheCanvas cachedCanvasHasHoles temporaryCursor temporaryCursorOffset hardwareCursor hasChanged savedPatch userInitials lastEventBuffer genieGestureProcessor keyboardInterpreter'
-        classVariableNames: 'CompositionWindowManager DoubleClickTime DragThreshold EventStats MinimalWheelDelta NewEventRules NormalCursor PasteBuffer SendMouseWheelToKeyboardFocus ShowEvents SynthesizeMouseWheelEvents'
         poolDictionaries: 'EventSensorConstants'
         category: 'Morphic-Kernel'!
 
  !HandMorph commentStamp: '<historical>' prior: 0!
  The cursor may be thought of as the HandMorph.  The hand's submorphs hold anything being carried by dragging. 
 
  There is some minimal support for multiple hands in the same world.!

Item was removed:
- ----- Method: HandMorph class>>minimumWheelDelta (in category 'preferences') -----
- minimumWheelDelta
-        <preference: 'Minimal Mouse Wheel Scroll Delta'
-                categoryList: #(Morphic mouse)
-                description: 'Answer the minimal scroll increment taken into account
- Defaults to 120, corresponding to a single mouse wheel notch.
- Use a lower value (20) if wanting smoother scrolling with trackpads.'
-                type: #Number>
-        ^MinimalWheelDelta ifNil: [120].!

Item was removed:
- ----- Method: HandMorph class>>minimumWheelDelta: (in category 'preferences') -----
- minimumWheelDelta: anInteger
-        MinimalWheelDelta := anInteger ifNotNil: [anInteger clampLow: 20 high: 120]!

Item was changed:
  ----- Method: HandMorph>>generateMouseWheelEvent: (in category 'private events') -----
  generateMouseWheelEvent: evtBuf
         "Generate the appropriate mouse wheel event for the given raw event buffer"
 
+        | buttons modifiers deltaX deltaY stamp |
-        | buttons modifiers deltaX deltaY stamp nextEvent |
         stamp := evtBuf second.
         stamp = 0 ifTrue: [stamp := Time eventMillisecondClock].
         deltaX := evtBuf third.
         deltaY := evtBuf fourth.
+        modifiers := evtBuf fifth.
+        buttons := (modifiers bitShift: 3) bitOr: (lastMouseEvent buttons bitAnd: 7).
-        buttons := evtBuf fifth.
-        modifiers := evtBuf sixth.
-        [(deltaX abs + deltaY abs < self class minimumWheelDelta)
-                        and: [(nextEvent := Sensor peekEvent) notNil
-                        and: [nextEvent first = evtBuf first
-                        and: [nextEvent fifth = evtBuf fifth
-                        and: [nextEvent sixth = evtBuf sixth]
-                        and: [nextEvent third isZero = evtBuf third isZero "both horizontal or vertical"]]]]]
-                whileTrue:
-                        ["nextEvent is similar.  Remove it from the queue, and check the next."
-                        nextEvent := Sensor nextEvent.
-                        deltaX := deltaX + nextEvent third.
-                        deltaY := deltaY + nextEvent fourth].
         ^ MouseWheelEvent new
                 setType: #mouseWheel
                 position: self position
                 delta: deltaX@deltaY
+                direction: 2r0000
                 buttons: buttons       
                 hand: self
                 stamp: stamp!

Item was changed:
  ----- Method: HandMorph>>handleEvent: (in category 'events-processing') -----
  handleEvent: unfilteredEvent
 
         | filteredEvent |
         owner ifNil: [^ unfilteredEvent  "not necessary but good style -- see Morph >> #handleEvent:"].
        
         self logEvent: unfilteredEvent.
 
         "Mouse-over events occur really, really, really often. They are kind of the heart beat of the Morphic UI process."
         unfilteredEvent isMouseOver ifTrue: [^ self sendMouseEvent: unfilteredEvent].
 
         self showEvent: unfilteredEvent.
         self sendListenEvents: unfilteredEvent.
        
         filteredEvent := self sendFilterEventCapture: unfilteredEvent for: nil.
         "filteredEvent := unfilteredEvent" " <-- use this to disable global capture filters"
        
         filteredEvent wasIgnored ifTrue: [
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
        
         filteredEvent isWindowEvent ifTrue: [
                 self sendEvent: filteredEvent focus: nil.
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
 
         filteredEvent isKeyboard ifTrue:[
                 self sendKeyboardEvent: filteredEvent.
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
                        
         filteredEvent isDropEvent ifTrue:[
                 self sendEvent: filteredEvent focus: nil.
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
 
         filteredEvent isMouse ifFalse: [
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
 
         " ********** MOUSE EVENT *********** "
 
         lastMouseEvent := filteredEvent.
 
         "Check for pending drag or double click operations."
         mouseClickState ifNotNil:[
                 (mouseClickState handleEvent: filteredEvent from: self) ifFalse:[
                         "Possibly dispatched #click: or something and will not re-establish otherwise"
                         self mouseOverHandler processMouseOver: lastMouseEvent.
                         ^ filteredEvent]].
 
         filteredEvent isMouseWheel ifTrue: [
+                mouseWheelState ifNil: [mouseWheelState := MouseWheelState new].
+                mouseWheelState handleEvent: filteredEvent from: self.
-                self class sendMouseWheelToKeyboardFocus
-                        ifFalse: [self sendMouseEvent: filteredEvent]
-                        ifTrue: [self sendEvent: filteredEvent focus: self keyboardFocus clear: [self keyboardFocus: nil]].
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
 
         filteredEvent isMove ifTrue:[
                 self position: filteredEvent position.
                 self sendMouseEvent: filteredEvent.
                 self mouseOverHandler processMouseOver: lastMouseEvent.
                 ^ filteredEvent].
 
         "Issue a synthetic move event if we're not at the position of the event"
         filteredEvent position = self position
                 ifFalse: [self moveToEvent: filteredEvent].
        
         "Drop submorphs on button events"
         self hasSubmorphs
                 ifTrue:[self dropMorphs: filteredEvent]
                 ifFalse:[self sendMouseEvent: filteredEvent].
 
         self mouseOverHandler processMouseOver: lastMouseEvent.
         ^ filteredEvent "not necessary but good style -- see Morph >> #handleEvent:"    !

Item was removed:
- ----- Method: MouseWheelEvent>>setDirection (in category 'initialization') -----
- setDirection
-        delta x > 0 ifTrue: [self setWheelRight].
-        delta x < 0 ifTrue: [self setWheelLeft].
-
-        delta y > 0 ifTrue: [self setWheelUp].
-        delta y < 0 ifTrue: [self setWheelDown].!

Item was removed:
- ----- Method: MouseWheelEvent>>setType:position:delta:buttons:hand:stamp: (in category 'private') -----
- setType: evtType position: evtPos delta: evtDelta buttons: evtButtons hand: evtHand stamp: stamp
-        type := evtType.
-        position := evtPos.
-        buttons := evtButtons.
-        source := evtHand.
-        wasHandled := false.
-        direction := 2r0000.
-        delta := evtDelta.
-        timeStamp := stamp.
-        self setDirection!

Item was added:
+ Object subclass: #MouseWheelState
+        instanceVariableNames: 'currentDelta'
+        classVariableNames: ''
+        poolDictionaries: ''
+        category: 'Morphic-Events'!

Item was added:
+ ----- Method: MouseWheelState>>handleEvent:from: (in category 'event processing') -----
+ handleEvent: aMouseWheelEvent from: aHand
+        "Every 120 units, raise the wheel flags for convenient mouse wheel programming. We choose not to send multiple mouse-wheel events for multiples of 120 because applications can always react to the actual delta values if they want to do more scrolling or zooming."
+       
+        | sign |
+        currentDelta := currentDelta + aMouseWheelEvent wheelDelta.
+
+        sign := currentDelta sign.
+        currentDelta := currentDelta abs.
+
+        (currentDelta x // 120) > 0 ifTrue: [
+                sign x = 1
+                        ifTrue: [aMouseWheelEvent setWheelRight]
+                        ifFalse: [aMouseWheelEvent setWheelLeft]].
+
+        (currentDelta y // 120) > 0 ifTrue: [
+                sign y = 1
+                        ifTrue: [aMouseWheelEvent setWheelUp]
+                        ifFalse: [aMouseWheelEvent setWheelDown]].
+               
+        currentDelta := currentDelta \\ 120.
+        currentDelta := currentDelta * sign.
+
+        "Finally, send the event."
+        HandMorph sendMouseWheelToKeyboardFocus
+                ifFalse: [aHand sendMouseEvent: aMouseWheelEvent]
+                ifTrue: [aHand sendEvent: aMouseWheelEvent focus: aHand keyboardFocus clear: [aHand keyboardFocus: nil]].
+ !

Item was added:
+ ----- Method: MouseWheelState>>initialize (in category 'initialize-release') -----
+ initialize
+
+        super initialize.
+        currentDelta := 0@0.!

Item was changed:
  ----- Method: PluggableListMorph>>mouseUp: (in category 'event handling') -----
  mouseUp: event
 
         | row |
         model okToChange ifFalse: [^ self].
+        (self containsPoint: event position) ifFalse: [^ self].
 
         row := self rowAtLocation: event position.
         row = self selectionIndex
                 ifTrue: [(autoDeselect ifNil: [true]) ifTrue: [row = 0 ifFalse: [self changeModelSelection: 0] ]]
                 ifFalse: [self changeModelSelection: (self modelIndexFor: row)].
                
         event hand newKeyboardFocus: self.
         hasFocus := true.
         Cursor normal show.!

Item was changed:
  ----- Method: ScrollPane>>mouseWheel: (in category 'event handling') -----
  mouseWheel: evt
 
+        evt isWheelUp ifTrue: [scrollBar scrollUp: 3].
+        evt isWheelDown ifTrue: [scrollBar scrollDown: 3].!
-        evt isWheelUp ifTrue: [scrollBar scrollUp: (3 * evt wheelDelta y abs // 120 max: 1)].
-        evt isWheelDown ifTrue: [scrollBar scrollDown: (3 * evt wheelDelta y abs // 120 max: 1)].
-        evt isWheelLeft ifTrue: [hScrollBar scrollUp: (3 * evt wheelDelta x abs // 120 max: 1)].
-        evt isWheelRight ifTrue: [hScrollBar scrollDown: (3 * evt wheelDelta x abs // 120 max: 1)].!

Item was changed:
  ----- Method: StringMorph>>contents: (in category 'accessing') -----
  contents: newContents
 
         newContents isText
                 ifTrue: [^ self initializeFromText: newContents].
 
         contents = newContents
+                ifTrue: [^ self "No substantive change."].
-                ifTrue: [^ self "no substantive change"].
 
         contents := newContents.
+        self changed. "New contents need to be drawn."
+               
+        self fitContents. "Resize if necessary."!
-       
-        self fitContents.!

Item was changed:
  ----- Method: StringMorph>>fitContents (in category 'layout') -----
  fitContents
 
+        self extent: self measureContents.!
-        | newBounds boundsChanged |
-        newBounds := self measureContents.
-        boundsChanged := bounds extent ~= newBounds.
-        self extent: newBounds.         "default short-circuits if bounds not changed"
-        boundsChanged ifFalse: [self changed]!

Item was removed:
- ----- Method: SystemProgressMorph class>>applyUserInterfaceTheme (in category 'preferences') -----
- applyUserInterfaceTheme
-
-        self reset.!

Item was added:
+ ----- Method: SystemProgressMorph>>canApplyUserInterfaceTheme (in category 'updating') -----
+ canApplyUserInterfaceTheme
+
+        ^ true!

Item was changed:
  ----- Method: UpdatingStringMorph>>fitContents (in category 'layout') -----
  fitContents
+        "Overridden to respect minimum and maximum widfth."
+       
-
         | newExtent |
+        newExtent :=  self measureContents.
+        self extent: ((newExtent x max: self minimumWidth) min: self maximumWidth) @ newExtent y.!
-        newExtent := self measureContents.
-        newExtent := ((newExtent x max: self minimumWidth) min: self maximumWidth) @ newExtent y.
-        (self extent = newExtent) ifFalse:
-                [self extent: newExtent.
-                self changed]
- !

Item was changed:
  ----- Method: UpdatingStringMorph>>updateContentsFrom: (in category 'stepping') -----
  updateContentsFrom: aValue
         self growable
                 ifTrue:
+                        [self contentsFitted: aValue]
-                        [self contents: aValue]
                 ifFalse:
                         [self contentsClipped: aValue]!