diff --git a/modules/gui/src/scene_win/gfx_scene_node.cc b/modules/gui/src/scene_win/gfx_scene_node.cc index 9b8828779f3a85f3e20c726276fe608e64bffdf1..f8632e9018d3933e0df87ac2d5e61adcd02d3575 100644 --- a/modules/gui/src/scene_win/gfx_scene_node.cc +++ b/modules/gui/src/scene_win/gfx_scene_node.cc @@ -71,10 +71,10 @@ bool GfxSceneNode::SetData(int column, const QVariant& value, int role){ Qt::ItemFlags GfxSceneNode::Flags(int column) const{ if(column==0){ - return Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled; + return Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsDragEnabled; } else if(column==1){ - return Qt::ItemIsSelectable|Qt::ItemIsEnabled|Qt::ItemIsEditable; + return Qt::ItemIsSelectable|Qt::ItemIsEnabled|Qt::ItemIsEditable|Qt::ItemIsDragEnabled; } return Qt::NoItemFlags; } diff --git a/modules/gui/src/scene_win/scene_win.cc b/modules/gui/src/scene_win/scene_win.cc index 0d492d3bc0d94536c6b3f8e110d0e018002a0ba9..0b2e75bd3bea9df0f7ddbfda13550b5601c685bf 100644 --- a/modules/gui/src/scene_win/scene_win.cc +++ b/modules/gui/src/scene_win/scene_win.cc @@ -59,6 +59,7 @@ SceneWin::SceneWin(QWidget* parent) : view_->setSelectionBehavior(QAbstractItemView::SelectRows); view_->setSelectionMode(QAbstractItemView::ExtendedSelection); view_->setEditTriggers(QAbstractItemView::EditKeyPressed); + view_->setDragEnabled(true); view_->expandAll(); layout->addWidget(view_); diff --git a/modules/gui/src/scene_win/scene_win_model.cc b/modules/gui/src/scene_win/scene_win_model.cc index 12df1534d79e3ac9ed4d2dc609773a1cb88ad8e8..9e7542b0815c2a73267820ad1fa1b1991cf8cce9 100644 --- a/modules/gui/src/scene_win/scene_win_model.cc +++ b/modules/gui/src/scene_win/scene_win_model.cc @@ -198,6 +198,36 @@ bool SceneWinModel::setData(const QModelIndex& index, return false; } +QStringList SceneWinModel::mimeTypes() const +{ + QStringList types; + types << "text/plain"; + return types; +} + +Qt::DropActions SceneWinModel::supportedDragActions() const +{ + return Qt::MoveAction; +} + +QMimeData* SceneWinModel::mimeData(const QModelIndexList &indexes) const +{ + QMimeData *mimeData = new QMimeData(); + QByteArray encoded_data; + + QDataStream stream(&encoded_data, QIODevice::WriteOnly); + + + foreach (QModelIndex index, indexes) { + if (index.isValid() && index.column()==1) { + QString text = "scene['"+data(index, Qt::DisplayRole).toString()+"']"; + encoded_data.append(text); + } + } + mimeData->setData("text/plain", encoded_data); + return mimeData; +} + void SceneWinModel::NodeAdded(const gfx::GfxNodeP& node) { gfx::EntityP e=boost::dynamic_pointer_cast<gfx::Entity>(node); diff --git a/modules/gui/src/scene_win/scene_win_model.hh b/modules/gui/src/scene_win/scene_win_model.hh index 996f7b640de20d1e9fea7303a7f162649757524c..c65af6677974af714ad602a61b1d8b9498391a20 100644 --- a/modules/gui/src/scene_win/scene_win_model.hh +++ b/modules/gui/src/scene_win/scene_win_model.hh @@ -23,6 +23,8 @@ Author: Stefan Scheuber, Marco Biasini, Ansgar Philippsen */ +#include <QStringList> +#include <QMimeData> #include <QMap> #include <QAbstractItemModel> @@ -88,6 +90,10 @@ public: const QVariant& value=QVariant(), int role=Qt::DisplayRole); + virtual QStringList mimeTypes() const; + Qt::DropActions supportedDragActions() const; + virtual QMimeData* mimeData(const QModelIndexList& indexes) const; + // scene observer interface virtual void NodeAdded(const gfx::GfxNodeP& node); virtual void NodeRemoved(const gfx::GfxNodeP& node);