[squeak-dev] The Trunk: Morphic-mt.843.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Apr 8 18:32:20 UTC 2015
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.843.mcz
==================== Summary ====================
Name: Morphic-mt.843
Author: mt
Time: 8 April 2015, 8:31:38.574 pm
UUID: 1526b04c-0b9c-5546-ad8f-90e7925b10a5
Ancestors: Morphic-mt.842
Scroll pane refactored to avoid using floats for controlling the transform morph's offset but use integer values. This allows for a pixel-precise scrolling behavior.
Note: The postscript should correctly update all existing scroll panes and their scroll bars.
=============== Diff against Morphic-mt.842 ===============
Item was changed:
----- Method: IndentingListItemMorph>>charactersOccluded (in category 'private') -----
charactersOccluded
"Answer the number of characters occluded in my #visibleList by my right edge."
| listIndex leftEdgeOfRightmostColumn eachString indexOfLastVisible iconWidth totalWidth |
listIndex := 0.
leftEdgeOfRightmostColumn := container columns
ifNil: [ 0 ]
ifNotNil:
[ : cols | (1 to: cols size - 1)
inject: 0
into:
[ : sum : each | sum + (self widthOfColumn: each) ] ].
eachString := container columns
ifNil: [ self complexContents asString ]
ifNotNil:
[ : cols | self contentsAtColumn: container columns size ].
iconWidth := self icon
ifNil: [ 0 ]
ifNotNil:
[ : icon | icon width + 2 ].
totalWidth := self toggleBounds right.
indexOfLastVisible := ((1 to: eachString size)
detect:
[ : stringIndex | (totalWidth:=totalWidth+(self fontToUse widthOf: (eachString at: stringIndex))) >
(container width -
(container vIsScrollbarShowing
+ ifTrue: [ container vScrollBar width ]
- ifTrue: [ container scrollBar width ]
ifFalse: [ 0 ]) - iconWidth - leftEdgeOfRightmostColumn) ]
ifNone: [ eachString size + 1 ]) - 1.
^ eachString size - indexOfLastVisible!
Item was removed:
- ----- Method: PluggableTextMorph>>hExtraScrollRange (in category 'scrolling') -----
- hExtraScrollRange
-
- ^ 0!
Item was removed:
- ----- Method: PluggableTextMorph>>vExtraScrollRange (in category 'scrolling') -----
- vExtraScrollRange
-
- ^ 10!
Item was removed:
- ----- Method: ScrollPane>>extraScrollRange (in category 'geometry') -----
- extraScrollRange
- "Return the amount of extra blank space to include below the bottom of the scroll content."
- "The classic behavior would be ^bounds height - (bounds height * 3 // 4)"
- ^ self scrollDeltaHeight!
Item was changed:
----- Method: ScrollPane>>hExtraScrollRange (in category 'geometry') -----
hExtraScrollRange
"Return the amount of extra blank space to include below the bottom of the scroll content."
+ ^ 0
- ^ self scrollDeltaWidth
!
Item was changed:
----- Method: ScrollPane>>hIsScrollable (in category 'geometry testing') -----
hIsScrollable
-
"If the contents of the pane are too small to scroll, return false."
- ^ self hLeftoverScrollRange > 0
+ ^ self hLeftoverScrollRange > 0
!
Item was changed:
----- Method: ScrollPane>>hLeftoverScrollRange (in category 'geometry') -----
hLeftoverScrollRange
"Return the entire scrolling range minus the currently viewed area."
+
+ ^ scroller hasSubmorphs
+ ifFalse: [0]
+ ifTrue: [self hTotalScrollRange - scroller width max: 0]
- | w |
- scroller hasSubmorphs ifFalse:[^0].
- w := bounds width.
- self vIsScrollbarShowing ifTrue:[ w := w - self scrollBarThickness ].
- ^ (self hTotalScrollRange - w roundTo: self scrollDeltaWidth) max: 0
!
Item was added:
+ ----- Method: ScrollPane>>hScrollBar (in category 'access') -----
+ hScrollBar
+ ^ hScrollBar!
Item was changed:
----- Method: ScrollPane>>hScrollBarValue: (in category 'scrolling') -----
hScrollBarValue: scrollValue
+ scroller hasSubmorphs ifFalse: [^ self].
+ lockOffset == true ifFalse: [
+ scroller offset: scrollValue @scroller offset y].
- | x |
- lockOffset == true ifTrue: [^ self].
-
- self hIsScrollbarShowing ifFalse:
- [^scroller offset: (0 - self hMargin)@scroller offset y].
- ((x := self hLeftoverScrollRange * scrollValue) <= 0)
- ifTrue:[x := 0 - self hMargin].
- scroller offset: (x at scroller offset y)
!
Item was changed:
----- Method: ScrollPane>>hSetScrollDelta (in category 'geometry') -----
hSetScrollDelta
"Set the ScrollBar deltas, value and interval, based on the current scroll pane size, offset and range."
- | range delta |
+ | delta |
- scroller hasSubmorphs ifFalse:[scrollBar interval: 1.0. ^self].
-
delta := self scrollDeltaWidth.
- range := self hLeftoverScrollRange.
- range = 0 ifTrue: [ hScrollBar scrollDelta: 0.02 pageDelta: 0.2; interval: 1.0; setValue: 0. ^self].
+ hScrollBar
+ truncate: true;
+ scrollDelta: delta
+ pageDelta: 10*delta;
+ maximumValue: self hLeftoverScrollRange;
+ interval: (self hTotalScrollRange = 0
+ ifTrue: [1.0]
+ ifFalse: [scroller width / self hTotalScrollRange]);
+ setValue: scroller offset x.!
- "Set up for one line (for arrow scrolling), or a full pane less one line (for paging)."
-
- hScrollBar
- scrollDelta: (delta / range) asFloat
- pageDelta: ((self innerBounds width - delta) / range) asFloat.
- hScrollBar interval: ((self innerBounds width) / self hTotalScrollRange) asFloat.
- hScrollBar setValue: ((scroller offset x / range) min: 1.0) asFloat.
- !
Item was changed:
----- Method: ScrollPane>>initializeScrollBars (in category 'initialization') -----
initializeScrollBars
"initialize the receiver's scrollBar"
+ (scrollBar := ScrollBar on: self getValue: nil setValue: #vScrollBarValue:)
- (scrollBar := ScrollBar new model: self slotName: 'vScrollBar')
borderWidth: 1;
borderColor: Color black.
+ (hScrollBar := ScrollBar on: self getValue: nil setValue: #hScrollBarValue:)
- (hScrollBar := ScrollBar new model: self slotName: 'hScrollBar')
borderWidth: 1;
borderColor: Color black.
""
scroller := TransformMorph new color: Color transparent.
scroller offset: 0 @ 0.
self addMorph: scroller.
""
scrollBar initializeEmbedded: retractableScrollBar not.
hScrollBar initializeEmbedded: retractableScrollBar not.
retractableScrollBar ifFalse:
[self
addMorph: scrollBar;
addMorph: hScrollBar].
Preferences alwaysShowVScrollbar ifTrue:
[ self alwaysShowVScrollBar: true ].
Preferences alwaysHideHScrollbar
ifTrue:[self hideHScrollBarIndefinitely: true ]
ifFalse:
[Preferences alwaysShowHScrollbar ifTrue:
[ self alwaysShowHScrollBar: true ]].
!
Item was removed:
- ----- Method: ScrollPane>>scrollBar (in category 'testing') -----
- scrollBar
- ^ scrollBar!
Item was changed:
----- Method: ScrollPane>>scrollBy: (in category 'scrolling') -----
scrollBy: delta
"Move the contents in the direction delta."
+ self flag: #negated. "mt: Who uses this and why is does the expected behavor negate the delta?"
+ self vScrollBar scrollBy: delta y negated.
+ self hScrollBar scrollBy: delta x negated.!
- | newYoffset r newXoffset |
-
- "Set the offset on the scroller"
- newYoffset := scroller offset y - delta y max: 0.
- newXoffset := scroller offset x - delta x max: -3.
-
- scroller offset: newXoffset@ newYoffset.
-
- "Update the scrollBars"
- (r := self vLeftoverScrollRange) = 0
- ifTrue: [scrollBar value: 0.0]
- ifFalse: [scrollBar value: newYoffset asFloat / r].
- (r := self hLeftoverScrollRange) = 0
- ifTrue: [hScrollBar value: -3.0]
- ifFalse: [hScrollBar value: newXoffset asFloat / r]
- !
Item was changed:
----- Method: ScrollPane>>scrollByKeyboard: (in category 'event handling') -----
scrollByKeyboard: event
"If event is ctrl+up/down then scroll and answer true"
(event controlKeyPressed or:[event commandKeyPressed]) ifFalse: [^ false].
+ event keyCharacter = Character arrowUp
- event keyValue = 30
ifTrue:
[scrollBar scrollUp: 3.
^ true].
+ event keyCharacter = Character arrowDown
- event keyValue = 31
ifTrue:
[scrollBar scrollDown: 3.
^ true].
+ "event keyCharacter = Character arrowRight
+ ifTrue:
+ [hScrollBar scrollDown: 3.
+ ^ true].
+ event keyCharacter = Character arrowLeft
+ ifTrue:
+ [hScrollBar scrollUp: 3.
+ ^ true]."
^ false!
Item was changed:
----- Method: ScrollPane>>setScrollDeltas (in category 'geometry') -----
setScrollDeltas
"Set the ScrollBar deltas, value and interval, based on the current scroll pane size, offset and range."
+ scroller hasSubmorphs ifFalse: [^ self].
- scroller hasSubmorphs ifFalse:
- [scrollBar interval: 1.0.
- hScrollBar interval: 1.0.
- ^ self].
"NOTE: fullbounds commented out now -- trying to find a case where this expensive step is necessary -- perhaps there is a less expensive way to handle that case."
"scroller fullBounds." "force recompute so that leftoverScrollRange will be up-to-date"
self hideOrShowScrollBars.
+ self vSetScrollDelta.
+ self hSetScrollDelta..
-
- (retractableScrollBar or: [ self vIsScrollbarShowing ]) ifTrue:[ self vSetScrollDelta ].
- (retractableScrollBar or: [ self hIsScrollbarShowing ]) ifTrue:[ self hSetScrollDelta ].
!
Item was changed:
----- Method: ScrollPane>>vExtraScrollRange (in category 'geometry') -----
vExtraScrollRange
"Return the amount of extra blank space to include below the bottom of the scroll content."
+ ^ 0
- "The classic behavior would be ^bounds height - (bounds height * 3 // 4)"
- ^ self scrollDeltaHeight
!
Item was changed:
----- Method: ScrollPane>>vIsScrollable (in category 'geometry testing') -----
vIsScrollable
+ "Return whether the verticle scrollbar is scrollable. If the contents of the pane are too small to scroll, return false."
+
+ ^ self vLeftoverScrollRange > 0!
- "Return whether the verticle scrollbar is scrollable"
-
- "If the contents of the pane are too small to scroll, return false."
- ^ self vLeftoverScrollRange > 0
- "treat a single line as non-scrollable"
- and: [self vTotalScrollRange > (self scrollDeltaHeight * 3/2)]
- !
Item was changed:
----- Method: ScrollPane>>vLeftoverScrollRange (in category 'geometry') -----
vLeftoverScrollRange
"Return the entire scrolling range minus the currently viewed area."
- | h |
+ ^ scroller hasSubmorphs
+ ifFalse: [0]
+ ifTrue: [self vTotalScrollRange - scroller height max: 0]
- scroller hasSubmorphs ifFalse:[^0].
- h := self vScrollBarHeight.
- ^ (self vTotalScrollRange - h roundTo: self scrollDeltaHeight) max: 0
!
Item was added:
+ ----- Method: ScrollPane>>vScrollBar (in category 'access') -----
+ vScrollBar
+ ^ scrollBar!
Item was changed:
----- Method: ScrollPane>>vScrollBarValue: (in category 'scrolling') -----
vScrollBarValue: scrollValue
+
scroller hasSubmorphs ifFalse: [^ self].
lockOffset == true ifFalse: [
+ scroller offset: scroller offset x @ scrollValue].
- scroller offset: (scroller offset x @ (self vLeftoverScrollRange * scrollValue) rounded)].
!
Item was changed:
----- Method: ScrollPane>>vSetScrollDelta (in category 'geometry') -----
vSetScrollDelta
"Set the ScrollBar deltas, value and interval, based on the current scroll pane size, offset and range."
- | range delta |
+ | delta |
- scroller hasSubmorphs ifFalse:[scrollBar interval: 1.0. ^self].
-
delta := self scrollDeltaHeight.
- range := self vLeftoverScrollRange.
- range = 0 ifTrue: [^ scrollBar scrollDelta: 0.02 pageDelta: 0.2; interval: 1.0; setValue: 0].
+ scrollBar
+ truncate: true;
+ scrollDelta: delta
+ pageDelta: 10*delta;
+ maximumValue: self vLeftoverScrollRange;
+ interval: (self vTotalScrollRange = 0
+ ifTrue: [1.0]
+ ifFalse: [scroller height / self vTotalScrollRange]);
+ setValue: scroller offset y.!
- "Set up for one line (for arrow scrolling), or a full pane less one line (for paging)."
- scrollBar scrollDelta: (delta / range) asFloat
- pageDelta: ((self innerBounds height - delta) / range) asFloat.
- scrollBar interval: ((self innerBounds height) / self vTotalScrollRange) asFloat.
- scrollBar setValue: (scroller offset y / range min: 1.0) asFloat.
- !
Item was changed:
(PackageInfo named: 'Morphic') postscript: '(Preferences dictionaryOfPreferences at: #alternativeWindowBoxesLook) defaultValue: false.
"Force SystemProgressMorph to be reset"
SystemProgressMorph initialize; reset.
"Initialize the key bindings and menus"
Editor initialize.
"Retain scrollBar look now that the pref actually does something"
Preferences enable: #gradientScrollBars.
"apply the new icons"
MenuIcons initializeIcons.
TheWorldMainDockingBar updateInstances.
-
"Cleanup old-style preferences here. Remove before new release."
Preferences removePreference: #gradientMenu. "Now in MenuMorph."
Preferences removePreference: #roundedMenuCorners. "Now in MenuMorph."
"Fix clipping bug of open windows. New ones are not affected."
+ TransformMorph allInstances do: [:ea | ea clipSubmorphs: true].
+
+ "Update existing scrollbars."
+ ScrollPane allSubInstances do: [:sc |
+ sc vScrollBar setValueSelector: #vScrollBarValue:.
+ sc hScrollBar setValueSelector: #hScrollBarValue:.
+ sc vSetScrollDelta; hSetScrollDelta].'!
- TransformMorph allInstances do: [:ea | ea clipSubmorphs: true].'!
More information about the Squeak-dev
mailing list
|