OSDN Git Service

Model/View構造への変更。一旦コミット。
authorMasayuki Satoh <miyabi.satoh@gmail.com>
Wed, 20 Aug 2014 00:24:52 +0000 (09:24 +0900)
committerMasayuki Satoh <miyabi.satoh@gmail.com>
Wed, 20 Aug 2014 00:24:52 +0000 (09:24 +0900)
21 files changed:
Gefu.pro
common.h
deleteworker.cpp
deleteworker.h
filetablemodel.cpp [new file with mode: 0644]
filetablemodel.h [new file with mode: 0644]
filetableview.cpp [new file with mode: 0644]
filetableview.h [new file with mode: 0644]
filetablewidget.cpp [deleted file]
filetablewidget.h [deleted file]
folderpanel.cpp
folderpanel.h
folderpanel.ui
irenamedialog.h
mainwindow.cpp
mainwindow.h
mainwindow.ui
renamemultidialog.cpp
renamemultidialog.h
renamesingledialog.cpp
renamesingledialog.h

index 4bd8473..1c109cd 100644 (file)
--- a/Gefu.pro
+++ b/Gefu.pro
@@ -24,8 +24,9 @@ SOURCES += main.cpp\
     deleteworker.cpp \\r
     overwritedialog.cpp \\r
     copymoveworker.cpp \\r
-    filetablewidget.cpp \\r
-    sortdialog.cpp\r
+    sortdialog.cpp \\r
+    filetablemodel.cpp \\r
+    filetableview.cpp\r
 \r
 HEADERS  += mainwindow.h \\r
     folderpanel.h \\r
@@ -40,8 +41,9 @@ HEADERS  += mainwindow.h \
     deleteworker.h \\r
     overwritedialog.h \\r
     copymoveworker.h \\r
-    filetablewidget.h \\r
-    sortdialog.h\r
+    sortdialog.h \\r
+    filetablemodel.h \\r
+    filetableview.h\r
 \r
 FORMS    += mainwindow.ui \\r
     folderpanel.ui \\r
index 1285ac4..56c37db 100644 (file)
--- a/common.h
+++ b/common.h
@@ -15,6 +15,7 @@ extern QString FilesizeToString(quint64 size);
 #define VERSION_VALUE   0.01\r
 \r
 #define slash   QString("/")\r
+#define QQ(x)   ("\"" + (x) + "\"")\r
 \r
 #define IniKey_ShowHidden       "Common/ShowHidden"\r
 #define IniKey_ShowSystem       "Common/ShowSystem"\r
