File indexing completed on 2024-05-12 11:43:43
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 }