File indexing completed on 2024-04-28 15:16:05

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2014 Dennis Nienhüser <nienhueser@kde.org>
0004 //
0005 
0006 #include "RenderState.h"
0007 
0008 #include <QList>
0009 
0010 namespace Marble {
0011 
0012 class Q_DECL_HIDDEN RenderState::Private
0013 {
0014 public:
0015     QString m_name;
0016     QList<RenderState> m_children;
0017     RenderStatus m_status;
0018 
0019     Private( const QString &name=QString(), RenderStatus status=Complete );
0020     RenderStatus status() const;
0021     static RenderStatus minimumStatus(RenderStatus a, RenderStatus b);
0022     QString toString( const RenderState &state, int indent ) const;
0023 };
0024 
0025 RenderState::RenderState( const QString &name, RenderStatus status ) :
0026     d( new Private( name, status ) )
0027 {
0028     // nothing to do
0029 }
0030 
0031 RenderState::RenderState( const RenderState &other ) :
0032     d( new Private )
0033 {
0034     *d = *other.d;
0035 }
0036 
0037 RenderState &RenderState::operator=( const RenderState &other )
0038 {
0039     *d = *other.d;
0040     return *this;
0041 }
0042 
0043 RenderState::~RenderState()
0044 {
0045     delete d;
0046 }
0047 
0048 RenderStatus RenderState::status() const
0049 {
0050     return d->status();
0051 }
0052 
0053 QString RenderState::name() const
0054 {
0055     return d->m_name;
0056 }
0057 
0058 int RenderState::children() const
0059 {
0060     return d->m_children.size();
0061 }
0062 
0063 RenderState RenderState::childAt( int index ) const
0064 {
0065     return d->m_children.at( index );
0066 }
0067 
0068 void RenderState::addChild(const RenderState &child)
0069 {
0070     d->m_children.push_back( child );
0071 }
0072 
0073 RenderState::operator QString() const
0074 {
0075   return d->toString( *this, 0 );
0076 }
0077 
0078 RenderState::Private::Private( const QString &name, RenderStatus status ) :
0079     m_name( name ),
0080     m_status( status )
0081 {
0082     // nothing to do
0083 }
0084 
0085 RenderStatus RenderState::Private::status() const
0086 {
0087     RenderStatus status = Complete;
0088     for( const RenderState &child: m_children ) {
0089         status = minimumStatus( status, child.status() );
0090     }
0091     return minimumStatus( status, m_status );
0092 }
0093 
0094 RenderStatus RenderState::Private::minimumStatus(RenderStatus a, RenderStatus b)
0095 {
0096     if ( a == Incomplete || b == Incomplete ) {
0097         return Incomplete;
0098     }
0099     if ( a == WaitingForData || b == WaitingForData ) {
0100         return WaitingForData;
0101     }
0102     if ( a == WaitingForUpdate || b == WaitingForUpdate ) {
0103         return WaitingForUpdate;
0104     }
0105 
0106     Q_ASSERT( a == Complete || b == Complete );
0107     return Complete;
0108 }
0109 
0110 QString RenderState::Private::toString( const RenderState &state, int level ) const
0111 {
0112     QString const prefix = level > 0 ? "\n" : "";
0113     QString const indent(level*2, QLatin1Char(' '));
0114     QString status;
0115     switch ( state.status() ) {
0116     case Marble::Complete:         status = "Complete"; break;
0117     case Marble::WaitingForUpdate: status = "Waiting for update"; break;
0118     case Marble::WaitingForData:   status = "Waiting for data"; break;
0119     case Marble::Incomplete:       status = "Incomplete"; break;
0120     }
0121     QString const name = ( state.name().isEmpty() ? "Anonymous renderer" : state.name() );
0122     QString result = QString("%1%2%3: %4").arg( prefix, indent, name, status );
0123 
0124     for( const RenderState &child: state.d->m_children ) {
0125         result += toString( child, level+1 );
0126     }
0127     return result;
0128 }
0129 
0130 }