index 0f3b694..0291108 100644 (file)
@@ -14,12 +14,12 @@ void DeleteWorker::operate()
 {\r
     m_progressText->setText(tr("削除準備中..."));\r
 \r
-    foreach (const QString &path, *m_DeleteList) {\r
+    foreach (const QFileInfo &info, *m_DeleteList) {\r
         if (isStopRequested()) {\r
             emit canceled();\r
             return;\r
         }\r
-        Listup(path);\r
+        Listup(info.absolutePath());\r
     }\r
 \r
     bool ret;\r
index a927abc..addedd8 100644 (file)
@@ -3,13 +3,15 @@
 \r
 #include "iworker.h"\r
 \r
+#include <QFileInfoList>\r
+\r
 class DeleteWorker : public IWorker\r
 {\r
     Q_OBJECT\r
 public:\r
     explicit DeleteWorker(QObject *parent = 0);\r
 \r
-    void setDeleteList(const QStringList *list) {\r
+    void setDeleteList(const QFileInfoList *list) {\r
         m_DeleteList = list;\r
     }\r
 \r
@@ -17,7 +19,7 @@ public slots:
     void operate();\r
 \r
 private:\r
-    const QStringList *m_DeleteList;\r
+    const QFileInfoList *m_DeleteList;\r
     QStringList m_Targets;\r
 \r
     void Listup(const QString &path);\r
diff --git a/filetablemodel.cpp b/filetablemodel.cpp
new file mode 100644 (file)
index 0000000..834a046
--- /dev/null
@@ -0,0 +1,262 @@
+#include "common.h"\r
+#include "filetablemodel.h"\r
+\r
+#include <QDateTime>\r
+#include <QDebug>\r
+#ifdef Q_OS_WIN32\r
+    #include <windows.h>\r
+#endif\r
+\r
+FileTableModel::FileTableModel(QObject *parent) :\r
+    QAbstractTableModel(parent),\r
+    m_dir(),\r
+    m_fileInfoList(),\r
+    m_checkStates(),\r
+    m_IconFactory(),\r
+    m_fsWatcher(NULL)\r
+{\r
+}\r
+\r
+bool FileTableModel::setPath(const QString &path)\r
+{\r
+    if (!QFileInfo::exists(path)) {\r
+        qDebug() << "パスが存在しません";\r
+        qDebug() << path;\r
+        return false;\r
+    }\r
+    QFileInfo info(path);\r
+    if (!info.isDir()) {\r
+        qDebug() << "フォルダではありません";\r
+        qDebug() << path;\r
+        return false;\r
+    }\r
+\r
+    beginResetModel();\r
+\r
+    m_dir.setPath(path);\r
+    m_fileInfoList = m_dir.entryInfoList();\r
+    m_checkStates.clear();\r
+\r
+    if (m_fileInfoList.isEmpty()) {\r
+        qDebug() << "ファイルリストを取得できません";\r
+        qDebug() << path;\r
+    }\r
+#ifdef Q_OS_WIN32\r
+    else if (!(filter() & QDir::System)){\r
+        QFileInfoList::iterator it;\r
+        for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); ) {\r
+            DWORD dwFlags = ::GetFileAttributes(\r
+                        it->absoluteFilePath().toStdWString().c_str());\r
+            if (dwFlags != DWORD(-1) && it->fileName() != ".." &&\r
+                ((dwFlags & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM))\r
+            {\r
+                qDebug() << it->fileName() << " is system file.";\r
+                it = m_fileInfoList.erase(it);\r
+            }\r
+            else {\r
+                it++;\r
+            }\r
+        }\r
+    }\r
+#endif\r
+    m_checkStates.resize(m_fileInfoList.size());\r
+    m_checkStates.fill(Qt::Unchecked);\r
+\r
+    if (m_fsWatcher) {\r
+        delete m_fsWatcher;\r
+    }\r
+    m_fsWatcher = new QFileSystemWatcher(this);\r
+    m_fsWatcher->addPath(path);\r
+    connect(m_fsWatcher, SIGNAL(directoryChanged(QString)),\r
+            this, SLOT(refresh()));\r
+\r
+    endResetModel();\r
+\r
+    emit rootChanged(m_dir.absolutePath());\r
+    stateChanged();\r
+\r
+    return !m_fileInfoList.isEmpty();\r
+}\r
+\r
+Qt::CheckState FileTableModel::checkState(const QModelIndex &index) const\r
+{\r
+    return m_checkStates[index.row()];\r
+}\r
+\r
+void FileTableModel::setCheckState(const QModelIndex &index, Qt::CheckState state)\r
+{\r
+    m_checkStates[index.row()] = state;\r
+    stateChanged();\r
+}\r
+\r
+void FileTableModel::setCheckStateAll(Qt::CheckState state)\r
+{\r
+    beginResetModel();\r
+    m_checkStates.fill(state);\r
+    endResetModel();\r
+\r
+    stateChanged();\r
+}\r
+\r
+\r
+bool FileTableModel::isDir(const QModelIndex &index) const\r
+{\r
+    return m_fileInfoList[index.row()].isDir();\r
+}\r
+\r
+const QString FileTableModel::absoluteFilePath(const QModelIndex &index) const\r
+{\r
+    return m_dir.absoluteFilePath(m_fileInfoList[index.row()].fileName());\r
+}\r
+\r
+QFileInfo FileTableModel::fileInfo(const QModelIndex &index) const\r
+{\r
+    return m_fileInfoList[index.row()];\r
+}\r
+\r
+void FileTableModel::stateChanged()\r
+{\r
+    int numFolder = 0;\r
+    int numFile = 0;\r
+    quint64 totalSize = 0;\r
+    for (int n = 0; n < m_checkStates.size(); n++) {\r
+        if (m_checkStates[n] == Qt::Checked) {\r
+            if (m_fileInfoList[n].isDir()) {\r
+                numFolder++;\r
+            }\r
+            else {\r
+                numFile++;\r
+                totalSize += m_fileInfoList[n].size();\r
+            }\r
+        }\r
+    }\r
+\r
+    emit stateChanged(numFolder, numFile, totalSize);\r
+}\r
+\r
+QFileInfoList FileTableModel::checkedItems() const\r
+{\r
+    QFileInfoList list;\r
+    for (int n = 0; n < m_checkStates.size(); n++) {\r
+        if (m_fileInfoList[n].fileName() != ".." &&\r
+            m_checkStates[n] == Qt::Checked)\r
+        {\r
+            list.append(m_fileInfoList[n]);\r
+        }\r
+    }\r
+    return list;\r
+}\r
+\r
+int FileTableModel::rowCount(const QModelIndex &parent) const\r
+{\r
+    Q_UNUSED(parent);\r
+    return m_fileInfoList.size();\r
+}\r
+\r
+int FileTableModel::columnCount(const QModelIndex &parent) const\r
+{\r
+    Q_UNUSED(parent);\r
+    return 4;\r
+}\r
+\r
+QVariant FileTableModel::data(const QModelIndex &index, int role) const\r
+{\r
+    if (!index.isValid()) {\r
+        return QVariant();\r
+    }\r
+\r
+    const QFileInfo &info = m_fileInfoList.at(index.row());\r
+    int checked = m_checkStates.at(index.row());\r
+\r
+    switch (role) {\r
+    case Qt::DisplayRole:\r
+        switch (index.column()) {\r
+        case 0: // チェックボックス\r
+            return QString("");\r
+        case 1: // ファイル名\r
+            return info.fileName();\r
+        case 2: // サイズ\r
+            if (info.isDir()) {\r
+                return QString("<DIR>");\r
+            }\r
+            else {\r
+                return FilesizeToString(info.size());\r
+            }\r
+            break;\r
+        case 3:\r
+            return info.lastModified().toString("yy/MM/dd hh:mm");\r
+        }\r
+        break;\r
+\r
+    case Qt::DecorationRole:\r
+        if (index.column() == 1) {\r
+            if (info.fileName() == "..") {\r
+                return QIcon(":/images/Up.png");\r
+            }\r
+            else {\r
+                // infoを使うと、正しいアイコンが取れない場合がある…なぜ?\r
+                return m_IconFactory.icon(QFileInfo(info.absoluteFilePath()));\r
+            }\r
+        }\r
+        break;\r
+\r
+    case Qt::TextAlignmentRole:\r
+        switch (index.column()) {\r
+        case 0:\r
+        case 1:\r
+            return Qt::AlignLeft + Qt::AlignVCenter;\r
+        case 2:\r
+        case 3:\r
+            return Qt::AlignRight + Qt::AlignVCenter;\r
+        }\r
+        break;\r
+\r
+    case Qt::CheckStateRole:\r
+        if (index.column() == 0 && info.fileName() != "..") {\r
+            return checked;\r
+        }\r
+        break;\r
+    }\r
+\r
+    return QVariant();\r
+}\r
+\r
+QVariant FileTableModel::headerData(int section, Qt::Orientation orientation, int role) const\r
+{\r
+    if (role == Qt::DisplayRole) {\r
+        if (orientation == Qt::Horizontal) {\r
+            switch (section) {\r
+            case 0: return QString("");\r
+            case 1: return tr("名前");\r
+            case 2: return tr("サイズ");\r
+            case 3: return tr("更新日時");\r
+            }\r
+        }\r
+    }\r
+    return QVariant();\r
+}\r
+\r
+Qt::ItemFlags FileTableModel::flags(const QModelIndex &index) const\r
+{\r
+    Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;\r
+    if (index.column() == 0 && m_fileInfoList[index.row()].fileName() != "..")\r
+    {\r
+        flags |= Qt::ItemIsUserCheckable;\r
+    }\r
+    return flags;\r
+}\r
+\r
+bool FileTableModel::setData(const QModelIndex &index, const QVariant &value, int role)\r
+{\r
+    switch (role) {\r
+    case Qt::CheckStateRole:\r
+        if (index.column() == 0) {\r
+            m_checkStates[index.row()] = static_cast<Qt::CheckState>(value.toInt());\r
+            stateChanged();\r
+            return true;\r
+        }\r
+        break;\r
+    }\r
+\r
+    return false;\r
+}\r
diff --git a/filetablemodel.h b/filetablemodel.h
new file mode 100644 (file)
index 0000000..22109b3
--- /dev/null
@@ -0,0 +1,59 @@
+#ifndef FILETABLEMODEL_H\r
+#define FILETABLEMODEL_H\r
+\r
+#include <QAbstractTableModel>\r
+#include <QDir>\r
+#include <QFileIconProvider>\r
+#include <QFileSystemWatcher>\r
+\r
+class FileTableModel : public QAbstractTableModel\r
+{\r
+    Q_OBJECT\r
+public:\r
+    explicit FileTableModel(QObject *parent = 0);\r
+\r
+    bool setPath(const QString &path);\r
+\r
+    QDir::Filters filter() const { return m_dir.filter(); }\r
+    void setFilter(QDir::Filters filters) { m_dir.setFilter(filters); }\r
+\r
+    QDir::SortFlags sorting() const { return m_dir.sorting(); }\r
+    void setSorting(QDir::SortFlags sort) { m_dir.setSorting(sort); }\r
+\r
+    Qt::CheckState checkState(const QModelIndex &index) const;\r
+    void setCheckState(const QModelIndex &index, Qt::CheckState state);\r
+    void setCheckStateAll(Qt::CheckState state);\r
+\r
+    bool isDir(const QModelIndex &index) const;\r
+    const QString absolutePath() const { return m_dir.absolutePath(); }\r
+    const QString absoluteFilePath(const QModelIndex &index) const;\r
+    QFileInfoList checkedItems() const;\r
+    QFileInfo fileInfo(const QModelIndex &index) const;\r
+\r
+signals:\r
+    void rootChanged(const QString &root);\r
+    void stateChanged(int checkedFoldrs, int checkedFiles, quint64 totalSize);\r
+\r
+public slots:\r
+    void refresh() { setPath(m_dir.absolutePath()); }\r
+\r
+private:\r
+    QDir m_dir;\r
+    QFileInfoList m_fileInfoList;\r
+    QVector<Qt::CheckState> m_checkStates;\r
+    QFileIconProvider m_IconFactory;\r
+    QFileSystemWatcher *m_fsWatcher;\r
+\r
+    void stateChanged();\r
+\r
+    // QAbstractItemModel interface\r
+public:\r
+    int rowCount(const QModelIndex &parent = QModelIndex()) const;\r
+    int columnCount(const QModelIndex &parent = QModelIndex()) const;\r
+    QVariant data(const QModelIndex &index, int role) const;\r
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const;\r
+    Qt::ItemFlags flags(const QModelIndex &index) const;\r
+    bool setData(const QModelIndex &index, const QVariant &value, int role);\r
+};\r
+\r
+#endif // FILETABLEMODEL_H\r
diff --git a/filetableview.cpp b/filetableview.cpp
new file mode 100644 (file)
index 0000000..d388ad8
--- /dev/null
@@ -0,0 +1,558 @@
+#include "common.h"\r
+#include "deleteworker.h"\r
+#include "filetablemodel.h"\r
+#include "filetableview.h"\r
+#include "mainwindow.h"\r
+#include "operationdialog.h"\r
+#include "renamemultidialog.h"\r
+#include "renamesingledialog.h"\r
+#include "renameworker.h"\r
+#include "sortdialog.h"\r
+\r
+#include <QDebug>\r
+#include <QDesktopServices>\r
+#include <QInputDialog>\r
+#include <QMessageBox>\r
+#include <QProcess>\r
+#include <QUrl>\r
+#include <QAction>\r
+#include <QSettings>\r
+#include <QFileDialog>\r
+#include <QKeyEvent>\r
+\r
+#define CHECK_FOCUS {                   \\r
+        if (!hasFocus()) { return; }    \\r
+    }\r
+\r
+#define MENU_TRRIGGERED(x) \\r
+    getMainWnd()->findChild<QAction*>(#x), SIGNAL(triggered())\r
+#define MENU_TOGGLED(x) \\r
+    getMainWnd()->findChild<QAction*>(#x), SIGNAL(toggled(bool))\r
+\r
+FileTableView::FileTableView(QWidget *parent) :\r
+    QTableView(parent)\r
+{\r
+    // シグナル/スロットを設定する\r
+    connect(MENU_TRRIGGERED(action_Open), this, SLOT(setPath()));\r
+    connect(MENU_TRRIGGERED(action_Exec), this, SLOT(openUrl()));\r
+    connect(MENU_TRRIGGERED(action_OpenEditor), this, SLOT(XXX()));\r
+    connect(MENU_TRRIGGERED(action_Command), this, SLOT(kickProcess()));\r
+\r
+    connect(MENU_TRRIGGERED(mark_Toggle), this, SLOT(toggleChecked()));\r
+    connect(MENU_TRRIGGERED(mark_All), this, SLOT(checkAllItems()));\r
+    connect(MENU_TRRIGGERED(mark_AllFiles), this, SLOT(checkAllFiles()));\r
+    connect(MENU_TRRIGGERED(mark_AllOff), this, SLOT(uncheckAllItems()));\r
+    connect(MENU_TRRIGGERED(mark_Invert), this, SLOT(invertAllChecked()));\r
+\r
+    connect(MENU_TOGGLED(view_Hidden), this, SLOT(showHiddenFiles(bool)));\r
+    connect(MENU_TOGGLED(view_System), this, SLOT(showSystemFiles(bool)));\r
+    connect(MENU_TRRIGGERED(view_Sort), this, SLOT(setSort()));\r
+\r
+    connect(MENU_TRRIGGERED(move_Back), this, SLOT(back()));\r
+    connect(MENU_TRRIGGERED(move_Forward), this, SLOT(forward()));\r
+    connect(MENU_TRRIGGERED(move_History), this, SLOT(showHidtory()));\r
+    connect(MENU_TRRIGGERED(move_Home), this, SLOT(jumpToHome()));\r
+    connect(MENU_TRRIGGERED(move_Parent), this, SLOT(jumpToParent()));\r
+    connect(MENU_TRRIGGERED(move_Root), this, SLOT(jumpToRoot()));\r
+    connect(MENU_TRRIGGERED(move_Jump), this, SLOT(jumpTo()));\r
+    connect(MENU_TRRIGGERED(move_Down), this, SLOT(cursorDown()));\r
+    connect(MENU_TRRIGGERED(move_Up), this, SLOT(cursorUp()));\r
+    connect(MENU_TRRIGGERED(move_Begin), this, SLOT(cursorToBegin()));\r
+    connect(MENU_TRRIGGERED(move_End), this, SLOT(cursorToEnd()));\r
+\r
+    connect(MENU_TRRIGGERED(cmd_Delete), this, SLOT(cmdDelete()));\r
+    connect(MENU_TRRIGGERED(cmd_Rename), this, SLOT(cmdRename()));\r
+    connect(MENU_TRRIGGERED(cmd_NewFile), this, SLOT(newFile()));\r
+    connect(MENU_TRRIGGERED(cmd_NewFolder), this, SLOT(newFolder()));\r
+\r
+    connect(this, SIGNAL(doubleClicked(QModelIndex)),\r
+            this, SLOT(setRootIndex(QModelIndex)));\r
+\r
+}\r
+QString FileTableView::side() const\r
+{\r
+    return m_side;\r
+}\r
+\r
+void FileTableView::setSide(const QString &side)\r
+{\r
+    m_side = side;\r
+}\r
+\r
+\r
+QFileInfoList FileTableView::selectedItems() const\r
+{\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+    QFileInfoList list = m->checkedItems();\r
+    if (list.isEmpty()) {\r
+        QFileInfo info = m->fileInfo(currentIndex());\r
+        if (info.fileName() != "..") {\r
+            list.append(info);\r
+        }\r
+    }\r
+\r
+    return list;\r
+}\r
+\r
+void FileTableView::setPath()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    setRootIndex(currentIndex());\r
+}\r
+\r
+void FileTableView::openUrl()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    QFileInfoList list = 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 FileTableView::kickProcess()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    QFileInfoList list = selectedItems();\r
+    QString command = QString::null;\r
+    foreach (const QFileInfo &info, list) {\r
+        if (info.isExecutable()) {\r
+            command = QQ(info.fileName()) + " " + command;\r
+        }\r
+        else {\r
+            command += " " + QQ(info.fileName());\r
+        }\r
+    }\r
+\r
+    QInputDialog dlg(this);\r
+    dlg.setInputMode(QInputDialog::TextInput);\r
+    dlg.setWindowTitle(tr("コマンドを実行"));\r
+    dlg.setLabelText(tr("コマンド:"));\r
+    dlg.setTextValue(command);\r
+    dlg.resize(500, 100);\r
+    int ret = dlg.exec();\r
+    command = dlg.textValue();\r
+    if (ret == QDialog::Accepted && !command.isEmpty()) {\r
+        FileTableModel *m = static_cast<FileTableModel*>(model());\r
+        QProcess process(this);\r
+        process.setWorkingDirectory(m->absolutePath());\r
+        if (!process.startDetached(command)) {\r
+            QMessageBox::critical(\r
+                        this, tr("エラー"),\r
+                        tr("コマンドの実行に失敗しました。<br/>") + command);\r
+        }\r
+    }\r
+}\r
+\r
+void FileTableView::toggleChecked()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+\r
+    QModelIndex index = currentIndex();\r
+    QFileInfo info = m->fileInfo(index);\r
+    if (info.fileName() != "..") {\r
+        if (m->checkState(index) == Qt::Checked) {\r
+            m->setCheckState(index, Qt::Unchecked);\r
+        }\r
+        else {\r
+            m->setCheckState(index, Qt::Checked);\r
+        }\r
+        update(index);\r
+    }\r
+    // 最終行でなければ、次のアイテムに移動する\r
+    if (index.row() < m->rowCount() - 1) {\r
+        setCurrentIndex(m->index(index.row() + 1, 1));\r
+    }\r
+}\r
+\r
+void FileTableView::checkAllItems()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+    setUpdatesEnabled(false);\r
+    m->setCheckStateAll(Qt::Checked);\r
+    setUpdatesEnabled(true);\r
+}\r
+\r
+void FileTableView::checkAllFiles()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+    setUpdatesEnabled(false);\r
+    for (int n = 0; n < m->rowCount(); n++) {\r
+        QModelIndex index = m->index(n, 0);\r
+        QFileInfo info = m->fileInfo(index);\r
+        if (info.isDir()) {\r
+            m->setCheckState(index, Qt::Unchecked);\r
+        }\r
+        else {\r
+            m->setCheckState(index, Qt::Checked);\r
+        }\r
+        update(index);\r
+    }\r
+    setUpdatesEnabled(true);\r
+}\r
+\r
+void FileTableView::uncheckAllItems()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+    setUpdatesEnabled(false);\r
+    m->setCheckStateAll(Qt::Unchecked);\r
+    setUpdatesEnabled(true);\r
+}\r
+\r
+void FileTableView::invertAllChecked()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+    setUpdatesEnabled(false);\r
+    for (int n = 0; n < m->rowCount(); n++) {\r
+        QModelIndex index = m->index(n, 0);\r
+        if (m->checkState(index) == Qt::Checked) {\r
+            m->setCheckState(index, Qt::Unchecked);\r
+        }\r
+        else {\r
+            m->setCheckState(index, Qt::Checked);\r
+        }\r
+        update(index);\r
+    }\r
+    setUpdatesEnabled(true);\r
+}\r
+\r
+void FileTableView::showHiddenFiles(bool show)\r
+{\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+\r
+    if (show) {\r
+        m->setFilter(m->filter() | QDir::Hidden);\r
+    }\r
+    else {\r
+        m->setFilter(m->filter() ^ QDir::Hidden);\r
+    }\r
+\r
+    setUpdatesEnabled(false);\r
+    m->refresh();\r
+    setUpdatesEnabled(true);\r
+}\r
+\r
+void FileTableView::showSystemFiles(bool show)\r
+{\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+\r
+    if (show) {\r
+        m->setFilter(m->filter() | QDir::System);\r
+    }\r
+    else {\r
+        m->setFilter(m->filter() ^ QDir::System);\r
+    }\r
+\r
+    setUpdatesEnabled(false);\r
+    m->refresh();\r
+    setUpdatesEnabled(true);\r
+}\r
+\r
+void FileTableView::setSort()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    SortDialog dlg(this);\r
+    dlg.setRightOrLeft(side());\r
+    if (dlg.exec() == QDialog::Accepted) {\r
+        QSettings settings;\r
+        FileTableModel *m = static_cast<FileTableModel*>(model());\r
+        m->setSorting(QDir::Name);  // 0\r
+\r
+        int sortBy = settings.value(side() + slash + IniKey_SortBy, 0).toInt();\r
+        switch (sortBy) {\r
+        case SortByDate:    m->setSorting(m->sorting() | QDir::Time); break;\r
+        case SortBySize:    m->setSorting(m->sorting() | QDir::Size); break;\r
+        case SortByType:    m->setSorting(m->sorting() | QDir::Type); break;\r
+        default:            m->setSorting(m->sorting() | QDir::Name); break;\r
+        }\r
+\r
+        // デフォルトだと文字列は昇順で、数値は降順…orz\r
+        int orderBy = settings.value(side() + slash + IniKey_OrderBy, 0).toInt();\r
+        if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
+            ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
+        {\r
+            m->setSorting(m->sorting() | QDir::Reversed);\r
+        }\r
+\r
+        switch (settings.value(side() + slash + IniKey_PutDirs, 0).toInt()) {\r
+        case PutDirsFirst:  m->setSorting(m->sorting() | QDir::DirsFirst); break;\r
+        case PutDirsLast:   m->setSorting(m->sorting() | QDir::DirsLast); break;\r
+        }\r
+\r
+        if (settings.value(side() + slash + IniKey_IgnoreCase, true).toBool()) {\r
+            m->setSorting(m->sorting() | QDir::IgnoreCase);\r
+        }\r
+\r
+        setUpdatesEnabled(false);\r
+        m->refresh();\r
+        setUpdatesEnabled(true);\r
+    }\r
+}\r
+\r
+void FileTableView::back()\r
+{\r
+    CHECK_FOCUS;\r
+}\r
+\r
+void FileTableView::forward()\r
+{\r
+    CHECK_FOCUS;\r
+}\r
+\r
+void FileTableView::showHidtory()\r
+{\r
+    CHECK_FOCUS;\r
+}\r
+\r
+void FileTableView::jumpToHome()\r
+{\r
+    CHECK_FOCUS;\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+\r
+    setUpdatesEnabled(false);\r
+    m->setPath(QDir::homePath());\r
+    setUpdatesEnabled(true);\r
+}\r
+\r
+void FileTableView::jumpToParent()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+    QDir dir(m->absolutePath());\r
+    dir.cdUp();\r
+\r
+    setUpdatesEnabled(false);\r
+    m->setPath(dir.absolutePath());\r
+    setUpdatesEnabled(true);\r
+}\r
+\r
+void FileTableView::jumpToRoot()\r
+{\r
+    CHECK_FOCUS;\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+\r
+    setUpdatesEnabled(false);\r
+    m->setPath(QDir::rootPath());\r
+    setUpdatesEnabled(true);\r
+}\r
+\r
+void FileTableView::jumpTo()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+    QString path = QFileDialog::getExistingDirectory(\r
+                this, tr("フォルダを選択"), m->absolutePath());\r
+    if (!path.isEmpty()) {\r
+        setUpdatesEnabled(false);\r
+        m->setPath(path);\r
+        setUpdatesEnabled(true);\r
+    }\r
+}\r
+\r
+void FileTableView::cursorDown()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    int row = currentIndex().row();\r
+    if (row < model()->rowCount() - 1) {\r
+        setCurrentIndex(model()->index(row + 1, 1));\r
+    }\r
+}\r
+\r
+void FileTableView::cursorUp()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    int row = currentIndex().row();\r
+    if (row > 0) {\r
+        setCurrentIndex(model()->index(row - 1, 1));\r
+    }\r
+}\r
+\r
+void FileTableView::cursorToBegin()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    setCurrentIndex(model()->index(0, 1));\r
+}\r
+\r
+void FileTableView::cursorToEnd()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    setCurrentIndex(model()->index(model()->rowCount() - 1, 1));\r
+}\r
+\r
+void FileTableView::cmdDelete()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    QFileInfoList list = selectedItems();\r
+    if (list.isEmpty()) {\r
+        return;\r
+    }\r
+\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("を削除します<br/>よろしいですか?"));\r
+    if (ret == QMessageBox::Yes) {\r
+        DeleteWorker worker;\r
+        worker.setDeleteList(&list);\r
+\r
+        OperationDialog opDlg(this);\r
+        opDlg.setWindowTitle(tr("削除"));\r
+        opDlg.setWorker(&worker);\r
+        opDlg.exec();\r
+    }\r
+}\r
+\r
+void FileTableView::cmdRename()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    QFileInfoList list = 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
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+    dlg->setWorkingDirectory(m->absolutePath());\r
+    dlg->setNames(list);\r
+    int dlgResult = dlg->exec();\r
+    if (dlgResult == QDialog::Accepted && !dlg->renameMap().isEmpty()) {\r
+        RenameWorker worker;\r
+        worker.setRenameMap(&dlg->renameMap());\r
+\r
+        OperationDialog opDlg(this);\r
+        opDlg.setWindowTitle(tr("名前を変更"));\r
+        opDlg.setWorker(&worker);\r
+        opDlg.exec();\r
+    }\r
+}\r
+\r
+void FileTableView::newFile()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    bool bOk;\r
+    QString name = QInputDialog::getText(\r
+                this, tr("ファイルを作成"), tr("ファイル名:"),\r
+                QLineEdit::Normal, "", &bOk);\r
+    if (bOk && !name.isEmpty()) {\r
+        FileTableModel *m = static_cast<FileTableModel*>(model());\r
+        QDir dir(m->absolutePath());\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
+    }\r
+}\r
+\r
+void FileTableView::newFolder()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    bool bOk;\r
+    QString name = QInputDialog::getText(\r
+                this, tr("フォルダを作成"), tr("フォルダ名:"),\r
+                QLineEdit::Normal, "", &bOk);\r
+    if (bOk && !name.isEmpty()) {\r
+        FileTableModel *m = static_cast<FileTableModel*>(model());\r
+        QDir dir(m->absolutePath());\r
+        if (!dir.mkpath(name)) {\r
+            QMessageBox::critical(\r
+                        this, tr("エラー"),\r
+                        tr("フォルダの作成に失敗しました。"));\r
+        }\r
+    }\r
+}\r
+\r
+void FileTableView::XXX()\r
+{\r
+    CHECK_FOCUS;\r
+\r
+    qDebug() << sender()->objectName() << "に対するスロットは未実装です。";\r
+}\r
+\r
+void FileTableView::setRootIndex(const QModelIndex &index)\r
+{\r
+    if (!index.isValid()) {\r
+        return;\r
+    }\r
+\r
+    FileTableModel *m = static_cast<FileTableModel*>(model());\r
+\r
+    if (m->isDir(index)) {\r
+        setUpdatesEnabled(false);\r
+        m->setPath(m->absoluteFilePath(index));\r
+        selectRow(0);\r
+        setUpdatesEnabled(true);\r
+    }\r
+}\r
+\r
+void FileTableView::keyPressEvent(QKeyEvent *event)\r
+{\r
+    // Macでアクションが処理されないケースがあるため、\r
+    // キーイベントを拾ってアクションシグナルを起動する\r
+    QString modifier = QString::null;\r
+    if (event->modifiers() & Qt::ShiftModifier)     { modifier += "Shift+"; }\r
+    if (event->modifiers() & Qt::ControlModifier)   { modifier += "Ctrl+"; }\r
+    if (event->modifiers() & Qt::AltModifier)       { modifier += "Alt+"; }\r
+    if (event->modifiers() & Qt::MetaModifier)      { modifier += "Meta+"; }\r
+\r
+    QString key = QKeySequence(event->key()).toString();\r
+    QString ksq = QKeySequence(modifier + key).toString();\r
+\r
+    if (!ksq.isEmpty()) {\r
+        foreach (QObject *obj, getMainWnd()->children()) {\r
+            QAction *action = qobject_cast<QAction*>(obj);\r
+            if (action) {\r
+                if (ksq == action->shortcut().toString()) {\r
+                    qDebug() << "emit " << ksq << " " << action->objectName();\r
+                    emit action->triggered();\r
+                    event->accept();\r
+                    return;\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    qDebug() << ksq;\r
+    QTableView::keyPressEvent(event);\r
+\r
+}\r
diff --git a/filetableview.h b/filetableview.h
new file mode 100644 (file)
index 0000000..5ad6faf
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef FILETABLEVIEW_H\r
+#define FILETABLEVIEW_H\r
+\r
+#include <QFileInfoList>\r
+#include <QTableView>\r
+\r
+class FileTableView : public QTableView\r
+{\r
+    Q_OBJECT\r
+public:\r
+    explicit FileTableView(QWidget *parent = 0);\r
+\r
+    QString side() const;\r
+    void setSide(const QString &side);\r
+\r
+private:\r
+    QString m_side;\r
+\r
+    QFileInfoList selectedItems() const;\r
+\r
+signals:\r
+\r
+public slots:\r
+    void setPath();\r
+    void openUrl();\r
+    void kickProcess();\r
+\r
+    void toggleChecked();\r
+    void checkAllItems();\r
+    void checkAllFiles();\r
+    void uncheckAllItems();\r
+    void invertAllChecked();\r
+\r
+    void showHiddenFiles(bool show);\r
+    void showSystemFiles(bool show);\r
+    void setSort();\r
+\r
+    void back();\r
+    void forward();\r
+    void showHidtory();\r
+    void jumpToHome();\r
+    void jumpToParent();\r
+    void jumpToRoot();\r
+    void jumpTo();\r
+    void cursorDown();\r
+    void cursorUp();\r
+    void cursorToBegin();\r
+    void cursorToEnd();\r
+\r
+    void cmdDelete();\r
+    void cmdRename();\r
+    void newFile();\r
+    void newFolder();\r
+\r
+    void XXX();\r
+\r
+    // QAbstractItemView interface\r
+public slots:\r
+    void setRootIndex(const QModelIndex &index);\r
+\r
+    // QWidget interface\r
+protected:\r
+    void keyPressEvent(QKeyEvent *event);\r
+};\r
+\r
+#endif // FILETABLEVIEW_H\r
diff --git a/filetablewidget.cpp b/filetablewidget.cpp
deleted file mode 100644 (file)
index ad28ddd..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-#include "common.h"\r
-#include "mainwindow.h"\r
-#include "filetablewidget.h"\r
-#include <QKeyEvent>\r
-#include <QHeaderView>\r
-#include <folderpanel.h>\r
-#include <QAction>\r
-#include <QDebug>\r
-#include <QMenuBar>\r
-\r
-FileTableWidget::FileTableWidget(QWidget *parent) :\r
-    QTableWidget(parent)\r
-{\r
-    connect(this, SIGNAL(cellChanged(int,int)), this, SLOT(onCellChanged(int,int)));\r
-\r
-    // ダブルクリック → 開く\r
-    MainWindow *mainWnd = getMainWnd();\r
-    connect(this, SIGNAL(cellDoubleClicked(int,int)), mainWnd, SLOT(onActionOpen()));\r
-}\r
-\r
-void FileTableWidget::keyPressEvent(QKeyEvent *event)\r
-{\r
-    // Macでアクションが処理されないケースがあるため、\r
-    // キーイベントを拾ってアクションシグナルを起動する\r
-    QString modifier = QString::null;\r
-    if (event->modifiers() & Qt::ShiftModifier)     { modifier += "Shift+"; }\r
-    if (event->modifiers() & Qt::ControlModifier)   { modifier += "Ctrl+"; }\r
-    if (event->modifiers() & Qt::AltModifier)       { modifier += "Alt+"; }\r
-    if (event->modifiers() & Qt::MetaModifier)      { modifier += "Meta+"; }\r
-\r
-    QString key = QKeySequence(event->key()).toString();\r
-    QString ksq = QKeySequence(modifier + key).toString();\r
-\r
-    if (!ksq.isEmpty()) {\r
-        foreach (QObject *obj, getMainWnd()->children()) {\r
-            QAction *action = qobject_cast<QAction*>(obj);\r
-            if (action) {\r
-                if (ksq == action->shortcut().toString()) {\r
-                    qDebug() << "emit " << ksq << " " << action->objectName();\r
-                    emit action->triggered();\r
-                    event->accept();\r
-                    return;\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    qDebug() << ksq;\r
-    QTableWidget::keyPressEvent(event);\r
-}\r
-\r
-void FileTableWidget::onCellChanged(int row, int column)\r
-{\r
-    if (column == 0) { // マーク状態が変更された\r
-        if (item(row, 0)->checkState() == Qt::Checked) {\r
-            for (int n = 0; n < 4; n++) {\r
-                item(row, n)->setForeground(Qt::red);\r
-                item(row, n)->setBackground(Qt::green);\r
-            }\r
-        }\r
-        else {\r
-            for (int n = 0; n < 4; n++) {\r
-                item(row, n)->setForeground(Qt::black);\r
-                item(row, n)->setBackground(Qt::white);\r
-            }\r
-        }\r
-        selectRow(row);\r
-    }\r
-}\r
-\r
-const QString& FileTableWidget::side() const\r
-{\r
-    FolderPanel *fp = static_cast<FolderPanel*>(parentWidget());\r
-    return fp->side();\r
-}\r
diff --git a/filetablewidget.h b/filetablewidget.h
deleted file mode 100644 (file)
index 7af8987..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef FILETABLEWIDGET_H\r
-#define FILETABLEWIDGET_H\r
-\r
-#include <QTableWidget>\r
-\r
-class FileTableWidget : public QTableWidget\r
-{\r
-    Q_OBJECT\r
-public:\r
-    explicit FileTableWidget(QWidget *parent = 0);\r
-\r
-signals:\r
-\r
-public slots:\r
-    void onCellChanged(int row, int column);\r
-\r
-protected:\r
-    void keyPressEvent(QKeyEvent *event);\r
-\r
-private:\r
-    const QString& side() const;\r
-};\r
-\r
-#endif // FILETABLEWIDGET_H\r
index 91ceaff..231f3cd 100644 (file)
@@ -1,4 +1,5 @@
 #include "common.h"\r
+#include "filetablemodel.h"\r
 #include "folderpanel.h"\r
 #include "mainwindow.h"\r
 #include "ui_folderpanel.h"\r
@@ -36,11 +37,7 @@ FolderPanel::FolderPanel(QWidget *parent) :
     m_bUpdating(false)\r
 {\r
     ui->setupUi(this);\r
-    qDebug() << objectName();\r
-\r
-    // セル(チェックボックス)の変更\r
-    connect(ui->fileTable, SIGNAL(cellChanged(int,int)),\r
-            this, SLOT(onUpdateMark(int,int)));\r
+    ui->fileTable->setModel(new FileTableModel(this));\r
 \r
     // リサイズ時の動作を設定する\r
     QHeaderView *header = ui->fileTable->horizontalHeader();\r
@@ -48,19 +45,6 @@ FolderPanel::FolderPanel(QWidget *parent) :
     header->setSectionResizeMode(1, QHeaderView::Stretch);\r
     header->setSectionResizeMode(2, QHeaderView::ResizeToContents);\r
     header->setSectionResizeMode(3, QHeaderView::ResizeToContents);\r
-\r
-    QSettings settings;\r
-    // フィルタ初期化\r
-    m_dir.setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);\r
-    if (settings.value(IniKey_ShowHidden, false).toBool()) {\r
-        m_dir.setFilter(m_dir.filter() | QDir::Hidden);\r
-    }\r
-    if (settings.value(IniKey_ShowSystem, false).toBool()) {\r
-        m_dir.setFilter(m_dir.filter() | QDir::System);\r
-    }\r
-\r
-    // ソート順初期化\r
-    m_dir.setSorting(QDir::DirsFirst | QDir::IgnoreCase);\r
 }\r
 \r
 FolderPanel::~FolderPanel()\r
@@ -69,12 +53,12 @@ FolderPanel::~FolderPanel()
     delete ui;\r
 }\r
 \r
-FileTableWidget* FolderPanel::fileTable()\r
+QTableView* FolderPanel::fileTable()\r
 {\r
     return ui->fileTable;\r
 }\r
 \r
-const FileTableWidget *FolderPanel::fileTable() const\r
+const QTableView *FolderPanel::fileTable() const\r
 {\r
     return ui->fileTable;\r
 }\r
@@ -110,63 +94,63 @@ void FolderPanel::setCurrentFolder(const QString &path)
     showSystem = settings.value(IniKey_ShowSystem, false).toBool();\r
 \r
     beginUpdate();\r
-    ui->fileTable->model()->removeRows(0, ui->fileTable->rowCount());\r
-    for (int i = 0; i < list.size(); i++) {\r
-        QFileInfo info = list.at(i);\r
-        if (info.fileName() == ".." && m_dir.isRoot()) {\r
-            continue;\r
-        }\r
-\r
-#ifdef Q_OS_WIN32\r
-        DWORD dwFlags = ::GetFileAttributes(info.absoluteFilePath().toStdWString().c_str());\r
-        if (!showSystem && dwFlags != DWORD(-1) && (dwFlags & FILE_ATTRIBUTE_SYSTEM)) {\r
-            continue;\r
-        }\r
-#endif\r
-\r
-        int row = ui->fileTable->rowCount();\r
-        ui->fileTable->insertRow(row);\r
-\r
-        // ファイル名とアイコン\r
-        QTableWidgetItem *iName = new QTableWidgetItem(info.fileName());\r
-        iName->setFlags(iName->flags() ^ Qt::ItemIsEditable);\r
-        if (info.fileName() == "..") {\r
-            iName->setIcon(QIcon(":/images/Up.png"));\r
-        }\r
-        else {\r
-            iName->setIcon(m_IconFactory.icon(info));\r
-        }\r
-        ui->fileTable->setItem(row, 1, iName);\r
-\r
-        // サイズ\r
-        QString str;\r
-        if (info.isDir()) {\r
-            str = tr("<DIR>");\r
-        }\r
-        else {\r
-            str = FilesizeToString(info.size());\r
-        }\r
-        QTableWidgetItem *iSize = new QTableWidgetItem(str);\r
-        iSize->setFlags(iSize->flags() ^ Qt::ItemIsEditable);\r
-        iSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
-        ui->fileTable->setItem(row, 2, iSize);\r
-\r
-        // 最終更新日時\r
-        QTableWidgetItem *iDateTime = new QTableWidgetItem(\r
-                    info.lastModified().toString("yy/MM/dd hh:mm"));\r
-        iDateTime->setFlags(iDateTime->flags() ^ Qt::ItemIsEditable);\r
-        ui->fileTable->setItem(row, 3, iDateTime);\r
-\r
-        // シグナル処理の関係で、チェックボックスは最後に追加する\r
-        QTableWidgetItem *iCheck = new QTableWidgetItem(tr(""));\r
-        iCheck->setFlags(iCheck->flags() ^ Qt::ItemIsEditable);\r
-        if (info.fileName() != "..") {\r
-            iCheck->setFlags(iCheck->flags() | Qt::ItemIsUserCheckable);\r
-            iCheck->setCheckState(Qt::Unchecked);\r
-        }\r
-        ui->fileTable->setItem(row, 0, iCheck);\r
-\r
-    }\r
+//    ui->fileTable->model()->removeRows(0, ui->fileTable->rowCount());\r
+//    for (int i = 0; i < list.size(); i++) {\r
+//        QFileInfo info = list.at(i);\r
+//        if (info.fileName() == ".." && m_dir.isRoot()) {\r
+//            continue;\r
+//        }\r
+\r
+//#ifdef Q_OS_WIN32\r
+//        DWORD dwFlags = ::GetFileAttributes(info.absoluteFilePath().toStdWString().c_str());\r
+//        if (!showSystem && dwFlags != DWORD(-1) && (dwFlags & FILE_ATTRIBUTE_SYSTEM)) {\r
+//            continue;\r
+//        }\r
+//#endif\r
+\r
+//        int row = ui->fileTable->rowCount();\r
+//        ui->fileTable->insertRow(row);\r
+\r
+//        // ファイル名とアイコン\r
+//        QTableWidgetItem *iName = new QTableWidgetItem(info.fileName());\r
+//        iName->setFlags(iName->flags() ^ Qt::ItemIsEditable);\r
+//        if (info.fileName() == "..") {\r
+//            iName->setIcon(QIcon(":/images/Up.png"));\r
+//        }\r
+//        else {\r
+//            iName->setIcon(m_IconFactory.icon(info));\r
+//        }\r
+//        ui->fileTable->setItem(row, 1, iName);\r
+\r
+//        // サイズ\r
+//        QString str;\r
+//        if (info.isDir()) {\r
+//            str = tr("<DIR>");\r
+//        }\r
+//        else {\r
+//            str = FilesizeToString(info.size());\r
+//        }\r
+//        QTableWidgetItem *iSize = new QTableWidgetItem(str);\r
+//        iSize->setFlags(iSize->flags() ^ Qt::ItemIsEditable);\r
+//        iSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
+//        ui->fileTable->setItem(row, 2, iSize);\r
+\r
+//        // 最終更新日時\r
+//        QTableWidgetItem *iDateTime = new QTableWidgetItem(\r
+//                    info.lastModified().toString("yy/MM/dd hh:mm"));\r
+//        iDateTime->setFlags(iDateTime->flags() ^ Qt::ItemIsEditable);\r
+//        ui->fileTable->setItem(row, 3, iDateTime);\r
+\r
+//        // シグナル処理の関係で、チェックボックスは最後に追加する\r
+//        QTableWidgetItem *iCheck = new QTableWidgetItem(tr(""));\r
+//        iCheck->setFlags(iCheck->flags() ^ Qt::ItemIsEditable);\r
+//        if (info.fileName() != "..") {\r
+//            iCheck->setFlags(iCheck->flags() | Qt::ItemIsUserCheckable);\r
+//            iCheck->setCheckState(Qt::Unchecked);\r
+//        }\r
+//        ui->fileTable->setItem(row, 0, iCheck);\r
+\r
+//    }\r
     ui->fileTable->selectRow(0);\r
     ui->fileTable->resizeRowsToContents();\r
 \r
@@ -193,44 +177,82 @@ void FolderPanel::UninstallWatcher()
     m_fsWatcher = NULL;\r
 }\r
 \r
-void FolderPanel::onUpdateMark(int, int column)\r
+const QString FolderPanel::side() const\r
 {\r
-    if (column != 0 || isUpdating()) {\r
-        return;\r
-    }\r
+    return ui->fileTable->side();\r
+}\r
 \r
-    // マークフォルダ数、ファイル数、サイズを計算する\r
-    int numFolders = 0;\r
-    int numFiles = 0;\r
-    quint64 sizeTotal = 0;\r
-    for (int n = 0; n < ui->fileTable->rowCount(); n++) {\r
-        if (ui->fileTable->item(n, 0)->checkState() != Qt::Checked) {\r
-            continue;\r
-        }\r
-        QString name = ui->fileTable->item(n, 1)->text();\r
-        QFileInfo info(m_dir.absoluteFilePath(name));\r
-        if (info.isDir()) {\r
-            numFolders++;\r
-        }\r
-        else {\r
-            numFiles++;\r
-            sizeTotal += info.size();\r
-        }\r
+void FolderPanel::setSide(const QString &side)\r
+{\r
+    ui->fileTable->setSide(side);\r
+\r
+    QSettings settings;\r
+    FileTableModel *model = new FileTableModel();\r
+    connect(model, SIGNAL(rootChanged(QString)),\r
+            ui->locationField, SLOT(setText(QString)));\r
+    connect(model, SIGNAL(stateChanged(int,int,quint64)),\r
+            this, SLOT(onStateChanged(int,int,quint64)));\r
+\r
+    //>>>>> フィルタ初期化\r
+    model->setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);\r
+    if (settings.value(IniKey_ShowHidden, false).toBool()) {\r
+        model->setFilter(model->filter() | QDir::Hidden);\r
+    }\r
+    if (settings.value(IniKey_ShowSystem, false).toBool()) {\r
+        model->setFilter(model->filter() | QDir::System);\r
+    }\r
+    //>>>>> ソート順初期化\r
+    model->setSorting(QDir::Name);  // 0\r
+    int sortBy = settings.value(side + slash + IniKey_SortBy, SortByName).toInt();\r
+    switch (sortBy) {\r
+    case SortByDate:    model->setSorting(model->sorting() | QDir::Time); break;\r
+    case SortBySize:    model->setSorting(model->sorting() | QDir::Size); break;\r
+    case SortByType:    model->setSorting(model->sorting() | QDir::Type); break;\r
+    default:            model->setSorting(model->sorting() | QDir::Name); break;\r
+    }\r
+    // デフォルトだと文字列は昇順で、数値は降順…orz\r
+    int orderBy = settings.value(side + slash + IniKey_OrderBy, OrderByDesc).toInt();\r
+    if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
+        ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
+    {\r
+        model->setSorting(model->sorting() | QDir::Reversed);\r
     }\r
+    // フォルダの位置\r
+    switch (settings.value(side + slash + IniKey_PutDirs, PutDirsFirst).toInt()) {\r
+    case PutDirsFirst:  model->setSorting(model->sorting() | QDir::DirsFirst); break;\r
+    case PutDirsLast:   model->setSorting(model->sorting() | QDir::DirsLast); break;\r
+    }\r
+    // 大文字小文字の区別\r
+    if (settings.value(side + slash + IniKey_IgnoreCase, true).toBool()) {\r
+        model->setSorting(model->sorting() | QDir::IgnoreCase);\r
+    }\r
+    //>>>>> 監視フォルダ初期化\r
+    QString key = side + slash + IniKey_Dir;\r
+    QString path = settings.value(key, QDir::homePath()).toString();\r
+    model->setPath(path);\r
+\r
+    ui->fileTable->setModel(model);\r
+    ui->fileTable->selectRow(0);\r
+    ui->fileTable->resizeColumnsToContents();\r
+    ui->fileTable->resizeRowsToContents();\r
+}\r
 \r
+void FolderPanel::onStateChanged(int checkedFolders, int checkedFiles, quint64 totalSize)\r
+{\r
     QString msg = "";\r
-    if (numFolders > 0) {\r
-        msg += tr("%1個のフォルダ ").arg(numFolders);\r
+    if (checkedFolders > 0) {\r
+        msg += tr("%1個のフォルダ ").arg(checkedFolders);\r
     }\r
-    if (numFiles > 0) {\r
-        msg += tr("%1個のファイル ").arg(numFiles);\r
+    if (checkedFiles > 0) {\r
+        msg += tr("%1個のファイル ").arg(checkedFiles);\r
     }\r
     if (msg.length() > 0) {\r
         msg += "を選択 合計 ";\r
-        msg += FilesizeToString(sizeTotal);\r
+        msg += FilesizeToString(totalSize);\r
     }\r
 \r
     ui->label->setText(msg);\r
+\r
 }\r
 \r
 void FolderPanel::on_locationField_editingFinished()\r
@@ -245,22 +267,22 @@ void FolderPanel::on_locationField_editingFinished()
 \r
 void FolderPanel::on_directoryChanged(QString)\r
 {\r
-    int row = ui->fileTable->currentRow();\r
-    this->setCurrentFolder(m_dir.absolutePath());\r
-    if (row >= ui->fileTable->rowCount()) {\r
-        row = ui->fileTable->rowCount() - 1;\r
-    }\r
-    ui->fileTable->selectRow(row);\r
+//    int row = ui->fileTable->currentRow();\r
+//    this->setCurrentFolder(m_dir.absolutePath());\r
+//    if (row >= ui->fileTable->rowCount()) {\r
+//        row = ui->fileTable->rowCount() - 1;\r
+//    }\r
+//    ui->fileTable->selectRow(row);\r
 }\r
 \r
-void FolderPanel::on_fileTable_itemSelectionChanged()\r
-{\r
-    if (isUpdating()) {\r
-        return;\r
-    }\r
-\r
-    int row = ui->fileTable->currentRow();\r
-    if (0 <= row && row < ui->fileTable->rowCount()) {\r
-        getMainWnd()->setStatusText(ui->fileTable->item(row, 1)->text());\r
-    }\r
-}\r
+//void FolderPanel::on_fileTable_itemSelectionChanged()\r
+//{\r
+//    if (isUpdating()) {\r
+//        return;\r
+//    }\r
+\r
+//    int row = ui->fileTable->currentRow();\r
+//    if (0 <= row && row < ui->fileTable->rowCount()) {\r
+//        getMainWnd()->setStatusText(ui->fileTable->item(row, 1)->text());\r
+//    }\r
+//}\r
index af50d82..d95effb 100644 (file)
@@ -6,7 +6,7 @@
 #include <QTableWidget>\r
 #include <QFileIconProvider>\r
 #include <QFileSystemWatcher>\r
-#include "filetablewidget.h"\r
+#include "filetableview.h"\r
 class MainWindow;\r
 \r
 namespace Ui {\r
@@ -21,8 +21,8 @@ public:
     explicit FolderPanel(QWidget *parent = 0);\r
     ~FolderPanel();\r
 \r
-    FileTableWidget* fileTable();\r
-    const FileTableWidget* fileTable() const;\r
+    QTableView *fileTable();\r
+    const QTableView* fileTable() const;\r
 \r
     QDir* dir() { return &m_dir; }\r
     const QDir* dir() const { return &m_dir; }\r
@@ -38,12 +38,12 @@ public:
     void endUpdate() {\r
         m_bUpdating = false;\r
 //        setUpdatesEnabled(true);\r
-        onUpdateMark(0, 0);\r
+        //onUpdateMark(0, 0);\r
     }\r
     bool isUpdating() const { return m_bUpdating; }\r
 \r
-    void setSide(const QString &side) { m_Side = side; }\r
-    const QString& side() const { return m_Side; }\r
+    const QString side() const;\r
+    void setSide(const QString &side);\r
 \r
 private:\r
     Ui::FolderPanel *ui;\r
@@ -51,13 +51,12 @@ private:
     QFileIconProvider m_IconFactory;\r
     QFileSystemWatcher *m_fsWatcher;\r
     bool m_bUpdating;\r
-    QString m_Side; // "Left" or "Right"\r
 \r
 private slots:\r
-    void onUpdateMark(int, int);\r
+    void onStateChanged(int checkedFolders, int checkedFiles, quint64 totalSize);\r
     void on_locationField_editingFinished();\r
     void on_directoryChanged(QString);\r
-    void on_fileTable_itemSelectionChanged();\r
+//    void on_fileTable_itemSelectionChanged();\r
 };\r
 \r
 #endif // FOLDERPANEL_H\r
index fd095b8..60002bc 100644 (file)
@@ -47,7 +47,7 @@
     </layout>\r
    </item>\r
    <item>\r
-    <widget class="FileTableWidget" name="fileTable">\r
+    <widget class="FileTableView" name="fileTable">\r
      <property name="horizontalScrollBarPolicy">\r
       <enum>Qt::ScrollBarAlwaysOff</enum>\r
      </property>\r
      <property name="wordWrap">\r
       <bool>false</bool>\r
      </property>\r
-     <property name="columnCount">\r
-      <number>4</number>\r
-     </property>\r
      <attribute name="horizontalHeaderHighlightSections">\r
       <bool>false</bool>\r
      </attribute>\r
      <attribute name="verticalHeaderVisible">\r
       <bool>false</bool>\r
      </attribute>\r
-     <column>\r
-      <property name="text">\r
-       <string/>\r
-      </property>\r
-     </column>\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
-     <column>\r
-      <property name="text">\r
-       <string>更新日時</string>\r
-      </property>\r
-     </column>\r
     </widget>\r
    </item>\r
    <item>\r
  </widget>\r
  <customwidgets>\r
   <customwidget>\r
-   <class>FileTableWidget</class>\r
-   <extends>QTableWidget</extends>\r
-   <header>filetablewidget.h</header>\r
+   <class>FileTableView</class>\r
+   <extends>QTableView</extends>\r
+   <header>filetableview.h</header>\r
   </customwidget>\r
  </customwidgets>\r
  <tabstops>\r
index 985970d..89e3bae 100644 (file)
@@ -14,7 +14,7 @@ public:
     const StringMap& renameMap() const { return m_RenameMap; }\r
 \r
     void setWorkingDirectory(const QString &path);\r
-    virtual void setNames(const QStringList &names) = 0;\r
+    virtual void setNames(const QFileInfoList &names) = 0;\r
 \r
 signals:\r
 \r
index fd3a878..95bd97c 100644 (file)
@@ -28,52 +28,36 @@ MainWindow::MainWindow(QWidget *parent) :
     ui->RPanel->setSide("Right");\r
 \r
     QSettings settings;\r
+    // メニュー項目のチェック状態を初期化する\r
     if (settings.value(IniKey_ShowHidden, false).toBool()) {\r
         ui->view_Hidden->setChecked(true);\r
     }\r
     if (settings.value(IniKey_ShowSystem, false).toBool()) {\r
         ui->view_System->setChecked(true);\r
     }\r
+    // 追加のショートカットキーを設定する\r
+    QList<QKeySequence> shortcuts;\r
+    shortcuts = ui->action_Open->shortcuts();\r
+    shortcuts.append(QKeySequence("M"));\r
+    ui->action_Open->setShortcuts(shortcuts);\r
 \r
-    // メニューのシグナル/スロットを設定する\r
-    connect(ui->action_Command, SIGNAL(triggered()), this, SLOT(onActionCommand()));\r
-    connect(ui->action_Exec, SIGNAL(triggered()), this, SLOT(onActionExec()));\r
-    connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(onActionOpen()));\r
-    connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(onActionQuit()));\r
-    connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(onActionSetting()));\r
+    shortcuts = ui->action_Exec->shortcuts();\r
+    shortcuts.append(QKeySequence("Shift+M"));\r
+    ui->action_Exec->setShortcuts(shortcuts);\r
 \r
-    connect(ui->mark_All, SIGNAL(triggered()), this, SLOT(onMarkAll()));\r
-    connect(ui->mark_AllFiles, SIGNAL(triggered()), this, SLOT(onMarkAllFiles()));\r
-    connect(ui->mark_AllOff, SIGNAL(triggered()), this, SLOT(onMarkAllOff()));\r
-    connect(ui->mark_Invert, SIGNAL(triggered()), this, SLOT(onMarkInvert()));\r
-    connect(ui->mark_Toggle, SIGNAL(triggered()), this, SLOT(onMarkToggle()));\r
+    // シグナル/スロットを設定する\r
+    connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(onActionSetting()));\r
+    connect(ui->action_Quit, SIGNAL(triggered()), qApp, SLOT(quit()));\r
+    connect(ui->help_About, SIGNAL(triggered()), this, SLOT(onHelpAbout()));\r
 \r
-    connect(ui->move_Down, SIGNAL(triggered()), this, SLOT(onMoveCursorDown()));\r
-    connect(ui->move_Up, SIGNAL(triggered()), this, SLOT(onMoveCursorUp()));\r
-    connect(ui->move_Begin, SIGNAL(triggered()), this, SLOT(onMoveCursorBegin()));\r
-    connect(ui->move_End, SIGNAL(triggered()), this, SLOT(onMoveCursorEnd()));\r
-    connect(ui->move_Back, SIGNAL(triggered()), this, SLOT(onMoveBack()));\r
-    connect(ui->move_Forward, SIGNAL(triggered()), this, SLOT(onMoveForward()));\r
-    connect(ui->move_Home, SIGNAL(triggered()), this, SLOT(onMoveHome()));\r
-    connect(ui->move_Jump, SIGNAL(triggered()), this, SLOT(onMoveJump()));\r
-    connect(ui->move_Parent, SIGNAL(triggered()), this, SLOT(onMoveParent()));\r
-    connect(ui->move_Root, SIGNAL(triggered()), this, SLOT(onMoveRoot()));\r
 \r
-    connect(ui->view_FromOther, SIGNAL(triggered()), this, SLOT(onViewFromOther()));\r
-    connect(ui->view_ToOther, SIGNAL(triggered()), this, SLOT(onViewToOther()));\r
-    connect(ui->view_Hidden, SIGNAL(triggered()), this, SLOT(onViewHidden()));\r
-    connect(ui->view_Sort, SIGNAL(triggered()), this, SLOT(onViewSort()));\r
-    connect(ui->view_Swap, SIGNAL(triggered()), this, SLOT(onViewSwap()));\r
-    connect(ui->view_System, SIGNAL(triggered()), this, SLOT(onViewSystem()));\r
+//    connect(ui->view_FromOther, SIGNAL(triggered()), this, SLOT(onViewFromOther()));\r
+//    connect(ui->view_ToOther, SIGNAL(triggered()), this, SLOT(onViewToOther()));\r
+//    connect(ui->view_Swap, SIGNAL(triggered()), this, SLOT(onViewSwap()));\r
 \r
-    connect(ui->cmd_Copy, SIGNAL(triggered()), this, SLOT(onCmdCopy()));\r
-    connect(ui->cmd_Delete, SIGNAL(triggered()), this, SLOT(onCmdDelete()));\r
-    connect(ui->cmd_Move, SIGNAL(triggered()), this, SLOT(onCmdMove()));\r
-    connect(ui->cmd_NewFile, SIGNAL(triggered()), this, SLOT(onCmdNewFile()));\r
-    connect(ui->cmd_NewFolder, SIGNAL(triggered()), this, SLOT(onCmdNewFolder()));\r
-    connect(ui->cmd_Rename, SIGNAL(triggered()), this, SLOT(onCmdRename()));\r
+//    connect(ui->cmd_Copy, SIGNAL(triggered()), this, SLOT(onCmdCopy()));\r
+//    connect(ui->cmd_Move, SIGNAL(triggered()), this, SLOT(onCmdMove()));\r
 \r
-    connect(ui->help_About, SIGNAL(triggered()), this, SLOT(onHelpAbout()));\r
 \r
     // ウィンドウタイトルを設定する\r
     setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));\r
@@ -83,74 +67,6 @@ MainWindow::MainWindow(QWidget *parent) :
     // ウィンドウ初期サイズを設定する\r
     resize(800, 600);\r
 \r
-\r
-    int sortBy, orderBy;\r
-    // 左ペインのソート初期値\r
-    QDir *dir;\r
-    dir = ui->LPanel->dir();\r
-    dir->setSorting(QDir::Name);  // 0\r
-\r
-    sortBy = settings.value(IniKey_LeftSortBy, SortByName).toInt();\r
-    switch (sortBy) {\r
-    case SortByDate:    dir->setSorting(dir->sorting() | QDir::Time); break;\r
-    case SortBySize:    dir->setSorting(dir->sorting() | QDir::Size); break;\r
-    case SortByType:    dir->setSorting(dir->sorting() | QDir::Type); break;\r
-    default:            dir->setSorting(dir->sorting() | QDir::Name); break;\r
-    }\r
-\r
-    // デフォルトだと文字列は昇順で、数値は降順…orz\r
-    orderBy = settings.value(IniKey_LeftOrderBy, OrderByDesc).toInt();\r
-    if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
-        ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
-    {\r
-        dir->setSorting(dir->sorting() | QDir::Reversed);\r
-    }\r
-\r
-    switch (settings.value(IniKey_LeftPutDirs, PutDirsFirst).toInt()) {\r
-    case PutDirsFirst:  dir->setSorting(dir->sorting() | QDir::DirsFirst); break;\r
-    case PutDirsLast:   dir->setSorting(dir->sorting() | QDir::DirsLast); break;\r
-    }\r
-\r
-    if (settings.value(IniKey_LeftIgnoreCase, true).toBool()) {\r
-        dir->setSorting(dir->sorting() | QDir::IgnoreCase);\r
-    }\r
-\r
-    // 右ペインのソート初期値\r
-    dir = ui->RPanel->dir();\r
-    dir->setSorting(QDir::Name);  // 0\r
-\r
-    sortBy = settings.value(IniKey_RightSortBy, SortByName).toInt();\r
-    switch (sortBy) {\r
-    case SortByDate:    dir->setSorting(dir->sorting() | QDir::Time); break;\r
-    case SortBySize:    dir->setSorting(dir->sorting() | QDir::Size); break;\r
-    case SortByType:    dir->setSorting(dir->sorting() | QDir::Type); break;\r
-    default:            dir->setSorting(dir->sorting() | QDir::Name); break;\r
-    }\r
-\r
-    // デフォルトだと文字列は昇順で、数値は降順…orz\r
-    orderBy = settings.value(IniKey_RightOrderBy, OrderByDesc).toInt();\r
-    if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
-        ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
-    {\r
-        dir->setSorting(dir->sorting() | QDir::Reversed);\r
-    }\r
-\r
-    switch (settings.value(IniKey_RightPutDirs, PutDirsFirst).toInt()) {\r
-    case PutDirsFirst:  dir->setSorting(dir->sorting() | QDir::DirsFirst); break;\r
-    case PutDirsLast:   dir->setSorting(dir->sorting() | QDir::DirsLast); break;\r
-    }\r
-\r
-    if (settings.value(IniKey_RightIgnoreCase, true).toBool()) {\r
-        dir->setSorting(dir->sorting() | QDir::IgnoreCase);\r
-    }\r
-\r
-    QString path;\r
-\r
-    path = settings.value(IniKey_LeftDir, QDir::homePath()).toString();\r
-    ui->LPanel->setCurrentFolder(path);\r
-\r
-    path = settings.value(IniKey_RightDir, QDir::homePath()).toString();\r
-    ui->RPanel->setCurrentFolder(path);\r
 }\r
 \r
 MainWindow::~MainWindow()\r
