1 #include "bookmarkdialog.h"
\r
2 #include "copymoveworker.h"
\r
3 #include "deleteworker.h"
\r
4 #include "foldermodel.h"
\r
5 #include "folderpanel.h"
\r
7 #include "historydialog.h"
\r
8 #include "operationdialog.h"
\r
9 #include "overwritedialog.h"
\r
10 #include "preferences.h"
\r
11 #include "preferencedialog.h"
\r
12 #include "renameworker.h"
\r
13 #include "renamesingledialog.h"
\r
14 #include "renamemultidialog.h"
\r
15 #include "simpletextview.h"
\r
16 #include "simpleimageview.h"
\r
17 #include "sortdialog.h"
\r
18 #include "version.h"
\r
19 #include "mainwindow.h"
\r
20 #include "ui_mainwindow.h"
\r
22 #include <QCheckBox>
\r
23 #include <QClipboard>
\r
24 #include <QCloseEvent>
\r
26 #include <QDesktopServices>
\r
27 #include <QFileDialog>
\r
28 #include <QInputDialog>
\r
29 #include <QMessageBox>
\r
30 #include <QMimeData>
\r
31 #include <QNetworkAccessManager>
\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 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 Preferences prefs(this);
\r
76 if (prefs.isReset()) {
\r
81 ui->LPanel->setModel(new FolderModel(this));
\r
82 ui->RPanel->setModel(new FolderModel(this));
\r
83 setActiveModel(ui->LPanel->model());
\r
86 ui->LPanel->initialize(this);
\r
87 ui->RPanel->initialize(this);
\r
88 ui->FPanel->initialize(this);
\r
89 ui->FPanel->setVisible(false);
\r
92 prefs.restoreModel("Left", ui->LPanel->model());
\r
93 prefs.restoreModel("Right", ui->RPanel->model());
\r
102 setWindowTitle(tr("げふぅ Ver%1").arg(VERSION_VALUE));
\r
103 setWindowIcon(QIcon("://images/file-manager.png"));
\r
104 prefs.restoreWindow(this);
\r
107 if (prefs.isCheckUpdate()) {
\r
108 onCheckUpdate(true);
\r
111 ui->LPanel->updateAppearance(prefs);
\r
112 ui->LPanel->model()->updateAppearance(prefs);
\r
113 ui->RPanel->updateAppearance(prefs);
\r
114 ui->RPanel->model()->updateAppearance(prefs);
\r
117 ///////////////////////////////////////////////////////////////////////////////
\r
118 /// \brief MainWindow::~MainWindow
\r
122 MainWindow::~MainWindow()
\r
127 ///////////////////////////////////////////////////////////////////////////////
\r
128 /// \brief MainWindow::app_focusChange
\r
129 /// \param old フォーカスを失うウィジェット
\r
130 /// \param now フォーカスを得るウィジェット
\r
134 void MainWindow::app_focusChange(QWidget *old, QWidget *now)
\r
136 qDebug() << "MainWindow::app_focusChange()";
\r
137 if (old) qDebug() << " old is" << old->objectName();
\r
138 if (now) qDebug() << " now is" << now->objectName();
\r
140 // フォルダビューがフォーカスを得た場合
\r
141 if (now && (now->objectName() == "folderView" ||
\r
142 now->objectName() == "thumbnailView"))
\r
144 connect(focusItemView()->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
\r
145 this, SLOT(view_currentChanged(QModelIndex,QModelIndex)));
\r
146 FolderModel *m = static_cast<FolderModel*>(focusItemView()->model());
\r
148 statusBar()->showMessage(m->filePath(focusItemView()->currentIndex()));
\r
151 // 検索ボックスがフォーカスを失った場合
\r
152 if (old && old->objectName() == "searchBox") {
\r
154 ui->toggle_Search->setChecked(false);
\r
157 // アクションの有効/無効を設定する
\r
163 ///////////////////////////////////////////////////////////////////////////////
\r
164 /// \brief MainWindow::model_PreReset
\r
166 /// FolderModelリセット前の処理
\r
168 void MainWindow::model_PreReset()
\r
170 qDebug() << "MainWindow::model_PreReset()";
\r
172 statusBar()->showMessage(tr("ファイルリストを取得しています..."));
\r
175 ///////////////////////////////////////////////////////////////////////////////
\r
176 /// \brief MainWindow::model_PostReset
\r
178 /// FolderModelリセット後の処理
\r
180 void MainWindow::model_PostReset()
\r
182 qDebug() << "MainWindow::model_PostReset()";
\r
184 FolderModel *m = static_cast<FolderModel*>(sender());
\r
185 if (!m->error().isEmpty()) {
\r
186 statusBar()->showMessage(m->error());
\r
189 statusBar()->showMessage(tr("レディ"));
\r
193 ///////////////////////////////////////////////////////////////////////////////
\r
194 /// \brief MainWindow::onRunCommand
\r
196 /// 入力されたコマンドを実行します。
\r
198 void MainWindow::onRunCommand()
\r
200 qDebug() << "MainWindow::onRunCommand";
\r
202 QFileInfoList list = selectedItems();
\r
203 QString command = QString::null;
\r
204 foreach (const QFileInfo &info, list) {
\r
206 QString path = info.absoluteFilePath();
\r
208 QString path = info.fileName();
\r
210 if (info.isExecutable()) {
\r
211 command = QQ(path) + " " + command;
\r
214 command += " " + QQ(path);
\r
218 QInputDialog dlg(this);
\r
219 dlg.setInputMode(QInputDialog::TextInput);
\r
220 dlg.setWindowTitle(tr("コマンドを実行"));
\r
221 dlg.setLabelText(tr("コマンド:"));
\r
222 dlg.setTextValue(command);
\r
223 dlg.resize(width() * 0.8, dlg.height());
\r
225 int ret = dlg.exec();
\r
226 command = dlg.textValue();
\r
227 if (ret == QDialog::Accepted && !command.isEmpty()) {
\r
228 startProcess(command, tr("コマンドの実行に失敗しました。"));
\r
232 ///////////////////////////////////////////////////////////////////////////////
\r
233 /// \brief MainWindow::onExpandLeft
\r
237 void MainWindow::onExpandLeft()
\r
239 qDebug() << "MainWindow::onExpandLeft()";
\r
241 QList<int> sizes = ui->splitter->sizes();
\r
242 QList<int> newSizes;
\r
244 newSizes << sizes[0] + 30;
\r
245 newSizes << sizes[1] - 30;
\r
247 ui->splitter->setSizes(newSizes);
\r
250 ///////////////////////////////////////////////////////////////////////////////
\r
251 /// \brief MainWindow::onExpandRight
\r
255 void MainWindow::onExpandRight()
\r
257 qDebug() << "MainWindow::onExpandLeft()";
\r
259 QList<int> sizes = ui->splitter->sizes();
\r
260 QList<int> newSizes;
\r
262 newSizes << sizes[0] - 30;
\r
263 newSizes << sizes[1] + 30;
\r
265 ui->splitter->setSizes(newSizes);
\r
268 ///////////////////////////////////////////////////////////////////////////////
\r
269 /// \brief MainWindow::onToggleMark
\r
273 void MainWindow::onToggleMark()
\r
275 qDebug() << "MainWindow::onToggleMark()";
\r
277 QModelIndex index = focusItemView()->currentIndex();
\r
278 if (activeModel()->isMarked(index)) {
\r
279 activeModel()->setData(index, Qt::Unchecked, Qt::CheckStateRole);
\r
282 activeModel()->setData(index, Qt::Checked, Qt::CheckStateRole);
\r
285 if (index.row() < activeModel()->rowCount() - 1) {
\r
286 index = activeModel()->index(index.row() + 1, 0);
\r
287 focusItemView()->setCurrentIndex(index);
\r
291 ///////////////////////////////////////////////////////////////////////////////
\r
292 /// \brief MainWindow::view_statusChanged
\r
293 /// \param text ステータス文字列
\r
295 /// ビューから受け取った文字列をステータスバーに表示します。
\r
297 void MainWindow::view_statusChanged(const QString &text)
\r
299 statusBar()->findChild<QLabel*>("Right")->setText(text);
\r
302 ///////////////////////////////////////////////////////////////////////////////
\r
303 /// \brief MainWindow::view_currentChanged
\r
304 /// \param current 新しいカレントインデックス
\r
305 /// \param previous (使用しません)
\r
307 /// カレントインデックスが変更された場合の処理を行います。
\r
309 void MainWindow::view_currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
\r
311 qDebug() << "MainWindow::view_currentChanged()" << current;
\r
312 Q_UNUSED(previous);
\r
314 if (focusItemView() != sender()->parent()) {
\r
318 statusBar()->showMessage(activeModel()->filePath(current));
\r
320 if (m_viewMode == ModePreview) {
\r
321 inactivePanel()->setViewItem(current);
\r
327 ///////////////////////////////////////////////////////////////////////////////
\r
328 /// \brief MainWindow::view_finished
\r
332 void MainWindow::view_finished()
\r
334 qDebug() << "MainWindow::view_finished()";
\r
336 statusBar()->findChild<QLabel*>("Right")->setText("");
\r
338 setViewMode(m_prevMode);
\r
341 ///////////////////////////////////////////////////////////////////////////////
\r
342 /// \brief MainWindow::onMove
\r
344 /// 選択アイテムを隣のパネルに移動します。
\r
346 void MainWindow::onMove()
\r
348 qDebug() << "MainWindow::onMove";
\r
351 foreach (const QFileInfo &fi, selectedItems()) {
\r
352 list << fi.absoluteFilePath();
\r
354 if (list.isEmpty()) {
\r
358 int row = focusItemView()->currentIndex().row();
\r
360 QString tgtPath = inactiveModel()->rootPath();
\r
361 moveItems(list, tgtPath);
\r
363 if (row >= activeModel()->rowCount()) {
\r
364 row = activeModel()->rowCount() - 1;
\r
366 focusItemView()->setCurrentIndex(activeModel()->index(row, 1));
\r
369 ///////////////////////////////////////////////////////////////////////////////
\r
370 /// \brief MainWindow::onKeyLeft
\r
372 /// ←キー押下時の処理を行います。
\r
374 void MainWindow::onKeyLeft()
\r
376 qDebug() << "MainWindow::onKeyLeft()";
\r
378 QWidget *w = qApp->focusWidget();
\r
379 if (w->objectName() == "folderView")
\r
381 QWidget *panel = w->parentWidget()->parentWidget();
\r
382 if (panel == ui->LPanel) {
\r
383 activeModel()->onCdUp();
\r
385 else if (ui->LPanel->folderPanel()->isVisible()){
\r
386 ui->LPanel->folderPanel()->itemView()->setFocus();
\r
390 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier);
\r
391 qApp->sendEvent(w, &event);
\r
395 ///////////////////////////////////////////////////////////////////////////////
\r
396 /// \brief MainWindow::onKeyRight
\r
398 /// →キー押下時の処理を行います。
\r
400 void MainWindow::onKeyRight()
\r
402 qDebug() << "MainWindow::onKeyRight()";
\r
404 QWidget *w = qApp->focusWidget();
\r
405 if (w->objectName() == "folderView")
\r
407 QWidget *panel = w->parentWidget()->parentWidget();
\r
408 if (panel == ui->RPanel) {
\r
409 activeModel()->onCdUp();
\r
411 else if (ui->RPanel->folderPanel()->isVisible()){
\r
412 ui->RPanel->folderPanel()->itemView()->setFocus();
\r
416 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier);
\r
417 qApp->sendEvent(w, &event);
\r
421 ///////////////////////////////////////////////////////////////////////////////
\r
422 /// \brief MainWindow::onChooseFolder
\r
424 /// 選択したフォルダに移動します。
\r
426 void MainWindow::onChooseFolder()
\r
428 qDebug() << "MainWindow::onChooseFolder()";
\r
430 QString path = QFileDialog::getExistingDirectory(
\r
431 this, tr("フォルダを選択"), activeModel()->rootPath());
\r
432 if (!path.isEmpty()) {
\r
433 activeModel()->setRootPath(path);
\r
437 ///////////////////////////////////////////////////////////////////////////////
\r
438 /// \brief MainWindow::onCopyFileName
\r
440 /// ファイル名をクリップボードにコピーします。
\r
442 void MainWindow::onCopyFileName()
\r
444 qDebug() << "MainWindow::onCopyFileName()";
\r
446 QClipboard *clipboard = qApp->clipboard();
\r
447 clipboard->setText(activeModel()->fileName(focusItemView()->currentIndex()));
\r
450 ///////////////////////////////////////////////////////////////////////////////
\r
451 /// \brief MainWindow::onCopyFilePath
\r
453 /// フルパスをクリップボードにコピーします。
\r
455 void MainWindow::onCopyFilePath()
\r
457 qDebug() << "MainWindow::onCopyFilePath()";
\r
459 QClipboard *clipboard = qApp->clipboard();
\r
460 clipboard->setText(activeModel()->filePath(focusItemView()->currentIndex()));
\r
463 ///////////////////////////////////////////////////////////////////////////////
\r
464 /// \brief MainWindow::askOverWrite
\r
465 /// \param copyMethod 上書き方法
\r
466 /// \param alias 別名
\r
467 /// \param srcPath コピー元パス
\r
468 /// \param tgtPath コピー先パス
\r
470 /// 上書きの処理方法を選択するダイアログを表示します。
\r
472 void MainWindow::askOverWrite(QString *copyMethod,
\r
474 const QString &srcPath,
\r
475 const QString &tgtPath)
\r
477 qDebug() << "MainWindow::askOverWrite()";
\r
479 CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());
\r
480 if (!m_overwriteDialog.isKeepSetting() ||
\r
481 m_overwriteDialog.copyMethod() == "rbRename")
\r
483 m_overwriteDialog.setFileInfo(srcPath, tgtPath);
\r
484 if (m_overwriteDialog.exec() == QDialog::Rejected) {
\r
488 *copyMethod = m_overwriteDialog.copyMethod();
\r
489 *alias = m_overwriteDialog.alias();
\r
491 worker->endAsking();
\r
494 ///////////////////////////////////////////////////////////////////////////////
\r
495 /// \brief MainWindow::onAddBookmark
\r
499 void MainWindow::onAddBookmark()
\r
501 qDebug() << "MainWindow::onAddBookmark()";
\r
502 qDebug() << sender()->objectName();
\r
505 if (sender()->objectName() == "bookmarkBtn") {
\r
506 FolderPanel *p = static_cast<FolderPanel*>(sender()->parent());
\r
513 QFileInfo fi(m->rootPath());
\r
514 Preferences(this).addBookmark(fi.fileName(), fi.absoluteFilePath());
\r
515 initBookmarkMenu();
\r
517 activePanel()->folderPanel()->itemView()->setFocus();
\r
518 statusBar()->showMessage(tr("%1をブックマークに追加しました").arg(fi.absoluteFilePath()));
\r
521 ///////////////////////////////////////////////////////////////////////////////
\r
522 /// \brief MainWindow::view_copyAvailable
\r
523 /// \param yes コピー可能ならtrue
\r
525 /// 選択範囲の有無をメニューに反映します。
\r
527 void MainWindow::view_copyAvailable(bool yes)
\r
529 ui->text_Copy->setEnabled(yes);
\r
532 ///////////////////////////////////////////////////////////////////////////////
\r
533 /// \brief MainWindow::copyItems
\r
534 /// \param list コピー元リスト
\r
535 /// \param tgtDir コピー先フォルダ
\r
539 void MainWindow::copyItems(const QStringList &list, const QString &tgtDir)
\r
541 qDebug() << "MainWindow::copyItems()" << tgtDir;
\r
543 Preferences prefs(this);
\r
544 if (prefs.isConfirmCopy() &&
\r
545 QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))
\r
546 != QMessageBox::Yes)
\r
551 // 上書き確認ダイアログを初期化する
\r
552 m_overwriteDialog.reset();
\r
555 CopyMoveWorker *worker = new CopyMoveWorker();
\r
556 connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),
\r
557 this, SLOT(askOverWrite(QString*,QString*,QString,QString)));
\r
558 worker->setCopyList(list);
\r
559 worker->setTargetDir(tgtDir);
\r
560 worker->setMoveMode(false);
\r
562 // 進捗ダイアログを表示して、処理を開始する
\r
563 OperationDialog opDlg(this);
\r
564 opDlg.setWindowTitle(tr("コピー"));
\r
565 opDlg.setWorker(worker);
\r
566 opDlg.setAutoClose(prefs.isAutoCloseCopy());
\r
570 prefs.setAutoCloseCopy(opDlg.autoClose());
\r
573 ///////////////////////////////////////////////////////////////////////////////
\r
574 /// \brief MainWindow::moveItems
\r
575 /// \param list 移動元リスト
\r
576 /// \param tgtDir 移動先フォルダ
\r
580 void MainWindow::moveItems(const QStringList &list, const QString &tgtDir)
\r
582 qDebug() << "MainWindow::moveItems()" << tgtDir;
\r
584 Preferences prefs(this);
\r
585 if (prefs.isConfirmMove() &&
\r
586 QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))
\r
587 != QMessageBox::Yes)
\r
592 // 上書き確認ダイアログを初期化する
\r
593 m_overwriteDialog.reset();
\r
596 CopyMoveWorker *worker = new CopyMoveWorker();
\r
597 connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),
\r
598 this, SLOT(askOverWrite(QString*,QString*,QString,QString)));
\r
599 worker->setCopyList(list);
\r
600 worker->setTargetDir(tgtDir);
\r
601 worker->setMoveMode(true);
\r
603 // 進捗ダイアログを表示して、処理を開始する
\r
604 OperationDialog opDlg(this);
\r
605 opDlg.setWindowTitle(tr("移動"));
\r
606 opDlg.setWorker(worker);
\r
607 opDlg.setAutoClose(prefs.isAutoCloseMove());
\r
611 prefs.setAutoCloseMove(opDlg.autoClose());
\r
614 ///////////////////////////////////////////////////////////////////////////////
\r
615 /// \brief MainWindow::onContextMenuEvent
\r
616 /// \param obj イベントが発生したオブジェクト
\r
617 /// \param e コンテキストメニューイベント
\r
618 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。
\r
620 bool MainWindow::onContextMenuEvent(QObject *obj, QContextMenuEvent *e)
\r
623 if (obj->objectName() == "textView") {
\r
624 menu.addAction(ui->text_ConvertFromEUC);
\r
625 menu.addAction(ui->text_ConvertFromJIS);
\r
626 menu.addAction(ui->text_ConvertFromSJIS);
\r
627 menu.addAction(ui->text_ConvertFromUTF8);
\r
628 menu.addAction(ui->text_ConvertFromUTF16);
\r
629 menu.addAction(ui->text_ConvertFromUTF16BE);
\r
630 menu.addAction(ui->text_ConvertFromUTF16LE);
\r
631 menu.addSeparator();
\r
632 menu.addAction(ui->text_Copy);
\r
633 if (m_viewMode == ModeView) {
\r
634 menu.addSeparator();
\r
635 menu.addAction(ui->view_Back);
\r
638 else if (obj->objectName() == "imageView") {
\r
639 menu.addAction(ui->image_FitToWindow);
\r
640 menu.addAction(ui->action_ScaleDown);
\r
641 menu.addAction(ui->action_ScaleUp);
\r
642 menu.addAction(ui->image_ScaleNormal);
\r
643 menu.addSeparator();
\r
644 menu.addAction(ui->image_Rotate90);
\r
645 menu.addAction(ui->image_Rotate180);
\r
647 if (m_viewMode == ModeView) {
\r
648 menu.addSeparator();
\r
649 menu.addAction(ui->view_Back);
\r
652 else if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView") {
\r
653 menu.addAction(ui->action_OpenWith);
\r
654 menu.addAction(ui->action_OpenEditor);
\r
655 menu.addAction(ui->action_OpenTerminal);
\r
656 menu.addAction(ui->action_OpenArchiver);
\r
657 menu.addSeparator();
\r
658 menu.addAction(ui->action_Copy);
\r
659 menu.addAction(ui->action_Move);
\r
660 menu.addSeparator();
\r
661 menu.addAction(ui->action_Delete);
\r
662 menu.addSeparator();
\r
663 menu.addAction(ui->action_CopyFileName);
\r
664 menu.addAction(ui->action_CopyFilePath);
\r
665 menu.addSeparator();
\r
666 menu.addAction(ui->action_Rename);
\r
669 qDebug() << "No context menu" << obj->objectName();
\r
673 QAction *selected = menu.exec(e->globalPos());
\r
674 if (selected == ui->action_ScaleDown || selected == ui->action_ScaleUp) {
\r
675 ui->image_FitToWindow->blockSignals(true);
\r
676 ui->image_FitToWindow->setChecked(false);
\r
677 ui->image_FitToWindow->blockSignals(false);
\r
683 ///////////////////////////////////////////////////////////////////////////////
\r
684 /// \brief MainWindow::onKeyPressEvent
\r
685 /// \param obj イベントが発生したオブジェクト
\r
686 /// \param e キーイベントオブジェクト
\r
687 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。
\r
689 bool MainWindow::onKeyPressEvent(QObject *obj, QKeyEvent *e)
\r
691 qDebug() << "MainWindow::onKeyPressEvent()";
\r
693 QString modifier = QString::null;
\r
694 if (e->modifiers() & Qt::ShiftModifier) { modifier += "Shift+"; }
\r
695 if (e->modifiers() & Qt::ControlModifier) { modifier += "Ctrl+"; }
\r
696 if (e->modifiers() & Qt::AltModifier) { modifier += "Alt+"; }
\r
697 if (e->modifiers() & Qt::MetaModifier) { modifier += "Meta+"; }
\r
699 QString key = modifier + QKeySequence(e->key()).toString();
\r
701 foreach (QAction *action, findChildren<QAction*>()) {
\r
702 if (action->isEnabled()) {
\r
703 foreach (const QKeySequence &ks, action->shortcuts()) {
\r
704 if (ks.toString() == key) {
\r
705 qDebug() << "emit" << action->objectName();
\r
706 if (action->isCheckable()) {
\r
718 if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView")
\r
721 switch (e->key()) {
\r
725 case Qt::Key_Right:
\r
728 case Qt::Key_PageDown:
\r
729 case Qt::Key_PageUp:
\r
739 ///////////////////////////////////////////////////////////////////////////////
\r
740 /// \brief MainWindow::onCopy
\r
742 /// 選択アイテムを隣のパネルにコピーします。
\r
744 void MainWindow::onCopy()
\r
746 qDebug() << "MainWindow::onCopy";
\r
749 foreach (const QFileInfo &fi, selectedItems()) {
\r
750 list << fi.absoluteFilePath();
\r
752 if (list.isEmpty()) {
\r
756 QString tgtPath = inactiveModel()->rootPath();
\r
757 copyItems(list, tgtPath);
\r
760 ///////////////////////////////////////////////////////////////////////////////
\r
761 /// \brief MainWindow::onCreateFile
\r
765 void MainWindow::onCreateFile()
\r
767 qDebug() << "MainWindow::onCreateFile";
\r
770 QString name = QInputDialog::getText(
\r
771 this, tr("ファイルを作成"), tr("ファイル名:"),
\r
772 QLineEdit::Normal, "", &bOk);
\r
773 if (!bOk || name.isEmpty()) {
\r
777 QModelIndex index = activeModel()->touch(name);
\r
778 if (!index.isValid()) {
\r
779 QMessageBox::critical(
\r
781 tr("ファイルの作成に失敗しました。"));
\r
785 focusItemView()->setCurrentIndex(index);
\r
786 if (Preferences(this).isOpenAfterCreation()) {
\r
787 onOpenEditor(index);
\r
791 ///////////////////////////////////////////////////////////////////////////////
\r
792 /// \brief MainWindow::onCreateFolder
\r
796 void MainWindow::onCreateFolder()
\r
798 qDebug() << "MainWindow::onCreateFolder";
\r
801 QString name = QInputDialog::getText(
\r
802 this, tr("フォルダを作成"), tr("フォルダ名:"),
\r
803 QLineEdit::Normal, "", &bOk);
\r
804 if (!bOk || name.isEmpty()) {
\r
808 QModelIndex index = activeModel()->mkdir(name);
\r
809 if (!index.isValid()) {
\r
810 QMessageBox::critical(
\r
812 tr("フォルダの作成に失敗しました。"));
\r
816 focusItemView()->setCurrentIndex(index);
\r
817 if (Preferences(this).isMoveAfterCreation()) {
\r
822 ///////////////////////////////////////////////////////////////////////////////
\r
823 /// \brief MainWindow::onDelete
\r
827 void MainWindow::onDelete()
\r
829 qDebug() << "MainWindow::onDelete";
\r
831 QFileInfoList list = selectedItems();
\r
832 if (list.isEmpty()) {
\r
836 Preferences prefs(this);
\r
837 if (prefs.isConfirmDelete()) {
\r
839 if (list.size() == 1) {
\r
840 msg = list[0].fileName();
\r
843 msg = tr("%1個のアイテム").arg(list.size());
\r
845 int ret = QMessageBox::question(
\r
847 tr("%1を削除しますか?").arg(msg));
\r
848 if (ret != QMessageBox::Yes) {
\r
853 DeleteWorker *worker = new DeleteWorker();
\r
854 worker->setDeleteList(list);
\r
856 OperationDialog opDlg(this);
\r
857 opDlg.setWindowTitle(tr("削除"));
\r
858 opDlg.setWorker(worker);
\r
859 opDlg.setAutoClose(prefs.isAutoCloseDelete());
\r
861 // int row = focusItemView()->currentIndex().row();
\r
865 // if (row >= activeModel()->rowCount()) {
\r
866 // row = activeModel()->rowCount() - 1;
\r
868 // focusItemView()->setCurrentIndex(activeModel()->index(row, 1));
\r
870 prefs.setAutoCloseDelete(opDlg.autoClose());
\r
873 ///////////////////////////////////////////////////////////////////////////////
\r
874 /// \brief MainWindow::onOpen
\r
875 /// \param index (使用しません)
\r
879 void MainWindow::onOpen(const QModelIndex &index)
\r
882 qDebug() << "MainWindow::onOpen()" << index;
\r
884 QModelIndex current = focusItemView()->currentIndex();
\r
885 if (activeModel()->isDir(current)) {
\r
886 activeModel()->setRootPath(activeModel()->filePath(current));
\r
891 QString ext = activeModel()->fileInfo(current).suffix().toLower();
\r
892 QStringList list = Preferences(this).getPreferExtensions().split(",", QString::SkipEmptyParts);
\r
893 foreach (const QString& s, list) {
\r
894 if (ext == s.trimmed().toLower()) {
\r
895 QString path = QDir::toNativeSeparators(activeModel()->filePath(current));
\r
896 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
902 setViewMode(ModeView);
\r
905 ///////////////////////////////////////////////////////////////////////////////
\r
906 /// \brief MainWindow::onOpenEditor
\r
909 /// 選択アイテムを外部エディタで開きます。
\r
911 void MainWindow::onOpenEditor(const QModelIndex &index)
\r
913 qDebug() << "MainWindow::onOpenEditor";
\r
915 QString exe = Preferences(this).getEditorPath();
\r
916 if (exe.isEmpty()) {
\r
917 QMessageBox::critical(
\r
919 tr("外部エディタのパスが未定義です。"));
\r
923 QFileInfoList list;
\r
924 if (index.isValid()) {
\r
925 list << activeModel()->fileInfo(index);
\r
928 list = selectedItems();
\r
932 foreach (const QFileInfo &info, list) {
\r
933 files += " " + QQ(info.absoluteFilePath());
\r
936 QString command = "open -a " + exe + files;
\r
938 QString command = exe + files;
\r
940 if (!startProcess(command, tr("外部エディタの起動に失敗しました。"))) {
\r
941 qDebug() << command;
\r
945 ///////////////////////////////////////////////////////////////////////////////
\r
946 /// \brief MainWindow::onOpenTerminal
\r
948 /// 選択アイテムをターミナルで開きます。
\r
950 void MainWindow::onOpenTerminal()
\r
952 qDebug() << "MainWindow::onOpenTerminal";
\r
954 QString exe = Preferences(this).getTerminalPath();
\r
955 if (exe.isEmpty()) {
\r
956 QMessageBox::critical(
\r
958 tr("ターミナルのパスが未定義です。"));
\r
962 QSet<QString> dirs;
\r
963 foreach (const QFileInfo &info, selectedItems()) {
\r
964 if (info.isDir()) {
\r
965 dirs.insert(info.absoluteFilePath());
\r
968 dirs.insert(info.absolutePath());
\r
972 foreach (const QString &dir, dirs) {
\r
974 QString command = "open -n -a " + exe + " " + QQ(dir);
\r
976 QString command = exe + " " + QQ(dir);
\r
978 if (!startProcess(command, tr("ターミナルの起動に失敗しました。"))) {
\r
979 qDebug() << command;
\r
985 ///////////////////////////////////////////////////////////////////////////////
\r
986 /// \brief MainWindow::onOpenArchiver
\r
988 /// 選択アイテムをアーカイバで開きます。
\r
990 void MainWindow::onOpenArchiver()
\r
992 qDebug() << "MainWindow::onOpenArchiver";
\r
994 QString exe = Preferences(this).getArchiverPath();
\r
995 if (exe.isEmpty()) {
\r
996 QMessageBox::critical(
\r
998 tr("アーカイバのパスが未定義です。"));
\r
1003 foreach (const QFileInfo &info, selectedItems()) {
\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::onOpenBookmark
\r
1019 /// ブックマークのメニュー項目をクリックしたときの処理を行います。
\r
1021 void MainWindow::onOpenBookmark()
\r
1023 qDebug() << "MainWindow::onOpenBookmark()";
\r
1025 QAction *action = qobject_cast<QAction*>(sender());
\r
1026 Q_CHECK_PTR(action);
\r
1028 int i = action->data().toInt();
\r
1029 activeModel()->setRootPath(Preferences(this).getBookmarkPath(i));
\r
1032 ///////////////////////////////////////////////////////////////////////////////
\r
1033 /// \brief MainWindow::onRename
\r
1035 /// 選択アイテムの名前を変更します。
\r
1037 void MainWindow::onRename()
\r
1039 qDebug() << "MainWindow::onRename";
\r
1041 QFileInfoList list = selectedItems();
\r
1042 if (list.isEmpty()) {
\r
1046 AbstractRenameDialog *dlg;
\r
1047 if (list.size() == 1) {
\r
1048 dlg = new RenameSingleDialog(this);
\r
1051 dlg = new RenameMultiDialog(this);
\r
1053 dlg->setWorkingDirectory(activeModel()->rootPath());
\r
1054 dlg->setNames(list);
\r
1055 int dlgResult = dlg->exec();
\r
1056 if (dlgResult != QDialog::Accepted || dlg->renameMap().isEmpty()) {
\r
1060 Preferences prefs(this);
\r
1061 if (prefs.isConfirmRename() &&
\r
1062 QMessageBox::question(this, tr("確認"), tr("名前の変更を実行しますか?"))
\r
1063 != QMessageBox::Yes)
\r
1068 RenameWorker *worker = new RenameWorker();
\r
1069 worker->setRenameMap(&dlg->renameMap());
\r
1071 OperationDialog opDlg(this);
\r
1072 opDlg.setWindowTitle(tr("名前を変更"));
\r
1073 opDlg.setWorker(worker);
\r
1074 opDlg.setAutoClose(prefs.isAutoCloseRename());
\r
1078 QFileInfo fi(dlg->renameMap().first());
\r
1079 focusItemView()->setCurrentIndex(activeModel()->search(fi.fileName()));
\r
1081 prefs.setAutoCloseRename(opDlg.autoClose());
\r
1084 ///////////////////////////////////////////////////////////////////////////////
\r
1085 /// \brief MainWindow::onOpenWith
\r
1087 /// 関連付けられたアプリで開きます。
\r
1089 void MainWindow::onOpenWith()
\r
1091 qDebug() << "MainWindow::onOpenWith";
\r
1093 foreach (const QFileInfo &info, selectedItems()) {
\r
1094 QString path = QDir::toNativeSeparators(info.absoluteFilePath());
\r
1095 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
1099 ///////////////////////////////////////////////////////////////////////////////
\r
1100 /// \brief MainWindow::showBookmarkDialog
\r
1102 /// ブックマーク一覧ダイアログを表示します。
\r
1104 void MainWindow::showBookmarkDialog()
\r
1106 qDebug() << "MainWindow::showBookmarkDialog()";
\r
1108 BookmarkDialog dlg(this);
\r
1109 dlg.setEditMode(false);
\r
1110 if (dlg.exec() == QDialog::Accepted) {
\r
1111 int n = dlg.selectedIndex();
\r
1112 activeModel()->setRootPath(Preferences(this).getBookmarkPath(n + 1));
\r
1116 ///////////////////////////////////////////////////////////////////////////////
\r
1117 /// \brief MainWindow::onEditBookmark
\r
1119 /// ブックマークの編集ダイアログを表示します。
\r
1121 void MainWindow::onEditBookmark()
\r
1123 qDebug() << "MainWindow::onEditBookmark()";
\r
1125 BookmarkDialog dlg(this);
\r
1126 dlg.setEditMode(true);
\r
1128 if (dlg.exec() == QDialog::Accepted) {
\r
1129 initBookmarkMenu();
\r
1133 ///////////////////////////////////////////////////////////////////////////////
\r
1134 /// \brief MainWindow::showFilterDialog
\r
1136 /// フィルタ設定ダイアログを表示します。
\r
1138 void MainWindow::showFilterDialog()
\r
1140 qDebug() << "MainWindow::showFilterDialog()";
\r
1142 QString filters = activeModel()->nameFilters().join(" ");
\r
1144 QInputDialog dlg(this);
\r
1145 dlg.setInputMode(QInputDialog::TextInput);
\r
1146 dlg.setWindowTitle(tr("フィルタを設定"));
\r
1147 dlg.setLabelText(tr("フィルタ:"));
\r
1148 dlg.setTextValue(filters);
\r
1149 dlg.resize(width() * 0.8, dlg.height());
\r
1151 if (dlg.exec() == QDialog::Accepted) {
\r
1152 filters = dlg.textValue();
\r
1153 if (filters.isEmpty()) {
\r
1157 activeModel()->setNameFilters(filters.split(" ", QString::SkipEmptyParts));
\r
1158 activeModel()->refresh();
\r
1162 ///////////////////////////////////////////////////////////////////////////////
\r
1163 /// \brief MainWindow::showHistoryDialog
\r
1165 /// 履歴選択ダイアログを表示します。
\r
1167 void MainWindow::showHistoryDialog()
\r
1169 qDebug() << "MainWindow::showHistoryDialog()";
\r
1171 HistoryDialog dlg(this);
\r
1172 dlg.setModel(ui->LPanel->model(), ui->RPanel->model(), activeModel());
\r
1176 ///////////////////////////////////////////////////////////////////////////////
\r
1177 /// \brief MainWindow::showSortDialog
\r
1179 /// ソート方法選択ダイアログを表示します。
\r
1181 void MainWindow::showSortDialog()
\r
1183 qDebug() << "MainWindow::showSortDialog()";
\r
1185 SortDialog dlg(this);
\r
1186 dlg.setModel(activeModel());
\r
1190 ///////////////////////////////////////////////////////////////////////////////
\r
1191 /// \brief MainWindow::onSplitCenter
\r
1195 void MainWindow::onSplitCenter()
\r
1197 qDebug() << "MainWindow::onSplitCenter()";
\r
1199 QList<int> sizes = ui->splitter->sizes();
\r
1200 int sizeTotal = sizes[0] + sizes[1];
\r
1201 sizes[0] = sizeTotal / 2;
\r
1202 sizes[1] = sizeTotal - sizes[0];
\r
1203 ui->splitter->setSizes(sizes);
\r
1206 ///////////////////////////////////////////////////////////////////////////////
\r
1207 /// \brief MainWindow::onSwap
\r
1209 /// 左右のパネルでモデルを入れ替えます。
\r
1211 void MainWindow::onSwap()
\r
1213 qDebug() << "MainWindow::onSwap()";
\r
1215 FolderModel *tmp = ui->LPanel->model();
\r
1216 ui->LPanel->setModel(ui->RPanel->model());
\r
1217 ui->RPanel->setModel(tmp);
\r
1220 if (ui->LPanel->model()->isActive()) {
\r
1221 setActiveModel(ui->RPanel->model());
\r
1224 setActiveModel(ui->LPanel->model());
\r
1228 ///////////////////////////////////////////////////////////////////////////////
\r
1229 /// \brief MainWindow::onTogglePreviewMode
\r
1230 /// \param checked メニューのチェック状態
\r
1232 /// 通常モード/プレビューモードを切り替えます。
\r
1234 void MainWindow::onTogglePreviewMode(bool checked)
\r
1236 qDebug() << "MainWindow::onTogglePreviewMode()" << checked;
\r
1239 setViewMode(ModePreview);
\r
1242 setViewMode(ModeBasic);
\r
1246 ///////////////////////////////////////////////////////////////////////////////
\r
1247 /// \brief MainWindow::onSearchNext
\r
1251 void MainWindow::onSearchNext()
\r
1253 qDebug() << "MainWindow::onSearchNext";
\r
1255 static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext();
\r
1258 ///////////////////////////////////////////////////////////////////////////////
\r
1259 /// \brief MainWindow::onSearchPrev
\r
1263 void MainWindow::onSearchPrev()
\r
1265 qDebug() << "MainWindow::onSearchPrev";
\r
1267 static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext(-1);
\r
1270 ///////////////////////////////////////////////////////////////////////////////
\r
1271 /// \brief MainWindow::onKeyDown
\r
1273 /// フォーカスウィジェットに↓キーイベントを送信します。
\r
1275 void MainWindow::onKeyDown()
\r
1277 qDebug() << "MainWindow::onKeyDown()";
\r
1279 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);
\r
1280 qApp->sendEvent(qApp->focusWidget(), &event);
\r
1283 ///////////////////////////////////////////////////////////////////////////////
\r
1284 /// \brief MainWindow::onKeyEnd
\r
1286 /// フォーカスウィジェットにEND, Ctrl+ENDキーイベントを送信します。
\r
1288 void MainWindow::onKeyEnd()
\r
1290 qDebug() << "MainWindow::onKeyEnd()";
\r
1292 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);
\r
1293 qApp->sendEvent(qApp->focusWidget(), &event1);
\r
1295 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);
\r
1296 qApp->sendEvent(qApp->focusWidget(), &event2);
\r
1299 ///////////////////////////////////////////////////////////////////////////////
\r
1300 /// \brief MainWindow::onKeyHome
\r
1302 /// フォーカスウィジェットにHOME, Ctrl+HOMEキーイベントを送信します。
\r
1304 void MainWindow::onKeyHome()
\r
1306 qDebug() << "MainWindow::onKeyHome()";
\r
1308 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);
\r
1309 qApp->sendEvent(qApp->focusWidget(), &event1);
\r
1311 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);
\r
1312 qApp->sendEvent(qApp->focusWidget(), &event2);
\r
1315 ///////////////////////////////////////////////////////////////////////////////
\r
1316 /// \brief MainWindow::onKeyUp
\r
1318 /// フォーカスウィジェットに↑キーイベントを送信します。
\r
1320 void MainWindow::onKeyUp()
\r
1322 qDebug() << "MainWindow::onKeyUp()";
\r
1324 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
\r
1325 qApp->sendEvent(qApp->focusWidget(), &event);
\r
1328 ///////////////////////////////////////////////////////////////////////////////
\r
1329 /// \brief MainWindow::onKeyHomeOther
\r
1331 /// 非フォーカスビューにHOME, Ctrl+HOMEキーイベントを送信します。
\r
1333 void MainWindow::onKeyHomeOther()
\r
1335 qDebug() << "MainWindow::onKeyHomeOther()";
\r
1337 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);
\r
1338 sendEventOther(&event1);
\r
1340 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);
\r
1341 sendEventOther(&event2);
\r
1344 ///////////////////////////////////////////////////////////////////////////////
\r
1345 /// \brief MainWindow::onKeyDownOther
\r
1347 /// 非フォーカスビューに↓キーイベントを送信します。
\r
1349 void MainWindow::onKeyDownOther()
\r
1351 qDebug() << "MainWindow::onKeyDownOther()";
\r
1353 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);
\r
1354 sendEventOther(&event);
\r
1357 ///////////////////////////////////////////////////////////////////////////////
\r
1358 /// \brief MainWindow::onKeyUpOther
\r
1360 /// 非フォーカスビューに↑キーイベントを送信します。
\r
1362 void MainWindow::onKeyUpOther()
\r
1364 qDebug() << "MainWindow::onKeyUpOther()";
\r
1366 QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
\r
1367 sendEventOther(&event);
\r
1370 ///////////////////////////////////////////////////////////////////////////////
\r
1371 /// \brief MainWindow::onKeyEndOther
\r
1373 /// 非フォーカスビューにEND, Ctrl+ENDキーイベントを送信します。
\r
1375 void MainWindow::onKeyEndOther()
\r
1377 qDebug() << "MainWindow::onKeyEndOther()";
\r
1379 QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);
\r
1380 sendEventOther(&event1);
\r
1382 QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);
\r
1383 sendEventOther(&event2);
\r
1386 ///////////////////////////////////////////////////////////////////////////////
\r
1387 /// \brief MainWindow::onScaleDown
\r
1391 void MainWindow::onScaleDown()
\r
1393 qDebug() << "MainWindow::onScaleDown()";
\r
1395 AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());
\r
1397 view->scaleDown();
\r
1400 Preferences prefs(this);
\r
1401 if (ui->LPanel->isVisible()) {
\r
1402 ui->LPanel->updateAppearance(prefs);
\r
1403 ui->LPanel->model()->updateAppearance(prefs);
\r
1405 if (ui->RPanel->isVisible()) {
\r
1406 ui->RPanel->updateAppearance(prefs);
\r
1407 ui->RPanel->model()->updateAppearance(prefs);
\r
1409 if (ui->FPanel->isVisible()) {
\r
1410 ui->FPanel->updateAppearance(prefs);
\r
1411 ui->FPanel->model()->updateAppearance(prefs);
\r
1415 ///////////////////////////////////////////////////////////////////////////////
\r
1416 /// \brief MainWindow::onScaleUp
\r
1420 void MainWindow::onScaleUp()
\r
1422 qDebug() << "MainWindow::onScaleUp()";
\r
1424 AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());
\r
1429 Preferences prefs(this);
\r
1430 if (ui->LPanel->isVisible()) {
\r
1431 ui->LPanel->updateAppearance(prefs);
\r
1432 ui->LPanel->model()->updateAppearance(prefs);
\r
1434 if (ui->RPanel->isVisible()) {
\r
1435 ui->RPanel->updateAppearance(prefs);
\r
1436 ui->RPanel->model()->updateAppearance(prefs);
\r
1438 if (ui->FPanel->isVisible()) {
\r
1439 ui->FPanel->updateAppearance(prefs);
\r
1440 ui->FPanel->model()->updateAppearance(prefs);
\r
1444 ///////////////////////////////////////////////////////////////////////////////
\r
1445 /// \brief MainWindow::initBookmarkMenu
\r
1447 /// ブックマークメニューを初期化します。
\r
1449 void MainWindow::initBookmarkMenu()
\r
1451 qDebug() << "MainWindow::initBookmarkMenu()";
\r
1453 Preferences prefs(this);
\r
1454 QFileIconProvider iconProvider;
\r
1456 ui->menu_Bookmark->clear();
\r
1457 ui->menu_Bookmark->addAction(ui->action_AddBookmark);
\r
1458 ui->menu_Bookmark->addAction(ui->action_EditBookmark);
\r
1459 ui->menu_Bookmark->addSeparator();
\r
1460 for (int n = 1; ; n++) {
\r
1461 QString name = prefs.getBookmarkEntry(n);
\r
1462 if (name.isEmpty()) {
\r
1465 QString path = prefs.getBookmarkPath(n);
\r
1467 QAction *action = ui->menu_Bookmark->addAction(
\r
1468 iconProvider.icon(QFileInfo(path)), name, this,
\r
1469 SLOT(onOpenBookmark()));
\r
1470 action->setData(n);
\r
1473 m_actions = findChildren<QAction*>();
\r
1476 ///////////////////////////////////////////////////////////////////////////////
\r
1477 /// \brief MainWindow::sendEventOther
\r
1478 /// \param event 送信するイベント
\r
1480 /// 非フォーカスのビューにイベントを送信します。
\r
1482 void MainWindow::sendEventOther(QEvent *event)
\r
1484 qDebug() << "MainWindow::sendEventOther()";
\r
1486 // フォーカスを持たない、可視状態のビューを検索する
\r
1487 foreach (QWidget *w, findChildren<QWidget*>()) {
\r
1488 AbstractView *view = dynamic_cast<AbstractView*>(w);
\r
1490 if (w->isVisible() && !w->hasFocus()) {
\r
1491 qDebug() << "Send event to" << w->objectName();
\r
1492 qApp->sendEvent(w, event);
\r
1498 ///////////////////////////////////////////////////////////////////////////////
\r
1499 /// \brief MainWindow::onSyncPanel
\r
1501 /// 隣のパネルと同じフォルダを表示します。
\r
1503 void MainWindow::onSyncPanel()
\r
1505 qDebug() << "MainWindow::onSyncPanel()";
\r
1507 activeModel()->setRootPath(inactiveModel()->rootPath());
\r
1510 ///////////////////////////////////////////////////////////////////////////////
\r
1511 /// \brief MainWindow::onSyncPanelTo
\r
1513 /// 隣のパネルに同じフォルダを表示します。
\r
1515 void MainWindow::onSyncPanelTo()
\r
1517 qDebug() << "MainWindow::onSyncPanelTo()";
\r
1519 inactiveModel()->setRootPath(activeModel()->rootPath());
\r
1522 ///////////////////////////////////////////////////////////////////////////////
\r
1523 /// \brief MainWindow::onToggleFullMode
\r
1524 /// \param checked メニューのチェック状態
\r
1526 /// 単画面/二画面を切り替えます。
\r
1528 void MainWindow::onToggleFullMode(bool checked)
\r
1530 qDebug() << "MainWindow::onToggleFullMode()" << checked;
\r
1533 setViewMode(ModeFull);
\r
1536 setViewMode(ModeBasic);
\r
1541 ///////////////////////////////////////////////////////////////////////////////
\r
1542 /// \brief MainWindow::onToggleSearch
\r
1543 /// \param checked メニューのチェック状態
\r
1545 /// 検索ボックスの表示/非表示を切り替えます。
\r
1547 void MainWindow::onToggleSearch(bool checked)
\r
1549 qDebug() << "MainWindow::onToggleSearch" << checked;
\r
1552 ui->LPanel->folderPanel()->toggleSearch(checked);
\r
1553 ui->RPanel->folderPanel()->toggleSearch(checked);
\r
1554 ui->FPanel->folderPanel()->toggleSearch(checked);
\r
1557 ///////////////////////////////////////////////////////////////////////////////
\r
1558 /// \brief MainWindow::showPreferenceDialog
\r
1560 /// 環境設定ダイアログを表示します。
\r
1562 void MainWindow::showPreferenceDialog()
\r
1564 qDebug() << "MainWindow::showPreferenceDialog";
\r
1566 PreferenceDialog dlg(this);
\r
1567 if (dlg.exec() == QDialog::Accepted) {
\r
1568 Preferences prefs(this);
\r
1569 if (ui->LPanel->isVisible()) {
\r
1570 ui->LPanel->updateAppearance(prefs);
\r
1571 ui->LPanel->model()->updateAppearance(prefs);
\r
1573 if (ui->RPanel->isVisible()) {
\r
1574 ui->RPanel->updateAppearance(prefs);
\r
1575 ui->RPanel->model()->updateAppearance(prefs);
\r
1577 if (ui->FPanel->isVisible()) {
\r
1578 ui->FPanel->updateAppearance(prefs);
\r
1579 ui->FPanel->model()->updateAppearance(prefs);
\r
1584 ///////////////////////////////////////////////////////////////////////////////
\r
1585 /// \brief MainWindow::onToggleHidden
\r
1586 /// \param checked メニューのチェック状態
\r
1588 /// 隠しファイルの表示/非表示を切り替えます。
\r
1590 void MainWindow::onToggleHidden(bool checked)
\r
1592 qDebug() << "MainWindow::onToggleHidden" << checked;
\r
1595 activeModel()->setFilter(activeModel()->filter() | QDir::Hidden);
\r
1598 activeModel()->setFilter(activeModel()->filter() ^ QDir::Hidden);
\r
1601 activeModel()->refresh();
\r
1604 ///////////////////////////////////////////////////////////////////////////////
\r
1605 /// \brief MainWindow::onToggleSystem
\r
1606 /// \param checked メニューのチェック状態
\r
1608 /// システムファイルの表示/非表示を切り替えます。
\r
1610 void MainWindow::onToggleSystem(bool checked)
\r
1612 qDebug() << "MainWindow::onToggleSystem" << checked;
\r
1615 activeModel()->setFilter(activeModel()->filter() | QDir::System);
\r
1618 activeModel()->setFilter(activeModel()->filter() ^ QDir::System);
\r
1621 activeModel()->refresh();
\r
1624 ///////////////////////////////////////////////////////////////////////////////
\r
1625 /// \brief MainWindow::onToggleThumbnailMode
\r
1626 /// \param checked メニューのチェック状態
\r
1628 /// サムネイルモードの切り替えを行います。
\r
1630 void MainWindow::onToggleThumbnailMode(bool checked)
\r
1632 qDebug() << "MainWindow::onToggleThumbnailMode()" << checked;
\r
1634 activePanel()->folderPanel()->toggleView(checked);
\r
1637 ///////////////////////////////////////////////////////////////////////////////
\r
1638 /// \brief MainWindow::onToggleToolbar
\r
1639 /// \param checked メニューのチェック状態
\r
1641 /// ツールバーの表示/非表示を切り替えます。
\r
1643 void MainWindow::onToggleToolbar(bool checked)
\r
1645 ui->mainToolBar->setVisible(checked);
\r
1648 ///////////////////////////////////////////////////////////////////////////////
\r
1649 /// \brief MainWindow::onCheckUpdate
\r
1650 /// \param silent 最新版を使用している場合に何も表示しないならtrue
\r
1652 /// アップデートの有無を確認します。
\r
1654 void MainWindow::onCheckUpdate(bool silent)
\r
1656 qDebug() << "MainWindow::onCheckUpdate()" << silent;
\r
1658 QNetworkAccessManager *manager = new QNetworkAccessManager(this);
\r
1661 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));
\r
1664 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinished(QNetworkReply*)));
\r
1667 manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_win.html")));
\r
1668 #elif defined(Q_OS_MAC)
\r
1669 manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_mac.html")));
\r
1673 void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)
\r
1675 qDebug() << "MainWindow::checkUpdateFinishedSilent";
\r
1677 checkUpdateFinished(reply, true);
\r
1680 void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)
\r
1682 qDebug() << "MainWindow::checkUpdateFinished" << silent;
\r
1684 if (reply->error() == QNetworkReply::NoError) {
\r
1685 QString str = reply->readAll();
\r
1686 str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);
\r
1687 QRegExp rx("Gefu([0-9]+)");
\r
1689 QString version = rx.cap(1);
\r
1690 if (version.toInt() > VERSION_VALUE * 100) {
\r
1691 QMessageBox::information(
\r
1693 tr("最新のバージョンが存在します。<br/>") +
\r
1694 tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));
\r
1696 else if (!silent) {
\r
1697 QMessageBox::information(
\r
1699 tr("お使いのバージョンは最新です。"));
\r
1702 else if (!silent){
\r
1703 QMessageBox::critical(
\r
1705 tr("最新バージョンのチェックに失敗しました。<br/>") +
\r
1706 reply->errorString());
\r
1710 ///////////////////////////////////////////////////////////////////////////////
\r
1711 /// \brief MainWindow::initActions
\r
1715 void MainWindow::initActions()
\r
1717 qDebug() << "MainWindow::initActions()";
\r
1719 QList<QKeySequence> shortcuts;
\r
1721 //>>>>> 追加のショートカットキーを設定する
\r
1722 appendActionShortcut(ui->action_Open, "M");
\r
1723 appendActionShortcut(ui->action_OpenWith, "Shift+M");
\r
1724 appendActionShortcut(ui->view_Back, "Backspace");
\r
1725 // MacだとShift+の形で認識されてしまうもの
\r
1726 appendActionShortcut(ui->action_ScaleUp, "Shift++");
\r
1727 appendActionShortcut(ui->action_Filter, "Shift+*");
\r
1728 appendActionShortcut(ui->action_OpenTerminal, "Shift+>");
\r
1729 appendActionShortcut(ui->action_About, "Shift+?");
\r
1730 appendActionShortcut(ui->image_ScaleNormal, "Shift+=");
\r
1733 connect(ui->action_About, SIGNAL(triggered()), this, SLOT(onAbout()));
\r
1734 connect(ui->action_AddBookmark, SIGNAL(triggered()), this, SLOT(onAddBookmark()));
\r
1735 connect(ui->action_Cd, SIGNAL(triggered()), this, SLOT(onChooseFolder()));
\r
1736 connect(ui->action_CheckUpdate, SIGNAL(triggered()), this, SLOT(onCheckUpdate()));
\r
1737 connect(ui->action_Copy, SIGNAL(triggered()), this, SLOT(onCopy()));
\r
1738 connect(ui->action_CopyFileName, SIGNAL(triggered()), this, SLOT(onCopyFileName()));
\r
1739 connect(ui->action_CopyFilePath, SIGNAL(triggered()), this, SLOT(onCopyFilePath()));
\r
1740 connect(ui->action_CreateFile, SIGNAL(triggered()), this, SLOT(onCreateFile()));
\r
1741 connect(ui->action_CreateFolder, SIGNAL(triggered()), this, SLOT(onCreateFolder()));
\r
1742 connect(ui->action_Delete, SIGNAL(triggered()), this, SLOT(onDelete()));
\r
1743 connect(ui->action_EditBookmark, SIGNAL(triggered()), this, SLOT(onEditBookmark()));
\r
1744 connect(ui->action_ExpandLeft, SIGNAL(triggered()), this, SLOT(onExpandLeft()));
\r
1745 connect(ui->action_ExpandRight, SIGNAL(triggered()), this, SLOT(onExpandRight()));
\r
1746 connect(ui->action_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));
\r
1747 connect(ui->action_History, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));
\r
1748 connect(ui->action_KeyDown, SIGNAL(triggered()), this, SLOT(onKeyDown()));
\r
1749 connect(ui->action_KeyDownOther, SIGNAL(triggered()), this, SLOT(onKeyDownOther()));
\r
1750 connect(ui->action_KeyEnd, SIGNAL(triggered()), this, SLOT(onKeyEnd()));
\r
1751 connect(ui->action_KeyEndOther, SIGNAL(triggered()), this, SLOT(onKeyEndOther()));
\r
1752 connect(ui->action_KeyHome, SIGNAL(triggered()), this, SLOT(onKeyHome()));
\r
1753 connect(ui->action_KeyHomeOther, SIGNAL(triggered()), this, SLOT(onKeyHomeOther()));
\r
1754 connect(ui->action_KeyLeft, SIGNAL(triggered()), this, SLOT(onKeyLeft()));
\r
1755 connect(ui->action_KeyUp, SIGNAL(triggered()), this, SLOT(onKeyUp()));
\r
1756 connect(ui->action_KeyUpOther, SIGNAL(triggered()), this, SLOT(onKeyUpOther()));
\r
1757 connect(ui->action_Move, SIGNAL(triggered()), this, SLOT(onMove()));
\r
1758 connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(onOpen()));
\r
1759 connect(ui->action_OpenArchiver, SIGNAL(triggered()), this, SLOT(onOpenArchiver()));
\r
1760 connect(ui->action_OpenEditor, SIGNAL(triggered()), this, SLOT(onOpenEditor()));
\r
1761 connect(ui->action_OpenTerminal, SIGNAL(triggered()), this, SLOT(onOpenTerminal()));
\r
1762 connect(ui->action_OpenWith, SIGNAL(triggered()), this, SLOT(onOpenWith()));
\r
1763 connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));
\r
1764 connect(ui->action_Rename, SIGNAL(triggered()), this, SLOT(onRename()));
\r
1765 connect(ui->action_KeyRight, SIGNAL(triggered()), this, SLOT(onKeyRight()));
\r
1766 connect(ui->action_RunCommand, SIGNAL(triggered()), this, SLOT(onRunCommand()));
\r
1767 connect(ui->action_ScaleDown, SIGNAL(triggered()), this, SLOT(onScaleDown()));
\r
1768 connect(ui->action_ScaleUp, SIGNAL(triggered()), this, SLOT(onScaleUp()));
\r
1769 connect(ui->action_SearchNext, SIGNAL(triggered()), this, SLOT(onSearchNext()));
\r
1770 connect(ui->action_SearchPrev, SIGNAL(triggered()), this, SLOT(onSearchPrev()));
\r
1771 connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));
\r
1772 connect(ui->action_ShowBookmark, SIGNAL(triggered()), this, SLOT(showBookmarkDialog()));
\r
1773 connect(ui->action_Sort, SIGNAL(triggered()), this, SLOT(showSortDialog()));
\r
1774 connect(ui->action_SplitCenter, SIGNAL(triggered()), this, SLOT(onSplitCenter()));
\r
1775 connect(ui->action_Swap, SIGNAL(triggered()), this, SLOT(onSwap()));
\r
1776 connect(ui->action_SyncPanel, SIGNAL(triggered()), this, SLOT(onSyncPanel()));
\r
1777 connect(ui->action_SyncPanelTo, SIGNAL(triggered()), this, SLOT(onSyncPanelTo()));
\r
1779 connect(ui->toggle_FullMode, SIGNAL(toggled(bool)), this, SLOT(onToggleFullMode(bool)));
\r
1780 connect(ui->toggle_Hidden, SIGNAL(toggled(bool)), this, SLOT(onToggleHidden(bool)));
\r
1781 connect(ui->toggle_Mark, SIGNAL(triggered()), this, SLOT(onToggleMark()));
\r
1782 connect(ui->toggle_PreviewMode, SIGNAL(toggled(bool)), this, SLOT(onTogglePreviewMode(bool)));
\r
1783 connect(ui->toggle_Search, SIGNAL(toggled(bool)), this, SLOT(onToggleSearch(bool)));
\r
1784 connect(ui->toggle_System, SIGNAL(toggled(bool)), this, SLOT(onToggleSystem(bool)));
\r
1785 connect(ui->toggle_ThumbnailMode, SIGNAL(toggled(bool)), this, SLOT(onToggleThumbnailMode(bool)));
\r
1786 connect(ui->toggle_Toolbar, SIGNAL(toggled(bool)), this, SLOT(onToggleToolbar(bool)));
\r
1788 connect(ui->view_Back, SIGNAL(triggered()), this, SLOT(view_finished()));
\r
1792 ///////////////////////////////////////////////////////////////////////////////
\r
1793 /// \brief MainWindow::setActiveModel
\r
1794 /// \param m 新しいアクティブモデル
\r
1796 /// アクティブモデルを変更します。
\r
1798 void MainWindow::setActiveModel(FolderModel *m)
\r
1800 qDebug() << "MainWindow::setActiveModel()" << m;
\r
1802 if (activeModel()) {
\r
1803 activeModel()->disconnect(this);
\r
1804 ui->action_CdHome->disconnect();
\r
1805 ui->action_CdRoot->disconnect();
\r
1806 ui->action_CdUp->disconnect();
\r
1807 ui->action_historyBack->disconnect();
\r
1808 ui->action_HistoryForward->disconnect();
\r
1809 ui->action_MarkAll->disconnect();
\r
1810 ui->action_MarkAllFiles->disconnect();
\r
1811 ui->action_MarkAllOff->disconnect();
\r
1812 ui->action_MarkInvert->disconnect();
\r
1813 ui->action_Refresh->disconnect();
\r
1818 connect(activeModel(), SIGNAL(modelAboutToBeReset()), this, SLOT(model_PreReset()));
\r
1819 connect(activeModel(), SIGNAL(modelReset()), this, SLOT(model_PostReset()));
\r
1820 connect(ui->action_CdHome, SIGNAL(triggered()), activeModel(), SLOT(onCdHome()));
\r
1821 connect(ui->action_CdRoot, SIGNAL(triggered()), activeModel(), SLOT(onCdRoot()));
\r
1822 connect(ui->action_CdUp, SIGNAL(triggered()), activeModel(), SLOT(onCdUp()));
\r
1823 connect(ui->action_historyBack, SIGNAL(triggered()), activeModel(), SLOT(onHistoryBack()));
\r
1824 connect(ui->action_HistoryForward, SIGNAL(triggered()), activeModel(), SLOT(onHistoryForward()));
\r
1825 connect(ui->action_MarkAll, SIGNAL(triggered()), activeModel(), SLOT(onMarkAll()));
\r
1826 connect(ui->action_MarkAllFiles, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllFiles()));
\r
1827 connect(ui->action_MarkAllOff, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllOff()));
\r
1828 connect(ui->action_MarkInvert, SIGNAL(triggered()), activeModel(), SLOT(onMarkInvert()));
\r
1829 connect(ui->action_Refresh, SIGNAL(triggered()), activeModel(), SLOT(refresh()));
\r
1831 Preferences prefs(this);
\r
1832 if (ui->LPanel->isVisible()) {
\r
1833 ui->LPanel->updateAppearance(prefs);
\r
1834 ui->LPanel->model()->updateAppearance(prefs);
\r
1836 if (ui->RPanel->isVisible()) {
\r
1837 ui->RPanel->updateAppearance(prefs);
\r
1838 ui->RPanel->model()->updateAppearance(prefs);
\r
1840 if (ui->FPanel->isVisible()) {
\r
1841 ui->FPanel->updateAppearance(prefs);
\r
1842 ui->FPanel->model()->updateAppearance(prefs);
\r
1846 ///////////////////////////////////////////////////////////////////////////////
\r
1847 /// \brief MainWindow::activeModel
\r
1848 /// \return アクティブなフォルダモデルを返します。
\r
1850 FolderModel *MainWindow::activeModel() const
\r
1852 return FolderModel::activeModel();
\r
1855 ///////////////////////////////////////////////////////////////////////////////
\r
1856 /// \brief MainWindow::activePanel
\r
1857 /// \return アクティブモデルを所有している可視状態のパネルを返します。
\r
1859 Panel *MainWindow::activePanel() const
\r
1861 if (ui->FPanel->model() == activeModel() && ui->FPanel->isVisible()) {
\r
1862 return ui->FPanel;
\r
1864 if (ui->LPanel->model() == activeModel() && ui->LPanel->isVisible()) {
\r
1865 return ui->LPanel;
\r
1867 if (ui->RPanel->model() == activeModel() && ui->RPanel->isVisible()) {
\r
1868 return ui->RPanel;
\r
1871 qDebug() << ">>>>>>>>>> activePanel() Logic error <<<<<<<<<<";
\r
1875 ///////////////////////////////////////////////////////////////////////////////
\r
1876 /// \brief MainWindow::inactiveModel
\r
1877 /// \return 非アクティブなフォルダモデルを返します。
\r
1879 FolderModel *MainWindow::inactiveModel() const
\r
1881 if (ui->LPanel->model()->isActive()) {
\r
1882 return ui->RPanel->model();
\r
1884 Q_ASSERT(ui->RPanel->model()->isActive());
\r
1885 return ui->LPanel->model();
\r
1888 ///////////////////////////////////////////////////////////////////////////////
\r
1889 /// \brief MainWindow::inactivePanel
\r
1890 /// \return 非アクティブモデルを所有している可視状態のパネルを返します。
\r
1892 Panel *MainWindow::inactivePanel() const
\r
1894 if (ui->LPanel->model() == inactiveModel() && ui->LPanel->isVisible()) {
\r
1895 return ui->LPanel;
\r
1897 if (ui->RPanel->model() == inactiveModel() && ui->RPanel->isVisible()) {
\r
1898 return ui->RPanel;
\r
1900 if (ui->FPanel->model() == inactiveModel() && ui->FPanel->isVisible()) {
\r
1901 return ui->FPanel;
\r
1904 qDebug() << ">>>>>>>>>> inactivePanel() Logic error <<<<<<<<<<";
\r
1908 ///////////////////////////////////////////////////////////////////////////////
\r
1909 /// \brief MainWindow::selectedItems
\r
1910 /// \return マークされているアイテムまたはカレントアイテムのリスト
\r
1912 QFileInfoList MainWindow::selectedItems() const
\r
1914 QFileInfoList list = activeModel()->markedItems();
\r
1915 if (list.isEmpty()) {
\r
1916 qDebug() << focusItemView();
\r
1917 qDebug() << focusItemView()->currentIndex();
\r
1918 Q_ASSERT(focusItemView()->currentIndex().isValid());
\r
1919 list << activeModel()->fileInfo(focusItemView()->currentIndex());
\r
1925 ///////////////////////////////////////////////////////////////////////////////
\r
1926 /// \brief MainWindow::focusItemView
\r
1927 /// \return フォーカスを持つアイテムビュー
\r
1929 QAbstractItemView *MainWindow::focusItemView() const
\r
1931 return static_cast<QAbstractItemView*>(qApp->focusWidget());
\r
1934 ///////////////////////////////////////////////////////////////////////////////
\r
1935 /// \brief MainWindow::setViewMode
\r
1936 /// \param mode 新しいビューモード
\r
1940 void MainWindow::setViewMode(Mode mode)
\r
1942 qDebug() << "MainWindow::setViewMode()" << mode;
\r
1944 QWidget *newFocusWidget = NULL;
\r
1948 ui->FPanel->setVisible(false);
\r
1949 ui->splitter->setVisible(true);
\r
1950 ui->LPanel->setViewItem();
\r
1951 ui->RPanel->setViewItem();
\r
1952 if (m_viewMode == ModeFull) {
\r
1953 activePanel()->folderPanel()->setItemView(focusItemView()->objectName());
\r
1954 activePanel()->folderPanel()->itemView()->setCurrentIndex(
\r
1955 focusItemView()->currentIndex());
\r
1956 ui->FPanel->setModel(NULL);
\r
1958 newFocusWidget = activePanel()->folderPanel()->itemView();
\r
1962 if (m_viewMode == ModeBasic) {
\r
1963 ui->FPanel->setModel(activeModel());
\r
1964 ui->splitter->setVisible(false);
\r
1965 ui->FPanel->setVisible(true);
\r
1966 ui->FPanel->folderPanel()->setItemView(focusItemView()->objectName());
\r
1967 ui->FPanel->folderPanel()->itemView()->setCurrentIndex(
\r
1968 focusItemView()->currentIndex());
\r
1970 ui->FPanel->setViewItem();
\r
1971 newFocusWidget = activePanel()->folderPanel()->itemView();
\r
1975 ui->FPanel->updateAppearance(Preferences(this));
\r
1976 ui->FPanel->setViewItem(focusItemView()->currentIndex());
\r
1977 ui->splitter->setVisible(false);
\r
1978 ui->FPanel->setVisible(true);
\r
1979 newFocusWidget = ui->FPanel->visibleView();
\r
1983 inactivePanel()->setViewItem(focusItemView()->currentIndex());
\r
1987 m_prevMode = m_viewMode;
\r
1988 m_viewMode = mode;
\r
1990 if (newFocusWidget)
\r
1991 newFocusWidget->setFocus();
\r
1996 ///////////////////////////////////////////////////////////////////////////////
\r
1997 /// \brief MainWindow::startProcess
\r
1998 /// \param cmd 実行するコマンド
\r
1999 /// \param errMsg エラー時の表示メッセージ
\r
2000 /// \return true:成功, false:失敗
\r
2002 bool MainWindow::startProcess(const QString &cmd, const QString &errMsg)
\r
2004 qDebug() << "MainWindow::startProcess" << cmd << errMsg;
\r
2006 QProcess process(this);
\r
2007 process.setWorkingDirectory(activeModel()->rootPath());
\r
2008 if (!process.startDetached(cmd)) {
\r
2009 QMessageBox::critical(this, tr("エラー"), errMsg + "<br/>" + cmd);
\r
2015 ///////////////////////////////////////////////////////////////////////////////
\r
2016 /// \brief MainWindow::updateActions
\r
2018 /// アクションの有効/無効を設定します。
\r
2020 void MainWindow::updateActions()
\r
2022 qDebug() << "MainWindow::updateActions";
\r
2024 bool isView = true;
\r
2025 bool isSearch = false;
\r
2026 bool isImageView = false;
\r
2027 bool toggleSearch = true;
\r
2029 QWidget *w = qApp->focusWidget();
\r
2030 if (w->objectName() == "folderView" || w->objectName() == "thumbnailView") {
\r
2031 setEnabledAllActions(true);
\r
2033 ui->action_historyBack->setEnabled(!activeModel()->isHistoryBegin());
\r
2034 ui->action_HistoryForward->setEnabled(!activeModel()->isHistoryEnd());
\r
2036 ui->toggle_Hidden->blockSignals(true);
\r
2037 ui->toggle_Hidden->setChecked(activeModel()->filter() & QDir::Hidden);
\r
2038 ui->toggle_Hidden->blockSignals(false);
\r
2040 ui->toggle_System->blockSignals(true);
\r
2041 ui->toggle_System->setChecked(activeModel()->filter() & QDir::System);
\r
2042 ui->toggle_System->blockSignals(false);
\r
2044 ui->toggle_ThumbnailMode->blockSignals(true);
\r
2045 ui->toggle_ThumbnailMode->setChecked(w->objectName() == "thumbnailView");
\r
2046 ui->toggle_ThumbnailMode->blockSignals(false);
\r
2048 // 現在の選択アイテムが".."の場合、ファイル操作系アクションは無効にする
\r
2049 QFileInfoList list = selectedItems();
\r
2050 if (list.size() == 1 && list[0].fileName() == "..") {
\r
2051 ui->action_Copy->setEnabled(false);
\r
2052 ui->action_Delete->setEnabled(false);
\r
2053 ui->action_Move->setEnabled(false);
\r
2054 ui->action_Rename->setEnabled(false);
\r
2057 // 単画面またはプレビューモードの場合
\r
2058 if (!ui->LPanel->folderPanel()->isVisible() ||
\r
2059 !ui->RPanel->folderPanel()->isVisible())
\r
2061 ui->action_Copy->setEnabled(false);
\r
2062 ui->action_Move->setEnabled(false);
\r
2063 ui->action_Swap->setEnabled(false);
\r
2064 ui->action_SyncPanel->setEnabled(false);
\r
2065 ui->action_SyncPanelTo->setEnabled(false);
\r
2069 if (m_viewMode == ModeFull) {
\r
2070 ui->toggle_PreviewMode->setEnabled(false);
\r
2071 ui->action_SplitCenter->setEnabled(false);
\r
2072 ui->action_ExpandLeft->setEnabled(false);
\r
2073 ui->action_ExpandRight->setEnabled(false);
\r
2074 ui->action_KeyDownOther->setEnabled(false);
\r
2075 ui->action_KeyEndOther->setEnabled(false);
\r
2076 ui->action_KeyHomeOther->setEnabled(false);
\r
2077 ui->action_KeyUpOther->setEnabled(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 reconnectAction(ui->text_ConvertFromEUC, SIGNAL(triggered()), v, SLOT(convertFromEUC()));
\r
2095 reconnectAction(ui->text_ConvertFromJIS, SIGNAL(triggered()), v, SLOT(convertFromJIS()));
\r
2096 reconnectAction(ui->text_ConvertFromSJIS, SIGNAL(triggered()), v, SLOT(convertFromSJIS()));
\r
2097 reconnectAction(ui->text_ConvertFromUTF8, SIGNAL(triggered()), v, SLOT(convertFromUTF8()));
\r
2098 reconnectAction(ui->text_ConvertFromUTF16, SIGNAL(triggered()), v, SLOT(convertFromUTF16()));
\r
2099 reconnectAction(ui->text_ConvertFromUTF16BE, SIGNAL(triggered()), v, SLOT(convertFromUTF16BE()));
\r
2100 reconnectAction(ui->text_ConvertFromUTF16LE, SIGNAL(triggered()), v, SLOT(convertFromUTF16LE()));
\r
2101 reconnectAction(ui->text_Copy, SIGNAL(triggered()), v, SLOT(copy()));
\r
2103 else if (w->objectName() == "imageView") {
\r
2104 SimpleImageView *v = static_cast<SimpleImageView*>(w);
\r
2105 setEnabledAllActions(false);
\r
2106 toggleSearch = false;
\r
2107 isImageView = true;
\r
2109 reconnectAction(ui->image_FitToWindow, SIGNAL(toggled(bool)), v, SLOT(fitToWindow(bool)));
\r
2110 reconnectAction(ui->image_ScaleNormal, SIGNAL(toggled(bool)), v, SLOT(scaleNormal()));
\r
2111 reconnectAction(ui->image_Rotate90, SIGNAL(triggered()), v, SLOT(rotate90()));
\r
2112 reconnectAction(ui->image_Rotate180, SIGNAL(triggered()), v, SLOT(rotate180()));
\r
2115 ui->toggle_Toolbar->blockSignals(true);
\r
2116 ui->toggle_Toolbar->setChecked(ui->mainToolBar->isVisible());
\r
2117 ui->toggle_Toolbar->blockSignals(false);
\r
2119 ui->action_About->setEnabled(true);
\r
2120 ui->action_CheckUpdate->setEnabled(true);
\r
2121 ui->action_KeyDown->setEnabled(isView);
\r
2122 ui->action_KeyEnd->setEnabled(isView);
\r
2123 ui->action_KeyHome->setEnabled(isView);
\r
2124 ui->action_KeyUp->setEnabled(isView);
\r
2125 ui->action_Quit->setEnabled(true);
\r
2126 ui->action_ScaleDown->setEnabled(isView);
\r
2127 ui->action_ScaleUp->setEnabled(isView);
\r
2128 ui->action_SearchNext->setEnabled(isSearch);
\r
2129 ui->action_SearchPrev->setEnabled(isSearch);
\r
2130 ui->action_Setting->setEnabled(true);
\r
2131 ui->toggle_Search->setEnabled(toggleSearch);
\r
2132 ui->view_Back->setEnabled(m_viewMode == ModeView);
\r
2134 if (isImageView) {
\r
2135 ui->action_ScaleDown->setText(tr("縮小"));
\r
2136 ui->action_ScaleUp->setText(tr("拡大"));
\r
2139 ui->action_ScaleDown->setText(tr("文字を小さく"));
\r
2140 ui->action_ScaleUp->setText(tr("文字を大きく"));
\r
2143 ui->toggle_FullMode->setEnabled(m_viewMode == ModeBasic || m_viewMode == ModeFull);
\r
2145 if (w->objectName() == "thumbnailView") {
\r
2146 ui->action_KeyLeft->setEnabled(false);
\r
2147 ui->action_KeyRight->setEnabled(false);
\r
2150 ui->action_KeyLeft->setEnabled(isView);
\r
2151 ui->action_KeyRight->setEnabled(isView);
\r
2155 ///////////////////////////////////////////////////////////////////////////////
\r
2156 /// \brief MainWindow::setEnabledAllActions
\r
2157 /// \param enable 有効にする場合はtrue
\r
2159 /// 全てのアクションを有効または無効にします。
\r
2161 void MainWindow::setEnabledAllActions(bool enable)
\r
2163 qDebug() << "MainWindow::setEnabledAllActions()" << enable;
\r
2164 foreach (QAction *action, m_actions) {
\r
2165 action->setEnabled(enable);
\r
2169 ///////////////////////////////////////////////////////////////////////////////
\r
2170 /// \brief MainWindow::onAbout
\r
2172 /// Aboutダイアログを表示します。
\r
2174 void MainWindow::onAbout()
\r
2176 QMessageBox::about(
\r
2180 tr("<center>Gefu is an Experimental File Utility.<br/>"
\r
2181 "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"
\r
2182 "<p>最新版の情報は<a href='http://gefu.sourceforge.jp/'>公式サイト</a>で公開しています。</p>"
\r
2183 "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));
\r
2186 ///////////////////////////////////////////////////////////////////////////////
\r
2187 /// \brief MainWindow::closeEvent
\r
2188 /// \param event クローズイベント
\r
2192 void MainWindow::closeEvent(QCloseEvent *event)
\r
2194 qDebug() << "MainWindow::closeEvent()";
\r
2195 Preferences prefs(this);
\r
2197 if (prefs.isConfirmQuit()) {
\r
2198 QMessageBox msgBox;
\r
2199 QCheckBox *checkBox = new QCheckBox();
\r
2200 checkBox->setText(tr("次回以降は確認しない"));
\r
2201 msgBox.setCheckBox(checkBox);
\r
2202 msgBox.setText(tr("終了しますか?"));
\r
2203 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
\r
2204 msgBox.setIcon(QMessageBox::Question);
\r
2206 if (msgBox.exec() == QMessageBox::No) {
\r
2207 qDebug() << ">>>>> ユーザによりキャンセルされました <<<<<";
\r
2211 prefs.setConfirmQuit(!checkBox->isChecked());
\r
2214 prefs.saveModel("Left", ui->LPanel->model());
\r
2215 prefs.saveModel("Right", ui->RPanel->model());
\r
2216 prefs.saveWindow(this);
\r
2217 QMainWindow::closeEvent(event);
\r
2220 ///////////////////////////////////////////////////////////////////////////////
\r
2221 /// \brief MainWindow::eventFilter
\r
2222 /// \param watched イベントの発生元オブジェクト
\r
2223 /// \param e 発生したイベント
\r
2224 /// \return イベントを処理した場合はtrueを返します。
\r
2226 bool MainWindow::eventFilter(QObject *watched, QEvent *e)
\r
2228 switch (e->type()) {
\r
2229 case QEvent::KeyPress:
\r
2231 return onKeyPressEvent(watched, static_cast<QKeyEvent*>(e));
\r
2233 case QEvent::ContextMenu:
\r
2234 // コンテキストメニューイベントの処理
\r
2235 return onContextMenuEvent(watched, static_cast<QContextMenuEvent*>(e));
\r