3 #include "mainwindow.h"
\r
4 #include "preferencedialog.h"
\r
5 #include "folderview.h"
\r
6 #include "searchbox.h"
\r
7 #include "locationbox.h"
\r
8 #include "ui_mainwindow.h"
\r
9 #include "copymoveworker.h"
\r
10 #include "operationdialog.h"
\r
11 #include "overwritedialog.h"
\r
12 #include "deleteworker.h"
\r
13 #include "renameworker.h"
\r
14 #include "renamesingledialog.h"
\r
15 #include "renamemultidialog.h"
\r
16 #include "historydialog.h"
\r
17 #include "sortdialog.h"
\r
18 #include "simpletextview.h"
\r
20 #include <QCheckBox>
\r
21 #include <QCloseEvent>
\r
23 #include <QDesktopWidget>
\r
24 #include <QMessageBox>
\r
25 #include <QSettings>
\r
26 #include <QNetworkAccessManager>
\r
27 #include <QNetworkReply>
\r
28 #include <QInputDialog>
\r
30 #include <QDesktopServices>
\r
31 #include <QClipboard>
\r
32 #include <QFileDialog>
\r
33 #include <folderpanel.h>
\r
35 MainWindow* getMainWnd()
\r
37 foreach (QWidget *w, qApp->topLevelWidgets()) {
\r
38 if (w->objectName() == "MainWindow") {
\r
39 return static_cast<MainWindow*>(w);
\r
42 qDebug() << "MainWindow not found !?";
\r
46 MainWindow::MainWindow(QWidget *parent) :
\r
47 QMainWindow(parent),
\r
48 ui(new Ui::MainWindow),
\r
49 m_focusedView(NULL),
\r
50 m_overwriteDialog(NULL)
\r
54 m_overwriteDialog = new OverWriteDialog(this);
\r
56 initActionConnections();
\r
57 connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(focusChange(QWidget*,QWidget*)));
\r
58 connect(ui->pane3->textView(), SIGNAL(viewFinished(QWidget*)), this, SLOT(viewFinish(QWidget*)));
\r
61 ui->pane3->setVisible(false);
\r
63 for (int i = 1; i <= 2; i++) {
\r
64 AnyView *anyView = findChild<AnyView*>(QString("pane%1").arg(i));
\r
65 Q_CHECK_PTR(anyView);
\r
67 FolderPanel *fp = anyView->findChild<FolderPanel*>("folderPanel");
\r
69 fp->setObjectName(QString("folderPanel%1").arg(i));
\r
71 LocationBox *locationBox = fp->locationBox();
\r
72 FolderView *folderView = fp->folderView();
\r
73 SearchBox *searchBox = fp->serachBox();
\r
76 folderView->setObjectName("folderView1");
\r
79 folderView->setObjectName("folderView2");
\r
83 connect(folderView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(open(QModelIndex)));
\r
84 connect(folderView, SIGNAL(dataChanged()), this, SLOT(dataChange()));
\r
85 connect(folderView, SIGNAL(dropAccepted(QFileInfoList)), this, SLOT(dropAccept(QFileInfoList)));
\r
86 connect(folderView, SIGNAL(currentChanged(QFileInfo)), this, SLOT(currentChange(QFileInfo)));
\r
87 connect(folderView, SIGNAL(itemFound()), this, SLOT(itemFound()));
\r
88 connect(folderView, SIGNAL(itemNotFound()), this, SLOT(itemNotFound()));
\r
89 // connect(folderView, SIGNAL(keyPressed(QKeyEvent*)), this, SLOT(keyPress(QKeyEvent*)));
\r
90 connect(folderView, SIGNAL(retrieveFinished()), this, SLOT(retrieveFinish()));
\r
91 connect(folderView, SIGNAL(retrieveStarted(QString)), this, SLOT(retrieveStart(QString)));
\r
92 connect(folderView, SIGNAL(requestContextMenu(QContextMenuEvent*)), this, SLOT(showContextMenu(QContextMenuEvent*)));
\r
93 connect(searchBox, SIGNAL(textEdited(QString)), this, SLOT(searchItem(QString)));
\r
94 connect(searchBox, SIGNAL(returnPressed()), this, SLOT(returnPressInSearchBox()));
\r
97 searchBox->setVisible(false);
\r
100 locationBox->initialize();
\r
103 setNameFilters(folderView);
\r
106 setSorting(folderView);
\r
109 folderView->initialize();
\r
112 QSettings settings;
\r
114 ui->view_Hidden->setChecked(settings.value(IniKey_ShowHidden).toBool());
\r
115 ui->view_System->setChecked(settings.value(IniKey_ShowSystem).toBool());
\r
116 ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());
\r
117 ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());
\r
119 // 追加のショートカットキーを設定する
\r
120 QList<QKeySequence> shortcuts;
\r
121 shortcuts = ui->action_Open->shortcuts();
\r
122 shortcuts.append(QKeySequence("M"));
\r
123 ui->action_Open->setShortcuts(shortcuts);
\r
125 shortcuts = ui->action_Exec->shortcuts();
\r
126 shortcuts.append(QKeySequence("Shift+M"));
\r
127 ui->action_Exec->setShortcuts(shortcuts);
\r
129 // MacだとShift+の形で認識されてしまうもの
\r
130 shortcuts = ui->view_FontSizeUp->shortcuts();
\r
131 shortcuts.append(QKeySequence("Shift++"));
\r
132 ui->view_FontSizeUp->setShortcuts(shortcuts);
\r
134 shortcuts = ui->view_Filter->shortcuts();
\r
135 shortcuts.append(QKeySequence("Shift+*"));
\r
136 ui->view_Filter->setShortcuts(shortcuts);
\r
138 shortcuts = ui->action_OpenTerminal->shortcuts();
\r
139 shortcuts.append(QKeySequence("Shift+>"));
\r
140 ui->action_OpenTerminal->setShortcuts(shortcuts);
\r
142 shortcuts = ui->help_About->shortcuts();
\r
143 shortcuts.append(QKeySequence("Shift+?"));
\r
144 ui->help_About->setShortcuts(shortcuts);
\r
147 setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));
\r
150 #if defined(Q_OS_MAC)
\r
151 setWindowIcon(QIcon(":/images/Gefu.icns"));
\r
153 setWindowIcon(QIcon(":/images/Gefu.png"));
\r
156 //>>>>> ウィンドウサイズと位置を設定する
\r
158 QPoint point = this->geometry().topLeft();
\r
159 QSize size = this->geometry().size();
\r
160 //>>>> 前回の位置・サイズ・状態を復元する
\r
161 if (!settings.value(IniKey_WindowGeometry, "").toString().isEmpty()) {
\r
162 restoreGeometry(settings.value(IniKey_WindowGeometry).toByteArray());
\r
163 restoreState(settings.value(iniKey_WindowState).toByteArray());
\r
165 //>>>> INIファイルの設定から復元する
\r
167 strValue = settings.value(IniKey_BootSizeSpec).toString();
\r
168 if (strValue == "sizeAbsolute") {
\r
169 size = settings.value(IniKey_BootSizeAbs).toSize();
\r
171 else if (strValue == "sizeRelative") {
\r
172 size = settings.value(IniKey_BootSizeRel).toSize();
\r
173 size.setWidth(size.width() * QApplication::desktop()->width() / 100.0);
\r
174 size.setHeight(size.height() * QApplication::desktop()->height() / 100.0);
\r
176 else if (strValue == "sizeLast") {
\r
177 size = this->geometry().size();
\r
180 strValue = settings.value(IniKey_BootPosSpec).toString();
\r
181 if (strValue == "posAbsolute") {
\r
182 point = settings.value(IniKey_BootPosAbs).toPoint();
\r
184 else if (strValue == "posRelative") {
\r
185 point = settings.value(IniKey_BootPosRel).toPoint();
\r
186 point.setX(point.x() * QApplication::desktop()->width() / 100.0);
\r
187 point.setY(point.y() * QApplication::desktop()->height() / 100.0);
\r
189 else if (strValue == "posLast") {
\r
190 point = this->geometry().topLeft();
\r
193 point.setX((QApplication::desktop()->width() - size.width()) / 2);
\r
194 point.setY((QApplication::desktop()->height() - size.height()) / 2);
\r
196 this->setGeometry(QRect(point, size));
\r
199 if (settings.value(IniKey_CheckUpdates).toBool()) {
\r
203 ui->pane2->changeView(AnyView::ViewFolder);
\r
204 ui->pane2->folderPanel()->folderView()->repaint();
\r
206 ui->pane1->changeView(AnyView::ViewFolder);
\r
207 ui->pane1->folderPanel()->folderView()->repaint();
\r
210 MainWindow::~MainWindow()
\r
215 FolderView* MainWindow::otherSideView(const FolderView *view) const
\r
217 qDebug() << "MainWindow::otherSideView()" << view->objectName();
\r
219 if (view == ui->pane1->folderPanel()->folderView()) {
\r
220 return ui->pane2->folderPanel()->folderView();
\r
223 Q_ASSERT(view == ui->pane2->folderPanel()->folderView());
\r
224 return ui->pane1->folderPanel()->folderView();
\r
227 void MainWindow::focusChange(QWidget *old, QWidget *now)
\r
230 qDebug() << "MainWindow::focusChange";
\r
232 qDebug() << "Now Focus" << now->objectName();
\r
236 (now == ui->pane1->folderPanel()->folderView() ||
\r
237 now == ui->pane2->folderPanel()->folderView()))
\r
239 ui->statusBar->showMessage(folderView()->currentItem().absoluteFilePath());
\r
243 (old == ui->pane1->folderPanel()->serachBox() ||
\r
244 old == ui->pane2->folderPanel()->serachBox()))
\r
246 old->setVisible(false);
\r
252 void MainWindow::executeCommand()
\r
254 qDebug() << "MainWindow::executeCommand";
\r
256 FolderView *v = folderView();
\r
259 QFileInfoList list = v->selectedItems();
\r
260 QString command = QString::null;
\r
261 foreach (const QFileInfo &info, list) {
\r
263 QString path = info.absoluteFilePath();
\r
265 QString path = info.fileName();
\r
267 if (info.isExecutable()) {
\r
268 command = QQ(path) + " " + command;
\r
271 command += " " + QQ(path);
\r
275 QInputDialog dlg(this);
\r
276 dlg.setInputMode(QInputDialog::TextInput);
\r
277 dlg.setWindowTitle(tr("コマンドを実行"));
\r
278 dlg.setLabelText(tr("コマンド:"));
\r
279 dlg.setTextValue(command);
\r
280 dlg.resize(width() * 0.8, dlg.height());
\r
282 int ret = dlg.exec();
\r
283 command = dlg.textValue();
\r
284 if (ret == QDialog::Accepted && !command.isEmpty()) {
\r
285 startProcess(command, v->dir(), tr("コマンドの実行に失敗しました。"));
\r
289 void MainWindow::historyBack()
\r
291 qDebug() << "MainWindow::historyBack();";
\r
293 if (folderView()->historyBack()) {
\r
298 void MainWindow::historyForward()
\r
300 qDebug() << "MainWindow::historyForward();";
\r
302 if (folderView()->historyForward()) {
\r
307 void MainWindow::itemFound()
\r
309 qDebug() << "MainWindow::itemFound";
\r
311 SearchBox *box = searchBox(static_cast<FolderView*>(sender()));
\r
312 QPalette pal = box->palette();
\r
313 pal.setColor(QPalette::Text, QPalette().text().color());
\r
314 box->setPalette(pal);
\r
317 void MainWindow::itemNotFound()
\r
319 qDebug() << "MainWindow::itemNotFound";
\r
321 SearchBox *box = searchBox(static_cast<FolderView*>(sender()));
\r
322 QPalette pal = box->palette();
\r
323 pal.setColor(QPalette::Text, Qt::red);
\r
324 box->setPalette(pal);
\r
327 void MainWindow::markAll()
\r
329 qDebug() << "MainWindow::markAll();";
\r
331 folderView()->setCheckStateAll(true);
\r
334 void MainWindow::markAllFiles()
\r
336 qDebug() << "MainWindow::markAllFiles();";
\r
338 folderView()->setCheckStateAllFiles();
\r
341 void MainWindow::markAllOff()
\r
343 qDebug() << "MainWindow::markAllOff();";
\r
345 folderView()->setCheckStateAll(false);
\r
348 void MainWindow::markInvert()
\r
350 qDebug() << "MainWindow::markInvert();";
\r
352 folderView()->invertCheckState();
\r
355 void MainWindow::markToggle()
\r
357 qDebug() << "MainWindow::markToggle();";
\r
359 folderView()->toggleCheckState(folderView()->currentIndex());
\r
362 void MainWindow::moveItems()
\r
364 qDebug() << "MainWindow::moveItems";
\r
366 FolderView *v = folderView();
\r
367 QFileInfoList list = v->selectedItems();
\r
368 if (list.isEmpty()) {
\r
372 QSettings settings;
\r
373 if (settings.value(IniKey_ConfirmMove).toBool()) {
\r
374 if (QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))
\r
375 != QMessageBox::Yes)
\r
381 // 上書き確認ダイアログを初期化する
\r
382 m_overwriteDialog->reset();
\r
385 FolderView *other = otherSideView(v);
\r
386 CopyMoveWorker *worker = new CopyMoveWorker();
\r
387 connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),
\r
388 this, SLOT(askOverWrite(QString*,QString*,QString,QString)));
\r
389 worker->setCopyList(&list);
\r
390 worker->setTargetDir(other->dir());
\r
391 worker->setMoveMode(true);
\r
393 // 進捗ダイアログを表示して、処理を開始する
\r
394 OperationDialog opDlg(this);
\r
395 opDlg.setWindowTitle(tr("移動"));
\r
396 opDlg.setWorker(worker);
\r
397 opDlg.setAutoClose(settings.value(IniKey_AutoCloseMove).toBool());
\r
401 settings.setValue(IniKey_AutoCloseMove, opDlg.autoClose());
\r
404 // ui->folderView1->refresh();
\r
405 // ui->folderView2->refresh();
\r
408 //void MainWindow::keyPress(QKeyEvent *event)
\r
410 // QString ksq = KeyEventToSequence(event);
\r
411 // if (ksq == "") {
\r
412 // event->ignore();
\r
416 // qDebug() << "MainWindow::keyPress" << ksq;
\r
418 // if (ProcessShortcut(ksq, this)) {
\r
419 // event->accept();
\r
423 // event->ignore();
\r
426 void MainWindow::leftKeyPress()
\r
428 qDebug() << "MainWindow::leftKeyPress();";
\r
430 if (ui->pane3->textView()->hasFocus()) {
\r
431 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier);
\r
432 QApplication::sendEvent(ui->pane3->textView(), &event);
\r
434 else if (ui->pane1->folderPanel()->folderView()->hasFocus()) {
\r
437 else if (ui->pane2->folderPanel()->folderView()->hasFocus()) {
\r
438 // ui->folderView1->setFocus();
\r
439 ui->pane1->setFocus();
\r
443 void MainWindow::rightKeyPress()
\r
445 qDebug() << "MainWindow::rightKeyPress();";
\r
447 if (ui->pane3->textView()->hasFocus()) {
\r
448 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier);
\r
449 QApplication::sendEvent(ui->pane3->textView(), &event);
\r
451 else if (ui->pane1->folderPanel()->folderView()->hasFocus()) {
\r
452 // ui->folderView2->setFocus();
\r
453 ui->pane2->setFocus();
\r
455 else if (ui->pane2->folderPanel()->folderView()->hasFocus()) {
\r
460 void MainWindow::returnPressInSearchBox()
\r
462 qDebug() << "MainWindow::returnPressInSearchBox";
\r
464 if (QApplication::keyboardModifiers() & Qt::ShiftModifier) {
\r
465 emit ui->action_SearchPrev->triggered();
\r
468 emit ui->action_SearchNext->triggered();
\r
472 void MainWindow::chooseFolder()
\r
474 qDebug() << "MainWindow::chooseFolder();";
\r
476 QString path = QFileDialog::getExistingDirectory(
\r
477 this, tr("フォルダを選択"), folderView()->dir());
\r
478 if (!path.isEmpty()) {
\r
479 folderView()->setPath(path, true);
\r
484 void MainWindow::copyFilenameToClipboard()
\r
486 qDebug() << "MainWindow::copyFilenameToClipboard();";
\r
488 QClipboard *clipboard = QApplication::clipboard();
\r
489 clipboard->setText(folderView()->currentItem().fileName());
\r
492 void MainWindow::copyFullpathTpClipboard()
\r
494 qDebug() << "MainWindow::copyFullpathTpClipboard();";
\r
496 QClipboard *clipboard = QApplication::clipboard();
\r
497 clipboard->setText(folderView()->currentItem().absoluteFilePath());
\r
500 void MainWindow::askOverWrite(QString *copyMethod,
\r
502 const QString &srcPath,
\r
503 const QString &tgtPath)
\r
505 qDebug() << "MainWindow::askOverWrite();";
\r
507 CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());
\r
508 if (!m_overwriteDialog->isKeepSetting() ||
\r
509 m_overwriteDialog->copyMethod() == "rbRename")
\r
511 m_overwriteDialog->setFileInfo(srcPath, tgtPath);
\r
512 if (m_overwriteDialog->exec() == QDialog::Rejected) {
\r
513 worker->requestStop();
\r
516 *copyMethod = m_overwriteDialog->copyMethod();
\r
517 *alias = m_overwriteDialog->alias();
\r
519 worker->endAsking();
\r
522 void MainWindow::currentChange(const QFileInfo &info)
\r
524 qDebug() << "MainWindow::currentChange();";
\r
526 ui->statusBar->showMessage(info.absoluteFilePath());
\r
527 if (info.isDir()) {
\r
528 ui->action_Open->setIcon(QIcon(":/images/Open.png"));
\r
529 ui->action_Open->setText(tr("開く"));
\r
530 ui->action_Open->setToolTip(tr("開く"));
\r
533 ui->action_Open->setIcon(QIcon(":/images/Search text.png"));
\r
534 ui->action_Open->setText(tr("テキストビューアで開く"));
\r
535 ui->action_Open->setToolTip(tr("テキストビューアで開く"));
\r
536 ui->action_Open->setEnabled(true);
\r
538 QSettings settings;
\r
539 if (!settings.value(IniKey_ViewerForceOpen).toBool()) {
\r
540 QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");
\r
541 foreach (const QString &ext, list) {
\r
542 if (ext.toLower() == info.suffix().toLower()) {
\r
543 ui->action_Open->setEnabled(false);
\r
550 if (ui->view_HalfMode->isChecked()) {
\r
551 FolderView *view = static_cast<FolderView*>(sender());
\r
552 if (!view->hasFocus()) {
\r
556 if (ui->pane1->folderPanel()->folderView()->hasFocus()) {
\r
557 ui->pane2->setViewItem(folderView()->currentItem());
\r
560 Q_ASSERT(ui->pane2->folderPanel()->folderView()->hasFocus());
\r
561 ui->pane1->setViewItem(folderView()->currentItem());
\r
567 void MainWindow::dataChange()
\r
569 qDebug() << "MainWindow::dataChange();";
\r
571 FolderView *view = static_cast<FolderView*>(sender());
\r
572 QFileInfoList list = view->checkedItems();
\r
573 if (list.isEmpty()) {
\r
574 showNameFilters(view);
\r
577 int numFolders = 0;
\r
580 foreach (const QFileInfo &info, list) {
\r
581 if (info.isDir()) {
\r
586 size += info.size();
\r
590 QString msg = QString::null;
\r
591 if (numFolders > 0) {
\r
592 msg += tr("%1個のフォルダ ").arg(numFolders);
\r
594 if (numFiles > 0) {
\r
595 msg += tr("%1個のファイル ").arg(numFiles);
\r
598 if (!msg.isEmpty()) {
\r
599 msg += tr("を選択 合計%1").arg(FilesizeToString(size));
\r
602 filterLabel(view)->setText(msg);
\r
606 void MainWindow::dropAccept(const QFileInfoList &list)
\r
608 copyItems(list, static_cast<FolderView*>(sender())->dir());
\r
611 void MainWindow::copyItems(const QFileInfoList &list, const QString &tgtDir)
\r
613 QSettings settings;
\r
614 if (settings.value(IniKey_ConfirmCopy).toBool()) {
\r
615 if (QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))
\r
616 != QMessageBox::Yes)
\r
622 // 上書き確認ダイアログを初期化する
\r
623 m_overwriteDialog->reset();
\r
626 CopyMoveWorker *worker = new CopyMoveWorker();
\r
627 connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),
\r
628 this, SLOT(askOverWrite(QString*,QString*,QString,QString)));
\r
629 worker->setCopyList(&list);
\r
630 worker->setTargetDir(tgtDir);
\r
631 worker->setMoveMode(false);
\r
633 // 進捗ダイアログを表示して、処理を開始する
\r
634 OperationDialog opDlg(this);
\r
635 opDlg.setWindowTitle(tr("コピー"));
\r
636 opDlg.setWorker(worker);
\r
637 opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());
\r
641 settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());
\r
644 // ui->folderView1->refresh();
\r
645 // ui->folderView2->refresh();
\r
648 void MainWindow::copyItems()
\r
650 qDebug() << "MainWindow::copyItems";
\r
652 FolderView *v = folderView();
\r
653 QFileInfoList list = v->selectedItems();
\r
654 if (list.isEmpty()) {
\r
658 FolderView *other = otherSideView(v);
\r
659 copyItems(list, other->dir());
\r
661 QSettings settings;
\r
662 if (settings.value(IniKey_ConfirmCopy).toBool()) {
\r
663 if (QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))
\r
664 != QMessageBox::Yes)
\r
670 // 上書き確認ダイアログを初期化する
\r
671 m_overwriteDialog->reset();
\r
674 FolderView *other = otherSideView(v);
\r
675 CopyMoveWorker *worker = new CopyMoveWorker();
\r
676 connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),
\r
677 this, SLOT(askOverWrite(QString*,QString*,QString,QString)));
\r
678 worker->setCopyList(&list);
\r
679 worker->setTargetDir(other->dir());
\r
680 worker->setMoveMode(false);
\r
682 // 進捗ダイアログを表示して、処理を開始する
\r
683 OperationDialog opDlg(this);
\r
684 opDlg.setWindowTitle(tr("コピー"));
\r
685 opDlg.setWorker(worker);
\r
686 opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());
\r
690 settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());
\r
693 ui->folderView1->refresh();
\r
694 ui->folderView2->refresh();
\r
698 void MainWindow::createFile()
\r
700 qDebug() << "MainWindow::createFile";
\r
703 QString name = QInputDialog::getText(
\r
704 this, tr("ファイルを作成"), tr("ファイル名:"),
\r
705 QLineEdit::Normal, "", &bOk);
\r
706 if (!bOk || name.isEmpty()) {
\r
710 QDir dir(folderView()->dir());
\r
711 QFile file(dir.absoluteFilePath(name));
\r
712 if (!file.open(QIODevice::WriteOnly)) {
\r
713 QMessageBox::critical(
\r
715 tr("ファイルの作成に失敗しました。"));
\r
720 QSettings settings;
\r
721 if (settings.value(IniKey_OpenAfterCreateFile).toBool()) {
\r
722 openEditor(dir.absoluteFilePath(name));
\r
727 void MainWindow::createFolder()
\r
729 qDebug() << "MainWindow::createFolder";
\r
732 QString name = QInputDialog::getText(
\r
733 this, tr("フォルダを作成"), tr("フォルダ名:"),
\r
734 QLineEdit::Normal, "", &bOk);
\r
735 if (!bOk || name.isEmpty()) {
\r
739 QDir dir(folderView()->dir());
\r
740 if (!dir.mkpath(name)) {
\r
741 QMessageBox::critical(
\r
743 tr("フォルダの作成に失敗しました。"));
\r
746 QSettings settings;
\r
747 if (settings.value(IniKey_MoveAfterCreateFolder).toBool()) {
\r
748 folderView()->setPath(dir.absoluteFilePath(name), true);
\r
754 void MainWindow::deleteItems()
\r
756 qDebug() << "MainWindow::deleteItems";
\r
758 FolderView *v = folderView();
\r
759 QFileInfoList list = v->selectedItems();
\r
760 if (list.isEmpty()) {
\r
764 QSettings settings;
\r
765 if (settings.value(IniKey_ConfirmDelete).toBool()) {
\r
767 if (list.size() == 1) {
\r
768 msg = list[0].fileName();
\r
771 msg = tr("%1個のアイテム").arg(list.size());
\r
773 int ret = QMessageBox::question(
\r
775 msg + tr("を削除しますか?"));
\r
776 if (ret != QMessageBox::Yes) {
\r
781 DeleteWorker *worker = new DeleteWorker();
\r
782 worker->setDeleteList(&list);
\r
784 OperationDialog opDlg(this);
\r
785 opDlg.setWindowTitle(tr("削除"));
\r
786 opDlg.setWorker(worker);
\r
787 opDlg.setAutoClose(settings.value(IniKey_AutoCloseDelete).toBool());
\r
791 settings.setValue(IniKey_AutoCloseDelete, opDlg.autoClose());
\r
794 // ui->folderView1->refresh();
\r
795 // ui->folderView2->refresh();
\r
798 void MainWindow::open(const QModelIndex &index)
\r
801 qDebug() << "MainWindow::open";
\r
803 FolderView *v = folderView();
\r
806 QFileInfo info = v->currentItem();
\r
807 if (info.isDir()) {
\r
808 v->setPath(info.absoluteFilePath(), true);
\r
813 QSettings settings;
\r
814 if (!settings.value(IniKey_ViewerForceOpen).toBool()) {
\r
815 QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");
\r
816 foreach (const QString &ext, list) {
\r
817 if (ext.toLower() == info.suffix().toLower()) {
\r
824 foreach (QObject *obj, this->children()) {
\r
825 QAction *action = qobject_cast<QAction*>(obj);
\r
827 if (action->objectName() == "help_About" ||
\r
828 action->objectName() == "check_Update" ||
\r
829 action->objectName() == "copy_Fullpath" ||
\r
830 action->objectName() == "copy_Filename" ||
\r
831 action->objectName() == "action_Quit" ||
\r
832 action->objectName() == "action_Setting")
\r
836 action->setEnabled(false);
\r
840 m_focusedView = folderView();
\r
841 ui->pane3->setViewItem(info);
\r
842 ui->splitter->setVisible(false);
\r
845 void MainWindow::openEditor(const QString &path)
\r
847 qDebug() << "MainWindow::openEditor";
\r
849 QSettings settings;
\r
850 QString exe = settings.value(IniKey_EditorPath).toString();
\r
851 if (exe.isEmpty()) {
\r
852 QMessageBox::critical(
\r
854 tr("外部エディタのパスが未定義です。"));
\r
858 FolderView *v = folderView();
\r
861 QFileInfoList list;
\r
862 if (path.isEmpty()) {
\r
863 list = v->selectedItems();
\r
869 foreach (const QFileInfo &info, list) {
\r
870 QString opt = settings.value(IniKey_EditorOption).toString();
\r
871 replaceVars(opt, info);
\r
874 QString command = "open -a " + exe + " " + opt;
\r
876 QString command = QQ(exe) + " " + opt;
\r
878 if (!startProcess(command, info.absolutePath(), tr("外部エディタの起動に失敗しました。"))) {
\r
884 void MainWindow::openTerminal()
\r
886 qDebug() << "MainWindow::openTerminal";
\r
888 QSettings settings;
\r
889 QString exe = settings.value(IniKey_TerminalPath).toString();
\r
890 if (exe.isEmpty()) {
\r
891 QMessageBox::critical(
\r
893 tr("ターミナルのパスが未定義です。"));
\r
897 FolderView *v = folderView();
\r
900 foreach (const QFileInfo &info, v->selectedItems()) {
\r
901 QString opt = settings.value(IniKey_TerminalOption).toString();
\r
902 replaceVars(opt, info);
\r
905 QString command = "open -a " + QQ(exe) + " --args " + opt;
\r
907 QString command = QQ(exe) + " " + opt;
\r
909 if (!startProcess(command, info.absolutePath(), tr("ターミナルの起動に失敗しました。"))) {
\r
915 void MainWindow::refresh()
\r
917 qDebug() << "MainWindow::refresh();";
\r
919 folderView()->refresh();
\r
923 void MainWindow::renameItems()
\r
925 qDebug() << "MainWindow::renameItems";
\r
927 FolderView *v = folderView();
\r
929 QFileInfoList list = v->selectedItems();
\r
930 if (list.isEmpty()) {
\r
934 IRenameDialog *dlg;
\r
935 if (list.size() == 1) {
\r
936 dlg = new RenameSingleDialog(this);
\r
939 dlg = new RenameMultiDialog(this);
\r
941 dlg->setWorkingDirectory(v->dir());
\r
942 dlg->setNames(list);
\r
943 int dlgResult = dlg->exec();
\r
944 if (dlgResult != QDialog::Accepted || dlg->renameMap().isEmpty()) {
\r
948 QSettings settings;
\r
949 if (settings.value(IniKey_ConfirmRename).toBool()) {
\r
950 int ret = QMessageBox::question(this, tr("確認"),
\r
951 tr("名前の変更を実行しますか?"));
\r
952 if (ret != QMessageBox::Yes) {
\r
957 RenameWorker *worker = new RenameWorker();
\r
958 worker->setRenameMap(&dlg->renameMap());
\r
960 OperationDialog opDlg(this);
\r
961 opDlg.setWindowTitle(tr("名前を変更"));
\r
962 opDlg.setWorker(worker);
\r
963 opDlg.setAutoClose(settings.value(IniKey_AutoCloseRename).toBool());
\r
967 settings.setValue(IniKey_AutoCloseRename, opDlg.autoClose());
\r
970 void MainWindow::retrieveFinish()
\r
972 qDebug() << "MainWindow::retrieveFinish();";
\r
974 ui->statusBar->showMessage(tr("レディ"), 5000);
\r
977 void MainWindow::retrieveStart(const QString &path)
\r
979 qDebug() << "MainWindow::retrieveStart();" << path;
\r
981 ui->statusBar->showMessage(tr("ファイルリストを取得しています..."));
\r
982 if (sender() == ui->pane1->folderPanel()->folderView()) {
\r
983 ui->pane1->folderPanel()->locationBox()->setText(path);
\r
986 Q_ASSERT(sender() == ui->pane2->folderPanel()->folderView());
\r
987 ui->pane2->folderPanel()->locationBox()->setText(path);
\r
991 void MainWindow::shellExecute()
\r
993 qDebug() << "MainWindow::shellExecute";
\r
995 FolderView *v = folderView();
\r
998 QFileInfoList list = v->selectedItems();
\r
999 foreach (const QFileInfo &info, list) {
\r
1000 QString path = QDir::toNativeSeparators(info.absoluteFilePath());
\r
1001 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
1005 void MainWindow::showFilterDialog()
\r
1007 qDebug() << "MainWindow::showFilterDialog();";
\r
1009 QString filters = folderView()->nameFilters().join(" ");
\r
1011 QInputDialog dlg(this);
\r
1012 dlg.setInputMode(QInputDialog::TextInput);
\r
1013 dlg.setWindowTitle(tr("フィルタを設定"));
\r
1014 dlg.setLabelText(tr("フィルタ:"));
\r
1015 dlg.setTextValue(filters);
\r
1016 dlg.resize(width() * 0.8, dlg.height());
\r
1018 if (dlg.exec() == QDialog::Accepted) {
\r
1019 setNameFilters(folderView(), dlg.textValue());
\r
1023 void MainWindow::showHistoryDialog()
\r
1025 qDebug() << "MainWindow::showHistoryDialog();";
\r
1027 FolderView *v = folderView();
\r
1028 FolderView *vOther = otherSideView(v);
\r
1030 HistoryDialog dlg(this);
\r
1031 if (v->side() == "Left") {
\r
1032 dlg.setDefaultLeft(true);
\r
1033 dlg.setHistory(v->history(), vOther->history());
\r
1036 dlg.setDefaultLeft(false);
\r
1037 dlg.setHistory(vOther->history(), v->history());
\r
1040 if (dlg.exec() == QDialog::Accepted) {
\r
1041 if (v->side() == dlg.selectedSide()) {
\r
1042 v->setHistoryIndexAt(dlg.selectedIndex());
\r
1045 v->setPath(vOther->history()->at(dlg.selectedIndex()), true);
\r
1051 void MainWindow::showSortDialog()
\r
1053 qDebug() << "MainWindow::showSortDialog();";
\r
1055 SortDialog dlg(this);
\r
1056 dlg.setRightOrLeft(folderView()->side());
\r
1058 if (dlg.exec() != QDialog::Accepted) {
\r
1062 setSorting(folderView());
\r
1065 void MainWindow::swapView()
\r
1067 qDebug() << "MainWindow::swapView();";
\r
1069 QString dir1 = ui->pane1->folderPanel()->folderView()->dir();
\r
1070 QString dir2 = ui->pane2->folderPanel()->folderView()->dir();
\r
1072 ui->pane1->folderPanel()->folderView()->setPath(dir2, true);
\r
1073 ui->pane2->folderPanel()->folderView()->setPath(dir1, true);
\r
1078 void MainWindow::switchHalfMode(bool checked)
\r
1080 qDebug() << "MainWindow::switchHalfMode();" << checked;
\r
1084 view = ui->pane1->folderPanel()->folderView();
\r
1085 if (view->hasFocus()) {
\r
1086 ui->pane2->setViewItem(view->currentItem());
\r
1088 // view->setFocus();
\r
1092 view = ui->pane2->folderPanel()->folderView();
\r
1093 if (view->hasFocus()) {
\r
1094 ui->pane1->setViewItem(view->currentItem());
\r
1096 // view->setFocus();
\r
1101 view = ui->pane1->folderPanel()->folderView();
\r
1102 if (view->isVisible()) {
\r
1103 ui->pane2->changeView(AnyView::ViewFolder);
\r
1108 view = ui->pane2->folderPanel()->folderView();
\r
1109 if (view->isVisible()) {
\r
1110 ui->pane1->changeView(AnyView::ViewFolder);
\r
1117 void MainWindow::setSorting(FolderView *view)
\r
1119 qDebug() << "MainWindow::setSorting();" << view->objectName();
\r
1121 QSettings settings;
\r
1122 QDir::SortFlags flags;
\r
1124 int sortBy = settings.value(view->side() + slash + IniKey_SortBy).toInt();
\r
1126 case SortByDate: flags |= QDir::Time; break;
\r
1127 case SortBySize: flags |= QDir::Size; break;
\r
1128 case SortByType: flags |= QDir::Type; break;
\r
1129 default: flags |= QDir::Name; break;
\r
1132 // デフォルトだと文字列は昇順で、数値は降順…orz
\r
1133 int orderBy = settings.value(view->side() + slash + IniKey_OrderBy).toInt();
\r
1134 if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||
\r
1135 ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))
\r
1137 flags |= QDir::Reversed;
\r
1140 switch (settings.value(view->side() + slash + IniKey_PutDirs).toInt()) {
\r
1141 case PutDirsFirst: flags |= QDir::DirsFirst; break;
\r
1142 case PutDirsLast: flags |= QDir::DirsLast; break;
\r
1145 if (settings.value(view->side() + slash + IniKey_IgnoreCase).toBool()) {
\r
1146 flags |= QDir::IgnoreCase;
\r
1149 view->setSorting(flags);
\r
1152 void MainWindow::showNameFilters(FolderView *view)
\r
1154 filterLabel(view)->setText(tr("フィルタ:") + view->nameFilters().join(" "));
\r
1157 void MainWindow::searchItem(const QString &text)
\r
1159 qDebug() << "MainWindow::searchItem" << text;
\r
1163 if (ui->pane1->folderPanel()->serachBox()->hasFocus()) {
\r
1164 v = ui->pane1->folderPanel()->folderView();
\r
1165 box = ui->pane1->folderPanel()->serachBox();
\r
1168 Q_ASSERT(ui->pane2->folderPanel()->serachBox()->hasFocus());
\r
1169 v = ui->pane2->folderPanel()->folderView();
\r
1170 box = ui->pane2->folderPanel()->serachBox();
\r
1173 if (text.right(1) == "/") {
\r
1174 box->setText(text.left(text.length() - 1));
\r
1175 ui->action_Search->setChecked(false);
\r
1179 v->searchItem(box->text());
\r
1182 void MainWindow::searchNext()
\r
1184 qDebug() << "MainWindow::searchNext";
\r
1186 FolderView *v = folderView();
\r
1187 SearchBox *box = searchBox(v);
\r
1188 v->searchNext(box->text());
\r
1191 void MainWindow::searchPrev()
\r
1193 qDebug() << "MainWindow::searchPrev";
\r
1195 FolderView *v = folderView();
\r
1196 SearchBox *box = searchBox(v);
\r
1197 v->searchPrev(box->text());
\r
1200 void MainWindow::setCursorToBegin()
\r
1202 qDebug() << "MainWindow::setCursorToBegin();";
\r
1204 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);
\r
1205 QApplication::sendEvent(QApplication::focusWidget(), &event);
\r
1206 // if (ui->textView->hasFocus()) {
\r
1207 // QTextCursor cursor = ui->textView->textCursor();
\r
1208 // cursor.movePosition(QTextCursor::Start);
\r
1209 // ui->textView->setTextCursor(cursor);
\r
1212 // FolderView *v = folderView();
\r
1214 // v->setCurrentIndex(v->model()->index(row, 0));
\r
1218 void MainWindow::cursorDown()
\r
1220 qDebug() << "MainWindow::cursorDown();";
\r
1222 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::DownArrow, Qt::NoModifier);
\r
1223 QApplication::sendEvent(QApplication::focusWidget(), &event);
\r
1225 // if (ui->textView->hasFocus()) {
\r
1226 // QTextCursor cursor = ui->textView->textCursor();
\r
1227 // cursor.movePosition(QTextCursor::Down);
\r
1228 // ui->textView->setTextCursor(cursor);
\r
1231 // FolderView *v = folderView();
\r
1232 // int row = v->currentIndex().row() + 1;
\r
1233 // if (row < v->model()->rowCount()) {
\r
1234 // v->setCurrentIndex(v->model()->index(row, 0));
\r
1239 void MainWindow::cursorUp()
\r
1241 qDebug() << "MainWindow::cursorUp();";
\r
1243 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
\r
1244 QApplication::sendEvent(QApplication::focusWidget(), &event);
\r
1246 // if (ui->textView->hasFocus()) {
\r
1247 // QTextCursor cursor = ui->textView->textCursor();
\r
1248 // cursor.movePosition(QTextCursor::Up);
\r
1249 // ui->textView->setTextCursor(cursor);
\r
1252 // FolderView *v = folderView();
\r
1253 // int row = v->currentIndex().row() - 1;
\r
1254 // if (row >= 0) {
\r
1255 // v->setCurrentIndex(v->model()->index(row, 0));
\r
1260 void MainWindow::setCursorToEnd()
\r
1262 qDebug() << "MainWindow::setCursorToEnd();";
\r
1264 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);
\r
1265 QApplication::sendEvent(QApplication::focusWidget(), &event);
\r
1267 // if (ui->textView->hasFocus()) {
\r
1268 // QTextCursor cursor = ui->textView->textCursor();
\r
1269 // cursor.movePosition(QTextCursor::End);
\r
1270 // ui->textView->setTextCursor(cursor);
\r
1273 // FolderView *v = folderView();
\r
1274 // int row = v->model()->rowCount() - 1;
\r
1275 // v->setCurrentIndex(v->model()->index(row, 0));
\r
1279 void MainWindow::setFontSizeDown()
\r
1281 qDebug() << "MainWindow::setFontSizeDown();";
\r
1283 changeFontSize(-1);
\r
1286 void MainWindow::setFontSizeUp()
\r
1288 qDebug() << "MainWindow::setFontSizeUp();";
\r
1289 changeFontSize(1);
\r
1292 void MainWindow::changeFontSize(int diff)
\r
1294 QSettings settings;
\r
1296 if (ui->pane1->folderPanel()->folderView()->hasFocus() ||
\r
1297 ui->pane2->folderPanel()->folderView()->hasFocus())
\r
1299 font = settings.value(IniKey_ViewFont).value<QFont>();
\r
1300 font.setPointSize(font.pointSize() + diff);
\r
1301 settings.setValue(IniKey_ViewFont, font);
\r
1303 ui->pane1->folderPanel()->folderView()->updateAppearance();
\r
1304 ui->pane2->folderPanel()->folderView()->updateAppearance();
\r
1306 if (ui->pane3->textView()->hasFocus()) {
\r
1307 font = settings.value(IniKey_ViewerFont).value<QFont>();
\r
1308 font.setPointSize(font.pointSize() + diff);
\r
1309 settings.setValue(IniKey_ViewerFont, font);
\r
1311 ui->pane3->textView()->updateAppearance();
\r
1315 void MainWindow::setPathFromOther()
\r
1317 qDebug() << "MainWindow::setPathFromOther();";
\r
1319 FolderView *view = folderView();
\r
1320 FolderView *other = otherSideView(view);
\r
1322 view->setPath(other->dir(), true);
\r
1326 void MainWindow::setPathToHome()
\r
1328 qDebug() << "MainWindow::setPathToHome();";
\r
1330 folderView()->setPath(QDir::homePath(), true);
\r
1334 void MainWindow::setPathToOther()
\r
1336 qDebug() << "MainWindow::setPathToOther();";
\r
1338 FolderView *view = folderView();
\r
1339 FolderView *other = otherSideView(view);
\r
1341 other->setPath(view->dir(), true);
\r
1345 void MainWindow::setPathToParent()
\r
1347 qDebug() << "MainWindow::setPathToParent();";
\r
1349 QDir dir(folderView()->dir());
\r
1350 if (!dir.isRoot()) {
\r
1352 folderView()->setPath(dir.absolutePath(), true);
\r
1357 void MainWindow::setPathToRoot()
\r
1359 qDebug() << "MainWindow::setPathToRoot();";
\r
1361 folderView()->setPath(QDir::rootPath(), true);
\r
1365 void MainWindow::toggleSearchBox(bool checked)
\r
1367 qDebug() << "MainWindow::toggleSearchBox" << checked;
\r
1374 if (v == ui->pane1->folderPanel()->folderView()) {
\r
1375 box = ui->pane1->folderPanel()->serachBox();
\r
1378 Q_ASSERT(v == ui->pane2->folderPanel()->folderView());
\r
1379 box = ui->pane2->folderPanel()->serachBox();
\r
1382 box->setVisible(true);
\r
1387 if (ui->pane1->folderPanel()->serachBox()->isVisible()) {
\r
1388 box = ui->pane1->folderPanel()->serachBox();
\r
1389 v = ui->pane1->folderPanel()->folderView();
\r
1392 Q_ASSERT(ui->pane2->folderPanel()->serachBox()->isVisible());
\r
1393 box = ui->pane2->folderPanel()->serachBox();
\r
1394 v = ui->pane2->folderPanel()->folderView();
\r
1397 if (box->hasFocus()) {
\r
1400 box->setVisible(false);
\r
1404 void MainWindow::openRequest(const QFileInfo &info)
\r
1406 m_focusedView = QApplication::focusWidget();
\r
1408 QFile file(info.absoluteFilePath());
\r
1409 if (file.open(QIODevice::ReadOnly)) {
\r
1410 ui->splitter->setVisible(false);
\r
1411 // ui->textView->setVisible(true);
\r
1412 // ui->textView->setFocus();
\r
1413 // ui->textView->setSource(file.readAll());
\r
1417 QMessageBox::critical(
\r
1419 tr("ファイルの読み込みに失敗しました。"));
\r
1423 void MainWindow::showPreferenceDialog()
\r
1425 qDebug() << "MainWindow::showPreferenceDialog";
\r
1427 PreferenceDialog dlg(this);
\r
1428 if (dlg.exec() == QDialog::Accepted) {
\r
1429 ui->pane1->folderPanel()->locationBox()->updateAppearance();
\r
1430 ui->pane2->folderPanel()->locationBox()->updateAppearance();
\r
1431 ui->pane1->folderPanel()->folderView()->updateAppearance();
\r
1432 ui->pane2->folderPanel()->folderView()->updateAppearance();
\r
1433 ui->pane1->textView()->updateAppearance();
\r
1434 ui->pane2->textView()->updateAppearance();
\r
1435 ui->pane3->textView()->updateAppearance();
\r
1441 void MainWindow::toggleShowHiddenFiles(bool checked)
\r
1443 qDebug() << "MainWindow::toggleShowHiddenFiles" << checked;
\r
1445 ui->pane1->folderPanel()->folderView()->setFilter(QDir::Hidden, checked);
\r
1446 ui->pane1->folderPanel()->folderView()->refresh();
\r
1448 ui->pane2->folderPanel()->folderView()->setFilter(QDir::Hidden, checked);
\r
1449 ui->pane2->folderPanel()->folderView()->refresh();
\r
1452 void MainWindow::toggleShowSystemFiles(bool checked)
\r
1454 qDebug() << "MainWindow::toggleShowSystemFiles" << checked;
\r
1456 ui->pane1->folderPanel()->folderView()->setFilter(QDir::System, checked);
\r
1457 ui->pane1->folderPanel()->folderView()->refresh();
\r
1459 ui->pane2->folderPanel()->folderView()->setFilter(QDir::System, checked);
\r
1460 ui->pane2->folderPanel()->folderView()->refresh();
\r
1463 void MainWindow::showContextMenu(QContextMenuEvent *event)
\r
1465 qDebug() << "MainWindow::showContextMenu();";
\r
1467 FolderView *view = static_cast<FolderView*>(sender());
\r
1468 QModelIndex index = view->indexAt(event->pos());
\r
1471 if (index.isValid()) {
\r
1472 menu.addAction(ui->action_Open);
\r
1473 menu.addAction(ui->action_Exec);
\r
1474 menu.addAction(ui->action_OpenEditor);
\r
1475 menu.addAction(ui->action_OpenTerminal);
\r
1476 menu.addSeparator();
\r
1477 menu.addAction(ui->copy_Filename);
\r
1478 menu.addAction(ui->copy_Fullpath);
\r
1481 menu.addAction(ui->move_Back);
\r
1482 menu.addAction(ui->move_Forward);
\r
1483 menu.addSeparator();
\r
1484 menu.addAction(ui->move_Parent);
\r
1485 menu.addAction(ui->move_Home);
\r
1486 menu.addAction(ui->move_Root);
\r
1487 menu.addAction(ui->move_Jump);
\r
1490 menu.exec(event->globalPos());
\r
1494 void MainWindow::checkUpdate(bool silent)
\r
1496 qDebug() << "MainWindow::checkUpdate()" << silent;
\r
1498 QNetworkAccessManager *manager = new QNetworkAccessManager(this);
\r
1501 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));
\r
1504 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinished(QNetworkReply*)));
\r
1507 manager->get(QNetworkRequest(QUrl("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_win.html")));
\r
1508 #elif defined(Q_OS_MAC)
\r
1509 manager->get(QNetworkRequest(QUrl("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_mac.html")));
\r
1513 void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)
\r
1515 qDebug() << "MainWindow::checkUpdateFinishedSilent";
\r
1517 checkUpdateFinished(reply, true);
\r
1520 void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)
\r
1522 qDebug() << "MainWindow::checkUpdateFinished" << silent;
\r
1524 if (reply->error() == QNetworkReply::NoError) {
\r
1525 QString str = reply->readAll();
\r
1526 str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);
\r
1527 QRegExp rx("Gefu([0-9]+)");
\r
1529 QString version = rx.cap(1);
\r
1530 if (version.toInt() > VERSION_VALUE * 100) {
\r
1531 QMessageBox::information(
\r
1533 tr("最新のバージョンが存在します。<br/>") +
\r
1534 tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));
\r
1536 else if (!silent) {
\r
1537 QMessageBox::information(
\r
1539 tr("お使いのバージョンは最新です。"));
\r
1542 else if (!silent){
\r
1543 QMessageBox::critical(
\r
1545 tr("最新バージョンのチェックに失敗しました。<br/>") +
\r
1546 reply->errorString());
\r
1550 void MainWindow::viewFinish(QWidget *sender)
\r
1552 qDebug() << "MainWindow::viewFinish();" << sender->objectName();
\r
1554 // sender->setVisible(false);
\r
1555 ui->pane3->setVisible(false);
\r
1556 ui->splitter->setVisible(true);
\r
1557 m_focusedView->setFocus();
\r
1561 void MainWindow::initActionConnections()
\r
1563 qDebug() << "MainWindow::initActionConnections";
\r
1565 connect(ui->key_Left, SIGNAL(triggered()), this, SLOT(leftKeyPress()));
\r
1566 connect(ui->key_Right, SIGNAL(triggered()), this, SLOT(rightKeyPress()));
\r
1568 connect(ui->action_Command, SIGNAL(triggered()), this, SLOT(executeCommand()));
\r
1569 connect(ui->action_Exec, SIGNAL(triggered()), this, SLOT(shellExecute()));
\r
1570 connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(open()));
\r
1571 connect(ui->action_OpenEditor, SIGNAL(triggered()), this, SLOT(openEditor()));
\r
1572 connect(ui->action_OpenTerminal, SIGNAL(triggered()), this, SLOT(openTerminal()));
\r
1573 connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));
\r
1574 connect(ui->action_Search, SIGNAL(toggled(bool)), this, SLOT(toggleSearchBox(bool)));
\r
1575 connect(ui->action_SearchNext, SIGNAL(triggered()), this, SLOT(searchNext()));
\r
1576 connect(ui->action_SearchPrev, SIGNAL(triggered()), this, SLOT(searchPrev()));
\r
1577 connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));
\r
1578 connect(ui->check_Update, SIGNAL(triggered()), this, SLOT(checkUpdate()));
\r
1579 connect(ui->cmd_Copy, SIGNAL(triggered()), this, SLOT(copyItems()));
\r
1580 connect(ui->cmd_Delete, SIGNAL(triggered()), this, SLOT(deleteItems()));
\r
1581 connect(ui->cmd_Move, SIGNAL(triggered()), this, SLOT(moveItems()));
\r
1582 connect(ui->cmd_NewFile, SIGNAL(triggered()), this, SLOT(createFile()));
\r
1583 connect(ui->cmd_NewFolder, SIGNAL(triggered()), this, SLOT(createFolder()));
\r
1584 connect(ui->cmd_Rename, SIGNAL(triggered()), this, SLOT(renameItems()));
\r
1585 connect(ui->copy_Filename, SIGNAL(triggered()), this, SLOT(copyFilenameToClipboard()));
\r
1586 connect(ui->copy_Fullpath, SIGNAL(triggered()), this, SLOT(copyFullpathTpClipboard()));
\r
1587 connect(ui->help_About, SIGNAL(triggered()), this, SLOT(about()));
\r
1588 connect(ui->mark_All, SIGNAL(triggered()), this, SLOT(markAll()));
\r
1589 connect(ui->mark_AllFiles, SIGNAL(triggered()), this, SLOT(markAllFiles()));
\r
1590 connect(ui->mark_AllOff, SIGNAL(triggered()), this, SLOT(markAllOff()));
\r
1591 connect(ui->mark_Invert, SIGNAL(triggered()), this, SLOT(markInvert()));
\r
1592 connect(ui->mark_Toggle, SIGNAL(triggered()), this, SLOT(markToggle()));
\r
1593 connect(ui->move_Back, SIGNAL(triggered()), this, SLOT(historyBack()));
\r
1594 connect(ui->move_Begin, SIGNAL(triggered()), this, SLOT(setCursorToBegin()));
\r
1595 connect(ui->move_Down, SIGNAL(triggered()), this, SLOT(cursorDown()));
\r
1596 connect(ui->move_End, SIGNAL(triggered()), this, SLOT(setCursorToEnd()));
\r
1597 connect(ui->move_Forward, SIGNAL(triggered()), this, SLOT(historyForward()));
\r
1598 connect(ui->move_History, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));
\r
1599 connect(ui->move_Home, SIGNAL(triggered()), this, SLOT(setPathToHome()));
\r
1600 connect(ui->move_Jump, SIGNAL(triggered()), this, SLOT(chooseFolder()));
\r
1601 connect(ui->move_Parent, SIGNAL(triggered()), this, SLOT(setPathToParent()));
\r
1602 connect(ui->move_Root, SIGNAL(triggered()), this, SLOT(setPathToRoot()));
\r
1603 connect(ui->move_Up, SIGNAL(triggered()), this, SLOT(cursorUp()));
\r
1604 connect(ui->view_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));
\r
1605 connect(ui->view_FontSizeDown, SIGNAL(triggered()), this, SLOT(setFontSizeDown()));
\r
1606 connect(ui->view_FontSizeUp, SIGNAL(triggered()), this, SLOT(setFontSizeUp()));
\r
1607 connect(ui->view_FromOther, SIGNAL(triggered()), this, SLOT(setPathFromOther()));
\r
1608 connect(ui->view_HalfMode, SIGNAL(toggled(bool)), this, SLOT(switchHalfMode(bool)));
\r
1609 connect(ui->view_Hidden, SIGNAL(toggled(bool)), this, SLOT(toggleShowHiddenFiles(bool)));
\r
1610 connect(ui->view_Refresh, SIGNAL(triggered()), this, SLOT(refresh()));
\r
1611 connect(ui->view_Sort, SIGNAL(triggered()), this, SLOT(showSortDialog()));
\r
1612 connect(ui->view_Swap, SIGNAL(triggered()), this, SLOT(swapView()));
\r
1613 connect(ui->view_System, SIGNAL(toggled(bool)), this, SLOT(toggleShowSystemFiles(bool)));
\r
1614 connect(ui->view_ToOther, SIGNAL(triggered()), this, SLOT(setPathToOther()));
\r
1617 FolderView *MainWindow::folderView() const
\r
1619 qDebug() << "MainWindow::folderView";
\r
1621 QWidget *w = qApp->focusWidget();
\r
1622 if (w == ui->pane1->folderPanel()->folderView() ||
\r
1623 w == ui->pane1->folderPanel()->serachBox() ||
\r
1624 w == ui->pane1->folderPanel()->locationBox())
\r
1626 return ui->pane1->folderPanel()->folderView();
\r
1629 if (w == ui->pane2->folderPanel()->folderView() ||
\r
1630 w == ui->pane2->folderPanel()->serachBox() ||
\r
1631 w == ui->pane2->folderPanel()->locationBox())
\r
1633 return ui->pane2->folderPanel()->folderView();
\r
1636 qDebug() << w->objectName();
\r
1640 void MainWindow::replaceVars(QString &str, const QFileInfo info)
\r
1642 qDebug() << "MainWindow::replaceVars" << str;
\r
1644 str.replace("$B", info.completeBaseName());
\r
1645 str.replace("$E", info.suffix());
\r
1646 str.replace("$F", info.fileName());
\r
1647 if (info.isDir()) {
\r
1648 str.replace("$D", info.absoluteFilePath());
\r
1651 str.replace("$D", info.absolutePath());
\r
1653 str.replace("$P", info.absoluteFilePath());
\r
1656 SearchBox *MainWindow::searchBox(FolderView *view) const
\r
1658 qDebug() << "MainWindow::searchBox()" << view->objectName();
\r
1660 if (view == ui->pane1->folderPanel()->folderView()) {
\r
1661 return ui->pane1->folderPanel()->serachBox();
\r
1664 Q_ASSERT(view == ui->pane1->folderPanel()->folderView());
\r
1665 return ui->pane2->folderPanel()->serachBox();
\r
1669 bool MainWindow::startProcess(const QString &cmd, const QString &workDir, const QString &errMsg)
\r
1671 qDebug() << "MainWindow::startProcess" << cmd << workDir << errMsg;
\r
1673 QProcess process(this);
\r
1674 process.setWorkingDirectory(workDir);
\r
1675 if (!process.startDetached(cmd)) {
\r
1676 QMessageBox::critical(this, tr("エラー"), errMsg + "<br/>" + cmd);
\r
1682 void MainWindow::updateActions()
\r
1684 qDebug() << "MainWindow::updateActions";
\r
1686 QWidget *w = QApplication::focusWidget();
\r
1687 if (qobject_cast<SimpleTextView*>(w) != NULL ||
\r
1688 ui->pane1->textView()->isVisible() ||
\r
1689 ui->pane2->textView()->isVisible())
\r
1692 setEnabledAllActions(false);
\r
1693 ui->action_Quit->setEnabled(true);
\r
1694 ui->action_Setting->setEnabled(true);
\r
1695 ui->check_Update->setEnabled(true);
\r
1696 ui->view_FontSizeDown->setEnabled(true);
\r
1697 ui->view_FontSizeUp->setEnabled(true);
\r
1698 ui->move_Begin->setEnabled(true);
\r
1699 ui->move_Down->setEnabled(true);
\r
1700 ui->move_End->setEnabled(true);
\r
1701 ui->move_Up->setEnabled(true);
\r
1702 ui->help_About->setEnabled(true);
\r
1703 ui->key_Left->setEnabled(true);
\r
1704 ui->key_Right->setEnabled(true);
\r
1706 if (ui->pane1->textView()->isVisible() ||
\r
1707 ui->pane2->textView()->isVisible())
\r
1709 ui->view_HalfMode->setEnabled(true);
\r
1712 else if (qobject_cast<SearchBox*>(w) != NULL) {
\r
1714 setEnabledAllActions(false);
\r
1715 ui->action_Search->setEnabled(true);
\r
1716 ui->action_SearchNext->setEnabled(true);
\r
1717 ui->action_SearchPrev->setEnabled(true);
\r
1718 ui->help_About->setEnabled(true);
\r
1720 else if (qobject_cast<FolderView*>(w) != NULL) {
\r
1722 setEnabledAllActions(true);
\r
1723 ui->action_SearchNext->setEnabled(false);
\r
1724 ui->action_SearchPrev->setEnabled(false);
\r
1726 ui->move_Back->setEnabled(!folderView()->history()->isBegin());
\r
1727 ui->move_Forward->setEnabled(!folderView()->history()->isEnd());
\r
1729 QSettings settings;
\r
1730 ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());
\r
1731 ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());
\r
1734 qDebug() << w->objectName() << "has focus.";
\r
1738 void MainWindow::setEnabledAllActions(bool enable)
\r
1740 qDebug() << "MainWindow::setEnabledAllActions();" << enable;
\r
1741 foreach (QObject *obj, children()) {
\r
1742 QAction *action = qobject_cast<QAction*>(obj);
\r
1744 action->setEnabled(enable);
\r
1749 void MainWindow::setNameFilters(FolderView *view, const QString &filters)
\r
1751 qDebug() << "MainWindow::setNameFilters();" << view->objectName() << filters;
\r
1753 QStringList list = filters.split(" ", QString::SkipEmptyParts);
\r
1754 if (list.isEmpty()) {
\r
1757 view->setNameFilters(list);
\r
1758 showNameFilters(view);
\r
1761 QLabel *MainWindow::filterLabel(const FolderView *view) const
\r
1763 qDebug() << "MainWindow::filterLabel()" << view->objectName();
\r
1764 if (view == ui->pane1->folderPanel()->folderView()) {
\r
1765 return ui->pane1->folderPanel()->filterLabel();
\r
1768 Q_ASSERT(view == ui->pane2->folderPanel()->folderView());
\r
1769 return ui->pane2->folderPanel()->filterLabel();
\r
1773 void MainWindow::about()
\r
1775 QMessageBox::about(
\r
1778 tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +
\r
1779 tr("<center>Gefu is an Experimental File Utility.<br/>"
\r
1780 "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"
\r
1781 "<p>最新版の情報は<a href='https://sourceforge.jp/projects/gefu/'>プロジェクトサイト</a>で公開しています。</p>"
\r
1782 "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));
\r
1785 void MainWindow::closeEvent(QCloseEvent *event)
\r
1787 QSettings settings;
\r
1789 if (settings.value(IniKey_ConfirmExit).toBool()) {
\r
1790 QMessageBox msgBox;
\r
1791 QCheckBox *checkBox = new QCheckBox();
\r
1792 checkBox->setText(tr("次回以降は確認しない"));
\r
1793 msgBox.setCheckBox(checkBox);
\r
1794 msgBox.setText(tr("終了しますか?"));
\r
1795 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
\r
1796 msgBox.setIcon(QMessageBox::Question);
\r
1798 if (msgBox.exec() == QMessageBox::No) {
\r
1802 settings.setValue(IniKey_ConfirmExit, !checkBox->isChecked());
\r
1805 settings.setValue(QString("Left/") + IniKey_Dir, ui->pane1->folderPanel()->folderView()->dir());
\r
1806 settings.setValue(QString("Right/") + IniKey_Dir, ui->pane2->folderPanel()->folderView()->dir());
\r
1807 settings.setValue(IniKey_ShowHidden, ui->view_Hidden->isChecked());
\r
1808 settings.setValue(IniKey_ShowSystem, ui->view_System->isChecked());
\r
1809 settings.setValue(IniKey_WindowGeometry, saveGeometry());
\r
1810 settings.setValue(iniKey_WindowState, saveState());
\r
1811 QMainWindow::closeEvent(event);
\r
1815 void MainWindow::keyPressEvent(QKeyEvent *event)
\r
1817 QString ksq = KeyEventToSequence(event);
\r
1818 qDebug() << ksq << " @MainWindow";
\r
1820 QMainWindow::keyPressEvent(event);
\r