auto-load TaskPanel with TaskDisplay

This commit is contained in:
Robert Haschke 2018-02-04 11:26:23 +01:00
parent 6f95642a5a
commit 5adac3f21f
4 changed files with 55 additions and 2 deletions

View File

@ -37,6 +37,7 @@
*/ */
#include "task_display.h" #include "task_display.h"
#include "task_panel.h"
#include "task_list_model.h" #include "task_list_model.h"
#include "meta_task_list_model.h" #include "meta_task_list_model.h"
#include <moveit/task_constructor/introspection.h> #include <moveit/task_constructor/introspection.h>
@ -46,6 +47,7 @@
#include <moveit/rdf_loader/rdf_loader.h> #include <moveit/rdf_loader/rdf_loader.h>
#include <moveit/robot_model/robot_model.h> #include <moveit/robot_model/robot_model.h>
#include <rviz/display_context.h>
#include <rviz/properties/string_property.h> #include <rviz/properties/string_property.h>
#include <rviz/properties/ros_topic_property.h> #include <rviz/properties/ros_topic_property.h>
#include <rviz/properties/status_property.h> #include <rviz/properties/status_property.h>
@ -83,11 +85,13 @@ TaskDisplay::TaskDisplay() : Display()
TaskDisplay::~TaskDisplay() TaskDisplay::~TaskDisplay()
{ {
if (context_) TaskPanel::decUseCount();
} }
void TaskDisplay::onInitialize() void TaskDisplay::onInitialize()
{ {
Display::onInitialize(); Display::onInitialize();
TaskPanel::incUseCount(context_->getWindowManager());
trajectory_visual_->onInitialize(scene_node_, context_); trajectory_visual_->onInitialize(scene_node_, context_);
} }

View File

@ -85,6 +85,16 @@ TaskPanel::TaskPanel(QWidget* parent)
connect(d->tasks_view->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), connect(d->tasks_view->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)),
this, SLOT(onCurrentStageChanged(QModelIndex,QModelIndex))); this, SLOT(onCurrentStageChanged(QModelIndex,QModelIndex)));
// if still undefined, this becomes the global instance
if (TaskPanelPrivate::global_instance_.isNull()) {
TaskPanelPrivate::global_instance_ = this;
// If an explicitly created instance is explicitly destroyed, we don't notice.
// If there there were displays "using" it, global_use_count_ is still greater zero.
if (TaskPanelPrivate::global_use_count_ > 0); // In this case, don't increment use count
else
++TaskPanelPrivate::global_use_count_; // otherwise increment use count for explicitly created instance
}
} }
TaskPanel::~TaskPanel() TaskPanel::~TaskPanel()
@ -92,6 +102,28 @@ TaskPanel::~TaskPanel()
delete d_ptr; delete d_ptr;
} }
QPointer<TaskPanel> TaskPanelPrivate::global_instance_;
uint TaskPanelPrivate::global_use_count_ = 0;
void TaskPanel::incUseCount(rviz::WindowManagerInterface* window_manager)
{
++TaskPanelPrivate::global_use_count_;
if (TaskPanelPrivate::global_instance_ || !window_manager)
return; // already define, nothing to do
--TaskPanelPrivate::global_use_count_; // counteract ++ in constructor
TaskPanelPrivate::global_instance_ = new TaskPanel(window_manager->getParentWindow());
TaskPanelPrivate::global_instance_->d_ptr->window_manager_ = window_manager;
window_manager->addPane("Motion Planning Tasks", TaskPanelPrivate::global_instance_);
}
void TaskPanel::decUseCount()
{
Q_ASSERT(TaskPanelPrivate::global_use_count_ > 0);
if (--TaskPanelPrivate::global_use_count_ == 0 && TaskPanelPrivate::global_instance_)
TaskPanelPrivate::global_instance_->deleteLater();
}
TaskPanelPrivate::TaskPanelPrivate(TaskPanel *q_ptr) TaskPanelPrivate::TaskPanelPrivate(TaskPanel *q_ptr)
: q_ptr(q_ptr) : q_ptr(q_ptr)
, settings(new rviz::PropertyTreeModel(new rviz::Property, q_ptr)) , settings(new rviz::PropertyTreeModel(new rviz::Property, q_ptr))
@ -136,6 +168,7 @@ TaskPanelPrivate::getTaskModel(const QModelIndex &index) const
void TaskPanel::onInitialize() void TaskPanel::onInitialize()
{ {
d_ptr->window_manager_ = vis_manager_->getWindowManager();
} }
void TaskPanel::save(rviz::Config config) const void TaskPanel::save(rviz::Config config) const
@ -171,7 +204,7 @@ void TaskPanel::addTask()
void TaskPanel::showStageDockWidget() void TaskPanel::showStageDockWidget()
{ {
rviz::PanelDockWidget *dock = getStageDockWidget(vis_manager_->getWindowManager()); rviz::PanelDockWidget *dock = getStageDockWidget(d_ptr->window_manager_);
if (dock) dock->show(); if (dock) dock->show();
} }

View File

@ -42,11 +42,15 @@
#include <moveit/macros/class_forward.h> #include <moveit/macros/class_forward.h>
#include <QModelIndex> #include <QModelIndex>
namespace rviz {
class WindowManagerInterface;
}
namespace moveit_rviz_plugin { namespace moveit_rviz_plugin {
class TaskSolutionVisualization; class TaskSolutionVisualization;
MOVEIT_CLASS_FORWARD(TaskListModel) MOVEIT_CLASS_FORWARD(TaskListModel)
typedef std::weak_ptr<TaskListModel> TaskListModelWeakPtr; MOVEIT_CLASS_FORWARD(TaskPanel)
/** The TaskPanel displays information about manipulation tasks in the system. /** The TaskPanel displays information about manipulation tasks in the system.
* *
@ -65,6 +69,14 @@ public:
TaskPanel(QWidget* parent = 0); TaskPanel(QWidget* parent = 0);
~TaskPanel(); ~TaskPanel();
/** Increment/decrement use count for global task panel instance.
*
* If not yet done, an instance is created. If use count drops to zero,
* the global instance is destroyed.
*/
static void incUseCount(rviz::WindowManagerInterface *window_manager);
static void decUseCount();
void onInitialize() override; void onInitialize() override;
void load(const rviz::Config& config) override; void load(const rviz::Config& config) override;
void save(rviz::Config config) const override; void save(rviz::Config config) const override;

View File

@ -66,6 +66,10 @@ public:
TaskPanel* q_ptr; TaskPanel* q_ptr;
rviz::PropertyTreeModel* settings; rviz::PropertyTreeModel* settings;
rviz::WindowManagerInterface* window_manager_;
static QPointer<TaskPanel> global_instance_;
static uint global_use_count_;
}; };
} }