The Inbox: Morphic-cmm.1616.mcz

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

The Inbox: Morphic-cmm.1616.mcz

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

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

Name: Morphic-cmm.1616
Author: cmm
Time: 6 January 2020, 10:07:44.246015 pm
UUID: d5855100-f308-4287-b83d-2e51c3b4688c
Ancestors: Morphic-mt.1615

When a text selection cannot fit into its text pane, start by scrolling to its upper-left, rather than its lower-right until the next edit is made, at which point scroll to the edit.

=============== Diff against Morphic-mt.1615 ===============

Item was changed:
  ----- Method: PluggableTextMorph>>handleEdit: (in category 'editor access') -----
  handleEdit: editBlock
  | result |
  textMorph editor selectFrom: selectionInterval first to: selectionInterval last;
  model: model.  "For, eg, evaluateSelection"
  result := textMorph handleEdit: editBlock.   "Update selection after edit"
+ self scrollSelectionIntoView: #scrollToPointBlock. "Special directive to scroll to text cursor"
- self scrollSelectionIntoView.
  ^ result!

Item was changed:
  ----- Method: PluggableTextMorph>>scrollSelectionIntoView: (in category 'editor access') -----
+ scrollSelectionIntoView: eventOrDirective
- scrollSelectionIntoView: event
  "Scroll my text into view. Due to line composition mechanism, we must never use the right of a character block because the lines last character block right value always comes from a global container and is *not* line specific."
+ self flag: #fixIntervalCache.
+ "mt: We should find a better design for discarding unused text editors in text morphs and restoring them on demand."
-
- self flag: #fixIntervalCache. "mt: We should find a better design for discarding unused text editors in text morphs and restoring them on demand."
  selectionInterval := textMorph editor markIndex to: textMorph editor pointIndex - 1.