@@ -168,6 +84,20 @@ void MainWindow::setStatusText(const QString &str)
     ui->statusBar->showMessage(str);\r
 }\r
 \r
+FileTableView *MainWindow::otherSideView(const FileTableView *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
+    }\r
+\r
+    qDebug() << w->objectName();\r
+    return NULL;\r
+}\r
+\r
 FolderPanel* MainWindow::activePanel()\r
 {\r
     if (ui->LPanel->fileTable()->hasFocus()) {\r
@@ -194,116 +124,6 @@ FolderPanel* MainWindow::inactivePanel()
 }\r
 \r
 ///\r
-/// \brief MainWindow::onActionCommand\r
-///\r
-/// コマンドを実行します(X)\r
-///\r
-void MainWindow::onActionCommand()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (!fp) {\r
-        return;\r
-    }\r
-\r
-    QString command = "";\r
-    for (int n = 0; n < fp->fileTable()->rowCount(); n++) {\r
-        if (fp->fileTable()->item(n, 0)->checkState() == Qt::Checked) {\r
-            QString path = fp->fileTable()->item(n, 1)->text();\r
-            path = fp->dir()->absoluteFilePath(path);\r
-            path = QDir::cleanPath(path);\r
-            path = QDir::toNativeSeparators(path);\r
-\r
-            QFileInfo info(path);\r
-            if (info.isExecutable()) {\r
-                command = "\"" + path + "\" " + command;\r
-            }\r
-            else {\r
-                command += " \"" + path + "\"";\r
-            }\r
-        }\r
-    }\r
-\r
-    if (command.isEmpty()) {\r
-        int row = fp->fileTable()->currentRow();\r
-        QString path = fp->fileTable()->item(row, 1)->text();\r
-        path = fp->dir()->absoluteFilePath(path);\r
-        path = QDir::cleanPath(path);\r
-        path = QDir::toNativeSeparators(path);\r
-\r
-        command = "\"" + path + "\"";\r
-    }\r
-\r
-    QInputDialog dlg(this);\r
-    dlg.setInputMode(QInputDialog::TextInput);\r
-    dlg.setLabelText(tr("コマンドを入力:"));\r
-    dlg.setWindowTitle(tr("コマンドを実行"));\r
-    dlg.setTextValue(command);\r
-    dlg.resize(500, 100);\r
-    int ret = dlg.exec();\r
-    command = dlg.textValue();\r
-    if (ret == QDialog::Accepted && !command.isEmpty()) {\r
-        QProcess process(this);\r
-        process.setWorkingDirectory(fp->dir()->absolutePath());\r
-        if (!process.startDetached(command)) {\r
-            QMessageBox::critical(\r
-                        this,\r
-                        tr("エラー"),\r
-                        tr("コマンドの実行に失敗しました。<br/>") + command);\r
-        }\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onActionExec\r
-///\r
-/// アプリケーションで開きます(Shift + Enter)\r
-///\r
-void MainWindow::onActionExec()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (!fp) {\r
-        return;\r
-    }\r
-\r
-    QStringList list = selectedItems(fp);\r
-    foreach (const QString &path, list) {\r
-        QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(path)));\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onActionOpen\r
-///\r
-/// フォルダを開きます(Enter)\r
-///\r
-void MainWindow::onActionOpen()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (!fp) {\r
-        return;\r
-    }\r
-\r
-    int row = fp->fileTable()->currentRow();\r
-    QString path = fp->fileTable()->item(row, 1)->text();\r
-    path = fp->dir()->absoluteFilePath(path);\r
-    QFileInfo info(path);\r
-\r
-    if (info.isDir()) {\r
-        fp->setCurrentFolder(path);\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onActionQuit\r
-///\r
-/// アプリケーションを終了します(Q)\r
-///\r
-void MainWindow::onActionQuit()\r
-{\r
-    qApp->quit();\r
-}\r
-\r
-///\r
 /// \brief MainWindow::onActionSetting\r
 ///\r
 /// 環境設定ダイアログを表示します(Z)\r
@@ -313,334 +133,6 @@ void MainWindow::onActionSetting()
     QMessageBox::information(this, tr("情報"), tr("環境設定機能は未実装です。"));\r
 }\r
 \r
-///\r
-/// \brief MainWindow::on_mark_All_triggered\r
-///\r
-/// すべてマークします(Shift + A)\r
-///\r
-void MainWindow::onMarkAll()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    int row = 0;\r
-    if (fp->fileTable()->item(row, 1)->text() == "..") {\r
-        row++;\r
-    }\r
-\r
-    fp->beginUpdate();\r
-    int curRow = fp->fileTable()->currentRow();\r
-    int rowCount = fp->fileTable()->rowCount();\r
-    for (; row < rowCount; row++) {\r
-        fp->fileTable()->item(row, 0)->setCheckState(Qt::Checked);\r
-    }\r
-    fp->fileTable()->setCurrentIndex(\r
-                fp->fileTable()->model()->index(curRow, 1));\r
-    fp->endUpdate();\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMarkAllFiles\r
-///\r
-/// すべての「ファイル」をマークします(A)\r
-///\r
-void MainWindow::onMarkAllFiles()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    int row = 0;\r
-    if (fp->fileTable()->item(row, 1)->text() == "..") {\r
-        row++;\r
-    }\r
-\r
-    fp->beginUpdate();\r
-    int curRow = fp->fileTable()->currentRow();\r
-    int rowCount = fp->fileTable()->rowCount();\r
-    for (; row < rowCount; row++) {\r
-        QString path = fp->fileTable()->item(row, 1)->text();\r
-        path = fp->dir()->absoluteFilePath(path);\r
-\r
-        QFileInfo info(path);\r
-        if (info.isDir()) {\r
-            fp->fileTable()->item(row, 0)->setCheckState(Qt::Unchecked);\r
-        }\r
-        else {\r
-           fp->fileTable()->item(row, 0)->setCheckState(Qt::Checked);\r
-        }\r
-    }\r
-    fp->fileTable()->setCurrentIndex(\r
-                fp->fileTable()->model()->index(curRow, 1));\r
-    fp->endUpdate();\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMarkAllOff\r
-///\r
-/// すべてのマークを解除します(U)\r
-///\r
-void MainWindow::onMarkAllOff()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    int row = 0;\r
-    if (fp->fileTable()->item(row, 1)->text() == "..") {\r
-        row++;\r
-    }\r
-\r
-    fp->beginUpdate();\r
-    int curRow = fp->fileTable()->currentRow();\r
-    int rowCount = fp->fileTable()->rowCount();\r
-    for (; row < rowCount; row++) {\r
-        fp->fileTable()->item(row, 0)->setCheckState(Qt::Unchecked);\r
-    }\r
-    fp->fileTable()->setCurrentIndex(\r
-                fp->fileTable()->model()->index(curRow, 1));\r
-    fp->endUpdate();\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMarkInvert\r
-///\r
-/// マークを反転します(I)\r
-///\r
-void MainWindow::onMarkInvert()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    int row = 0;\r
-    if (fp->fileTable()->item(row, 1)->text() == "..") {\r
-        row++;\r
-    }\r
-\r
-    fp->beginUpdate();\r
-    int curRow = fp->fileTable()->currentRow();\r
-    int rowCount = fp->fileTable()->rowCount();\r
-    for (; row < rowCount; row++) {\r
-        QTableWidgetItem *item = fp->fileTable()->item(row, 0);\r
-        if (item->checkState() == Qt::Checked) {\r
-            item->setCheckState(Qt::Unchecked);\r
-        }\r
-        else {\r
-            item->setCheckState(Qt::Checked);\r
-        }\r
-    }\r
-    fp->fileTable()->setCurrentIndex(\r
-                fp->fileTable()->model()->index(curRow, 1));\r
-    fp->endUpdate();\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMarkToggle\r
-///\r
-/// マークを設定または解除します(Space)\r
-///\r
-void MainWindow::onMarkToggle()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    int row = fp->fileTable()->currentRow();\r
-    QTableWidgetItem *item = fp->fileTable()->item(row, 0);\r
-    if (fp->fileTable()->item(row, 1)->text() != "..") {\r
-       if (item->checkState() == Qt::Checked) {\r
-            item->setCheckState(Qt::Unchecked);\r
-       }\r
-        else {\r
-            item->setCheckState(Qt::Checked);\r
-       }\r
-    }\r
-    // 最終行でなければ、次のアイテムに移動する\r
-    if (row < fp->fileTable()->rowCount() - 1) {\r
-        QModelIndex nextIndex = fp->fileTable()->model()->index(row + 1, 1);\r
-        fp->fileTable()->setCurrentIndex(nextIndex);\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMoveCursorDown\r
-///\r
-/// カーソルを下に移動します(J)\r
-///\r
-void MainWindow::onMoveCursorDown()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    int row = fp->fileTable()->currentRow();\r
-    if (row < fp->fileTable()->rowCount() - 1) {\r
-        QModelIndex nextIndex = fp->fileTable()->model()->index(row + 1, 1);\r
-        fp->fileTable()->setCurrentIndex(nextIndex);\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMoveCursorUp\r
-///\r
-/// カーソルを上に移動します(K)\r
-///\r
-void MainWindow::onMoveCursorUp()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    int row = fp->fileTable()->currentRow();\r
-    if (row > 0) {\r
-        QModelIndex nextIndex = fp->fileTable()->model()->index(row - 1, 1);\r
-        fp->fileTable()->setCurrentIndex(nextIndex);\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMoveCursorBegin\r
-///\r
-/// カーソルを先頭に移動します(G)\r
-///\r
-void MainWindow::onMoveCursorBegin()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    QModelIndex nextIndex = fp->fileTable()->model()->index(0, 1);\r
-    fp->fileTable()->setCurrentIndex(nextIndex);\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMoveCursorEnd\r
-///\r
-/// カーソルを末尾に移動します(Shift + G)\r
-void MainWindow::onMoveCursorEnd()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    int row = fp->fileTable()->rowCount() - 1;\r
-    QModelIndex nextIndex = fp->fileTable()->model()->index(row, 1);\r
-    fp->fileTable()->setCurrentIndex(nextIndex);\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMoveBack\r
-///\r
-/// 前の履歴に戻ります(Alt + ←)\r
-///\r
-void MainWindow::onMoveBack()\r
-{\r
-    QMessageBox::information(this, tr("情報"), tr("履歴機能は未実装です。"));\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMoveForward\r
-///\r
-/// 次の履歴に進みます(Alt + →)\r
-///\r
-void MainWindow::onMoveForward()\r
-{\r
-    QMessageBox::information(this, tr("情報"), tr("履歴機能は未実装です。"));\r
-\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMoveHome\r
-///\r
-/// ホームフォルダに移動します(H)\r
-///\r
-void MainWindow::onMoveHome()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    fp->setCurrentFolder(QDir::homePath());\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMoveJump\r
-///\r
-/// フォルダを選択して移動します(Shift + J)\r
-void MainWindow::onMoveJump()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    QString path = QFileDialog::getExistingDirectory(\r
-                this,\r
-                tr("フォルダを選択"),\r
-                fp->dir()->absolutePath());\r
-    if (!path.isEmpty()) {\r
-        fp->setCurrentFolder(path);\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMoveOther\r
-///\r
-/// キーボードフォーカスを他方のパネルに移動します(TAB)\r
-///\r
-void MainWindow::onMoveOther()\r
-{\r
-    FolderPanel *fp = this->inactivePanel();\r
-    if (fp) {\r
-        fp->fileTable()->setFocus();\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMoveParent\r
-///\r
-/// 親フォルダに移動します(Backspace)\r
-///\r
-void MainWindow::onMoveParent()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    if (!fp->dir()->isRoot()) {\r
-        QString path = fp->dir()->absoluteFilePath("..");\r
-        fp->setCurrentFolder(path);\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onMoveRoot\r
-///\r
-/// ルートフォルダに移動します()\r
-void MainWindow::onMoveRoot()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (fp == NULL) {\r
-        return;\r
-    }\r
-\r
-    if (!fp->dir()->isRoot()) {\r
-        fp->setCurrentFolder(QDir::rootPath());\r
-    }\r
-}\r
 \r
 ///\r
 /// \brief MainWindow::onViewFromOther\r
@@ -674,81 +166,6 @@ void MainWindow::onViewToOther()
     fp2->setCurrentFolder(fp1->dir()->absolutePath());\r
 }\r
 \r
-///\r
-/// \brief MainWindow::onViewHidden\r
-///\r
-/// 隠しファイルの表示/非表示を切り替えます(Shift + H)\r
-///\r
-void MainWindow::onViewHidden()\r
-{\r
-    QSettings settings;\r
-    bool checked = !settings.value(IniKey_ShowHidden, false).toBool();\r
-    settings.setValue(IniKey_ShowHidden, checked);\r
-    ui->view_Hidden->setChecked(checked);\r
-#if 1\r
-    if (checked) {\r
-        ui->LPanel->dir()->setFilter(ui->LPanel->dir()->filter() | QDir::Hidden);\r
-        ui->RPanel->dir()->setFilter(ui->RPanel->dir()->filter() | QDir::Hidden);\r
-    }\r
-    else {\r
-        ui->LPanel->dir()->setFilter(ui->LPanel->dir()->filter() ^ QDir::Hidden);\r
-        ui->RPanel->dir()->setFilter(ui->RPanel->dir()->filter() ^ QDir::Hidden);\r
-    }\r
-#endif\r
-    ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());\r
-    ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());\r
-}\r
-\r
-void MainWindow::onViewSort()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (!fp) {\r
-        return;\r
-    }\r
-\r
-    QString iniSec;\r
-    SortDialog dlg(this);\r
-    if (fp == ui->LPanel) {\r
-        iniSec = IniSec_Left;\r
-    }\r
-    else {\r
-        iniSec = IniSec_Right;\r
-    }\r
-\r
-    dlg.setRightOrLeft(iniSec);\r
-    if (dlg.exec() == QDialog::Accepted) {\r
-        QSettings settings;\r
-        QDir *dir = fp->dir();\r
-        dir->setSorting(QDir::Name);  // 0\r
-\r
-        int sortBy = settings.value(iniSec + slash + IniKey_SortBy, 0).toInt();\r
-        switch (sortBy) {\r
-        case SortByDate:    dir->setSorting(dir->sorting() | QDir::Time); break;\r
-        case SortBySize:    dir->setSorting(dir->sorting() | QDir::Size); break;\r
-        case SortByType:    dir->setSorting(dir->sorting() | QDir::Type); break;\r
-        default:            dir->setSorting(dir->sorting() | QDir::Name); break;\r
-        }\r
-\r
-        // デフォルトだと文字列は昇順で、数値は降順…orz\r
-        int orderBy = settings.value(iniSec + slash + IniKey_OrderBy, 0).toInt();\r
-        if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
-            ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
-        {\r
-            dir->setSorting(dir->sorting() | QDir::Reversed);\r
-        }\r
-\r
-        switch (settings.value(iniSec + slash + IniKey_PutDirs, 0).toInt()) {\r
-        case PutDirsFirst:  dir->setSorting(dir->sorting() | QDir::DirsFirst); break;\r
-        case PutDirsLast:   dir->setSorting(dir->sorting() | QDir::DirsLast); break;\r
-        }\r
-\r
-        if (settings.value(iniSec + slash + IniKey_IgnoreCase, true).toBool()) {\r
-            dir->setSorting(dir->sorting() | QDir::IgnoreCase);\r
-        }\r
-\r
-        fp->setCurrentFolder(fp->dir()->absolutePath());\r
-    }\r
-}\r
 \r
 ///\r
 /// \brief MainWindow::onViewSwap\r
@@ -770,33 +187,6 @@ void MainWindow::onViewSwap()
     fp2->setCurrentFolder(path1);\r
 }\r
 \r
-///\r
-/// \brief MainWindow::onViewSystem\r
-///\r
-/// システムファイルの表示/非表示を切り替えます(Shift + H)\r
-///\r
-void MainWindow::onViewSystem()\r
-{\r
-    QSettings settings;\r
-    bool checked = !settings.value(IniKey_ShowSystem, false).toBool();\r
-    settings.setValue(IniKey_ShowSystem, checked);\r
-    ui->view_System->setChecked(checked);\r
-#if 1\r
-    QDir *dirs[2];\r
-    dirs[0] = ui->LPanel->dir();\r
-    dirs[1] = ui->RPanel->dir();\r
-    for (int n = 0; n < 2; n++) {\r
-        if (checked) {\r
-            dirs[n]->setFilter(dirs[n]->filter() | QDir::System);\r
-        }\r
-        else {\r
-            dirs[n]->setFilter(dirs[n]->filter() ^ QDir::System);\r
-        }\r
-    }\r
-#endif\r
-    ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());\r
-    ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());\r
-}\r
 \r
 ///\r
 /// \brief MainWindow::onCmdMove\r
@@ -810,27 +200,27 @@ void MainWindow::onCmdMove()
         return;\r
     }\r
 \r
-    QStringList list = selectedItems(fp);\r
-    if (list.isEmpty()) {\r
-        return;\r
-    }\r
+//    QStringList list = selectedItems(fp);\r
+//    if (list.isEmpty()) {\r
+//        return;\r
+//    }\r
 \r
-    CopyMoveWorker *worker = new CopyMoveWorker();\r
-    connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),\r
-            this, SLOT(onAskOverWrite(bool*,int*,int*,QString*,QString,QString)));\r
-    worker->setCopyList(&list);\r
-    worker->setTargetDir(inactivePanel()->dir()->absolutePath());\r
-    worker->setMoveMode(true);\r
+//    CopyMoveWorker *worker = new CopyMoveWorker();\r
+//    connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),\r
+//            this, SLOT(onAskOverWrite(bool*,int*,int*,QString*,QString,QString)));\r
+//    worker->setCopyList(&list);\r
+//    worker->setTargetDir(inactivePanel()->dir()->absolutePath());\r
+//    worker->setMoveMode(true);\r
 \r
-    OperationDialog opDlg(this);\r
-    opDlg.setWindowTitle(tr("移動"));\r
-    opDlg.setWorker(worker);\r
+//    OperationDialog opDlg(this);\r
+//    opDlg.setWindowTitle(tr("移動"));\r
+//    opDlg.setWorker(worker);\r
 \r
-    ui->LPanel->UninstallWatcher();\r
-    ui->RPanel->UninstallWatcher();\r
-    opDlg.exec();\r
-    ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());\r
-    ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());\r
+//    ui->LPanel->UninstallWatcher();\r
+//    ui->RPanel->UninstallWatcher();\r
+//    opDlg.exec();\r
+//    ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());\r
+//    ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());\r
 \r
 }\r
 \r
@@ -846,27 +236,27 @@ void MainWindow::onCmdCopy()
         return;\r
     }\r
 \r
-    QStringList list = selectedItems(fp);\r
-    if (list.isEmpty()) {\r
-        return;\r
-    }\r
+//    QStringList list = selectedItems(fp);\r
+//    if (list.isEmpty()) {\r
+//        return;\r
+//    }\r
 \r
-    CopyMoveWorker *worker = new CopyMoveWorker();\r
-    connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),\r
-            this, SLOT(onAskOverWrite(bool*,int*,int*,QString*,QString,QString)));\r
-    worker->setCopyList(&list);\r
-    worker->setTargetDir(inactivePanel()->dir()->absolutePath());\r
-    worker->setMoveMode(false);\r
+//    CopyMoveWorker *worker = new CopyMoveWorker();\r
+//    connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),\r
+//            this, SLOT(onAskOverWrite(bool*,int*,int*,QString*,QString,QString)));\r
+//    worker->setCopyList(&list);\r
+//    worker->setTargetDir(inactivePanel()->dir()->absolutePath());\r
+//    worker->setMoveMode(false);\r
 \r
