Excerpts from stepharo's message of 2015-08-22 09:55:04 +0200:
> would be fun to see if you can reuse the algo of roassal.

i have taken a stab at that:

===========================================================================================
view := RTView new.
| activenode prevnode |

view
        when: TRMouseClick
        do:
                [ :ev | 
                | label node |
                "node := shape element."
                label := RTEditableLabel new
                        height: 30; "i have a very high resolution and like 
large fonts"
                        text: '';
                        element.
                node := RTBox new
                        color: Color white;
                        borderWidth: 2;
                        borderColor: Color black;
                        element.
                node @ RTDraggable.

                "select a node to branch of new nodes from it"
                node when: TRMouseClick do: [ :click | activenode := click 
element ].

                "if the label is empty: '', then its size is 0@0 and is no
                 longer clickable to edit, hence we make the node clickable 
instead"
                node when: TRMouseDoubleClick do: [ label shape 
showTextMorphFor: label ].
                node when: TRMouseLeave do: [ label shape hideTextMorphFor: 
label ].
                view
                        add: node;
                        add: label.
                RTNest new
                        stretchable;
                        on: node nest: {label}.

                "when the label changes its size, the box doesn't update its
                 size unless we add this workaround"
                label trachelShape addCallback: (TRExtentCallback new block: [ 
:aShape :ratio | node trachelShape extent: aShape extent + (20 @ 0) ]).

                node translateTo: ev position.

                "label shape showTextMorphFor: label." "this opens the node in 
edit mode, 
                                                        but somehow messes 
things up"

                (activenode notNil and: node ~= activenode)
                        ifTrue: [ prevnode := activenode ].
                prevnode
                        ifNotNil: [ edge := RTEdge from: prevnode to: node.
                                edge
                                        +
                                                (RTBezierLine horizontal
                                                        
withContinuousRectangleAttachPoint;
                                                        yourself).
                                view add: edge ].
                prevnode := node.
                activenode := node.
                view signalUpdate ].
view.
===========================================================================================

the behavior is a bit different than the usual mindmapping tools as it does not
enforce an automatic layout but you are free to place nodes whereever you like
by just clicking in the location and moving the node later.

that behavior is inspired by a mindmapping tool called labyrint:
https://github.com/labyrinth-team/labyrinth
https://www.youtube.com/watch?v=Pv3dTovGc0E


thanks to alexandre  bergel and others who helped me to figure out some
problems such as a workaround for RTEditableLabel not working with
RTCompositeShape:

shape := RTCompositeShape new.
shape allOfSameSizeWithPadding.
shape add: (RTBox new color: Color white; borderWidth: 2; borderColor: Color 
black).
shape add: (RTEditableLabel new height: 30).

the remaining problems are cosmetic. for example i can't seem to get the nodes
to open up in edit mode. doing that with the commented line in the code above,
wrecks havoc on the node.
i also would like RTBezierLine to be horizontal or vertical depending on how
the two nodes are positioned to each other. and it should always start at the
middle of the rectangles edge at a 90degree angle.

lastly, i'd like to have rounded corners on the RTBox.

if/when i develop this further, i plan to add the ability to select multiple
nodes and add edges between them. be able to move selected nodes as a group,
and align selected (or all) nodes according to one of the layouts provided by
roassal (tree, circle, etc), things like export to svg or png would also be 
nice.

and of course, package it up...

greetings, martin.

-- 
eKita                   -   the online platform for your entire academic life
-- 
chief engineer                                                       eKita.co
pike programmer      pike.lysator.liu.se    caudium.net     societyserver.org
secretary                                                      beijinglug.org
mentor                                                           fossasia.org
foresight developer  foresightlinux.org                            realss.com
unix sysadmin
Martin Bähr          working in china        http://societyserver.org/mbaehr/

Reply via email to