|
|
|
@ -3,33 +3,20 @@
|
|
|
|
|
#include <QDropEvent>
|
|
|
|
|
|
|
|
|
|
#include "../../model/world/tablemimedata.hpp"
|
|
|
|
|
#include "../../model/world/universalid.hpp"
|
|
|
|
|
|
|
|
|
|
namespace
|
|
|
|
|
{
|
|
|
|
|
const CSMWorld::TableMimeData *getEventMimeData(QDropEvent *event)
|
|
|
|
|
{
|
|
|
|
|
Q_ASSERT(event != NULL);
|
|
|
|
|
return dynamic_cast<const CSMWorld::TableMimeData *>(event->mimeData());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#include "../world/dragdroputils.hpp"
|
|
|
|
|
|
|
|
|
|
CSVWidget::DropLineEdit::DropLineEdit(CSMWorld::UniversalId::Type type, QWidget *parent)
|
|
|
|
|
CSVWidget::DropLineEdit::DropLineEdit(CSMWorld::ColumnBase::Display type, QWidget *parent)
|
|
|
|
|
: QLineEdit(parent),
|
|
|
|
|
mDropType(type)
|
|
|
|
|
{
|
|
|
|
|
setAcceptDrops(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CSVWidget::DropLineEdit::DropLineEdit(CSMWorld::ColumnBase::Display display, QWidget *parent)
|
|
|
|
|
: QLineEdit(parent),
|
|
|
|
|
mDropType(CSMWorld::TableMimeData::convertEnums(display))
|
|
|
|
|
{
|
|
|
|
|
setAcceptDrops(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CSVWidget::DropLineEdit::dragEnterEvent(QDragEnterEvent *event)
|
|
|
|
|
{
|
|
|
|
|
if (canAcceptEventData(event))
|
|
|
|
|
if (CSVWorld::DragDropUtils::canAcceptData(*event, mDropType))
|
|
|
|
|
{
|
|
|
|
|
event->acceptProposedAction();
|
|
|
|
|
}
|
|
|
|
@ -37,7 +24,7 @@ void CSVWidget::DropLineEdit::dragEnterEvent(QDragEnterEvent *event)
|
|
|
|
|
|
|
|
|
|
void CSVWidget::DropLineEdit::dragMoveEvent(QDragMoveEvent *event)
|
|
|
|
|
{
|
|
|
|
|
if (canAcceptEventData(event))
|
|
|
|
|
if (CSVWorld::DragDropUtils::canAcceptData(*event, mDropType))
|
|
|
|
|
{
|
|
|
|
|
event->accept();
|
|
|
|
|
}
|
|
|
|
@ -45,48 +32,10 @@ void CSVWidget::DropLineEdit::dragMoveEvent(QDragMoveEvent *event)
|
|
|
|
|
|
|
|
|
|
void CSVWidget::DropLineEdit::dropEvent(QDropEvent *event)
|
|
|
|
|
{
|
|
|
|
|
const CSMWorld::TableMimeData *data = getEventMimeData(event);
|
|
|
|
|
if (data == NULL) // May happen when non-records (e.g. plain text) are dragged and dropped
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int dataIndex = getAcceptedDataIndex(*data);
|
|
|
|
|
if (dataIndex != -1)
|
|
|
|
|
{
|
|
|
|
|
std::vector<CSMWorld::UniversalId> idData = data->getData();
|
|
|
|
|
setText(idData[dataIndex].getId().c_str());
|
|
|
|
|
emit tableMimeDataDropped(idData[dataIndex], data->getDocumentPtr());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSVWidget::DropLineEdit::canAcceptEventData(QDropEvent *event) const
|
|
|
|
|
{
|
|
|
|
|
const CSMWorld::TableMimeData *data = getEventMimeData(event);
|
|
|
|
|
if (data == NULL) // May happen when non-records (e.g. plain text) are dragged and dropped
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return getAcceptedDataIndex(*data) != -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CSVWidget::DropLineEdit::getAcceptedDataIndex(const CSMWorld::TableMimeData &data) const
|
|
|
|
|
{
|
|
|
|
|
if (mDropType == CSMWorld::UniversalId::Type_None)
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool isReferenceable = mDropType == CSMWorld::UniversalId::Type_Referenceable;
|
|
|
|
|
std::vector<CSMWorld::UniversalId> idData = data.getData();
|
|
|
|
|
int size = static_cast<int>(idData.size());
|
|
|
|
|
for (int i = 0; i < size; ++i)
|
|
|
|
|
if (CSVWorld::DragDropUtils::canAcceptData(*event, mDropType))
|
|
|
|
|
{
|
|
|
|
|
CSMWorld::UniversalId::Type type = idData[i].getType();
|
|
|
|
|
if (type == mDropType || isReferenceable && CSMWorld::TableMimeData::isReferencable(type))
|
|
|
|
|
{
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
CSMWorld::UniversalId id = CSVWorld::DragDropUtils::getAcceptedData(*event, mDropType);
|
|
|
|
|
setText(id.getId().c_str());
|
|
|
|
|
emit tableMimeDataDropped(id, CSVWorld::DragDropUtils::getTableMimeData(*event)->getDocumentPtr());
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|