File indexing completed on 2024-05-05 03:49:48
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2009-2010 Bastian Holst <bastianholst@gmx.de> 0004 // 0005 0006 #ifndef MARBLE_SCREENGRAPHICSITEMPRIVATE_H 0007 #define MARBLE_SCREENGRAPHICSITEMPRIVATE_H 0008 0009 #include "MarbleGraphicsItem_p.h" 0010 #include "MarbleDebug.h" 0011 0012 #include "BillboardGraphicsItem.h" 0013 #include "ScreenGraphicsItem.h" 0014 #include "ViewportParams.h" 0015 0016 namespace Marble 0017 { 0018 0019 class ScreenGraphicsItemPrivate : public MarbleGraphicsItemPrivate 0020 { 0021 public: 0022 ScreenGraphicsItemPrivate( ScreenGraphicsItem *screenGraphicsItem, 0023 MarbleGraphicsItem *parent ) 0024 : MarbleGraphicsItemPrivate( screenGraphicsItem, parent ), 0025 m_position(), 0026 m_viewportSize(), 0027 m_floatItemMoving( false ), 0028 m_flags( ScreenGraphicsItem::GraphicsItemFlags() ) 0029 { 0030 } 0031 0032 ~ScreenGraphicsItemPrivate() override 0033 { 0034 } 0035 0036 QVector<QPointF> positions() const override 0037 { 0038 QVector<QPointF> list; 0039 0040 list.append( positivePosition() ); 0041 return list; 0042 } 0043 0044 QPointF positivePosition() const 0045 { 0046 const QSizeF parentSize = m_parent ? m_parent->size() : m_viewportSize; 0047 if ( !parentSize.isValid() ) { 0048 mDebug() << "Invalid parent size"; 0049 return m_position; 0050 } 0051 QPointF position; 0052 qreal x = m_position.x(); 0053 qreal y = m_position.y(); 0054 0055 position.setX( ( x >= 0 ) ? x : parentSize.width() + x - m_size.width() ); 0056 position.setY( ( y >= 0 ) ? y : parentSize.height() + y - m_size.height() ); 0057 0058 return position; 0059 } 0060 0061 QVector<QPointF> absolutePositions() const override 0062 { 0063 if( m_parent == nullptr ) { 0064 return positions(); 0065 } 0066 0067 QVector<QPointF> parentPositions; 0068 0069 if( ScreenGraphicsItem *screenItem = dynamic_cast<ScreenGraphicsItem*>( m_parent ) ) { 0070 parentPositions = screenItem->absolutePositions(); 0071 } 0072 else if ( BillboardGraphicsItem *geoLabelItem = dynamic_cast<BillboardGraphicsItem *>( m_parent ) ) { 0073 parentPositions = geoLabelItem->positions(); 0074 } 0075 0076 QPointF relativePosition = positivePosition(); 0077 0078 QVector<QPointF> absolutePositions; 0079 absolutePositions.reserve(parentPositions.size()); 0080 for( const QPointF &point: parentPositions ) { 0081 absolutePositions.append( point + relativePosition ); 0082 } 0083 0084 return absolutePositions; 0085 } 0086 0087 void setProjection(const ViewportParams *viewport) override 0088 { 0089 // If we have no parent 0090 if( m_parent == nullptr ) { 0091 // Saving the screen size needed for positions() 0092 m_viewportSize = viewport->size(); 0093 } 0094 } 0095 0096 bool isMovable() const 0097 { 0098 return ( m_flags & ScreenGraphicsItem::ItemIsMovable ) ? true : false; 0099 } 0100 0101 QPointF m_position; 0102 // The size of the parent, or if no parent exists the size of the viewport. 0103 QSizeF m_viewportSize; 0104 0105 QPoint m_floatItemMoveStartPos; 0106 bool m_floatItemMoving; 0107 0108 ScreenGraphicsItem::GraphicsItemFlags m_flags; 0109 }; 0110 0111 } 0112 0113 #endif