diff --git a/src/ExtendedTableWidget.cpp b/src/ExtendedTableWidget.cpp index d2391cbf..329eb294 100644 --- a/src/ExtendedTableWidget.cpp +++ b/src/ExtendedTableWidget.cpp @@ -155,3 +155,20 @@ void ExtendedTableWidget::cellClicked(const QModelIndex& index) emit foreignKeyClicked(fk.table(), fk.columns().size() ? fk.columns().at(0) : "", m->data(index, Qt::EditRole).toByteArray()); } } + +void ExtendedTableWidget::dragEnterEvent(QDragEnterEvent* event) +{ + event->accept(); +} + +void ExtendedTableWidget::dragMoveEvent(QDragMoveEvent* event) +{ + event->accept(); +} + +void ExtendedTableWidget::dropEvent(QDropEvent* event) +{ + QModelIndex index = indexAt(event->pos()); + model()->dropMimeData(event->mimeData(), Qt::CopyAction, index.row(), index.column(), QModelIndex()); + event->acceptProposedAction(); +} diff --git a/src/ExtendedTableWidget.h b/src/ExtendedTableWidget.h index 09938070..b26536f1 100644 --- a/src/ExtendedTableWidget.h +++ b/src/ExtendedTableWidget.h @@ -4,6 +4,8 @@ #include #include "FilterTableHeader.h" #include +#include +#include class ExtendedTableWidget : public QTableView { @@ -31,6 +33,9 @@ private slots: protected: virtual void keyPressEvent(QKeyEvent* event); virtual void updateGeometries(); + virtual void dragEnterEvent(QDragEnterEvent* event); + virtual void dragMoveEvent(QDragMoveEvent* event); + virtual void dropEvent(QDropEvent* event); FilterTableHeader* m_tableHeader; }; diff --git a/src/MainWindow.ui b/src/MainWindow.ui index 611288a0..0316a34f 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -182,12 +182,21 @@ + + true + This is the database view. You can double-click any record to edit its contents in the cell editor window. QAbstractItemView::NoEditTriggers + + QAbstractItemView::DragDrop + + + Qt::CopyAction + true diff --git a/src/sqlitetablemodel.cpp b/src/sqlitetablemodel.cpp index d1de79fd..0937251d 100644 --- a/src/sqlitetablemodel.cpp +++ b/src/sqlitetablemodel.cpp @@ -7,6 +7,9 @@ #include #include #include +#include +#include +#include SqliteTableModel::SqliteTableModel(QObject* parent, DBBrowserDB* db, size_t chunkSize, const QString& encoding) : QAbstractTableModel(parent) @@ -336,7 +339,7 @@ Qt::ItemFlags SqliteTableModel::flags(const QModelIndex& index) const if(!index.isValid()) return Qt::ItemIsEnabled; - Qt::ItemFlags ret = QAbstractTableModel::flags(index); + Qt::ItemFlags ret = QAbstractTableModel::flags(index) | Qt::ItemIsDropEnabled; // Custom display format set? bool custom_display_format = false; @@ -621,3 +624,29 @@ QByteArray SqliteTableModel::decode(const QByteArray& str) const else return QTextCodec::codecForName(m_encoding.toUtf8())->toUnicode(str).toUtf8(); } + +Qt::DropActions SqliteTableModel::supportedDropActions() const +{ + return Qt::CopyAction; +} + +bool SqliteTableModel::dropMimeData(const QMimeData* data, Qt::DropAction, int row, int column, const QModelIndex& parent) +{ + // What has been dropped on the widget? + if(data->hasUrls()) + { + // If it's a URL, open the file and paste the content in the current cell + QList urls = data->urls(); + QFile file(urls.first().toLocalFile()); + if(file.exists() && file.open(QFile::ReadOnly)) + { + setData(index(row, column, parent), file.readAll()); + return true; + } + } else if(data->hasText()) { + // If it's just text we can set the cell data directly + setData(index(row, column, parent), data->text()); + } + + return false; +} diff --git a/src/sqlitetablemodel.h b/src/sqlitetablemodel.h index ff6be450..da3a1e14 100644 --- a/src/sqlitetablemodel.h +++ b/src/sqlitetablemodel.h @@ -50,6 +50,10 @@ public: public slots: void updateFilter(int column, const QString& value); +protected: + virtual Qt::DropActions supportedDropActions() const; + virtual bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); + private: void fetchData(unsigned int from, unsigned to); void clearCache();