A first proposition for legend in roassal 2

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

A first proposition for legend in roassal 2

Usman Bhatti
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
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
Reply | Threaded
Open this post in threaded view
|

Re: A first proposition for legend in roassal 2

abergel
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 <[hidden email]> 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
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev

-- 
_,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
Alexandre Bergel  http://www.bergel.eu
^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.




_______________________________________________
Moose-dev mailing list
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
Reply | Threaded
Open this post in threaded view
|

Re: A first proposition for legend in roassal 2

Usman Bhatti
On Wed, Apr 2, 2014 at 6:58 PM, Alexandre Bergel <[hidden email]> wrote:
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?

Yes. I agree, it is much better to work with the builders than working at the level of canvas. I had started to do at the level of TRCanvas because it provided services for fixed shapes and I wanted the legend to have a fixed position and it should be draggable. I think you have added support for fixed shapes at the level of the view so the builder should be work as desired.

tx for looking into it.
Usman
 

Cheers,
Alexandre


On Apr 2, 2014, at 9:14 AM, Usman Bhatti <[hidden email]> 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
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev

-- 
_,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
Alexandre Bergel  http://www.bergel.eu
^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.




_______________________________________________
Moose-dev mailing list
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev



_______________________________________________
Moose-dev mailing list
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev