OSDN Git Service

baa3a96dc4e7047f54f28ea83c5d078074919d61
[gefu/Gefu.git] / mainwindow.cpp
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
6 #include "global.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
21 \r
22 #include <QCheckBox>\r
23 #include <QClipboard>\r
24 #include <QCloseEvent>\r
25 #include <QDebug>\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
32 #include <QProcess>\r
33 \r
34 ///////////////////////////////////////////////////////////////////////////////\r
35 /// \brief MainWindow::MainWindow\r
36 /// \param parent   親ウィジェット\r
37 ///\r
38 /// コンストラクタ\r
39 ///\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
46     m_actions()\r
47 {\r
48     ui->setupUi(this);\r
49     connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(app_focusChange(QWidget*,QWidget*)));\r
50 \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
56 \r
57     // アプリケーション情報を初期化する\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
63 \r
64     // 古い設定ファイルを削除する\r
65 #ifdef Q_OS_MAC\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
71     }\r
72 #endif\r
73 \r
74     // 設定の初期化\r
75     Preferences prefs(this);\r
76     if (prefs.isReset()) {\r
77         prefs.clear();\r
78     }\r
79 \r
80     // パネルにモデルを割り当てる\r
81     ui->LPanel->setModel(new FolderModel(this));\r
82     ui->RPanel->setModel(new FolderModel(this));\r
83     setActiveModel(ui->LPanel->model());\r
84 \r
85     // パネルを初期化する\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
90 \r
91     // モデルを初期化する\r
92     prefs.restoreModel("Left", ui->LPanel->model());\r
93     prefs.restoreModel("Right", ui->RPanel->model());\r
94 \r
95     // アクションを初期化する\r
96     initActions();\r
97 \r
98     // ブックマークメニューを初期化する\r
99     initBookmarkMenu();\r
100 \r
101     // メインウィンドウを初期化する\r
102     setWindowTitle(tr("げふぅ Ver%1").arg(VERSION_VALUE));\r
103     setWindowIcon(QIcon("://images/file-manager.png"));\r
104     prefs.restoreWindow(this);\r
105 \r
106     // 最新バージョンをチェックする\r
107     if (prefs.isCheckUpdate()) {\r
108         onCheckUpdate(true);\r
109     }\r
110 \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
115 \r
116     connect(ui->FPanel, SIGNAL(showed(QWidget*)), this, SLOT(view_showed(QWidget*)));\r
117 }\r
118 \r
119 ///////////////////////////////////////////////////////////////////////////////\r
120 /// \brief MainWindow::~MainWindow\r
121 ///\r
122 /// デストラクタ\r
123 ///\r
124 MainWindow::~MainWindow()\r
125 {\r
126     delete ui;\r
127 }\r
128 \r
129 ///////////////////////////////////////////////////////////////////////////////\r
130 /// \brief MainWindow::app_focusChange\r
131 /// \param old  フォーカスを失うウィジェット\r
132 /// \param now  フォーカスを得るウィジェット\r
133 ///\r
134 /// フォーカス変更時の処理\r
135 ///\r
136 void MainWindow::app_focusChange(QWidget *old, QWidget *now)\r
137 {\r
138     qDebug() << "MainWindow::app_focusChange()";\r
139     if (old) qDebug() << "  old is" << old->objectName();\r
140     if (now) qDebug() << "  now is" << now->objectName();\r
141 \r
142     // フォルダビューがフォーカスを得た場合\r
143     if (now && (now->objectName() == "folderView" ||\r
144                 now->objectName() == "thumbnailView"))\r
145     {\r
146         connect(focusItemView()->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),\r
147                 this, SLOT(view_currentChanged(QModelIndex,QModelIndex)));\r
148         FolderModel *m = static_cast<FolderModel*>(focusItemView()->model());\r
149         setActiveModel(m);\r
150         statusBar()->showMessage(m->filePath(focusItemView()->currentIndex()));\r
151     }\r
152 \r
153     // 検索ボックスがフォーカスを失った場合\r
154     if (old && old->objectName() == "searchBox") {\r
155         // 検索モード終了\r
156         ui->toggle_Search->setChecked(false);\r
157     }\r
158 \r
159     // アクションの有効/無効を設定する\r
160     if (now) {\r
161         updateActions();\r
162     }\r
163 }\r
164 \r
165 ///////////////////////////////////////////////////////////////////////////////\r
166 /// \brief MainWindow::model_PreReset\r
167 ///\r
168 /// FolderModelリセット前の処理\r
169 ///\r
170 void MainWindow::model_PreReset()\r
171 {\r
172     qDebug() << "MainWindow::model_PreReset()";\r
173 \r
174     statusBar()->showMessage(tr("ファイルリストを取得しています..."));\r
175 }\r
176 \r
177 ///////////////////////////////////////////////////////////////////////////////\r
178 /// \brief MainWindow::model_PostReset\r
179 ///\r
180 /// FolderModelリセット後の処理\r
181 ///\r
182 void MainWindow::model_PostReset()\r
183 {\r
184     qDebug() << "MainWindow::model_PostReset()";\r
185 \r
186     FolderModel *m = static_cast<FolderModel*>(sender());\r
187     if (!m->error().isEmpty()) {\r
188         statusBar()->showMessage(m->error());\r
189     }\r
190     else {\r
191         statusBar()->showMessage(tr("レディ"));\r
192     }\r
193 }\r
194 \r
195 ///////////////////////////////////////////////////////////////////////////////\r
196 /// \brief MainWindow::onRunCommand\r
197 ///\r
198 /// 入力されたコマンドを実行します。\r
199 ///\r
200 void MainWindow::onRunCommand()\r
201 {\r
202     qDebug() << "MainWindow::onRunCommand";\r
203 \r
204     QFileInfoList list = selectedItems();\r
205     QString command = QString::null;\r
206     foreach (const QFileInfo &info, list) {\r
207 #ifdef Q_OS_MAC\r
208         QString path = info.absoluteFilePath();\r
209 #else\r
210         QString path = info.fileName();\r
211 #endif\r
212         if (info.isExecutable()) {\r
213             command = QQ(path) + " " + command;\r
214         }\r
215         else {\r
216             command += " " + QQ(path);\r
217         }\r
218     }\r
219 \r
220     QInputDialog dlg(this);\r
221     dlg.setInputMode(QInputDialog::TextInput);\r
222     dlg.setWindowTitle(tr("コマンドを実行"));\r
223     dlg.setLabelText(tr("コマンド:"));\r
224     dlg.setTextValue(command);\r
225     dlg.resize(width() * 0.8, dlg.height());\r
226 \r
227     int ret = dlg.exec();\r
228     command = dlg.textValue();\r
229     if (ret == QDialog::Accepted && !command.isEmpty()) {\r
230         startProcess(command, tr("コマンドの実行に失敗しました。"));\r
231     }\r
232 }\r
233 \r
234 ///////////////////////////////////////////////////////////////////////////////\r
235 /// \brief MainWindow::onExpandLeft\r
236 ///\r
237 /// 左パネルを拡大します。\r
238 ///\r
239 void MainWindow::onExpandLeft()\r
240 {\r
241     qDebug() << "MainWindow::onExpandLeft()";\r
242 \r
243     QList<int> sizes = ui->splitter->sizes();\r
244     QList<int> newSizes;\r
245 \r
246     newSizes << sizes[0] + 30;\r
247     newSizes << sizes[1] - 30;\r
248 \r
249     ui->splitter->setSizes(newSizes);\r
250 }\r
251 \r
252 ///////////////////////////////////////////////////////////////////////////////\r
253 /// \brief MainWindow::onExpandRight\r
254 ///\r
255 /// 右パネルを拡大します。\r
256 ///\r
257 void MainWindow::onExpandRight()\r
258 {\r
259     qDebug() << "MainWindow::onExpandLeft()";\r
260 \r
261     QList<int> sizes = ui->splitter->sizes();\r
262     QList<int> newSizes;\r
263 \r
264     newSizes << sizes[0] - 30;\r
265     newSizes << sizes[1] + 30;\r
266 \r
267     ui->splitter->setSizes(newSizes);\r
268 }\r
269 \r
270 ///////////////////////////////////////////////////////////////////////////////\r
271 /// \brief MainWindow::onToggleMark\r
272 ///\r
273 /// マーク状態を反転します。\r
274 ///\r
275 void MainWindow::onToggleMark()\r
276 {\r
277     qDebug() << "MainWindow::onToggleMark()";\r
278 \r
279     QModelIndex index = focusItemView()->currentIndex();\r
280     if (activeModel()->isMarked(index)) {\r
281         activeModel()->setData(index, Qt::Unchecked, Qt::CheckStateRole);\r
282     }\r
283     else {\r
284         activeModel()->setData(index, Qt::Checked, Qt::CheckStateRole);\r
285     }\r
286 \r
287     if (index.row() < activeModel()->rowCount() - 1) {\r
288         index = activeModel()->index(index.row() + 1, 0);\r
289         focusItemView()->setCurrentIndex(index);\r
290     }\r
291 }\r
292 \r
293 ///////////////////////////////////////////////////////////////////////////////\r
294 /// \brief MainWindow::view_statusChanged\r
295 /// \param text ステータス文字列\r
296 ///\r
297 /// ビューから受け取った文字列をステータスバーに表示します。\r
298 ///\r
299 void MainWindow::view_statusChanged(const QString &text)\r
300 {\r
301     statusBar()->findChild<QLabel*>("Right")->setText(text);\r
302 }\r
303 \r
304 ///////////////////////////////////////////////////////////////////////////////\r
305 /// \brief MainWindow::view_showed\r
306 /// \param w    表示されたビュー\r
307 ///\r
308 /// パネルのビューが表示された場合の処理を行います。\r
309 ///\r
310 void MainWindow::view_showed(QWidget *w)\r
311 {\r
312     w->setFocus();\r
313 }\r
314 \r
315 ///////////////////////////////////////////////////////////////////////////////\r
316 /// \brief MainWindow::view_currentChanged\r
317 /// \param current  新しいカレントインデックス\r
318 /// \param previous (使用しません)\r
319 ///\r
320 /// カレントインデックスが変更された場合の処理を行います。\r
321 ///\r
322 void MainWindow::view_currentChanged(const QModelIndex &current, const QModelIndex &previous)\r
323 {\r
324     qDebug() << "MainWindow::view_currentChanged()" << current;\r
325     Q_UNUSED(previous);\r
326 \r
327     if (focusItemView() != sender()->parent()) {\r
328         return;\r
329     }\r
330 \r
331     statusBar()->showMessage(activeModel()->filePath(current));\r
332 \r
333     if (m_viewMode == ModePreview) {\r
334         inactivePanel()->setViewItem(current);\r
335     }\r
336 \r
337     updateActions();\r
338 }\r
339 \r
340 ///////////////////////////////////////////////////////////////////////////////\r
341 /// \brief MainWindow::view_finished\r
342 ///\r
343 /// ビューアの終了\r
344 ///\r
345 void MainWindow::view_finished()\r
346 {\r
347     qDebug() << "MainWindow::view_finished()";\r
348 \r
349     statusBar()->findChild<QLabel*>("Right")->setText("");\r
350 \r
351     setViewMode(m_prevMode);\r
352 }\r
353 \r
354 ///////////////////////////////////////////////////////////////////////////////\r
355 /// \brief MainWindow::onMove\r
356 ///\r
357 /// 選択アイテムを隣のパネルに移動します。\r
358 ///\r
359 void MainWindow::onMove()\r
360 {\r
361     qDebug() << "MainWindow::onMove";\r
362 \r
363     QStringList list;\r
364     foreach (const QFileInfo &fi, selectedItems()) {\r
365         list << fi.absoluteFilePath();\r
366     }\r
367     if (list.isEmpty()) {\r
368         return;\r
369     }\r
370 \r
371     int row = focusItemView()->currentIndex().row();\r
372 \r
373     QString tgtPath = inactiveModel()->rootPath();\r
374     moveItems(list, tgtPath);\r
375 \r
376     if (row >= activeModel()->rowCount()) {\r
377         row = activeModel()->rowCount() - 1;\r
378     }\r
379     focusItemView()->setCurrentIndex(activeModel()->index(row, 1));\r
380 }\r
381 \r
382 ///////////////////////////////////////////////////////////////////////////////\r
383 /// \brief MainWindow::onKeyLeft\r
384 ///\r
385 /// ←キー押下時の処理を行います。\r
386 ///\r
387 void MainWindow::onKeyLeft()\r
388 {\r
389     qDebug() << "MainWindow::onKeyLeft()";\r
390 \r
391     QWidget *w = qApp->focusWidget();\r
392     if (w->objectName() == "folderView")\r
393     {\r
394         QWidget *panel = w->parentWidget()->parentWidget();\r
395         if (panel == ui->LPanel) {\r
396             activeModel()->onCdUp();\r
397         }\r
398         else if (ui->LPanel->folderPanel()->isVisible()){\r
399             ui->LPanel->folderPanel()->itemView()->setFocus();\r
400         }\r
401     }\r
402     else {\r
403         QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier);\r
404         qApp->sendEvent(w, &event);\r
405     }\r
406 }\r
407 \r
408 ///////////////////////////////////////////////////////////////////////////////\r
409 /// \brief MainWindow::onKeyRight\r
410 ///\r
411 /// →キー押下時の処理を行います。\r
412 ///\r
413 void MainWindow::onKeyRight()\r
414 {\r
415     qDebug() << "MainWindow::onKeyRight()";\r
416 \r
417     QWidget *w = qApp->focusWidget();\r
418     if (w->objectName() == "folderView")\r
419     {\r
420         QWidget *panel = w->parentWidget()->parentWidget();\r
421         if (panel == ui->RPanel) {\r
422             activeModel()->onCdUp();\r
423         }\r
424         else if (ui->RPanel->folderPanel()->isVisible()){\r
425             ui->RPanel->folderPanel()->itemView()->setFocus();\r
426         }\r
427     }\r
428     else {\r
429         QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier);\r
430         qApp->sendEvent(w, &event);\r
431     }\r
432 }\r
433 \r
434 ///////////////////////////////////////////////////////////////////////////////\r
435 /// \brief MainWindow::onChooseFolder\r
436 ///\r
437 /// 選択したフォルダに移動します。\r
438 ///\r
439 void MainWindow::onChooseFolder()\r
440 {\r
441     qDebug() << "MainWindow::onChooseFolder()";\r
442 \r
443     QString path = QFileDialog::getExistingDirectory(\r
444                 this, tr("フォルダを選択"), activeModel()->rootPath());\r
445     if (!path.isEmpty()) {\r
446         activeModel()->setRootPath(path);\r
447     }\r
448 }\r
449 \r
450 ///////////////////////////////////////////////////////////////////////////////\r
451 /// \brief MainWindow::onCopyFileName\r
452 ///\r
453 /// ファイル名をクリップボードにコピーします。\r
454 ///\r
455 void MainWindow::onCopyFileName()\r
456 {\r
457     qDebug() << "MainWindow::onCopyFileName()";\r
458 \r
459     QClipboard *clipboard = qApp->clipboard();\r
460     clipboard->setText(activeModel()->fileName(focusItemView()->currentIndex()));\r
461 }\r
462 \r
463 ///////////////////////////////////////////////////////////////////////////////\r
464 /// \brief MainWindow::onCopyFilePath\r
465 ///\r
466 /// フルパスをクリップボードにコピーします。\r
467 ///\r
468 void MainWindow::onCopyFilePath()\r
469 {\r
470     qDebug() << "MainWindow::onCopyFilePath()";\r
471 \r
472     QClipboard *clipboard = qApp->clipboard();\r
473     clipboard->setText(activeModel()->filePath(focusItemView()->currentIndex()));\r
474 }\r
475 \r
476 ///////////////////////////////////////////////////////////////////////////////\r
477 /// \brief MainWindow::askOverWrite\r
478 /// \param copyMethod   上書き方法\r
479 /// \param alias        別名\r
480 /// \param srcPath      コピー元パス\r
481 /// \param tgtPath      コピー先パス\r
482 ///\r
483 /// 上書きの処理方法を選択するダイアログを表示します。\r
484 ///\r
485 void MainWindow::askOverWrite(QString *copyMethod,\r
486                               QString *alias,\r
487                               const QString &srcPath,\r
488                               const QString &tgtPath)\r
489 {\r
490     qDebug() << "MainWindow::askOverWrite()";\r
491 \r
492     CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());\r
493     if (!m_overwriteDialog.isKeepSetting() ||\r
494         m_overwriteDialog.copyMethod() == "rbRename")\r
495     {\r
496         m_overwriteDialog.setFileInfo(srcPath, tgtPath);\r
497         if (m_overwriteDialog.exec() == QDialog::Rejected) {\r
498             worker->abort();\r
499         }\r
500     }\r
501     *copyMethod = m_overwriteDialog.copyMethod();\r
502     *alias = m_overwriteDialog.alias();\r
503 \r
504     worker->endAsking();\r
505 }\r
506 \r
507 ///////////////////////////////////////////////////////////////////////////////\r
508 /// \brief MainWindow::onAddBookmark\r
509 ///\r
510 /// ブックマークを追加します。\r
511 ///\r
512 void MainWindow::onAddBookmark()\r
513 {\r
514     qDebug() << "MainWindow::onAddBookmark()";\r
515     qDebug() << sender()->objectName();\r
516 \r
517     FolderModel *m;\r
518     if (sender()->objectName() == "bookmarkBtn") {\r
519         FolderPanel *p = static_cast<FolderPanel*>(sender()->parent());\r
520         m = p->model();\r
521     }\r
522     else {\r
523         m = activeModel();\r
524     }\r
525 \r
526     QFileInfo fi(m->rootPath());\r
527     Preferences(this).addBookmark(fi.fileName(), fi.absoluteFilePath());\r
528     initBookmarkMenu();\r
529 \r
530     activePanel()->folderPanel()->itemView()->setFocus();\r
531     statusBar()->showMessage(tr("%1をブックマークに追加しました").arg(fi.absoluteFilePath()));\r
532 }\r
533 \r
534 ///////////////////////////////////////////////////////////////////////////////\r
535 /// \brief MainWindow::view_copyAvailable\r
536 /// \param yes  コピー可能ならtrue\r
537 ///\r
538 /// 選択範囲の有無をメニューに反映します。\r
539 ///\r
540 void MainWindow::view_copyAvailable(bool yes)\r
541 {\r
542     ui->text_Copy->setEnabled(yes);\r
543 }\r
544 \r
545 ///////////////////////////////////////////////////////////////////////////////\r
546 /// \brief MainWindow::copyItems\r
547 /// \param list     コピー元リスト\r
548 /// \param tgtDir   コピー先フォルダ\r
549 ///\r
550 /// アイテムをコピーします。\r
551 ///\r
552 void MainWindow::copyItems(const QStringList &list, const QString &tgtDir)\r
553 {\r
554     qDebug() << "MainWindow::copyItems()" << tgtDir;\r
555 \r
556     Preferences prefs(this);\r
557     if (prefs.isConfirmCopy() &&\r
558         QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))\r
559             != QMessageBox::Yes)\r
560     {\r
561         return;\r
562     }\r
563 \r
564     // 上書き確認ダイアログを初期化する\r
565     m_overwriteDialog.reset();\r
566 \r
567     // ワーカースレッドを作成する\r
568     CopyMoveWorker *worker = new CopyMoveWorker();\r
569     connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
570             this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
571     worker->setCopyList(list);\r
572     worker->setTargetDir(tgtDir);\r
573     worker->setMoveMode(false);\r
574 \r
575     // 進捗ダイアログを表示して、処理を開始する\r
576     OperationDialog opDlg(this);\r
577     opDlg.setWindowTitle(tr("コピー"));\r
578     opDlg.setWorker(worker);\r
579     opDlg.setAutoClose(prefs.isAutoCloseCopy());\r
580 \r
581     opDlg.exec();\r
582 \r
583     prefs.setAutoCloseCopy(opDlg.autoClose());\r
584 }\r
585 \r
586 ///////////////////////////////////////////////////////////////////////////////\r
587 /// \brief MainWindow::moveItems\r
588 /// \param list     移動元リスト\r
589 /// \param tgtDir   移動先フォルダ\r
590 ///\r
591 /// アイテムを移動します。\r
592 ///\r
593 void MainWindow::moveItems(const QStringList &list, const QString &tgtDir)\r
594 {\r
595     qDebug() << "MainWindow::moveItems()" << tgtDir;\r
596 \r
597     Preferences prefs(this);\r
598     if (prefs.isConfirmMove() &&\r
599         QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))\r
600             != QMessageBox::Yes)\r
601     {\r
602         return;\r
603     }\r
604 \r
605     // 上書き確認ダイアログを初期化する\r
606     m_overwriteDialog.reset();\r
607 \r
608     // ワーカースレッドを作成する\r
609     CopyMoveWorker *worker = new CopyMoveWorker();\r
610     connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
611             this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
612     worker->setCopyList(list);\r
613     worker->setTargetDir(tgtDir);\r
614     worker->setMoveMode(true);\r
615 \r
616     // 進捗ダイアログを表示して、処理を開始する\r
617     OperationDialog opDlg(this);\r
618     opDlg.setWindowTitle(tr("移動"));\r
619     opDlg.setWorker(worker);\r
620     opDlg.setAutoClose(prefs.isAutoCloseMove());\r
621 \r
622     opDlg.exec();\r
623 \r
624     prefs.setAutoCloseMove(opDlg.autoClose());\r
625 }\r
626 \r
627 ///////////////////////////////////////////////////////////////////////////////\r
628 /// \brief MainWindow::onContextMenuEvent\r
629 /// \param obj  イベントが発生したオブジェクト\r
630 /// \param e    コンテキストメニューイベント\r
631 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。\r
632 ///\r
633 bool MainWindow::onContextMenuEvent(QObject *obj, QContextMenuEvent *e)\r
634 {\r
635     QMenu menu(this);\r
636     if (obj->objectName() == "textView") {\r
637         menu.addAction(ui->text_ConvertFromEUC);\r
638         menu.addAction(ui->text_ConvertFromJIS);\r
639         menu.addAction(ui->text_ConvertFromSJIS);\r
640         menu.addAction(ui->text_ConvertFromUTF8);\r
641         menu.addAction(ui->text_ConvertFromUTF16);\r
642         menu.addAction(ui->text_ConvertFromUTF16BE);\r
643         menu.addAction(ui->text_ConvertFromUTF16LE);\r
644         menu.addSeparator();\r
645         menu.addAction(ui->text_Copy);\r
646         if (m_viewMode == ModeView) {\r
647             menu.addSeparator();\r
648             menu.addAction(ui->view_Back);\r
649         }\r
650     }\r
651     else if (obj->objectName() == "imageView") {\r
652         menu.addAction(ui->image_FitToWindow);\r
653         menu.addAction(ui->action_ScaleDown);\r
654         menu.addAction(ui->action_ScaleUp);\r
655         menu.addAction(ui->image_ScaleNormal);\r
656         menu.addSeparator();\r
657         menu.addAction(ui->image_Rotate90);\r
658         menu.addAction(ui->image_Rotate180);\r
659 \r
660         if (m_viewMode == ModeView) {\r
661             menu.addSeparator();\r
662             menu.addAction(ui->view_Back);\r
663         }\r
664     }\r
665     else if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView") {\r
666         menu.addAction(ui->action_OpenWith);\r
667         menu.addAction(ui->action_OpenEditor);\r
668         menu.addAction(ui->action_OpenTerminal);\r
669         menu.addAction(ui->action_OpenArchiver);\r
670         menu.addSeparator();\r
671         menu.addAction(ui->action_Copy);\r
672         menu.addAction(ui->action_Move);\r
673         menu.addSeparator();\r
674         menu.addAction(ui->action_Delete);\r
675         menu.addSeparator();\r
676         menu.addAction(ui->action_CopyFileName);\r
677         menu.addAction(ui->action_CopyFilePath);\r
678         menu.addSeparator();\r
679         menu.addAction(ui->action_Rename);\r
680     }\r
681     else {\r
682         qDebug() << "No context menu" << obj->objectName();\r
683         return false;\r
684     }\r
685 \r
686     QAction *selected = menu.exec(e->globalPos());\r
687     if (selected == ui->action_ScaleDown || selected == ui->action_ScaleUp) {\r
688         ui->image_FitToWindow->blockSignals(true);\r
689         ui->image_FitToWindow->setChecked(false);\r
690         ui->image_FitToWindow->blockSignals(false);\r
691     }\r
692 \r
693     return true;\r
694 }\r
695 \r
696 ///////////////////////////////////////////////////////////////////////////////\r
697 /// \brief MainWindow::onKeyPressEvent\r
698 /// \param obj  イベントが発生したオブジェクト\r
699 /// \param e    キーイベントオブジェクト\r
700 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。\r
701 ///\r
702 bool MainWindow::onKeyPressEvent(QObject *obj, QKeyEvent *e)\r
703 {\r
704     qDebug() << "MainWindow::onKeyPressEvent()";\r
705 \r
706     QString modifier = QString::null;\r
707     if (e->modifiers() & Qt::ShiftModifier)     { modifier += "Shift+"; }\r
708     if (e->modifiers() & Qt::ControlModifier)   { modifier += "Ctrl+"; }\r
709     if (e->modifiers() & Qt::AltModifier)       { modifier += "Alt+"; }\r
710     if (e->modifiers() & Qt::MetaModifier)      { modifier += "Meta+"; }\r
711 \r
712     QString key = modifier + QKeySequence(e->key()).toString();\r
713 \r
714     foreach (QAction *action, findChildren<QAction*>()) {\r
715         if (action->isEnabled()) {\r
716             foreach (const QKeySequence &ks, action->shortcuts()) {\r
717                 if (ks.toString() == key) {\r
718                     qDebug() << "emit" << action->objectName();\r
719                     if (action->isCheckable()) {\r
720                         action->toggle();\r
721                     }\r
722                     else {\r
723                         action->trigger();\r
724                     }\r
725                     return true;\r
726                 }\r
727              }\r
728         }\r
729     }\r
730 \r
731     if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView")\r
732     {\r
733         // カーソル移動系のみ有効にする\r
734         switch (e->key()) {\r
735         case Qt::Key_Down:\r
736         case Qt::Key_Up:\r
737         case Qt::Key_Left:\r
738         case Qt::Key_Right:\r
739         case Qt::Key_Home:\r
740         case Qt::Key_End:\r
741         case Qt::Key_PageDown:\r
742         case Qt::Key_PageUp:\r
743         case Qt::Key_Tab:\r
744             return false;\r
745         }\r
746         return true;\r
747     }\r
748 \r
749     return false;\r
750 }\r
751 \r
752 ///////////////////////////////////////////////////////////////////////////////\r
753 /// \brief MainWindow::onCopy\r
754 ///\r
755 /// 選択アイテムを隣のパネルにコピーします。\r
756 ///\r
757 void MainWindow::onCopy()\r
758 {\r
759     qDebug() << "MainWindow::onCopy";\r
760 \r
761     QStringList list;\r
762     foreach (const QFileInfo &fi, selectedItems()) {\r
763         list << fi.absoluteFilePath();\r
764     }\r
765     if (list.isEmpty()) {\r
766         return;\r
767     }\r
768 \r
769     QString tgtPath = inactiveModel()->rootPath();\r
770     copyItems(list, tgtPath);\r
771 }\r
772 \r
773 ///////////////////////////////////////////////////////////////////////////////\r
774 /// \brief MainWindow::onCreateFile\r
775 ///\r
776 /// ファイルを作成します。\r
777 ///\r
778 void MainWindow::onCreateFile()\r
779 {\r
780     qDebug() << "MainWindow::onCreateFile";\r
781 \r
782     bool bOk;\r
783     QString name = QInputDialog::getText(\r
784                 this, tr("ファイルを作成"), tr("ファイル名:"),\r
785                 QLineEdit::Normal, "", &bOk);\r
786     if (!bOk || name.isEmpty()) {\r
787         return;\r
788     }\r
789 \r
790     QModelIndex index = activeModel()->touch(name);\r
791     if (!index.isValid()) {\r
792         QMessageBox::critical(\r
793                     this, tr("エラー"),\r
794                     tr("ファイルの作成に失敗しました。"));\r
795         return;\r
796     }\r
797 \r
798     focusItemView()->setCurrentIndex(index);\r
799     if (Preferences(this).isOpenAfterCreation()) {\r
800         onOpenEditor(index);\r
801     }\r
802 }\r
803 \r
804 ///////////////////////////////////////////////////////////////////////////////\r
805 /// \brief MainWindow::onCreateFolder\r
806 ///\r
807 /// フォルダを作成します。\r
808 ///\r
809 void MainWindow::onCreateFolder()\r
810 {\r
811     qDebug() << "MainWindow::onCreateFolder";\r
812 \r
813     bool bOk;\r
814     QString name = QInputDialog::getText(\r
815                 this, tr("フォルダを作成"), tr("フォルダ名:"),\r
816                 QLineEdit::Normal, "", &bOk);\r
817     if (!bOk || name.isEmpty()) {\r
818         return;\r
819     }\r
820 \r
821     QModelIndex index = activeModel()->mkdir(name);\r
822     if (!index.isValid()) {\r
823         QMessageBox::critical(\r
824                     this, tr("エラー"),\r
825                     tr("フォルダの作成に失敗しました。"));\r
826         return;\r
827     }\r
828 \r
829     focusItemView()->setCurrentIndex(index);\r
830     if (Preferences(this).isMoveAfterCreation()) {\r
831         onOpen(index);\r
832     }\r
833 }\r
834 \r
835 ///////////////////////////////////////////////////////////////////////////////\r
836 /// \brief MainWindow::onDelete\r
837 ///\r
838 /// 選択アイテムを削除します。\r
839 ///\r
840 void MainWindow::onDelete()\r
841 {\r
842     qDebug() << "MainWindow::onDelete";\r
843 \r
844     QFileInfoList list = selectedItems();\r
845     if (list.isEmpty()) {\r
846         return;\r
847     }\r
848 \r
849     Preferences prefs(this);\r
850     if (prefs.isConfirmDelete()) {\r
851         QString msg;\r
852         if (list.size() == 1) {\r
853             msg = list[0].fileName();\r
854         }\r
855         else {\r
856             msg = tr("%1個のアイテム").arg(list.size());\r
857         }\r
858         int ret = QMessageBox::question(\r
859                     this, tr("確認"),\r
860                     tr("%1を削除しますか?").arg(msg));\r
861         if (ret != QMessageBox::Yes) {\r
862             return;\r
863         }\r
864     }\r
865 \r
866     DeleteWorker *worker = new DeleteWorker();\r
867     worker->setDeleteList(list);\r
868 \r
869     OperationDialog opDlg(this);\r
870     opDlg.setWindowTitle(tr("削除"));\r
871     opDlg.setWorker(worker);\r
872     opDlg.setAutoClose(prefs.isAutoCloseDelete());\r
873 \r
874 //    int row = focusItemView()->currentIndex().row();\r
875 \r
876     opDlg.exec();\r
877 \r
878 //    if (row >= activeModel()->rowCount()) {\r
879 //        row = activeModel()->rowCount() - 1;\r
880 //    }\r
881 //    focusItemView()->setCurrentIndex(activeModel()->index(row, 1));\r
882 \r
883     prefs.setAutoCloseDelete(opDlg.autoClose());\r
884 }\r
885 \r
886 ///////////////////////////////////////////////////////////////////////////////\r
887 /// \brief MainWindow::onOpen\r
888 /// \param index    (使用しません)\r
889 ///\r
890 /// アイテムを開きます。\r
891 ///\r
892 void MainWindow::onOpen(const QModelIndex &index)\r
893 {\r
894     Q_UNUSED(index);\r
895     qDebug() << "MainWindow::onOpen()" << index;\r
896 \r
897     QModelIndex current = focusItemView()->currentIndex();\r
898     if (activeModel()->isDir(current)) {\r
899         activeModel()->setRootPath(activeModel()->filePath(current));\r
900         return;\r
901     }\r
902 \r
903     // 外部アプリを優先する場合\r
904     QString ext = activeModel()->fileInfo(current).suffix().toLower();\r
905     QStringList list = Preferences(this).getPreferExtensions().split(",", QString::SkipEmptyParts);\r
906     foreach (const QString& s, list) {\r
907         if (ext == s.trimmed().toLower()) {\r
908             QString path = QDir::toNativeSeparators(activeModel()->filePath(current));\r
909             QDesktopServices::openUrl(QUrl("file:///" + path));\r
910             return;\r
911         }\r
912     }\r
913 \r
914     // 内蔵ビューアで表示する\r
915     setViewMode(ModeView);\r
916 }\r
917 \r
918 ///////////////////////////////////////////////////////////////////////////////\r
919 /// \brief MainWindow::onOpenEditor\r
920 /// \param path\r
921 ///\r
922 /// 選択アイテムを外部エディタで開きます。\r
923 ///\r
924 void MainWindow::onOpenEditor(const QModelIndex &index)\r
925 {\r
926     qDebug() << "MainWindow::onOpenEditor";\r
927 \r
928     QString exe = Preferences(this).getEditorPath();\r
929     if (exe.isEmpty()) {\r
930         QMessageBox::critical(\r
931                     this, tr("エラー"),\r
932                     tr("外部エディタのパスが未定義です。"));\r
933         return;\r
934     }\r
935 \r
936     QFileInfoList list;\r
937     if (index.isValid()) {\r
938         list << activeModel()->fileInfo(index);\r
939     }\r
940     else {\r
941         list = selectedItems();\r
942     }\r
943 \r
944     QString files;\r
945     foreach (const QFileInfo &info, list) {\r
946         files += " " + QQ(info.absoluteFilePath());\r
947     }\r
948 #ifdef Q_OS_MAC\r
949     QString command = "open -a " + exe + files;\r
950 #else\r
951     QString command = exe + files;\r
952 #endif\r
953     if (!startProcess(command, tr("外部エディタの起動に失敗しました。"))) {\r
954         qDebug() << command;\r
955     }\r
956 }\r
957 \r
958 ///////////////////////////////////////////////////////////////////////////////\r
959 /// \brief MainWindow::onOpenTerminal\r
960 ///\r
961 /// 選択アイテムをターミナルで開きます。\r
962 ///\r
963 void MainWindow::onOpenTerminal()\r
964 {\r
965     qDebug() << "MainWindow::onOpenTerminal";\r
966 \r
967     QString exe = Preferences(this).getTerminalPath();\r
968     if (exe.isEmpty()) {\r
969         QMessageBox::critical(\r
970                     this, tr("エラー"),\r
971                     tr("ターミナルのパスが未定義です。"));\r
972         return;\r
973     }\r
974 \r
975     QSet<QString> dirs;\r
976     foreach (const QFileInfo &info, selectedItems()) {\r
977         if (info.isDir()) {\r
978             dirs.insert(info.absoluteFilePath());\r
979         }\r
980         else {\r
981             dirs.insert(info.absolutePath());\r
982         }\r
983     }\r
984 \r
985     foreach (const QString &dir, dirs) {\r
986 #ifdef Q_OS_MAC\r
987         QString command = "open -n -a " + exe + " " + QQ(dir);\r
988 #else\r
989         QString command = exe + " " + QQ(dir);\r
990 #endif\r
991         if (!startProcess(command, tr("ターミナルの起動に失敗しました。"))) {\r
992             qDebug() << command;\r
993             break;\r
994         }\r
995     }\r
996 }\r
997 \r
998 ///////////////////////////////////////////////////////////////////////////////\r
999 /// \brief MainWindow::onOpenArchiver\r
1000 ///\r
1001 /// 選択アイテムをアーカイバで開きます。\r
1002 ///\r
1003 void MainWindow::onOpenArchiver()\r
1004 {\r
1005     qDebug() << "MainWindow::onOpenArchiver";\r
1006 \r
1007     QString exe = Preferences(this).getArchiverPath();\r
1008     if (exe.isEmpty()) {\r
1009         QMessageBox::critical(\r
1010                     this, tr("エラー"),\r
1011                     tr("アーカイバのパスが未定義です。"));\r
1012         return;\r
1013     }\r
1014 \r
1015     QString files;\r
1016     foreach (const QFileInfo &info, selectedItems()) {\r
1017         files += " " + QQ(info.absoluteFilePath());\r
1018     }\r
1019 #ifdef Q_OS_MAC\r
1020     QString command = "open -a " + exe + files;\r
1021 #else\r
1022     QString command = exe + files;\r
1023 #endif\r
1024     if (!startProcess(command, tr("アーカイバの起動に失敗しました。"))) {\r
1025         qDebug() << command;\r
1026     }\r
1027 }\r
1028 \r
1029 ///////////////////////////////////////////////////////////////////////////////\r
1030 /// \brief MainWindow::onOpenBookmark\r
1031 ///\r
1032 /// ブックマークのメニュー項目をクリックしたときの処理を行います。\r
1033 ///\r
1034 void MainWindow::onOpenBookmark()\r
1035 {\r
1036     qDebug() << "MainWindow::onOpenBookmark()";\r
1037 \r
1038     QAction *action = qobject_cast<QAction*>(sender());\r
1039     Q_CHECK_PTR(action);\r
1040 \r
1041     int i = action->data().toInt();\r
1042     activeModel()->setRootPath(Preferences(this).getBookmarkPath(i));\r
1043 }\r
1044 \r
1045 ///////////////////////////////////////////////////////////////////////////////\r
1046 /// \brief MainWindow::onRename\r
1047 ///\r
1048 /// 選択アイテムの名前を変更します。\r
1049 ///\r
1050 void MainWindow::onRename()\r
1051 {\r
1052     qDebug() << "MainWindow::onRename";\r
1053 \r
1054     QFileInfoList list = selectedItems();\r
1055     if (list.isEmpty()) {\r
1056         return;\r
1057     }\r
1058 \r
1059     AbstractRenameDialog *dlg;\r
1060     if (list.size() == 1) {\r
1061         dlg = new RenameSingleDialog(this);\r
1062     }\r
1063     else {\r
1064         dlg = new RenameMultiDialog(this);\r
1065     }\r
1066     dlg->setWorkingDirectory(activeModel()->rootPath());\r
1067     dlg->setNames(list);\r
1068     int dlgResult = dlg->exec();\r
1069     if (dlgResult != QDialog::Accepted || dlg->renameMap().isEmpty()) {\r
1070         return;\r
1071     }\r
1072 \r
1073     Preferences prefs(this);\r
1074     if (prefs.isConfirmRename() &&\r
1075         QMessageBox::question(this, tr("確認"), tr("名前の変更を実行しますか?"))\r
1076             != QMessageBox::Yes)\r
1077     {\r
1078         return;\r
1079     }\r
1080 \r
1081     RenameWorker *worker = new RenameWorker();\r
1082     worker->setRenameMap(&dlg->renameMap());\r
1083 \r
1084     OperationDialog opDlg(this);\r
1085     opDlg.setWindowTitle(tr("名前を変更"));\r
1086     opDlg.setWorker(worker);\r
1087     opDlg.setAutoClose(prefs.isAutoCloseRename());\r
1088 \r
1089     opDlg.exec();\r
1090 \r
1091     QFileInfo fi(dlg->renameMap().first());\r
1092     focusItemView()->setCurrentIndex(activeModel()->search(fi.fileName()));\r
1093 \r
1094     prefs.setAutoCloseRename(opDlg.autoClose());\r
1095 }\r
1096 \r
1097 ///////////////////////////////////////////////////////////////////////////////\r
1098 /// \brief MainWindow::onOpenWith\r
1099 ///\r
1100 /// 関連付けられたアプリで開きます。\r
1101 ///\r
1102 void MainWindow::onOpenWith()\r
1103 {\r
1104     qDebug() << "MainWindow::onOpenWith";\r
1105 \r
1106     foreach (const QFileInfo &info, selectedItems()) {\r
1107         QString path = QDir::toNativeSeparators(info.absoluteFilePath());\r
1108         QDesktopServices::openUrl(QUrl("file:///" + path));\r
1109     }\r
1110 }\r
1111 \r
1112 ///////////////////////////////////////////////////////////////////////////////\r
1113 /// \brief MainWindow::showBookmarkDialog\r
1114 ///\r
1115 /// ブックマーク一覧ダイアログを表示します。\r
1116 ///\r
1117 void MainWindow::showBookmarkDialog()\r
1118 {\r
1119     qDebug() << "MainWindow::showBookmarkDialog()";\r
1120 \r
1121     BookmarkDialog dlg(this);\r
1122     dlg.setEditMode(false);\r
1123     if (dlg.exec() == QDialog::Accepted) {\r
1124         int n = dlg.selectedIndex();\r
1125         activeModel()->setRootPath(Preferences(this).getBookmarkPath(n + 1));\r
1126     }\r
1127 }\r
1128 \r
1129 ///////////////////////////////////////////////////////////////////////////////\r
1130 /// \brief MainWindow::onEditBookmark\r
1131 ///\r
1132 /// ブックマークの編集ダイアログを表示します。\r
1133 ///\r
1134 void MainWindow::onEditBookmark()\r
1135 {\r
1136     qDebug() << "MainWindow::onEditBookmark()";\r
1137 \r
1138     BookmarkDialog dlg(this);\r
1139     dlg.setEditMode(true);\r
1140 \r
1141     if (dlg.exec() == QDialog::Accepted) {\r
1142         initBookmarkMenu();\r
1143     }\r
1144 }\r
1145 \r
1146 ///////////////////////////////////////////////////////////////////////////////\r
1147 /// \brief MainWindow::showFilterDialog\r
1148 ///\r
1149 /// フィルタ設定ダイアログを表示します。\r
1150 ///\r
1151 void MainWindow::showFilterDialog()\r
1152 {\r
1153     qDebug() << "MainWindow::showFilterDialog()";\r
1154 \r
1155     QString filters = activeModel()->nameFilters().join(" ");\r
1156 \r
1157     QInputDialog dlg(this);\r
1158     dlg.setInputMode(QInputDialog::TextInput);\r
1159     dlg.setWindowTitle(tr("フィルタを設定"));\r
1160     dlg.setLabelText(tr("フィルタ:"));\r
1161     dlg.setTextValue(filters);\r
1162     dlg.resize(width() * 0.8, dlg.height());\r
1163 \r
1164     if (dlg.exec() == QDialog::Accepted) {\r
1165         filters = dlg.textValue();\r
1166         if (filters.isEmpty()) {\r
1167             filters = "*";\r
1168         }\r
1169 \r
1170         activeModel()->setNameFilters(filters.split(" ", QString::SkipEmptyParts));\r
1171         activeModel()->refresh();\r
1172     }\r
1173 }\r
1174 \r
1175 ///////////////////////////////////////////////////////////////////////////////\r
1176 /// \brief MainWindow::showHistoryDialog\r
1177 ///\r
1178 /// 履歴選択ダイアログを表示します。\r
1179 ///\r
1180 void MainWindow::showHistoryDialog()\r
1181 {\r
1182     qDebug() << "MainWindow::showHistoryDialog()";\r
1183 \r
1184     HistoryDialog dlg(this);\r
1185     dlg.setModel(ui->LPanel->model(), ui->RPanel->model(), activeModel());\r
1186     dlg.exec();\r
1187 }\r
1188 \r
1189 ///////////////////////////////////////////////////////////////////////////////\r
1190 /// \brief MainWindow::showSortDialog\r
1191 ///\r
1192 /// ソート方法選択ダイアログを表示します。\r
1193 ///\r
1194 void MainWindow::showSortDialog()\r
1195 {\r
1196     qDebug() << "MainWindow::showSortDialog()";\r
1197 \r
1198     SortDialog dlg(this);\r
1199     dlg.setModel(activeModel());\r
1200     dlg.exec();\r
1201 }\r
1202 \r
1203 ///////////////////////////////////////////////////////////////////////////////\r
1204 /// \brief MainWindow::onSplitCenter\r
1205 ///\r
1206 /// パネルを中央で分割します。\r
1207 ///\r
1208 void MainWindow::onSplitCenter()\r
1209 {\r
1210     qDebug() << "MainWindow::onSplitCenter()";\r
1211 \r
1212     QList<int> sizes = ui->splitter->sizes();\r
1213     int sizeTotal = sizes[0] + sizes[1];\r
1214     sizes[0] = sizeTotal / 2;\r
1215     sizes[1] = sizeTotal - sizes[0];\r
1216     ui->splitter->setSizes(sizes);\r
1217 }\r
1218 \r
1219 ///////////////////////////////////////////////////////////////////////////////\r
1220 /// \brief MainWindow::onSwap\r
1221 ///\r
1222 /// 左右のパネルでモデルを入れ替えます。\r
1223 ///\r
1224 void MainWindow::onSwap()\r
1225 {\r
1226     qDebug() << "MainWindow::onSwap()";\r
1227 \r
1228     FolderModel *tmp = ui->LPanel->model();\r
1229     ui->LPanel->setModel(ui->RPanel->model());\r
1230     ui->RPanel->setModel(tmp);\r
1231 \r
1232     // アクティブ状態も変更する\r
1233     if (ui->LPanel->model()->isActive()) {\r
1234         setActiveModel(ui->RPanel->model());\r
1235     }\r
1236     else {\r
1237         setActiveModel(ui->LPanel->model());\r
1238     }\r
1239 }\r
1240 \r
1241 ///////////////////////////////////////////////////////////////////////////////\r
1242 /// \brief MainWindow::onTogglePreviewMode\r
1243 /// \param checked  メニューのチェック状態\r
1244 ///\r
1245 /// 通常モード/プレビューモードを切り替えます。\r
1246 ///\r
1247 void MainWindow::onTogglePreviewMode(bool checked)\r
1248 {\r
1249     qDebug() << "MainWindow::onTogglePreviewMode()" << checked;\r
1250 \r
1251     if (checked) {\r
1252         setViewMode(ModePreview);\r
1253     }\r
1254     else {\r
1255         setViewMode(ModeBasic);\r
1256     }\r
1257 }\r
1258 \r
1259 ///////////////////////////////////////////////////////////////////////////////\r
1260 /// \brief MainWindow::onSearchNext\r
1261 ///\r
1262 /// 次のアイテムを検索します。\r
1263 ///\r
1264 void MainWindow::onSearchNext()\r
1265 {\r
1266     qDebug() << "MainWindow::onSearchNext";\r
1267 \r
1268     static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext();\r
1269 }\r
1270 \r
1271 ///////////////////////////////////////////////////////////////////////////////\r
1272 /// \brief MainWindow::onSearchPrev\r
1273 ///\r
1274 /// 前のアイテムを検索します。\r
1275 ///\r
1276 void MainWindow::onSearchPrev()\r
1277 {\r
1278     qDebug() << "MainWindow::onSearchPrev";\r
1279 \r
1280     static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext(-1);\r
1281 }\r
1282 \r
1283 ///////////////////////////////////////////////////////////////////////////////\r
1284 /// \brief MainWindow::onKeyDown\r
1285 ///\r
1286 /// フォーカスウィジェットに↓キーイベントを送信します。\r
1287 ///\r
1288 void MainWindow::onKeyDown()\r
1289 {\r
1290     qDebug() << "MainWindow::onKeyDown()";\r
1291 \r
1292     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);\r
1293     qApp->sendEvent(qApp->focusWidget(), &event);\r
1294 }\r
1295 \r
1296 ///////////////////////////////////////////////////////////////////////////////\r
1297 /// \brief MainWindow::onKeyEnd\r
1298 ///\r
1299 /// フォーカスウィジェットにEND, Ctrl+ENDキーイベントを送信します。\r
1300 ///\r
1301 void MainWindow::onKeyEnd()\r
1302 {\r
1303     qDebug() << "MainWindow::onKeyEnd()";\r
1304 \r
1305     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);\r
1306     qApp->sendEvent(qApp->focusWidget(), &event1);\r
1307 \r
1308     QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);\r
1309     qApp->sendEvent(qApp->focusWidget(), &event2);\r
1310 }\r
1311 \r
1312 ///////////////////////////////////////////////////////////////////////////////\r
1313 /// \brief MainWindow::onKeyHome\r
1314 ///\r
1315 /// フォーカスウィジェットにHOME, Ctrl+HOMEキーイベントを送信します。\r
1316 ///\r
1317 void MainWindow::onKeyHome()\r
1318 {\r
1319     qDebug() << "MainWindow::onKeyHome()";\r
1320 \r
1321     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);\r
1322     qApp->sendEvent(qApp->focusWidget(), &event1);\r
1323 \r
1324     QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);\r
1325     qApp->sendEvent(qApp->focusWidget(), &event2);\r
1326 }\r
1327 \r
1328 ///////////////////////////////////////////////////////////////////////////////\r
1329 /// \brief MainWindow::onKeyUp\r
1330 ///\r
1331 /// フォーカスウィジェットに↑キーイベントを送信します。\r
1332 ///\r
1333 void MainWindow::onKeyUp()\r
1334 {\r
1335     qDebug() << "MainWindow::onKeyUp()";\r
1336 \r
1337     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);\r
1338     qApp->sendEvent(qApp->focusWidget(), &event);\r
1339 }\r
1340 \r
1341 ///////////////////////////////////////////////////////////////////////////////\r
1342 /// \brief MainWindow::onKeyHomeOther\r
1343 ///\r
1344 /// 非フォーカスビューにHOME, Ctrl+HOMEキーイベントを送信します。\r
1345 ///\r
1346 void MainWindow::onKeyHomeOther()\r
1347 {\r
1348     qDebug() << "MainWindow::onKeyHomeOther()";\r
1349 \r
1350     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);\r
1351     sendEventOther(&event1);\r
1352 \r
1353     QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);\r
1354     sendEventOther(&event2);\r
1355 }\r
1356 \r
1357 ///////////////////////////////////////////////////////////////////////////////\r
1358 /// \brief MainWindow::onKeyDownOther\r
1359 ///\r
1360 /// 非フォーカスビューに↓キーイベントを送信します。\r
1361 ///\r
1362 void MainWindow::onKeyDownOther()\r
1363 {\r
1364     qDebug() << "MainWindow::onKeyDownOther()";\r
1365 \r
1366     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);\r
1367     sendEventOther(&event);\r
1368 }\r
1369 \r
1370 ///////////////////////////////////////////////////////////////////////////////\r
1371 /// \brief MainWindow::onKeyUpOther\r
1372 ///\r
1373 /// 非フォーカスビューに↑キーイベントを送信します。\r
1374 ///\r
1375 void MainWindow::onKeyUpOther()\r
1376 {\r
1377     qDebug() << "MainWindow::onKeyUpOther()";\r
1378 \r
1379     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);\r
1380     sendEventOther(&event);\r
1381 }\r
1382 \r
1383 ///////////////////////////////////////////////////////////////////////////////\r
1384 /// \brief MainWindow::onKeyEndOther\r
1385 ///\r
1386 /// 非フォーカスビューにEND, Ctrl+ENDキーイベントを送信します。\r
1387 ///\r
1388 void MainWindow::onKeyEndOther()\r
1389 {\r
1390     qDebug() << "MainWindow::onKeyEndOther()";\r
1391 \r
1392     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);\r
1393     sendEventOther(&event1);\r
1394 \r
1395     QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);\r
1396     sendEventOther(&event2);\r
1397 }\r
1398 \r
1399 ///////////////////////////////////////////////////////////////////////////////\r
1400 /// \brief MainWindow::onScaleDown\r
1401 ///\r
1402 /// 表示を縮小します。\r
1403 ///\r
1404 void MainWindow::onScaleDown()\r
1405 {\r
1406     qDebug() << "MainWindow::onScaleDown()";\r
1407 \r
1408     AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());\r
1409     if (view) {\r
1410         view->scaleDown();\r
1411     }\r
1412 \r
1413     Preferences prefs(this);\r
1414     if (ui->LPanel->isVisible()) {\r
1415         ui->LPanel->updateAppearance(prefs);\r
1416         ui->LPanel->model()->updateAppearance(prefs);\r
1417     }\r
1418     if (ui->RPanel->isVisible()) {\r
1419         ui->RPanel->updateAppearance(prefs);\r
1420         ui->RPanel->model()->updateAppearance(prefs);\r
1421     }\r
1422     if (ui->FPanel->isVisible()) {\r
1423         ui->FPanel->updateAppearance(prefs);\r
1424         ui->FPanel->model()->updateAppearance(prefs);\r
1425     }\r
1426 }\r
1427 \r
1428 ///////////////////////////////////////////////////////////////////////////////\r
1429 /// \brief MainWindow::onScaleUp\r
1430 ///\r
1431 /// 表示を拡大します。\r
1432 ///\r
1433 void MainWindow::onScaleUp()\r
1434 {\r
1435     qDebug() << "MainWindow::onScaleUp()";\r
1436 \r
1437     AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());\r
1438     if (view) {\r
1439         view->scaleUp();\r
1440     }\r
1441 \r
1442     Preferences prefs(this);\r
1443     if (ui->LPanel->isVisible()) {\r
1444         ui->LPanel->updateAppearance(prefs);\r
1445         ui->LPanel->model()->updateAppearance(prefs);\r
1446     }\r
1447     if (ui->RPanel->isVisible()) {\r
1448         ui->RPanel->updateAppearance(prefs);\r
1449         ui->RPanel->model()->updateAppearance(prefs);\r
1450     }\r
1451     if (ui->FPanel->isVisible()) {\r
1452         ui->FPanel->updateAppearance(prefs);\r
1453         ui->FPanel->model()->updateAppearance(prefs);\r
1454     }\r
1455 }\r
1456 \r
1457 ///////////////////////////////////////////////////////////////////////////////\r
1458 /// \brief MainWindow::initBookmarkMenu\r
1459 ///\r
1460 /// ブックマークメニューを初期化します。\r
1461 ///\r
1462 void MainWindow::initBookmarkMenu()\r
1463 {\r
1464     qDebug() << "MainWindow::initBookmarkMenu()";\r
1465 \r
1466     Preferences prefs(this);\r
1467     QFileIconProvider iconProvider;\r
1468 \r
1469     ui->menu_Bookmark->clear();\r
1470     ui->menu_Bookmark->addAction(ui->action_AddBookmark);\r
1471     ui->menu_Bookmark->addAction(ui->action_EditBookmark);\r
1472     ui->menu_Bookmark->addSeparator();\r
1473     for (int n = 1; ; n++) {\r
1474         QString name = prefs.getBookmarkEntry(n);\r
1475         if (name.isEmpty()) {\r
1476             break;\r
1477         }\r
1478         QString path = prefs.getBookmarkPath(n);\r
1479 \r
1480         QAction *action = ui->menu_Bookmark->addAction(\r
1481                     iconProvider.icon(QFileInfo(path)), name, this,\r
1482                     SLOT(onOpenBookmark()));\r
1483         action->setData(n);\r
1484     }\r
1485 \r
1486     m_actions = findChildren<QAction*>();\r
1487 }\r
1488 \r
1489 ///////////////////////////////////////////////////////////////////////////////\r
1490 /// \brief MainWindow::sendEventOther\r
1491 /// \param event    送信するイベント\r
1492 ///\r
1493 /// 非フォーカスのビューにイベントを送信します。\r
1494 ///\r
1495 void MainWindow::sendEventOther(QEvent *event)\r
1496 {\r
1497     qDebug() << "MainWindow::sendEventOther()";\r
1498 \r
1499     // フォーカスを持たない、可視状態のビューを検索する\r
1500     foreach (QWidget *w, findChildren<QWidget*>()) {\r
1501         AbstractView *view = dynamic_cast<AbstractView*>(w);\r
1502         if (view) {\r
1503             if (w->isVisible() && !w->hasFocus()) {\r
1504                 qDebug() << "Send event to" << w->objectName();\r
1505                 qApp->sendEvent(w, event);\r
1506             }\r
1507         }\r
1508     }\r
1509 }\r
1510 \r
1511 ///////////////////////////////////////////////////////////////////////////////\r
1512 /// \brief MainWindow::onSyncPanel\r
1513 ///\r
1514 /// 隣のパネルと同じフォルダを表示します。\r
1515 ///\r
1516 void MainWindow::onSyncPanel()\r
1517 {\r
1518     qDebug() << "MainWindow::onSyncPanel()";\r
1519 \r
1520     activeModel()->setRootPath(inactiveModel()->rootPath());\r
1521 }\r
1522 \r
1523 ///////////////////////////////////////////////////////////////////////////////\r
1524 /// \brief MainWindow::onSyncPanelTo\r
1525 ///\r
1526 /// 隣のパネルに同じフォルダを表示します。\r
1527 ///\r
1528 void MainWindow::onSyncPanelTo()\r
1529 {\r
1530     qDebug() << "MainWindow::onSyncPanelTo()";\r
1531 \r
1532     inactiveModel()->setRootPath(activeModel()->rootPath());\r
1533 }\r
1534 \r
1535 ///////////////////////////////////////////////////////////////////////////////\r
1536 /// \brief MainWindow::onToggleFullMode\r
1537 /// \param checked  メニューのチェック状態\r
1538 ///\r
1539 /// 単画面/二画面を切り替えます。\r
1540 ///\r
1541 void MainWindow::onToggleFullMode(bool checked)\r
1542 {\r
1543     qDebug() << "MainWindow::onToggleFullMode()" << checked;\r
1544 \r
1545     if (checked) {\r
1546         setViewMode(ModeFull);\r
1547     }\r
1548     else {\r
1549         setViewMode(ModeBasic);\r
1550     }\r
1551 }\r
1552 \r
1553 \r
1554 ///////////////////////////////////////////////////////////////////////////////\r
1555 /// \brief MainWindow::onToggleSearch\r
1556 /// \param checked  メニューのチェック状態\r
1557 ///\r
1558 /// 検索ボックスの表示/非表示を切り替えます。\r
1559 ///\r
1560 void MainWindow::onToggleSearch(bool checked)\r
1561 {\r
1562     qDebug() << "MainWindow::onToggleSearch" << checked;\r
1563 \r
1564     // 丸投げ\r
1565     ui->LPanel->folderPanel()->toggleSearch(checked);\r
1566     ui->RPanel->folderPanel()->toggleSearch(checked);\r
1567     ui->FPanel->folderPanel()->toggleSearch(checked);\r
1568 }\r
1569 \r
1570 ///////////////////////////////////////////////////////////////////////////////\r
1571 /// \brief MainWindow::showPreferenceDialog\r
1572 ///\r
1573 /// 環境設定ダイアログを表示します。\r
1574 ///\r
1575 void MainWindow::showPreferenceDialog()\r
1576 {\r
1577     qDebug() << "MainWindow::showPreferenceDialog";\r
1578 \r
1579     PreferenceDialog dlg(this);\r
1580     if (dlg.exec() == QDialog::Accepted) {\r
1581         Preferences prefs(this);\r
1582         if (ui->LPanel->isVisible()) {\r
1583             ui->LPanel->updateAppearance(prefs);\r
1584             ui->LPanel->model()->updateAppearance(prefs);\r
1585         }\r
1586         if (ui->RPanel->isVisible()) {\r
1587             ui->RPanel->updateAppearance(prefs);\r
1588             ui->RPanel->model()->updateAppearance(prefs);\r
1589         }\r
1590         if (ui->FPanel->isVisible()) {\r
1591             ui->FPanel->updateAppearance(prefs);\r
1592             ui->FPanel->model()->updateAppearance(prefs);\r
1593         }\r
1594     }\r
1595 }\r
1596 \r
1597 ///////////////////////////////////////////////////////////////////////////////\r
1598 /// \brief MainWindow::onToggleHidden\r
1599 /// \param checked  メニューのチェック状態\r
1600 ///\r
1601 /// 隠しファイルの表示/非表示を切り替えます。\r
1602 ///\r
1603 void MainWindow::onToggleHidden(bool checked)\r
1604 {\r
1605     qDebug() << "MainWindow::onToggleHidden" << checked;\r
1606 \r
1607     if (checked) {\r
1608         activeModel()->setFilter(activeModel()->filter() | QDir::Hidden);\r
1609     }\r
1610     else {\r
1611         activeModel()->setFilter(activeModel()->filter() ^ QDir::Hidden);\r
1612     }\r
1613 \r
1614     activeModel()->refresh();\r
1615 }\r
1616 \r
1617 ///////////////////////////////////////////////////////////////////////////////\r
1618 /// \brief MainWindow::onToggleSystem\r
1619 /// \param checked  メニューのチェック状態\r
1620 ///\r
1621 /// システムファイルの表示/非表示を切り替えます。\r
1622 ///\r
1623 void MainWindow::onToggleSystem(bool checked)\r
1624 {\r
1625     qDebug() << "MainWindow::onToggleSystem" << checked;\r
1626 \r
1627     if (checked) {\r
1628         activeModel()->setFilter(activeModel()->filter() | QDir::System);\r
1629     }\r
1630     else {\r
1631         activeModel()->setFilter(activeModel()->filter() ^ QDir::System);\r
1632     }\r
1633 \r
1634     activeModel()->refresh();\r
1635 }\r
1636 \r
1637 ///////////////////////////////////////////////////////////////////////////////\r
1638 /// \brief MainWindow::onToggleThumbnailMode\r
1639 /// \param checked  メニューのチェック状態\r
1640 ///\r
1641 /// サムネイルモードの切り替えを行います。\r
1642 ///\r
1643 void MainWindow::onToggleThumbnailMode(bool checked)\r
1644 {\r
1645     qDebug() << "MainWindow::onToggleThumbnailMode()" << checked;\r
1646 \r
1647     activePanel()->folderPanel()->toggleView(checked);\r
1648 }\r
1649 \r
1650 ///////////////////////////////////////////////////////////////////////////////\r
1651 /// \brief MainWindow::onToggleToolbar\r
1652 /// \param checked メニューのチェック状態\r
1653 ///\r
1654 /// ツールバーの表示/非表示を切り替えます。\r
1655 ///\r
1656 void MainWindow::onToggleToolbar(bool checked)\r
1657 {\r
1658     ui->mainToolBar->setVisible(checked);\r
1659 }\r
1660 \r
1661 ///////////////////////////////////////////////////////////////////////////////\r
1662 /// \brief MainWindow::onCheckUpdate\r
1663 /// \param silent   最新版を使用している場合に何も表示しないならtrue\r
1664 ///\r
1665 /// アップデートの有無を確認します。\r
1666 ///\r
1667 void MainWindow::onCheckUpdate(bool silent)\r
1668 {\r
1669     qDebug() << "MainWindow::onCheckUpdate()" << silent;\r
1670 \r
1671     QNetworkAccessManager *manager = new QNetworkAccessManager(this);\r
1672 \r
1673     if (silent) {\r
1674         connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));\r
1675     }\r
1676     else {\r
1677         connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinished(QNetworkReply*)));\r
1678     }\r
1679 #ifdef Q_OS_WIN\r
1680     manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_win.html")));\r
1681 #elif defined(Q_OS_MAC)\r
1682     manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_mac.html")));\r
1683 #endif\r
1684 }\r
1685 \r
1686 void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)\r
1687 {\r
1688     qDebug() << "MainWindow::checkUpdateFinishedSilent";\r
1689 \r
1690     checkUpdateFinished(reply, true);\r
1691 }\r
1692 \r
1693 void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)\r
1694 {\r
1695     qDebug() << "MainWindow::checkUpdateFinished" << silent;\r
1696 \r
1697     if (reply->error() == QNetworkReply::NoError) {\r
1698         QString str = reply->readAll();\r
1699         str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);\r
1700         QRegExp rx("Gefu([0-9]+)");\r
1701         rx.indexIn(str);\r
1702         QString version = rx.cap(1);\r
1703         if (version.toInt() > VERSION_VALUE * 100) {\r
1704             QMessageBox::information(\r
1705                         this, tr("情報"),\r
1706                         tr("最新のバージョンが存在します。<br/>") +\r
1707                         tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));\r
1708         }\r
1709         else if (!silent) {\r
1710             QMessageBox::information(\r
1711                         this, tr("情報"),\r
1712                         tr("お使いのバージョンは最新です。"));\r
1713         }\r
1714     }\r
1715     else if (!silent){\r
1716         QMessageBox::critical(\r
1717                     this, tr("エラー"),\r
1718                     tr("最新バージョンのチェックに失敗しました。<br/>") +\r
1719                     reply->errorString());\r
1720     }\r
1721 }\r
1722 \r
1723 ///////////////////////////////////////////////////////////////////////////////\r
1724 /// \brief MainWindow::initActions\r
1725 ///\r
1726 /// アクションを初期化します。\r
1727 ///\r
1728 void MainWindow::initActions()\r
1729 {\r
1730     qDebug() << "MainWindow::initActions()";\r
1731 \r
1732     QList<QKeySequence> shortcuts;\r
1733 \r
1734     //>>>>> 追加のショートカットキーを設定する\r
1735     appendActionShortcut(ui->action_Open, "M");\r
1736     appendActionShortcut(ui->action_OpenWith, "Shift+M");\r
1737     appendActionShortcut(ui->view_Back, "Backspace");\r
1738     // MacだとShift+の形で認識されてしまうもの\r
1739     appendActionShortcut(ui->action_ScaleUp, "Shift++");\r
1740     appendActionShortcut(ui->action_Filter, "Shift+*");\r
1741     appendActionShortcut(ui->action_OpenTerminal, "Shift+>");\r
1742     appendActionShortcut(ui->action_About, "Shift+?");\r
1743     appendActionShortcut(ui->image_ScaleNormal, "Shift+=");\r
1744 \r
1745     // SIGNAL -> SLOT\r
1746     connect(ui->action_About, SIGNAL(triggered()), this, SLOT(onAbout()));\r
1747     connect(ui->action_AddBookmark, SIGNAL(triggered()), this, SLOT(onAddBookmark()));\r
1748     connect(ui->action_Cd, SIGNAL(triggered()), this, SLOT(onChooseFolder()));\r
1749     connect(ui->action_CheckUpdate, SIGNAL(triggered()), this, SLOT(onCheckUpdate()));\r
1750     connect(ui->action_Copy, SIGNAL(triggered()), this, SLOT(onCopy()));\r
1751     connect(ui->action_CopyFileName, SIGNAL(triggered()), this, SLOT(onCopyFileName()));\r
1752     connect(ui->action_CopyFilePath, SIGNAL(triggered()), this, SLOT(onCopyFilePath()));\r
1753     connect(ui->action_CreateFile, SIGNAL(triggered()), this, SLOT(onCreateFile()));\r
1754     connect(ui->action_CreateFolder, SIGNAL(triggered()), this, SLOT(onCreateFolder()));\r
1755     connect(ui->action_Delete, SIGNAL(triggered()), this, SLOT(onDelete()));\r
1756     connect(ui->action_EditBookmark, SIGNAL(triggered()), this, SLOT(onEditBookmark()));\r
1757     connect(ui->action_ExpandLeft, SIGNAL(triggered()), this, SLOT(onExpandLeft()));\r
1758     connect(ui->action_ExpandRight, SIGNAL(triggered()), this, SLOT(onExpandRight()));\r
1759     connect(ui->action_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));\r
1760     connect(ui->action_History, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));\r
1761     connect(ui->action_KeyDown, SIGNAL(triggered()), this, SLOT(onKeyDown()));\r
1762     connect(ui->action_KeyDownOther, SIGNAL(triggered()), this, SLOT(onKeyDownOther()));\r
1763     connect(ui->action_KeyEnd, SIGNAL(triggered()), this, SLOT(onKeyEnd()));\r
1764     connect(ui->action_KeyEndOther, SIGNAL(triggered()), this, SLOT(onKeyEndOther()));\r
1765     connect(ui->action_KeyHome, SIGNAL(triggered()), this, SLOT(onKeyHome()));\r
1766     connect(ui->action_KeyHomeOther, SIGNAL(triggered()), this, SLOT(onKeyHomeOther()));\r
1767     connect(ui->action_KeyLeft, SIGNAL(triggered()), this, SLOT(onKeyLeft()));\r
1768     connect(ui->action_KeyUp, SIGNAL(triggered()), this, SLOT(onKeyUp()));\r
1769     connect(ui->action_KeyUpOther, SIGNAL(triggered()), this, SLOT(onKeyUpOther()));\r
1770     connect(ui->action_Move, SIGNAL(triggered()), this, SLOT(onMove()));\r
1771     connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(onOpen()));\r
1772     connect(ui->action_OpenArchiver, SIGNAL(triggered()), this, SLOT(onOpenArchiver()));\r
1773     connect(ui->action_OpenEditor, SIGNAL(triggered()), this, SLOT(onOpenEditor()));\r
1774     connect(ui->action_OpenTerminal, SIGNAL(triggered()), this, SLOT(onOpenTerminal()));\r
1775     connect(ui->action_OpenWith, SIGNAL(triggered()), this, SLOT(onOpenWith()));\r
1776     connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));\r
1777     connect(ui->action_Rename, SIGNAL(triggered()), this, SLOT(onRename()));\r
1778     connect(ui->action_KeyRight, SIGNAL(triggered()), this, SLOT(onKeyRight()));\r
1779     connect(ui->action_RunCommand, SIGNAL(triggered()), this, SLOT(onRunCommand()));\r
1780     connect(ui->action_ScaleDown, SIGNAL(triggered()), this, SLOT(onScaleDown()));\r
1781     connect(ui->action_ScaleUp, SIGNAL(triggered()), this, SLOT(onScaleUp()));\r
1782     connect(ui->action_SearchNext, SIGNAL(triggered()), this, SLOT(onSearchNext()));\r
1783     connect(ui->action_SearchPrev, SIGNAL(triggered()), this, SLOT(onSearchPrev()));\r
1784     connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));\r
1785     connect(ui->action_ShowBookmark, SIGNAL(triggered()), this, SLOT(showBookmarkDialog()));\r
1786     connect(ui->action_Sort, SIGNAL(triggered()), this, SLOT(showSortDialog()));\r
1787     connect(ui->action_SplitCenter, SIGNAL(triggered()), this, SLOT(onSplitCenter()));\r
1788     connect(ui->action_Swap, SIGNAL(triggered()), this, SLOT(onSwap()));\r
1789     connect(ui->action_SyncPanel, SIGNAL(triggered()), this, SLOT(onSyncPanel()));\r
1790     connect(ui->action_SyncPanelTo, SIGNAL(triggered()), this, SLOT(onSyncPanelTo()));\r
1791 \r
1792     connect(ui->toggle_FullMode, SIGNAL(toggled(bool)), this, SLOT(onToggleFullMode(bool)));\r
1793     connect(ui->toggle_Hidden, SIGNAL(toggled(bool)), this, SLOT(onToggleHidden(bool)));\r
1794     connect(ui->toggle_Mark, SIGNAL(triggered()), this, SLOT(onToggleMark()));\r
1795     connect(ui->toggle_PreviewMode, SIGNAL(toggled(bool)), this, SLOT(onTogglePreviewMode(bool)));\r
1796     connect(ui->toggle_Search, SIGNAL(toggled(bool)), this, SLOT(onToggleSearch(bool)));\r
1797     connect(ui->toggle_System, SIGNAL(toggled(bool)), this, SLOT(onToggleSystem(bool)));\r
1798     connect(ui->toggle_ThumbnailMode, SIGNAL(toggled(bool)), this, SLOT(onToggleThumbnailMode(bool)));\r
1799     connect(ui->toggle_Toolbar, SIGNAL(toggled(bool)), this, SLOT(onToggleToolbar(bool)));\r
1800 \r
1801     connect(ui->view_Back, SIGNAL(triggered()), this, SLOT(view_finished()));\r
1802 \r
1803 }\r
1804 \r
1805 ///////////////////////////////////////////////////////////////////////////////\r
1806 /// \brief MainWindow::setActiveModel\r
1807 /// \param m    新しいアクティブモデル\r
1808 ///\r
1809 /// アクティブモデルを変更します。\r
1810 ///\r
1811 void MainWindow::setActiveModel(FolderModel *m)\r
1812 {\r
1813     qDebug() << "MainWindow::setActiveModel()" << m;\r
1814 \r
1815     if (activeModel()) {\r
1816         activeModel()->disconnect(this);\r
1817         ui->action_CdHome->disconnect();\r
1818         ui->action_CdRoot->disconnect();\r
1819         ui->action_CdUp->disconnect();\r
1820         ui->action_historyBack->disconnect();\r
1821         ui->action_HistoryForward->disconnect();\r
1822         ui->action_MarkAll->disconnect();\r
1823         ui->action_MarkAllFiles->disconnect();\r
1824         ui->action_MarkAllOff->disconnect();\r
1825         ui->action_MarkInvert->disconnect();\r
1826         ui->action_Refresh->disconnect();\r
1827     }\r
1828 \r
1829     m->setActive();\r
1830 \r
1831     connect(activeModel(), SIGNAL(modelAboutToBeReset()), this, SLOT(model_PreReset()));\r
1832     connect(activeModel(), SIGNAL(modelReset()), this, SLOT(model_PostReset()));\r
1833     connect(ui->action_CdHome, SIGNAL(triggered()), activeModel(), SLOT(onCdHome()));\r
1834     connect(ui->action_CdRoot, SIGNAL(triggered()), activeModel(), SLOT(onCdRoot()));\r
1835     connect(ui->action_CdUp, SIGNAL(triggered()), activeModel(), SLOT(onCdUp()));\r
1836     connect(ui->action_historyBack, SIGNAL(triggered()), activeModel(), SLOT(onHistoryBack()));\r
1837     connect(ui->action_HistoryForward, SIGNAL(triggered()), activeModel(), SLOT(onHistoryForward()));\r
1838     connect(ui->action_MarkAll, SIGNAL(triggered()), activeModel(), SLOT(onMarkAll()));\r
1839     connect(ui->action_MarkAllFiles, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllFiles()));\r
1840     connect(ui->action_MarkAllOff, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllOff()));\r
1841     connect(ui->action_MarkInvert, SIGNAL(triggered()), activeModel(), SLOT(onMarkInvert()));\r
1842     connect(ui->action_Refresh, SIGNAL(triggered()), activeModel(), SLOT(refresh()));\r
1843 \r
1844     Preferences prefs(this);\r
1845     if (ui->LPanel->isVisible()) {\r
1846         ui->LPanel->updateAppearance(prefs);\r
1847         ui->LPanel->model()->updateAppearance(prefs);\r
1848     }\r
1849     if (ui->RPanel->isVisible()) {\r
1850         ui->RPanel->updateAppearance(prefs);\r
1851         ui->RPanel->model()->updateAppearance(prefs);\r
1852     }\r
1853     if (ui->FPanel->isVisible()) {\r
1854         ui->FPanel->updateAppearance(prefs);\r
1855         ui->FPanel->model()->updateAppearance(prefs);\r
1856     }\r
1857 }\r
1858 \r
1859 ///////////////////////////////////////////////////////////////////////////////\r
1860 /// \brief MainWindow::activeModel\r
1861 /// \return アクティブなフォルダモデルを返します。\r
1862 ///\r
1863 FolderModel *MainWindow::activeModel() const\r
1864 {\r
1865     return FolderModel::activeModel();\r
1866 }\r
1867 \r
1868 ///////////////////////////////////////////////////////////////////////////////\r
1869 /// \brief MainWindow::activePanel\r
1870 /// \return アクティブモデルを所有している可視状態のパネルを返します。\r
1871 ///\r
1872 Panel *MainWindow::activePanel() const\r
1873 {\r
1874     if (ui->FPanel->model() == activeModel() && ui->FPanel->isVisible()) {\r
1875         return ui->FPanel;\r
1876     }\r
1877     if (ui->LPanel->model() == activeModel() && ui->LPanel->isVisible()) {\r
1878         return ui->LPanel;\r
1879     }\r
1880     if (ui->RPanel->model() == activeModel() && ui->RPanel->isVisible()) {\r
1881         return ui->RPanel;\r
1882     }\r
1883 \r
1884     qDebug() << ">>>>>>>>>> activePanel() Logic error <<<<<<<<<<";\r
1885     return NULL;\r
1886 }\r
1887 \r
1888 ///////////////////////////////////////////////////////////////////////////////\r
1889 /// \brief MainWindow::inactiveModel\r
1890 /// \return 非アクティブなフォルダモデルを返します。\r
1891 ///\r
1892 FolderModel *MainWindow::inactiveModel() const\r
1893 {\r
1894     if (ui->LPanel->model()->isActive()) {\r
1895         return ui->RPanel->model();\r
1896     }\r
1897     Q_ASSERT(ui->RPanel->model()->isActive());\r
1898     return ui->LPanel->model();\r
1899 }\r
1900 \r
1901 ///////////////////////////////////////////////////////////////////////////////\r
1902 /// \brief MainWindow::inactivePanel\r
1903 /// \return 非アクティブモデルを所有している可視状態のパネルを返します。\r
1904 ///\r
1905 Panel *MainWindow::inactivePanel() const\r
1906 {\r
1907     if (ui->LPanel->model() == inactiveModel() && ui->LPanel->isVisible()) {\r
1908         return ui->LPanel;\r
1909     }\r
1910     if (ui->RPanel->model() == inactiveModel() && ui->RPanel->isVisible()) {\r
1911         return ui->RPanel;\r
1912     }\r
1913     if (ui->FPanel->model() == inactiveModel() && ui->FPanel->isVisible()) {\r
1914         return ui->FPanel;\r
1915     }\r
1916 \r
1917     qDebug() << ">>>>>>>>>> inactivePanel() Logic error <<<<<<<<<<";\r
1918     return NULL;\r
1919 }\r
1920 \r
1921 ///////////////////////////////////////////////////////////////////////////////\r
1922 /// \brief MainWindow::selectedItems\r
1923 /// \return マークされているアイテムまたはカレントアイテムのリスト\r
1924 ///\r
1925 QFileInfoList MainWindow::selectedItems() const\r
1926 {\r
1927     QFileInfoList list = activeModel()->markedItems();\r
1928     if (list.isEmpty()) {\r
1929         qDebug() << focusItemView();\r
1930         qDebug() << focusItemView()->currentIndex();\r
1931         Q_ASSERT(focusItemView()->currentIndex().isValid());\r
1932         list << activeModel()->fileInfo(focusItemView()->currentIndex());\r
1933     }\r
1934 \r
1935     return list;\r
1936 }\r
1937 \r
1938 ///////////////////////////////////////////////////////////////////////////////\r
1939 /// \brief MainWindow::focusItemView\r
1940 /// \return フォーカスを持つアイテムビュー\r
1941 ///\r
1942 QAbstractItemView *MainWindow::focusItemView() const\r
1943 {\r
1944     return static_cast<QAbstractItemView*>(qApp->focusWidget());\r
1945 }\r
1946 \r
1947 ///////////////////////////////////////////////////////////////////////////////\r
1948 /// \brief MainWindow::setViewMode\r
1949 /// \param mode 新しいビューモード\r
1950 ///\r
1951 /// ビューモードを変更します。\r
1952 ///\r
1953 void MainWindow::setViewMode(Mode mode)\r
1954 {\r
1955     qDebug() << "MainWindow::setViewMode()" << mode;\r
1956 \r
1957     QWidget *newFocusWidget = NULL;\r
1958 \r
1959     switch (mode) {\r
1960     case ModeBasic:\r
1961         ui->FPanel->setVisible(false);\r
1962         ui->splitter->setVisible(true);\r
1963         ui->LPanel->setViewItem();\r
1964         ui->RPanel->setViewItem();\r
1965         if (m_viewMode == ModeFull) {\r
1966             activePanel()->folderPanel()->setItemView(focusItemView()->objectName());\r
1967             activePanel()->folderPanel()->itemView()->setCurrentIndex(\r
1968                         focusItemView()->currentIndex());\r
1969             ui->FPanel->setModel(NULL);\r
1970         }\r
1971         newFocusWidget = activePanel()->folderPanel()->itemView();\r
1972         break;\r
1973 \r
1974     case ModeFull:\r
1975         if (m_viewMode == ModeBasic) {\r
1976             ui->FPanel->setModel(activeModel());\r
1977             ui->splitter->setVisible(false);\r
1978             ui->FPanel->setVisible(true);\r
1979             ui->FPanel->folderPanel()->setItemView(focusItemView()->objectName());\r
1980             ui->FPanel->folderPanel()->itemView()->setCurrentIndex(\r
1981                             focusItemView()->currentIndex());\r
1982         }\r
1983         ui->FPanel->setViewItem();\r
1984         newFocusWidget = activePanel()->folderPanel()->itemView();\r
1985         break;\r
1986 \r
1987     case ModeView:\r
1988         ui->FPanel->updateAppearance(Preferences(this));\r
1989         ui->FPanel->setViewItem(focusItemView()->currentIndex());\r
1990         ui->splitter->setVisible(false);\r
1991         ui->FPanel->setVisible(true);\r
1992         newFocusWidget = ui->FPanel->visibleView();\r
1993         break;\r
1994 \r
1995     case ModePreview:\r
1996         inactivePanel()->setViewItem(focusItemView()->currentIndex());\r
1997         break;\r
1998     }\r
1999 \r
2000     m_prevMode = m_viewMode;\r
2001     m_viewMode = mode;\r
2002 \r
2003     if (newFocusWidget)\r
2004         newFocusWidget->setFocus();\r
2005     else\r
2006         updateActions();\r
2007 }\r
2008 \r
2009 ///////////////////////////////////////////////////////////////////////////////\r
2010 /// \brief MainWindow::startProcess\r
2011 /// \param cmd      実行するコマンド\r
2012 /// \param errMsg   エラー時の表示メッセージ\r
2013 /// \return true:成功, false:失敗\r
2014 ///\r
2015 bool MainWindow::startProcess(const QString &cmd, const QString &errMsg)\r
2016 {\r
2017     qDebug() << "MainWindow::startProcess" << cmd << errMsg;\r
2018 \r
2019     QProcess process(this);\r
2020     process.setWorkingDirectory(activeModel()->rootPath());\r
2021     if (!process.startDetached(cmd)) {\r
2022         QMessageBox::critical(this, tr("エラー"), errMsg + "<br/>" + cmd);\r
2023         return false;\r
2024     }\r
2025     return true;\r
2026 }\r
2027 \r
2028 ///////////////////////////////////////////////////////////////////////////////\r
2029 /// \brief MainWindow::updateActions\r
2030 ///\r
2031 /// アクションの有効/無効を設定します。\r
2032 ///\r
2033 void MainWindow::updateActions()\r
2034 {\r
2035     qDebug() << "MainWindow::updateActions";\r
2036 \r
2037     bool isView = true;\r
2038     bool isSearch = false;\r
2039     bool isImageView = false;\r
2040     bool toggleSearch = true;\r
2041 \r
2042     QWidget *w = qApp->focusWidget();\r
2043     if (w->objectName() == "folderView" || w->objectName() == "thumbnailView") {\r
2044         setEnabledAllActions(true);\r
2045         // 履歴\r
2046         ui->action_historyBack->setEnabled(!activeModel()->isHistoryBegin());\r
2047         ui->action_HistoryForward->setEnabled(!activeModel()->isHistoryEnd());\r
2048         // チェック状態\r
2049         ui->toggle_Hidden->blockSignals(true);\r
2050         ui->toggle_Hidden->setChecked(activeModel()->filter() & QDir::Hidden);\r
2051         ui->toggle_Hidden->blockSignals(false);\r
2052 \r
2053         ui->toggle_System->blockSignals(true);\r
2054         ui->toggle_System->setChecked(activeModel()->filter() & QDir::System);\r
2055         ui->toggle_System->blockSignals(false);\r
2056 \r
2057         ui->toggle_ThumbnailMode->blockSignals(true);\r
2058         ui->toggle_ThumbnailMode->setChecked(w->objectName() == "thumbnailView");\r
2059         ui->toggle_ThumbnailMode->blockSignals(false);\r
2060 \r
2061         // 現在の選択アイテムが".."の場合、ファイル操作系アクションは無効にする\r
2062         QFileInfoList list = selectedItems();\r
2063         if (list.size() == 1 && list[0].fileName() == "..") {\r
2064             ui->action_Copy->setEnabled(false);\r
2065             ui->action_Delete->setEnabled(false);\r
2066             ui->action_Move->setEnabled(false);\r
2067             ui->action_Rename->setEnabled(false);\r
2068         }\r
2069 \r
2070         // 単画面またはプレビューモードの場合\r
2071         if (!ui->LPanel->folderPanel()->isVisible() ||\r
2072             !ui->RPanel->folderPanel()->isVisible())\r
2073         {\r
2074             ui->action_Copy->setEnabled(false);\r
2075             ui->action_Move->setEnabled(false);\r
2076             ui->action_Swap->setEnabled(false);\r
2077             ui->action_SyncPanel->setEnabled(false);\r
2078             ui->action_SyncPanelTo->setEnabled(false);\r
2079         }\r
2080 \r
2081         // 単画面の場合\r
2082         if (m_viewMode == ModeFull) {\r
2083             ui->toggle_PreviewMode->setEnabled(false);\r
2084             ui->action_SplitCenter->setEnabled(false);\r
2085             ui->action_ExpandLeft->setEnabled(false);\r
2086             ui->action_ExpandRight->setEnabled(false);\r
2087             ui->action_KeyDownOther->setEnabled(false);\r
2088             ui->action_KeyEndOther->setEnabled(false);\r
2089             ui->action_KeyHomeOther->setEnabled(false);\r
2090             ui->action_KeyUpOther->setEnabled(false);\r
2091         }\r
2092     }\r
2093     else if (w->objectName() == "searchBox"){\r
2094         setEnabledAllActions(false);\r
2095         isView = false;\r
2096         isSearch = true;\r
2097     }\r
2098     else if (w->objectName() == "locationBox") {\r
2099         setEnabledAllActions(false);\r
2100         isView = false;\r
2101     }\r
2102     else if (w->objectName() == "textView") {\r
2103         SimpleTextView *v = static_cast<SimpleTextView*>(w);\r
2104         setEnabledAllActions(false);\r
2105         toggleSearch = false;\r
2106 \r
2107         reconnectAction(ui->text_ConvertFromEUC, SIGNAL(triggered()), v, SLOT(convertFromEUC()));\r
2108         reconnectAction(ui->text_ConvertFromJIS, SIGNAL(triggered()), v, SLOT(convertFromJIS()));\r
2109         reconnectAction(ui->text_ConvertFromSJIS, SIGNAL(triggered()), v, SLOT(convertFromSJIS()));\r
2110         reconnectAction(ui->text_ConvertFromUTF8, SIGNAL(triggered()), v, SLOT(convertFromUTF8()));\r
2111         reconnectAction(ui->text_ConvertFromUTF16, SIGNAL(triggered()), v, SLOT(convertFromUTF16()));\r
2112         reconnectAction(ui->text_ConvertFromUTF16BE, SIGNAL(triggered()), v, SLOT(convertFromUTF16BE()));\r
2113         reconnectAction(ui->text_ConvertFromUTF16LE, SIGNAL(triggered()), v, SLOT(convertFromUTF16LE()));\r
2114         reconnectAction(ui->text_Copy, SIGNAL(triggered()), v, SLOT(copy()));\r
2115     }\r
2116     else if (w->objectName() == "imageView") {\r
2117         SimpleImageView *v = static_cast<SimpleImageView*>(w);\r
2118         setEnabledAllActions(false);\r
2119         toggleSearch = false;\r
2120         isImageView = true;\r
2121 \r
2122         reconnectAction(ui->image_FitToWindow, SIGNAL(toggled(bool)), v, SLOT(fitToWindow(bool)));\r
2123         reconnectAction(ui->image_ScaleNormal, SIGNAL(toggled(bool)), v, SLOT(scaleNormal()));\r
2124         reconnectAction(ui->image_Rotate90, SIGNAL(triggered()), v, SLOT(rotate90()));\r
2125         reconnectAction(ui->image_Rotate180, SIGNAL(triggered()), v, SLOT(rotate180()));\r
2126     }\r
2127     else if (w->objectName() == "progressBar") {\r
2128         setEnabledAllActions(false);\r
2129         toggleSearch = false;\r
2130         isView = false;\r
2131     }\r
2132 \r
2133     ui->toggle_Toolbar->blockSignals(true);\r
2134     ui->toggle_Toolbar->setChecked(ui->mainToolBar->isVisible());\r
2135     ui->toggle_Toolbar->blockSignals(false);\r
2136 \r
2137     ui->action_About->setEnabled(true);\r
2138     ui->action_CheckUpdate->setEnabled(true);\r
2139     ui->action_KeyDown->setEnabled(isView);\r
2140     ui->action_KeyEnd->setEnabled(isView);\r
2141     ui->action_KeyHome->setEnabled(isView);\r
2142     ui->action_KeyUp->setEnabled(isView);\r
2143     ui->action_Quit->setEnabled(true);\r
2144     ui->action_ScaleDown->setEnabled(isView);\r
2145     ui->action_ScaleUp->setEnabled(isView);\r
2146     ui->action_SearchNext->setEnabled(isSearch);\r
2147     ui->action_SearchPrev->setEnabled(isSearch);\r
2148     ui->action_Setting->setEnabled(true);\r
2149     ui->toggle_Search->setEnabled(toggleSearch);\r
2150     ui->view_Back->setEnabled(m_viewMode == ModeView);\r
2151 \r
2152     if (isImageView) {\r
2153         ui->action_ScaleDown->setText(tr("縮小"));\r
2154         ui->action_ScaleUp->setText(tr("拡大"));\r
2155     }\r
2156     else {\r
2157         ui->action_ScaleDown->setText(tr("文字を小さく"));\r
2158         ui->action_ScaleUp->setText(tr("文字を大きく"));\r
2159     }\r
2160 \r
2161     ui->toggle_FullMode->setEnabled(m_viewMode == ModeBasic || m_viewMode == ModeFull);\r
2162 \r
2163     if (w->objectName() == "thumbnailView") {\r
2164         ui->action_KeyLeft->setEnabled(false);\r
2165         ui->action_KeyRight->setEnabled(false);\r
2166     }\r
2167     else {\r
2168         ui->action_KeyLeft->setEnabled(isView);\r
2169         ui->action_KeyRight->setEnabled(isView);\r
2170     }\r
2171 }\r
2172 \r
2173 ///////////////////////////////////////////////////////////////////////////////\r
2174 /// \brief MainWindow::setEnabledAllActions\r
2175 /// \param enable   有効にする場合はtrue\r
2176 ///\r
2177 /// 全てのアクションを有効または無効にします。\r
2178 ///\r
2179 void MainWindow::setEnabledAllActions(bool enable)\r
2180 {\r
2181     qDebug() << "MainWindow::setEnabledAllActions()" << enable;\r
2182     foreach (QAction *action, m_actions) {\r
2183         action->setEnabled(enable);\r
2184     }\r
2185 }\r
2186 \r
2187 ///////////////////////////////////////////////////////////////////////////////\r
2188 /// \brief MainWindow::onAbout\r
2189 ///\r
2190 /// Aboutダイアログを表示します。\r
2191 ///\r
2192 void MainWindow::onAbout()\r
2193 {\r
2194     QMessageBox::about(\r
2195                 this,\r
2196                 tr("げふぅ について"),\r
2197                 windowTitle() +\r
2198                 tr("<center>Gefu is an Experimental File Utility.<br/>"\r
2199                    "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"\r
2200                    "<p>最新版の情報は<a href='http://gefu.sourceforge.jp/'>公式サイト</a>で公開しています。</p>"\r
2201                    "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));\r
2202 }\r
2203 \r
2204 ///////////////////////////////////////////////////////////////////////////////\r
2205 /// \brief MainWindow::closeEvent\r
2206 /// \param event    クローズイベント\r
2207 ///\r
2208 /// 終了処理を行います。\r
2209 ///\r
2210 void MainWindow::closeEvent(QCloseEvent *event)\r
2211 {\r
2212     qDebug() << "MainWindow::closeEvent()";\r
2213     Preferences prefs(this);\r
2214 \r
2215     if (prefs.isConfirmQuit()) {\r
2216         QMessageBox msgBox;\r
2217         QCheckBox *checkBox = new QCheckBox();\r
2218         checkBox->setText(tr("次回以降は確認しない"));\r
2219         msgBox.setCheckBox(checkBox);\r
2220         msgBox.setText(tr("終了しますか?"));\r
2221         msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);\r
2222         msgBox.setIcon(QMessageBox::Question);\r
2223 \r
2224         if (msgBox.exec() == QMessageBox::No) {\r
2225             qDebug() << ">>>>> ユーザによりキャンセルされました <<<<<";\r
2226             event->ignore();\r
2227             return;\r
2228         }\r
2229         prefs.setConfirmQuit(!checkBox->isChecked());\r
2230     }\r
2231 \r
2232     prefs.saveModel("Left", ui->LPanel->model());\r
2233     prefs.saveModel("Right", ui->RPanel->model());\r
2234     prefs.saveWindow(this);\r
2235     QMainWindow::closeEvent(event);\r
2236 }\r
2237 \r
2238 ///////////////////////////////////////////////////////////////////////////////\r
2239 /// \brief MainWindow::eventFilter\r
2240 /// \param watched  イベントの発生元オブジェクト\r
2241 /// \param e        発生したイベント\r
2242 /// \return イベントを処理した場合はtrueを返します。\r
2243 ///\r
2244 bool MainWindow::eventFilter(QObject *watched, QEvent *e)\r
2245 {\r
2246     switch (e->type()) {\r
2247     case QEvent::KeyPress:\r
2248         // キーイベントの処理\r
2249         return onKeyPressEvent(watched, static_cast<QKeyEvent*>(e));\r
2250 \r
2251     case QEvent::ContextMenu:\r
2252         // コンテキストメニューイベントの処理\r
2253         return onContextMenuEvent(watched, static_cast<QContextMenuEvent*>(e));\r
2254 \r
2255     default:\r
2256         break;\r
2257     }\r
2258 \r
2259     return false;\r
2260 }\r