TaskPanel: separate widget classes

TaskPanel, TaskView, TaskSettings, ...
This commit is contained in:
janEbert 2018-02-06 17:57:45 +01:00 committed by Robert Haschke
parent 3a4dc6755b
commit 193d3fef67
7 changed files with 379 additions and 244 deletions

View File

@ -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

View File

@ -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<TaskListModel*, TaskDisplay*>
TaskPanelPrivate::getTaskListModel(const QModelIndex &index) const
TaskViewPrivate::getTaskListModel(const QModelIndex &index) const
{
auto *meta_model = static_cast<MetaTaskListModel*>(tasks_view->model());
return meta_model->getTaskListModel(index);
}
std::pair<BaseTaskModel*, QModelIndex>
TaskPanelPrivate::getTaskModel(const QModelIndex &index) const
TaskViewPrivate::getTaskModel(const QModelIndex &index) const
{
auto *meta_model = static_cast<MetaTaskListModel*>(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());
}
}
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 &current, const QModelIndex &previous)
void TaskView::onCurrentStageChanged(const QModelIndex &current, const QModelIndex &previous)
{
BaseTaskModel *task;
QModelIndex task_index;
@ -255,7 +259,7 @@ void TaskPanel::onCurrentStageChanged(const QModelIndex &current, const QModelIn
}
}
void TaskPanel::onCurrentSolutionChanged(const QModelIndex &current, const QModelIndex &previous)
void TaskView::onCurrentSolutionChanged(const QModelIndex &current, 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 &current, 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"

View File

@ -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);
};
}

View File

@ -14,9 +14,6 @@
<string>Tasks Panel</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
@ -30,56 +27,38 @@
<number>0</number>
</property>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_tasks">
<attribute name="icon">
<iconset resource="resources.qrc">
<normaloff>:/icons/tasks.png</normaloff>:/icons/tasks.png</iconset>
</attribute>
<attribute name="title">
<string/>
</attribute>
<layout class="QVBoxLayout" name="tab_tasks_layout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QHBoxLayout" name="tasks_view_label_layout">
<property name="spacing">
<number>6</number>
</property>
<item>
<widget class="QLabel" name="tasks_view_label">
<widget class="QToolButton" name="button_show_settings">
<property name="text">
<string>Task Tree</string>
<string>...</string>
</property>
<property name="icon">
<iconset resource="resources.qrc">
<normaloff>:/icons/settings.png</normaloff>:/icons/settings.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="button_show_stage_dock_widget">
<property name="maximumSize">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>18</width>
<height>18</height>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="button_show_stage_dock_widget">
<property name="text">
<string/>
<string>...</string>
</property>
<property name="icon">
<iconset resource="resources.qrc">
@ -89,134 +68,8 @@
</item>
</layout>
</item>
<item>
<widget class="QSplitter" name="splitter">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="moveit_rviz_plugin::TaskListView" name="tasks_view">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>2</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
<widget class="moveit_rviz_plugin::AutoAdjustingTreeView" name="solutions_view">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_settings">
<attribute name="icon">
<iconset resource="resources.qrc">
<normaloff>:/icons/settings.png</normaloff>:/icons/settings.png</iconset>
</attribute>
<attribute name="title">
<string/>
</attribute>
<layout class="QVBoxLayout" name="tab_settings_layout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="settings_view_label">
<property name="text">
<string>Settings</string>
</property>
</widget>
</item>
<item>
<widget class="rviz::PropertyTreeWidget" name="settings_view"/>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
<action name="actionRemoveTaskTreeRows">
<property name="text">
<string>Remove</string>
</property>
<property name="toolTip">
<string>Remove selected rows</string>
</property>
<property name="shortcut">
<string>Del</string>
</property>
<property name="shortcutContext">
<enum>Qt::WidgetShortcut</enum>
</property>
</action>
<action name="actionAddLocalTask">
<property name="text">
<string>Add task</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>
<class>rviz::PropertyTreeWidget</class>
<extends>QTreeView</extends>
<header location="global">rviz/properties/property_tree_widget.h</header>
</customwidget>
<customwidget>
<class>moveit_rviz_plugin::TaskListView</class>
<extends>QTreeView</extends>
<header>task_list_model.h</header>
</customwidget>
<customwidget>
<class>moveit_rviz_plugin::AutoAdjustingTreeView</class>
<extends>QTreeView</extends>
<header>task_list_model.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="resources.qrc"/>
</resources>

View File

@ -40,6 +40,8 @@
#include "task_panel.h"
#include "ui_task_panel.h"
#include "ui_task_view.h"
#include "ui_task_settings.h"
#include <rviz/panel.h>
#include <rviz/properties/property_tree_model.h>
@ -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<TaskPanel> 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<TaskListModel*, TaskDisplay*>
@ -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<TaskDisplay> locked_display_;
rviz::WindowManagerInterface* window_manager_;
};
static QPointer<TaskPanel> global_instance_;
static uint global_use_count_;
class TaskSettingsPrivate : public Ui_TaskSettings {
public:
TaskSettingsPrivate(TaskSettings *q_ptr);
TaskSettings *q_ptr;
};
}

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>moveit_rviz_plugin::TaskSettings</class>
<widget class="QWidget" name="moveit_rviz_plugin::TaskSettings">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="tab_settings_layout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="settings_view_label">
<property name="text">
<string>Settings</string>
</property>
</widget>
</item>
<item>
<widget class="rviz::PropertyTreeWidget" name="settings_view"/>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>rviz::PropertyTreeWidget</class>
<extends>QTreeView</extends>
<header location="global">rviz/properties/property_tree_widget.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>moveit_rviz_plugin::TaskView</class>
<widget class="QWidget" name="moveit_rviz_plugin::TaskView">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Tasks Panel</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="tasks_overview">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="tasks_view_label_layout">
<property name="spacing">
<number>6</number>
</property>
<item>
<widget class="QLabel" name="tasks_view_label">
<property name="text">
<string>Task Tree</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QSplitter" name="splitter">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="moveit_rviz_plugin::TaskListView" name="tasks_view">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>2</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
<widget class="moveit_rviz_plugin::AutoAdjustingTreeView" name="solutions_view">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</widget>
</item>
</layout>
</item>
</layout>
<action name="actionRemoveTaskTreeRows">
<property name="text">
<string>Remove</string>
</property>
<property name="toolTip">
<string>Remove selected rows</string>
</property>
<property name="shortcut">
<string>Del</string>
</property>
<property name="shortcutContext">
<enum>Qt::WidgetShortcut</enum>
</property>
</action>
<action name="actionAddLocalTask">
<property name="text">
<string>Add task</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>
<class>moveit_rviz_plugin::TaskListView</class>
<extends>QTreeView</extends>
<header>task_list_model.h</header>
</customwidget>
<customwidget>
<class>moveit_rviz_plugin::AutoAdjustingTreeView</class>
<extends>QTreeView</extends>
<header>task_list_model.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>