OSDN Git Service

Ver0.11pre
authorMasayuki Satoh <miyabi.satoh@gmail.com>
Mon, 25 Aug 2014 13:08:55 +0000 (22:08 +0900)
committerMasayuki Satoh <miyabi.satoh@gmail.com>
Mon, 25 Aug 2014 13:08:55 +0000 (22:08 +0900)
26 files changed:
Gefu.pro
README.md
ReadMe.txt
common.h
copymoveworker.cpp
copymoveworker.h
filetablemodel.cpp
filetablemodel.h
folderview.cpp
folderview.h
historydialog.cpp
historydialog.h
locationbox.cpp
locationbox.h
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
overwritedialog.cpp
overwritedialog.h
overwritedialog.ui
preferencedialog.cpp
preferencedialog.ui
searchbox.cpp
searchbox.h
simpletextview.cpp

index bbe11af..a3babff 100644 (file)
--- a/Gefu.pro
+++ b/Gefu.pro
@@ -16,7 +16,6 @@ TEMPLATE = app
 
 SOURCES += main.cpp\
     mainwindow.cpp \
-    folderpanel.cpp \
     renamesingledialog.cpp \
     renamemultidialog.cpp \
     operationdialog.cpp \
@@ -28,17 +27,16 @@ SOURCES += main.cpp\
     copymoveworker.cpp \
     sortdialog.cpp \
     filetablemodel.cpp \
-    filetableview.cpp \
     history.cpp \
     historydialog.cpp \
     preferencedialog.cpp \
-    clickablelabel.cpp \
     colorsamplemodel.cpp \
-    simpletextview.cpp
+    simpletextview.cpp \
+    searchbox.cpp \
+    folderview.cpp \
+    locationbox.cpp
 
 HEADERS  += mainwindow.h \
-    folderpanel.h \
-    singleton.hpp \
     renamesingledialog.h \
     renamemultidialog.h \
     operationdialog.h \
@@ -51,16 +49,16 @@ HEADERS  += mainwindow.h \
     copymoveworker.h \
     sortdialog.h \
     filetablemodel.h \
-    filetableview.h \
     history.h \
     historydialog.h \
     preferencedialog.h \
-    clickablelabel.h \
     colorsamplemodel.h \
-    simpletextview.h
+    simpletextview.h \
+    searchbox.h \
+    folderview.h \
+    locationbox.h
 
 FORMS    += mainwindow.ui \
-    folderpanel.ui \
     renamesingledialog.ui \
     renamemultidialog.ui \
     operationdialog.ui \
@@ -74,7 +72,8 @@ RESOURCES += \
 
 OTHER_FILES += \
     Gefu.rc \
-    README.md
+    README.md \
+    ReadMe.txt
 
 macx {
     ICON = ./images/Gefu.icns
index dab55e0..9f9abbe 100644 (file)
--- a/README.md
+++ b/README.md
@@ -8,13 +8,18 @@ Gefu is an Experimental File Utility.
 - オプション
     - ファンクションキー
     - キーバインドカスタマイズ
-- ファイル検索
 - 簡易画像ビューア
 - 簡易アーカイバ
 - 簡易FTPクライアント
 - SNS連携(タイムライン表示とか) ← ファイラーの機能か?
 
-#### 2014/08/24 Ver0.10
+#### 2014/08/25 Ver0.11 公開
+- ファイル検索機能を実装。
+- 内部構造を大幅に変更。
+  各ビューで処理していたアクションを、メインウィンドウで処理するように変更。
+- 起動時の位置とサイズが常にデフォルト値になっていたのを修正。
+
+#### 2014/08/24 Ver0.10 公開
 - 環境設定ダイアログの変更
     - コントロールの活性・非活性切り替えを修正。
     - フォント選択をダイアログ使用に変更。
index e8ce75e..ca902eb 100644 (file)
@@ -1,8 +1,8 @@
 ===============================================================================
     Gefu(げふぅ) - Gefu is an Experimental File Utility - 
-    Version 0.10
+    Version 0.11
 ===============================================================================
-                                                       2014/08/24 @miyabi_satoh
+                                                       2014/08/25 @miyabi_satoh
 
 ◇ 概要 ◇
 
  Twitter: https://twitter.com/miyabi_satoh
 
 ◇ 履歴 ◇
+#### 2014/08/25 Ver0.11
+- ファイル検索機能を実装。
+- 内部構造を大幅に変更。
+  (各ビューで処理していたアクションを、メインウィンドウで処理するように変更。)
+- 起動時の位置とサイズが常にデフォルト値になっていたのを修正。
+
 #### 2014/08/24 Ver0.10
 - SourceForge.jp でプロジェクト公開。
 - 環境設定ダイアログの変更
index 7543459..54d56b0 100644 (file)
--- a/common.h
+++ b/common.h
@@ -5,11 +5,13 @@
 typedef QMap<QString, QString> StringMap;\r
 \r
 class MainWindow;\r
+class QKeyEvent;\r
 extern MainWindow* getMainWnd();\r
 extern QString FilesizeToString(quint64 size);\r
 extern QString ViewerIgnoreExt();\r
+extern QString KeyEventToSequence(const QKeyEvent *event);\r
 \r
-#define VERSION_VALUE   0.10\r
+#define VERSION_VALUE   0.11\r
 \r
 #define slash   QString("/")\r
 #define QQ(x)   ("\"" + QString(x) + "\"")\r
index 41e28ac..f23ee70 100644 (file)
@@ -35,13 +35,12 @@ void CopyMoveWorker::operate()
     }\r
 \r
     bool ret;\r
-    int copyMethod = OverWriteDialog::Undefined;\r
-    int prevCopyMethod = OverWriteDialog::Undefined;\r
     int successCount = 0;\r
     int skipCount = 0;\r
     int errorCount = 0;\r
     int errDelCount = 0;\r
     QString msg;\r
+    QString copyMethod;\r
     QString alias;\r
     StringMap::iterator it;\r
     for (it = m_CopyMap.begin(); it != m_CopyMap.end(); it++) {\r
@@ -73,34 +72,31 @@ void CopyMoveWorker::operate()
         do {    // コピーをスキップするのにbreakを使うがためのdo-while\r
             if (tgtInfo.exists()) {\r
                 // 解決方法を選択\r
-                if (copyMethod == OverWriteDialog::Undefined ||\r
-                        copyMethod == OverWriteDialog::Rename)\r
-                {\r
-                    bool bOk;\r
-                    m_Asking = true;\r
-                    emit askOverWrite(&bOk, &prevCopyMethod, &copyMethod, &alias,\r
-                                      srcInfo.absoluteFilePath(),\r
-                                      tgtInfo.absoluteFilePath());\r
-                    while (isAsking()) {\r
-                        this->thread()->msleep(100);\r
-                    }\r
+                m_Asking = true;\r
+                emit askOverWrite(&copyMethod,\r
+                                  &alias,\r
+                                  srcInfo.absoluteFilePath(),\r
+                                  tgtInfo.absoluteFilePath());\r
+\r
+                while (isAsking()) {\r
+                    thread()->msleep(100);\r
+                }\r
 \r
-                    if (!bOk) {\r
-                        requestStop();\r
-                        msg = tr("%1個のファイルをコピーしました。").arg(successCount);\r
-                        if (skipCount > 0) {\r
-                            msg += tr("%1個のファイルをスキップしました。").arg(skipCount);\r
-                        }\r
-                        if (errorCount > 0) {\r
-                            msg += tr("%1個のファイルをコピーできませんでした。").arg(errorCount);\r
-                        }\r
-                        m_progressText->setText(msg);\r
-                        emit canceled();\r
-                        return;\r
+                // キャンセルされた?\r
+                if (isStopRequested()) {\r
+                    msg = tr("%1個のファイルをコピーしました。").arg(successCount);\r
+                    if (skipCount > 0) {\r
+                        msg += tr("%1個のファイルをスキップしました。").arg(skipCount);\r
                     }\r
+                    if (errorCount > 0) {\r
+                        msg += tr("%1個のファイルをコピーできませんでした。").arg(errorCount);\r
+                    }\r
+                    m_progressText->setText(msg);\r
+                    emit canceled();\r
+                    return;\r
                 }\r
 \r
-                if (prevCopyMethod == OverWriteDialog::OverWrite) {\r
+                if (copyMethod == "rbOverWrite") {\r
                     if (srcInfo.absoluteFilePath() == tgtInfo.absoluteFilePath()) {\r
                         emit success(tr("同一ファイルへの操作のためスキップ"));\r
                         skipCount++;\r
@@ -108,7 +104,7 @@ void CopyMoveWorker::operate()
                     }\r
                     QFile(tgtInfo.absoluteFilePath()).remove();\r
                 }\r
-                else if (prevCopyMethod == OverWriteDialog::OverWriteIfNew) {\r
+                else if (copyMethod == "rbOverWriteIfNew") {\r
                     if (srcInfo.lastModified() <= tgtInfo.lastModified()) {\r
                         emit success(tr("古いファイルのためスキップ"));\r
                         skipCount++;\r
@@ -121,7 +117,7 @@ void CopyMoveWorker::operate()
                     }\r
                     QFile(tgtInfo.absoluteFilePath()).remove();\r
                 }\r
-                else if (prevCopyMethod == OverWriteDialog::AppendNumber) {\r
+                else if (copyMethod == "rbAppendNumber") {\r
                     QString baseName = tgtInfo.baseName();\r
                     QString suffix = tgtInfo.completeSuffix();\r
                     for (int n = 1; ; n++) {\r
@@ -133,15 +129,19 @@ void CopyMoveWorker::operate()
                     }\r
                     emit operation(tr("=>") + tgtInfo.fileName() + tr("にリネーム"));\r
                 }\r
-                else if (prevCopyMethod == OverWriteDialog::Skip) {\r
+                else if (copyMethod == "rbSkip") {\r
                     emit success(tr("スキップ"));\r
                     skipCount++;\r
                     break;\r
                 }\r
-                else if (prevCopyMethod == OverWriteDialog::Rename) {\r
+                else if (copyMethod == "rbRename") {\r
                     tgtInfo.setFile(tgtInfo.absolutePath(), alias);\r
                     emit operation(tr("=>") + tgtInfo.fileName() + tr("にリネーム"));\r
                 }\r
+                else {\r
+                    qDebug() << "Unknown method : " << copyMethod;\r
+                    Q_ASSERT(false);\r
+                }\r
             }\r
 \r
             ret = QFile::copy(srcInfo.absoluteFilePath(), tgtInfo.absoluteFilePath());\r
@@ -155,7 +155,6 @@ void CopyMoveWorker::operate()
                         emit error("元ファイルの削除に失敗");\r
                     }\r
                 }\r
-\r
             }\r
             else {\r
                 errorCount++;\r
index ade7f6a..7cdac09 100644 (file)
@@ -29,7 +29,7 @@ public:
     }\r
 \r
 signals:\r
-    void askOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod, QString *alias,\r
+    void askOverWrite(QString *copyMethod, QString *alias,\r
                       const QString &srcPath, const QString &tgtPath);\r
 \r
 public slots:\r
index 06d4424..df135d2 100644 (file)
@@ -26,6 +26,8 @@ FileTableModel::FileTableModel(QObject *parent) :
     m_HiddenBrush(),\r
     m_ReadonlyBrush()\r
 {\r
+    // デフォルトフィルタを設定する\r
+    setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);\r
 }\r
 \r
 bool FileTableModel::setPath(const QString &path)\r
@@ -54,7 +56,6 @@ bool FileTableModel::setPath(const QString &path)
     }\r
     else {\r
         QFileInfoList::iterator it;\r
-        bool removeDotDot = false;\r
         for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); ) {\r
 #ifdef Q_OS_WIN32\r
             if (!(filter() & QDir::System)){\r
@@ -73,27 +74,24 @@ bool FileTableModel::setPath(const QString &path)
                 if (m_dir.isRoot()) {\r
                     qDebug() << m_dir.absolutePath() << " is root.";\r
                     it = m_fileInfoList.erase(it);\r
-                    removeDotDot = true;\r
                     continue;\r
                 }\r
             }\r
             it++;\r
         }\r
         // ソート方法によらず、".."は必ず先頭にする\r
-        if (!removeDotDot) {\r
-            QFileInfoList::iterator itRoot = m_fileInfoList.end();\r
-            for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); it++) {\r
-                if (it->fileName() == "..") {\r
-                    itRoot = it;\r
-                    break;\r
-                }\r
-            }\r
-            if (itRoot != m_fileInfoList.end()) {\r
-                QFileInfo info(*itRoot);\r
-                m_fileInfoList.erase(itRoot);\r
-                m_fileInfoList.push_front(info);\r
+        QFileInfoList::iterator itRoot = m_fileInfoList.end();\r
+        for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); it++) {\r
+            if (it->fileName() == "..") {\r
+                itRoot = it;\r
+                break;\r
             }\r
         }\r
+        if (itRoot != m_fileInfoList.end()) {\r
+            QFileInfo info(*itRoot);\r
+            m_fileInfoList.erase(itRoot);\r
+            m_fileInfoList.push_front(info);\r
+        }\r
     }\r
 \r
     m_checkStates.resize(m_fileInfoList.size());\r
@@ -105,7 +103,7 @@ bool FileTableModel::setPath(const QString &path)
     m_fsWatcher = new QFileSystemWatcher(this);\r
     m_fsWatcher->addPath(path);\r
     connect(m_fsWatcher, SIGNAL(directoryChanged(QString)),\r
-            this, SIGNAL(listUpdated()));\r
+            this, SLOT(directoryChange(QString)));\r
 \r
     endResetModel();\r
 \r
@@ -149,36 +147,6 @@ void FileTableModel::setCheckStateAll(Qt::CheckState state)
     stateChanged();\r
 }\r
 \r
