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)).}! |
|
Having (rich) text support, we could display a method's source code in a balloon help (e.g. in a system browser). Best, Marcel |
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: best,
Eliot |
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:
best,
Eliot |
Yeah, that's how it is implemented in BalloonMorph. Is there some dependency misconfigured?
Best, Marcel |
Seems like that Morphic should be loaded *before* MorphicExtras anyway. Can we fix that in the update map?
Best, Marcel |
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 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,
Eliot |
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 |
Free forum by Nabble | Edit this page |