[Marble-devel] Merging of FloatItems and MarbleGraphicsItems

Torsten Rahn tackat at t-online.de
Mon Jul 20 03:07:50 CEST 2009


Hi,

Am Sonntag 19 Juli 2009 23:06:04 schrieb Bastian Holst:
> I have used ScreenGraphicsItem (which implements all features for
> MarbleGraphicsItems that have no geo location) to implement
> AbstractFloatItem. It would be nice if somebody could review this.

Much of the stuff is very good. I feel however that some of the proposed 
changes need some severe adjustments (easy to implement, but changes the 
current design quite a bit). 

> Especially my changes to the API of AbstractFloatItem, ScreenGraphicsItem
> and MarbleGraphicsItem.
>
> Now all MarbleGraphicsItems can define a background, margin, padding etc.
> This would help for example to implement WeatherItems.

Although this would help for the WeatherItem I think that stuff like the 
background, margin and padding shouldn't be part of the lower-most base class. 
(and indeed the QGraphicsItem class doesn't introduce anything similar -- 
comparable stuff like "margins" gets only introduced a bit higher in the class 
hierarchy).

For many classes inheriting from e.g. GeoGraphicsItem (which inherits from 
MarbleGraphicsItem) stuff like "padding" or "margin" doesn't make sense and 
just adds unneeded API and adds largely to the memory consumption:

E.g. what would be the "backgroundShape" or the "padding" of a 
GeoDataLineStringItem or a GeoDataPointItem? 

So my opinion is that these properties need to get moved up in the inheritance 
hierarchy: 

On the ScreenGraphicsItem side they need to get moved into ScreenGraphicsItem.


On the GeoGraphicsItem side it's a bit more tricky:

The difference between a ScreenGraphicsItem and a GeoGraphicsItem is that the 
ScreenGraphicsItem doesn't follow the projection at all and that the extent is 
given in pixels.
The GeoGraphicsItem on the other hand is an item of which the position is 
expressed in geographics coordinates and it follows the projection 
automatically. The extent/shape of a geographics Item can change and vary 
according to the projection. E.g. for a line string the shape will change 
massively in spherical projection depending on how the globe is rotated.

Now like for your WeatherItem a GeoGraphicsItem can have a "Label" which is 
positioned according to the GeoGraphicsItem's position and which might contain 
images and/or Text. 

The same is true for the Placemark(Item) which can have an icon-"Label" and a 
text-"Label" assigned.

The shape of the "Label" is not subject to the distortion that might get 
introduced via the projection. So in that regard it's quite similar to a 
ScreenGraphicsItem. According to our definition of Screen- and GeoGraphicsItem 
it's still a GeoGraphicsItem though.
So I suggest that we create a GeoLabelGraphicsItem class which inherits from 
GeoGraphicsItem. Inside the GeoLabelGraphicsItem we'd have all the padding, 
backgroundShape, margin properties etc. .

The GeoPlacemarkGraphicsItem class could then use GeoLabelGraphicsItem 
internally to display the icon and the text label.

For the WeatherItem you could do likewise: You let the WeatherItem own a 
GeoLabelGraphicsItem. 


So the following methods should get IMHO lifted from MarbleGraphicsItem to 

* ScreenGraphicsItem and
* GeoLabelGraphicsItem (which needs to be created)

(and yes, you'd need to duplicated the API/implementation there :-/ ):

+    qreal margin() const;
+    void setMargin( qreal margin );
+    qreal marginTop() const;
+    void setMarginTop( qreal marginTop );
+    qreal marginBottom() const;
+    void setMarginBottom( qreal marginBottom );
+    qreal marginLeft() const;
+    void setMarginLeft( qreal marginLeft );
+    qreal marginRight() const;
+    void setMarginRight( qreal marginRight );
+    qreal borderWidth() const;
+    void setBorderWidth( qreal width );
+    qreal padding() const;
+    void setPadding( qreal width );
+    qreal border() const;
+    void setBorder( qreal width );
+    QBrush borderBrush() const;
+    void setBorderBrush( const QBrush &brush );
+    Qt::PenStyle borderStyle () const;
+    void setBorderStyle( Qt::PenStyle style );
+    QBrush background() const;
+    void setBackground( const QBrush &background );
+    QRectF contentRect( const QPointF& position = QPointF( 0.0, 0.0 ) ) 
+    QRectF paintedRect( const QPointF& position = QPointF( 0.0, 0.0 ) ) 
const;

> Until now the brush and color for the background as well as some other
> things were set globally (if you look at the old code these were static
> properties, but setter and getter functions were not static).

The reason was that for the FloatItems to have a uniform appearance all items 
would have the same look and feel.
And another concern would be memory. However both of these issues can much 
better get solved with object properties if the implementation is done in a 
smart way:

Imagine we hold the margins and padding in a single object that is referenced 
by a pointer. Then we can reference the default values to a single "default 
value" object that is shared between all (e.g. 20000) labels.
This way we could ensure the same look and feel shared by all labels and we 
could keep the memory consumption low.

> As it is possible that different items would want different background
> colors, I changed these to object properties.

So yes I agree that your move from static properties to object properties in 
the API is good. But I think we need to improve the way the properties get 
stored if we deal with lots of objects like this. 

> Another option would be to have a default item style class (static) holding
> the standard values which will be used when nothing else has been set.

Ooops, that sounds roughly like what I was just thinking of :-)))

> If
> someone sets the background color of the compass to yellow, only the
> compass will appear in yellow and if now somebody sets the standard
> background color to red all other items get a red background (compass of
> course has still a yellow background).
> What do you think?

Looks great! 
The only issue I see is the styling/layout methods which imho needs to get 
moved upwards to ScreenGraphicsItem and GeoLabelGraphicsItem :-)

Regards,
Torsten

> Regards
> Bastian




More information about the Marble-devel mailing list