Cool!
Here is a new version of your script:
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
| view initialNodes |
view := ROView new.
initialNodes := (ROLabelElement spritesFor: (Array with: Integer))
asOrderedCollection.
initialNodes do: [:n |
n + ROLabel.
n @ (ROExpandChildrenOnClick newCalculatingChildrenWith: [:aClass | aClass
subclasses])].
view addAll: initialNodes.
ROTreeLayout on: initialNodes.
view @RODraggable @ RODraggableWithVelocity.
view open
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
I also fixed a few things in your class:
<ROExpandChildrenOnClick.st>
Let me know how it goes.
Cheers,
Alexandre
On 24 Nov 2011, at 15:48, Martin Dias wrote:
> I downloaded Roassal, I like it!
>
> Modifying an example, I obtained something like an expandable tree, but I don't
know how to re-layout after click. Could you help me?
>
> I paste the script and I attach a class (which is needed).
>
> | view initialNodes |
> view := ROView new.
> initialNodes := (ROElement spritesFor: (Array with: Integer))
asOrderedCollection.
> initialNodes do: [:n |
> n + ROLabel.
> n @ (ROExpandChildrenOnClick newCalculatingChildrenWith: [:aClass | aClass
subclasses])].
> view addAll: initialNodes.
> ROTreeLayout on: initialNodes.
> view open
>
> Thanks!
> MartÃn
>
>
> On Tue, Nov 15, 2011 at 9:41 AM, Alexandre Bergel <alexandre.bergel(a)me.com>
wrote:
>> I fail to see what these principles are :). Mondrian is nothing but a very simple
graph model with a builder api and some rendering logic. zOrder is just a smart way of
drawing edges such that you can see them properly even in the case of nested graphs. But,
the model does not have to be static.
>
> Although quite effective visually, the zOrder gives an ordering that may be different
from the one specified by the user.
>
> You could have:
> view node: 'A' forIt: [ view node: 'B' ]
>
> But the ordering of drawing A and B is driven by the zOrder. The elements to
displayed are cached in the MONode. However, the lookup when you define an edge itself
follows the node nesting.
>
> I agree with you that the model that does not have to be static, but over the year we
have put a great deal of effort in making Mondrian fast. Now, we are trying to make it
dynamic in addition. This is a non-trivial piece of work.
>
> Also, I have the intuition that we need a dedicated DSL to define the kind of
visualization Martin is looking for.
>
>> I took a quick look at Roassal. It looks quite interesting.
>
> Thanks!
>
>> I have some questions/remarks:
>> - What is the performance for large views when compared with Mondrian?
>
> I haven't addressed the need for performance. One cool thing about Roassal, is
that I do not rely on the Morph scrollbar. This gives more control about what exactly is
displayed. Also, I have flying cameras, which is neat.
>
>> - It is at a lower level of abstraction than Mondrian, but higher than actual
rendering. The first thing I thought of when looking at it was that perhaps it would be
interesting to have it as a backend for Mondrian. Like this we can potentially have the
best of both worlds and we can reuse the engineering effort. And then I saw
ROMondrianViewBuilder which is a good start :).
>
> Ideally, I would like Roassal to be a low level for Mondrian. This is indeed what I
tried with ROMondrianViewBuilder as you can see. I guess that for Martin problem, we need
something like ROHierarchicalGraphViewBuilder.
>
>> - I like the decoration. This is what we had in Mondrian, but that got lost in
translation.
>
> Yes!
> I also would like to have decorators to manage caches. Having caches within
MOGraphElement and its subclasses complexify the whole thing.
>
>> - The rendering logic is tightly coupled with Morphic. It does not have to be,
right?
>
> Is not really tight to Morphic.
> Classes such as ROLine, ROBox, ROCircle do not directly talk to a form, but to a
ROCanvas instead. I will probably add ROFormCanvas, ROHTML5Canvas in the near future
>
>> - I did not see how the decision of drawing edge appears to be. For example, in
the mondrian2 you have the edges drawn on top of the nodes. But, I am not sure if this is
because of the declaration order of because of something else.
>
> The view had an ordered collection of elements, which is sequentially displayed.
> The strategy of displaying edges should not be hardcoded in the ROView.
> Consider the script:
>
> -=-=-=-=-=-=-=-=-=-=-=-=
> | view |
> view := ROMondrianViewBuilder new.
> view nodes: Collection withAllSubclasses.
> view shape line.
> view edgesFrom: #superclass.
> view treeLayout.
> view open
> -=-=-=-=-=-=-=-=-=-=-=-=
>
> We could have
> -=-=-=-=-=-=-=-=-=-=-=-=
> ...
> view treeLayout.
> view moveEdgesToTheBack.
> view open
> -=-=-=-=-=-=-=-=-=-=-=-=
>
> Maybe... Not really elegant. But the order should not be hardcoded
>
> Alexandre
>
>
>>
>> Cheers,
>> Doru
>>
>>
>>
>>> Alexandre
>>>
>>>
>>>
>>>> On 14 Nov 2011, at 17:30, Alexandre Bergel wrote:
>>>>
>>>>> Martin, are you happy with what Mondrian offers currently? Is there
anything else you would like to see?
>>>>>
>>>>> Alexandre
>>>>>
>>>>>
>>>>> On 8 Nov 2011, at 15:50, Martin Dias wrote:
>>>>>
>>>>>> Johan and Alexandre: Thank you, was funny to play with Mondrian
Easel and to see AspectMaps.
>>>>>> Doru: You was right, I had in mind something like a tree. I made
a proof script using blocks for recursion... look:
>>>>>>
>>>>>> | blockForClass blockForExpandable blockForLeaf |
>>>>>> blockForClass := [:aClass |
>>>>>> blockForLeaf value: aClass.
>>>>>> aClass subclasses do: [:aSubclass |
>>>>>> (aSubclass subclasses isEmpty
>>>>>> ifTrue: [blockForLeaf]
>>>>>> ifFalse: [blockForExpandable])
>>>>>> value: aSubclass ] ].
>>>>>> blockForLeaf := [:aClass |
>>>>>> view shape label text: #name.
>>>>>> view node: aClass.
>>>>>> view edgesFrom: #superclass.
>>>>>> view horizontalTreeLayout ].
>>>>>> blockForExpandable := [:aClass |
>>>>>> view interaction
>>>>>> whenClickingUpdateNode: [:x | blockForClass value: x ]
>>>>>> withLayoutUpdate: true.
>>>>>> view shape rectangle
>>>>>> dashedBorder;
>>>>>> size: 10;
>>>>>> borderColor: Color lightGray.
>>>>>> view node: aClass.
>>>>>> view edgesFrom: #superclass.
>>>>>> view horizontalTreeLayout ].
>>>>>> blockForClass value: Collection.
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Tue, Nov 8, 2011 at 4:16 AM, Tudor Girba
<tudor(a)tudorgirba.com> wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I think Martin was asking for a script that would add nodes to
the parent graph, not to the inner graph of a selected node.
>>>>>>
>>>>>> The idea is to have an expandable graph that would behave
similarly to a tree morph widget (when you expand a node, the whole tree becomes larger).
>>>>>>
>>>>>> Cheers,
>>>>>> Doru
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 8 Nov 2011, at 04:28, Alexandre Bergel wrote:
>>>>>>
>>>>>>>> During Smalltalks conference, we started with Mariano and
Doru to do an experiment: to use Mondrian to visualize the graph that is being serialized
with Fuel.
>>>>>>>
>>>>>>> Cool!
>>>>>>>
>>>>>>>> 1) Is it fine how I installed Mondrian?
>>>>>>>>
>>>>>>>> Gofer it
>>>>>>>> squeaksource: 'Mondrian';
>>>>>>>> package: 'ConfigurationOfMondrian';
>>>>>>>> load.
>>>>>>>> (ConfigurationOfMondrian project latestVersion) load.
>>>>>>>
>>>>>>> Yes.
>>>>>>>
>>>>>>>> 2) For large graphs, I would like to show them lazily,
maybe drawing some expandable nodes (+). Do you understand what I mean? Is that possible?
>>>>>>>
>>>>>>> Try this in an easel:
>>>>>>> -=-=-=-=-=-=-=-=-=-=-=-=
>>>>>>> view shape rectangle size: 20.
>>>>>>> view interaction action: #inspect.
>>>>>>> view interaction
>>>>>>> whenEnteringUpdateNode: [:node |
>>>>>>> view interaction forwarder.
>>>>>>> view nodes: (Set allSubclasses).
>>>>>>> view interaction forwarder.
>>>>>>> view edgesFrom: #superclass..
>>>>>>> view treeLayout
>>>>>>> ]
>>>>>>> whenLeavingUpdateNode: [:node | ]
>>>>>>> withLayoutUpdate: true.
>>>>>>> view nodes: (1 to: 3)
>>>>>>> -=-=-=-=-=-=-=-=-=-=-=-=
>>>>>>>
>>>>>>> Cheers,
>>>>>>> Alexandre
>>>>>>> --
>>>>>>> _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
>>>>>>> Alexandre Bergel
http://www.bergel.eu
>>>>>>> ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Moose-dev mailing list
>>>>>>> Moose-dev(a)iam.unibe.ch
>>>>>>>
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
>>>>>>
>>>>>> --
>>>>>>
www.tudorgirba.com
>>>>>>
>>>>>> "Not knowing how to do something is not an argument for how
it cannot be done."
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Moose-dev mailing list
>>>>>> Moose-dev(a)iam.unibe.ch
>>>>>>
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
>>>>>>
>>>>>> _______________________________________________
>>>>>> Moose-dev mailing list
>>>>>> Moose-dev(a)iam.unibe.ch
>>>>>>
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
>>>>>
>>>>> --
>>>>> _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
>>>>> Alexandre Bergel
http://www.bergel.eu
>>>>> ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Moose-dev mailing list
>>>>> Moose-dev(a)iam.unibe.ch
>>>>>
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
>>>>
>>>> --
>>>>
www.tudorgirba.com
>>>>
>>>> "Reasonable is what we are accustomed with."
>>>>
>>>>
>>>> _______________________________________________
>>>> Moose-dev mailing list
>>>> Moose-dev(a)iam.unibe.ch
>>>>
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
>>>>
>>>> _______________________________________________
>>>> Moose-dev mailing list
>>>> Moose-dev(a)iam.unibe.ch
>>>>
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
>>>
>>> --
>>> _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
>>> Alexandre Bergel
http://www.bergel.eu
>>> ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Moose-dev mailing list
>>> Moose-dev(a)iam.unibe.ch
>>>
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
>>
>> --
>>
www.tudorgirba.com
>>
>> Innovation comes in least expected form.
>> That is, if it is expected, it already happened.
>>
>>
>> _______________________________________________
>> Moose-dev mailing list
>> Moose-dev(a)iam.unibe.ch
>>
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
>
> --
> _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
> Alexandre Bergel
http://www.bergel.eu
> ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
>
>
>
>
>
> _______________________________________________
> Moose-dev mailing list
> Moose-dev(a)iam.unibe.ch
>
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
>
> <ROExpandChildrenOnClick.st>_______________________________________________
> Moose-dev mailing list
> Moose-dev(a)iam.unibe.ch
>
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
--
_,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
Alexandre Bergel
http://www.bergel.eu
^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
_______________________________________________
Moose-dev mailing list
Moose-dev(a)iam.unibe.ch
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
"The coherence of a trip is given by the clearness of the goal."
_______________________________________________
Moose-dev mailing list
Moose-dev(a)iam.unibe.ch