diff --git a/visualization/motion_planning_tasks/src/CMakeLists.txt b/visualization/motion_planning_tasks/src/CMakeLists.txt index 830b58c1..e0032d77 100644 --- a/visualization/motion_planning_tasks/src/CMakeLists.txt +++ b/visualization/motion_planning_tasks/src/CMakeLists.txt @@ -1,6 +1,10 @@ set(MOVEIT_LIB_NAME motion_planning_tasks_rviz_plugin) -qt_wrap_ui(UIC_FILES task_panel.ui) +qt_wrap_ui(UIC_FILES + task_panel.ui + task_view.ui + task_settings.ui +) add_library(${MOVEIT_LIB_NAME} factory_model.cpp diff --git a/visualization/motion_planning_tasks/src/task_panel.cpp b/visualization/motion_planning_tasks/src/task_panel.cpp index 18160db4..31ff4b5c 100644 --- a/visualization/motion_planning_tasks/src/task_panel.cpp +++ b/visualization/motion_planning_tasks/src/task_panel.cpp @@ -79,13 +79,15 @@ TaskPanel::TaskPanel(QWidget* parent) : rviz::Panel(parent), d_ptr(new TaskPanelPrivate(this)) { Q_D(TaskPanel); - // connect signals - connect(d->actionRemoveTaskTreeRows, SIGNAL(triggered()), this, SLOT(removeSelectedStages())); - connect(d->actionAddLocalTask, SIGNAL(triggered()), this, SLOT(addTask())); - connect(d->button_show_stage_dock_widget, SIGNAL(clicked()), this, SLOT(showStageDockWidget())); - connect(d->tasks_view->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), - this, SLOT(onCurrentStageChanged(QModelIndex,QModelIndex))); + d->tasks_widget = new TaskView(this); + d->settings_widget = new TaskSettings(this); + layout()->addWidget(d->tasks_widget); + layout()->addWidget(d->settings_widget); + + connect(d->button_show_stage_dock_widget, SIGNAL(clicked()), this, SLOT(showStageDockWidget())); + connect(d->button_show_settings, SIGNAL(toggled(bool)), d->settings_widget, SLOT(setVisible(bool))); + d->settings_widget->setVisible(d->button_show_settings->isChecked()); // if still undefined, this becomes the global instance if (TaskPanelPrivate::global_instance_.isNull()) { @@ -127,14 +129,41 @@ void TaskPanel::decUseCount() TaskPanelPrivate::TaskPanelPrivate(TaskPanel *q_ptr) : q_ptr(q_ptr) - , settings(new rviz::PropertyTreeModel(new rviz::Property, q_ptr)) { setupUi(q_ptr); - // init tasks view + button_show_stage_dock_widget->setEnabled(bool(getStageFactory())); +} + +void TaskPanel::onInitialize() +{ + d_ptr->window_manager_ = vis_manager_->getWindowManager(); +} + +void TaskPanel::save(rviz::Config config) const +{ + rviz::Panel::save(config); +} + +void TaskPanel::load(const rviz::Config& config) +{ + rviz::Panel::load(config); +} + +void TaskPanel::showStageDockWidget() +{ + rviz::PanelDockWidget *dock = getStageDockWidget(d_ptr->window_manager_); + if (dock) dock->show(); +} + + +TaskViewPrivate::TaskViewPrivate(TaskView *q_ptr) + : q_ptr(q_ptr) +{ + setupUi(q_ptr); + MetaTaskListModel *meta_model = &MetaTaskListModel::instance(); StageFactoryPtr factory = getStageFactory(); if (factory) meta_model->setMimeTypes( { factory->mimeType() } ); - else button_show_stage_dock_widget->setEnabled(false); tasks_view->setModel(meta_model); tasks_view->setSelectionMode(QAbstractItemView::ExtendedSelection); @@ -148,30 +177,23 @@ TaskPanelPrivate::TaskPanelPrivate(TaskPanel *q_ptr) // init actions tasks_view->addActions({actionRemoveTaskTreeRows, actionAddLocalTask}); - - initSettings(settings->getRoot()); - settings_view->setModel(settings); -} - -void TaskPanelPrivate::initSettings(rviz::Property* root) -{ } std::pair -TaskPanelPrivate::getTaskListModel(const QModelIndex &index) const +TaskViewPrivate::getTaskListModel(const QModelIndex &index) const { auto *meta_model = static_cast(tasks_view->model()); return meta_model->getTaskListModel(index); } std::pair -TaskPanelPrivate::getTaskModel(const QModelIndex &index) const +TaskViewPrivate::getTaskModel(const QModelIndex &index) const { auto *meta_model = static_cast(tasks_view->model()); return meta_model->getTaskModel(index); } -void TaskPanelPrivate::unlock(TaskDisplay* display) +void TaskViewPrivate::unlock(TaskDisplay* display) { if (locked_display_ && locked_display_ != display) { locked_display_->clearMarkers(); @@ -180,56 +202,38 @@ void TaskPanelPrivate::unlock(TaskDisplay* display) } } -void TaskPanel::onInitialize() +TaskView::TaskView(QWidget *parent) + : QWidget(parent), d_ptr(new TaskViewPrivate(this)) { - d_ptr->window_manager_ = vis_manager_->getWindowManager(); + Q_D(TaskView); + + // connect signals + connect(d->actionRemoveTaskTreeRows, SIGNAL(triggered()), this, SLOT(removeSelectedStages())); + connect(d->actionAddLocalTask, SIGNAL(triggered()), this, SLOT(addTask())); + + connect(d->tasks_view->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), + this, SLOT(onCurrentStageChanged(QModelIndex,QModelIndex))); + } -void TaskPanel::save(rviz::Config config) const -{ - rviz::Panel::save(config); - d_ptr->settings->getRoot()->save(config); -} - -void TaskPanel::load(const rviz::Config& config) -{ - rviz::Panel::load(config); - d_ptr->settings->getRoot()->load(config); -} - -void TaskPanel::addTask() +void TaskView::addTask() { TaskListModel* task_list_model = nullptr; QModelIndex current = d_ptr->tasks_view->currentIndex(); - if (!current.isValid()) { - // create new TaskDisplay - TaskDisplay *display = new TaskDisplay(); - display->setName("Motion Planning Task"); - vis_manager_->getRootDisplayGroup()->addDisplay(display); - display->initialize(vis_manager_); - display->setEnabled(true); - - task_list_model = &display->getTaskListModel(); - } else + if (current.isValid()) { task_list_model = d_ptr->getTaskListModel(current).first; - - task_list_model->insertModel(new LocalTaskModel(task_list_model), current.row()); + task_list_model->insertModel(new LocalTaskModel(task_list_model), current.row()); + } } -void TaskPanel::showStageDockWidget() -{ - rviz::PanelDockWidget *dock = getStageDockWidget(d_ptr->window_manager_); - if (dock) dock->show(); -} - -void TaskPanel::removeSelectedStages() +void TaskView::removeSelectedStages() { auto *m = d_ptr->tasks_view->model(); for (const auto &range : d_ptr->tasks_view->selectionModel()->selection()) m->removeRows(range.top(), range.bottom()-range.top()+1, range.parent()); } -void TaskPanel::onCurrentStageChanged(const QModelIndex ¤t, const QModelIndex &previous) +void TaskView::onCurrentStageChanged(const QModelIndex ¤t, const QModelIndex &previous) { BaseTaskModel *task; QModelIndex task_index; @@ -255,7 +259,7 @@ void TaskPanel::onCurrentStageChanged(const QModelIndex ¤t, const QModelIn } } -void TaskPanel::onCurrentSolutionChanged(const QModelIndex ¤t, const QModelIndex &previous) +void TaskView::onCurrentSolutionChanged(const QModelIndex ¤t, const QModelIndex &previous) { TaskDisplay *display = d_ptr->getTaskListModel(d_ptr->tasks_view->currentIndex()).second; d_ptr->unlock(display); @@ -274,7 +278,7 @@ void TaskPanel::onCurrentSolutionChanged(const QModelIndex ¤t, const QMode vis->showTrajectory(solution, true); } -void TaskPanel::onSolutionSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected) +void TaskView::onSolutionSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected) { QItemSelectionModel *sm = d_ptr->solutions_view->selectionModel(); const QModelIndexList& selected_rows = sm->selectedRows(); @@ -292,6 +296,19 @@ void TaskPanel::onSolutionSelectionChanged(const QItemSelection &selected, const } } + +TaskSettingsPrivate::TaskSettingsPrivate(TaskSettings *q_ptr) + : q_ptr(q_ptr) +{ + setupUi(q_ptr); +} + +TaskSettings::TaskSettings(QWidget *parent) + : QWidget(parent), d_ptr(new TaskSettingsPrivate(this)) +{ + Q_D(TaskSettings); +} + } #include "moc_task_panel.cpp" diff --git a/visualization/motion_planning_tasks/src/task_panel.h b/visualization/motion_planning_tasks/src/task_panel.h index ace98e0d..845712f9 100644 --- a/visualization/motion_planning_tasks/src/task_panel.h +++ b/visualization/motion_planning_tasks/src/task_panel.h @@ -82,9 +82,23 @@ public: void load(const rviz::Config& config) override; void save(rviz::Config config) const override; +protected Q_SLOTS: + void showStageDockWidget(); +}; + + +class MetaTaskListModel; +class TaskViewPrivate; +class TaskView : public QWidget { + Q_OBJECT + Q_DECLARE_PRIVATE(TaskView) + TaskViewPrivate *d_ptr; + +public: + TaskView(QWidget* parent = 0); + public Q_SLOTS: void addTask(); - void showStageDockWidget(); protected Q_SLOTS: void removeSelectedStages(); @@ -93,4 +107,15 @@ protected Q_SLOTS: void onSolutionSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); }; + +class TaskSettingsPrivate; +class TaskSettings : public QWidget { + Q_OBJECT + Q_DECLARE_PRIVATE(TaskSettings) + TaskSettingsPrivate *d_ptr; + +public: + TaskSettings(QWidget* parent = 0); +}; + } diff --git a/visualization/motion_planning_tasks/src/task_panel.ui b/visualization/motion_planning_tasks/src/task_panel.ui index 7fa9a4d6..8d178229 100644 --- a/visualization/motion_planning_tasks/src/task_panel.ui +++ b/visualization/motion_planning_tasks/src/task_panel.ui @@ -14,9 +14,6 @@ Tasks Panel - - 0 - 0 @@ -30,193 +27,49 @@ 0 - - - 0 - - - - - :/icons/tasks.png:/icons/tasks.png - - - - - - - 0 + + + + + ... - - 0 + + + :/icons/settings.png:/icons/settings.png - - 0 + + true - - 0 + + + + + + Qt::Horizontal - - 0 + + + 40 + 20 + - - - - 6 - - - - - Task Tree - - - - - - - - 18 - 18 - - - - - - - - :/icons/new-stage.png:/icons/new-stage.png - - - - - - - - - - 0 - 0 - - - - Qt::Horizontal - - - - - 2 - 0 - - - - Qt::ActionsContextMenu - - - false - - - - - - 1 - 0 - - - - QAbstractItemView::ExtendedSelection - - - false - - - true - - - true - - - false - - - - - - - - - - :/icons/settings.png:/icons/settings.png - - - - - - - 0 + + + + + + ... - - 0 + + + :/icons/new-stage.png:/icons/new-stage.png - - 0 - - - 0 - - - 0 - - - - - Settings - - - - - - - - - + + + - - - Remove - - - Remove selected rows - - - Del - - - Qt::WidgetShortcut - - - - - Add task - - - - - rviz::PropertyTreeWidget - QTreeView -
rviz/properties/property_tree_widget.h
-
- - moveit_rviz_plugin::TaskListView - QTreeView -
task_list_model.h
-
- - moveit_rviz_plugin::AutoAdjustingTreeView - QTreeView -
task_list_model.h
-
-
diff --git a/visualization/motion_planning_tasks/src/task_panel_p.h b/visualization/motion_planning_tasks/src/task_panel_p.h index af56ae55..0dcd8a85 100644 --- a/visualization/motion_planning_tasks/src/task_panel_p.h +++ b/visualization/motion_planning_tasks/src/task_panel_p.h @@ -40,6 +40,8 @@ #include "task_panel.h" #include "ui_task_panel.h" +#include "ui_task_view.h" +#include "ui_task_settings.h" #include #include @@ -55,7 +57,19 @@ class TaskPanelPrivate : public Ui_TaskPanel { public: TaskPanelPrivate(TaskPanel *q_ptr); - void initSettings(rviz::Property *root); + TaskPanel* q_ptr; + TaskView* tasks_widget; + TaskSettings* settings_widget; + + rviz::WindowManagerInterface* window_manager_; + static QPointer global_instance_; + static uint global_use_count_; +}; + + +class TaskViewPrivate : public Ui_TaskView { +public: + TaskViewPrivate(TaskView *q_ptr); /// retrieve TaskListModel corresponding to given index inline std::pair @@ -68,13 +82,16 @@ public: /// unlock locked_display_ if given display is different void unlock(TaskDisplay *display); - TaskPanel* q_ptr; - rviz::PropertyTreeModel* settings; + TaskView *q_ptr; QPointer locked_display_; - rviz::WindowManagerInterface* window_manager_; +}; - static QPointer global_instance_; - static uint global_use_count_; + +class TaskSettingsPrivate : public Ui_TaskSettings { +public: + TaskSettingsPrivate(TaskSettings *q_ptr); + + TaskSettings *q_ptr; }; } diff --git a/visualization/motion_planning_tasks/src/task_settings.ui b/visualization/motion_planning_tasks/src/task_settings.ui new file mode 100644 index 00000000..3a76384c --- /dev/null +++ b/visualization/motion_planning_tasks/src/task_settings.ui @@ -0,0 +1,69 @@ + + + moveit_rviz_plugin::TaskSettings + + + + 0 + 0 + 400 + 300 + + + + Settings + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Settings + + + + + + + + + + + + + rviz::PropertyTreeWidget + QTreeView +
rviz/properties/property_tree_widget.h
+
+
+ + +
diff --git a/visualization/motion_planning_tasks/src/task_view.ui b/visualization/motion_planning_tasks/src/task_view.ui new file mode 100644 index 00000000..fe25c1d4 --- /dev/null +++ b/visualization/motion_planning_tasks/src/task_view.ui @@ -0,0 +1,150 @@ + + + moveit_rviz_plugin::TaskView + + + + 0 + 0 + 400 + 300 + + + + Tasks Panel + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 6 + + + + + Task Tree + + + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + 2 + 0 + + + + Qt::ActionsContextMenu + + + false + + + + + + 1 + 0 + + + + QAbstractItemView::ExtendedSelection + + + false + + + true + + + true + + + false + + + + + + + + + + Remove + + + Remove selected rows + + + Del + + + Qt::WidgetShortcut + + + + + Add task + + + + + + moveit_rviz_plugin::TaskListView + QTreeView +
task_list_model.h
+
+ + moveit_rviz_plugin::AutoAdjustingTreeView + QTreeView +
task_list_model.h
+
+
+ + +