Hi Usman,
Thanks for working on this very important problem. Legend are indeed important.
I would recommend, however, to have a builder for this.
I started to work on a legend builder. Here is an example:
-=—=-=-=—=-=-=—=-=-=—=-=-=—=-=-=—=-=
| v shape legendBuilder elements |
v := RTView new.
"We add some elements"
shape := RTShapeBuilder new circle
size: [ :c | 10 max: (c numberOfMethods) / 7 ];
fillColor: Color gray;
if: [ :cls | '*Array*' match: cls name ] fillColor: Color blue;
if: [ :cls | '*Dictionary*' match: cls name ] fillColor: Color green;
if: [ :cls | '*Set*' match: cls name ] fillColor: Color red;
current.
elements := shape elementsOn: (Collection withAllSubclasses).
elements @ RTPopup.
v addAll: elements.
RTGridLayout on: v elements.
"We add the legend"
legendBuilder := RTLegendBuilder new view: v.
legendBuilder name: 'array' color: Color blue.
legendBuilder name: 'dictionary' color: Color green.
legendBuilder name: 'set' color: Color red.
legendBuilder render.
"Open the view"
v open
-=—=-=-=—=-=-=—=-=-=—=-=-=—=-=-=—=-=
Result is the following:
Feel free to complete the builder. There is a lot to add more (e.g., spacing between the
each item of the legend).
Does this make sense?
Cheers,
Alexandre
On Apr 2, 2014, at 9:14 AM, Usman Bhatti <usman.bhatti(a)gmail.com> wrote:
Hello,
I started to see how an implementation of a legend can be provided in Roassal 2.
I added this methods in TRCanvas>>addLegend:..
addLegend: aDictionary
| startPos interNodeWidth|
interNodeWidth := 30.
fixedShapes isEmpty ifTrue: [ startPos := self topLeft + (10@20) ] ifFalse: [startPos :=
self topLeft + (10@40)].
aDictionary associationsDo:
[ :association |
|shape|
self
addFixedShape:
(TRBoxShape new
size: 10;
translateTo: startPos;
color: association value).
shape := (TRLabelShape new
text: association key;
fontSize: 10).
shape translateTo: (shape width /2) + startPos x + 10 @ startPos y.
self
addFixedShape: shape.
startPos := startPos x + shape width + interNodeWidth @ startPos y ].
Usage example:
============================================
| v e1 e2 l |
v := RTView new.
e1 := (RTEllipse new size: 30; color: (Color blue alpha: 0.3)) element.
e2 := (RTEllipse new size: 30; color: (Color yellow alpha: 0.3)) element.
l := (RTLine new attachPoint: RTShorterDistanceAttachPoint new) edgeFrom: e1 to: e2.
e1 @ RTDraggable.
e2 @ RTDraggable.
v canvas addLegend: ({ 'Red' -> Color red. 'very very green' ->
Color green.'blue' -> Color blue. 'Cyan' -> Color cyan.
'Cyan2' -> Color cyan}) asDictionary.
v addAll: (Array with: l with: e2 with: e1).
v open
=========================================
Questions for Roassal guys:
- Is TRCanvas the right place to add a legend? I started from here because it allows
adding fixed shapes to the view.
- how do I tell the canvas not to draw where meta-items are drawn such as legend(s),
menus, etc.
If this is correct, Leo might continue from here on and put this code in a class to add
more customizations.
tx,
Usman
_______________________________________________
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
^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.