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