-    OperationDialog opDlg(this);\r
-    opDlg.setWindowTitle(tr("コピー"));\r
-    opDlg.setWorker(worker);\r
+//    OperationDialog opDlg(this);\r
+//    opDlg.setWindowTitle(tr("コピー"));\r
+//    opDlg.setWorker(worker);\r
 \r
-    ui->LPanel->UninstallWatcher();\r
-    ui->RPanel->UninstallWatcher();\r
-    opDlg.exec();\r
-    ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());\r
-    ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());\r
+//    ui->LPanel->UninstallWatcher();\r
+//    ui->RPanel->UninstallWatcher();\r
+//    opDlg.exec();\r
+//    ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());\r
+//    ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());\r
 \r
 }\r
 \r
@@ -905,155 +295,6 @@ void MainWindow::onAskOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod,
 }\r
 \r
 ///\r
-/// \brief MainWindow::onCmdDelete\r
-///\r
-/// ファイルを削除します\r
-///\r
-void MainWindow::onCmdDelete()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (!fp) {\r
-        return;\r
-    }\r
-\r
-    QStringList list = selectedItems(fp);\r
-    if (list.isEmpty()) {\r
-        return;\r
-    }\r
-\r
-    QString msg;\r
-    if (list.size() == 1) {\r
-        msg = QFileInfo(list.at(0)).fileName();\r
-    }\r
-    else {\r
-        msg = tr("%1個のアイテム").arg(list.size());\r
-    }\r
-    int ret = QMessageBox::question(\r
-                this,\r
-                tr("確認"),\r
-                msg + tr("を削除します<br/>よろしいですか?"));\r
-    if (ret == QMessageBox::Yes) {\r
-        DeleteWorker *worker = new DeleteWorker();\r
-        worker->setDeleteList(&list);\r
-\r
-        OperationDialog opDlg(this);\r
-        opDlg.setWindowTitle(tr("削除"));\r
-        opDlg.setWorker(worker);\r
-\r
-        ui->LPanel->UninstallWatcher();\r
-        ui->RPanel->UninstallWatcher();\r
-        opDlg.exec();\r
-        ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());\r
-        ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onCmdNewFile\r
-///\r
-/// ファイルを作成します\r
-///\r
-void MainWindow::onCmdNewFile()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (!fp) {\r
-        return;\r
-    }\r
-\r
-    bool bOk;\r
-    QString name = QInputDialog::getText(\r
-                this,\r
-                tr("ファイルを作成"),\r
-                tr("ファイル名"),\r
-                QLineEdit::Normal,\r
-                "",\r
-                &bOk);\r
-    if (bOk && !name.isEmpty()) {\r
-        QFile file(fp->dir()->absoluteFilePath(name));\r
-        if (!file.open(QIODevice::WriteOnly)) {\r
-            QMessageBox::critical(this,\r
-                                  tr("エラー"),\r
-                                  tr("ファイルの作成に失敗しました。"));\r
-        }\r
-        else {\r
-            file.close();\r
-        }\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onCmdNewFolder\r
-///\r
-/// フォルダを作成します\r
-///\r
-void MainWindow::onCmdNewFolder()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (!fp) {\r
-        return;\r
-    }\r
-\r
-    bool bOk;\r
-    QString name = QInputDialog::getText(\r
-                this,\r
-                tr("フォルダを作成"),\r
-                tr("フォルダ名"),\r
-                QLineEdit::Normal,\r
-                "",\r
-                &bOk);\r
-    if (bOk && !name.isEmpty()) {\r
-        if (!fp->dir()->mkpath(name)) {\r
-            QMessageBox::critical(this,\r
-                                  tr("エラー"),\r
-                                  tr("フォルダの作成に失敗しました。"));\r
-        }\r
-    }\r
-}\r
-\r
-///\r
-/// \brief MainWindow::onCmdRename\r
-///\r
-/// 名前を変更します\r
-///\r
-void MainWindow::onCmdRename()\r
-{\r
-    FolderPanel *fp = activePanel();\r
-    if (!fp) {\r
-        return;\r
-    }\r
-\r
-    QStringList list = selectedItems(fp);\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(fp->dir()->absolutePath());\r
-    dlg->setNames(list);\r
-    int dlgResult = dlg->exec();\r
-    if (dlgResult == QDialog::Accepted && !dlg->renameMap().isEmpty()) {\r
-        RenameWorker *worker = new RenameWorker();\r
-        worker->setRenameMap(&dlg->renameMap());\r
-\r
-        OperationDialog opDlg(this);\r
-        opDlg.setWindowTitle(tr("名前を変更"));\r
-        opDlg.setWorker(worker);\r
-\r
-        ui->LPanel->UninstallWatcher();\r
-        ui->RPanel->UninstallWatcher();\r
-        opDlg.exec();\r
-        ui->LPanel->setCurrentFolder(ui->LPanel->dir()->absolutePath());\r
-        ui->RPanel->setCurrentFolder(ui->RPanel->dir()->absolutePath());\r
-    }\r
-}\r
-\r
-///\r
 /// \brief MainWindow::onHelpAbout\r
 ///\r
 /// アプリケーションの概要を表示します(?)\r
