Login  Register

Re: [Ann] DragPanels: Floating palette windows with drag-and-drop in Morphic

Posted by Hannes Hirzel on Jul 01, 2015; 10:38am
URL: https://forum.world.st/Ann-DragPanels-Floating-palette-windows-with-drag-and-drop-in-Morphic-tp4834283p4835082.html

Thank you for the custom made class CardsSvgWriter

I loaded it from

http://smalltalkhub.com/#!/~StephanEggermont/Documentation

CardsMorphic-StephanEggermont.57

through the Monticello Browser.

BTW

Gofer new
        smalltalkhubUser: 'StephanEggermont' project: 'Documentation'
        package: 'CardsMorphic';
        load.

taken from above gives an error message.


I understand that there is no menu command yet to do the export so I did

    CardsSvgWriter newFile: 'cards.svg' on: (CardWall allInstances at: 1)

in a playground workspace window. I suggest to include that the context menu.

Texts are preserved in the svg file, so search is possible.

Fontsize is an issue: in the exported SVG file it is much smaller than
in the CardWall panel.

Adding a card by just typing the card text and hitting '<ENTER>' would be nice.

--Hannes

On 6/30/15, Stephan Eggermont <[hidden email]> wrote:

> The export as SVG is indeed easy.
> I've added this helper class to CardsMorphic-StephanEggermont.56
> It is not well-factored, and for now ignores font families.
>
> A class helper method to directly create a file:
>
> CardSvgWriter class>newFile: aString on: aCardWall
> ^self new write: aCardWall to: (aString asFileReference writeStream )
>
> Write a SVG header, the size and then the contents of the cardwall,
> finally close the SVG.
>
> CardSvgWriter>>write: aWall to: aStream
> stream := aStream.
> stream nextPutAll: self fileHeader.
> self fileSized: aWall fullFrame.
> stream cr.
> aWall cardSpace submorphsDo: [ :column |
> self writeColumn: column].
> stream nextPutAll: '</svg>'.
> stream close
>
> SVG is an XML format
>
> CardSvgWriter>>fileHeader
> ^'<?xml version="1.0" standalone="no"?>
> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
> '
>
> Take the SVG size from the CardWall morph. Two namespaces are needed,
> the second one to make the images work.
>
> CardSvgWriter>>fileSized: frame
> stream nextPutAll: '<svg xmlns="http://www.w3.org/2000/svg"
> xmlns:xlink="http://www.w3.org/1999/xlink" viewBox = "',
> (frame left) asString,' ',
> (frame top) asString,' ',
> (frame width) asString,' ',
> (frame height) asString,'" version = "1.1">'
>
> For each column, write the title and a gray background
>
> CardSvgWriter>>writeColumn: aColumn
> |background|
> stream nextPutAll: '<text x="',(aColumn left+2) asString,'"
> y="',(aColumn top+2) asString,'" fill="gray" font-size= "11">'.
> stream nextPutAll: aColumn title.
> stream nextPutAll: '</text>'.
> stream cr.
> background := aColumn submorphs first.
> stream nextPutAll: '<rect x= "',(background left) asString,
> '" y="',(background top) asString,
> '" width="',(background width) asString,
> '" height="',(background height) asString,
> '" fill="rgb(250,250,250)" />'.
> stream cr.
> background submorphsDo: [ :card | self writeCard: card ].
>
> for each card, write its components
>
> CardSvgWriter>>writeCard: aCard
> self writeCardRectangle: aCard.
> self writeCardText: aCard.
> self writeCardImage: aCard
>
> The rectangle still has hardcoded border and borderColor
>
> CardSvgWriter>>writeCardRectangle: aCard
> stream nextPutAll: '<rect x= "',(aCard left) asString,
> '" y="',(aCard top) asString,
> '" width="',(aCard width) asString,
> '" height="',(aCard height) asString,
> '" stroke="','rgb(240,240,240)'"aCard borderColor asHTMLColor",
> '" stroke-width="', '1',"aCard borderWidth asString,"
> '" fill="',aCard color asHTMLColor,'" />'.
> stream cr.
>
> Positioning of text is different in SVG and Morphic. In SVG,
> it is the left-bottom, vs left-top in Morphic.
>
> CardSVGWriter>>writeCardText: aCard
> stream nextPutAll: '<text x="',(aCard left+2) asString,'" y="',(aCard
> top+12) asString,'" fill="black" font-size= "10">'.
> stream nextPutAll: aCard title.
> stream nextPutAll: '</text>'.
> stream cr.
>
> The avatars are jpegs. they need to be base64 encoded.
> Here they are repeated for each card, they should be
> written once and linked.
>
> CardSVGWriter>writeCardImage: aCard
> aCard person ifNotNil: [
> stream nextPutAll: '<image x="',(aCard right-32) asString,'"
> y="',(aCard bottom-32) asString,'" width="32" height="32"
> xlink:href="data:image/jpg;base64,',
> (ZnUtils encodeBase64: (ByteArray streamContents: [:s |
> PluginBasedJPEGReadWriter putForm: (AvatarCache default imageFor:
> aCard person) onStream: s]))
> ,'"/>'.
> stream cr]
>
>