-#if 0\r
-bool FileTableModel::isDir(const QModelIndex &index) const\r
-{\r
-    if (!index.isValid()) {\r
-        qDebug() << "isDir() : index is invalid.";\r
-        return QString();\r
-    }\r
-    return m_fileInfoList[index.row()].isDir();\r
-}\r
-\r
-const QString FileTableModel::absoluteFilePath(const QModelIndex &index) const\r
-{\r
-    if (!index.isValid()) {\r
-        qDebug() << "absoluteFilePath() : index is invalid.";\r
-        return QString();\r
-    }\r
-//    return m_dir.absoluteFilePath(m_fileInfoList[index.row()].fileName());\r
-    return m_fileInfoList[index.row()].absoluteFilePath();\r
-}\r
-\r
-const QString FileTableModel::fileName(const QModelIndex &index) const\r
-{\r
-    if (!index.isValid()) {\r
-        qDebug() << "fileName() : index is invalid.";\r
-        return QString();\r
-    }\r
-    return m_fileInfoList[index.row()].fileName();\r
-}\r
-#endif\r
-\r
 QFileInfo FileTableModel::fileInfo(const QModelIndex &index) const\r
 {\r
     if (!index.isValid()) {\r
@@ -207,6 +175,13 @@ void FileTableModel::updateAppearance()
     endResetModel();\r
 }\r
 \r
+void FileTableModel::directoryChange(const QString &path)\r
+{\r
+    qDebug() << "FileTableModel::directoryChange";\r
+\r
+    setPath(path);\r
+}\r
+\r
 void FileTableModel::stateChanged()\r
 {\r
     int numFolder = 0;\r
index f21ea6e..321829c 100644 (file)
@@ -31,22 +31,20 @@ public:
     void setCheckState(const QModelIndex &index, Qt::CheckState state);\r
     void setCheckStateAll(Qt::CheckState state);\r
     const QString absolutePath() const { return m_dir.absolutePath(); }\r
-#if 0\r
-    bool isDir(const QModelIndex &index) const;\r
-    const QString absoluteFilePath(const QModelIndex &index) const;\r
-    const QString fileName(const QModelIndex &index) const;\r
-#endif\r
+\r
     QFileInfoList checkedItems() const;\r
     QFileInfo fileInfo(const QModelIndex &index) const;\r
 \r
     void updateAppearance();\r
 \r
+    QFont font() const { return m_font; }\r
+\r
 signals:\r
     void rootChanged(const QString &root);\r
     void stateChanged(int checkedFoldrs, int checkedFiles, quint64 totalSize);\r
-    void listUpdated();\r
 \r
 public slots:\r
+    void directoryChange(const QString &path);\r
 \r
 private:\r
     QDir m_dir;\r
index 747bf01..1bcf8c5 100644 (file)
@@ -1,6 +1,322 @@
+#include "common.h"
 #include "folderview.h"
 
+#include <QDebug>
+#include <QHeaderView>
+#include <QKeyEvent>
+#include <QSettings>
+
+QString FilesizeToString(quint64 size)
+{
+    if (size >= 1024 * 1024 * 1024) {
+        return QString("%1GB").arg(int(10 * size / (1024 * 1024 * 1024)) / 10);
+    }
+    if (size >= 1024 * 1024) {
+        return QString("%1MB").arg(int(10 * size / (1024 * 1024)) / 10);
+    }
+    if (size >= 1024) {
+        return QString("%1KB").arg(int(10 * size / (1024)) / 10);
+    }
+    return QString("%1B").arg(size);
+}
+
 FolderView::FolderView(QWidget *parent) :
-    QTableView(parent)
+    QTableView(parent),
+    m_model()
+{
+    setModel(&m_model);
+}
+
+QString FolderView::side() const
+{
+    if (this->objectName() == "folderView1") {
+        return QString("Left");
+    }
+    else {
+        Q_ASSERT(this->objectName() == "folderView2");
+        return QString("Right");
+    }
+}
+
+void FolderView::initialize()
+{
+    qDebug() << side() << "initialize";
+
+    QHeaderView *header;
+    // 列のリサイズモードを設定する
+    header = horizontalHeader();
+    header->setSectionResizeMode(QHeaderView::ResizeToContents);
+    header->setSectionResizeMode(1, QHeaderView::Stretch);
+
+    // 行の高さを設定する
+    header = verticalHeader();
+    header->setDefaultSectionSize(QFontMetrics(m_model.font()).height() * 1.5);
+
+    // 前回終了時のパスを開く
+    QSettings settings;
+    setPath(settings.value(side() + slash + IniKey_Dir).toString(), true);
+
+    // 色とフォントを設定する
+    updateAppearance();
+}
+
+void FolderView::updateAppearance()
+{
+    qDebug() << side() << "updateAppearance";
+    m_model.updateAppearance();
+
+    QSettings settings;
+    QPalette pal = palette();
+    pal.setColor(QPalette::Base, settings.value(IniKey_ViewColorBgNormal).value<QColor>());
+    setPalette(pal);
+}
+
+void FolderView::refresh()
+{
+    qDebug() << side() << "refresh";
+
+    int row = currentIndex().row();
+
+    setPath(m_model.absolutePath(), false);
+
+    if (row < 0) {
+        row = 0;
+    }
+    else if (row >= m_model.rowCount()) {
+        row = m_model.rowCount() - 1;
+    }
+    setCurrentIndex(m_model.index(row, 0));
+}
+
+void FolderView::searchItem(const QString &text)
+{
+    qDebug() << "FolderView::searchItem" << text;
+
+    for (int row = 0; row < m_model.rowCount(); row++) {
+        QModelIndex index = m_model.index(row, 0);
+        QString name = m_model.fileInfo(index).fileName().toLower();
+        if (name.indexOf(text.toLower()) != -1) {
+            setCurrentIndex(index);
+            emit itemFound(this);
+            return;
+        }
+    }
+
+    emit itemNotFound(this);
+}
+
+void FolderView::searchNext(const QString &text)
+{
+    qDebug() << "FolderView::searchNext" << text;
+
+    for (int row = currentIndex().row() + 1; row < m_model.rowCount(); row++) {
+        QModelIndex index = m_model.index(row, 0);
+        QString name = m_model.fileInfo(index).fileName().toLower();
+        if (name.indexOf(text.toLower()) != -1) {
+            setCurrentIndex(index);
+            emit itemFound(this);
+            return;
+        }
+    }
+
+    emit itemNotFound(this);
+}
+
+void FolderView::searchPrev(const QString &text)
+{
+    qDebug() << side() << "searchPrev" << text;
+
+    for (int row = currentIndex().row() - 1; row >= 0; row--) {
+        QModelIndex index = m_model.index(row, 0);
+        QString name = m_model.fileInfo(index).fileName().toLower();
+        if (name.indexOf(text.toLower()) != -1) {
+            setCurrentIndex(index);
+            emit itemFound(this);
+            return;
+        }
+    }
+
+    emit itemNotFound(this);
+}
+
+void FolderView::setCheckStateAll(bool checked)
 {
+    qDebug() << side() << "markAll();";
+
+    QModelIndex current = currentIndex();
+
+    setUpdatesEnabled(false);
+    m_model.setCheckStateAll(checked ? Qt::Checked : Qt::Unchecked);
+    setUpdatesEnabled(true);
+
+    setCurrentIndex(current);
+}
+
+void FolderView::setCheckStateAllFiles()
+{
+    qDebug() << side() << "markAllFiles();";
+
+    QModelIndex current = currentIndex();
+
+    setUpdatesEnabled(false);
+    for (int n = 0; n < m_model.rowCount(); n++) {
+        QModelIndex index = m_model.index(n, 0);
+        QFileInfo info = m_model.fileInfo(index);
+        if (info.isDir()) {
+            m_model.setCheckState(index, Qt::Unchecked);
+        }
+        else {
+            m_model.setCheckState(index, Qt::Checked);
+        }
+    }
+    setUpdatesEnabled(true);
+
+    setCurrentIndex(current);
+}
+
+void FolderView::invertCheckState()
+{
+    qDebug() << side() << "invertCheckState();";
+
+    QModelIndex current = currentIndex();
+
+    setUpdatesEnabled(false);
+    for (int n = 0; n < m_model.rowCount(); n++) {
+        QModelIndex index = m_model.index(n, 0);
+        if (m_model.checkState(index) == Qt::Checked) {
+            m_model.setCheckState(index, Qt::Unchecked);
+        }
+        else {
+            m_model.setCheckState(index, Qt::Checked);
+        }
+    }
+    setUpdatesEnabled(true);
+
+    setCurrentIndex(current);
+}
+
+void FolderView::toggleCheckState(const QModelIndex &index)
+{
+    QFileInfo info = m_model.fileInfo(index);
+    if (info.fileName() != "..") {
+        if (m_model.checkState(index) == Qt::Checked) {
+            m_model.setCheckState(index, Qt::Unchecked);
+        }
+        else {
+            m_model.setCheckState(index, Qt::Checked);
+        }
+    }
+    // 最終行でなければ、次のアイテムに移動する
+    if (index.row() == m_model.rowCount() - 1) {
+        setCurrentIndex(index);
+    }
+    else if (index.row() < m_model.rowCount() - 1) {
+        setCurrentIndex(m_model.index(index.row() + 1, 1));
+    }
+}
+
+bool FolderView::historyBack()
+{
+    if (!m_history.isBegin()) {
+        setPath(m_history.back(), false);
+        return true;
+    }
+    return false;
+}
+
+bool FolderView::historyForward()
+{
+    if (!m_history.isEnd()) {
+        setPath(m_history.forward(), false);
+        return true;
+    }
+    return false;
+}
+
+QFileInfo FolderView::currentItem() const
+{
+    qDebug() << "FolderView::currentItem";
+
+    Q_ASSERT(currentIndex().isValid());
+
+    return m_model.fileInfo(currentIndex());
+}
+
+QFileInfoList FolderView::selectedItems() const
+{
+    qDebug() << side() << "selectedItems";
+
+    // マークされているアイテムを取得する
+    QFileInfoList list = m_model.checkedItems();
+
+    // 一つもマークされていなければ、カーソル位置のアイテムを取得する
+    if (list.isEmpty()) {
+        list << currentItem();
+    }
+
+    return list;
+}
+
+void FolderView::setPath(const QString &path, bool addHistory)
+{
+    qDebug() << side() << "setPath" << path << addHistory;
+
+    Q_ASSERT(QFileInfo(path).isDir());
+
+    emit retrieveStarted(path);
+
+    setUpdatesEnabled(false);
+    m_model.setPath(path);
+    setCurrentIndex(m_model.index(0, 0));
+    setUpdatesEnabled(true);
+
+    if (addHistory) {
+        m_history.add(path);
+    }
+
+    emit retrieveFinished();
+}
+
+void FolderView::setFilter(QDir::Filters filter, bool enable)
+{
+    qDebug() << side() << "setFilter" << enable;
+
+    if (enable) {
+        m_model.setFilter(m_model.filter() | filter);
+    }
+    else {
+        m_model.setFilter(m_model.filter() ^ filter);
+    }
+}
+
+void FolderView::setHistoryIndexAt(int index)
+{
+    m_history.setAt(index);
+    setPath(m_history.current(), false);
+}
+
+void FolderView::setNameFilters(const QStringList &list)
+{
+    m_model.setNameFilters(list);
+    refresh();
+}
+
+void FolderView::setSorting(QDir::SortFlags flags)
+{
+    m_model.setSorting(flags);
+    refresh();
+}
+
+void FolderView::keyPressEvent(QKeyEvent *event)
+{
+    qDebug() << side() << "keyPressEvent";
+
+    emit keyPressed(this, event);
+
+    if (!event->isAccepted()) {
+        QTableView::keyPressEvent(event);
+    }
+    else {
+        qDebug() << "KeyEvent accepted.";
+    }
 }
index 1bf1731..3b23544 100644 (file)
@@ -1,6 +1,9 @@
 #ifndef FOLDERVIEW_H
 #define FOLDERVIEW_H
 
+#include "filetablemodel.h"
+#include "history.h"
+
 #include <QTableView>
 
 class FolderView : public QTableView
@@ -9,10 +12,59 @@ class FolderView : public QTableView
 public:
     explicit FolderView(QWidget *parent = 0);
 
+    QString side() const;
+
+    // actions
+    void initialize();
+    void updateAppearance();
+    void refresh();
+
+    void searchItem(const QString &text);
+    void searchNext(const QString &text);
+    void searchPrev(const QString &text);
+
+    void setCheckStateAll(bool checked);
+    void setCheckStateAllFiles();
+    void invertCheckState();
+    void toggleCheckState(const QModelIndex &index);
+
+    bool historyBack();
+    bool historyForward();
+
+
+    // getter
+    QFileInfo currentItem() const;
+    QString dir() const { return m_model.absolutePath(); }
+    QFileInfoList selectedItems() const;
+    const History* history() const { return &m_history; }
+    QStringList nameFilters() const { return m_model.nameFilters(); }
+
+    // setter
+    void setPath(const QString &path, bool addHistory);
+    void setFilter(QDir::Filters filter, bool enable);
+    void setHistoryIndexAt(int index);
+    void setNameFilters(const QStringList &list);
+    void setSorting(QDir::SortFlags flags);
+
+private:
+    FileTableModel m_model;
+    History m_history;
+
+
 signals:
+    void itemFound(FolderView *view);
+    void itemNotFound(FolderView *view);
+    void retrieveStarted(const QString &path);
+    void retrieveFinished();
+    void keyPressed(FolderView *view, QKeyEvent *event);
 
 public slots:
 
+
+    // QWidget interface
+protected:
+    void keyPressEvent(QKeyEvent *event);
+
 };
 
 #endif // FOLDERVIEW_H
index 02f5fb8..83c87d1 100644 (file)
@@ -19,7 +19,7 @@ HistoryDialog::~HistoryDialog()
     delete ui;
 }
 
-void HistoryDialog::setHistory(History *left, History *right)
+void HistoryDialog::setHistory(const History *left, const History *right)
 {
     m_leftHistory = left;
     m_rightHistory = right;
index 821c0f6..b48b014 100644 (file)
@@ -17,7 +17,7 @@ public:
     explicit HistoryDialog(QWidget *parent = 0);
     ~HistoryDialog();
 
-    void setHistory(History *left, History *right);
+    void setHistory(const History *left, const History *right);
     void setDefaultLeft(bool bLeft);
 
     int selectedIndex() const;
@@ -25,9 +25,9 @@ public:
 
 private:
     Ui::HistoryDialog *ui;
-    History *m_leftHistory;
-    History *m_rightHistory;
-    History *m_displaying;
+    const History *m_leftHistory;
+    const History *m_rightHistory;
+    const History *m_displaying;
 
 private slots:
     void showLeftHistory();
index bbd0550..bd46ffa 100644 (file)
@@ -1,6 +1,31 @@
+#include "common.h"
 #include "locationbox.h"
 
+#include <QDebug>
+#include <QSettings>
+
 LocationBox::LocationBox(QWidget *parent) :
     QLineEdit(parent)
 {
 }
+
+void LocationBox::initialize()
+{
+    qDebug() << "LocationBox::initialize";
+
+    updateAppearance();
+}
+
+void LocationBox::updateAppearance()
+{
+    qDebug() << "LocationBox::updateAppearance";
+
+    QSettings settings;
+
+    QPalette pal = palette();
+    pal.setColor(QPalette::Base, settings.value(IniKey_BoxColorBg).value<QColor>());
+    pal.setColor(QPalette::Text, settings.value(IniKey_BoxColorFg).value<QColor>());
+    setPalette(pal);
+
+    setFont(settings.value(IniKey_BoxFont).value<QFont>());
+}
index 0cd5449..6463311 100644 (file)
@@ -9,6 +9,9 @@ class LocationBox : public QLineEdit
 public:
     explicit LocationBox(QWidget *parent = 0);
 
+    void initialize();
+    void updateAppearance();
+
 signals:
 
 public slots:
index e8d9796..1465830 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -32,14 +32,11 @@ int main(int argc, char *argv[])
 \r
     // 各オプションのデフォルト値を設定する\r
     //>>>>> 起動と終了\r
-    if (settings.value(IniKey_ConfirmExit, "").toString().isEmpty())\r
+    if (settings.value(IniKey_ConfirmExit, "").toString().isEmpty()) {\r
         settings.setValue(IniKey_ConfirmExit, true);\r
-    if (settings.value(IniKey_BootSizeAbs, "").toString().isEmpty()) {\r
         settings.setValue(IniKey_BootSizeSpec, "sizeRelative");\r
         settings.setValue(IniKey_BootSizeAbs, QSize(800,600));\r
         settings.setValue(IniKey_BootSizeRel, QSize(75,75));\r
-    }\r
-    if (settings.value(IniKey_BootPosAbs, "").toString().isEmpty()) {\r
         settings.setValue(IniKey_BootPosSpec, "posCenter");\r
         settings.setValue(IniKey_BootPosAbs, QPoint(0, 0));\r
         settings.setValue(IniKey_BootPosRel, QPoint(0, 0));\r
index 8febeeb..d2c121f 100644 (file)
@@ -1,8 +1,19 @@
 #include "common.h"\r
 #include "mainwindow.h"\r
 #include "preferencedialog.h"\r
-#include "filetableview.h"\r
+#include "folderview.h"\r
+#include "searchbox.h"\r
+#include "locationbox.h"\r
 #include "ui_mainwindow.h"\r
+#include "copymoveworker.h"\r
+#include "operationdialog.h"\r
+#include "overwritedialog.h"\r
+#include "deleteworker.h"\r
+#include "renameworker.h"\r
+#include "renamesingledialog.h"\r
+#include "renamemultidialog.h"\r
+#include "historydialog.h"\r
+#include "sortdialog.h"\r
 \r
 #include <QCheckBox>\r
 #include <QCloseEvent>\r
 #include <QSettings>\r
 #include <QNetworkAccessManager>\r
 #include <QNetworkReply>\r
+#include <QInputDialog>\r
+#include <QProcess>\r
+#include <QDesktopServices>\r
+#include <QClipboard>\r
+#include <QFileDialog>\r
+\r
+MainWindow* getMainWnd()\r
+{\r
+    foreach (QWidget *w, qApp->topLevelWidgets()) {\r
+        if (w->objectName() == "MainWindow") {\r
+            return static_cast<MainWindow*>(w);\r
+        }\r
+    }\r
+    qDebug() << "MainWindow not found !?";\r
+    return NULL;\r
+}\r
 \r
 MainWindow::MainWindow(QWidget *parent) :\r
     QMainWindow(parent),\r
     ui(new Ui::MainWindow),\r
-    m_focusedView(NULL)\r
+    m_focusedView(NULL),\r
+    m_overwriteDialog(NULL)\r
 {\r
     ui->setupUi(this);\r
-    ui->RPanel->setSide("Right");\r
-    ui->LPanel->setSide("Left");\r
-    ui->LPanel->updateAppearance();\r
-    ui->RPanel->updateAppearance();\r
 \r
-    QSettings settings;\r
-    // メニュー項目の状態を初期化する\r
-    if (settings.value(IniKey_ShowHidden).toBool()) {\r
-        ui->view_Hidden->setChecked(true);\r
-    }\r
-    if (settings.value(IniKey_ShowSystem).toBool()) {\r
-        ui->view_System->setChecked(true);\r
+    m_overwriteDialog = new OverWriteDialog(this);\r
+\r
+    initActionConnections();\r
+    connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(focusChange(QWidget*,QWidget*)));\r
+    connect(ui->textView, SIGNAL(viewFinished(QWidget*)), this, SLOT(viewFinish(QWidget*)));\r
+\r
+    // テキストビューアは初期状態で非表示\r
+    ui->textView->setVisible(false);\r
+\r
+    for (int i = 1; i <= 2; i++) {\r
+        LocationBox *locationBox = findChild<LocationBox*>(QString("locationBox%1").arg(i));\r
+        Q_CHECK_PTR(locationBox);\r
+\r
+        FolderView *folderView = findChild<FolderView*>(QString("folderView%1").arg(i));\r
+        Q_CHECK_PTR(folderView);\r
+\r
+        SearchBox *searchBox = findChild<SearchBox*>(QString("searchBox%1").arg(i));\r
+        Q_CHECK_PTR(searchBox);\r
+\r
+        // シグナル&スロット\r
+        connect(folderView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(open(QModelIndex)));\r
+        connect(folderView, SIGNAL(itemFound(FolderView*)), this, SLOT(itemFound(FolderView*)));\r
+        connect(folderView, SIGNAL(itemNotFound(FolderView*)), this, SLOT(itemNotFound(FolderView*)));\r
+        connect(folderView, SIGNAL(keyPressed(FolderView*,QKeyEvent*)), this, SLOT(keyPress(FolderView*,QKeyEvent*)));\r
+        connect(folderView, SIGNAL(retrieveFinished()), this, SLOT(retrieveFinish()));\r
+        connect(folderView, SIGNAL(retrieveStarted(QString)), this, SLOT(retrieveStart(QString)));\r
+        connect(searchBox, SIGNAL(textEdited(QString)), this, SLOT(searchItem(QString)));\r
+        connect(searchBox, SIGNAL(returnPressed()), this, SLOT(returnPressInSearchBox()));\r
+\r
+        // 検索ボックスは初期状態で非表示\r
+        searchBox->setVisible(false);\r
+\r
+        // ロケーションボックスを初期化する\r
+        locationBox->initialize();\r
+\r
+        // フィルタを初期化する\r
+        setNameFilters(folderView);\r
+\r
+        // ソートを初期化する\r
+        setSorting(folderView);\r
+\r
+        // フォルダビューを初期化する\r
+        folderView->initialize();\r
+\r
+        folderView->repaint();\r
     }\r
-    bool enabled;\r
-    enabled = !settings.value(IniKey_EditorPath).toString().isEmpty();\r
-    ui->action_OpenEditor->setEnabled(enabled);\r
 \r
-    enabled = !settings.value(IniKey_TerminalPath).toString().isEmpty();\r
-    ui->action_OpenTerminal->setEnabled(enabled);\r
+    QSettings settings;\r
+    // メニュー項目の状態を初期化する\r
+    ui->view_Hidden->setChecked(settings.value(IniKey_ShowHidden).toBool());\r
+    ui->view_System->setChecked(settings.value(IniKey_ShowSystem).toBool());\r
+    ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());\r
+    ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());\r
 \r
     // 追加のショートカットキーを設定する\r
     QList<QKeySequence> shortcuts;\r
@@ -49,6 +112,7 @@ MainWindow::MainWindow(QWidget *parent) :
     shortcuts.append(QKeySequence("Shift+M"));\r
     ui->action_Exec->setShortcuts(shortcuts);\r
 \r
+    // MacだとShift+の形で認識されてしまうもの\r
     shortcuts = ui->view_Filter->shortcuts();\r
     shortcuts.append(QKeySequence("Shift+*"));  // マヂで!?\r
     ui->view_Filter->setShortcuts(shortcuts);\r
@@ -61,23 +125,16 @@ MainWindow::MainWindow(QWidget *parent) :
     shortcuts.append(QKeySequence("Shift+?"));  // マヂで!?\r
     ui->help_About->setShortcuts(shortcuts);\r
 \r
-    // シグナル/スロットを設定する\r
-    connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));\r
-    connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));\r
-    connect(ui->help_About, SIGNAL(triggered()), this, SLOT(about()));\r
-    connect(ui->view_Hidden, SIGNAL(triggered()), this, SLOT(toggleShowHiddenFiles()));\r
-    connect(ui->view_System, SIGNAL(triggered()), this, SLOT(toggleShowSystemFiles()));\r
-    connect(ui->check_Update, SIGNAL(triggered()), this, SLOT(checkUpdate()));\r
-    connect(ui->plainTextEdit, SIGNAL(viewFinished(QWidget*)), this, SLOT(viewFinish(QWidget*)));\r
-\r
     // ウィンドウタイトルを設定する\r
     setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));\r
+\r
     // ウィンドウアイコンを設定する\r
-#if defined(Q_OS_MAC) || defined(Q_OS_MAC64) || defined(Q_OS_MACX)\r
+#if defined(Q_OS_MAC)\r
     setWindowIcon(QIcon(":/images/Gefu.icns"));\r
 #else\r
     setWindowIcon(QIcon(":/images/Gefu.png"));\r
 #endif\r
+\r
     //>>>>> ウィンドウサイズと位置を設定する\r
     QString strValue;\r
     QPoint point = this->geometry().topLeft();\r
@@ -124,9 +181,6 @@ MainWindow::MainWindow(QWidget *parent) :
     if (settings.value(IniKey_CheckUpdates).toBool()) {\r
         checkUpdate(true);\r
     }\r
-\r
-//    ui->splitter->setVisible(false);\r
-    ui->plainTextEdit->setVisible(false);\r
 }\r
 \r
 MainWindow::~MainWindow()\r
@@ -134,220 +188,1282 @@ MainWindow::~MainWindow()
     delete ui;\r
 }\r
 \r