+ self scrollToShow:
+ (textMorph editor hasSelection
+ ifTrue: [ textMorph editor startBlock topLeft corner: textMorph editor stopBlock bottomLeft ]
+ ifFalse: [ textMorph editor startBlock withWidth: 1 ]).
+ (eventOrDirective notNil and: [ eventOrDirective = #scrollToPointBlock or: [ eventOrDirective isKeyboard ] ]) ifTrue:
+ [ self scrollToShow: (textMorph editor pointBlock withWidth: 1) ].
-
- textMorph editor hasSelection
- ifFalse: [self scrollToShow: (textMorph editor startBlock withWidth: 1)]
- ifTrue: [
- self scrollToShow: (textMorph editor startBlock topLeft corner: textMorph editor stopBlock bottomLeft).
- self scrollToShow: (textMorph editor pointBlock withWidth: 1). "Ensure text cursor visibility."].
-
  ^ true!

Item was changed:
  ----- Method: ScrollPane>>keyStroke: (in category 'event handling') -----
+ keyStroke: aKeyboardEvent
+ "If pane is not empty, let the last submorph handle the event."
+ scroller submorphs ifNotEmpty: [ : subs | subs last keyStroke: aKeyboardEvent ]!
- keyStroke: evt
- "If pane is not empty, pass the event to the last submorph,
-  assuming it is the most appropriate recipient (!!)"
-
- scroller submorphs last keyStroke: evt!

Item was changed:
  ----- Method: ScrollPane>>offsetToShow: (in category 'scrolling') -----
  offsetToShow: aRectangle
  "Calculate the offset necessary to show the rectangle."
 
  | offset scrollRange target |
  self fullBounds. "We need updated bounds."
  offset := scroller offset.
  scrollRange := self hTotalScrollRange @ self vTotalScrollRange.
 
  "Normalize the incoming rectangle."
  target :=
+ aRectangle left @ aRectangle top
- (scroller width < aRectangle width
- ifTrue: [offset x < aRectangle left "Coming from left?"
- ifTrue: [aRectangle right - scroller width]
- ifFalse: [aRectangle left]]
- ifFalse: [aRectangle left])
- @
- (scroller height < aRectangle height
- ifTrue: [offset y < aRectangle top "Coming from top?"
- ifTrue: [aRectangle bottom - scroller height]
- ifFalse: [aRectangle top]]
- ifFalse: [aRectangle top])
  corner:
  (scroller width < aRectangle width
  ifTrue: [offset x + scroller width > aRectangle right "Coming from right?"
  ifTrue: [aRectangle left + scroller width]
  ifFalse: [aRectangle right]]
  ifFalse: [aRectangle right])
  @
  (scroller height < aRectangle height
  ifTrue: [offset y + scroller height > aRectangle bottom "Coming from bottom?"
  ifTrue: [aRectangle top + scroller height]
  ifFalse: [aRectangle bottom]]
  ifFalse: [aRectangle bottom]).
 
  "Vertical Scrolling"
- target top < offset y
- ifTrue: [offset := offset x @ target top].
  target bottom > (offset y + scroller height)
  ifTrue: [offset := offset x @ (target bottom - scroller height)].
+ target top < offset y
+ ifTrue: [offset := offset x @ target top].
 
  "Horizontal Scrolling"
- target left < offset x
- ifTrue: [offset := target left @ offset y].
  target right > (offset x + scroller width)
  ifTrue: [offset := (target right - scroller width) @ offset y].
+ target left < offset x
+ ifTrue: [offset := target left @ offset y].
 
  ^ (offset min: scrollRange - scroller extent) max: 0@0!

Item was changed:
  ----- Method: TextMorphForEditView>>keyStroke: (in category 'event handling') -----
  keyStroke: evt
  | view |
 
  editView deleteBalloon.
  self editor model: editView model.  "For evaluateSelection"
  view := editView.  "Copy into temp for case of a self-mutating doit"
  (acceptOnCR and: [evt keyCharacter = Character cr])
  ifTrue: [^ self editor accept].
 
  view hasUserEdited: false.
  super keyStroke: evt.
+ view scrollSelectionIntoView: evt.
- view scrollSelectionIntoView.
 
  view hasUserEdited
  ifTrue: [ view textEdited: self contents].!


Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Morphic-cmm.1616.mcz

Chris Muller-3
Hi Marcel and Christoph,

After further thought the other day, I had arrived at the same concerns as Christoph and you; and had this version sitting dirty in my image.  In addition to yours, I myself also didn't care for passing the non-well-formed Event object which the method might in the future couple to beyond the type test.  Plus, the extra garbage.

All this is somewhat ameliorated in this edition, by simply allowing a Symbolic "directive" to be passed in alternately from an Event object (which would not be used even if it was).

This was done a few days ago.  Since then, Marcel submitted his workaround in Tools which is fine for now, but I just wanted to capture this latest version in the Inbox for future discussion rather than lose it.

Best,
  Chris

On Mon, Jan 6, 2020 at 10:08 PM <[hidden email]> wrote:
Chris Muller uploaded a new version of Morphic to project The Inbox:
http://source.squeak.org/inbox/Morphic-cmm.1616.mcz

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

Name: Morphic-cmm.1616
Author: cmm
Time: 6 January 2020, 10:07:44.246015 pm
UUID: d5855100-f308-4287-b83d-2e51c3b4688c
Ancestors: Morphic-mt.1615

When a text selection cannot fit into its text pane, start by scrolling to its upper-left, rather than its lower-right until the next edit is made, at which point scroll to the edit.

=============== Diff against Morphic-mt.1615 ===============

Item was changed:
  ----- Method: PluggableTextMorph>>handleEdit: (in category 'editor access') -----
  handleEdit: editBlock
        | result |
        textMorph editor selectFrom: selectionInterval first to: selectionInterval last;
                                                model: model.  "For, eg, evaluateSelection"
        result := textMorph handleEdit: editBlock.   "Update selection after edit"
+       self scrollSelectionIntoView: #scrollToPointBlock. "Special directive to scroll to text cursor"
-       self scrollSelectionIntoView.
        ^ result!

Item was changed:
  ----- Method: PluggableTextMorph>>scrollSelectionIntoView: (in category 'editor access') -----
+ scrollSelectionIntoView: eventOrDirective
- scrollSelectionIntoView: event
        "Scroll my text into view. Due to line composition mechanism, we must never use the right of a character block because the lines last character block right value always comes from a global container and is *not* line specific."
+       self flag: #fixIntervalCache.
+       "mt: We should find a better design for discarding unused text editors in text morphs and restoring them on demand."
-
-       self flag: #fixIntervalCache. "mt: We should find a better design for discarding unused text editors in text morphs and restoring them on demand."
        selectionInterval := textMorph editor markIndex to: textMorph editor pointIndex - 1.
+       self scrollToShow:
+               (textMorph editor hasSelection
+                       ifTrue: [ textMorph editor startBlock topLeft corner: textMorph editor stopBlock bottomLeft ]
+                       ifFalse: [ textMorph editor startBlock withWidth: 1 ]).
+       (eventOrDirective notNil and: [ eventOrDirective = #scrollToPointBlock or: [ eventOrDirective isKeyboard ] ]) ifTrue:
+               [ self scrollToShow: (textMorph editor pointBlock withWidth: 1) ].
-       
-       textMorph editor hasSelection
-               ifFalse: [self scrollToShow: (textMorph editor startBlock withWidth: 1)]
-               ifTrue: [
-                       self scrollToShow: (textMorph editor startBlock topLeft corner: textMorph editor stopBlock bottomLeft).
-                       self scrollToShow: (textMorph editor pointBlock withWidth: 1). "Ensure text cursor visibility."].
-               
        ^ true!

Item was changed:
  ----- Method: ScrollPane>>keyStroke: (in category 'event handling') -----
+ keyStroke: aKeyboardEvent
+       "If pane is not empty, let the last submorph handle the event."
+       scroller submorphs ifNotEmpty: [ : subs | subs last keyStroke: aKeyboardEvent ]!
- keyStroke: evt
-       "If pane is not empty, pass the event to the last submorph,
-       assuming it is the most appropriate recipient (!!)"
-
-       scroller submorphs last keyStroke: evt!

Item was changed:
  ----- Method: ScrollPane>>offsetToShow: (in category 'scrolling') -----
  offsetToShow: aRectangle
        "Calculate the offset necessary to show the rectangle."

        | offset scrollRange target |
        self fullBounds. "We need updated bounds."
        offset := scroller offset.
        scrollRange := self hTotalScrollRange @ self vTotalScrollRange.

        "Normalize the incoming rectangle."
        target :=
+               aRectangle left @ aRectangle top
-                       (scroller width < aRectangle width
-                               ifTrue: [offset x < aRectangle left "Coming from left?"
-                                       ifTrue: [aRectangle right - scroller width]
-                                       ifFalse: [aRectangle left]]
-                               ifFalse: [aRectangle left])
-               @
-                       (scroller height < aRectangle height
-                               ifTrue: [offset y < aRectangle top "Coming from top?"
-                                       ifTrue: [aRectangle bottom - scroller height]
-                                       ifFalse: [aRectangle top]]
-                               ifFalse: [aRectangle top])
                corner:
                        (scroller width < aRectangle width
                                ifTrue: [offset x + scroller width > aRectangle right "Coming from right?"
                                        ifTrue: [aRectangle left + scroller width]
                                        ifFalse: [aRectangle right]]
                                ifFalse: [aRectangle right])
                @
                        (scroller height < aRectangle height
                                ifTrue: [offset y + scroller height > aRectangle bottom "Coming from bottom?"
                                        ifTrue: [aRectangle top + scroller height]
                                        ifFalse: [aRectangle bottom]]
                                ifFalse: [aRectangle bottom]).

        "Vertical Scrolling"
-       target top < offset y
-               ifTrue: [offset := offset x @ target top].     
        target bottom > (offset y + scroller height)
                ifTrue: [offset := offset x @ (target bottom - scroller height)].
+       target top < offset y
+               ifTrue: [offset := offset x @ target top].     

        "Horizontal Scrolling"
-       target left < offset x
-               ifTrue: [offset := target left @ offset y].
        target right > (offset x + scroller width)
                ifTrue: [offset := (target right - scroller width) @ offset y].
+       target left < offset x
+               ifTrue: [offset := target left @ offset y].

        ^ (offset min: scrollRange - scroller extent) max: 0@0!

Item was changed:
  ----- Method: TextMorphForEditView>>keyStroke: (in category 'event handling') -----
  keyStroke: evt
        | view |

        editView deleteBalloon.
        self editor model: editView model.  "For evaluateSelection"
        view := editView.  "Copy into temp for case of a self-mutating doit"
        (acceptOnCR and: [evt keyCharacter = Character cr])
                ifTrue: [^ self editor accept].

        view hasUserEdited: false.
        super keyStroke: evt.
+       view scrollSelectionIntoView: evt.
-       view scrollSelectionIntoView.

        view hasUserEdited
                ifTrue: [       view textEdited: self contents].!