@@ -1070,33 +311,6 @@ void MainWindow::onHelpAbout()
 }\r
 \r
 ///\r
-/// \brief MainWindow::selectedItems\r
-/// \param fp フォルダパネルへのポインタ\r
-/// \return 選択アイテムのフルパスのリスト\r
-///\r
-/// 選択アイテムのフルパスのリストを取得します\r
-///\r
-QStringList MainWindow::selectedItems(FolderPanel *fp)\r
-{\r
-    QStringList list;\r
-    for (int n = 0; n < fp->fileTable()->rowCount(); n++) {\r
-        if (fp->fileTable()->item(n, 0)->checkState() == Qt::Checked) {\r
-            list << fp->dir()->absoluteFilePath(fp->fileTable()->item(n, 1)->text());\r
-        }\r
-    }\r
-\r
-    if (list.isEmpty()) {\r
-        int row = fp->fileTable()->currentRow();\r
-        QString name = fp->fileTable()->item(row, 1)->text();\r
-        if (name != "..") {\r
-            list << fp->dir()->absoluteFilePath(name);\r
-        }\r
-    }\r
-\r
-    return list;\r
-}\r
-\r
-///\r
 /// \brief getMainWnd\r
 /// \return メインウィンドウのポインタ\r
 ///\r
index d150c7b..13049bc 100644 (file)
@@ -4,6 +4,7 @@
 #include <QFileInfo>\r
 #include <QMainWindow>\r
 class FolderPanel;\r