-FileTableView *MainWindow::otherSideView(const FileTableView *view) const\r
+FolderView* MainWindow::otherSideView(const FolderView *view) const\r
 {\r
-    QWidget *w = view->parentWidget();\r
-    if (ui->LPanel == w) {\r
-        return ui->RPanel->findChild<FileTableView*>("fileTable");\r
-    }\r
-    else if (ui->RPanel == w) {\r
-        return ui->LPanel->findChild<FileTableView*>("fileTable");\r
+    qDebug() << "MainWindow::otherSideView()" << view->objectName();\r
+\r
+    if (view == ui->folderView1) {\r
+        return ui->folderView2;\r
     }\r
 \r
-    qDebug() << w->objectName();\r
-    return NULL;\r
+    Q_ASSERT(view == ui->folderView2);\r
+    return ui->folderView1;\r
 }\r
 \r
-void MainWindow::openRequest(const QFileInfo &info)\r
+void MainWindow::focusChange(QWidget *old, QWidget *now)\r
 {\r
-    m_focusedView = QApplication::focusWidget();\r
+    Q_UNUSED(old);\r
+    Q_UNUSED(now);\r
+    qDebug() << "MainWindow::focusChange";\r
 \r
-    setUpdatesEnabled(false);\r
+    updateActions();\r
+}\r
 \r
-    foreach (QObject *obj, this->children()) {\r
-        QAction *action = qobject_cast<QAction*>(obj);\r
-        if (action) {\r
-            if (action->objectName() == "help_About" ||\r
-                action->objectName() == "check_Update" ||\r
-                action->objectName() == "copy_Fullpath" ||\r
-                action->objectName() == "copy_Filename" ||\r
-                action->objectName() == "action_Quit" ||\r
-                action->objectName() == "action_Setting")\r
-            {\r
-                continue;\r
-            }\r
-            qDebug() << action->objectName();\r
-            action->setEnabled(false);\r
+void MainWindow::executeCommand()\r
+{\r
+    qDebug() << "MainWindow::executeCommand";\r
+\r
+    FolderView *v = folderView();\r
+    Q_ASSERT(v);\r
+\r
+    QFileInfoList list = v->selectedItems();\r
+    QString command = QString::null;\r
+    foreach (const QFileInfo &info, list) {\r
+#ifdef Q_OS_MAC\r
+        QString path = info.absoluteFilePath();\r
+#else\r
+        QString path = info.fileName();\r
+#endif\r
+        if (info.isExecutable()) {\r
+            command = QQ(path) + " " + command;\r
+        }\r
+        else {\r
+            command += " " + QQ(path);\r
         }\r
     }\r
 \r
-    ui->menu_File->setVisible(false);\r
-    ui->splitter->setVisible(false);\r
-    ui->plainTextEdit->setVisible(true);\r
-    ui->plainTextEdit->setFocus();\r
-\r
-    setUpdatesEnabled(true);\r
+    QInputDialog dlg(this);\r
+    dlg.setInputMode(QInputDialog::TextInput);\r
+    dlg.setWindowTitle(tr("コマンドを実行"));\r
+    dlg.setLabelText(tr("コマンド:"));\r
+    dlg.setTextValue(command);\r
+    dlg.resize(width() * 0.8, dlg.height());\r
 \r
-    QFile file(info.absoluteFilePath());\r
-    if (file.open(QIODevice::ReadOnly)) {\r
-        ui->plainTextEdit->setSource(file.readAll());\r
+    int ret = dlg.exec();\r
+    command = dlg.textValue();\r
+    if (ret == QDialog::Accepted && !command.isEmpty()) {\r
+        startProcess(command, v->dir(), tr("コマンドの実行に失敗しました。"));\r
     }\r
 }\r
 \r
-void MainWindow::showPreferenceDialog()\r
+void MainWindow::historyBack()\r
 {\r
-    PreferenceDialog dlg(this);\r
+    qDebug() << "MainWindow::historyBack();";\r
 \r
-    if (dlg.exec() == QDialog::Accepted) {\r
-        ui->LPanel->updateAppearance();\r
-        ui->RPanel->updateAppearance();\r
+    if (folderView()->historyBack()) {\r
+        updateActions();\r
+    }\r
+}\r
 \r
-        QSettings settings;\r
-        bool enabled;\r
-        enabled = !settings.value(IniKey_EditorPath).toString().isEmpty();\r
-        ui->action_OpenEditor->setEnabled(enabled);\r
+void MainWindow::historyForward()\r
+{\r
+    qDebug() << "MainWindow::historyForward();";\r
 \r
-        enabled = !settings.value(IniKey_TerminalPath).toString().isEmpty();\r
-        ui->action_OpenTerminal->setEnabled(enabled);\r
+    if (folderView()->historyForward()) {\r
+        updateActions();\r
     }\r
 }\r
 \r
-void MainWindow::toggleShowHiddenFiles()\r
+void MainWindow::itemFound(FolderView *view)\r
 {\r
-    // キーボードがトリガーの場合、メニュー項目のチェック状態は\r
-    // 変わらない(Mac)ので、QSettingsを使う\r
-    QSettings settings;\r
-    bool show = !settings.value(IniKey_ShowHidden).toBool();\r
-    settings.setValue(IniKey_ShowHidden, show);\r
+    qDebug() << "MainWindow::itemFound";\r
 \r
-    ui->view_Hidden->setChecked(show);\r
+    SearchBox *box = searchBox(view);\r
+    QPalette pal = box->palette();\r
+    pal.setColor(QPalette::Text, QPalette().text().color());\r
+    box->setPalette(pal);\r
+}\r
+\r
+void MainWindow::itemNotFound(FolderView *view)\r
+{\r
+    qDebug() << "MainWindow::itemNotFound";\r
 \r
-    emit showHiddenFiles(show);\r
+    SearchBox *box = searchBox(view);\r
+    QPalette pal = box->palette();\r
+    pal.setColor(QPalette::Text, Qt::red);\r
+    box->setPalette(pal);\r
 }\r
 \r
-void MainWindow::toggleShowSystemFiles()\r
+void MainWindow::markAll()\r
 {\r
-    // キーボードがトリガーの場合、メニュー項目のチェック状態は\r
-    // 変わらない(Mac)ので、QSettingsを使う\r
-    QSettings settings;\r
-    bool show = !settings.value(IniKey_ShowSystem).toBool();\r
-    settings.setValue(IniKey_ShowSystem, show);\r
+    qDebug() << "MainWindow::markAll();";\r
 \r
-    ui->view_System->setChecked(show);\r
+    folderView()->setCheckStateAll(true);\r
+}\r
+\r
+void MainWindow::markAllFiles()\r
+{\r
+    qDebug() << "MainWindow::markAllFiles();";\r
 \r
-    emit showSystemFiles(show);\r
+    folderView()->setCheckStateAllFiles();\r
 }\r
 \r
-void MainWindow::checkUpdate(bool silent)\r
+void MainWindow::markAllOff()\r
 {\r
-    QNetworkAccessManager *manager = new QNetworkAccessManager(this);\r
+    qDebug() << "MainWindow::markAllOff();";\r
 \r
-    if (silent) {\r
-        connect(manager, SIGNAL(finished(QNetworkReply*)),\r
-                this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));\r
-    }\r
-    else {\r
-        connect(manager, SIGNAL(finished(QNetworkReply*)),\r
-                this, SLOT(checkUpdateFinished(QNetworkReply*)));\r
-    }\r
-#ifdef Q_OS_WIN\r
-    manager->get(QNetworkRequest(QUrl("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_win.html")));\r
-#elif defined(Q_OS_MAC)\r
-    manager->get(QNetworkRequest(QUrl("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_mac.html")));\r
-#endif\r
+    folderView()->setCheckStateAll(false);\r
 }\r
 \r
-void MainWindow::checkUpdateFinished(QNetworkReply *reply)\r
+void MainWindow::markInvert()\r
 {\r
-    checkUpdateFinished(reply, false);\r
+    qDebug() << "MainWindow::markInvert();";\r
+\r
+    folderView()->invertCheckState();\r
 }\r
 \r
-void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)\r
+void MainWindow::markToggle()\r
 {\r
-    if (reply->error() == QNetworkReply::NoError) {\r
-        QString str = reply->readAll();\r
-        str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);\r
-        QRegExp rx("Gefu([0-9]+)");\r
-        rx.indexIn(str);\r
-        QString version = rx.cap(1);\r
-        if (version.toInt() > VERSION_VALUE * 100) {\r
-            QMessageBox::information(\r
-                        this, tr("情報"),\r
-                        tr("最新のバージョンが存在します。<br/>") +\r
-                        tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));\r
+    qDebug() << "MainWindow::markToggle();";\r
+\r
+    folderView()->toggleCheckState(folderView()->currentIndex());\r
+}\r
+\r
+void MainWindow::moveItems()\r
+{\r
+    qDebug() << "MainWindow::moveItems";\r
+\r
+    FolderView *v = folderView();\r
+    QFileInfoList list = v->selectedItems();\r
+    if (list.isEmpty()) {\r
+        return;\r
+    }\r
+\r
+    QSettings settings;\r
+    if (settings.value(IniKey_ConfirmCopy).toBool()) {\r
+        if (QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))\r
+            != QMessageBox::Yes)\r
+        {\r
+            return;\r
         }\r
-        else if (!silent) {\r
-            QMessageBox::information(\r
-                        this, tr("情報"),\r
-                        tr("お使いのバージョンは最新です。"));\r
+    }\r
+\r
+    // 上書き確認ダイアログを初期化する\r
+    m_overwriteDialog->reset();\r
+\r
+    // ワーカースレッドを作成する\r
+    FolderView *other = otherSideView(v);\r
+    CopyMoveWorker *worker = new CopyMoveWorker();\r
+    connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
+            this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
+    worker->setCopyList(&list);\r
+    worker->setTargetDir(other->dir());\r
+    worker->setMoveMode(true);\r
+\r
+    // 進捗ダイアログを表示して、処理を開始する\r
+    OperationDialog opDlg(this);\r
+    opDlg.setWindowTitle(tr("移動"));\r
+    opDlg.setWorker(worker);\r
+    opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());\r
+\r
+    opDlg.exec();\r
+\r
+    settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());\r
+\r
+    // 念のため、リフレッシュ\r
+    ui->folderView1->refresh();\r
+    ui->folderView2->refresh();\r
+}\r
+\r
+void MainWindow::keyPress(FolderView *view, QKeyEvent *event)\r
+{\r
+    QString ksq = KeyEventToSequence(event);\r
+    if (ksq == "") {\r
+        event->ignore();\r
+        return;\r
+    }\r
+\r
+    qDebug() << "MainWindow::keyPress" << ksq;\r
+\r
+    foreach (QObject *obj, children()) {\r
+        QAction *action = qobject_cast<QAction*>(obj);\r
+        if (!action) {\r
+            continue;\r
+        }\r
+\r
+        foreach (const QKeySequence &k, action->shortcuts()) {\r
+            if (ksq == k.toString()) {\r
+                if (action->isEnabled()) {\r
+                    if (action->isCheckable()) {\r
+                        action->setChecked(!action->isChecked());\r
+                    }\r
+                    else {\r
+                        emit action->triggered();\r
+                    }\r
+                    qDebug() << "emit" << action->objectName();\r
+                }\r
+                event->accept();\r
+                return;\r
+            }\r
         }\r
     }\r
-    else if (!silent){\r
-        QMessageBox::critical(\r
-                    this, tr("エラー"),\r
-                    tr("最新バージョンのチェックに失敗しました。<br/>") +\r
-                    reply->errorString());\r
+\r
+    if (ksq == "Left" || ksq == "Right") {\r
+        if (view->side() == ksq) {\r
+        }\r
+        else {\r
+            otherSideView(view)->setFocus();\r
+        }\r
+        event->accept();\r
+        return;\r
     }\r
+\r
+    event->ignore();\r
 }\r
 \r
-void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)\r
+void MainWindow::returnPressInSearchBox()\r
 {\r
-    checkUpdateFinished(reply, true);\r
+    qDebug() << "MainWindow::returnPressInSearchBox";\r
+\r
+    if (QApplication::keyboardModifiers() & Qt::ShiftModifier) {\r
+        emit ui->action_SearchPrev->triggered();\r
+    }\r
+    else {\r
+        emit ui->action_SearchNext->triggered();\r
+    }\r
 }\r
 \r
