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"