6 #include "MarbleGraphicsItem.h"
8 #include "MarbleGraphicsItem_p.h"
11 #include "MarbleDebug.h"
18 #include <QMouseEvent>
22 MarbleGraphicsItem::MarbleGraphicsItem(MarbleGraphicsItemPrivate *dd)
27 MarbleGraphicsItem::~MarbleGraphicsItem()
34 Q_D(MarbleGraphicsItem);
36 if (!d->m_visibility) {
40 if (d->m_repaintNeeded) {
41 d->updateChildPositions();
43 d->m_repaintNeeded =
false;
48 if (d->positions().size() == 0) {
54 if ( ItemCoordinateCache == cacheMode()
55 || DeviceCoordinateCache == cacheMode() )
59 const QSize neededPixmapSize = scale * size().toSize() +
QSize( 1, 1 );
61 if (d->m_pixmap.size() != neededPixmapSize ||
62 d->m_pixmap.devicePixelRatio() != scale) {
65 if ( size().
isValid() && !size().isNull() ) {
66 d->m_pixmap =
QPixmap(neededPixmapSize);
67 d->m_pixmap.setDevicePixelRatio(scale);
70 mDebug() <<
"Warning: Invalid pixmap size suggested: " << d->m_size;
74 QPainter pixmapPainter(&d->m_pixmap);
78 pixmapPainter.translate( 0.5, 0.5 );
79 paint( &pixmapPainter );
82 for (MarbleGraphicsItem *item: d->m_children) {
83 item->paintEvent( &pixmapPainter, viewport );
87 for (
const QPointF& position: d->positions()) {
92 for (
const QPointF& position: d->positions()) {
99 for (MarbleGraphicsItem *item: d->m_children) {
100 item->paintEvent( painter, viewport );
110 bool MarbleGraphicsItem::contains(
const QPointF& point )
const
112 Q_D(
const MarbleGraphicsItem);
113 for (
const QRectF& rect: d->boundingRects()) {
114 if( rect.contains( point ) )
127 for (
const QPointF &point: positions) {
128 QRectF rect( point, m_size );
140 QSizeF MarbleGraphicsItem::size()
const
142 Q_D(
const MarbleGraphicsItem);
146 AbstractMarbleGraphicsLayout *MarbleGraphicsItem::layout()
const
148 Q_D(
const MarbleGraphicsItem);
152 void MarbleGraphicsItem::setLayout( AbstractMarbleGraphicsLayout *layout )
154 Q_D(MarbleGraphicsItem);
157 d->m_layout = layout;
161 MarbleGraphicsItem::CacheMode MarbleGraphicsItem::cacheMode()
const
163 Q_D(
const MarbleGraphicsItem);
164 return d->m_cacheMode;
167 void MarbleGraphicsItem::setCacheMode( CacheMode mode )
169 Q_D(MarbleGraphicsItem);
170 d->m_cacheMode = mode;
171 if (d->m_cacheMode == NoCache) {
172 d->m_repaintNeeded =
true;
176 void MarbleGraphicsItem::update()
178 Q_D(MarbleGraphicsItem);
179 d->m_repaintNeeded =
true;
183 d->m_parent->update();
187 bool MarbleGraphicsItem::visible()
const
189 Q_D(
const MarbleGraphicsItem);
190 return d->m_visibility;
193 void MarbleGraphicsItem::setVisible(
bool visible )
195 Q_D(MarbleGraphicsItem);
196 d->m_visibility = visible;
199 void MarbleGraphicsItem::hide()
204 void MarbleGraphicsItem::show()
209 void MarbleGraphicsItem::setSize(
const QSizeF& size )
211 Q_D(MarbleGraphicsItem);
212 if (d->m_size != size) {
218 QSizeF MarbleGraphicsItem::contentSize()
const
223 void MarbleGraphicsItem::setContentSize(
const QSizeF& size )
228 QRectF MarbleGraphicsItem::contentRect()
const
233 void MarbleGraphicsItem::paint(
QPainter *painter )
238 bool MarbleGraphicsItem::eventFilter(
QObject *
object,
QEvent *e )
248 Q_D(
const MarbleGraphicsItem);
251 if (!d->m_children.isEmpty()) {
254 for(
const QPointF& absolutePosition: absolutePositions ) {
255 QPoint shiftedPos =
event->pos() - absolutePosition.toPoint();
258 for (MarbleGraphicsItem *child: d->m_children) {
261 for(
const QRectF& childRect: childRects ) {
262 if( childRect.toRect().contains( shiftedPos ) ) {
263 if( child->eventFilter(
object, e ) ) {
278 Q_D(MarbleGraphicsItem);
279 d->setProjection(viewport);