-void MainWindow::viewFinish(QWidget *sender)\r
+void MainWindow::chooseFolder()\r
 {\r
-    setUpdatesEnabled(false);\r
+    qDebug() << "MainWindow::chooseFolder();";\r
 \r
-    foreach (QObject *obj, this->children()) {\r
-        QAction *action = qobject_cast<QAction*>(obj);\r
-        if (action) {\r
-            action->setEnabled(true);\r
-        }\r
+    QString path = QFileDialog::getExistingDirectory(\r
+                this, tr("フォルダを選択"), folderView()->dir());\r
+    if (!path.isEmpty()) {\r
+        folderView()->setPath(path, true);\r
+        updateActions();\r
     }\r
+}\r
 \r
-    sender->setVisible(false);\r
-    ui->splitter->setVisible(true);\r
-    m_focusedView->setFocus();\r
+void MainWindow::copyFilenameToClipboard()\r
+{\r
+    qDebug() << "MainWindow::copyFilenameToClipboard();";\r
 \r
-    setUpdatesEnabled(true);\r
+    QClipboard *clipboard = QApplication::clipboard();\r
+    clipboard->setText(folderView()->currentItem().fileName());\r
 }\r
 \r
-void MainWindow::about()\r
+void MainWindow::copyFullpathTpClipboard()\r
 {\r
-    QMessageBox::about(\r
-                this,\r
-                tr("げふぅ について"),\r
-                tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +\r
-                tr("<center>Gefu is an Experimental File Utility.<br/>"\r
-                   "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"\r
-                   "<p>最新版の情報は<a href='http://miyabi.rakusaba.jp'>喫茶[雅]</a>で公開しています。</p>"\r
-                   "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));\r
+    qDebug() << "MainWindow::copyFullpathTpClipboard();";\r
+\r
+    QClipboard *clipboard = QApplication::clipboard();\r
+    clipboard->setText(folderView()->currentItem().absoluteFilePath());\r
 }\r
 \r
-MainWindow* getMainWnd()\r
+void MainWindow::askOverWrite(QString *copyMethod,\r
+                              QString *alias,\r
+                              const QString &srcPath,\r
+                              const QString &tgtPath)\r
 {\r
-    foreach (QWidget *w, qApp->topLevelWidgets()) {\r
-        if (w->objectName() == "MainWindow") {\r
-            return static_cast<MainWindow*>(w);\r
+    qDebug() << "MainWindow::askOverWrite();";\r
+\r
+    CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());\r
+    if (!m_overwriteDialog->isKeepSetting() ||\r
+        m_overwriteDialog->copyMethod() == "rbRename")\r
+    {\r
+        m_overwriteDialog->setFileInfo(srcPath, tgtPath);\r
+        if (m_overwriteDialog->exec() == QDialog::Rejected) {\r
+            worker->requestStop();\r
         }\r
     }\r
-    qDebug() << "MainWindow not found !?";\r
-    return NULL;\r
-}\r
+    *copyMethod = m_overwriteDialog->copyMethod();\r
+    *alias = m_overwriteDialog->alias();\r
 \r
+    worker->endAsking();\r
+}\r
 \r
-void MainWindow::closeEvent(QCloseEvent *event)\r
+void MainWindow::copyItems()\r
 {\r
+    qDebug() << "MainWindow::copyItems";\r
+\r
+    FolderView *v = folderView();\r
+    QFileInfoList list = v->selectedItems();\r
+    if (list.isEmpty()) {\r
+        return;\r
+    }\r
+\r
     QSettings settings;\r
+    if (settings.value(IniKey_ConfirmCopy).toBool()) {\r
+        if (QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))\r
+            != QMessageBox::Yes)\r
+        {\r
+            return;\r
+        }\r
+    }\r
 \r
-    if (settings.value(IniKey_ConfirmExit).toBool()) {\r
-        QMessageBox msgBox;\r
-        QCheckBox *checkBox = new QCheckBox();\r
-        checkBox->setText(tr("次回以降は確認しない"));\r
-        msgBox.setCheckBox(checkBox);\r
-        msgBox.setText(tr("終了しますか?"));\r
-        msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);\r
-        msgBox.setIcon(QMessageBox::Question);\r
+    // 上書き確認ダイアログを初期化する\r
+    m_overwriteDialog->reset();\r
 \r
-        if (msgBox.exec() == QMessageBox::No) {\r
-            event->ignore();\r
+    // ワーカースレッドを作成する\r
+    FolderView *other = otherSideView(v);\r
+    CopyMoveWorker *worker = new CopyMoveWorker();\r
+    connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
+            this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
+    worker->setCopyList(&list);\r
+    worker->setTargetDir(other->dir());\r
+    worker->setMoveMode(false);\r
+\r
+    // 進捗ダイアログを表示して、処理を開始する\r
+    OperationDialog opDlg(this);\r
+    opDlg.setWindowTitle(tr("コピー"));\r
+    opDlg.setWorker(worker);\r
+    opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());\r
+\r
+    opDlg.exec();\r
+\r
+    settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());\r
+\r
+    // 念のため、リフレッシュ\r
+    ui->folderView1->refresh();\r
+    ui->folderView2->refresh();\r
+}\r
+\r
+void MainWindow::createFile()\r
+{\r
+    qDebug() << "MainWindow::createFile";\r
+\r
+    bool bOk;\r
+    QString name = QInputDialog::getText(\r
+                this, tr("ファイルを作成"), tr("ファイル名:"),\r
+                QLineEdit::Normal, "", &bOk);\r
+    if (!bOk || name.isEmpty()) {\r
+        return;\r
+    }\r
+\r
+    QDir dir(folderView()->dir());\r
+    QFile file(dir.absoluteFilePath(name));\r
+    if (!file.open(QIODevice::WriteOnly)) {\r
+        QMessageBox::critical(\r
+                    this, tr("エラー"),\r
+                    tr("ファイルの作成に失敗しました。"));\r
+    }\r
+    else {\r
+        file.close();\r
+\r
+        QSettings settings;\r
+        if (settings.value(IniKey_OpenAfterCreateFile).toBool()) {\r
+            openEditor(dir.absoluteFilePath(name));\r
+        }\r
+    }\r
+}\r
+\r
+void MainWindow::createFolder()\r
+{\r
+    qDebug() << "MainWindow::createFolder";\r
+\r
+    bool bOk;\r
+    QString name = QInputDialog::getText(\r
+                this, tr("フォルダを作成"), tr("フォルダ名:"),\r
+                QLineEdit::Normal, "", &bOk);\r
+    if (!bOk || name.isEmpty()) {\r
+        return;\r
+    }\r
+\r
+    QDir dir(folderView()->dir());\r
+    if (!dir.mkpath(name)) {\r
+        QMessageBox::critical(\r
+                    this, tr("エラー"),\r
+                    tr("フォルダの作成に失敗しました。"));\r
+    }\r
+    else {\r
+        QSettings settings;\r
+        if (settings.value(IniKey_MoveAfterCreateFolder).toBool()) {\r
+            folderView()->setPath(dir.absoluteFilePath(name), true);\r
+            updateActions();\r
+        }\r
+    }\r
+}\r
+\r
+void MainWindow::deleteItems()\r
+{\r
+    qDebug() << "MainWindow::deleteItems";\r
+\r
+    FolderView *v = folderView();\r
+    QFileInfoList list = v->selectedItems();\r
+    if (list.isEmpty()) {\r
+        return;\r
+    }\r
+\r
+    QSettings settings;\r
+    if (settings.value(IniKey_ConfirmDelete).toBool()) {\r
+        QString msg;\r
+        if (list.size() == 1) {\r
+            msg = list[0].fileName();\r
+        }\r
+        else {\r
+            msg = tr("%1個のアイテム").arg(list.size());\r
+        }\r
+        int ret = QMessageBox::question(\r
+                    this, tr("確認"),\r
+                    msg + tr("を削除しますか?"));\r
+        if (ret != QMessageBox::Yes) {\r
             return;\r
         }\r
-        settings.setValue(IniKey_ConfirmExit, !checkBox->isChecked());\r
     }\r
 \r
-    settings.setValue(IniKey_WindowGeometry, saveGeometry());\r
-    settings.setValue(iniKey_WindowState, saveState());\r
-    QMainWindow::closeEvent(event);\r
+    DeleteWorker *worker = new DeleteWorker();\r
+    worker->setDeleteList(&list);\r
+\r
+    OperationDialog opDlg(this);\r
+    opDlg.setWindowTitle(tr("削除"));\r
+    opDlg.setWorker(worker);\r
+    opDlg.setAutoClose(settings.value(IniKey_AutoCloseDelete).toBool());\r
+\r
+    opDlg.exec();\r
+\r
+    settings.setValue(IniKey_AutoCloseDelete, opDlg.autoClose());\r
+\r
+    // 念のため、リフレッシュ\r
+    ui->folderView1->refresh();\r
+    ui->folderView2->refresh();\r
+}\r
+\r
+void MainWindow::open(const QModelIndex &index)\r
+{\r
+    Q_UNUSED(index);\r
+    qDebug() << "MainWindow::open";\r
+\r
+    FolderView *v = folderView();\r
+    Q_ASSERT(v);\r
+\r
+    QFileInfo info = v->currentItem();\r
+    if (info.isDir()) {\r
+        v->setPath(info.absoluteFilePath(), true);\r
+        updateActions();\r
+        return;\r
+    }\r
+\r
+    QSettings settings;\r
+    if (!settings.value(IniKey_ViewerForceOpen).toBool()) {\r
+        QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");\r
+        foreach (const QString &ext, list) {\r
+            if (ext.toLower() == info.suffix().toLower()) {\r
+                shellExecute();\r
+                return;\r
+            }\r
+        }\r
+    }\r
+\r
+    setUpdatesEnabled(false);\r
+\r
+    foreach (QObject *obj, this->children()) {\r
+        QAction *action = qobject_cast<QAction*>(obj);\r
+        if (action) {\r
+            if (action->objectName() == "help_About" ||\r
+                action->objectName() == "check_Update" ||\r
+                action->objectName() == "copy_Fullpath" ||\r
+                action->objectName() == "copy_Filename" ||\r
+                action->objectName() == "action_Quit" ||\r
+                action->objectName() == "action_Setting")\r
+            {\r
+                continue;\r
+            }\r
+            action->setEnabled(false);\r
+        }\r
+    }\r
+\r
+    m_focusedView = folderView();\r
+    ui->splitter->setVisible(false);\r
+    ui->textView->setVisible(true);\r
+    ui->textView->setFocus();\r
+\r
+    setUpdatesEnabled(true);\r
+\r
+    QFile file(info.absoluteFilePath());\r
+    if (file.open(QIODevice::ReadOnly)) {\r
+        ui->textView->setSource(file.readAll());\r
+    }\r
+}\r
+\r
+void MainWindow::openEditor(const QString &path)\r
+{\r
+    qDebug() << "MainWindow::openEditor";\r
+\r
+    QSettings settings;\r
+    QString exe = settings.value(IniKey_EditorPath).toString();\r
+    if (exe.isEmpty()) {\r
+        QMessageBox::critical(\r
+                    this, tr("エラー"),\r
+                    tr("外部エディタのパスが未定義です。"));\r
+        return;\r
+    }\r
+\r
+    FolderView *v = folderView();\r
+    Q_ASSERT(v);\r
+\r
+    QFileInfoList list;\r
+    if (path.isEmpty()) {\r
+        list = v->selectedItems();\r
+    }\r
+    else {\r
+        list << path;\r
+    }\r
+\r
+    foreach (const QFileInfo &info, list) {\r
+        QString opt = settings.value(IniKey_EditorOption).toString();\r
+        replaceVars(opt, info);\r
+\r
+#ifdef Q_OS_MAC\r
+        QString command = "open -a " + exe + " " + opt;\r
+#else\r
+        QString command = QQ(exe) + " " + opt;\r
+#endif\r
+        if (!startProcess(command, info.absolutePath(), tr("外部エディタの起動に失敗しました。"))) {\r
+            break;\r
+        }\r
+    }\r
+}\r
+\r
+void MainWindow::openTerminal()\r
+{\r
+    qDebug() << "MainWindow::openTerminal";\r
+\r
+    QSettings settings;\r
+    QString exe = settings.value(IniKey_TerminalPath).toString();\r
+    if (exe.isEmpty()) {\r
+        QMessageBox::critical(\r
+                    this, tr("エラー"),\r
+                    tr("ターミナルのパスが未定義です。"));\r
+        return;\r
+    }\r
+\r
+    FolderView *v = folderView();\r
+    Q_ASSERT(v);\r
+\r
+    foreach (const QFileInfo &info, v->selectedItems()) {\r
+        QString opt = settings.value(IniKey_TerminalOption).toString();\r
+        replaceVars(opt, info);\r
+\r
+#ifdef Q_OS_MAC\r
+        QString command = "open -a " + QQ(exe) + " --args " + opt;\r
+#else\r
+        QString command = QQ(exe) + " " + opt;\r
+#endif\r
+        if (!startProcess(command, info.absolutePath(), tr("ターミナルの起動に失敗しました。"))) {\r
+            break;\r
+        }\r
+    }\r
+}\r
+\r
+void MainWindow::refresh()\r
+{\r
+    qDebug() << "MainWindow::refresh();";\r
+\r
+    folderView()->refresh();\r
+    updateActions();\r
+}\r
+\r
+void MainWindow::renameItems()\r
+{\r
+    qDebug() << "MainWindow::renameItems";\r
+\r
+    FolderView *v = folderView();\r
+\r
+    QFileInfoList list = v->selectedItems();\r
+    if (list.isEmpty()) {\r
+        return;\r
+    }\r
+\r
+    IRenameDialog *dlg;\r
+    if (list.size() == 1) {\r
+        dlg = new RenameSingleDialog(this);\r
+    }\r
+    else {\r
+        dlg = new RenameMultiDialog(this);\r
+    }\r
+    dlg->setWorkingDirectory(v->dir());\r
+    dlg->setNames(list);\r
+    int dlgResult = dlg->exec();\r
+    if (dlgResult != QDialog::Accepted || dlg->renameMap().isEmpty()) {\r
+        return;\r
+    }\r
+\r
+    QSettings settings;\r
+    if (settings.value(IniKey_ConfirmRename).toBool()) {\r
+        int ret = QMessageBox::question(this, tr("確認"),\r
+                                        tr("名前の変更を実行しますか?"));\r
+        if (ret != QMessageBox::Yes) {\r
+            return;\r
+        }\r
+    }\r
+\r
+    RenameWorker *worker = new RenameWorker();\r
+    worker->setRenameMap(&dlg->renameMap());\r
+\r
+    OperationDialog opDlg(this);\r
+    opDlg.setWindowTitle(tr("名前を変更"));\r
+    opDlg.setWorker(worker);\r
+    opDlg.setAutoClose(settings.value(IniKey_AutoCloseRename).toBool());\r
+\r
+    opDlg.exec();\r
+\r
+    settings.setValue(IniKey_AutoCloseRename, opDlg.autoClose());\r
+}\r
+\r
+void MainWindow::retrieveFinish()\r
+{\r
+    qDebug() << "MainWindow::retrieveFinish();";\r
+\r
+    ui->statusBar->showMessage(tr("レディ"), 5000);\r
+}\r
+\r
+void MainWindow::retrieveStart(const QString &path)\r
+{\r
+    qDebug() << "MainWindow::retrieveStart();" << path;\r
+\r
+    ui->statusBar->showMessage(tr("ファイルリストを取得しています..."));\r
+    if (sender() == ui->folderView1) {\r
+        ui->locationBox1->setText(path);\r
+    }\r
+    else {\r
+        Q_ASSERT(sender() == ui->folderView2);\r
+        ui->locationBox2->setText(path);\r
+    }\r
+}\r
+\r
+void MainWindow::shellExecute()\r
+{\r
+    qDebug() << "MainWindow::shellExecute";\r
+\r
+    FolderView *v = folderView();\r
+    Q_ASSERT(v);\r
+\r
+    QFileInfoList list = v->selectedItems();\r
+    foreach (const QFileInfo &info, list) {\r
+        QString path = QDir::toNativeSeparators(info.absoluteFilePath());\r
+        QDesktopServices::openUrl(QUrl("file:///" + path));\r
+    }\r
+}\r
+\r
+void MainWindow::showFilterDialog()\r
+{\r
+    qDebug() << "MainWindow::showFilterDialog();";\r
+\r
+    QString filters = folderView()->nameFilters().join(" ");\r
+\r
+    QInputDialog dlg(this);\r
+    dlg.setInputMode(QInputDialog::TextInput);\r
+    dlg.setWindowTitle(tr("フィルタを設定"));\r
+    dlg.setLabelText(tr("フィルタ:"));\r
+    dlg.setTextValue(filters);\r
+    dlg.resize(width() * 0.8, dlg.height());\r
+\r
+    if (dlg.exec() == QDialog::Accepted) {\r
+        setNameFilters(folderView(), dlg.textValue());\r
+    }\r
+}\r
+\r
+void MainWindow::showHistoryDialog()\r
+{\r
+    qDebug() << "MainWindow::showHistoryDialog();";\r
+\r
+    FolderView *v = folderView();\r
+    FolderView *vOther = otherSideView(v);\r
+\r
+    HistoryDialog dlg(this);\r
+    if (v->side() == "Left") {\r
+        dlg.setDefaultLeft(true);\r
+        dlg.setHistory(v->history(), vOther->history());\r
+    }\r
+    else {\r
+        dlg.setDefaultLeft(false);\r
+        dlg.setHistory(vOther->history(), v->history());\r
+    }\r
+\r
+    if (dlg.exec() == QDialog::Accepted) {\r
+        if (v->side() == dlg.selectedSide()) {\r
+            v->setHistoryIndexAt(dlg.selectedIndex());\r
+        }\r
+        else {\r
+            v->setPath(vOther->history()->at(dlg.selectedIndex()), true);\r
+        }\r
+        updateActions();\r
+    }\r
+}\r
+\r
+void MainWindow::showSortDialog()\r
+{\r
+    qDebug() << "MainWindow::showSortDialog();";\r
+\r
+    SortDialog dlg(this);\r
+    dlg.setRightOrLeft(folderView()->side());\r
+\r
+    if (dlg.exec() != QDialog::Accepted) {\r
+        return;\r
+    }\r
+\r
+    setSorting(folderView());\r
+}\r
+\r
+void MainWindow::swapView()\r
+{\r
+    qDebug() << "MainWindow::swapView();";\r
+\r
+    QString dir1 = ui->folderView1->dir();\r
+    QString dir2 = ui->folderView2->dir();\r
+\r
+    ui->folderView1->setPath(dir2, true);\r
+    ui->folderView2->setPath(dir1, true);\r
+\r
+    updateActions();\r
+}\r
+\r
+void MainWindow::setSorting(FolderView *view)\r
+{\r
+    qDebug() << "MainWindow::setSorting();" << view->objectName();\r
+\r
+    QSettings settings;\r
+    QDir::SortFlags flags;\r
+\r
+    int sortBy = settings.value(view->side() + slash + IniKey_SortBy).toInt();\r
+    switch (sortBy) {\r
+    case SortByDate:    flags |= QDir::Time; break;\r
+    case SortBySize:    flags |= QDir::Size; break;\r
+    case SortByType:    flags |= QDir::Type; break;\r
+    default:            flags |= QDir::Name; break;\r
+    }\r
+\r
+    // デフォルトだと文字列は昇順で、数値は降順…orz\r
+    int orderBy = settings.value(view->side() + slash + IniKey_OrderBy).toInt();\r
+    if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
+        ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
+    {\r
+        flags |= QDir::Reversed;\r
+    }\r
+\r
+    switch (settings.value(view->side() + slash + IniKey_PutDirs).toInt()) {\r
+    case PutDirsFirst:  flags |= QDir::DirsFirst; break;\r
+    case PutDirsLast:   flags |= QDir::DirsLast; break;\r
+    }\r
+\r
+    if (settings.value(view->side() + slash + IniKey_IgnoreCase).toBool()) {\r
+        flags |= QDir::IgnoreCase;\r
+    }\r
+\r
+    view->setSorting(flags);\r
+}\r
+\r
+void MainWindow::searchItem(const QString &text)\r
+{\r
+    qDebug() << "MainWindow::searchItem" << text;\r
+\r
+    FolderView *v;\r
+    SearchBox *box;\r
+    if (ui->searchBox1->hasFocus()) {\r
+        v = ui->folderView1;\r
+        box = ui->searchBox1;\r
+    }\r
+    else {\r
+        Q_ASSERT(ui->searchBox2->hasFocus());\r
+        v = ui->folderView2;\r
+        box = ui->searchBox2;\r
+    }\r
+\r
+    if (text.right(1) == "/") {\r
+        box->setText(text.left(text.length() - 1));\r
+        ui->action_Search->setChecked(false);\r
+        return;\r
+    }\r
+\r
+    v->searchItem(box->text());\r
+}\r
+\r
+void MainWindow::searchNext()\r
+{\r
+    qDebug() << "MainWindow::searchNext";\r
+\r
+    FolderView *v = folderView();\r
+    SearchBox *box = searchBox(v);\r
+    v->searchNext(box->text());\r
+}\r
+\r
+void MainWindow::searchPrev()\r
+{\r
+    qDebug() << "MainWindow::searchPrev";\r
+\r
+    FolderView *v = folderView();\r
+    SearchBox *box = searchBox(v);\r
+    v->searchPrev(box->text());\r
+}\r
+\r
+void MainWindow::setCursorToBegin()\r
+{\r
+    qDebug() << "MainWindow::setCursorToBegin();";\r
+\r
+    FolderView *v = folderView();\r
+    int row = 0;\r
+    v->setCurrentIndex(v->model()->index(row, 0));\r
+}\r
+\r
+void MainWindow::cursorDown()\r
+{\r
+    qDebug() << "MainWindow::cursorDown();";\r
+\r
+    FolderView *v = folderView();\r
+    int row = v->currentIndex().row() + 1;\r
+    if (row < v->model()->rowCount()) {\r
+        v->setCurrentIndex(v->model()->index(row, 0));\r
+    }\r
+}\r
+\r
+void MainWindow::cursorUp()\r
+{\r
+    qDebug() << "MainWindow::cursorUp();";\r
+\r
+    FolderView *v = folderView();\r
+    int row = v->currentIndex().row() - 1;\r
+    if (row >= 0) {\r
+        v->setCurrentIndex(v->model()->index(row, 0));\r
+    }\r
+}\r
+\r
+void MainWindow::setCursorToEnd()\r
+{\r
+    qDebug() << "MainWindow::setCursorToEnd();";\r
+\r
+    FolderView *v = folderView();\r
+    int row = v->model()->rowCount() - 1;\r
+    v->setCurrentIndex(v->model()->index(row, 0));\r
+}\r
+\r
+void MainWindow::setPathFromOther()\r
+{\r
+    qDebug() << "MainWindow::setPathFromOther();";\r
+\r
+    FolderView *view = folderView();\r
+    FolderView *other = otherSideView(view);\r
+\r
+    view->setPath(other->dir(), true);\r
+    updateActions();\r
+}\r
+\r
+void MainWindow::setPathToHome()\r
+{\r
+    qDebug() << "MainWindow::setPathToHome();";\r
+\r
+    folderView()->setPath(QDir::homePath(), true);\r
+    updateActions();\r
+}\r
+\r
+void MainWindow::setPathToOther()\r
+{\r
+    qDebug() << "MainWindow::setPathToOther();";\r
+\r
+    FolderView *view = folderView();\r
+    FolderView *other = otherSideView(view);\r
+\r
+    other->setPath(view->dir(), true);\r
+    updateActions();\r
+}\r
+\r
+void MainWindow::setPathToParent()\r
+{\r
+    qDebug() << "MainWindow::setPathToParent();";\r
+\r
+    QDir dir(folderView()->dir());\r
+    if (!dir.isRoot()) {\r
+        dir.cdUp();\r
+        folderView()->setPath(dir.absolutePath(), true);\r
+        updateActions();\r
+    }\r
+}\r
+\r
+void MainWindow::setPathToRoot()\r
+{\r
+    qDebug() << "MainWindow::setPathToRoot();";\r
+\r
+    folderView()->setPath(QDir::rootPath(), true);\r
+    updateActions();\r
+}\r
+\r
+void MainWindow::toggleSearchBox(bool checked)\r
+{\r
+    qDebug() << "MainWindow::toggleSearchBox" << checked;\r
+\r
+    FolderView *v;\r
+    SearchBox *box;\r
+\r
+    if (checked) {\r
+        v = folderView();\r
+        if (v == ui->folderView1) {\r
+            box = ui->searchBox1;\r
+        }\r
+        else {\r
+            Q_ASSERT(v == ui->folderView2);\r
+            box = ui->searchBox2;\r
+        }\r
+\r
+        box->setVisible(true);\r
+        box->setFocus();\r
+        box->selectAll();\r
+    }\r
+    else {\r
+        if (ui->searchBox1->isVisible()) {\r
+            box = ui->searchBox1;\r
+            v = ui->folderView1;\r
+        }\r
+        else {\r
+            Q_ASSERT(ui->searchBox2->isVisible());\r
+            box = ui->searchBox2;\r
+            v = ui->folderView2;\r
+        }\r
+\r
+        if (box->hasFocus()) {\r
+            v->setFocus();\r
+        }\r
+        box->setVisible(false);\r
+    }\r
+}\r
+\r
+void MainWindow::openRequest(const QFileInfo &info)\r
+{\r
+    m_focusedView = QApplication::focusWidget();\r
+\r
+    QFile file(info.absoluteFilePath());\r
+    if (file.open(QIODevice::ReadOnly)) {\r
+        ui->splitter->setVisible(false);\r
+        ui->textView->setVisible(true);\r
+        ui->textView->setFocus();\r
+        ui->textView->setSource(file.readAll());\r
+    }\r
+    else {\r
+        QMessageBox::critical(\r
+                    this, tr("エラー"),\r
+                    tr("ファイルの読み込みに失敗しました。"));\r
+    }\r
+}\r
+\r
+void MainWindow::showPreferenceDialog()\r
+{\r
+    qDebug() << "MainWindow::showPreferenceDialog";\r
+\r
+    PreferenceDialog dlg(this);\r
+    if (dlg.exec() == QDialog::Accepted) {\r
+        ui->locationBox1->updateAppearance();\r
+        ui->locationBox2->updateAppearance();\r
+        ui->folderView1->updateAppearance();\r
+        ui->folderView2->updateAppearance();\r
+\r
+        updateActions();\r
+    }\r
+}\r
+\r
+void MainWindow::toggleShowHiddenFiles(bool checked)\r
+{\r
+    qDebug() << "MainWindow::toggleShowHiddenFiles" << checked;\r
+\r
+    ui->folderView1->setFilter(QDir::Hidden, checked);\r
+    ui->folderView1->refresh();\r
+\r
+    ui->folderView2->setFilter(QDir::Hidden, checked);\r
+    ui->folderView2->refresh();\r
+}\r
+\r
+void MainWindow::toggleShowSystemFiles(bool checked)\r
+{\r
+    qDebug() << "MainWindow::toggleShowSystemFiles" << checked;\r
+\r
+    ui->folderView1->setFilter(QDir::System, checked);\r
+    ui->folderView1->refresh();\r
+\r
+    ui->folderView2->setFilter(QDir::System, checked);\r
+    ui->folderView2->refresh();\r
+}\r
+\r
+void MainWindow::checkUpdate(bool silent)\r
+{\r
+    qDebug() << "MainWindow::checkUpdate()" << silent;\r
+\r
+    QNetworkAccessManager *manager = new QNetworkAccessManager(this);\r
+\r
+    if (silent) {\r
+        connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));\r
+    }\r
+    else {\r
+        connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinished(QNetworkReply*)));\r
+    }\r
+#ifdef Q_OS_WIN\r
+    manager->get(QNetworkRequest(QUrl("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_win.html")));\r
+#elif defined(Q_OS_MAC)\r
+    manager->get(QNetworkRequest(QUrl("http://miyabi.rakusaba.jp/wp-content/uploads/gefu_latest_mac.html")));\r
+#endif\r
+}\r
+\r
+void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)\r
+{\r
+    qDebug() << "MainWindow::checkUpdateFinishedSilent";\r
+\r
+    checkUpdateFinished(reply, true);\r
+}\r
+\r
+void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)\r
+{\r
+    qDebug() << "MainWindow::checkUpdateFinished" << silent;\r
+\r
+    if (reply->error() == QNetworkReply::NoError) {\r
+        QString str = reply->readAll();\r
+        str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);\r
+        QRegExp rx("Gefu([0-9]+)");\r
+        rx.indexIn(str);\r
+        QString version = rx.cap(1);\r
+        if (version.toInt() > VERSION_VALUE * 100) {\r
+            QMessageBox::information(\r
+                        this, tr("情報"),\r
+                        tr("最新のバージョンが存在します。<br/>") +\r
+                        tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));\r
+        }\r
+        else if (!silent) {\r
+            QMessageBox::information(\r
+                        this, tr("情報"),\r
+                        tr("お使いのバージョンは最新です。"));\r
+        }\r
+    }\r
+    else if (!silent){\r
+        QMessageBox::critical(\r
+                    this, tr("エラー"),\r
+                    tr("最新バージョンのチェックに失敗しました。<br/>") +\r
+                    reply->errorString());\r
+    }\r
+}\r
+\r
+void MainWindow::viewFinish(QWidget *sender)\r
+{\r
+    qDebug() << "MainWindow::viewFinish();" << sender->objectName();\r
+\r
+    sender->setVisible(false);\r
+    ui->splitter->setVisible(true);\r
+    m_focusedView->setFocus();\r
+}\r
+\r
+\r
+void MainWindow::initActionConnections()\r
+{\r
+    qDebug() << "MainWindow::initActionConnections";\r
+\r
+    connect(ui->action_Command, SIGNAL(triggered()), this, SLOT(executeCommand()));\r
+    connect(ui->action_Exec, SIGNAL(triggered()), this, SLOT(shellExecute()));\r
+    connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(open()));\r
+    connect(ui->action_OpenEditor, SIGNAL(triggered()), this, SLOT(openEditor()));\r
+    connect(ui->action_OpenTerminal, SIGNAL(triggered()), this, SLOT(openTerminal()));\r
+    connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));\r
+    connect(ui->action_Search, SIGNAL(toggled(bool)), this, SLOT(toggleSearchBox(bool)));\r
+    connect(ui->action_SearchNext, SIGNAL(triggered()), this, SLOT(searchNext()));\r
+    connect(ui->action_SearchPrev, SIGNAL(triggered()), this, SLOT(searchPrev()));\r
+    connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));\r
+    connect(ui->check_Update, SIGNAL(triggered()), this, SLOT(checkUpdate()));\r
+    connect(ui->cmd_Copy, SIGNAL(triggered()), this, SLOT(copyItems()));\r
+    connect(ui->cmd_Delete, SIGNAL(triggered()), this, SLOT(deleteItems()));\r
+    connect(ui->cmd_Move, SIGNAL(triggered()), this, SLOT(moveItems()));\r
+    connect(ui->cmd_NewFile, SIGNAL(triggered()), this, SLOT(createFile()));\r
+    connect(ui->cmd_NewFolder, SIGNAL(triggered()), this, SLOT(createFolder()));\r
+    connect(ui->cmd_Rename, SIGNAL(triggered()), this, SLOT(renameItems()));\r
+    connect(ui->copy_Filename, SIGNAL(triggered()), this, SLOT(copyFilenameToClipboard()));\r
+    connect(ui->copy_Fullpath, SIGNAL(triggered()), this, SLOT(copyFullpathTpClipboard()));\r
+    connect(ui->help_About, SIGNAL(triggered()), this, SLOT(about()));\r
+    connect(ui->mark_All, SIGNAL(triggered()), this, SLOT(markAll()));\r
+    connect(ui->mark_AllFiles, SIGNAL(triggered()), this, SLOT(markAllFiles()));\r
+    connect(ui->mark_AllOff, SIGNAL(triggered()), this, SLOT(markAllOff()));\r
+    connect(ui->mark_Invert, SIGNAL(triggered()), this, SLOT(markInvert()));\r
+    connect(ui->mark_Toggle, SIGNAL(triggered()), this, SLOT(markToggle()));\r
+    connect(ui->move_Back, SIGNAL(triggered()), this, SLOT(historyBack()));\r
+    connect(ui->move_Begin, SIGNAL(triggered()), this, SLOT(setCursorToBegin()));\r
+    connect(ui->move_Down, SIGNAL(triggered()), this, SLOT(cursorDown()));\r
+    connect(ui->move_End, SIGNAL(triggered()), this, SLOT(setCursorToEnd()));\r
+    connect(ui->move_Forward, SIGNAL(triggered()), this, SLOT(historyForward()));\r
+    connect(ui->move_History, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));\r
+    connect(ui->move_Home, SIGNAL(triggered()), this, SLOT(setPathToHome()));\r
+    connect(ui->move_Jump, SIGNAL(triggered()), this, SLOT(chooseFolder()));\r
+    connect(ui->move_Parent, SIGNAL(triggered()), this, SLOT(setPathToParent()));\r
+    connect(ui->move_Root, SIGNAL(triggered()), this, SLOT(setPathToRoot()));\r
+    connect(ui->move_Up, SIGNAL(triggered()), this, SLOT(cursorUp()));\r
+    connect(ui->view_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));\r
+    connect(ui->view_FromOther, SIGNAL(triggered()), this, SLOT(setPathFromOther()));\r
+    connect(ui->view_Hidden, SIGNAL(toggled(bool)), this, SLOT(toggleShowHiddenFiles(bool)));\r
+    connect(ui->view_Refresh, SIGNAL(triggered()), this, SLOT(refresh()));\r
+    connect(ui->view_Sort, SIGNAL(triggered()), this, SLOT(showSortDialog()));\r
+    connect(ui->view_Swap, SIGNAL(triggered()), this, SLOT(swapView()));\r
+    connect(ui->view_System, SIGNAL(toggled(bool)), this, SLOT(toggleShowSystemFiles(bool)));\r
+    connect(ui->view_ToOther, SIGNAL(triggered()), this, SLOT(setPathToOther()));\r
+}\r
+\r
+FolderView *MainWindow::folderView() const\r
+{\r
+    qDebug() << "MainWindow::folderView";\r
+\r
+    QWidget *w = qApp->focusWidget();\r
+    if (w == ui->folderView1 || w == ui->searchBox1 || w == ui->locationBox1) {\r
+        return ui->folderView1;\r
+    }\r
+    if (w == ui->folderView2 || w == ui->searchBox2 || w == ui->locationBox2) {\r
+        return ui->folderView2;\r
+    }\r
+\r
+    qDebug() << w->objectName();\r
+    return NULL;\r
+}\r
+\r
+void MainWindow::replaceVars(QString &str, const QFileInfo info)\r
+{\r
+    qDebug() << "MainWindow::replaceVars" << str;\r
+\r
+    str.replace("$B", info.completeBaseName());\r
+    str.replace("$E", info.suffix());\r
+    str.replace("$F", info.fileName());\r
+    if (info.isDir()) {\r
+        str.replace("$D", info.absoluteFilePath());\r
+    }\r
+    else {\r
+        str.replace("$D", info.absolutePath());\r
+    }\r
+    str.replace("$P", info.absoluteFilePath());\r
+}\r
+\r
+SearchBox *MainWindow::searchBox(FolderView *view) const\r
+{\r
+    qDebug() << "MainWindow::searchBox()" << view->objectName();\r
+\r
+    if (view == ui->folderView1) {\r
+        return ui->searchBox1;\r
+    }\r
+    else {\r
+        Q_ASSERT(view == ui->folderView2);\r
+        return ui->searchBox2;\r
+    }\r
+}\r
+\r
+bool MainWindow::startProcess(const QString &cmd, const QString &workDir, const QString &errMsg)\r
+{\r
+    qDebug() << "MainWindow::startProcess" << cmd << workDir << errMsg;\r
+\r
+    QProcess process(this);\r
+    process.setWorkingDirectory(workDir);\r
+    if (!process.startDetached(cmd)) {\r
+        QMessageBox::critical(this, tr("エラー"), errMsg + "<br/>" + cmd);\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+void MainWindow::updateActions()\r
+{\r
+    qDebug() << "MainWindow::updateActions";\r
+\r
+    if (ui->textView->hasFocus()) {\r
+        // テキストビューア時\r
+        setEnabledAllActions(false);\r
+        ui->action_Quit->setEnabled(true);\r
+        ui->action_Setting->setEnabled(true);\r
+        ui->check_Update->setEnabled(true);\r
+        ui->copy_Filename->setEnabled(true);\r
+        ui->copy_Fullpath->setEnabled(true);\r
+        ui->help_About->setEnabled(true);\r
+    }\r
+    else if (ui->searchBox1->hasFocus() || ui->searchBox2->hasFocus()) {\r
+        // ファイル検索時\r
+        setEnabledAllActions(false);\r
+        ui->action_Search->setEnabled(true);\r
+        ui->action_SearchNext->setEnabled(true);\r
+        ui->action_SearchPrev->setEnabled(true);\r
+        ui->help_About->setEnabled(true);\r
+        ui->action_Quit->setEnabled(true);\r
+    }\r
+    else if (ui->folderView1->hasFocus() || ui->folderView2->hasFocus()) {\r
+        // 通常時\r
+        setEnabledAllActions(true);\r
+        ui->action_SearchNext->setEnabled(false);\r
+        ui->action_SearchPrev->setEnabled(false);\r
+\r
+        ui->move_Back->setEnabled(!folderView()->history()->isBegin());\r
+        ui->move_Forward->setEnabled(!folderView()->history()->isEnd());\r
+\r
+        QSettings settings;\r
+        ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());\r
+        ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());\r
+    }\r
+}\r
+\r
+void MainWindow::setEnabledAllActions(bool enable)\r
+{\r
+    qDebug() << "MainWindow::setEnabledAllActions();" << enable;\r
+    foreach (QObject *obj, children()) {\r
+        QAction *action = qobject_cast<QAction*>(obj);\r
+        if (action) {\r
+            action->setEnabled(enable);\r
+        }\r
+    }\r
+}\r
+\r
+void MainWindow::setNameFilters(FolderView *view, const QString &filters)\r
+{\r
+    qDebug() << "MainWindow::setNameFilters();" << view->objectName() << filters;\r
+\r
+    QStringList list = filters.split(" ", QString::SkipEmptyParts);\r
+    if (list.isEmpty()) {\r
+        list << "*";\r
+    }\r
+    view->setNameFilters(list);\r
+    filterLabel(view)->setText(tr("フィルタ:") + list.join(" "));\r
+}\r
+\r
+QLabel *MainWindow::filterLabel(const FolderView *view) const\r
+{\r
+    qDebug() << "MainWindow::filterLabel()" << view->objectName();\r
+    if (view == ui->folderView1) {\r
+        return ui->filterLabel1;\r
+    }\r
+    else {\r
+        Q_ASSERT(view == ui->folderView2);\r
+        return ui->filterLabel2;\r
+    }\r
+}\r
+\r
+void MainWindow::about()\r
+{\r
+    QMessageBox::about(\r
+                this,\r
+                tr("げふぅ について"),\r
+                tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +\r
+                tr("<center>Gefu is an Experimental File Utility.<br/>"\r
+                   "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"\r
+                   "<p>最新版の情報は<a href='http://miyabi.rakusaba.jp'>喫茶[雅]</a>で公開しています。</p>"\r
+                   "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));\r
+}\r
+\r
+void MainWindow::closeEvent(QCloseEvent *event)\r
+{\r
+    QSettings settings;\r
+\r
+    if (settings.value(IniKey_ConfirmExit).toBool()) {\r
+        QMessageBox msgBox;\r
+        QCheckBox *checkBox = new QCheckBox();\r
+        checkBox->setText(tr("次回以降は確認しない"));\r
+        msgBox.setCheckBox(checkBox);\r
+        msgBox.setText(tr("終了しますか?"));\r
+        msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);\r
+        msgBox.setIcon(QMessageBox::Question);\r
+\r
+        if (msgBox.exec() == QMessageBox::No) {\r
+            event->ignore();\r
+            return;\r
+        }\r
+        settings.setValue(IniKey_ConfirmExit, !checkBox->isChecked());\r
+    }\r
+\r
+    settings.setValue(QString("Left/") + IniKey_Dir, ui->folderView1->dir());\r
+    settings.setValue(QString("Right/") + IniKey_Dir, ui->folderView2->dir());\r
+    settings.setValue(IniKey_ShowHidden, ui->view_Hidden->isChecked());\r
+    settings.setValue(IniKey_ShowSystem, ui->view_System->isChecked());\r
+    settings.setValue(IniKey_WindowGeometry, saveGeometry());\r
+    settings.setValue(iniKey_WindowState, saveState());\r
+    QMainWindow::closeEvent(event);\r
+}\r
+\r
+\r
+void MainWindow::keyPressEvent(QKeyEvent *event)\r
+{\r
+    QString ksq = KeyEventToSequence(event);\r
+    qDebug() << ksq << " @MainWindow";\r
+\r
+    QMainWindow::keyPressEvent(event);\r
 }\r
index 7b29346..a2b21ee 100644 (file)
@@ -2,15 +2,21 @@
 #define MAINWINDOW_H\r
 \r
 #include <QFileInfo>\r
+#include <QModelIndex>\r
 #include <QMainWindow>\r
-class FolderPanel;\r
-class FileTableView;\r
 class QNetworkReply;\r
+class FolderView;\r
+class SearchBox;\r
+class OverWriteDialog;\r
+class QLabel;\r
 \r
 namespace Ui {\r
 class MainWindow;\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief The MainWindow class\r
+///\r
 class MainWindow : public QMainWindow\r
 {\r
     Q_OBJECT\r
@@ -19,33 +25,101 @@ public:
     explicit MainWindow(QWidget *parent = 0);\r
     ~MainWindow();\r
 \r
-    FileTableView* otherSideView(const FileTableView *view) const;\r
+    FolderView *otherSideView(const FolderView *view) const;\r
 \r
 signals:\r
     void showHiddenFiles(bool show);\r
     void showSystemFiles(bool show);\r
 \r
 public slots:\r
+    void askOverWrite(QString *copyMethod, QString *alias,\r
+                      const QString &srcPath, const QString &tgtPath);\r
+\r
+    void focusChange(QWidget * old, QWidget * now);\r
+    void keyPress(FolderView *view, QKeyEvent *event);\r
+    void returnPressInSearchBox();\r
+\r
+    void chooseFolder();\r
+    void copyFilenameToClipboard();\r
+    void copyFullpathTpClipboard();\r
+    void copyItems();\r
+    void createFile();\r
+    void createFolder();\r
+    void cursorDown();\r
+    void cursorUp();\r
+    void deleteItems();\r
+    void executeCommand();\r
+    void historyBack();\r
+    void historyForward();\r
+    void itemFound(FolderView *view);\r
+    void itemNotFound(FolderView *view);\r
+    void markAll();\r
+    void markAllFiles();\r
+    void markAllOff();\r
+    void markInvert();\r
+    void markToggle();\r
+    void moveItems();\r
+    void open(const QModelIndex &index = QModelIndex());\r
+    void openEditor(const QString &path = QString());\r
+    void openTerminal();\r
+    void refresh();\r
+    void renameItems();\r
+    void retrieveFinish();\r
+    void retrieveStart(const QString &path);\r
+    void searchItem(const QString& text);\r
+    void searchNext();\r
+    void searchPrev();\r
+    void setCursorToBegin();\r
+    void setCursorToEnd();\r
+    void setPathFromOther();\r
+    void setPathToHome();\r
+    void setPathToOther();\r
+    void setPathToParent();\r
+    void setPathToRoot();\r
+    void shellExecute();\r
+    void showFilterDialog();\r
+    void showHistoryDialog();\r
+    void showSortDialog();\r
+    void swapView();\r
+    void toggleSearchBox(bool checked);\r
+\r
+\r
+\r
 \r
-private slots:\r
     void openRequest(const QFileInfo &info);\r
     void showPreferenceDialog();\r
     void about();\r
-    void toggleShowHiddenFiles();\r
-    void toggleShowSystemFiles();\r
+    void toggleShowHiddenFiles(bool checked);\r
+    void toggleShowSystemFiles(bool checked);\r
     void checkUpdate(bool silent = false);\r
-    void checkUpdateFinished(QNetworkReply *reply);\r
-    void checkUpdateFinished(QNetworkReply *reply, bool silent);\r
+    void checkUpdateFinished(QNetworkReply *reply, bool silent = false);\r
     void checkUpdateFinishedSilent(QNetworkReply *reply);\r
     void viewFinish(QWidget *sender);\r
 \r
 private:\r
     Ui::MainWindow *ui;\r
     QWidget *m_focusedView;\r
+    OverWriteDialog *m_overwriteDialog;\r
+\r
+    // action\r
+    void initActionConnections();\r
+    static void replaceVars(QString &str, const QFileInfo info);\r
+    bool startProcess(const QString &cmd, const QString &workDir, const QString &errMsg);\r
+    void updateActions();\r
+    void setEnabledAllActions(bool enable);\r
+    void setNameFilters(FolderView *view, const QString& filters = QString());\r
+    void setSorting(FolderView *view);\r
+\r
+    // getter\r
+    QLabel* filterLabel(const FolderView *view) const;\r
+    FolderView* folderView() const;\r
+    SearchBox* searchBox(FolderView *view) const;\r
+\r
 \r
     // QWidget interface\r
 protected:\r
     void closeEvent(QCloseEvent *event);\r
+    void keyPressEvent(QKeyEvent *event);\r
 };\r
 \r
 #endif // MAINWINDOW_H\r
index e8d44b2..3457703 100644 (file)
@@ -6,19 +6,19 @@
    <rect>\r
     <x>0</x>\r
     <y>0</y>\r
-    <width>665</width>\r
-    <height>337</height>\r
+    <width>828</width>\r
+    <height>531</height>\r
    </rect>\r
   </property>\r
   <property name="windowTitle">\r
    <string>MainWindow</string>\r
   </property>\r
   <property name="windowIcon">\r
-   <iconset>\r
+   <iconset resource="resource.qrc">\r
     <normaloff>:/images/Gefu.png</normaloff>:/images/Gefu.png</iconset>\r
   </property>\r
   <widget class="QWidget" name="centralWidget">\r
-   <layout class="QVBoxLayout" name="verticalLayout">\r
+   <layout class="QVBoxLayout" name="verticalLayout_3">\r
     <property name="spacing">\r
      <number>0</number>\r
     </property>\r
       <property name="orientation">\r
        <enum>Qt::Horizontal</enum>\r
       </property>\r
-      <widget class="FolderPanel" name="LPanel" native="true">\r
-       <property name="sizePolicy">\r
-        <sizepolicy hsizetype="Expanding" vsizetype="Expanding">\r
-         <horstretch>0</horstretch>\r
-         <verstretch>0</verstretch>\r
-        </sizepolicy>\r
-       </property>\r
+      <widget class="QWidget" name="">\r
+       <layout class="QVBoxLayout" name="verticalLayout_2">\r
+        <property name="spacing">\r
+         <number>0</number>\r
+        </property>\r
+        <item>\r
+         <widget class="LocationBox" name="locationBox1">\r
+          <property name="focusPolicy">\r
+           <enum>Qt::ClickFocus</enum>\r
+          </property>\r
+         </widget>\r
+        </item>\r
+        <item>\r
+         <widget class="FolderView" name="folderView1">\r
+          <property name="verticalScrollBarPolicy">\r
+           <enum>Qt::ScrollBarAlwaysOn</enum>\r
+          </property>\r
+          <property name="horizontalScrollBarPolicy">\r
+           <enum>Qt::ScrollBarAlwaysOff</enum>\r
+          </property>\r
+          <property name="tabKeyNavigation">\r
+           <bool>false</bool>\r
+          </property>\r
+          <property name="dragEnabled">\r
+           <bool>true</bool>\r
+          </property>\r
+          <property name="dragDropMode">\r
+           <enum>QAbstractItemView::DragDrop</enum>\r
+          </property>\r
+          <property name="defaultDropAction">\r
+           <enum>Qt::CopyAction</enum>\r
+          </property>\r
+          <property name="alternatingRowColors">\r
+           <bool>false</bool>\r
+          </property>\r
+          <property name="selectionMode">\r
+           <enum>QAbstractItemView::SingleSelection</enum>\r
+          </property>\r
+          <property name="selectionBehavior">\r
+           <enum>QAbstractItemView::SelectRows</enum>\r
+          </property>\r
+          <property name="textElideMode">\r
+           <enum>Qt::ElideMiddle</enum>\r
+          </property>\r
+          <property name="showGrid">\r
+           <bool>false</bool>\r
+          </property>\r
+          <property name="wordWrap">\r
+           <bool>false</bool>\r
+          </property>\r
+          <attribute name="horizontalHeaderHighlightSections">\r
+           <bool>false</bool>\r
+          </attribute>\r
+          <attribute name="verticalHeaderVisible">\r
+           <bool>false</bool>\r
+          </attribute>\r
+         </widget>\r
+        </item>\r
+        <item>\r
+         <widget class="SearchBox" name="searchBox1">\r
+          <property name="focusPolicy">\r
+           <enum>Qt::ClickFocus</enum>\r
+          </property>\r
+         </widget>\r
+        </item>\r
+        <item>\r
+         <widget class="QLabel" name="filterLabel1">\r
+          <property name="text">\r
+           <string>TextLabel</string>\r
+          </property>\r
+         </widget>\r
+        </item>\r
+       </layout>\r
       </widget>\r
-      <widget class="FolderPanel" name="RPanel" native="true">\r
-       <property name="sizePolicy">\r
-        <sizepolicy hsizetype="Expanding" vsizetype="Expanding">\r
-         <horstretch>0</horstretch>\r
-         <verstretch>0</verstretch>\r
-        </sizepolicy>\r
-       </property>\r
+      <widget class="QWidget" name="">\r
+       <layout class="QVBoxLayout" name="verticalLayout">\r
+        <property name="spacing">\r
+         <number>0</number>\r
+        </property>\r
+        <item>\r
+         <widget class="LocationBox" name="locationBox2">\r
+          <property name="focusPolicy">\r
+           <enum>Qt::ClickFocus</enum>\r
+          </property>\r
+         </widget>\r
+        </item>\r
+        <item>\r
+         <widget class="FolderView" name="folderView2">\r
+          <property name="verticalScrollBarPolicy">\r
+           <enum>Qt::ScrollBarAlwaysOn</enum>\r
+          </property>\r
+          <property name="horizontalScrollBarPolicy">\r
+           <enum>Qt::ScrollBarAlwaysOff</enum>\r
+          </property>\r
+          <property name="tabKeyNavigation">\r
+           <bool>false</bool>\r
+          </property>\r
+          <property name="dragEnabled">\r
+           <bool>true</bool>\r
+          </property>\r
+          <property name="dragDropMode">\r
+           <enum>QAbstractItemView::DragDrop</enum>\r
+          </property>\r
+          <property name="defaultDropAction">\r
+           <enum>Qt::CopyAction</enum>\r
+          </property>\r
+          <property name="alternatingRowColors">\r
+           <bool>false</bool>\r
+          </property>\r
+          <property name="selectionMode">\r
+           <enum>QAbstractItemView::SingleSelection</enum>\r
+          </property>\r
+          <property name="selectionBehavior">\r
+           <enum>QAbstractItemView::SelectRows</enum>\r
+          </property>\r
+          <property name="textElideMode">\r
+           <enum>Qt::ElideMiddle</enum>\r
+          </property>\r
+          <property name="showGrid">\r
+           <bool>false</bool>\r
+          </property>\r
+          <property name="wordWrap">\r
+           <bool>false</bool>\r
+          </property>\r
+          <attribute name="horizontalHeaderHighlightSections">\r
+           <bool>false</bool>\r
+          </attribute>\r
+          <attribute name="verticalHeaderVisible">\r
+           <bool>false</bool>\r
+          </attribute>\r
+         </widget>\r
+        </item>\r
+        <item>\r
+         <widget class="SearchBox" name="searchBox2">\r
+          <property name="focusPolicy">\r
+           <enum>Qt::ClickFocus</enum>\r
+          </property>\r
+         </widget>\r
+        </item>\r
+        <item>\r
+         <widget class="QLabel" name="filterLabel2">\r
+          <property name="text">\r
+           <string>TextLabel</string>\r
+          </property>\r
+         </widget>\r
+        </item>\r
+       </layout>\r
       </widget>\r
      </widget>\r
     </item>\r
     <item>\r
-     <widget class="SimpleTextView" name="plainTextEdit"/>\r
+     <widget class="SimpleTextView" name="textView"/>\r
     </item>\r
     <item>\r
      <layout class="QHBoxLayout" name="horizontalLayout">\r
    <attribute name="toolBarBreak">\r
     <bool>false</bool>\r
    </attribute>\r
-   <addaction name="action_Exec"/>\r
+   <addaction name="action_Open"/>\r
    <addaction name="action_OpenEditor"/>\r
-   <addaction name="action_Command"/>\r
+   <addaction name="action_Search"/>\r
    <addaction name="separator"/>\r
    <addaction name="mark_All"/>\r
    <addaction name="mark_AllFiles"/>\r
     <rect>\r
      <x>0</x>\r
      <y>0</y>\r
-     <width>665</width>\r
+     <width>828</width>\r
      <height>22</height>\r
     </rect>\r
    </property>\r
     <addaction name="action_OpenTerminal"/>\r
     <addaction name="action_Command"/>\r
     <addaction name="separator"/>\r
+    <addaction name="action_Search"/>\r
+    <addaction name="action_SearchNext"/>\r
+    <addaction name="action_SearchPrev"/>\r
+    <addaction name="separator"/>\r
     <addaction name="action_Setting"/>\r
     <addaction name="separator"/>\r
     <addaction name="action_Quit"/>\r
   </widget>\r
   <action name="action_Quit">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Exit.png</normaloff>:/images/Exit.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="action_Open">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Open.png</normaloff>:/images/Open.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="action_Exec">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Play.png</normaloff>:/images/Play.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="view_FromOther">\r
    <property name="icon">\r
-    <iconset theme="隣のパネルと同じフォルダを表示">\r
+    <iconset theme="隣のパネルと同じフォルダを表示" resource="resource.qrc">\r
      <normaloff>:/images/Synchronize.png</normaloff>:/images/Synchronize.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="mark_All">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Ok.png</normaloff>:/images/Ok.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="mark_AllFiles">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Check boxes.png</normaloff>:/images/Check boxes.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="mark_AllOff">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Cancel.png</normaloff>:/images/Cancel.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="view_Swap">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Text replace.png</normaloff>:/images/Text replace.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="action_Setting">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Settings.png</normaloff>:/images/Settings.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="move_Down">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Go down.png</normaloff>:/images/Go down.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="move_Up">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Go up.png</normaloff>:/images/Go up.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="move_Back">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Back.png</normaloff>:/images/Back.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="move_Forward">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Forward.png</normaloff>:/images/Forward.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="move_Parent">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Up.png</normaloff>:/images/Up.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="move_Root">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Monitor.png</normaloff>:/images/Monitor.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="move_Jump">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Folder.png</normaloff>:/images/Folder.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="move_Home">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Home.png</normaloff>:/images/Home.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="action_OpenEditor">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Edit page.png</normaloff>:/images/Edit page.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="action_Command">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Export.png</normaloff>:/images/Export.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="cmd_Copy">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Copy.png</normaloff>:/images/Copy.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="cmd_Move">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Paste.png</normaloff>:/images/Paste.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="cmd_Delete">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Delete.png</normaloff>:/images/Delete.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="cmd_Rename">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Rename.png</normaloff>:/images/Rename.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="cmd_NewFile">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/New file.png</normaloff>:/images/New file.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="cmd_NewFolder">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Add folder.png</normaloff>:/images/Add folder.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="help_About">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Help.png</normaloff>:/images/Help.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="view_Refresh">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Refresh.png</normaloff>:/images/Refresh.png</iconset>\r
    </property>\r
    <property name="text">\r
   </action>\r
   <action name="view_Filter">\r
    <property name="icon">\r
-    <iconset>\r
+    <iconset resource="resource.qrc">\r
      <normaloff>:/images/Funnel.png</normaloff>:/images/Funnel.png</iconset>\r
    </property>\r
    <property name="text">\r
     <string>Shift+C</string>\r
    </property>\r
   </action>\r
+  <action name="action_Search">\r
+   <property name="checkable">\r
+    <bool>true</bool>\r
+   </property>\r
+   <property name="icon">\r
+    <iconset resource="resource.qrc">\r
+     <normaloff>:/images/Search.png</normaloff>:/images/Search.png</iconset>\r
+   </property>\r
+   <property name="text">\r
+    <string>検索</string>\r
+   </property>\r
+   <property name="toolTip">\r
+    <string>検索</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>/</string>\r
+   </property>\r
+  </action>\r
+  <action name="action_SearchNext">\r
+   <property name="text">\r
+    <string>次を検索</string>\r
+   </property>\r
+   <property name="toolTip">\r
+    <string>次を検索</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Return</string>\r
+   </property>\r
+  </action>\r
+  <action name="action_SearchPrev">\r
+   <property name="text">\r
+    <string>前を検索</string>\r
+   </property>\r
+   <property name="toolTip">\r
+    <string>前を検索</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Shift+Return</string>\r
+   </property>\r
+  </action>\r
  </widget>\r
  <layoutdefault spacing="6" margin="11"/>\r
  <customwidgets>\r
   <customwidget>\r
-   <class>FolderPanel</class>\r
-   <extends>QWidget</extends>\r
-   <header>folderpanel.h</header>\r
-   <container>1</container>\r
-  </customwidget>\r
-  <customwidget>\r
    <class>SimpleTextView</class>\r
    <extends>QPlainTextEdit</extends>\r
    <header>simpletextview.h</header>\r
   </customwidget>\r
+  <customwidget>\r
+   <class>SearchBox</class>\r
+   <extends>QLineEdit</extends>\r
+   <header>searchbox.h</header>\r
+  </customwidget>\r
+  <customwidget>\r
+   <class>FolderView</class>\r
+   <extends>QTableView</extends>\r
+   <header>folderview.h</header>\r
+  </customwidget>\r
+  <customwidget>\r
+   <class>LocationBox</class>\r
+   <extends>QLineEdit</extends>\r
+   <header>locationbox.h</header>\r
+  </customwidget>\r
  </customwidgets>\r
- <resources/>\r
+ <resources>\r
+  <include location="resource.qrc"/>\r
+ </resources>\r
  <connections/>\r
 </ui>\r
index 55899f5..b5dc44e 100644 (file)
@@ -1,8 +1,11 @@
+#include "common.h"\r
 #include "overwritedialog.h"\r
 #include "ui_overwritedialog.h"\r
+\r
 #include <QDir>\r
 #include <QMessageBox>\r
 #include <QDateTime>\r
+#include <QSettings>\r
 \r
 OverWriteDialog::OverWriteDialog(QWidget *parent) :\r
     QDialog(parent),\r
@@ -11,15 +14,15 @@ OverWriteDialog::OverWriteDialog(QWidget *parent) :
 {\r
     ui->setupUi(this);\r
 \r
-    ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);\r
-    ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);\r
+    QHeaderView *header = ui->tableWidget->horizontalHeader();\r
+    header->setSectionResizeMode(QHeaderView::ResizeToContents);\r
+    header->setSectionResizeMode(0, QHeaderView::Stretch);\r
 \r
     connect(ui->rbAppendNumber, SIGNAL(clicked()), this, SLOT(onRenameOrElse()));\r
     connect(ui->rbOverWrite, SIGNAL(clicked()), this, SLOT(onRenameOrElse()));\r
     connect(ui->rbOverWriteIfNew, SIGNAL(clicked()), this, SLOT(onRenameOrElse()));\r
     connect(ui->rbRename, SIGNAL(clicked()), this, SLOT(onRenameOrElse()));\r
     connect(ui->rbSkip, SIGNAL(clicked()), this, SLOT(onRenameOrElse()));\r
-\r
 }\r
 \r
 OverWriteDialog::~OverWriteDialog()\r
