https://forum.world.st/Ann-DragPanels-Floating-palette-windows-with-drag-and-drop-in-Morphic-tp4834283p4835082.html
through the Monticello Browser.
load.
taken from above gives an error message.
in a playground workspace window. I suggest to include that the context menu.
Texts are preserved in the svg file, so search is possible.
in the CardWall panel.
Adding a card by just typing the card text and hitting '<ENTER>' would be nice.
> 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]
>
>