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
49 connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(app_focusChange(QWidget*,QWidget*)));
\r
51 // ステータスバーにウィジェットを設定する
\r
52 QLabel *label = new QLabel(this);
\r
53 label->setAlignment(Qt::AlignRight);
\r
54 label->setObjectName("Right");
\r
55 ui->statusBar->addPermanentWidget(label, 0);
\r
58 qApp->setApplicationName("Gefu");
\r
59 qApp->setApplicationVersion(QString("%1").arg(VERSION_VALUE));
\r
60 qApp->setOrganizationDomain("sourceforge.jp");
\r
61 qApp->setOrganizationName("gefu");
\r
62 qApp->setWindowIcon(QIcon("://images/file-manager.png"));
\r
66 QSettings::setDefaultFormat(QSettings::IniFormat);
\r
67 QSettings settings(this);
\r
68 if (QFileInfo::exists(settings.fileName())) {
\r
69 QFile(settings.fileName()).remove();
\r
70 QDir().rmdir(QFileInfo(settings.fileName()).absolutePath());
\r
75 ui->LPanel->setModel(new FolderModel(this));
\r
76 ui->RPanel->setModel(new FolderModel(this));
\r
77 setActiveModel(ui->LPanel->model());
\r
80 ui->LPanel->initialize(this);
\r
81 ui->RPanel->initialize(this);
\r
82 ui->FPanel->initialize(this);
\r
83 ui->FPanel->setVisible(false);
\r
86 Preferences prefs(this);
\r
87 prefs.restoreModel("Left", ui->LPanel->model());
\r
88 prefs.restoreModel("Right", ui->RPanel->model());
\r
97 setWindowTitle(tr("げふぅ Ver%1").arg(VERSION_VALUE));
\r
98 setWindowIcon(QIcon("://images/file-manager.png"));
\r
99 prefs.restoreWindow(this);
\r
102 if (prefs.isCheckUpdate()) {
\r
103 onCheckUpdate(true);
\r
106 ui->LPanel->updateAppearance(prefs);
\r
107 ui->LPanel->model()->updateAppearance(prefs);
\r
108 ui->RPanel->updateAppearance(prefs);
\r
109 ui->RPanel->model()->updateAppearance(prefs);
\r
112 ///////////////////////////////////////////////////////////////////////////////
\r
113 /// \brief MainWindow::~MainWindow
\r
117 MainWindow::~MainWindow()
\r
122 ///////////////////////////////////////////////////////////////////////////////
\r
123 /// \brief MainWindow::app_focusChange
\r
124 /// \param old フォーカスを失うウィジェット
\r
125 /// \param now フォーカスを得るウィジェット
\r
129 void MainWindow::app_focusChange(QWidget *old, QWidget *now)
\r
131 qDebug() << "MainWindow::app_focusChange()";
\r
132 if (old) qDebug() << " old is" << old->objectName();
\r
133 if (now) qDebug() << " now is" << now->objectName();
\r
135 // フォルダビューがフォーカスを得た場合
\r
136 if (now && (now->objectName() == "folderView" ||
\r
137 now->objectName() == "thumbnailView"))
\r
139 connect(focusItemView()->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
\r
140 this, SLOT(view_currentChanged(QModelIndex,QModelIndex)));
\r
141 FolderModel *m = static_cast<FolderModel*>(focusItemView()->model());
\r
143 ui->statusBar->showMessage(m->filePath(focusItemView()->currentIndex()));
\r
146 // 検索ボックスがフォーカスを失った場合
\r
147 if (old && old->objectName() == "searchBox") {
\r
149 ui->toggle_Search->setChecked(false);
\r
152 // アクションの有効/無効を設定する
\r
158 ///////////////////////////////////////////////////////////////////////////////
\r
159 /// \brief MainWindow::model_PreReset
\r
161 /// FolderModelリセット前の処理
\r
163 void MainWindow::model_PreReset()
\r
165 qDebug() << "MainWindow::model_PreReset()";
\r
167 ui->statusBar->showMessage(tr("ファイルリストを取得しています..."));
\r
170 ///////////////////////////////////////////////////////////////////////////////
\r
171 /// \brief MainWindow::model_PostReset
\r
173 /// FolderModelリセット後の処理
\r
175 void MainWindow::model_PostReset()
\r
177 qDebug() << "MainWindow::model_PostReset()";
\r
179 FolderModel *m = static_cast<FolderModel*>(sender());
\r
180 if (!m->error().isEmpty()) {
\r
181 ui->statusBar->showMessage(m->error());
\r
184 ui->statusBar->showMessage(tr("レディ"));
\r
188 ///////////////////////////////////////////////////////////////////////////////
\r
189 /// \brief MainWindow::onRunCommand
\r
191 /// 入力されたコマンドを実行します。
\r
193 void MainWindow::onRunCommand()
\r
195 qDebug() << "MainWindow::onRunCommand";
\r
197 QFileInfoList list = selectedItems();
\r
198 QString command = QString::null;
\r
199 foreach (const QFileInfo &info, list) {
\r
201 QString path = info.absoluteFilePath();
\r
203 QString path = info.fileName();
\r
205 if (info.isExecutable()) {
\r
206 command = QQ(path) + " " + command;
\r
209 command += " " + QQ(path);
\r
213 QInputDialog dlg(this);
\r
214 dlg.setInputMode(QInputDialog::TextInput);
\r
215 dlg.setWindowTitle(tr("コマンドを実行"));
\r
216 dlg.setLabelText(tr("コマンド:"));
\r
217 dlg.setTextValue(command);
\r
218 dlg.resize(width() * 0.8, dlg.height());
\r
220 int ret = dlg.exec();
\r
221 command = dlg.textValue();
\r
222 if (ret == QDialog::Accepted && !command.isEmpty()) {
\r
223 startProcess(command, tr("コマンドの実行に失敗しました。"));
\r
227 ///////////////////////////////////////////////////////////////////////////////
\r
228 /// \brief MainWindow::onExpandLeft
\r
232 void MainWindow::onExpandLeft()
\r
234 qDebug() << "MainWindow::onExpandLeft()";
\r
236 QList<int> sizes = ui->splitter->sizes();
\r
237 QList<int> newSizes;
\r
239 newSizes << sizes[0] + 30;
\r
240 newSizes << sizes[1] - 30;
\r
242 ui->splitter->setSizes(newSizes);
\r
245 ///////////////////////////////////////////////////////////////////////////////
\r
246 /// \brief MainWindow::onExpandRight
\r
250 void MainWindow::onExpandRight()
\r
252 qDebug() << "MainWindow::onExpandLeft()";
\r
254 QList<int> sizes = ui->splitter->sizes();
\r
255 QList<int> newSizes;
\r
257 newSizes << sizes[0] - 30;
\r
258 newSizes << sizes[1] + 30;
\r
260 ui->splitter->setSizes(newSizes);
\r
263 ///////////////////////////////////////////////////////////////////////////////
\r
264 /// \brief MainWindow::onToggleMark
\r
268 void MainWindow::onToggleMark()
\r
270 qDebug() << "MainWindow::onToggleMark()";
\r
272 QModelIndex index = focusItemView()->currentIndex();
\r
273 if (activeModel()->isMarked(index)) {
\r
274 activeModel()->setData(index, Qt::Unchecked, Qt::CheckStateRole);
\r
277 activeModel()->setData(index, Qt::Checked, Qt::CheckStateRole);
\r
280 if (index.row() < activeModel()->rowCount() - 1) {
\r
281 index = activeModel()->index(index.row() + 1, 0);
\r
282 focusItemView()->setCurrentIndex(index);
\r
286 ///////////////////////////////////////////////////////////////////////////////
\r
287 /// \brief MainWindow::view_statusChanged
\r
288 /// \param text ステータス文字列
\r
290 /// ビューから受け取った文字列をステータスバーに表示します。
\r
292 void MainWindow::view_statusChanged(const QString &text)
\r
294 ui->statusBar->findChild<QLabel*>("Right")->setText(text);
\r
297 ///////////////////////////////////////////////////////////////////////////////
\r
298 /// \brief MainWindow::view_currentChanged
\r
299 /// \param current 新しいカレントインデックス
\r
300 /// \param previous (使用しません)
\r
302 /// カレントインデックスが変更された場合の処理を行います。
\r
304 void MainWindow::view_currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
\r
306 qDebug() << "MainWindow::view_currentChanged()" << current;
\r
307 Q_UNUSED(previous);
\r
309 if (focusItemView() != sender()->parent()) {
\r
313 ui->statusBar->showMessage(activeModel()->filePath(current));
\r
315 if (m_viewMode == ModePreview) {
\r
316 inactivePanel()->setViewItem(current);
\r
322 ///////////////////////////////////////////////////////////////////////////////
\r
323 /// \brief MainWindow::view_finished
\r
327 void MainWindow::view_finished()
\r
329 qDebug() << "MainWindow::view_finished()";
\r
331 ui->statusBar->findChild<QLabel*>("Right")->setText("");
\r
333 setViewMode(m_prevMode);
\r
336 ///////////////////////////////////////////////////////////////////////////////
\r
337 /// \brief MainWindow::onMove
\r
339 /// 選択アイテムを隣のパネルに移動します。
\r
341 void MainWindow::onMove()
\r
343 qDebug() << "MainWindow::onMove";
\r
345 QFileInfoList list = selectedItems();
\r
346 if (list.isEmpty()) {
\r
350 int row = focusItemView()->currentIndex().row();
\r
352 QString tgtPath = inactiveModel()->rootPath();
\r
353 moveItems(list, tgtPath);
\r
355 if (row >= activeModel()->rowCount()) {
\r
356 row = activeModel()->rowCount() - 1;
\r
358 focusItemView()->setCurrentIndex(activeModel()->index(row, 1));
\r
361 ///////////////////////////////////////////////////////////////////////////////
\r
362 /// \brief MainWindow::onKeyLeft
\r
364 /// ←キー押下時の処理を行います。
\r
366 void MainWindow::onKeyLeft()
\r
368 qDebug() << "MainWindow::onKeyLeft()";
\r
370 QWidget *w = qApp->focusWidget();
\r
371 if (w->objectName() == "folderView")
\r
373 QWidget *panel = w->parentWidget()->parentWidget();
\r
374 if (panel == ui->LPanel) {
\r
375 activeModel()->onCdUp();
\r
377 else if (ui->LPanel->folderPanel()->isVisible()){
\r
378 ui->LPanel->folderPanel()->itemView()->setFocus();
\r
382 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier);
\r
383 qApp->sendEvent(w, &event);
\r
387 ///////////////////////////////////////////////////////////////////////////////
\r
388 /// \brief MainWindow::onKeyRight
\r
390 /// →キー押下時の処理を行います。
\r
392 void MainWindow::onKeyRight()
\r
394 qDebug() << "MainWindow::onKeyRight()";
\r
396 QWidget *w = qApp->focusWidget();
\r
397 if (w->objectName() == "folderView")
\r
399 QWidget *panel = w->parentWidget()->parentWidget();
\r
400 if (panel == ui->RPanel) {
\r
401 activeModel()->onCdUp();
\r
403 else if (ui->RPanel->folderPanel()->isVisible()){
\r
404 ui->RPanel->folderPanel()->itemView()->setFocus();
\r
408 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier);
\r
409 qApp->sendEvent(w, &event);
\r
413 ///////////////////////////////////////////////////////////////////////////////
\r
414 /// \brief MainWindow::onChooseFolder
\r
416 /// 選択したフォルダに移動します。
\r
418 void MainWindow::onChooseFolder()
\r
420 qDebug() << "MainWindow::onChooseFolder()";
\r
422 QString path = QFileDialog::getExistingDirectory(
\r
423 this, tr("フォルダを選択"), activeModel()->rootPath());
\r
424 if (!path.isEmpty()) {
\r
425 activeModel()->setRootPath(path);
\r
426 // updateActions();
\r
430 ///////////////////////////////////////////////////////////////////////////////
\r
431 /// \brief MainWindow::onCopyFileName
\r
433 /// ファイル名をクリップボードにコピーします。
\r
435 void MainWindow::onCopyFileName()
\r
437 qDebug() << "MainWindow::onCopyFileName()";
\r
439 QClipboard *clipboard = qApp->clipboard();
\r
440 clipboard->setText(activeModel()->fileName(focusItemView()->currentIndex()));
\r
443 ///////////////////////////////////////////////////////////////////////////////
\r
444 /// \brief MainWindow::onCopyFilePath
\r
446 /// フルパスをクリップボードにコピーします。
\r
448 void MainWindow::onCopyFilePath()
\r
450 qDebug() << "MainWindow::onCopyFilePath()";
\r
452 QClipboard *clipboard = qApp->clipboard();
\r
453 clipboard->setText(activeModel()->filePath(focusItemView()->currentIndex()));
\r
456 ///////////////////////////////////////////////////////////////////////////////
\r
457 /// \brief MainWindow::askOverWrite
\r
458 /// \param copyMethod 上書き方法
\r
459 /// \param alias 別名
\r
460 /// \param srcPath コピー元パス
\r
461 /// \param tgtPath コピー先パス
\r
463 /// 上書きの処理方法を選択するダイアログを表示します。
\r
465 void MainWindow::askOverWrite(QString *copyMethod,
\r
467 const QString &srcPath,
\r
468 const QString &tgtPath)
\r
470 qDebug() << "MainWindow::askOverWrite()";
\r
472 CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());
\r
473 if (!m_overwriteDialog.isKeepSetting() ||
\r
474 m_overwriteDialog.copyMethod() == "rbRename")
\r
476 m_overwriteDialog.setFileInfo(srcPath, tgtPath);
\r
477 if (m_overwriteDialog.exec() == QDialog::Rejected) {
\r
478 worker->requestStop();
\r
481 *copyMethod = m_overwriteDialog.copyMethod();
\r
482 *alias = m_overwriteDialog.alias();
\r
484 worker->endAsking();
\r
487 ///////////////////////////////////////////////////////////////////////////////
\r
488 /// \brief MainWindow::onAddBookmark
\r
492 void MainWindow::onAddBookmark()
\r
494 qDebug() << "MainWindow::onAddBookmark()";
\r
495 qDebug() << sender()->objectName();
\r
498 if (sender()->objectName() == "bookmarkBtn") {
\r
499 FolderPanel *p = static_cast<FolderPanel*>(sender()->parent());
\r
506 QFileInfo fi(m->rootPath());
\r
507 Preferences(this).addBookmark(fi.fileName(), fi.absoluteFilePath());
\r
508 initBookmarkMenu();
\r
510 activePanel()->folderPanel()->itemView()->setFocus();
\r
511 ui->statusBar->showMessage(tr("%1をブックマークに追加しました").arg(fi.absoluteFilePath()));
\r
514 ///////////////////////////////////////////////////////////////////////////////
\r
515 /// \brief MainWindow::view_copyAvailable
\r
516 /// \param yes コピー可能ならtrue
\r
518 /// 選択範囲の有無をメニューに反映します。
\r
520 void MainWindow::view_copyAvailable(bool yes)
\r
522 ui->text_Copy->setEnabled(yes);
\r
525 ///////////////////////////////////////////////////////////////////////////////
\r
526 /// \brief MainWindow::copyItems
\r
527 /// \param list コピー元リスト
\r
528 /// \param tgtDir コピー先フォルダ
\r
532 void MainWindow::copyItems(const QFileInfoList &list, const QString &tgtDir)
\r
534 qDebug() << "MainWindow::copyItems()" << tgtDir;
\r
536 Preferences prefs(this);
\r
537 if (prefs.isConfirmCopy() &&
\r
538 QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))
\r
539 != QMessageBox::Yes)
\r
544 // 上書き確認ダイアログを初期化する
\r
545 m_overwriteDialog.reset();
\r
548 CopyMoveWorker *worker = new CopyMoveWorker();
\r
549 connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),
\r
550 this, SLOT(askOverWrite(QString*,QString*,QString,QString)));
\r
551 worker->setCopyList(&list);
\r
552 worker->setTargetDir(tgtDir);
\r
553 worker->setMoveMode(false);
\r
555 // 進捗ダイアログを表示して、処理を開始する
\r
556 OperationDialog opDlg(this);
\r
557 opDlg.setWindowTitle(tr("コピー"));
\r
558 opDlg.setWorker(worker);
\r
559 opDlg.setAutoClose(prefs.isAutoCloseCopy());
\r
563 prefs.setAutoCloseCopy(opDlg.autoClose());
\r
566 ///////////////////////////////////////////////////////////////////////////////
\r
567 /// \brief MainWindow::moveItems
\r
568 /// \param list 移動元リスト
\r
569 /// \param tgtDir 移動先フォルダ
\r
573 void MainWindow::moveItems(const QFileInfoList &list, const QString &tgtDir)
\r
575 qDebug() << "MainWindow::moveItems()" << tgtDir;
\r
577 Preferences prefs(this);
\r
578 if (prefs.isConfirmMove() &&
\r
579 QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))
\r
580 != QMessageBox::Yes)
\r
585 // 上書き確認ダイアログを初期化する
\r
586 m_overwriteDialog.reset();
\r
589 CopyMoveWorker *worker = new CopyMoveWorker();
\r
590 connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),
\r
591 this, SLOT(askOverWrite(QString*,QString*,QString,QString)));
\r
592 worker->setCopyList(&list);
\r
593 worker->setTargetDir(tgtDir);
\r
594 worker->setMoveMode(true);
\r
596 // 進捗ダイアログを表示して、処理を開始する
\r
597 OperationDialog opDlg(this);
\r
598 opDlg.setWindowTitle(tr("移動"));
\r
599 opDlg.setWorker(worker);
\r
600 opDlg.setAutoClose(prefs.isAutoCloseMove());
\r
604 prefs.setAutoCloseMove(opDlg.autoClose());
\r
607 ///////////////////////////////////////////////////////////////////////////////
\r
608 /// \brief MainWindow::onContextMenuEvent
\r
609 /// \param obj イベントが発生したオブジェクト
\r
610 /// \param e コンテキストメニューイベント
\r
611 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。
\r
613 bool MainWindow::onContextMenuEvent(QObject *obj, QContextMenuEvent *e)
\r
616 if (obj->objectName() == "textView") {
\r
617 menu.addAction(ui->text_ConvertFromEUC);
\r
618 menu.addAction(ui->text_ConvertFromJIS);
\r
619 menu.addAction(ui->text_ConvertFromSJIS);
\r
620 menu.addAction(ui->text_ConvertFromUTF8);
\r
621 menu.addAction(ui->text_ConvertFromUTF16);
\r
622 menu.addAction(ui->text_ConvertFromUTF16BE);
\r
623 menu.addAction(ui->text_ConvertFromUTF16LE);
\r
624 menu.addSeparator();
\r
625 menu.addAction(ui->text_Copy);
\r
626 if (m_viewMode == ModeView) {
\r
627 menu.addSeparator();
\r
628 menu.addAction(ui->view_Back);
\r
631 else if (obj->objectName() == "imageView") {
\r
632 menu.addAction(ui->image_FitToWindow);
\r
633 menu.addAction(ui->action_ScaleDown);
\r
634 menu.addAction(ui->action_ScaleUp);
\r
635 menu.addAction(ui->image_ScaleNormal);
\r
636 menu.addSeparator();
\r
637 menu.addAction(ui->image_Rotate90);
\r
638 menu.addAction(ui->image_Rotate180);
\r
640 if (m_viewMode == ModeView) {
\r
641 menu.addSeparator();
\r
642 menu.addAction(ui->view_Back);
\r
645 else if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView") {
\r
646 QModelIndex index = focusItemView()->indexAt(e->pos());
\r
647 if (index.isValid()) {
\r
648 menu.addAction(ui->action_Open);
\r
649 menu.addAction(ui->action_OpenWith);
\r
650 menu.addAction(ui->action_OpenEditor);
\r
651 menu.addAction(ui->action_OpenTerminal);
\r
652 menu.addAction(ui->action_OpenArchiver);
\r
653 menu.addSeparator();
\r
654 menu.addAction(ui->action_Copy);
\r
655 menu.addAction(ui->action_Move);
\r
656 menu.addSeparator();
\r
657 menu.addAction(ui->action_Delete);
\r
658 menu.addSeparator();
\r
659 menu.addAction(ui->action_CopyFileName);
\r
660 menu.addAction(ui->action_CopyFilePath);
\r
661 menu.addSeparator();
\r
662 menu.addAction(ui->action_Rename);
\r
665 menu.addAction(ui->action_historyBack);
\r
666 menu.addAction(ui->action_HistoryForward);
\r
667 menu.addSeparator();
\r
668 menu.addAction(ui->action_CdUp);
\r
669 menu.addAction(ui->action_CdHome);
\r
670 menu.addAction(ui->action_CdRoot);
\r
671 menu.addAction(ui->action_Cd);
\r
672 menu.addSeparator();
\r
673 menu.addAction(ui->action_CreateFile);
\r
674 menu.addAction(ui->action_CreateFolder);
\r
678 qDebug() << "No context menu" << obj->objectName();
\r
682 QAction *selected = menu.exec(e->globalPos());
\r
683 if (selected == ui->action_ScaleDown ||
\r
684 selected == ui->action_ScaleUp)
\r
686 ui->image_FitToWindow->blockSignals(true);
\r
687 ui->image_FitToWindow->setChecked(false);
\r
688 ui->image_FitToWindow->blockSignals(false);
\r
694 ///////////////////////////////////////////////////////////////////////////////
\r
695 /// \brief MainWindow::onDropEvent
\r
696 /// \param obj イベントが発生したオブジェクト
\r
697 /// \param e ドロップイベントオブジェクト
\r
698 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。
\r
700 bool MainWindow::onDropEvent(QObject *obj, QDropEvent *e)
\r
702 qDebug() << "MainWindow::onDropEvent()";
\r
704 if (obj->parent()->objectName() == "folderView" ||
\r
705 obj->parent()->objectName() == "thumbnailView")
\r
707 QAbstractItemView *v = static_cast<QAbstractItemView*>(obj->parent());
\r
708 if (v->property("dragging").toBool()) {
\r
709 // 自分自身へのドロップなら何もしない
\r
713 QFileInfoList list;
\r
714 foreach (const QUrl &url, e->mimeData()->urls()) {
\r
715 QString path = QFileInfo(url.toLocalFile()).canonicalFilePath();
\r
716 if (!path.isEmpty()) {
\r
720 qDebug() << "drop path is empty." << url;
\r
724 if (list.isEmpty()) {
\r
725 // ローカルファイルのドロップでなければ何もしない
\r
729 e->acceptProposedAction();
\r
732 QAction *actCopy = menu.addAction(tr("コピー"));
\r
733 QAction *actMove = menu.addAction(tr("移動"));
\r
734 menu.addSeparator();
\r
735 menu.addAction(tr("キャンセル"));
\r
737 QAction *selected = menu.exec(v->mapToGlobal(e->pos()));
\r
738 FolderModel *m = static_cast<FolderModel*>(v->model());
\r
739 if (selected == actMove) {
\r
740 moveItems(list, m->rootPath());
\r
742 else if (selected == actCopy) {
\r
743 copyItems(list, m->rootPath());
\r
748 qDebug() << obj->parent()->objectName();
\r
754 ///////////////////////////////////////////////////////////////////////////////
\r
755 /// \brief MainWindow::onKeyPressEvent
\r
756 /// \param obj イベントが発生したオブジェクト
\r
757 /// \param e キーイベントオブジェクト
\r
758 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。
\r
760 bool MainWindow::onKeyPressEvent(QObject *obj, QKeyEvent *e)
\r
762 qDebug() << "MainWindow::onKeyPressEvent()";
\r
764 QString modifier = QString::null;
\r
765 if (e->modifiers() & Qt::ShiftModifier) { modifier += "Shift+"; }
\r
766 if (e->modifiers() & Qt::ControlModifier) { modifier += "Ctrl+"; }
\r
767 if (e->modifiers() & Qt::AltModifier) { modifier += "Alt+"; }
\r
768 if (e->modifiers() & Qt::MetaModifier) { modifier += "Meta+"; }
\r
770 QString key = modifier + QKeySequence(e->key()).toString();
\r
772 foreach (QAction *action, findChildren<QAction*>()) {
\r
773 if (action->isEnabled()) {
\r
774 foreach (const QKeySequence &ks, action->shortcuts()) {
\r
775 if (ks.toString() == key) {
\r
776 qDebug() << "emit" << action->objectName();
\r
777 if (action->isCheckable()) {
\r
789 if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView")
\r
792 switch (e->key()) {
\r
796 case Qt::Key_Right:
\r
799 case Qt::Key_PageDown:
\r
800 case Qt::Key_PageUp:
\r
813 ///////////////////////////////////////////////////////////////////////////////
\r
814 /// \brief MainWindow::onCopy
\r
816 /// 選択アイテムを隣のパネルにコピーします。
\r
818 void MainWindow::onCopy()
\r
820 qDebug() << "MainWindow::onCopy";
\r
822 QFileInfoList list = selectedItems();
\r
823 if (list.isEmpty()) {
\r
827 QString tgtPath = inactiveModel()->rootPath();
\r
828 copyItems(list, tgtPath);
\r
831 ///////////////////////////////////////////////////////////////////////////////
\r
832 /// \brief MainWindow::onCreateFile
\r
836 void MainWindow::onCreateFile()
\r
838 qDebug() << "MainWindow::onCreateFile";
\r
841 QString name = QInputDialog::getText(
\r
842 this, tr("ファイルを作成"), tr("ファイル名:"),
\r
843 QLineEdit::Normal, "", &bOk);
\r
844 if (!bOk || name.isEmpty()) {
\r
848 QModelIndex index = activeModel()->touch(name);
\r
849 if (!index.isValid()) {
\r
850 QMessageBox::critical(
\r
852 tr("ファイルの作成に失敗しました。"));
\r
856 focusItemView()->setCurrentIndex(index);
\r
857 if (Preferences(this).isOpenAfterCreation()) {
\r
858 onOpenEditor(index);
\r
862 ///////////////////////////////////////////////////////////////////////////////
\r
863 /// \brief MainWindow::onCreateFolder
\r
867 void MainWindow::onCreateFolder()
\r
869 qDebug() << "MainWindow::onCreateFolder";
\r
872 QString name = QInputDialog::getText(
\r
873 this, tr("フォルダを作成"), tr("フォルダ名:"),
\r
874 QLineEdit::Normal, "", &bOk);
\r
875 if (!bOk || name.isEmpty()) {
\r
879 QModelIndex index = activeModel()->mkdir(name);
\r
880 if (!index.isValid()) {
\r
881 QMessageBox::critical(
\r
883 tr("フォルダの作成に失敗しました。"));
\r
887 focusItemView()->setCurrentIndex(index);
\r
888 if (Preferences(this).isMoveAfterCreation()) {
\r
893 ///////////////////////////////////////////////////////////////////////////////
\r
894 /// \brief MainWindow::onDelete
\r
898 void MainWindow::onDelete()
\r
900 qDebug() << "MainWindow::onDelete";
\r
902 QFileInfoList list = selectedItems();
\r
903 if (list.isEmpty()) {
\r
907 Preferences prefs(this);
\r
908 if (prefs.isConfirmDelete()) {
\r
910 if (list.size() == 1) {
\r
911 msg = list[0].fileName();
\r
914 msg = tr("%1個のアイテム").arg(list.size());
\r
916 int ret = QMessageBox::question(
\r
918 msg + tr("を削除しますか?"));
\r
919 if (ret != QMessageBox::Yes) {
\r
924 DeleteWorker *worker = new DeleteWorker();
\r
925 worker->setDeleteList(&list);
\r
927 OperationDialog opDlg(this);
\r
928 opDlg.setWindowTitle(tr("削除"));
\r
929 opDlg.setWorker(worker);
\r
930 opDlg.setAutoClose(prefs.isAutoCloseDelete());
\r
932 int row = focusItemView()->currentIndex().row();
\r
936 if (row >= activeModel()->rowCount()) {
\r
937 row = activeModel()->rowCount() - 1;
\r
939 focusItemView()->setCurrentIndex(activeModel()->index(row, 1));
\r
941 prefs.setAutoCloseDelete(opDlg.autoClose());
\r
944 ///////////////////////////////////////////////////////////////////////////////
\r
945 /// \brief MainWindow::onOpen
\r
946 /// \param index (使用しません)
\r
950 void MainWindow::onOpen(const QModelIndex &index)
\r
953 qDebug() << "MainWindow::onOpen()" << index;
\r
955 QModelIndex current = focusItemView()->currentIndex();
\r
956 if (activeModel()->isDir(current)) {
\r
957 activeModel()->setRootPath(activeModel()->filePath(current));
\r
962 QString ext = activeModel()->fileInfo(current).suffix().toLower();
\r
963 QStringList list = Preferences(this).getPreferExtensions().split(",", QString::SkipEmptyParts);
\r
964 foreach (const QString& s, list) {
\r
965 if (ext == s.trimmed().toLower()) {
\r
966 QString path = QDir::toNativeSeparators(activeModel()->filePath(current));
\r
967 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
973 setViewMode(ModeView);
\r
976 ///////////////////////////////////////////////////////////////////////////////
\r
977 /// \brief MainWindow::onOpenEditor
\r
980 /// 選択アイテムを外部エディタで開きます。
\r
982 void MainWindow::onOpenEditor(const QModelIndex &index)
\r
984 qDebug() << "MainWindow::onOpenEditor";
\r
986 QString exe = Preferences(this).getEditorPath();
\r
987 if (exe.isEmpty()) {
\r
988 QMessageBox::critical(
\r
990 tr("外部エディタのパスが未定義です。"));
\r
994 QFileInfoList list;
\r
995 if (index.isValid()) {
\r
996 list << activeModel()->fileInfo(index);
\r
999 list = selectedItems();
\r
1003 foreach (const QFileInfo &info, list) {
\r
1004 files += " " + QQ(info.absoluteFilePath());
\r
1007 QString command = "open -a " + exe + files;
\r
1009 QString command = exe + files;
\r
1011 if (!startProcess(command, tr("外部エディタの起動に失敗しました。"))) {
\r
1012 qDebug() << command;
\r
1016 ///////////////////////////////////////////////////////////////////////////////
\r
1017 /// \brief MainWindow::onOpenTerminal
\r
1019 /// 選択アイテムをターミナルで開きます。
\r
1021 void MainWindow::onOpenTerminal()
\r
1023 qDebug() << "MainWindow::onOpenTerminal";
\r
1025 QString exe = Preferences(this).getTerminalPath();
\r
1026 if (exe.isEmpty()) {
\r
1027 QMessageBox::critical(
\r
1029 tr("ターミナルのパスが未定義です。"));
\r
1033 QSet<QString> dirs;
\r
1034 foreach (const QFileInfo &info, selectedItems()) {
\r
1035 if (info.isDir()) {
\r
1036 dirs.insert(info.absoluteFilePath());
\r
1039 dirs.insert(info.absolutePath());
\r
1043 foreach (const QString &dir, dirs) {
\r
1045 QString command = "open -n -a " + exe + " " + QQ(dir);
\r
1047 QString command = exe + " " + QQ(dir);
\r
1049 if (!startProcess(command, tr("ターミナルの起動に失敗しました。"))) {
\r
1050 qDebug() << command;
\r
1056 ///////////////////////////////////////////////////////////////////////////////
\r
1057 /// \brief MainWindow::onOpenArchiver
\r
1059 /// 選択アイテムをアーカイバで開きます。
\r
1061 void MainWindow::onOpenArchiver()
\r
1063 qDebug() << "MainWindow::onOpenArchiver";
\r
1065 QString exe = Preferences(this).getArchiverPath();
\r
1066 if (exe.isEmpty()) {
\r
1067 QMessageBox::critical(
\r
1069 tr("アーカイバのパスが未定義です。"));
\r
1074 foreach (const QFileInfo &info, selectedItems()) {
\r
1075 files += " " + QQ(info.absoluteFilePath());
\r
1078 QString command = "open -a " + exe + files;
\r
1080 QString command = exe + files;
\r
1082 if (!startProcess(command, tr("アーカイバの起動に失敗しました。"))) {
\r
1083 qDebug() << command;
\r
1087 ///////////////////////////////////////////////////////////////////////////////
\r
1088 /// \brief MainWindow::onOpenBookmark
\r
1090 /// ブックマークのメニュー項目をクリックしたときの処理を行います。
\r
1092 void MainWindow::onOpenBookmark()
\r
1094 qDebug() << "MainWindow::onOpenBookmark()";
\r
1096 QAction *action = qobject_cast<QAction*>(sender());
\r
1097 Q_CHECK_PTR(action);
\r
1099 int i = action->data().toInt();
\r
1100 activeModel()->setRootPath(Preferences(this).getBookmarkPath(i));
\r
1103 ///////////////////////////////////////////////////////////////////////////////
\r
1104 /// \brief MainWindow::onRename
\r
1106 /// 選択アイテムの名前を変更します。
\r
1108 void MainWindow::onRename()
\r
1110 qDebug() << "MainWindow::onRename";
\r
1112 QFileInfoList list = selectedItems();
\r
1113 if (list.isEmpty()) {
\r
1117 AbstractRenameDialog *dlg;
\r
1118 if (list.size() == 1) {
\r
1119 dlg = new RenameSingleDialog(this);
\r
1122 dlg = new RenameMultiDialog(this);
\r
1124 dlg->setWorkingDirectory(activeModel()->rootPath());
\r
1125 dlg->setNames(list);
\r
1126 int dlgResult = dlg->exec();
\r
1127 if (dlgResult != QDialog::Accepted || dlg->renameMap().isEmpty()) {
\r
1131 Preferences prefs(this);
\r
1132 if (prefs.isConfirmRename() &&
\r
1133 QMessageBox::question(this, tr("確認"), tr("名前の変更を実行しますか?"))
\r
1134 != QMessageBox::Yes)
\r
1139 RenameWorker *worker = new RenameWorker();
\r
1140 worker->setRenameMap(&dlg->renameMap());
\r
1142 OperationDialog opDlg(this);
\r
1143 opDlg.setWindowTitle(tr("名前を変更"));
\r
1144 opDlg.setWorker(worker);
\r
1145 opDlg.setAutoClose(prefs.isAutoCloseRename());
\r
1149 QFileInfo fi(dlg->renameMap().first());
\r
1150 focusItemView()->setCurrentIndex(activeModel()->search(fi.fileName()));
\r
1152 prefs.setAutoCloseRename(opDlg.autoClose());
\r
1155 ///////////////////////////////////////////////////////////////////////////////
\r
1156 /// \brief MainWindow::onOpenWith
\r
1158 /// 関連付けられたアプリで開きます。
\r
1160 void MainWindow::onOpenWith()
\r
1162 qDebug() << "MainWindow::onOpenWith";
\r
1164 foreach (const QFileInfo &info, selectedItems()) {
\r
1165 QString path = QDir::toNativeSeparators(info.absoluteFilePath());
\r
1166 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
1170 ///////////////////////////////////////////////////////////////////////////////
\r
1171 /// \brief MainWindow::showBookmarkDialog
\r
1173 /// ブックマーク一覧ダイアログを表示します。
\r
1175 void MainWindow::showBookmarkDialog()
\r
1177 qDebug() << "MainWindow::showBookmarkDialog()";
\r
1179 BookmarkDialog dlg(this);
\r
1180 dlg.setEditMode(false);
\r
1181 if (dlg.exec() == QDialog::Accepted) {
\r
1182 int n = dlg.selectedIndex();
\r
1183 activeModel()->setRootPath(Preferences(this).getBookmarkPath(n + 1));
\r
1187 ///////////////////////////////////////////////////////////////////////////////
\r
1188 /// \brief MainWindow::onEditBookmark
\r
1190 /// ブックマークの編集ダイアログを表示します。
\r
1192 void MainWindow::onEditBookmark()
\r
1194 qDebug() << "MainWindow::onEditBookmark()";
\r
1196 BookmarkDialog dlg(this);
\r
1197 dlg.setEditMode(true);
\r
1199 if (dlg.exec() == QDialog::Accepted) {
\r
1200 initBookmarkMenu();
\r
1204 ///////////////////////////////////////////////////////////////////////////////
\r
1205 /// \brief MainWindow::showFilterDialog
\r
1207 /// フィルタ設定ダイアログを表示します。
\r
1209 void MainWindow::showFilterDialog()
\r
1211 qDebug() << "MainWindow::showFilterDialog()";
\r
1213 QString filters = activeModel()->nameFilters().join(" ");
\r
1215 QInputDialog dlg(this);
\r
1216 dlg.setInputMode(QInputDialog::TextInput);
\r
1217 dlg.setWindowTitle(tr("フィルタを設定"));
\r
1218 dlg.setLabelText(tr("フィルタ:"));
\r
1219 dlg.setTextValue(filters);
\r
1220 dlg.resize(width() * 0.8, dlg.height());
\r
1222 if (dlg.exec() == QDialog::Accepted) {
\r
1223 filters = dlg.textValue();
\r
1224 if (filters.isEmpty()) {
\r
1228 activeModel()->setNameFilters(filters.split(" ", QString::SkipEmptyParts));
\r
1229 activeModel()->refresh();
\r
1233 ///////////////////////////////////////////////////////////////////////////////
\r
1234 /// \brief MainWindow::showHistoryDialog
\r
1236 /// 履歴選択ダイアログを表示します。
\r
1238 void MainWindow::showHistoryDialog()
\r
1240 qDebug() << "MainWindow::showHistoryDialog()";
\r
1242 HistoryDialog dlg(this);
\r
1243 dlg.setModel(ui->LPanel->model(), ui->RPanel->model(), activeModel());
\r
1247 ///////////////////////////////////////////////////////////////////////////////
\r
1248 /// \brief MainWindow::showSortDialog
\r
1250 /// ソート方法選択ダイアログを表示します。
\r
1252 void MainWindow::showSortDialog()
\r
1254 qDebug() << "MainWindow::showSortDialog()";
\r
1256 SortDialog dlg(this);
\r
1257 dlg.setModel(activeModel());
\r
1261 ///////////////////////////////////////////////////////////////////////////////
\r
1262 /// \brief MainWindow::onSplitCenter
\r
1266 void MainWindow::onSplitCenter()
\r
1268 qDebug() << "MainWindow::onSplitCenter()";
\r
1270 QList<int> sizes = ui->splitter->sizes();
\r
1271 int sizeTotal = sizes[0] + sizes[1];
\r
1272 sizes[0] = sizeTotal / 2;
\r
1273 sizes[1] = sizeTotal - sizes[0];
\r
1274 ui->splitter->setSizes(sizes);
\r
1277 ///////////////////////////////////////////////////////////////////////////////
\r
1278 /// \brief MainWindow::onSwap
\r
1280 /// 左右のパネルでモデルを入れ替えます。
\r
1282 void MainWindow::onSwap()
\r
1284 qDebug() << "MainWindow::onSwap()";
\r
1286 FolderModel *tmp = ui->LPanel->model();
\r
1287 ui->LPanel->setModel(ui->RPanel->model());
\r
1288 ui->RPanel->setModel(tmp);
\r
1291 if (ui->LPanel->model()->isActive()) {
\r
1292 setActiveModel(ui->RPanel->model());
\r
1295 setActiveModel(ui->LPanel->model());
\r
1299 ///////////////////////////////////////////////////////////////////////////////
\r
1300 /// \brief MainWindow::onTogglePreviewMode
\r
1301 /// \param checked メニューのチェック状態
\r
1303 /// 通常モード/プレビューモードを切り替えます。
\r
1305 void MainWindow::onTogglePreviewMode(bool checked)
\r
1307 qDebug() << "MainWindow::onTogglePreviewMode()" << checked;
\r
1310 setViewMode(ModePreview);
\r
1313 setViewMode(ModeBasic);
\r
1317 ///////////////////////////////////////////////////////////////////////////////
\r
1318 /// \brief MainWindow::onSearchNext
\r
1322 void MainWindow::onSearchNext()
\r
1324 qDebug() << "MainWindow::onSearchNext";
\r
1326 static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext();
\r
1329 ///////////////////////////////////////////////////////////////////////////////
\r
1330 /// \brief MainWindow::onSearchPrev
\r
1334 void MainWindow::onSearchPrev()
\r
1336 qDebug() << "MainWindow::onSearchPrev";
\r
1338 static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext(-1);
\r
1341 ///////////////////////////////////////////////////////////////////////////////
\r
1342 /// \brief MainWindow::onKeyDown
\r
1344 /// フォーカスウィジェットに↓キーイベントを送信します。
\r
1346 void MainWindow::onKeyDown()
\r
1348 qDebug() << "MainWindow::onKeyDown()";
\r
1350 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);
\r
1351 qApp->sendEvent(qApp->focusWidget(), &event);
\r
1354 ///////////////////////////////////////////////////////////////////////////////
\r
1355 /// \brief MainWindow::onKeyEnd
\r
1357 /// フォーカスウィジェットにEND, Ctrl+ENDキーイベントを送信します。
\r
1359 void MainWindow::onKeyEnd()
\r
1361 qDebug() << "MainWindow::onKeyEnd()";
\r
1363 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);
\r
1364 qApp->sendEvent(qApp->focusWidget(), &event1);
\r
1366 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);
\r
1367 qApp->sendEvent(qApp->focusWidget(), &event2);
\r
1370 ///////////////////////////////////////////////////////////////////////////////
\r
1371 /// \brief MainWindow::onKeyHome
\r
1373 /// フォーカスウィジェットにHOME, Ctrl+HOMEキーイベントを送信します。
\r
1375 void MainWindow::onKeyHome()
\r
1377 qDebug() << "MainWindow::onKeyHome()";
\r
1379 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);
\r
1380 qApp->sendEvent(qApp->focusWidget(), &event1);
\r
1382 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);
\r
1383 qApp->sendEvent(qApp->focusWidget(), &event2);
\r
1386 ///////////////////////////////////////////////////////////////////////////////
\r
1387 /// \brief MainWindow::onKeyUp
\r
1389 /// フォーカスウィジェットに↑キーイベントを送信します。
\r
1391 void MainWindow::onKeyUp()
\r
1393 qDebug() << "MainWindow::onKeyUp()";
\r
1395 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
\r
1396 qApp->sendEvent(qApp->focusWidget(), &event);
\r
1399 ///////////////////////////////////////////////////////////////////////////////
\r
1400 /// \brief MainWindow::onKeyHomeOther
\r
1402 /// 非フォーカスビューにHOME, Ctrl+HOMEキーイベントを送信します。
\r
1404 void MainWindow::onKeyHomeOther()
\r
1406 qDebug() << "MainWindow::onKeyHomeOther()";
\r
1408 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);
\r
1409 sendEventOther(&event1);
\r
1411 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);
\r
1412 sendEventOther(&event2);
\r
1415 ///////////////////////////////////////////////////////////////////////////////
\r
1416 /// \brief MainWindow::onKeyDownOther
\r
1418 /// 非フォーカスビューに↓キーイベントを送信します。
\r
1420 void MainWindow::onKeyDownOther()
\r
1422 qDebug() << "MainWindow::onKeyDownOther()";
\r
1424 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);
\r
1425 sendEventOther(&event);
\r
1428 ///////////////////////////////////////////////////////////////////////////////
\r
1429 /// \brief MainWindow::onKeyUpOther
\r
1431 /// 非フォーカスビューに↑キーイベントを送信します。
\r
1433 void MainWindow::onKeyUpOther()
\r
1435 qDebug() << "MainWindow::onKeyUpOther()";
\r
1437 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
\r
1438 sendEventOther(&event);
\r
1441 ///////////////////////////////////////////////////////////////////////////////
\r
1442 /// \brief MainWindow::onKeyEndOther
\r
1444 /// 非フォーカスビューにEND, Ctrl+ENDキーイベントを送信します。
\r
1446 void MainWindow::onKeyEndOther()
\r
1448 qDebug() << "MainWindow::onKeyEndOther()";
\r
1450 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);
\r
1451 sendEventOther(&event1);
\r
1453 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);
\r
1454 sendEventOther(&event2);
\r
1457 ///////////////////////////////////////////////////////////////////////////////
\r
1458 /// \brief MainWindow::onScaleDown
\r
1462 void MainWindow::onScaleDown()
\r
1464 qDebug() << "MainWindow::onScaleDown()";
\r
1466 AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());
\r
1468 view->scaleDown();
\r
1471 Preferences prefs(this);
\r
1472 if (ui->LPanel->isVisible()) {
\r
1473 ui->LPanel->updateAppearance(prefs);
\r
1474 ui->LPanel->model()->updateAppearance(prefs);
\r
1476 if (ui->RPanel->isVisible()) {
\r
1477 ui->RPanel->updateAppearance(prefs);
\r
1478 ui->RPanel->model()->updateAppearance(prefs);
\r
1480 if (ui->FPanel->isVisible()) {
\r
1481 ui->FPanel->updateAppearance(prefs);
\r
1482 ui->FPanel->model()->updateAppearance(prefs);
\r
1486 ///////////////////////////////////////////////////////////////////////////////
\r
1487 /// \brief MainWindow::onScaleUp
\r
1491 void MainWindow::onScaleUp()
\r
1493 qDebug() << "MainWindow::onScaleUp()";
\r
1495 AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());
\r
1500 Preferences prefs(this);
\r
1501 if (ui->LPanel->isVisible()) {
\r
1502 ui->LPanel->updateAppearance(prefs);
\r
1503 ui->LPanel->model()->updateAppearance(prefs);
\r
1505 if (ui->RPanel->isVisible()) {
\r
1506 ui->RPanel->updateAppearance(prefs);
\r
1507 ui->RPanel->model()->updateAppearance(prefs);
\r
1509 if (ui->FPanel->isVisible()) {
\r
1510 ui->FPanel->updateAppearance(prefs);
\r
1511 ui->FPanel->model()->updateAppearance(prefs);
\r
1515 ///////////////////////////////////////////////////////////////////////////////
\r
1516 /// \brief MainWindow::initBookmarkMenu
\r
1518 /// ブックマークメニューを初期化します。
\r
1520 void MainWindow::initBookmarkMenu()
\r
1522 qDebug() << "MainWindow::initBookmarkMenu()";
\r
1524 Preferences prefs(this);
\r
1525 QFileIconProvider iconProvider;
\r
1527 ui->menu_Bookmark->clear();
\r
1528 ui->menu_Bookmark->addAction(ui->action_AddBookmark);
\r
1529 ui->menu_Bookmark->addAction(ui->action_EditBookmark);
\r
1530 ui->menu_Bookmark->addSeparator();
\r
1531 for (int n = 1; ; n++) {
\r
1532 QString name = prefs.getBookmarkEntry(n);
\r
1533 if (name.isEmpty()) {
\r
1536 QString path = prefs.getBookmarkPath(n);
\r
1538 QAction *action = ui->menu_Bookmark->addAction(
\r
1539 iconProvider.icon(QFileInfo(path)), name, this,
\r
1540 SLOT(onOpenBookmark()));
\r
1541 action->setData(n);
\r
1544 m_actions = findChildren<QAction*>();
\r
1547 ///////////////////////////////////////////////////////////////////////////////
\r
1548 /// \brief MainWindow::sendEventOther
\r
1549 /// \param event 送信するイベント
\r
1551 /// 非フォーカスのビューにイベントを送信します。
\r
1553 void MainWindow::sendEventOther(QEvent *event)
\r
1555 qDebug() << "MainWindow::sendEventOther()";
\r
1557 // フォーカスを持たない、可視状態のビューを検索する
\r
1558 foreach (QWidget *w, findChildren<QWidget*>()) {
\r
1559 AbstractView *view = dynamic_cast<AbstractView*>(w);
\r
1561 if (w->isVisible() && !w->hasFocus()) {
\r
1562 qDebug() << "Send event to" << w->objectName();
\r
1563 qApp->sendEvent(w, event);
\r
1569 ///////////////////////////////////////////////////////////////////////////////
\r
1570 /// \brief MainWindow::onSyncPanel
\r
1572 /// 隣のパネルと同じフォルダを表示します。
\r
1574 void MainWindow::onSyncPanel()
\r
1576 qDebug() << "MainWindow::onSyncPanel()";
\r
1578 activeModel()->setRootPath(inactiveModel()->rootPath());
\r
1581 ///////////////////////////////////////////////////////////////////////////////
\r
1582 /// \brief MainWindow::onSyncPanelTo
\r
1584 /// 隣のパネルに同じフォルダを表示します。
\r
1586 void MainWindow::onSyncPanelTo()
\r
1588 qDebug() << "MainWindow::onSyncPanelTo()";
\r
1590 inactiveModel()->setRootPath(activeModel()->rootPath());
\r
1593 ///////////////////////////////////////////////////////////////////////////////
\r
1594 /// \brief MainWindow::onToggleFullMode
\r
1595 /// \param checked メニューのチェック状態
\r
1597 /// 単画面/二画面を切り替えます。
\r
1599 void MainWindow::onToggleFullMode(bool checked)
\r
1601 qDebug() << "MainWindow::onToggleFullMode()" << checked;
\r
1604 setViewMode(ModeFull);
\r
1607 setViewMode(ModeBasic);
\r
1612 ///////////////////////////////////////////////////////////////////////////////
\r
1613 /// \brief MainWindow::onToggleSearch
\r
1614 /// \param checked メニューのチェック状態
\r
1616 /// 検索ボックスの表示/非表示を切り替えます。
\r
1618 void MainWindow::onToggleSearch(bool checked)
\r
1620 qDebug() << "MainWindow::onToggleSearch" << checked;
\r
1623 ui->LPanel->folderPanel()->toggleSearch(checked);
\r
1624 ui->RPanel->folderPanel()->toggleSearch(checked);
\r
1627 ///////////////////////////////////////////////////////////////////////////////
\r
1628 /// \brief MainWindow::showPreferenceDialog
\r
1630 /// 環境設定ダイアログを表示します。
\r
1632 void MainWindow::showPreferenceDialog()
\r
1634 qDebug() << "MainWindow::showPreferenceDialog";
\r
1636 PreferenceDialog dlg(this);
\r
1637 if (dlg.exec() == QDialog::Accepted) {
\r
1638 Preferences prefs(this);
\r
1639 if (ui->LPanel->isVisible()) {
\r
1640 ui->LPanel->updateAppearance(prefs);
\r
1641 ui->LPanel->model()->updateAppearance(prefs);
\r
1643 if (ui->RPanel->isVisible()) {
\r
1644 ui->RPanel->updateAppearance(prefs);
\r
1645 ui->RPanel->model()->updateAppearance(prefs);
\r
1647 if (ui->FPanel->isVisible()) {
\r
1648 ui->FPanel->updateAppearance(prefs);
\r
1649 ui->FPanel->model()->updateAppearance(prefs);
\r
1654 ///////////////////////////////////////////////////////////////////////////////
\r
1655 /// \brief MainWindow::onToggleHidden
\r
1656 /// \param checked メニューのチェック状態
\r
1658 /// 隠しファイルの表示/非表示を切り替えます。
\r
1660 void MainWindow::onToggleHidden(bool checked)
\r
1662 qDebug() << "MainWindow::onToggleHidden" << checked;
\r
1665 activeModel()->setFilter(activeModel()->filter() | QDir::Hidden);
\r
1668 activeModel()->setFilter(activeModel()->filter() ^ QDir::Hidden);
\r
1671 activeModel()->refresh();
\r
1674 ///////////////////////////////////////////////////////////////////////////////
\r
1675 /// \brief MainWindow::onToggleSystem
\r
1676 /// \param checked メニューのチェック状態
\r
1678 /// システムファイルの表示/非表示を切り替えます。
\r
1680 void MainWindow::onToggleSystem(bool checked)
\r
1682 qDebug() << "MainWindow::onToggleSystem" << checked;
\r
1685 activeModel()->setFilter(activeModel()->filter() | QDir::System);
\r
1688 activeModel()->setFilter(activeModel()->filter() ^ QDir::System);
\r
1691 activeModel()->refresh();
\r
1694 ///////////////////////////////////////////////////////////////////////////////
\r
1695 /// \brief MainWindow::onToggleThumbnailMode
\r
1696 /// \param checked メニューのチェック状態
\r
1698 /// サムネイルモードの切り替えを行います。
\r
1700 void MainWindow::onToggleThumbnailMode(bool checked)
\r
1702 qDebug() << "MainWindow::onToggleThumbnailMode()" << checked;
\r
1704 activePanel()->folderPanel()->toggleView(checked);
\r
1707 ///////////////////////////////////////////////////////////////////////////////
\r
1708 /// \brief MainWindow::onCheckUpdate
\r
1709 /// \param silent 最新版を使用している場合に何も表示しないならtrue
\r
1711 /// アップデートの有無を確認します。
\r
1713 void MainWindow::onCheckUpdate(bool silent)
\r
1715 qDebug() << "MainWindow::onCheckUpdate()" << silent;
\r
1717 QNetworkAccessManager *manager = new QNetworkAccessManager(this);
\r
1720 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));
\r
1723 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinished(QNetworkReply*)));
\r
1726 manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_win.html")));
\r
1727 #elif defined(Q_OS_MAC)
\r
1728 manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_mac.html")));
\r
1732 void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)
\r
1734 qDebug() << "MainWindow::checkUpdateFinishedSilent";
\r
1736 checkUpdateFinished(reply, true);
\r
1739 void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)
\r
1741 qDebug() << "MainWindow::checkUpdateFinished" << silent;
\r
1743 if (reply->error() == QNetworkReply::NoError) {
\r
1744 QString str = reply->readAll();
\r
1745 str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);
\r
1746 QRegExp rx("Gefu([0-9]+)");
\r
1748 QString version = rx.cap(1);
\r
1749 if (version.toInt() > VERSION_VALUE * 100) {
\r
1750 QMessageBox::information(
\r
1752 tr("最新のバージョンが存在します。<br/>") +
\r
1753 tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));
\r
1755 else if (!silent) {
\r
1756 QMessageBox::information(
\r
1758 tr("お使いのバージョンは最新です。"));
\r
1761 else if (!silent){
\r
1762 QMessageBox::critical(
\r
1764 tr("最新バージョンのチェックに失敗しました。<br/>") +
\r
1765 reply->errorString());
\r
1769 ///////////////////////////////////////////////////////////////////////////////
\r
1770 /// \brief MainWindow::initActions
\r
1774 void MainWindow::initActions()
\r
1776 qDebug() << "MainWindow::initActions()";
\r
1778 QList<QKeySequence> shortcuts;
\r
1780 //>>>>> 追加のショートカットキーを設定する
\r
1781 appendActionShortcut(ui->action_Open, "M");
\r
1782 appendActionShortcut(ui->action_OpenWith, "Shift+M");
\r
1783 appendActionShortcut(ui->view_Back, "Backspace");
\r
1784 // MacだとShift+の形で認識されてしまうもの
\r
1785 appendActionShortcut(ui->action_ScaleUp, "Shift++");
\r
1786 appendActionShortcut(ui->action_Filter, "Shift+*");
\r
1787 appendActionShortcut(ui->action_OpenTerminal, "Shift+>");
\r
1788 appendActionShortcut(ui->action_About, "Shift+?");
\r
1789 appendActionShortcut(ui->image_ScaleNormal, "Shift+=");
\r
1792 connect(ui->action_About, SIGNAL(triggered()), this, SLOT(onAbout()));
\r
1793 connect(ui->action_AddBookmark, SIGNAL(triggered()), this, SLOT(onAddBookmark()));
\r
1794 connect(ui->action_Cd, SIGNAL(triggered()), this, SLOT(onChooseFolder()));
\r
1795 connect(ui->action_CheckUpdate, SIGNAL(triggered()), this, SLOT(onCheckUpdate()));
\r
1796 connect(ui->action_Copy, SIGNAL(triggered()), this, SLOT(onCopy()));
\r
1797 connect(ui->action_CopyFileName, SIGNAL(triggered()), this, SLOT(onCopyFileName()));
\r
1798 connect(ui->action_CopyFilePath, SIGNAL(triggered()), this, SLOT(onCopyFilePath()));
\r
1799 connect(ui->action_CreateFile, SIGNAL(triggered()), this, SLOT(onCreateFile()));
\r
1800 connect(ui->action_CreateFolder, SIGNAL(triggered()), this, SLOT(onCreateFolder()));
\r
1801 connect(ui->action_Delete, SIGNAL(triggered()), this, SLOT(onDelete()));
\r
1802 connect(ui->action_EditBookmark, SIGNAL(triggered()), this, SLOT(onEditBookmark()));
\r
1803 connect(ui->action_ExpandLeft, SIGNAL(triggered()), this, SLOT(onExpandLeft()));
\r
1804 connect(ui->action_ExpandRight, SIGNAL(triggered()), this, SLOT(onExpandRight()));
\r
1805 connect(ui->action_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));
\r
1806 connect(ui->action_History, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));
\r
1807 connect(ui->action_KeyDown, SIGNAL(triggered()), this, SLOT(onKeyDown()));
\r
1808 connect(ui->action_KeyDownOther, SIGNAL(triggered()), this, SLOT(onKeyDownOther()));
\r
1809 connect(ui->action_KeyEnd, SIGNAL(triggered()), this, SLOT(onKeyEnd()));
\r
1810 connect(ui->action_KeyEndOther, SIGNAL(triggered()), this, SLOT(onKeyEndOther()));
\r
1811 connect(ui->action_KeyHome, SIGNAL(triggered()), this, SLOT(onKeyHome()));
\r
1812 connect(ui->action_KeyHomeOther, SIGNAL(triggered()), this, SLOT(onKeyHomeOther()));
\r
1813 connect(ui->action_KeyLeft, SIGNAL(triggered()), this, SLOT(onKeyLeft()));
\r
1814 connect(ui->action_KeyUp, SIGNAL(triggered()), this, SLOT(onKeyUp()));
\r
1815 connect(ui->action_KeyUpOther, SIGNAL(triggered()), this, SLOT(onKeyUpOther()));
\r
1816 connect(ui->action_Move, SIGNAL(triggered()), this, SLOT(onMove()));
\r
1817 connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(onOpen()));
\r
1818 connect(ui->action_OpenArchiver, SIGNAL(triggered()), this, SLOT(onOpenArchiver()));
\r
1819 connect(ui->action_OpenEditor, SIGNAL(triggered()), this, SLOT(onOpenEditor()));
\r
1820 connect(ui->action_OpenTerminal, SIGNAL(triggered()), this, SLOT(onOpenTerminal()));
\r
1821 connect(ui->action_OpenWith, SIGNAL(triggered()), this, SLOT(onOpenWith()));
\r
1822 connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));
\r
1823 connect(ui->action_Rename, SIGNAL(triggered()), this, SLOT(onRename()));
\r
1824 connect(ui->action_KeyRight, SIGNAL(triggered()), this, SLOT(onKeyRight()));
\r
1825 connect(ui->action_RunCommand, SIGNAL(triggered()), this, SLOT(onRunCommand()));
\r
1826 connect(ui->action_ScaleDown, SIGNAL(triggered()), this, SLOT(onScaleDown()));
\r
1827 connect(ui->action_ScaleUp, SIGNAL(triggered()), this, SLOT(onScaleUp()));
\r
1828 connect(ui->action_SearchNext, SIGNAL(triggered()), this, SLOT(onSearchNext()));
\r
1829 connect(ui->action_SearchPrev, SIGNAL(triggered()), this, SLOT(onSearchPrev()));
\r
1830 connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));
\r
1831 connect(ui->action_ShowBookmark, SIGNAL(triggered()), this, SLOT(showBookmarkDialog()));
\r
1832 connect(ui->action_Sort, SIGNAL(triggered()), this, SLOT(showSortDialog()));
\r
1833 connect(ui->action_SplitCenter, SIGNAL(triggered()), this, SLOT(onSplitCenter()));
\r
1834 connect(ui->action_Swap, SIGNAL(triggered()), this, SLOT(onSwap()));
\r
1835 connect(ui->action_SyncPanel, SIGNAL(triggered()), this, SLOT(onSyncPanel()));
\r
1836 connect(ui->action_SyncPanelTo, SIGNAL(triggered()), this, SLOT(onSyncPanelTo()));
\r
1838 connect(ui->toggle_FullMode, SIGNAL(toggled(bool)), this, SLOT(onToggleFullMode(bool)));
\r
1839 connect(ui->toggle_Hidden, SIGNAL(toggled(bool)), this, SLOT(onToggleHidden(bool)));
\r
1840 connect(ui->toggle_Mark, SIGNAL(triggered()), this, SLOT(onToggleMark()));
\r
1841 connect(ui->toggle_PreviewMode, SIGNAL(toggled(bool)), this, SLOT(onTogglePreviewMode(bool)));
\r
1842 connect(ui->toggle_Search, SIGNAL(toggled(bool)), this, SLOT(onToggleSearch(bool)));
\r
1843 connect(ui->toggle_System, SIGNAL(toggled(bool)), this, SLOT(onToggleSystem(bool)));
\r
1844 connect(ui->toggle_ThumbnailMode, SIGNAL(toggled(bool)), this, SLOT(onToggleThumbnailMode(bool)));
\r
1846 connect(ui->view_Back, SIGNAL(triggered()), this, SLOT(view_finished()));
\r
1850 ///////////////////////////////////////////////////////////////////////////////
\r
1851 /// \brief MainWindow::setActiveModel
\r
1852 /// \param m 新しいアクティブモデル
\r
1854 /// アクティブモデルを変更します。
\r
1856 void MainWindow::setActiveModel(FolderModel *m)
\r
1858 qDebug() << "MainWindow::setActiveModel()" << m;
\r
1860 if (activeModel()) {
\r
1861 activeModel()->disconnect(this);
\r
1862 ui->action_CdHome->disconnect();
\r
1863 ui->action_CdRoot->disconnect();
\r
1864 ui->action_CdUp->disconnect();
\r
1865 ui->action_historyBack->disconnect();
\r
1866 ui->action_HistoryForward->disconnect();
\r
1867 ui->action_MarkAll->disconnect();
\r
1868 ui->action_MarkAllFiles->disconnect();
\r
1869 ui->action_MarkAllOff->disconnect();
\r
1870 ui->action_MarkInvert->disconnect();
\r
1871 ui->action_Refresh->disconnect();
\r
1876 connect(activeModel(), SIGNAL(modelAboutToBeReset()), this, SLOT(model_PreReset()));
\r
1877 connect(activeModel(), SIGNAL(modelReset()), this, SLOT(model_PostReset()));
\r
1878 connect(ui->action_CdHome, SIGNAL(triggered()), activeModel(), SLOT(onCdHome()));
\r
1879 connect(ui->action_CdRoot, SIGNAL(triggered()), activeModel(), SLOT(onCdRoot()));
\r
1880 connect(ui->action_CdUp, SIGNAL(triggered()), activeModel(), SLOT(onCdUp()));
\r
1881 connect(ui->action_historyBack, SIGNAL(triggered()), activeModel(), SLOT(onHistoryBack()));
\r
1882 connect(ui->action_HistoryForward, SIGNAL(triggered()), activeModel(), SLOT(onHistoryForward()));
\r
1883 connect(ui->action_MarkAll, SIGNAL(triggered()), activeModel(), SLOT(onMarkAll()));
\r
1884 connect(ui->action_MarkAllFiles, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllFiles()));
\r
1885 connect(ui->action_MarkAllOff, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllOff()));
\r
1886 connect(ui->action_MarkInvert, SIGNAL(triggered()), activeModel(), SLOT(onMarkInvert()));
\r
1887 connect(ui->action_Refresh, SIGNAL(triggered()), activeModel(), SLOT(refresh()));
\r
1889 Preferences prefs(this);
\r
1890 if (ui->LPanel->isVisible()) {
\r
1891 ui->LPanel->updateAppearance(prefs);
\r
1892 ui->LPanel->model()->updateAppearance(prefs);
\r
1894 if (ui->RPanel->isVisible()) {
\r
1895 ui->RPanel->updateAppearance(prefs);
\r
1896 ui->RPanel->model()->updateAppearance(prefs);
\r
1898 if (ui->FPanel->isVisible()) {
\r
1899 ui->FPanel->updateAppearance(prefs);
\r
1900 ui->FPanel->model()->updateAppearance(prefs);
\r
1904 ///////////////////////////////////////////////////////////////////////////////
\r
1905 /// \brief MainWindow::activeModel
\r
1906 /// \return アクティブなフォルダモデルを返します。
\r
1908 FolderModel *MainWindow::activeModel() const
\r
1910 return FolderModel::activeModel();
\r
1913 ///////////////////////////////////////////////////////////////////////////////
\r
1914 /// \brief MainWindow::activePanel
\r
1915 /// \return アクティブモデルを所有している可視状態のパネルを返します。
\r
1917 Panel *MainWindow::activePanel() const
\r
1919 if (ui->FPanel->model() == activeModel() && ui->FPanel->isVisible()) {
\r
1920 return ui->FPanel;
\r
1922 if (ui->LPanel->model() == activeModel() && ui->LPanel->isVisible()) {
\r
1923 return ui->LPanel;
\r
1925 if (ui->RPanel->model() == activeModel() && ui->RPanel->isVisible()) {
\r
1926 return ui->RPanel;
\r
1929 qDebug() << ">>>>>>>>>> activePanel() Logic error <<<<<<<<<<";
\r
1933 ///////////////////////////////////////////////////////////////////////////////
\r
1934 /// \brief MainWindow::inactiveModel
\r
1935 /// \return 非アクティブなフォルダモデルを返します。
\r
1937 FolderModel *MainWindow::inactiveModel() const
\r
1939 if (ui->LPanel->model()->isActive()) {
\r
1940 return ui->RPanel->model();
\r
1942 Q_ASSERT(ui->RPanel->model()->isActive());
\r
1943 return ui->LPanel->model();
\r
1946 ///////////////////////////////////////////////////////////////////////////////
\r
1947 /// \brief MainWindow::inactivePanel
\r
1948 /// \return 非アクティブモデルを所有している可視状態のパネルを返します。
\r
1950 Panel *MainWindow::inactivePanel() const
\r
1952 if (ui->LPanel->model() == inactiveModel() && ui->LPanel->isVisible()) {
\r
1953 return ui->LPanel;
\r
1955 if (ui->RPanel->model() == inactiveModel() && ui->RPanel->isVisible()) {
\r
1956 return ui->RPanel;
\r
1958 if (ui->FPanel->model() == inactiveModel() && ui->FPanel->isVisible()) {
\r
1959 return ui->FPanel;
\r
1962 qDebug() << ">>>>>>>>>> inactivePanel() Logic error <<<<<<<<<<";
\r
1966 ///////////////////////////////////////////////////////////////////////////////
\r
1967 /// \brief MainWindow::selectedItems
\r
1968 /// \return マークされているアイテムまたはカレントアイテムのリスト
\r
1970 QFileInfoList MainWindow::selectedItems() const
\r
1972 QFileInfoList list = activeModel()->markedItems();
\r
1973 if (list.isEmpty()) {
\r
1974 qDebug() << focusItemView();
\r
1975 qDebug() << focusItemView()->currentIndex();
\r
1976 Q_ASSERT(focusItemView()->currentIndex().isValid());
\r
1977 list << activeModel()->fileInfo(focusItemView()->currentIndex());
\r
1983 ///////////////////////////////////////////////////////////////////////////////
\r
1984 /// \brief MainWindow::focusItemView
\r
1985 /// \return フォーカスを持つアイテムビュー
\r
1987 QAbstractItemView *MainWindow::focusItemView() const
\r
1989 return static_cast<QAbstractItemView*>(qApp->focusWidget());
\r
1992 ///////////////////////////////////////////////////////////////////////////////
\r
1993 /// \brief MainWindow::setViewMode
\r
1994 /// \param mode 新しいビューモード
\r
1998 void MainWindow::setViewMode(Mode mode)
\r
2000 qDebug() << "MainWindow::setViewMode()" << mode;
\r
2002 QWidget *newFocusWidget = NULL;
\r
2006 ui->FPanel->setVisible(false);
\r
2007 ui->splitter->setVisible(true);
\r
2008 ui->LPanel->setViewItem();
\r
2009 ui->RPanel->setViewItem();
\r
2010 if (m_viewMode == ModeFull) {
\r
2011 activePanel()->folderPanel()->setItemView(focusItemView()->objectName());
\r
2012 activePanel()->folderPanel()->itemView()->setCurrentIndex(
\r
2013 focusItemView()->currentIndex());
\r
2014 ui->FPanel->setModel(NULL);
\r
2016 newFocusWidget = activePanel()->folderPanel()->itemView();
\r
2020 if (m_viewMode == ModeBasic) {
\r
2021 ui->FPanel->setModel(activeModel());
\r
2022 ui->splitter->setVisible(false);
\r
2023 ui->FPanel->setVisible(true);
\r
2024 ui->FPanel->folderPanel()->setItemView(focusItemView()->objectName());
\r
2025 ui->FPanel->folderPanel()->itemView()->setCurrentIndex(
\r
2026 focusItemView()->currentIndex());
\r
2028 ui->FPanel->setViewItem();
\r
2029 newFocusWidget = activePanel()->folderPanel()->itemView();
\r
2033 ui->FPanel->setViewItem(focusItemView()->currentIndex());
\r
2034 ui->splitter->setVisible(false);
\r
2035 ui->FPanel->setVisible(true);
\r
2036 newFocusWidget = ui->FPanel->visibleView();
\r
2040 inactivePanel()->setViewItem(focusItemView()->currentIndex());
\r
2044 m_prevMode = m_viewMode;
\r
2045 m_viewMode = mode;
\r
2047 if (newFocusWidget)
\r
2048 newFocusWidget->setFocus();
\r
2053 ///////////////////////////////////////////////////////////////////////////////
\r
2054 /// \brief MainWindow::startProcess
\r
2055 /// \param cmd 実行するコマンド
\r
2056 /// \param errMsg エラー時の表示メッセージ
\r
2057 /// \return true:成功, false:失敗
\r
2059 bool MainWindow::startProcess(const QString &cmd, const QString &errMsg)
\r
2061 qDebug() << "MainWindow::startProcess" << cmd << errMsg;
\r
2063 QProcess process(this);
\r
2064 process.setWorkingDirectory(activeModel()->rootPath());
\r
2065 if (!process.startDetached(cmd)) {
\r
2066 QMessageBox::critical(this, tr("エラー"), errMsg + "<br/>" + cmd);
\r
2072 ///////////////////////////////////////////////////////////////////////////////
\r
2073 /// \brief MainWindow::updateActions
\r
2075 /// アクションの有効/無効を設定します。
\r
2077 void MainWindow::updateActions()
\r
2079 qDebug() << "MainWindow::updateActions";
\r
2081 bool isView = true;
\r
2082 bool isSearch = false;
\r
2083 bool isImageView = false;
\r
2084 bool toggleSearch = true;
\r
2087 QWidget *w = qApp->focusWidget();
\r
2088 if (w->objectName() == "folderView" || w->objectName() == "thumbnailView") {
\r
2089 setEnabledAllActions(true);
\r
2091 // 現在の選択アイテムが".."の場合、ファイル操作系アクションは無効にする
\r
2092 QFileInfoList list = selectedItems();
\r
2093 if (list.size() == 1 && list[0].fileName() == "..") {
\r
2094 ui->action_Copy->setEnabled(false);
\r
2095 ui->action_Delete->setEnabled(false);
\r
2096 ui->action_Move->setEnabled(false);
\r
2097 ui->action_Rename->setEnabled(false);
\r
2100 // 非二画面の場合、隣のパネルが必要な操作は無効にする
\r
2101 if (!ui->LPanel->folderPanel()->isVisible() ||
\r
2102 !ui->RPanel->folderPanel()->isVisible())
\r
2104 ui->action_Copy->setEnabled(false);
\r
2105 ui->action_Move->setEnabled(false);
\r
2106 ui->action_Swap->setEnabled(false);
\r
2107 ui->action_SyncPanel->setEnabled(false);
\r
2108 ui->action_SyncPanelTo->setEnabled(false);
\r
2111 // 単画面の場合、プレビューモードは無効にする
\r
2112 if (m_viewMode == ModeFull) {
\r
2113 ui->toggle_PreviewMode->setEnabled(false);
\r
2116 // サムネイル表示の場合、左右キーはカーソル移動
\r
2117 if (w->objectName() == "thumbnailView") {
\r
2118 ui->action_KeyLeft->setEnabled(false);
\r
2119 ui->action_KeyRight->setEnabled(false);
\r
2120 ui->toggle_ThumbnailMode->blockSignals(true);
\r
2121 ui->toggle_ThumbnailMode->setChecked(true);
\r
2122 ui->toggle_ThumbnailMode->blockSignals(false);
\r
2125 ui->toggle_ThumbnailMode->blockSignals(true);
\r
2126 ui->toggle_ThumbnailMode->setChecked(false);
\r
2127 ui->toggle_ThumbnailMode->blockSignals(false);
\r
2130 else if (w->objectName() == "searchBox"){
\r
2131 setEnabledAllActions(false);
\r
2135 else if (w->objectName() == "locationBox") {
\r
2136 setEnabledAllActions(false);
\r
2139 else if (w->objectName() == "textView") {
\r
2140 SimpleTextView *v = static_cast<SimpleTextView*>(w);
\r
2141 setEnabledAllActions(false);
\r
2142 toggleSearch = false;
\r
2144 ui->text_ConvertFromEUC->setEnabled(true);
\r
2145 ui->text_ConvertFromEUC->disconnect();
\r
2146 connect(ui->text_ConvertFromEUC, SIGNAL(triggered()), v, SLOT(convertFromEUC()));
\r
2148 ui->text_ConvertFromJIS->setEnabled(true);
\r
2149 ui->text_ConvertFromJIS->disconnect();
\r
2150 connect(ui->text_ConvertFromJIS, SIGNAL(triggered()), v, SLOT(convertFromJIS()));
\r
2152 ui->text_ConvertFromSJIS->setEnabled(true);
\r
2153 ui->text_ConvertFromSJIS->disconnect();
\r
2154 connect(ui->text_ConvertFromSJIS, SIGNAL(triggered()), v, SLOT(convertFromSJIS()));
\r
2156 ui->text_ConvertFromUTF8->setEnabled(true);
\r
2157 ui->text_ConvertFromUTF8->disconnect();
\r
2158 connect(ui->text_ConvertFromUTF8, SIGNAL(triggered()), v, SLOT(convertFromUTF8()));
\r
2160 ui->text_ConvertFromUTF16->setEnabled(true);
\r
2161 ui->text_ConvertFromUTF16->disconnect();
\r
2162 connect(ui->text_ConvertFromUTF16, SIGNAL(triggered()), v, SLOT(convertFromUTF16()));
\r
2164 ui->text_ConvertFromUTF16BE->setEnabled(true);
\r
2165 ui->text_ConvertFromUTF16BE->disconnect();
\r
2166 connect(ui->text_ConvertFromUTF16BE, SIGNAL(triggered()), v, SLOT(convertFromUTF16BE()));
\r
2168 ui->text_ConvertFromUTF16LE->setEnabled(true);
\r
2169 ui->text_ConvertFromUTF16LE->disconnect();
\r
2170 connect(ui->text_ConvertFromUTF16LE, SIGNAL(triggered()), v, SLOT(convertFromUTF16LE()));
\r
2172 ui->text_Copy->disconnect();
\r
2173 connect(ui->text_Copy, SIGNAL(triggered()), v, SLOT(copy()));
\r
2176 else if (w->objectName() == "imageView") {
\r
2177 SimpleImageView *v = static_cast<SimpleImageView*>(w);
\r
2178 setEnabledAllActions(false);
\r
2179 toggleSearch = false;
\r
2180 isImageView = true;
\r
2182 ui->image_FitToWindow->setEnabled(true);
\r
2183 ui->image_FitToWindow->disconnect();
\r
2184 connect(ui->image_FitToWindow, SIGNAL(toggled(bool)), v, SLOT(fitToWindow(bool)));
\r
2186 ui->image_ScaleNormal->setEnabled(true);
\r
2187 ui->image_ScaleNormal->disconnect();
\r
2188 connect(ui->image_ScaleNormal, SIGNAL(triggered()), v, SLOT(scaleNormal()));
\r
2190 ui->image_Rotate90->setEnabled(true);
\r
2191 ui->image_Rotate90->disconnect();
\r
2192 connect(ui->image_Rotate90, SIGNAL(triggered()), v, SLOT(rotate90()));
\r
2194 ui->image_Rotate180->setEnabled(true);
\r
2195 ui->image_Rotate180->disconnect();
\r
2196 connect(ui->image_Rotate180, SIGNAL(triggered()), v, SLOT(rotate180()));
\r
2199 ui->action_About->setEnabled(true);
\r
2200 ui->action_CheckUpdate->setEnabled(true);
\r
2201 ui->action_KeyDown->setEnabled(isView);
\r
2202 ui->action_KeyEnd->setEnabled(isView);
\r
2203 ui->action_KeyHome->setEnabled(isView);
\r
2204 ui->action_KeyUp->setEnabled(isView);
\r
2205 ui->action_Quit->setEnabled(true);
\r
2206 ui->action_ScaleDown->setEnabled(isView);
\r
2207 ui->action_ScaleUp->setEnabled(isView);
\r
2208 ui->action_SearchNext->setEnabled(isSearch);
\r
2209 ui->action_SearchPrev->setEnabled(isSearch);
\r
2210 ui->action_Setting->setEnabled(true);
\r
2211 ui->toggle_Search->setEnabled(toggleSearch);
\r
2212 ui->view_Back->setEnabled(m_viewMode == ModeView);
\r
2214 if (isImageView) {
\r
2215 ui->action_ScaleDown->setText(tr("縮小"));
\r
2216 ui->action_ScaleUp->setText(tr("拡大"));
\r
2219 ui->action_ScaleDown->setText(tr("文字を小さく"));
\r
2220 ui->action_ScaleUp->setText(tr("文字を大きく"));
\r
2223 if (m_viewMode == ModeBasic || m_viewMode == ModeFull) {
\r
2224 ui->toggle_FullMode->setEnabled(true);
\r
2227 ui->toggle_FullMode->setEnabled(false);
\r
2230 ui->action_historyBack->setEnabled(!activeModel()->isHistoryBegin());
\r
2231 ui->action_HistoryForward->setEnabled(!activeModel()->isHistoryEnd());
\r
2234 ///////////////////////////////////////////////////////////////////////////////
\r
2235 /// \brief MainWindow::setEnabledAllActions
\r
2236 /// \param enable 有効にする場合はtrue
\r
2238 /// 全てのアクションを有効または無効にします。
\r
2240 void MainWindow::setEnabledAllActions(bool enable)
\r
2242 qDebug() << "MainWindow::setEnabledAllActions()" << enable;
\r
2243 foreach (QAction *action, m_actions) {
\r
2244 action->setEnabled(enable);
\r
2248 ///////////////////////////////////////////////////////////////////////////////
\r
2249 /// \brief MainWindow::onAbout
\r
2251 /// Aboutダイアログを表示します。
\r
2253 void MainWindow::onAbout()
\r
2255 QMessageBox::about(
\r
2259 tr("<center>Gefu is an Experimental File Utility.<br/>"
\r
2260 "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"
\r
2261 "<p>最新版の情報は<a href='http://gefu.sourceforge.jp/'>公式サイト</a>で公開しています。</p>"
\r
2262 "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));
\r
2265 ///////////////////////////////////////////////////////////////////////////////
\r
2266 /// \brief MainWindow::closeEvent
\r
2267 /// \param event クローズイベント
\r
2271 void MainWindow::closeEvent(QCloseEvent *event)
\r
2273 qDebug() << "MainWindow::closeEvent()";
\r
2274 Preferences prefs(this);
\r
2276 if (prefs.isConfirmQuit()) {
\r
2277 QMessageBox msgBox;
\r
2278 QCheckBox *checkBox = new QCheckBox();
\r
2279 checkBox->setText(tr("次回以降は確認しない"));
\r
2280 msgBox.setCheckBox(checkBox);
\r
2281 msgBox.setText(tr("終了しますか?"));
\r
2282 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
\r
2283 msgBox.setIcon(QMessageBox::Question);
\r
2285 if (msgBox.exec() == QMessageBox::No) {
\r
2286 qDebug() << ">>>>> ユーザによりキャンセルされました <<<<<";
\r
2290 prefs.setConfirmQuit(!checkBox->isChecked());
\r
2293 prefs.saveModel("Left", ui->LPanel->model());
\r
2294 prefs.saveModel("Right", ui->RPanel->model());
\r
2295 prefs.saveWindow(this);
\r
2296 QMainWindow::closeEvent(event);
\r
2299 ///////////////////////////////////////////////////////////////////////////////
\r
2300 /// \brief MainWindow::eventFilter
\r
2301 /// \param watched イベントの発生元オブジェクト
\r
2302 /// \param e 発生したイベント
\r
2303 /// \return イベントを処理した場合はtrueを返します。
\r
2305 bool MainWindow::eventFilter(QObject *watched, QEvent *e)
\r
2307 switch (e->type()) {
\r
2308 case QEvent::KeyPress:
\r
2310 return onKeyPressEvent(watched, static_cast<QKeyEvent*>(e));
\r
2312 case QEvent::ContextMenu:
\r
2313 // コンテキストメニューイベントの処理
\r
2314 return onContextMenuEvent(watched, static_cast<QContextMenuEvent*>(e));
\r
2316 case QEvent::Drop:
\r
2317 qDebug() << "QEvent::Drop";
\r
2319 return onDropEvent(watched, static_cast<QDropEvent*>(e));
\r