Go to the documentation of this file.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 <sstream>
00033
00034 #include "rviz/display_context.h"
00035 #include "rviz/failed_view_controller.h"
00036 #include "rviz/properties/enum_property.h"
00037 #include "rviz/properties/property_tree_model.h"
00038 #include "rviz/render_panel.h"
00039 #include "rviz/view_controller.h"
00040
00041 #include "rviz/view_manager.h"
00042
00043 namespace rviz
00044 {
00045
00046 ViewManager::ViewManager( DisplayContext* context )
00047 : context_( context )
00048 , root_property_( new ViewControllerContainer )
00049 , property_model_( new PropertyTreeModel( root_property_ ))
00050 , factory_( new PluginlibFactory<ViewController>( "rviz", "rviz::ViewController" ))
00051 , current_( NULL )
00052 , render_panel_( NULL )
00053 {
00054 property_model_->setDragDropClass( "view-controller" );
00055 connect( property_model_, SIGNAL( configChanged() ), this, SIGNAL( configChanged() ));
00056 }
00057
00058 ViewManager::~ViewManager()
00059 {
00060 delete property_model_;
00061 delete factory_;
00062 }
00063
00064 void ViewManager::initialize()
00065 {
00066 setCurrent( create( "rviz/Orbit" ), false );
00067 }
00068
00069 void ViewManager::update( float wall_dt, float ros_dt )
00070 {
00071 if( getCurrent() )
00072 {
00073 getCurrent()->update( wall_dt, ros_dt );
00074 }
00075 }
00076
00077 ViewController* ViewManager::create( const QString& class_id )
00078 {
00079 QString error;
00080 ViewController* view = factory_->make( class_id, &error );
00081 if( !view )
00082 {
00083 view = new FailedViewController( class_id, error );
00084 }
00085 view->initialize( context_ );
00086
00087 return view;
00088 }
00089
00090 ViewController* ViewManager::getCurrent() const
00091 {
00092 return current_;
00093 }
00094
00095 void ViewManager::setCurrentFrom( ViewController* source_view )
00096 {
00097 if( source_view == NULL )
00098 {
00099 return;
00100 }
00101
00102 ViewController* previous = getCurrent();
00103 if( source_view != previous )
00104 {
00105 ViewController* new_current = copy( source_view );
00106
00107 setCurrent( new_current, false );
00108 Q_EMIT configChanged();
00109 }
00110 }
00111
00112 void ViewManager::onCurrentDestroyed( QObject* obj )
00113 {
00114 if( obj == current_ )
00115 {
00116 current_ = NULL;
00117 }
00118 }
00119
00120 void ViewManager::setCurrent( ViewController* new_current, bool mimic_view )
00121 {
00122 ViewController* previous = getCurrent();
00123 if( previous )
00124 {
00125 if( mimic_view )
00126 {
00127 new_current->mimic( previous );
00128 }
00129 else
00130 {
00131 new_current->transitionFrom( previous );
00132 }
00133 disconnect( previous, SIGNAL( destroyed( QObject* )), this, SLOT( onCurrentDestroyed( QObject* )));
00134 }
00135 new_current->setName( "Current View" );
00136 connect( new_current, SIGNAL( destroyed( QObject* )), this, SLOT( onCurrentDestroyed( QObject* )));
00137 current_ = new_current;
00138 root_property_->addChildToFront( new_current );
00139 delete previous;
00140
00141 if( render_panel_ )
00142 {
00143
00144
00145
00146 render_panel_->setViewController( new_current );
00147 }
00148 Q_EMIT currentChanged();
00149 }
00150
00151 void ViewManager::setCurrentViewControllerType( const QString& new_class_id )
00152 {
00153 setCurrent( create( new_class_id ), true );
00154 }
00155
00156 void ViewManager::copyCurrentToList()
00157 {
00158 ViewController* current = getCurrent();
00159 if( current )
00160 {
00161 ViewController* new_copy = copy( current );
00162 new_copy->setName( factory_->getClassName( new_copy->getClassId() ));
00163 root_property_->addChild( new_copy );
00164 }
00165 }
00166
00167 ViewController* ViewManager::getViewAt( int index ) const
00168 {
00169 if( index < 0 )
00170 {
00171 index = 0;
00172 }
00173 return qobject_cast<ViewController*>( root_property_->childAt( index + 1 ));
00174 }
00175
00176 int ViewManager::getNumViews() const
00177 {
00178 int count = root_property_->numChildren();
00179 if( count <= 0 )
00180 {
00181 return 0;
00182 }
00183 else
00184 {
00185 return count-1;
00186 }
00187 }
00188
00189 void ViewManager::add( ViewController* view, int index )
00190 {
00191 if( index < 0 )
00192 {
00193 index = root_property_->numChildren();
00194 }
00195 else
00196 {
00197 index++;
00198 }
00199 property_model_->getRoot()->addChild( view, index );
00200 }
00201
00202 ViewController* ViewManager::take( ViewController* view )
00203 {
00204 for( int i = 0; i < getNumViews(); i++ )
00205 {
00206 if( getViewAt( i ) == view )
00207 {
00208 return qobject_cast<ViewController*>( root_property_->takeChildAt( i + 1 ));
00209 }
00210 }
00211 return NULL;
00212 }
00213
00214 ViewController* ViewManager::takeAt( int index )
00215 {
00216 if( index < 0 )
00217 {
00218 return NULL;
00219 }
00220 return qobject_cast<ViewController*>( root_property_->takeChildAt( index + 1 ));
00221 }
00222
00223 void ViewManager::load( const Config& config )
00224 {
00225 Config current_config = config.mapGetChild( "Current" );
00226 QString class_id;
00227 if( current_config.mapGetString( "Class", &class_id ))
00228 {
00229 ViewController* new_current = create( class_id );
00230 new_current->load( current_config );
00231 setCurrent( new_current, false );
00232 }
00233
00234 Config saved_views_config = config.mapGetChild( "Saved" );
00235 root_property_->removeChildren( 1 );
00236 int num_saved = saved_views_config.listLength();
00237 for( int i = 0; i < num_saved; i++ )
00238 {
00239 Config view_config = saved_views_config.listChildAt( i );
00240
00241 if( view_config.mapGetString( "Class", &class_id ))
00242 {
00243 ViewController* view = create( class_id );
00244 view->load( view_config );
00245 add( view );
00246 }
00247 }
00248 }
00249
00250 void ViewManager::save( Config config ) const
00251 {
00252 getCurrent()->save( config.mapMakeChild( "Current" ));
00253
00254 Config saved_views_config = config.mapMakeChild( "Saved" );
00255 for( int i = 0; i < getNumViews(); i++ )
00256 {
00257 getViewAt( i )->save( saved_views_config.listAppendNew() );
00258 }
00259 }
00260
00261 ViewController* ViewManager::copy( ViewController* source )
00262 {
00263 Config config;
00264 source->save( config );
00265
00266 ViewController* copy_of_source = create( source->getClassId() );
00267 copy_of_source->load( config );
00268
00269 return copy_of_source;
00270 }
00271
00272 void ViewManager::setRenderPanel( RenderPanel* render_panel )
00273 {
00274 render_panel_ = render_panel;
00275 }
00276
00277 Qt::ItemFlags ViewControllerContainer::getViewFlags( int column ) const
00278 {
00279 return Property::getViewFlags( column ) | Qt::ItemIsDropEnabled;
00280 }
00281
00282 void ViewControllerContainer::addChild( Property* child, int index )
00283 {
00284 if( index == 0 )
00285 {
00286 index = 1;
00287 }
00288 Property::addChild( child, index );
00289 }
00290
00291 void ViewControllerContainer::addChildToFront( Property* child )
00292 {
00293 Property::addChild( child, 0 );
00294 }
00295
00296 }