+++ /dev/null
-#include "common.h"\r
-#include "copymoveworker.h"\r
-#include "deleteworker.h"\r
-#include "filetablemodel.h"\r
-#include "filetableview.h"\r
-#include "historydialog.h"\r
-#include "mainwindow.h"\r
-#include "operationdialog.h"\r
-#include "overwritedialog.h"\r
-#include "renamemultidialog.h"\r
-#include "renamesingledialog.h"\r
-#include "renameworker.h"\r
-#include "sortdialog.h"\r
-\r
-#include <QDebug>\r
-#include <QDesktopServices>\r
-#include <QInputDialog>\r
-#include <QMessageBox>\r
-#include <QProcess>\r
-#include <QUrl>\r
-#include <QAction>\r
-#include <QSettings>\r
-#include <QFileDialog>\r
-#include <QKeyEvent>\r
-#include <QStatusBar>\r
-#include <QMimeData>\r
-#include <QDrag>\r
-#include <QApplication>\r
-#include <QClipboard>\r
-#include <QShortcut>\r
-\r
-#define CHECK_FOCUS { \\r
- if (!hasFocus()) { return; } \\r
- }\r
-\r
-#define MENU_TRRIGGERED(x) \\r
- getMainWnd()->findChild<QAction*>(#x), SIGNAL(triggered())\r
-#define MENU_TOGGLED(x) \\r
- getMainWnd()->findChild<QAction*>(#x), SIGNAL(toggled(bool))\r
-\r
-FileTableView::FileTableView(QWidget *parent) :\r
- QTableView(parent),\r
- m_side(),\r
- m_history(),\r
- m_dragStartPos(),\r
- m_dragging(false)\r
-{\r
- // シグナル/スロットを設定する\r
- connect(MENU_TRRIGGERED(action_Open), this, SLOT(openItem()));\r
- connect(MENU_TRRIGGERED(action_Exec), this, SLOT(openUrl()));\r
- connect(MENU_TRRIGGERED(action_OpenEditor), this, SLOT(openEditor()));\r
- connect(MENU_TRRIGGERED(action_OpenTerminal), this, SLOT(openTerminal()));\r
- connect(MENU_TRRIGGERED(action_Command), this, SLOT(kickProcess()));\r
-\r
- connect(MENU_TRRIGGERED(mark_Toggle), this, SLOT(toggleChecked()));\r
- connect(MENU_TRRIGGERED(mark_All), this, SLOT(checkAllItems()));\r
- connect(MENU_TRRIGGERED(mark_AllFiles), this, SLOT(checkAllFiles()));\r
- connect(MENU_TRRIGGERED(mark_AllOff), this, SLOT(uncheckAllItems()));\r
- connect(MENU_TRRIGGERED(mark_Invert), this, SLOT(invertAllChecked()));\r
-\r
- connect(MENU_TRRIGGERED(view_FromOther), this, SLOT(setPathFromOther()));\r
- connect(MENU_TRRIGGERED(view_ToOther), this, SLOT(setPathToOther()));\r
- connect(MENU_TRRIGGERED(view_Swap), this, SLOT(swapPath()));\r
- connect(MENU_TRRIGGERED(view_Sort), this, SLOT(setSort()));\r
- connect(MENU_TRRIGGERED(view_Refresh), this, SLOT(refresh()));\r
- connect(MENU_TRRIGGERED(view_Filter), this, SLOT(setFilter()));\r
-\r
- connect(MENU_TRRIGGERED(move_Back), this, SLOT(back()));\r
- connect(MENU_TRRIGGERED(move_Forward), this, SLOT(forward()));\r
- connect(MENU_TRRIGGERED(move_History), this, SLOT(showHidtory()));\r
- connect(MENU_TRRIGGERED(move_Home), this, SLOT(jumpToHome()));\r
- connect(MENU_TRRIGGERED(move_Parent), this, SLOT(jumpToParent()));\r
- connect(MENU_TRRIGGERED(move_Root), this, SLOT(jumpToRoot()));\r
- connect(MENU_TRRIGGERED(move_Jump), this, SLOT(jumpTo()));\r
- connect(MENU_TRRIGGERED(move_Down), this, SLOT(cursorDown()));\r
- connect(MENU_TRRIGGERED(move_Up), this, SLOT(cursorUp()));\r
- connect(MENU_TRRIGGERED(move_Begin), this, SLOT(cursorToBegin()));\r
- connect(MENU_TRRIGGERED(move_End), this, SLOT(cursorToEnd()));\r
-\r
- connect(MENU_TRRIGGERED(cmd_Copy), this, SLOT(cmdCopy()));\r
- connect(MENU_TRRIGGERED(cmd_Move), this, SLOT(cmdMove()));\r
- connect(MENU_TRRIGGERED(cmd_Delete), this, SLOT(cmdDelete()));\r
- connect(MENU_TRRIGGERED(cmd_Rename), this, SLOT(cmdRename()));\r
- connect(MENU_TRRIGGERED(cmd_NewFile), this, SLOT(newFile()));\r
- connect(MENU_TRRIGGERED(cmd_NewFolder), this, SLOT(newFolder()));\r
- connect(MENU_TRRIGGERED(copy_Filename), this, SLOT(copyFilenameToClipboard()));\r
- connect(MENU_TRRIGGERED(copy_Fullpath), this, SLOT(copyFullpathToClipboard()));\r
-\r
- connect(getMainWnd(), SIGNAL(showHiddenFiles(bool)),\r
- this, SLOT(showHiddenFiles(bool)));\r
- connect(getMainWnd(), SIGNAL(showSystemFiles(bool)),\r
- this, SLOT(showSystemFiles(bool)));\r
- connect(this, SIGNAL(openRequested(QFileInfo)),\r
- getMainWnd(), SLOT(openRequest(QFileInfo)));\r
-\r
- connect(this, SIGNAL(doubleClicked(QModelIndex)),\r
- this, SLOT(onDoubleClick(QModelIndex)));\r
-\r
- // Drag & Drop\r
- setDragEnabled(true);\r
- setAcceptDrops(true);\r
- setDropIndicatorShown(true);\r
-\r
- // Context Menu\r
- setContextMenuPolicy(Qt::CustomContextMenu);\r
- connect(this, SIGNAL(customContextMenuRequested(QPoint)),\r
- this, SLOT(contextMenuRequested(QPoint)));\r
-}\r
-\r
-FileTableView::~FileTableView()\r
-{\r
- QSettings settings;\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
-\r
- settings.setValue(side() + slash + IniKey_Dir, m->absolutePath());\r
-}\r
-\r
-QString FileTableView::side() const\r
-{\r
- return m_side;\r
-}\r
-\r
-void FileTableView::setSide(const QString &side)\r
-{\r
- m_side = side;\r
-\r
- // コンストラクタではステータスバーが生成されていないため\r
- // このタイミングでconnectする\r
- connect(this, SIGNAL(indexChanged(QString)),\r
- getMainWnd()->statusBar(), SLOT(showMessage(QString)));\r
-}\r
-\r
-void FileTableView::setRootPath(const QString &path, bool addHistory)\r
-{\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- QFileInfo info(path);\r
-\r
- if (info.isDir()) {\r
- getMainWnd()->statusBar()->showMessage(tr("ファイルリストの取得中..."));\r
-\r
- setUpdatesEnabled(false);\r
- m->setPath(info.absoluteFilePath());\r
- setUpdatesEnabled(true);\r
-\r
- if (addHistory) {\r
- m_history.add(info.absoluteFilePath());\r
- }\r
- updateMenu();\r
-\r
- selectRow(0);\r
- getMainWnd()->statusBar()->showMessage(tr("レディ"), 5000);\r
- }\r
-}\r
-\r
-QFileInfoList FileTableView::selectedItems() const\r
-{\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- QFileInfoList list = m->checkedItems();\r
- if (list.isEmpty()) {\r
- QFileInfo info = m->fileInfo(currentIndex());\r
- if (info.fileName() != "..") {\r
- list.append(info);\r
- }\r
- }\r
-\r
- return list;\r
-}\r
-\r
-void FileTableView::updateMenu()\r
-{\r
- if (m_history.isEmpty()) {\r
- getMainWnd()->findChild<QAction*>("move_Back")->setEnabled(false);\r
- getMainWnd()->findChild<QAction*>("move_Forward")->setEnabled(false);\r
-\r
- }\r
- else {\r
- getMainWnd()->findChild<QAction*>("move_Back")\r
- ->setEnabled(!m_history.isBegin());\r
- getMainWnd()->findChild<QAction*>("move_Forward")\r
- ->setEnabled(!m_history.isEnd());\r
- }\r
-}\r
-\r
-void FileTableView::openItem()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QModelIndex index = currentIndex();\r
- if (!index.isValid()) {\r
- return;\r
- }\r
-\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- if (m->fileInfo(index).isDir()) {\r
- setRootIndex(index);\r
- }\r
- else {\r
- QSettings settings;\r
- if (!settings.value(IniKey_ViewerForceOpen).toBool()) {\r
- QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");\r
- foreach (const QString &ext, list) {\r
- if (ext.toLower() == m->fileInfo(index).suffix().toLower()) {\r
- openUrl(index);\r
- return;\r
- }\r
- }\r
- }\r
- emit openRequested(m->fileInfo(index));\r
- }\r
-}\r
-\r
-void FileTableView::openUrl(const QModelIndex &index)\r
-{\r
- CHECK_FOCUS;\r
-\r
- if (index.isValid()) {\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- QString path = QDir::toNativeSeparators(m->fileInfo(index).absoluteFilePath());\r
- QDesktopServices::openUrl(QUrl("file:///" + path));\r
- }\r
- else {\r
- QFileInfoList list = selectedItems();\r
- foreach (const QFileInfo &info, list) {\r
- QString path = QDir::toNativeSeparators(info.absoluteFilePath());\r
- QDesktopServices::openUrl(QUrl("file:///" + path));\r
- }\r
- }\r
-}\r
-\r
-void FileTableView::openEditor(const QString &path)\r
-{\r
- CHECK_FOCUS;\r
-\r
- QSettings settings;\r
- if (settings.value(IniKey_EditorPath).toString().isEmpty()) {\r
- QMessageBox::critical(\r
- this, tr("エラー"),\r
- tr("外部エディタのパスが未定義です。"));\r
- return;\r
- }\r
-\r
- QFileInfo info;\r
- if (path.isEmpty()) {\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- info.setFile(m->fileInfo(currentIndex()).absoluteFilePath());\r
- }\r
- else {\r
- info.setFile(path);\r
- }\r
-\r
- QString exe = settings.value(IniKey_EditorPath).toString();\r
- QString opt = settings.value(IniKey_EditorOption).toString();\r
- opt.replace("$B", info.completeBaseName());\r
- opt.replace("$E", info.suffix());\r
- opt.replace("$F", info.fileName());\r
- opt.replace("$D", info.absolutePath());\r
- opt.replace("$P", info.absoluteFilePath());\r
-\r
- QString command;\r
-#ifdef Q_OS_MAC\r
- command = "open -a " + exe + " " + opt;\r
-#else\r
- command = QQ(exe) + " " + opt;\r
-#endif\r
- qDebug() << command;\r
- QProcess process(this);\r
- process.setWorkingDirectory(info.absolutePath());\r
- if (!process.startDetached(command)) {\r
- QMessageBox::critical(\r
- this, tr("エラー"),\r
- tr("外部エディタの起動に失敗しました。<br/>")\r
- + command);\r
- }\r
-}\r
-\r
-void FileTableView::openTerminal(const QString &path)\r
-{\r
- CHECK_FOCUS;\r
-\r
- QSettings settings;\r
- if (settings.value(IniKey_TerminalPath).toString().isEmpty()) {\r
- QMessageBox::critical(\r
- this, tr("エラー"),\r
- tr("ターミナルのパスが未定義です。"));\r
- return;\r
- }\r
-\r
- QFileInfo info;\r
- if (path.isEmpty()) {\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- info.setFile(m->fileInfo(currentIndex()).absoluteFilePath());\r
- }\r
- else {\r
- info.setFile(path);\r
- }\r
-\r
- QString exe = settings.value(IniKey_TerminalPath).toString();\r
- QString opt = settings.value(IniKey_TerminalOption).toString();\r
- opt.replace("$B", info.completeBaseName());\r
- opt.replace("$E", info.suffix());\r
- opt.replace("$F", info.fileName());\r
- if (info.isDir()) {\r
- opt.replace("$D", info.absoluteFilePath());\r
- }\r
- else {\r
- opt.replace("$D", info.absolutePath());\r
- }\r
- opt.replace("$P", info.absoluteFilePath());\r
-\r
- QString command;\r
-#ifdef Q_OS_MAC\r
- command = "open -a " + exe + " --args " + opt;\r
-#else\r
- command = QQ(exe) + " " + opt;\r
-#endif\r
- qDebug() << command;\r
- QProcess process(this);\r
- process.setWorkingDirectory(info.absolutePath());\r
- if (!process.startDetached(command)) {\r
- QMessageBox::critical(\r
- this, tr("エラー"),\r
- tr("ターミナルの起動に失敗しました。<br/>")\r
- + command);\r
- }\r
-}\r
-\r
-void FileTableView::kickProcess()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QFileInfoList list = selectedItems();\r
- QString command = QString::null;\r
- foreach (const QFileInfo &info, list) {\r
- if (info.isExecutable()) {\r
- command = QQ(info.fileName()) + " " + command;\r
- }\r
- else {\r
- command += " " + QQ(info.fileName());\r
- }\r
- }\r
-\r
- QInputDialog dlg(this);\r
- dlg.setInputMode(QInputDialog::TextInput);\r
- dlg.setWindowTitle(tr("コマンドを実行"));\r
- dlg.setLabelText(tr("コマンド:"));\r
- dlg.setTextValue(command);\r
- dlg.resize(getMainWnd()->width() * 0.8, dlg.height());\r
-\r
- int ret = dlg.exec();\r
- command = dlg.textValue();\r
- if (ret == QDialog::Accepted && !command.isEmpty()) {\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- QProcess process(this);\r
- process.setWorkingDirectory(m->absolutePath());\r
- if (!process.startDetached(command)) {\r
- QMessageBox::critical(\r
- this, tr("エラー"),\r
- tr("コマンドの実行に失敗しました。<br/>") + command);\r
- }\r
- }\r
-}\r
-\r
-void FileTableView::toggleChecked()\r
-{\r
- CHECK_FOCUS;\r
-\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
-\r
- QModelIndex index = currentIndex();\r
-\r
- QFileInfo info = m->fileInfo(index);\r
- if (info.fileName() != "..") {\r
- if (m->checkState(index) == Qt::Checked) {\r
- m->setCheckState(index, Qt::Unchecked);\r
- }\r
- else {\r
- m->setCheckState(index, Qt::Checked);\r
- }\r
- }\r
- // 最終行でなければ、次のアイテムに移動する\r
- if (index.row() == m->rowCount() - 1) {\r
- setCurrentIndex(index);\r
- }\r
- else if (index.row() < m->rowCount() - 1) {\r
- setCurrentIndex(m->index(index.row() + 1, 1));\r
- }\r
-}\r
-\r
-void FileTableView::checkAllItems()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QModelIndex index = currentIndex();\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- setUpdatesEnabled(false);\r
- m->setCheckStateAll(Qt::Checked);\r
- setUpdatesEnabled(true);\r
- setCurrentIndex(index);\r
-}\r
-\r
-void FileTableView::checkAllFiles()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QModelIndex index = currentIndex();\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- setUpdatesEnabled(false);\r
- for (int n = 0; n < m->rowCount(); n++) {\r
- QModelIndex index = m->index(n, 0);\r
- QFileInfo info = m->fileInfo(index);\r
- if (info.isDir()) {\r
- m->setCheckState(index, Qt::Unchecked);\r
- }\r
- else {\r
- m->setCheckState(index, Qt::Checked);\r
- }\r
- update(index);\r
- }\r
- setUpdatesEnabled(true);\r
- setCurrentIndex(index);\r
-}\r
-\r
-void FileTableView::uncheckAllItems()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QModelIndex index = currentIndex();\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- setUpdatesEnabled(false);\r
- m->setCheckStateAll(Qt::Unchecked);\r
- setUpdatesEnabled(true);\r
- setCurrentIndex(index);\r
-}\r
-\r
-void FileTableView::invertAllChecked()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QModelIndex index = currentIndex();\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- setUpdatesEnabled(false);\r
- for (int n = 0; n < m->rowCount(); n++) {\r
- QModelIndex index = m->index(n, 0);\r
- if (m->checkState(index) == Qt::Checked) {\r
- m->setCheckState(index, Qt::Unchecked);\r
- }\r
- else {\r
- m->setCheckState(index, Qt::Checked);\r
- }\r
- update(index);\r
- }\r
- setUpdatesEnabled(true);\r
- setCurrentIndex(index);\r
-}\r
-\r
-void FileTableView::setPathFromOther()\r
-{\r
- CHECK_FOCUS;\r
-\r
- FileTableView *other = getMainWnd()->otherSideView(this);\r
- if (other == NULL) {\r
- return;\r
- }\r
-\r
- FileTableModel *mOther = static_cast<FileTableModel*>(other->model());\r
-\r
- setRootPath(mOther->absolutePath(), true);\r
-}\r
-\r
-void FileTableView::setPathToOther()\r
-{\r
- CHECK_FOCUS;\r
-\r
- FileTableView *other = getMainWnd()->otherSideView(this);\r
- if (other == NULL) {\r
- return;\r
- }\r
-\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
-\r
- other->setRootPath(m->absolutePath(), true);\r
-}\r
-\r
-void FileTableView::swapPath()\r
-{\r
- CHECK_FOCUS;\r
-\r
- FileTableView *other = getMainWnd()->otherSideView(this);\r
- if (other == NULL) {\r
- return;\r
- }\r
-\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- FileTableModel *mOther = static_cast<FileTableModel*>(other->model());\r
-\r
- QString path = m->absolutePath();\r
- QString pathOther = mOther->absolutePath();\r
-\r
- setRootPath(pathOther, true);\r
- other->setRootPath(path, true);\r
-}\r
-\r
-void FileTableView::showHiddenFiles(bool show)\r
-{\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- if (show) {\r
- m->setFilter(m->filter() | QDir::Hidden);\r
- }\r
- else {\r
- m->setFilter(m->filter() ^ QDir::Hidden);\r
- }\r
-\r
- setUpdatesEnabled(false);\r
- refresh();\r
- setUpdatesEnabled(true);\r
-}\r
-\r
-void FileTableView::showSystemFiles(bool show)\r
-{\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- if (show) {\r
- m->setFilter(m->filter() | QDir::System);\r
- }\r
- else {\r
- m->setFilter(m->filter() ^ QDir::System);\r
- }\r
-\r
- setUpdatesEnabled(false);\r
- refresh();\r
- setUpdatesEnabled(true);\r
-}\r
-\r
-void FileTableView::setSort()\r
-{\r
- CHECK_FOCUS;\r
-\r
- SortDialog dlg(this);\r
- dlg.setRightOrLeft(side());\r
- if (dlg.exec() == QDialog::Accepted) {\r
- QSettings settings;\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- m->setSorting(QDir::Name); // 0\r
-\r
- int sortBy = settings.value(side() + slash + IniKey_SortBy).toInt();\r
- switch (sortBy) {\r
- case SortByDate: m->setSorting(m->sorting() | QDir::Time); break;\r
- case SortBySize: m->setSorting(m->sorting() | QDir::Size); break;\r
- case SortByType: m->setSorting(m->sorting() | QDir::Type); break;\r
- default: m->setSorting(m->sorting() | QDir::Name); break;\r
- }\r
-\r
- // デフォルトだと文字列は昇順で、数値は降順…orz\r
- int orderBy = settings.value(side() + slash + IniKey_OrderBy).toInt();\r
- if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
- ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
- {\r
- m->setSorting(m->sorting() | QDir::Reversed);\r
- }\r
-\r
- switch (settings.value(side() + slash + IniKey_PutDirs).toInt()) {\r
- case PutDirsFirst: m->setSorting(m->sorting() | QDir::DirsFirst); break;\r
- case PutDirsLast: m->setSorting(m->sorting() | QDir::DirsLast); break;\r
- }\r
-\r
- if (settings.value(side() + slash + IniKey_IgnoreCase).toBool()) {\r
- m->setSorting(m->sorting() | QDir::IgnoreCase);\r
- }\r
-\r
- setUpdatesEnabled(false);\r
- refresh();\r
- setUpdatesEnabled(true);\r
- }\r
-}\r
-\r
-void FileTableView::refresh()\r
-{\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- int row = currentIndex().row();\r
- setRootPath(m->absolutePath(), false);\r
- if (m->rowCount() <= row) {\r
- row = m->rowCount() - 1;\r
- }\r
- setCurrentIndex(m->index(row, 0));\r
- selectRow(row);\r
-}\r
-\r
-void FileTableView::setFilter()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QString filters = QString::null;\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- foreach (const QString &filter, m->nameFilters()) {\r
- filters += filter + " ";\r
- }\r
-\r
- QInputDialog dlg(this);\r
- dlg.setInputMode(QInputDialog::TextInput);\r
- dlg.setWindowTitle(tr("フィルタを設定"));\r
- dlg.setLabelText(tr("フィルタ:"));\r
- dlg.setTextValue(filters);\r
- dlg.resize(getMainWnd()->width() * 0.8, dlg.height());\r
-\r
- if (dlg.exec() == QDialog::Accepted) {\r
- filters = dlg.textValue();\r
- if (filters.isEmpty()) {\r
- filters = "*";\r
- }\r
- m->setNameFilters(filters.split(" ", QString::SkipEmptyParts));\r
- refresh();\r
- emit filterChanged();\r
- }\r
-}\r
-\r
-void FileTableView::back()\r
-{\r
- CHECK_FOCUS;\r
-\r
- if (!m_history.isBegin()) {\r
- const QString &path = m_history.back();\r
- setRootPath(path, false);\r
-\r
- updateMenu();\r
- }\r
-}\r
-\r
-void FileTableView::forward()\r
-{\r
- CHECK_FOCUS;\r
-\r
- if (!m_history.isEnd()) {\r
- const QString &path = m_history.forward();\r
- setRootPath(path, false);\r
-\r
- updateMenu();\r
- }\r
-}\r
-\r
-void FileTableView::showHidtory()\r
-{\r
- CHECK_FOCUS;\r
-\r
- FileTableView *other = getMainWnd()->otherSideView(this);\r
-\r
- HistoryDialog dlg(this);\r
- if (side() == "Left") {\r
- dlg.setDefaultLeft(true);\r
- dlg.setHistory(&m_history, other->history());\r
- }\r
- else {\r
- dlg.setDefaultLeft(false);\r
- dlg.setHistory(other->history(), &m_history);\r
- }\r
-\r
- if (dlg.exec() == QDialog::Accepted) {\r
- if (side() == dlg.selectedSide()) {\r
- m_history.setAt(dlg.selectedIndex());\r
- setRootPath(m_history.current(), false);\r
- }\r
- else {\r
- setRootPath(other->history()->at(dlg.selectedIndex()), true);\r
- }\r
- updateMenu();\r
- }\r
-}\r
-\r
-void FileTableView::jumpToHome()\r
-{\r
- CHECK_FOCUS;\r
-\r
- setRootPath(QDir::homePath(), true);\r
-}\r
-\r
-void FileTableView::jumpToParent()\r
-{\r
- CHECK_FOCUS;\r
-\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- QDir dir(m->absolutePath());\r
- if (!dir.isRoot()) {\r
- dir.cdUp();\r
- setRootPath(dir.absolutePath(), true);\r
- }\r
-}\r
-\r
-void FileTableView::jumpToRoot()\r
-{\r
- CHECK_FOCUS;\r
-\r
- setRootPath(QDir::rootPath(), true);\r
-}\r
-\r
-void FileTableView::jumpTo()\r
-{\r
- CHECK_FOCUS;\r
-\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- QString path = QFileDialog::getExistingDirectory(\r
- this, tr("フォルダを選択"), m->absolutePath());\r
- if (!path.isEmpty()) {\r
- setRootPath(path, true);\r
- }\r
-}\r
-\r
-void FileTableView::cursorDown()\r
-{\r
- CHECK_FOCUS;\r
-\r
- int row = currentIndex().row();\r
- if (row < model()->rowCount() - 1) {\r
- setCurrentIndex(model()->index(row + 1, 1));\r
- }\r
-}\r
-\r
-void FileTableView::cursorUp()\r
-{\r
- CHECK_FOCUS;\r
-\r
- int row = currentIndex().row();\r
- if (row > 0) {\r
- setCurrentIndex(model()->index(row - 1, 1));\r
- }\r
-}\r
-\r
-void FileTableView::cursorToBegin()\r
-{\r
- CHECK_FOCUS;\r
-\r
- setCurrentIndex(model()->index(0, 1));\r
-}\r
-\r
-void FileTableView::cursorToEnd()\r
-{\r
- CHECK_FOCUS;\r
-\r
- setCurrentIndex(model()->index(model()->rowCount() - 1, 1));\r
-}\r
-\r
-void FileTableView::cmdCopy()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QFileInfoList list = selectedItems();\r
- if (list.isEmpty()) {\r
- return;\r
- }\r
-\r
- QSettings settings;\r
- if (settings.value(IniKey_ConfirmCopy).toBool()) {\r
- int ret = QMessageBox::question(this, tr("確認"),\r
- tr("コピーを実行しますか?"));\r
- if (ret != QMessageBox::Yes) {\r
- return;\r
- }\r
- }\r
-\r
- FileTableView *other = getMainWnd()->otherSideView(this);\r
- FileTableModel *mOther = static_cast<FileTableModel*>(other->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(mOther->absolutePath());\r
- worker->setMoveMode(false);\r
-\r
- OperationDialog opDlg(this);\r
- opDlg.setWindowTitle(tr("コピー"));\r
- opDlg.setWorker(worker);\r
- opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());\r
-\r
- opDlg.exec();\r
-\r
- settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());\r
-}\r
-\r
-void FileTableView::cmdMove()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QFileInfoList list = selectedItems();\r
- if (list.isEmpty()) {\r
- return;\r
- }\r
-\r
- QSettings settings;\r
- if (settings.value(IniKey_ConfirmMove).toBool()) {\r
- int ret = QMessageBox::question(this, tr("確認"),\r
- tr("移動を実行しますか?"));\r
- if (ret != QMessageBox::Yes) {\r
- return;\r
- }\r
- }\r
-\r
- FileTableView *other = getMainWnd()->otherSideView(this);\r
- FileTableModel *mOther = static_cast<FileTableModel*>(other->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(mOther->absolutePath());\r
- worker->setMoveMode(true);\r
-\r
- OperationDialog opDlg(this);\r
- opDlg.setWindowTitle(tr("移動"));\r
- opDlg.setWorker(worker);\r
- opDlg.setAutoClose(settings.value(IniKey_AutoCloseMove).toBool());\r
-\r
- opDlg.exec();\r
-\r
- settings.setValue(IniKey_AutoCloseMove, opDlg.autoClose());\r
-}\r
-\r
-void FileTableView::cmdDelete()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QFileInfoList list = selectedItems();\r
- if (list.isEmpty()) {\r
- return;\r
- }\r
-\r
- QSettings settings;\r
- if (settings.value(IniKey_ConfirmDelete).toBool()) {\r
- QString msg;\r
- if (list.size() == 1) {\r
- msg = list[0].fileName();\r
- }\r
- else {\r
- msg = tr("%1個のアイテム").arg(list.size());\r
- }\r
- int ret = QMessageBox::question(\r
- this, tr("確認"),\r
- msg + tr("を削除しますか?"));\r
- if (ret != QMessageBox::Yes) {\r
- return;\r
- }\r
- }\r
- DeleteWorker *worker = new DeleteWorker();\r
- worker->setDeleteList(&list);\r
-\r
- OperationDialog opDlg(this);\r
- opDlg.setWindowTitle(tr("削除"));\r
- opDlg.setWorker(worker);\r
- opDlg.setAutoClose(settings.value(IniKey_AutoCloseDelete).toBool());\r
-\r
- opDlg.exec();\r
-\r
- settings.setValue(IniKey_AutoCloseDelete, opDlg.autoClose());\r
-}\r
-\r
-void FileTableView::cmdRename()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QFileInfoList list = selectedItems();\r
- if (list.isEmpty()) {\r
- return;\r
- }\r
-\r
- IRenameDialog *dlg;\r
- if (list.size() == 1) {\r
- dlg = new RenameSingleDialog(this);\r
- }\r
- else {\r
- dlg = new RenameMultiDialog(this);\r
- }\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- dlg->setWorkingDirectory(m->absolutePath());\r
- dlg->setNames(list);\r
- int dlgResult = dlg->exec();\r
- if (dlgResult == QDialog::Accepted && !dlg->renameMap().isEmpty()) {\r
- QSettings settings;\r
- if (settings.value(IniKey_ConfirmRename).toBool()) {\r
- int ret = QMessageBox::question(this, tr("確認"),\r
- tr("名前の変更を実行しますか?"));\r
- if (ret != QMessageBox::Yes) {\r
- return;\r
- }\r
- }\r
-\r
- RenameWorker *worker = new RenameWorker();\r
- worker->setRenameMap(&dlg->renameMap());\r
-\r
- OperationDialog opDlg(this);\r
- opDlg.setWindowTitle(tr("名前を変更"));\r
- opDlg.setWorker(worker);\r
- opDlg.setAutoClose(settings.value(IniKey_AutoCloseRename).toBool());\r
-\r
- opDlg.exec();\r
-\r
- settings.setValue(IniKey_AutoCloseRename, opDlg.autoClose());\r
- }\r
-}\r
-\r
-void FileTableView::newFile()\r
-{\r
- CHECK_FOCUS;\r
-\r
- bool bOk;\r
- QString name = QInputDialog::getText(\r
- this, tr("ファイルを作成"), tr("ファイル名:"),\r
- QLineEdit::Normal, "", &bOk);\r
- if (bOk && !name.isEmpty()) {\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- QDir dir(m->absolutePath());\r
- QFile file(dir.absoluteFilePath(name));\r
- if (!file.open(QIODevice::WriteOnly)) {\r
- QMessageBox::critical(\r
- this, tr("エラー"),\r
- tr("ファイルの作成に失敗しました。"));\r
- }\r
- else {\r
- file.close();\r
-\r
- QSettings settings;\r
- if (settings.value(IniKey_OpenAfterCreateFile).toBool()) {\r
- openEditor(dir.absoluteFilePath(name));\r
- }\r
- }\r
- }\r
-}\r
-\r
-void FileTableView::newFolder()\r
-{\r
- CHECK_FOCUS;\r
-\r
- bool bOk;\r
- QString name = QInputDialog::getText(\r
- this, tr("フォルダを作成"), tr("フォルダ名:"),\r
- QLineEdit::Normal, "", &bOk);\r
- if (bOk && !name.isEmpty()) {\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- QDir dir(m->absolutePath());\r
- if (!dir.mkpath(name)) {\r
- QMessageBox::critical(\r
- this, tr("エラー"),\r
- tr("フォルダの作成に失敗しました。"));\r
- }\r
- else {\r
- QSettings settings;\r
- if (settings.value(IniKey_MoveAfterCreateFolder).toBool()) {\r
- setRootPath(dir.absoluteFilePath(name), true);\r
- }\r
- }\r
- }\r
-}\r
-\r
-void FileTableView::copyFilenameToClipboard()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QModelIndex index = currentIndex();\r
- if (!index.isValid()) {\r
- return;\r
- }\r
-\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- QClipboard *clipboard = QApplication::clipboard();\r
- clipboard->setText(m->fileInfo(index).fileName());\r
-}\r
-\r
-void FileTableView::copyFullpathToClipboard()\r
-{\r
- CHECK_FOCUS;\r
-\r
- QModelIndex index = currentIndex();\r
- if (!index.isValid()) {\r
- return;\r
- }\r
-\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- QClipboard *clipboard = QApplication::clipboard();\r
- clipboard->setText(m->fileInfo(index).absoluteFilePath());\r
-}\r
-\r
-void FileTableView::XXX()\r
-{\r
- CHECK_FOCUS;\r
-\r
- qDebug() << sender()->objectName() << "に対するスロットは未実装です。";\r
-}\r
-\r
-void FileTableView::askOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod,\r
- QString *alias, const QString &srcPath,\r
- const QString &tgtPath)\r
- {\r
- OverWriteDialog dlg;\r
- if (*prevCopyMethod == OverWriteDialog::Undefined) {\r
- QSettings settings;\r
- QString method = settings.value(IniKey_DefaultOnCopy).toString();\r
- if (method == "owDefOverWrite") {\r
- *prevCopyMethod = OverWriteDialog::OverWrite;\r
- }\r
- else if (method == "owDefSkip") {\r
- *prevCopyMethod = OverWriteDialog::Skip;\r
- }\r
- else if (method == "owDefAppendNumber") {\r
- *prevCopyMethod = OverWriteDialog::AppendNumber;\r
- }\r
- else if (method == "owDefRename") {\r
- *prevCopyMethod = OverWriteDialog::Rename;\r
- }\r
- else {\r
- *prevCopyMethod = OverWriteDialog::OverWriteIfNew;\r
- }\r
- }\r
- dlg.setCopyMethod(*prevCopyMethod);\r
- dlg.setSameMethodChecked(*copyMethod != OverWriteDialog::Undefined);\r
- dlg.setFileInfo(srcPath, tgtPath);\r
- if (dlg.exec() == QDialog::Rejected) {\r
- *bOk = false;\r
- }\r
- else {\r
- *prevCopyMethod = dlg.copyMethod();\r
- if (dlg.isSameMethodChecked()) {\r
- *copyMethod = *prevCopyMethod;\r
- }\r
- *alias = dlg.alias();\r
- *bOk = true;\r
- }\r
- CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());\r
- worker->endAsking();\r
-}\r
-\r
-void FileTableView::onDoubleClick(const QModelIndex &index)\r
-{\r
- if (!index.isValid()) {\r
- return;\r
- }\r
-\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
-\r
- if (m->fileInfo(index).isDir()) {\r
- if (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier)) {\r
- openTerminal(m->fileInfo(index).absoluteFilePath());\r
- }\r
- else {\r
- setRootPath(m->fileInfo(index).absoluteFilePath(), true);\r
- }\r
- }\r
- else if (QApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)){\r
- openEditor(m->fileInfo(index).absoluteFilePath());\r
- }\r
- else {\r
- openUrl(index);\r
- }\r
-\r
-}\r
-\r
-void FileTableView::contextMenuRequested(const QPoint &pos)\r
-{\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- QModelIndex index = indexAt(pos);\r
- if (!index.isValid()) {\r
- return;\r
- }\r
-\r
- Q_UNUSED(m);\r
-}\r
-\r
-void FileTableView::setRootIndex(const QModelIndex &index)\r
-{\r
- if (!index.isValid()) {\r
- return;\r
- }\r
-\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
-\r
- if (m->fileInfo(index).isDir()) {\r
- setRootPath(m->fileInfo(index).absoluteFilePath(), true);\r
- }\r
-}\r
-\r
-void FileTableView::keyPressEvent(QKeyEvent *event)\r
-{\r
- // Macでアクションが処理されないケースがあるため、\r
- // キーイベントを拾ってアクションシグナルを起動する\r
- QString modifier = QString::null;\r
- if (event->modifiers() & Qt::ShiftModifier) { modifier += "Shift+"; }\r
- if (event->modifiers() & Qt::ControlModifier) { modifier += "Ctrl+"; }\r
- if (event->modifiers() & Qt::AltModifier) { modifier += "Alt+"; }\r
- if (event->modifiers() & Qt::MetaModifier) { modifier += "Meta+"; }\r
-\r
- QString key = QKeySequence(event->key()).toString();\r
- QString ksq = QKeySequence(modifier + key).toString();\r
-\r
- if (!ksq.isEmpty()) {\r
- foreach (QObject *obj, getMainWnd()->children()) {\r
- QAction *action = qobject_cast<QAction*>(obj);\r
- if (action && action->isEnabled()) {\r
- foreach (const QKeySequence &keySeq, action->shortcuts()) {\r
- if (ksq == keySeq.toString()) {\r
- qDebug() << "emit " << ksq << " " << action->objectName();\r
- emit action->triggered();\r
- event->accept();\r
- return;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (ksq == "Left" || ksq == "Right") {\r
- if (side() == ksq) {\r
- jumpToParent();\r
- }\r
- else {\r
- getMainWnd()->otherSideView(this)->setFocus();\r
- }\r
- event->accept();\r
- return;\r
- }\r
-\r
- if (!ksq.isEmpty() && ksq != "Down" && ksq != "Up") {\r
- qDebug() << ksq;\r
- }\r
- QTableView::keyPressEvent(event);\r
-}\r
-\r
-void FileTableView::focusInEvent(QFocusEvent *event)\r
-{\r
- if (!currentIndex().isValid()) {\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- if (m) {\r
- setCurrentIndex(m->index(0, 0));\r
- }\r
- }\r
-\r
- updateMenu();\r
-\r
- QTableView::focusInEvent(event);\r
-}\r
-\r
-void FileTableView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)\r
-{\r
- Q_UNUSED(previous);\r
-\r
- if (current.isValid()) {\r
- FileTableModel *m = static_cast<FileTableModel*>(model());\r
- emit indexChanged(m->fileInfo(current).absoluteFilePath());\r
- }\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