1 #include "copymoveworker.h"
\r
2 #include "deleteworker.h"
\r
3 #include "mainwindow.h"
\r
4 #include "operationdialog.h"
\r
5 #include "overwritedialog.h"
\r
6 #include "renamemultidialog.h"
\r
7 #include "renamesingledialog.h"
\r
8 #include "renameworker.h"
\r
9 #include "sortdialog.h"
\r
10 #include "ui_mainwindow.h"
\r
11 #include <QFileSystemModel>
\r
13 #include <QKeyEvent>
\r
14 #include <QDesktopServices>
\r
15 #include <QSettings>
\r
16 #include <QFileDialog>
\r
17 #include <QMessageBox>
\r
20 #include <QInputDialog>
\r
22 MainWindow::MainWindow(QWidget *parent) :
\r
23 QMainWindow(parent),
\r
24 ui(new Ui::MainWindow)
\r
27 ui->LPanel->setSide("Left");
\r
28 ui->RPanel->setSide("Right");
\r
31 if (settings.value(IniKey_ShowHidden, false).toBool()) {
\r
32 ui->view_Hidden->setChecked(true);
\r
34 if (settings.value(IniKey_ShowSystem, false).toBool()) {
\r
35 ui->view_System->setChecked(true);
\r
38 // メニューのシグナル/スロットを設定する
\r
39 connect(ui->action_Command, SIGNAL(triggered()), this, SLOT(onActionCommand()));
\r
40 connect(ui->action_Exec, SIGNAL(triggered()), this, SLOT(onActionExec()));
\r
41 connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(onActionOpen()));
\r
42 connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(onActionQuit()));
\r
43 connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(onActionSetting()));
\r
45 connect(ui->mark_All, SIGNAL(triggered()), this, SLOT(onMarkAll()));
\r
46 connect(ui->mark_AllFiles, SIGNAL(triggered()), this, SLOT(onMarkAllFiles()));
\r
47 connect(ui->mark_AllOff, SIGNAL(triggered()), this, SLOT(onMarkAllOff()));
\r
48 connect(ui->mark_Invert, SIGNAL(triggered()), this, SLOT(onMarkInvert()));
\r
49 connect(ui->mark_Toggle, SIGNAL(triggered()), this, SLOT(onMarkToggle()));
\r
51 connect(ui->move_Down, SIGNAL(triggered()), this, SLOT(onMoveCursorDown()));
\r
52 connect(ui->move_Up, SIGNAL(triggered()), this, SLOT(onMoveCursorUp()));
\r
53 connect(ui->move_Begin, SIGNAL(triggered()), this, SLOT(onMoveCursorBegin()));
\r
54 connect(ui->move_End, SIGNAL(triggered()), this, SLOT(onMoveCursorEnd()));
\r
55 connect(ui->move_Back, SIGNAL(triggered()), this, SLOT(onMoveBack()));
\r
56 connect(ui->move_Forward, SIGNAL(triggered()), this, SLOT(onMoveForward()));
\r
57 connect(ui->move_Home, SIGNAL(triggered()), this, SLOT(onMoveHome()));
\r
58 connect(ui->move_Jump, SIGNAL(triggered()), this, SLOT(onMoveJump()));
\r
59 connect(ui->move_Parent, SIGNAL(triggered()), this, SLOT(onMoveParent()));
\r
60 connect(ui->move_Root, SIGNAL(triggered()), this, SLOT(onMoveRoot()));
\r
62 connect(ui->view_FromOther, SIGNAL(triggered()), this, SLOT(onViewFromOther()));
\r
63 connect(ui->view_ToOther, SIGNAL(triggered()), this, SLOT(onViewToOther()));
\r
64 connect(ui->view_Hidden, SIGNAL(triggered()), this, SLOT(onViewHidden()));
\r
65 connect(ui->view_Sort, SIGNAL(triggered()), this, SLOT(onViewSort()));
\r
66 connect(ui->view_Swap, SIGNAL(triggered()), this, SLOT(onViewSwap()));
\r
67 connect(ui->view_System, SIGNAL(triggered()), this, SLOT(onViewSystem()));
\r
69 connect(ui->cmd_Copy, SIGNAL(triggered()), this, SLOT(onCmdCopy()));
\r
70 connect(ui->cmd_Delete, SIGNAL(triggered()), this, SLOT(onCmdDelete()));
\r
71 connect(ui->cmd_Move, SIGNAL(triggered()), this, SLOT(onCmdMove()));
\r
72 connect(ui->cmd_NewFile, SIGNAL(triggered()), this, SLOT(onCmdNewFile()));
\r
73 connect(ui->cmd_NewFolder, SIGNAL(triggered()), this, SLOT(onCmdNewFolder()));
\r
74 connect(ui->cmd_Rename, SIGNAL(triggered()), this, SLOT(onCmdRename()));
\r
76 connect(ui->help_About, SIGNAL(triggered()), this, SLOT(onHelpAbout()));
\r
79 setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));
\r
81 setWindowIcon(QIcon(":/images/Gefu.png"));
\r
87 int sortBy, orderBy;
\r
90 dir = ui->LPanel->dir();
\r
91 dir->setSorting(QDir::Name); // 0
\r
93 sortBy = settings.value(IniKey_LeftSortBy, SortByName).toInt();
\r
95 case SortByDate: dir->setSorting(dir->sorting() | QDir::Time); break;
\r
96 case SortBySize: dir->setSorting(dir->sorting() | QDir::Size); break;
\r
97 case SortByType: dir->setSorting(dir->sorting() | QDir::Type); break;
\r
98 default: dir->setSorting(dir->sorting() | QDir::Name); break;
\r
101 // デフォルトだと文字列は昇順で、数値は降順…orz
\r
102 orderBy = settings.value(IniKey_LeftOrderBy, OrderByDesc).toInt();
\r
103 if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||
\r
104 ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))
\r
106 dir->setSorting(dir->sorting() | QDir::Reversed);
\r
109 switch (settings.value(IniKey_LeftPutDirs, PutDirsFirst).toInt()) {
\r
110 case PutDirsFirst: dir->setSorting(dir->sorting() | QDir::DirsFirst); break;
\r
111 case PutDirsLast: dir->setSorting(dir->sorting() | QDir::DirsLast); break;
\r
114 if (settings.value(IniKey_LeftIgnoreCase, true).toBool()) {
\r
115 dir->setSorting(dir->sorting() | QDir::IgnoreCase);
\r
119 dir = ui->RPanel->dir();
\r
120 dir->setSorting(QDir::Name); // 0
\r
122 sortBy = settings.value(IniKey_RightSortBy, SortByName).toInt();
\r
124 case SortByDate: dir->setSorting(dir->sorting() | QDir::Time); break;
\r
125 case SortBySize: dir->setSorting(dir->sorting() | QDir::Size); break;
\r
126 case SortByType: dir->setSorting(dir->sorting() | QDir::Type); break;
\r
127 default: dir->setSorting(dir->sorting() | QDir::Name); break;
\r
130 // デフォルトだと文字列は昇順で、数値は降順…orz
\r
131 orderBy = settings.value(IniKey_RightOrderBy, OrderByDesc).toInt();
\r
132 if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||
\r
133 ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))
\r
135 dir->setSorting(dir->sorting() | QDir::Reversed);
\r
138 switch (settings.value(IniKey_RightPutDirs, PutDirsFirst).toInt()) {
\r
139 case PutDirsFirst: dir->setSorting(dir->sorting() | QDir::DirsFirst); break;
\r
140 case PutDirsLast: dir->setSorting(dir->sorting() | QDir::DirsLast); break;
\r
143 if (settings.value(IniKey_RightIgnoreCase, true).toBool()) {
\r
144 dir->setSorting(dir->sorting() | QDir::IgnoreCase);
\r
149 path = settings.value(IniKey_LeftDir, QDir::homePath()).toString();
\r
150 ui->LPanel->setCurrentFolder(path);
\r
152 path = settings.value(IniKey_RightDir, QDir::homePath()).toString();
\r
153 ui->RPanel->setCurrentFolder(path);
\r
156 MainWindow::~MainWindow()
\r
158 QSettings settings;
\r
160 settings.setValue(IniKey_LeftDir, ui->LPanel->dir()->absolutePath());
\r
161 settings.setValue(IniKey_RightDir, ui->RPanel->dir()->absolutePath());
\r
166 void MainWindow::setStatusText(const QString &str)
\r
168 ui->statusBar->showMessage(str);
\r
171 FolderPanel* MainWindow::activePanel()
\r
173 if (ui->LPanel->fileTable()->hasFocus()) {
\r
176 if (ui->RPanel->fileTable()->hasFocus()) {
\r
183 FolderPanel* MainWindow::inactivePanel()
\r
185 FolderPanel *fp = activePanel();
\r
186 if (fp == ui->LPanel) {
\r
189 if (fp == ui->RPanel) {
\r
197 /// \brief MainWindow::onActionCommand
\r
201 void MainWindow::onActionCommand()
\r
203 FolderPanel *fp = activePanel();
\r
208 QString command = "";
\r
209 for (int n = 0; n < fp->fileTable()->rowCount(); n++) {
\r
210 if (fp->fileTable()->item(n, 0)->checkState() == Qt::Checked) {
\r
211 QString path = fp->fileTable()->item(n, 1)->text();
\r
212 path = fp->dir()->absoluteFilePath(path);
\r
213 path = QDir::cleanPath(path);
\r
214 path = QDir::toNativeSeparators(path);
\r
216 QFileInfo info(path);
\r
217 if (info.isExecutable()) {
\r
218 command = "\"" + path + "\" " + command;
\r
221 command += " \"" + path + "\"";
\r
226 if (command.isEmpty()) {
\r
227 int row = fp->fileTable()->currentRow();
\r
228 QString path = fp->fileTable()->item(row, 1)->text();
\r
229 path = fp->dir()->absoluteFilePath(path);
\r
230 path = QDir::cleanPath(path);
\r
231 path = QDir::toNativeSeparators(path);
\r
233 command = "\"" + path + "\"";
\r
236 QInputDialog dlg(this);
\r
237 dlg.setInputMode(QInputDialog::TextInput);
\r
238 dlg.setLabelText(tr("コマンドを入力:"));
\r
239 dlg.setWindowTitle(tr("コマンドを実行"));
\r
240 dlg.setTextValue(command);
\r
241 dlg.resize(500, 100);
\r
242 int ret = dlg.exec();
\r
243 command = dlg.textValue();
\r
244 if (ret == QDialog::Accepted && !command.isEmpty()) {
\r
245 QProcess process(this);
\r
246 process.setWorkingDirectory(fp->dir()->absolutePath());
\r
247 if (!process.startDetached(command)) {
\r
248 QMessageBox::critical(
\r
251 tr("コマンドの実行に失敗しました。<br/>") + command);
\r
257 /// \brief MainWindow::onActionExec
\r
259 /// アプリケーションで開きます(Shift + Enter)
\r
261 void MainWindow::onActionExec()
\r
263 FolderPanel *fp = activePanel();
\r
268 QStringList list = selectedItems(fp);
\r
269 foreach (const QString &path, list) {
\r
270 QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(path)));
\r
275 /// \brief MainWindow::onActionOpen
\r
277 /// フォルダを開きます(Enter)
\r
279 void MainWindow::onActionOpen()
\r
281 FolderPanel *fp = activePanel();
\r
286 int row = fp->fileTable()->currentRow();
\r
287 QString path = fp->fileTable()->item(row, 1)->text();
\r
288 path = fp->dir()->absoluteFilePath(path);
\r
289 QFileInfo info(path);
\r
291 if (info.isDir()) {
\r
292 fp->setCurrentFolder(path);
\r
297 /// \brief MainWindow::onActionQuit
\r
299 /// アプリケーションを終了します(Q)
\r
301 void MainWindow::onActionQuit()
\r
307 /// \brief MainWindow::onActionSetting
\r
309 /// 環境設定ダイアログを表示します(Z)
\r
311 void MainWindow::onActionSetting()
\r
313 QMessageBox::information(this, tr("情報"), tr("環境設定機能は未実装です。"));
\r
317 /// \brief MainWindow::on_mark_All_triggered
\r
319 /// すべてマークします(Shift + A)
\r
321 void MainWindow::onMarkAll()
\r
323 FolderPanel *fp = activePanel();
\r
329 if (fp->fileTable()->item(row, 1)->text() == "..") {
\r
334 int curRow = fp->fileTable()->currentRow();
\r
335 int rowCount = fp->fileTable()->rowCount();
\r
336 for (; row < rowCount; row++) {
\r
337 fp->fileTable()->item(row, 0)->setCheckState(Qt::Checked);
\r
339 fp->fileTable()->setCurrentIndex(
\r
340 fp->fileTable()->model()->index(curRow, 1));
\r
345 /// \brief MainWindow::onMarkAllFiles
\r
347 /// すべての「ファイル」をマークします(A)
\r
349 void MainWindow::onMarkAllFiles()
\r
351 FolderPanel *fp = activePanel();
\r
357 if (fp->fileTable()->item(row, 1)->text() == "..") {
\r
362 int curRow = fp->fileTable()->currentRow();
\r
363 int rowCount = fp->fileTable()->rowCount();
\r
364 for (; row < rowCount; row++) {
\r
365 QString path = fp->fileTable()->item(row, 1)->text();
\r
366 path = fp->dir()->absoluteFilePath(path);
\r
368 QFileInfo info(path);
\r
369 if (info.isDir()) {
\r
370 fp->fileTable()->item(row, 0)->setCheckState(Qt::Unchecked);
\r
373 fp->fileTable()->item(row, 0)->setCheckState(Qt::Checked);
\r
376 fp->fileTable()->setCurrentIndex(
\r
377 fp->fileTable()->model()->index(curRow, 1));
\r
382 /// \brief MainWindow::onMarkAllOff
\r
384 /// すべてのマークを解除します(U)
\r
386 void MainWindow::onMarkAllOff()
\r
388 FolderPanel *fp = activePanel();
\r
394 if (fp->fileTable()->item(row, 1)->text() == "..") {
\r
399 int curRow = fp->fileTable()->currentRow();
\r
400 int rowCount = fp->fileTable()->rowCount();
\r
401 for (; row < rowCount; row++) {
\r
402 fp->fileTable()->item(row, 0)->setCheckState(Qt::Unchecked);
\r
404 fp->fileTable()->setCurrentIndex(
\r
405 fp->fileTable()->model()->index(curRow, 1));
\r
410 /// \brief MainWindow::onMarkInvert
\r
414 void MainWindow::onMarkInvert()
\r
416 FolderPanel *fp = activePanel();
\r
422 if (fp->fileTable()->item(row, 1)->text() == "..") {
\r
427 int curRow = fp->fileTable()->currentRow();
\r
428 int rowCount = fp->fileTable()->rowCount();
\r
429 for (; row < rowCount; row++) {
\r
430 QTableWidgetItem *item = fp->fileTable()->item(row, 0);
\r
431 if (item->checkState() == Qt::Checked) {
\r
432 item->setCheckState(Qt::Unchecked);
\r
435 item->setCheckState(Qt::Checked);
\r
438 fp->fileTable()->setCurrentIndex(
\r
439 fp->fileTable()->model()->index(curRow, 1));
\r
444 /// \brief MainWindow::onMarkToggle
\r
446 /// マークを設定または解除します(Space)
\r
448 void MainWindow::onMarkToggle()
\r
450 FolderPanel *fp = activePanel();
\r
455 int row = fp->fileTable()->currentRow();
\r
456 QTableWidgetItem *item = fp->fileTable()->item(row, 0);
\r
457 if (fp->fileTable()->item(row, 1)->text() != "..") {
\r
458 if (item->checkState() == Qt::Checked) {
\r
459 item->setCheckState(Qt::Unchecked);
\r
462 item->setCheckState(Qt::Checked);
\r
465 // 最終行でなければ、次のアイテムに移動する
\r
466 if (row < fp->fileTable()->rowCount() - 1) {
\r
467 QModelIndex nextIndex = fp->fileTable()->model()->index(row + 1, 1);
\r
468 fp->fileTable()->setCurrentIndex(nextIndex);
\r
473 /// \brief MainWindow::onMoveCursorDown
\r
475 /// カーソルを下に移動します(J)
\r
477 void MainWindow::onMoveCursorDown()
\r
479 FolderPanel *fp = activePanel();
\r
484 int row = fp->fileTable()->currentRow();
\r
485 if (row < fp->fileTable()->rowCount() - 1) {
\r
486 QModelIndex nextIndex = fp->fileTable()->model()->index(row + 1, 1);
\r
487 fp->fileTable()->setCurrentIndex(nextIndex);
\r
492 /// \brief MainWindow::onMoveCursorUp
\r
494 /// カーソルを上に移動します(K)
\r
496 void MainWindow::onMoveCursorUp()
\r
498 FolderPanel *fp = activePanel();
\r
503 int row = fp->fileTable()->currentRow();
\r
505 QModelIndex nextIndex = fp->fileTable()->model()->index(row - 1, 1);
\r
506 fp->fileTable()->setCurrentIndex(nextIndex);
\r
511 /// \brief MainWindow::onMoveCursorBegin
\r
513 /// カーソルを先頭に移動します(G)
\r
515 void MainWindow::onMoveCursorBegin()
\r
517 FolderPanel *fp = activePanel();
\r
522 QModelIndex nextIndex = fp->fileTable()->model()->index(0, 1);
\r
523 fp->fileTable()->setCurrentIndex(nextIndex);
\r
527 /// \brief MainWindow::onMoveCursorEnd
\r
529 /// カーソルを末尾に移動します(Shift + G)
\r
530 void MainWindow::onMoveCursorEnd()
\r
532 FolderPanel *fp = activePanel();
\r
537 int row = fp->fileTable()->rowCount() - 1;
\r
538 QModelIndex nextIndex = fp->fileTable()->model()->index(row, 1);
\r
539 fp->fileTable()->setCurrentIndex(nextIndex);
\r
543 /// \brief MainWindow::onMoveBack
\r
545 /// 前の履歴に戻ります(Alt + ←)
\r
547 void MainWindow::onMoveBack()
\r
549 QMessageBox::information(this, tr("情報"), tr("履歴機能は未実装です。"));
\r
553 /// \brief MainWindow::onMoveForward
\r
555 /// 次の履歴に進みます(Alt + →)
\r
557 void MainWindow::onMoveForward()
\r
559 QMessageBox::information(this, tr("情報"), tr("履歴機能は未実装です。"));
\r
564 /// \brief MainWindow::onMoveHome
\r
566 /// ホームフォルダに移動します(H)
\r
568 void MainWindow::onMoveHome()
\r
570 FolderPanel *fp = activePanel();
\r
575 fp->setCurrentFolder(QDir::homePath());
\r
579 /// \brief MainWindow::onMoveJump
\r
581 /// フォルダを選択して移動します(Shift + J)
\r
582 void MainWindow::onMoveJump()
\r
584 FolderPanel *fp = activePanel();
\r
589 QString path = QFileDialog::getExistingDirectory(
\r
592 fp->dir()->absolutePath());
\r
593 if (!path.isEmpty()) {
\r
594 fp->setCurrentFolder(path);
\r
599 /// \brief MainWindow::onMoveOther
\r
601 /// キーボードフォーカスを他方のパネルに移動します(TAB)
\r
603 void MainWindow::onMoveOther()
\r
605 FolderPanel *fp = this->inactivePanel();
\r
607 fp->fileTable()->setFocus();
\r
612 /// \brief MainWindow::onMoveParent
\r
614 /// 親フォルダに移動します(Backspace)
\r
616 void MainWindow::onMoveParent()
\r
618 FolderPanel *fp = activePanel();
\r
623 if (!fp->dir()->isRoot()) {
\r
624 QString path = fp->dir()->absoluteFilePath("..");
\r
625 fp->setCurrentFolder(path);
\r
630 /// \brief MainWindow::onMoveRoot
\r
632 /// ルートフォルダに移動します()
\r
633 void MainWindow::onMoveRoot()
\r
635 FolderPanel *fp = activePanel();
\r
640 if (!fp->dir()->isRoot()) {
\r
641 fp->setCurrentFolder(QDir::rootPath());
\r
646 /// \brief MainWindow::onViewFromOther
\r
648 /// 隣のパネルと同じフォルダを表示します(O)
\r
650 void MainWindow::onViewFromOther()
\r
652 FolderPanel *fp1 = activePanel();
\r
653 FolderPanel *fp2 = inactivePanel();
\r
654 if (fp1 == NULL || fp2 == NULL) {
\r
658 fp1->setCurrentFolder(fp2->dir()->absolutePath());
\r
662 /// \brief MainWindow::onViewToOther
\r
664 /// 隣のパネルに同じフォルダを表示します(Shift + O)
\r
666 void MainWindow::onViewToOther()
\r
668 FolderPanel *fp1 = activePanel();
\r
669 FolderPanel *fp2 = inactivePanel();
\r
670 if (fp1 == NULL || fp2 == NULL) {
\r
674 fp2->setCurrentFolder(fp1->dir()->absolutePath());
\r
678 /// \brief MainWindow::onViewHidden
\r
680 /// 隠しファイルの表示/非表示を切り替えます(Shift + H)
\r
682 void MainWindow::onViewHidden()
\r
684 QSettings settings;
\r
685 bool checked = !settings.value(IniKey_ShowHidden, false).toBool();
\r
686 settings.setValue(IniKey_ShowHidden, checked);
\r
687 ui->view_Hidden->setChecked(checked);
\r
690 ui->LPanel->dir()->setFilter(ui->LPanel->dir()->filter() | QDir::Hidden);
\r
691 ui->RPanel->dir()->setFilter(ui->RPanel->dir()->filter() | QDir::Hidden);
\r
694 ui->LPanel->dir()->setFilter(ui->LPanel->dir()->filter() ^ QDir::Hidden);
\r
695 ui->RPanel->dir()->setFilter(ui->RPanel->dir()->filter() ^ QDir::Hidden);
\r
698 ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());
\r
699 ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());
\r
702 void MainWindow::onViewSort()
\r
704 FolderPanel *fp = activePanel();
\r
710 SortDialog dlg(this);
\r
711 if (fp == ui->LPanel) {
\r
712 iniSec = IniSec_Left;
\r
715 iniSec = IniSec_Right;
\r
718 dlg.setRightOrLeft(iniSec);
\r
719 if (dlg.exec() == QDialog::Accepted) {
\r
720 QSettings settings;
\r
721 QDir *dir = fp->dir();
\r
722 dir->setSorting(QDir::Name); // 0
\r
724 int sortBy = settings.value(iniSec + slash + IniKey_SortBy, 0).toInt();
\r
726 case SortByDate: dir->setSorting(dir->sorting() | QDir::Time); break;
\r
727 case SortBySize: dir->setSorting(dir->sorting() | QDir::Size); break;
\r
728 case SortByType: dir->setSorting(dir->sorting() | QDir::Type); break;
\r
729 default: dir->setSorting(dir->sorting() | QDir::Name); break;
\r
732 // デフォルトだと文字列は昇順で、数値は降順…orz
\r
733 int orderBy = settings.value(iniSec + slash + IniKey_OrderBy, 0).toInt();
\r
734 if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||
\r
735 ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))
\r
737 dir->setSorting(dir->sorting() | QDir::Reversed);
\r
740 switch (settings.value(iniSec + slash + IniKey_PutDirs, 0).toInt()) {
\r
741 case PutDirsFirst: dir->setSorting(dir->sorting() | QDir::DirsFirst); break;
\r
742 case PutDirsLast: dir->setSorting(dir->sorting() | QDir::DirsLast); break;
\r
745 if (settings.value(iniSec + slash + IniKey_IgnoreCase, true).toBool()) {
\r
746 dir->setSorting(dir->sorting() | QDir::IgnoreCase);
\r
749 fp->setCurrentFolder(fp->dir()->absolutePath());
\r
754 /// \brief MainWindow::onViewSwap
\r
756 /// パネルの表示内容を交換します(W)
\r
758 void MainWindow::onViewSwap()
\r
760 FolderPanel *fp1 = activePanel();
\r
761 FolderPanel *fp2 = inactivePanel();
\r
762 if (fp1 == NULL || fp2 == NULL) {
\r
766 QString path1 = fp1->dir()->absolutePath();
\r
767 QString path2 = fp2->dir()->absolutePath();
\r
769 fp1->setCurrentFolder(path2);
\r
770 fp2->setCurrentFolder(path1);
\r
774 /// \brief MainWindow::onViewSystem
\r
776 /// システムファイルの表示/非表示を切り替えます(Shift + H)
\r
778 void MainWindow::onViewSystem()
\r
780 QSettings settings;
\r
781 bool checked = !settings.value(IniKey_ShowSystem, false).toBool();
\r
782 settings.setValue(IniKey_ShowSystem, checked);
\r
783 ui->view_System->setChecked(checked);
\r
786 dirs[0] = ui->LPanel->dir();
\r
787 dirs[1] = ui->RPanel->dir();
\r
788 for (int n = 0; n < 2; n++) {
\r
790 dirs[n]->setFilter(dirs[n]->filter() | QDir::System);
\r
793 dirs[n]->setFilter(dirs[n]->filter() ^ QDir::System);
\r
797 ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());
\r
798 ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());
\r
802 /// \brief MainWindow::onCmdMove
\r
804 /// ファイルを移動します(Ctrl + M)
\r
806 void MainWindow::onCmdMove()
\r
808 FolderPanel *fp = activePanel();
\r
813 QStringList list = selectedItems(fp);
\r
814 if (list.isEmpty()) {
\r
818 CopyMoveWorker *worker = new CopyMoveWorker();
\r
819 connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),
\r
820 this, SLOT(onAskOverWrite(bool*,int*,int*,QString*,QString,QString)));
\r
821 worker->setCopyList(&list);
\r
822 worker->setTargetDir(inactivePanel()->dir()->absolutePath());
\r
823 worker->setMoveMode(true);
\r
825 OperationDialog opDlg(this);
\r
826 opDlg.setWindowTitle(tr("移動"));
\r
827 opDlg.setWorker(worker);
\r
829 ui->LPanel->UninstallWatcher();
\r
830 ui->RPanel->UninstallWatcher();
\r
832 ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());
\r
833 ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());
\r
838 /// \brief MainWindow::onCmdCopy
\r
840 /// ファイルをコピーします(Ctrl + C)
\r
842 void MainWindow::onCmdCopy()
\r
844 FolderPanel *fp = activePanel();
\r
849 QStringList list = selectedItems(fp);
\r
850 if (list.isEmpty()) {
\r
854 CopyMoveWorker *worker = new CopyMoveWorker();
\r
855 connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),
\r
856 this, SLOT(onAskOverWrite(bool*,int*,int*,QString*,QString,QString)));
\r
857 worker->setCopyList(&list);
\r
858 worker->setTargetDir(inactivePanel()->dir()->absolutePath());
\r
859 worker->setMoveMode(false);
\r
861 OperationDialog opDlg(this);
\r
862 opDlg.setWindowTitle(tr("コピー"));
\r
863 opDlg.setWorker(worker);
\r
865 ui->LPanel->UninstallWatcher();
\r
866 ui->RPanel->UninstallWatcher();
\r
868 ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());
\r
869 ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());
\r
874 /// \brief MainWindow::onAskOverWrite
\r
876 /// \param prevCopyMethod
\r
877 /// \param copyMethod
\r
882 /// 上書き処理の方法をユーザに問い合わせます
\r
884 void MainWindow::onAskOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod,
\r
885 QString *alias, const QString srcPath,
\r
886 const QString tgtPath)
\r
888 OverWriteDialog dlg;
\r
889 dlg.setCopyMethod(*prevCopyMethod);
\r
890 dlg.setSameMethodChecked(*copyMethod != OverWriteDialog::Undefined);
\r
891 dlg.setFileInfo(srcPath, tgtPath);
\r
892 if (dlg.exec() == QDialog::Rejected) {
\r
896 *prevCopyMethod = dlg.copyMethod();
\r
897 if (dlg.isSameMethodChecked()) {
\r
898 *copyMethod = *prevCopyMethod;
\r
900 *alias = dlg.alias();
\r
903 CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());
\r
904 worker->endAsking();
\r
908 /// \brief MainWindow::onCmdDelete
\r
912 void MainWindow::onCmdDelete()
\r
914 FolderPanel *fp = activePanel();
\r
919 QStringList list = selectedItems(fp);
\r
920 if (list.isEmpty()) {
\r
925 if (list.size() == 1) {
\r
926 msg = QFileInfo(list.at(0)).fileName();
\r
929 msg = tr("%1個のアイテム").arg(list.size());
\r
931 int ret = QMessageBox::question(
\r
934 msg + tr("を削除します<br/>よろしいですか?"));
\r
935 if (ret == QMessageBox::Yes) {
\r
936 DeleteWorker *worker = new DeleteWorker();
\r
937 worker->setDeleteList(&list);
\r
939 OperationDialog opDlg(this);
\r
940 opDlg.setWindowTitle(tr("削除"));
\r
941 opDlg.setWorker(worker);
\r
943 ui->LPanel->UninstallWatcher();
\r
944 ui->RPanel->UninstallWatcher();
\r
946 ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());
\r
947 ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());
\r
952 /// \brief MainWindow::onCmdNewFile
\r
956 void MainWindow::onCmdNewFile()
\r
958 FolderPanel *fp = activePanel();
\r
964 QString name = QInputDialog::getText(
\r
971 if (bOk && !name.isEmpty()) {
\r
972 QFile file(fp->dir()->absoluteFilePath(name));
\r
973 if (!file.open(QIODevice::WriteOnly)) {
\r
974 QMessageBox::critical(this,
\r
976 tr("ファイルの作成に失敗しました。"));
\r
985 /// \brief MainWindow::onCmdNewFolder
\r
989 void MainWindow::onCmdNewFolder()
\r
991 FolderPanel *fp = activePanel();
\r
997 QString name = QInputDialog::getText(
\r
1001 QLineEdit::Normal,
\r
1004 if (bOk && !name.isEmpty()) {
\r
1005 if (!fp->dir()->mkpath(name)) {
\r
1006 QMessageBox::critical(this,
\r
1008 tr("フォルダの作成に失敗しました。"));
\r
1014 /// \brief MainWindow::onCmdRename
\r
1018 void MainWindow::onCmdRename()
\r
1020 FolderPanel *fp = activePanel();
\r
1025 QStringList list = selectedItems(fp);
\r
1026 if (list.isEmpty()) {
\r
1030 IRenameDialog *dlg;
\r
1031 if (list.size() == 1) {
\r
1032 dlg = new RenameSingleDialog(this);
\r
1035 dlg = new RenameMultiDialog(this);
\r
1037 dlg->setWorkingDirectory(fp->dir()->absolutePath());
\r
1038 dlg->setNames(list);
\r
1039 int dlgResult = dlg->exec();
\r
1040 if (dlgResult == QDialog::Accepted && !dlg->renameMap().isEmpty()) {
\r
1041 RenameWorker *worker = new RenameWorker();
\r
1042 worker->setRenameMap(&dlg->renameMap());
\r
1044 OperationDialog opDlg(this);
\r
1045 opDlg.setWindowTitle(tr("名前を変更"));
\r
1046 opDlg.setWorker(worker);
\r
1048 ui->LPanel->UninstallWatcher();
\r
1049 ui->RPanel->UninstallWatcher();
\r
1051 ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());
\r
1052 ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());
\r
1057 /// \brief MainWindow::onHelpAbout
\r
1059 /// アプリケーションの概要を表示します(?)
\r
1061 void MainWindow::onHelpAbout()
\r
1063 QMessageBox::about(
\r
1066 tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +
\r
1067 tr("<center>Gefu is Experimental File Utility.<br/>"
\r
1068 "(げふぅは実験的なファイルユーティリティです)</center>"
\r
1069 "<p>Copyright 2014 @miyabi_satoh All rights reserved.</p>"));
\r
1073 /// \brief MainWindow::selectedItems
\r
1074 /// \param fp フォルダパネルへのポインタ
\r
1075 /// \return 選択アイテムのフルパスのリスト
\r
1077 /// 選択アイテムのフルパスのリストを取得します
\r
1079 QStringList MainWindow::selectedItems(FolderPanel *fp)
\r
1082 for (int n = 0; n < fp->fileTable()->rowCount(); n++) {
\r
1083 if (fp->fileTable()->item(n, 0)->checkState() == Qt::Checked) {
\r
1084 list << fp->dir()->absoluteFilePath(fp->fileTable()->item(n, 1)->text());
\r
1088 if (list.isEmpty()) {
\r
1089 int row = fp->fileTable()->currentRow();
\r
1090 QString name = fp->fileTable()->item(row, 1)->text();
\r
1091 if (name != "..") {
\r
1092 list << fp->dir()->absoluteFilePath(name);
\r
1100 /// \brief getMainWnd
\r
1101 /// \return メインウィンドウのポインタ
\r
1103 /// メインウィンドウを取得します
\r
1105 MainWindow* getMainWnd()
\r
1107 foreach (QWidget *w, qApp->topLevelWidgets()) {
\r
1108 if (w->objectName() == "MainWindow") {
\r
1109 return static_cast<MainWindow*>(w);
\r
1112 qDebug() << "MainWindow not found !?";
\r