3 #include "preferencedialog.h"
\r
4 #include "folderview.h"
\r
5 #include "searchbox.h"
\r
6 #include "locationbox.h"
\r
7 #include "copymoveworker.h"
\r
8 #include "operationdialog.h"
\r
9 #include "overwritedialog.h"
\r
10 #include "deleteworker.h"
\r
11 #include "renameworker.h"
\r
12 #include "renamesingledialog.h"
\r
13 #include "renamemultidialog.h"
\r
14 #include "historydialog.h"
\r
15 #include "sortdialog.h"
\r
16 #include "simpletextview.h"
\r
17 #include "simpleimageview.h"
\r
18 #include "mainwindow.h"
\r
19 #include "ui_mainwindow.h"
\r
20 #include "bookmarkdialog.h"
\r
22 #include <QCheckBox>
\r
23 #include <QCloseEvent>
\r
25 #include <QDesktopWidget>
\r
26 #include <QMessageBox>
\r
27 #include <QSettings>
\r
28 #include <QNetworkAccessManager>
\r
29 #include <QNetworkReply>
\r
30 #include <QInputDialog>
\r
32 #include <QDesktopServices>
\r
33 #include <QClipboard>
\r
34 #include <QFileDialog>
\r
35 #include <folderpanel.h>
\r
37 MainWindow::MainWindow(QWidget *parent) :
\r
38 QMainWindow(parent),
\r
39 ui(new Ui::MainWindow),
\r
40 m_focusedView(NULL),
\r
41 m_overwriteDialog(NULL),
\r
42 m_viewMode(ModeBasic)
\r
44 qDebug() << ">>>>>>>>>> MainWindowの構築開始 <<<<<";
\r
47 m_overwriteDialog = new OverWriteDialog(this);
\r
49 initActionConnections();
\r
50 connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(focusChange(QWidget*,QWidget*)));
\r
51 connect(ui->pane3->textView(), SIGNAL(viewFinished()), this, SLOT(viewFinish()));
\r
52 connect(ui->pane3->imageView(), SIGNAL(viewFinished()), this, SLOT(viewFinish()));
\r
53 connect(ui->pane1->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));
\r
54 connect(ui->pane2->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));
\r
55 connect(ui->pane3->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));
\r
56 connect(ui->pane1->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));
\r
57 connect(ui->pane2->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));
\r
58 connect(ui->pane3->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));
\r
61 ui->pane3->setVisible(false);
\r
63 // ステータスバーにウィジェットを設定する
\r
64 QLabel *label = new QLabel("", this);
\r
65 label->setAlignment(Qt::AlignRight);
\r
66 label->setObjectName("Right");
\r
67 ui->statusBar->addPermanentWidget(label, 0);
\r
69 for (int i = 1; i <= 2; i++) {
\r
71 AnyView *anyView = findChild<AnyView*>(QString("pane%1").arg(i));
\r
72 Q_CHECK_PTR(anyView);
\r
74 FolderPanel *fp = anyView->findChild<FolderPanel*>("folderPanel");
\r
77 // FolderPanelとFolderViewの名前を変更する
\r
78 fp->setObjectName(QString("folderPanel%1").arg(i));
\r
79 fp->folderView()->setObjectName(QString("folderView%1").arg(i));
\r
81 fp->initialize(this);
\r
89 ui->view_Hidden->setChecked(settings.value(IniKey_ShowHidden).toBool());
\r
90 ui->view_System->setChecked(settings.value(IniKey_ShowSystem).toBool());
\r
91 ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());
\r
92 ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());
\r
94 // 追加のショートカットキーを設定する
\r
95 QList<QKeySequence> shortcuts;
\r
96 shortcuts = ui->action_Open->shortcuts();
\r
97 shortcuts.append(QKeySequence("M"));
\r
98 ui->action_Open->setShortcuts(shortcuts);
\r
100 shortcuts = ui->action_Exec->shortcuts();
\r
101 shortcuts.append(QKeySequence("Shift+M"));
\r
102 ui->action_Exec->setShortcuts(shortcuts);
\r
104 // MacだとShift+の形で認識されてしまうもの
\r
105 shortcuts = ui->view_FontSizeUp->shortcuts();
\r
106 shortcuts.append(QKeySequence("Shift++"));
\r
107 ui->view_FontSizeUp->setShortcuts(shortcuts);
\r
109 shortcuts = ui->view_Filter->shortcuts();
\r
110 shortcuts.append(QKeySequence("Shift+*"));
\r
111 ui->view_Filter->setShortcuts(shortcuts);
\r
113 shortcuts = ui->action_OpenTerminal->shortcuts();
\r
114 shortcuts.append(QKeySequence("Shift+>"));
\r
115 ui->action_OpenTerminal->setShortcuts(shortcuts);
\r
117 shortcuts = ui->help_About->shortcuts();
\r
118 shortcuts.append(QKeySequence("Shift+?"));
\r
119 ui->help_About->setShortcuts(shortcuts);
\r
122 setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));
\r
125 #if defined(Q_OS_MAC)
\r
126 setWindowIcon(QIcon(":/images/Gefu.icns"));
\r
128 setWindowIcon(QIcon(":/images/Gefu.png"));
\r
131 //>>>>> ウィンドウサイズと位置を設定する
\r
133 QPoint point = this->geometry().topLeft();
\r
134 QSize size = this->geometry().size();
\r
135 //>>>> 前回の位置・サイズ・状態を復元する
\r
136 if (!settings.value(IniKey_WindowGeometry, "").toString().isEmpty()) {
\r
137 restoreGeometry(settings.value(IniKey_WindowGeometry).toByteArray());
\r
138 restoreState(settings.value(iniKey_WindowState).toByteArray());
\r
140 //>>>> INIファイルの設定から復元する
\r
142 strValue = settings.value(IniKey_BootSizeSpec).toString();
\r
143 if (strValue == "sizeAbsolute") {
\r
144 size = settings.value(IniKey_BootSizeAbs).toSize();
\r
146 else if (strValue == "sizeRelative") {
\r
147 size = settings.value(IniKey_BootSizeRel).toSize();
\r
148 size.setWidth(size.width() * QApplication::desktop()->width() / 100.0);
\r
149 size.setHeight(size.height() * QApplication::desktop()->height() / 100.0);
\r
151 else if (strValue == "sizeLast") {
\r
152 size = this->geometry().size();
\r
155 strValue = settings.value(IniKey_BootPosSpec).toString();
\r
156 if (strValue == "posAbsolute") {
\r
157 point = settings.value(IniKey_BootPosAbs).toPoint();
\r
159 else if (strValue == "posRelative") {
\r
160 point = settings.value(IniKey_BootPosRel).toPoint();
\r
161 point.setX(point.x() * QApplication::desktop()->width() / 100.0);
\r
162 point.setY(point.y() * QApplication::desktop()->height() / 100.0);
\r
164 else if (strValue == "posLast") {
\r
165 point = this->geometry().topLeft();
\r
168 point.setX((QApplication::desktop()->width() - size.width()) / 2);
\r
169 point.setY((QApplication::desktop()->height() - size.height()) / 2);
\r
171 this->setGeometry(QRect(point, size));
\r
174 if (settings.value(IniKey_CheckUpdates).toBool()) {
\r
178 ui->pane2->changeView(AnyView::ViewFolder);
\r
179 ui->pane2->repaint();
\r
181 ui->pane1->changeView(AnyView::ViewFolder);
\r
182 ui->pane1->repaint();
\r
184 qDebug() << ">>>>>>>>>> MainWindowの構築終了 <<<<<";
\r
187 MainWindow::~MainWindow()
\r
192 void MainWindow::focusChange(QWidget *old, QWidget *now)
\r
194 qDebug() << ">>>>> フォーカス変更";
\r
195 if (old) qDebug() << "old is" << old->objectName();
\r
196 if (now) qDebug() << "now is" << now->objectName();
\r
198 // 検索ボックスがフォーカスを失ったら、非表示にする
\r
199 if (old == ui->pane1->folderPanel()->searchBox() ||
\r
200 old == ui->pane2->folderPanel()->searchBox())
\r
202 ui->action_Search->setChecked(false);
\r
205 // フォルダビューにフォーカスが移ったら、ステータスバーの表示を更新する
\r
206 if (now == ui->pane1->folderPanel()->folderView() ||
\r
207 now == ui->pane2->folderPanel()->folderView())
\r
209 FolderView *view = static_cast<FolderView*>(now);
\r
210 ui->statusBar->showMessage(view->currentItem().absoluteFilePath());
\r
218 void MainWindow::executeCommand()
\r
220 qDebug() << "MainWindow::executeCommand";
\r
222 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
225 QFileInfoList list = view->selectedItems();
\r
226 QString command = QString::null;
\r
227 foreach (const QFileInfo &info, list) {
\r
229 QString path = info.absoluteFilePath();
\r
231 QString path = info.fileName();
\r
233 if (info.isExecutable()) {
\r
234 command = QQ(path) + " " + command;
\r
237 command += " " + QQ(path);
\r
241 QInputDialog dlg(this);
\r
242 dlg.setInputMode(QInputDialog::TextInput);
\r
243 dlg.setWindowTitle(tr("コマンドを実行"));
\r
244 dlg.setLabelText(tr("コマンド:"));
\r
245 dlg.setTextValue(command);
\r
246 dlg.resize(width() * 0.8, dlg.height());
\r
248 int ret = dlg.exec();
\r
249 command = dlg.textValue();
\r
250 if (ret == QDialog::Accepted && !command.isEmpty()) {
\r
251 startProcess(command, view->dir(), tr("コマンドの実行に失敗しました。"));
\r
255 void MainWindow::historyBack()
\r
257 qDebug() << "MainWindow::historyBack();";
\r
259 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
262 if (view->historyBack()) {
\r
267 void MainWindow::historyForward()
\r
269 qDebug() << "MainWindow::historyForward();";
\r
271 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
274 if (view->historyForward()) {
\r
279 void MainWindow::markAll()
\r
281 qDebug() << "MainWindow::markAll();";
\r
283 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
286 view->setCheckStateAll(true);
\r
289 void MainWindow::markAllFiles()
\r
291 qDebug() << "MainWindow::markAllFiles();";
\r
293 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
296 view->setCheckStateAllFiles();
\r
299 void MainWindow::markAllOff()
\r
301 qDebug() << "MainWindow::markAllOff();";
\r
303 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
306 view->setCheckStateAll(false);
\r
309 void MainWindow::markInvert()
\r
311 qDebug() << "MainWindow::markInvert();";
\r
313 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
316 view->invertCheckState();
\r
319 void MainWindow::markToggle()
\r
321 qDebug() << "MainWindow::markToggle();";
\r
323 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
326 view->toggleCheckState(view->currentIndex());
\r
329 void MainWindow::moveItems()
\r
331 qDebug() << "MainWindow::moveItems";
\r
333 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
336 QFileInfoList list = view->selectedItems();
\r
337 if (list.isEmpty()) {
\r
341 QSettings settings;
\r
342 if (settings.value(IniKey_ConfirmMove).toBool()) {
\r
343 if (QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))
\r
344 != QMessageBox::Yes)
\r
350 // 上書き確認ダイアログを初期化する
\r
351 m_overwriteDialog->reset();
\r
354 FolderView *other = otherSideFolderView(view);
\r
355 CopyMoveWorker *worker = new CopyMoveWorker();
\r
356 connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),
\r
357 this, SLOT(askOverWrite(QString*,QString*,QString,QString)));
\r
358 worker->setCopyList(&list);
\r
359 worker->setTargetDir(other->dir());
\r
360 worker->setMoveMode(true);
\r
362 // 進捗ダイアログを表示して、処理を開始する
\r
363 OperationDialog opDlg(this);
\r
364 opDlg.setWindowTitle(tr("移動"));
\r
365 opDlg.setWorker(worker);
\r
366 opDlg.setAutoClose(settings.value(IniKey_AutoCloseMove).toBool());
\r
368 int row = view->currentIndex().row();
\r
372 if (row >= view->model()->rowCount()) {
\r
373 row = view->model()->rowCount() - 1;
\r
375 //view->selectRow(row);
\r
376 view->setCurrentIndex(view->model()->index(row, 1));
\r
378 settings.setValue(IniKey_AutoCloseMove, opDlg.autoClose());
\r
381 void MainWindow::leftKeyPress()
\r
383 qDebug() << "MainWindow::leftKeyPress();";
\r
385 if (ui->pane3->textView()->hasFocus()) {
\r
386 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier);
\r
387 QApplication::sendEvent(ui->pane3->textView(), &event);
\r
389 else if (ui->pane1->folderPanel()->folderView()->hasFocus()) {
\r
392 else if (ui->pane2->folderPanel()->folderView()->hasFocus()) {
\r
393 ui->pane1->folderPanel()->folderView()->setFocus();
\r
397 void MainWindow::rightKeyPress()
\r
399 qDebug() << "MainWindow::rightKeyPress();";
\r
401 if (ui->pane3->textView()->hasFocus()) {
\r
402 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier);
\r
403 QApplication::sendEvent(ui->pane3->textView(), &event);
\r
405 else if (ui->pane1->folderPanel()->folderView()->hasFocus()) {
\r
406 ui->pane2->folderPanel()->folderView()->setFocus();
\r
408 else if (ui->pane2->folderPanel()->folderView()->hasFocus()) {
\r
413 void MainWindow::showFileInfo(const QString &str)
\r
415 qDebug() << "MainWindow::showFileInfo();" << str;
\r
416 QLabel *label = ui->statusBar->findChild<QLabel*>("Right");
\r
417 Q_CHECK_PTR(label);
\r
419 label->setText(str);
\r
422 void MainWindow::chooseFolder()
\r
424 qDebug() << "MainWindow::chooseFolder();";
\r
426 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
429 QString path = QFileDialog::getExistingDirectory(
\r
430 this, tr("フォルダを選択"), view->dir());
\r
431 if (!path.isEmpty()) {
\r
432 view->setPath(path, true);
\r
437 void MainWindow::copyFilenameToClipboard()
\r
439 qDebug() << "MainWindow::copyFilenameToClipboard();";
\r
441 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
444 QClipboard *clipboard = QApplication::clipboard();
\r
445 clipboard->setText(view->currentItem().fileName());
\r
448 void MainWindow::copyFullpathTpClipboard()
\r
450 qDebug() << "MainWindow::copyFullpathTpClipboard();";
\r
452 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
455 QClipboard *clipboard = QApplication::clipboard();
\r
456 clipboard->setText(view->currentItem().absoluteFilePath());
\r
459 void MainWindow::askOverWrite(QString *copyMethod,
\r
461 const QString &srcPath,
\r
462 const QString &tgtPath)
\r
464 qDebug() << "MainWindow::askOverWrite();";
\r
466 CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());
\r
467 if (!m_overwriteDialog->isKeepSetting() ||
\r
468 m_overwriteDialog->copyMethod() == "rbRename")
\r
470 m_overwriteDialog->setFileInfo(srcPath, tgtPath);
\r
471 if (m_overwriteDialog->exec() == QDialog::Rejected) {
\r
472 worker->requestStop();
\r
475 *copyMethod = m_overwriteDialog->copyMethod();
\r
476 *alias = m_overwriteDialog->alias();
\r
478 worker->endAsking();
\r
481 void MainWindow::currentChange(const QFileInfo &info)
\r
483 qDebug() << ">>>>> カーソル変更 <<<<<";
\r
485 FolderView *view = static_cast<FolderView*>(sender());
\r
488 if (!view->hasFocus()) {
\r
492 // ステータスバーにカーソルのフルパスを表示する
\r
493 ui->statusBar->showMessage(info.absoluteFilePath());
\r
496 if (m_viewMode & ModeHalfView) {
\r
497 AnyView *otherSide = static_cast<AnyView*>(
\r
498 otherSideFolderView(view)->parent()->parent());
\r
499 Q_CHECK_PTR(otherSide);
\r
501 if (!otherSide->setViewItem(view->currentItem())) {
\r
509 void MainWindow::dropAccept(const QFileInfoList &list)
\r
511 qDebug() << "MainWindow::dropAccept();";
\r
513 FolderView *view = static_cast<FolderView*>(sender());
\r
516 copyItems(list, view->dir());
\r
519 void MainWindow::copyItems(const QFileInfoList &list, const QString &tgtDir)
\r
521 qDebug() << "MainWindow::copyItems();";
\r
523 QSettings settings;
\r
524 if (settings.value(IniKey_ConfirmCopy).toBool()) {
\r
525 if (QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))
\r
526 != QMessageBox::Yes)
\r
532 // 上書き確認ダイアログを初期化する
\r
533 m_overwriteDialog->reset();
\r
536 CopyMoveWorker *worker = new CopyMoveWorker();
\r
537 connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),
\r
538 this, SLOT(askOverWrite(QString*,QString*,QString,QString)));
\r
539 worker->setCopyList(&list);
\r
540 worker->setTargetDir(tgtDir);
\r
541 worker->setMoveMode(false);
\r
543 // 進捗ダイアログを表示して、処理を開始する
\r
544 OperationDialog opDlg(this);
\r
545 opDlg.setWindowTitle(tr("コピー"));
\r
546 opDlg.setWorker(worker);
\r
547 opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());
\r
551 settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());
\r
554 void MainWindow::copyItems()
\r
556 qDebug() << "MainWindow::copyItems";
\r
558 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
561 QFileInfoList list = view->selectedItems();
\r
562 if (list.isEmpty()) {
\r
566 QString tgtPath = otherSideFolderView(view)->dir();
\r
567 copyItems(list, tgtPath);
\r
570 void MainWindow::createFile()
\r
572 qDebug() << "MainWindow::createFile";
\r
574 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
578 QString name = QInputDialog::getText(
\r
579 this, tr("ファイルを作成"), tr("ファイル名:"),
\r
580 QLineEdit::Normal, "", &bOk);
\r
581 if (!bOk || name.isEmpty()) {
\r
585 QDir dir(view->dir());
\r
586 QFile file(dir.absoluteFilePath(name));
\r
587 if (!file.open(QIODevice::WriteOnly)) {
\r
588 QMessageBox::critical(
\r
590 tr("ファイルの作成に失敗しました。"));
\r
595 QSettings settings;
\r
596 if (settings.value(IniKey_OpenAfterCreateFile).toBool()) {
\r
597 openEditor(dir.absoluteFilePath(name));
\r
601 view->searchItem(name);
\r
605 void MainWindow::createFolder()
\r
607 qDebug() << "MainWindow::createFolder";
\r
609 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
613 QString name = QInputDialog::getText(
\r
614 this, tr("フォルダを作成"), tr("フォルダ名:"),
\r
615 QLineEdit::Normal, "", &bOk);
\r
616 if (!bOk || name.isEmpty()) {
\r
620 QDir dir(view->dir());
\r
621 if (!dir.mkpath(name)) {
\r
622 QMessageBox::critical(
\r
624 tr("フォルダの作成に失敗しました。"));
\r
627 QSettings settings;
\r
628 if (settings.value(IniKey_MoveAfterCreateFolder).toBool()) {
\r
629 view->setPath(dir.absoluteFilePath(name), true);
\r
633 view->searchItem(name);
\r
637 void MainWindow::deleteItems()
\r
639 qDebug() << "MainWindow::deleteItems";
\r
641 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
644 QFileInfoList list = view->selectedItems();
\r
645 if (list.isEmpty()) {
\r
649 QSettings settings;
\r
650 if (settings.value(IniKey_ConfirmDelete).toBool()) {
\r
652 if (list.size() == 1) {
\r
653 msg = list[0].fileName();
\r
656 msg = tr("%1個のアイテム").arg(list.size());
\r
658 int ret = QMessageBox::question(
\r
660 msg + tr("を削除しますか?"));
\r
661 if (ret != QMessageBox::Yes) {
\r
666 DeleteWorker *worker = new DeleteWorker();
\r
667 worker->setDeleteList(&list);
\r
669 OperationDialog opDlg(this);
\r
670 opDlg.setWindowTitle(tr("削除"));
\r
671 opDlg.setWorker(worker);
\r
672 opDlg.setAutoClose(settings.value(IniKey_AutoCloseDelete).toBool());
\r
674 int row = view->currentIndex().row();
\r
679 if (row >= view->model()->rowCount()) {
\r
680 row = view->model()->rowCount() - 1;
\r
682 // view->selectRow(row);
\r
683 view->setCurrentIndex(view->model()->index(row, 1));
\r
685 settings.setValue(IniKey_AutoCloseDelete, opDlg.autoClose());
\r
688 void MainWindow::open(const QModelIndex &index)
\r
691 qDebug() << "MainWindow::open";
\r
693 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
696 QFileInfo info = view->currentItem();
\r
697 if (info.isDir()) {
\r
698 view->setPath(info.absoluteFilePath(), true);
\r
703 setUpdatesEnabled(false);
\r
705 m_focusedView = view;
\r
706 if (ui->pane3->setViewItem(info)) {
\r
707 ui->pane3->setVisible(true);
\r
708 ui->splitter->setVisible(false);
\r
710 setViewMode(ModeFullView);
\r
713 ui->pane3->setVisible(false);
\r
716 setUpdatesEnabled(true);
\r
719 void MainWindow::openEditor(const QString &path)
\r
721 qDebug() << "MainWindow::openEditor";
\r
723 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
726 QSettings settings;
\r
727 QString exe = settings.value(IniKey_EditorPath).toString();
\r
728 if (exe.isEmpty()) {
\r
729 QMessageBox::critical(
\r
731 tr("外部エディタのパスが未定義です。"));
\r
735 QFileInfoList list;
\r
736 if (path.isEmpty()) {
\r
737 list = view->selectedItems();
\r
743 foreach (const QFileInfo &info, list) {
\r
744 QString opt = settings.value(IniKey_EditorOption).toString();
\r
745 replaceVars(opt, info);
\r
748 QString command = "open -a " + exe + " " + opt;
\r
750 QString command = QQ(exe) + " " + opt;
\r
752 if (!startProcess(command, info.absolutePath(), tr("外部エディタの起動に失敗しました。"))) {
\r
758 void MainWindow::openTerminal()
\r
760 qDebug() << "MainWindow::openTerminal";
\r
762 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
765 QSettings settings;
\r
766 QString exe = settings.value(IniKey_TerminalPath).toString();
\r
767 if (exe.isEmpty()) {
\r
768 QMessageBox::critical(
\r
770 tr("ターミナルのパスが未定義です。"));
\r
774 foreach (const QFileInfo &info, view->selectedItems()) {
\r
775 QString opt = settings.value(IniKey_TerminalOption).toString();
\r
776 replaceVars(opt, info);
\r
779 QString command = "open -a " + QQ(exe) + " --args " + opt;
\r
781 QString command = QQ(exe) + " " + opt;
\r
783 if (!startProcess(command, info.absolutePath(), tr("ターミナルの起動に失敗しました。"))) {
\r
790 void MainWindow::openBookmark()
\r
792 qDebug() << "MainWindow::openBookmark();";
\r
794 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
797 QAction *action = qobject_cast<QAction*>(sender());
\r
798 Q_CHECK_PTR(action);
\r
800 QSettings settings;
\r
801 int i = action->data().toInt();
\r
802 view->setPath(settings.value(IniKey_BookmarkEntryPath(i)).toString(), true);
\r
805 void MainWindow::refresh()
\r
807 qDebug() << "MainWindow::refresh();";
\r
809 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
815 void MainWindow::renameItems()
\r
817 qDebug() << "MainWindow::renameItems";
\r
819 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
822 QFileInfoList list = view->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 dlg->setWorkingDirectory(view->dir());
\r
835 dlg->setNames(list);
\r
836 int dlgResult = dlg->exec();
\r
837 if (dlgResult != QDialog::Accepted || dlg->renameMap().isEmpty()) {
\r
841 QSettings settings;
\r
842 if (settings.value(IniKey_ConfirmRename).toBool()) {
\r
843 int ret = QMessageBox::question(this, tr("確認"),
\r
844 tr("名前の変更を実行しますか?"));
\r
845 if (ret != QMessageBox::Yes) {
\r
850 RenameWorker *worker = new RenameWorker();
\r
851 worker->setRenameMap(&dlg->renameMap());
\r
853 OperationDialog opDlg(this);
\r
854 opDlg.setWindowTitle(tr("名前を変更"));
\r
855 opDlg.setWorker(worker);
\r
856 opDlg.setAutoClose(settings.value(IniKey_AutoCloseRename).toBool());
\r
861 QFileInfo info(dlg->renameMap().first());
\r
862 view->searchItem(info.fileName());
\r
864 settings.setValue(IniKey_AutoCloseRename, opDlg.autoClose());
\r
867 void MainWindow::shellExecute()
\r
869 qDebug() << "MainWindow::shellExecute";
\r
871 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
874 foreach (const QFileInfo &info, view->selectedItems()) {
\r
875 QString path = QDir::toNativeSeparators(info.absoluteFilePath());
\r
876 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
880 void MainWindow::showBookmarkDialog()
\r
882 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
885 BookmarkDialog dlg(this);
\r
886 dlg.setEditMode(false);
\r
887 if (dlg.exec() == QDialog::Accepted) {
\r
888 int n = dlg.selectedIndex();
\r
890 QSettings settings;
\r
891 view->setPath(settings.value(IniKey_BookmarkEntryPath(n)).toString(), true);
\r
895 void MainWindow::editBookmark()
\r
897 qDebug() << "MainWindow::showBookmarkDialog();";
\r
899 BookmarkDialog dlg(this);
\r
900 dlg.setEditMode(true);
\r
902 if (dlg.exec() == QDialog::Accepted) {
\r
907 void MainWindow::showFilterDialog()
\r
909 qDebug() << "MainWindow::showFilterDialog();";
\r
911 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
914 QString filters = view->nameFilters().join(" ");
\r
916 QInputDialog dlg(this);
\r
917 dlg.setInputMode(QInputDialog::TextInput);
\r
918 dlg.setWindowTitle(tr("フィルタを設定"));
\r
919 dlg.setLabelText(tr("フィルタ:"));
\r
920 dlg.setTextValue(filters);
\r
921 dlg.resize(width() * 0.8, dlg.height());
\r
923 if (dlg.exec() == QDialog::Accepted) {
\r
924 static_cast<FolderPanel*>(view->parent())->setNameFilters(dlg.textValue());
\r
925 int row = view->currentIndex().row();
\r
929 if (row >= view->model()->rowCount()) {
\r
930 row = view->model()->rowCount() - 1;
\r
932 // view->selectRow(row);
\r
933 view->setCurrentIndex(view->model()->index(row, 1));
\r
938 void MainWindow::showHistoryDialog()
\r
940 qDebug() << "MainWindow::showHistoryDialog();";
\r
942 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
945 FolderView *vOther = otherSideFolderView(view);
\r
947 HistoryDialog dlg(this);
\r
948 if (view->side() == "Left") {
\r
949 dlg.setDefaultLeft(true);
\r
950 dlg.setHistory(view->history(), vOther->history());
\r
953 dlg.setDefaultLeft(false);
\r
954 dlg.setHistory(vOther->history(), view->history());
\r
957 if (dlg.exec() == QDialog::Accepted) {
\r
958 if (view->side() == dlg.selectedSide()) {
\r
959 view->setHistoryIndexAt(dlg.selectedIndex());
\r
962 view->setPath(vOther->history()->at(dlg.selectedIndex()), true);
\r
967 void MainWindow::showSortDialog()
\r
969 qDebug() << "MainWindow::showSortDialog();";
\r
971 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
974 SortDialog dlg(this);
\r
975 dlg.setRightOrLeft(view->side());
\r
977 if (dlg.exec() == QDialog::Accepted) {
\r
978 view->setSorting();
\r
983 void MainWindow::swapView()
\r
985 qDebug() << "MainWindow::swapView();";
\r
987 QString dir1 = ui->pane1->folderPanel()->folderView()->dir();
\r
988 QString dir2 = ui->pane2->folderPanel()->folderView()->dir();
\r
990 ui->pane1->folderPanel()->folderView()->setPath(dir2, true);
\r
991 ui->pane2->folderPanel()->folderView()->setPath(dir1, true);
\r
996 void MainWindow::switchHalfMode(bool checked)
\r
998 qDebug() << "MainWindow::switchHalfMode();" << checked;
\r
1000 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
1001 Q_CHECK_PTR(view);
\r
1003 AnyView *pane = static_cast<AnyView*>(
\r
1004 otherSideFolderView(view)->parent()->parent());
\r
1005 Q_CHECK_PTR(pane);
\r
1009 setViewMode(ModeHalfView);
\r
1010 pane->setViewItem(view->currentItem());
\r
1014 setViewMode(ModeBasic);
\r
1015 pane->changeView(AnyView::ViewFolder);
\r
1020 //void MainWindow::searchItem(const QString &text)
\r
1022 // qDebug() << "MainWindow::searchItem" << text;
\r
1024 // SearchBox *box = qobject_cast<SearchBox*>(qApp->focusWidget());
\r
1025 // Q_CHECK_PTR(box);
\r
1027 // if (text.right(1) == "/") {
\r
1028 // // '/'が入力されたら、検索終了
\r
1029 // box->setText(text.left(text.length() - 1));
\r
1030 // ui->action_Search->setChecked(false);
\r
1033 // FolderPanel *fp = qobject_cast<FolderPanel*>(box->parent());
\r
1034 // Q_CHECK_PTR(fp);
\r
1036 // fp->folderView()->searchItem(box->text());
\r
1040 void MainWindow::searchNext()
\r
1042 qDebug() << "MainWindow::searchNext";
\r
1044 SearchBox *box = qobject_cast<SearchBox*>(qApp->focusWidget());
\r
1047 FolderPanel *fp = qobject_cast<FolderPanel*>(box->parent());
\r
1050 fp->folderView()->searchNext(box->text());
\r
1053 void MainWindow::searchPrev()
\r
1055 qDebug() << "MainWindow::searchPrev";
\r
1057 SearchBox *box = qobject_cast<SearchBox*>(qApp->focusWidget());
\r
1060 FolderPanel *fp = qobject_cast<FolderPanel*>(box->parent());
\r
1063 fp->folderView()->searchPrev(box->text());
\r
1066 void MainWindow::setCursorToBegin()
\r
1068 qDebug() << "MainWindow::setCursorToBegin();";
\r
1070 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);
\r
1071 QApplication::sendEvent(QApplication::focusWidget(), &event1);
\r
1073 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);
\r
1074 QApplication::sendEvent(QApplication::focusWidget(), &event2);
\r
1077 void MainWindow::cursorDown()
\r
1079 qDebug() << "MainWindow::cursorDown();";
\r
1081 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);
\r
1082 QApplication::sendEvent(QApplication::focusWidget(), &event);
\r
1085 void MainWindow::cursorUp()
\r
1087 qDebug() << "MainWindow::cursorUp();";
\r
1089 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
\r
1090 QApplication::sendEvent(QApplication::focusWidget(), &event);
\r
1093 void MainWindow::setCursorToEnd()
\r
1095 qDebug() << "MainWindow::setCursorToEnd();";
\r
1097 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);
\r
1098 QApplication::sendEvent(QApplication::focusWidget(), &event1);
\r
1100 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);
\r
1101 QApplication::sendEvent(QApplication::focusWidget(), &event2);
\r
1104 void MainWindow::setFontSizeDown()
\r
1106 qDebug() << "MainWindow::setFontSizeDown();";
\r
1108 changeFontSize(-1);
\r
1111 void MainWindow::setFontSizeUp()
\r
1113 qDebug() << "MainWindow::setFontSizeUp();";
\r
1115 changeFontSize(1);
\r
1118 void MainWindow::changeFontSize(int diff)
\r
1120 qDebug() << "MainWindow::changeFontSize(;";
\r
1122 QSettings settings;
\r
1125 // フォルダビューのフォントサイズ変更
\r
1126 if (ui->pane1->folderPanel()->folderView()->hasFocus() ||
\r
1127 ui->pane2->folderPanel()->folderView()->hasFocus())
\r
1129 font = settings.value(IniKey_ViewFont).value<QFont>();
\r
1130 font.setPointSize(font.pointSize() + diff);
\r
1131 settings.setValue(IniKey_ViewFont, font);
\r
1133 ui->pane1->folderPanel()->folderView()->updateAppearance();
\r
1134 ui->pane2->folderPanel()->folderView()->updateAppearance();
\r
1137 // テキストビューのフォントサイズ変更
\r
1138 if (ui->pane1->textView()->hasFocus() ||
\r
1139 ui->pane2->textView()->hasFocus() ||
\r
1140 ui->pane3->textView()->hasFocus())
\r
1142 font = settings.value(IniKey_ViewerFont).value<QFont>();
\r
1143 font.setPointSize(font.pointSize() + diff);
\r
1144 settings.setValue(IniKey_ViewerFont, font);
\r
1146 ui->pane1->textView()->updateAppearance();
\r
1147 ui->pane2->textView()->updateAppearance();
\r
1148 ui->pane3->textView()->updateAppearance();
\r
1151 if (ui->pane1->imageView()->hasFocus() ||
\r
1152 ui->pane2->imageView()->hasFocus() ||
\r
1153 ui->pane3->imageView()->hasFocus())
\r
1155 ui->pane1->imageView()->changeScale(diff > 0);
\r
1156 ui->pane2->imageView()->changeScale(diff > 0);
\r
1157 ui->pane3->imageView()->changeScale(diff > 0);
\r
1161 void MainWindow::initBookmark()
\r
1163 QSettings settings;
\r
1164 QFileIconProvider iconProvider;
\r
1166 ui->menu_Bookmark->clear();
\r
1167 ui->menu_Bookmark->addAction(ui->bookmark_Edit);
\r
1168 ui->menu_Bookmark->addSeparator();
\r
1170 while (!settings.value(IniKey_BookmarkEntryName(i), "").toString().isEmpty()) {
\r
1171 QString path = settings.value(IniKey_BookmarkEntryPath(i)).toString();
\r
1172 QAction *action = new QAction(this);
\r
1173 action->setText(settings.value(IniKey_BookmarkEntryName(i)).toString());
\r
1174 action->setData(i);
\r
1175 action->setIcon(iconProvider.icon(QFileInfo(path)));
\r
1176 ui->menu_Bookmark->addAction(action);
\r
1177 connect(action, SIGNAL(triggered()), this, SLOT(openBookmark()));
\r
1182 void MainWindow::setPathFromOther()
\r
1184 qDebug() << "MainWindow::setPathFromOther();";
\r
1186 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
1187 Q_CHECK_PTR(view);
\r
1189 FolderView *other = otherSideFolderView(view);
\r
1191 view->setPath(other->dir(), true);
\r
1194 void MainWindow::setPathToHome()
\r
1196 qDebug() << "MainWindow::setPathToHome();";
\r
1198 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
1199 Q_CHECK_PTR(view);
\r
1201 view->setPath(QDir::homePath(), true);
\r
1204 void MainWindow::setPathToOther()
\r
1206 qDebug() << "MainWindow::setPathToOther();";
\r
1208 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
1209 Q_CHECK_PTR(view);
\r
1211 FolderView *other = otherSideFolderView(view);
\r
1213 other->setPath(view->dir(), true);
\r
1216 void MainWindow::setPathToParent()
\r
1218 qDebug() << "MainWindow::setPathToParent();";
\r
1220 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
1221 Q_CHECK_PTR(view);
\r
1223 QDir dir(view->dir());
\r
1224 if (!dir.isRoot()) {
\r
1226 view->setPath(dir.absolutePath(), true);
\r
1230 void MainWindow::setPathToRoot()
\r
1232 qDebug() << "MainWindow::setPathToRoot();";
\r
1234 FolderView *view = static_cast<FolderView*>(qApp->focusWidget());
\r
1235 Q_CHECK_PTR(view);
\r
1237 view->setPath(QDir::rootPath(), true);
\r
1240 void MainWindow::toggleSearchBox(bool checked)
\r
1242 qDebug() << "MainWindow::toggleSearchBox" << checked;
\r
1248 setViewMode(m_viewMode | ModeSearch);
\r
1249 view = static_cast<FolderView*>(qApp->focusWidget());
\r
1250 Q_CHECK_PTR(view);
\r
1252 box = view->parent()->findChild<SearchBox*>("searchBox");
\r
1255 box->setVisible(true);
\r
1260 setViewMode(m_viewMode ^ ModeSearch);
\r
1261 if (ui->pane1->folderPanel()->searchBox()->isVisible()) {
\r
1262 box = ui->pane1->folderPanel()->searchBox();
\r
1263 view = ui->pane1->folderPanel()->folderView();
\r
1266 Q_ASSERT(ui->pane2->folderPanel()->searchBox()->isVisible());
\r
1267 box = ui->pane2->folderPanel()->searchBox();
\r
1268 view = ui->pane2->folderPanel()->folderView();
\r
1271 if (box->hasFocus()) {
\r
1274 box->setVisible(false);
\r
1278 void MainWindow::showPreferenceDialog()
\r
1280 qDebug() << "MainWindow::showPreferenceDialog";
\r
1282 PreferenceDialog dlg(this);
\r
1283 if (dlg.exec() == QDialog::Accepted) {
\r
1284 ui->pane1->folderPanel()->locationBox()->updateAppearance();
\r
1285 ui->pane2->folderPanel()->locationBox()->updateAppearance();
\r
1286 ui->pane1->folderPanel()->folderView()->updateAppearance();
\r
1287 ui->pane2->folderPanel()->folderView()->updateAppearance();
\r
1288 ui->pane1->textView()->updateAppearance();
\r
1289 ui->pane2->textView()->updateAppearance();
\r
1290 ui->pane3->textView()->updateAppearance();
\r
1296 void MainWindow::toggleShowHiddenFiles(bool checked)
\r
1298 qDebug() << "MainWindow::toggleShowHiddenFiles" << checked;
\r
1300 ui->pane1->folderPanel()->folderView()->setFilter(QDir::Hidden, checked);
\r
1301 ui->pane1->folderPanel()->folderView()->refresh();
\r
1303 ui->pane2->folderPanel()->folderView()->setFilter(QDir::Hidden, checked);
\r
1304 ui->pane2->folderPanel()->folderView()->refresh();
\r
1307 void MainWindow::toggleShowSystemFiles(bool checked)
\r
1309 qDebug() << "MainWindow::toggleShowSystemFiles" << checked;
\r
1311 ui->pane1->folderPanel()->folderView()->setFilter(QDir::System, checked);
\r
1312 ui->pane1->folderPanel()->folderView()->refresh();
\r
1314 ui->pane2->folderPanel()->folderView()->setFilter(QDir::System, checked);
\r
1315 ui->pane2->folderPanel()->folderView()->refresh();
\r
1318 void MainWindow::showContextMenu(QContextMenuEvent *event)
\r
1320 qDebug() << "MainWindow::showContextMenu();";
\r
1322 FolderView *view = static_cast<FolderView*>(sender());
\r
1323 Q_CHECK_PTR(view);
\r
1325 QModelIndex index = view->indexAt(event->pos());
\r
1328 if (index.isValid()) {
\r
1329 menu.addAction(ui->action_Open);
\r
1330 menu.addAction(ui->action_Exec);
\r
1331 menu.addAction(ui->action_OpenEditor);
\r
1332 menu.addAction(ui->action_OpenTerminal);
\r
1333 menu.addSeparator();
\r
1334 menu.addAction(ui->cmd_Copy);
\r
1335 menu.addAction(ui->cmd_Move);
\r
1336 menu.addSeparator();
\r
1337 menu.addAction(ui->cmd_Delete);
\r
1338 menu.addSeparator();
\r
1339 menu.addAction(ui->copy_Filename);
\r
1340 menu.addAction(ui->copy_Fullpath);
\r
1341 menu.addSeparator();
\r
1342 menu.addAction(ui->cmd_Rename);
\r
1345 menu.addAction(ui->move_Back);
\r
1346 menu.addAction(ui->move_Forward);
\r
1347 menu.addSeparator();
\r
1348 menu.addAction(ui->move_Parent);
\r
1349 menu.addAction(ui->move_Home);
\r
1350 menu.addAction(ui->move_Root);
\r
1351 menu.addAction(ui->move_Jump);
\r
1352 menu.addSeparator();
\r
1353 menu.addAction(ui->cmd_NewFile);
\r
1354 menu.addAction(ui->cmd_NewFolder);
\r
1357 menu.exec(event->globalPos());
\r
1360 void MainWindow::checkUpdate(bool silent)
\r
1362 qDebug() << "MainWindow::checkUpdate()" << silent;
\r
1364 QNetworkAccessManager *manager = new QNetworkAccessManager(this);
\r
1367 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));
\r
1370 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinished(QNetworkReply*)));
\r
1373 manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_win.html")));
\r
1374 #elif defined(Q_OS_MAC)
\r
1375 manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_mac.html")));
\r
1379 void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)
\r
1381 qDebug() << "MainWindow::checkUpdateFinishedSilent";
\r
1383 checkUpdateFinished(reply, true);
\r
1386 void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)
\r
1388 qDebug() << "MainWindow::checkUpdateFinished" << silent;
\r
1390 if (reply->error() == QNetworkReply::NoError) {
\r
1391 QString str = reply->readAll();
\r
1392 str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);
\r
1393 QRegExp rx("Gefu([0-9]+)");
\r
1395 QString version = rx.cap(1);
\r
1396 if (version.toInt() > VERSION_VALUE * 100) {
\r
1397 QMessageBox::information(
\r
1399 tr("最新のバージョンが存在します。<br/>") +
\r
1400 tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));
\r
1402 else if (!silent) {
\r
1403 QMessageBox::information(
\r
1405 tr("お使いのバージョンは最新です。"));
\r
1408 else if (!silent){
\r
1409 QMessageBox::critical(
\r
1411 tr("最新バージョンのチェックに失敗しました。<br/>") +
\r
1412 reply->errorString());
\r
1416 void MainWindow::viewFinish()
\r
1418 qDebug() << "MainWindow::viewFinish();" << sender()->objectName();
\r
1420 ui->statusBar->findChild<QLabel*>("Right")->setText("");
\r
1421 ui->pane3->setVisible(false);
\r
1422 ui->splitter->setVisible(true);
\r
1423 m_focusedView->setFocus();
\r
1426 void MainWindow::initActionConnections()
\r
1428 qDebug() << "MainWindow::initActionConnections";
\r
1430 connect(ui->key_Left, SIGNAL(triggered()), this, SLOT(leftKeyPress()));
\r
1431 connect(ui->key_Right, SIGNAL(triggered()), this, SLOT(rightKeyPress()));
\r
1433 connect(ui->action_Command, SIGNAL(triggered()), this, SLOT(executeCommand()));
\r
1434 connect(ui->action_Exec, SIGNAL(triggered()), this, SLOT(shellExecute()));
\r
1435 connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(open()));
\r
1436 connect(ui->action_OpenEditor, SIGNAL(triggered()), this, SLOT(openEditor()));
\r
1437 connect(ui->action_OpenTerminal, SIGNAL(triggered()), this, SLOT(openTerminal()));
\r
1438 connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));
\r
1439 connect(ui->action_Search, SIGNAL(toggled(bool)), this, SLOT(toggleSearchBox(bool)));
\r
1440 connect(ui->action_SearchNext, SIGNAL(triggered()), this, SLOT(searchNext()));
\r
1441 connect(ui->action_SearchPrev, SIGNAL(triggered()), this, SLOT(searchPrev()));
\r
1442 connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));
\r
1443 connect(ui->check_Update, SIGNAL(triggered()), this, SLOT(checkUpdate()));
\r
1444 connect(ui->cmd_Copy, SIGNAL(triggered()), this, SLOT(copyItems()));
\r
1445 connect(ui->cmd_Delete, SIGNAL(triggered()), this, SLOT(deleteItems()));
\r
1446 connect(ui->cmd_Move, SIGNAL(triggered()), this, SLOT(moveItems()));
\r
1447 connect(ui->cmd_NewFile, SIGNAL(triggered()), this, SLOT(createFile()));
\r
1448 connect(ui->cmd_NewFolder, SIGNAL(triggered()), this, SLOT(createFolder()));
\r
1449 connect(ui->cmd_Rename, SIGNAL(triggered()), this, SLOT(renameItems()));
\r
1450 connect(ui->copy_Filename, SIGNAL(triggered()), this, SLOT(copyFilenameToClipboard()));
\r
1451 connect(ui->copy_Fullpath, SIGNAL(triggered()), this, SLOT(copyFullpathTpClipboard()));
\r
1452 connect(ui->help_About, SIGNAL(triggered()), this, SLOT(about()));
\r
1453 connect(ui->mark_All, SIGNAL(triggered()), this, SLOT(markAll()));
\r
1454 connect(ui->mark_AllFiles, SIGNAL(triggered()), this, SLOT(markAllFiles()));
\r
1455 connect(ui->mark_AllOff, SIGNAL(triggered()), this, SLOT(markAllOff()));
\r
1456 connect(ui->mark_Invert, SIGNAL(triggered()), this, SLOT(markInvert()));
\r
1457 connect(ui->mark_Toggle, SIGNAL(triggered()), this, SLOT(markToggle()));
\r
1458 connect(ui->move_Back, SIGNAL(triggered()), this, SLOT(historyBack()));
\r
1459 connect(ui->move_Begin, SIGNAL(triggered()), this, SLOT(setCursorToBegin()));
\r
1460 connect(ui->move_Down, SIGNAL(triggered()), this, SLOT(cursorDown()));
\r
1461 connect(ui->move_End, SIGNAL(triggered()), this, SLOT(setCursorToEnd()));
\r
1462 connect(ui->move_Forward, SIGNAL(triggered()), this, SLOT(historyForward()));
\r
1463 connect(ui->move_History, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));
\r
1464 connect(ui->move_Home, SIGNAL(triggered()), this, SLOT(setPathToHome()));
\r
1465 connect(ui->move_Jump, SIGNAL(triggered()), this, SLOT(chooseFolder()));
\r
1466 connect(ui->move_Parent, SIGNAL(triggered()), this, SLOT(setPathToParent()));
\r
1467 connect(ui->move_Root, SIGNAL(triggered()), this, SLOT(setPathToRoot()));
\r
1468 connect(ui->move_Up, SIGNAL(triggered()), this, SLOT(cursorUp()));
\r
1469 connect(ui->view_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));
\r
1470 connect(ui->view_FontSizeDown, SIGNAL(triggered()), this, SLOT(setFontSizeDown()));
\r
1471 connect(ui->view_FontSizeUp, SIGNAL(triggered()), this, SLOT(setFontSizeUp()));
\r
1472 connect(ui->view_FromOther, SIGNAL(triggered()), this, SLOT(setPathFromOther()));
\r
1473 connect(ui->view_HalfMode, SIGNAL(toggled(bool)), this, SLOT(switchHalfMode(bool)));
\r
1474 connect(ui->view_Hidden, SIGNAL(toggled(bool)), this, SLOT(toggleShowHiddenFiles(bool)));
\r
1475 connect(ui->view_Refresh, SIGNAL(triggered()), this, SLOT(refresh()));
\r
1476 connect(ui->view_Sort, SIGNAL(triggered()), this, SLOT(showSortDialog()));
\r
1477 connect(ui->view_Swap, SIGNAL(triggered()), this, SLOT(swapView()));
\r
1478 connect(ui->view_System, SIGNAL(toggled(bool)), this, SLOT(toggleShowSystemFiles(bool)));
\r
1479 connect(ui->view_ToOther, SIGNAL(triggered()), this, SLOT(setPathToOther()));
\r
1480 connect(ui->bookmark_Edit, SIGNAL(triggered()), this, SLOT(editBookmark()));
\r
1481 connect(ui->bookmark_Show, SIGNAL(triggered()), this, SLOT(showBookmarkDialog()));
\r
1484 void MainWindow::replaceVars(QString &str, const QFileInfo info)
\r
1486 qDebug() << "MainWindow::replaceVars" << str;
\r
1488 str.replace("$B", info.completeBaseName());
\r
1489 str.replace("$E", info.suffix());
\r
1490 str.replace("$F", info.fileName());
\r
1491 if (info.isDir()) {
\r
1492 str.replace("$D", info.absoluteFilePath());
\r
1495 str.replace("$D", info.absolutePath());
\r
1497 str.replace("$P", info.absoluteFilePath());
\r
1500 FolderView* MainWindow::otherSideFolderView(const FolderView *view) const
\r
1502 qDebug() << "MainWindow::otherSideFolderView()";
\r
1504 if (view == ui->pane1->folderPanel()->folderView()) {
\r
1505 return ui->pane2->folderPanel()->folderView();
\r
1508 Q_ASSERT(view == ui->pane2->folderPanel()->folderView());
\r
1509 return ui->pane1->folderPanel()->folderView();
\r
1513 void MainWindow::setViewMode(ModeFlags flags)
\r
1515 qDebug() << "MainWindow::setViewMode();" << flags;
\r
1516 m_viewMode = flags;
\r
1519 bool MainWindow::startProcess(const QString &cmd, const QString &workDir, const QString &errMsg)
\r
1521 qDebug() << "MainWindow::startProcess" << cmd << workDir << errMsg;
\r
1523 QProcess process(this);
\r
1524 process.setWorkingDirectory(workDir);
\r
1525 if (!process.startDetached(cmd)) {
\r
1526 QMessageBox::critical(this, tr("エラー"), errMsg + "<br/>" + cmd);
\r
1532 void MainWindow::updateActions()
\r
1534 qDebug() << "MainWindow::updateActions" << m_viewMode;
\r
1536 QWidget *w = qApp->focusWidget();
\r
1538 if ((view = qobject_cast<FolderView*>(w))) {
\r
1539 setEnabledAllActions(true);
\r
1540 qDebug() << ">>>>> フォルダビューの共通メニュー設定 <<<<<";
\r
1541 ui->action_SearchNext->setEnabled(false);
\r
1542 ui->action_SearchPrev->setEnabled(false);
\r
1545 QFileInfo info(view->currentItem());
\r
1546 if (info.isDir()) {
\r
1547 ui->action_Open->setIcon(QIcon(":/images/Open.png"));
\r
1548 ui->action_Open->setText(tr("開く"));
\r
1549 ui->action_Open->setToolTip(tr("開く"));
\r
1552 ui->action_Open->setIcon(QIcon(":/images/Search text.png"));
\r
1553 ui->action_Open->setText(tr("内蔵ビューアで開く"));
\r
1554 ui->action_Open->setToolTip(tr("内蔵ビューアで開く"));
\r
1556 QSettings settings;
\r
1557 if (!settings.value(IniKey_ViewerForceOpen).toBool()) {
\r
1558 QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");
\r
1559 foreach (const QString &ext, list) {
\r
1560 if (ext.toLower() == info.suffix().toLower()) {
\r
1561 ui->action_Open->setEnabled(false);
\r
1568 if (info.fileName() == "..") {
\r
1570 ui->cmd_Copy->setEnabled(false);
\r
1571 ui->cmd_Delete->setEnabled(false);
\r
1572 ui->cmd_Move->setEnabled(false);
\r
1573 ui->cmd_Rename->setEnabled(false);
\r
1576 if (m_viewMode & ModeBasic) {
\r
1577 qDebug() << ">>>>> 通常モードのメニュー設定 <<<<<";
\r
1578 ui->action_SearchNext->setEnabled(false);
\r
1579 ui->action_SearchPrev->setEnabled(false);
\r
1581 ui->move_Back->setEnabled(!view->history()->isBegin());
\r
1582 ui->move_Forward->setEnabled(!view->history()->isEnd());
\r
1584 QSettings settings;
\r
1585 ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());
\r
1586 ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());
\r
1589 else if (!otherSideFolderView(view)->isVisible()) {
\r
1590 qDebug() << ">>>>> ハーフモードのメニュー設定 <<<<<";
\r
1591 ui->view_FromOther->setEnabled(false);
\r
1592 ui->view_ToOther->setEnabled(false);
\r
1593 ui->cmd_Copy->setEnabled(false);
\r
1594 ui->cmd_Move->setEnabled(false);
\r
1597 else if (qobject_cast<SearchBox*>(w)) {
\r
1598 qDebug() << ">>>>> 検索モードのメニュー設定 <<<<<";
\r
1599 setEnabledAllActions(false);
\r
1600 ui->action_Search->setEnabled(true);
\r
1601 ui->action_SearchNext->setEnabled(true);
\r
1602 ui->action_SearchPrev->setEnabled(true);
\r
1603 ui->help_About->setEnabled(true);
\r
1605 else if (qobject_cast<SimpleImageView*>(w) ||
\r
1606 qobject_cast<SimpleTextView*>(w))
\r
1608 qDebug() << ">>>>> ビューアモードのメニュー設定 <<<<<";
\r
1609 setEnabledAllActions(false);
\r
1610 ui->action_Quit->setEnabled(true);
\r
1611 ui->action_Setting->setEnabled(true);
\r
1612 ui->check_Update->setEnabled(true);
\r
1613 ui->view_FontSizeDown->setEnabled(true);
\r
1614 ui->view_FontSizeUp->setEnabled(true);
\r
1615 ui->move_Begin->setEnabled(true);
\r
1616 ui->move_Down->setEnabled(true);
\r
1617 ui->move_End->setEnabled(true);
\r
1618 ui->move_Up->setEnabled(true);
\r
1619 ui->help_About->setEnabled(true);
\r
1620 ui->key_Left->setEnabled(true);
\r
1621 ui->key_Right->setEnabled(true);
\r
1622 if (m_viewMode & ModeHalfView) {
\r
1623 ui->view_HalfMode->setEnabled(true);
\r
1628 void MainWindow::setEnabledAllActions(bool enable)
\r
1630 qDebug() << "MainWindow::setEnabledAllActions();" << enable;
\r
1631 foreach (QObject *obj, children()) {
\r
1632 QAction *action = qobject_cast<QAction*>(obj);
\r
1634 action->setEnabled(enable);
\r
1639 void MainWindow::about()
\r
1641 qDebug() << ">>>>> about <<<<<";
\r
1643 QMessageBox::about(
\r
1646 tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +
\r
1647 tr("<center>Gefu is an Experimental File Utility.<br/>"
\r
1648 "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"
\r
1649 "<p>最新版の情報は<a href='https://sourceforge.jp/projects/gefu/'>プロジェクトサイト</a>で公開しています。</p>"
\r
1650 "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));
\r
1653 void MainWindow::closeEvent(QCloseEvent *event)
\r
1655 qDebug() << "MainWindow::closeEvent();";
\r
1656 qDebug() << ">>>>> アプリケーションの終了要求 <<<<<";
\r
1657 QSettings settings;
\r
1659 if (settings.value(IniKey_ConfirmExit).toBool()) {
\r
1660 QMessageBox msgBox;
\r
1661 QCheckBox *checkBox = new QCheckBox();
\r
1662 checkBox->setText(tr("次回以降は確認しない"));
\r
1663 msgBox.setCheckBox(checkBox);
\r
1664 msgBox.setText(tr("終了しますか?"));
\r
1665 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
\r
1666 msgBox.setIcon(QMessageBox::Question);
\r
1668 if (msgBox.exec() == QMessageBox::No) {
\r
1669 qDebug() << ">>>>> ユーザによりキャンセルされました <<<<<";
\r
1673 settings.setValue(IniKey_ConfirmExit, !checkBox->isChecked());
\r
1676 settings.setValue(QString("Left/") + IniKey_Dir, ui->pane1->folderPanel()->folderView()->dir());
\r
1677 settings.setValue(QString("Right/") + IniKey_Dir, ui->pane2->folderPanel()->folderView()->dir());
\r
1678 settings.setValue(IniKey_ShowHidden, ui->view_Hidden->isChecked());
\r
1679 settings.setValue(IniKey_ShowSystem, ui->view_System->isChecked());
\r
1680 settings.setValue(IniKey_WindowGeometry, saveGeometry());
\r
1681 settings.setValue(iniKey_WindowState, saveState());
\r
1682 QMainWindow::closeEvent(event);
\r
1686 void MainWindow::keyPressEvent(QKeyEvent *event)
\r
1688 QString ksq = KeyEventToSequence(event);
\r
1690 qDebug() << ">>>>> キーイベントを受信(MainWindow)" << ksq << "<<<<<";
\r
1692 if (ProcessShortcut(ksq, this)) {
\r
1697 QMainWindow::keyPressEvent(event);
\r