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

marble

  • sources
  • kde-4.12
  • 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 
28 namespace Marble
29 {
30 
35 bool zValueLessThan( const LayerInterface * const one, const LayerInterface * const two )
36 {
37  Q_ASSERT( one && two );
38  return one->zValue() < two->zValue();
39 }
40 
41 class LayerManager::Private
42 {
43  public:
44  Private( const MarbleModel* model, LayerManager *parent );
45  ~Private();
46 
47  void updateVisibility( bool visible, const QString &nameId );
48 
49  void addPlugins();
50 
51  LayerManager *const q;
52 
53  QList<RenderPlugin *> m_renderPlugins;
54  QList<AbstractFloatItem *> m_floatItems;
55  QList<AbstractDataPlugin *> m_dataPlugins;
56  QList<LayerInterface *> m_internalLayers;
57  const MarbleModel* m_model;
58 
59  bool m_showBackground;
60 
61  bool m_showRuntimeTrace;
62 };
63 
64 LayerManager::Private::Private( const MarbleModel* model, LayerManager *parent )
65  : q( parent ),
66  m_renderPlugins(),
67  m_model( model ),
68  m_showBackground( true ),
69  m_showRuntimeTrace( false )
70 {
71 }
72 
73 LayerManager::Private::~Private()
74 {
75  qDeleteAll( m_renderPlugins );
76 }
77 
78 void LayerManager::Private::updateVisibility( bool visible, const QString &nameId )
79 {
80  emit q->visibilityChanged( nameId, visible );
81 }
82 
83 
84 LayerManager::LayerManager( const MarbleModel* model, QObject *parent )
85  : QObject( parent ),
86  d( new Private( model, this ) )
87 {
88  d->addPlugins();
89  connect( model->pluginManager(), SIGNAL(renderPluginsChanged()), this, SLOT(addPlugins()) );
90 }
91 
92 LayerManager::~LayerManager()
93 {
94  delete d;
95 }
96 
97 bool LayerManager::showBackground() const
98 {
99  return d->m_showBackground;
100 }
101 
102 QList<RenderPlugin *> LayerManager::renderPlugins() const
103 {
104  return d->m_renderPlugins;
105 }
106 
107 QList<AbstractFloatItem *> LayerManager::floatItems() const
108 {
109  return d->m_floatItems;
110 }
111 
112 QList<AbstractDataPlugin *> LayerManager::dataPlugins() const
113 {
114  return d->m_dataPlugins;
115 }
116 
117 QList<AbstractDataPluginItem *> LayerManager::whichItemAt( const QPoint& curpos ) const
118 {
119  QList<AbstractDataPluginItem *> itemList;
120 
121  foreach( AbstractDataPlugin *plugin, d->m_dataPlugins ) {
122  itemList.append( plugin->whichItemAt( curpos ) );
123  }
124  return itemList;
125 }
126 
127 void LayerManager::renderLayers( GeoPainter *painter, ViewportParams *viewport )
128 {
129  const QTime totalTime = QTime::currentTime();
130 
131  QStringList renderPositions;
132 
133  if ( d->m_showBackground ) {
134  renderPositions << "STARS" << "BEHIND_TARGET";
135  }
136 
137  renderPositions << "SURFACE" << "HOVERS_ABOVE_SURFACE" << "ATMOSPHERE"
138  << "ORBIT" << "ALWAYS_ON_TOP" << "FLOAT_ITEM" << "USER_TOOLS";
139 
140  QStringList traceList;
141  foreach( const QString& renderPosition, renderPositions ) {
142  QList<LayerInterface*> layers;
143 
144  // collect all RenderPlugins of current renderPosition
145  foreach( RenderPlugin *renderPlugin, d->m_renderPlugins ) {
146  if ( renderPlugin && renderPlugin->renderPosition().contains( renderPosition ) ) {
147  if ( renderPlugin->enabled() && renderPlugin->visible() ) {
148  if ( !renderPlugin->isInitialized() ) {
149  renderPlugin->initialize();
150  emit renderPluginInitialized( renderPlugin );
151  }
152  layers.push_back( renderPlugin );
153  }
154  }
155  }
156 
157  // collect all internal LayerInterfaces of current renderPosition
158  foreach( LayerInterface *layer, d->m_internalLayers ) {
159  if ( layer && layer->renderPosition().contains( renderPosition ) ) {
160  layers.push_back( layer );
161  }
162  }
163 
164  // sort them according to their zValue()s
165  qSort( layers.begin(), layers.end(), zValueLessThan );
166 
167  // render the layers of the current renderPosition
168  QTime timer;
169  foreach( LayerInterface *layer, layers ) {
170  timer.start();
171  layer->render( painter, viewport, renderPosition, 0 );
172  traceList.append( QString("%2 ms %3").arg( timer.elapsed(),3 ).arg( layer->runtimeTrace() ) );
173  }
174  }
175 
176 
177  if ( d->m_showRuntimeTrace ) {
178  const int totalElapsed = totalTime.elapsed();
179  const int fps = 1000.0/totalElapsed;
180  traceList.append( QString( "Total: %1 ms (%2 fps)" ).arg( totalElapsed, 3 ).arg( fps ) );
181 
182  painter->save();
183  painter->setBackgroundMode( Qt::OpaqueMode );
184  painter->setBackground( Qt::gray );
185  painter->setFont( QFont( "Sans Serif", 10, QFont::Bold ) );
186 
187  int i=0;
188  foreach ( const QString &text, traceList ) {
189  painter->setPen( Qt::black );
190  painter->drawText( QPoint(10,40+15*i), text );
191  painter->setPen( Qt::white );
192  painter->drawText( QPoint(9,39+15*i), text );
193  ++i;
194  }
195  painter->restore();
196  }
197 }
198 
199 void LayerManager::Private::addPlugins()
200 {
201  foreach ( const RenderPlugin *factory, m_model->pluginManager()->renderPlugins() ) {
202  bool alreadyCreated = false;
203  foreach( const RenderPlugin* existing, m_renderPlugins ) {
204  if ( existing->nameId() == factory->nameId() ) {
205  alreadyCreated = true;
206  break;
207  }
208  }
209 
210  if ( alreadyCreated ) {
211  continue;
212  }
213 
214  RenderPlugin *const renderPlugin = factory->newInstance( m_model );
215  Q_ASSERT( renderPlugin && "Plugin returned null when requesting a new instance." );
216  m_renderPlugins.append( renderPlugin );
217 
218  QObject::connect( renderPlugin, SIGNAL(settingsChanged(QString)),
219  q, SIGNAL(pluginSettingsChanged()) );
220  QObject::connect( renderPlugin, SIGNAL(repaintNeeded(QRegion)),
221  q, SIGNAL(repaintNeeded(QRegion)) );
222  QObject::connect( renderPlugin, SIGNAL(visibilityChanged(bool,QString)),
223  q, SLOT(updateVisibility(bool,QString)) );
224 
225  // get float items ...
226  AbstractFloatItem * const floatItem =
227  qobject_cast<AbstractFloatItem *>( renderPlugin );
228  if ( floatItem )
229  m_floatItems.append( floatItem );
230 
231  // ... and data plugins
232  AbstractDataPlugin * const dataPlugin =
233  qobject_cast<AbstractDataPlugin *>( renderPlugin );
234  if( dataPlugin )
235  m_dataPlugins.append( dataPlugin );
236  }
237 }
238 
239 void LayerManager::setShowBackground( bool show )
240 {
241  d->m_showBackground = show;
242 }
243 
244 void LayerManager::setShowRuntimeTrace( bool show )
245 {
246  d->m_showRuntimeTrace = show;
247 }
248 
249 void LayerManager::setVisible( const QString &nameId, bool visible )
250 {
251  foreach( RenderPlugin * renderPlugin, d->m_renderPlugins ) {
252  if ( nameId == renderPlugin->nameId() ) {
253  if ( renderPlugin->visible() == visible )
254  return;
255 
256  renderPlugin->setVisible( visible );
257 
258  return;
259  }
260  }
261 }
262 
263 void LayerManager::addLayer(LayerInterface *layer)
264 {
265  d->m_internalLayers.push_back(layer);
266 }
267 
268 void LayerManager::removeLayer(LayerInterface *layer)
269 {
270  d->m_internalLayers.removeAll(layer);
271 }
272 
273 QList<LayerInterface *> LayerManager::internalLayers() const
274 {
275  return d->m_internalLayers;
276 }
277 
278 }
279 
280 #include "LayerManager.moc"
Marble::RenderPlugin::enabled
bool enabled
Definition: RenderPlugin.h:51
Marble::LayerManager::LayerManager
LayerManager(const MarbleModel *model, QObject *parent=0)
Definition: LayerManager.cpp:84
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.
AbstractFloatItem.h
Marble::LayerManager::internalLayers
QList< LayerInterface * > internalLayers() const
Definition: LayerManager.cpp:273
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:102
Marble::LayerInterface
Definition: LayerInterface.h:25
Marble::AbstractDataPlugin
An abstract class for plugins that show data that has a geo coordinate.
Definition: AbstractDataPlugin.h:45
Marble::MarbleModel::pluginManager
const PluginManager * pluginManager() const
Definition: MarbleModel.cpp:564
QObject
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:27
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:263
Marble::LayerManager::showBackground
bool showBackground() const
Definition: LayerManager.cpp:97
Marble::LayerManager::~LayerManager
~LayerManager()
Definition: LayerManager.cpp:92
Marble::LayerManager::floatItems
QList< AbstractFloatItem * > floatItems() const
Returns a list of all FloatItems on the layer.
Definition: LayerManager.cpp:107
Marble::LayerManager::Private
friend class Private
Definition: LayerManager.h:121
Marble::RenderPlugin::setVisible
void setVisible(bool visible)
settting visible
Definition: RenderPlugin.cpp:149
GeoPainter.h
Marble::LayerManager::renderPluginInitialized
void renderPluginInitialized(RenderPlugin *renderPlugin)
Signal that a render item has been initialized.
Marble::LayerManager::setShowBackground
void setShowBackground(bool show)
Definition: LayerManager.cpp:239
Marble::AbstractDataPlugin::whichItemAt
QList< AbstractDataPluginItem * > whichItemAt(const QPoint &curpos)
This function returns all items at the position curpos.
Definition: AbstractDataPlugin.cpp:160
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
Marble::LayerManager::whichItemAt
QList< AbstractDataPluginItem * > whichItemAt(const QPoint &curpos) const
Returns all items of dataPlugins on the position curpos.
Definition: LayerManager.cpp:117
Marble::LayerInterface::zValue
virtual qreal zValue() const
Returns the z value of the layer (default: 0.0).
Definition: LayerInterface.cpp:22
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:96
Marble::RenderPlugin::visible
bool visible
Definition: RenderPlugin.h:52
Marble::LayerManager::setShowRuntimeTrace
void setShowRuntimeTrace(bool show)
Definition: LayerManager.cpp:244
RenderPlugin.h
PluginManager.h
Marble::RenderPluginInterface::isInitialized
virtual bool isInitialized() const =0
Marble::LayerManager::dataPlugins
QList< AbstractDataPlugin * > dataPlugins() const
Returns a list of all DataPlugins on the layer.
Definition: LayerManager.cpp:112
Marble::LayerManager::setVisible
void setVisible(const QString &nameId, bool visible)
Definition: LayerManager.cpp:249
LayerManager.h
Marble::LayerManager::removeLayer
void removeLayer(LayerInterface *layer)
Remove a layer from being included in rendering.
Definition: LayerManager.cpp:268
AbstractDataPlugin.h
Marble::RenderPlugin
The abstract class that creates a renderable item.
Definition: RenderPlugin.h:43
AbstractDataPluginItem.h
Marble::LayerManager::renderLayers
void renderLayers(GeoPainter *painter, ViewportParams *viewport)
Definition: LayerManager.cpp:127
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:51 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
  • kstars
  • libkdeedu
  •   keduvocdocument
  • 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