forked from teamnwah/openmw-tes3coop
DragRecordTable checks drag type before accepting it
This commit is contained in:
parent
a23de394f8
commit
b9882eb59a
4 changed files with 58 additions and 34 deletions
|
@ -1,8 +1,14 @@
|
||||||
|
#include "dragrecordtable.hpp"
|
||||||
|
|
||||||
#include <QDrag>
|
#include <QDrag>
|
||||||
#include <QDragEnterEvent>
|
#include <QDragEnterEvent>
|
||||||
|
|
||||||
|
#include "../../model/doc/document.hpp"
|
||||||
|
|
||||||
#include "../../model/world/tablemimedata.hpp"
|
#include "../../model/world/tablemimedata.hpp"
|
||||||
#include "dragrecordtable.hpp"
|
#include "../../model/world/commands.hpp"
|
||||||
|
|
||||||
|
#include "dragdroputils.hpp"
|
||||||
|
|
||||||
void CSVWorld::DragRecordTable::startDragFromTable (const CSVWorld::DragRecordTable& table)
|
void CSVWorld::DragRecordTable::startDragFromTable (const CSVWorld::DragRecordTable& table)
|
||||||
{
|
{
|
||||||
|
@ -35,5 +41,48 @@ void CSVWorld::DragRecordTable::dragEnterEvent(QDragEnterEvent *event)
|
||||||
|
|
||||||
void CSVWorld::DragRecordTable::dragMoveEvent(QDragMoveEvent *event)
|
void CSVWorld::DragRecordTable::dragMoveEvent(QDragMoveEvent *event)
|
||||||
{
|
{
|
||||||
event->accept();
|
QModelIndex index = indexAt(event->pos());
|
||||||
|
if (CSVWorld::DragDropUtils::canAcceptData(*event, getIndexDisplayType(index)))
|
||||||
|
{
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event->ignore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVWorld::DragRecordTable::dropEvent(QDropEvent *event)
|
||||||
|
{
|
||||||
|
QModelIndex index = indexAt(event->pos());
|
||||||
|
CSMWorld::ColumnBase::Display display = getIndexDisplayType(index);
|
||||||
|
if (CSVWorld::DragDropUtils::canAcceptData(*event, display))
|
||||||
|
{
|
||||||
|
const CSMWorld::TableMimeData *data = CSVWorld::DragDropUtils::getTableMimeData(*event);
|
||||||
|
if (data->fromDocument(mDocument))
|
||||||
|
{
|
||||||
|
CSMWorld::UniversalId id = CSVWorld::DragDropUtils::getAcceptedData(*event, display);
|
||||||
|
QVariant newIndexData = QString::fromUtf8(id.getId().c_str());
|
||||||
|
QVariant oldIndexData = index.data(Qt::EditRole);
|
||||||
|
if (newIndexData != oldIndexData)
|
||||||
|
{
|
||||||
|
mDocument.getUndoStack().push(new CSMWorld::ModifyCommand(*model(), index, newIndexData));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CSMWorld::ColumnBase::Display CSVWorld::DragRecordTable::getIndexDisplayType(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
Q_ASSERT(model() != NULL);
|
||||||
|
|
||||||
|
if (index.isValid())
|
||||||
|
{
|
||||||
|
QVariant display = model()->headerData(index.column(), Qt::Horizontal, CSMWorld::ColumnBase::Role_Display);
|
||||||
|
if (display.isValid())
|
||||||
|
{
|
||||||
|
return static_cast<CSMWorld::ColumnBase::Display>(display.toInt());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CSMWorld::ColumnBase::Display_None;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include <QTableView>
|
#include <QTableView>
|
||||||
#include <QEvent>
|
#include <QEvent>
|
||||||
|
|
||||||
|
#include "../../model/world/columnbase.hpp"
|
||||||
|
|
||||||
class QWidget;
|
class QWidget;
|
||||||
class QAction;
|
class QAction;
|
||||||
|
|
||||||
|
@ -38,6 +40,11 @@ namespace CSVWorld
|
||||||
void dragEnterEvent(QDragEnterEvent *event);
|
void dragEnterEvent(QDragEnterEvent *event);
|
||||||
|
|
||||||
void dragMoveEvent(QDragMoveEvent *event);
|
void dragMoveEvent(QDragMoveEvent *event);
|
||||||
|
|
||||||
|
void dropEvent(QDropEvent *event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
CSMWorld::ColumnBase::Display getIndexDisplayType(const QModelIndex &index) const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -697,36 +697,6 @@ void CSVWorld::Table::mouseMoveEvent (QMouseEvent* event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVWorld::Table::dropEvent(QDropEvent *event)
|
|
||||||
{
|
|
||||||
QModelIndex index = indexAt (event->pos());
|
|
||||||
|
|
||||||
if (!index.isValid())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const CSMWorld::TableMimeData* mime = dynamic_cast<const CSMWorld::TableMimeData*> (event->mimeData());
|
|
||||||
if (!mime) // May happen when non-records (e.g. plain text) are dragged and dropped
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (mime->fromDocument (mDocument))
|
|
||||||
{
|
|
||||||
CSMWorld::ColumnBase::Display display = static_cast<CSMWorld::ColumnBase::Display>
|
|
||||||
(mModel->headerData (index.column(), Qt::Horizontal, CSMWorld::ColumnBase::Role_Display).toInt());
|
|
||||||
|
|
||||||
if (mime->holdsType (display))
|
|
||||||
{
|
|
||||||
CSMWorld::UniversalId record (mime->returnMatching (display));
|
|
||||||
|
|
||||||
std::auto_ptr<CSMWorld::ModifyCommand> command (new CSMWorld::ModifyCommand
|
|
||||||
(*mProxyModel, index, QVariant (QString::fromUtf8 (record.getId().c_str()))));
|
|
||||||
|
|
||||||
mDocument.getUndoStack().push (command.release());
|
|
||||||
}
|
|
||||||
} //TODO handle drops from different document
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> CSVWorld::Table::getColumnsWithDisplay(CSMWorld::ColumnBase::Display display) const
|
std::vector<std::string> CSVWorld::Table::getColumnsWithDisplay(CSMWorld::ColumnBase::Display display) const
|
||||||
{
|
{
|
||||||
const int count = mModel->columnCount();
|
const int count = mModel->columnCount();
|
||||||
|
|
|
@ -76,8 +76,6 @@ namespace CSVWorld
|
||||||
|
|
||||||
void mouseMoveEvent(QMouseEvent *event);
|
void mouseMoveEvent(QMouseEvent *event);
|
||||||
|
|
||||||
void dropEvent(QDropEvent *event);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual void mouseDoubleClickEvent (QMouseEvent *event);
|
virtual void mouseDoubleClickEvent (QMouseEvent *event);
|
||||||
|
|
Loading…
Reference in a new issue