+class FileTableView;\r
 \r
 namespace Ui {\r
 class MainWindow;\r
@@ -18,46 +19,15 @@ public:
     ~MainWindow();\r
 \r
     void setStatusText(const QString &str);\r
+    FileTableView* otherSideView(const FileTableView *view) const;\r
 \r
 public slots:\r
-    void onActionCommand();\r
-    void onActionExec();\r
-    void onActionOpen();\r
-    void onActionQuit();\r
     void onActionSetting();\r
-\r
-    void onMarkAll();\r
-    void onMarkAllFiles();\r
-    void onMarkAllOff();\r
-    void onMarkInvert();\r
-    void onMarkToggle();\r
-\r
-    void onMoveCursorDown();\r
-    void onMoveCursorUp();\r
-    void onMoveCursorBegin();\r
-    void onMoveCursorEnd();\r
-    void onMoveBack();\r
-    void onMoveForward();\r
-    void onMoveHome();\r
-    void onMoveJump();\r
-    void onMoveOther();\r
-    void onMoveParent();\r
-    void onMoveRoot();\r
-\r
     void onViewFromOther();\r
     void onViewToOther();\r
-    void onViewHidden();\r
-    void onViewSort();\r
     void onViewSwap();\r
-    void onViewSystem();\r
-\r
     void onCmdMove();\r
     void onCmdCopy();\r
-    void onCmdDelete();\r
-    void onCmdNewFile();\r
-    void onCmdNewFolder();\r
-    void onCmdRename();\r
-\r
     void onHelpAbout();\r
 \r
 private slots:\r
@@ -69,7 +39,6 @@ private:
 \r
     FolderPanel* activePanel();\r
     FolderPanel* inactivePanel();\r
-    QStringList selectedItems(FolderPanel *fp);\r
 };\r
 \r
 \r
