Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1010.mcz
==================== Summary ====================
Name: Morphic-mt.1010 Author: mt Time: 6 October 2015, 1:49:59.363 pm UUID: 5584d8ee-d8e6-1041-8d6f-076e24462426 Ancestors: Morphic-cmm.1009
Allow morphs to have custom corner radiuses when using the rounded corner style.
=============== Diff against Morphic-cmm.1009 ===============
Item was changed: ----- Method: Morph>>boundsWithinCorners (in category 'drawing') ----- boundsWithinCorners "Return a single sub-rectangle that lies entirely inside corners that are made by me. Used to identify large regions of window that do not need to be redrawn."
^ self wantsRoundedCorners + ifTrue: [self bounds insetBy: 0@self cornerRadius] - ifTrue: [self bounds insetBy: 0@self class preferredCornerRadius] ifFalse: [self bounds] !
Item was added: + ----- Method: Morph>>cornerRadius (in category 'rounding') ----- + cornerRadius + + ^ self + valueOfProperty: #cornerRadius + ifAbsent: [self class preferredCornerRadius]!
Item was added: + ----- Method: Morph>>cornerRadius: (in category 'rounding') ----- + cornerRadius: radius + + self + setProperty: #cornerRadius + toValue: radius. + + self changed.!
Item was changed: + ----- Method: Morph>>cornerStyle (in category 'rounding') ----- - ----- Method: Morph>>cornerStyle (in category 'visual properties') ----- cornerStyle "Returns one of the following symbols: #square #rounded according to the current corner style."
^ self valueOfProperty: #cornerStyle ifAbsent: [#square]!
Item was changed: ----- Method: Morph>>drawDropHighlightOn: (in category 'drawing') ----- drawDropHighlightOn: aCanvas
self highlightedForDrop ifTrue: [ self wantsRoundedCorners + ifTrue: [aCanvas frameRoundRect: self fullBounds radius: self cornerRadius width: 1 color: self dropHighlightColor] - ifTrue: [aCanvas frameRoundRect: self fullBounds radius: self class preferredCornerRadius width: 1 color: self dropHighlightColor] ifFalse: [aCanvas frameRectangle: self fullBounds color: self dropHighlightColor]].!
Item was changed: ----- Method: Morph>>drawDropShadowOn: (in category 'drawing') ----- drawDropShadowOn: aCanvas "Rectangular shadow with support for rounded corners." | shadowBounds | shadowBounds := self shadowOffset isRectangle ifTrue: [self bounds outsetBy: self shadowOffset] ifFalse: [self bounds translateBy: (self shadowOffset negated max: 0@0)]. "Only redraw the shadow if the shadow area is affected." + ((aCanvas clipRect intersects: shadowBounds) and: [((self bounds insetBy: (self wantsRoundedCorners ifFalse: [0] ifTrue: [self cornerRadius])) containsRect: aCanvas clipRect) not]) - ((aCanvas clipRect intersects: shadowBounds) and: [((self bounds insetBy: (self wantsRoundedCorners ifFalse: [0] ifTrue: [self class preferredCornerRadius])) containsRect: aCanvas clipRect) not]) ifTrue: [ (self hasProperty: #dropShadow) ifFalse: [self updateDropShadowCache]. aCanvas translucentImage: (self valueOfProperty: #dropShadow) at: shadowBounds topLeft].!
Item was changed: ----- Method: Morph>>drawKeyboardFocusIndicationOn: (in category 'drawing') ----- drawKeyboardFocusIndicationOn: aCanvas
self wantsRoundedCorners + ifTrue: [aCanvas frameRoundRect: self bounds radius: self cornerRadius width: 3 "self borderStyle width" color: self keyboardFocusColor] - ifTrue: [aCanvas frameRoundRect: self bounds radius: self class preferredCornerRadius width: 3 "self borderStyle width" color: self keyboardFocusColor] ifFalse: [aCanvas frameRectangle: self bounds width: 3 "self borderStyle width" color: self keyboardFocusColor].!
Item was changed: ----- Method: Morph>>drawMouseDownHighlightOn: (in category 'drawing') ----- drawMouseDownHighlightOn: aCanvas
self highlightedForMouseDown ifTrue: [ self wantsRoundedCorners + ifTrue: [aCanvas frameRoundRect: self fullBounds radius: self cornerRadius width: 1 color: self color darker darker] - ifTrue: [aCanvas frameRoundRect: self fullBounds radius: self class preferredCornerRadius width: 1 color: self color darker darker] ifFalse: [aCanvas frameRectangle: self fullBounds color: self color darker darker]].!
Item was changed: ----- Method: Morph>>drawOn: (in category 'drawing') ----- drawOn: aCanvas
self wantsRoundedCorners + ifTrue: [aCanvas frameAndFillRoundRect: self bounds radius: self cornerRadius fillStyle: self fillStyle borderWidth: self borderStyle width borderColor: self borderStyle color] - ifTrue: [aCanvas frameAndFillRoundRect: self bounds radius: self class preferredCornerRadius fillStyle: self fillStyle borderWidth: self borderStyle width borderColor: self borderStyle color] ifFalse: [aCanvas fillRectangle: self bounds fillStyle: self fillStyle borderStyle: self borderStyle]. !
Item was changed: ----- Method: Morph>>updateDropShadowCache (in category 'drawing') ----- updateDropShadowCache
| shadowBounds offset form canvas drawBlock localBounds mask maskCanvas | shadowBounds := self shadowOffset isRectangle ifTrue: [0@0 corner: (self bounds outsetBy: self shadowOffset) extent] ifFalse: [0@0 corner: self extent + self shadowOffset abs]. offset := self shadowOffset isRectangle ifTrue: [0@0] ifFalse: [self shadowOffset max: 0@0]. localBounds := self shadowOffset isRectangle ifTrue: [self shadowOffset topLeft extent: self extent] ifFalse: [(self shadowOffset negated max: 0@0) extent: self extent]. form := Form extent: shadowBounds extent depth: Display depth. canvas := form getCanvas.
drawBlock := self useSoftDropShadow ifFalse: [ [:c | self wantsRoundedCorners + ifTrue: [c fillRoundRect: localBounds radius: self cornerRadius fillStyle: self shadowColor] - ifTrue: [c fillRoundRect: localBounds radius: self class preferredCornerRadius fillStyle: self shadowColor] ifFalse: [c fillRectangle: localBounds fillStyle: self shadowColor]]] ifTrue: [ [:c | self wantsRoundedCorners ifTrue: [0 to: 9 do: [:i | c fillRoundRect: (shadowBounds insetBy: i) + radius: (self cornerRadius max: 20) -i - radius: (self class preferredCornerRadius max: 20) -i fillStyle: (self shadowColor alpha: self shadowColor alpha * (i+1))]] ifFalse: [0 to: 9 do: [:i | c fillRoundRect: (shadowBounds insetBy: i) radius: 20-i fillStyle: (self shadowColor alpha: self shadowColor alpha * (i+1))]]]]. canvas translateBy: offset during: [ :shadowCanvas | drawBlock value: shadowCanvas].
"Support transparent morph colors without having the shadow to shine through.." mask := Form extent: shadowBounds extent depth: Display depth. maskCanvas := mask getCanvas. self wantsRoundedCorners + ifTrue: [maskCanvas fillRoundRect: (localBounds insetBy: self borderWidth) radius: self cornerRadius fillStyle: Color black] - ifTrue: [maskCanvas fillRoundRect: (localBounds insetBy: self borderWidth) radius: self class preferredCornerRadius fillStyle: Color black] ifFalse: [maskCanvas fillRectangle: (localBounds insetBy: self borderWidth) fillStyle: Color black]. mask displayOn: form at: 0@0 rule: Form erase. self setProperty: #dropShadow toValue: form.!
Item was changed: ----- Method: NewBalloonMorph>>drawDropShadowOn: (in category 'drawing') ----- drawDropShadowOn: aCanvas
aCanvas translateBy: self shadowOffset during: [ :shadowCanvas | (shadowCanvas isVisible: self bubbleBounds) ifTrue: [ self wantsRoundedCorners + ifTrue: [shadowCanvas fillRoundRect: self bubbleBounds radius: self cornerRadius fillStyle: self shadowColor] - ifTrue: [shadowCanvas fillRoundRect: self bubbleBounds radius: self class preferredCornerRadius fillStyle: self shadowColor] ifFalse: [shadowCanvas fillRectangle: self bubbleBounds fillStyle: self shadowColor]]. self hasTail ifTrue: [ shadowCanvas drawPolygon: self verticesForTail fillStyle: self shadowColor]].
!
Item was changed: ----- Method: NewBalloonMorph>>drawOn: (in category 'drawing') ----- drawOn: aCanvas
"Bubble." self wantsRoundedCorners ifTrue: [aCanvas frameAndFillRoundRect: self bubbleBounds + radius: self cornerRadius fillStyle: self fillStyle borderWidth: self borderStyle width borderColor: self borderStyle color] - radius: self class preferredCornerRadius fillStyle: self fillStyle borderWidth: self borderStyle width borderColor: self borderStyle color] ifFalse: [aCanvas fillRectangle: self bubbleBounds fillStyle: self fillStyle borderStyle: self borderStyle].
"Tail." self hasTail ifTrue: [ self verticesForTail in: [:points | | pixelOffset | pixelOffset := points first y < points second y ifFalse: [points first x < points second x ifTrue: [self borderStyle width negated @ self borderStyle width] "bottomLeft" ifFalse: [self borderStyle width @ self borderStyle width]] "bottomRight" ifTrue: [points first x < points second x ifTrue: [self borderStyle width negated @ self borderStyle width negated] "topLeft" ifFalse: [self borderStyle width @ self borderStyle width negated]]. "topRight"
aCanvas drawPolygon: points fillStyle: self fillStyle. aCanvas line: points first to: points second + pixelOffset width: self borderStyle width color: self borderStyle color. aCanvas line: points first to: points third + pixelOffset width: self borderStyle width color: self borderStyle color]]!
Item was changed: ----- Method: NewBalloonMorph>>verticesForTail (in category 'drawing') ----- verticesForTail
| offset factorX factorY tpos bpos | offset := 5 + (self wantsRoundedCorners + ifTrue: [self cornerRadius] - ifTrue: [self class preferredCornerRadius] ifFalse: [0]). tpos := self tailPosition. factorX := tpos x < self center x ifTrue: [1] ifFalse: [-1]. factorY := tpos y > self center y ifTrue: [1] ifFalse: [-1]. bpos := self bubbleBounds perform: self orientation. ^ { tpos. bpos + (((offset + self tailWidth) * factorX) @ (self borderStyle width negated * factorY)). bpos + ((offset * factorX) @ (self borderStyle width negated * factorY)).}!
Item was changed: ----- Method: PluggableButtonMorph>>drawBackgroundOn: (in category 'drawing') ----- drawBackgroundOn: aCanvas | cc gradient borderColor fill | cc := self color. cc isTransparent ifTrue:[cc := Color gray: 0.9]. self enabled ifFalse:[cc := Color lightGray]. cc brightness > 0.9 ifTrue:[cc := cc adjustBrightness: 0.9 - cc brightness]. showSelectionFeedback ifTrue:[ borderColor := cc muchDarker. gradient := GradientFillStyle ramp: { 0.0 -> cc muchDarker. 0.1-> (cc adjustBrightness: -0.2). 0.5 -> cc. 0.9-> (cc adjustBrightness: -0.1). 1 -> cc muchDarker}. cc := cc muchDarker. ] ifFalse:[ borderColor := Color lightGray. gradient := GradientFillStyle ramp: { 0.0 -> Color white. 0.1-> (cc adjustBrightness: 0.05). 0.6 -> (cc darker)}. ]. gradient origin: bounds topLeft. gradient direction: 0@self height.
PluggableButtonMorph gradientButton ifFalse: [fill := SolidFillStyle color: cc] ifTrue: [fill := gradient].
^ self wantsRoundedCorners ifTrue: [aCanvas frameAndFillRoundRect: self bounds + radius: self cornerRadius - radius: self class preferredCornerRadius fillStyle: fill borderWidth: 1 borderColor: borderColor] ifFalse: [aCanvas frameAndFillRectangle: self bounds fillColor: fill asColor borderWidth: 1 borderColor: borderColor darker; fillRectangle: self innerBounds fillStyle: fill]!
Item was changed: ----- Method: UserDialogBoxMorph>>drawSubmorphsOn: (in category 'drawing') ----- drawSubmorphsOn: aCanvas
super drawSubmorphsOn: aCanvas.
self wantsRoundedCorners ifTrue: [ "Overdraw lower part of title bar to hide bottom corners." aCanvas + fillRectangle: (self submorphs first "titleRow" bottomLeft - (-1 @ self submorphs first cornerRadius) - fillRectangle: (self submorphs first "titleRow" bottomLeft - (-1 @ Morph preferredCornerRadius) corner: self submorphs first "titleRow" bottomRight - (1@0)) color: self color].!
Item was changed: ----- Method: UserDialogBoxMorph>>initialize (in category 'initialization') ----- initialize
| titleRow cc | super initialize. self color: Color white. self listDirection: #topToBottom; wrapCentering: #center; hResizing: #shrinkWrap; vResizing: #shrinkWrap. self layoutInset: -1 @ -1; cellInset: 5@5. self borderStyle: BorderStyle thinGray. self setProperty: #indicateKeyboardFocus: toValue: #never. FillInTheBlankMorph roundedDialogCorners ifTrue: [self useRoundedCorners].
self hasDropShadow: Preferences menuAppearance3d. self useSoftDropShadow ifFalse: [ self shadowColor: (TranslucentColor r: 0.0 g: 0.0 b: 0.0 alpha: 0.666); shadowOffset: 1 @ 1] ifTrue: [ self shadowColor: (TranslucentColor r: 0.0 g: 0.0 b: 0.0 alpha: 0.01); shadowOffset: (10@8 corner: 10@12)].
cc := Color gray: 0.8. titleRow := AlignmentMorph newRow. titleRow hResizing: #spaceFill; vResizing: #shrinkWrap.
self cornerStyle == #rounded ifTrue: [titleRow useRoundedCorners].
titleRow borderStyle: BorderStyle thinGray. + titleRow layoutInset: (5@5 corner: (2@ (5 + (titleRow cornerStyle == #rounded ifTrue: [titleRow cornerRadius] ifFalse: [0])))). - titleRow layoutInset: (5@5 corner: (2@ (5 + (titleRow cornerStyle == #rounded ifTrue: [Morph preferredCornerRadius] ifFalse: [0])))). titleRow color: cc. titleRow fillStyle: self titleGradient.
titleMorph := StringMorph new. titleMorph emphasis: 1. titleRow addMorph: titleMorph. labelMorph := TextMorph new. labelMorph margins: (Preferences standardButtonFont widthOf: $x) * 2 @ 0. labelMorph lock. buttonRow := AlignmentMorph newRow vResizing: #rigid; height: (Preferences standardButtonFont height + 20); hResizing: #spaceFill; layoutInset: (((Preferences standardButtonFont widthOf: $x) * 2 @ 0) corner: ((Preferences standardButtonFont widthOf: $x) * 2 @ 10)); cellInset: (Preferences standardButtonFont widthOf: $x) * 2. buttonRow color: Color transparent. self addMorphBack: titleRow ; addMorphBack: labelMorph ; addMorphBack: buttonRow. keyMap := Dictionary new!
packages@lists.squeakfoundation.org