The Trunk: Morphic-mt.794.mcz

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

The Trunk: Morphic-mt.794.mcz

commits-2
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.794.mcz

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

Name: Morphic-mt.794
Author: mt
Time: 31 March 2015, 11:38:42.253 am
UUID: 765a2201-af4c-0948-b90d-72414d335160
Ancestors: Morphic-mt.793

New-style balloon morph added and used. Can be switched back to old-style balloon morphs via preferences.

New-style balloon morphs support:
- text (not only strings)
- layouting via text paragraph (not hard-cutted via: #noLineLongerThan:)
- positioning at current hand position (if not supplied with other reference point)

In general, new-style balloon morphs have an improved readability.

=============== Diff against Morphic-mt.793 ===============

Item was changed:
  ----- Method: BalloonMorph class>>string:for:corner: (in category 'instance creation') -----
  string: str for: morph corner: cornerName
  "Make up and return a balloon for morph. Find the quadrant that
  clips the text the least, using cornerName as a tie-breaker. tk 9/12/97"
  | tm vertices |
+ tm := self
+ getTextMorph: (str asString withNoLineLongerThan: Preferences maxBalloonHelpLineLength)
+ for: morph.
- tm := self getTextMorph: str for: morph.
  vertices := self getVertices: tm bounds.
  vertices := self
  getBestLocation: vertices
  for: morph
  corner: cornerName.
  ^ self new color: morph balloonColor;
  setVertices: vertices;
  addMorph: tm;
  setTarget: morph!

Item was changed:
  ----- Method: MenuMorph>>showKeyboardHelp (in category 'keystroke helpers') -----
  showKeyboardHelp
 
  | help |
+ help := self balloonMorphClass
+ string: 'Enter text to narrow selection\down to matching items ' withCRs
- help := BalloonMorph
- string: 'Enter text to\narrow selection down\to matching items ' withCRs
  for: self
  corner: #topLeft.
+ help popUpAt: self topCenter forHand: self activeHand!
- help popUpForHand: self activeHand!

Item was added:
+ ----- Method: Morph>>balloonMorphClass (in category 'halos and balloon help') -----
+ balloonMorphClass
+
+ ^ NewBalloonMorph useNewBalloonMorph
+ ifTrue: [NewBalloonMorph]
+ ifFalse: [BalloonMorph]!

Item was changed:
  ----- Method: Morph>>showBalloon:hand: (in category 'halos and balloon help') -----
  showBalloon: msgString hand: aHand
  "Pop up a balloon containing the given string,
  first removing any existing BalloonMorphs in the world."
 
  | w balloon h |
  (w := self world) ifNil: [^ self].
  h := aHand.
  h ifNil:[
  h := w activeHand].
+ balloon := self balloonMorphClass
+ string: msgString
- balloon := BalloonMorph
- string: (msgString asString withNoLineLongerThan: Preferences maxBalloonHelpLineLength)
  for: self balloonHelpAligner.
  balloon popUpFor: self hand: h.!

Item was added:
+ Morph subclass: #NewBalloonMorph
+ instanceVariableNames: 'balloonOwner textMorph maximumWidth orientation hasTail'
+ classVariableNames: 'UseNewBalloonMorph'
+ poolDictionaries: ''
+ category: 'Morphic-Widgets'!
+
+ !NewBalloonMorph commentStamp: 'mt 3/31/2015 10:15' prior: 0!
+ A balloon is a bubble with an optional tail. It contains rich text, which describes something about its balloon-owner.!

Item was added:
+ ----- Method: NewBalloonMorph class>>string:for: (in category 'instance creation') -----
+ string: str for: morph
+
+ ^ self string: str for: morph corner: #bottomLeft!

Item was added:
+ ----- Method: NewBalloonMorph class>>string:for:corner: (in category 'instance creation') -----
+ string: message for: morph corner: symbol
+
+ ^ self new
+ balloonOwner: morph;
+ setText: message;
+ orientation: symbol;
+ yourself!

Item was added:
+ ----- Method: NewBalloonMorph class>>useNewBalloonMorph (in category 'preferences') -----
+ useNewBalloonMorph
+
+ <preference: 'Use new-style balloon morphs'
+ category: #Morphic
+ description: 'The new-style balloon morphs are improved for better reading quality and support rich text.'
+ type: #Boolean>
+ ^ UseNewBalloonMorph ifNil: [true]!

Item was added:
+ ----- Method: NewBalloonMorph class>>useNewBalloonMorph: (in category 'preferences') -----
+ useNewBalloonMorph: aBoolean
+
+ UseNewBalloonMorph := aBoolean.!

Item was added:
+ ----- Method: NewBalloonMorph>>balloonOwner (in category 'accessing') -----
+ balloonOwner
+
+ ^ balloonOwner!

Item was added:
+ ----- Method: NewBalloonMorph>>balloonOwner: (in category 'accessing') -----
+ balloonOwner: aMorph
+
+ balloonOwner := aMorph.!

Item was added:
+ ----- Method: NewBalloonMorph>>bubbleBounds (in category 'geometry') -----
+ bubbleBounds
+
+ ^ self bounds insetBy: (0 @ self tailHeight corner: 0 @ self tailHeight)!

Item was added:
+ ----- Method: NewBalloonMorph>>bubbleInset (in category 'geometry') -----
+ bubbleInset
+
+ ^ 5@2!

Item was added:
+ ----- Method: NewBalloonMorph>>defaultBorderColor (in category 'initialization') -----
+ defaultBorderColor
+
+ ^ self defaultColor muchDarker"Color black"!

Item was added:
+ ----- Method: NewBalloonMorph>>defaultBorderWidth (in category 'initialization') -----
+ defaultBorderWidth
+
+ ^ 1!

Item was added:
+ ----- Method: NewBalloonMorph>>defaultColor (in category 'initialization') -----
+ defaultColor
+
+ ^ BalloonMorph balloonColor!

Item was added:
+ ----- 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 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 added:
+ ----- Method: NewBalloonMorph>>drawOn: (in category 'drawing') -----
+ drawOn: aCanvas
+
+ "Bubble."
+ self wantsRoundedCorners
+ ifTrue: [aCanvas
+ frameAndFillRoundRect: self bubbleBounds
+ 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 added:
+ ----- Method: NewBalloonMorph>>hasTail (in category 'accessing') -----
+ hasTail
+
+ ^ hasTail ifNil: [true]!

Item was added:
+ ----- Method: NewBalloonMorph>>hasTail: (in category 'accessing') -----
+ hasTail: aBoolean
+
+ hasTail := aBoolean.!

Item was added:
+ ----- Method: NewBalloonMorph>>initialize (in category 'initialization') -----
+ initialize
+
+ super initialize.
+
+ self
+ borderWidth: self defaultBorderWidth;
+ borderColor: self defaultBorderColor;
+ color: (self defaultColor alpha: 1.0); "no alpha due to drop shadow"
+ hasDropShadow: true;
+ shadowOffset: 1@1;
+ shadowColor: (self color muchDarker muchDarker alpha: 0.333);
+ orientation: #bottomLeft.
+
+ MenuMorph roundedMenuCorners
+ ifTrue: [self cornerStyle: #rounded].
+
+ textMorph := TextMorph new
+ wrapFlag: false;
+ lock;
+ yourself.
+
+ self addMorph: textMorph.!

Item was added:
+ ----- Method: NewBalloonMorph>>maximumWidth (in category 'accessing') -----
+ maximumWidth
+
+ ^ maximumWidth ifNil: [
+ maximumWidth := (self balloonOwner balloonFont widthOf: $m) * Preferences maxBalloonHelpLineLength]!

Item was added:
+ ----- Method: NewBalloonMorph>>maximumWidth: (in category 'accessing') -----
+ maximumWidth: anInteger
+
+ maximumWidth := anInteger.!

Item was added:
+ ----- Method: NewBalloonMorph>>morphicLayerNumber (in category 'WiW support') -----
+ morphicLayerNumber
+
+ "helpful for insuring some morphs always appear in front of or behind others.
+ smaller numbers are in front"
+
+ ^5 "Balloons are very front-like things"!

Item was added:
+ ----- Method: NewBalloonMorph>>move: (in category 'geometry') -----
+ move: targetPoint
+
+ self perform: (self orientation, #:) asSymbol with: targetPoint.!

Item was added:
+ ----- Method: NewBalloonMorph>>orientation (in category 'accessing') -----
+ orientation
+ "Encodes the position of the tail. #topLeft, #topRight, #bottomLeft, #bottomRight"
+
+ ^ orientation!

Item was added:
+ ----- Method: NewBalloonMorph>>orientation: (in category 'accessing') -----
+ orientation: aSymbol
+
+ orientation := aSymbol.
+ self changed.!

Item was added:
+ ----- Method: NewBalloonMorph>>popUpAt:forHand: (in category 'initialization') -----
+ popUpAt: point forHand: aHand
+ "Pop up the receiver as balloon help for the given hand"
+
+ #(bottomLeft bottomRight topLeft topRight) detect: [:nextOrientation |
+ self orientation: nextOrientation.
+ self move: point.
+ self bounds: (self bounds translatedToBeWithin: aHand world bounds).
+ (self bounds perform: self orientation) = point] ifNone: ["Keep last try."].
+
+ aHand world addMorphFront: self.
+ aHand balloonHelp: self.!

Item was added:
+ ----- Method: NewBalloonMorph>>popUpFor:hand: (in category 'initialization') -----
+ popUpFor: aMorph hand: aHand
+ "Pop up the receiver as balloon help for the given hand"
+
+ self balloonOwner: aMorph.
+ self popUpForHand: aHand.!

Item was added:
+ ----- Method: NewBalloonMorph>>popUpForHand: (in category 'initialization') -----
+ popUpForHand: aHand
+
+ self popUpAt: aHand position forHand: aHand.!

Item was added:
+ ----- Method: NewBalloonMorph>>setText: (in category 'initialization') -----
+ setText: stringOrText
+
+ | text |
+ text := stringOrText asText.
+ text addAttribute: (TextFontReference toFont: (self balloonOwner ifNil: [BalloonMorph]) balloonFont).
+
+ self textMorph wrapFlag: false.
+ self textMorph newContents: text.
+ self textMorph fullBounds.
+
+ (self maximumWidth > 0 and: [self textMorph width > self maximumWidth])
+ ifTrue: [
+ self textMorph
+ wrapFlag: true;
+ width: self maximumWidth].
+
+ self updateLayout.!

Item was added:
+ ----- Method: NewBalloonMorph>>tailHeight (in category 'geometry') -----
+ tailHeight
+
+ ^ 8!

Item was added:
+ ----- Method: NewBalloonMorph>>tailPosition (in category 'geometry') -----
+ tailPosition
+
+ ^ self innerBounds perform: self orientation!

Item was added:
+ ----- Method: NewBalloonMorph>>tailWidth (in category 'geometry') -----
+ tailWidth
+
+ ^ 15!

Item was added:
+ ----- Method: NewBalloonMorph>>textMorph (in category 'accessing - ui') -----
+ textMorph
+
+ ^ textMorph!

Item was added:
+ ----- Method: NewBalloonMorph>>updateLayout (in category 'layout') -----
+ updateLayout
+
+ self textMorph fullBounds.
+ self extent: self textMorph extent + (2* self bubbleInset) +  (0 @ (2*self tailHeight)).
+ self textMorph center: self center.!

Item was added:
+ ----- Method: NewBalloonMorph>>verticesForTail (in category 'drawing') -----
+ verticesForTail
+
+ | offset factorX factorY tpos bpos |
+ offset := 5 + (self wantsRoundedCorners
+ 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)).}!


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.794.mcz

marcel.taeumel (old)
Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.794.mcz

marcel.taeumel (old)


Having (rich) text support, we could display a method's source code in a balloon help (e.g. in a system browser).

Best,
Marcel
Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.794.mcz

Eliot Miranda-2
In reply to this post by commits-2
I'm getting a failed update:

This package depends on the following classes:
  NewBalloonMorph
You must resolve these dependencies before you will be able to load these definitions: 
  NewBalloonMorph>>isBalloonHelp

latest update: #14275

On Tue, Mar 31, 2015 at 2:38 AM, <[hidden email]> wrote:
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.794.mcz

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

Name: Morphic-mt.794
Author: mt
Time: 31 March 2015, 11:38:42.253 am
UUID: 765a2201-af4c-0948-b90d-72414d335160
Ancestors: Morphic-mt.793

New-style balloon morph added and used. Can be switched back to old-style balloon morphs via preferences.

New-style balloon morphs support:
- text (not only strings)
- layouting via text paragraph (not hard-cutted via: #noLineLongerThan:)
- positioning at current hand position (if not supplied with other reference point)

In general, new-style balloon morphs have an improved readability.

=============== Diff against Morphic-mt.793 ===============

Item was changed:
  ----- Method: BalloonMorph class>>string:for:corner: (in category 'instance creation') -----
  string: str for: morph corner: cornerName
        "Make up and return a balloon for morph. Find the quadrant that
        clips the text the least, using cornerName as a tie-breaker. tk 9/12/97"
        | tm vertices |
+       tm := self
+               getTextMorph: (str asString withNoLineLongerThan: Preferences maxBalloonHelpLineLength)
+               for: morph.
-       tm := self getTextMorph: str for: morph.
        vertices := self getVertices: tm bounds.
        vertices := self
                                getBestLocation: vertices
                                for: morph
                                corner: cornerName.
        ^ self new color: morph balloonColor;
                 setVertices: vertices;
                 addMorph: tm;
                 setTarget: morph!

Item was changed:
  ----- Method: MenuMorph>>showKeyboardHelp (in category 'keystroke helpers') -----
  showKeyboardHelp

        | help |
+       help := self balloonMorphClass
+               string: 'Enter text to narrow selection\down to matching items ' withCRs
-       help := BalloonMorph
-               string: 'Enter text to\narrow selection down\to matching items ' withCRs
                for: self
                corner: #topLeft.
+       help popUpAt: self topCenter forHand: self activeHand!
-       help popUpForHand: self activeHand!

Item was added:
+ ----- Method: Morph>>balloonMorphClass (in category 'halos and balloon help') -----
+ balloonMorphClass
+
+       ^ NewBalloonMorph useNewBalloonMorph
+               ifTrue: [NewBalloonMorph]
+               ifFalse: [BalloonMorph]!

Item was changed:
  ----- Method: Morph>>showBalloon:hand: (in category 'halos and balloon help') -----
  showBalloon: msgString hand: aHand
        "Pop up a balloon containing the given string,
        first removing any existing BalloonMorphs in the world."

        | w balloon h |
        (w := self world) ifNil: [^ self].
        h := aHand.
        h ifNil:[
                h := w activeHand].
+       balloon := self balloonMorphClass
+               string: msgString
-       balloon := BalloonMorph
-               string: (msgString asString withNoLineLongerThan: Preferences maxBalloonHelpLineLength)
                for: self balloonHelpAligner.
        balloon popUpFor: self hand: h.!

Item was added:
+ Morph subclass: #NewBalloonMorph
+       instanceVariableNames: 'balloonOwner textMorph maximumWidth orientation hasTail'
+       classVariableNames: 'UseNewBalloonMorph'
+       poolDictionaries: ''
+       category: 'Morphic-Widgets'!
+
+ !NewBalloonMorph commentStamp: 'mt 3/31/2015 10:15' prior: 0!
+ A balloon is a bubble with an optional tail. It contains rich text, which describes something about its balloon-owner.!

Item was added:
+ ----- Method: NewBalloonMorph class>>string:for: (in category 'instance creation') -----
+ string: str for: morph
+
+       ^ self string: str for: morph corner: #bottomLeft!

Item was added:
+ ----- Method: NewBalloonMorph class>>string:for:corner: (in category 'instance creation') -----
+ string: message for: morph corner: symbol
+
+       ^ self new
+               balloonOwner: morph;
+               setText: message;
+               orientation: symbol;
+               yourself!

Item was added:
+ ----- Method: NewBalloonMorph class>>useNewBalloonMorph (in category 'preferences') -----
+ useNewBalloonMorph
+
+       <preference: 'Use new-style balloon morphs'
+               category: #Morphic
+               description: 'The new-style balloon morphs are improved for better reading quality and support rich text.'
+               type: #Boolean>
+       ^ UseNewBalloonMorph ifNil: [true]!

Item was added:
+ ----- Method: NewBalloonMorph class>>useNewBalloonMorph: (in category 'preferences') -----
+ useNewBalloonMorph: aBoolean
+
+       UseNewBalloonMorph := aBoolean.!

Item was added:
+ ----- Method: NewBalloonMorph>>balloonOwner (in category 'accessing') -----
+ balloonOwner
+
+       ^ balloonOwner!

Item was added:
+ ----- Method: NewBalloonMorph>>balloonOwner: (in category 'accessing') -----
+ balloonOwner: aMorph
+
+       balloonOwner := aMorph.!

Item was added:
+ ----- Method: NewBalloonMorph>>bubbleBounds (in category 'geometry') -----
+ bubbleBounds
+
+       ^ self bounds insetBy: (0 @ self tailHeight corner: 0 @ self tailHeight)!

Item was added:
+ ----- Method: NewBalloonMorph>>bubbleInset (in category 'geometry') -----
+ bubbleInset
+
+       ^ 5@2!

Item was added:
+ ----- Method: NewBalloonMorph>>defaultBorderColor (in category 'initialization') -----
+ defaultBorderColor
+
+       ^ self defaultColor muchDarker"Color black"!

Item was added:
+ ----- Method: NewBalloonMorph>>defaultBorderWidth (in category 'initialization') -----
+ defaultBorderWidth
+
+       ^ 1!

Item was added:
+ ----- Method: NewBalloonMorph>>defaultColor (in category 'initialization') -----
+ defaultColor
+
+       ^ BalloonMorph balloonColor!

Item was added:
+ ----- 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 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 added:
+ ----- Method: NewBalloonMorph>>drawOn: (in category 'drawing') -----
+ drawOn: aCanvas
+
+       "Bubble."
+       self wantsRoundedCorners
+               ifTrue: [aCanvas
+                       frameAndFillRoundRect: self bubbleBounds
+                       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 added:
+ ----- Method: NewBalloonMorph>>hasTail (in category 'accessing') -----
+ hasTail
+
+       ^ hasTail ifNil: [true]!

Item was added:
+ ----- Method: NewBalloonMorph>>hasTail: (in category 'accessing') -----
+ hasTail: aBoolean
+
+       hasTail := aBoolean.!

Item was added:
+ ----- Method: NewBalloonMorph>>initialize (in category 'initialization') -----
+ initialize
+
+       super initialize.
+
+       self
+               borderWidth: self defaultBorderWidth;
+               borderColor: self defaultBorderColor;
+               color: (self defaultColor alpha: 1.0); "no alpha due to drop shadow"
+               hasDropShadow: true;
+               shadowOffset: 1@1;
+               shadowColor: (self color muchDarker muchDarker alpha: 0.333);
+               orientation: #bottomLeft.
+
+       MenuMorph roundedMenuCorners
+               ifTrue: [self cornerStyle: #rounded].
+
+       textMorph := TextMorph new
+               wrapFlag: false;
+               lock;
+               yourself.
+
+       self addMorph: textMorph.!

Item was added:
+ ----- Method: NewBalloonMorph>>maximumWidth (in category 'accessing') -----
+ maximumWidth
+
+       ^ maximumWidth ifNil: [
+               maximumWidth := (self balloonOwner balloonFont widthOf: $m) * Preferences maxBalloonHelpLineLength]!

Item was added:
+ ----- Method: NewBalloonMorph>>maximumWidth: (in category 'accessing') -----
+ maximumWidth: anInteger
+
+       maximumWidth := anInteger.!

Item was added:
+ ----- Method: NewBalloonMorph>>morphicLayerNumber (in category 'WiW support') -----
+ morphicLayerNumber
+
+       "helpful for insuring some morphs always appear in front of or behind others.
+       smaller numbers are in front"
+
+       ^5              "Balloons are very front-like things"!

Item was added:
+ ----- Method: NewBalloonMorph>>move: (in category 'geometry') -----
+ move: targetPoint
+
+       self perform: (self orientation, #:) asSymbol with: targetPoint.!

Item was added:
+ ----- Method: NewBalloonMorph>>orientation (in category 'accessing') -----
+ orientation
+       "Encodes the position of the tail. #topLeft, #topRight, #bottomLeft, #bottomRight"
+
+       ^ orientation!

Item was added:
+ ----- Method: NewBalloonMorph>>orientation: (in category 'accessing') -----
+ orientation: aSymbol
+
+       orientation := aSymbol.
+       self changed.!

Item was added:
+ ----- Method: NewBalloonMorph>>popUpAt:forHand: (in category 'initialization') -----
+ popUpAt: point forHand: aHand
+       "Pop up the receiver as balloon help for the given hand"
+
+       #(bottomLeft bottomRight topLeft topRight) detect: [:nextOrientation |
+               self orientation: nextOrientation.
+               self move: point.
+               self bounds: (self bounds translatedToBeWithin: aHand world bounds).
+               (self bounds perform: self orientation) = point] ifNone: ["Keep last try."].
+
+       aHand world addMorphFront: self.
+       aHand balloonHelp: self.!

Item was added:
+ ----- Method: NewBalloonMorph>>popUpFor:hand: (in category 'initialization') -----
+ popUpFor: aMorph hand: aHand
+       "Pop up the receiver as balloon help for the given hand"
+
+       self balloonOwner: aMorph.
+       self popUpForHand: aHand.!

Item was added:
+ ----- Method: NewBalloonMorph>>popUpForHand: (in category 'initialization') -----
+ popUpForHand: aHand
+
+       self popUpAt: aHand position forHand: aHand.!

Item was added:
+ ----- Method: NewBalloonMorph>>setText: (in category 'initialization') -----
+ setText: stringOrText
+
+       | text |
+       text := stringOrText asText.
+       text addAttribute: (TextFontReference toFont: (self balloonOwner ifNil: [BalloonMorph]) balloonFont).
+
+       self textMorph wrapFlag: false.
+       self textMorph newContents: text.
+       self textMorph fullBounds.
+
+       (self maximumWidth > 0 and: [self textMorph width > self maximumWidth])
+               ifTrue: [
+                       self textMorph
+                               wrapFlag: true;
+                               width: self maximumWidth].
+
+       self updateLayout.!

Item was added:
+ ----- Method: NewBalloonMorph>>tailHeight (in category 'geometry') -----
+ tailHeight
+
+       ^ 8!

Item was added:
+ ----- Method: NewBalloonMorph>>tailPosition (in category 'geometry') -----
+ tailPosition
+
+       ^ self innerBounds perform: self orientation!

Item was added:
+ ----- Method: NewBalloonMorph>>tailWidth (in category 'geometry') -----
+ tailWidth
+
+       ^ 15!

Item was added:
+ ----- Method: NewBalloonMorph>>textMorph (in category 'accessing - ui') -----
+ textMorph
+
+       ^ textMorph!

Item was added:
+ ----- Method: NewBalloonMorph>>updateLayout (in category 'layout') -----
+ updateLayout
+
+       self textMorph fullBounds.
+       self extent: self textMorph extent + (2* self bubbleInset) +  (0 @ (2*self tailHeight)).
+       self textMorph center: self center.!

Item was added:
+ ----- Method: NewBalloonMorph>>verticesForTail (in category 'drawing') -----
+ verticesForTail
+
+       | offset factorX factorY tpos bpos |
+       offset := 5 + (self wantsRoundedCorners
+               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)).}!





--
best,
Eliot


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.794.mcz

Eliot Miranda-2
I had to manually load an up-to-date Morphic version before the update could succeed cuz MorphicExtras has an extension method on NewBalloonMorph but there's no update map.

On Tue, Mar 31, 2015 at 12:15 PM, Eliot Miranda <[hidden email]> wrote:
I'm getting a failed update:

This package depends on the following classes:
  NewBalloonMorph
You must resolve these dependencies before you will be able to load these definitions: 
  NewBalloonMorph>>isBalloonHelp

latest update: #14275

On Tue, Mar 31, 2015 at 2:38 AM, <[hidden email]> wrote:
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.794.mcz

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

Name: Morphic-mt.794
Author: mt
Time: 31 March 2015, 11:38:42.253 am
UUID: 765a2201-af4c-0948-b90d-72414d335160
Ancestors: Morphic-mt.793

New-style balloon morph added and used. Can be switched back to old-style balloon morphs via preferences.

New-style balloon morphs support:
- text (not only strings)
- layouting via text paragraph (not hard-cutted via: #noLineLongerThan:)
- positioning at current hand position (if not supplied with other reference point)

In general, new-style balloon morphs have an improved readability.

=============== Diff against Morphic-mt.793 ===============

Item was changed:
  ----- Method: BalloonMorph class>>string:for:corner: (in category 'instance creation') -----
  string: str for: morph corner: cornerName
        "Make up and return a balloon for morph. Find the quadrant that
        clips the text the least, using cornerName as a tie-breaker. tk 9/12/97"
        | tm vertices |
+       tm := self
+               getTextMorph: (str asString withNoLineLongerThan: Preferences maxBalloonHelpLineLength)
+               for: morph.
-       tm := self getTextMorph: str for: morph.
        vertices := self getVertices: tm bounds.
        vertices := self
                                getBestLocation: vertices
                                for: morph
                                corner: cornerName.
        ^ self new color: morph balloonColor;
                 setVertices: vertices;
                 addMorph: tm;
                 setTarget: morph!

Item was changed:
  ----- Method: MenuMorph>>showKeyboardHelp (in category 'keystroke helpers') -----
  showKeyboardHelp

        | help |
+       help := self balloonMorphClass
+               string: 'Enter text to narrow selection\down to matching items ' withCRs
-       help := BalloonMorph
-               string: 'Enter text to\narrow selection down\to matching items ' withCRs
                for: self
                corner: #topLeft.
+       help popUpAt: self topCenter forHand: self activeHand!
-       help popUpForHand: self activeHand!

Item was added:
+ ----- Method: Morph>>balloonMorphClass (in category 'halos and balloon help') -----
+ balloonMorphClass
+
+       ^ NewBalloonMorph useNewBalloonMorph
+               ifTrue: [NewBalloonMorph]
+               ifFalse: [BalloonMorph]!

Item was changed:
  ----- Method: Morph>>showBalloon:hand: (in category 'halos and balloon help') -----
  showBalloon: msgString hand: aHand
        "Pop up a balloon containing the given string,
        first removing any existing BalloonMorphs in the world."

        | w balloon h |
        (w := self world) ifNil: [^ self].
        h := aHand.
        h ifNil:[
                h := w activeHand].
+       balloon := self balloonMorphClass
+               string: msgString
-       balloon := BalloonMorph
-               string: (msgString asString withNoLineLongerThan: Preferences maxBalloonHelpLineLength)
                for: self balloonHelpAligner.
        balloon popUpFor: self hand: h.!

Item was added:
+ Morph subclass: #NewBalloonMorph
+       instanceVariableNames: 'balloonOwner textMorph maximumWidth orientation hasTail'
+       classVariableNames: 'UseNewBalloonMorph'
+       poolDictionaries: ''
+       category: 'Morphic-Widgets'!
+
+ !NewBalloonMorph commentStamp: 'mt 3/31/2015 10:15' prior: 0!
+ A balloon is a bubble with an optional tail. It contains rich text, which describes something about its balloon-owner.!

Item was added:
+ ----- Method: NewBalloonMorph class>>string:for: (in category 'instance creation') -----
+ string: str for: morph
+
+       ^ self string: str for: morph corner: #bottomLeft!

Item was added:
+ ----- Method: NewBalloonMorph class>>string:for:corner: (in category 'instance creation') -----
+ string: message for: morph corner: symbol
+
+       ^ self new
+               balloonOwner: morph;
+               setText: message;
+               orientation: symbol;
+               yourself!

Item was added:
+ ----- Method: NewBalloonMorph class>>useNewBalloonMorph (in category 'preferences') -----
+ useNewBalloonMorph
+
+       <preference: 'Use new-style balloon morphs'
+               category: #Morphic
+               description: 'The new-style balloon morphs are improved for better reading quality and support rich text.'
+               type: #Boolean>
+       ^ UseNewBalloonMorph ifNil: [true]!

Item was added:
+ ----- Method: NewBalloonMorph class>>useNewBalloonMorph: (in category 'preferences') -----
+ useNewBalloonMorph: aBoolean
+
+       UseNewBalloonMorph := aBoolean.!

Item was added:
+ ----- Method: NewBalloonMorph>>balloonOwner (in category 'accessing') -----
+ balloonOwner
+
+       ^ balloonOwner!

Item was added:
+ ----- Method: NewBalloonMorph>>balloonOwner: (in category 'accessing') -----
+ balloonOwner: aMorph
+
+       balloonOwner := aMorph.!

Item was added:
+ ----- Method: NewBalloonMorph>>bubbleBounds (in category 'geometry') -----
+ bubbleBounds
+
+       ^ self bounds insetBy: (0 @ self tailHeight corner: 0 @ self tailHeight)!

Item was added:
+ ----- Method: NewBalloonMorph>>bubbleInset (in category 'geometry') -----
+ bubbleInset
+
+       ^ 5@2!

Item was added:
+ ----- Method: NewBalloonMorph>>defaultBorderColor (in category 'initialization') -----
+ defaultBorderColor
+
+       ^ self defaultColor muchDarker"Color black"!

Item was added:
+ ----- Method: NewBalloonMorph>>defaultBorderWidth (in category 'initialization') -----
+ defaultBorderWidth
+
+       ^ 1!

Item was added:
+ ----- Method: NewBalloonMorph>>defaultColor (in category 'initialization') -----
+ defaultColor
+
+       ^ BalloonMorph balloonColor!

Item was added:
+ ----- 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 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 added:
+ ----- Method: NewBalloonMorph>>drawOn: (in category 'drawing') -----
+ drawOn: aCanvas
+
+       "Bubble."
+       self wantsRoundedCorners
+               ifTrue: [aCanvas
+                       frameAndFillRoundRect: self bubbleBounds
+                       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 added:
+ ----- Method: NewBalloonMorph>>hasTail (in category 'accessing') -----
+ hasTail
+
+       ^ hasTail ifNil: [true]!

Item was added:
+ ----- Method: NewBalloonMorph>>hasTail: (in category 'accessing') -----
+ hasTail: aBoolean
+
+       hasTail := aBoolean.!

Item was added:
+ ----- Method: NewBalloonMorph>>initialize (in category 'initialization') -----
+ initialize
+
+       super initialize.
+
+       self
+               borderWidth: self defaultBorderWidth;
+               borderColor: self defaultBorderColor;
+               color: (self defaultColor alpha: 1.0); "no alpha due to drop shadow"
+               hasDropShadow: true;
+               shadowOffset: 1@1;
+               shadowColor: (self color muchDarker muchDarker alpha: 0.333);
+               orientation: #bottomLeft.
+
+       MenuMorph roundedMenuCorners
+               ifTrue: [self cornerStyle: #rounded].
+
+       textMorph := TextMorph new
+               wrapFlag: false;
+               lock;
+               yourself.
+
+       self addMorph: textMorph.!

Item was added:
+ ----- Method: NewBalloonMorph>>maximumWidth (in category 'accessing') -----
+ maximumWidth
+
+       ^ maximumWidth ifNil: [
+               maximumWidth := (self balloonOwner balloonFont widthOf: $m) * Preferences maxBalloonHelpLineLength]!

Item was added:
+ ----- Method: NewBalloonMorph>>maximumWidth: (in category 'accessing') -----
+ maximumWidth: anInteger
+
+       maximumWidth := anInteger.!

Item was added:
+ ----- Method: NewBalloonMorph>>morphicLayerNumber (in category 'WiW support') -----
+ morphicLayerNumber
+
+       "helpful for insuring some morphs always appear in front of or behind others.
+       smaller numbers are in front"
+
+       ^5              "Balloons are very front-like things"!

Item was added:
+ ----- Method: NewBalloonMorph>>move: (in category 'geometry') -----
+ move: targetPoint
+
+       self perform: (self orientation, #:) asSymbol with: targetPoint.!

Item was added:
+ ----- Method: NewBalloonMorph>>orientation (in category 'accessing') -----
+ orientation
+       "Encodes the position of the tail. #topLeft, #topRight, #bottomLeft, #bottomRight"
+
+       ^ orientation!

Item was added:
+ ----- Method: NewBalloonMorph>>orientation: (in category 'accessing') -----
+ orientation: aSymbol
+
+       orientation := aSymbol.
+       self changed.!

Item was added:
+ ----- Method: NewBalloonMorph>>popUpAt:forHand: (in category 'initialization') -----
+ popUpAt: point forHand: aHand
+       "Pop up the receiver as balloon help for the given hand"
+
+       #(bottomLeft bottomRight topLeft topRight) detect: [:nextOrientation |
+               self orientation: nextOrientation.
+               self move: point.
+               self bounds: (self bounds translatedToBeWithin: aHand world bounds).
+               (self bounds perform: self orientation) = point] ifNone: ["Keep last try."].
+
+       aHand world addMorphFront: self.
+       aHand balloonHelp: self.!

Item was added:
+ ----- Method: NewBalloonMorph>>popUpFor:hand: (in category 'initialization') -----
+ popUpFor: aMorph hand: aHand
+       "Pop up the receiver as balloon help for the given hand"
+
+       self balloonOwner: aMorph.
+       self popUpForHand: aHand.!

Item was added:
+ ----- Method: NewBalloonMorph>>popUpForHand: (in category 'initialization') -----
+ popUpForHand: aHand
+
+       self popUpAt: aHand position forHand: aHand.!

Item was added:
+ ----- Method: NewBalloonMorph>>setText: (in category 'initialization') -----
+ setText: stringOrText
+
+       | text |
+       text := stringOrText asText.
+       text addAttribute: (TextFontReference toFont: (self balloonOwner ifNil: [BalloonMorph]) balloonFont).
+
+       self textMorph wrapFlag: false.
+       self textMorph newContents: text.
+       self textMorph fullBounds.
+
+       (self maximumWidth > 0 and: [self textMorph width > self maximumWidth])
+               ifTrue: [
+                       self textMorph
+                               wrapFlag: true;
+                               width: self maximumWidth].
+
+       self updateLayout.!

Item was added:
+ ----- Method: NewBalloonMorph>>tailHeight (in category 'geometry') -----
+ tailHeight
+
+       ^ 8!

Item was added:
+ ----- Method: NewBalloonMorph>>tailPosition (in category 'geometry') -----
+ tailPosition
+
+       ^ self innerBounds perform: self orientation!

Item was added:
+ ----- Method: NewBalloonMorph>>tailWidth (in category 'geometry') -----
+ tailWidth
+
+       ^ 15!

Item was added:
+ ----- Method: NewBalloonMorph>>textMorph (in category 'accessing - ui') -----
+ textMorph
+
+       ^ textMorph!

Item was added:
+ ----- Method: NewBalloonMorph>>updateLayout (in category 'layout') -----
+ updateLayout
+
+       self textMorph fullBounds.
+       self extent: self textMorph extent + (2* self bubbleInset) +  (0 @ (2*self tailHeight)).
+       self textMorph center: self center.!

Item was added:
+ ----- Method: NewBalloonMorph>>verticesForTail (in category 'drawing') -----
+ verticesForTail
+
+       | offset factorX factorY tpos bpos |
+       offset := 5 + (self wantsRoundedCorners
+               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)).}!





--
best,
Eliot



--
best,
Eliot


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.794.mcz

marcel.taeumel (old)
Yeah, that's how it is implemented in BalloonMorph. Is there some dependency misconfigured?

Best,
Marcel
Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.794.mcz

marcel.taeumel (old)
Seems like that Morphic should be loaded *before* MorphicExtras anyway. Can we fix that in the update map?

Best,
Marcel
Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.794.mcz

Eliot Miranda-2


On Tue, Mar 31, 2015 at 11:36 PM, Marcel Taeumel <[hidden email]> wrote:
Seems like that Morphic should be loaded *before* MorphicExtras anyway. Can
we fix that in the update map?

That's right.  Yes.  If you construct an image with the state before the updated MorphicExtras is loaded and save that configuration as an update map that will take care of things.  

Best,
Marcel



--
View this message in context: http://forum.world.st/The-Trunk-Morphic-mt-794-mcz-tp4816304p4816550.html
Sent from the Squeak - Dev mailing list archive at Nabble.com.




--
best,
Eliot


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.794.mcz

Tobias Pape

On 01.04.2015, at 18:33, Eliot Miranda <[hidden email]> wrote:

> On Tue, Mar 31, 2015 at 11:36 PM, Marcel Taeumel <[hidden email]> wrote:
> Seems like that Morphic should be loaded *before* MorphicExtras anyway. Can
> we fix that in the update map?
>
> That's right.  Yes.  If you construct an image with the state before the updated MorphicExtras is loaded and save that configuration as an update map that will take care of things.  

I took care of that :)

Best
        -Tobias