(#467) Using subclassed treeview to notify the model about drag end

Using new class PdmUiTreeViewWidget instead of QTreeView in
PdmUiTreeViewEditor. PdmUiTreeViewWidget handles drag leave events and
calls endDrag() on the model.
This commit is contained in:
Pål Hagen 2015-10-21 17:20:12 +02:00
parent b046ca0769
commit f4bbbcb7a2
5 changed files with 47 additions and 10 deletions

View File

@ -57,6 +57,7 @@ public:
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) = 0;
virtual QMimeData* mimeData(const QModelIndexList &indexes) const = 0;
virtual QStringList mimeTypes() const = 0;
virtual void endDrag() = 0;
};
inline PdmUiDragDropHandle::~PdmUiDragDropHandle() { }

View File

@ -86,7 +86,7 @@ QWidget* PdmUiTreeViewEditor::createWidget(QWidget* parent)
m_mainWidget->setLayout(m_layout);
m_treeViewModel = new caf::PdmUiTreeViewModel(this);
m_treeView = new QTreeView(m_mainWidget);
m_treeView = new PdmUiTreeViewWidget(m_mainWidget);
m_treeView->setModel(m_treeViewModel);
m_treeView->installEventFilter(this);

View File

@ -39,11 +39,13 @@
#include "cafPdmUiTreeEditorHandle.h"
#include "cafPdmUiFieldEditorHandle.h"
#include "cafPdmUiTreeViewModel.h"
#include <QAbstractItemModel>
#include <QPointer>
#include <QWidget>
#include <QItemSelectionModel>
#include <QTreeView>
class MySortFilterProxyModel;
@ -75,7 +77,29 @@ public:
QStringList columnHeaders;
};
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
class PdmUiTreeViewWidget : public QTreeView
{
public:
PdmUiTreeViewWidget(QWidget* parent = 0) : QTreeView(parent) {};
virtual ~PdmUiTreeViewWidget() {};
protected:
virtual void dragLeaveEvent(QDragLeaveEvent* event)
{
caf::PdmUiTreeViewModel* treeViewModel = dynamic_cast<caf::PdmUiTreeViewModel*>(model());
if (treeViewModel)
{
treeViewModel->endDrag();
}
}
};
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
class PdmUiTreeViewEditor : public PdmUiTreeEditorHandle
{
Q_OBJECT
@ -126,17 +150,17 @@ private:
virtual bool eventFilter(QObject *obj, QEvent *event);
private:
QPointer<QWidget> m_mainWidget;
QVBoxLayout* m_layout;
QPointer<QWidget> m_mainWidget;
QVBoxLayout* m_layout;
QTreeView* m_treeView;
PdmUiTreeViewModel* m_treeViewModel;
PdmUiTreeViewWidget* m_treeView;
PdmUiTreeViewModel* m_treeViewModel;
PdmUiTreeViewEditorAttribute m_editorAttributes;
PdmUiTreeViewEditorAttribute m_editorAttributes;
bool m_useDefaultContextMenu;
bool m_updateSelectionManager;
bool m_appendClassNameToUiItemText;
bool m_useDefaultContextMenu;
bool m_updateSelectionManager;
bool m_appendClassNameToUiItemText;
};

View File

@ -794,6 +794,17 @@ void PdmUiTreeViewModel::setDragDropHandle(PdmUiDragDropHandle* dragDropHandle)
m_dragDropHandle = dragDropHandle;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiTreeViewModel::endDrag()
{
if (m_dragDropHandle)
{
m_dragDropHandle->endDrag();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -74,7 +74,8 @@ public:
QModelIndex findModelIndex(const PdmUiItem* object) const;
void setDragDropHandle(PdmUiDragDropHandle* dragDropHandle);
void endDrag();
private:
void updateSubTreeRecursive(const QModelIndex& uiSubTreeRootModelIdx, PdmUiTreeOrdering* uiModelSubTreeRoot, PdmUiTreeOrdering* updatedPdmSubTreeRoot);