00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <stdio.h>
00031
00032 #include <QApplication>
00033 #include <QColor>
00034 #include <QDockWidget>
00035 #include <QFont>
00036 #include <QMetaObject>
00037 #include <QWidget>
00038
00039 #include <OgreSceneManager.h>
00040 #include <OgreSceneNode.h>
00041
00042 #include "rviz/display_context.h"
00043 #include "rviz/ogre_helpers/apply_visibility_bits.h"
00044 #include "rviz/properties/property_tree_model.h"
00045 #include "rviz/properties/status_list.h"
00046 #include "rviz/window_manager_interface.h"
00047 #include "rviz/panel_dock_widget.h"
00048
00049 #include "display.h"
00050
00051 #include <boost/filesystem.hpp>
00052
00053 namespace rviz
00054 {
00055
00056 Display::Display()
00057 : context_( 0 )
00058 , scene_node_( NULL )
00059 , status_( 0 )
00060 , initialized_( false )
00061 , visibility_bits_( 0xFFFFFFFF )
00062 , associated_widget_( NULL )
00063 , associated_widget_panel_( NULL )
00064 {
00065
00066 qRegisterMetaType<ros::Time>();
00067
00068
00069 setValue( false );
00070
00071 connect( this, SIGNAL( changed() ), this, SLOT( onEnableChanged() ));
00072
00073 setDisableChildrenIfFalse(true);
00074 }
00075
00076 Display::~Display()
00077 {
00078 if( scene_node_ )
00079 {
00080 scene_manager_->destroySceneNode( scene_node_ );
00081 }
00082 }
00083
00084 void Display::initialize( DisplayContext* context )
00085 {
00086 context_ = context;
00087 scene_manager_ = context_->getSceneManager();
00088 scene_node_ = scene_manager_->getRootSceneNode()->createChildSceneNode();
00089
00090 update_nh_.setCallbackQueue( context_->getUpdateQueue() );
00091 threaded_nh_.setCallbackQueue( context_->getThreadedQueue() );
00092 fixed_frame_ = context_->getFixedFrame();
00093
00094 onInitialize();
00095
00096 initialized_ = true;
00097 }
00098
00099 void Display::queueRender()
00100 {
00101 if( context_ )
00102 {
00103 context_->queueRender();
00104 }
00105 }
00106
00107 QVariant Display::getViewData( int column, int role ) const
00108 {
00109 switch( role )
00110 {
00111 case Qt::BackgroundRole:
00112 {
00113
00114
00115
00116
00117
00118
00119 return QColor( Qt::white );
00120 }
00121 case Qt::ForegroundRole:
00122 {
00123
00124 if ( getViewFlags( column ) & Qt::ItemIsEnabled )
00125 {
00126 if ( isEnabled() )
00127 {
00128 if ( status_ && status_->getLevel() != StatusProperty::Ok )
00129 {
00130 return StatusProperty::statusColor( status_->getLevel() );
00131 }
00132 else
00133 {
00134
00135 return QColor( 40, 120, 197 );
00136 }
00137 }
00138 else
00139 {
00140 return QColor( Qt::black );
00141 }
00142 }
00143 break;
00144 }
00145 case Qt::FontRole:
00146 {
00147 QFont font;
00148 if ( isEnabled() )
00149 {
00150 font.setBold( true );
00151 }
00152 return font;
00153 }
00154 case Qt::DecorationRole:
00155 {
00156 if( column == 0 )
00157 {
00158 if ( isEnabled() )
00159 {
00160 StatusProperty::Level level = status_ ? status_->getLevel() : StatusProperty::Ok;
00161 switch( level )
00162 {
00163 case StatusProperty::Ok:
00164 return getIcon();
00165 case StatusProperty::Warn:
00166 case StatusProperty::Error:
00167 return status_->statusIcon( status_->getLevel() );
00168 }
00169 }
00170 else
00171 {
00172 return getIcon();
00173 }
00174 }
00175 break;
00176 }
00177 }
00178 return BoolProperty::getViewData( column, role );
00179 }
00180
00181 Qt::ItemFlags Display::getViewFlags( int column ) const
00182 {
00183 return BoolProperty::getViewFlags( column ) | Qt::ItemIsDragEnabled;
00184 }
00185
00186 void Display::setStatus( StatusProperty::Level level, const QString& name, const QString& text )
00187 {
00188 QMetaObject::invokeMethod( this, "setStatusInternal", Qt::QueuedConnection,
00189 Q_ARG( int, level ),
00190 Q_ARG( QString, name ),
00191 Q_ARG( QString, text ));
00192 }
00193
00194 void Display::setStatusInternal( int level, const QString& name, const QString& text )
00195 {
00196 if( !status_ )
00197 {
00198 status_ = new StatusList( "Status" );
00199 addChild( status_, 0 );
00200 }
00201 StatusProperty::Level old_level = status_->getLevel();
00202
00203 status_->setStatus( (StatusProperty::Level) level, name, text );
00204 if( model_ && old_level != status_->getLevel() )
00205 {
00206 model_->emitDataChanged( this );
00207 }
00208 }
00209
00210 void Display::deleteStatus( const QString& name )
00211 {
00212 QMetaObject::invokeMethod( this, "deleteStatusInternal", Qt::QueuedConnection,
00213 Q_ARG( QString, name ));
00214 }
00215
00216 void Display::deleteStatusInternal( const QString& name )
00217 {
00218 if( status_ )
00219 {
00220 status_->deleteStatus( name );
00221 }
00222 }
00223
00224 void Display::clearStatuses()
00225 {
00226 QMetaObject::invokeMethod( this, "clearStatusesInternal", Qt::QueuedConnection );
00227 }
00228
00229 void Display::clearStatusesInternal()
00230 {
00231 if( status_ )
00232 {
00233 StatusProperty::Level old_level = status_->getLevel();
00234 status_->clear();
00235 if( model_ && old_level != StatusProperty::Ok )
00236 {
00237 model_->emitDataChanged( this );
00238 }
00239 }
00240 }
00241
00242 void Display::load( const Config& config )
00243 {
00244
00245 BoolProperty::load( config );
00246
00247 QString name;
00248 if( config.mapGetString( "Name", &name ))
00249 {
00250 setObjectName( name );
00251 }
00252
00253 bool enabled;
00254 if( config.mapGetBool( "Enabled", &enabled ))
00255 {
00256 setEnabled( enabled );
00257 }
00258 }
00259
00260 void Display::save( Config config ) const
00261 {
00262
00263 BoolProperty::save( config );
00264
00265 config.mapSetValue( "Class", getClassId() );
00266 config.mapSetValue( "Name", getName() );
00267 config.mapSetValue( "Enabled", getBool() );
00268 }
00269
00270 void Display::setEnabled( bool enabled )
00271 {
00272 if ( enabled == isEnabled() ) return;
00273 setValue( enabled );
00274 }
00275
00276 void Display::disable()
00277 {
00278 setEnabled( false );
00279 }
00280
00281 bool Display::isEnabled() const
00282 {
00283 return getBool() && (getViewFlags( 0 ) & Qt::ItemIsEnabled);
00284 }
00285
00286 void Display::setFixedFrame( const QString& fixed_frame )
00287 {
00288 fixed_frame_ = fixed_frame;
00289 if( initialized_ )
00290 {
00291 fixedFrameChanged();
00292 }
00293 }
00294
00295 void Display::emitTimeSignal( ros::Time time )
00296 {
00297 Q_EMIT( timeSignal( this, time ) );
00298 }
00299
00300 void Display::reset()
00301 {
00302 clearStatuses();
00303 }
00304
00305 void Display::onEnableChanged()
00306 {
00307 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
00308 queueRender();
00309 if( isEnabled() )
00310 {
00311 scene_node_->setVisible( true );
00312
00313 if( associated_widget_panel_ )
00314 {
00315 associated_widget_panel_->show();
00316 }
00317 else if( associated_widget_ )
00318 {
00319 associated_widget_->show();
00320 }
00321
00322 onEnable();
00323 }
00324 else
00325 {
00326 onDisable();
00327
00328 if( associated_widget_panel_ )
00329 {
00330 if( associated_widget_panel_->isVisible() )
00331 {
00332 associated_widget_panel_->hide();
00333 }
00334 }
00335 else if( associated_widget_ && associated_widget_->isVisible() )
00336 {
00337 associated_widget_->hide();
00338 }
00339
00340 scene_node_->setVisible( false );
00341 }
00342 QApplication::restoreOverrideCursor();
00343 }
00344
00345 void Display::setVisibilityBits( uint32_t bits )
00346 {
00347 visibility_bits_ |= bits;
00348 applyVisibilityBits( visibility_bits_, scene_node_ );
00349 }
00350
00351 void Display::unsetVisibilityBits( uint32_t bits )
00352 {
00353 visibility_bits_ &= ~bits;
00354 applyVisibilityBits( visibility_bits_, scene_node_ );
00355 }
00356
00357 void Display::setAssociatedWidget( QWidget* widget )
00358 {
00359 if( associated_widget_panel_ )
00360 {
00361 disconnect( associated_widget_panel_, SIGNAL( visibilityChanged( bool ) ), this, SLOT( associatedPanelVisibilityChange( bool ) ));
00362 disconnect( associated_widget_panel_, SIGNAL( closed( ) ), this, SLOT( disable( )));
00363 }
00364
00365 associated_widget_ = widget;
00366 if( associated_widget_ )
00367 {
00368 WindowManagerInterface* wm = context_->getWindowManager();
00369 if( wm )
00370 {
00371 associated_widget_panel_ = wm->addPane( getName(), associated_widget_ );
00372 connect( associated_widget_panel_, SIGNAL( visibilityChanged( bool ) ), this, SLOT( associatedPanelVisibilityChange( bool ) ));
00373 connect( associated_widget_panel_, SIGNAL( closed( ) ), this, SLOT( disable( )));
00374 associated_widget_panel_->setIcon( getIcon() );
00375 }
00376 else
00377 {
00378 associated_widget_panel_ = NULL;
00379 associated_widget_->setWindowTitle( getName() );
00380 }
00381 }
00382 else
00383 {
00384 associated_widget_panel_ = NULL;
00385 }
00386 }
00387
00388 void Display::associatedPanelVisibilityChange( bool visible )
00389 {
00390
00391 if ( visible )
00392 {
00393 setEnabled( true );
00394 }
00395 else
00396 {
00397 setEnabled( false );
00398 }
00399 }
00400
00401 void Display::setIcon( const QIcon& icon )
00402 {
00403 icon_=icon;
00404 if ( associated_widget_panel_ )
00405 {
00406 associated_widget_panel_->setIcon( getIcon() );
00407 }
00408 }
00409
00410 void Display::setName( const QString& name )
00411 {
00412 BoolProperty::setName( name );
00413
00414 if( associated_widget_panel_ )
00415 {
00416 associated_widget_panel_->setWindowTitle( name );
00417 associated_widget_panel_->setObjectName( name );
00418 }
00419 else if( associated_widget_ )
00420 {
00421 associated_widget_->setWindowTitle( name );
00422 }
00423 }
00424
00425 }