diff --git a/visualization/motion_planning_tasks/src/task_display.cpp b/visualization/motion_planning_tasks/src/task_display.cpp index 92da2f82..abc0746f 100644 --- a/visualization/motion_planning_tasks/src/task_display.cpp +++ b/visualization/motion_planning_tasks/src/task_display.cpp @@ -146,6 +146,16 @@ void TaskDisplay::reset() trajectory_visual_->reset(); } +void TaskDisplay::save(rviz::Config config) const +{ + Display::save(config); +} + +void TaskDisplay::load(const rviz::Config &config) +{ + Display::load(config); +} + void TaskDisplay::onEnable() { Display::onEnable(); diff --git a/visualization/motion_planning_tasks/src/task_display.h b/visualization/motion_planning_tasks/src/task_display.h index d9d34ffa..4a834f68 100644 --- a/visualization/motion_planning_tasks/src/task_display.h +++ b/visualization/motion_planning_tasks/src/task_display.h @@ -77,8 +77,10 @@ public: void loadRobotModel(); - virtual void update(float wall_dt, float ros_dt); - virtual void reset(); + void update(float wall_dt, float ros_dt) override; + void reset() override; + void save(rviz::Config config) const; + void load(const rviz::Config &config); // overrides from Display virtual void onInitialize(); diff --git a/visualization/motion_planning_tasks/src/task_panel.cpp b/visualization/motion_planning_tasks/src/task_panel.cpp index 9b254fd4..b164be26 100644 --- a/visualization/motion_planning_tasks/src/task_panel.cpp +++ b/visualization/motion_planning_tasks/src/task_panel.cpp @@ -142,11 +142,13 @@ void TaskPanel::onInitialize() void TaskPanel::save(rviz::Config config) const { rviz::Panel::save(config); + d_ptr->tasks_widget->save(config.mapMakeChild("tasks_view")); } void TaskPanel::load(const rviz::Config& config) { rviz::Panel::load(config); + d_ptr->tasks_widget->load(config.mapGetChild("tasks_view")); } void TaskPanel::showStageDockWidget() @@ -247,6 +249,57 @@ TaskView::TaskView(QWidget *parent) onCurrentStageChanged(d->tasks_view->currentIndex(), QModelIndex()); } +void TaskView::save(rviz::Config config) +{ + auto writeSplitterSizes = [&config](QSplitter* splitter, const QString& key) { + rviz::Config group = config.mapMakeChild(key); + for (int s : splitter->sizes()) { + rviz::Config item = group.listAppendNew(); + item.setValue(s); + } + }; + writeSplitterSizes(d_ptr->tasks_property_splitter, "property_splitter"); + writeSplitterSizes(d_ptr->tasks_solutions_splitter, "solutions_splitter"); + + auto writeColumnSizes = [&config](QTreeView* view, const QString& key) { + rviz::Config group = config.mapMakeChild(key); + for (int c = 0, end = view->header()->count(); c != end; ++c) { + rviz::Config item = group.listAppendNew(); + item.setValue(view->columnWidth(c)); + } + }; + writeColumnSizes(d_ptr->tasks_view, "tasks_view_columns"); + writeColumnSizes(d_ptr->solutions_view, "solutions_view_columns"); +} + +void TaskView::load(const rviz::Config &config) +{ + if (!config.isValid()) return; + + auto readSizes = [&config](const QString& key) { + rviz::Config group = config.mapGetChild(key); + QList sizes, empty; + for (int i = 0; i < group.listLength(); ++i) { + rviz::Config item = group.listChildAt(i); + if (item.getType() != rviz::Config::Value) return empty; + QVariant value = item.getValue(); + bool ok = false; + int int_value = value.toInt(&ok); + if (!ok) return empty; + sizes << int_value; + } + return sizes; + }; + d_ptr->tasks_property_splitter->setSizes(readSizes("property_splitter")); + d_ptr->tasks_solutions_splitter->setSizes(readSizes("solutions_splitter")); + + int column = 0; + for (int w : readSizes("tasks_view_columns")) + d_ptr->tasks_view->setColumnWidth(++column, w); + for (int w : readSizes("solutions_view_columns")) + d_ptr->tasks_view->setColumnWidth(++column, w); +} + void TaskView::addTask() { QModelIndex current = d_ptr->tasks_view->currentIndex(); diff --git a/visualization/motion_planning_tasks/src/task_panel.h b/visualization/motion_planning_tasks/src/task_panel.h index 845712f9..5323e1ec 100644 --- a/visualization/motion_planning_tasks/src/task_panel.h +++ b/visualization/motion_planning_tasks/src/task_panel.h @@ -97,6 +97,9 @@ class TaskView : public QWidget { public: TaskView(QWidget* parent = 0); + void save(rviz::Config config); + void load(const rviz::Config& config); + public Q_SLOTS: void addTask();