re-enable drag-n-drop to edit task pipeline

This commit is contained in:
Robert Haschke 2017-11-30 20:18:42 +01:00
parent e9363919e8
commit d9be19bbe8
8 changed files with 49 additions and 24 deletions

View File

@ -141,6 +141,7 @@ TaskListModel::TaskListModel(QObject *parent)
: FlatMergeProxyModel(parent)
{
ROS_DEBUG_NAMED(LOGNAME, "created TaskListModel: %p", this);
setStageFactory(getStageFactory());
}
TaskListModel::~TaskListModel() {
@ -171,28 +172,21 @@ void TaskListModel::setSolutionClient(ros::ServiceClient *client)
void TaskListModel::setStageFactory(const StageFactoryPtr &factory)
{
stage_factory_ = factory;
if (stage_factory_)
setMimeTypes({ stage_factory_->mimeType() });
}
// re-implemented from base class to allow dropping
Qt::ItemFlags TaskListModel::flags(const QModelIndex &index) const
{
auto f = FlatMergeProxyModel::flags(index);
if (!index.isValid()) {
Qt::ItemFlags f = QAbstractItemModel::flags(index);
// dropping at root will create a new local task
if (stage_factory_)
f |= Qt::ItemIsDropEnabled;
return f;
}
return FlatMergeProxyModel::flags(index);
}
QStringList TaskListModel::mimeTypes() const
{
QStringList result;
if (stage_factory_)
result << stage_factory_->mimeType();
return result;
return f;
}
QVariant TaskListModel::headerData(int section, Qt::Orientation orientation, int role) const
@ -290,7 +284,9 @@ bool TaskListModel::dropMimeData(const QMimeData *mime, Qt::DropAction action, i
}
// create a new local task using the given container as root
insertModel(new LocalTaskModel(std::move(container), this), row);
auto *m = new LocalTaskModel(std::move(container), this);
m->setStageFactory(stage_factory_);
insertModel(m, row);
return true;
}

View File

@ -141,7 +141,6 @@ public:
/// providing a StageFactory makes the model accepting drops
void setStageFactory(const StageFactoryPtr &factory);
QStringList mimeTypes() const override;
bool dropMimeData(const QMimeData *mime, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;
Qt::DropActions supportedDropActions() const override;
Qt::ItemFlags flags(const QModelIndex &index) const;

View File

@ -98,7 +98,11 @@ TaskPanelPrivate::TaskPanelPrivate(TaskPanel *q_ptr)
{
setupUi(q_ptr);
// init tasks view
tasks_view->setModel(&MetaTaskListModel::instance());
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);
tasks_view->setAcceptDrops(true);

View File

@ -97,7 +97,8 @@ TEST(TreeMergeModel, basics) {
EXPECT_EQ(tree.rowCount(), 1);
EXPECT_EQ(tree.columnCount(), 3);
EXPECT_TRUE(tree.index(0, 1).flags() & Qt::ItemIsSelectable);
EXPECT_TRUE(tree.index(0, 0).flags() & Qt::ItemIsSelectable);
EXPECT_FALSE(tree.index(0, 1).flags() & Qt::ItemIsSelectable);
EXPECT_FALSE(tree.index(1, 0).isValid());
QModelIndex idx = tree.index(0, 0);

View File

@ -45,6 +45,7 @@ class FlatMergeProxyModelPrivate {
public:
Q_DECLARE_PUBLIC(FlatMergeProxyModel)
FlatMergeProxyModel* q_ptr;
QStringList mime_types_;
struct ModelData {
ModelData(QAbstractItemModel* m) : model_(m) {}
@ -297,6 +298,16 @@ bool FlatMergeProxyModel::setData(const QModelIndex &index, const QVariant &valu
return data->model_->setData(src_index, value, role);
}
void FlatMergeProxyModel::setMimeTypes(const QStringList &mime_types)
{
d_ptr->mime_types_ = mime_types;
}
QStringList FlatMergeProxyModel::mimeTypes() const
{
return d_ptr->mime_types_;
}
bool FlatMergeProxyModel::dropMimeData(const QMimeData *mime, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
if (!parent.isValid())

View File

@ -78,6 +78,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;
void setMimeTypes(const QStringList& mime_types);
QStringList mimeTypes() const override;
bool dropMimeData(const QMimeData *mime, Qt::DropAction action, int row, int column, const QModelIndex &parent);
bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;

View File

@ -44,6 +44,7 @@ class TreeMergeProxyModelPrivate {
public:
Q_DECLARE_PUBLIC(TreeMergeProxyModel)
TreeMergeProxyModel* q_ptr;
QStringList mime_types_;
struct ModelData {
ModelData(const QString& name, QAbstractItemModel* m)
@ -248,16 +249,15 @@ Qt::ItemFlags TreeMergeProxyModel::flags(const QModelIndex &index) const
if (!index.isValid())
return QAbstractItemModel::flags(index);
if (isGroupItem(index)) { // top-level item
auto f = QAbstractItemModel::flags(index);
if (index.column() == 0)
f |= Qt::ItemIsEditable | Qt::ItemIsSelectable;
return f;
}
TreeMergeProxyModelPrivate::ModelData *data = nullptr;
QModelIndex src_index = d_ptr->mapToSource(index, data);
return data->model_ ->flags(src_index);
auto f = data->model_ ->flags(src_index);
if (isGroupItem(index)) { // top-level item
if (index.column() == 0)
f |= Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable;
}
return f;
}
QVariant TreeMergeProxyModel::headerData(int section, Qt::Orientation orientation, int role) const
@ -302,6 +302,16 @@ bool TreeMergeProxyModel::setData(const QModelIndex &index, const QVariant &valu
return data->model_->setData(src_index, value, role);
}
void TreeMergeProxyModel::setMimeTypes(const QStringList &mime_types)
{
d_ptr->mime_types_ = mime_types;
}
QStringList TreeMergeProxyModel::mimeTypes() const
{
return d_ptr->mime_types_;
}
bool TreeMergeProxyModel::dropMimeData(const QMimeData *mime, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
if (!parent.isValid())

View File

@ -79,6 +79,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;
void setMimeTypes(const QStringList& mime_types);
QStringList mimeTypes() const override;
bool dropMimeData(const QMimeData *mime, Qt::DropAction action, int row, int column, const QModelIndex &parent);
bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;