34 #include <QApplication> 35 #include <QCloseEvent> 36 #include <QDesktopServices> 37 #include <QDockWidget> 39 #include <QFileDialog> 42 #include <QMessageBox> 45 #include <QToolButton> 49 #include <QToolButton> 50 #include <QHBoxLayout> 53 #include <boost/algorithm/string/split.hpp> 54 #include <boost/algorithm/string/trim.hpp> 55 #include <boost/bind.hpp> 56 #include <boost/filesystem.hpp> 62 #include <OgreRenderWindow.h> 63 #include <OgreMeshManager.h> 93 namespace fs = boost::filesystem;
95 #define CONFIG_EXTENSION "rviz" 96 #define CONFIG_EXTENSION_WILDCARD "*." CONFIG_EXTENSION 97 #define RECENT_CONFIG_COUNT 10 99 #if BOOST_FILESYSTEM_VERSION == 3 100 #define BOOST_FILENAME_STRING filename().string 101 #define BOOST_FILE_STRING string 103 #define BOOST_FILENAME_STRING filename 104 #define BOOST_FILE_STRING file_string 111 : QMainWindow( parent )
113 , render_panel_(
NULL)
114 , show_help_action_(
NULL)
116 , recent_configs_menu_(
NULL)
120 , toolbar_actions_(
NULL )
121 , show_choose_new_master_option_( false )
122 , add_tool_action_(
NULL )
123 , remove_tool_menu_(
NULL )
124 , initialized_( false )
127 , post_load_timer_( new QTimer( this ))
129 , toolbar_visible_(true)
143 QToolButton* reset_button =
new QToolButton( );
144 reset_button->setText(
"Reset" );
145 reset_button->setContentsMargins(0,0,0,0);
146 statusBar()->addPermanentWidget( reset_button, 0 );
147 connect( reset_button, SIGNAL( clicked(
bool )),
this, SLOT(
reset() ));
156 statusBar()->addPermanentWidget(
fps_label_, 0 );
159 setWindowTitle(
"RViz[*]" );
190 if ( wall_diff.
toSec() > 1.0 )
197 fps_label_->setText( QString::number(
int(fps)) + QString(
" fps") );
221 Ogre::MeshManager::getSingleton().removeAll();
229 QApplication::exit( 255 );
256 setWindowIcon( app_icon );
263 connect(
this, SIGNAL(
statusUpdate(
const QString& )),
splash_, SLOT( showMessage(
const QString& )));
280 QWidget* central_widget =
new QWidget(
this);
281 QHBoxLayout* central_layout =
new QHBoxLayout;
282 central_layout->setSpacing(0);
283 central_layout->setMargin(0);
311 central_widget->setLayout( central_layout );
326 setCentralWidget( central_widget );
345 connect( tool_man, SIGNAL( toolAdded(
Tool* )),
this, SLOT(
addTool(
Tool* )));
355 if( display_config_file !=
"" )
380 home_dir_ = QDir::toNativeSeparators( QDir::homePath() ).toStdString();
388 ROS_ERROR(
"Moving file [%s] out of the way to recreate it as a directory.",
config_dir_.c_str());
405 if( !reader.
error() )
407 QString last_config_dir, last_image_dir;
408 if( config.
mapGetString(
"Last Config Dir", &last_config_dir ) &&
409 config.
mapGetString(
"Last Image Dir", &last_image_dir ))
417 int num_recent = recent_configs_list.
listLength();
418 for(
int i = 0; i < num_recent; i++ )
453 QAction * file_menu_open_action =
file_menu_->addAction(
"&Open Config",
this, SLOT(
onOpen() ), QKeySequence(
"Ctrl+O" ));
454 this->addAction(file_menu_open_action);
455 QAction * file_menu_save_action =
file_menu_->addAction(
"&Save Config",
this, SLOT(
onSave() ), QKeySequence(
"Ctrl+S" ));
456 this->addAction(file_menu_save_action);
457 QAction * file_menu_save_as_action =
file_menu_->addAction(
"Save Config &As",
this, SLOT(
onSaveAs() ), QKeySequence(
"Ctrl+Shift+S"));
458 this->addAction(file_menu_save_as_action);
469 QAction * file_menu_quit_action =
file_menu_->addAction(
"&Quit",
this, SLOT( close() ), QKeySequence(
"Ctrl+Q" ));
470 this->addAction(file_menu_quit_action);
477 QAction * fullscreen_action =
view_menu_->addAction(
"&Fullscreen",
this, SLOT(
setFullScreen(
bool) ), Qt::Key_F11);
478 fullscreen_action->setCheckable(
true);
479 this->addAction(fullscreen_action);
480 connect(
this, SIGNAL(
fullScreenChange(
bool ) ), fullscreen_action, SLOT( setChecked(
bool ) ) );
484 QMenu* help_menu = menuBar()->addMenu(
"&Help" );
485 help_menu->addAction(
"Show &Help panel",
this, SLOT(
showHelpPanel() ));
486 help_menu->addAction(
"Open rviz wiki in browser",
this, SLOT(
onHelpWiki() ));
487 help_menu->addSeparator();
488 help_menu->addAction(
"&About",
this, SLOT(
onHelpAbout() ));
494 font.setPointSize( font.pointSizeF()*0.9 );
500 toolbar_->setContentsMargins(0,0,0,0);
502 toolbar_->setToolButtonStyle( Qt::ToolButtonTextBesideIcon );
509 QToolButton* add_tool_button =
new QToolButton();
510 add_tool_button->setToolTip(
"Add a new tool" );
511 add_tool_button->setIcon(
loadPixmap(
"package://rviz/icons/plus.png" ) );
512 toolbar_->addWidget( add_tool_button );
516 QToolButton* remove_tool_button =
new QToolButton();
518 remove_tool_button->setPopupMode( QToolButton::InstantPopup );
519 remove_tool_button->setToolTip(
"Remove a tool from the toolbar" );
520 remove_tool_button->setIcon(
loadPixmap(
"package://rviz/icons/minus.png" ) );
521 toolbar_->addWidget( remove_tool_button );
524 QMenu* button_style_menu =
new QMenu();
525 QAction* action_tool_button_icon_only =
new QAction(
"Icon only",
toolbar_actions_ );
526 action_tool_button_icon_only->setData(Qt::ToolButtonIconOnly);
527 button_style_menu->addAction(action_tool_button_icon_only);
528 QAction* action_tool_button_text_only =
new QAction(
"Text only",
toolbar_actions_ );
529 action_tool_button_text_only->setData(Qt::ToolButtonTextOnly);
530 button_style_menu->addAction(action_tool_button_text_only);
531 QAction* action_tool_button_text_beside_icon =
new QAction(
"Text beside icon",
toolbar_actions_ );
532 action_tool_button_text_beside_icon->setData(Qt::ToolButtonTextBesideIcon);
533 button_style_menu->addAction(action_tool_button_text_beside_icon);
534 QAction* action_tool_button_text_under_icon =
new QAction(
"Text under icon",
toolbar_actions_ );
535 action_tool_button_text_under_icon->setData(Qt::ToolButtonTextUnderIcon);
536 button_style_menu->addAction(action_tool_button_text_under_icon);
538 QToolButton* button_style_button =
new QToolButton();
539 button_style_button->setMenu( button_style_menu );
540 button_style_button->setPopupMode( QToolButton::InstantPopup );
541 button_style_button->setToolTip(
"Set toolbar style" );
542 button_style_button->setIcon(
loadPixmap(
"package://rviz/icons/visibility.svg" ) );
543 toolbar_->addWidget( button_style_button );
544 connect( button_style_menu, SIGNAL( triggered( QAction* )),
this, SLOT(
onButtonStyleTool( QAction* )));
549 QList<PanelDockWidget *> dock_widgets = findChildren<PanelDockWidget *>();
551 for ( QList<PanelDockWidget *>::iterator it=dock_widgets.begin(); it!=dock_widgets.end(); it++ )
553 Qt::DockWidgetArea curr_area = dockWidgetArea ( *it );
554 if ( area == curr_area )
556 (*it)->setCollapsed(hide);
561 (*it)->setAllowedAreas( (*it)->allowedAreas() & ~area );
565 (*it)->setAllowedAreas( (*it)->allowedAreas() | area );
594 QDockWidget* dock_widget =
dynamic_cast<QDockWidget*
>( sender() );
597 Qt::DockWidgetArea area = dockWidgetArea( dock_widget );
598 if ( area == Qt::LeftDockWidgetArea )
602 if ( area == Qt::RightDockWidgetArea )
614 QString display_name;
625 if( dialog->exec() == QDialog::Accepted )
630 connect( dock, SIGNAL( dockLocationChanged( Qt::DockWidgetArea )),
this, SLOT(
onDockPanelChange() ) );
648 if( dialog->exec() == QDialog::Accepted )
662 for (; it != end; ++it)
666 std::string display_name = *it;
669 display_name +=
" (default)";
671 if( display_name.find(
home_dir_ ) == 0 )
675 QString qdisplay_name = QString::fromStdString( display_name );
676 QAction*
action =
new QAction( qdisplay_name,
this );
677 action->setData( QString::fromStdString( *it ));
704 std::string path = qpath.toStdString();
705 std::string actual_load_path = path;
706 if( !fs::exists( path ) || fs::is_directory( path ) || fs::is_empty( path ))
709 if( !fs::exists( actual_load_path ))
711 ROS_ERROR(
"Default display config '%s' not found. RViz will be very empty at first.", actual_load_path.c_str() );
723 setWindowModified(
false );
731 connect(
this, SIGNAL(
statusUpdate(
const QString& )), dialog, SLOT( showMessage(
const QString& )));
736 reader.
readFile( config, QString::fromStdString( actual_load_path ));
737 if( !reader.
error() )
767 if( !isWindowModified() )
769 setWindowModified(
true );
785 title = fs::path( path ).BOOST_FILENAME_STRING() +
"[*] - RViz";
787 setWindowTitle( QString::fromStdString( title ));
806 setWindowModified(
false );
838 if( config.
mapGetInt(
"Width", &width ) &&
841 resize( width, height );
844 QString main_window_config;
845 if( config.
mapGetString(
"QMainWindow State", &main_window_config ))
847 restoreState( QByteArray::fromHex( qPrintable( main_window_config )));
851 QList<PanelDockWidget *> dock_widgets = findChildren<PanelDockWidget *>();
853 for ( QList<PanelDockWidget *>::iterator it=dock_widgets.begin(); it!=dock_widgets.end(); it++ )
859 (*it)->load(itConfig);
874 int tool_button_style;
875 if ( config.
mapGetInt(
"toolButtonStyle", &tool_button_style) )
877 toolbar_->setToolButtonStyle(static_cast<Qt::ToolButtonStyle>(tool_button_style));
893 QByteArray window_state = saveState().toHex();
894 config.
mapSetValue(
"QMainWindow State", window_state.constData() );
900 QList<PanelDockWidget *> dock_widgets = findChildren<PanelDockWidget *>();
902 for ( QList<PanelDockWidget *>::iterator it=dock_widgets.begin(); it!=dock_widgets.end(); it++ )
904 (*it)->save(config.
mapMakeChild( (*it)->windowTitle() ));
920 for(
int i = 0; i < num_custom_panels; i++ )
924 QString class_id, name;
934 connect(dock, SIGNAL( dockLocationChanged( Qt::DockWidgetArea )),
this, SLOT(
onDockPanelChange() ) );
935 Panel* panel = qobject_cast<
Panel*>( dock->widget() );
938 panel->
load( panel_config );
966 if( isWindowModified() )
968 QMessageBox box(
this );
969 box.setText(
"There are unsaved changes." );
970 box.setInformativeText( QString::fromStdString(
"Save changes to " +
display_config_file_ +
"?" ));
971 box.setStandardButtons( QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel );
972 box.setDefaultButton( QMessageBox::Save );
974 int result = box.exec();
978 case QMessageBox::Save:
985 QMessageBox box(
this );
986 box.setWindowTitle(
"Failed to save." );
988 box.setInformativeText( QString::fromStdString(
"Save copy of " +
display_config_file_ +
" to another file?" ));
989 box.setStandardButtons( QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel );
990 box.setDefaultButton( QMessageBox::Save );
991 int result = box.exec();
994 case QMessageBox::Save:
997 case QMessageBox::Discard:
1004 case QMessageBox::Discard:
1019 QString
filename = QFileDialog::getOpenFileName(
this,
"Choose a file to open",
1024 if( !filename.isEmpty() )
1026 std::string path = filename.toStdString();
1028 if( !fs::exists( path ))
1030 QString message = filename +
" does not exist!";
1031 QMessageBox::critical(
this,
"Config file does not exist", message );
1051 QMessageBox box(
this );
1052 box.setWindowTitle(
"Failed to save." );
1054 box.setInformativeText( QString::fromStdString(
"Save copy of " +
display_config_file_ +
" to another file?" ));
1055 box.setStandardButtons( QMessageBox::Save | QMessageBox::Cancel );
1056 box.setDefaultButton( QMessageBox::Save );
1057 if( box.exec() == QMessageBox::Save )
1068 QString q_filename = QFileDialog::getSaveFileName(
this,
"Choose a file to save to",
1073 if( !q_filename.isEmpty() )
1075 std::string
filename = q_filename.toStdString();
1076 fs::path path( filename );
1096 connect( dialog, SIGNAL( savedInDirectory(
const QString& )),
1103 QAction*
action =
dynamic_cast<QAction*
>( sender() );
1106 std::string path = action->data().toString().toStdString();
1109 if( !fs::exists( path ))
1111 QString message = QString::fromStdString( path ) +
" does not exist!";
1112 QMessageBox::critical(
this,
"Config file does not exist", message );
1124 action->setIcon( tool->
getIcon() );
1125 action->setIconText( tool->
getName() );
1126 action->setCheckable(
true );
1146 QString name = remove_tool_menu_action->text();
1160 toolbar_->setToolButtonStyle(static_cast<Qt::ToolButtonStyle>(button_style_tool_menu_action->data().toInt()));
1173 QString tool_name = tool->
getName();
1175 for(
int i = 0; i < remove_tool_actions.size(); i++ )
1177 QAction* removal_action = remove_tool_actions.at( i );
1178 if( removal_action->text() == tool_name )
1189 action->setIcon( tool->
getIcon() );
1190 action->setIconText( tool->
getName() );
1198 action->setChecked(
true );
1208 connect( dock, SIGNAL( destroyed( QObject* )),
this, SLOT(
onHelpDestroyed() ));
1227 QDesktopServices::openUrl( QUrl(
"http://www.ros.org/wiki/rviz" ));
1232 QString about_text = QString(
1233 "This is RViz version %1 (%2).\n" 1235 "Compiled against Qt version %3." 1237 "Compiled against OGRE version %4.%5.%6%7 (%8)." 1241 .arg(QT_VERSION_STR)
1242 .arg(OGRE_VERSION_MAJOR)
1243 .arg(OGRE_VERSION_MINOR)
1244 .arg(OGRE_VERSION_PATCH)
1245 .arg(OGRE_VERSION_SUFFIX)
1246 .arg(OGRE_VERSION_NAME);
1248 QMessageBox::about(QApplication::activeWindow(),
"About", about_text);
1253 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) 1254 QList<QTabBar *> tab_bars = findChildren<QTabBar *>(QString(), Qt::FindDirectChildrenOnly);
1256 QList<QTabBar *> tab_bars = findChildren<QTabBar *>(QString());
1259 for ( QList<QTabBar *>::iterator it = tab_bars.begin(); it != tab_bars.end(); it++ )
1261 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) 1262 if((*it)->parent() ==
this)
1265 (*it)->setElideMode( Qt::ElideNone );
1282 if( QAction*
action = qobject_cast<QAction*>( sender() ))
1305 Qt::WindowStates state = windowState();
1306 if (full_screen == state.testFlag(Qt::WindowFullScreen))
1313 menuBar()->setVisible(!full_screen);
1315 statusBar()->setVisible(!full_screen);
1319 setWindowState(state | Qt::WindowFullScreen);
1321 setWindowState(state & ~Qt::WindowFullScreen);
1331 const QString& class_id,
1332 Qt::DockWidgetArea area,
1345 record.
dock =
addPane( name, panel, area, floating );
1346 record.
panel = panel;
1364 dock->setFloating( floating );
1365 dock->setObjectName( name );
1366 addDockWidget( area, dock );
1370 connect(
this, SIGNAL(
fullScreenChange(
bool) ), dock, SLOT( overrideVisibility(
bool) ));
1372 QAction* toggle_action = dock->toggleViewAction();
void indicateToolIsCurrent(Tool *tool)
Mark the given tool as the current one.
void addTool(Tool *tool)
Add the given tool to this frame's toolbar.
QString getErrorMessage() const
void saveToolbars(Config config)
Saves the user configuration of the toolbar to the config node.
void exitFullScreen()
Exit full screen mode.
void hideLeftDock(bool hide)
void setHideButtonVisibility(bool visible)
Hide or show the hide-dock buttons.
void initialize()
Do initialization that wasn't done in constructor. Initializes tool manager, view manager...
void removeTool(Tool *tool)
Remove the given tool from the frame's toolbar.
void fullScreenChange(bool hidden)
Emitted when the interface enters or leaves full screen mode.
QDockWidget * addPanelByName(const QString &name, const QString &class_lookup_name, Qt::DockWidgetArea area=Qt::LeftDockWidgetArea, bool floating=true)
void setValue(const QVariant &value)
Ensures this is a valid Config object, sets the type to Value then sets the value.
void hideRightDock(bool hide)
std::string persistent_settings_file_
bool saveDisplayConfig(const QString &path)
Save display and other settings to the given file.
virtual void load(const Config &config)
Load the properties of all subsystems from the given Config.
QString error_message_
Error message (if any) from most recent saveDisplayConfig() call.
void initialize(Ogre::SceneManager *scene_manager, DisplayContext *manager)
void initialize(VisualizationManager *manager)
QString errorMessage()
Return an error message if the latest read call had an error, or the empty string if not...
std::string display_config_file_
void onDeletePanel()
Delete a panel widget.
QMenu * recent_configs_menu_
void statusUpdate(const QString &message)
Emitted during file-loading and initialization to indicate progress.
void setSplashPath(const QString &splash_path)
Set the path to the "splash" image file. This image is shown during initialization and loading of the...
PanelFactory * panel_factory_
void onRecentConfigSelected()
QString errorMessage()
Return an error message if the latest write call had an error, or the empty string if there was no er...
virtual QWidget * getParentWindow()
int listLength() const
Returns the length of the List in this Node, or 0 if this Node does not have type List...
ROSCPP_DECL bool isInitialized()
Config listChildAt(int i) const
Return the i'th child in the list, if the referenced Node has type List. Returns an Invalid Config if...
bool show_choose_new_master_option_
void onToolbarRemoveTool(QAction *remove_tool_menu_action)
Remove a the tool whose name is given by remove_tool_menu_action->text().
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
Ogre::SceneManager * getSceneManager() const
Returns the Ogre::SceneManager used for the main RenderPanel.
std::string last_image_dir_
void openNewPanelDialog()
virtual QIcon getIcon(const QString &class_id) const
TFSIMD_FORCE_INLINE const tfScalar & y() const
void initialize(const QString &display_config_file="")
Initialize the visualizer. Creates the VisualizationManager.
void savePanels(Config config)
Saves custom panels to the given config node.
bool toolbar_visible_
Indicates if the toolbar should be visible outside of fullscreen mode.
bool isValid() const
Returns true if the internal Node reference is valid, false if not. Same as (getType() != Invalid)...
std::map< Tool *, QAction * > tool_to_action_map_
virtual void setStatus(const QString &message)
bool error()
Return true if the latest write operation had an error.
virtual void onDockPanelVisibilityChange(bool visible)
virtual void closeEvent(QCloseEvent *event)
QMenu * remove_tool_menu_
bool mapGetString(const QString &key, QString *value_out) const
Convenience function for looking up a named string.
void savePersistentSettings()
Save the "general" config file, which has just the few things which should not be saved with a displa...
void mapSetValue(const QString &key, QVariant value)
Set a named child to the given value.
QToolButton * hide_left_dock_button_
A dialog for grabbing a screen shot.
Configuration data storage class.
void loadWindowGeometry(const Config &config)
virtual void setName(const QString &name)
void onToolbarActionTriggered(QAction *action)
Looks up the Tool for this action and calls VisualizationManager::setCurrentTool().
void readFile(Config &config, const QString &filename)
Read config data from a file. This potentially changes the return value sof error(), statusMessage(), and config().
QList< PanelRecord > custom_panels_
void setDisplayConfigFile(const std::string &path)
Set the display config file path.
QStatusBar * original_status_bar_
void setImageSaveDirectory(const QString &directory)
Set the default directory in which to save screenshot images.
RenderPanel * render_panel_
VisualizationManager * manager_
std::string package_path_
QVariant getValue() const
If this config object is valid and is a Value type, this returns its value. Otherwise it returns an i...
void setFullScreen(bool full_screen)
Set full screen mode.
Config mapMakeChild(const QString &key)
Create a child node stored with the given key, and return the child.
void loadPersistentSettings()
Load the "general" config file, which has just the few things which should not be saved with a displa...
bool mapGetBool(const QString &key, bool *value_out) const
Convenience function for looking up a named boolean.
std::string get_version()
The VisualizationManager class is the central manager class of rviz, holding all the Displays...
void setHelpPath(const QString &help_path)
Set the path to the help file. Should contain HTML. Default is a file in the RViz package...
bool error()
Return true if the latest readFile() or readString() call had an error.
QAction * add_tool_action_
TFSIMD_FORCE_INLINE const tfScalar & x() const
QActionGroup * toolbar_actions_
std::map< QAction *, Tool * > action_to_tool_map_
virtual PanelDockWidget * addPane(const QString &name, QWidget *panel, Qt::DockWidgetArea area=Qt::LeftDockWidgetArea, bool floating=true)
#define RECENT_CONFIG_COUNT
void load(const Config &config)
Load the properties of each Display and most editable rviz data.
void initConfigs()
Initialize the default config directory (~/.rviz) and set up the persistent_settings_file_ and displa...
void markLoadingDone()
Set loading_ to false.
bool mapGetInt(const QString &key, int *value_out) const
Convenience function for looking up a named integer.
ROSLIB_DECL std::string getPath(const std::string &package_name)
void save(Config config) const
Save the properties of each Display and most editable rviz data.
void onButtonStyleTool(QAction *button_style_tool_menu_action)
Change the button style of the toolbar.
void loadDisplayConfig(const QString &path)
Load display and other settings from the given file.
bool loading_
True just when loading a display config file, false all other times.
void writeFile(const Config &config, const QString &filename)
Write config data to a file. This potentially changes the return values of error() and statusMessage(...
void updateRecentConfigMenu()
void setDisplayConfigModified()
Call this to let the frame know that something that would get saved in the display config has changed...
void hideDockImpl(Qt::DockWidgetArea area, bool hide)
Config listAppendNew()
Ensure the referenced Node is of type List, append a new Empty Node to the end of the list...
void saveWindowGeometry(Config config)
#define CONFIG_EXTENSION_WILDCARD
void changeMaster()
Save the current state and quit with exit code 255 to signal the wrapper that we would like to restar...
ros::WallTime last_fps_calc_time_
VisualizationFrame(QWidget *parent=0)
QTimer * post_load_timer_
Single-shot timer for calling postLoad() a short time after loadDisplayConfig() finishes.
#define BOOST_FILE_STRING
bool prepareToExit()
Check for unsaved changes, prompt to save config, etc.
QMenu * delete_view_menu_
virtual ToolManager * getToolManager() const
Return a pointer to the ToolManager.
virtual Type * make(const QString &class_id, QString *error_return=NULL)
Instantiate and return a instance of a subclass of Type using makeRaw().
Config mapGetChild(const QString &key) const
If the referenced Node is a Map and it has a child with the given key, return a reference to the chil...
WidgetGeometryChangeDetector * geom_change_detector_
void initToolbars()
Sets up the top toolbar with QToolbuttions for adding/deleting tools and modifiying the tool view...
virtual void load(const Config &config)
Override to load configuration data. This version loads the name of the panel.
std::string default_display_config_file_
void setApp(QApplication *app)
void loadPanels(const Config &config)
Loads custom panels from the given config node.
void markRecentConfig(const std::string &path)
void startUpdate()
Start timers. Creates and starts the update and idle timers, both set to 30Hz (33ms).
QPixmap loadPixmap(QString url, bool fill_cache)
void setShowChooseNewMaster(bool show)
Call this before initialize() to have it take effect.
std::string last_config_dir_
virtual void save(Config config)
Save the properties of each subsystem and most editable rviz data.
void resetTime()
Resets the wall and ROS elapsed time to zero and calls resetDisplays().
void setType(Type new_type)
Set the type of this Config Node.
void refreshTool(Tool *tool)
Refresh the given tool in this frame's' toolbar.
virtual void setHelpPath(const QString &help_path)
QToolButton * hide_right_dock_button_
void configureToolbars(const Config &config)
Applies the user defined toolbar configuration from the given config node.
virtual void leaveEvent(QEvent *event)
QAction * show_help_action_