@@ -27,32 +30,17 @@ OverWriteDialog::~OverWriteDialog()
     delete ui;\r
 }\r
 \r
-void OverWriteDialog::setCopyMethod(int method)\r
+void OverWriteDialog::reset()\r
 {\r
-    switch (method) {\r
-    case OverWriteDialog::OverWrite:\r
-        ui->rbOverWrite->setChecked(true);\r
-        break;\r
-    case OverWriteDialog::AppendNumber:\r
-        ui->rbAppendNumber->setChecked(true);\r
-        break;\r
-    case OverWriteDialog::Skip:\r
-        ui->rbSkip->setChecked(true);\r
-        break;\r
-    case OverWriteDialog::Rename:\r
-        ui->rbRename->setChecked(true);\r
-        ui->lineEdit->setFocus();\r
-        break;\r
-    default:\r
-        ui->rbOverWriteIfNew->setChecked(true);\r
-        break;\r
+    QSettings settings;\r
+    QString method = settings.value(IniKey_DefaultOnCopy).toString();\r
+    QRadioButton *radio = findChild<QRadioButton*>(method);\r
+    if (radio == NULL) {\r
+        radio = ui->rbOverWriteIfNew;\r
     }\r
-    onRenameOrElse();\r
-}\r
+    radio->setChecked(true);\r
 \r
-void OverWriteDialog::setSameMethodChecked(bool checked)\r
-{\r
-    ui->checkBox->setChecked(checked);\r
+    ui->keepSetting->setChecked(false);\r
 }\r
 \r
 void OverWriteDialog::setFileInfo(const QString srcPath, const QString tgtPath)\r
@@ -62,50 +50,48 @@ void OverWriteDialog::setFileInfo(const QString srcPath, const QString tgtPath)
     m_tgtPath = tgtPath;\r
     ui->lineEdit->setText(tgtInfo.fileName());\r
 \r
+    QTableWidgetItem *iSrcName = new QTableWidgetItem(srcInfo.fileName());\r
+    iSrcName->setFlags(iSrcName->flags() ^ Qt::ItemIsEditable);\r
+    iSrcName->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);\r
+    ui->tableWidget->setItem(0, 0, iSrcName);\r
+\r
+    QTableWidgetItem *iTgtName = new QTableWidgetItem(tgtInfo.fileName());\r
+    iTgtName->setFlags(iTgtName->flags() ^ Qt::ItemIsEditable);\r
+    iTgtName->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);\r
+    ui->tableWidget->setItem(0, 0, iTgtName);\r
+\r
     QTableWidgetItem *iSrcSize = new QTableWidgetItem(tr("%1 Bytes").arg(srcInfo.size()));\r
     iSrcSize->setFlags(iSrcSize->flags() ^ Qt::ItemIsEditable);\r
     iSrcSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
