OSDN Git Service

移動を実装、キーイベント処理を変更(修正)。
[gefu/Gefu.git] / mainwindow.cpp
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 "ui_mainwindow.h"\r
10 #include <QFileSystemModel>\r
11 #include <QDebug>\r
12 #include <QKeyEvent>\r
13 #include <QDesktopServices>\r
14 #include <QSettings>\r
15 #include <QFileDialog>\r
16 #include <QMessageBox>\r
17 #include <QProcess>\r
18 #include <QThread>\r
19 #include <QInputDialog>\r
20 \r
21 MainWindow::MainWindow(QWidget *parent) :\r
22     QMainWindow(parent),\r
23     ui(new Ui::MainWindow)\r
24 {\r
25     ui->setupUi(this);\r
26 \r
27     QSettings settings;\r
28     bool checked = settings.value("Common/ShowHidden", false).toBool();\r
29     ui->view_Hidden->setChecked(checked);\r
30 \r
31     // メニューのシグナル/スロットを設定する\r
32     connect(ui->action_Command, SIGNAL(triggered()), this, SLOT(onActionCommand()));\r
33     connect(ui->action_Exec, SIGNAL(triggered()), this, SLOT(onActionExec()));\r
34     connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(onActionOpen()));\r
35     connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(onActionQuit()));\r
36     connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(onActionSetting()));\r
37 \r
38     connect(ui->mark_All, SIGNAL(triggered()), this, SLOT(onMarkAll()));\r
39     connect(ui->mark_AllFiles, SIGNAL(triggered()), this, SLOT(onMarkAllFiles()));\r
40     connect(ui->mark_AllOff, SIGNAL(triggered()), this, SLOT(onMarkAllOff()));\r
41     connect(ui->mark_Invert, SIGNAL(triggered()), this, SLOT(onMarkInvert()));\r
42     connect(ui->mark_Toggle, SIGNAL(triggered()), this, SLOT(onMarkToggle()));\r
43 \r
44     connect(ui->move_Down, SIGNAL(triggered()), this, SLOT(onMoveCursorDown()));\r
45     connect(ui->move_Up, SIGNAL(triggered()), this, SLOT(onMoveCursorUp()));\r
46     connect(ui->move_Begin, SIGNAL(triggered()), this, SLOT(onMoveCursorBegin()));\r
47     connect(ui->move_End, SIGNAL(triggered()), this, SLOT(onMoveCursorEnd()));\r
48     connect(ui->move_Back, SIGNAL(triggered()), this, SLOT(onMoveBack()));\r
49     connect(ui->move_Forward, SIGNAL(triggered()), this, SLOT(onMoveForward()));\r
50     connect(ui->move_Home, SIGNAL(triggered()), this, SLOT(onMoveHome()));\r
51     connect(ui->move_Jump, SIGNAL(triggered()), this, SLOT(onMoveJump()));\r
52     connect(ui->move_Parent, SIGNAL(triggered()), this, SLOT(onMoveParent()));\r
53     connect(ui->move_Root, SIGNAL(triggered()), this, SLOT(onMoveRoot()));\r
54 \r
55     connect(ui->view_FromOther, SIGNAL(triggered()), this, SLOT(onViewFromOther()));\r
56     connect(ui->view_ToOther, SIGNAL(triggered()), this, SLOT(onViewToOther()));\r
57     connect(ui->view_Hidden, SIGNAL(triggered()), this, SLOT(onViewHidden()));\r
58     connect(ui->view_Swap, SIGNAL(triggered()), this, SLOT(onViewSwap()));\r
59 \r
60     connect(ui->cmd_Copy, SIGNAL(triggered()), this, SLOT(onCmdCopy()));\r
61     connect(ui->cmd_Delete, SIGNAL(triggered()), this, SLOT(onCmdDelete()));\r
62     connect(ui->cmd_Move, SIGNAL(triggered()), this, SLOT(onCmdMove()));\r
63     connect(ui->cmd_NewFile, SIGNAL(triggered()), this, SLOT(onCmdNewFile()));\r
64     connect(ui->cmd_NewFolder, SIGNAL(triggered()), this, SLOT(onCmdNewFolder()));\r
65     connect(ui->cmd_Rename, SIGNAL(triggered()), this, SLOT(onCmdRename()));\r
66 \r
67     connect(ui->help_About, SIGNAL(triggered()), this, SLOT(onHelpAbout()));\r
68 \r
69     // ウィンドウタイトルを設定する\r
70     setWindowTitle(tr("げふぅ v0.00"));\r
71     // ウィンドウアイコンを設定する\r
72     setWindowIcon(QIcon(":/images/Gefu.png"));\r
73 \r
74     // ウィンドウ初期サイズを設定する\r
75     resize(800, 600);\r
76 \r
77     QString path;\r
78 \r
79     path = settings.value("Left/dir", QDir::homePath()).toString();\r
80     ui->folderPanel_L->setCurrentFolder(path);\r
81 \r
82     path = settings.value("Right/dir", QDir::homePath()).toString();\r
83     ui->folderPanel_R->setCurrentFolder(path);\r
84 }\r
85 \r
86 MainWindow::~MainWindow()\r
87 {\r
88     QSettings settings;\r
89 \r
90     settings.setValue("Left/dir", ui->folderPanel_L->dir()->absolutePath());\r
91     settings.setValue("Right/dir", ui->folderPanel_R->dir()->absolutePath());\r
92 \r
93     delete ui;\r
94 }\r
95 \r
96 void MainWindow::setStatusText(const QString &str)\r
97 {\r
98     ui->statusBar->showMessage(str);\r
99 }\r
100 \r
101 FolderPanel* MainWindow::activePanel()\r
102 {\r
103     if (ui->folderPanel_L->fileTable()->hasFocus()) {\r
104         return ui->folderPanel_L;\r
105     }\r
106     if (ui->folderPanel_R->fileTable()->hasFocus()) {\r
107         return ui->folderPanel_R;\r
108     }\r
109 \r
110     return NULL;\r
111 }\r
112 \r
113 FolderPanel* MainWindow::inactivePanel()\r
114 {\r
115     FolderPanel *fp = activePanel();\r
116     if (fp == ui->folderPanel_L) {\r
117         return ui->folderPanel_R;\r
118     }\r
119     if (fp == ui->folderPanel_R) {\r
120         return ui->folderPanel_L;\r
121     }\r
122 \r
123     return NULL;\r
124 }\r
125 \r
126 ///\r
127 /// \brief MainWindow::onActionCommand\r
128 ///\r
129 /// コマンドを実行します(X)\r
130 ///\r
131 void MainWindow::onActionCommand()\r
132 {\r
133     FolderPanel *fp = activePanel();\r
134     if (!fp) {\r
135         return;\r
136     }\r
137 \r
138     QString command = "";\r
139     for (int n = 0; n < fp->fileTable()->rowCount(); n++) {\r
140         if (fp->fileTable()->item(n, 0)->checkState() == Qt::Checked) {\r
141             QString path = fp->fileTable()->item(n, 1)->text();\r
142             path = fp->dir()->absoluteFilePath(path);\r
143             path = QDir::cleanPath(path);\r
144             path = QDir::toNativeSeparators(path);\r
145 \r
146             QFileInfo info(path);\r
147             if (info.isExecutable()) {\r
148                 command = "\"" + path + "\" " + command;\r
149             }\r
150             else {\r
151                 command += " \"" + path + "\"";\r
152             }\r
153         }\r
154     }\r
155 \r
156     if (command.isEmpty()) {\r
157 //        int row = fp->fileTable()->currentIndex().row();\r
158         int row = fp->fileTable()->currentRow();\r
159         QString path = fp->fileTable()->item(row, 1)->text();\r
160         path = fp->dir()->absoluteFilePath(path);\r
161         path = QDir::cleanPath(path);\r
162         path = QDir::toNativeSeparators(path);\r
163 \r
164         command = "\"" + path + "\"";\r
165     }\r
166 \r
167     QInputDialog dlg(this);\r
168     dlg.setInputMode(QInputDialog::TextInput);\r
169     dlg.setLabelText(tr("コマンドを入力:"));\r
170     dlg.setWindowTitle(tr("コマンドを実行"));\r
171     dlg.setTextValue(command);\r
172     dlg.resize(500, 100);\r
173     int ret = dlg.exec();\r
174     command = dlg.textValue();\r
175     if (ret == QDialog::Accepted && !command.isEmpty()) {\r
176         QProcess process(this);\r
177         process.setWorkingDirectory(fp->dir()->absolutePath());\r
178         if (!process.startDetached(command)) {\r
179             QMessageBox::critical(\r
180                         this,\r
181                         tr("エラー"),\r
182                         tr("コマンドの実行に失敗しました。<br/>") + command);\r
183         }\r
184     }\r
185 }\r
186 \r
187 ///\r
188 /// \brief MainWindow::onActionExec\r
189 ///\r
190 /// アプリケーションで開きます(Shift + Enter)\r
191 ///\r
192 void MainWindow::onActionExec()\r
193 {\r
194     FolderPanel *fp = activePanel();\r
195     if (!fp) {\r
196         return;\r
197     }\r
198 \r
199     int count = 0;\r
200     for (int n = 0; n < fp->fileTable()->rowCount(); n++) {\r
201         if (fp->fileTable()->item(n, 0)->checkState() == Qt::Checked) {\r
202             QString path = fp->fileTable()->item(n, 1)->text();\r
203             path = fp->dir()->absoluteFilePath(path);\r
204             path = QDir::toNativeSeparators(path);\r
205             QDesktopServices::openUrl(QUrl("file:///" + path));\r
206             count++;\r
207         }\r
208     }\r
209 \r
210     if (count == 0) {\r
211 //        int row = fp->fileTable()->currentIndex().row();\r
212         int row = fp->fileTable()->currentRow();\r
213         QString path = fp->fileTable()->item(row, 1)->text();\r
214         path = fp->dir()->absoluteFilePath(path);\r
215         path = QDir::toNativeSeparators(path);\r
216         QDesktopServices::openUrl(QUrl("file:///" + path));\r
217     }\r
218 }\r
219 \r
220 ///\r
221 /// \brief MainWindow::onActionOpen\r
222 ///\r
223 /// フォルダを開きます(Enter)\r
224 ///\r
225 void MainWindow::onActionOpen()\r
226 {\r
227     FolderPanel *fp = activePanel();\r
228     if (!fp) {\r
229         return;\r
230     }\r
231 \r
232 //    int row = fp->fileTable()->currentIndex().row();\r
233     int row = fp->fileTable()->currentRow();\r
234     QString path = fp->fileTable()->item(row, 1)->text();\r
235     path = fp->dir()->absoluteFilePath(path);\r
236     QFileInfo info(path);\r
237 \r
238     if (info.isDir()) {\r
239         fp->setCurrentFolder(path);\r
240     }\r
241 }\r
242 \r
243 ///\r
244 /// \brief MainWindow::onActionQuit\r
245 ///\r
246 /// アプリケーションを終了します(Q)\r
247 ///\r
248 void MainWindow::onActionQuit()\r
249 {\r
250     qApp->quit();\r
251 }\r
252 \r
253 ///\r
254 /// \brief MainWindow::onActionSetting\r
255 ///\r
256 /// 環境設定ダイアログを表示します(Z)\r
257 ///\r
258 void MainWindow::onActionSetting()\r
259 {\r
260     QMessageBox::information(this, tr("情報"), tr("環境設定機能は未実装です。"));\r
261 }\r
262 \r
263 ///\r
264 /// \brief MainWindow::on_mark_All_triggered\r
265 ///\r
266 /// すべてマークします(Shift + A)\r
267 ///\r
268 void MainWindow::onMarkAll()\r
269 {\r
270     FolderPanel *fp = activePanel();\r
271     if (fp == NULL) {\r
272         return;\r
273     }\r
274 \r
275     int row = 0;\r
276     if (fp->fileTable()->item(row, 1)->text() == "..") {\r
277         row++;\r
278     }\r
279 \r
280     for (; row < fp->fileTable()->rowCount(); row++) {\r
281         fp->fileTable()->item(row, 0)->setCheckState(Qt::Checked);\r
282     }\r
283 }\r
284 \r
285 ///\r
286 /// \brief MainWindow::onMarkAllFiles\r
287 ///\r
288 /// すべての「ファイル」をマークします(A)\r
289 ///\r
290 void MainWindow::onMarkAllFiles()\r
291 {\r
292     FolderPanel *fp = activePanel();\r
293     if (fp == NULL) {\r
294         return;\r
295     }\r
296 \r
297     int row = 0;\r
298     if (fp->fileTable()->item(row, 1)->text() == "..") {\r
299         row++;\r
300     }\r
301 \r
302     for (; row < fp->fileTable()->rowCount(); row++) {\r
303         QString path = fp->fileTable()->item(row, 1)->text();\r
304         path = fp->dir()->absoluteFilePath(path);\r
305 \r
306         QFileInfo info(path);\r
307         if (info.isDir()) {\r
308             fp->fileTable()->item(row, 0)->setCheckState(Qt::Unchecked);\r
309         }\r
310         else {\r
311            fp->fileTable()->item(row, 0)->setCheckState(Qt::Checked);\r
312         }\r
313     }\r
314 }\r
315 \r
316 ///\r
317 /// \brief MainWindow::onMarkAllOff\r
318 ///\r
319 /// すべてのマークを解除します(U)\r
320 ///\r
321 void MainWindow::onMarkAllOff()\r
322 {\r
323     FolderPanel *fp = activePanel();\r
324     if (fp == NULL) {\r
325         return;\r
326     }\r
327 \r
328     int row = 0;\r
329     if (fp->fileTable()->item(row, 1)->text() == "..") {\r
330         row++;\r
331     }\r
332 \r
333     for (; row < fp->fileTable()->rowCount(); row++) {\r
334         fp->fileTable()->item(row, 0)->setCheckState(Qt::Unchecked);\r
335     }\r
336 }\r
337 \r
338 ///\r
339 /// \brief MainWindow::onMarkInvert\r
340 ///\r
341 /// マークを反転します(I)\r
342 ///\r
343 void MainWindow::onMarkInvert()\r
344 {\r
345     FolderPanel *fp = activePanel();\r
346     if (fp == NULL) {\r
347         return;\r
348     }\r
349 \r
350     int row = 0;\r
351     if (fp->fileTable()->item(row, 1)->text() == "..") {\r
352         row++;\r
353     }\r
354 \r
355     for (; row < fp->fileTable()->rowCount(); row++) {\r
356         QTableWidgetItem *item = fp->fileTable()->item(row, 0);\r
357         if (item->checkState() == Qt::Checked) {\r
358             item->setCheckState(Qt::Unchecked);\r
359         }\r
360         else {\r
361             item->setCheckState(Qt::Checked);\r
362         }\r
363     }\r
364 }\r
365 \r
366 ///\r
367 /// \brief MainWindow::onMarkToggle\r
368 ///\r
369 /// マークを設定または解除します(Space)\r
370 ///\r
371 void MainWindow::onMarkToggle()\r
372 {\r
373     FolderPanel *fp = activePanel();\r
374     if (fp == NULL) {\r
375         return;\r
376     }\r
377 \r
378 //    int row = fp->fileTable()->currentIndex().row();\r
379     int row = fp->fileTable()->currentRow();\r
380     QTableWidgetItem *item = fp->fileTable()->item(row, 0);\r
381     if (fp->fileTable()->item(row, 1)->text() != "..") {\r
382        if (item->checkState() == Qt::Checked) {\r
383             item->setCheckState(Qt::Unchecked);\r
384        }\r
385         else {\r
386             item->setCheckState(Qt::Checked);\r
387        }\r
388     }\r
389     // 最終行でなければ、次のアイテムに移動する\r
390     if (row < fp->fileTable()->rowCount() - 1) {\r
391         QModelIndex nextIndex = fp->fileTable()->model()->index(row + 1, 1);\r
392         fp->fileTable()->setCurrentIndex(nextIndex);\r
393     }\r
394 }\r
395 \r
396 ///\r
397 /// \brief MainWindow::onMoveCursorDown\r
398 ///\r
399 /// カーソルを下に移動します(J)\r
400 ///\r
401 void MainWindow::onMoveCursorDown()\r
402 {\r
403     FolderPanel *fp = activePanel();\r
404     if (fp == NULL) {\r
405         return;\r
406     }\r
407 \r
408 //    int row = fp->fileTable()->currentIndex().row();\r
409     int row = fp->fileTable()->currentRow();\r
410     if (row < fp->fileTable()->rowCount() - 1) {\r
411         QModelIndex nextIndex = fp->fileTable()->model()->index(row + 1, 1);\r
412         fp->fileTable()->setCurrentIndex(nextIndex);\r
413     }\r
414 }\r
415 \r
416 ///\r
417 /// \brief MainWindow::onMoveCursorUp\r
418 ///\r
419 /// カーソルを上に移動します(K)\r
420 ///\r
421 void MainWindow::onMoveCursorUp()\r
422 {\r
423     FolderPanel *fp = activePanel();\r
424     if (fp == NULL) {\r
425         return;\r
426     }\r
427 \r
428 //    int row = fp->fileTable()->currentIndex().row();\r
429     int row = fp->fileTable()->currentRow();\r
430     if (row > 0) {\r
431         QModelIndex nextIndex = fp->fileTable()->model()->index(row - 1, 1);\r
432         fp->fileTable()->setCurrentIndex(nextIndex);\r
433     }\r
434 }\r
435 \r
436 ///\r
437 /// \brief MainWindow::onMoveCursorBegin\r
438 ///\r
439 /// カーソルを先頭に移動します(G)\r
440 ///\r
441 void MainWindow::onMoveCursorBegin()\r
442 {\r
443     FolderPanel *fp = activePanel();\r
444     if (fp == NULL) {\r
445         return;\r
446     }\r
447 \r
448     QModelIndex nextIndex = fp->fileTable()->model()->index(0, 1);\r
449     fp->fileTable()->setCurrentIndex(nextIndex);\r
450 }\r
451 \r
452 ///\r
453 /// \brief MainWindow::onMoveCursorEnd\r
454 ///\r
455 /// カーソルを末尾に移動します(Shift + G)\r
456 void MainWindow::onMoveCursorEnd()\r
457 {\r
458     FolderPanel *fp = activePanel();\r
459     if (fp == NULL) {\r
460         return;\r
461     }\r
462 \r
463     int row = fp->fileTable()->rowCount() - 1;\r
464     QModelIndex nextIndex = fp->fileTable()->model()->index(row, 1);\r
465     fp->fileTable()->setCurrentIndex(nextIndex);\r
466 }\r
467 \r
468 ///\r
469 /// \brief MainWindow::onMoveBack\r
470 ///\r
471 /// 前の履歴に戻ります(Alt + ←)\r
472 ///\r
473 void MainWindow::onMoveBack()\r
474 {\r
475     QMessageBox::information(this, tr("情報"), tr("履歴機能は未実装です。"));\r
476 }\r
477 \r
478 ///\r
479 /// \brief MainWindow::onMoveForward\r
480 ///\r
481 /// 次の履歴に進みます(Alt + →)\r
482 ///\r
483 void MainWindow::onMoveForward()\r
484 {\r
485     QMessageBox::information(this, tr("情報"), tr("履歴機能は未実装です。"));\r
486 \r
487 }\r
488 \r
489 ///\r
490 /// \brief MainWindow::onMoveHome\r
491 ///\r
492 /// ホームフォルダに移動します(H)\r
493 ///\r
494 void MainWindow::onMoveHome()\r
495 {\r
496     FolderPanel *fp = activePanel();\r
497     if (fp == NULL) {\r
498         return;\r
499     }\r
500 \r
501     fp->setCurrentFolder(QDir::homePath());\r
502 }\r
503 \r
504 ///\r
505 /// \brief MainWindow::onMoveJump\r
506 ///\r
507 /// フォルダを選択して移動します(Shift + J)\r
508 void MainWindow::onMoveJump()\r
509 {\r
510     FolderPanel *fp = activePanel();\r
511     if (fp == NULL) {\r
512         return;\r
513     }\r
514 \r
515     QString path = QFileDialog::getExistingDirectory(\r
516                 this,\r
517                 tr("フォルダを選択"),\r
518                 fp->dir()->absolutePath());\r
519     if (!path.isEmpty()) {\r
520         fp->setCurrentFolder(path);\r
521     }\r
522 }\r
523 \r
524 ///\r
525 /// \brief MainWindow::onMoveOther\r
526 ///\r
527 /// キーボードフォーカスを他方のパネルに移動します(TAB)\r
528 ///\r
529 void MainWindow::onMoveOther()\r
530 {\r
531     FolderPanel *fp = this->inactivePanel();\r
532     if (fp) {\r
533         fp->fileTable()->setFocus();\r
534     }\r
535 }\r
536 \r
537 ///\r
538 /// \brief MainWindow::onMoveParent\r
539 ///\r
540 /// 親フォルダに移動します(Backspace)\r
541 ///\r
542 void MainWindow::onMoveParent()\r
543 {\r
544     FolderPanel *fp = activePanel();\r
545     if (fp == NULL) {\r
546         return;\r
547     }\r
548 \r
549     if (!fp->dir()->isRoot()) {\r
550         QString path = fp->dir()->absoluteFilePath("..");\r
551         fp->setCurrentFolder(path);\r
552     }\r
553 }\r
554 \r
555 ///\r
556 /// \brief MainWindow::onMoveRoot\r
557 ///\r
558 /// ルートフォルダに移動します()\r
559 void MainWindow::onMoveRoot()\r
560 {\r
561     FolderPanel *fp = activePanel();\r
562     if (fp == NULL) {\r
563         return;\r
564     }\r
565 \r
566     if (!fp->dir()->isRoot()) {\r
567         fp->setCurrentFolder(QDir::rootPath());\r
568     }\r
569 }\r
570 \r
571 ///\r
572 /// \brief MainWindow::onViewFromOther\r
573 ///\r
574 /// 隣のパネルと同じフォルダを表示します(O)\r
575 ///\r
576 void MainWindow::onViewFromOther()\r
577 {\r
578     FolderPanel *fp1 = activePanel();\r
579     FolderPanel *fp2 = inactivePanel();\r
580     if (fp1 == NULL || fp2 == NULL) {\r
581         return;\r
582     }\r
583 \r
584     fp1->setCurrentFolder(fp2->dir()->absolutePath());\r
585 }\r
586 \r
587 ///\r
588 /// \brief MainWindow::onViewToOther\r
589 ///\r
590 /// 隣のパネルに同じフォルダを表示します(Shift + O)\r
591 ///\r
592 void MainWindow::onViewToOther()\r
593 {\r
594     FolderPanel *fp1 = activePanel();\r
595     FolderPanel *fp2 = inactivePanel();\r
596     if (fp1 == NULL || fp2 == NULL) {\r
597         return;\r
598     }\r
599 \r
600     fp2->setCurrentFolder(fp1->dir()->absolutePath());\r
601 }\r
602 \r
603 ///\r
604 /// \brief MainWindow::onViewHidden\r
605 ///\r
606 /// 隠しファイルの表示/非表示を切り替えます(Shift + H)\r
607 void MainWindow::onViewHidden()\r
608 {\r
609     QSettings settings;\r
610     bool checked = !settings.value("Common/ShowHidden", false).toBool();\r
611     settings.setValue("Common/ShowHidden", checked);\r
612 \r
613     if (checked) {\r
614         ui->folderPanel_L->dir()->setFilter(ui->folderPanel_L->dir()->filter() | QDir::Hidden);\r
615         ui->folderPanel_R->dir()->setFilter(ui->folderPanel_R->dir()->filter() | QDir::Hidden);\r
616     }\r
617     else {\r
618         ui->folderPanel_L->dir()->setFilter(ui->folderPanel_L->dir()->filter() ^ QDir::Hidden);\r
619         ui->folderPanel_R->dir()->setFilter(ui->folderPanel_R->dir()->filter() ^ QDir::Hidden);\r
620     }\r
621 \r
622     ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());\r
623     ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());\r
624 }\r
625 \r
626 ///\r
627 /// \brief MainWindow::onViewSwap\r
628 ///\r
629 /// パネルの表示内容を交換します(W)\r
630 ///\r
631 void MainWindow::onViewSwap()\r
632 {\r
633     FolderPanel *fp1 = activePanel();\r
634     FolderPanel *fp2 = inactivePanel();\r
635     if (fp1 == NULL || fp2 == NULL) {\r
636         return;\r
637     }\r
638 \r
639     QString path1 = fp1->dir()->absolutePath();\r
640     QString path2 = fp2->dir()->absolutePath();\r
641 \r
642     fp1->setCurrentFolder(path2);\r
643     fp2->setCurrentFolder(path1);\r
644 }\r
645 \r
646 void MainWindow::onCmdMove()\r
647 {\r
648     FolderPanel *fp = activePanel();\r
649     if (!fp) {\r
650         return;\r
651     }\r
652 \r
653     QStringList list = selectedItems(fp);\r
654     if (list.isEmpty()) {\r
655         return;\r
656     }\r
657 \r
658     CopyMoveWorker *worker = new CopyMoveWorker();\r
659     connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),\r
660             this, SLOT(onAskOverWrite(bool*,int*,int*,QString*,QString,QString)));\r
661     worker->setCopyList(&list);\r
662     worker->setTargetDir(inactivePanel()->dir()->absolutePath());\r
663     worker->setMoveMode(true);\r
664 \r
665     OperationDialog opDlg(this);\r
666     opDlg.setWindowTitle(tr("移動"));\r
667     opDlg.setWorker(worker);\r
668 \r
669     ui->folderPanel_L->UninstallWatcher();\r
670     ui->folderPanel_R->UninstallWatcher();\r
671     opDlg.exec();\r
672     ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());\r
673     ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());\r
674 \r
675 }\r
676 \r
677 void MainWindow::onCmdCopy()\r
678 {\r
679     FolderPanel *fp = activePanel();\r
680     if (!fp) {\r
681         return;\r
682     }\r
683 \r
684     QStringList list = selectedItems(fp);\r
685     if (list.isEmpty()) {\r
686         return;\r
687     }\r
688 \r
689     CopyMoveWorker *worker = new CopyMoveWorker();\r
690     connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),\r
691             this, SLOT(onAskOverWrite(bool*,int*,int*,QString*,QString,QString)));\r
692     worker->setCopyList(&list);\r
693     worker->setTargetDir(inactivePanel()->dir()->absolutePath());\r
694     worker->setMoveMode(false);\r
695 \r
696     OperationDialog opDlg(this);\r
697     opDlg.setWindowTitle(tr("コピー"));\r
698     opDlg.setWorker(worker);\r
699 \r
700     ui->folderPanel_L->UninstallWatcher();\r
701     ui->folderPanel_R->UninstallWatcher();\r
702     opDlg.exec();\r
703     ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());\r
704     ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());\r
705 \r
706 }\r
707 \r
708 void MainWindow::onAskOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod,\r
709                                 QString *alias, const QString srcPath,\r
710                                 const QString tgtPath)\r
711 {\r
712     OverWriteDialog dlg;\r
713     dlg.setCopyMethod(*prevCopyMethod);\r
714     dlg.setSameMethodChecked(*copyMethod != OverWriteDialog::Undefined);\r
715     dlg.setFileInfo(srcPath, tgtPath);\r
716     if (dlg.exec() == QDialog::Rejected) {\r
717         *bOk = false;\r
718     }\r
719     else {\r
720         *prevCopyMethod = dlg.copyMethod();\r
721         if (dlg.isSameMethodChecked()) {\r
722             *copyMethod = *prevCopyMethod;\r
723         }\r
724         *alias = dlg.alias();\r
725         *bOk = true;\r
726     }\r
727     CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());\r
728     worker->endAsking();\r
729 }\r
730 \r
731 ///\r
732 /// \brief MainWindow::onCmdDelete\r
733 ///\r
734 /// ファイルを削除します\r
735 ///\r
736 void MainWindow::onCmdDelete()\r
737 {\r
738     FolderPanel *fp = activePanel();\r
739     if (!fp) {\r
740         return;\r
741     }\r
742 \r
743     QStringList list = selectedItems(fp);\r
744     if (list.isEmpty()) {\r
745         return;\r
746     }\r
747 \r
748     QString msg;\r
749     if (list.size() == 1) {\r
750         msg = QFileInfo(list.at(0)).fileName();\r
751     }\r
752     else {\r
753         msg = tr("%1個のアイテム").arg(list.size());\r
754     }\r
755     int ret = QMessageBox::question(\r
756                 this,\r
757                 tr("確認"),\r
758                 msg + tr("を削除します<br/>よろしいですか?"));\r
759     if (ret == QMessageBox::Yes) {\r
760         DeleteWorker *worker = new DeleteWorker();\r
761         worker->setDeleteList(&list);\r
762 \r
763         OperationDialog opDlg(this);\r
764         opDlg.setWindowTitle(tr("削除"));\r
765         opDlg.setWorker(worker);\r
766 \r
767         ui->folderPanel_L->UninstallWatcher();\r
768         ui->folderPanel_R->UninstallWatcher();\r
769         opDlg.exec();\r
770         ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());\r
771         ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());\r
772     }\r
773 }\r
774 \r
775 ///\r
776 /// \brief MainWindow::onCmdNewFile\r
777 ///\r
778 /// ファイルを作成します\r
779 ///\r
780 void MainWindow::onCmdNewFile()\r
781 {\r
782     FolderPanel *fp = activePanel();\r
783     if (!fp) {\r
784         return;\r
785     }\r
786 \r
787     bool bOk;\r
788     QString name = QInputDialog::getText(\r
789                 this,\r
790                 tr("ファイルを作成"),\r
791                 tr("ファイル名"),\r
792                 QLineEdit::Normal,\r
793                 "",\r
794                 &bOk);\r
795     if (bOk && !name.isEmpty()) {\r
796         QFile file(fp->dir()->absoluteFilePath(name));\r
797         if (!file.open(QIODevice::WriteOnly)) {\r
798             QMessageBox::critical(this,\r
799                                   tr("エラー"),\r
800                                   tr("ファイルの作成に失敗しました。"));\r
801         }\r
802         else {\r
803             file.close();\r
804         }\r
805     }\r
806 }\r
807 \r
808 ///\r
809 /// \brief MainWindow::onCmdNewFolder\r
810 ///\r
811 /// フォルダを作成します\r
812 ///\r
813 void MainWindow::onCmdNewFolder()\r
814 {\r
815     FolderPanel *fp = activePanel();\r
816     if (!fp) {\r
817         return;\r
818     }\r
819 \r
820     bool bOk;\r
821     QString name = QInputDialog::getText(\r
822                 this,\r
823                 tr("フォルダを作成"),\r
824                 tr("フォルダ名"),\r
825                 QLineEdit::Normal,\r
826                 "",\r
827                 &bOk);\r
828     if (bOk && !name.isEmpty()) {\r
829         if (!fp->dir()->mkpath(name)) {\r
830             QMessageBox::critical(this,\r
831                                   tr("エラー"),\r
832                                   tr("フォルダの作成に失敗しました。"));\r
833         }\r
834     }\r
835 }\r
836 \r
837 ///\r
838 /// \brief MainWindow::onCmdRename\r
839 ///\r
840 /// 名前を変更します\r
841 ///\r
842 void MainWindow::onCmdRename()\r
843 {\r
844     FolderPanel *fp = activePanel();\r
845     if (!fp) {\r
846         return;\r
847     }\r
848 \r
849     QStringList list = selectedItems(fp);\r
850     if (list.isEmpty()) {\r
851         return;\r
852     }\r
853 \r
854     IRenameDialog *dlg;\r
855     if (list.size() == 1) {\r
856         dlg = new RenameSingleDialog(this);\r
857     }\r
858     else {\r
859         dlg = new RenameMultiDialog(this);\r
860     }\r
861     dlg->setWorkingDirectory(fp->dir()->absolutePath());\r
862     dlg->setNames(list);\r
863     int dlgResult = dlg->exec();\r
864     if (dlgResult == QDialog::Accepted && !dlg->renameMap().isEmpty()) {\r
865         RenameWorker *worker = new RenameWorker();\r
866         worker->setRenameMap(&dlg->renameMap());\r
867 \r
868         OperationDialog opDlg(this);\r
869         opDlg.setWindowTitle(tr("名前を変更"));\r
870         opDlg.setWorker(worker);\r
871 \r
872         ui->folderPanel_L->UninstallWatcher();\r
873         ui->folderPanel_R->UninstallWatcher();\r
874         opDlg.exec();\r
875         ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());\r
876         ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());\r
877     }\r
878 }\r
879 \r
880 ///\r
881 /// \brief MainWindow::onHelpAbout\r
882 ///\r
883 /// アプリケーションの概要を表示します(?)\r
884 ///\r
885 void MainWindow::onHelpAbout()\r
886 {\r
887     QMessageBox::about(\r
888                 this,\r
889                 tr("げふぅ について"),\r
890                 tr("<h3>Gefu Ver0.00</h3>"\r
891                    "<center>Gefu is Experimental File Utility.<br/>"\r
892                    "(げふぅは実験的なファイルユーティリティです)</center>"\r
893                    "<p>Copyright 2014 @miyabi_satoh All rights reserved.</p>"));\r
894 }\r
895 \r
896 QStringList MainWindow::selectedItems(FolderPanel *fp)\r
897 {\r
898     QStringList list;\r
899     for (int n = 0; n < fp->fileTable()->rowCount(); n++) {\r
900         if (fp->fileTable()->item(n, 0)->checkState() == Qt::Checked) {\r
901             list << fp->dir()->absoluteFilePath(fp->fileTable()->item(n, 1)->text());\r
902         }\r
903     }\r
904 \r
905     if (list.isEmpty()) {\r
906         int row = fp->fileTable()->currentRow();\r
907         QString name = fp->fileTable()->item(row, 1)->text();\r
908         if (name != "..") {\r
909             list << fp->dir()->absoluteFilePath(name);\r
910         }\r
911     }\r
912 \r
913     return list;\r
914 }\r