OSDN Git Service

Ver0.06
[gefu/Gefu.git] / filetableview.cpp
index 7443d7c..52d2e3d 100644 (file)
@@ -23,6 +23,9 @@
 #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
@@ -36,7 +39,9 @@
 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
@@ -87,7 +92,6 @@ FileTableView::FileTableView(QWidget *parent) :
     setDragEnabled(true);\r
     setAcceptDrops(true);\r
     setDropIndicatorShown(true);\r
-//    setDragDropMode(QAbstractItemView::DragDrop);\r
 }\r
 \r
 FileTableView::~FileTableView()\r
@@ -201,11 +205,7 @@ void FileTableView::kickProcess()
     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
@@ -243,7 +243,6 @@ void FileTableView::toggleChecked()
         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
@@ -486,10 +485,6 @@ void FileTableView::showHidtory()
         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
@@ -499,7 +494,6 @@ void FileTableView::showHidtory()
             setRootPath(other->history()->at(dlg.selectedIndex()), true);\r
         }\r
         updateMenu();\r
-        qDebug() << dlg.selectedIndex();\r
     }\r
 }\r
 \r
@@ -757,27 +751,6 @@ void FileTableView::askOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod
      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
@@ -842,3 +815,106 @@ void FileTableView::currentChanged(const QModelIndex &current, const QModelIndex
 \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