From fc9ca1b624b11206ca4a12fc55ab8136ceb4ed7f Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Tue, 7 Nov 2017 22:35:07 +0100 Subject: [PATCH] LocalTaskModel: allow removing of stages --- include/moveit_task_constructor/container.h | 1 + src/container.cpp | 7 +++++++ .../local_task_model.cpp | 20 +++++++++++++++++++ .../motion_planning_tasks/local_task_model.h | 2 ++ 4 files changed, 30 insertions(+) diff --git a/include/moveit_task_constructor/container.h b/include/moveit_task_constructor/container.h index c9d5fc9f..629f5ed7 100644 --- a/include/moveit_task_constructor/container.h +++ b/include/moveit_task_constructor/container.h @@ -20,6 +20,7 @@ public: bool traverseRecursively(const StageCallback &processor) const; virtual bool insert(Stage::pointer&& stage, int before = -1); + virtual bool remove(int pos); virtual void clear(); void reset() override; diff --git a/src/container.cpp b/src/container.cpp index c7fc89ca..aa1167e2 100644 --- a/src/container.cpp +++ b/src/container.cpp @@ -96,6 +96,13 @@ bool ContainerBase::insert(Stage::pointer &&stage, int before) return true; } +bool ContainerBase::remove(int pos) +{ + ContainerBasePrivate::const_iterator it = pimpl()->position(pos); + pimpl()->children_.erase(it); + return true; +} + void ContainerBase::clear() { pimpl()->children_.clear(); diff --git a/visualization/motion_planning_tasks/local_task_model.cpp b/visualization/motion_planning_tasks/local_task_model.cpp index 3285da51..99739f9f 100644 --- a/visualization/motion_planning_tasks/local_task_model.cpp +++ b/visualization/motion_planning_tasks/local_task_model.cpp @@ -169,6 +169,26 @@ bool LocalTaskModel::setData(const QModelIndex &index, const QVariant &value, in return true; } +bool LocalTaskModel::removeRows(int row, int count, const QModelIndex &parent) +{ + if (!parent.isValid()) + return false; // cannot remove top-level container + if (flags_ & IS_RUNNING) + return false; // cannot modify running task + + Q_ASSERT(dynamic_cast(node(parent)->me())); + ContainerBasePrivate *cp = static_cast(node(parent)); + ContainerBase *c = static_cast(cp->me()); + if (row < 0 || (size_t)row + count > cp->children().size()) + return false; + + beginRemoveRows(parent, row, row+count-1); + for (; count > 0; --count) + c->remove(row); + endRemoveRows(); + return true; +} + void LocalTaskModel::setStageFactory(const StageFactoryPtr &factory) { stage_factory_ = factory; diff --git a/visualization/motion_planning_tasks/local_task_model.h b/visualization/motion_planning_tasks/local_task_model.h index 64080ada..87c441d5 100644 --- a/visualization/motion_planning_tasks/local_task_model.h +++ b/visualization/motion_planning_tasks/local_task_model.h @@ -65,6 +65,8 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; + bool removeRows(int row, int count, const QModelIndex &parent) override; + /// providing a StageFactory makes the model accepting drops void setStageFactory(const StageFactoryPtr &factory); bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;