• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
LayerManager.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2008 Torsten Rahn <tackat@kde.org>
9 // Copyright 2009 Jens-Michael Hoffmann <jensmh@gmx.de>
10 // Copyright 2011,2012 Bernahrd Beschow <bbeschow@cs.tu-berlin.de>
11 //
12 
13 
14 // Own
15 #include "LayerManager.h"
16 
17 // Local dir
18 #include "MarbleDebug.h"
19 #include "AbstractDataPlugin.h"
20 #include "AbstractDataPluginItem.h"
21 #include "AbstractFloatItem.h"
22 #include "GeoPainter.h"
23 #include "MarbleModel.h"
24 #include "PluginManager.h"
25 #include "RenderPlugin.h"
26 #include "LayerInterface.h"
27 #include "RenderState.h"
28 
29 namespace Marble
30 {
31 
36 bool zValueLessThan( const LayerInterface * const one, const LayerInterface * const two )
37 {
38  Q_ASSERT( one && two );
39  return one->zValue() < two->zValue();
40 }
41 
42 class LayerManager::Private
43 {
44  public:
45  Private( const MarbleModel* model, LayerManager *parent );
46  ~Private();
47 
48  void updateVisibility( bool visible, const QString &nameId );
49 
50  void addPlugins();
51 
52  LayerManager *const q;
53 
54  QList<RenderPlugin *> m_renderPlugins;
55  QList<AbstractFloatItem *> m_floatItems;
56  QList<AbstractDataPlugin *> m_dataPlugins;
57  QList<LayerInterface *> m_internalLayers;
58  const MarbleModel* m_model;
59 
60  bool m_showBackground;
61 
62  RenderState m_renderState;
63  bool m_showRuntimeTrace;
64 };
65 
66 LayerManager::Private::Private( const MarbleModel* model, LayerManager *parent )
67  : q( parent ),
68  m_renderPlugins(),
69  m_model( model ),
70  m_showBackground( true ),
71  m_showRuntimeTrace( false )
72 {
73 }
74 
75 LayerManager::Private::~Private()
76 {
77  qDeleteAll( m_renderPlugins );
78 }
79 
80 void LayerManager::Private::updateVisibility( bool visible, const QString &nameId )
81 {
82  emit q->visibilityChanged( nameId, visible );
83 }
84 
85 
86 LayerManager::LayerManager( const MarbleModel* model, QObject *parent )
87  : QObject( parent ),
88  d( new Private( model, this ) )
89 {
90  d->addPlugins();
91  connect( model->pluginManager(), SIGNAL(renderPluginsChanged()), this, SLOT(addPlugins()) );
92 }
93 
94 LayerManager::~LayerManager()
95 {
96  delete d;
97 }
98 
99 bool LayerManager::showBackground() const
100 {
101  return d->m_showBackground;
102 }
103 
104 QList<RenderPlugin *> LayerManager::renderPlugins() const
105 {
106  return d->m_renderPlugins;
107 }
108 
109 QList<AbstractFloatItem *> LayerManager::floatItems() const
110 {
111  return d->m_floatItems;
112 }
113 
114 QList<AbstractDataPlugin *> LayerManager::dataPlugins() const
115 {
116  return d->m_dataPlugins;
117 }
118 
119 QList<AbstractDataPluginItem *> LayerManager::whichItemAt( const QPoint& curpos ) const
120 {
121  QList<AbstractDataPluginItem *> itemList;
122 
123  foreach( AbstractDataPlugin *plugin, d->m_dataPlugins ) {
124  itemList.append( plugin->whichItemAt( curpos ) );
125  }
126  return itemList;
127 }
128 
129 void LayerManager::renderLayers( GeoPainter *painter, ViewportParams *viewport )
130 {
131  d->m_renderState = RenderState( "Marble" );
132  const QTime totalTime = QTime::currentTime();
133 
134  QStringList renderPositions;
135 
136  if ( d->m_showBackground ) {
137  renderPositions << "STARS" << "BEHIND_TARGET";
138  }
139 
140  renderPositions << "SURFACE" << "HOVERS_ABOVE_SURFACE" << "ATMOSPHERE"
141  << "ORBIT" << "ALWAYS_ON_TOP" << "FLOAT_ITEM" << "USER_TOOLS";
142 
143  QStringList traceList;
144  foreach( const QString& renderPosition, renderPositions ) {
145  QList<LayerInterface*> layers;
146 
147  // collect all RenderPlugins of current renderPosition
148  foreach( RenderPlugin *renderPlugin, d->m_renderPlugins ) {
149  if ( renderPlugin && renderPlugin->renderPosition().contains( renderPosition ) ) {
150  if ( renderPlugin->enabled() && renderPlugin->visible() ) {
151  if ( !renderPlugin->isInitialized() ) {
152  renderPlugin->initialize();
153  emit renderPluginInitialized( renderPlugin );
154  }
155  layers.push_back( renderPlugin );
156  }
157  }
158  }
159 
160  // collect all internal LayerInterfaces of current renderPosition
161  foreach( LayerInterface *layer, d->m_internalLayers ) {
162  if ( layer && layer->renderPosition().contains( renderPosition ) ) {
163  layers.push_back( layer );
164  }
165  }
166 
167  // sort them according to their zValue()s
168  qSort( layers.begin(), layers.end(), zValueLessThan );
169 
170  // render the layers of the current renderPosition
171  QTime timer;
172  foreach( LayerInterface *layer, layers ) {
173  timer.start();
174  layer->render( painter, viewport, renderPosition, 0 );
175  d->m_renderState.addChild( layer->renderState() );
176  traceList.append( QString("%2 ms %3").arg( timer.elapsed(),3 ).arg( layer->runtimeTrace() ) );
177  }
178  }
179 
180  if ( d->m_showRuntimeTrace ) {
181  const int totalElapsed = totalTime.elapsed();
182  const int fps = 1000.0/totalElapsed;
183  traceList.append( QString( "Total: %1 ms (%2 fps)" ).arg( totalElapsed, 3 ).arg( fps ) );
184 
185  painter->save();
186  painter->setBackgroundMode( Qt::OpaqueMode );
187  painter->setBackground( Qt::gray );
188  painter->setFont( QFont( "Sans Serif", 10, QFont::Bold ) );
189 
190  int i=0;
191  foreach ( const QString &text, traceList ) {
192  painter->setPen( Qt::black );
193  painter->drawText( QPoint(10,40+15*i), text );
194  painter->setPen( Qt::white );
195  painter->drawText( QPoint(9,39+15*i), text );
196  ++i;
197  }
198  painter->restore();
199  }
200 }
201 
202 void LayerManager::Private::addPlugins()
203 {
204  foreach ( const RenderPlugin *factory, m_model->pluginManager()->renderPlugins() ) {
205  bool alreadyCreated = false;
206  foreach( const RenderPlugin* existing, m_renderPlugins ) {
207  if ( existing->nameId() == factory->nameId() ) {
208  alreadyCreated = true;
209  break;
210  }
211  }
212 
213  if ( alreadyCreated ) {
214  continue;
215  }
216 
217  RenderPlugin *const renderPlugin = factory->newInstance( m_model );
218  Q_ASSERT( renderPlugin && "Plugin returned null when requesting a new instance." );
219  m_renderPlugins.append( renderPlugin );
220 
221  QObject::connect( renderPlugin, SIGNAL(settingsChanged(QString)),
222  q, SIGNAL(pluginSettingsChanged()) );
223  QObject::connect( renderPlugin, SIGNAL(repaintNeeded(QRegion)),
224  q, SIGNAL(repaintNeeded(QRegion)) );
225  QObject::connect( renderPlugin, SIGNAL(visibilityChanged(bool,QString)),
226  q, SLOT(updateVisibility(bool,QString)) );
227 
228  // get float items ...
229  AbstractFloatItem * const floatItem =
230  qobject_cast<AbstractFloatItem *>( renderPlugin );
231  if ( floatItem )
232  m_floatItems.append( floatItem );
233 
234  // ... and data plugins
235  AbstractDataPlugin * const dataPlugin =
236  qobject_cast<AbstractDataPlugin *>( renderPlugin );
237  if( dataPlugin )
238  m_dataPlugins.append( dataPlugin );
239  }
240 }
241 
242 void LayerManager::setShowBackground( bool show )
243 {
244  d->m_showBackground = show;
245 }
246 
247 void LayerManager::setShowRuntimeTrace( bool show )
248 {
249  d->m_showRuntimeTrace = show;
250 }
251 
252 void LayerManager::addLayer(LayerInterface *layer)
253 {
254  d->m_internalLayers.push_back(layer);
255 }
256 
257 void LayerManager::removeLayer(LayerInterface *layer)
258 {
259  d->m_internalLayers.removeAll(layer);
260 }
261 
262 QList<LayerInterface *> LayerManager::internalLayers() const
263 {
264  return d->m_internalLayers;
265 }
266 
267 RenderState LayerManager::renderState() const
268 {
269  return d->m_renderState;
270 }
271 
272 }
273 
274 #include "LayerManager.moc"
Marble::RenderPlugin::enabled
bool enabled
Definition: RenderPlugin.h:51
QPainter::setBackgroundMode
void setBackgroundMode(Qt::BGMode mode)
Marble::LayerManager::LayerManager
LayerManager(const MarbleModel *model, QObject *parent=0)
Definition: LayerManager.cpp:86
QPainter::setBackground
void setBackground(const QBrush &brush)
QList::push_back
void push_back(const T &value)
Marble::GeoPainter
A painter that allows to draw geometric primitives on the map.
Definition: GeoPainter.h:98
MarbleModel.h
This file contains the headers for MarbleModel.
QFont
AbstractFloatItem.h
Marble::LayerManager::internalLayers
QList< LayerInterface * > internalLayers() const
Definition: LayerManager.cpp:262
QStringList::contains
bool contains(const QString &str, Qt::CaseSensitivity cs) const
QPainter::save
void save()
LayerInterface.h
Marble::LayerManager::renderPlugins
QList< RenderPlugin * > renderPlugins() const
Returns a list of all RenderPlugins on the layer, this includes float items.
Definition: LayerManager.cpp:104
Marble::LayerInterface
Definition: LayerInterface.h:26
Marble::AbstractDataPlugin
An abstract class for plugins that show data that has a geo coordinate.
Definition: AbstractDataPlugin.h:45
QPoint
Marble::MarbleModel::pluginManager
const PluginManager * pluginManager() const
Definition: MarbleModel.cpp:634
QTime
MarbleDebug.h
Marble::zValueLessThan
bool zValueLessThan(GeoGraphicsItem *i1, GeoGraphicsItem *i2)
Definition: GeoGraphicsScene.cpp:28
Marble::LayerInterface::runtimeTrace
virtual QString runtimeTrace() const
Returns a debug line for perfo/tracing issues.
Definition: LayerInterface.cpp:32
Marble::LayerInterface::renderPosition
virtual QStringList renderPosition() const =0
Preferred level in the layer stack for the rendering.
Marble::RenderPlugin::newInstance
virtual RenderPlugin * newInstance(const MarbleModel *marbleModel) const =0
Creation a new instance of the plugin.
Marble::LayerInterface::render
virtual bool render(GeoPainter *painter, ViewportParams *viewport, const QString &renderPos, GeoSceneLayer *layer)=0
Renders the content provided by the layer on the viewport.
Marble::RenderPluginInterface::initialize
virtual void initialize()=0
Marble::LayerManager::addLayer
void addLayer(LayerInterface *layer)
Add a layer to be included in rendering.
Definition: LayerManager.cpp:252
QPainter::setFont
void setFont(const QFont &font)
QTime::elapsed
int elapsed() const
QList::append
void append(const T &value)
Marble::LayerManager::showBackground
bool showBackground() const
Definition: LayerManager.cpp:99
Marble::LayerManager::~LayerManager
~LayerManager()
Definition: LayerManager.cpp:94
RenderState.h
QObject
QPainter::setPen
void setPen(const QColor &color)
Marble::LayerManager::floatItems
QList< AbstractFloatItem * > floatItems() const
Returns a list of all FloatItems on the layer.
Definition: LayerManager.cpp:109
Marble::LayerManager::Private
friend class Private
Definition: LayerManager.h:123
QString
QList
GeoPainter.h
Marble::LayerManager::renderPluginInitialized
void renderPluginInitialized(RenderPlugin *renderPlugin)
Signal that a render item has been initialized.
Marble::RenderState
Definition: RenderState.h:22
Marble::LayerManager::setShowBackground
void setShowBackground(bool show)
Definition: LayerManager.cpp:242
Marble::AbstractDataPlugin::whichItemAt
QList< AbstractDataPluginItem * > whichItemAt(const QPoint &curpos)
This function returns all items at the position curpos.
Definition: AbstractDataPlugin.cpp:165
QStringList
Marble::ViewportParams
A public class that controls what is visible in the viewport of a Marble map.
Definition: ViewportParams.h:44
Marble::RenderPlugin::nameId
QString nameId
Definition: RenderPlugin.h:48
QList::end
iterator end()
Marble::LayerManager::whichItemAt
QList< AbstractDataPluginItem * > whichItemAt(const QPoint &curpos) const
Returns all items of dataPlugins on the position curpos.
Definition: LayerManager.cpp:119
Marble::LayerInterface::zValue
virtual qreal zValue() const
Returns the z value of the layer (default: 0.0).
Definition: LayerInterface.cpp:22
Marble::LayerManager::renderState
RenderState renderState() const
Definition: LayerManager.cpp:267
QPainter::restore
void restore()
QTime::currentTime
QTime currentTime()
Marble::GeoPainter::drawText
void drawText(const GeoDataCoordinates &position, const QString &text)
Draws the given text at a given geographic position. The text is drawn starting at the given position...
Definition: GeoPainter.cpp:264
Marble::MarbleModel
The data model (not based on QAbstractModel) for a MarbleWidget.
Definition: MarbleModel.h:97
Marble::RenderPlugin::visible
bool visible
Definition: RenderPlugin.h:52
Marble::LayerManager::setShowRuntimeTrace
void setShowRuntimeTrace(bool show)
Definition: LayerManager.cpp:247
RenderPlugin.h
PluginManager.h
Marble::RenderPluginInterface::isInitialized
virtual bool isInitialized() const =0
QTime::start
void start()
Marble::LayerManager::dataPlugins
QList< AbstractDataPlugin * > dataPlugins() const
Returns a list of all DataPlugins on the layer.
Definition: LayerManager.cpp:114
LayerManager.h
Marble::LayerManager::removeLayer
void removeLayer(LayerInterface *layer)
Remove a layer from being included in rendering.
Definition: LayerManager.cpp:257
AbstractDataPlugin.h
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::parent
QObject * parent() const
Marble::LayerInterface::renderState
virtual RenderState renderState() const
Definition: LayerInterface.cpp:27
Marble::RenderPlugin
The abstract class that creates a renderable item.
Definition: RenderPlugin.h:43
QList::begin
iterator begin()
AbstractDataPluginItem.h
QRegion
Marble::LayerManager::renderLayers
void renderLayers(GeoPainter *painter, ViewportParams *viewport)
Definition: LayerManager.cpp:129
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:40 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal