[Marble-devel] [PATCH 13/13] Make switching clouds layer on/off work again.
Jens-Michael Hoffmann
jensmh at gmx.de
Tue Mar 30 20:37:57 CEST 2010
Make switching clouds layer on/off work again.
This fixes a regression introduced by the tileloader refactoring.
The approach taken is to store the clouds settings in a new class
MapThemeSettings, which is basically a thin wrapper around a
map<layername, on/off>. These settings reside in MarbleModel and
are handed to the TileLoader, which can then decide which layer
to use.
Open questions/remaining issues:
- New method StackedTileLoader::reset() really needed?
Or better adjust one of the existing ones?
- Use ViewParams to store settings, however I tend to not be entirely
happy with passing ViewParams to the StackedTileLoader.
---
marble/src/lib/CMakeLists.txt | 1 +
marble/src/lib/MapThemeSettings.cpp | 35 ++++++++++++++++++++++++++++++++
marble/src/lib/MapThemeSettings.h | 37 ++++++++++++++++++++++++++++++++++
marble/src/lib/MarbleMap.cpp | 10 +++-----
marble/src/lib/MarbleModel.cpp | 21 +++++++++++++++++-
marble/src/lib/MarbleModel.h | 6 +++-
marble/src/lib/StackedTileLoader.cpp | 26 ++++++++++++++++++++---
marble/src/lib/StackedTileLoader.h | 5 ++-
8 files changed, 125 insertions(+), 16 deletions(-)
create mode 100644 marble/src/lib/MapThemeSettings.cpp
create mode 100644 marble/src/lib/MapThemeSettings.h
diff --git a/marble/src/lib/CMakeLists.txt b/marble/src/lib/CMakeLists.txt
index 88a84c4..89615f3 100644
--- a/marble/src/lib/CMakeLists.txt
+++ b/marble/src/lib/CMakeLists.txt
@@ -63,6 +63,7 @@ set(marblewidget_SRCS
blendings/BlendingAlgorithms.cpp
blendings/BlendingFactory.cpp
blendings/SunLightBlending.cpp
+ MapThemeSettings.cpp
MarbleWidget.cpp
MarbleModel.cpp
MarbleMap.cpp
diff --git a/marble/src/lib/MapThemeSettings.cpp b/marble/src/lib/MapThemeSettings.cpp
new file mode 100644
index 0000000..4753bdd
--- /dev/null
+++ b/marble/src/lib/MapThemeSettings.cpp
@@ -0,0 +1,35 @@
+// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+#include "MapThemeSettings.h"
+
+namespace Marble
+{
+
+bool MapThemeSettings::isEnabled( QString const & layer ) const
+{
+ QMap<QString, bool>::const_iterator const pos = m_settings.constFind( layer );
+ if ( pos != m_settings.constEnd() )
+ return pos.value();
+ else
+ return false;
+}
+
+void MapThemeSettings::setEnabled( QString const & layer, bool const enable )
+{
+ m_settings[ layer ] = enable;
+}
+
+}
diff --git a/marble/src/lib/MapThemeSettings.h b/marble/src/lib/MapThemeSettings.h
new file mode 100644
index 0000000..06aad82
--- /dev/null
+++ b/marble/src/lib/MapThemeSettings.h
@@ -0,0 +1,37 @@
+// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef MARBLE_MAP_THEME_SETTINGS_H
+#define MARBLE_MAP_THEME_SETTINGS_H
+
+#include <QtCore/QMap>
+#include <QtCore/QString>
+
+namespace Marble
+{
+
+class MapThemeSettings
+{
+ public:
+ bool isEnabled( QString const & layer ) const;
+ void setEnabled( QString const & layer, bool const enable = true );
+
+ private:
+ QMap<QString, bool> m_settings;
+};
+
+}
+
+#endif
diff --git a/marble/src/lib/MarbleMap.cpp b/marble/src/lib/MarbleMap.cpp
index 8bb64d6..7260778 100644
--- a/marble/src/lib/MarbleMap.cpp
+++ b/marble/src/lib/MarbleMap.cpp
@@ -635,8 +635,7 @@ bool MarbleMap::showGrid() const
bool MarbleMap::showClouds() const
{
- // TODO
- return true;
+ return d->m_model->showClouds();
}
bool MarbleMap::showAtmosphere() const
@@ -1034,16 +1033,15 @@ void MarbleMap::setShowCrosshairs( bool visible )
void MarbleMap::setShowClouds( bool visible )
{
- // TODO
+ d->m_model->setShowClouds( visible );
+ setNeedsUpdate();
}
void MarbleMap::setShowTileId( bool visible )
{
-
d->m_model->layerDecorator()->setShowTileId( visible );
-
-
}
+
void MarbleMap::setShowGrid( bool visible )
{
setPropertyValue( "coordinate-grid", visible );
diff --git a/marble/src/lib/MarbleModel.cpp b/marble/src/lib/MarbleModel.cpp
index 7420c8d..45313e4 100644
--- a/marble/src/lib/MarbleModel.cpp
+++ b/marble/src/lib/MarbleModel.cpp
@@ -24,6 +24,7 @@
#include <QtGui/QSortFilterProxyModel>
#include "MapThemeManager.h"
+#include "MapThemeSettings.h"
#include "global.h"
#include "MarbleDebug.h"
#include "gps/GpsLayer.h"
@@ -87,6 +88,7 @@ class MarbleModelPrivate
m_dataFacade( 0 ),
m_pluginManager( new PluginManager( parent ) ),
m_mapThemeManager( new MapThemeManager( parent )),
+ m_mapThemeSettings( new MapThemeSettings ),
m_mapTheme( 0 ),
m_layerManager( 0 ),
m_downloadManager( new HttpDownloadManager( new FileStoragePolicy(
@@ -100,6 +102,7 @@ class MarbleModelPrivate
~MarbleModelPrivate()
{
delete m_downloadManager;
+ delete m_mapThemeSettings;
}
void resize( int width, int height );
@@ -111,6 +114,7 @@ class MarbleModelPrivate
PluginManager *m_pluginManager;
MapThemeManager *m_mapThemeManager;
+ MapThemeSettings *m_mapThemeSettings;
// View and paint stuff
GeoSceneDocument *m_mapTheme;
@@ -161,8 +165,8 @@ MarbleModel::MarbleModel( QObject *parent )
MarbleModelPrivate::refCounter.ref();
d->m_dataFacade = new MarbleDataFacade( this );
- d->m_tileLoader = new StackedTileLoader( d->m_mapThemeManager, d->m_downloadManager, this );
-
+ d->m_tileLoader = new StackedTileLoader( d->m_mapThemeManager, d->m_mapThemeSettings,
+ d->m_downloadManager, this );
d->m_texmapper = 0;
d->m_fileManager = new FileManager();
@@ -266,6 +270,19 @@ bool MarbleModel::showGps() const
return d->m_gpsLayer->visible();
}
+bool MarbleModel::showClouds() const
+{
+ return d->m_mapThemeSettings->isEnabled( "clouds_data" );
+}
+
+void MarbleModel::setShowClouds( bool const visible )
+{
+ if ( visible == d->m_mapThemeSettings->isEnabled( "clouds_data" ))
+ return;
+ d->m_mapThemeSettings->setEnabled( "clouds_data", visible );
+ d->m_tileLoader->reset();
+}
+
void MarbleModel::setShowGps( bool visible )
{
d->m_gpsLayer->setVisible( visible );
diff --git a/marble/src/lib/MarbleModel.h b/marble/src/lib/MarbleModel.h
index cd21fe9..e522cb6 100644
--- a/marble/src/lib/MarbleModel.h
+++ b/marble/src/lib/MarbleModel.h
@@ -225,13 +225,15 @@ class MARBLE_EXPORT MarbleModel : public QObject
* @return The Gps Data visibility.
*/
bool showGps() const;
+ bool showClouds() const;
- /**
+ void setShowClouds( bool const visible );
+ /**
* @brief Set whether the Gps Data is visible.
* @param visible visibility of the Gps Data.
*/
void setShowGps( bool visible );
-
+
/**
* @brief Start the model's timer polling
* @param time the amount of milliseconds between each poll
diff --git a/marble/src/lib/StackedTileLoader.cpp b/marble/src/lib/StackedTileLoader.cpp
index 0452f59..145998d 100644
--- a/marble/src/lib/StackedTileLoader.cpp
+++ b/marble/src/lib/StackedTileLoader.cpp
@@ -31,6 +31,7 @@
#include "GeoSceneTexture.h"
#include "HttpDownloadManager.h"
#include "MapThemeManager.h"
+#include "MapThemeSettings.h"
#include "MarbleDebug.h"
#include "MarbleDirs.h"
#include "MarbleModel.h"
@@ -61,7 +62,8 @@ public:
StackedTileLoaderPrivate()
: m_datasetProvider( 0 ),
m_mapThemeManager( 0 ),
- m_tileLoader( 0 )
+ m_tileLoader( 0 ),
+ m_settings( 0 )
{
m_tileCache.setMaxCost( 20000 * 1024 ); // Cache size measured in bytes
}
@@ -74,16 +76,19 @@ public:
TileLoader *m_tileLoader;
QHash <TileId, StackedTile*> m_tilesOnDisplay;
QCache <TileId, StackedTile> m_tileCache;
+ MapThemeSettings const * m_settings;
};
StackedTileLoader::StackedTileLoader( MapThemeManager const * const mapThemeManager,
+ MapThemeSettings const * const settings,
HttpDownloadManager * const downloadManager,
MarbleModel * const model )
: d( new StackedTileLoaderPrivate ),
m_parent( model )
{
d->m_mapThemeManager = mapThemeManager;
+ d->m_settings = settings;
initTextureLayers();
d->m_tileLoader = new TileLoader( mapThemeManager, downloadManager );
d->m_tileLoader->setTextureLayers( d->m_textureLayers );
@@ -251,6 +256,12 @@ StackedTile* StackedTileLoader::reloadTile( TileId const & stackedTileId )
return stackedTile;
}
+void StackedTileLoader::reset()
+{
+ d->m_tilesOnDisplay.clear();
+ d->m_tileCache.clear();
+}
+
quint64 StackedTileLoader::volatileCacheLimit() const
{
return d->m_tileCache.maxCost() / 1024;
@@ -391,9 +402,16 @@ StackedTileLoader::findRelevantTextureLayers( TileId const & stackedTileId ) con
QVector<GeoSceneAbstractDataset*>::const_iterator const end = textureLayers.constEnd();
for (; pos != end; ++pos ) {
GeoSceneTexture const * const candidate = dynamic_cast<GeoSceneTexture const *>( *pos );
- if ( candidate && ( !candidate->hasMaximumTileLevel()
- || stackedTileId.zoomLevel() <= candidate->maximumTileLevel() )) {
- result.append( candidate );
+ if ( candidate ) {
+ // FIXME (hack): first layer is always enabled
+ bool const enabled = ( pos == textureLayers.constBegin() )
+ || d->m_settings->isEnabled( candidate->name() );
+ mDebug() << "StackedTileLoader::findRelevantTextureLayers: checking" << candidate->name()
+ << ( enabled ? "enabled" : "disabled" );
+ if ( enabled && ( !candidate->hasMaximumTileLevel()
+ || stackedTileId.zoomLevel() <= candidate->maximumTileLevel() )) {
+ result.append( candidate );
+ }
}
}
return result;
diff --git a/marble/src/lib/StackedTileLoader.h b/marble/src/lib/StackedTileLoader.h
index 335816c..dc414d0 100644
--- a/marble/src/lib/StackedTileLoader.h
+++ b/marble/src/lib/StackedTileLoader.h
@@ -32,10 +32,10 @@ class QString;
namespace Marble
{
-
class StackedTile;
class HttpDownloadManager;
class MapThemeManager;
+class MapThemeSettings;
class MarbleModel;
class GeoSceneLayer;
class GeoSceneTexture;
@@ -67,6 +67,7 @@ class StackedTileLoader : public QObject
* the tiles from a remote resource.
*/
StackedTileLoader( MapThemeManager const * const mapThemeManager,
+ MapThemeSettings const * const settings,
HttpDownloadManager * const downloadManager, MarbleModel * const model );
virtual ~StackedTileLoader();
@@ -83,8 +84,8 @@ class StackedTileLoader : public QObject
* and the zoom level.
*/
StackedTile* loadTile( TileId const &stackedTileId );
-
StackedTile* reloadTile( TileId const & stackedTileId );
+ void reset();
/**
* Resets the internal tile hash.
--
1.7.0.3
More information about the Marble-devel
mailing list