index 49a0d61..ef58a63 100644 (file)
@@ -68,6 +68,9 @@
           <height>0</height>\r
          </size>\r
         </property>\r
+        <property name="focusPolicy">\r
+         <enum>Qt::NoFocus</enum>\r
+        </property>\r
         <property name="text">\r
          <string>PushButton</string>\r
         </property>\r
@@ -81,6 +84,9 @@
           <height>0</height>\r
          </size>\r
         </property>\r
+        <property name="focusPolicy">\r
+         <enum>Qt::NoFocus</enum>\r
+        </property>\r
         <property name="text">\r
          <string>PushButton</string>\r
         </property>\r
           <height>0</height>\r
          </size>\r
         </property>\r
+        <property name="focusPolicy">\r
+         <enum>Qt::NoFocus</enum>\r
+        </property>\r
         <property name="text">\r
          <string>PushButton</string>\r
         </property>\r
           <height>0</height>\r
          </size>\r
         </property>\r
+        <property name="focusPolicy">\r
+         <enum>Qt::NoFocus</enum>\r
+        </property>\r
         <property name="text">\r
          <string>PushButton</string>\r
         </property>\r
      <x>0</x>\r
      <y>0</y>\r
      <width>662</width>\r
-     <height>22</height>\r
+     <height>24</height>\r
     </rect>\r
    </property>\r
    <widget class="QMenu" name="menu_File">\r
     <addaction name="separator"/>\r
     <addaction name="move_Down"/>\r
     <addaction name="move_Up"/>\r
+    <addaction name="move_Begin"/>\r
+    <addaction name="move_End"/>\r
    </widget>\r
    <widget class="QMenu" name="menu_Operate">\r
     <property name="title">\r
index ef4aef5..87b3da3 100644 (file)
@@ -22,11 +22,9 @@ RenameMultiDialog::~RenameMultiDialog()
     delete ui;\r
 }\r
 \r
-void RenameMultiDialog::setNames(const QStringList &names)\r
+void RenameMultiDialog::setNames(const QFileInfoList &names)\r
 {\r
-    foreach (const QString &name, names) {\r
-        QFileInfo info(name);\r
-\r
+    foreach (const QFileInfo &info, names) {\r
         int row = ui->tableWidget->rowCount();\r
         ui->tableWidget->insertRow(row);\r
 \r
index a3e06ee..4336438 100644 (file)
@@ -16,7 +16,7 @@ public:
     explicit RenameMultiDialog(QWidget *parent = 0);\r
     ~RenameMultiDialog();\r
 \r
-    void setNames(const QStringList &names);\r
+    void setNames(const QFileInfoList &names);\r
 \r
 private slots:\r
     void on_btn_UpperAll_clicked();\r
index 9f633d7..a1adf90 100644 (file)
@@ -16,11 +16,10 @@ RenameSingleDialog::~RenameSingleDialog()
     delete ui;\r
 }\r
 \r
-void RenameSingleDialog::setNames(const QStringList &names)\r
+void RenameSingleDialog::setNames(const QFileInfoList &names)\r
 {\r
-    QFileInfo info(names.at(0));\r
-    ui->nameBefore->setText(info.fileName());\r
-    ui->nameAfter->setText(info.fileName());\r
+    ui->nameBefore->setText(names[0].fileName());\r
+    ui->nameAfter->setText(names[0].fileName());\r
 }\r
 \r
 void RenameSingleDialog::on_btn_UpperAll_clicked()\r
index 98addef..2b85c3b 100644 (file)
@@ -15,7 +15,7 @@ public:
     explicit RenameSingleDialog(QWidget *parent = 0);\r
     ~RenameSingleDialog();\r
 \r
-    void setNames(const QStringList &names);\r
+    void setNames(const QFileInfoList &names);\r
 \r
 private slots:\r
     void on_btn_UpperAll_clicked();\r