-    ui->tableWidget->setItem(0, 0, iSrcSize);\r
+    ui->tableWidget->setItem(0, 1, iSrcSize);\r
 \r
     QTableWidgetItem *iTgtSize = new QTableWidgetItem(tr("%1 Bytes").arg(tgtInfo.size()));\r
     iTgtSize->setFlags(iTgtSize->flags() ^ Qt::ItemIsEditable);\r
     iTgtSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
-    ui->tableWidget->setItem(1, 0, iTgtSize);\r
+    ui->tableWidget->setItem(1, 1, iTgtSize);\r
 \r
     QTableWidgetItem *iSrcDate = new QTableWidgetItem(srcInfo.lastModified().toString("yy/MM/dd hh:mm"));\r
     iSrcDate->setFlags(iSrcDate->flags() ^ Qt::ItemIsEditable);\r
     iSrcDate->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
-    ui->tableWidget->setItem(0, 1, iSrcDate);\r
+    ui->tableWidget->setItem(0, 2, iSrcDate);\r
 \r
     QTableWidgetItem *iTgtDate = new QTableWidgetItem(tgtInfo.lastModified().toString("yy/MM/dd hh:mm"));\r
     iTgtDate->setFlags(iTgtDate->flags() ^ Qt::ItemIsEditable);\r
     iTgtDate->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
-    ui->tableWidget->setItem(1, 1, iTgtDate);\r
+    ui->tableWidget->setItem(1, 2, iTgtDate);\r
 }\r
 \r
-int OverWriteDialog::copyMethod()\r
+QString OverWriteDialog::copyMethod() const\r
 {\r
-    if (ui->rbAppendNumber->isChecked()) {\r
-        return OverWriteDialog::AppendNumber;\r
-    }\r
-    if (ui->rbOverWrite->isChecked()) {\r
-        return OverWriteDialog::OverWrite;\r
-    }\r
-    if (ui->rbOverWriteIfNew->isChecked()) {\r
-        return OverWriteDialog::OverWriteIfNew;\r
-    }\r
-    if (ui->rbRename->isChecked()) {\r
-        return OverWriteDialog::Rename;\r
-    }\r
-    return OverWriteDialog::Skip;\r
+    return ui->method->checkedButton()->objectName();\r
 }\r
 \r
