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@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@iam.unibe.ch https://www.iam.unibe.ch/mailman/listinfo/moose-dev