[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