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
12 #include <QKeyEvent>
\r
13 #include <QDesktopServices>
\r
14 #include <QSettings>
\r
15 #include <QFileDialog>
\r
16 #include <QMessageBox>
\r
19 #include <QInputDialog>
\r
21 MainWindow::MainWindow(QWidget *parent) :
\r
22 QMainWindow(parent),
\r
23 ui(new Ui::MainWindow)
\r
28 bool checked = settings.value("Common/ShowHidden", false).toBool();
\r
29 ui->view_Hidden->setChecked(checked);
\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
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
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
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
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
67 connect(ui->help_About, SIGNAL(triggered()), this, SLOT(onHelpAbout()));
\r
70 setWindowTitle(tr("げふぅ v0.00"));
\r
72 setWindowIcon(QIcon(":/images/Gefu.png"));
\r
79 path = settings.value("Left/dir", QDir::homePath()).toString();
\r
80 ui->folderPanel_L->setCurrentFolder(path);
\r
82 path = settings.value("Right/dir", QDir::homePath()).toString();
\r
83 ui->folderPanel_R->setCurrentFolder(path);
\r
86 MainWindow::~MainWindow()
\r
90 settings.setValue("Left/dir", ui->folderPanel_L->dir()->absolutePath());
\r
91 settings.setValue("Right/dir", ui->folderPanel_R->dir()->absolutePath());
\r
96 void MainWindow::setStatusText(const QString &str)
\r
98 ui->statusBar->showMessage(str);
\r
101 FolderPanel* MainWindow::activePanel()
\r
103 if (ui->folderPanel_L->fileTable()->hasFocus()) {
\r
104 return ui->folderPanel_L;
\r
106 if (ui->folderPanel_R->fileTable()->hasFocus()) {
\r
107 return ui->folderPanel_R;
\r
113 FolderPanel* MainWindow::inactivePanel()
\r
115 FolderPanel *fp = activePanel();
\r
116 if (fp == ui->folderPanel_L) {
\r
117 return ui->folderPanel_R;
\r
119 if (fp == ui->folderPanel_R) {
\r
120 return ui->folderPanel_L;
\r
127 /// \brief MainWindow::onActionCommand
\r
131 void MainWindow::onActionCommand()
\r
133 FolderPanel *fp = activePanel();
\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
146 QFileInfo info(path);
\r
147 if (info.isExecutable()) {
\r
148 command = "\"" + path + "\" " + command;
\r
151 command += " \"" + path + "\"";
\r
156 if (command.isEmpty()) {
\r
157 int row = fp->fileTable()->currentRow();
\r
158 QString path = fp->fileTable()->item(row, 1)->text();
\r
159 path = fp->dir()->absoluteFilePath(path);
\r
160 path = QDir::cleanPath(path);
\r
161 path = QDir::toNativeSeparators(path);
\r
163 command = "\"" + path + "\"";
\r
166 QInputDialog dlg(this);
\r
167 dlg.setInputMode(QInputDialog::TextInput);
\r
168 dlg.setLabelText(tr("コマンドを入力:"));
\r
169 dlg.setWindowTitle(tr("コマンドを実行"));
\r
170 dlg.setTextValue(command);
\r
171 dlg.resize(500, 100);
\r
172 int ret = dlg.exec();
\r
173 command = dlg.textValue();
\r
174 if (ret == QDialog::Accepted && !command.isEmpty()) {
\r
175 QProcess process(this);
\r
176 process.setWorkingDirectory(fp->dir()->absolutePath());
\r
177 if (!process.startDetached(command)) {
\r
178 QMessageBox::critical(
\r
181 tr("コマンドの実行に失敗しました。<br/>") + command);
\r
187 /// \brief MainWindow::onActionExec
\r
189 /// アプリケーションで開きます(Shift + Enter)
\r
191 void MainWindow::onActionExec()
\r
193 FolderPanel *fp = activePanel();
\r
198 QStringList list = selectedItems(fp);
\r
199 foreach (const QString &path, list) {
\r
200 QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(path)));
\r
205 /// \brief MainWindow::onActionOpen
\r
207 /// フォルダを開きます(Enter)
\r
209 void MainWindow::onActionOpen()
\r
211 FolderPanel *fp = activePanel();
\r
216 int row = fp->fileTable()->currentRow();
\r
217 QString path = fp->fileTable()->item(row, 1)->text();
\r
218 path = fp->dir()->absoluteFilePath(path);
\r
219 QFileInfo info(path);
\r
221 if (info.isDir()) {
\r
222 fp->setCurrentFolder(path);
\r
227 /// \brief MainWindow::onActionQuit
\r
229 /// アプリケーションを終了します(Q)
\r
231 void MainWindow::onActionQuit()
\r
237 /// \brief MainWindow::onActionSetting
\r
239 /// 環境設定ダイアログを表示します(Z)
\r
241 void MainWindow::onActionSetting()
\r
243 QMessageBox::information(this, tr("情報"), tr("環境設定機能は未実装です。"));
\r
247 /// \brief MainWindow::on_mark_All_triggered
\r
249 /// すべてマークします(Shift + A)
\r
251 void MainWindow::onMarkAll()
\r
253 FolderPanel *fp = activePanel();
\r
259 if (fp->fileTable()->item(row, 1)->text() == "..") {
\r
264 int curRow = fp->fileTable()->currentRow();
\r
265 int rowCount = fp->fileTable()->rowCount();
\r
266 for (; row < rowCount; row++) {
\r
267 fp->fileTable()->item(row, 0)->setCheckState(Qt::Checked);
\r
269 fp->fileTable()->setCurrentIndex(
\r
270 fp->fileTable()->model()->index(curRow, 1));
\r
275 /// \brief MainWindow::onMarkAllFiles
\r
277 /// すべての「ファイル」をマークします(A)
\r
279 void MainWindow::onMarkAllFiles()
\r
281 FolderPanel *fp = activePanel();
\r
287 if (fp->fileTable()->item(row, 1)->text() == "..") {
\r
292 int curRow = fp->fileTable()->currentRow();
\r
293 int rowCount = fp->fileTable()->rowCount();
\r
294 for (; row < rowCount; row++) {
\r
295 QString path = fp->fileTable()->item(row, 1)->text();
\r
296 path = fp->dir()->absoluteFilePath(path);
\r
298 QFileInfo info(path);
\r
299 if (info.isDir()) {
\r
300 fp->fileTable()->item(row, 0)->setCheckState(Qt::Unchecked);
\r
303 fp->fileTable()->item(row, 0)->setCheckState(Qt::Checked);
\r
306 fp->fileTable()->setCurrentIndex(
\r
307 fp->fileTable()->model()->index(curRow, 1));
\r
312 /// \brief MainWindow::onMarkAllOff
\r
314 /// すべてのマークを解除します(U)
\r
316 void MainWindow::onMarkAllOff()
\r
318 FolderPanel *fp = activePanel();
\r
324 if (fp->fileTable()->item(row, 1)->text() == "..") {
\r
329 int curRow = fp->fileTable()->currentRow();
\r
330 int rowCount = fp->fileTable()->rowCount();
\r
331 for (; row < rowCount; row++) {
\r
332 fp->fileTable()->item(row, 0)->setCheckState(Qt::Unchecked);
\r
334 fp->fileTable()->setCurrentIndex(
\r
335 fp->fileTable()->model()->index(curRow, 1));
\r
340 /// \brief MainWindow::onMarkInvert
\r
344 void MainWindow::onMarkInvert()
\r
346 FolderPanel *fp = activePanel();
\r
352 if (fp->fileTable()->item(row, 1)->text() == "..") {
\r
357 int curRow = fp->fileTable()->currentRow();
\r
358 int rowCount = fp->fileTable()->rowCount();
\r
359 for (; row < rowCount; row++) {
\r
360 QTableWidgetItem *item = fp->fileTable()->item(row, 0);
\r
361 if (item->checkState() == Qt::Checked) {
\r
362 item->setCheckState(Qt::Unchecked);
\r
365 item->setCheckState(Qt::Checked);
\r
368 fp->fileTable()->setCurrentIndex(
\r
369 fp->fileTable()->model()->index(curRow, 1));
\r
374 /// \brief MainWindow::onMarkToggle
\r
376 /// マークを設定または解除します(Space)
\r
378 void MainWindow::onMarkToggle()
\r
380 FolderPanel *fp = activePanel();
\r
385 int row = fp->fileTable()->currentRow();
\r
386 QTableWidgetItem *item = fp->fileTable()->item(row, 0);
\r
387 if (fp->fileTable()->item(row, 1)->text() != "..") {
\r
388 if (item->checkState() == Qt::Checked) {
\r
389 item->setCheckState(Qt::Unchecked);
\r
392 item->setCheckState(Qt::Checked);
\r
395 // 最終行でなければ、次のアイテムに移動する
\r
396 if (row < fp->fileTable()->rowCount() - 1) {
\r
397 QModelIndex nextIndex = fp->fileTable()->model()->index(row + 1, 1);
\r
398 fp->fileTable()->setCurrentIndex(nextIndex);
\r
403 /// \brief MainWindow::onMoveCursorDown
\r
405 /// カーソルを下に移動します(J)
\r
407 void MainWindow::onMoveCursorDown()
\r
409 FolderPanel *fp = activePanel();
\r
414 int row = fp->fileTable()->currentRow();
\r
415 if (row < fp->fileTable()->rowCount() - 1) {
\r
416 QModelIndex nextIndex = fp->fileTable()->model()->index(row + 1, 1);
\r
417 fp->fileTable()->setCurrentIndex(nextIndex);
\r
422 /// \brief MainWindow::onMoveCursorUp
\r
424 /// カーソルを上に移動します(K)
\r
426 void MainWindow::onMoveCursorUp()
\r
428 FolderPanel *fp = activePanel();
\r
433 int row = fp->fileTable()->currentRow();
\r
435 QModelIndex nextIndex = fp->fileTable()->model()->index(row - 1, 1);
\r
436 fp->fileTable()->setCurrentIndex(nextIndex);
\r
441 /// \brief MainWindow::onMoveCursorBegin
\r
443 /// カーソルを先頭に移動します(G)
\r
445 void MainWindow::onMoveCursorBegin()
\r
447 FolderPanel *fp = activePanel();
\r
452 QModelIndex nextIndex = fp->fileTable()->model()->index(0, 1);
\r
453 fp->fileTable()->setCurrentIndex(nextIndex);
\r
457 /// \brief MainWindow::onMoveCursorEnd
\r
459 /// カーソルを末尾に移動します(Shift + G)
\r
460 void MainWindow::onMoveCursorEnd()
\r
462 FolderPanel *fp = activePanel();
\r
467 int row = fp->fileTable()->rowCount() - 1;
\r
468 QModelIndex nextIndex = fp->fileTable()->model()->index(row, 1);
\r
469 fp->fileTable()->setCurrentIndex(nextIndex);
\r
473 /// \brief MainWindow::onMoveBack
\r
475 /// 前の履歴に戻ります(Alt + ←)
\r
477 void MainWindow::onMoveBack()
\r
479 QMessageBox::information(this, tr("情報"), tr("履歴機能は未実装です。"));
\r
483 /// \brief MainWindow::onMoveForward
\r
485 /// 次の履歴に進みます(Alt + →)
\r
487 void MainWindow::onMoveForward()
\r
489 QMessageBox::information(this, tr("情報"), tr("履歴機能は未実装です。"));
\r
494 /// \brief MainWindow::onMoveHome
\r
496 /// ホームフォルダに移動します(H)
\r
498 void MainWindow::onMoveHome()
\r
500 FolderPanel *fp = activePanel();
\r
505 fp->setCurrentFolder(QDir::homePath());
\r
509 /// \brief MainWindow::onMoveJump
\r
511 /// フォルダを選択して移動します(Shift + J)
\r
512 void MainWindow::onMoveJump()
\r
514 FolderPanel *fp = activePanel();
\r
519 QString path = QFileDialog::getExistingDirectory(
\r
522 fp->dir()->absolutePath());
\r
523 if (!path.isEmpty()) {
\r
524 fp->setCurrentFolder(path);
\r
529 /// \brief MainWindow::onMoveOther
\r
531 /// キーボードフォーカスを他方のパネルに移動します(TAB)
\r
533 void MainWindow::onMoveOther()
\r
535 FolderPanel *fp = this->inactivePanel();
\r
537 fp->fileTable()->setFocus();
\r
542 /// \brief MainWindow::onMoveParent
\r
544 /// 親フォルダに移動します(Backspace)
\r
546 void MainWindow::onMoveParent()
\r
548 FolderPanel *fp = activePanel();
\r
553 if (!fp->dir()->isRoot()) {
\r
554 QString path = fp->dir()->absoluteFilePath("..");
\r
555 fp->setCurrentFolder(path);
\r
560 /// \brief MainWindow::onMoveRoot
\r
562 /// ルートフォルダに移動します()
\r
563 void MainWindow::onMoveRoot()
\r
565 FolderPanel *fp = activePanel();
\r
570 if (!fp->dir()->isRoot()) {
\r
571 fp->setCurrentFolder(QDir::rootPath());
\r
576 /// \brief MainWindow::onViewFromOther
\r
578 /// 隣のパネルと同じフォルダを表示します(O)
\r
580 void MainWindow::onViewFromOther()
\r
582 FolderPanel *fp1 = activePanel();
\r
583 FolderPanel *fp2 = inactivePanel();
\r
584 if (fp1 == NULL || fp2 == NULL) {
\r
588 fp1->setCurrentFolder(fp2->dir()->absolutePath());
\r
592 /// \brief MainWindow::onViewToOther
\r
594 /// 隣のパネルに同じフォルダを表示します(Shift + O)
\r
596 void MainWindow::onViewToOther()
\r
598 FolderPanel *fp1 = activePanel();
\r
599 FolderPanel *fp2 = inactivePanel();
\r
600 if (fp1 == NULL || fp2 == NULL) {
\r
604 fp2->setCurrentFolder(fp1->dir()->absolutePath());
\r
608 /// \brief MainWindow::onViewHidden
\r
610 /// 隠しファイルの表示/非表示を切り替えます(Shift + H)
\r
611 void MainWindow::onViewHidden()
\r
613 QSettings settings;
\r
614 bool checked = !settings.value("Common/ShowHidden", false).toBool();
\r
615 settings.setValue("Common/ShowHidden", checked);
\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
622 ui->folderPanel_L->dir()->setFilter(ui->folderPanel_L->dir()->filter() ^ QDir::Hidden);
\r
623 ui->folderPanel_R->dir()->setFilter(ui->folderPanel_R->dir()->filter() ^ QDir::Hidden);
\r
626 ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());
\r
627 ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());
\r
631 /// \brief MainWindow::onViewSwap
\r
633 /// パネルの表示内容を交換します(W)
\r
635 void MainWindow::onViewSwap()
\r
637 FolderPanel *fp1 = activePanel();
\r
638 FolderPanel *fp2 = inactivePanel();
\r
639 if (fp1 == NULL || fp2 == NULL) {
\r
643 QString path1 = fp1->dir()->absolutePath();
\r
644 QString path2 = fp2->dir()->absolutePath();
\r
646 fp1->setCurrentFolder(path2);
\r
647 fp2->setCurrentFolder(path1);
\r
651 /// \brief MainWindow::onCmdMove
\r
653 /// ファイルを移動します(Ctrl + M)
\r
655 void MainWindow::onCmdMove()
\r
657 FolderPanel *fp = activePanel();
\r
662 QStringList list = selectedItems(fp);
\r
663 if (list.isEmpty()) {
\r
667 CopyMoveWorker *worker = new CopyMoveWorker();
\r
668 connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),
\r
669 this, SLOT(onAskOverWrite(bool*,int*,int*,QString*,QString,QString)));
\r
670 worker->setCopyList(&list);
\r
671 worker->setTargetDir(inactivePanel()->dir()->absolutePath());
\r
672 worker->setMoveMode(true);
\r
674 OperationDialog opDlg(this);
\r
675 opDlg.setWindowTitle(tr("移動"));
\r
676 opDlg.setWorker(worker);
\r
678 ui->folderPanel_L->UninstallWatcher();
\r
679 ui->folderPanel_R->UninstallWatcher();
\r
681 ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());
\r
682 ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());
\r
687 /// \brief MainWindow::onCmdCopy
\r
689 /// ファイルをコピーします(Ctrl + C)
\r
691 void MainWindow::onCmdCopy()
\r
693 FolderPanel *fp = activePanel();
\r
698 QStringList list = selectedItems(fp);
\r
699 if (list.isEmpty()) {
\r
703 CopyMoveWorker *worker = new CopyMoveWorker();
\r
704 connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),
\r
705 this, SLOT(onAskOverWrite(bool*,int*,int*,QString*,QString,QString)));
\r
706 worker->setCopyList(&list);
\r
707 worker->setTargetDir(inactivePanel()->dir()->absolutePath());
\r
708 worker->setMoveMode(false);
\r
710 OperationDialog opDlg(this);
\r
711 opDlg.setWindowTitle(tr("コピー"));
\r
712 opDlg.setWorker(worker);
\r
714 ui->folderPanel_L->UninstallWatcher();
\r
715 ui->folderPanel_R->UninstallWatcher();
\r
717 ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());
\r
718 ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());
\r
723 /// \brief MainWindow::onAskOverWrite
\r
725 /// \param prevCopyMethod
\r
726 /// \param copyMethod
\r
731 /// 上書き処理の方法をユーザに問い合わせます
\r
733 void MainWindow::onAskOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod,
\r
734 QString *alias, const QString srcPath,
\r
735 const QString tgtPath)
\r
737 OverWriteDialog dlg;
\r
738 dlg.setCopyMethod(*prevCopyMethod);
\r
739 dlg.setSameMethodChecked(*copyMethod != OverWriteDialog::Undefined);
\r
740 dlg.setFileInfo(srcPath, tgtPath);
\r
741 if (dlg.exec() == QDialog::Rejected) {
\r
745 *prevCopyMethod = dlg.copyMethod();
\r
746 if (dlg.isSameMethodChecked()) {
\r
747 *copyMethod = *prevCopyMethod;
\r
749 *alias = dlg.alias();
\r
752 CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());
\r
753 worker->endAsking();
\r
757 /// \brief MainWindow::onCmdDelete
\r
761 void MainWindow::onCmdDelete()
\r
763 FolderPanel *fp = activePanel();
\r
768 QStringList list = selectedItems(fp);
\r
769 if (list.isEmpty()) {
\r
774 if (list.size() == 1) {
\r
775 msg = QFileInfo(list.at(0)).fileName();
\r
778 msg = tr("%1個のアイテム").arg(list.size());
\r
780 int ret = QMessageBox::question(
\r
783 msg + tr("を削除します<br/>よろしいですか?"));
\r
784 if (ret == QMessageBox::Yes) {
\r
785 DeleteWorker *worker = new DeleteWorker();
\r
786 worker->setDeleteList(&list);
\r
788 OperationDialog opDlg(this);
\r
789 opDlg.setWindowTitle(tr("削除"));
\r
790 opDlg.setWorker(worker);
\r
792 ui->folderPanel_L->UninstallWatcher();
\r
793 ui->folderPanel_R->UninstallWatcher();
\r
795 ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());
\r
796 ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());
\r
801 /// \brief MainWindow::onCmdNewFile
\r
805 void MainWindow::onCmdNewFile()
\r
807 FolderPanel *fp = activePanel();
\r
813 QString name = QInputDialog::getText(
\r
820 if (bOk && !name.isEmpty()) {
\r
821 QFile file(fp->dir()->absoluteFilePath(name));
\r
822 if (!file.open(QIODevice::WriteOnly)) {
\r
823 QMessageBox::critical(this,
\r
825 tr("ファイルの作成に失敗しました。"));
\r
834 /// \brief MainWindow::onCmdNewFolder
\r
838 void MainWindow::onCmdNewFolder()
\r
840 FolderPanel *fp = activePanel();
\r
846 QString name = QInputDialog::getText(
\r
853 if (bOk && !name.isEmpty()) {
\r
854 if (!fp->dir()->mkpath(name)) {
\r
855 QMessageBox::critical(this,
\r
857 tr("フォルダの作成に失敗しました。"));
\r
863 /// \brief MainWindow::onCmdRename
\r
867 void MainWindow::onCmdRename()
\r
869 FolderPanel *fp = activePanel();
\r
874 QStringList list = selectedItems(fp);
\r
875 if (list.isEmpty()) {
\r
879 IRenameDialog *dlg;
\r
880 if (list.size() == 1) {
\r
881 dlg = new RenameSingleDialog(this);
\r
884 dlg = new RenameMultiDialog(this);
\r
886 dlg->setWorkingDirectory(fp->dir()->absolutePath());
\r
887 dlg->setNames(list);
\r
888 int dlgResult = dlg->exec();
\r
889 if (dlgResult == QDialog::Accepted && !dlg->renameMap().isEmpty()) {
\r
890 RenameWorker *worker = new RenameWorker();
\r
891 worker->setRenameMap(&dlg->renameMap());
\r
893 OperationDialog opDlg(this);
\r
894 opDlg.setWindowTitle(tr("名前を変更"));
\r
895 opDlg.setWorker(worker);
\r
897 ui->folderPanel_L->UninstallWatcher();
\r
898 ui->folderPanel_R->UninstallWatcher();
\r
900 ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());
\r
901 ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());
\r
906 /// \brief MainWindow::onHelpAbout
\r
908 /// アプリケーションの概要を表示します(?)
\r
910 void MainWindow::onHelpAbout()
\r
912 QMessageBox::about(
\r
915 tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +
\r
916 tr("<center>Gefu is Experimental File Utility.<br/>"
\r
917 "(げふぅは実験的なファイルユーティリティです)</center>"
\r
918 "<p>Copyright 2014 @miyabi_satoh All rights reserved.</p>"));
\r
922 /// \brief MainWindow::selectedItems
\r
923 /// \param fp フォルダパネルへのポインタ
\r
924 /// \return 選択アイテムのフルパスのリスト
\r
926 /// 選択アイテムのフルパスのリストを取得します
\r
928 QStringList MainWindow::selectedItems(FolderPanel *fp)
\r
931 for (int n = 0; n < fp->fileTable()->rowCount(); n++) {
\r
932 if (fp->fileTable()->item(n, 0)->checkState() == Qt::Checked) {
\r
933 list << fp->dir()->absoluteFilePath(fp->fileTable()->item(n, 1)->text());
\r
937 if (list.isEmpty()) {
\r
938 int row = fp->fileTable()->currentRow();
\r
939 QString name = fp->fileTable()->item(row, 1)->text();
\r
940 if (name != "..") {
\r
941 list << fp->dir()->absoluteFilePath(name);
\r
949 /// \brief getMainWnd
\r
950 /// \return メインウィンドウのポインタ
\r
954 MainWindow* getMainWnd()
\r
956 foreach (QWidget *w, qApp->topLevelWidgets()) {
\r
957 if (w->objectName() == "MainWindow") {
\r
958 return static_cast<MainWindow*>(w);
\r
961 qDebug() << "MainWindow not found !?";
\r