#include <QFileDialog>\r
#include <QKeyEvent>\r
#include <QStatusBar>\r
+#include <QMimeData>\r
+#include <QDrag>\r
+#include <QApplication>\r
\r
#define CHECK_FOCUS { \\r
if (!hasFocus()) { return; } \\r
FileTableView::FileTableView(QWidget *parent) :\r
QTableView(parent),\r
m_side(),\r
- m_history()\r
+ m_history(),\r
+ m_dragStartPos(),\r
+ m_dragging(false)\r
{\r
// シグナル/スロットを設定する\r
connect(MENU_TRRIGGERED(action_Open), this, SLOT(setPath()));\r
setDragEnabled(true);\r
setAcceptDrops(true);\r
setDropIndicatorShown(true);\r
-// setDragDropMode(QAbstractItemView::DragDrop);\r
}\r
\r
FileTableView::~FileTableView()\r
dlg.setWindowTitle(tr("コマンドを実行"));\r
dlg.setLabelText(tr("コマンド:"));\r
dlg.setTextValue(command);\r
-\r
- QSize szMainWnd = getMainWnd()->size();\r
- QSize szDialog = dlg.size();\r
- szDialog.setWidth(szMainWnd.width() * 0.8);\r
- dlg.resize(szDialog);\r
+ dlg.resize(getMainWnd()->width() * 0.8, dlg.height());\r
\r
int ret = dlg.exec();\r
command = dlg.textValue();\r
setCurrentIndex(index);\r
}\r
else if (index.row() < m->rowCount() - 1) {\r
- qDebug() << "set = " << index.row() + 1;\r
setCurrentIndex(m->index(index.row() + 1, 1));\r
}\r
}\r
dlg.setHistory(other->history(), &m_history);\r
}\r
\r
- QSize szMainWnd = getMainWnd()->size();\r
- QSize szDialog = dlg.size();\r
- szDialog.setWidth(szMainWnd.width() * 0.8);\r
- dlg.resize(szDialog);\r
if (dlg.exec() == QDialog::Accepted) {\r
if (side() == dlg.selectedSide()) {\r
m_history.setAt(dlg.selectedIndex());\r
setRootPath(other->history()->at(dlg.selectedIndex()), true);\r
}\r
updateMenu();\r
- qDebug() << dlg.selectedIndex();\r
}\r
}\r
\r
worker->endAsking();\r
}\r
\r
-void FileTableView::acceptDrops(const QFileInfoList &list)\r
-{\r
- if (list.isEmpty()) {\r
- return;\r
- }\r
-\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- CopyMoveWorker *worker = new CopyMoveWorker();\r
- connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),\r
- this, SLOT(askOverWrite(bool*,int*,int*,QString*,QString,QString)));\r
- worker->setCopyList(&list);\r
- worker->setTargetDir(m->absolutePath());\r
- worker->setMoveMode(false);\r
-\r
- OperationDialog opDlg(this);\r
- opDlg.setWindowTitle(tr("コピー"));\r
- opDlg.setWorker(worker);\r
-\r
- opDlg.exec();\r
-}\r
-\r
void FileTableView::setRootIndex(const QModelIndex &index)\r
{\r
if (!index.isValid()) {\r
\r
QTableView::currentChanged(current, previous);\r
}\r
+\r
+\r
+void FileTableView::dropEvent(QDropEvent *event)\r
+{\r
+ if (m_dragging) {\r
+ event->ignore();\r
+ return;\r
+ }\r
+\r
+ QFileInfoList list;\r
+ foreach (const QUrl &url, event->mimeData()->urls()) {\r
+ QFileInfo info(url.toLocalFile());\r
+ QString path = info.canonicalFilePath();\r
+ if (!path.isEmpty()) {\r
+ list << path;\r
+ }\r
+ else {\r
+ qDebug() << "path is empty.";\r
+ }\r
+ }\r
+\r
+ if (list.isEmpty()) {\r
+ event->ignore();\r
+ return;\r
+ }\r
+ event->acceptProposedAction();\r
+\r
+ FileTableModel *m = static_cast<FileTableModel*>(model());\r
+ CopyMoveWorker *worker = new CopyMoveWorker();\r
+ connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),\r
+ this, SLOT(askOverWrite(bool*,int*,int*,QString*,QString,QString)));\r
+ worker->setCopyList(&list);\r
+ worker->setTargetDir(m->absolutePath());\r
+ worker->setMoveMode(false);\r
+\r
+ OperationDialog opDlg(this);\r
+ opDlg.setWindowTitle(tr("コピー"));\r
+ opDlg.setWorker(worker);\r
+\r
+ opDlg.exec();\r
+}\r
+\r
+\r
+void FileTableView::dragEnterEvent(QDragEnterEvent *event)\r
+{\r
+ if (event->mimeData()->hasUrls()) {\r
+ event->acceptProposedAction();\r
+ return;\r
+ }\r
+\r
+ QTableView::dragEnterEvent(event);\r
+}\r
+\r
+void FileTableView::mousePressEvent(QMouseEvent *event)\r
+{\r
+ if ((event->buttons() & Qt::LeftButton) || (event->buttons() & Qt::RightButton))\r
+ {\r
+ m_dragStartPos = event->pos();\r
+ }\r
+\r
+ QTableView::mousePressEvent(event);\r
+}\r
+\r
+void FileTableView::mouseMoveEvent(QMouseEvent *event)\r
+{\r
+ if (!(event->buttons() & Qt::LeftButton) &&\r
+ !(event->buttons() & Qt::RightButton))\r
+ {\r
+ QTableView::mouseMoveEvent(event);\r
+ return;\r
+ }\r
+ if ((event->pos() - m_dragStartPos).manhattanLength()\r
+ < QApplication::startDragDistance())\r
+ {\r
+ QTableView::mouseMoveEvent(event);\r
+ return;\r
+ }\r
+\r
+ QFileInfoList list = selectedItems();\r
+ if (list.isEmpty()) {\r
+ QTableView::mousePressEvent(event);\r
+ return;\r
+ }\r
+\r
+ QList<QUrl> urls;\r
+ foreach (const QFileInfo &info, list) {\r
+ urls << QUrl::fromLocalFile(info.absoluteFilePath());\r
+ }\r
+\r
+ QDrag *drag = new QDrag(this);\r
+ QMimeData *mimeData = new QMimeData;\r
+ mimeData->setUrls(urls);\r
+ drag->setMimeData(mimeData);\r
+\r
+ m_dragging = true;\r
+ if (event->buttons() & Qt::RightButton) {\r
+ drag->exec(Qt::CopyAction | Qt::MoveAction);\r
+ }\r
+ else {\r
+ drag->exec(Qt::CopyAction);\r
+ }\r
+ m_dragging = false;\r
+}\r