mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Added drag and drop support.
Implemented our own insertRows/deleteRows to avoid bug caused by default drag and drop behaviour of Qt https://bugreports.qt-project.org/browse/QTBUG-26229 https://bugreports.qt-project.org/browse/QTBUG-6679 p4#: 21028
This commit is contained in:
parent
1e8d5236d1
commit
b0503cabba
@ -51,9 +51,9 @@ RimUiTreeModelPdm::RimUiTreeModelPdm(QObject* parent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
/// TO BE DELETED
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
bool RimUiTreeModelPdm::insertRows(int position, int rows, const QModelIndex &parent /*= QModelIndex()*/)
|
bool RimUiTreeModelPdm::insertRows_special(int position, int rows, const QModelIndex &parent /*= QModelIndex()*/)
|
||||||
{
|
{
|
||||||
caf::PdmUiTreeItem* parentItem = getTreeItemFromIndex(parent);
|
caf::PdmUiTreeItem* parentItem = getTreeItemFromIndex(parent);
|
||||||
|
|
||||||
@ -126,7 +126,7 @@ bool RimUiTreeModelPdm::deletePropertyFilter(const QModelIndex& itemIndex)
|
|||||||
bool wasSomeFilterActive = propertyFilterCollection->hasActiveFilters();
|
bool wasSomeFilterActive = propertyFilterCollection->hasActiveFilters();
|
||||||
|
|
||||||
// Remove Ui items pointing at the pdm object to delete
|
// Remove Ui items pointing at the pdm object to delete
|
||||||
removeRow(itemIndex.row(), itemIndex.parent());
|
removeRows_special(itemIndex.row(), 1, itemIndex.parent());
|
||||||
|
|
||||||
propertyFilterCollection->remove(propertyFilter);
|
propertyFilterCollection->remove(propertyFilter);
|
||||||
delete propertyFilter;
|
delete propertyFilter;
|
||||||
@ -166,7 +166,7 @@ bool RimUiTreeModelPdm::deleteRangeFilter(const QModelIndex& itemIndex)
|
|||||||
bool wasSomeFilterActive = rangeFilterCollection->hasActiveFilters();
|
bool wasSomeFilterActive = rangeFilterCollection->hasActiveFilters();
|
||||||
|
|
||||||
// Remove Ui items pointing at the pdm object to delete
|
// Remove Ui items pointing at the pdm object to delete
|
||||||
removeRow(itemIndex.row(), itemIndex.parent());
|
removeRows_special(itemIndex.row(), 1, itemIndex.parent());
|
||||||
|
|
||||||
rangeFilterCollection->remove(rangeFilter);
|
rangeFilterCollection->remove(rangeFilter);
|
||||||
delete rangeFilter;
|
delete rangeFilter;
|
||||||
@ -200,7 +200,7 @@ bool RimUiTreeModelPdm::deleteReservoirView(const QModelIndex& itemIndex)
|
|||||||
CVF_ASSERT(reservoirView);
|
CVF_ASSERT(reservoirView);
|
||||||
|
|
||||||
// Remove Ui items pointing at the pdm object to delete
|
// Remove Ui items pointing at the pdm object to delete
|
||||||
removeRow(itemIndex.row(), itemIndex.parent());
|
removeRows_special(itemIndex.row(), 1, itemIndex.parent());
|
||||||
|
|
||||||
reservoirView->eclipseCase()->removeReservoirView(reservoirView);
|
reservoirView->eclipseCase()->removeReservoirView(reservoirView);
|
||||||
delete reservoirView;
|
delete reservoirView;
|
||||||
@ -226,7 +226,7 @@ void RimUiTreeModelPdm::deleteReservoir(RimReservoir* reservoir)
|
|||||||
CVF_ASSERT(uiItem);
|
CVF_ASSERT(uiItem);
|
||||||
|
|
||||||
// Remove Ui items pointing at the pdm object to delete
|
// Remove Ui items pointing at the pdm object to delete
|
||||||
removeRow(mi.row(), mi.parent());
|
removeRows_special(mi.row(), 1, mi.parent());
|
||||||
}
|
}
|
||||||
|
|
||||||
RimProject* proj = RIApplication::instance()->project();
|
RimProject* proj = RIApplication::instance()->project();
|
||||||
@ -449,7 +449,7 @@ void RimUiTreeModelPdm::deleteInputProperty(const QModelIndex& itemIndex)
|
|||||||
if (!inputProperty) return;
|
if (!inputProperty) return;
|
||||||
|
|
||||||
// Remove item from UI tree model before delete of project data structure
|
// Remove item from UI tree model before delete of project data structure
|
||||||
removeRow(itemIndex.row(), itemIndex.parent());
|
removeRows_special(itemIndex.row(), 1, itemIndex.parent());
|
||||||
|
|
||||||
std::vector<RimInputPropertyCollection*> parentObjects;
|
std::vector<RimInputPropertyCollection*> parentObjects;
|
||||||
object->parentObjectsOfType(parentObjects);
|
object->parentObjectsOfType(parentObjects);
|
||||||
@ -581,8 +581,8 @@ void RimUiTreeModelPdm::addObjects(const QModelIndex& itemIndex, caf::PdmObjectG
|
|||||||
caseCollection = rimReservoir->parentCaseCollection();
|
caseCollection = rimReservoir->parentCaseCollection();
|
||||||
if (caseCollection)
|
if (caseCollection)
|
||||||
{
|
{
|
||||||
gridCaseGroup = caseCollection->parentCaseGroup();
|
gridCaseGroup = caseCollection->parentCaseGroup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -701,3 +701,97 @@ void RimUiTreeModelPdm::clearClipboard()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
Qt::DropActions RimUiTreeModelPdm::supportedDropActions() const
|
||||||
|
{
|
||||||
|
return Qt::CopyAction | Qt::MoveAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
Qt::ItemFlags RimUiTreeModelPdm::flags(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
Qt::ItemFlags defaultFlags = caf::UiTreeModelPdm::flags(index);
|
||||||
|
if (index.isValid())
|
||||||
|
{
|
||||||
|
caf::PdmUiTreeItem* currentItem = getTreeItemFromIndex(index);
|
||||||
|
CVF_ASSERT(currentItem);
|
||||||
|
CVF_ASSERT(currentItem->dataObject().p());
|
||||||
|
|
||||||
|
if (dynamic_cast<RimIdenticalGridCaseGroup*>(currentItem->dataObject().p()) ||
|
||||||
|
dynamic_cast<RimCaseCollection*>(currentItem->dataObject().p()))
|
||||||
|
{
|
||||||
|
return Qt::ItemIsDropEnabled | defaultFlags;
|
||||||
|
}
|
||||||
|
else if (dynamic_cast<RimReservoir*>(currentItem->dataObject().p()))
|
||||||
|
{
|
||||||
|
// TODO: Remember to handle reservoir holding the main grid
|
||||||
|
return Qt::ItemIsDragEnabled | defaultFlags;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
bool RimUiTreeModelPdm::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
|
||||||
|
{
|
||||||
|
const MimeDataWithIndexes* myMimeData = qobject_cast<const MimeDataWithIndexes*>(data);
|
||||||
|
if (myMimeData && parent.isValid())
|
||||||
|
{
|
||||||
|
caf::PdmObjectGroup pog;
|
||||||
|
|
||||||
|
for (int i = 0; i < myMimeData->indexes().size(); i++)
|
||||||
|
{
|
||||||
|
QModelIndex mi = myMimeData->indexes().at(i);
|
||||||
|
caf::PdmUiTreeItem* currentItem = getTreeItemFromIndex(mi);
|
||||||
|
caf::PdmObject* pdmObj = currentItem->dataObject().p();
|
||||||
|
|
||||||
|
pog.objects().push_back(pdmObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
addObjects(parent, pog);
|
||||||
|
|
||||||
|
if (action == Qt::MoveAction)
|
||||||
|
{
|
||||||
|
std::vector<caf::PdmPointer<RimResultReservoir> > typedObjects;
|
||||||
|
pog.objectsByType(&typedObjects);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < typedObjects.size(); i++)
|
||||||
|
{
|
||||||
|
RimReservoir* rimReservoir = typedObjects[i];
|
||||||
|
deleteReservoir(rimReservoir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
QMimeData* RimUiTreeModelPdm::mimeData(const QModelIndexList &indexes) const
|
||||||
|
{
|
||||||
|
MimeDataWithIndexes* myObj = new MimeDataWithIndexes();
|
||||||
|
myObj->setIndexes(indexes);
|
||||||
|
return myObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
QStringList RimUiTreeModelPdm::mimeTypes() const
|
||||||
|
{
|
||||||
|
QStringList types;
|
||||||
|
types << MimeDataWithIndexes::formatName();
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -96,8 +96,9 @@ class RimUiTreeModelPdm : public caf::UiTreeModelPdm
|
|||||||
public:
|
public:
|
||||||
RimUiTreeModelPdm(QObject* parent);
|
RimUiTreeModelPdm(QObject* parent);
|
||||||
|
|
||||||
// Overrides
|
|
||||||
virtual bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex());
|
// TO BE DELETED, NOT USED
|
||||||
|
virtual bool insertRows_special(int position, int rows, const QModelIndex &parent = QModelIndex());
|
||||||
|
|
||||||
// Special edit methods
|
// Special edit methods
|
||||||
bool deleteRangeFilter(const QModelIndex& itemIndex);
|
bool deleteRangeFilter(const QModelIndex& itemIndex);
|
||||||
@ -119,6 +120,12 @@ public:
|
|||||||
|
|
||||||
void updateScriptPaths();
|
void updateScriptPaths();
|
||||||
|
|
||||||
|
virtual Qt::DropActions supportedDropActions() const;
|
||||||
|
virtual Qt::ItemFlags flags(const QModelIndex &index) const;
|
||||||
|
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
|
||||||
|
virtual QMimeData * mimeData(const QModelIndexList &indexes) const;
|
||||||
|
virtual QStringList mimeTypes() const;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slotRefreshScriptTree(QString path);
|
void slotRefreshScriptTree(QString path);
|
||||||
void clearClipboard();
|
void clearClipboard();
|
||||||
|
@ -377,15 +377,11 @@ void RIMainWindow::createDockPanels()
|
|||||||
m_treeView->setModel(m_treeModelPdm);
|
m_treeView->setModel(m_treeModelPdm);
|
||||||
m_treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
m_treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||||
|
|
||||||
// Must be enabled for drag and drop
|
// Drag and drop configuration
|
||||||
/*
|
|
||||||
m_treeView->setSelectionMode(QAbstractItemView::SingleSelection);
|
|
||||||
m_treeView->setDragEnabled(true);
|
m_treeView->setDragEnabled(true);
|
||||||
m_treeView->viewport()->setAcceptDrops(true);
|
m_treeView->viewport()->setAcceptDrops(true);
|
||||||
m_treeView->setDropIndicatorShown(true);
|
m_treeView->setDropIndicatorShown(true);
|
||||||
m_treeView->setDragDropMode(QAbstractItemView::InternalMove);
|
m_treeView->setDragDropMode(QAbstractItemView::DragDrop);
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
dockWidget->setWidget(m_treeView);
|
dockWidget->setWidget(m_treeView);
|
||||||
|
|
||||||
|
@ -293,9 +293,9 @@ Qt::ItemFlags UiTreeModelPdm::flags(const QModelIndex &index) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
/// TO BE DELETED
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
bool UiTreeModelPdm::insertRows(int position, int rows, const QModelIndex &parent /*= QModelIndex()*/)
|
bool UiTreeModelPdm::insertRows_special(int position, int rows, const QModelIndex &parent /*= QModelIndex()*/)
|
||||||
{
|
{
|
||||||
PdmUiTreeItem* parentItem = getTreeItemFromIndex(parent);
|
PdmUiTreeItem* parentItem = getTreeItemFromIndex(parent);
|
||||||
|
|
||||||
@ -311,7 +311,7 @@ bool UiTreeModelPdm::insertRows(int position, int rows, const QModelIndex &paren
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
bool UiTreeModelPdm::removeRows(int position, int rows, const QModelIndex &parent /*= QModelIndex()*/)
|
bool UiTreeModelPdm::removeRows_special(int position, int rows, const QModelIndex &parent /*= QModelIndex()*/)
|
||||||
{
|
{
|
||||||
if (rows <= 0) return true;
|
if (rows <= 0) return true;
|
||||||
|
|
||||||
@ -344,7 +344,7 @@ void UiTreeModelPdm::rebuildUiSubTree(PdmObject* root)
|
|||||||
QModelIndex item = getModelIndexFromPdmObject(root);
|
QModelIndex item = getModelIndexFromPdmObject(root);
|
||||||
if (item.isValid())
|
if (item.isValid())
|
||||||
{
|
{
|
||||||
this->removeRows(0, rowCount(item), item);
|
this->removeRows_special(0, rowCount(item), item);
|
||||||
PdmUiTreeItem* treeItem = getTreeItemFromIndex(item);
|
PdmUiTreeItem* treeItem = getTreeItemFromIndex(item);
|
||||||
|
|
||||||
|
|
||||||
|
@ -62,8 +62,10 @@ public:
|
|||||||
virtual Qt::ItemFlags flags(const QModelIndex &index) const;
|
virtual Qt::ItemFlags flags(const QModelIndex &index) const;
|
||||||
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
|
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
|
||||||
|
|
||||||
virtual bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex());
|
// TO BE DELETED, NOT USED
|
||||||
virtual bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex());
|
virtual bool insertRows_special(int position, int rows, const QModelIndex &parent = QModelIndex());
|
||||||
|
|
||||||
|
virtual bool removeRows_special(int position, int rows, const QModelIndex &parent = QModelIndex());
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QModelIndex getModelIndexFromPdmObjectRecursive(const QModelIndex& root, const PdmObject * object) const;
|
QModelIndex getModelIndexFromPdmObjectRecursive(const QModelIndex& root, const PdmObject * object) const;
|
||||||
|
Loading…
Reference in New Issue
Block a user