Skip to content

Commit 53fb95c

Browse files
committed
Reuse closed globe window
1 parent 5dd8e45 commit 53fb95c

2 files changed

Lines changed: 66 additions & 55 deletions

File tree

‎src/plugins/globe/globe_plugin.cpp‎

Lines changed: 64 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ GlobePlugin::GlobePlugin( QgisInterface* theQgisInterface )
7575
, mQActionPointer( NULL )
7676
, mQActionSettingsPointer( NULL )
7777
, mOsgViewer( 0 )
78+
, mViewerWidget( 0 )
7879
, mQgisMapLayer( 0 )
7980
, mTileSource( 0 )
8081
, mElevationManager( NULL )
@@ -215,81 +216,88 @@ void GlobePlugin::initGui()
215216

216217
void GlobePlugin::run()
217218
{
219+
if ( mViewerWidget == 0 )
220+
{
218221
#ifdef QGISDEBUG
219-
if ( !getenv( "OSGNOTIFYLEVEL" ) ) osgEarth::setNotifyLevel( osg::DEBUG_INFO );
222+
if ( !getenv( "OSGNOTIFYLEVEL" ) ) osgEarth::setNotifyLevel( osg::DEBUG_INFO );
220223
#endif
221224

222-
if ( mOsgViewer == 0 ) mOsgViewer = new osgViewer::Viewer();
225+
mOsgViewer = new osgViewer::Viewer();
223226

224-
// install the programmable manipulator.
225-
osgEarth::Util::EarthManipulator* manip = new osgEarth::Util::EarthManipulator();
226-
mOsgViewer->setCameraManipulator( manip );
227+
// install the programmable manipulator.
228+
osgEarth::Util::EarthManipulator* manip = new osgEarth::Util::EarthManipulator();
229+
mOsgViewer->setCameraManipulator( manip );
227230

228-
mIsGlobeRunning = true;
229-
setupProxy();
231+
mIsGlobeRunning = true;
232+
setupProxy();
230233

231-
if ( getenv( "MAPXML" ) )
232-
{
233-
char* mapxml = getenv( "MAPXML" );
234-
QgsDebugMsg( mapxml );
235-
osg::Node* node = osgDB::readNodeFile( mapxml );
236-
if ( !node )
234+
if ( getenv( "MAPXML" ) )
237235
{
238-
QgsDebugMsg( "Failed to load earth file " );
239-
return;
236+
char* mapxml = getenv( "MAPXML" );
237+
QgsDebugMsg( mapxml );
238+
osg::Node* node = osgDB::readNodeFile( mapxml );
239+
if ( !node )
240+
{
241+
QgsDebugMsg( "Failed to load earth file " );
242+
return;
243+
}
244+
mMapNode = MapNode::findMapNode( node );
245+
mRootNode = new osg::Group();
246+
mRootNode->addChild( node );
247+
}
248+
else
249+
{
250+
setupMap();
240251
}
241-
mMapNode = MapNode::findMapNode( node );
242-
mRootNode = new osg::Group();
243-
mRootNode->addChild( node );
244-
}
245-
else
246-
{
247-
setupMap();
248-
}
249252

250-
// create a surface to house the controls
251-
mControlCanvas = ControlCanvas::get( mOsgViewer );
252-
mRootNode->addChild( mControlCanvas );
253+
// create a surface to house the controls
254+
mControlCanvas = ControlCanvas::get( mOsgViewer );
255+
mRootNode->addChild( mControlCanvas );
253256

254-
mOsgViewer->setSceneData( mRootNode );
257+
mOsgViewer->setSceneData( mRootNode );
255258

256-
mOsgViewer->setThreadingModel( osgViewer::Viewer::SingleThreaded );
259+
mOsgViewer->setThreadingModel( osgViewer::Viewer::SingleThreaded );
257260

258-
mOsgViewer->addEventHandler( new osgViewer::StatsHandler() );
259-
mOsgViewer->addEventHandler( new osgViewer::WindowSizeHandler() );
260-
mOsgViewer->addEventHandler( new osgViewer::ThreadingHandler() );
261-
mOsgViewer->addEventHandler( new osgViewer::LODScaleHandler() );
262-
mOsgViewer->addEventHandler( new osgGA::StateSetManipulator( mOsgViewer->getCamera()->getOrCreateStateSet() ) );
263-
// add a handler that will automatically calculate good clipping planes
264-
//mOsgViewer->addEventHandler( new osgEarth::Util::AutoClipPlaneHandler() );
265-
// osgEarth benefits from pre-compilation of GL objects in the pager. In newer versions of
266-
// OSG, this activates OSG's IncrementalCompileOpeartion in order to avoid frame breaks.
267-
mOsgViewer->getDatabasePager()->setDoPreCompile( true );
261+
mOsgViewer->addEventHandler( new osgViewer::StatsHandler() );
262+
mOsgViewer->addEventHandler( new osgViewer::WindowSizeHandler() );
263+
mOsgViewer->addEventHandler( new osgViewer::ThreadingHandler() );
264+
mOsgViewer->addEventHandler( new osgViewer::LODScaleHandler() );
265+
mOsgViewer->addEventHandler( new osgGA::StateSetManipulator( mOsgViewer->getCamera()->getOrCreateStateSet() ) );
266+
// add a handler that will automatically calculate good clipping planes
267+
//mOsgViewer->addEventHandler( new osgEarth::Util::AutoClipPlaneHandler() );
268+
// osgEarth benefits from pre-compilation of GL objects in the pager. In newer versions of
269+
// OSG, this activates OSG's IncrementalCompileOpeartion in order to avoid frame breaks.
270+
mOsgViewer->getDatabasePager()->setDoPreCompile( true );
268271

269-
mSettingsDialog->setViewer( mOsgViewer );
272+
mSettingsDialog->setViewer( mOsgViewer );
270273

271274
#ifdef GLOBE_OSG_STANDALONE_VIEWER
272-
mOsgViewer->run();
275+
mOsgViewer->run();
273276
#endif
274277

275-
QWidget* viewerWidget = new osgEarth::QtGui::ViewerWidget( mOsgViewer );
276-
viewerWidget->setGeometry( 100, 100, 1024, 800 );
277-
viewerWidget->show();
278+
mViewerWidget = new osgEarth::QtGui::ViewerWidget( mOsgViewer );
279+
mViewerWidget->setGeometry( 100, 100, 1024, 800 );
280+
mViewerWidget->show();
278281

279-
// Set a home viewpoint
280-
manip->setHomeViewpoint(
281-
osgEarth::Util::Viewpoint( osg::Vec3d( -90, 0, 0 ), 0.0, -90.0, 4e7 ),
282-
1.0 );
282+
// Set a home viewpoint
283+
manip->setHomeViewpoint(
284+
osgEarth::Util::Viewpoint( osg::Vec3d( -90, 0, 0 ), 0.0, -90.0, 4e7 ),
285+
1.0 );
283286

284-
setupControls();
287+
setupControls();
285288

286-
// add our handlers
287-
mOsgViewer->addEventHandler( new FlyToExtentHandler( this ) );
288-
mOsgViewer->addEventHandler( new KeyboardControlHandler( manip, mQGisIface ) );
289+
// add our handlers
290+
mOsgViewer->addEventHandler( new FlyToExtentHandler( this ) );
291+
mOsgViewer->addEventHandler( new KeyboardControlHandler( manip, mQGisIface ) );
289292

290-
mOsgViewer->addEventHandler( new QueryCoordinatesHandler( this, mElevationManager,
291-
mMapNode->getMap()->getProfile()->getSRS() )
292-
);
293+
mOsgViewer->addEventHandler( new QueryCoordinatesHandler( this, mElevationManager,
294+
mMapNode->getMap()->getProfile()->getSRS() )
295+
);
296+
}
297+
else
298+
{
299+
mViewerWidget->show();
300+
}
293301
}
294302

295303
void GlobePlugin::settings()
@@ -878,7 +886,8 @@ bool NavigationControl::handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActi
878886
_mouse_down_event = NULL;
879887
break;
880888
default:
881-
/* ignore */;
889+
/* ignore */
890+
;
882891
}
883892
if ( _mouse_down_event )
884893
{

‎src/plugins/globe/globe_plugin.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ class GlobePlugin : public QObject, public QgisPlugin
112112
QAction * mQActionSettingsPointer;
113113
//! OSG Viewer
114114
osgViewer::Viewer* mOsgViewer;
115+
//! QT viewer widget
116+
QWidget* mViewerWidget;
115117
//! Settings Dialog
116118
QgsGlobePluginDialog *mSettingsDialog;
117119
//! OSG root node

0 commit comments

Comments
 (0)