3 #include "preferencedialog.h"
\r
4 #include "foldermodel.h"
\r
5 #include "folderpanel.h"
\r
6 #include "copymoveworker.h"
\r
7 #include "operationdialog.h"
\r
8 #include "overwritedialog.h"
\r
9 #include "deleteworker.h"
\r
10 #include "renameworker.h"
\r
11 #include "renamesingledialog.h"
\r
12 #include "renamemultidialog.h"
\r
13 #include "historydialog.h"
\r
14 #include "sortdialog.h"
\r
15 #include "simpletextview.h"
\r
16 #include "simpleimageview.h"
\r
17 #include "bookmarkdialog.h"
\r
18 #include "preferences.h"
\r
19 #include "mainwindow.h"
\r
20 #include "ui_mainwindow.h"
\r
22 #include <QCheckBox>
\r
23 #include <QCloseEvent>
\r
25 #include <QMessageBox>
\r
26 #include <QMimeData>
\r
27 #include <QNetworkAccessManager>
\r
28 #include <QInputDialog>
\r
30 #include <QDesktopServices>
\r
31 #include <QClipboard>
\r
32 #include <QFileDialog>
\r
34 ///////////////////////////////////////////////////////////////////////////////
\r
35 /// \brief MainWindow::MainWindow
\r
36 /// \param parent 親ウィジェット
\r
40 MainWindow::MainWindow(QWidget *parent) :
\r
41 QMainWindow(parent),
\r
42 ui(new Ui::MainWindow),
\r
43 m_overwriteDialog(this),
\r
44 m_viewMode(ModeBasic),
\r
45 m_prevMode(ModeBasic)
\r
48 connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(app_focusChange(QWidget*,QWidget*)));
\r
50 // ステータスバーにウィジェットを設定する
\r
51 QLabel *label = new QLabel(this);
\r
52 label->setAlignment(Qt::AlignRight);
\r
53 label->setObjectName("Right");
\r
54 ui->statusBar->addPermanentWidget(label, 0);
\r
57 qApp->setApplicationName("Gefu");
\r
58 qApp->setApplicationVersion(QString("%1").arg(VERSION_VALUE));
\r
59 qApp->setOrganizationDomain("sourceforge.jp");
\r
60 qApp->setOrganizationName("gefu");
\r
61 qApp->setWindowIcon(QIcon("://images/file-manager.png"));
\r
65 QSettings::setDefaultFormat(QSettings::IniFormat);
\r
66 QSettings settings(this);
\r
67 if (QFileInfo::exists(settings.fileName())) {
\r
68 QFile(settings.fileName()).remove();
\r
69 QDir().rmdir(QFileInfo(settings.fileName()).absolutePath());
\r
74 ui->LPanel->setModel(new FolderModel(this));
\r
75 ui->RPanel->setModel(new FolderModel(this));
\r
76 setActiveModel(ui->LPanel->model());
\r
79 ui->LPanel->initialize(this);
\r
80 ui->RPanel->initialize(this);
\r
81 ui->FPanel->initialize(this);
\r
82 ui->FPanel->setVisible(false);
\r
85 Preferences prefs(this);
\r
86 prefs.restoreModel("Left", ui->LPanel->model());
\r
87 prefs.restoreModel("Right", ui->RPanel->model());
\r
96 setWindowTitle(tr("げふぅ Ver%1").arg(VERSION_VALUE));
\r
97 setWindowIcon(QIcon("://images/file-manager.png"));
\r
98 prefs.restoreWindow(this);
\r
101 if (prefs.isCheckUpdate()) {
\r
102 onCheckUpdate(true);
\r
106 ///////////////////////////////////////////////////////////////////////////////
\r
107 /// \brief MainWindow::~MainWindow
\r
111 MainWindow::~MainWindow()
\r
116 ///////////////////////////////////////////////////////////////////////////////
\r
117 /// \brief MainWindow::app_focusChange
\r
118 /// \param old フォーカスを失うウィジェット
\r
119 /// \param now フォーカスを得るウィジェット
\r
123 void MainWindow::app_focusChange(QWidget *old, QWidget *now)
\r
125 qDebug() << "MainWindow::app_focusChange()";
\r
126 if (old) qDebug() << " old is" << old->objectName();
\r
127 if (now) qDebug() << " now is" << now->objectName();
\r
129 // フォルダビューがフォーカスを得た場合
\r
130 if (now && (now->objectName() == "folderView" ||
\r
131 now->objectName() == "thumbnailView"))
\r
133 FolderModel *m = static_cast<FolderModel*>(focusItemView()->model());
\r
135 ui->statusBar->showMessage(m->filePath(focusItemView()->currentIndex()));
\r
138 // 検索ボックスがフォーカスを失った場合
\r
139 if (old && old->objectName() == "searchBox") {
\r
141 ui->toggle_Search->setChecked(false);
\r
144 // アクションの有効/無効を設定する
\r
150 ///////////////////////////////////////////////////////////////////////////////
\r
151 /// \brief MainWindow::model_PreReset
\r
153 /// FolderModelリセット前の処理
\r
155 void MainWindow::model_PreReset()
\r
157 qDebug() << "MainWindow::model_PreReset()";
\r
159 ui->statusBar->showMessage(tr("ファイルリストを取得しています..."));
\r
162 ///////////////////////////////////////////////////////////////////////////////
\r
163 /// \brief MainWindow::model_PostReset
\r
165 /// FolderModelリセット後の処理
\r
167 void MainWindow::model_PostReset()
\r
169 qDebug() << "MainWindow::model_PostReset()";
\r
171 FolderModel *m = static_cast<FolderModel*>(sender());
\r
172 if (!m->error().isEmpty()) {
\r
173 ui->statusBar->showMessage(m->error());
\r
176 ui->statusBar->showMessage(tr("レディ"));
\r
180 ///////////////////////////////////////////////////////////////////////////////
\r
181 /// \brief MainWindow::onRunCommand
\r
183 /// 入力されたコマンドを実行します。
\r
185 void MainWindow::onRunCommand()
\r
187 qDebug() << "MainWindow::onRunCommand";
\r
189 QFileInfoList list = selectedItems();
\r
190 QString command = QString::null;
\r
191 foreach (const QFileInfo &info, list) {
\r
193 QString path = info.absoluteFilePath();
\r
195 QString path = info.fileName();
\r
197 if (info.isExecutable()) {
\r
198 command = QQ(path) + " " + command;
\r
201 command += " " + QQ(path);
\r
205 QInputDialog dlg(this);
\r
206 dlg.setInputMode(QInputDialog::TextInput);
\r
207 dlg.setWindowTitle(tr("コマンドを実行"));
\r
208 dlg.setLabelText(tr("コマンド:"));
\r
209 dlg.setTextValue(command);
\r
210 dlg.resize(width() * 0.8, dlg.height());
\r
212 int ret = dlg.exec();
\r
213 command = dlg.textValue();
\r
214 if (ret == QDialog::Accepted && !command.isEmpty()) {
\r
215 startProcess(command, tr("コマンドの実行に失敗しました。"));
\r
219 ///////////////////////////////////////////////////////////////////////////////
\r
220 /// \brief MainWindow::onExpandLeft
\r
224 void MainWindow::onExpandLeft()
\r
226 qDebug() << "MainWindow::onExpandLeft()";
\r
228 QList<int> sizes = ui->splitter->sizes();
\r
229 QList<int> newSizes;
\r
231 newSizes << sizes[0] + 30;
\r
232 newSizes << sizes[1] - 30;
\r
234 ui->splitter->setSizes(newSizes);
\r
237 ///////////////////////////////////////////////////////////////////////////////
\r
238 /// \brief MainWindow::onExpandRight
\r
242 void MainWindow::onExpandRight()
\r
244 qDebug() << "MainWindow::onExpandLeft()";
\r
246 QList<int> sizes = ui->splitter->sizes();
\r
247 QList<int> newSizes;
\r
249 newSizes << sizes[0] - 30;
\r
250 newSizes << sizes[1] + 30;
\r
252 ui->splitter->setSizes(newSizes);
\r
255 ///////////////////////////////////////////////////////////////////////////////
\r
256 /// \brief MainWindow::onToggleMark
\r
260 void MainWindow::onToggleMark()
\r
262 qDebug() << "MainWindow::onToggleMark()";
\r
264 QModelIndex index = focusItemView()->currentIndex();
\r
265 if (activeModel()->isMarked(index)) {
\r
266 activeModel()->setData(index, Qt::Unchecked, Qt::CheckStateRole);
\r
269 activeModel()->setData(index, Qt::Checked, Qt::CheckStateRole);
\r
272 if (index.row() < activeModel()->rowCount() - 1) {
\r
273 index = activeModel()->index(index.row() + 1, 0);
\r
274 focusItemView()->setCurrentIndex(index);
\r
278 ///////////////////////////////////////////////////////////////////////////////
\r
279 /// \brief MainWindow::view_statusChanged
\r
280 /// \param text ステータス文字列
\r
282 /// ビューから受け取った文字列をステータスバーに表示します。
\r
284 void MainWindow::view_statusChanged(const QString &text)
\r
286 ui->statusBar->findChild<QLabel*>("Right")->setText(text);
\r
289 ///////////////////////////////////////////////////////////////////////////////
\r
290 /// \brief MainWindow::view_currentChanged
\r
291 /// \param current 新しいカレントインデックス
\r
292 /// \param previous (使用しません)
\r
294 /// カレントインデックスが変更された場合の処理を行います。
\r
296 void MainWindow::view_currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
\r
298 qDebug() << "MainWindow::view_currentChanged()" << current;
\r
299 Q_UNUSED(previous);
\r
301 if (focusItemView() != sender()->parent()) {
\r
305 ui->statusBar->showMessage(activeModel()->filePath(current));
\r
307 if (m_viewMode == ModePreview) {
\r
308 inactivePanel()->setViewItem(current);
\r
314 ///////////////////////////////////////////////////////////////////////////////
\r
315 /// \brief MainWindow::view_finished
\r
319 void MainWindow::view_finished()
\r
321 qDebug() << "MainWindow::view_finished()";
\r
323 ui->statusBar->findChild<QLabel*>("Right")->setText("");
\r
325 setViewMode(m_prevMode);
\r
328 ///////////////////////////////////////////////////////////////////////////////
\r
329 /// \brief MainWindow::onMove
\r
331 /// 選択アイテムを隣のパネルに移動します。
\r
333 void MainWindow::onMove()
\r
335 qDebug() << "MainWindow::onMove";
\r
337 QFileInfoList list = selectedItems();
\r
338 if (list.isEmpty()) {
\r
342 int row = focusItemView()->currentIndex().row();
\r
344 QString tgtPath = inactiveModel()->rootPath();
\r
345 moveItems(list, tgtPath);
\r
347 if (row >= activeModel()->rowCount()) {
\r
348 row = activeModel()->rowCount() - 1;
\r
350 focusItemView()->setCurrentIndex(activeModel()->index(row, 1));
\r
353 ///////////////////////////////////////////////////////////////////////////////
\r
354 /// \brief MainWindow::onKeyLeft
\r
356 /// ←キー押下時の処理を行います。
\r
358 void MainWindow::onKeyLeft()
\r
360 qDebug() << "MainWindow::onKeyLeft()";
\r
362 QWidget *w = qApp->focusWidget();
\r
363 if (w->objectName() == "folderView")
\r
365 QWidget *panel = w->parentWidget()->parentWidget();
\r
366 if (panel == ui->LPanel) {
\r
367 activeModel()->onCdUp();
\r
369 else if (ui->LPanel->folderPanel()->isVisible()){
\r
370 ui->LPanel->folderPanel()->itemView()->setFocus();
\r
374 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier);
\r
375 qApp->sendEvent(w, &event);
\r
379 ///////////////////////////////////////////////////////////////////////////////
\r
380 /// \brief MainWindow::onKeyRight
\r
382 /// →キー押下時の処理を行います。
\r
384 void MainWindow::onKeyRight()
\r
386 qDebug() << "MainWindow::onKeyRight()";
\r
388 QWidget *w = qApp->focusWidget();
\r
389 if (w->objectName() == "folderView")
\r
391 QWidget *panel = w->parentWidget()->parentWidget();
\r
392 if (panel == ui->RPanel) {
\r
393 activeModel()->onCdUp();
\r
395 else if (ui->RPanel->folderPanel()->isVisible()){
\r
396 ui->RPanel->folderPanel()->itemView()->setFocus();
\r
400 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier);
\r
401 qApp->sendEvent(w, &event);
\r
405 ///////////////////////////////////////////////////////////////////////////////
\r
406 /// \brief MainWindow::onChooseFolder
\r
408 /// 選択したフォルダに移動します。
\r
410 void MainWindow::onChooseFolder()
\r
412 qDebug() << "MainWindow::onChooseFolder()";
\r
414 QString path = QFileDialog::getExistingDirectory(
\r
415 this, tr("フォルダを選択"), activeModel()->rootPath());
\r
416 if (!path.isEmpty()) {
\r
417 activeModel()->setRootPath(path);
\r
418 // updateActions();
\r
422 ///////////////////////////////////////////////////////////////////////////////
\r
423 /// \brief MainWindow::onCopyFileName
\r
425 /// ファイル名をクリップボードにコピーします。
\r
427 void MainWindow::onCopyFileName()
\r
429 qDebug() << "MainWindow::onCopyFileName()";
\r
431 QClipboard *clipboard = qApp->clipboard();
\r
432 clipboard->setText(activeModel()->fileName(focusItemView()->currentIndex()));
\r
435 ///////////////////////////////////////////////////////////////////////////////
\r
436 /// \brief MainWindow::onCopyFilePath
\r
438 /// フルパスをクリップボードにコピーします。
\r
440 void MainWindow::onCopyFilePath()
\r
442 qDebug() << "MainWindow::onCopyFilePath()";
\r
444 QClipboard *clipboard = qApp->clipboard();
\r
445 clipboard->setText(activeModel()->filePath(focusItemView()->currentIndex()));
\r
448 ///////////////////////////////////////////////////////////////////////////////
\r
449 /// \brief MainWindow::askOverWrite
\r
450 /// \param copyMethod 上書き方法
\r
451 /// \param alias 別名
\r
452 /// \param srcPath コピー元パス
\r
453 /// \param tgtPath コピー先パス
\r
455 /// 上書きの処理方法を選択するダイアログを表示します。
\r
457 void MainWindow::askOverWrite(QString *copyMethod,
\r
459 const QString &srcPath,
\r
460 const QString &tgtPath)
\r
462 qDebug() << "MainWindow::askOverWrite()";
\r
464 CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());
\r
465 if (!m_overwriteDialog.isKeepSetting() ||
\r
466 m_overwriteDialog.copyMethod() == "rbRename")
\r
468 m_overwriteDialog.setFileInfo(srcPath, tgtPath);
\r
469 if (m_overwriteDialog.exec() == QDialog::Rejected) {
\r
470 worker->requestStop();
\r
473 *copyMethod = m_overwriteDialog.copyMethod();
\r
474 *alias = m_overwriteDialog.alias();
\r
476 worker->endAsking();
\r
479 ///////////////////////////////////////////////////////////////////////////////
\r
480 /// \brief MainWindow::onAddBookmark
\r
484 void MainWindow::onAddBookmark()
\r
486 qDebug() << "MainWindow::onAddBookmark()";
\r
487 qDebug() << sender()->objectName();
\r
490 if (sender()->objectName() == "bookmarkBtn") {
\r
491 FolderPanel *p = static_cast<FolderPanel*>(sender()->parent());
\r
498 QFileInfo fi(m->rootPath());
\r
499 Preferences(this).addBookmark(fi.fileName(), fi.absoluteFilePath());
\r
500 initBookmarkMenu();
\r
502 activePanel()->folderPanel()->itemView()->setFocus();
\r
503 ui->statusBar->showMessage(tr("%1をブックマークに追加しました").arg(fi.absoluteFilePath()));
\r
506 ///////////////////////////////////////////////////////////////////////////////
\r
507 /// \brief MainWindow::view_copyAvailable
\r
508 /// \param yes コピー可能ならtrue
\r
510 /// 選択範囲の有無をメニューに反映します。
\r
512 void MainWindow::view_copyAvailable(bool yes)
\r
514 ui->text_Copy->setEnabled(yes);
\r
517 ///////////////////////////////////////////////////////////////////////////////
\r
518 /// \brief MainWindow::copyItems
\r
519 /// \param list コピー元リスト
\r
520 /// \param tgtDir コピー先フォルダ
\r
524 void MainWindow::copyItems(const QFileInfoList &list, const QString &tgtDir)
\r
526 qDebug() << "MainWindow::copyItems()" << tgtDir;
\r
528 Preferences prefs(this);
\r
529 if (prefs.isConfirmCopy() &&
\r
530 QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))
\r
531 != QMessageBox::Yes)
\r
536 // 上書き確認ダイアログを初期化する
\r
537 m_overwriteDialog.reset();
\r
540 CopyMoveWorker *worker = new CopyMoveWorker();
\r
541 connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),
\r
542 this, SLOT(askOverWrite(QString*,QString*,QString,QString)));
\r
543 worker->setCopyList(&list);
\r
544 worker->setTargetDir(tgtDir);
\r
545 worker->setMoveMode(false);
\r
547 // 進捗ダイアログを表示して、処理を開始する
\r
548 OperationDialog opDlg(this);
\r
549 opDlg.setWindowTitle(tr("コピー"));
\r
550 opDlg.setWorker(worker);
\r
551 opDlg.setAutoClose(prefs.isAutoCloseCopy());
\r
555 prefs.setAutoCloseCopy(opDlg.autoClose());
\r
558 ///////////////////////////////////////////////////////////////////////////////
\r
559 /// \brief MainWindow::moveItems
\r
560 /// \param list 移動元リスト
\r
561 /// \param tgtDir 移動先フォルダ
\r
565 void MainWindow::moveItems(const QFileInfoList &list, const QString &tgtDir)
\r
567 qDebug() << "MainWindow::moveItems()" << tgtDir;
\r
569 Preferences prefs(this);
\r
570 if (prefs.isConfirmMove() &&
\r
571 QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))
\r
572 != QMessageBox::Yes)
\r
577 // 上書き確認ダイアログを初期化する
\r
578 m_overwriteDialog.reset();
\r
581 CopyMoveWorker *worker = new CopyMoveWorker();
\r
582 connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),
\r
583 this, SLOT(askOverWrite(QString*,QString*,QString,QString)));
\r
584 worker->setCopyList(&list);
\r
585 worker->setTargetDir(tgtDir);
\r
586 worker->setMoveMode(true);
\r
588 // 進捗ダイアログを表示して、処理を開始する
\r
589 OperationDialog opDlg(this);
\r
590 opDlg.setWindowTitle(tr("移動"));
\r
591 opDlg.setWorker(worker);
\r
592 opDlg.setAutoClose(prefs.isAutoCloseMove());
\r
596 prefs.setAutoCloseMove(opDlg.autoClose());
\r
599 ///////////////////////////////////////////////////////////////////////////////
\r
600 /// \brief MainWindow::onContextMenuEvent
\r
601 /// \param obj イベントが発生したオブジェクト
\r
602 /// \param e コンテキストメニューイベント
\r
603 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。
\r
605 bool MainWindow::onContextMenuEvent(QObject *obj, QContextMenuEvent *e)
\r
608 if (obj->objectName() == "textView") {
\r
609 menu.addAction(ui->text_ConvertFromEUC);
\r
610 menu.addAction(ui->text_ConvertFromJIS);
\r
611 menu.addAction(ui->text_ConvertFromSJIS);
\r
612 menu.addAction(ui->text_ConvertFromUTF8);
\r
613 menu.addAction(ui->text_ConvertFromUTF16);
\r
614 menu.addAction(ui->text_ConvertFromUTF16BE);
\r
615 menu.addAction(ui->text_ConvertFromUTF16LE);
\r
616 menu.addSeparator();
\r
617 menu.addAction(ui->text_Copy);
\r
618 if (m_viewMode == ModeView) {
\r
619 menu.addSeparator();
\r
620 menu.addAction(ui->view_Back);
\r
623 else if (obj->objectName() == "imageView") {
\r
624 menu.addAction(ui->image_FitToWindow);
\r
625 menu.addAction(ui->action_ScaleDown);
\r
626 menu.addAction(ui->action_ScaleUp);
\r
627 menu.addAction(ui->image_ScaleNormal);
\r
628 menu.addSeparator();
\r
629 menu.addAction(ui->image_Rotate90);
\r
630 menu.addAction(ui->image_Rotate180);
\r
632 if (m_viewMode == ModeView) {
\r
633 menu.addSeparator();
\r
634 menu.addAction(ui->view_Back);
\r
637 else if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView") {
\r
638 QModelIndex index = focusItemView()->indexAt(e->pos());
\r
639 if (index.isValid()) {
\r
640 menu.addAction(ui->action_Open);
\r
641 menu.addAction(ui->action_OpenWith);
\r
642 menu.addAction(ui->action_OpenEditor);
\r
643 menu.addAction(ui->action_OpenTerminal);
\r
644 menu.addAction(ui->action_OpenArchiver);
\r
645 menu.addSeparator();
\r
646 menu.addAction(ui->action_Copy);
\r
647 menu.addAction(ui->action_Move);
\r
648 menu.addSeparator();
\r
649 menu.addAction(ui->action_Delete);
\r
650 menu.addSeparator();
\r
651 menu.addAction(ui->action_CopyFileName);
\r
652 menu.addAction(ui->action_CopyFilePath);
\r
653 menu.addSeparator();
\r
654 menu.addAction(ui->action_Rename);
\r
657 menu.addAction(ui->action_historyBack);
\r
658 menu.addAction(ui->action_HistoryForward);
\r
659 menu.addSeparator();
\r
660 menu.addAction(ui->action_CdUp);
\r
661 menu.addAction(ui->action_CdHome);
\r
662 menu.addAction(ui->action_CdRoot);
\r
663 menu.addAction(ui->action_Cd);
\r
664 menu.addSeparator();
\r
665 menu.addAction(ui->action_CreateFile);
\r
666 menu.addAction(ui->action_CreateFolder);
\r
670 qDebug() << "No context menu" << obj->objectName();
\r
674 QAction *selected = menu.exec(e->globalPos());
\r
675 if (selected == ui->action_ScaleDown ||
\r
676 selected == ui->action_ScaleUp)
\r
678 ui->image_FitToWindow->blockSignals(true);
\r
679 ui->image_FitToWindow->setChecked(false);
\r
680 ui->image_FitToWindow->blockSignals(false);
\r
686 ///////////////////////////////////////////////////////////////////////////////
\r
687 /// \brief MainWindow::onDropEvent
\r
688 /// \param obj イベントが発生したオブジェクト
\r
689 /// \param e ドロップイベントオブジェクト
\r
690 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。
\r
692 bool MainWindow::onDropEvent(QObject *obj, QDropEvent *e)
\r
694 qDebug() << "MainWindow::onDropEvent()";
\r
696 if (obj->parent()->objectName() == "folderView" ||
\r
697 obj->parent()->objectName() == "thumbnailView")
\r
699 QAbstractItemView *v = static_cast<QAbstractItemView*>(obj->parent());
\r
700 if (v->property("dragging").toBool()) {
\r
701 // 自分自身へのドロップなら何もしない
\r
705 QFileInfoList list;
\r
706 foreach (const QUrl &url, e->mimeData()->urls()) {
\r
707 QString path = QFileInfo(url.toLocalFile()).canonicalFilePath();
\r
708 if (!path.isEmpty()) {
\r
712 qDebug() << "drop path is empty." << url;
\r
716 if (list.isEmpty()) {
\r
717 // ローカルファイルのドロップでなければ何もしない
\r
721 e->acceptProposedAction();
\r
724 QAction *actCopy = menu.addAction(tr("コピー"));
\r
725 QAction *actMove = menu.addAction(tr("移動"));
\r
726 menu.addSeparator();
\r
727 menu.addAction(tr("キャンセル"));
\r
729 QAction *selected = menu.exec(v->mapToGlobal(e->pos()));
\r
730 FolderModel *m = static_cast<FolderModel*>(v->model());
\r
731 if (selected == actMove) {
\r
732 moveItems(list, m->rootPath());
\r
734 else if (selected == actCopy) {
\r
735 copyItems(list, m->rootPath());
\r
740 qDebug() << obj->parent()->objectName();
\r
746 ///////////////////////////////////////////////////////////////////////////////
\r
747 /// \brief MainWindow::onKeyPressEvent
\r
748 /// \param obj イベントが発生したオブジェクト
\r
749 /// \param e キーイベントオブジェクト
\r
750 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。
\r
752 bool MainWindow::onKeyPressEvent(QObject *obj, QKeyEvent *e)
\r
754 qDebug() << "MainWindow::onKeyPressEvent()";
\r
756 QString modifier = QString::null;
\r
757 if (e->modifiers() & Qt::ShiftModifier) { modifier += "Shift+"; }
\r
758 if (e->modifiers() & Qt::ControlModifier) { modifier += "Ctrl+"; }
\r
759 if (e->modifiers() & Qt::AltModifier) { modifier += "Alt+"; }
\r
760 if (e->modifiers() & Qt::MetaModifier) { modifier += "Meta+"; }
\r
762 QString key = modifier + QKeySequence(e->key()).toString();
\r
764 foreach (QAction *action, findChildren<QAction*>()) {
\r
765 if (action->isEnabled()) {
\r
766 foreach (const QKeySequence &ks, action->shortcuts()) {
\r
767 if (ks.toString() == key) {
\r
768 qDebug() << "emit" << action->objectName();
\r
769 if (action->isCheckable()) {
\r
781 if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView")
\r
784 switch (e->key()) {
\r
788 case Qt::Key_Right:
\r
791 case Qt::Key_PageDown:
\r
792 case Qt::Key_PageUp:
\r
805 ///////////////////////////////////////////////////////////////////////////////
\r
806 /// \brief MainWindow::onCopy
\r
808 /// 選択アイテムを隣のパネルにコピーします。
\r
810 void MainWindow::onCopy()
\r
812 qDebug() << "MainWindow::onCopy";
\r
814 QFileInfoList list = selectedItems();
\r
815 if (list.isEmpty()) {
\r
819 QString tgtPath = inactiveModel()->rootPath();
\r
820 copyItems(list, tgtPath);
\r
823 ///////////////////////////////////////////////////////////////////////////////
\r
824 /// \brief MainWindow::onCreateFile
\r
828 void MainWindow::onCreateFile()
\r
830 qDebug() << "MainWindow::onCreateFile";
\r
833 QString name = QInputDialog::getText(
\r
834 this, tr("ファイルを作成"), tr("ファイル名:"),
\r
835 QLineEdit::Normal, "", &bOk);
\r
836 if (!bOk || name.isEmpty()) {
\r
840 QModelIndex index = activeModel()->touch(name);
\r
841 if (!index.isValid()) {
\r
842 QMessageBox::critical(
\r
844 tr("ファイルの作成に失敗しました。"));
\r
848 focusItemView()->setCurrentIndex(index);
\r
849 if (Preferences(this).isOpenAfterCreation()) {
\r
850 onOpenEditor(index);
\r
854 ///////////////////////////////////////////////////////////////////////////////
\r
855 /// \brief MainWindow::onCreateFolder
\r
859 void MainWindow::onCreateFolder()
\r
861 qDebug() << "MainWindow::onCreateFolder";
\r
864 QString name = QInputDialog::getText(
\r
865 this, tr("フォルダを作成"), tr("フォルダ名:"),
\r
866 QLineEdit::Normal, "", &bOk);
\r
867 if (!bOk || name.isEmpty()) {
\r
871 QModelIndex index = activeModel()->mkdir(name);
\r
872 if (!index.isValid()) {
\r
873 QMessageBox::critical(
\r
875 tr("フォルダの作成に失敗しました。"));
\r
879 focusItemView()->setCurrentIndex(index);
\r
880 if (Preferences(this).isMoveAfterCreation()) {
\r
885 ///////////////////////////////////////////////////////////////////////////////
\r
886 /// \brief MainWindow::onDelete
\r
890 void MainWindow::onDelete()
\r
892 qDebug() << "MainWindow::onDelete";
\r
894 QFileInfoList list = selectedItems();
\r
895 if (list.isEmpty()) {
\r
899 Preferences prefs(this);
\r
900 if (prefs.isConfirmDelete()) {
\r
902 if (list.size() == 1) {
\r
903 msg = list[0].fileName();
\r
906 msg = tr("%1個のアイテム").arg(list.size());
\r
908 int ret = QMessageBox::question(
\r
910 msg + tr("を削除しますか?"));
\r
911 if (ret != QMessageBox::Yes) {
\r
916 DeleteWorker *worker = new DeleteWorker();
\r
917 worker->setDeleteList(&list);
\r
919 OperationDialog opDlg(this);
\r
920 opDlg.setWindowTitle(tr("削除"));
\r
921 opDlg.setWorker(worker);
\r
922 opDlg.setAutoClose(prefs.isAutoCloseDelete());
\r
924 int row = focusItemView()->currentIndex().row();
\r
928 if (row >= activeModel()->rowCount()) {
\r
929 row = activeModel()->rowCount() - 1;
\r
931 focusItemView()->setCurrentIndex(activeModel()->index(row, 1));
\r
933 prefs.setAutoCloseDelete(opDlg.autoClose());
\r
936 ///////////////////////////////////////////////////////////////////////////////
\r
937 /// \brief MainWindow::onOpen
\r
938 /// \param index (使用しません)
\r
942 void MainWindow::onOpen(const QModelIndex &index)
\r
945 qDebug() << "MainWindow::onOpen()" << index;
\r
947 QModelIndex current = focusItemView()->currentIndex();
\r
948 if (activeModel()->isDir(current)) {
\r
949 activeModel()->setRootPath(activeModel()->filePath(current));
\r
954 QString ext = activeModel()->fileInfo(current).suffix().toLower();
\r
955 QStringList list = Preferences(this).getPreferExtensions().split(",", QString::SkipEmptyParts);
\r
956 foreach (const QString& s, list) {
\r
957 if (ext == s.trimmed().toLower()) {
\r
958 QString path = QDir::toNativeSeparators(activeModel()->filePath(current));
\r
959 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
965 setViewMode(ModeView);
\r
968 ///////////////////////////////////////////////////////////////////////////////
\r
969 /// \brief MainWindow::onOpenEditor
\r
972 /// 選択アイテムを外部エディタで開きます。
\r
974 void MainWindow::onOpenEditor(const QModelIndex &index)
\r
976 qDebug() << "MainWindow::onOpenEditor";
\r
978 QString exe = Preferences(this).getEditorPath();
\r
979 if (exe.isEmpty()) {
\r
980 QMessageBox::critical(
\r
982 tr("外部エディタのパスが未定義です。"));
\r
986 QFileInfoList list;
\r
987 if (index.isValid()) {
\r
988 list << activeModel()->fileInfo(index);
\r
991 list = selectedItems();
\r
995 foreach (const QFileInfo &info, list) {
\r
996 files += " " + QQ(info.absoluteFilePath());
\r
999 QString command = "open -a " + exe + files;
\r
1001 QString command = exe + files;
\r
1003 if (!startProcess(command, tr("外部エディタの起動に失敗しました。"))) {
\r
1004 qDebug() << command;
\r
1008 ///////////////////////////////////////////////////////////////////////////////
\r
1009 /// \brief MainWindow::onOpenTerminal
\r
1011 /// 選択アイテムをターミナルで開きます。
\r
1013 void MainWindow::onOpenTerminal()
\r
1015 qDebug() << "MainWindow::onOpenTerminal";
\r
1017 QString exe = Preferences(this).getTerminalPath();
\r
1018 if (exe.isEmpty()) {
\r
1019 QMessageBox::critical(
\r
1021 tr("ターミナルのパスが未定義です。"));
\r
1025 QSet<QString> dirs;
\r
1026 foreach (const QFileInfo &info, selectedItems()) {
\r
1027 if (info.isDir()) {
\r
1028 dirs.insert(info.absoluteFilePath());
\r
1031 dirs.insert(info.absolutePath());
\r
1035 foreach (const QString &dir, dirs) {
\r
1037 QString command = "open -n -a " + exe + " " + QQ(dir);
\r
1039 QString command = exe + " " + QQ(dir);
\r
1041 if (!startProcess(command, tr("ターミナルの起動に失敗しました。"))) {
\r
1042 qDebug() << command;
\r
1048 ///////////////////////////////////////////////////////////////////////////////
\r
1049 /// \brief MainWindow::onOpenArchiver
\r
1051 /// 選択アイテムをアーカイバで開きます。
\r
1053 void MainWindow::onOpenArchiver()
\r
1055 qDebug() << "MainWindow::onOpenArchiver";
\r
1057 QString exe = Preferences(this).getArchiverPath();
\r
1058 if (exe.isEmpty()) {
\r
1059 QMessageBox::critical(
\r
1061 tr("アーカイバのパスが未定義です。"));
\r
1066 foreach (const QFileInfo &info, selectedItems()) {
\r
1067 files += " " + QQ(info.absoluteFilePath());
\r
1070 QString command = "open -a " + exe + files;
\r
1072 QString command = exe + files;
\r
1074 if (!startProcess(command, tr("アーカイバの起動に失敗しました。"))) {
\r
1075 qDebug() << command;
\r
1079 ///////////////////////////////////////////////////////////////////////////////
\r
1080 /// \brief MainWindow::onOpenBookmark
\r
1082 /// ブックマークのメニュー項目をクリックしたときの処理を行います。
\r
1084 void MainWindow::onOpenBookmark()
\r
1086 qDebug() << "MainWindow::onOpenBookmark()";
\r
1088 QAction *action = qobject_cast<QAction*>(sender());
\r
1089 Q_CHECK_PTR(action);
\r
1091 int i = action->data().toInt();
\r
1092 activeModel()->setRootPath(Preferences(this).getBookmarkPath(i));
\r
1095 ///////////////////////////////////////////////////////////////////////////////
\r
1096 /// \brief MainWindow::onRename
\r
1098 /// 選択アイテムの名前を変更します。
\r
1100 void MainWindow::onRename()
\r
1102 qDebug() << "MainWindow::onRename";
\r
1104 QFileInfoList list = selectedItems();
\r
1105 if (list.isEmpty()) {
\r
1109 AbstractRenameDialog *dlg;
\r
1110 if (list.size() == 1) {
\r
1111 dlg = new RenameSingleDialog(this);
\r
1114 dlg = new RenameMultiDialog(this);
\r
1116 dlg->setWorkingDirectory(activeModel()->rootPath());
\r
1117 dlg->setNames(list);
\r
1118 int dlgResult = dlg->exec();
\r
1119 if (dlgResult != QDialog::Accepted || dlg->renameMap().isEmpty()) {
\r
1123 Preferences prefs(this);
\r
1124 if (prefs.isConfirmRename() &&
\r
1125 QMessageBox::question(this, tr("確認"), tr("名前の変更を実行しますか?"))
\r
1126 != QMessageBox::Yes)
\r
1131 RenameWorker *worker = new RenameWorker();
\r
1132 worker->setRenameMap(&dlg->renameMap());
\r
1134 OperationDialog opDlg(this);
\r
1135 opDlg.setWindowTitle(tr("名前を変更"));
\r
1136 opDlg.setWorker(worker);
\r
1137 opDlg.setAutoClose(prefs.isAutoCloseRename());
\r
1141 QFileInfo fi(dlg->renameMap().first());
\r
1142 focusItemView()->setCurrentIndex(activeModel()->search(fi.fileName()));
\r
1144 prefs.setAutoCloseRename(opDlg.autoClose());
\r
1147 ///////////////////////////////////////////////////////////////////////////////
\r
1148 /// \brief MainWindow::onOpenWith
\r
1150 /// 関連付けられたアプリで開きます。
\r
1152 void MainWindow::onOpenWith()
\r
1154 qDebug() << "MainWindow::onOpenWith";
\r
1156 foreach (const QFileInfo &info, selectedItems()) {
\r
1157 QString path = QDir::toNativeSeparators(info.absoluteFilePath());
\r
1158 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
1162 ///////////////////////////////////////////////////////////////////////////////
\r
1163 /// \brief MainWindow::showBookmarkDialog
\r
1165 /// ブックマーク一覧ダイアログを表示します。
\r
1167 void MainWindow::showBookmarkDialog()
\r
1169 qDebug() << "MainWindow::showBookmarkDialog()";
\r
1171 BookmarkDialog dlg(this);
\r
1172 dlg.setEditMode(false);
\r
1173 if (dlg.exec() == QDialog::Accepted) {
\r
1174 int n = dlg.selectedIndex();
\r
1175 activeModel()->setRootPath(Preferences(this).getBookmarkPath(n + 1));
\r
1179 ///////////////////////////////////////////////////////////////////////////////
\r
1180 /// \brief MainWindow::onEditBookmark
\r
1182 /// ブックマークの編集ダイアログを表示します。
\r
1184 void MainWindow::onEditBookmark()
\r
1186 qDebug() << "MainWindow::onEditBookmark()";
\r
1188 BookmarkDialog dlg(this);
\r
1189 dlg.setEditMode(true);
\r
1191 if (dlg.exec() == QDialog::Accepted) {
\r
1192 initBookmarkMenu();
\r
1196 ///////////////////////////////////////////////////////////////////////////////
\r
1197 /// \brief MainWindow::showFilterDialog
\r
1199 /// フィルタ設定ダイアログを表示します。
\r
1201 void MainWindow::showFilterDialog()
\r
1203 qDebug() << "MainWindow::showFilterDialog()";
\r
1205 QString filters = activeModel()->nameFilters().join(" ");
\r
1207 QInputDialog dlg(this);
\r
1208 dlg.setInputMode(QInputDialog::TextInput);
\r
1209 dlg.setWindowTitle(tr("フィルタを設定"));
\r
1210 dlg.setLabelText(tr("フィルタ:"));
\r
1211 dlg.setTextValue(filters);
\r
1212 dlg.resize(width() * 0.8, dlg.height());
\r
1214 if (dlg.exec() == QDialog::Accepted) {
\r
1215 filters = dlg.textValue();
\r
1216 if (filters.isEmpty()) {
\r
1220 activeModel()->setNameFilters(filters.split(" ", QString::SkipEmptyParts));
\r
1221 activeModel()->refresh();
\r
1225 ///////////////////////////////////////////////////////////////////////////////
\r
1226 /// \brief MainWindow::showHistoryDialog
\r
1228 /// 履歴選択ダイアログを表示します。
\r
1230 void MainWindow::showHistoryDialog()
\r
1232 qDebug() << "MainWindow::showHistoryDialog()";
\r
1234 HistoryDialog dlg(this);
\r
1235 dlg.setModel(ui->LPanel->model(), ui->RPanel->model(), activeModel());
\r
1239 ///////////////////////////////////////////////////////////////////////////////
\r
1240 /// \brief MainWindow::showSortDialog
\r
1242 /// ソート方法選択ダイアログを表示します。
\r
1244 void MainWindow::showSortDialog()
\r
1246 qDebug() << "MainWindow::showSortDialog()";
\r
1248 SortDialog dlg(this);
\r
1249 dlg.setModel(activeModel());
\r
1253 ///////////////////////////////////////////////////////////////////////////////
\r
1254 /// \brief MainWindow::onSplitCenter
\r
1258 void MainWindow::onSplitCenter()
\r
1260 qDebug() << "MainWindow::onSplitCenter()";
\r
1262 QList<int> sizes = ui->splitter->sizes();
\r
1263 int sizeTotal = sizes[0] + sizes[1];
\r
1264 sizes[0] = sizeTotal / 2;
\r
1265 sizes[1] = sizeTotal - sizes[0];
\r
1266 ui->splitter->setSizes(sizes);
\r
1269 ///////////////////////////////////////////////////////////////////////////////
\r
1270 /// \brief MainWindow::onSwap
\r
1272 /// 左右のパネルでモデルを入れ替えます。
\r
1274 void MainWindow::onSwap()
\r
1276 qDebug() << "MainWindow::onSwap()";
\r
1278 FolderModel *tmp = ui->LPanel->model();
\r
1279 ui->LPanel->setModel(ui->RPanel->model());
\r
1280 ui->RPanel->setModel(tmp);
\r
1283 if (ui->LPanel->model()->isActive()) {
\r
1284 setActiveModel(ui->RPanel->model());
\r
1287 setActiveModel(ui->LPanel->model());
\r
1291 ///////////////////////////////////////////////////////////////////////////////
\r
1292 /// \brief MainWindow::onTogglePreviewMode
\r
1293 /// \param checked メニューのチェック状態
\r
1295 /// 通常モード/プレビューモードを切り替えます。
\r
1297 void MainWindow::onTogglePreviewMode(bool checked)
\r
1299 qDebug() << "MainWindow::onTogglePreviewMode()" << checked;
\r
1302 setViewMode(ModePreview);
\r
1305 setViewMode(ModeBasic);
\r
1309 ///////////////////////////////////////////////////////////////////////////////
\r
1310 /// \brief MainWindow::onSearchNext
\r
1314 void MainWindow::onSearchNext()
\r
1316 qDebug() << "MainWindow::onSearchNext";
\r
1318 static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext();
\r
1321 ///////////////////////////////////////////////////////////////////////////////
\r
1322 /// \brief MainWindow::onSearchPrev
\r
1326 void MainWindow::onSearchPrev()
\r
1328 qDebug() << "MainWindow::onSearchPrev";
\r
1330 static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext(-1);
\r
1333 ///////////////////////////////////////////////////////////////////////////////
\r
1334 /// \brief MainWindow::onKeyDown
\r
1336 /// フォーカスウィジェットに↓キーイベントを送信します。
\r
1338 void MainWindow::onKeyDown()
\r
1340 qDebug() << "MainWindow::onKeyDown()";
\r
1342 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);
\r
1343 qApp->sendEvent(qApp->focusWidget(), &event);
\r
1346 ///////////////////////////////////////////////////////////////////////////////
\r
1347 /// \brief MainWindow::onKeyEnd
\r
1349 /// フォーカスウィジェットにEND, Ctrl+ENDキーイベントを送信します。
\r
1351 void MainWindow::onKeyEnd()
\r
1353 qDebug() << "MainWindow::onKeyEnd()";
\r
1355 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);
\r
1356 qApp->sendEvent(qApp->focusWidget(), &event1);
\r
1358 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);
\r
1359 qApp->sendEvent(qApp->focusWidget(), &event2);
\r
1362 ///////////////////////////////////////////////////////////////////////////////
\r
1363 /// \brief MainWindow::onKeyHome
\r
1365 /// フォーカスウィジェットにHOME, Ctrl+HOMEキーイベントを送信します。
\r
1367 void MainWindow::onKeyHome()
\r
1369 qDebug() << "MainWindow::onKeyHome()";
\r
1371 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);
\r
1372 qApp->sendEvent(qApp->focusWidget(), &event1);
\r
1374 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);
\r
1375 qApp->sendEvent(qApp->focusWidget(), &event2);
\r
1378 ///////////////////////////////////////////////////////////////////////////////
\r
1379 /// \brief MainWindow::onKeyUp
\r
1381 /// フォーカスウィジェットに↑キーイベントを送信します。
\r
1383 void MainWindow::onKeyUp()
\r
1385 qDebug() << "MainWindow::onKeyUp()";
\r
1387 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
\r
1388 qApp->sendEvent(qApp->focusWidget(), &event);
\r
1391 ///////////////////////////////////////////////////////////////////////////////
\r
1392 /// \brief MainWindow::onKeyHomeOther
\r
1394 /// 非フォーカスビューにHOME, Ctrl+HOMEキーイベントを送信します。
\r
1396 void MainWindow::onKeyHomeOther()
\r
1398 qDebug() << "MainWindow::onKeyHomeOther()";
\r
1400 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);
\r
1401 sendEventOther(&event1);
\r
1403 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);
\r
1404 sendEventOther(&event2);
\r
1407 ///////////////////////////////////////////////////////////////////////////////
\r
1408 /// \brief MainWindow::onKeyDownOther
\r
1410 /// 非フォーカスビューに↓キーイベントを送信します。
\r
1412 void MainWindow::onKeyDownOther()
\r
1414 qDebug() << "MainWindow::onKeyDownOther()";
\r
1416 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);
\r
1417 sendEventOther(&event);
\r
1420 ///////////////////////////////////////////////////////////////////////////////
\r
1421 /// \brief MainWindow::onKeyUpOther
\r
1423 /// 非フォーカスビューに↑キーイベントを送信します。
\r
1425 void MainWindow::onKeyUpOther()
\r
1427 qDebug() << "MainWindow::onKeyUpOther()";
\r
1429 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
\r
1430 sendEventOther(&event);
\r
1433 ///////////////////////////////////////////////////////////////////////////////
\r
1434 /// \brief MainWindow::onKeyEndOther
\r
1436 /// 非フォーカスビューにEND, Ctrl+ENDキーイベントを送信します。
\r
1438 void MainWindow::onKeyEndOther()
\r
1440 qDebug() << "MainWindow::onKeyEndOther()";
\r
1442 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);
\r
1443 sendEventOther(&event1);
\r
1445 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);
\r
1446 sendEventOther(&event2);
\r
1449 ///////////////////////////////////////////////////////////////////////////////
\r
1450 /// \brief MainWindow::onScaleDown
\r
1454 void MainWindow::onScaleDown()
\r
1456 qDebug() << "MainWindow::onScaleDown()";
\r
1458 AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());
\r
1460 view->scaleDown();
\r
1463 ui->LPanel->updateAppearance();
\r
1464 ui->RPanel->updateAppearance();
\r
1465 ui->FPanel->updateAppearance();
\r
1468 ///////////////////////////////////////////////////////////////////////////////
\r
1469 /// \brief MainWindow::onScaleUp
\r
1473 void MainWindow::onScaleUp()
\r
1475 qDebug() << "MainWindow::onScaleUp()";
\r
1477 AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());
\r
1482 ui->LPanel->updateAppearance();
\r
1483 ui->RPanel->updateAppearance();
\r
1484 ui->FPanel->updateAppearance();
\r
1487 ///////////////////////////////////////////////////////////////////////////////
\r
1488 /// \brief MainWindow::initBookmarkMenu
\r
1490 /// ブックマークメニューを初期化します。
\r
1492 void MainWindow::initBookmarkMenu()
\r
1494 qDebug() << "MainWindow::initBookmarkMenu()";
\r
1496 Preferences prefs(this);
\r
1497 QFileIconProvider iconProvider;
\r
1499 ui->menu_Bookmark->clear();
\r
1500 ui->menu_Bookmark->addAction(ui->action_AddBookmark);
\r
1501 ui->menu_Bookmark->addAction(ui->action_EditBookmark);
\r
1502 ui->menu_Bookmark->addSeparator();
\r
1503 for (int n = 1; ; n++) {
\r
1504 QString name = prefs.getBookmarkEntry(n);
\r
1505 if (name.isEmpty()) {
\r
1508 QString path = prefs.getBookmarkPath(n);
\r
1510 QAction *action = ui->menu_Bookmark->addAction(
\r
1511 iconProvider.icon(QFileInfo(path)), name, this,
\r
1512 SLOT(onOpenBookmark()));
\r
1513 action->setData(n);
\r
1517 ///////////////////////////////////////////////////////////////////////////////
\r
1518 /// \brief MainWindow::sendEventOther
\r
1519 /// \param event 送信するイベント
\r
1521 /// 非フォーカスのビューにイベントを送信します。
\r
1523 void MainWindow::sendEventOther(QEvent *event)
\r
1525 qDebug() << "MainWindow::sendEventOther()";
\r
1527 // フォーカスを持たない、可視状態のビューを検索する
\r
1528 foreach (QWidget *w, findChildren<QWidget*>()) {
\r
1529 AbstractView *view = dynamic_cast<AbstractView*>(w);
\r
1531 if (w->isVisible() && !w->hasFocus()) {
\r
1532 qDebug() << "Send event to" << w->objectName();
\r
1533 qApp->sendEvent(w, event);
\r
1539 ///////////////////////////////////////////////////////////////////////////////
\r
1540 /// \brief MainWindow::onSyncPanel
\r
1542 /// 隣のパネルと同じフォルダを表示します。
\r
1544 void MainWindow::onSyncPanel()
\r
1546 qDebug() << "MainWindow::onSyncPanel()";
\r
1548 activeModel()->setRootPath(inactiveModel()->rootPath());
\r
1551 ///////////////////////////////////////////////////////////////////////////////
\r
1552 /// \brief MainWindow::onSyncPanelTo
\r
1554 /// 隣のパネルに同じフォルダを表示します。
\r
1556 void MainWindow::onSyncPanelTo()
\r
1558 qDebug() << "MainWindow::onSyncPanelTo()";
\r
1560 inactiveModel()->setRootPath(activeModel()->rootPath());
\r
1563 ///////////////////////////////////////////////////////////////////////////////
\r
1564 /// \brief MainWindow::onToggleFullMode
\r
1565 /// \param checked メニューのチェック状態
\r
1567 /// 単画面/二画面を切り替えます。
\r
1569 void MainWindow::onToggleFullMode(bool checked)
\r
1571 qDebug() << "MainWindow::onToggleFullMode()" << checked;
\r
1574 setViewMode(ModeFull);
\r
1577 setViewMode(ModeBasic);
\r
1582 ///////////////////////////////////////////////////////////////////////////////
\r
1583 /// \brief MainWindow::onToggleSearch
\r
1584 /// \param checked メニューのチェック状態
\r
1586 /// 検索ボックスの表示/非表示を切り替えます。
\r
1588 void MainWindow::onToggleSearch(bool checked)
\r
1590 qDebug() << "MainWindow::onToggleSearch" << checked;
\r
1593 ui->LPanel->folderPanel()->toggleSearch(checked);
\r
1594 ui->RPanel->folderPanel()->toggleSearch(checked);
\r
1597 ///////////////////////////////////////////////////////////////////////////////
\r
1598 /// \brief MainWindow::showPreferenceDialog
\r
1600 /// 環境設定ダイアログを表示します。
\r
1602 void MainWindow::showPreferenceDialog()
\r
1604 qDebug() << "MainWindow::showPreferenceDialog";
\r
1606 PreferenceDialog dlg(this);
\r
1607 if (dlg.exec() == QDialog::Accepted) {
\r
1608 ui->LPanel->updateAppearance();
\r
1609 ui->RPanel->updateAppearance();
\r
1610 ui->FPanel->updateAppearance();
\r
1614 ///////////////////////////////////////////////////////////////////////////////
\r
1615 /// \brief MainWindow::onToggleHidden
\r
1616 /// \param checked メニューのチェック状態
\r
1618 /// 隠しファイルの表示/非表示を切り替えます。
\r
1620 void MainWindow::onToggleHidden(bool checked)
\r
1622 qDebug() << "MainWindow::onToggleHidden" << checked;
\r
1625 activeModel()->setFilter(activeModel()->filter() | QDir::Hidden);
\r
1628 activeModel()->setFilter(activeModel()->filter() ^ QDir::Hidden);
\r
1631 activeModel()->refresh();
\r
1634 ///////////////////////////////////////////////////////////////////////////////
\r
1635 /// \brief MainWindow::onToggleSystem
\r
1636 /// \param checked メニューのチェック状態
\r
1638 /// システムファイルの表示/非表示を切り替えます。
\r
1640 void MainWindow::onToggleSystem(bool checked)
\r
1642 qDebug() << "MainWindow::onToggleSystem" << checked;
\r
1645 activeModel()->setFilter(activeModel()->filter() | QDir::System);
\r
1648 activeModel()->setFilter(activeModel()->filter() ^ QDir::System);
\r
1651 activeModel()->refresh();
\r
1654 ///////////////////////////////////////////////////////////////////////////////
\r
1655 /// \brief MainWindow::onToggleThumbnailMode
\r
1656 /// \param checked メニューのチェック状態
\r
1658 /// サムネイルモードの切り替えを行います。
\r
1660 void MainWindow::onToggleThumbnailMode(bool checked)
\r
1662 qDebug() << "MainWindow::onToggleThumbnailMode()" << checked;
\r
1664 activePanel()->folderPanel()->toggleView(checked);
\r
1667 ///////////////////////////////////////////////////////////////////////////////
\r
1668 /// \brief MainWindow::onCheckUpdate
\r
1669 /// \param silent 最新版を使用している場合に何も表示しないならtrue
\r
1671 /// アップデートの有無を確認します。
\r
1673 void MainWindow::onCheckUpdate(bool silent)
\r
1675 qDebug() << "MainWindow::onCheckUpdate()" << silent;
\r
1677 QNetworkAccessManager *manager = new QNetworkAccessManager(this);
\r
1680 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));
\r
1683 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinished(QNetworkReply*)));
\r
1686 manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_win.html")));
\r
1687 #elif defined(Q_OS_MAC)
\r
1688 manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_mac.html")));
\r
1692 void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)
\r
1694 qDebug() << "MainWindow::checkUpdateFinishedSilent";
\r
1696 checkUpdateFinished(reply, true);
\r
1699 void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)
\r
1701 qDebug() << "MainWindow::checkUpdateFinished" << silent;
\r
1703 if (reply->error() == QNetworkReply::NoError) {
\r
1704 QString str = reply->readAll();
\r
1705 str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);
\r
1706 QRegExp rx("Gefu([0-9]+)");
\r
1708 QString version = rx.cap(1);
\r
1709 if (version.toInt() > VERSION_VALUE * 100) {
\r
1710 QMessageBox::information(
\r
1712 tr("最新のバージョンが存在します。<br/>") +
\r
1713 tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));
\r
1715 else if (!silent) {
\r
1716 QMessageBox::information(
\r
1718 tr("お使いのバージョンは最新です。"));
\r
1721 else if (!silent){
\r
1722 QMessageBox::critical(
\r
1724 tr("最新バージョンのチェックに失敗しました。<br/>") +
\r
1725 reply->errorString());
\r
1729 ///////////////////////////////////////////////////////////////////////////////
\r
1730 /// \brief MainWindow::initActions
\r
1734 void MainWindow::initActions()
\r
1736 qDebug() << "MainWindow::initActions()";
\r
1738 QList<QKeySequence> shortcuts;
\r
1740 //>>>>> 追加のショートカットキーを設定する
\r
1741 appendActionShortcut(ui->action_Open, "M");
\r
1742 appendActionShortcut(ui->action_OpenWith, "Shift+M");
\r
1743 appendActionShortcut(ui->view_Back, "Backspace");
\r
1744 // MacだとShift+の形で認識されてしまうもの
\r
1745 appendActionShortcut(ui->action_ScaleUp, "Shift++");
\r
1746 appendActionShortcut(ui->action_Filter, "Shift+*");
\r
1747 appendActionShortcut(ui->action_OpenTerminal, "Shift+>");
\r
1748 appendActionShortcut(ui->action_About, "Shift+?");
\r
1749 appendActionShortcut(ui->image_ScaleNormal, "Shift+=");
\r
1752 connect(ui->action_About, SIGNAL(triggered()), this, SLOT(onAbout()));
\r
1753 connect(ui->action_AddBookmark, SIGNAL(triggered()), this, SLOT(onAddBookmark()));
\r
1754 connect(ui->action_Cd, SIGNAL(triggered()), this, SLOT(onChooseFolder()));
\r
1755 connect(ui->action_CheckUpdate, SIGNAL(triggered()), this, SLOT(onCheckUpdate()));
\r
1756 connect(ui->action_Copy, SIGNAL(triggered()), this, SLOT(onCopy()));
\r
1757 connect(ui->action_CopyFileName, SIGNAL(triggered()), this, SLOT(onCopyFileName()));
\r
1758 connect(ui->action_CopyFilePath, SIGNAL(triggered()), this, SLOT(onCopyFilePath()));
\r
1759 connect(ui->action_CreateFile, SIGNAL(triggered()), this, SLOT(onCreateFile()));
\r
1760 connect(ui->action_CreateFolder, SIGNAL(triggered()), this, SLOT(onCreateFolder()));
\r
1761 connect(ui->action_Delete, SIGNAL(triggered()), this, SLOT(onDelete()));
\r
1762 connect(ui->action_EditBookmark, SIGNAL(triggered()), this, SLOT(onEditBookmark()));
\r
1763 connect(ui->action_ExpandLeft, SIGNAL(triggered()), this, SLOT(onExpandLeft()));
\r
1764 connect(ui->action_ExpandRight, SIGNAL(triggered()), this, SLOT(onExpandRight()));
\r
1765 connect(ui->action_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));
\r
1766 connect(ui->action_History, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));
\r
1767 connect(ui->action_KeyDown, SIGNAL(triggered()), this, SLOT(onKeyDown()));
\r
1768 connect(ui->action_KeyDownOther, SIGNAL(triggered()), this, SLOT(onKeyDownOther()));
\r
1769 connect(ui->action_KeyEnd, SIGNAL(triggered()), this, SLOT(onKeyEnd()));
\r
1770 connect(ui->action_KeyEndOther, SIGNAL(triggered()), this, SLOT(onKeyEndOther()));
\r
1771 connect(ui->action_KeyHome, SIGNAL(triggered()), this, SLOT(onKeyHome()));
\r
1772 connect(ui->action_KeyHomeOther, SIGNAL(triggered()), this, SLOT(onKeyHomeOther()));
\r
1773 connect(ui->action_KeyLeft, SIGNAL(triggered()), this, SLOT(onKeyLeft()));
\r
1774 connect(ui->action_KeyUp, SIGNAL(triggered()), this, SLOT(onKeyUp()));
\r
1775 connect(ui->action_KeyUpOther, SIGNAL(triggered()), this, SLOT(onKeyUpOther()));
\r
1776 connect(ui->action_Move, SIGNAL(triggered()), this, SLOT(onMove()));
\r
1777 connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(onOpen()));
\r
1778 connect(ui->action_OpenArchiver, SIGNAL(triggered()), this, SLOT(onOpenArchiver()));
\r
1779 connect(ui->action_OpenEditor, SIGNAL(triggered()), this, SLOT(onOpenEditor()));
\r
1780 connect(ui->action_OpenTerminal, SIGNAL(triggered()), this, SLOT(onOpenTerminal()));
\r
1781 connect(ui->action_OpenWith, SIGNAL(triggered()), this, SLOT(onOpenWith()));
\r
1782 connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));
\r
1783 connect(ui->action_Rename, SIGNAL(triggered()), this, SLOT(onRename()));
\r
1784 connect(ui->action_KeyRight, SIGNAL(triggered()), this, SLOT(onKeyRight()));
\r
1785 connect(ui->action_RunCommand, SIGNAL(triggered()), this, SLOT(onRunCommand()));
\r
1786 connect(ui->action_ScaleDown, SIGNAL(triggered()), this, SLOT(onScaleDown()));
\r
1787 connect(ui->action_ScaleUp, SIGNAL(triggered()), this, SLOT(onScaleUp()));
\r
1788 connect(ui->action_SearchNext, SIGNAL(triggered()), this, SLOT(onSearchNext()));
\r
1789 connect(ui->action_SearchPrev, SIGNAL(triggered()), this, SLOT(onSearchPrev()));
\r
1790 connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));
\r
1791 connect(ui->action_ShowBookmark, SIGNAL(triggered()), this, SLOT(showBookmarkDialog()));
\r
1792 connect(ui->action_Sort, SIGNAL(triggered()), this, SLOT(showSortDialog()));
\r
1793 connect(ui->action_SplitCenter, SIGNAL(triggered()), this, SLOT(onSplitCenter()));
\r
1794 connect(ui->action_Swap, SIGNAL(triggered()), this, SLOT(onSwap()));
\r
1795 connect(ui->action_SyncPanel, SIGNAL(triggered()), this, SLOT(onSyncPanel()));
\r
1796 connect(ui->action_SyncPanelTo, SIGNAL(triggered()), this, SLOT(onSyncPanelTo()));
\r
1798 connect(ui->toggle_FullMode, SIGNAL(toggled(bool)), this, SLOT(onToggleFullMode(bool)));
\r
1799 connect(ui->toggle_Hidden, SIGNAL(toggled(bool)), this, SLOT(onToggleHidden(bool)));
\r
1800 connect(ui->toggle_Mark, SIGNAL(triggered()), this, SLOT(onToggleMark()));
\r
1801 connect(ui->toggle_PreviewMode, SIGNAL(toggled(bool)), this, SLOT(onTogglePreviewMode(bool)));
\r
1802 connect(ui->toggle_Search, SIGNAL(toggled(bool)), this, SLOT(onToggleSearch(bool)));
\r
1803 connect(ui->toggle_System, SIGNAL(toggled(bool)), this, SLOT(onToggleSystem(bool)));
\r
1804 connect(ui->toggle_ThumbnailMode, SIGNAL(toggled(bool)), this, SLOT(onToggleThumbnailMode(bool)));
\r
1806 connect(ui->view_Back, SIGNAL(triggered()), this, SLOT(view_finished()));
\r
1810 ///////////////////////////////////////////////////////////////////////////////
\r
1811 /// \brief MainWindow::setActiveModel
\r
1812 /// \param m 新しいアクティブモデル
\r
1814 /// アクティブモデルを変更します。
\r
1816 void MainWindow::setActiveModel(FolderModel *m)
\r
1818 qDebug() << "MainWindow::setActiveModel()" << m;
\r
1820 if (activeModel()) {
\r
1821 activeModel()->disconnect(this);
\r
1822 ui->action_CdHome->disconnect();
\r
1823 ui->action_CdRoot->disconnect();
\r
1824 ui->action_CdUp->disconnect();
\r
1825 ui->action_historyBack->disconnect();
\r
1826 ui->action_HistoryForward->disconnect();
\r
1827 ui->action_MarkAll->disconnect();
\r
1828 ui->action_MarkAllFiles->disconnect();
\r
1829 ui->action_MarkAllOff->disconnect();
\r
1830 ui->action_MarkInvert->disconnect();
\r
1831 ui->action_Refresh->disconnect();
\r
1836 connect(activeModel(), SIGNAL(modelAboutToBeReset()), this, SLOT(model_PreReset()));
\r
1837 connect(activeModel(), SIGNAL(modelReset()), this, SLOT(model_PostReset()));
\r
1838 connect(ui->action_CdHome, SIGNAL(triggered()), activeModel(), SLOT(onCdHome()));
\r
1839 connect(ui->action_CdRoot, SIGNAL(triggered()), activeModel(), SLOT(onCdRoot()));
\r
1840 connect(ui->action_CdUp, SIGNAL(triggered()), activeModel(), SLOT(onCdUp()));
\r
1841 connect(ui->action_historyBack, SIGNAL(triggered()), activeModel(), SLOT(onHistoryBack()));
\r
1842 connect(ui->action_HistoryForward, SIGNAL(triggered()), activeModel(), SLOT(onHistoryForward()));
\r
1843 connect(ui->action_MarkAll, SIGNAL(triggered()), activeModel(), SLOT(onMarkAll()));
\r
1844 connect(ui->action_MarkAllFiles, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllFiles()));
\r
1845 connect(ui->action_MarkAllOff, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllOff()));
\r
1846 connect(ui->action_MarkInvert, SIGNAL(triggered()), activeModel(), SLOT(onMarkInvert()));
\r
1847 connect(ui->action_Refresh, SIGNAL(triggered()), activeModel(), SLOT(refresh()));
\r
1849 ui->LPanel->updateAppearance();
\r
1850 ui->RPanel->updateAppearance();
\r
1851 ui->FPanel->updateAppearance();
\r
1854 ///////////////////////////////////////////////////////////////////////////////
\r
1855 /// \brief MainWindow::activeModel
\r
1856 /// \return アクティブなフォルダモデルを返します。
\r
1858 FolderModel *MainWindow::activeModel() const
\r
1860 return FolderModel::activeModel();
\r
1863 ///////////////////////////////////////////////////////////////////////////////
\r
1864 /// \brief MainWindow::activePanel
\r
1865 /// \return アクティブモデルを所有している可視状態のパネルを返します。
\r
1867 Panel *MainWindow::activePanel() const
\r
1869 if (ui->FPanel->model() == activeModel() && ui->FPanel->isVisible()) {
\r
1870 return ui->FPanel;
\r
1872 if (ui->LPanel->model() == activeModel() && ui->LPanel->isVisible()) {
\r
1873 return ui->LPanel;
\r
1875 if (ui->RPanel->model() == activeModel() && ui->RPanel->isVisible()) {
\r
1876 return ui->RPanel;
\r
1879 qDebug() << ">>>>>>>>>> activePanel() Logic error <<<<<<<<<<";
\r
1883 ///////////////////////////////////////////////////////////////////////////////
\r
1884 /// \brief MainWindow::inactiveModel
\r
1885 /// \return 非アクティブなフォルダモデルを返します。
\r
1887 FolderModel *MainWindow::inactiveModel() const
\r
1889 if (ui->LPanel->model()->isActive()) {
\r
1890 return ui->RPanel->model();
\r
1892 Q_ASSERT(ui->RPanel->model()->isActive());
\r
1893 return ui->LPanel->model();
\r
1896 ///////////////////////////////////////////////////////////////////////////////
\r
1897 /// \brief MainWindow::inactivePanel
\r
1898 /// \return 非アクティブモデルを所有している可視状態のパネルを返します。
\r
1900 Panel *MainWindow::inactivePanel() const
\r
1902 if (ui->LPanel->model() == inactiveModel() && ui->LPanel->isVisible()) {
\r
1903 return ui->LPanel;
\r
1905 if (ui->RPanel->model() == inactiveModel() && ui->RPanel->isVisible()) {
\r
1906 return ui->RPanel;
\r
1908 if (ui->FPanel->model() == inactiveModel() && ui->FPanel->isVisible()) {
\r
1909 return ui->FPanel;
\r
1912 qDebug() << ">>>>>>>>>> inactivePanel() Logic error <<<<<<<<<<";
\r
1916 ///////////////////////////////////////////////////////////////////////////////
\r
1917 /// \brief MainWindow::selectedItems
\r
1918 /// \return マークされているアイテムまたはカレントアイテムのリスト
\r
1920 QFileInfoList MainWindow::selectedItems() const
\r
1922 QFileInfoList list = activeModel()->markedItems();
\r
1923 if (list.isEmpty()) {
\r
1924 qDebug() << focusItemView();
\r
1925 qDebug() << focusItemView()->currentIndex();
\r
1926 Q_ASSERT(focusItemView()->currentIndex().isValid());
\r
1927 list << activeModel()->fileInfo(focusItemView()->currentIndex());
\r
1933 ///////////////////////////////////////////////////////////////////////////////
\r
1934 /// \brief MainWindow::focusItemView
\r
1935 /// \return フォーカスを持つアイテムビュー
\r
1937 QAbstractItemView *MainWindow::focusItemView() const
\r
1939 return static_cast<QAbstractItemView*>(qApp->focusWidget());
\r
1942 ///////////////////////////////////////////////////////////////////////////////
\r
1943 /// \brief MainWindow::setViewMode
\r
1944 /// \param mode 新しいビューモード
\r
1948 void MainWindow::setViewMode(Mode mode)
\r
1950 qDebug() << "MainWindow::setViewMode()" << mode;
\r
1952 QWidget *newFocusWidget = NULL;
\r
1956 ui->FPanel->setVisible(false);
\r
1957 ui->splitter->setVisible(true);
\r
1958 ui->LPanel->setViewItem();
\r
1959 ui->RPanel->setViewItem();
\r
1960 if (m_viewMode == ModeFull) {
\r
1961 activePanel()->folderPanel()->setItemView(focusItemView()->objectName());
\r
1962 activePanel()->folderPanel()->itemView()->setCurrentIndex(
\r
1963 focusItemView()->currentIndex());
\r
1964 ui->FPanel->setModel(NULL);
\r
1966 newFocusWidget = activePanel()->folderPanel()->itemView();
\r
1970 if (m_viewMode == ModeBasic) {
\r
1971 ui->FPanel->setModel(activeModel());
\r
1972 ui->splitter->setVisible(false);
\r
1973 ui->FPanel->setVisible(true);
\r
1974 ui->FPanel->folderPanel()->setItemView(focusItemView()->objectName());
\r
1975 ui->FPanel->folderPanel()->itemView()->setCurrentIndex(
\r
1976 focusItemView()->currentIndex());
\r
1978 ui->FPanel->setViewItem();
\r
1979 newFocusWidget = activePanel()->folderPanel()->itemView();
\r
1983 ui->FPanel->setViewItem(focusItemView()->currentIndex());
\r
1984 ui->splitter->setVisible(false);
\r
1985 ui->FPanel->setVisible(true);
\r
1986 newFocusWidget = ui->FPanel->visibleView();
\r
1990 inactivePanel()->setViewItem(focusItemView()->currentIndex());
\r
1994 m_prevMode = m_viewMode;
\r
1995 m_viewMode = mode;
\r
1997 if (newFocusWidget)
\r
1998 newFocusWidget->setFocus();
\r
2003 ///////////////////////////////////////////////////////////////////////////////
\r
2004 /// \brief MainWindow::startProcess
\r
2005 /// \param cmd 実行するコマンド
\r
2006 /// \param errMsg エラー時の表示メッセージ
\r
2007 /// \return true:成功, false:失敗
\r
2009 bool MainWindow::startProcess(const QString &cmd, const QString &errMsg)
\r
2011 qDebug() << "MainWindow::startProcess" << cmd << errMsg;
\r
2013 QProcess process(this);
\r
2014 process.setWorkingDirectory(activeModel()->rootPath());
\r
2015 if (!process.startDetached(cmd)) {
\r
2016 QMessageBox::critical(this, tr("エラー"), errMsg + "<br/>" + cmd);
\r
2022 ///////////////////////////////////////////////////////////////////////////////
\r
2023 /// \brief MainWindow::updateActions
\r
2025 /// アクションの有効/無効を設定します。
\r
2027 void MainWindow::updateActions()
\r
2029 qDebug() << "MainWindow::updateActions";
\r
2031 bool isView = true;
\r
2032 bool isSearch = false;
\r
2033 bool isImageView = false;
\r
2034 bool toggleSearch = true;
\r
2037 QWidget *w = qApp->focusWidget();
\r
2038 if (w->objectName() == "folderView" || w->objectName() == "thumbnailView") {
\r
2039 setEnabledAllActions(true);
\r
2041 // 現在の選択アイテムが".."の場合、ファイル操作系アクションは無効にする
\r
2042 QFileInfoList list = selectedItems();
\r
2043 if (list.size() == 1 && list[0].fileName() == "..") {
\r
2044 ui->action_Copy->setEnabled(false);
\r
2045 ui->action_Delete->setEnabled(false);
\r
2046 ui->action_Move->setEnabled(false);
\r
2047 ui->action_Rename->setEnabled(false);
\r
2050 // 非二画面の場合、隣のパネルが必要な操作は無効にする
\r
2051 if (!ui->LPanel->folderPanel()->isVisible() ||
\r
2052 !ui->RPanel->folderPanel()->isVisible())
\r
2054 ui->action_Copy->setEnabled(false);
\r
2055 ui->action_Move->setEnabled(false);
\r
2056 ui->action_Swap->setEnabled(false);
\r
2057 ui->action_SyncPanel->setEnabled(false);
\r
2058 ui->action_SyncPanelTo->setEnabled(false);
\r
2061 // 単画面の場合、プレビューモードは無効にする
\r
2062 if (m_viewMode == ModeFull) {
\r
2063 ui->toggle_PreviewMode->setEnabled(false);
\r
2066 // サムネイル表示の場合、左右キーはカーソル移動
\r
2067 if (w->objectName() == "thumbnailView") {
\r
2068 ui->action_KeyLeft->setEnabled(false);
\r
2069 ui->action_KeyRight->setEnabled(false);
\r
2070 ui->toggle_ThumbnailMode->blockSignals(true);
\r
2071 ui->toggle_ThumbnailMode->setChecked(true);
\r
2072 ui->toggle_ThumbnailMode->blockSignals(false);
\r
2075 ui->toggle_ThumbnailMode->blockSignals(true);
\r
2076 ui->toggle_ThumbnailMode->setChecked(false);
\r
2077 ui->toggle_ThumbnailMode->blockSignals(false);
\r
2080 else if (w->objectName() == "searchBox"){
\r
2081 setEnabledAllActions(false);
\r
2085 else if (w->objectName() == "locationBox") {
\r
2086 setEnabledAllActions(false);
\r
2089 else if (w->objectName() == "textView") {
\r
2090 SimpleTextView *v = static_cast<SimpleTextView*>(w);
\r
2091 setEnabledAllActions(false);
\r
2092 toggleSearch = false;
\r
2094 ui->text_ConvertFromEUC->setEnabled(true);
\r
2095 ui->text_ConvertFromEUC->disconnect();
\r
2096 connect(ui->text_ConvertFromEUC, SIGNAL(triggered()), v, SLOT(convertFromEUC()));
\r
2098 ui->text_ConvertFromJIS->setEnabled(true);
\r
2099 ui->text_ConvertFromJIS->disconnect();
\r
2100 connect(ui->text_ConvertFromJIS, SIGNAL(triggered()), v, SLOT(convertFromJIS()));
\r
2102 ui->text_ConvertFromSJIS->setEnabled(true);
\r
2103 ui->text_ConvertFromSJIS->disconnect();
\r
2104 connect(ui->text_ConvertFromSJIS, SIGNAL(triggered()), v, SLOT(convertFromSJIS()));
\r
2106 ui->text_ConvertFromUTF8->setEnabled(true);
\r
2107 ui->text_ConvertFromUTF8->disconnect();
\r
2108 connect(ui->text_ConvertFromUTF8, SIGNAL(triggered()), v, SLOT(convertFromUTF8()));
\r
2110 ui->text_ConvertFromUTF16->setEnabled(true);
\r
2111 ui->text_ConvertFromUTF16->disconnect();
\r
2112 connect(ui->text_ConvertFromUTF16, SIGNAL(triggered()), v, SLOT(convertFromUTF16()));
\r
2114 ui->text_ConvertFromUTF16BE->setEnabled(true);
\r
2115 ui->text_ConvertFromUTF16BE->disconnect();
\r
2116 connect(ui->text_ConvertFromUTF16BE, SIGNAL(triggered()), v, SLOT(convertFromUTF16BE()));
\r
2118 ui->text_ConvertFromUTF16LE->setEnabled(true);
\r
2119 ui->text_ConvertFromUTF16LE->disconnect();
\r
2120 connect(ui->text_ConvertFromUTF16LE, SIGNAL(triggered()), v, SLOT(convertFromUTF16LE()));
\r
2122 ui->text_Copy->disconnect();
\r
2123 connect(ui->text_Copy, SIGNAL(triggered()), v, SLOT(copy()));
\r
2126 else if (w->objectName() == "imageView") {
\r
2127 SimpleImageView *v = static_cast<SimpleImageView*>(w);
\r
2128 setEnabledAllActions(false);
\r
2129 toggleSearch = false;
\r
2130 isImageView = true;
\r
2132 ui->image_FitToWindow->setEnabled(true);
\r
2133 ui->image_FitToWindow->disconnect();
\r
2134 connect(ui->image_FitToWindow, SIGNAL(toggled(bool)), v, SLOT(fitToWindow(bool)));
\r
2136 ui->image_ScaleNormal->setEnabled(true);
\r
2137 ui->image_ScaleNormal->disconnect();
\r
2138 connect(ui->image_ScaleNormal, SIGNAL(triggered()), v, SLOT(scaleNormal()));
\r
2140 ui->image_Rotate90->setEnabled(true);
\r
2141 ui->image_Rotate90->disconnect();
\r
2142 connect(ui->image_Rotate90, SIGNAL(triggered()), v, SLOT(rotate90()));
\r
2144 ui->image_Rotate180->setEnabled(true);
\r
2145 ui->image_Rotate180->disconnect();
\r
2146 connect(ui->image_Rotate180, SIGNAL(triggered()), v, SLOT(rotate180()));
\r
2149 ui->action_About->setEnabled(true);
\r
2150 ui->action_CheckUpdate->setEnabled(true);
\r
2151 ui->action_KeyDown->setEnabled(isView);
\r
2152 ui->action_KeyEnd->setEnabled(isView);
\r
2153 ui->action_KeyHome->setEnabled(isView);
\r
2154 ui->action_KeyUp->setEnabled(isView);
\r
2155 ui->action_Quit->setEnabled(true);
\r
2156 ui->action_ScaleDown->setEnabled(isView);
\r
2157 ui->action_ScaleUp->setEnabled(isView);
\r
2158 ui->action_SearchNext->setEnabled(isSearch);
\r
2159 ui->action_SearchPrev->setEnabled(isSearch);
\r
2160 ui->action_Setting->setEnabled(true);
\r
2161 ui->toggle_Search->setEnabled(toggleSearch);
\r
2162 ui->view_Back->setEnabled(m_viewMode == ModeView);
\r
2164 if (isImageView) {
\r
2165 ui->action_ScaleDown->setText(tr("縮小"));
\r
2166 ui->action_ScaleUp->setText(tr("拡大"));
\r
2169 ui->action_ScaleDown->setText(tr("文字を小さく"));
\r
2170 ui->action_ScaleUp->setText(tr("文字を大きく"));
\r
2173 if (m_viewMode == ModeBasic || m_viewMode == ModeFull) {
\r
2174 ui->toggle_FullMode->setEnabled(true);
\r
2177 ui->toggle_FullMode->setEnabled(false);
\r
2180 ui->action_historyBack->setEnabled(!activeModel()->isHistoryBegin());
\r
2181 ui->action_HistoryForward->setEnabled(!activeModel()->isHistoryEnd());
\r
2185 if ((view = qobject_cast<FolderView*>(w))) {
\r
2186 setEnabledAllActions(true);
\r
2187 qDebug() << ">>>>> フォルダビューの共通メニュー設定 <<<<<";
\r
2188 ui->action_SearchNext->setEnabled(false);
\r
2189 ui->action_SearchPrev->setEnabled(false);
\r
2192 QFileInfo info(activeModel()->fileInfo(view->currentIndex()));
\r
2193 if (info.isDir()) {
\r
2194 ui->action_Open->setIcon(QIcon("://images/Open.png"));
\r
2195 ui->action_Open->setText(tr("開く"));
\r
2196 ui->action_Open->setToolTip(tr("開く"));
\r
2199 ui->action_Open->setIcon(QIcon("://images/Search text.png"));
\r
2200 ui->action_Open->setText(tr("内蔵ビューアで開く"));
\r
2201 ui->action_Open->setToolTip(tr("内蔵ビューアで開く"));
\r
2203 QSettings settings;
\r
2204 if (!settings.value(IniKey_ViewerForceOpen).toBool()) {
\r
2205 QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");
\r
2206 foreach (const QString &ext, list) {
\r
2207 if (ext.toLower() == info.suffix().toLower()) {
\r
2208 ui->action_Open->setEnabled(false);
\r
2215 if (info.fileName() == ".." && activeModel()->markedItems().isEmpty()) {
\r
2217 ui->action_Copy->setEnabled(false);
\r
2218 ui->action_Delete->setEnabled(false);
\r
2219 ui->action_Move->setEnabled(false);
\r
2220 ui->action_Rename->setEnabled(false);
\r
2223 if (m_viewMode & ModeBasic) {
\r
2224 qDebug() << ">>>>> 通常モードのメニュー設定 <<<<<";
\r
2225 ui->action_SearchNext->setEnabled(false);
\r
2226 ui->action_SearchPrev->setEnabled(false);
\r
2228 ui->action_historyBack->setEnabled(!activeModel()->isHistoryBegin());
\r
2229 ui->action_HistoryForward->setEnabled(!activeModel()->isHistoryEnd());
\r
2231 QSettings settings;
\r
2232 ui->action_OpenEditor->setEnabled(!settings.value(IniKey_PathEditor).toString().isEmpty());
\r
2233 ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_PathTerminal).toString().isEmpty());
\r
2236 else if (!otherSideFolderView(view)->isVisible()) {
\r
2237 qDebug() << ">>>>> ハーフモードのメニュー設定 <<<<<";
\r
2238 ui->action_SyncPanel->setEnabled(false);
\r
2239 ui->action_SyncPanelTo->setEnabled(false);
\r
2240 ui->action_Copy->setEnabled(false);
\r
2241 ui->action_Move->setEnabled(false);
\r
2244 else if (qobject_cast<SearchBox*>(w)) {
\r
2245 qDebug() << ">>>>> 検索モードのメニュー設定 <<<<<";
\r
2246 setEnabledAllActions(false);
\r
2247 ui->toggle_Search->setEnabled(true);
\r
2248 ui->action_SearchNext->setEnabled(true);
\r
2249 ui->action_SearchPrev->setEnabled(true);
\r
2250 ui->action_About->setEnabled(true);
\r
2252 else if (qobject_cast<SimpleImageView*>(w) ||
\r
2253 qobject_cast<SimpleTextView*>(w))
\r
2255 qDebug() << ">>>>> ビューアモードのメニュー設定 <<<<<";
\r
2256 setEnabledAllActions(false);
\r
2257 ui->action_Quit->setEnabled(true);
\r
2258 ui->action_Setting->setEnabled(true);
\r
2259 ui->action_CheckUpdate->setEnabled(true);
\r
2260 ui->view_FontSizeDown->setEnabled(true);
\r
2261 ui->view_FontSizeUp->setEnabled(true);
\r
2262 ui->action_KeyDown->setEnabled(true);
\r
2263 ui->action_KeyEnd->setEnabled(true);
\r
2264 ui->action_KeyHome->setEnabled(true);
\r
2265 ui->action_KeyUp->setEnabled(true);
\r
2266 ui->action_About->setEnabled(true);
\r
2267 ui->key_Left->setEnabled(true);
\r
2268 ui->key_Right->setEnabled(true);
\r
2269 if (m_viewMode == ModePreview) {
\r
2270 ui->view_HalfMode->setEnabled(true);
\r
2276 ///////////////////////////////////////////////////////////////////////////////
\r
2277 /// \brief MainWindow::setEnabledAllActions
\r
2278 /// \param enable 有効にする場合はtrue
\r
2280 /// 全てのアクションを有効または無効にします。
\r
2282 void MainWindow::setEnabledAllActions(bool enable)
\r
2284 qDebug() << "MainWindow::setEnabledAllActions()" << enable;
\r
2285 foreach (QAction *action, findChildren<QAction*>()) {
\r
2286 action->setEnabled(enable);
\r
2290 ///////////////////////////////////////////////////////////////////////////////
\r
2291 /// \brief MainWindow::onAbout
\r
2293 /// Aboutダイアログを表示します。
\r
2295 void MainWindow::onAbout()
\r
2297 QMessageBox::about(
\r
2300 qApp->applicationDisplayName() +
\r
2301 tr("<center>Gefu is an Experimental File Utility.<br/>"
\r
2302 "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"
\r
2303 "<p>最新版の情報は<a href='http://gefu.sourceforge.jp/'>公式サイト</a>で公開しています。</p>"
\r
2304 "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));
\r
2307 ///////////////////////////////////////////////////////////////////////////////
\r
2308 /// \brief MainWindow::closeEvent
\r
2309 /// \param event クローズイベント
\r
2313 void MainWindow::closeEvent(QCloseEvent *event)
\r
2315 qDebug() << "MainWindow::closeEvent()";
\r
2316 Preferences prefs(this);
\r
2318 if (prefs.isConfirmQuit()) {
\r
2319 QMessageBox msgBox;
\r
2320 QCheckBox *checkBox = new QCheckBox();
\r
2321 checkBox->setText(tr("次回以降は確認しない"));
\r
2322 msgBox.setCheckBox(checkBox);
\r
2323 msgBox.setText(tr("終了しますか?"));
\r
2324 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
\r
2325 msgBox.setIcon(QMessageBox::Question);
\r
2327 if (msgBox.exec() == QMessageBox::No) {
\r
2328 qDebug() << ">>>>> ユーザによりキャンセルされました <<<<<";
\r
2332 prefs.setConfirmQuit(!checkBox->isChecked());
\r
2335 prefs.saveModel("Left", ui->LPanel->model());
\r
2336 prefs.saveModel("Right", ui->RPanel->model());
\r
2337 prefs.saveWindow(this);
\r
2338 QMainWindow::closeEvent(event);
\r
2341 ///////////////////////////////////////////////////////////////////////////////
\r
2342 /// \brief MainWindow::eventFilter
\r
2343 /// \param watched イベントの発生元オブジェクト
\r
2344 /// \param e 発生したイベント
\r
2345 /// \return イベントを処理した場合はtrueを返します。
\r
2347 bool MainWindow::eventFilter(QObject *watched, QEvent *e)
\r
2349 switch (e->type()) {
\r
2350 case QEvent::KeyPress:
\r
2352 return onKeyPressEvent(watched, static_cast<QKeyEvent*>(e));
\r
2354 case QEvent::ContextMenu:
\r
2355 // コンテキストメニューイベントの処理
\r
2356 return onContextMenuEvent(watched, static_cast<QContextMenuEvent*>(e));
\r
2358 case QEvent::Drop:
\r
2359 qDebug() << "QEvent::Drop";
\r
2361 return onDropEvent(watched, static_cast<QDropEvent*>(e));
\r