2 #include "copymoveworker.h"
\r
3 #include "deleteworker.h"
\r
4 #include "filetablemodel.h"
\r
5 #include "filetableview.h"
\r
6 #include "historydialog.h"
\r
7 #include "mainwindow.h"
\r
8 #include "operationdialog.h"
\r
9 #include "overwritedialog.h"
\r
10 #include "renamemultidialog.h"
\r
11 #include "renamesingledialog.h"
\r
12 #include "renameworker.h"
\r
13 #include "sortdialog.h"
\r
16 #include <QDesktopServices>
\r
17 #include <QInputDialog>
\r
18 #include <QMessageBox>
\r
22 #include <QSettings>
\r
23 #include <QFileDialog>
\r
24 #include <QKeyEvent>
\r
25 #include <QStatusBar>
\r
26 #include <QMimeData>
\r
28 #include <QApplication>
\r
30 #define CHECK_FOCUS { \
\r
31 if (!hasFocus()) { return; } \
\r
34 #define MENU_TRRIGGERED(x) \
\r
35 getMainWnd()->findChild<QAction*>(#x), SIGNAL(triggered())
\r
36 #define MENU_TOGGLED(x) \
\r
37 getMainWnd()->findChild<QAction*>(#x), SIGNAL(toggled(bool))
\r
39 FileTableView::FileTableView(QWidget *parent) :
\r
47 connect(MENU_TRRIGGERED(action_Open), this, SLOT(setPath()));
\r
48 connect(MENU_TRRIGGERED(action_Exec), this, SLOT(openUrl()));
\r
49 connect(MENU_TRRIGGERED(action_OpenEditor), this, SLOT(openEditor()));
\r
50 connect(MENU_TRRIGGERED(action_OpenTerminal), this, SLOT(openTerminal()));
\r
51 connect(MENU_TRRIGGERED(action_Command), this, SLOT(kickProcess()));
\r
53 connect(MENU_TRRIGGERED(mark_Toggle), this, SLOT(toggleChecked()));
\r
54 connect(MENU_TRRIGGERED(mark_All), this, SLOT(checkAllItems()));
\r
55 connect(MENU_TRRIGGERED(mark_AllFiles), this, SLOT(checkAllFiles()));
\r
56 connect(MENU_TRRIGGERED(mark_AllOff), this, SLOT(uncheckAllItems()));
\r
57 connect(MENU_TRRIGGERED(mark_Invert), this, SLOT(invertAllChecked()));
\r
59 connect(MENU_TRRIGGERED(view_FromOther), this, SLOT(setPathFromOther()));
\r
60 connect(MENU_TRRIGGERED(view_ToOther), this, SLOT(setPathToOther()));
\r
61 connect(MENU_TRRIGGERED(view_Swap), this, SLOT(swapPath()));
\r
62 connect(MENU_TRRIGGERED(view_Sort), this, SLOT(setSort()));
\r
63 connect(MENU_TRRIGGERED(view_Refresh), this, SLOT(refresh()));
\r
64 connect(MENU_TRRIGGERED(view_Filter), this, SLOT(setFilter()));
\r
66 connect(MENU_TRRIGGERED(move_Back), this, SLOT(back()));
\r
67 connect(MENU_TRRIGGERED(move_Forward), this, SLOT(forward()));
\r
68 connect(MENU_TRRIGGERED(move_History), this, SLOT(showHidtory()));
\r
69 connect(MENU_TRRIGGERED(move_Home), this, SLOT(jumpToHome()));
\r
70 connect(MENU_TRRIGGERED(move_Parent), this, SLOT(jumpToParent()));
\r
71 connect(MENU_TRRIGGERED(move_Root), this, SLOT(jumpToRoot()));
\r
72 connect(MENU_TRRIGGERED(move_Jump), this, SLOT(jumpTo()));
\r
73 connect(MENU_TRRIGGERED(move_Down), this, SLOT(cursorDown()));
\r
74 connect(MENU_TRRIGGERED(move_Up), this, SLOT(cursorUp()));
\r
75 connect(MENU_TRRIGGERED(move_Begin), this, SLOT(cursorToBegin()));
\r
76 connect(MENU_TRRIGGERED(move_End), this, SLOT(cursorToEnd()));
\r
78 connect(MENU_TRRIGGERED(cmd_Copy), this, SLOT(cmdCopy()));
\r
79 connect(MENU_TRRIGGERED(cmd_Move), this, SLOT(cmdMove()));
\r
80 connect(MENU_TRRIGGERED(cmd_Delete), this, SLOT(cmdDelete()));
\r
81 connect(MENU_TRRIGGERED(cmd_Rename), this, SLOT(cmdRename()));
\r
82 connect(MENU_TRRIGGERED(cmd_NewFile), this, SLOT(newFile()));
\r
83 connect(MENU_TRRIGGERED(cmd_NewFolder), this, SLOT(newFolder()));
\r
85 connect(getMainWnd(), SIGNAL(showHiddenFiles(bool)),
\r
86 this, SLOT(showHiddenFiles(bool)));
\r
87 connect(getMainWnd(), SIGNAL(showSystemFiles(bool)),
\r
88 this, SLOT(showSystemFiles(bool)));
\r
90 connect(this, SIGNAL(doubleClicked(QModelIndex)),
\r
91 this, SLOT(onDoubleClick(QModelIndex)));
\r
94 setDragEnabled(true);
\r
95 setAcceptDrops(true);
\r
96 setDropIndicatorShown(true);
\r
99 FileTableView::~FileTableView()
\r
101 QSettings settings;
\r
102 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
104 settings.setValue(side() + slash + IniKey_Dir, m->absolutePath());
\r
107 QString FileTableView::side() const
\r
112 void FileTableView::setSide(const QString &side)
\r
116 // コンストラクタではステータスバーが生成されていないため
\r
117 // このタイミングでconnectする
\r
118 connect(this, SIGNAL(indexChanged(QString)),
\r
119 getMainWnd()->statusBar(), SLOT(showMessage(QString)));
\r
122 void FileTableView::setRootPath(const QString &path, bool addHistory)
\r
124 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
125 QFileInfo info(path);
\r
127 if (info.isDir()) {
\r
128 getMainWnd()->statusBar()->showMessage(tr("ファイルリストの取得中..."));
\r
130 setUpdatesEnabled(false);
\r
131 m->setPath(info.absoluteFilePath());
\r
132 setUpdatesEnabled(true);
\r
135 m_history.add(info.absoluteFilePath());
\r
140 getMainWnd()->statusBar()->showMessage(tr("レディ"), 5000);
\r
144 QFileInfoList FileTableView::selectedItems() const
\r
146 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
147 QFileInfoList list = m->checkedItems();
\r
148 if (list.isEmpty()) {
\r
149 QFileInfo info = m->fileInfo(currentIndex());
\r
150 if (info.fileName() != "..") {
\r
158 void FileTableView::updateMenu()
\r
160 if (m_history.isEmpty()) {
\r
161 getMainWnd()->findChild<QAction*>("move_Back")->setEnabled(false);
\r
162 getMainWnd()->findChild<QAction*>("move_Forward")->setEnabled(false);
\r
166 getMainWnd()->findChild<QAction*>("move_Back")
\r
167 ->setEnabled(!m_history.isBegin());
\r
168 getMainWnd()->findChild<QAction*>("move_Forward")
\r
169 ->setEnabled(!m_history.isEnd());
\r
173 void FileTableView::setPath()
\r
177 setRootIndex(currentIndex());
\r
180 void FileTableView::openUrl(const QModelIndex &index)
\r
184 if (index.isValid()) {
\r
185 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
186 QString path = QDir::toNativeSeparators(m->absoluteFilePath(index));
\r
187 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
190 QFileInfoList list = selectedItems();
\r
191 foreach (const QFileInfo &info, list) {
\r
192 QString path = QDir::toNativeSeparators(info.absoluteFilePath());
\r
193 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
198 void FileTableView::openEditor(const QString &path)
\r
202 QSettings settings;
\r
203 if (settings.value(IniKey_EditorPath).toString().isEmpty()) {
\r
204 QMessageBox::critical(
\r
206 tr("外部エディタのパスが未定義です。"));
\r
211 if (path.isEmpty()) {
\r
212 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
213 info.setFile(m->absoluteFilePath(currentIndex()));
\r
216 info.setFile(path);
\r
219 QString exe = settings.value(IniKey_EditorPath).toString();
\r
220 QString opt = settings.value(IniKey_EditorOption).toString();
\r
221 opt.replace("$B", info.completeBaseName());
\r
222 opt.replace("$E", info.suffix());
\r
223 opt.replace("$F", info.fileName());
\r
224 opt.replace("$D", info.absolutePath());
\r
225 opt.replace("$P", info.absoluteFilePath());
\r
229 command = "open -a " + exe + " " + opt;
\r
231 command = QQ(exe) + " " + opt;
\r
233 qDebug() << command;
\r
234 QProcess process(this);
\r
235 process.setWorkingDirectory(info.absolutePath());
\r
236 if (!process.startDetached(command)) {
\r
237 QMessageBox::critical(
\r
239 tr("外部エディタの起動に失敗しました。<br/>")
\r
244 void FileTableView::openTerminal(const QString &path)
\r
248 QSettings settings;
\r
249 if (settings.value(IniKey_TerminalPath).toString().isEmpty()) {
\r
250 QMessageBox::critical(
\r
252 tr("ターミナルのパスが未定義です。"));
\r
257 if (path.isEmpty()) {
\r
258 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
259 info.setFile(m->absoluteFilePath(currentIndex()));
\r
262 info.setFile(path);
\r
265 QString exe = settings.value(IniKey_TerminalPath).toString();
\r
266 QString opt = settings.value(IniKey_TerminalOption).toString();
\r
267 opt.replace("$B", info.completeBaseName());
\r
268 opt.replace("$E", info.suffix());
\r
269 opt.replace("$F", info.fileName());
\r
270 if (info.isDir()) {
\r
271 opt.replace("$D", info.absoluteFilePath());
\r
274 opt.replace("$D", info.absolutePath());
\r
276 opt.replace("$P", info.absoluteFilePath());
\r
280 command = "open -a " + exe + " --args " + opt;
\r
282 command = QQ(exe) + " " + opt;
\r
284 qDebug() << command;
\r
285 QProcess process(this);
\r
286 process.setWorkingDirectory(info.absolutePath());
\r
287 if (!process.startDetached(command)) {
\r
288 QMessageBox::critical(
\r
290 tr("ターミナルの起動に失敗しました。<br/>")
\r
295 void FileTableView::kickProcess()
\r
299 QFileInfoList list = selectedItems();
\r
300 QString command = QString::null;
\r
301 foreach (const QFileInfo &info, list) {
\r
302 if (info.isExecutable()) {
\r
303 command = QQ(info.fileName()) + " " + command;
\r
306 command += " " + QQ(info.fileName());
\r
310 QInputDialog dlg(this);
\r
311 dlg.setInputMode(QInputDialog::TextInput);
\r
312 dlg.setWindowTitle(tr("コマンドを実行"));
\r
313 dlg.setLabelText(tr("コマンド:"));
\r
314 dlg.setTextValue(command);
\r
315 dlg.resize(getMainWnd()->width() * 0.8, dlg.height());
\r
317 int ret = dlg.exec();
\r
318 command = dlg.textValue();
\r
319 if (ret == QDialog::Accepted && !command.isEmpty()) {
\r
320 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
321 QProcess process(this);
\r
322 process.setWorkingDirectory(m->absolutePath());
\r
323 if (!process.startDetached(command)) {
\r
324 QMessageBox::critical(
\r
326 tr("コマンドの実行に失敗しました。<br/>") + command);
\r
331 void FileTableView::toggleChecked()
\r
335 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
337 QModelIndex index = currentIndex();
\r
339 QFileInfo info = m->fileInfo(index);
\r
340 if (info.fileName() != "..") {
\r
341 if (m->checkState(index) == Qt::Checked) {
\r
342 m->setCheckState(index, Qt::Unchecked);
\r
345 m->setCheckState(index, Qt::Checked);
\r
348 // 最終行でなければ、次のアイテムに移動する
\r
349 if (index.row() == m->rowCount() - 1) {
\r
350 setCurrentIndex(index);
\r
352 else if (index.row() < m->rowCount() - 1) {
\r
353 setCurrentIndex(m->index(index.row() + 1, 1));
\r
357 void FileTableView::checkAllItems()
\r
361 QModelIndex index = currentIndex();
\r
362 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
363 setUpdatesEnabled(false);
\r
364 m->setCheckStateAll(Qt::Checked);
\r
365 setUpdatesEnabled(true);
\r
366 setCurrentIndex(index);
\r
369 void FileTableView::checkAllFiles()
\r
373 QModelIndex index = currentIndex();
\r
374 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
375 setUpdatesEnabled(false);
\r
376 for (int n = 0; n < m->rowCount(); n++) {
\r
377 QModelIndex index = m->index(n, 0);
\r
378 QFileInfo info = m->fileInfo(index);
\r
379 if (info.isDir()) {
\r
380 m->setCheckState(index, Qt::Unchecked);
\r
383 m->setCheckState(index, Qt::Checked);
\r
387 setUpdatesEnabled(true);
\r
388 setCurrentIndex(index);
\r
391 void FileTableView::uncheckAllItems()
\r
395 QModelIndex index = currentIndex();
\r
396 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
397 setUpdatesEnabled(false);
\r
398 m->setCheckStateAll(Qt::Unchecked);
\r
399 setUpdatesEnabled(true);
\r
400 setCurrentIndex(index);
\r
403 void FileTableView::invertAllChecked()
\r
407 QModelIndex index = currentIndex();
\r
408 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
409 setUpdatesEnabled(false);
\r
410 for (int n = 0; n < m->rowCount(); n++) {
\r
411 QModelIndex index = m->index(n, 0);
\r
412 if (m->checkState(index) == Qt::Checked) {
\r
413 m->setCheckState(index, Qt::Unchecked);
\r
416 m->setCheckState(index, Qt::Checked);
\r
420 setUpdatesEnabled(true);
\r
421 setCurrentIndex(index);
\r
424 void FileTableView::setPathFromOther()
\r
428 FileTableView *other = getMainWnd()->otherSideView(this);
\r
429 if (other == NULL) {
\r
433 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
435 setRootPath(mOther->absolutePath(), true);
\r
438 void FileTableView::setPathToOther()
\r
442 FileTableView *other = getMainWnd()->otherSideView(this);
\r
443 if (other == NULL) {
\r
447 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
449 other->setRootPath(m->absolutePath(), true);
\r
452 void FileTableView::swapPath()
\r
456 FileTableView *other = getMainWnd()->otherSideView(this);
\r
457 if (other == NULL) {
\r
461 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
462 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
464 QString path = m->absolutePath();
\r
465 QString pathOther = mOther->absolutePath();
\r
467 setRootPath(pathOther, true);
\r
468 other->setRootPath(path, true);
\r
471 void FileTableView::showHiddenFiles(bool show)
\r
473 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
475 m->setFilter(m->filter() | QDir::Hidden);
\r
478 m->setFilter(m->filter() ^ QDir::Hidden);
\r
481 setUpdatesEnabled(false);
\r
483 setUpdatesEnabled(true);
\r
486 void FileTableView::showSystemFiles(bool show)
\r
488 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
490 m->setFilter(m->filter() | QDir::System);
\r
493 m->setFilter(m->filter() ^ QDir::System);
\r
496 setUpdatesEnabled(false);
\r
498 setUpdatesEnabled(true);
\r
501 void FileTableView::setSort()
\r
505 SortDialog dlg(this);
\r
506 dlg.setRightOrLeft(side());
\r
507 if (dlg.exec() == QDialog::Accepted) {
\r
508 QSettings settings;
\r
509 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
510 m->setSorting(QDir::Name); // 0
\r
512 int sortBy = settings.value(side() + slash + IniKey_SortBy).toInt();
\r
514 case SortByDate: m->setSorting(m->sorting() | QDir::Time); break;
\r
515 case SortBySize: m->setSorting(m->sorting() | QDir::Size); break;
\r
516 case SortByType: m->setSorting(m->sorting() | QDir::Type); break;
\r
517 default: m->setSorting(m->sorting() | QDir::Name); break;
\r
520 // デフォルトだと文字列は昇順で、数値は降順…orz
\r
521 int orderBy = settings.value(side() + slash + IniKey_OrderBy).toInt();
\r
522 if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||
\r
523 ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))
\r
525 m->setSorting(m->sorting() | QDir::Reversed);
\r
528 switch (settings.value(side() + slash + IniKey_PutDirs).toInt()) {
\r
529 case PutDirsFirst: m->setSorting(m->sorting() | QDir::DirsFirst); break;
\r
530 case PutDirsLast: m->setSorting(m->sorting() | QDir::DirsLast); break;
\r
533 if (settings.value(side() + slash + IniKey_IgnoreCase).toBool()) {
\r
534 m->setSorting(m->sorting() | QDir::IgnoreCase);
\r
537 setUpdatesEnabled(false);
\r
539 setUpdatesEnabled(true);
\r
543 void FileTableView::refresh()
\r
545 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
546 int row = currentIndex().row();
\r
547 setRootPath(m->absolutePath(), false);
\r
548 if (m->rowCount() <= row) {
\r
549 row = m->rowCount() - 1;
\r
551 setCurrentIndex(m->index(row, 0));
\r
555 void FileTableView::setFilter()
\r
559 QString filters = QString::null;
\r
560 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
561 foreach (const QString &filter, m->nameFilters()) {
\r
562 filters += filter + " ";
\r
565 QInputDialog dlg(this);
\r
566 dlg.setInputMode(QInputDialog::TextInput);
\r
567 dlg.setWindowTitle(tr("フィルタを設定"));
\r
568 dlg.setLabelText(tr("フィルタ:"));
\r
569 dlg.setTextValue(filters);
\r
570 dlg.resize(getMainWnd()->width() * 0.8, dlg.height());
\r
572 if (dlg.exec() == QDialog::Accepted) {
\r
573 filters = dlg.textValue();
\r
574 if (filters.isEmpty()) {
\r
577 m->setNameFilters(filters.split(" ", QString::SkipEmptyParts));
\r
579 emit filterChanged();
\r
583 void FileTableView::back()
\r
587 if (!m_history.isBegin()) {
\r
588 const QString &path = m_history.back();
\r
589 setRootPath(path, false);
\r
595 void FileTableView::forward()
\r
599 if (!m_history.isEnd()) {
\r
600 const QString &path = m_history.forward();
\r
601 setRootPath(path, false);
\r
607 void FileTableView::showHidtory()
\r
611 FileTableView *other = getMainWnd()->otherSideView(this);
\r
613 HistoryDialog dlg(this);
\r
614 if (side() == "Left") {
\r
615 dlg.setDefaultLeft(true);
\r
616 dlg.setHistory(&m_history, other->history());
\r
619 dlg.setDefaultLeft(false);
\r
620 dlg.setHistory(other->history(), &m_history);
\r
623 if (dlg.exec() == QDialog::Accepted) {
\r
624 if (side() == dlg.selectedSide()) {
\r
625 m_history.setAt(dlg.selectedIndex());
\r
626 setRootPath(m_history.current(), false);
\r
629 setRootPath(other->history()->at(dlg.selectedIndex()), true);
\r
635 void FileTableView::jumpToHome()
\r
639 setRootPath(QDir::homePath(), true);
\r
642 void FileTableView::jumpToParent()
\r
646 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
647 QDir dir(m->absolutePath());
\r
650 setRootPath(dir.absolutePath(), true);
\r
653 void FileTableView::jumpToRoot()
\r
657 setRootPath(QDir::rootPath(), true);
\r
660 void FileTableView::jumpTo()
\r
664 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
665 QString path = QFileDialog::getExistingDirectory(
\r
666 this, tr("フォルダを選択"), m->absolutePath());
\r
667 if (!path.isEmpty()) {
\r
668 setRootPath(path, true);
\r
672 void FileTableView::cursorDown()
\r
676 int row = currentIndex().row();
\r
677 if (row < model()->rowCount() - 1) {
\r
678 setCurrentIndex(model()->index(row + 1, 1));
\r
682 void FileTableView::cursorUp()
\r
686 int row = currentIndex().row();
\r
688 setCurrentIndex(model()->index(row - 1, 1));
\r
692 void FileTableView::cursorToBegin()
\r
696 setCurrentIndex(model()->index(0, 1));
\r
699 void FileTableView::cursorToEnd()
\r
703 setCurrentIndex(model()->index(model()->rowCount() - 1, 1));
\r
706 void FileTableView::cmdCopy()
\r
710 QFileInfoList list = selectedItems();
\r
711 if (list.isEmpty()) {
\r
715 QSettings settings;
\r
716 if (settings.value(IniKey_ConfirmCopy).toBool()) {
\r
717 int ret = QMessageBox::question(this, tr("確認"),
\r
718 tr("コピーを実行しますか?"));
\r
719 if (ret != QMessageBox::Yes) {
\r
724 FileTableView *other = getMainWnd()->otherSideView(this);
\r
725 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
726 CopyMoveWorker *worker = new CopyMoveWorker();
\r
727 connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),
\r
728 this, SLOT(askOverWrite(bool*,int*,int*,QString*,QString,QString)));
\r
729 worker->setCopyList(&list);
\r
730 worker->setTargetDir(mOther->absolutePath());
\r
731 worker->setMoveMode(false);
\r
733 OperationDialog opDlg(this);
\r
734 opDlg.setWindowTitle(tr("コピー"));
\r
735 opDlg.setWorker(worker);
\r
736 opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());
\r
740 settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());
\r
743 void FileTableView::cmdMove()
\r
747 QFileInfoList list = selectedItems();
\r
748 if (list.isEmpty()) {
\r
752 QSettings settings;
\r
753 if (settings.value(IniKey_ConfirmMove).toBool()) {
\r
754 int ret = QMessageBox::question(this, tr("確認"),
\r
756 if (ret != QMessageBox::Yes) {
\r
761 FileTableView *other = getMainWnd()->otherSideView(this);
\r
762 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
763 CopyMoveWorker *worker = new CopyMoveWorker();
\r
764 connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),
\r
765 this, SLOT(askOverWrite(bool*,int*,int*,QString*,QString,QString)));
\r
766 worker->setCopyList(&list);
\r
767 worker->setTargetDir(mOther->absolutePath());
\r
768 worker->setMoveMode(true);
\r
770 OperationDialog opDlg(this);
\r
771 opDlg.setWindowTitle(tr("移動"));
\r
772 opDlg.setWorker(worker);
\r
773 opDlg.setAutoClose(settings.value(IniKey_AutoCloseMove).toBool());
\r
777 settings.setValue(IniKey_AutoCloseMove, opDlg.autoClose());
\r
780 void FileTableView::cmdDelete()
\r
784 QFileInfoList list = selectedItems();
\r
785 if (list.isEmpty()) {
\r
789 QSettings settings;
\r
790 if (settings.value(IniKey_ConfirmDelete).toBool()) {
\r
792 if (list.size() == 1) {
\r
793 msg = list[0].fileName();
\r
796 msg = tr("%1個のアイテム").arg(list.size());
\r
798 int ret = QMessageBox::question(
\r
800 msg + tr("を削除しますか?"));
\r
801 if (ret != QMessageBox::Yes) {
\r
805 DeleteWorker *worker = new DeleteWorker();
\r
806 worker->setDeleteList(&list);
\r
808 OperationDialog opDlg(this);
\r
809 opDlg.setWindowTitle(tr("削除"));
\r
810 opDlg.setWorker(worker);
\r
811 opDlg.setAutoClose(settings.value(IniKey_AutoCloseDelete).toBool());
\r
815 settings.setValue(IniKey_AutoCloseDelete, opDlg.autoClose());
\r
818 void FileTableView::cmdRename()
\r
822 QFileInfoList list = selectedItems();
\r
823 if (list.isEmpty()) {
\r
827 IRenameDialog *dlg;
\r
828 if (list.size() == 1) {
\r
829 dlg = new RenameSingleDialog(this);
\r
832 dlg = new RenameMultiDialog(this);
\r
834 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
835 dlg->setWorkingDirectory(m->absolutePath());
\r
836 dlg->setNames(list);
\r
837 int dlgResult = dlg->exec();
\r
838 if (dlgResult == QDialog::Accepted && !dlg->renameMap().isEmpty()) {
\r
839 QSettings settings;
\r
840 if (settings.value(IniKey_ConfirmRename).toBool()) {
\r
841 int ret = QMessageBox::question(this, tr("確認"),
\r
842 tr("名前の変更を実行しますか?"));
\r
843 if (ret != QMessageBox::Yes) {
\r
848 RenameWorker *worker = new RenameWorker();
\r
849 worker->setRenameMap(&dlg->renameMap());
\r
851 OperationDialog opDlg(this);
\r
852 opDlg.setWindowTitle(tr("名前を変更"));
\r
853 opDlg.setWorker(worker);
\r
854 opDlg.setAutoClose(settings.value(IniKey_AutoCloseRename).toBool());
\r
858 settings.setValue(IniKey_AutoCloseRename, opDlg.autoClose());
\r
862 void FileTableView::newFile()
\r
867 QString name = QInputDialog::getText(
\r
868 this, tr("ファイルを作成"), tr("ファイル名:"),
\r
869 QLineEdit::Normal, "", &bOk);
\r
870 if (bOk && !name.isEmpty()) {
\r
871 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
872 QDir dir(m->absolutePath());
\r
873 QFile file(dir.absoluteFilePath(name));
\r
874 if (!file.open(QIODevice::WriteOnly)) {
\r
875 QMessageBox::critical(
\r
877 tr("ファイルの作成に失敗しました。"));
\r
882 QSettings settings;
\r
883 if (settings.value(IniKey_OpenAfterCreateFile).toBool()) {
\r
884 openEditor(dir.absoluteFilePath(name));
\r
890 void FileTableView::newFolder()
\r
895 QString name = QInputDialog::getText(
\r
896 this, tr("フォルダを作成"), tr("フォルダ名:"),
\r
897 QLineEdit::Normal, "", &bOk);
\r
898 if (bOk && !name.isEmpty()) {
\r
899 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
900 QDir dir(m->absolutePath());
\r
901 if (!dir.mkpath(name)) {
\r
902 QMessageBox::critical(
\r
904 tr("フォルダの作成に失敗しました。"));
\r
907 QSettings settings;
\r
908 if (settings.value(IniKey_MoveAfterCreateFolder).toBool()) {
\r
909 setRootPath(dir.absoluteFilePath(name), true);
\r
915 void FileTableView::XXX()
\r
919 qDebug() << sender()->objectName() << "に対するスロットは未実装です。";
\r
922 void FileTableView::askOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod,
\r
923 QString *alias, const QString &srcPath,
\r
924 const QString &tgtPath)
\r
926 OverWriteDialog dlg;
\r
927 if (*prevCopyMethod == OverWriteDialog::Undefined) {
\r
928 QSettings settings;
\r
929 QString method = settings.value(IniKey_DefaultOnCopy).toString();
\r
930 if (method == "owDefOverWrite") {
\r
931 *prevCopyMethod = OverWriteDialog::OverWrite;
\r
933 else if (method == "owDefSkip") {
\r
934 *prevCopyMethod = OverWriteDialog::Skip;
\r
936 else if (method == "owDefAppendNumber") {
\r
937 *prevCopyMethod = OverWriteDialog::AppendNumber;
\r
939 else if (method == "owDefRename") {
\r
940 *prevCopyMethod = OverWriteDialog::Rename;
\r
943 *prevCopyMethod = OverWriteDialog::OverWriteIfNew;
\r
946 dlg.setCopyMethod(*prevCopyMethod);
\r
947 dlg.setSameMethodChecked(*copyMethod != OverWriteDialog::Undefined);
\r
948 dlg.setFileInfo(srcPath, tgtPath);
\r
949 if (dlg.exec() == QDialog::Rejected) {
\r
953 *prevCopyMethod = dlg.copyMethod();
\r
954 if (dlg.isSameMethodChecked()) {
\r
955 *copyMethod = *prevCopyMethod;
\r
957 *alias = dlg.alias();
\r
960 CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());
\r
961 worker->endAsking();
\r
964 void FileTableView::onDoubleClick(const QModelIndex &index)
\r
966 if (!index.isValid()) {
\r
970 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
972 if (m->isDir(index)) {
\r
973 if (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier)) {
\r
974 openTerminal(m->absoluteFilePath(index));
\r
977 setRootPath(m->absoluteFilePath(index), true);
\r
980 else if (QApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)){
\r
981 openEditor(m->absoluteFilePath(index));
\r
989 void FileTableView::setRootIndex(const QModelIndex &index)
\r
991 if (!index.isValid()) {
\r
995 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
997 if (m->isDir(index)) {
\r
998 setRootPath(m->absoluteFilePath(index), true);
\r
1002 void FileTableView::keyPressEvent(QKeyEvent *event)
\r
1004 // Macでアクションが処理されないケースがあるため、
\r
1005 // キーイベントを拾ってアクションシグナルを起動する
\r
1006 QString modifier = QString::null;
\r
1007 if (event->modifiers() & Qt::ShiftModifier) { modifier += "Shift+"; }
\r
1008 if (event->modifiers() & Qt::ControlModifier) { modifier += "Ctrl+"; }
\r
1009 if (event->modifiers() & Qt::AltModifier) { modifier += "Alt+"; }
\r
1010 if (event->modifiers() & Qt::MetaModifier) { modifier += "Meta+"; }
\r
1012 QString key = QKeySequence(event->key()).toString();
\r
1013 QString ksq = QKeySequence(modifier + key).toString();
\r
1015 if (!ksq.isEmpty()) {
\r
1016 foreach (QObject *obj, getMainWnd()->children()) {
\r
1017 QAction *action = qobject_cast<QAction*>(obj);
\r
1019 foreach (const QKeySequence &keySeq, action->shortcuts()) {
\r
1020 if (ksq == keySeq.toString()) {
\r
1021 qDebug() << "emit " << ksq << " " << action->objectName();
\r
1022 emit action->triggered();
\r
1031 if (!ksq.isEmpty() && ksq != "Down" && ksq != "Up") {
\r
1034 QTableView::keyPressEvent(event);
\r
1037 void FileTableView::focusInEvent(QFocusEvent *event)
\r
1039 qDebug() << "focusInEvent();";
\r
1040 if (!currentIndex().isValid()) {
\r
1041 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
1043 setCurrentIndex(m->index(0, 0));
\r
1049 QTableView::focusInEvent(event);
\r
1052 void FileTableView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
\r
1054 Q_UNUSED(previous);
\r
1056 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
1057 emit indexChanged(m->absoluteFilePath(current));
\r
1059 QTableView::currentChanged(current, previous);
\r
1063 void FileTableView::dropEvent(QDropEvent *event)
\r
1070 QFileInfoList list;
\r
1071 foreach (const QUrl &url, event->mimeData()->urls()) {
\r
1072 QFileInfo info(url.toLocalFile());
\r
1073 QString path = info.canonicalFilePath();
\r
1074 if (!path.isEmpty()) {
\r
1078 qDebug() << "path is empty.";
\r
1082 if (list.isEmpty()) {
\r
1086 event->acceptProposedAction();
\r
1088 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
1089 CopyMoveWorker *worker = new CopyMoveWorker();
\r
1090 connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),
\r
1091 this, SLOT(askOverWrite(bool*,int*,int*,QString*,QString,QString)));
\r
1092 worker->setCopyList(&list);
\r
1093 worker->setTargetDir(m->absolutePath());
\r
1094 worker->setMoveMode(false);
\r
1096 OperationDialog opDlg(this);
\r
1097 opDlg.setWindowTitle(tr("コピー"));
\r
1098 opDlg.setWorker(worker);
\r
1104 void FileTableView::dragEnterEvent(QDragEnterEvent *event)
\r
1106 if (event->mimeData()->hasUrls()) {
\r
1107 event->acceptProposedAction();
\r
1111 QTableView::dragEnterEvent(event);
\r
1114 void FileTableView::mousePressEvent(QMouseEvent *event)
\r
1116 if ((event->buttons() & Qt::LeftButton) || (event->buttons() & Qt::RightButton))
\r
1118 m_dragStartPos = event->pos();
\r
1121 QTableView::mousePressEvent(event);
\r
1124 void FileTableView::mouseMoveEvent(QMouseEvent *event)
\r
1126 if (!(event->buttons() & Qt::LeftButton) &&
\r
1127 !(event->buttons() & Qt::RightButton))
\r
1129 QTableView::mouseMoveEvent(event);
\r
1132 if ((event->pos() - m_dragStartPos).manhattanLength()
\r
1133 < QApplication::startDragDistance())
\r
1135 QTableView::mouseMoveEvent(event);
\r
1139 QFileInfoList list = selectedItems();
\r
1140 if (list.isEmpty()) {
\r
1141 QTableView::mousePressEvent(event);
\r
1146 foreach (const QFileInfo &info, list) {
\r
1147 urls << QUrl::fromLocalFile(info.absoluteFilePath());
\r
1150 QDrag *drag = new QDrag(this);
\r
1151 QMimeData *mimeData = new QMimeData;
\r
1152 mimeData->setUrls(urls);
\r
1153 drag->setMimeData(mimeData);
\r
1155 m_dragging = true;
\r
1156 if (event->buttons() & Qt::RightButton) {
\r
1157 drag->exec(Qt::CopyAction | Qt::MoveAction);
\r
1160 drag->exec(Qt::CopyAction);
\r
1162 m_dragging = false;
\r