35 #include <QApplication> 36 #include <QCloseEvent> 37 #include <QDesktopServices> 38 #include <QDockWidget> 40 #include <QFileDialog> 43 #include <QMessageBox> 46 #include <QToolButton> 50 #include <QToolButton> 51 #include <QHBoxLayout> 54 #include <boost/algorithm/string/split.hpp> 55 #include <boost/algorithm/string/trim.hpp> 56 #include <boost/bind.hpp> 57 #include <boost/filesystem.hpp> 63 #include <OgreRenderWindow.h> 64 #include <OgreMeshManager.h> 96 namespace fs = boost::filesystem;
98 #define CONFIG_EXTENSION "rviz" 99 #define CONFIG_EXTENSION_WILDCARD "*." CONFIG_EXTENSION 100 #define RECENT_CONFIG_COUNT 10 102 #if BOOST_FILESYSTEM_VERSION == 3 103 #define BOOST_FILENAME_STRING filename().string 104 #define BOOST_FILE_STRING string 106 #define BOOST_FILENAME_STRING filename 107 #define BOOST_FILE_STRING file_string 113 : QMainWindow(parent)
115 , render_panel_(nullptr)
116 , show_help_action_(nullptr)
118 , file_menu_(nullptr)
119 , recent_configs_menu_(nullptr)
123 , toolbar_actions_(nullptr)
124 , show_choose_new_master_option_(false)
125 , add_tool_action_(nullptr)
126 , remove_tool_menu_(nullptr)
127 , initialized_(false)
130 , post_load_timer_(new QTimer(this))
132 , toolbar_visible_(true)
147 QToolButton* reset_button =
new QToolButton();
148 reset_button->setText(
"Reset");
149 reset_button->setContentsMargins(0, 0, 0, 0);
150 statusBar()->addPermanentWidget(reset_button, 0);
151 connect(reset_button, SIGNAL(clicked(
bool)),
this, SLOT(
reset()));
160 statusBar()->addPermanentWidget(
fps_label_, 0);
163 setWindowTitle(
"RViz[*]");
193 if (wall_diff.
toSec() > 1.0)
200 fps_label_->setText(QString::number(
int(fps)) + QString(
" fps"));
224 Ogre::MeshManager::getSingleton().removeAll();
232 QApplication::exit(255);
260 setWindowIcon(app_icon);
267 connect(
this, SIGNAL(
statusUpdate(
const QString&)),
splash_, SLOT(showMessage(
const QString&)));
274 app_->processEvents();
284 app_->processEvents();
286 QWidget* central_widget =
new QWidget(
this);
287 QHBoxLayout* central_layout =
new QHBoxLayout;
288 central_layout->setSpacing(0);
289 central_layout->setMargin(0);
317 central_widget->setLayout(central_layout);
321 app_->processEvents();
327 app_->processEvents();
333 app_->processEvents();
335 setCentralWidget(central_widget);
339 app_->processEvents();
347 app_->processEvents();
353 app_->processEvents();
358 connect(tool_man, SIGNAL(toolAdded(
Tool*)),
this, SLOT(
addTool(
Tool*)));
367 app_->processEvents();
369 if (display_config_file !=
"")
380 app_->processEvents();
395 home_dir_ = QDir::toNativeSeparators(QDir::homePath()).toStdString();
404 ROS_ERROR(
"Moving file [%s] out of the way to recreate it as a directory.",
config_dir_.c_str());
423 QString last_config_dir, last_image_dir;
424 if (config.
mapGetString(
"Last Config Dir", &last_config_dir) &&
433 int num_recent = recent_configs_list.
listLength();
434 for (
int i = 0; i < num_recent; i++)
469 QAction* file_menu_open_action =
470 file_menu_->addAction(
"&Open Config",
this, SLOT(
onOpen()), QKeySequence(
"Ctrl+O"));
471 this->addAction(file_menu_open_action);
472 QAction* file_menu_save_action =
473 file_menu_->addAction(
"&Save Config",
this, SLOT(
onSave()), QKeySequence(
"Ctrl+S"));
474 this->addAction(file_menu_save_action);
475 QAction* file_menu_save_as_action =
476 file_menu_->addAction(
"Save Config &As",
this, SLOT(
onSaveAs()), QKeySequence(
"Ctrl+Shift+S"));
477 this->addAction(file_menu_save_as_action);
489 QAction* file_menu_quit_action =
490 file_menu_->addAction(
"&Quit",
this, SLOT(close()), QKeySequence(
"Ctrl+Q"));
491 file_menu_quit_action->setObjectName(
"actQuit");
492 this->addAction(file_menu_quit_action);
499 QAction* fullscreen_action =
501 fullscreen_action->setCheckable(
true);
504 connect(
this, SIGNAL(
fullScreenChange(
bool)), fullscreen_action, SLOT(setChecked(
bool)));
507 QMenu* help_menu = menuBar()->addMenu(
"&Help");
508 help_menu->addAction(
"Show &Help panel",
this, SLOT(
showHelpPanel()));
509 help_menu->addAction(
"Open rviz wiki in browser",
this, SLOT(
onHelpWiki()));
510 help_menu->addSeparator();
511 help_menu->addAction(
"&About",
this, SLOT(
onHelpAbout()));
517 font.setPointSize(font.pointSizeF() * 0.9);
523 toolbar_->setContentsMargins(0, 0, 0, 0);
525 toolbar_->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
532 QToolButton* add_tool_button =
new QToolButton();
533 add_tool_button->setToolTip(
"Add a new tool");
534 add_tool_button->setIcon(
loadPixmap(
"package://rviz/icons/plus.png"));
535 toolbar_->addWidget(add_tool_button);
539 QToolButton* remove_tool_button =
new QToolButton();
541 remove_tool_button->setPopupMode(QToolButton::InstantPopup);
542 remove_tool_button->setToolTip(
"Remove a tool from the toolbar");
543 remove_tool_button->setIcon(
loadPixmap(
"package://rviz/icons/minus.png"));
544 toolbar_->addWidget(remove_tool_button);
547 QMenu* button_style_menu =
new QMenu(
toolbar_);
548 QAction* action_tool_button_icon_only =
new QAction(
"Icon only",
toolbar_actions_);
549 action_tool_button_icon_only->setData(Qt::ToolButtonIconOnly);
550 button_style_menu->addAction(action_tool_button_icon_only);
551 QAction* action_tool_button_text_only =
new QAction(
"Text only",
toolbar_actions_);
552 action_tool_button_text_only->setData(Qt::ToolButtonTextOnly);
553 button_style_menu->addAction(action_tool_button_text_only);
554 QAction* action_tool_button_text_beside_icon =
new QAction(
"Text beside icon",
toolbar_actions_);
555 action_tool_button_text_beside_icon->setData(Qt::ToolButtonTextBesideIcon);
556 button_style_menu->addAction(action_tool_button_text_beside_icon);
557 QAction* action_tool_button_text_under_icon =
new QAction(
"Text under icon",
toolbar_actions_);
558 action_tool_button_text_under_icon->setData(Qt::ToolButtonTextUnderIcon);
559 button_style_menu->addAction(action_tool_button_text_under_icon);
561 QToolButton* button_style_button =
new QToolButton();
562 button_style_button->setMenu(button_style_menu);
563 button_style_button->setPopupMode(QToolButton::InstantPopup);
564 button_style_button->setToolTip(
"Set toolbar style");
565 button_style_button->setIcon(
loadPixmap(
"package://rviz/icons/visibility.svg"));
566 toolbar_->addWidget(button_style_button);
567 connect(button_style_menu, SIGNAL(triggered(QAction*)),
this, SLOT(
onButtonStyleTool(QAction*)));
572 QList<PanelDockWidget*> dock_widgets = findChildren<PanelDockWidget*>();
574 for (QList<PanelDockWidget*>::iterator it = dock_widgets.begin(); it != dock_widgets.end(); it++)
576 Qt::DockWidgetArea curr_area = dockWidgetArea(*it);
577 if (area == curr_area)
579 (*it)->setCollapsed(hide);
584 (*it)->setAllowedAreas((*it)->allowedAreas() & ~area);
588 (*it)->setAllowedAreas((*it)->allowedAreas() | area);
617 QDockWidget* dock_widget =
dynamic_cast<QDockWidget*
>(sender());
620 Qt::DockWidgetArea area = dockWidgetArea(dock_widget);
621 if (area == Qt::LeftDockWidgetArea)
625 if (area == Qt::RightDockWidgetArea)
638 if (dialog.exec() == QDialog::Accepted)
641 preferences_ = boost::make_shared<Preferences>(temp_preferences);
649 QString display_name;
655 if (dialog->exec() == QDialog::Accepted)
660 connect(dock, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
this, SLOT(
onDockPanelChange()));
675 if (dialog->exec() == QDialog::Accepted)
689 for (; it != end; ++it)
693 std::string display_name = *it;
696 display_name +=
" (default)";
702 QString qdisplay_name = QString::fromStdString(display_name);
703 QAction*
action =
new QAction(qdisplay_name,
this);
704 action->setData(QString::fromStdString(*it));
731 std::string path = qpath.toStdString();
732 fs::path actual_load_path = path;
733 bool valid_load_path = fs::is_regular_file(actual_load_path);
735 if (!valid_load_path && fs::portable_posix_name(path))
739 actual_load_path = fs::path(
config_dir_) / actual_load_path;
740 if ((valid_load_path = fs::is_regular_file(actual_load_path)))
741 path = actual_load_path.string();
744 if (!valid_load_path)
746 actual_load_path = (fs::path(
package_path_) /
"default.rviz");
747 if (!(valid_load_path = fs::is_regular_file(actual_load_path)))
749 ROS_ERROR(
"Default display config '%s' not found. RViz will be very empty at first.",
750 actual_load_path.c_str());
766 setWindowModified(
false);
769 std::unique_ptr<LoadingDialog> dialog;
774 connect(
this, SIGNAL(
statusUpdate(
const QString&)), dialog.get(), SLOT(showMessage(
const QString&)));
775 app_->processEvents();
780 reader.
readFile(config, QString::fromStdString(full_path));
811 if (!isWindowModified())
813 setWindowModified(
true);
829 title = fs::path(path).BOOST_FILENAME_STRING() +
"[*] - RViz";
831 setWindowTitle(QString::fromStdString(title));
851 setWindowModified(
false);
886 resize(width, height);
889 QString main_window_config;
890 if (config.
mapGetString(
"QMainWindow State", &main_window_config))
892 restoreState(QByteArray::fromHex(qPrintable(main_window_config)));
896 QList<PanelDockWidget*> dock_widgets = findChildren<PanelDockWidget*>();
898 for (QList<PanelDockWidget*>::iterator it = dock_widgets.begin(); it != dock_widgets.end(); it++)
904 (*it)->load(itConfig);
919 int tool_button_style;
920 if (config.
mapGetInt(
"toolButtonStyle", &tool_button_style))
922 toolbar_->setToolButtonStyle(static_cast<Qt::ToolButtonStyle>(tool_button_style));
938 QByteArray window_state = saveState().toHex();
939 config.
mapSetValue(
"QMainWindow State", window_state.constData());
945 QList<PanelDockWidget*> dock_widgets = findChildren<PanelDockWidget*>();
947 for (QList<PanelDockWidget*>::iterator it = dock_widgets.begin(); it != dock_widgets.end(); it++)
965 for (
int i = 0; i < num_custom_panels; i++)
969 QString class_id, name;
978 connect(dock, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
this, SLOT(
onDockPanelChange()));
979 Panel* panel = qobject_cast<
Panel*>(dock->widget());
982 panel->
load(panel_config);
1021 if (isWindowModified() &&
preferences_->prompt_save_on_exit)
1023 QMessageBox box(
this);
1024 box.setText(
"There are unsaved changes.");
1025 box.setInformativeText(QString::fromStdString(
"Save changes to " +
display_config_file_ +
"?"));
1026 box.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
1027 box.setDefaultButton(QMessageBox::Save);
1029 int result = box.exec();
1033 case QMessageBox::Save:
1040 QMessageBox box(
this);
1041 box.setWindowTitle(
"Failed to save.");
1043 box.setInformativeText(
1045 box.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
1046 box.setDefaultButton(QMessageBox::Save);
1047 int result = box.exec();
1050 case QMessageBox::Save:
1053 case QMessageBox::Discard:
1059 case QMessageBox::Discard:
1074 QString
filename = QFileDialog::getOpenFileName(
this,
"Choose a file to open",
1079 if (!filename.isEmpty())
1081 std::string path = filename.toStdString();
1083 if (!fs::exists(path))
1085 QString message = filename +
" does not exist!";
1086 QMessageBox::critical(
this,
"Config file does not exist", message);
1106 QMessageBox box(
this);
1107 box.setWindowTitle(
"Failed to save.");
1109 box.setInformativeText(
1111 box.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel);
1112 box.setDefaultButton(QMessageBox::Save);
1113 if (box.exec() == QMessageBox::Save)
1124 QString q_filename = QFileDialog::getSaveFileName(
this,
"Choose a file to save to",
1129 if (!q_filename.isEmpty())
1131 std::string
filename = q_filename.toStdString();
1132 fs::path path(filename);
1153 connect(dialog, SIGNAL(savedInDirectory(
const QString&)),
this,
1160 QAction*
action =
dynamic_cast<QAction*
>(sender());
1163 std::string path = action->data().toString().toStdString();
1166 if (!fs::exists(path))
1168 QString message = QString::fromStdString(path) +
" does not exist!";
1169 QMessageBox::critical(
this,
"Config file does not exist", message);
1181 action->setIcon(tool->
getIcon());
1182 action->setIconText(tool->
getName());
1183 action->setCheckable(
true);
1201 it->second->setIconText(name);
1216 QString name = remove_tool_menu_action->text();
1231 static_cast<Qt::ToolButtonStyle>(button_style_tool_menu_action->data().toInt()));
1244 QString tool_name = tool->
getName();
1246 for (
int i = 0; i < remove_tool_actions.size(); i++)
1248 QAction* removal_action = remove_tool_actions.at(i);
1249 if (removal_action->text() == tool_name)
1260 action->setIcon(tool->
getIcon());
1261 action->setIconText(tool->
getName());
1269 action->setChecked(
true);
1279 connect(dock, SIGNAL(destroyed(QObject*)),
this, SLOT(
onHelpDestroyed()));
1298 QDesktopServices::openUrl(QUrl(
"http://wiki.ros.org/rviz"));
1303 QString about_text = QString(
"This is RViz version %1 (%2).\n" 1305 "Compiled against Qt version %3." 1307 "Compiled against OGRE version %4.%5.%6%7 (%8).")
1310 .arg(QT_VERSION_STR)
1311 .arg(OGRE_VERSION_MAJOR)
1312 .arg(OGRE_VERSION_MINOR)
1313 .arg(OGRE_VERSION_PATCH)
1314 .arg(OGRE_VERSION_SUFFIX)
1315 .arg(OGRE_VERSION_NAME);
1317 QMessageBox::about(QApplication::activeWindow(),
"About", about_text);
1322 QList<QTabBar*> tab_bars = findChildren<QTabBar*>(QString(), Qt::FindDirectChildrenOnly);
1323 for (QList<QTabBar*>::iterator it = tab_bars.begin(); it != tab_bars.end(); it++)
1325 (*it)->setElideMode(Qt::ElideNone);
1341 if (QAction*
action = qobject_cast<QAction*>(sender()))
1363 Qt::WindowStates state = windowState();
1364 if (full_screen == state.testFlag(Qt::WindowFullScreen))
1371 menuBar()->setVisible(!full_screen);
1373 statusBar()->setVisible(!full_screen);
1377 setWindowState(state | Qt::WindowFullScreen);
1379 setWindowState(state & ~Qt::WindowFullScreen);
1389 const QString& class_id,
1390 Qt::DockWidgetArea area,
1403 record.
dock =
addPane(name, panel, area, floating);
1404 record.
panel = panel;
1422 addDockWidget(area, dock);
1425 dock->setFloating(floating);
1426 dock->setObjectName(name);
1430 connect(
this, SIGNAL(
fullScreenChange(
bool)), dock, SLOT(overrideVisibility(
bool)));
1432 QAction* toggle_action = dock->toggleViewAction();
boost::shared_ptr< Preferences > preferences_
void openPreferencesDialog()
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.
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.
void setValue(const QVariant &value)
Ensures this is a valid Config object, sets the type to Value then sets the value.
PanelDockWidget * addPane(const QString &name, QWidget *panel, Qt::DockWidgetArea area=Qt::LeftDockWidgetArea, bool floating=false) override
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.
QVariant getValue() const
If this config object is valid and is a Value type, this returns its value. Otherwise it returns an i...
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...
ROSCPP_DECL bool isInitialized()
void leaveEvent(QEvent *event) override
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)
std::string last_image_dir_
void openNewPanelDialog()
int listLength() const
Returns the length of the List in this Node, or 0 if this Node does not have type List...
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...
bool mapGetString(const QString &key, QString *value_out) const
Convenience function for looking up a named string.
void initialize(const QString &display_config_file="")
Initialize the visualizer. Creates the VisualizationManager.
Ogre::SceneManager * getSceneManager() const override
Returns the Ogre::SceneManager used for the main RenderPanel.
void displayConfigFileChanged(const QString &fullpath)
Emitted when the config file has changed.
void savePanels(Config config)
Saves custom panels to the given config node.
QWidget * getParentWindow() override
bool toolbar_visible_
Indicates if the toolbar should be visible outside of fullscreen mode.
bool error()
Return true if the latest write operation had an error.
virtual void onDockPanelVisibilityChange(bool visible)
QMenu * remove_tool_menu_
void savePersistentSettings()
Save the "general" config file, which has just the few things which should not be saved with a displa...
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_
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 setStatus(const QString &message) override
void loadWindowGeometry(const Config &config)
void closeEvent(QCloseEvent *event) override
virtual void setName(const QString &name)
void onToolbarActionTriggered(QAction *action)
Looks up the Tool for this action and calls VisualizationManager::setCurrentTool().
VisualizationFrame(QWidget *parent=nullptr)
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 save(Config config) const
Save the properties of each Display and most editable rviz data.
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_
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...
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_
void loadPreferences(const Config &config)
QActionGroup * toolbar_actions_
#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.
QString getErrorMessage() const
ROSLIB_DECL std::string getPath(const std::string &package_name)
void savePreferences(Config config)
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.
QDockWidget * addPanelByName(const QString &name, const QString &class_lookup_name, Qt::DockWidgetArea area=Qt::LeftDockWidgetArea, bool floating=false)
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(...
bool loadDisplayConfigHelper(const std::string &full_path)
Load display and other settings from the given full file path.
bool mapGetBool(const QString &key, bool *value_out) const
Convenience function for looking up a named boolean.
~VisualizationFrame() override
virtual Type * make(const QString &class_id, QString *error_return=nullptr)
Instantiate and return a instance of a subclass of Type using makeRaw().
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...
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...
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_
QTimer * post_load_timer_
#define BOOST_FILE_STRING
bool prepareToExit()
Check for unsaved changes, prompt to save config, etc.
QMenu * delete_view_menu_
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 onToolNameChanged(const QString &name)
React to name changes of a tool, updating the name of the associated QAction.
void setApp(QApplication *app)
bool mapGetInt(const QString &key, int *value_out) const
Convenience function for looking up a named integer.
void loadPanels(const Config &config)
Loads custom panels from the given config node.
void markRecentConfig(const std::string &path)
ToolManager * getToolManager() const override
Return a pointer to the ToolManager.
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().
QIcon getIcon(const QString &class_id) const override
void setType(Type new_type)
Set the type of this Config Node.
std::map< QAction *, Tool * > action_to_tool_map_
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.
QAction * show_help_action_