-bool OverWriteDialog::isSameMethodChecked()\r
+bool OverWriteDialog::isKeepSetting() const\r
 {\r
-    return ui->checkBox->isChecked();\r
+    return ui->keepSetting->isChecked();\r
 }\r
 \r
-const QString OverWriteDialog::alias()\r
+const QString OverWriteDialog::alias() const\r
 {\r
     return ui->lineEdit->text();\r
 }\r
index e481d8c..6cdef3b 100644 (file)
@@ -13,25 +13,18 @@ class OverWriteDialog : public QDialog
     Q_OBJECT\r
 \r
 public:\r
-    enum {\r
-        Undefined       = 0x00,\r
-        OverWrite       = 0x01,\r
-        OverWriteIfNew  = 0x02,\r
-        AppendNumber    = 0x04,\r
-        Skip            = 0x08,\r
-        Rename          = 0x10,\r
-    };\r
-\r
     explicit OverWriteDialog(QWidget *parent = 0);\r
     ~OverWriteDialog();\r
 \r
-    void setCopyMethod(int method);\r
-    void setSameMethodChecked(bool checked);\r
+    void reset();\r
+\r
+    // setter\r
     void setFileInfo(const QString srcPath, const QString tgtPath);\r
 \r
-    int copyMethod();\r
-    bool isSameMethodChecked();\r
-    const QString alias();\r
+    // getter\r
+    QString copyMethod() const;\r
+    bool isKeepSetting() const;\r
+    const QString alias() const;\r
 \r
 private slots:\r
     void onRenameOrElse();\r
index 19c0af1..7707349 100644 (file)
@@ -53,7 +53,7 @@
       <number>2</number>\r
      </property>\r
      <property name="columnCount">\r
-      <number>2</number>\r
+      <number>3</number>\r
      </property>\r
      <attribute name="horizontalHeaderHighlightSections">\r
       <bool>false</bool>\r
      </row>\r
      <column>\r
       <property name="text">\r
+       <string>ファイル名</string>\r
+      </property>\r
+     </column>\r
+     <column>\r
+      <property name="text">\r
        <string>サイズ</string>\r
       </property>\r
      </column>\r
         <property name="text">\r
          <string>上書き</string>\r
         </property>\r
+        <attribute name="buttonGroup">\r
+         <string notr="true">method</string>\r
+        </attribute>\r
        </widget>\r
       </item>\r
       <item>\r
         <property name="text">\r
          <string>新しければ上書き</string>\r
         </property>\r
+        <attribute name="buttonGroup">\r
+         <string notr="true">method</string>\r
+        </attribute>\r
        </widget>\r
       </item>\r
       <item>\r
         <property name="text">\r
          <string>スキップ</string>\r
         </property>\r
+        <attribute name="buttonGroup">\r
+         <string notr="true">method</string>\r
+        </attribute>\r
        </widget>\r
       </item>\r
       <item>\r
         <property name="text">\r
          <string>ファイル名末尾に数字を付与</string>\r
         </property>\r
+        <attribute name="buttonGroup">\r
+         <string notr="true">method</string>\r
+        </attribute>\r
        </widget>\r
       </item>\r
       <item>\r
         <property name="text">\r
          <string>名前を変更</string>\r
         </property>\r
+        <attribute name="buttonGroup">\r
+         <string notr="true">method</string>\r
+        </attribute>\r
        </widget>\r
       </item>\r
       <item>\r
    <item>\r
     <layout class="QHBoxLayout" name="horizontalLayout_2">\r
      <item>\r
-      <widget class="QCheckBox" name="checkBox">\r
+      <widget class="QCheckBox" name="keepSetting">\r
        <property name="focusPolicy">\r
         <enum>Qt::StrongFocus</enum>\r
        </property>\r
    </hints>\r
   </connection>\r
  </connections>\r
+ <buttongroups>\r
+  <buttongroup name="method"/>\r
+ </buttongroups>\r
 </ui>\r
index b0e2fc6..d050b10 100644 (file)
@@ -137,7 +137,7 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
     }
     radioBtn = findChild<QRadioButton*>(strValue);
     if (radioBtn == NULL) {
-        radioBtn = ui->owDefIfNew;
+        radioBtn = ui->rbOverWriteIfNew;
     }
     radioBtn->setChecked(true);
     ui->moveAfterCreate->setChecked(settings.value(IniKey_MoveAfterCreateFolder).toBool());
index 3c45e8e..7860251 100644 (file)
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>549</width>
-    <height>478</height>
+    <height>524</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -17,7 +17,7 @@
    </sizepolicy>
   </property>
   <property name="windowTitle">
-   <string>Dialog</string>
+   <string>環境設定</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout_7">
    <item>
       <enum>Qt::StrongFocus</enum>
      </property>
      <property name="currentIndex">
-      <number>4</number>
+      <number>2</number>
      </property>
      <widget class="QWidget" name="tabBoot_Exit">
       <attribute name="title">
        <string>起動と終了</string>
       </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout">
+      <layout class="QVBoxLayout" name="verticalLayout_4">
        <property name="spacing">
-        <number>4</number>
-       </property>
-       <property name="leftMargin">
-        <number>4</number>
-       </property>
-       <property name="topMargin">
-        <number>4</number>
-       </property>
-       <property name="rightMargin">
-        <number>4</number>
-       </property>
-       <property name="bottomMargin">
-        <number>4</number>
+        <number>-1</number>
        </property>
        <item>
-        <widget class="QCheckBox" name="bootSize">
-         <property name="focusPolicy">
-          <enum>Qt::StrongFocus</enum>
-         </property>
-         <property name="text">
-          <string>起動時のウィンドウサイズを指定する</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_3">
+        <layout class="QVBoxLayout" name="verticalLayout_3">
          <property name="spacing">
-          <number>4</number>
+          <number>-1</number>
          </property>
-         <property name="sizeConstraint">
-          <enum>QLayout::SetFixedSize</enum>
-         </property>
-         <property name="leftMargin">
-          <number>4</number>
-         </property>
-         <property name="topMargin">
-          <number>4</number>
-         </property>
-         <property name="rightMargin">
-          <number>4</number>
-         </property>
-         <property name="bottomMargin">
-          <number>4</number>
-         </property>
-         <item>
-          <spacer name="horizontalSpacer">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeType">
-            <enum>QSizePolicy::Fixed</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
          <item>
-          <widget class="QRadioButton" name="sizeAbsolute">
+          <widget class="QCheckBox" name="bootSize">
            <property name="focusPolicy">
             <enum>Qt::StrongFocus</enum>
            </property>
            <property name="text">
-            <string>絶対指定</string>
+            <string>起動時のウィンドウサイズを指定する</string>
            </property>
-           <attribute name="buttonGroup">
-            <string notr="true">sizeOptions</string>
-           </attribute>
           </widget>
          </item>
          <item>
-          <layout class="QHBoxLayout" name="horizontalLayout_2">
-           <property name="spacing">
-            <number>4</number>
-           </property>
-           <property name="leftMargin">
-            <number>4</number>
-           </property>
-           <property name="topMargin">
-            <number>4</number>
-           </property>
-           <property name="rightMargin">
-            <number>4</number>
-           </property>
-           <property name="bottomMargin">
-            <number>4</number>
-           </property>
-           <item>
-            <widget class="QLabel" name="label_3">
-             <property name="text">
-              <string>幅</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QSpinBox" name="absoluteWidth">
-             <property name="maximum">
-              <number>9999</number>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QLabel" name="label_2">
-             <property name="text">
-              <string>px</string>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </item>
-         <item>
-          <layout class="QHBoxLayout" name="horizontalLayout">
+          <layout class="QHBoxLayout" name="horizontalLayout_9">
            <property name="spacing">
-            <number>4</number>
+            <number>-1</number>
            </property>
-           <property name="leftMargin">
-            <number>4</number>
-           </property>
-           <property name="topMargin">
-            <number>4</number>
-           </property>
-           <property name="rightMargin">
-            <number>4</number>
-           </property>
-           <property name="bottomMargin">
-            <number>4</number>
-           </property>
-           <item>
-            <widget class="QLabel" name="label_4">
-             <property name="text">
-              <string>高さ</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QSpinBox" name="absoluteHeight">
-             <property name="maximum">
-              <number>9999</number>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QLabel" name="label">
-             <property name="text">
-              <string>px</string>
-             </property>
-            </widget>
-           </item>
            <item>
-            <spacer name="horizontalSpacer_10">
+            <spacer name="horizontalSpacer">
              <property name="orientation">
               <enum>Qt::Horizontal</enum>
              </property>
+             <property name="sizeType">
+              <enum>QSizePolicy::Fixed</enum>
+             </property>
              <property name="sizeHint" stdset="0">
               <size>
-               <width>40</width>
+               <width>10</width>
                <height>20</height>
               </size>
              </property>
             </spacer>
            </item>
-          </layout>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_6">
-         <property name="spacing">
-          <number>4</number>
-         </property>
-         <property name="sizeConstraint">
-          <enum>QLayout::SetMinimumSize</enum>
-         </property>
-         <property name="leftMargin">
-          <number>4</number>
-         </property>
-         <property name="topMargin">
-          <number>4</number>
-         </property>
-         <property name="rightMargin">
-          <number>4</number>
-         </property>
-         <property name="bottomMargin">
-          <number>4</number>
-         </property>
-         <item>
-          <spacer name="horizontalSpacer_2">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeType">
-            <enum>QSizePolicy::Fixed</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-         <item>
-          <widget class="QRadioButton" name="sizeRelative">
-           <property name="focusPolicy">
-            <enum>Qt::StrongFocus</enum>
-           </property>
-           <property name="text">
-            <string>相対指定</string>
-           </property>
-           <attribute name="buttonGroup">
-            <string notr="true">sizeOptions</string>
-           </attribute>
-          </widget>
-         </item>
-         <item>
-          <layout class="QHBoxLayout" name="horizontalLayout_4">
-           <property name="spacing">
-            <number>4</number>
-           </property>
-           <property name="leftMargin">
-            <number>4</number>
-           </property>
-           <property name="topMargin">
-            <number>4</number>
-           </property>
-           <property name="rightMargin">
-            <number>4</number>
-           </property>
-           <property name="bottomMargin">
-            <number>4</number>
-           </property>
-           <item>
-            <widget class="QLabel" name="label_5">
-             <property name="text">
-              <string>幅</string>
-             </property>
-            </widget>
-           </item>
            <item>
-            <widget class="QSpinBox" name="relativeWidth">
-             <property name="maximum">
-              <number>100</number>
+            <layout class="QGridLayout" name="gridLayout_2">
+             <property name="spacing">
+              <number>-1</number>
              </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QLabel" name="label_6">
-             <property name="text">
-              <string>%</string>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </item>
-         <item>
-          <layout class="QHBoxLayout" name="horizontalLayout_5">
-           <property name="spacing">
-            <number>4</number>
-           </property>
-           <property name="leftMargin">
-            <number>4</number>
-           </property>
-           <property name="topMargin">
-            <number>4</number>
-           </property>
-           <property name="rightMargin">
-            <number>4</number>
-           </property>
-           <property name="bottomMargin">
-            <number>4</number>
-           </property>
-           <item>
-            <widget class="QLabel" name="label_7">
-             <property name="text">
-              <string>高さ</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QSpinBox" name="relativeHeight">
-             <property name="maximum">
-              <number>100</number>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QLabel" name="label_8">
-             <property name="text">
-              <string>%</string>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </item>
-         <item>
-          <spacer name="horizontalSpacer_8">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_7">
-         <property name="spacing">
-          <number>4</number>
-         </property>
-         <property name="sizeConstraint">
-          <enum>QLayout::SetMinimumSize</enum>
-         </property>
-         <property name="leftMargin">
-          <number>4</number>
-         </property>
-         <property name="topMargin">
-          <number>4</number>
-         </property>
-         <property name="rightMargin">
-          <number>4</number>
-         </property>
-         <property name="bottomMargin">
-          <number>4</number>
-         </property>
-         <item>
-          <spacer name="horizontalSpacer_3">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeType">
-            <enum>QSizePolicy::Fixed</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-         <item>
-          <widget class="QRadioButton" name="sizeLast">
-           <property name="focusPolicy">
-            <enum>Qt::StrongFocus</enum>
-           </property>
-           <property name="text">
-            <string>前回終了時のサイズ</string>
-           </property>
-           <attribute name="buttonGroup">
-            <string notr="true">sizeOptions</string>
-           </attribute>
-          </widget>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <widget class="QCheckBox" name="bootPos">
-         <property name="focusPolicy">
-          <enum>Qt::StrongFocus</enum>
-         </property>
-         <property name="text">
-          <string>起動時のウィンドウ位置を指定する</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_12">
-         <property name="spacing">
-          <number>4</number>
-         </property>
-         <property name="sizeConstraint">
-          <enum>QLayout::SetFixedSize</enum>
-         </property>
-         <property name="leftMargin">
-          <number>4</number>
-         </property>
-         <property name="topMargin">
-          <number>4</number>
-         </property>
-         <property name="rightMargin">
-          <number>4</number>
-         </property>
-         <property name="bottomMargin">
-          <number>4</number>
-         </property>
-         <item>
-          <spacer name="horizontalSpacer_6">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeType">
-            <enum>QSizePolicy::Fixed</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-         <item>
-          <widget class="QRadioButton" name="posAbsolute">
-           <property name="focusPolicy">
-            <enum>Qt::StrongFocus</enum>
-           </property>
-           <property name="text">
-            <string>絶対指定</string>
-           </property>
-           <attribute name="buttonGroup">
-            <string notr="true">posOptions</string>
-           </attribute>
-          </widget>
-         </item>
-         <item>
-          <layout class="QHBoxLayout" name="horizontalLayout_13">
-           <property name="spacing">
-            <number>4</number>
-           </property>
-           <property name="leftMargin">
-            <number>4</number>
-           </property>
-           <property name="topMargin">
-            <number>4</number>
-           </property>
-           <property name="rightMargin">
-            <number>4</number>
-           </property>
-           <property name="bottomMargin">
-            <number>4</number>
-           </property>
-           <item>
-            <widget class="QLabel" name="label_13">
-             <property name="text">
-              <string>X</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QSpinBox" name="absoluteLeft">
-             <property name="maximum">
-              <number>9999</number>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QLabel" name="label_14">
-             <property name="text">
-              <string>px</string>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </item>
-         <item>
-          <layout class="QHBoxLayout" name="horizontalLayout_14">
-           <property name="spacing">
-            <number>4</number>
-           </property>
-           <property name="leftMargin">
-            <number>4</number>
-           </property>
-           <property name="topMargin">
-            <number>4</number>
-           </property>
-           <property name="rightMargin">
-            <number>4</number>
-           </property>
-           <property name="bottomMargin">
-            <number>4</number>
-           </property>
-           <item>
-            <widget class="QLabel" name="label_15">
-             <property name="text">
-              <string>Y</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QSpinBox" name="absoluteTop">
-             <property name="maximum">
-              <number>9999</number>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QLabel" name="label_16">
-             <property name="text">
-              <string>px</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <spacer name="horizontalSpacer_11">
-             <property name="orientation">
-              <enum>Qt::Horizontal</enum>
-             </property>
-             <property name="sizeHint" stdset="0">
-              <size>
-               <width>40</width>
-               <height>20</height>
-              </size>
-             </property>
-            </spacer>
-           </item>
-          </layout>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_9">
-         <property name="spacing">
-          <number>4</number>
-         </property>
-         <property name="sizeConstraint">
-          <enum>QLayout::SetMinimumSize</enum>
-         </property>
-         <property name="leftMargin">
-          <number>4</number>
-         </property>
-         <property name="topMargin">
-          <number>4</number>
-         </property>
-         <property name="rightMargin">
-          <number>4</number>
-         </property>
-         <property name="bottomMargin">
-          <number>4</number>
-         </property>
-         <item>
-          <spacer name="horizontalSpacer_5">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeType">
-            <enum>QSizePolicy::Fixed</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
+             <item row="0" column="0">
+              <widget class="QRadioButton" name="sizeAbsolute">
+               <property name="minimumSize">
+                <size>
+                 <width>0</width>
+                 <height>24</height>
+                </size>
+               </property>
+               <property name="focusPolicy">
+                <enum>Qt::StrongFocus</enum>
+               </property>
+               <property name="text">
+                <string>絶対指定</string>
+               </property>
+               <attribute name="buttonGroup">
+                <string notr="true">sizeOptions</string>
+               </attribute>
+              </widget>
+             </item>
+             <item row="0" column="1">
+              <layout class="QHBoxLayout" name="horizontalLayout">
+               <item>
+                <widget class="QLabel" name="label_3">
+                 <property name="text">
+                  <string>幅</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QSpinBox" name="absoluteWidth">
+                 <property name="maximum">
+                  <number>9999</number>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QLabel" name="label_2">
+                 <property name="text">
+                  <string>px</string>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </item>
+             <item row="0" column="2">
+              <layout class="QHBoxLayout" name="horizontalLayout_2">
+               <item>
+                <widget class="QLabel" name="label_4">
+                 <property name="text">
+                  <string>高さ</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QSpinBox" name="absoluteHeight">
+                 <property name="maximum">
+                  <number>9999</number>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QLabel" name="label">
+                 <property name="text">
+                  <string>px</string>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </item>
+             <item row="1" column="0">
+              <widget class="QRadioButton" name="sizeRelative">
+               <property name="sizePolicy">
+                <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                 <horstretch>0</horstretch>
+                 <verstretch>0</verstretch>
+                </sizepolicy>
+               </property>
+               <property name="minimumSize">
+                <size>
+                 <width>0</width>
+                 <height>24</height>
+                </size>
+               </property>
+               <property name="focusPolicy">
+                <enum>Qt::StrongFocus</enum>
+               </property>
+               <property name="text">
+                <string>相対指定</string>
+               </property>
+               <attribute name="buttonGroup">
+                <string notr="true">sizeOptions</string>
+               </attribute>
+              </widget>
+             </item>
+             <item row="1" column="1">
+              <layout class="QHBoxLayout" name="horizontalLayout_4">
+               <item>
+                <widget class="QLabel" name="label_5">
+                 <property name="text">
+                  <string>幅</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QSpinBox" name="relativeWidth">
+                 <property name="maximum">
+                  <number>100</number>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QLabel" name="label_6">
+                 <property name="text">
+                  <string>%</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <spacer name="horizontalSpacer_7">
+                 <property name="orientation">
+                  <enum>Qt::Horizontal</enum>
+                 </property>
+                 <property name="sizeHint" stdset="0">
+                  <size>
+                   <width>0</width>
+                   <height>20</height>
+                  </size>
+                 </property>
+                </spacer>
+               </item>
+              </layout>
+             </item>
+             <item row="1" column="2">
+              <layout class="QHBoxLayout" name="horizontalLayout_3">
+               <item>
+                <widget class="QLabel" name="label_7">
+                 <property name="text">
+                  <string>高さ</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QSpinBox" name="relativeHeight">
+                 <property name="maximum">
+                  <number>100</number>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QLabel" name="label_8">
+                 <property name="text">
+                  <string>%</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <spacer name="horizontalSpacer_8">
+                 <property name="orientation">
+                  <enum>Qt::Horizontal</enum>
+                 </property>
+                 <property name="sizeHint" stdset="0">
+                  <size>
+                   <width>0</width>
+                   <height>20</height>
+                  </size>
+                 </property>
+                </spacer>
+               </item>
+              </layout>
+             </item>
+             <item row="2" column="0" colspan="2">
+              <widget class="QRadioButton" name="sizeLast">
+               <property name="minimumSize">
+                <size>
+                 <width>0</width>
+                 <height>24</height>
+                </size>
+               </property>
+               <property name="focusPolicy">
+                <enum>Qt::StrongFocus</enum>
+               </property>
+               <property name="text">
+                <string>前回終了時のサイズ</string>
+               </property>
+               <attribute name="buttonGroup">
+                <string notr="true">sizeOptions</string>
+               </attribute>
+              </widget>
+             </item>
+            </layout>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_2">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
          </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QVBoxLayout" name="verticalLayout">
          <item>
