File indexing completed on 2024-04-21 03:49:27
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2009 Bastian Holst <bastianholst@gmx.de> 0004 // 0005 0006 // Self 0007 #include "AbstractDataPlugin.h" 0008 0009 // Marble 0010 #include "AbstractDataPluginModel.h" 0011 #include "AbstractDataPluginItem.h" 0012 #include "GeoPainter.h" 0013 #include "GeoSceneLayer.h" 0014 #include "MarbleModel.h" 0015 #include "ViewportParams.h" 0016 #include "MarbleDebug.h" 0017 0018 // Qt 0019 #include <QTimer> 0020 #include <QRegion> 0021 0022 namespace Marble 0023 { 0024 0025 class AbstractDataPluginPrivate 0026 { 0027 public: 0028 AbstractDataPluginPrivate() 0029 : m_model( nullptr ), 0030 m_numberOfItems( 10 ) 0031 { 0032 m_updateTimer.setSingleShot( true ); 0033 } 0034 0035 ~AbstractDataPluginPrivate() { 0036 delete m_model; 0037 } 0038 0039 AbstractDataPluginModel *m_model; 0040 quint32 m_numberOfItems; 0041 QTimer m_updateTimer; 0042 }; 0043 0044 AbstractDataPlugin::AbstractDataPlugin( const MarbleModel *marbleModel ) 0045 : RenderPlugin( marbleModel ), 0046 d( new AbstractDataPluginPrivate ) 0047 { 0048 connect( &d->m_updateTimer, SIGNAL(timeout()), this, SIGNAL(repaintNeeded()) ); 0049 } 0050 0051 AbstractDataPlugin::~AbstractDataPlugin() 0052 { 0053 delete d; 0054 } 0055 0056 bool AbstractDataPlugin::isInitialized() const 0057 { 0058 return model() != nullptr; 0059 } 0060 0061 QStringList AbstractDataPlugin::backendTypes() const 0062 { 0063 return QStringList( name() ); 0064 } 0065 0066 QString AbstractDataPlugin::renderPolicy() const 0067 { 0068 return QString( "ALWAYS" ); 0069 } 0070 0071 QStringList AbstractDataPlugin::renderPosition() const 0072 { 0073 return QStringList( "ALWAYS_ON_TOP" ); 0074 } 0075 0076 bool AbstractDataPlugin::render( GeoPainter *painter, ViewportParams *viewport, 0077 const QString& renderPos, GeoSceneLayer * layer) 0078 { 0079 Q_UNUSED( renderPos ); 0080 Q_UNUSED( layer ); 0081 0082 QList<AbstractDataPluginItem*> items = d->m_model->items( viewport, numberOfItems() ); 0083 painter->save(); 0084 0085 // Paint the most important item at last 0086 for( int i = items.size() - 1; i >= 0; --i ) { 0087 items.at( i )->paintEvent( painter, viewport ); 0088 } 0089 0090 painter->restore(); 0091 0092 return true; 0093 } 0094 0095 AbstractDataPluginModel *AbstractDataPlugin::model() 0096 { 0097 return d->m_model; 0098 } 0099 0100 const AbstractDataPluginModel *AbstractDataPlugin::model() const 0101 { 0102 return d->m_model; 0103 } 0104 0105 void AbstractDataPlugin::setModel( AbstractDataPluginModel* model ) 0106 { 0107 if ( d->m_model ) { 0108 disconnect( d->m_model, SIGNAL(itemsUpdated()), this, SLOT(delayedUpdate()) ); 0109 delete d->m_model; 0110 } 0111 d->m_model = model; 0112 0113 connect( d->m_model, SIGNAL(itemsUpdated()), this, SLOT(delayedUpdate()) ); 0114 connect( d->m_model, SIGNAL(favoriteItemsChanged(QStringList)), this, 0115 SLOT(favoriteItemsChanged(QStringList)) ); 0116 connect( d->m_model, SIGNAL(favoriteItemsOnlyChanged()), this, 0117 SIGNAL(favoriteItemsOnlyChanged()) ); 0118 0119 emit favoritesModelChanged(); 0120 } 0121 0122 quint32 AbstractDataPlugin::numberOfItems() const 0123 { 0124 return d->m_numberOfItems; 0125 } 0126 0127 void AbstractDataPlugin::setNumberOfItems( quint32 number ) 0128 { 0129 bool changed = ( number != d->m_numberOfItems ); 0130 d->m_numberOfItems = number; 0131 0132 if ( changed ) 0133 emit changedNumberOfItems( number ); 0134 } 0135 0136 QList<AbstractDataPluginItem *> AbstractDataPlugin::whichItemAt( const QPoint& curpos ) 0137 { 0138 if ( d->m_model && enabled() && visible()) { 0139 return d->m_model->whichItemAt( curpos ); 0140 } 0141 else { 0142 return QList<AbstractDataPluginItem *>(); 0143 } 0144 } 0145 0146 RenderPlugin::RenderType AbstractDataPlugin::renderType() const 0147 { 0148 return OnlineRenderType; 0149 } 0150 0151 void AbstractDataPlugin::setFavoriteItemsOnly( bool favoriteOnly ) 0152 { 0153 if ( d->m_model && d->m_model->isFavoriteItemsOnly() != favoriteOnly ) { 0154 d->m_model->setFavoriteItemsOnly( favoriteOnly ); 0155 } 0156 } 0157 0158 bool AbstractDataPlugin::isFavoriteItemsOnly() const 0159 { 0160 return d->m_model && d->m_model->isFavoriteItemsOnly(); 0161 } 0162 0163 QObject *AbstractDataPlugin::favoritesModel() 0164 { 0165 return d->m_model ? d->m_model->favoritesModel() : nullptr; 0166 } 0167 0168 void AbstractDataPlugin::favoriteItemsChanged( const QStringList& favoriteItems ) 0169 { 0170 Q_UNUSED( favoriteItems ) 0171 } 0172 0173 void AbstractDataPlugin::delayedUpdate() 0174 { 0175 if ( !d->m_updateTimer.isActive() ) 0176 { 0177 d->m_updateTimer.start( 500 ); 0178 } 0179 } 0180 0181 } // namespace Marble 0182 0183 #include "moc_AbstractDataPlugin.cpp"