-          <widget class="QRadioButton" name="posRelative">
+          <widget class="QCheckBox" name="bootPos">
            <property name="focusPolicy">
             <enum>Qt::StrongFocus</enum>
            </property>
            <property name="text">
-            <string>相対指定</string>
+            <string>起動時のウィンドウ位置を指定する</string>
            </property>
-           <attribute name="buttonGroup">
-            <string notr="true">posOptions</string>
-           </attribute>
           </widget>
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_10">
-           <property name="spacing">
-            <number>4</number>
-           </property>
-           <property name="leftMargin">
-            <number>4</number>
-           </property>
-           <property name="topMargin">
-            <number>4</number>
-           </property>
-           <property name="rightMargin">
-            <number>4</number>
-           </property>
-           <property name="bottomMargin">
-            <number>4</number>
-           </property>
            <item>
-            <widget class="QLabel" name="label_9">
-             <property name="text">
-              <string>X</string>
+            <spacer name="horizontalSpacer_3">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
              </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QSpinBox" name="relativeLeft">
-             <property name="maximum">
-              <number>100</number>
+             <property name="sizeType">
+              <enum>QSizePolicy::Fixed</enum>
              </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QLabel" name="label_10">
-             <property name="text">
-              <string>%</string>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>10</width>
+               <height>20</height>
+              </size>
              </property>
-            </widget>
+            </spacer>
            </item>
-          </layout>
-         </item>
-         <item>
-          <layout class="QHBoxLayout" name="horizontalLayout_11">
-           <property name="spacing">
-            <number>4</number>
-           </property>
-           <property name="leftMargin">
-            <number>4</number>
-           </property>
-           <property name="topMargin">
-            <number>4</number>
-           </property>
-           <property name="rightMargin">
-            <number>4</number>
-           </property>
-           <property name="bottomMargin">
-            <number>4</number>
-           </property>
            <item>
-            <widget class="QLabel" name="label_11">
-             <property name="text">
-              <string>Y</string>
-             </property>
-            </widget>
+            <layout class="QGridLayout" name="gridLayout_3">
+             <item row="0" column="0">
+              <widget class="QRadioButton" name="posAbsolute">
+               <property name="minimumSize">
+                <size>
+                 <width>0</width>
+                 <height>24</height>
+                </size>
+               </property>
+               <property name="focusPolicy">
+                <enum>Qt::StrongFocus</enum>
+               </property>
+               <property name="text">
+                <string>絶対指定</string>
+               </property>
+               <attribute name="buttonGroup">
+                <string notr="true">posOptions</string>
+               </attribute>
+              </widget>
+             </item>
+             <item row="0" column="1">
+              <layout class="QHBoxLayout" name="horizontalLayout_7">
+               <item>
+                <widget class="QLabel" name="label_13">
+                 <property name="text">
+                  <string>X</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QSpinBox" name="absoluteLeft">
+                 <property name="maximum">
+                  <number>9999</number>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QLabel" name="label_14">
+                 <property name="text">
+                  <string>px</string>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </item>
+             <item row="0" column="2">
+              <layout class="QHBoxLayout" name="horizontalLayout_5">
+               <item>
+                <widget class="QLabel" name="label_15">
+                 <property name="text">
+                  <string>Y</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QSpinBox" name="absoluteTop">
+                 <property name="maximum">
+                  <number>9999</number>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QLabel" name="label_16">
+                 <property name="text">
+                  <string>px</string>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </item>
+             <item row="1" column="0">
+              <widget class="QRadioButton" name="posRelative">
+               <property name="minimumSize">
+                <size>
+                 <width>0</width>
+                 <height>24</height>
+                </size>
+               </property>
+               <property name="focusPolicy">
+                <enum>Qt::StrongFocus</enum>
+               </property>
+               <property name="text">
+                <string>相対指定</string>
+               </property>
+               <attribute name="buttonGroup">
+                <string notr="true">posOptions</string>
+               </attribute>
+              </widget>
+             </item>
+             <item row="1" column="1">
+              <layout class="QHBoxLayout" name="horizontalLayout_8">
+               <item>
+                <widget class="QLabel" name="label_9">
+                 <property name="text">
+                  <string>X</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QSpinBox" name="relativeLeft">
+                 <property name="maximum">
+                  <number>100</number>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QLabel" name="label_10">
+                 <property name="text">
+                  <string>%</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <spacer name="horizontalSpacer_5">
+                 <property name="orientation">
+                  <enum>Qt::Horizontal</enum>
+                 </property>
+                 <property name="sizeHint" stdset="0">
+                  <size>
+                   <width>0</width>
+                   <height>20</height>
+                  </size>
+                 </property>
+                </spacer>
+               </item>
+              </layout>
+             </item>
+             <item row="1" column="2">
+              <layout class="QHBoxLayout" name="horizontalLayout_6">
+               <item>
+                <widget class="QLabel" name="label_11">
+                 <property name="text">
+                  <string>Y</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QSpinBox" name="relativeTop">
+                 <property name="maximum">
+                  <number>100</number>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QLabel" name="label_12">
+                 <property name="text">
+                  <string>%</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <spacer name="horizontalSpacer_6">
+                 <property name="orientation">
+                  <enum>Qt::Horizontal</enum>
+                 </property>
+                 <property name="sizeHint" stdset="0">
+                  <size>
+                   <width>0</width>
+                   <height>20</height>
+                  </size>
+                 </property>
+                </spacer>
+               </item>
+              </layout>
+             </item>
+             <item row="2" column="0">
+              <widget class="QRadioButton" name="posCenter">
+               <property name="minimumSize">
+                <size>
+                 <width>0</width>
+                 <height>24</height>
+                </size>
+               </property>
+               <property name="focusPolicy">
+                <enum>Qt::StrongFocus</enum>
+               </property>
+               <property name="text">
+                <string>画面中央</string>
+               </property>
+               <attribute name="buttonGroup">
+                <string notr="true">posOptions</string>
+               </attribute>
+              </widget>
+             </item>
+             <item row="3" column="0" colspan="2">
+              <widget class="QRadioButton" name="posLast">
+               <property name="minimumSize">
+                <size>
+                 <width>0</width>
+                 <height>24</height>
+                </size>
+               </property>
+               <property name="focusPolicy">
+                <enum>Qt::StrongFocus</enum>
+               </property>
+               <property name="text">
+                <string>前回終了時の位置</string>
+               </property>
+               <attribute name="buttonGroup">
+                <string notr="true">posOptions</string>
+               </attribute>
+              </widget>
+             </item>
+            </layout>
            </item>
            <item>
-            <widget class="QSpinBox" name="relativeTop">
-             <property name="maximum">
-              <number>100</number>
+            <spacer name="horizontalSpacer_4">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
              </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QLabel" name="label_12">
-             <property name="text">
-              <string>%</string>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
              </property>
-            </widget>
+            </spacer>
            </item>
           </layout>
          </item>
-         <item>
-          <spacer name="horizontalSpacer_9">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_15">
-         <property name="spacing">
-          <number>4</number>
-         </property>
-         <property name="sizeConstraint">
-          <enum>QLayout::SetMinimumSize</enum>
-         </property>
-         <property name="leftMargin">
-          <number>4</number>
-         </property>
-         <property name="topMargin">
-          <number>4</number>
-         </property>
-         <property name="rightMargin">
-          <number>4</number>
-         </property>
-         <property name="bottomMargin">
-          <number>4</number>
-         </property>
-         <item>
-          <spacer name="horizontalSpacer_7">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeType">
-            <enum>QSizePolicy::Fixed</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-         <item>
-          <widget class="QRadioButton" name="posCenter">
-           <property name="focusPolicy">
-            <enum>Qt::StrongFocus</enum>
-           </property>
-           <property name="text">
-            <string>画面中央</string>
-           </property>
-           <attribute name="buttonGroup">
-            <string notr="true">posOptions</string>
-           </attribute>
-          </widget>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_8">
-         <property name="spacing">
-          <number>4</number>
-         </property>
-         <property name="sizeConstraint">
-          <enum>QLayout::SetMinimumSize</enum>
-         </property>
-         <property name="leftMargin">
-          <number>4</number>
-         </property>
-         <property name="topMargin">
-          <number>4</number>
-         </property>
-         <property name="rightMargin">
-          <number>4</number>
-         </property>
-         <property name="bottomMargin">
-          <number>4</number>
-         </property>
-         <item>
-          <spacer name="horizontalSpacer_4">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeType">
-            <enum>QSizePolicy::Fixed</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-         <item>
-          <widget class="QRadioButton" name="posLast">
-           <property name="focusPolicy">
-            <enum>Qt::StrongFocus</enum>
-           </property>
-           <property name="text">
-            <string>前回終了時の位置</string>
-           </property>
-           <attribute name="buttonGroup">
-            <string notr="true">posOptions</string>
-           </attribute>
-          </widget>
-         </item>
         </layout>
        </item>
        <item>
           <enum>Qt::StrongFocus</enum>
          </property>
          <property name="text">
-          <string>起動時に最新バージョンをチェックする</string>
+          <string>起動時に最新バージョンをチェックする</string>
          </property>
         </widget>
        </item>
          <property name="sizeHint" stdset="0">
           <size>
            <width>20</width>
-           <height>1</height>
+           <height>45</height>
           </size>
          </property>
         </spacer>
        </item>
       </layout>
      </widget>
-     <widget class="QWidget" name="tab">
+     <widget class="QWidget" name="tabOperation">
       <attribute name="title">
        <string>ファイル操作</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_8">
        <property name="spacing">
-        <number>4</number>
+        <number>-1</number>
        </property>
        <property name="leftMargin">
         <number>4</number>
          </property>
          <layout class="QHBoxLayout" name="horizontalLayout_24">
           <property name="spacing">
-           <number>4</number>
+           <number>-1</number>
           </property>
           <property name="leftMargin">
            <number>4</number>
          </property>
          <layout class="QHBoxLayout" name="horizontalLayout_25">
           <property name="spacing">
-           <number>4</number>
+           <number>-1</number>
           </property>
           <property name="leftMargin">
            <number>4</number>
            <number>4</number>
           </property>
           <property name="spacing">
-           <number>4</number>
+           <number>-1</number>
           </property>
           <item row="0" column="0">
-           <widget class="QRadioButton" name="owDefOverWrite">
+           <widget class="QRadioButton" name="rbOverWrite">
             <property name="focusPolicy">
              <enum>Qt::StrongFocus</enum>
             </property>
            </widget>
           </item>
           <item row="0" column="1">
-           <widget class="QRadioButton" name="owDefIfNew">
+           <widget class="QRadioButton" name="rbOverWriteIfNew">
             <property name="focusPolicy">
              <enum>Qt::StrongFocus</enum>
             </property>
            </widget>
           </item>
           <item row="0" column="2">
-           <widget class="QRadioButton" name="owDefSkip">
+           <widget class="QRadioButton" name="rbSkip">
             <property name="focusPolicy">
              <enum>Qt::StrongFocus</enum>
             </property>
            </widget>
           </item>
           <item row="1" column="0" colspan="2">
-           <widget class="QRadioButton" name="owDefAppendNumber">
+           <widget class="QRadioButton" name="rbAppendNumber">
             <property name="focusPolicy">
              <enum>Qt::StrongFocus</enum>
             </property>
            </widget>
           </item>
           <item row="1" column="2">
-           <widget class="QRadioButton" name="owDefRename">
+           <widget class="QRadioButton" name="rbRename">
             <property name="focusPolicy">
              <enum>Qt::StrongFocus</enum>
             </property>
        </item>
       </layout>
      </widget>
-     <widget class="QWidget" name="tab_2">
+     <widget class="QWidget" name="tabPath">
       <attribute name="title">
        <string>パス設定</string>
       </attribute>
@@ -1835,7 +1576,7 @@ $P ... フルパス($D/$Fと同じ)</string>
       <zorder></zorder>
       <zorder>optExplain</zorder>
      </widget>
-     <widget class="QWidget" name="tab_3">
+     <widget class="QWidget" name="tabTextViewer">
       <attribute name="title">
        <string>テキストビューア</string>
       </attribute>
@@ -2163,14 +1904,12 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ
   </layout>
  </widget>
  <tabstops>
-  <tabstop>tabWidget</tabstop>
   <tabstop>bootSize</tabstop>
   <tabstop>sizeAbsolute</tabstop>
   <tabstop>absoluteWidth</tabstop>
   <tabstop>absoluteHeight</tabstop>
   <tabstop>sizeRelative</tabstop>
   <tabstop>relativeWidth</tabstop>
-  <tabstop>relativeHeight</tabstop>
   <tabstop>sizeLast</tabstop>
   <tabstop>bootPos</tabstop>
   <tabstop>posAbsolute</tabstop>
@@ -2178,7 +1917,6 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ
   <tabstop>absoluteTop</tabstop>
   <tabstop>posRelative</tabstop>
   <tabstop>relativeLeft</tabstop>
-  <tabstop>relativeTop</tabstop>
   <tabstop>posCenter</tabstop>
   <tabstop>posLast</tabstop>
   <tabstop>resetOnBoot</tabstop>
@@ -2205,11 +1943,11 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ
   <tabstop>autoCloseMove</tabstop>
   <tabstop>autoCloseDelete</tabstop>
   <tabstop>autoCloseRename</tabstop>
-  <tabstop>owDefOverWrite</tabstop>
-  <tabstop>owDefIfNew</tabstop>
-  <tabstop>owDefSkip</tabstop>
-  <tabstop>owDefAppendNumber</tabstop>
-  <tabstop>owDefRename</tabstop>
+  <tabstop>rbOverWrite</tabstop>
+  <tabstop>rbOverWriteIfNew</tabstop>
+  <tabstop>rbSkip</tabstop>
+  <tabstop>rbAppendNumber</tabstop>
+  <tabstop>rbRename</tabstop>
   <tabstop>moveAfterCreate</tabstop>
   <tabstop>openAfterCreate</tabstop>
   <tabstop>editorPath</tabstop>
@@ -2239,8 +1977,8 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ
    <slot>accept()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
+     <x>254</x>
+     <y>473</y>
     </hint>
     <hint type="destinationlabel">
      <x>157</x>
@@ -2255,8 +1993,8 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ
    <slot>reject()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
+     <x>322</x>
+     <y>473</y>
     </hint>
     <hint type="destinationlabel">
      <x>286</x>
@@ -2266,8 +2004,8 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ
   </connection>
  </connections>
  <buttongroups>
-  <buttongroup name="overwriteOptions"/>
   <buttongroup name="posOptions"/>
+  <buttongroup name="overwriteOptions"/>
   <buttongroup name="sizeOptions"/>
  </buttongroups>
 </ui>
index 4748908..b78565f 100644 (file)
@@ -1,6 +1,63 @@
+#include "common.h"
+#include "mainwindow.h"
 #include "searchbox.h"
 
+#include <QAction>
+#include <QDebug>
+#include <QKeyEvent>
+#include <QApplication>
+
 SearchBox::SearchBox(QWidget *parent) :
     QLineEdit(parent)
 {
 }
+
+void SearchBox::itemFound()
+{
+    QPalette palette = this->palette();
+    palette.setColor(QPalette::Text, Qt::black);
+    setPalette(palette);
+}
+
+void SearchBox::itemNotFound()
+{
+    QPalette palette = this->palette();
+    palette.setColor(QPalette::Text, Qt::red);
+    setPalette(palette);
+}
+
+void SearchBox::keyPressEvent(QKeyEvent *event)
+{
+#if 0
+    QString ksq = KeyEventToSequence(event);
+
+    if (ksq == "/") {
+        QAction *action = getMainWnd()->findChild<QAction*>("action_Search");
+        action->toggle();
+        event->accept();
+        return;
+    }
+
+    QString textBefore = text();
+    QLineEdit::keyPressEvent(event);
+
+
+    if (ksq == "Shift+Return"){
+        qDebug() << ksq;
+        emit getMainWnd()->findChild<QAction*>("action_SearchPrev")->triggered();
+    }
+    else if (ksq.indexOf("Return") != -1) {
+        qDebug() << ksq;
+        emit getMainWnd()->findChild<QAction*>("action_SearchNext")->triggered();
+    }
+    else if (textBefore != text()) {
+        emit searchItem(text());
+    }
+    else {
+        qDebug() << ksq;
+    }
+#endif
+
+    QLineEdit::keyPressEvent(event);
+
+}
index d397e62..0f901df 100644 (file)
@@ -10,9 +10,19 @@ public:
     explicit SearchBox(QWidget *parent = 0);
 
 signals:
+    void searchItem(const QString &text);
+    void searchNext(const QString &text);
+    void searchPrev(const QString &next);
+
+private slots:
+    void itemFound();
+    void itemNotFound();
 
 public slots:
 
+    // QWidget interface
+protected:
+    void keyPressEvent(QKeyEvent *event);
 };
 
 #endif // SEARCHBOX_H
index 8b2815e..bd105d7 100644 (file)
@@ -9,6 +9,18 @@
 #include <QTextCodec>
 #include <QStatusBar>
 
+QString KeyEventToSequence(const QKeyEvent *event)
+{
+    QString modifier = QString::null;
+    if (event->modifiers() & Qt::ShiftModifier)     { modifier += "Shift+"; }
+    if (event->modifiers() & Qt::ControlModifier)   { modifier += "Ctrl+"; }
+    if (event->modifiers() & Qt::AltModifier)       { modifier += "Alt+"; }
+    if (event->modifiers() & Qt::MetaModifier)      { modifier += "Meta+"; }
+
+    QString key = QKeySequence(event->key()).toString();
+    return QKeySequence(modifier + key).toString();
+}
+
 SimpleTextView::SimpleTextView(QWidget *parent) :
     QPlainTextEdit(parent),
     m_convEUC(NULL),
@@ -313,14 +325,7 @@ void SimpleTextView::back()
 
 void SimpleTextView::keyPressEvent(QKeyEvent *event)
 {
-    QString modifier = QString::null;
-    if (event->modifiers() & Qt::ShiftModifier)     { modifier += "Shift+"; }
-    if (event->modifiers() & Qt::ControlModifier)   { modifier += "Ctrl+"; }
-    if (event->modifiers() & Qt::AltModifier)       { modifier += "Alt+"; }
-    if (event->modifiers() & Qt::MetaModifier)      { modifier += "Meta+"; }
-
-    QString key = QKeySequence(event->key()).toString();
-    QString ksq = QKeySequence(modifier + key).toString();
+    QString ksq = KeyEventToSequence(event);
 
     if (ksq == "Return" || ksq == "Backspace" || ksq == "W") {
         emit viewFinished(this);