OSDN Git Service

サムネイルモードの実装
authorMasayuki Satoh <miyabi.satoh@gmail.com>
Sun, 14 Sep 2014 09:09:46 +0000 (18:09 +0900)
committerMasayuki Satoh <miyabi.satoh@gmail.com>
Sun, 14 Sep 2014 09:09:46 +0000 (18:09 +0900)
70 files changed:
Gefu.pro
README.md
ReadMe.txt
abstractrenamedialog.h [new file with mode: 0644]
abstractview.h [new file with mode: 0644]
anyview.cpp [deleted file]
anyview.h [deleted file]
bookmarkdialog.cpp
colorsamplemodel.cpp [deleted file]
colorsamplemodel.h [deleted file]
common.h [deleted file]
copymoveworker.h
filetablemodel.cpp [deleted file]
filetablemodel.h [deleted file]
foldermodel.cpp [new file with mode: 0644]
foldermodel.h [new file with mode: 0644]
folderpanel.cpp
folderpanel.h
folderpanel.ui
folderview.cpp
folderview.h
global.cpp [new file with mode: 0644]
global.h [new file with mode: 0644]
history.cpp [deleted file]
history.h [deleted file]
historydialog.cpp
historydialog.h
historydialog.ui
images/Picture.png [deleted file]
images/Pictures.png [new file with mode: 0644]
images/windows_fullscreen.png [new file with mode: 0644]
installer-full.nsi
installer.nsi
irenamedialog.cpp [deleted file]
irenamedialog.h [deleted file]
keybind.txt
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
operationdialog.cpp
overwritedialog.cpp
panel.cpp [new file with mode: 0644]
panel.h [new file with mode: 0644]
panel.ui [moved from anyview.ui with 70% similarity]
preferencedialog.cpp
preferencedialog.h
preferencedialog.ui
preferences.cpp [new file with mode: 0644]
preferences.h [new file with mode: 0644]
renamemultidialog.cpp
renamemultidialog.h
renamesingledialog.cpp
renamesingledialog.h
renameworker.h
resource.qrc
searchbox.cpp [deleted file]
searchbox.h [deleted file]
simpleimageview.cpp
simpleimageview.h
simpletextview.cpp
simpletextview.h
sortdialog.cpp
sortdialog.h
thumbnaildelegate.cpp [new file with mode: 0644]
thumbnaildelegate.h [new file with mode: 0644]
thumbnailview.cpp [new file with mode: 0644]
thumbnailview.h [new file with mode: 0644]
win32.cpp [new file with mode: 0644]
win32.h [new file with mode: 0644]

index 04149f9..4476cbb 100644 (file)
--- a/Gefu.pro
+++ b/Gefu.pro
@@ -18,51 +18,54 @@ SOURCES += main.cpp\
     renamesingledialog.cpp \
     renamemultidialog.cpp \
     operationdialog.cpp \
-    irenamedialog.cpp \
     renameworker.cpp \
     deleteworker.cpp \
     overwritedialog.cpp \
     copymoveworker.cpp \
     sortdialog.cpp \
-    filetablemodel.cpp \
-    history.cpp \
     historydialog.cpp \
     preferencedialog.cpp \
-    colorsamplemodel.cpp \
     simpletextview.cpp \
-    searchbox.cpp \
     folderview.cpp \
-    anyview.cpp \
     folderpanel.cpp \
     bookmarkdialog.cpp \
     simpleimageview.cpp \
-    abstractworker.cpp
+    abstractworker.cpp \
+    foldermodel.cpp \
+    panel.cpp \
+    preferences.cpp \
+    global.cpp \
+    win32.cpp \
+    thumbnailview.cpp \
+    thumbnaildelegate.cpp
 
 HEADERS  += mainwindow.h \
     renamesingledialog.h \
     renamemultidialog.h \
     operationdialog.h \
-    common.h \
-    irenamedialog.h \
     renameworker.h \
     deleteworker.h \
     overwritedialog.h \
     copymoveworker.h \
     sortdialog.h \
-    filetablemodel.h \
-    history.h \
     historydialog.h \
     preferencedialog.h \
-    colorsamplemodel.h \
     simpletextview.h \
-    searchbox.h \
     folderview.h \
     version.h \
-    anyview.h \
     folderpanel.h \
     bookmarkdialog.h \
     simpleimageview.h \
-    abstractworker.h
+    abstractworker.h \
+    foldermodel.h \
+    panel.h \
+    preferences.h \
+    global.h \
+    win32.h \
+    abstractview.h \
+    abstractrenamedialog.h \
+    thumbnailview.h \
+    thumbnaildelegate.h
 
 FORMS    += mainwindow.ui \
     renamesingledialog.ui \
@@ -72,9 +75,9 @@ FORMS    += mainwindow.ui \
     sortdialog.ui \
     historydialog.ui \
     preferencedialog.ui \
-    anyview.ui \
     folderpanel.ui \
-    bookmarkdialog.ui
+    bookmarkdialog.ui \
+    panel.ui
 
 RESOURCES += \
     resource.qrc
index e3addcf..996dc97 100644 (file)
--- a/README.md
+++ b/README.md
@@ -3,6 +3,13 @@ Gefu
 
 Gefu is an Experimental File Utility.
 
+#### Ver0.21
+  * 設定ダイアログを刷新。
+    * iniファイルのパスも変更したため、設定が初期化されます。
+  * 画像ビューアの画質を向上。
+  * アイコンを変更。
+  * フォルダビューの列ヘッダーを削除。
+
 #### 2014/08/31 Ver0.20
   * ウィンドウ自体が非アクティブになったとき、両パネルとも暗くなっていたのを修正。
   * ドロップ時、コピー・移動・キャンセルのポップアップメニューを出すようにした。
index ea10fbc..e9d99c0 100644 (file)
@@ -1,6 +1,6 @@
 ===============================================================================\r
     Gefu(げふぅ) - Gefu is an Experimental File Utility - \r
-    Version 0.20\r
+    Version 0.21\r
 ===============================================================================\r
                                                        2014/08/31 @miyabi_satoh\r
 \r
  - 配布・転載を行う場合は @miyabi_satoh までご連絡ください。\r
    特に利益を生じる無断配布・無断転載は固く禁じます。\r
  - メニューおよびツールバーのアイコンには、以下を使用しています\r
-    - Tango Icon Library            http://tango.freedesktop.org/Tango_Icon_Library\r
-    - Utilities-file-archiver.png   http://chakraos.org/wiki/index.php?title=File:Utilities-file-archiver.png\r
-    - Cats Icons 2                  http://www.softicons.com/system-icons/cats-icons-2-by-mcdo-design\r
+    - Cats Icons 2              http://www.softicons.com/system-icons/cats-icons-2-by-mcdo-design\r
+    - NuoveXT Icons by Saki     http://www.iconarchive.com/show/nuoveXT-icons-by-saki.html\r
+    - 32x32 Free Design Icons   http://www.small-icons.com/packs/32x32-free-design-icons.htm\r
+\r
 \r
 ◇ 連絡先 ◇\r
  Web:     https://sourceforge.jp/projects/gefu/\r
diff --git a/abstractrenamedialog.h b/abstractrenamedialog.h
new file mode 100644 (file)
index 0000000..ffcd71e
--- /dev/null
@@ -0,0 +1,39 @@
+#ifndef ABSTRACTRENAMEDIALOG_H\r
+#define ABSTRACTRENAMEDIALOG_H\r
+\r
+#include "global.h"\r
+\r
+#include <QDialog>\r
+#include <QDir>\r
+\r
+class AbstractRenameDialog : public QDialog\r
+{\r
+    Q_OBJECT\r
+public:\r
+    explicit AbstractRenameDialog(QWidget *parent = 0) :\r
+        QDialog(parent)\r
+    {\r
+    }\r
+\r
+    const StringMap& renameMap() const\r
+    {\r
+        return m_RenameMap;\r
+    }\r
+\r
+    void setWorkingDirectory(const QString &path)\r
+    {\r
+        m_dir.setPath(path);\r
+    }\r
+\r
+    virtual void setNames(const QFileInfoList &names) = 0;\r
+\r
+signals:\r
+\r
+public slots:\r
+\r
+protected:\r
+    QDir m_dir;\r
+    StringMap m_RenameMap;\r
+};\r
+\r
+#endif // ABSTRACTRENAMEDIALOG_H\r
diff --git a/abstractview.h b/abstractview.h
new file mode 100644 (file)
index 0000000..56f13c7
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef ABSTRACTVIEW_H
+#define ABSTRACTVIEW_H
+
+class AbstractView
+{
+public:
+    AbstractView() {}
+
+    virtual void    scaleUp() = 0;
+    virtual void    scaleDown() = 0;
+};
+
+#endif // ABSTRACTVIEW_H
diff --git a/anyview.cpp b/anyview.cpp
deleted file mode 100644 (file)
index 24dc82f..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-#include "common.h"
-#include "folderview.h"
-#include "anyview.h"
-#include "ui_anyview.h"
-
-#include <QDebug>
-#include <QSettings>
-
-AnyView::AnyView(QWidget *parent) :
-    QWidget(parent),
-    ui(new Ui::AnyView)
-{
-    ui->setupUi(this);
-
-    // 初期状態では全て非表示
-    ui->folderPanel->setVisible(false);
-    ui->graphicsView->setVisible(false);
-    ui->textView->setVisible(false);
-}
-
-AnyView::~AnyView()
-{
-    delete ui;
-}
-
-void AnyView::changeView(int viewType)
-{
-    qDebug() << "AnyView::changeView();" << viewType;
-
-    // 一度すべてを非表示にする
-    ui->folderPanel->setVisible(false);
-    ui->graphicsView->setVisible(false);
-    ui->textView->setVisible(false);
-
-    QWidget *w;
-    switch (viewType) {
-    case AnyView::ViewFolder:   w = ui->folderPanel; break;
-    case AnyView::ViewImage:    w = ui->graphicsView; break;
-    case AnyView::ViewText:     w = ui->textView; break;
-    default: Q_ASSERT(false);   w = NULL; break;
-    }
-
-    this->setVisible(true);
-    w->setVisible(true);
-}
-
-bool AnyView::setViewItem(const QFileInfo &info)
-{
-    // フォルダ
-    if (info.isDir()) {
-        changeView(ViewFolder);
-        ui->folderPanel->folderView()->setPath(info.absoluteFilePath(), true);
-        return true;
-    }
-
-    // 画像ファイル
-    changeView(ViewImage);
-    if (ui->graphicsView->setSource(info.absoluteFilePath())) {
-        return true;
-    }
-
-    QSettings settings;
-    bool isBinary = false;
-    if (!settings.value(IniKey_ViewerForceOpen).toBool()) {
-        QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");
-        foreach (const QString &ext, list) {
-            if (ext.toLower() == info.suffix().toLower()) {
-                isBinary = true;
-                break;
-            }
-        }
-    }
-
-    if (!isBinary) {
-        changeView(ViewText);
-        QFile file(info.absoluteFilePath());
-        if (file.open(QIODevice::ReadOnly)) {
-            ui->textView->setSource(file.readAll());
-            file.close();
-            return true;
-        }
-    }
-
-    changeView(ViewText);
-    ui->textView->setSource("");
-    return false;
-}
-
-FolderPanel *AnyView::folderPanel() const
-{
-    return ui->folderPanel;
-}
-
-SimpleImageView *AnyView::imageView() const
-{
-    return ui->graphicsView;
-}
-
-SimpleTextView *AnyView::textView() const
-{
-    return ui->textView;
-}
-
-QWidget *AnyView::visibleView() const
-{
-    if (ui->folderPanel->isVisible()) {
-        return ui->folderPanel->folderView();
-    }
-    if (ui->graphicsView->isVisible()) {
-        return ui->graphicsView;
-    }
-    if (ui->textView->isVisible()) {
-        return ui->textView;
-    }
-    return NULL;
-}
-
-void AnyView::focusInEvent(QFocusEvent *)
-{
-    qDebug() << "AnyView::focusInEvent();";
-
-    if (ui->folderPanel->isVisible()) {
-        ui->folderPanel->folderView()->setFocus();
-    }
-    else if (ui->graphicsView->isVisible()) {
-        ui->graphicsView->setFocus();
-    }
-    else {
-        Q_ASSERT(ui->textView->isVisible());
-        ui->textView->setFocus();
-    }
-}
diff --git a/anyview.h b/anyview.h
deleted file mode 100644 (file)
index 2926016..0000000
--- a/anyview.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef ANYVIEW_H
-#define ANYVIEW_H
-
-#include <QFileInfo>
-#include <QWidget>
-class FolderPanel;
-class SimpleTextView;
-class SimpleImageView;
-
-namespace Ui {
-class AnyView;
-}
-
-class AnyView : public QWidget
-{
-    Q_OBJECT
-
-public:
-    enum {
-        ViewFolder = 1,
-        ViewText = 2,
-        ViewImage = 3,
-    };
-
-    explicit AnyView(QWidget *parent = 0);
-    ~AnyView();
-
-    // action
-    void changeView(int viewType);
-    bool setViewItem(const QFileInfo &info);
-
-    // getter
-    FolderPanel* folderPanel() const;
-    SimpleImageView* imageView() const;
-    SimpleTextView* textView() const;
-    QWidget* visibleView() const;
-
-private:
-    Ui::AnyView *ui;
-
-    // QWidget interface
-protected:
-    void focusInEvent(QFocusEvent *);
-};
-
-#endif // ANYVIEW_H
index b252623..dc5d0b7 100644 (file)
@@ -1,4 +1,4 @@
-#include "common.h"
+#include "preferences.h"
 #include "bookmarkdialog.h"
 #include "ui_bookmarkdialog.h"
 
@@ -6,7 +6,6 @@
 #include <QFileDialog>
 #include <QFileInfo>
 #include <QMessageBox>
-#include <QSettings>
 
 BookmarkDialog::BookmarkDialog(QWidget *parent) :
     QDialog(parent),
@@ -36,18 +35,19 @@ void BookmarkDialog::setEditMode(bool edit)
         setWindowTitle(tr("ブックマークを開く"));
     }
 
-    QSettings settings;
-    for (int i = 0; ; i++) {
-        QString name = settings.value(IniKey_BookmarkEntryName(i), "").toString();
+    Preferences prefs(this);
+    for (int i = 1; ; i++) {
+        QString name = prefs.getBookmarkEntry(i);
         if (name.isEmpty()) {
             break;
         }
 
-        QString path = settings.value(IniKey_BookmarkEntryPath(i)).toString();
-        insertData(i, name, path);
+        QString path = prefs.getBookmarkPath(i);
+        insertData(i - 1, name, path);
     }
     ui->tableWidget->resizeColumnsToContents();
     ui->tableWidget->resizeRowsToContents();
+    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
     ui->tableWidget->setCurrentCell(0, 0);
 }
 
@@ -147,7 +147,9 @@ void BookmarkDialog::moveSelectedRows(bool up)
 
 void BookmarkDialog::accept()
 {
-    QSettings settings;
+    Preferences prefs(this);
+    prefs.clearBookmark();
+
     QModelIndex index;
     int i;
     for (i = 0; i < ui->tableWidget->rowCount(); i++) {
@@ -162,13 +164,7 @@ void BookmarkDialog::accept()
         index = ui->tableWidget->model()->index(i, 1);
         QString path = ui->tableWidget->model()->data(index).toString();
 
-        settings.setValue(IniKey_BookmarkEntryName(i), name);
-        settings.setValue(IniKey_BookmarkEntryPath(i), path);
-    }
-    while (!settings.value(IniKey_BookmarkEntryName(i), "").toString().isEmpty()) {
-        settings.remove(IniKey_BookmarkEntryName(i));
-        settings.remove(IniKey_BookmarkEntryPath(i));
-        i++;
+        prefs.addBookmark(name, path);
     }
 
     QDialog::accept();
diff --git a/colorsamplemodel.cpp b/colorsamplemodel.cpp
deleted file mode 100644 (file)
index 7590448..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-#include "colorsamplemodel.h"
-
-#include <QBrush>
-
-ColorSampleModel::ColorSampleModel(QObject *parent) :
-    QAbstractTableModel(parent)
-{
-}
-
-void ColorSampleModel::setFont(const QFont &font)
-{
-    m_font = font;
-}
-
-int ColorSampleModel::rowCount(const QModelIndex &parent) const
-{
-    Q_UNUSED(parent);
-    return 5;
-}
-
-int ColorSampleModel::columnCount(const QModelIndex &parent) const
-{
-    Q_UNUSED(parent);
-    return 3;
-}
-
-QVariant ColorSampleModel::data(const QModelIndex &index, int role) const
-{
-    if (!index.isValid()) {
-        return QVariant();
-    }
-
-    const QString strText[5][3] = {
-        { tr("通常"), tr("<DIR>"), tr("12/34/56 78:90") },
-        { tr("マーク"), tr("123B"), tr("12/34/56 78:90") },
-        { tr("システム"), tr("456KB"), tr("12/34/56 78:90") },
-        { tr("隠し属性"), tr("789MB"), tr("12/34/56 78:90") },
-        { tr("読取専用"), tr("10.2GB"), tr("12/34/56 78:90") }
-    };
-
-    switch (role) {
-    case Qt::DisplayRole:
-        return strText[index.row()][index.column()];
-
-    case Qt::FontRole:
-        return m_font;
-        break;
-
-    case Qt::BackgroundRole:
-        if (index.row() == 1) {
-            return QBrush(m_colorMap->value("clrBgMark"));
-        }
-        else {
-            return QBrush(m_colorMap->value("clrBgNormal"));
-        }
-        break;
-
-    case Qt::ForegroundRole:
-        switch (index.row()) {
-        case 0: return QBrush(m_colorMap->value("clrFgNormal"));
-        case 1: return QBrush(m_colorMap->value("clrFgMark"));
-        case 2: return QBrush(m_colorMap->value("clrFgSystem"));
-        case 3: return QBrush(m_colorMap->value("clrFgHidden"));
-        case 4: return QBrush(m_colorMap->value("clrFgReadonly"));
-        break;
-        }
-    }
-
-    return QVariant();
-}
diff --git a/colorsamplemodel.h b/colorsamplemodel.h
deleted file mode 100644 (file)
index 0593383..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef COLORSAMPLEMODEL_H
-#define COLORSAMPLEMODEL_H
-
-#include <QAbstractTableModel>
-#include <QFont>
-#include <QMap>
-
-typedef QMap<QString, QColor> ColorMap;
-
-class ColorSampleModel : public QAbstractTableModel
-{
-    Q_OBJECT
-public:
-    explicit ColorSampleModel(QObject *parent = 0);
-
-    const QFont& font() { return m_font; }
-    void setFont(const QFont &font);
-
-    void setColorMap(ColorMap *colorMap) {
-        m_colorMap = colorMap;
-    }
-
-    void update() {
-        beginResetModel();
-        endResetModel();
-    }
-
-private:
-    ColorMap *m_colorMap;
-    QFont m_font;
-
-signals:
-
-public slots:
-
-
-    // QAbstractItemModel interface
-public:
-    int rowCount(const QModelIndex &parent) const;
-    int columnCount(const QModelIndex &parent) const;
-    QVariant data(const QModelIndex &index, int role) const;
-};
-
-
-#endif // COLORSAMPLEMODEL_H
diff --git a/common.h b/common.h
deleted file mode 100644 (file)
index 05f7162..0000000
--- a/common.h
+++ /dev/null
@@ -1,87 +0,0 @@
-#ifndef COMMON_H\r
-#define COMMON_H\r
-\r
-#include <QMap>\r
-typedef QMap<QString, QString> StringMap;\r
-\r
-class QObject;\r
-class QKeyEvent;\r
-extern QString FilesizeToString(quint64 size);\r
-extern QString ViewerIgnoreExt();\r
-extern QString KeyEventToSequence(const QKeyEvent *event);\r
-extern bool IsKeyUpDown(const QKeyEvent *event);\r
-extern bool ProcessShortcut(const QString &ksq, const QObject *object);\r
-extern void Sleep(int msec);\r
-\r
-#define slash   QString("/")\r
-#define QQ(x)   ("\"" + QString(x) + "\"")\r
-\r
-#define IniKey_ShowHidden               "Common/ShowHidden"\r
-#define IniKey_ShowSystem               "Common/ShowSystem"\r
-#define IniKey_DefaultOnCopy            "Common/DefaultCopyMode"\r
-#define IniKey_MoveAfterCreateFolder    "Common/MoveAfterFolderCreation"\r
-#define IniKey_OpenAfterCreateFile      "Common/OpenAfterFileCreation"\r
-#define IniKey_CheckUpdates             "Common/CheckUpdates"\r
-#define IniKey_BookmarkEntryName(x)     QString("Bookmark/Name%1").arg(x)\r
-#define IniKey_BookmarkEntryPath(x)     QString("Bookmark/Path%1").arg(x)\r
-#define IniKey_BootSizeSpec             "BootAndExit/SizeSpec"\r
-#define IniKey_BootSizeRel              "BootAndExit/SizeRel"\r
-#define IniKey_BootSizeAbs              "BootAndExit/SizeAbs"\r
-#define IniKey_BootPosSpec              "BootAndExit/PosSpec"\r
-#define IniKey_BootPosRel               "BootAndExit/PosRel"\r
-#define IniKey_BootPosAbs               "BootAndExit/PosAbs"\r
-#define IniKey_ResetOnBoot              "BootAndExit/Reset"\r
-#define IniKey_BoxColorFg               "Appearance/BoxColorFg"\r
-#define IniKey_BoxColorBg               "Appearance/BoxColorBg"\r
-#define IniKey_BoxFont                  "Appearance/BoxFont"\r
-#define IniKey_ViewFont                 "Appearance/ViewFont"\r
-#define IniKey_ViewColorBgNormal        "Appearance/ViewColorBgNormal"\r
-#define IniKey_ViewColorBgMark          "Appearance/ViewColorBgMark"\r
-#define IniKey_ViewColorFgNormal        "Appearance/ViewColorFgNormal"\r
-#define IniKey_ViewColorFgMark          "Appearance/ViewColorFgMark"\r
-#define IniKey_ViewColorFgSystem        "Appearance/ViewColorFgSystem"\r
-#define IniKey_ViewColorFgHidden        "Appearance/ViewColorFgHidden"\r
-#define IniKey_ViewColorFgReadonly      "Appearance/ViewColorFgReadonly"\r
-#define IniKey_Darkness                 "Appearance/Darkness"\r
-#define IniKey_ConfirmExit              "Confirm/Exit"\r
-#define IniKey_ConfirmCopy              "Confirm/Copy"\r
-#define IniKey_ConfirmMove              "Confirm/Move"\r
-#define IniKey_ConfirmDelete            "Confirm/Delete"\r
-#define IniKey_ConfirmRename            "Confirm/Rename"\r
-#define IniKey_AutoCloseCopy            "AutoClose/Copy"\r
-#define IniKey_AutoCloseMove            "AutoClose/Move"\r
-#define IniKey_AutoCloseDelete          "AutoClose/Delete"\r
-#define IniKey_AutoCloseRename          "AutoClose/Rename"\r
-#define IniKey_PathEditor               "Path/Editor"\r
-#define IniKey_PathTerminal             "Path/Terminal"\r
-#define IniKey_PathArchiver             "Path/Archiver"\r
-#define IniKey_InflateOptions           "Path/InflateOptions"\r
-#define IniKey_DeflateOptions           "Path/DeflateOptions"\r
-#define IniKey_ViewerFont               "Viewer/Font"\r
-#define IniKey_ViewerColorBg            "Viewer/ColorBg"\r
-#define IniKey_ViewerColorFg            "Viewer/ColorFg"\r
-#define IniKey_ViewerInherit            "Viewer/Inherit"\r
-#define IniKey_ViewerForceOpen          "Viewer/ForceOpen"\r
-#define IniKey_ViewerIgnoreExt          "Viewer/IgnoreExt"\r
-#define IniKey_WindowGeometry           "Window/Geometry"\r
-#define iniKey_WindowState              "Window/State"\r
-// 以下は[Left/Right]セクションのキー\r
-#define IniKey_Dir                  "dir"\r
-#define IniKey_SortBy               "SortBy"\r
-#define IniKey_OrderBy              "OrderBy"\r
-#define IniKey_PutDirs              "PutDirs"\r
-#define IniKey_IgnoreCase           "IgnoreCase"\r
-\r
-#define SortByName  QDir::Name\r
-#define SortByDate  QDir::Time\r
-#define SortBySize  QDir::Size\r
-#define SortByType  QDir::Type\r
-\r
-#define OrderByAsc  0\r
-#define OrderByDesc QDir::Reversed\r
-\r
-#define PutDirsFirst    QDir::DirsFirst\r
-#define PutDirsLast     QDir::DirsLast\r
-#define PutDirsDefault  0\r
-\r
-#endif // COMMON_H\r
index c677fe4..45e0030 100644 (file)
@@ -1,11 +1,10 @@
 #ifndef COPYWORKER_H\r
 #define COPYWORKER_H\r
 \r
-#include "common.h"\r
 #include "abstractworker.h"\r
+#include "global.h"\r
 \r
 #include <QFileInfo>\r
-#include <QMap>\r
 \r
 class CopyMoveWorker : public AbstractWorker\r
 {\r
diff --git a/filetablemodel.cpp b/filetablemodel.cpp
deleted file mode 100644 (file)
index 0388a0b..0000000
+++ /dev/null
@@ -1,350 +0,0 @@
-#include "common.h"\r
-#include "filetablemodel.h"\r
-\r
-#include <QDateTime>\r
-#include <QDebug>\r
-#include <QApplication>\r
-#include <QSettings>\r
-#include <QPalette>\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(this),\r
-    m_font(),\r
-    m_NormalBrush(),\r
-    m_NormalTextBrush(),\r
-    m_MarkBrush(),\r
-    m_MarkTextBrush(),\r
-    m_SystemBrush(),\r
-    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
-{\r
-    qDebug() << "FileTableModel::setPath" << 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
-    else {\r
-        QFileInfoList::iterator it;\r
-        for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); ) {\r
-#ifdef Q_OS_WIN32\r
-            if (!(filter() & QDir::System)){\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
-                    continue;\r
-                }\r
-            }\r
-#endif\r
-            if (it->fileName() == "..") {\r
-                if (m_dir.isRoot()) {\r
-                    qDebug() << m_dir.absolutePath() << " is root.";\r
-                    it = m_fileInfoList.erase(it);\r
-                    continue;\r
-                }\r
-            }\r
-            it++;\r
-        }\r
-        // ソート方法によらず、".."は必ず先頭にする\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
-    m_checkStates.fill(Qt::Unchecked);\r
-\r
-    m_fsWatcher.addPath(path);\r
-    connect(&m_fsWatcher, SIGNAL(directoryChanged(QString)),\r
-            this, SLOT(directoryChange(QString)));\r
-\r
-    endResetModel();\r
-\r
-    emit dataChanged(QModelIndex(), QModelIndex());\r
-\r
-    return !m_fileInfoList.isEmpty();\r
-}\r
-\r
-QFileInfo FileTableModel::fileInfo(const QModelIndex &index) const\r
-{\r
-    qDebug() << "FileTableModel::fileInfo()" << index;\r
-\r
-    if (index.isValid()) {\r
-        return m_fileInfoList[index.row()];\r
-    }\r
-    return QFileInfo();\r
-}\r
-\r
-void FileTableModel::updateAppearance(int darkness)\r
-{\r
-    qDebug() << "FileTableModel::updateAppearance();" << darkness;\r
-\r
-    QSettings settings;\r
-\r
-    m_font = settings.value(IniKey_ViewFont).value<QFont>();\r
-    m_NormalBrush = QBrush(settings.value(IniKey_ViewColorBgNormal).value<QColor>().darker(darkness));\r
-    m_NormalTextBrush = QBrush(settings.value(IniKey_ViewColorFgNormal).value<QColor>().darker(darkness));\r
-    m_MarkBrush = QBrush(settings.value(IniKey_ViewColorBgMark).value<QColor>().darker(darkness));\r
-    m_MarkTextBrush = QBrush(settings.value(IniKey_ViewColorFgMark).value<QColor>().darker(darkness));\r
-    m_SystemBrush = QBrush(settings.value(IniKey_ViewColorFgSystem).value<QColor>().darker(darkness));\r
-    m_HiddenBrush = QBrush(settings.value(IniKey_ViewColorFgHidden).value<QColor>().darker(darkness));\r
-    m_ReadonlyBrush = QBrush(settings.value(IniKey_ViewColorFgReadonly).value<QColor>().darker(darkness));\r
-    m_ReadonlyBrush = QBrush(settings.value(IniKey_ViewColorFgReadonly).value<QColor>().darker(darkness));\r
-}\r
-\r
-void FileTableModel::directoryChange(const QString &path)\r
-{\r
-    qDebug() << "FileTableModel::directoryChange" << path;\r
-\r
-    emit preReload();\r
-\r
-    m_fsWatcher.removePath(m_dir.absolutePath());\r
-    setPath(path);\r
-\r
-    emit postReload();\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 5;\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
-\r
-        case 1: // ファイル名\r
-            if (info.isDir()) {\r
-                return info.fileName();\r
-            }\r
-            if (info.fileName().left(1) == ".") {   // "."で始まるファイル\r
-                int pos = info.fileName().lastIndexOf(".");\r
-                if (pos == 0) {\r
-                    return info.fileName();\r
-                }\r
-            }\r
-            return info.completeBaseName();\r
-\r
-        case 2: // 拡張子\r
-            if (info.isDir()) {\r
-                return QString();\r
-            }\r
-            if (info.fileName().left(1) == ".") {   // "."で始まるファイル\r
-                int pos = info.fileName().lastIndexOf(".");\r
-                if (pos == 0) {\r
-                    return QString();\r
-                }\r
-            }\r
-            return info.suffix();\r
-\r
-        case 3: // サイズ\r
-            if (info.isDir()) {\r
-                return QString("<DIR>");\r
-            }\r
-            else {\r
-                return FilesizeToString(info.size());\r
-            }\r
-            break;\r
-\r
-        case 4: // 更新日時\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));\r
-            }\r
-        }\r
-        break;\r
-\r
-    case Qt::FontRole:\r
-        return m_font;\r
-\r
-    case Qt::TextAlignmentRole:\r
-        switch (index.column()) {\r
-        case 3:\r
-        case 4:\r
-            return Qt::AlignRight + Qt::AlignVCenter;\r
-        default:\r
-            return Qt::AlignLeft + Qt::AlignVCenter;\r
-        }\r
-        break;\r
-\r
-    case Qt::BackgroundRole:\r
-        if (checked) {\r
-            return m_MarkBrush;\r
-        }\r
-        return m_NormalBrush;\r
-\r
-    case Qt::ForegroundRole:\r
-        if (checked) {\r
-            return m_MarkTextBrush;\r
-        }\r
-#ifdef Q_OS_WIN32\r
-        {\r
-            DWORD dwFlags = ::GetFileAttributes(\r
-                        info.absoluteFilePath().toStdWString().c_str());\r
-            if (dwFlags != DWORD(-1) && (dwFlags & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM)\r
-            {\r
-                return m_SystemBrush;\r
-            }\r
-        }\r
-#endif\r
-        if (info.isHidden() && info.fileName() != "..") {\r
-            return m_HiddenBrush;\r
-        }\r
-        if (!info.isWritable()) {\r
-            return m_ReadonlyBrush;\r
-        }\r
-        return m_NormalTextBrush;\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
-            case 4: 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
-\r
-    if (!index.isValid()) {\r
-        return flags | Qt::ItemIsDropEnabled;\r
-    }\r
-\r
-    if (m_fileInfoList[index.row()].fileName() != "..") {\r
-        if (index.column() == 0) {\r
-            flags |= Qt::ItemIsUserCheckable;\r
-        }\r
-        flags |= Qt::ItemIsDropEnabled;\r
-    }\r
-    return flags;\r
-}\r
-\r
-bool FileTableModel::setData(const QModelIndex &index, const QVariant &value, int role)\r
-{\r
-    qDebug() << "FileTableModel::setData()" << index;\r
-\r
-    if (!index.isValid()) {\r
-        return false;\r
-    }\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
-            emit dataChanged(index, this->index(index.row(), 4));\r
-            return true;\r
-        }\r
-        break;\r
-    }\r
-\r
-    return false;\r
-}\r
-\r
-Qt::DropActions FileTableModel::supportedDropActions() const\r
-{\r
-    qDebug() << "FileTableModel::supportedDropActions()";\r
-\r
-    return Qt::CopyAction;\r
-}\r
-\r
-QStringList FileTableModel::mimeTypes() const\r
-{\r
-    qDebug() << "FileTableModel::mimeTypes()";\r
-\r
-    QStringList types;\r
-\r
-    types << "text/uri-list";\r
-\r
-    return types;\r
-}\r
diff --git a/filetablemodel.h b/filetablemodel.h
deleted file mode 100644 (file)
index ec9af4b..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef FILETABLEMODEL_H\r
-#define FILETABLEMODEL_H\r
-\r
-#include <QAbstractTableModel>\r
-#include <QDir>\r
-#include <QFileIconProvider>\r
-#include <QFileSystemWatcher>\r
-#include <QBrush>\r
-#include <QFont>\r
-\r
-class FileTableModel : public QAbstractTableModel\r
-{\r
-    Q_OBJECT\r
-public:\r
-    explicit FileTableModel(QObject *parent = 0);\r
-\r
-    // action\r
-    bool setPath(const QString &path);\r
-    void updateAppearance(int darkness = false);\r
-\r
-    // getter\r
-    QDir::SortFlags sorting() const { return m_dir.sorting(); }\r
-    QDir::Filters filter() const { return m_dir.filter(); }\r
-    QStringList nameFilters() const { return m_dir.nameFilters(); }\r
-    const QString absolutePath() const { return m_dir.absolutePath(); }\r
-    QFileInfo fileInfo(const QModelIndex &index) const;\r
-    QFont font() const { return m_font; }\r
-\r
-    // setter\r
-    void setSorting(QDir::SortFlags sort) { m_dir.setSorting(sort); }\r
-    void setFilter(QDir::Filters filters) { m_dir.setFilter(filters); }\r
-    void setNameFilters(const QStringList &nameFiltes) {\r
-        m_dir.setNameFilters(nameFiltes);\r
-    }\r
-\r
-signals:\r
-    void selectionChanged(int checkedFoldrs, int checkedFiles, quint64 totalSize);\r
-    void preReload();\r
-    void postReload();\r
-\r
-public slots:\r
-    void directoryChange(const QString &path);\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
-    QFont m_font;\r
-    QBrush m_NormalBrush;\r
-    QBrush m_NormalTextBrush;\r
-    QBrush m_MarkBrush;\r
-    QBrush m_MarkTextBrush;\r
-    QBrush m_SystemBrush;\r
-    QBrush m_HiddenBrush;\r
-    QBrush m_ReadonlyBrush;\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
-    Qt::DropActions supportedDropActions() const;\r
-    QStringList mimeTypes() const;\r
-};\r
-\r
-#endif // FILETABLEMODEL_H\r
diff --git a/foldermodel.cpp b/foldermodel.cpp
new file mode 100644 (file)
index 0000000..9d881ef
--- /dev/null
@@ -0,0 +1,529 @@
+#include "global.h"\r
+#include "preferences.h"\r
+#include "win32.h"\r
+#include "foldermodel.h"\r
+\r
+#include <QDateTime>\r
+#include <QDebug>\r
+#include <QApplication>\r
+#include <QSettings>\r
+#include <QPalette>\r
+\r
+FolderModel* FolderModel::m_activeModel = NULL;\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::FolderModel\r
+/// \param parent   親オブジェクト\r
+///\r
+/// コンストラクタ\r
+///\r
+FolderModel::FolderModel(QObject *parent) :\r
+    QAbstractTableModel(parent),\r
+    m_dir(),\r
+    m_fileInfoList(),\r
+    m_checkStates(),\r
+    m_IconProvider(),\r
+    m_fsWatcher(this),\r
+    m_history(),\r
+    m_historyPos(-1)\r
+{\r
+    connect(&m_fsWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(fsWatcher_directoryChanged(QString)));\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::fileIcon\r
+/// \param index    アイテムのインデックス\r
+/// \return アイコンを返します。\r
+///\r
+QIcon FolderModel::fileIcon(const QModelIndex &index) const\r
+{\r
+    if (fileName(index) == "..") {\r
+        return QIcon("://images/Up.png");\r
+    }\r
+    return m_IconProvider.icon(fileInfo(index));\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::isMarked\r
+/// \param index    アイテムのインデックス\r
+/// \return マークされていればtrueを返します。\r
+///\r
+bool FolderModel::isMarked(const QModelIndex &index) const\r
+{\r
+    CheckContainer::const_iterator it = m_checkStates.find(fileName(index));\r
+    if (it != m_checkStates.end()) {\r
+        return *it == Qt::Checked;\r
+    }\r
+    return false;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::markedItems\r
+/// \return マークされているアイテムのリストを返します。\r
+///\r
+QFileInfoList FolderModel::markedItems() const\r
+{\r
+    QFileInfoList list;\r
+    for (int n = 0; n < rowCount(); ++n) {\r
+        QModelIndex index = this->index(n, 0);\r
+        if (isMarked(index)) {\r
+            list << fileInfo(index);\r
+        }\r
+    }\r
+\r
+    return list;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::mkdir\r
+/// \param name 作成するフォルダ名\r
+/// \return 作成したフォルダのインデックス\r
+///\r
+/// フォルダを作成します。\r
+///\r
+QModelIndex FolderModel::mkdir(const QString &name)\r
+{\r
+    qDebug() << "FolderModel::mkdir()" << name;\r
+\r
+    if (!m_dir.mkdir(name)) {\r
+        return QModelIndex();\r
+    }\r
+\r
+    refresh();\r
+\r
+    for (int n = 0; n < rowCount(); ++n) {\r
+        if (m_fileInfoList[n].fileName() == name) {\r
+            return index(n, 0);\r
+        }\r
+    }\r
+\r
+    return QModelIndex();\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::search\r
+/// \param value    検索する文字列\r
+/// \param start    開始位置\r
+/// \param step     ステップ数\r
+/// \return 見つかったアイテムのインデックスを返します。\r
+///\r
+QModelIndex FolderModel::search(const QString &value, const QModelIndex &start, int step)\r
+{\r
+    qDebug() << "FolderModel::search()" << value << start << step;\r
+\r
+    const QString searchText = value.toLower();\r
+    for (int n = start.row() + step; 0 <= n && n < rowCount(); n += step) {\r
+        if (m_fileInfoList[n].fileName().toLower().indexOf(searchText) != -1) {\r
+            return index(n, 0);\r
+        }\r
+    }\r
+\r
+    return QModelIndex();\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::setHistoryAt\r
+/// \param path 設定するパス\r
+///\r
+/// 指定したパスに履歴を移動します。\r
+///\r
+void FolderModel::setHistoryAt(const QString &path)\r
+{\r
+    qDebug() << "FolderModel::setHistoryAt()" << path;\r
+\r
+    for (int n = 0; n < m_history.size(); ++n) {\r
+        if (m_history[n] == path) {\r
+            m_historyPos = n;\r
+            setRootPath(path, false);\r
+            return;\r
+        }\r
+    }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::setRootPath\r
+/// \param path         設定するパス\r
+/// \param addHistory   履歴に追加する場合はtrue\r
+///\r
+/// ルートパスを設定します。\r
+///\r
+void FolderModel::setRootPath(const QString &path, bool addHistory)\r
+{\r
+    qDebug() << "FolderModel::setRootPath()" << path;\r
+\r
+    beginResetModel();\r
+    setError();\r
+\r
+    try {\r
+        if (!QFileInfo::exists(path)) {\r
+            throw tr("フォルダが存在しないか、利用できません:%1").arg(path);\r
+        }\r
+\r
+        QDir dir(path);\r
+        dir.setFilter(m_dir.filter());\r
+        dir.setNameFilters(m_dir.nameFilters());\r
+        dir.setSorting(m_dir.sorting());\r
+\r
+        QFileInfoList list = dir.entryInfoList();\r
+        if (list.isEmpty()) {\r
+            throw tr("ファイルリストを取得できません:%1").arg(path);\r
+        }\r
+\r
+        m_fileInfoList.clear();\r
+        if (m_dir.absolutePath() != dir.absolutePath()) {\r
+            m_fsWatcher.removePath(m_dir.absolutePath());\r
+            m_fsWatcher.addPath(dir.absolutePath());\r
+            m_checkStates.clear();\r
+            m_dir.setPath(dir.absolutePath());\r
+            if (addHistory) {\r
+                m_history.resize(m_historyPos + 1);\r
+                m_history << m_dir.absolutePath();\r
+                m_historyPos = m_history.size() - 1;\r
+            }\r
+        }\r
+\r
+        foreach (const QFileInfo &fi, list) {\r
+            if (fi.fileName() == "..") {\r
+                if (!m_dir.isRoot()) {\r
+                    m_fileInfoList.push_front(fi);\r
+                }\r
+                continue;\r
+            }\r
+            else if (!(filter() & QDir::System) &&\r
+                     Win32::hasSystemAttribute(fi.absoluteFilePath()))\r
+            {\r
+                continue;\r
+            }\r
+\r
+            m_fileInfoList << fi;\r
+            if (m_checkStates.find(fi.fileName()) == m_checkStates.end()) {\r
+                m_checkStates[fi.fileName()] = Qt::Unchecked;\r
+            }\r
+        }\r
+    }\r
+    catch (const QString &s) {\r
+        setError(s);\r
+    }\r
+\r
+    endResetModel();\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::touch\r
+/// \param name 作成するファイル名\r
+/// \return 作成したファイルのインデックス\r
+///\r
+/// 空のファイルを作成します。\r
+///\r
+QModelIndex FolderModel::touch(const QString &name)\r
+{\r
+    QFile file(m_dir.absoluteFilePath(name));\r
+    if (!file.open(QIODevice::WriteOnly)) {\r
+        return QModelIndex();\r
+    }\r
+    file.close();\r
+\r
+    refresh();\r
+\r
+    for (int n = 0; n < rowCount(); ++n) {\r
+        if (m_fileInfoList[n].fileName() == name) {\r
+            return index(n, 0);\r
+        }\r
+    }\r
+\r
+    return QModelIndex();\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::activeModel\r
+/// \return アクティブなモデルを返します。\r
+///\r
+FolderModel *FolderModel::activeModel()\r
+{\r
+    return m_activeModel;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::onCdHome\r
+///\r
+/// ホームフォルダに移動します。\r
+///\r
+void FolderModel::onCdHome()\r
+{\r
+    setRootPath(QDir::homePath());\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::onCdRoot\r
+///\r
+/// ルートフォルダに移動します。\r
+///\r
+void FolderModel::onCdRoot()\r
+{\r
+    setRootPath(QDir::rootPath());\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::onCdUp\r
+///\r
+/// 親フォルダに移動します。\r
+///\r
+void FolderModel::onCdUp()\r
+{\r
+    if (!m_dir.isRoot()) {\r
+        QDir dir(m_dir);\r
+        dir.cdUp();\r
+        setRootPath(dir.absolutePath());\r
+    }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::onHistoryBack\r
+///\r
+/// 履歴を戻ります。\r
+///\r
+void FolderModel::onHistoryBack()\r
+{\r
+    if (m_historyPos > 0) {\r
+        setRootPath(m_history[--m_historyPos], false);\r
+    }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::onHistoryForward\r
+///\r
+/// 履歴を進みます。\r
+///\r
+void FolderModel::onHistoryForward()\r
+{\r
+    if (m_historyPos < m_history.size() - 1) {\r
+        setRootPath(m_history[++m_historyPos], false);\r
+    }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::onMarkAll\r
+///\r
+/// 全てのマークをONにします。\r
+///\r
+void FolderModel::onMarkAll()\r
+{\r
+    CheckContainer::iterator it;\r
+    for (it = m_checkStates.begin(); it != m_checkStates.end(); ++it) {\r
+        it.value() = Qt::Checked;\r
+    }\r
+    emit dataChanged(index(0, 0), index(rowCount(), columnCount()));\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::onMarkAllFiles\r
+///\r
+/// 全てのフォルダをマークOFF、ファイルをマークONにします。\r
+///\r
+void FolderModel::onMarkAllFiles()\r
+{\r
+    foreach (const QFileInfo &fi, m_fileInfoList) {\r
+        if (fi.fileName() == "..") {\r
+            continue;\r
+        }\r
+        if (fi.isDir()) {\r
+            m_checkStates[fi.fileName()] = Qt::Unchecked;\r
+        }\r
+        else {\r
+            m_checkStates[fi.fileName()] = Qt::Checked;\r
+        }\r
+    }\r
+    emit dataChanged(index(0, 0), index(rowCount(), columnCount()));\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::onMarkAllOff\r
+///\r
+/// 全てのマークをOFFにします。\r
+///\r
+void FolderModel::onMarkAllOff()\r
+{\r
+    CheckContainer::iterator it;\r
+    for (it = m_checkStates.begin(); it != m_checkStates.end(); ++it) {\r
+        it.value() = Qt::Unchecked;\r
+    }\r
+    emit dataChanged(index(0, 0), index(rowCount(), columnCount()));\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::onMarkInvert\r
+///\r
+/// 全てのマークを反転します。\r
+///\r
+void FolderModel::onMarkInvert()\r
+{\r
+    CheckContainer::iterator it;\r
+    for (it = m_checkStates.begin(); it != m_checkStates.end(); ++it) {\r
+        it.value() = (it.value() == Qt::Checked) ? Qt::Unchecked : Qt::Checked;\r
+    }\r
+    emit dataChanged(index(0, 0), index(rowCount(), columnCount()));\r
+}\r
+\r
+int FolderModel::rowCount(const QModelIndex &parent) const\r
+{\r
+    Q_UNUSED(parent);\r
+    return m_fileInfoList.size();\r
+}\r
+\r
+int FolderModel::columnCount(const QModelIndex &parent) const\r
+{\r
+    Q_UNUSED(parent);\r
+    return ColumnCount;\r
+}\r
+\r
+QVariant FolderModel::data(const QModelIndex &index, int role) const\r
+{\r
+    if (!index.isValid()) {\r
+        return QVariant();\r
+    }\r
+\r
+    Preferences prefs(const_cast<FolderModel*>(this));\r
+\r
+    switch (role) {\r
+    case Qt::DisplayRole:\r
+        switch (index.column()) {\r
+        case Name:\r
+            if (isDir(index) || isDotFile(index)) {\r
+                return fileName(index);\r
+            }\r
+            return fileInfo(index).completeBaseName();\r
+\r
+        case Extension:\r
+            if (isDir(index) || isDotFile(index)) {\r
+                return QVariant();\r
+            }\r
+            return fileInfo(index).suffix();\r
+\r
+        case Size: // サイズ\r
+            if (isDir(index)) {\r
+                return QString("<DIR>");\r
+            }\r
+            return FileSizeToString(fileInfo(index).size());\r
+\r
+        case LastModified: // 更新日時\r
+            return fileInfo(index).lastModified().toString("yy/MM/dd hh:mm");\r
+        }\r
+        break;\r
+\r
+    case Qt::DecorationRole:\r
+        if (index.column() == Name) {\r
+            return fileIcon(index);\r
+        }\r
+        break;\r
+\r
+    case Qt::FontRole:\r
+        return prefs.getFolderViewFont();\r
+\r
+    case Qt::TextAlignmentRole:\r
+        switch (index.column()) {\r
+        case Size:\r
+        case LastModified:\r
+            return Qt::AlignRight + Qt::AlignVCenter;\r
+        }\r
+        return Qt::AlignLeft + Qt::AlignVCenter;\r
+\r
+    case Qt::BackgroundRole:\r
+        if (isMarked(index)) {\r
+            return QBrush(prefs.folderViewMarkedBgColor(isActive()));\r
+        }\r
+        return QBrush(prefs.folderViewBgColor(isActive()));\r
+\r
+    case Qt::ForegroundRole:\r
+        if (isMarked(index)) {\r
+            return QBrush(prefs.folderViewMarkedFgColor(isActive()));\r
+        }\r
+        if (fileName(index) != ".." && Win32::hasSystemAttribute(filePath(index))) {\r
+            return QBrush(prefs.folderViewSystemColor(isActive()));\r
+        }\r
+        if (fileName(index) != ".." && fileInfo(index).isHidden()) {\r
+            return QBrush(prefs.folderViewHiddenColor(isActive()));\r
+        }\r
+        if (fileName(index) != ".." && !fileInfo(index).isWritable()) {\r
+            return QBrush(prefs.folderViewReadOnlyColor(isActive()));\r
+        }\r
+        return QBrush(prefs.folderViewFgColor(isActive()));\r
+\r
+    case Qt::CheckStateRole:\r
+        if (index.column() == Name && fileName(index) != "..") {\r
+            return isMarked(index) ? Qt::Checked : Qt::Unchecked;\r
+        }\r
+        break;\r
+    }\r
+\r
+    return QVariant();\r
+}\r
+\r
+QVariant FolderModel::headerData(int section, Qt::Orientation orientation, int role) const\r
+{\r
+    if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {\r
+        switch (section) {\r
+        case Name:          return tr("名前");\r
+        case Extension:     return tr("拡張子");\r
+        case Size:          return tr("サイズ");\r
+        case LastModified:  return tr("更新日時");\r
+        }\r
+    }\r
+    return QVariant();\r
+}\r
+\r
+Qt::ItemFlags FolderModel::flags(const QModelIndex &index) const\r
+{\r
+    Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;\r
+\r
+    if (!index.isValid()) {\r
+        return flags | Qt::ItemIsDropEnabled;\r
+    }\r
+\r
+    if (m_fileInfoList[index.row()].fileName() != "..") {\r
+        if (index.column() == Name) {\r
+            flags |= Qt::ItemIsUserCheckable;\r
+        }\r
+        flags |= Qt::ItemIsDropEnabled;\r
+    }\r
+    return flags;\r
+}\r
+\r
+bool FolderModel::setData(const QModelIndex &index, const QVariant &value, int role)\r
+{\r
+    qDebug() << "FolderModel::setData()" << index;\r
+\r
+    if (!index.isValid()) {\r
+        return false;\r
+    }\r
+\r
+    switch (role) {\r
+    case Qt::CheckStateRole:\r
+        if (index.column() == Name && fileName(index) != "..") {\r
+            m_checkStates[fileName(index)] = value.toInt();\r
+            emit dataChanged(this->index(index.row(), 0),\r
+                             this->index(index.row(), ColumnCount - 1));\r
+            return true;\r
+        }\r
+        break;\r
+    }\r
+\r
+    return false;\r
+}\r
+\r
+Qt::DropActions FolderModel::supportedDropActions() const\r
+{\r
+    qDebug() << "FolderModel::supportedDropActions()";\r
+\r
+    return Qt::CopyAction;\r
+}\r
+\r
+QStringList FolderModel::mimeTypes() const\r
+{\r
+    qDebug() << "FolderModel::mimeTypes()";\r
+\r
+    QStringList types;\r
+\r
+    types << "text/uri-list";\r
+\r
+    return types;\r
+}\r
diff --git a/foldermodel.h b/foldermodel.h
new file mode 100644 (file)
index 0000000..15b0e56
--- /dev/null
@@ -0,0 +1,209 @@
+#ifndef FOLDERMODEL_H\r
+#define FOLDERMODEL_H\r
+\r
+#include <QAbstractTableModel>\r
+#include <QDir>\r
+#include <QFileIconProvider>\r
+#include <QFileSystemWatcher>\r
+#include <QBrush>\r
+#include <QFont>\r
+\r
+class FolderModel : public QAbstractTableModel\r
+{\r
+    Q_OBJECT\r
+public:\r
+    enum Column {\r
+        Name = 0,\r
+        Extension,\r
+        Size,\r
+        LastModified,\r
+        ColumnCount,\r
+    };\r
+    typedef QVector<QString> History;\r
+\r
+    explicit FolderModel(QObject *parent = 0);\r
+\r
+    QString         error() const;\r
+    QIcon           fileIcon(const QModelIndex &index) const;\r
+    QFileInfo       fileInfo(const QModelIndex &index) const;\r
+    QString         fileName(const QModelIndex &index) const;\r
+    QString         filePath(const QModelIndex &index) const;\r
+    QDir::Filters   filter() const;\r
+    const History&  history() const;\r
+    bool            isActive() const;\r
+    bool            isDir(const QModelIndex &index) const;\r
+    bool            isHistoryBegin() const;\r
+    bool            isHistoryEnd() const;\r
+    bool            isMarked(const QModelIndex &index) const;\r
+    QFileInfoList   markedItems() const;\r
+    QModelIndex     mkdir(const QString &name);\r
+    QStringList     nameFilters() const;\r
+    QString         rootPath() const;\r
+    QModelIndex     search(const QString &value, const QModelIndex &start = QModelIndex(), int step = 1);\r
+    void            setActive();\r
+    void            setFilter(QDir::Filters filters);\r
+    void            setHistoryAt(const QString &path);\r
+    void            setNameFilters(const QStringList &nameFiltes);\r
+    void            setRootPath(const QString &path, bool addHistory = true);\r
+    void            setSorting(QDir::SortFlags sort);\r
+    QDir::SortFlags sorting() const;\r
+    QModelIndex     touch(const QString &name);\r
+\r
+    static FolderModel* activeModel();\r
+\r
+signals:\r
+\r
+public slots:\r
+    void    onCdHome();\r
+    void    onCdRoot();\r
+    void    onCdUp();\r
+    void    onHistoryBack();\r
+    void    onHistoryForward();\r
+    void    onMarkAll();\r
+    void    onMarkAllFiles();\r
+    void    onMarkAllOff();\r
+    void    onMarkInvert();\r
+    void    refresh();\r
+\r
+private slots:\r
+    void    fsWatcher_directoryChanged(const QString &path);\r
+\r
+private:\r
+    static FolderModel* m_activeModel;\r
+\r
+    typedef QMap<QString, int> CheckContainer;\r
+\r
+    QString             m_error;\r
+    QDir                m_dir;\r
+    QFileInfoList       m_fileInfoList;\r
+    CheckContainer      m_checkStates;\r
+    QFileIconProvider   m_IconProvider;\r
+    QFileSystemWatcher  m_fsWatcher;\r
+    History             m_history;\r
+    int                 m_historyPos;\r
+\r
+    bool    isDotFile(const QModelIndex &index) const;\r
+    void    setError(const QString &error = QString());\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 = Qt::DisplayRole) const;\r
+    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;\r
+    Qt::ItemFlags flags(const QModelIndex &index) const;\r
+    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);\r
+    Qt::DropActions supportedDropActions() const;\r
+    QStringList mimeTypes() const;\r
+};\r
+\r
+inline QString FolderModel::error() const\r
+{\r
+    return m_error;\r
+}\r
+\r
+inline QFileInfo FolderModel::fileInfo(const QModelIndex &index) const\r
+{\r
+    Q_ASSERT(index.isValid());\r
+    return m_fileInfoList[index.row()];\r
+}\r
+\r
+inline QString FolderModel::fileName(const QModelIndex &index) const\r
+{\r
+    Q_ASSERT(index.isValid());\r
+    return m_fileInfoList[index.row()].fileName();\r
+}\r
+\r
+inline QString FolderModel::filePath(const QModelIndex &index) const\r
+{\r
+    Q_ASSERT(index.isValid());\r
+    return m_fileInfoList[index.row()].absoluteFilePath();\r
+}\r
+\r
+inline QDir::Filters FolderModel::filter() const\r
+{\r
+    return m_dir.filter();\r
+}\r
+\r
+inline const FolderModel::History &FolderModel::history() const\r
+{\r
+    return m_history;\r
+}\r
+\r
+inline bool FolderModel::isActive() const\r
+{\r
+    return m_activeModel == this;\r
+}\r
+\r
+inline bool FolderModel::isDir(const QModelIndex &index) const\r
+{\r
+    return m_fileInfoList[index.row()].isDir();\r
+}\r
+\r
+inline bool FolderModel::isHistoryBegin() const\r
+{\r
+    return m_historyPos == 0;\r
+}\r
+\r
+inline bool FolderModel::isHistoryEnd() const\r
+{\r
+    return m_historyPos == m_history.size() - 1;\r
+}\r
+\r
+inline bool FolderModel::isDotFile(const QModelIndex &index) const\r
+{\r
+    return fileName(index).lastIndexOf(".") == 0;\r
+}\r
+\r
+inline QStringList FolderModel::nameFilters() const\r
+{\r
+    return m_dir.nameFilters();\r
+}\r
+\r
+inline void FolderModel::refresh()\r
+{\r
+    setRootPath(rootPath());\r
+}\r
+\r
+inline QString FolderModel::rootPath() const\r
+{\r
+    return m_dir.absolutePath();\r
+}\r
+\r
+inline void FolderModel::setActive()\r
+{\r
+    m_activeModel = this;\r
+}\r
+\r
+inline void FolderModel::setError(const QString &error)\r
+{\r
+    m_error = error;\r
+}\r
+\r
+inline void FolderModel::setFilter(QDir::Filters filters)\r
+{\r
+    m_dir.setFilter(filters);\r
+}\r
+\r
+inline void FolderModel::setSorting(QDir::SortFlags sort)\r
+{\r
+    m_dir.setSorting(sort);\r
+}\r
+\r
+inline void FolderModel::setNameFilters(const QStringList &nameFiltes)\r
+{\r
+    m_dir.setNameFilters(nameFiltes);\r
+}\r
+\r
+inline QDir::SortFlags FolderModel::sorting() const\r
+{\r
+    return m_dir.sorting();\r
+}\r
+\r
+inline void FolderModel::fsWatcher_directoryChanged(const QString &path)\r
+{\r
+    Q_UNUSED(path);\r
+    refresh();\r
+}\r
+\r
+#endif // FOLDERMODEL_H\r
index 051ebb3..f8e0c84 100644 (file)
@@ -1,6 +1,6 @@
-#include "common.h"
+#include "global.h"
+#include "preferences.h"
 #include "mainwindow.h"
-#include "searchbox.h"
 #include "folderpanel.h"
 #include "ui_folderpanel.h"
 
 #include <QSettings>
 #include <QStatusBar>
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::FolderPanel
+/// \param parent   親ウィジェット
+///
+/// コンストラクタ
+///
 FolderPanel::FolderPanel(QWidget *parent) :
     QWidget(parent),
     ui(new Ui::FolderPanel),
     m_mainWnd(NULL)
 {
     ui->setupUi(this);
+    ui->searchBox->setText("");
+    ui->searchBox->setVisible(false);
+    ui->thumbnailView->setVisible(false);
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::~FolderPanel
+///
+/// デストラクタ
+///
 FolderPanel::~FolderPanel()
 {
     delete ui;
 }
 
-void FolderPanel::initialize(MainWindow *mainWnd)
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::initialize
+/// \param w    メインウィンドウオブジェクト
+///
+/// 初期化処理を行います。
+///
+void FolderPanel::initialize(MainWindow *w)
 {
     qDebug() << "FolderPanel::initialize();";
-    m_mainWnd = mainWnd;
-
-    // シグナル&スロット
-    connect(ui->searchBox, SIGNAL(textEdited(QString)), this, SLOT(searchItem(QString)));
-    connect(ui->folderView, SIGNAL(doubleClicked(QModelIndex)), mainWnd, SLOT(open(QModelIndex)));
-    connect(ui->folderView, SIGNAL(dropAccepted(QFileInfoList,QDropEvent*)), mainWnd, SLOT(dropAccept(QFileInfoList,QDropEvent*)));
-    connect(ui->folderView, SIGNAL(currentChanged(QFileInfo)), mainWnd, SLOT(currentChange(QFileInfo)));
-    connect(ui->folderView, SIGNAL(requestContextMenu(QContextMenuEvent*)), mainWnd, SLOT(showContextMenu(QContextMenuEvent*)));
-    connect(ui->folderView, SIGNAL(retrieveStarted(QString)), ui->locationBox, SLOT(setText(QString)));
-    connect(ui->folderView, SIGNAL(dataChanged()), this, SLOT(dataChange()));
-    connect(ui->folderView, SIGNAL(itemFound()), this, SLOT(itemFound()));
-    connect(ui->folderView, SIGNAL(itemNotFound()), this, SLOT(itemNotFound()));
-    connect(ui->bookmarkBtn, SIGNAL(clicked()), this, SLOT(addBookmark()));
-
-    // 初期状態では検索ボックスは非表示
-    ui->searchBox->setVisible(false);
 
     // フォルダビューを初期化する
-    ui->folderView->initialize(mainWnd);
+    ui->folderView->initialize(w);
+    // サムネイルビューを初期化する
+    ui->thumbnailView->initialize(w);
+
+    connect(ui->bookmarkBtn, SIGNAL(clicked()), w, SLOT(onAddBookmark()));
 }
 
-void FolderPanel::updateAppearance(bool darker)
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::itemView
+/// \return アイテムビューを返します。
+///
+QAbstractItemView *FolderPanel::itemView() const
 {
-    QSettings settings;
-    QPalette pal;
-    int darkness = 100;
-    if (darker) {
-        darkness += settings.value(IniKey_Darkness).toInt();
+    if (ui->thumbnailView->isVisible()) {
+        return ui->thumbnailView;
     }
-
-    // ロケーションボックス
-    pal = ui->locationBox->palette();
-    pal.setColor(QPalette::Base, settings.value(IniKey_BoxColorBg).value<QColor>().darker(darkness));
-    pal.setColor(QPalette::Text, settings.value(IniKey_BoxColorFg).value<QColor>().darker(darkness));
-    ui->locationBox->setPalette(pal);
-    ui->locationBox->setFont(settings.value(IniKey_BoxFont).value<QFont>());
-
-    // モデル
-    FileTableModel *model = qobject_cast<FileTableModel*>(ui->folderView->model());
-    model->updateAppearance(darkness);
-
-    // ビュー
-    pal = ui->folderView->palette();
-    pal.setColor(QPalette::Base, settings.value(IniKey_ViewColorBgNormal).value<QColor>().darker(darkness));
-    ui->folderView->setPalette(pal);
-
-    // 行の高さを設定する
-    QHeaderView *header = ui->folderView->verticalHeader();
-    header->setDefaultSectionSize(QFontMetrics(model->font()).height() * 1.5);
-
-    // 列の幅を設定する
-    header = ui->folderView->horizontalHeader();
-    header->setSectionResizeMode(0, QHeaderView::Fixed);
-    header->setSectionResizeMode(1, QHeaderView::Stretch);
-    header->setSectionResizeMode(2, QHeaderView::ResizeToContents);
-    header->setSectionResizeMode(3, QHeaderView::ResizeToContents);
-    header->setSectionResizeMode(4, QHeaderView::ResizeToContents);
+    return ui->folderView;
 }
 
-QLineEdit *FolderPanel::locationBox() const
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::folderView
+/// \return フォルダビューを返します。
+///
+//FolderView *FolderPanel::folderView() const
+//{
+//    return ui->folderView;
+//}
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::model
+/// \return 関連付けられたフォルダモデルを返します。
+///
+FolderModel *FolderPanel::model() const
 {
-    return ui->locationBox;
+    return static_cast<FolderModel*>(ui->folderView->model());
 }
 
-FolderView *FolderPanel::folderView() const
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::setModel
+/// \param m    設定するモデル
+///
+/// モデルを設定します。
+///
+void FolderPanel::setModel(FolderModel *m)
 {
-    return ui->folderView;
-}
+    qDebug() << "FolderPanel::setModel()" << m;
+    if (model()) {
+        model()->disconnect(this);
+    }
 
-SearchBox *FolderPanel::searchBox() const
-{
-    return ui->searchBox;
-}
+    ui->folderView->setModel(m);
+    ui->thumbnailView->setModel(m);
 
-QLabel *FolderPanel::filterLabel() const
-{
-    return ui->filterLabel;
-}
+    if (model()) {
+        connect(model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+                this, SLOT(model_dataChanged(QModelIndex,QModelIndex)));
+        connect(model(), SIGNAL(modelReset()), this, SLOT(model_Reset()));
 
-void FolderPanel::setNameFilters(const QString &filters)
-{
-    QStringList list = filters.split(" ", QString::SkipEmptyParts);
-    if (list.isEmpty()) {
-        list << "*";
+        model_Reset();
+        model_dataChanged(QModelIndex(), QModelIndex());
     }
-    ui->folderView->setNameFilters(list);
-    showNameFilters();
-}
-
-void FolderPanel::showNameFilters()
-{
-    ui->filterLabel->setText(tr("フィルタ:") + ui->folderView->nameFilters().join(" "));
 }
 
-void FolderPanel::dataChange()
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::toggleSearch
+/// \param checked  メニューのチェック状態
+///
+/// 検索ボックスの表示/非表示を切り替えます。
+///
+void FolderPanel::toggleSearch(bool checked)
 {
-    qDebug() << "FolderPanel::dataChange();";
+    qDebug() << "FolderPanel::toggleSearch()" << checked;
 
-    FolderView *view = static_cast<FolderView*>(sender());
-    Q_CHECK_PTR(view);
+    if (checked) {
+        if (!model()->isActive()) {
+            return;
+        }
 
-    QFileInfoList list = view->checkedItems();
-    if (list.isEmpty()) {
-        showNameFilters();
+        ui->searchBox->setVisible(true);
+        ui->searchBox->setFocus();
+        ui->searchBox->selectAll();
     }
     else {
-        int numFolders = 0;
-        int numFiles = 0;
-        quint64 size = 0;
-        foreach (const QFileInfo &info, list) {
-            if (info.isDir()) {
-                numFolders++;
-            }
-            else {
-                numFiles++;
-                size += info.size();
-            }
-        }
-
-        QString msg = QString::null;
-        if (numFolders > 0) {
-            msg += tr("%1個のフォルダ ").arg(numFolders);
-        }
-        if (numFiles > 0) {
-            msg += tr("%1個のファイル ").arg(numFiles);
+        if (!ui->searchBox->isVisible()) {
+            return;
         }
 
-        if (!msg.isEmpty()) {
-            msg += tr("を選択 合計%1").arg(FilesizeToString(size));
+        if (ui->searchBox->hasFocus()) {
+            itemView()->setFocus();
         }
+        ui->searchBox->setVisible(false);
+    }
+}
 
-        ui->filterLabel->setText(msg);
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::toggleView
+/// \param checked  メニューのチェック状態
+///
+/// リスト/サムネイルを切り替えます。
+///
+void FolderPanel::toggleView(bool checked)
+{
+    QModelIndex index = itemView()->currentIndex();
+    if (checked) {
+        ui->folderView->setVisible(false);
+        ui->thumbnailView->setVisible(true);
+        ui->thumbnailView->setFocus();
     }
+    else {
+        ui->thumbnailView->setVisible(false);
+        ui->folderView->setVisible(true);
+        ui->folderView->setFocus();
+    }
+    itemView()->setCurrentIndex(index);
 }
 
-void FolderPanel::addBookmark()
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::updateAppearance
+///
+/// 外観を変更します。
+///
+void FolderPanel::updateAppearance()
 {
-    qDebug() << "FolderPanel::addBookmark();";
+    qDebug() << "FolderPanel::updateAppearance()";
 
-    QSettings settings;
-    int i = 0;
-    while (!settings.value(IniKey_BookmarkEntryName(i), "").toString().isEmpty()) {
-        i++;
-    }
+    Preferences prefs(this);
+    QPalette pal;
 
-    QFileInfo info(ui->folderView->dir());
-    QString name = info.fileName();
-    if (name.isEmpty()) {
-        name = "root";
-    }
-    settings.setValue(IniKey_BookmarkEntryName(i), name);
-    settings.setValue(IniKey_BookmarkEntryPath(i), info.absoluteFilePath());
+    pal = ui->locationBox->palette();
+    pal.setColor(QPalette::Base, prefs.locationBoxBgColor(model()->isActive()));
+    pal.setColor(QPalette::Text, prefs.locationBoxFgColor(model()->isActive()));
+    ui->locationBox->setPalette(pal);
+
+    pal = ui->searchBox->palette();
+    pal.setColor(QPalette::Base, prefs.getSearchBoxBgColor());
+    pal.setColor(QPalette::Text, prefs.getSearchBoxFgColor());
+    ui->searchBox->setPalette(pal);
+
+    pal = ui->folderView->palette();
+    pal.setColor(QPalette::Base, prefs.folderViewBgColor(model()->isActive()));
+    ui->folderView->setPalette(pal);
+
+    pal = ui->thumbnailView->palette();
+    pal.setColor(QPalette::Base, prefs.folderViewBgColor(model()->isActive()));
+    ui->thumbnailView->setPalette(pal);
 
-    m_mainWnd->statusBar()->showMessage(tr("%1をブックマークに追加しました").arg(name));
+    QHeaderView *header = ui->folderView->verticalHeader();
+    QFont font = prefs.getFolderViewFont();
+    header->setDefaultSectionSize(QFontMetrics(font).height() * prefs.getLineHeight());
 }
 
-void FolderPanel::itemFound()
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::searchNext
+/// \param step 次なら1, 前なら-1
+///
+/// 次または前のアイテムを検索します。
+///
+void FolderPanel::searchNext(int step)
 {
-    qDebug() << "FolderPanel::itemFound";
+    qDebug() << "FolderPanel::searchNext()" << step;
 
-    QPalette pal = ui->searchBox->palette();
-    pal.setColor(QPalette::Text, QPalette().text().color());
-    ui->searchBox->setPalette(pal);
+    QModelIndex index = model()->search(ui->searchBox->text(),
+                                        itemView()->currentIndex(),
+                                        step);
+    showSearchResult(index);
 }
 
-void FolderPanel::itemNotFound()
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::showSearchResult
+/// \param index    検索されたアイテム
+///
+/// 検索結果を表示します。
+///
+void FolderPanel::showSearchResult(const QModelIndex &index)
 {
-    qDebug() << "FolderPanel::itemNotFound";
+    Preferences prefs(this);
 
     QPalette pal = ui->searchBox->palette();
-    pal.setColor(QPalette::Text, Qt::red);
+    if (index.isValid()) {
+        itemView()->setCurrentIndex(index);
+        pal.setColor(QPalette::Base, prefs.getSearchBoxBgColor());
+        pal.setColor(QPalette::Text, prefs.getSearchBoxFgColor());
+    }
+    else {
+        pal.setColor(QPalette::Base, prefs.getSearchBoxUnmatchBgColor());
+        pal.setColor(QPalette::Text, prefs.getSearchBoxUnmatchFgColor());
+    }
     ui->searchBox->setPalette(pal);
 }
 
-void FolderPanel::searchItem(const QString &text)
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::model_dataChanged
+/// \param topLeft      (使用しません)
+/// \param bottomRight  (使用しません)
+///
+/// アイテムの選択状態変更に伴う処理を行います。
+///
+void FolderPanel::model_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
 {
-    qDebug() << "FolderPanel::searchItem" << text;
+    Q_UNUSED(topLeft);
+    Q_UNUSED(bottomRight);
 
-    if (text.right(1) == "/") {
-        // '/'が入力されたら、検索終了
-        ui->searchBox->setText(text.left(text.length() - 1));
-        ui->folderView->setFocus();
+    QFileInfoList list = model()->markedItems();
+    if (list.isEmpty()) {
+        ui->filterLabel->setText(tr("フィルタ:%1").arg(model()->nameFilters().join(" ")));
     }
     else {
-        ui->folderView->searchItem(ui->searchBox->text());
+        int numFolders = 0;
+        int numFiles = 0;
+        qint64 totalSize = 0;
+        foreach (const QFileInfo &fi, list) {
+            if (fi.isDir()) {
+                ++numFolders;
+            }
+            else {
+                ++numFiles;
+                totalSize += fi.size();
+            }
+        }
+
+        QString text;
+        if (numFolders > 0) {
+            text += tr("%1個のフォルダ ").arg(numFolders);
+        }
+        if (numFiles > 0) {
+            text += tr("%1個のファイル ").arg(numFiles);
+        }
+        if (!text.isEmpty()) {
+            text += tr("を選択 合計%1").arg(FileSizeToString(totalSize));
+        }
+        ui->filterLabel->setText(text);
     }
 }
 
-void FolderPanel::focusInEvent(QFocusEvent *)
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::model_Reset
+///
+/// モデルリセット後の処理を行います。
+///
+void FolderPanel::model_Reset()
 {
-    qDebug() << "FolderPanel::focusInEvent();";
+    ui->locationBox->setText(model()->rootPath());
+    ui->filterLabel->setText(tr("フィルタ:%1").arg(model()->nameFilters().join(" ")));
+}
 
-    ui->folderView->setFocus();
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderPanel::on_searchBox_textEdited
+/// \param arg1 入力テキスト
+///
+/// 検索ボックスのテキストが変更された場合の処理を行います。
+///
+void FolderPanel::on_searchBox_textEdited(const QString &arg1)
+{
+    if (arg1.right(1) == "/") {
+        ui->searchBox->setText(arg1.left(arg1.size() - 1));
+        // 検索終了
+        itemView()->setFocus();
+    }
+    else {
+        showSearchResult(model()->search(arg1));
+    }
 }
index 10209d6..363abb0 100644 (file)
@@ -2,13 +2,11 @@
 #define FOLDERPANEL_H
 
 #include <QWidget>
-class QLabel;
-class QLineEdit;
-class LocationBox;
-class FolderView;
-class SearchBox;
+#include <QAbstractItemView>
+class FolderModel;
 class MainWindow;
 
+
 namespace Ui {
 class FolderPanel;
 }
@@ -21,34 +19,28 @@ public:
     explicit FolderPanel(QWidget *parent = 0);
     ~FolderPanel();
 
-    void initialize(MainWindow *mainWnd);
-    void updateAppearance(bool darker = false);
-
-    // getter
-    QLineEdit *locationBox() const;
-    FolderView* folderView() const;
-    SearchBox* searchBox() const;
-    QLabel* filterLabel() const;
-
-    // setter
-    void setNameFilters(const QString &filters = QString());
+//    FolderView*     folderView() const;
+    void                initialize(MainWindow *w);
+    QAbstractItemView*  itemView() const;
+    FolderModel*        model() const;
+    void                searchNext(int step = 1);
+    void                setModel(FolderModel *m);
+    void                toggleSearch(bool checked);
+    void                toggleView(bool checked);
+    void                updateAppearance();
 
 private:
     Ui::FolderPanel *ui;
     MainWindow *m_mainWnd;
 
-    void showNameFilters();
+    void    showSearchResult(const QModelIndex &index);
 
 public slots:
-    void dataChange();
-    void addBookmark();
-    void itemFound();
-    void itemNotFound();
-    void searchItem(const QString& text);
-
-    // QWidget interface
-protected:
-    void focusInEvent(QFocusEvent *);
+
+private slots:
+    void    model_dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight);
+    void    model_Reset();
+    void    on_searchBox_textEdited(const QString &arg1);
 };
 
 #endif // FOLDERPANEL_H
index e52dcd6..d58c939 100644 (file)
      </property>
      <item>
       <widget class="QLineEdit" name="locationBox">
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>26</height>
+        </size>
+       </property>
        <property name="focusPolicy">
         <enum>Qt::ClickFocus</enum>
        </property>
+       <property name="text">
+        <string>LocationBox</string>
+       </property>
       </widget>
      </item>
      <item>
      <property name="wordWrap">
       <bool>false</bool>
      </property>
+     <attribute name="horizontalHeaderVisible">
+      <bool>false</bool>
+     </attribute>
      <attribute name="horizontalHeaderHighlightSections">
       <bool>false</bool>
      </attribute>
     </widget>
    </item>
    <item>
-    <widget class="SearchBox" name="searchBox">
+    <widget class="ThumbnailView" name="thumbnailView">
+     <property name="textElideMode">
+      <enum>Qt::ElideMiddle</enum>
+     </property>
+     <property name="viewMode">
+      <enum>QListView::IconMode</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLineEdit" name="searchBox">
      <property name="focusPolicy">
       <enum>Qt::ClickFocus</enum>
      </property>
+     <property name="text">
+      <string>SearchBox</string>
+     </property>
     </widget>
    </item>
    <item>
  </widget>
  <customwidgets>
   <customwidget>
-   <class>SearchBox</class>
-   <extends>QLineEdit</extends>
-   <header>searchbox.h</header>
-  </customwidget>
-  <customwidget>
    <class>FolderView</class>
    <extends>QTableView</extends>
    <header>folderview.h</header>
   </customwidget>
+  <customwidget>
+   <class>ThumbnailView</class>
+   <extends>QListView</extends>
+   <header>thumbnailview.h</header>
+  </customwidget>
  </customwidgets>
  <resources>
   <include location="resource.qrc"/>
index 301e80d..a9619fc 100644 (file)
-#include "common.h"
 #include "mainwindow.h"
+#include "preferences.h"
 #include "folderpanel.h"
 #include "folderview.h"
 
+#include <QApplication>
 #include <QDebug>
+#include <QDrag>
 #include <QHeaderView>
-#include <QKeyEvent>
-#include <QSettings>
+#include <QMouseEvent>
 #include <QMimeData>
-#include <QApplication>
-#include <QDrag>
-#include <QMenu>
-#include <QStatusBar>
-
-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);
-}
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderView::FolderView
+/// \param parent   親ウィジェット
+///
+/// コンストラクタ
+///
 FolderView::FolderView(QWidget *parent) :
     QTableView(parent),
-    m_mainWnd(NULL),
-    m_model(),
+    AbstractView(),
     m_dragStartPos(),
-    m_dragging(false)
+    m_dragging(false),
+    m_saveRow(0),
+    m_savePath(),
+    m_saveName()
 {
-    setModel(&m_model);
-    connect(&m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(dataChanged(QModelIndex,QModelIndex)));
-    connect(&m_model, SIGNAL(preReload()), this, SLOT(preReload()));
-    connect(&m_model, SIGNAL(postReload()), this, SLOT(postReload()));
-
     setDragEnabled(true);
     setAcceptDrops(true);
     setDropIndicatorShown(true);
-
     setContextMenuPolicy(Qt::DefaultContextMenu);
 }
 
-QString FolderView::side() const
-{
-    if (this->objectName() == "folderView1") {
-        return QString("Left");
-    }
-    else {
-        Q_ASSERT(this->objectName() == "folderView2");
-        return QString("Right");
-    }
-}
-
-void FolderView::initialize(MainWindow *mainWnd)
-{
-    qDebug() << side() << "initialize";
-
-    m_mainWnd = mainWnd;
-
-    setColumnWidth(0, 30);
-
-    // ソート順を初期化する
-    setSorting();
-
-    // ネームフィルタを初期化する
-    setNameFilters(QStringList() << "*");
-
-    // 前回終了時のパスを開く
-    QSettings settings;
-    setPath(settings.value(side() + slash + IniKey_Dir).toString(), true);
-}
-
-void FolderView::refresh()
-{
-    qDebug() << side() << "refresh";
-
-    preReload();
-
-    setPath(m_model.absolutePath(), false);
-
-    postReload();
-}
-
-void FolderView::preReload()
-{
-    // 現在行と名前を保存しておく
-    m_saveRow = currentIndex().row();
-    m_saveName = currentItem().fileName();
-}
-
-void FolderView::postReload()
-{
-    // 保存した名前と同名アイテムが見つかれば、再選択する
-    for (int row = 0; row < m_model.rowCount(); row++) {
-        QModelIndex index = m_model.index(row, 1);
-        if (m_model.fileInfo(index).fileName().indexOf(m_saveName) != -1) {
-            setCurrentIndex(index);
-            return;
-        }
-    }
-
-    // 同名アイテムが見つからなければ、行を維持する
-    if (m_saveRow >= m_model.rowCount()) {
-        m_saveRow = m_model.rowCount() - 1;
-    }
-    setCurrentIndex(m_model.index(m_saveRow, 1));
-}
-
-void FolderView::searchItem(const QString &text)
-{
-    qDebug() << side() << "searchItem" << text;
-
-    for (int row = 0; row < m_model.rowCount(); row++) {
-        QModelIndex index = m_model.index(row, 1);
-        QString name = m_model.fileInfo(index).fileName().toLower();
-        if (name.indexOf(text.toLower()) != -1) {
-            setCurrentIndex(index);
-            emit itemFound();
-            return;
-        }
-    }
-
-    emit itemNotFound();
-}
-
-void FolderView::searchNext(const QString &text)
-{
-    qDebug() << side() << "searchNext" << text;
-
-    for (int row = currentIndex().row() + 1; row < m_model.rowCount(); row++) {
-        QModelIndex index = m_model.index(row, 1);
-        QString name = m_model.fileInfo(index).fileName().toLower();
-        if (name.indexOf(text.toLower()) != -1) {
-            setCurrentIndex(index);
-            emit itemFound();
-            return;
-        }
-    }
-
-    emit itemNotFound();
-}
-
-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, 1);
-        QString name = m_model.fileInfo(index).fileName().toLower();
-        if (name.indexOf(text.toLower()) != -1) {
-            setCurrentIndex(index);
-            emit itemFound();
-            return;
-        }
-    }
-
-    emit itemNotFound();
-}
-
-void FolderView::setCheckStateAll(Qt::CheckState state)
-{
-    qDebug() << side() << "setCheckStateAll();" << state;
-
-    QModelIndex current = currentIndex();
-
-    for (int n = 0; n < m_model.rowCount(); n++) {
-        m_model.setData(m_model.index(n, 0), state, Qt::CheckStateRole);
-    }
-
-    setCurrentIndex(current);
-}
-
-void FolderView::setCheckStateAllFiles()
-{
-    qDebug() << side() << "setCheckStateAllFiles();";
-
-    QModelIndex current = currentIndex();
-
-    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.setData(index, Qt::Unchecked, Qt::CheckStateRole);
-        }
-        else {
-            m_model.setData(index, Qt::Checked, Qt::CheckStateRole);
-        }
-    }
-
-    setCurrentIndex(current);
-}
-
-void FolderView::invertCheckState()
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderView::initialize
+/// \param w    メインウィンドウオブジェクト
+///
+/// 初期化処理を行います。
+///
+void FolderView::initialize(MainWindow *w)
 {
-    qDebug() << side() << "invertCheckState();";
+    qDebug() << "FolderView::initialize()";
 
-    QModelIndex current = currentIndex();
+    connect(this, SIGNAL(doubleClicked(QModelIndex)), w, SLOT(onOpen(QModelIndex)));
+    connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
+            w, SLOT(view_currentChanged(QModelIndex,QModelIndex)));
 
-    for (int n = 0; n < m_model.rowCount(); n++) {
-        QModelIndex index = m_model.index(n, 0);
-        if (m_model.data(index, Qt::CheckStateRole).toInt() == Qt::Checked) {
-            m_model.setData(index, Qt::Unchecked, Qt::CheckStateRole);
-        }
-        else {
-            m_model.setData(index, Qt::Checked, Qt::CheckStateRole);
-        }
-    }
-
-    setCurrentIndex(current);
-}
-
-void FolderView::toggleCheckState(const QModelIndex &index)
-{
-    qDebug() << side() << "toggleCheckState();" << index;
-
-    QFileInfo info = m_model.fileInfo(index);
-    if (info.fileName() != "..") {
-        QModelIndex chkIndex = m_model.index(index.row(), 0);
-        if (m_model.data(chkIndex, Qt::CheckStateRole).toInt() == Qt::Checked) {
-            m_model.setData(chkIndex, Qt::Unchecked, Qt::CheckStateRole);
-        }
-        else {
-            m_model.setData(chkIndex, Qt::Checked, Qt::CheckStateRole);
-        }
-    }
-    // 最終行でなければ、次のアイテムに移動する
-    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() << side() << "currentItem";
-
-    return m_model.fileInfo(currentIndex());
-}
-
-QFileInfoList FolderView::checkedItems() const
-{
-    qDebug() << side() << "checkedItems()";
-
-    QFileInfoList list;
-    for (int n = 0; n < m_model.rowCount(); n++) {
-        QModelIndex index = m_model.index(n, 0);
-        if (m_model.data(index, Qt::CheckStateRole).toInt() == Qt::Checked) {
-            list << m_model.fileInfo(index);
-        }
-    }
-    return list;
+    installEventFilter(w);
+    viewport()->installEventFilter(w);
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderView::selectedItems
+/// \return
+///
 QFileInfoList FolderView::selectedItems() const
 {
-    qDebug() << side() << "selectedItems";
-
-    // マークされているアイテムを取得する
-    QFileInfoList list = checkedItems();
-
-    // 一つもマークされていなければ、カーソル位置のアイテムを取得する
+    QFileInfoList list = folderModel()->markedItems();
     if (list.isEmpty()) {
-        list << currentItem();
+        list << folderModel()->fileInfo(currentIndex());
     }
 
     return list;
 }
 
-FolderPanel *FolderView::parentPanel() const
-{
-    return qobject_cast<FolderPanel*>(parentWidget());
-}
-
-void FolderView::setPath(const QString &path, bool addHistory)
-{
-    qDebug() << side() << "setPath" << path << addHistory;
-
-    Q_ASSERT(QFileInfo(path).isDir());
-
-    m_mainWnd->statusBar()->showMessage(tr("ファイルリストを取得しています..."));
-    emit retrieveStarted(path);
-
-    m_model.setPath(path);
-    setCurrentIndex(m_model.index(0, 1));
-
-    if (addHistory) {
-        m_history.add(path);
-    }
-
-    m_mainWnd->statusBar()->showMessage(tr("レディ"));
-}
-
-void FolderView::setFilter(QDir::Filters filter, bool enable)
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderView::model_PreReset
+///
+/// モデルリセット前の処理
+///
+void FolderView::model_PreReset()
 {
-    qDebug() << side() << "setFilter" << enable;
+    qDebug() << "FolderView::model_PreReset()";
 
-    if (enable) {
-        m_model.setFilter(m_model.filter() | filter);
+    // 現在行と名前を保存しておく
+    if (model() && currentIndex().isValid()) {
+        m_saveRow = currentIndex().row();
+        m_saveName = folderModel()->fileName(currentIndex());
+        m_savePath = folderModel()->rootPath();
     }
     else {
-        m_model.setFilter(m_model.filter() ^ filter);
+        m_saveRow = 0;
+        m_saveName = QString::null;
+        m_savePath = QString::null;
     }
 }
 
-void FolderView::setHistoryIndexAt(int index)
-{
-    m_history.setAt(index);
-    setPath(m_history.current(), false);
-}
-
-void FolderView::setNameFilters(const QStringList &list)
-{
-    m_model.setNameFilters(list);
-}
-
-void FolderView::setSorting()
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderView::model_PostReset
+///
+/// モデルリセット後の処理
+///
+void FolderView::model_PostReset()
 {
-    qDebug() << side() << "setSorting();";
-
-    QSettings settings;
-    QDir::SortFlags flags;
+    qDebug() << "FolderView::model_PostReset()";
 
-    int sortBy = settings.value(side() + slash + IniKey_SortBy).toInt();
-    switch (sortBy) {
-    case SortByDate:    flags |= QDir::Time; break;
-    case SortBySize:    flags |= QDir::Size; break;
-    case SortByType:    flags |= QDir::Type; break;
-    default:            flags |= QDir::Name; break;
-    }
-
-    // デフォルトだと文字列は昇順で、数値は降順…orz
-    int orderBy = settings.value(side() + slash + IniKey_OrderBy).toInt();
-    if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||
-        ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))
-    {
-        flags |= QDir::Reversed;
-    }
-
-    switch (settings.value(side() + slash + IniKey_PutDirs).toInt()) {
-    case PutDirsFirst:  flags |= QDir::DirsFirst; break;
-    case PutDirsLast:   flags |= QDir::DirsLast; break;
+    // フォルダが変わった場合は先頭行を選択する
+    if (m_savePath != folderModel()->rootPath()) {
+        setCurrentIndex(model()->index(0, 0));
+        return;
     }
 
-    if (settings.value(side() + slash + IniKey_IgnoreCase).toBool()) {
-        flags |= QDir::IgnoreCase;
+    // 保存した名前と同名アイテムが見つかれば、再選択する
+    for (int row = 0; row < model()->rowCount(); row++) {
+        QModelIndex index = model()->index(row, 0);
+        if (folderModel()->fileName(index) == m_saveName) {
+            setCurrentIndex(index);
+            return;
+        }
     }
 
-    m_model.setSorting(flags);
-}
-
-void FolderView::keyPressEvent(QKeyEvent *event)
-{
-    qDebug() << side() << "keyPressEvent";
-
-    if (IsKeyUpDown(event)) {
-        QTableView::keyPressEvent(event);
-        event->accept();
-        return;
+    // 同名アイテムが見つからなければ、行を維持する
+    if (m_saveRow >= model()->rowCount()) {
+        m_saveRow = model()->rowCount() - 1;
     }
-
-    // MainWindowへ
-    event->ignore();
-}
-
-void FolderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
-{
-    qDebug() << side() << "dataChanged();";
-
-    emit dataChanged();
-
-    QTableView::dataChanged(topLeft, bottomRight, roles);
-}
-
-void FolderView::currentChanged(const QModelIndex &current, const QModelIndex &previous)
-{
-    qDebug() << side() << "currentChanged();" << current;
-
-    emit currentChanged(m_model.fileInfo(current));
-
-    QTableView::currentChanged(current, previous);
+    setCurrentIndex(model()->index(m_saveRow, 1));
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderView::mousePressEvent
+/// \param event
+///
 void FolderView::mousePressEvent(QMouseEvent *event)
 {
-    if ((event->buttons() & Qt::LeftButton) || (event->buttons() & Qt::RightButton))
+    m_dragStartPos = QPoint();
+    if ((event->buttons() & Qt::LeftButton) ||
+        (event->buttons() & Qt::RightButton))
     {
-        m_dragStartPos = event->pos();
+        QModelIndex index = indexAt(event->pos());
+        if (index.isValid() && folderModel()->fileName(index) != "..") {
+            m_dragStartPos = event->pos();
+        }
     }
 
     QTableView::mousePressEvent(event);
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief FolderView::mouseMoveEvent
+/// \param event
+///
 void FolderView::mouseMoveEvent(QMouseEvent *event)
 {
     if (!(event->buttons() & Qt::LeftButton) &&
-            !(event->buttons() & Qt::RightButton))
+        !(event->buttons() & Qt::RightButton))
     {
         QTableView::mouseMoveEvent(event);
         return;
     }
-    if ((event->pos() - m_dragStartPos).manhattanLength()
-            < QApplication::startDragDistance())
+    if (m_dragStartPos.isNull() ||
+        (event->pos() - m_dragStartPos).manhattanLength() < qApp->startDragDistance())
     {
         QTableView::mouseMoveEvent(event);
         return;
     }
 
     QFileInfoList list = selectedItems();
-    if (list.isEmpty()) {
-        QTableView::mousePressEvent(event);
+    if (list.size() == 1 && list[0].fileName() == "..") {
+        QTableView::mouseMoveEvent(event);
         return;
     }
 
@@ -448,17 +171,15 @@ void FolderView::mouseMoveEvent(QMouseEvent *event)
     drag->setMimeData(mimeData);
 
     m_dragging = true;
-    if (event->buttons() & Qt::RightButton) {
-        drag->exec(Qt::CopyAction | Qt::MoveAction);
-    }
-    else {
-        drag->exec(Qt::CopyAction);
-    }
+    drag->exec(Qt::CopyAction);
     m_dragging = false;
+    m_dragStartPos = QPoint();
 }
 
 void FolderView::dragEnterEvent(QDragEnterEvent *event)
 {
+    qDebug() << "FolderView::dragEnterEvent()";
+
     if (event->mimeData()->hasUrls()) {
         event->acceptProposedAction();
         return;
@@ -467,40 +188,37 @@ void FolderView::dragEnterEvent(QDragEnterEvent *event)
     QTableView::dragEnterEvent(event);
 }
 
-void FolderView::dropEvent(QDropEvent *event)
+void FolderView::setModel(QAbstractItemModel *model)
 {
-    qDebug() << side() << "dropEvent();";
-
-    if (m_dragging) {
-        event->ignore();
-        return;
+    if (this->model()) {
+        this->model()->disconnect(this);
     }
 
-    QFileInfoList list;
-    foreach (const QUrl &url, event->mimeData()->urls()) {
-        QString path = QFileInfo(url.toLocalFile()).canonicalFilePath();
-        if (!path.isEmpty()) {
-            list << path;
-        }
-        else {
-            qDebug() << "path is empty." << url;
-        }
-    }
+    QTableView::setModel(model);
 
-    if (list.isEmpty()) {
-        event->ignore();
-        return;
-    }
+    if (this->model()) {
+        connect(this->model(), SIGNAL(modelAboutToBeReset()), this, SLOT(model_PreReset()));
+        connect(this->model(), SIGNAL(modelReset()), this, SLOT(model_PostReset()));
 
-    event->acceptProposedAction();
-
-    emit dropAccepted(list, event);
+        // 列の幅を設定する
+        horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
+        horizontalHeader()->setSectionResizeMode(FolderModel::Name,
+                                                 QHeaderView::Stretch);
+    }
 }
 
-
-void FolderView::contextMenuEvent(QContextMenuEvent *event)
+void FolderView::scaleUp()
 {
-    qDebug() << side() << "contextMenuEvent();";
+    Preferences prefs(this);
+    QFont font = prefs.getFolderViewFont();
+    font.setPointSize(font.pointSize() + 1);
+    prefs.setFolderViewFont(font);
+}
 
-    emit requestContextMenu(event);
+void FolderView::scaleDown()
+{
+    Preferences prefs(this);
+    QFont font = prefs.getFolderViewFont();
+    font.setPointSize(font.pointSize() - 1);
+    prefs.setFolderViewFont(font);
 }
index e23813c..930d115 100644 (file)
@@ -1,89 +1,62 @@
 #ifndef FOLDERVIEW_H
 #define FOLDERVIEW_H
 
-#include "filetablemodel.h"
-#include "history.h"
+#include "abstractview.h"
+#include "foldermodel.h"
 
 #include <QTableView>
 class MainWindow;
-class FolderPanel;
 
-class FolderView : public QTableView
+class FolderView : public QTableView, public AbstractView
 {
     Q_OBJECT
+    Q_PROPERTY(bool dragging MEMBER m_dragging READ isDragging())
+
 public:
     explicit FolderView(QWidget *parent = 0);
 
-    QString side() const;
-
-    // actions
-    void initialize(MainWindow *mainWnd);
-
-    void searchItem(const QString &text);
-    void searchNext(const QString &text);
-    void searchPrev(const QString &text);
-
-    void setCheckStateAll(Qt::CheckState state);
-    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 checkedItems() const;
-    QFileInfoList selectedItems() const;
-    const History* history() const { return &m_history; }
-    QStringList nameFilters() const { return m_model.nameFilters(); }
-    FolderPanel *parentPanel() const;
-
-
-    // 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();
+    void            initialize(MainWindow *w);
+    bool            isDragging();
+    FolderModel*    folderModel() const;
+    QFileInfoList   selectedItems() const;
 
 private:
-    MainWindow *m_mainWnd;
-    FileTableModel m_model;
-    History m_history;
-    QPoint m_dragStartPos;
-    bool m_dragging;
-    int m_saveRow;
+    QPoint  m_dragStartPos;
+    bool    m_dragging;
+    int     m_saveRow;
+    QString m_savePath;
     QString m_saveName;
 
 signals:
-    void currentChanged(const QFileInfo &info);
-    void dataChanged();
-    void dropAccepted(const QFileInfoList &list, QDropEvent *event);
-    void itemFound();
-    void itemNotFound();
-    void retrieveStarted(const QString &path);
-    void requestContextMenu(QContextMenuEvent *event);
 
-public slots:
-    void refresh();
-    void preReload();
-    void postReload();
-
-    // QAbstractItemView interface
-protected slots:
-    void currentChanged(const QModelIndex &current, const QModelIndex &previous);
-    void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>());
+private slots:
+    void    model_PreReset();
+    void    model_PostReset();
 
     // QWidget interface
 protected:
-    void keyPressEvent(QKeyEvent *event);
     void mousePressEvent(QMouseEvent *event);
     void mouseMoveEvent(QMouseEvent *event);
     void dragEnterEvent(QDragEnterEvent *event);
-    void dropEvent(QDropEvent *event);
-    void contextMenuEvent(QContextMenuEvent *event);
+
+    // QAbstractItemView interface
+public:
+    void setModel(QAbstractItemModel *model);
+
+    // AbstractView interface
+public:
+    void scaleUp();
+    void scaleDown();
 };
 
+inline bool FolderView::isDragging()
+{
+    return m_dragging;
+}
+
+inline FolderModel *FolderView::folderModel() const
+{
+    return static_cast<FolderModel*>(model());
+}
+
 #endif // FOLDERVIEW_H
diff --git a/global.cpp b/global.cpp
new file mode 100644 (file)
index 0000000..789184f
--- /dev/null
@@ -0,0 +1,22 @@
+#include "global.h"
+
+void appendActionShortcut(QAction *action, const QString &ks)
+{
+    QList<QKeySequence> shortcuts = action->shortcuts();
+    shortcuts << QKeySequence(ks);
+    action->setShortcuts(shortcuts);
+}
+
+QString FileSizeToString(qint64 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);
+}
diff --git a/global.h b/global.h
new file mode 100644 (file)
index 0000000..9a72364
--- /dev/null
+++ b/global.h
@@ -0,0 +1,16 @@
+#ifndef GLOBAL_H
+#define GLOBAL_H
+
+#define QQ(x)   ("\"" + QString(x) + "\"")
+
+#include <QAction>
+#include <QKeySequence>
+#include <QMap>
+#include <QString>
+
+typedef QMap<QString, QString> StringMap;
+
+extern void appendActionShortcut(QAction *action, const QString &ks);
+extern QString FileSizeToString(qint64 size);
+
+#endif // GLOBAL_H
diff --git a/history.cpp b/history.cpp
deleted file mode 100644 (file)
index 733ceb4..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#include "history.h"
-
-History::History() :
-    m_list(),
-    m_pos(0)
-{
-}
-
-void History::add(const QString &path)
-{
-    // 現在位置より後ろのデータは削除する
-    if (!isEmpty() && !isEnd()) {
-        m_list.resize(m_pos + 1);
-    }
-    // 現在位置と異なるパスであれば追加する
-    if (isEmpty() || (m_list[m_pos] != path)) {
-        m_list << path;
-    }
-    m_pos = m_list.size() - 1;
-}
-
-const QString &History::back()
-{
-    if (!isBegin()) {
-        m_pos--;
-    }
-    return m_list[m_pos];
-}
-
-const QString &History::forward()
-{
-    if (!isEnd()) {
-        m_pos++;
-    }
-    return m_list[m_pos];
-}
diff --git a/history.h b/history.h
deleted file mode 100644 (file)
index 0d86e4d..0000000
--- a/history.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <QStringList>
-
-#ifndef HISTORY_H
-#define HISTORY_H
-
-#include <QVector>
-
-class History
-{
-    typedef QVector<QString> Container;
-
-public:
-    History();
-
-    void add(const QString &path);
-
-    const QString& back();
-    const QString& forward();
-    const QString& current() const { return m_list[m_pos]; }
-
-    bool isBegin() const    { return m_pos == 0; }
-    bool isEnd() const      { return m_pos == m_list.size() - 1; }
-    bool isEmpty() const    { return m_list.isEmpty(); }
-
-    int size() const { return m_list.size(); }
-    const QString& at(int n) const { return m_list.at(n); }
-    void setAt(int n) { m_pos = n; }
-
-private:
-    Container m_list;
-    int m_pos;
-};
-
-#endif // HISTORY_H
index ff3f1aa..a44b4f6 100644 (file)
@@ -1,14 +1,13 @@
-#include "common.h"
-#include "mainwindow.h"
+#include "foldermodel.h"
 #include "historydialog.h"
 #include "ui_historydialog.h"
 
 HistoryDialog::HistoryDialog(QWidget *parent) :
     QDialog(parent),
     ui(new Ui::HistoryDialog),
-    m_leftHistory(NULL),
-    m_rightHistory(NULL),
-    m_displaying(NULL)
+    m_leftModel(NULL),
+    m_rightModel(NULL),
+    m_activeModel(NULL)
 {
     ui->setupUi(this);
     resize(parent->width() * 0.8, height());
@@ -19,76 +18,56 @@ HistoryDialog::~HistoryDialog()
     delete ui;
 }
 
-void HistoryDialog::setHistory(const History *left, const History *right)
+void HistoryDialog::setModel(const FolderModel *left, const FolderModel *right, FolderModel *active)
 {
-    m_leftHistory = left;
-    m_rightHistory = right;
-}
+    m_leftModel = left;
+    m_rightModel = right;
+    m_activeModel = active;
 
-void HistoryDialog::setDefaultLeft(bool bLeft)
-{
-    if (bLeft) {
-        ui->leftPane->setChecked(true);
+    if (active == left) {
+        ui->radioLeft->click();
     }
     else {
-        ui->rightPane->setChecked(true);
+        ui->radioRight->click();
     }
-}
 
-int HistoryDialog::selectedIndex() const
-{
-    int row = ui->listWidget->currentIndex().row();
-    return m_displaying->size() - row - 1;
-}
-
-const QString HistoryDialog::selectedSide() const
-{
-    if (ui->leftPane->isChecked()) {
-        return QString("Left");
+    for (int n = left->history().size() - 1; n >= 0; --n) {
+        ui->listLeft->addItem(left->history().at(n));
     }
-    else {
-        return QString("Right");
+    for (int n = right->history().size() - 1; n >= 0; --n) {
+        ui->listRight->addItem(right->history().at(n));
     }
 }
 
-void HistoryDialog::showLeftHistory()
+void HistoryDialog::on_radioLeft_clicked()
 {
-    if (m_displaying != m_leftHistory) {
-        m_displaying = m_leftHistory;
-        showHistory();
-    }
-
+    ui->listRight->setVisible(false);
+    ui->listLeft->setVisible(true);
 }
 
-void HistoryDialog::showRightHistory()
+void HistoryDialog::on_radioRight_clicked()
 {
-    if (m_displaying != m_rightHistory) {
-        m_displaying = m_rightHistory;
-        showHistory();
-    }
+    ui->listLeft->setVisible(false);
+    ui->listRight->setVisible(true);
 }
 
-void HistoryDialog::showHistory()
+void HistoryDialog::accept()
 {
-    ui->listWidget->clear();
-    for (int n = 0; n < m_displaying->size(); n++) {
-        ui->listWidget->insertItem(0, m_displaying->at(n));
+    QString path;
+    const FolderModel *selected;
+    if (ui->radioLeft->isChecked()) {
+        selected = m_leftModel;
+        path = ui->listLeft->currentItem()->text();
+    }
+    else {
+        selected = m_rightModel;
+        path = ui->listRight->currentItem()->text();
     }
-    ui->listWidget->setCurrentRow(0);
-}
-
-void HistoryDialog::showEvent(QShowEvent *event)
-{
-    Q_UNUSED(event);
 
-    if (ui->leftPane->isChecked()) {
-        showLeftHistory();
+    if (selected == m_activeModel) {
+        m_activeModel->setHistoryAt(path);
     }
     else {
-        showRightHistory();
+        m_activeModel->setRootPath(path);
     }
-
-    connect(ui->leftPane, SIGNAL(clicked()), this, SLOT(showLeftHistory()));
-    connect(ui->rightPane, SIGNAL(clicked()), this, SLOT(showRightHistory()));
-    connect(ui->listWidget, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(accept()));
 }
index b48b014..7903e2c 100644 (file)
@@ -1,9 +1,8 @@
 #ifndef HISTORYDIALOG_H
 #define HISTORYDIALOG_H
 
-#include "history.h"
-
 #include <QDialog>
+class FolderModel;
 
 namespace Ui {
 class HistoryDialog;
@@ -17,26 +16,23 @@ public:
     explicit HistoryDialog(QWidget *parent = 0);
     ~HistoryDialog();
 
-    void setHistory(const History *left, const History *right);
-    void setDefaultLeft(bool bLeft);
+    void setModel(const FolderModel *left,
+                  const FolderModel *right,
+                  FolderModel *active);
 
-    int selectedIndex() const;
-    const QString selectedSide() const;
+private slots:
+    void on_radioLeft_clicked();
+    void on_radioRight_clicked();
 
 private:
     Ui::HistoryDialog *ui;
-    const History *m_leftHistory;
-    const History *m_rightHistory;
-    const History *m_displaying;
-
-private slots:
-    void showLeftHistory();
-    void showRightHistory();
-    void showHistory();
+    const FolderModel *m_leftModel;
+    const FolderModel *m_rightModel;
+    FolderModel *m_activeModel;
 
-    // QWidget interface
-protected:
-    void showEvent(QShowEvent *event);
+    // QDialog interface
+public slots:
+    void accept();
 };
 
 #endif // HISTORYDIALOG_H
index 311e85f..6cc2ee0 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>280</width>
-    <height>286</height>
+    <width>548</width>
+    <height>288</height>
    </rect>
   </property>
   <property name="windowTitle">
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
-      <widget class="QRadioButton" name="leftPane">
+      <widget class="QRadioButton" name="radioLeft">
        <property name="focusPolicy">
         <enum>Qt::StrongFocus</enum>
        </property>
        <property name="text">
-        <string>å·¦ã\83\9aã\82¤ã\83³</string>
+        <string>å·¦ã\83\91ã\83\8dã\83«</string>
        </property>
        <attribute name="buttonGroup">
         <string notr="true">buttonGroup</string>
       </widget>
      </item>
      <item>
-      <widget class="QRadioButton" name="rightPane">
+      <widget class="QRadioButton" name="radioRight">
        <property name="focusPolicy">
         <enum>Qt::StrongFocus</enum>
        </property>
        <property name="text">
-        <string>å\8f³ã\83\9aã\82¤ã\83³</string>
+        <string>å\8f³ã\83\91ã\83\8dã\83«</string>
        </property>
        <attribute name="buttonGroup">
         <string notr="true">buttonGroup</string>
     </layout>
    </item>
    <item>
-    <widget class="QListWidget" name="listWidget">
-     <property name="focusPolicy">
-      <enum>Qt::StrongFocus</enum>
-     </property>
-    </widget>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <widget class="QListWidget" name="listLeft">
+       <property name="focusPolicy">
+        <enum>Qt::StrongFocus</enum>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QListWidget" name="listRight">
+       <property name="focusPolicy">
+        <enum>Qt::StrongFocus</enum>
+       </property>
+      </widget>
+     </item>
+    </layout>
    </item>
    <item>
     <widget class="QDialogButtonBox" name="buttonBox">
@@ -67,9 +78,9 @@
   </layout>
  </widget>
  <tabstops>
-  <tabstop>listWidget</tabstop>
-  <tabstop>leftPane</tabstop>
-  <tabstop>rightPane</tabstop>
+  <tabstop>listLeft</tabstop>
+  <tabstop>radioLeft</tabstop>
+  <tabstop>radioRight</tabstop>
  </tabstops>
  <resources/>
  <connections>
diff --git a/images/Picture.png b/images/Picture.png
deleted file mode 100644 (file)
index c992023..0000000
Binary files a/images/Picture.png and /dev/null differ
diff --git a/images/Pictures.png b/images/Pictures.png
new file mode 100644 (file)
index 0000000..588947a
Binary files /dev/null and b/images/Pictures.png differ
diff --git a/images/windows_fullscreen.png b/images/windows_fullscreen.png
new file mode 100644 (file)
index 0000000..562bdfc
Binary files /dev/null and b/images/windows_fullscreen.png differ
index 921179b..b54cd61 100644 (file)
@@ -2,7 +2,7 @@
 \r
 ; HM NIS Edit Wizard helper defines\r
 !define PRODUCT_NAME "Gefu"\r
-!define PRODUCT_VERSION "0.20"\r
+!define PRODUCT_VERSION "0.21"\r
 !define PRODUCT_PUBLISHER "@miyabi_satoh"\r
 !define PRODUCT_WEB_SITE "http://gefu.sourceforge.jp/"\r
 !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Gefu.exe"\r
@@ -51,7 +51,7 @@ var ICONS_GROUP
 ; MUI end ------\r
 \r
 Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"\r
-OutFile "Gefu020_full_setup.exe"\r
+OutFile "Gefu021_full_setup.exe"\r
 InstallDir "$PROGRAMFILES\Gefu"\r
 InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""\r
 ShowInstDetails show\r
index 920f98b..ad6d550 100644 (file)
@@ -2,7 +2,7 @@
 \r
 ; HM NIS Edit Wizard helper defines\r
 !define PRODUCT_NAME "Gefu"\r
-!define PRODUCT_VERSION "0.20"\r
+!define PRODUCT_VERSION "0.21"\r
 !define PRODUCT_PUBLISHER "@miyabi_satoh"\r
 !define PRODUCT_WEB_SITE "http://gefu.sourceforge.jp/"\r
 !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Gefu.exe"\r
@@ -51,7 +51,7 @@ var ICONS_GROUP
 ; MUI end ------\r
 \r
 Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"\r
-OutFile "Gefu020_Setup.exe"\r
+OutFile "Gefu021_Setup.exe"\r
 InstallDir "$PROGRAMFILES\Gefu"\r
 InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""\r
 ShowInstDetails show\r
diff --git a/irenamedialog.cpp b/irenamedialog.cpp
deleted file mode 100644 (file)
index 25248e1..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "irenamedialog.h"\r
-\r
-IRenameDialog::IRenameDialog(QWidget *parent) :\r
-    QDialog(parent)\r
-{\r
-}\r
-\r
-void IRenameDialog::setWorkingDirectory(const QString &path)\r
-{\r
-    m_dir.setPath(path);\r
-}\r
diff --git a/irenamedialog.h b/irenamedialog.h
deleted file mode 100644 (file)
index 89e3bae..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef IRENAMEDIALOG_H\r
-#define IRENAMEDIALOG_H\r
-\r
-#include <QDialog>\r
-#include <QDir>\r
-#include "common.h"\r
-\r
-class IRenameDialog : public QDialog\r
-{\r
-    Q_OBJECT\r
-public:\r
-    explicit IRenameDialog(QWidget *parent = 0);\r
-\r
-    const StringMap& renameMap() const { return m_RenameMap; }\r
-\r
-    void setWorkingDirectory(const QString &path);\r
-    virtual void setNames(const QFileInfoList &names) = 0;\r
-\r
-signals:\r
-\r
-public slots:\r
-\r
-protected:\r
-    QDir m_dir;\r
-    StringMap m_RenameMap;\r
-};\r
-\r
-#endif // IRENAMEDIALOG_H\r
index 20d4b4c..8c813af 100644 (file)
 = フォルダビュー
 ||キー      ||装飾なし                           ||Shift                            ||Alt                            ||Ctrl(Command)                ||覚え方                         ||
 ||A         ||すべてのファイルをマーク           ||すべてマーク                     ||                               ||                             ||All                            ||
-||B         ||ブックマークを表示                 ||ブックマークを編集               ||                               ||                             ||Bookmark                       ||
+||B         ||ブックマークを表示                 ||ブックマークを編集               ||                               ||ブックマークを追加           ||Bookmark                       ||
 ||C         ||ファイル名をクリップボードにコピー ||フルパスをクリップボードにコピー ||                               ||隣のパネルにアイテムをコピー ||Copy                           ||
 ||D         ||                                   ||                                 ||                               ||選択アイテムを削除           ||Delete                         ||
-||E         ||外部エディタで開く                 ||                                 ||                               ||ファイルを作成               ||Edit, newの「E」               ||
+||E         ||外部エディタで開く                 ||                                 ||                               ||ファイルを作成               ||Edit                           ||
 ||G         ||フォルダを選択して移動             ||                                 ||                               ||                             ||Go                             ||
 ||H         ||ホームフォルダに移動               ||隠しファイルを表示/非表示        ||                               ||                             ||Home, Hide                     ||
 ||I         ||マークを反転                       ||                                 ||                               ||                             ||Invert                         ||
@@ -24,7 +24,7 @@
 ||M         ||開く                               ||アプリケーションで開く           ||                               ||隣のパネルにアイテムを移動   ||viのキーバインド, Move         ||
 ||O         ||隣のパネルと同じフォルダを表示     ||隣のパネルに同じフォルダを表示   ||                               ||                             ||Onaji(同じ)                    ||
 ||P         ||プレビューモードに切り替え/解除   ||                                 ||                               ||                             ||Preview                        ||
-||R         ||履歴を表示                         ||                                 ||                               ||名前の変更                   ||Rireki, Rename                 ||
+||R         ||履歴を表示                         ||                                 ||                               ||名前の変更                   ||Rireki(履歴), Rename           ||
 ||S         ||ソート方法を選択                   ||システムファイルを表示/非表示    ||                               ||                             ||Sort, System                   ||
 ||U         ||すべてのマークを解除               ||アーカイバで開く                 ||                               ||                             ||Unmark, Unpack                 ||
 ||W         ||表示フォルダを交換                 ||                                 ||                               ||                             ||swapの「W」                    ||
@@ -41,6 +41,8 @@
 ||/         ||ファイル検索開始/終了              ||                                 ||                               ||                             ||                               ||
 ||←        ||親フォルダに移動/隣のパネルに移動  ||右パネルを拡大                   ||                               ||                             ||                               ||
 ||→        ||親フォルダに移動/隣のパネルに移動  ||左パネルを拡大                   ||                               ||                             ||                               ||
+||,         ||単画面/二画面を切り替え           ||                                 ||                               ||                             ||<                              ||
+||.         ||リスト/サムネイルを切り替え       ||                                 ||                               ||                             ||>                              ||
 
 = テキストビューア
 ||キー      ||装飾なし                           ||Shift                            ||Alt                            ||Ctrl(Command)                    ||覚え方                ||
index 883cd03..83ede96 100644 (file)
--- a/main.cpp
+++ b/main.cpp
-#include "common.h"\r
 #include "mainwindow.h"\r
 \r
-#include <QDebug>\r
 #include <QApplication>\r
-#include <QSettings>\r
-#include <QDir>\r
-#include <QAction>\r
-#include <QTimer>\r
 \r
 int main(int argc, char *argv[])\r
 {\r
     QApplication a(argc, argv);\r
-    a.setOrganizationName("gefu");\r
-    a.setOrganizationDomain("sourceforge.jp");\r
-    a.setApplicationName("Gefu");\r
-    a.setWindowIcon(QIcon("://images/file-manager.png"));\r
-\r
-    QSettings::setDefaultFormat(QSettings::IniFormat);\r
-    QSettings settings;\r
-    if (settings.value(IniKey_ResetOnBoot, false).toBool()) {\r
-        settings.clear();\r
-    }\r
-\r
-    // 各オプションのデフォルト値を設定する\r
-    QFont font = a.font();\r
-#ifdef Q_OS_WIN\r
-    font.setFamily("MS ゴシック");\r
-#else\r
-    font.setFamily("Monaco");\r
-#endif\r
-    //>>>>> 起動と終了\r
-    if (settings.value(IniKey_ConfirmExit, "").toString().isEmpty()) {\r
-        settings.setValue(IniKey_ConfirmExit, true);\r
-        settings.setValue(IniKey_BootSizeSpec, "sizeRelative");\r
-        settings.setValue(IniKey_BootSizeAbs, QSize(800,600));\r
-        settings.setValue(IniKey_BootSizeRel, QSize(75,75));\r
-        settings.setValue(IniKey_BootPosSpec, "posCenter");\r
-        settings.setValue(IniKey_BootPosAbs, QPoint(0, 0));\r
-        settings.setValue(IniKey_BootPosRel, QPoint(0, 0));\r
-    }\r
-    //>>>>> 色とフォント\r
-    if (settings.value(IniKey_BoxFont, "").toString().isEmpty()) {\r
-        settings.setValue(IniKey_BoxFont, font);\r
-        settings.setValue(IniKey_BoxColorBg, QPalette().base().color());\r
-        settings.setValue(IniKey_BoxColorFg, QPalette().text().color());\r
-    }\r
-    if (settings.value(IniKey_ViewFont, "").toString().isEmpty()) {\r
-        settings.setValue(IniKey_ViewFont, font);\r
-        settings.setValue(IniKey_ViewColorBgMark, QColor(0,192,0));\r
-        settings.setValue(IniKey_ViewColorBgNormal, QPalette().base().color());\r
-        settings.setValue(IniKey_ViewColorFgHidden, QColor(128,128,128));\r
-        settings.setValue(IniKey_ViewColorFgMark, QColor(128,0,0));\r
-        settings.setValue(IniKey_ViewColorFgNormal, QPalette().text().color());\r
-        settings.setValue(IniKey_ViewColorFgReadonly, QColor(0,128,0));\r
-        settings.setValue(IniKey_ViewColorFgSystem, QColor(128,0,128));\r
-    }\r
-    //>>>>> ファイル操作\r
-    if (settings.value(IniKey_AutoCloseCopy, "").toString().isEmpty()) {\r
-        settings.setValue(IniKey_AutoCloseCopy, false);\r
-        settings.setValue(IniKey_AutoCloseDelete, false);\r
-        settings.setValue(IniKey_AutoCloseMove, false);\r
-        settings.setValue(IniKey_AutoCloseRename, false);\r
-    }\r
-    if (settings.value(IniKey_ConfirmCopy, "").toString().isEmpty()) {\r
-        settings.setValue(IniKey_ConfirmCopy, true);\r
-        settings.setValue(IniKey_ConfirmDelete, true);\r
-        settings.setValue(IniKey_ConfirmMove, true);\r
-        settings.setValue(IniKey_ConfirmRename, true);\r
-    }\r
-    if (settings.value(IniKey_DefaultOnCopy, "").toString().isEmpty())\r
-        settings.setValue(IniKey_DefaultOnCopy, "owDefIfNew");\r
-    if (settings.value(IniKey_MoveAfterCreateFolder, "").toString().isEmpty())\r
-        settings.setValue(IniKey_MoveAfterCreateFolder, false);\r
-    if (settings.value(IniKey_OpenAfterCreateFile, "").toString().isEmpty())\r
-        settings.setValue(IniKey_OpenAfterCreateFile, false);\r
-    //>>>>> パス設定\r
-    // エディタ\r
-    if (settings.value(IniKey_PathEditor, "").toString().isEmpty()) {\r
-#if defined(Q_OS_WIN)\r
-        settings.setValue(IniKey_PathEditor, "notepad.exe");\r
-#elif defined(Q_OS_MAC)\r
-        settings.setValue(IniKey_PathEditor, "/Applications/TextEdit.app");\r
-#else\r
-        settings.setValue(IniKey_PathEditor, "gedit");\r
-#endif\r
-    }\r
-    // ターミナル\r
-    if (settings.value(IniKey_PathTerminal, "").toString().isEmpty()) {\r
-#if defined(Q_OS_WIN)\r
-        settings.setValue(IniKey_PathTerminal, "cmd.exe /k cd");\r
-#elif defined(Q_OS_MAC)\r
-        settings.setValue(IniKey_PathTerminal, "/Applications/Utilities/Terminal.app --args -c cd");\r
-#else\r
-        settings.setValue(IniKey_TerminalPath, "gnome-terminal");\r
-#endif\r
-    }\r
-    // アーカイバ\r
-    if (settings.value(IniKey_PathArchiver, "").toString().isEmpty()) {\r
-#if defined(Q_OS_WIN)\r
-        if (QFileInfo::exists("C:/Program Files/Lhaplus/Lhaplus.exe")) {\r
-            settings.setValue(IniKey_PathArchiver, QQ("C:/Program Files/Lhaplus/Lhaplus.exe"));\r
-        }\r
-        else if (QFileInfo::exists("C:/Program Files/Lhaca/Lhaca.exe")) {\r
-            settings.setValue(IniKey_PathArchiver, QQ("C:/Program Files/Lhaca/Lhaca.exe"));\r
-        }\r
-        else if (QFileInfo::exists("C:/Program Files/7-zip/7zFM.exe")) {\r
-            settings.setValue(IniKey_PathArchiver, QQ("C:/Program Files/7-zip/7zFM.exe"));\r
-        }\r
-\r
-#elif defined(Q_OS_MAC)\r
-        settings.setValue(IniKey_PathArchiver, QQ("/System/Library/CoreServices/Archive Utility.app"));\r
-#else\r
-#endif\r
-    }\r
-\r
-    //>>>>> テキストビューア\r
-    if (settings.value(IniKey_ViewerFont, "").toString().isEmpty()) {\r
-        settings.setValue(IniKey_ViewerColorBg, QPalette().base().color());\r
-        settings.setValue(IniKey_ViewerColorFg, QPalette().text().color());\r
-        settings.setValue(IniKey_ViewerFont, font);\r
-        settings.setValue(IniKey_ViewerForceOpen, false);\r
-        settings.setValue(IniKey_ViewerInherit, true);\r
-        settings.setValue(IniKey_ViewerIgnoreExt, ViewerIgnoreExt());\r
-    }\r
-\r
-    //>>>>> 隠しファイルの表示\r
-    if (settings.value(IniKey_ShowHidden, "").toString().isEmpty())\r
-        settings.setValue(IniKey_ShowHidden, false);\r
-    //>>>>> システムファイルの表示\r
-    if (settings.value(IniKey_ShowSystem, "").toString().isEmpty())\r
-        settings.setValue(IniKey_ShowSystem, false);\r
-    //>>>>> 最新版のチェック\r
-    if (settings.value(IniKey_CheckUpdates, "").toString().isEmpty())\r
-        settings.setValue(IniKey_CheckUpdates, true);\r
-    //>>>>> 最後のフォルダとソート方法\r
-    QString side = "Left/";\r
-    if (settings.value(side + IniKey_Dir, "").toString().isEmpty()) {\r
-        settings.setValue(side + IniKey_Dir, QDir::homePath());\r
-        settings.setValue(side + IniKey_SortBy, SortByName);\r
-        settings.setValue(side + IniKey_OrderBy, OrderByAsc);\r
-        settings.setValue(side + IniKey_PutDirs, PutDirsFirst);\r
-        settings.setValue(side + IniKey_IgnoreCase, true);\r
-    }\r
-    side = "Right/";\r
-    if (settings.value(side + IniKey_Dir, "").toString().isEmpty()) {\r
-        settings.setValue(side + IniKey_Dir, QDir::homePath());\r
-        settings.setValue(side + IniKey_SortBy, SortByName);\r
-        settings.setValue(side + IniKey_OrderBy, OrderByAsc);\r
-        settings.setValue(side + IniKey_PutDirs, PutDirsFirst);\r
-        settings.setValue(side + IniKey_IgnoreCase, true);\r
-    }\r
-\r
     MainWindow w;\r
     w.show();\r
 \r
     return a.exec();\r
 }\r
-\r
-QString ViewerIgnoreExt()\r
-{\r
-    QStringList list;\r
-    // 画像系\r
-    list << "ico" << "ai" << "psd" << "xcf" << "tif" << "tiff" << "wmf";\r
-    // 音・動画系\r
-    list << "wav" << "mp3" << "ogg" << "midi" << "mid" << "aif" << "aiff";\r
-    list << "mov" << "mpg" << "mpeg" << "wma" << "wmv" << "asf" << "avi";\r
-    list << "flac" << "mkv";\r
-    // 実行ファイル系\r
-    list << "exe" << "com" << "lib" << "dll" << "msi" << "scr" << "sys";\r
-    list << "o" << "obj" << "ocx" << "a" << "so" << "app";\r
-    // アーカイブ系\r
-    list << "lzh" << "zip" << "cab" << "tar" << "rar" << "gz" << "tgz";\r
-    list << "bz2" << "xz" << "jar" << "7z" << "dmg";\r
-    // ドキュメント系\r
-    list << "pdf" << "doc" << "docx" << "xls" << "xlsx" << "ppt" << "pptx";\r
-    // フォント\r
-    list << "ttf" << "ttc";\r
-\r
-    list.sort();\r
-\r
-    return list.join(",");\r
-}\r
-\r
-bool ProcessShortcut(const QString &ksq, const QObject *object)\r
-{\r
-    qDebug() << "ProcessShortcut()";\r
-\r
-    if (ksq.isEmpty()) {\r
-        return false;\r
-    }\r
-\r
-    foreach (QObject *obj, object->children()) {\r
-        QAction *action = qobject_cast<QAction*>(obj);\r
-        if (!action || !action->isEnabled()) {\r
-            continue;\r
-        }\r
-\r
-        foreach (const QKeySequence &k, action->shortcuts()) {\r
-            if (ksq == k.toString()) {\r
-                if (action->isCheckable()) {\r
-                    action->setChecked(!action->isChecked());\r
-                }\r
-                else {\r
-                    emit action->triggered();\r
-                }\r
-                qDebug() << "emit" << action->objectName();\r
-                return true;\r
-            }\r
-        }\r
-    }\r
-    return false;\r
-}\r
-\r
-void Sleep(int msec)\r
-{\r
-    QEventLoop loop;\r
-    QTimer::singleShot(msec, &loop, SLOT(quit()));\r
-    loop.exec();\r
-}\r
index f0486d6..7d933d9 100644 (file)
@@ -1,8 +1,9 @@
-#include "common.h"\r
+#include "global.h"\r
 #include "version.h"\r
 #include "preferencedialog.h"\r
-#include "folderview.h"\r
-#include "searchbox.h"\r
+#include "foldermodel.h"\r
+#include "folderpanel.h"\r
+//#include "folderview.h"\r
 #include "copymoveworker.h"\r
 #include "operationdialog.h"\r
 #include "overwritedialog.h"\r
 #include "sortdialog.h"\r
 #include "simpletextview.h"\r
 #include "simpleimageview.h"\r
+#include "bookmarkdialog.h"\r
+#include "preferences.h"\r
 #include "mainwindow.h"\r
 #include "ui_mainwindow.h"\r
-#include "bookmarkdialog.h"\r
 \r
 #include <QCheckBox>\r
 #include <QCloseEvent>\r
 #include <QDebug>\r
-#include <QDesktopWidget>\r
 #include <QMessageBox>\r
-#include <QSettings>\r
+#include <QMimeData>\r
 #include <QNetworkAccessManager>\r
-#include <QNetworkReply>\r
 #include <QInputDialog>\r
 #include <QProcess>\r
 #include <QDesktopServices>\r
 #include <QClipboard>\r
 #include <QFileDialog>\r
-#include <folderpanel.h>\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::MainWindow\r
+/// \param parent   親ウィジェット\r
+///\r
+/// コンストラクタ\r
+///\r
 MainWindow::MainWindow(QWidget *parent) :\r
     QMainWindow(parent),\r
     ui(new Ui::MainWindow),\r
-    m_activeView(NULL),\r
-    m_overwriteDialog(NULL),\r
-    m_viewMode(ModeBasic)\r
+    m_overwriteDialog(this),\r
+    m_viewMode(ModeBasic),\r
+    m_prevMode(ModeBasic)\r
 {\r
-    qDebug() << ">>>>>>>>>> MainWindowの構築開始 <<<<<";\r
     ui->setupUi(this);\r
-\r
-    m_overwriteDialog = new OverWriteDialog(this);\r
-\r
-    initActionConnections();\r
-    connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(focusChange(QWidget*,QWidget*)));\r
-    connect(ui->pane3->textView(), SIGNAL(viewFinished()), this, SLOT(viewFinish()));\r
-    connect(ui->pane3->imageView(), SIGNAL(viewFinished()), this, SLOT(viewFinish()));\r
-    connect(ui->pane1->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
-    connect(ui->pane2->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
-    connect(ui->pane3->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
-    connect(ui->pane1->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
-    connect(ui->pane2->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
-    connect(ui->pane3->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
-\r
-    // ビューアは初期状態で非表示\r
-    ui->pane3->setVisible(false);\r
+    connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(app_focusChange(QWidget*,QWidget*)));\r
 \r
     // ステータスバーにウィジェットを設定する\r
-    QLabel *label = new QLabel("", this);\r
+    QLabel *label = new QLabel(this);\r
     label->setAlignment(Qt::AlignRight);\r
     label->setObjectName("Right");\r
     ui->statusBar->addPermanentWidget(label, 0);\r
 \r
-    for (int i = 1; i <= 2; i++) {\r
-        // pane1 or pane2\r
-        AnyView *anyView = findChild<AnyView*>(QString("pane%1").arg(i));\r
-        Q_CHECK_PTR(anyView);\r
-\r
-        FolderPanel *fp = anyView->findChild<FolderPanel*>("folderPanel");\r
-        Q_CHECK_PTR(fp);\r
-\r
-        // FolderPanelとFolderViewの名前を変更する\r
-        fp->setObjectName(QString("folderPanel%1").arg(i));\r
-        fp->folderView()->setObjectName(QString("folderView%1").arg(i));\r
+    // アプリケーション情報を初期化する\r
+    qApp->setApplicationDisplayName(tr("げふぅ Ver%1").arg(VERSION_VALUE));\r
+    qApp->setApplicationName("Gefu");\r
+    qApp->setApplicationVersion(QString("%1").arg(VERSION_VALUE));\r
+    qApp->setOrganizationDomain("sourceforge.jp");\r
+    qApp->setOrganizationName("gefu");\r
+    qApp->setWindowIcon(QIcon("://images/file-manager.png"));\r
+\r
+    // 古い設定ファイルを削除する\r
+    QSettings::setDefaultFormat(QSettings::IniFormat);\r
+    QSettings settings(this);\r
+    if (QFileInfo::exists(settings.fileName())) {\r
+        QFile(settings.fileName()).remove();\r
+        QDir().rmdir(QFileInfo(settings.fileName()).absolutePath());\r
+    }\r
+\r
+    // パネルにモデルを割り当てる\r
+    ui->LPanel->setModel(new FolderModel(this));\r
+    ui->RPanel->setModel(new FolderModel(this));\r
+    setActiveModel(ui->LPanel->model());\r
+\r
+    // パネルを初期化する\r
+    ui->LPanel->initialize(this);\r
+    ui->RPanel->initialize(this);\r
+    ui->FPanel->initialize(this);\r
+    ui->FPanel->setVisible(false);\r
+\r
+    // モデルを初期化する\r
+    Preferences prefs(this);\r
+    prefs.restoreModel("Left", ui->LPanel->model());\r
+    prefs.restoreModel("Right", ui->RPanel->model());\r
+\r
+    // アクションを初期化する\r
+    initActions();\r
 \r
-        fp->initialize(this);\r
-        fp->updateAppearance(i == 2);\r
-    }\r
-\r
-    QSettings settings;\r
     // ブックマークメニューを初期化する\r
-    initBookmark();\r
-\r
-    // メニュー項目の状態を初期化する\r
-    ui->view_Hidden->setChecked(settings.value(IniKey_ShowHidden).toBool());\r
-    ui->view_System->setChecked(settings.value(IniKey_ShowSystem).toBool());\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
-    shortcuts = ui->action_Exec->shortcuts();\r
-    shortcuts.append(QKeySequence("Shift+M"));\r
-    ui->action_Exec->setShortcuts(shortcuts);\r
+    initBookmarkMenu();\r
 \r
-    // MacだとShift+の形で認識されてしまうもの\r
-    shortcuts = ui->view_FontSizeUp->shortcuts();\r
-    shortcuts.append(QKeySequence("Shift++"));\r
-    ui->view_FontSizeUp->setShortcuts(shortcuts);\r
-\r
-    shortcuts = ui->view_Filter->shortcuts();\r
-    shortcuts.append(QKeySequence("Shift+*"));\r
-    ui->view_Filter->setShortcuts(shortcuts);\r
-\r
-    shortcuts = ui->action_OpenTerminal->shortcuts();\r
-    shortcuts.append(QKeySequence("Shift+>"));\r
-    ui->action_OpenTerminal->setShortcuts(shortcuts);\r
-\r
-    shortcuts = ui->help_About->shortcuts();\r
-    shortcuts.append(QKeySequence("Shift+?"));\r
-    ui->help_About->setShortcuts(shortcuts);\r
-\r
-    // ウィンドウタイトルを設定する\r
-    setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));\r
-\r
-    // ウィンドウアイコンを設定する\r
+    // メインウィンドウを初期化する\r
+    setWindowTitle(qApp->applicationDisplayName());\r
     setWindowIcon(QIcon("://images/file-manager.png"));\r
-\r
-    //>>>>> ウィンドウサイズと位置を設定する\r
-    QString strValue;\r
-    QPoint point = this->geometry().topLeft();\r
-    QSize size = this->geometry().size();\r
-    //>>>> 前回の位置・サイズ・状態を復元する\r
-    if (!settings.value(IniKey_WindowGeometry, "").toString().isEmpty()) {\r
-        restoreGeometry(settings.value(IniKey_WindowGeometry).toByteArray());\r
-        restoreState(settings.value(iniKey_WindowState).toByteArray());\r
-    }\r
-    //>>>> INIファイルの設定から復元する\r
-    //>>> サイズ\r
-    strValue = settings.value(IniKey_BootSizeSpec).toString();\r
-    if (strValue == "sizeAbsolute") {\r
-        size = settings.value(IniKey_BootSizeAbs).toSize();\r
-    }\r
-    else if (strValue == "sizeRelative") {\r
-        size = settings.value(IniKey_BootSizeRel).toSize();\r
-        size.setWidth(size.width() * QApplication::desktop()->width() / 100.0);\r
-        size.setHeight(size.height() * QApplication::desktop()->height() / 100.0);\r
-    }\r
-    else if (strValue == "sizeLast") {\r
-        size = this->geometry().size();\r
-    }\r
-    //>>> 位置\r
-    strValue = settings.value(IniKey_BootPosSpec).toString();\r
-    if (strValue == "posAbsolute") {\r
-        point = settings.value(IniKey_BootPosAbs).toPoint();\r
-    }\r
-    else if (strValue == "posRelative") {\r
-        point = settings.value(IniKey_BootPosRel).toPoint();\r
-        point.setX(point.x() * QApplication::desktop()->width() / 100.0);\r
-        point.setY(point.y() * QApplication::desktop()->height() / 100.0);\r
-    }\r
-    else if (strValue == "posLast") {\r
-        point = this->geometry().topLeft();\r
-    }\r
-    else {\r
-        point.setX((QApplication::desktop()->width() - size.width()) / 2);\r
-        point.setY((QApplication::desktop()->height() - size.height()) / 2);\r
-    }\r
-    this->setGeometry(QRect(point, size));\r
+    prefs.restoreWindow(this);\r
 \r
     // 最新バージョンをチェックする\r
-    if (settings.value(IniKey_CheckUpdates).toBool()) {\r
-        checkUpdate(true);\r
+    if (prefs.isCheckUpdate()) {\r
+        onCheckUpdate(true);\r
     }\r
-\r
-    ui->pane2->changeView(AnyView::ViewFolder);\r
-    ui->pane2->repaint();\r
-\r
-    ui->pane1->changeView(AnyView::ViewFolder);\r
-    ui->pane1->repaint();\r
-\r
-    qDebug() << ">>>>>>>>>> MainWindowの構築終了 <<<<<";\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::~MainWindow\r
+///\r
+/// デストラクタ\r
+///\r
 MainWindow::~MainWindow()\r
 {\r
     delete ui;\r
 }\r
 \r
-void MainWindow::focusChange(QWidget *old, QWidget *now)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::app_focusChange\r
+/// \param old  フォーカスを失うウィジェット\r
+/// \param now  フォーカスを得るウィジェット\r
+///\r
+/// フォーカス変更時の処理\r
+///\r
+void MainWindow::app_focusChange(QWidget *old, QWidget *now)\r
 {\r
-    qDebug() << ">>>>> フォーカス変更";\r
-    if (old) qDebug() << "old is" << old->objectName();\r
-    if (now) qDebug() << "now is" << now->objectName();\r
+    qDebug() << "MainWindow::app_focusChange()";\r
+    if (old) qDebug() << "  old is" << old->objectName();\r
+    if (now) qDebug() << "  now is" << now->objectName();\r
 \r
-    // 検索ボックスがフォーカスを失ったら、非表示にする\r
-    if (old == ui->pane1->folderPanel()->searchBox() ||\r
-        old == ui->pane2->folderPanel()->searchBox())\r
+    // フォルダビューがフォーカスを得た場合\r
+    if (now && (now->objectName() == "folderView" ||\r
+                now->objectName() == "thumbnailView"))\r
     {\r
-        ui->action_Search->setChecked(false);\r
+        FolderModel *m = static_cast<FolderModel*>(focusItemView()->model());\r
+        setActiveModel(m);\r
+        ui->statusBar->showMessage(m->filePath(focusItemView()->currentIndex()));\r
     }\r
 \r
-    // フォルダビューにフォーカスが移ったら、ステータスバーの表示を更新する\r
-    if (now == ui->pane1->folderPanel()->folderView() ||\r
-        now == ui->pane2->folderPanel()->folderView())\r
-    {\r
-        m_activeView = qobject_cast<FolderView*>(now);\r
-        ui->statusBar->showMessage(m_activeView->currentItem().absoluteFilePath());\r
-        m_activeView->parentPanel()->updateAppearance(false);\r
-        otherSideFolderView(m_activeView)->parentPanel()->updateAppearance(true);\r
+    // 検索ボックスがフォーカスを失った場合\r
+    if (old && old->objectName() == "searchBox") {\r
+        // 検索モード終了\r
+        ui->toggle_Search->setChecked(false);\r
     }\r
 \r
+    // アクションの有効/無効を設定する\r
     if (now) {\r
         updateActions();\r
     }\r
 }\r
 \r
-void MainWindow::executeCommand()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::model_PreReset\r
+///\r
+/// FolderModelリセット前の処理\r
+///\r
+void MainWindow::model_PreReset()\r
 {\r
-    qDebug() << "MainWindow::executeCommand";\r
+    qDebug() << "MainWindow::model_PreReset()";\r
+\r
+    ui->statusBar->showMessage(tr("ファイルリストを取得しています..."));\r
+}\r
 \r
-    QFileInfoList list = m_activeView->selectedItems();\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::model_PostReset\r
+///\r
+/// FolderModelリセット後の処理\r
+///\r
+void MainWindow::model_PostReset()\r
+{\r
+    qDebug() << "MainWindow::model_PostReset()";\r
+\r
+    FolderModel *m = static_cast<FolderModel*>(sender());\r
+    if (!m->error().isEmpty()) {\r
+        ui->statusBar->showMessage(m->error());\r
+    }\r
+    else {\r
+        ui->statusBar->showMessage(tr("レディ"));\r
+    }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onRunCommand\r
+///\r
+/// 入力されたコマンドを実行します。\r
+///\r
+void MainWindow::onRunCommand()\r
+{\r
+    qDebug() << "MainWindow::onRunCommand";\r
+\r
+    QFileInfoList list = selectedItems();\r
     QString command = QString::null;\r
     foreach (const QFileInfo &info, list) {\r
 #ifdef Q_OS_MAC\r
@@ -241,13 +212,18 @@ void MainWindow::executeCommand()
     int ret = dlg.exec();\r
     command = dlg.textValue();\r
     if (ret == QDialog::Accepted && !command.isEmpty()) {\r
-        startProcess(command, m_activeView->dir(), tr("コマンドの実行に失敗しました。"));\r
+        startProcess(command, tr("コマンドの実行に失敗しました。"));\r
     }\r
 }\r
 \r
-void MainWindow::expandLeft()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onExpandLeft\r
+///\r
+/// 左パネルを拡大します。\r
+///\r
+void MainWindow::onExpandLeft()\r
 {\r
-    qDebug() << "MainWindow::expandLeft();";\r
+    qDebug() << "MainWindow::onExpandLeft()";\r
 \r
     QList<int> sizes = ui->splitter->sizes();\r
     QList<int> newSizes;\r
@@ -256,12 +232,16 @@ void MainWindow::expandLeft()
     newSizes << sizes[1] - 30;\r
 \r
     ui->splitter->setSizes(newSizes);\r
-\r
 }\r
 \r
-void MainWindow::expandRight()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onExpandRight\r
+///\r
+/// 右パネルを拡大します。\r
+///\r
+void MainWindow::onExpandRight()\r
 {\r
-    qDebug() << "MainWindow::expandLeft();";\r
+    qDebug() << "MainWindow::onExpandLeft()";\r
 \r
     QList<int> sizes = ui->splitter->sizes();\r
     QList<int> newSizes;\r
@@ -270,240 +250,291 @@ void MainWindow::expandRight()
     newSizes << sizes[1] + 30;\r
 \r
     ui->splitter->setSizes(newSizes);\r
-\r
 }\r
 \r
-void MainWindow::historyBack()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onToggleMark\r
+///\r
+/// マーク状態を反転します。\r
+///\r
+void MainWindow::onToggleMark()\r
 {\r
-    qDebug() << "MainWindow::historyBack();";\r
+    qDebug() << "MainWindow::onToggleMark()";\r
 \r
-    if (m_activeView->historyBack()) {\r
-        updateActions();\r
+    QModelIndex index = focusItemView()->currentIndex();\r
+    if (activeModel()->isMarked(index)) {\r
+        activeModel()->setData(index, Qt::Unchecked, Qt::CheckStateRole);\r
+    }\r
+    else {\r
+        activeModel()->setData(index, Qt::Checked, Qt::CheckStateRole);\r
     }\r
-}\r
-\r
-void MainWindow::historyForward()\r
-{\r
-    qDebug() << "MainWindow::historyForward();";\r
 \r
-    if (m_activeView->historyForward()) {\r
-        updateActions();\r
+    if (index.row() < activeModel()->rowCount() - 1) {\r
+        index = activeModel()->index(index.row() + 1, 0);\r
+        focusItemView()->setCurrentIndex(index);\r
     }\r
 }\r
 \r
-void MainWindow::markAll()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::view_statusChanged\r
+/// \param text ステータス文字列\r
+///\r
+/// ビューから受け取った文字列をステータスバーに表示します。\r
+///\r
+void MainWindow::view_statusChanged(const QString &text)\r
 {\r
-    qDebug() << "MainWindow::markAll();";\r
-\r
-    m_activeView->setCheckStateAll(Qt::Checked);\r
+    ui->statusBar->findChild<QLabel*>("Right")->setText(text);\r
 }\r
 \r
-void MainWindow::markAllFiles()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::view_currentChanged\r
+/// \param current  新しいカレントインデックス\r
+/// \param previous (使用しません)\r
+///\r
+/// カレントインデックスが変更された場合の処理を行います。\r
+///\r
+void MainWindow::view_currentChanged(const QModelIndex &current, const QModelIndex &previous)\r
 {\r
-    qDebug() << "MainWindow::markAllFiles();";\r
-\r
-    m_activeView->setCheckStateAllFiles();\r
-}\r
+    qDebug() << "MainWindow::view_currentChanged()" << current;\r
+    Q_UNUSED(previous);\r
 \r
-void MainWindow::markAllOff()\r
-{\r
-    qDebug() << "MainWindow::markAllOff();";\r
+    if (focusItemView() != sender()->parent()) {\r
+        return;\r
+    }\r
 \r
-    m_activeView->setCheckStateAll(Qt::Unchecked);\r
-}\r
+    ui->statusBar->showMessage(activeModel()->filePath(current));\r
 \r
-void MainWindow::markInvert()\r
-{\r
-    qDebug() << "MainWindow::markInvert();";\r
+    if (m_viewMode == ModePreview) {\r
+        inactivePanel()->setViewItem(current);\r
+    }\r
 \r
-    m_activeView->invertCheckState();\r
+    updateActions();\r
 }\r
 \r
-void MainWindow::markToggle()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::view_finished\r
+///\r
+/// ビューアの終了\r
+///\r
+void MainWindow::view_finished()\r
 {\r
-    qDebug() << "MainWindow::markToggle();";\r
+    qDebug() << "MainWindow::view_finished()";\r
+\r
+    ui->statusBar->findChild<QLabel*>("Right")->setText("");\r
 \r
-    m_activeView->toggleCheckState(m_activeView->currentIndex());\r
+    setViewMode(m_prevMode);\r
 }\r
 \r
-void MainWindow::moveItems()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onMove\r
+///\r
+/// 選択アイテムを隣のパネルに移動します。\r
+///\r
+void MainWindow::onMove()\r
 {\r
-    qDebug() << "MainWindow::moveItems";\r
+    qDebug() << "MainWindow::onMove";\r
 \r
-    QFileInfoList list = m_activeView->selectedItems();\r
+    QFileInfoList list = selectedItems();\r
     if (list.isEmpty()) {\r
         return;\r
     }\r
 \r
-    int row = m_activeView->currentIndex().row();\r
+    int row = focusItemView()->currentIndex().row();\r
 \r
-    QString tgtPath = otherSideFolderView(m_activeView)->dir();\r
+    QString tgtPath = inactiveModel()->rootPath();\r
     moveItems(list, tgtPath);\r
-    m_activeView->refresh();\r
 \r
-    if (row >= m_activeView->model()->rowCount()) {\r
-        row = m_activeView->model()->rowCount() - 1;\r
+    if (row >= activeModel()->rowCount()) {\r
+        row = activeModel()->rowCount() - 1;\r
     }\r
-    m_activeView->setCurrentIndex(m_activeView->model()->index(row, 1));\r
+    focusItemView()->setCurrentIndex(activeModel()->index(row, 1));\r
 }\r
 \r
-\r
-void MainWindow::leftKeyPress()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onKeyLeft\r
+///\r
+/// ←キー押下時の処理を行います。\r
+///\r
+void MainWindow::onKeyLeft()\r
 {\r
-    qDebug() << "MainWindow::leftKeyPress();";\r
+    qDebug() << "MainWindow::onKeyLeft()";\r
 \r
-    if (ui->pane3->textView()->hasFocus()) {\r
-        QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier);\r
-        QApplication::sendEvent(ui->pane3->textView(), &event);\r
-    }\r
-    else if (ui->pane1->folderPanel()->folderView()->hasFocus()) {\r
-        setPathToParent();\r
+    QWidget *w = qApp->focusWidget();\r
+    if (w->objectName() == "folderView")\r
+    {\r
+        QWidget *panel = w->parentWidget()->parentWidget();\r
+        if (panel == ui->LPanel) {\r
+            activeModel()->onCdUp();\r
+        }\r
+        else if (ui->LPanel->folderPanel()->isVisible()){\r
+            ui->LPanel->folderPanel()->itemView()->setFocus();\r
+        }\r
     }\r
-    else if (ui->pane2->folderPanel()->folderView()->hasFocus()) {\r
-        ui->pane1->folderPanel()->folderView()->setFocus();\r
+    else {\r
+        QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier);\r
+        qApp->sendEvent(w, &event);\r
     }\r
 }\r
 \r
-void MainWindow::rightKeyPress()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onKeyRight\r
+///\r
+/// →キー押下時の処理を行います。\r
+///\r
+void MainWindow::onKeyRight()\r
 {\r
-    qDebug() << "MainWindow::rightKeyPress();";\r
+    qDebug() << "MainWindow::onKeyRight()";\r
 \r
-    if (ui->pane3->textView()->hasFocus()) {\r
-        QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier);\r
-        QApplication::sendEvent(ui->pane3->textView(), &event);\r
-    }\r
-    else if (ui->pane1->folderPanel()->folderView()->hasFocus()) {\r
-        ui->pane2->folderPanel()->folderView()->setFocus();\r
+    QWidget *w = qApp->focusWidget();\r
+    if (w->objectName() == "folderView")\r
+    {\r
+        QWidget *panel = w->parentWidget()->parentWidget();\r
+        if (panel == ui->RPanel) {\r
+            activeModel()->onCdUp();\r
+        }\r
+        else if (ui->RPanel->folderPanel()->isVisible()){\r
+            ui->RPanel->folderPanel()->itemView()->setFocus();\r
+        }\r
     }\r
-    else if (ui->pane2->folderPanel()->folderView()->hasFocus()) {\r
-        setPathToParent();\r
+    else {\r
+        QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier);\r
+        qApp->sendEvent(w, &event);\r
     }\r
 }\r
 \r
-void MainWindow::showFileInfo(const QString &str)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onChooseFolder\r
+///\r
+/// 選択したフォルダに移動します。\r
+///\r
+void MainWindow::onChooseFolder()\r
 {\r
-    qDebug() << "MainWindow::showFileInfo();" << str;\r
-    QLabel *label = ui->statusBar->findChild<QLabel*>("Right");\r
-    Q_CHECK_PTR(label);\r
-\r
-    label->setText(str);\r
-}\r
-\r
-void MainWindow::chooseFolder()\r
-{\r
-    qDebug() << "MainWindow::chooseFolder();";\r
+    qDebug() << "MainWindow::onChooseFolder()";\r
 \r
     QString path = QFileDialog::getExistingDirectory(\r
-                this, tr("フォルダを選択"), m_activeView->dir());\r
+                this, tr("フォルダを選択"), activeModel()->rootPath());\r
     if (!path.isEmpty()) {\r
-        m_activeView->setPath(path, true);\r
-        updateActions();\r
+        activeModel()->setRootPath(path);\r
+//        updateActions();\r
     }\r
 }\r
 \r
-void MainWindow::copyFilenameToClipboard()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onCopyFileName\r
+///\r
+/// ファイル名をクリップボードにコピーします。\r
+///\r
+void MainWindow::onCopyFileName()\r
 {\r
-    qDebug() << "MainWindow::copyFilenameToClipboard();";\r
+    qDebug() << "MainWindow::onCopyFileName()";\r
 \r
-    QClipboard *clipboard = QApplication::clipboard();\r
-    clipboard->setText(m_activeView->currentItem().fileName());\r
+    QClipboard *clipboard = qApp->clipboard();\r
+    clipboard->setText(activeModel()->fileName(focusItemView()->currentIndex()));\r
 }\r
 \r
-void MainWindow::copyFullpathTpClipboard()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onCopyFilePath\r
+///\r
+/// フルパスをクリップボードにコピーします。\r
+///\r
+void MainWindow::onCopyFilePath()\r
 {\r
-    qDebug() << "MainWindow::copyFullpathTpClipboard();";\r
+    qDebug() << "MainWindow::onCopyFilePath()";\r
 \r
-    QClipboard *clipboard = QApplication::clipboard();\r
-    clipboard->setText(m_activeView->currentItem().absoluteFilePath());\r
+    QClipboard *clipboard = qApp->clipboard();\r
+    clipboard->setText(activeModel()->filePath(focusItemView()->currentIndex()));\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::askOverWrite\r
+/// \param copyMethod   上書き方法\r
+/// \param alias        別名\r
+/// \param srcPath      コピー元パス\r
+/// \param tgtPath      コピー先パス\r
+///\r
+/// 上書きの処理方法を選択するダイアログを表示します。\r
+///\r
 void MainWindow::askOverWrite(QString *copyMethod,\r
                               QString *alias,\r
                               const QString &srcPath,\r
                               const QString &tgtPath)\r
 {\r
-    qDebug() << "MainWindow::askOverWrite();";\r
+    qDebug() << "MainWindow::askOverWrite()";\r
 \r
     CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());\r
-    if (!m_overwriteDialog->isKeepSetting() ||\r
-        m_overwriteDialog->copyMethod() == "rbRename")\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
+        m_overwriteDialog.setFileInfo(srcPath, tgtPath);\r
+        if (m_overwriteDialog.exec() == QDialog::Rejected) {\r
             worker->requestStop();\r
         }\r
     }\r
-    *copyMethod = m_overwriteDialog->copyMethod();\r
-    *alias = m_overwriteDialog->alias();\r
+    *copyMethod = m_overwriteDialog.copyMethod();\r
+    *alias = m_overwriteDialog.alias();\r
 \r
     worker->endAsking();\r
 }\r
 \r
-void MainWindow::currentChange(const QFileInfo &info)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onAddBookmark\r
+///\r
+/// ブックマークを追加します。\r
+///\r
+void MainWindow::onAddBookmark()\r
 {\r
-    qDebug() << ">>>>> カーソル変更 <<<<<";\r
-\r
-    FolderView *view = static_cast<FolderView*>(sender());\r
-    Q_CHECK_PTR(view);\r
+    qDebug() << "MainWindow::onAddBookmark()";\r
+    qDebug() << sender()->objectName();\r
 \r
-    if (!view->hasFocus()) {\r
-        return;\r
+    FolderModel *m;\r
+    if (sender()->objectName() == "bookmarkBtn") {\r
+        FolderPanel *p = static_cast<FolderPanel*>(sender()->parent());\r
+        m = p->model();\r
     }\r
-\r
-    // ステータスバーにカーソルのフルパスを表示する\r
-    ui->statusBar->showMessage(info.absoluteFilePath());\r
-\r
-    // ハーフモードで変更された場合\r
-    if (m_viewMode & ModeHalfView) {\r
-        AnyView *otherSide = static_cast<AnyView*>(\r
-                    otherSideFolderView(view)->parent()->parent());\r
-        Q_CHECK_PTR(otherSide);\r
-\r
-        if (!otherSide->setViewItem(view->currentItem())) {\r
-            showFileInfo("");\r
-        }\r
+    else {\r
+        m = activeModel();\r
     }\r
 \r
-    updateActions();\r
+    QFileInfo fi(m->rootPath());\r
+    Preferences(this).addBookmark(fi.fileName(), fi.absoluteFilePath());\r
+    initBookmarkMenu();\r
+\r
+    activePanel()->folderPanel()->itemView()->setFocus();\r
+    ui->statusBar->showMessage(tr("%1をブックマークに追加しました").arg(fi.absoluteFilePath()));\r
 }\r
 \r
-void MainWindow::dropAccept(const QFileInfoList &list, QDropEvent *event)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::view_copyAvailable\r
+/// \param yes  コピー可能ならtrue\r
+///\r
+/// 選択範囲の有無をメニューに反映します。\r
+///\r
+void MainWindow::view_copyAvailable(bool yes)\r
 {\r
-    qDebug() << "MainWindow::dropAccept();";\r
-\r
-    FolderView *view = static_cast<FolderView*>(sender());\r
-    Q_CHECK_PTR(view);\r
-\r
-    QMenu menu(this);\r
-    QAction *actCopy = menu.addAction(tr("コピー"));\r
-    QAction *actMove = menu.addAction(tr("移動"));\r
-    menu.addSeparator();\r
-    menu.addAction(tr("キャンセル"));\r
-\r
-    QAction *selected = menu.exec(view->mapToGlobal(event->pos()));\r
-    if (selected == actMove) {\r
-        moveItems(list, view->dir());\r
-    }\r
-    else if (selected == actCopy) {\r
-        copyItems(list, view->dir());\r
-    }\r
+    ui->text_Copy->setEnabled(yes);\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::copyItems\r
+/// \param list     コピー元リスト\r
+/// \param tgtDir   コピー先フォルダ\r
+///\r
+/// アイテムをコピーします。\r
+///\r
 void MainWindow::copyItems(const QFileInfoList &list, const QString &tgtDir)\r
 {\r
-    qDebug() << "MainWindow::copyItems();" << tgtDir;\r
+    qDebug() << "MainWindow::copyItems()" << tgtDir;\r
 \r
-    QSettings settings;\r
-    if (settings.value(IniKey_ConfirmCopy).toBool()) {\r
-        if (QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))\r
+    Preferences prefs(this);\r
+    if (prefs.isConfirmCopy() &&\r
+        QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))\r
             != QMessageBox::Yes)\r
-        {\r
-            return;\r
-        }\r
+    {\r
+        return;\r
     }\r
 \r
     // 上書き確認ダイアログを初期化する\r
-    m_overwriteDialog->reset();\r
+    m_overwriteDialog.reset();\r
 \r
     // ワーカースレッドを作成する\r
     CopyMoveWorker *worker = new CopyMoveWorker();\r
@@ -517,28 +548,34 @@ void MainWindow::copyItems(const QFileInfoList &list, const QString &tgtDir)
     OperationDialog opDlg(this);\r
     opDlg.setWindowTitle(tr("コピー"));\r
     opDlg.setWorker(worker);\r
-    opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());\r
+    opDlg.setAutoClose(prefs.isAutoCloseCopy());\r
 \r
     opDlg.exec();\r
 \r
-    settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());\r
+    prefs.setAutoCloseCopy(opDlg.autoClose());\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::moveItems\r
+/// \param list     移動元リスト\r
+/// \param tgtDir   移動先フォルダ\r
+///\r
+/// アイテムを移動します。\r
+///\r
 void MainWindow::moveItems(const QFileInfoList &list, const QString &tgtDir)\r
 {\r
-    qDebug() << "MainWindow::moveItems();" << tgtDir;\r
+    qDebug() << "MainWindow::moveItems()" << tgtDir;\r
 \r
-    QSettings settings;\r
-    if (settings.value(IniKey_ConfirmMove).toBool()) {\r
-        if (QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))\r
+    Preferences prefs(this);\r
+    if (prefs.isConfirmMove() &&\r
+        QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))\r
             != QMessageBox::Yes)\r
-        {\r
-            return;\r
-        }\r
+    {\r
+        return;\r
     }\r
 \r
     // 上書き確認ダイアログを初期化する\r
-    m_overwriteDialog->reset();\r
+    m_overwriteDialog.reset();\r
 \r
     // ワーカースレッドを作成する\r
     CopyMoveWorker *worker = new CopyMoveWorker();\r
@@ -552,29 +589,245 @@ void MainWindow::moveItems(const QFileInfoList &list, const QString &tgtDir)
     OperationDialog opDlg(this);\r
     opDlg.setWindowTitle(tr("移動"));\r
     opDlg.setWorker(worker);\r
-    opDlg.setAutoClose(settings.value(IniKey_AutoCloseMove).toBool());\r
+    opDlg.setAutoClose(prefs.isAutoCloseMove());\r
 \r
     opDlg.exec();\r
 \r
-    settings.setValue(IniKey_AutoCloseMove, opDlg.autoClose());\r
+    prefs.setAutoCloseMove(opDlg.autoClose());\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onContextMenuEvent\r
+/// \param obj  イベントが発生したオブジェクト\r
+/// \param e    コンテキストメニューイベント\r
+/// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。\r
+///\r
+bool MainWindow::onContextMenuEvent(QObject *obj, QContextMenuEvent *e)\r
+{\r
+    QMenu menu(this);\r
+    if (obj->objectName() == "textView") {\r
+        menu.addAction(ui->text_ConvertFromEUC);\r
+        menu.addAction(ui->text_ConvertFromJIS);\r
+        menu.addAction(ui->text_ConvertFromSJIS);\r
+        menu.addAction(ui->text_ConvertFromUTF8);\r
+        menu.addAction(ui->text_ConvertFromUTF16);\r
+        menu.addAction(ui->text_ConvertFromUTF16BE);\r
+        menu.addAction(ui->text_ConvertFromUTF16LE);\r
+        menu.addSeparator();\r
+        menu.addAction(ui->text_Copy);\r
+        if (m_viewMode == ModeView) {\r
+            menu.addSeparator();\r
+            menu.addAction(ui->view_Back);\r
+        }\r
+    }\r
+    else if (obj->objectName() == "imageView") {\r
+        menu.addAction(ui->image_FitToWindow);\r
+        menu.addAction(ui->action_ScaleDown);\r
+        menu.addAction(ui->action_ScaleUp);\r
+        menu.addAction(ui->image_ScaleNormal);\r
+        menu.addSeparator();\r
+        menu.addAction(ui->image_Rotate90);\r
+        menu.addAction(ui->image_Rotate180);\r
+\r
+        if (m_viewMode == ModeView) {\r
+            menu.addSeparator();\r
+            menu.addAction(ui->view_Back);\r
+        }\r
+    }\r
+    else if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView") {\r
+        QModelIndex index = focusItemView()->indexAt(e->pos());\r
+        if (index.isValid()) {\r
+            menu.addAction(ui->action_Open);\r
+            menu.addAction(ui->action_OpenWith);\r
+            menu.addAction(ui->action_OpenEditor);\r
+            menu.addAction(ui->action_OpenTerminal);\r
+            menu.addAction(ui->action_OpenArchiver);\r
+            menu.addSeparator();\r
+            menu.addAction(ui->action_Copy);\r
+            menu.addAction(ui->action_Move);\r
+            menu.addSeparator();\r
+            menu.addAction(ui->action_Delete);\r
+            menu.addSeparator();\r
+            menu.addAction(ui->action_CopyFileName);\r
+            menu.addAction(ui->action_CopyFilePath);\r
+            menu.addSeparator();\r
+            menu.addAction(ui->action_Rename);\r
+        }\r
+        else {\r
+            menu.addAction(ui->action_historyBack);\r
+            menu.addAction(ui->action_HistoryForward);\r
+            menu.addSeparator();\r
+            menu.addAction(ui->action_CdUp);\r
+            menu.addAction(ui->action_CdHome);\r
+            menu.addAction(ui->action_CdRoot);\r
+            menu.addAction(ui->action_Cd);\r
+            menu.addSeparator();\r
+            menu.addAction(ui->action_CreateFile);\r
+            menu.addAction(ui->action_CreateFolder);\r
+        }\r
+    }\r
+    else {\r
+        qDebug() << "No context menu" << obj->objectName();\r
+        return false;\r
+    }\r
+\r
+    QAction *selected = menu.exec(e->globalPos());\r
+    if (selected == ui->action_ScaleDown ||\r
+        selected == ui->action_ScaleUp)\r
+    {\r
+        ui->image_FitToWindow->blockSignals(true);\r
+        ui->image_FitToWindow->setChecked(false);\r
+        ui->image_FitToWindow->blockSignals(false);\r
+    }\r
+\r
+    return true;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onDropEvent\r
+/// \param obj  イベントが発生したオブジェクト\r
+/// \param e    ドロップイベントオブジェクト\r
+/// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。\r
+///\r
+bool MainWindow::onDropEvent(QObject *obj, QDropEvent *e)\r
+{\r
+    qDebug() << "MainWindow::onDropEvent()";\r
+\r
+    if (obj->parent()->objectName() == "folderView" ||\r
+        obj->parent()->objectName() == "thumbnailView")\r
+    {\r
+        QAbstractItemView *v = static_cast<QAbstractItemView*>(obj->parent());\r
+        if (v->property("dragging").toBool()) {\r
+            // 自分自身へのドロップなら何もしない\r
+            return true;\r
+        }\r
+\r
+        QFileInfoList list;\r
+        foreach (const QUrl &url, e->mimeData()->urls()) {\r
+            QString path = QFileInfo(url.toLocalFile()).canonicalFilePath();\r
+            if (!path.isEmpty()) {\r
+                list << path;\r
+            }\r
+            else {\r
+                qDebug() << "drop path is empty." << url;\r
+            }\r
+        }\r
+\r
+        if (list.isEmpty()) {\r
+            // ローカルファイルのドロップでなければ何もしない\r
+            return true;\r
+        }\r
+\r
+        e->acceptProposedAction();\r
+\r
+        QMenu menu(this);\r
+        QAction *actCopy = menu.addAction(tr("コピー"));\r
+        QAction *actMove = menu.addAction(tr("移動"));\r
+        menu.addSeparator();\r
+        menu.addAction(tr("キャンセル"));\r
+\r
+        QAction *selected = menu.exec(v->mapToGlobal(e->pos()));\r
+        FolderModel *m = static_cast<FolderModel*>(v->model());\r
+        if (selected == actMove) {\r
+            moveItems(list, m->rootPath());\r
+        }\r
+        else if (selected == actCopy) {\r
+            copyItems(list, m->rootPath());\r
+        }\r
+        return true;\r
+    }\r
+    else {\r
+        qDebug() << obj->parent()->objectName();\r
+    }\r
+\r
+    return true;\r
 }\r
 \r
-void MainWindow::copyItems()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onKeyPressEvent\r
+/// \param obj  イベントが発生したオブジェクト\r
+/// \param e    キーイベントオブジェクト\r
+/// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。\r
+///\r
+bool MainWindow::onKeyPressEvent(QObject *obj, QKeyEvent *e)\r
 {\r
-    qDebug() << "MainWindow::copyItems";\r
+    qDebug() << "MainWindow::onKeyPressEvent()";\r
+\r
+    QString modifier = QString::null;\r
+    if (e->modifiers() & Qt::ShiftModifier)     { modifier += "Shift+"; }\r
+    if (e->modifiers() & Qt::ControlModifier)   { modifier += "Ctrl+"; }\r
+    if (e->modifiers() & Qt::AltModifier)       { modifier += "Alt+"; }\r
+    if (e->modifiers() & Qt::MetaModifier)      { modifier += "Meta+"; }\r
+\r
+    QString key = modifier + QKeySequence(e->key()).toString();\r
 \r
-    QFileInfoList list = m_activeView->selectedItems();\r
+    foreach (QAction *action, findChildren<QAction*>()) {\r
+        if (action->isEnabled()) {\r
+            foreach (const QKeySequence &ks, action->shortcuts()) {\r
+                if (ks.toString() == key) {\r
+                    qDebug() << "emit" << action->objectName();\r
+                    if (action->isCheckable()) {\r
+                        action->toggle();\r
+                    }\r
+                    else {\r
+                        action->trigger();\r
+                    }\r
+                    return true;\r
+                }\r
+             }\r
+        }\r
+    }\r
+\r
+    if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView")\r
+    {\r
+        // カーソル移動系のみ有効にする\r
+        switch (e->key()) {\r
+        case Qt::Key_Down:\r
+        case Qt::Key_Up:\r
+        case Qt::Key_Left:\r
+        case Qt::Key_Right:\r
+        case Qt::Key_Home:\r
+        case Qt::Key_End:\r
+        case Qt::Key_PageDown:\r
+        case Qt::Key_PageUp:\r
+        case Qt::Key_Tab:\r
+            return false;\r
+        }\r
+        return true;\r
+    }\r
+\r
+\r
+\r
+\r
+    return false;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onCopy\r
+///\r
+/// 選択アイテムを隣のパネルにコピーします。\r
+///\r
+void MainWindow::onCopy()\r
+{\r
+    qDebug() << "MainWindow::onCopy";\r
+\r
+    QFileInfoList list = selectedItems();\r
     if (list.isEmpty()) {\r
         return;\r
     }\r
 \r
-    QString tgtPath = otherSideFolderView(m_activeView)->dir();\r
+    QString tgtPath = inactiveModel()->rootPath();\r
     copyItems(list, tgtPath);\r
 }\r
 \r
-void MainWindow::createFile()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onCreateFile\r
+///\r
+/// ファイルを作成します。\r
+///\r
+void MainWindow::onCreateFile()\r
 {\r
-    qDebug() << "MainWindow::createFile";\r
+    qDebug() << "MainWindow::onCreateFile";\r
 \r
     bool bOk;\r
     QString name = QInputDialog::getText(\r
@@ -584,29 +837,28 @@ void MainWindow::createFile()
         return;\r
     }\r
 \r
-    QDir dir(m_activeView->dir());\r
-    QFile file(dir.absoluteFilePath(name));\r
-    if (!file.open(QIODevice::WriteOnly)) {\r
+    QModelIndex index = activeModel()->touch(name);\r
+    if (!index.isValid()) {\r
         QMessageBox::critical(\r
                     this, tr("エラー"),\r
                     tr("ファイルの作成に失敗しました。"));\r
+        return;\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
-        m_activeView->refresh();\r
-        m_activeView->searchItem(name);\r
+    focusItemView()->setCurrentIndex(index);\r
+    if (Preferences(this).isOpenAfterCreation()) {\r
+        onOpenEditor(index);\r
     }\r
 }\r
 \r
-void MainWindow::createFolder()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onCreateFolder\r
+///\r
+/// フォルダを作成します。\r
+///\r
+void MainWindow::onCreateFolder()\r
 {\r
-    qDebug() << "MainWindow::createFolder";\r
+    qDebug() << "MainWindow::onCreateFolder";\r
 \r
     bool bOk;\r
     QString name = QInputDialog::getText(\r
@@ -616,34 +868,36 @@ void MainWindow::createFolder()
         return;\r
     }\r
 \r
-    QDir dir(m_activeView->dir());\r
-    if (!dir.mkpath(name)) {\r
+    QModelIndex index = activeModel()->mkdir(name);\r
+    if (!index.isValid()) {\r
         QMessageBox::critical(\r
                     this, tr("エラー"),\r
                     tr("フォルダの作成に失敗しました。"));\r
+        return;\r
     }\r
-    else {\r
-        QSettings settings;\r
-        if (settings.value(IniKey_MoveAfterCreateFolder).toBool()) {\r
-            m_activeView->setPath(dir.absoluteFilePath(name), true);\r
-        }\r
 \r
-        m_activeView->refresh();\r
-        m_activeView->searchItem(name);\r
+    focusItemView()->setCurrentIndex(index);\r
+    if (Preferences(this).isMoveAfterCreation()) {\r
+        onOpen(index);\r
     }\r
 }\r
 \r
-void MainWindow::deleteItems()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onDelete\r
+///\r
+/// 選択アイテムを削除します。\r
+///\r
+void MainWindow::onDelete()\r
 {\r
-    qDebug() << "MainWindow::deleteItems";\r
+    qDebug() << "MainWindow::onDelete";\r
 \r
-    QFileInfoList list = m_activeView->selectedItems();\r
+    QFileInfoList list = selectedItems();\r
     if (list.isEmpty()) {\r
         return;\r
     }\r
 \r
-    QSettings settings;\r
-    if (settings.value(IniKey_ConfirmDelete).toBool()) {\r
+    Preferences prefs(this);\r
+    if (prefs.isConfirmDelete()) {\r
         QString msg;\r
         if (list.size() == 1) {\r
             msg = list[0].fileName();\r
@@ -665,54 +919,63 @@ void MainWindow::deleteItems()
     OperationDialog opDlg(this);\r
     opDlg.setWindowTitle(tr("削除"));\r
     opDlg.setWorker(worker);\r
-    opDlg.setAutoClose(settings.value(IniKey_AutoCloseDelete).toBool());\r
+    opDlg.setAutoClose(prefs.isAutoCloseDelete());\r
 \r
-    int row = m_activeView->currentIndex().row();\r
+    int row = focusItemView()->currentIndex().row();\r
 \r
     opDlg.exec();\r
-    m_activeView->refresh();\r
 \r
-    if (row >= m_activeView->model()->rowCount()) {\r
-        row = m_activeView->model()->rowCount() - 1;\r
+    if (row >= activeModel()->rowCount()) {\r
+        row = activeModel()->rowCount() - 1;\r
     }\r
-    m_activeView->setCurrentIndex(m_activeView->model()->index(row, 1));\r
+    focusItemView()->setCurrentIndex(activeModel()->index(row, 1));\r
 \r
-    settings.setValue(IniKey_AutoCloseDelete, opDlg.autoClose());\r
+    prefs.setAutoCloseDelete(opDlg.autoClose());\r
 }\r
 \r
-void MainWindow::open(const QModelIndex &index)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onOpen\r
+/// \param index    (使用しません)\r
+///\r
+/// アイテムを開きます。\r
+///\r
+void MainWindow::onOpen(const QModelIndex &index)\r
 {\r
     Q_UNUSED(index);\r
-    qDebug() << "MainWindow::open" << index;\r
+    qDebug() << "MainWindow::onOpen()" << index;\r
 \r
-    QFileInfo info = m_activeView->currentItem();\r
-    if (info.isDir()) {\r
-        m_activeView->setPath(info.absoluteFilePath(), true);\r
-        updateActions();\r
+    QModelIndex current = focusItemView()->currentIndex();\r
+    if (activeModel()->isDir(current)) {\r
+        activeModel()->setRootPath(activeModel()->filePath(current));\r
         return;\r
     }\r
 \r
-    if (ui->pane3->setViewItem(info)) {\r
-        ui->pane3->setVisible(true);\r
-        ui->splitter->setVisible(false);\r
-\r
-        setViewMode(ModeFullView);\r
-    }\r
-    else {\r
-        ui->pane3->setVisible(false);\r
-        if (index.isValid()) {\r
-            QString path = QDir::toNativeSeparators(info.absoluteFilePath());\r
+    // 外部アプリを優先する場合\r
+    QString ext = activeModel()->fileInfo(current).suffix().toLower();\r
+    QStringList list = Preferences(this).getPreferExtensions().split(",", QString::SkipEmptyParts);\r
+    foreach (const QString& s, list) {\r
+        if (ext == s.trimmed().toLower()) {\r
+            QString path = QDir::toNativeSeparators(activeModel()->filePath(current));\r
             QDesktopServices::openUrl(QUrl("file:///" + path));\r
+            return;\r
         }\r
     }\r
+\r
+    // 内蔵ビューアで表示する\r
+    setViewMode(ModeView);\r
 }\r
 \r
-void MainWindow::openEditor(const QString &path)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onOpenEditor\r
+/// \param path\r
+///\r
+/// 選択アイテムを外部エディタで開きます。\r
+///\r
+void MainWindow::onOpenEditor(const QModelIndex &index)\r
 {\r
-    qDebug() << "MainWindow::openEditor";\r
+    qDebug() << "MainWindow::onOpenEditor";\r
 \r
-    QSettings settings;\r
-    QString exe = settings.value(IniKey_PathEditor).toString();\r
+    QString exe = Preferences(this).getEditorPath();\r
     if (exe.isEmpty()) {\r
         QMessageBox::critical(\r
                     this, tr("エラー"),\r
@@ -721,11 +984,11 @@ void MainWindow::openEditor(const QString &path)
     }\r
 \r
     QFileInfoList list;\r
-    if (path.isEmpty()) {\r
-        list = m_activeView->selectedItems();\r
+    if (index.isValid()) {\r
+        list << activeModel()->fileInfo(index);\r
     }\r
     else {\r
-        list << path;\r
+        list = selectedItems();\r
     }\r
 \r
     QString files;\r
@@ -737,17 +1000,21 @@ void MainWindow::openEditor(const QString &path)
 #else\r
     QString command = exe + files;\r
 #endif\r
-    if (!startProcess(command, m_activeView->dir(), tr("外部エディタの起動に失敗しました。"))) {\r
+    if (!startProcess(command, tr("外部エディタの起動に失敗しました。"))) {\r
         qDebug() << command;\r
     }\r
 }\r
 \r
-void MainWindow::openTerminal()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onOpenTerminal\r
+///\r
+/// 選択アイテムをターミナルで開きます。\r
+///\r
+void MainWindow::onOpenTerminal()\r
 {\r
-    qDebug() << "MainWindow::openTerminal";\r
+    qDebug() << "MainWindow::onOpenTerminal";\r
 \r
-    QSettings settings;\r
-    QString exe = settings.value(IniKey_PathTerminal).toString();\r
+    QString exe = Preferences(this).getTerminalPath();\r
     if (exe.isEmpty()) {\r
         QMessageBox::critical(\r
                     this, tr("エラー"),\r
@@ -756,7 +1023,7 @@ void MainWindow::openTerminal()
     }\r
 \r
     QSet<QString> dirs;\r
-    foreach (const QFileInfo &info, m_activeView->selectedItems()) {\r
+    foreach (const QFileInfo &info, selectedItems()) {\r
         if (info.isDir()) {\r
             dirs.insert(info.absoluteFilePath());\r
         }\r
@@ -771,19 +1038,23 @@ void MainWindow::openTerminal()
 #else\r
         QString command = exe + " " + QQ(dir);\r
 #endif\r
-        if (!startProcess(command, m_activeView->dir(), tr("ターミナルの起動に失敗しました。"))) {\r
+        if (!startProcess(command, tr("ターミナルの起動に失敗しました。"))) {\r
             qDebug() << command;\r
             break;\r
         }\r
     }\r
 }\r
 \r
-void MainWindow::openArchiver()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onOpenArchiver\r
+///\r
+/// 選択アイテムをアーカイバで開きます。\r
+///\r
+void MainWindow::onOpenArchiver()\r
 {\r
-    qDebug() << "MainWindow::openArchiver";\r
+    qDebug() << "MainWindow::onOpenArchiver";\r
 \r
-    QSettings settings;\r
-    QString exe = settings.value(IniKey_PathArchiver).toString();\r
+    QString exe = Preferences(this).getArchiverPath();\r
     if (exe.isEmpty()) {\r
         QMessageBox::critical(\r
                     this, tr("エラー"),\r
@@ -792,7 +1063,7 @@ void MainWindow::openArchiver()
     }\r
 \r
     QString files;\r
-    foreach (const QFileInfo &info, m_activeView->selectedItems()) {\r
+    foreach (const QFileInfo &info, selectedItems()) {\r
         files += " " + QQ(info.absoluteFilePath());\r
     }\r
 #ifdef Q_OS_MAC\r
@@ -800,60 +1071,61 @@ void MainWindow::openArchiver()
 #else\r
     QString command = exe + files;\r
 #endif\r
-    if (!startProcess(command, m_activeView->dir(), tr("アーカイバの起動に失敗しました。"))) {\r
+    if (!startProcess(command, tr("アーカイバの起動に失敗しました。"))) {\r
         qDebug() << command;\r
     }\r
 }\r
 \r
-void MainWindow::openBookmark()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onOpenBookmark\r
+///\r
+/// ブックマークのメニュー項目をクリックしたときの処理を行います。\r
+///\r
+void MainWindow::onOpenBookmark()\r
 {\r
-    qDebug() << "MainWindow::openBookmark();";\r
+    qDebug() << "MainWindow::onOpenBookmark()";\r
 \r
     QAction *action = qobject_cast<QAction*>(sender());\r
     Q_CHECK_PTR(action);\r
 \r
-    QSettings settings;\r
     int i = action->data().toInt();\r
-    m_activeView->setPath(settings.value(IniKey_BookmarkEntryPath(i)).toString(), true);\r
+    activeModel()->setRootPath(Preferences(this).getBookmarkPath(i));\r
 }\r
 \r
-void MainWindow::refresh()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onRename\r
+///\r
+/// 選択アイテムの名前を変更します。\r
+///\r
+void MainWindow::onRename()\r
 {\r
-    qDebug() << "MainWindow::refresh();";\r
+    qDebug() << "MainWindow::onRename";\r
 \r
-    m_activeView->refresh();\r
-}\r
-\r
-void MainWindow::renameItems()\r
-{\r
-    qDebug() << "MainWindow::renameItems";\r
-\r
-    QFileInfoList list = m_activeView->selectedItems();\r
+    QFileInfoList list = selectedItems();\r
     if (list.isEmpty()) {\r
         return;\r
     }\r
 \r
-    IRenameDialog *dlg;\r
+    AbstractRenameDialog *dlg;\r
     if (list.size() == 1) {\r
         dlg = new RenameSingleDialog(this);\r
     }\r
     else {\r
         dlg = new RenameMultiDialog(this);\r
     }\r
-    dlg->setWorkingDirectory(m_activeView->dir());\r
+    dlg->setWorkingDirectory(activeModel()->rootPath());\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
+    Preferences prefs(this);\r
+    if (prefs.isConfirmRename() &&\r
+        QMessageBox::question(this, tr("確認"), tr("名前の変更を実行しますか?"))\r
+            != QMessageBox::Yes)\r
+    {\r
+        return;\r
     }\r
 \r
     RenameWorker *worker = new RenameWorker();\r
@@ -862,58 +1134,75 @@ void MainWindow::renameItems()
     OperationDialog opDlg(this);\r
     opDlg.setWindowTitle(tr("名前を変更"));\r
     opDlg.setWorker(worker);\r
-    opDlg.setAutoClose(settings.value(IniKey_AutoCloseRename).toBool());\r
+    opDlg.setAutoClose(prefs.isAutoCloseRename());\r
 \r
     opDlg.exec();\r
-    m_activeView->refresh();\r
 \r
-    QFileInfo info(dlg->renameMap().first());\r
-    m_activeView->searchItem(info.fileName());\r
+    focusItemView()->setCurrentIndex(\r
+                activeModel()->search(dlg->renameMap().first()));\r
 \r
-    settings.setValue(IniKey_AutoCloseRename, opDlg.autoClose());\r
+    prefs.setAutoCloseRename(opDlg.autoClose());\r
 }\r
 \r
-void MainWindow::shellExecute()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onOpenWith\r
+///\r
+/// 関連付けられたアプリで開きます。\r
+///\r
+void MainWindow::onOpenWith()\r
 {\r
-    qDebug() << "MainWindow::shellExecute";\r
+    qDebug() << "MainWindow::onOpenWith";\r
 \r
-    foreach (const QFileInfo &info, m_activeView->selectedItems()) {\r
+    foreach (const QFileInfo &info, selectedItems()) {\r
         QString path = QDir::toNativeSeparators(info.absoluteFilePath());\r
         QDesktopServices::openUrl(QUrl("file:///" + path));\r
     }\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::showBookmarkDialog\r
+///\r
+/// ブックマーク一覧ダイアログを表示します。\r
+///\r
 void MainWindow::showBookmarkDialog()\r
 {\r
-    qDebug() << "MainWindow::showBookmarkDialog();";\r
+    qDebug() << "MainWindow::showBookmarkDialog()";\r
 \r
     BookmarkDialog dlg(this);\r
     dlg.setEditMode(false);\r
     if (dlg.exec() == QDialog::Accepted) {\r
         int n = dlg.selectedIndex();\r
-\r
-        QSettings settings;\r
-        m_activeView->setPath(settings.value(IniKey_BookmarkEntryPath(n)).toString(), true);\r
+        activeModel()->setRootPath(Preferences(this).getBookmarkPath(n + 1));\r
     }\r
 }\r
 \r
-void MainWindow::editBookmark()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onEditBookmark\r
+///\r
+/// ブックマークの編集ダイアログを表示します。\r
+///\r
+void MainWindow::onEditBookmark()\r
 {\r
-    qDebug() << "MainWindow::showBookmarkDialog();";\r
+    qDebug() << "MainWindow::onEditBookmark()";\r
 \r
     BookmarkDialog dlg(this);\r
     dlg.setEditMode(true);\r
 \r
     if (dlg.exec() == QDialog::Accepted) {\r
-        initBookmark();\r
+        initBookmarkMenu();\r
     }\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::showFilterDialog\r
+///\r
+/// フィルタ設定ダイアログを表示します。\r
+///\r
 void MainWindow::showFilterDialog()\r
 {\r
-    qDebug() << "MainWindow::showFilterDialog();";\r
+    qDebug() << "MainWindow::showFilterDialog()";\r
 \r
-    QString filters = m_activeView->nameFilters().join(" ");\r
+    QString filters = activeModel()->nameFilters().join(" ");\r
 \r
     QInputDialog dlg(this);\r
     dlg.setInputMode(QInputDialog::TextInput);\r
@@ -923,62 +1212,52 @@ void MainWindow::showFilterDialog()
     dlg.resize(width() * 0.8, dlg.height());\r
 \r
     if (dlg.exec() == QDialog::Accepted) {\r
-        static_cast<FolderPanel*>(m_activeView->parent())->setNameFilters(dlg.textValue());\r
-        int row = m_activeView->currentIndex().row();\r
-\r
-        m_activeView->refresh();\r
-\r
-        if (row >= m_activeView->model()->rowCount()) {\r
-            row = m_activeView->model()->rowCount() - 1;\r
+        filters = dlg.textValue();\r
+        if (filters.isEmpty()) {\r
+            filters = "*";\r
         }\r
 \r
-        m_activeView->setCurrentIndex(m_activeView->model()->index(row, 1));\r
-\r
+        activeModel()->setNameFilters(filters.split(" ", QString::SkipEmptyParts));\r
+        activeModel()->refresh();\r
     }\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::showHistoryDialog\r
+///\r
+/// 履歴選択ダイアログを表示します。\r
+///\r
 void MainWindow::showHistoryDialog()\r
 {\r
-    qDebug() << "MainWindow::showHistoryDialog();";\r
-\r
-    FolderView *vOther = otherSideFolderView(m_activeView);\r
+    qDebug() << "MainWindow::showHistoryDialog()";\r
 \r
     HistoryDialog dlg(this);\r
-    if (m_activeView->side() == "Left") {\r
-        dlg.setDefaultLeft(true);\r
-        dlg.setHistory(m_activeView->history(), vOther->history());\r
-    }\r
-    else {\r
-        dlg.setDefaultLeft(false);\r
-        dlg.setHistory(vOther->history(), m_activeView->history());\r
-    }\r
-\r
-    if (dlg.exec() == QDialog::Accepted) {\r
-        if (m_activeView->side() == dlg.selectedSide()) {\r
-            m_activeView->setHistoryIndexAt(dlg.selectedIndex());\r
-        }\r
-        else {\r
-            m_activeView->setPath(vOther->history()->at(dlg.selectedIndex()), true);\r
-        }\r
-    }\r
+    dlg.setModel(ui->LPanel->model(), ui->RPanel->model(), activeModel());\r
+    dlg.exec();\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::showSortDialog\r
+///\r
+/// ソート方法選択ダイアログを表示します。\r
+///\r
 void MainWindow::showSortDialog()\r
 {\r
-    qDebug() << "MainWindow::showSortDialog();";\r
+    qDebug() << "MainWindow::showSortDialog()";\r
 \r
     SortDialog dlg(this);\r
-    dlg.setRightOrLeft(m_activeView->side());\r
-\r
-    if (dlg.exec() == QDialog::Accepted) {\r
-        m_activeView->setSorting();\r
-        m_activeView->refresh();\r
-    }\r
+    dlg.setModel(activeModel());\r
+    dlg.exec();\r
 }\r
 \r
-void MainWindow::splitCenter()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onSplitCenter\r
+///\r
+/// パネルを中央で分割します。\r
+///\r
+void MainWindow::onSplitCenter()\r
 {\r
-    qDebug() << "MainWindow::splitCenter();";\r
+    qDebug() << "MainWindow::onSplitCenter()";\r
 \r
     QList<int> sizes = ui->splitter->sizes();\r
     int sizeTotal = sizes[0] + sizes[1];\r
@@ -987,101 +1266,136 @@ void MainWindow::splitCenter()
     ui->splitter->setSizes(sizes);\r
 }\r
 \r
-void MainWindow::swapView()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onSwap\r
+///\r
+/// 左右のパネルでモデルを入れ替えます。\r
+///\r
+void MainWindow::onSwap()\r
 {\r
-    qDebug() << "MainWindow::swapView();";\r
-\r
-    QString dir1 = ui->pane1->folderPanel()->folderView()->dir();\r
-    QString dir2 = ui->pane2->folderPanel()->folderView()->dir();\r
+    qDebug() << "MainWindow::onSwap()";\r
 \r
-    ui->pane1->folderPanel()->folderView()->setPath(dir2, true);\r
-    ui->pane2->folderPanel()->folderView()->setPath(dir1, true);\r
+    FolderModel *tmp = ui->LPanel->model();\r
+    ui->LPanel->setModel(ui->RPanel->model());\r
+    ui->RPanel->setModel(tmp);\r
 \r
-    updateActions();\r
+    // アクティブ状態も変更する\r
+    if (ui->LPanel->model()->isActive()) {\r
+        setActiveModel(ui->RPanel->model());\r
+    }\r
+    else {\r
+        setActiveModel(ui->LPanel->model());\r
+    }\r
 }\r
 \r
-void MainWindow::switchHalfMode(bool checked)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onTogglePreviewMode\r
+/// \param checked  メニューのチェック状態\r
+///\r
+/// 通常モード/プレビューモードを切り替えます。\r
+///\r
+void MainWindow::onTogglePreviewMode(bool checked)\r
 {\r
-    qDebug() << "MainWindow::switchHalfMode();" << checked;\r
-\r
-    AnyView *pane = static_cast<AnyView*>(\r
-                otherSideFolderView(m_activeView)->parent()->parent());\r
-    Q_CHECK_PTR(pane);\r
+    qDebug() << "MainWindow::onTogglePreviewMode()" << checked;\r
 \r
     if (checked) {\r
-        // ハーフモードへ移行する\r
-        setViewMode(ModeHalfView);\r
-        pane->setViewItem(m_activeView->currentItem());\r
+        setViewMode(ModePreview);\r
     }\r
     else {\r
-        // ハーフモードを解除する\r
         setViewMode(ModeBasic);\r
-        pane->changeView(AnyView::ViewFolder);\r
     }\r
-    updateActions();\r
 }\r
 \r
-void MainWindow::searchNext()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onSearchNext\r
+///\r
+/// 次のアイテムを検索します。\r
+///\r
+void MainWindow::onSearchNext()\r
 {\r
-    qDebug() << "MainWindow::searchNext";\r
-\r
-    SearchBox *box = qobject_cast<SearchBox*>(qApp->focusWidget());\r
-    Q_CHECK_PTR(box);\r
+    qDebug() << "MainWindow::onSearchNext";\r
 \r
-    m_activeView->searchNext(box->text());\r
+    static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext();\r
 }\r
 \r
-void MainWindow::searchPrev()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onSearchPrev\r
+///\r
+/// 前のアイテムを検索します。\r
+///\r
+void MainWindow::onSearchPrev()\r
 {\r
-    qDebug() << "MainWindow::searchPrev";\r
+    qDebug() << "MainWindow::onSearchPrev";\r
 \r
-    SearchBox *box = qobject_cast<SearchBox*>(qApp->focusWidget());\r
-    Q_CHECK_PTR(box);\r
-\r
-    m_activeView->searchPrev(box->text());\r
+    static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext(-1);\r
 }\r
 \r
-void MainWindow::setCursorToBegin()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onKeyDown\r
+///\r
+/// フォーカスウィジェットに↓キーイベントを送信します。\r
+///\r
+void MainWindow::onKeyDown()\r
 {\r
-    qDebug() << "MainWindow::setCursorToBegin();";\r
-\r
-    QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);\r
-    QApplication::sendEvent(QApplication::focusWidget(), &event1);\r
+    qDebug() << "MainWindow::onKeyDown()";\r
 \r
-    QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);\r
-    QApplication::sendEvent(QApplication::focusWidget(), &event2);\r
+    QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);\r
+    qApp->sendEvent(qApp->focusWidget(), &event);\r
 }\r
 \r
-void MainWindow::cursorDown()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onKeyEnd\r
+///\r
+/// フォーカスウィジェットにEND, Ctrl+ENDキーイベントを送信します。\r
+///\r
+void MainWindow::onKeyEnd()\r
 {\r
-    qDebug() << "MainWindow::cursorDown();";\r
+    qDebug() << "MainWindow::onKeyEnd()";\r
 \r
-    QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);\r
-    QApplication::sendEvent(QApplication::focusWidget(), &event);\r
+    QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);\r
+    qApp->sendEvent(qApp->focusWidget(), &event1);\r
+\r
+    QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);\r
+    qApp->sendEvent(qApp->focusWidget(), &event2);\r
 }\r
 \r
-void MainWindow::cursorUp()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onKeyHome\r
+///\r
+/// フォーカスウィジェットにHOME, Ctrl+HOMEキーイベントを送信します。\r
+///\r
+void MainWindow::onKeyHome()\r
 {\r
-    qDebug() << "MainWindow::cursorUp();";\r
+    qDebug() << "MainWindow::onKeyHome()";\r
 \r
-    QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);\r
-    QApplication::sendEvent(QApplication::focusWidget(), &event);\r
+    QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);\r
+    qApp->sendEvent(qApp->focusWidget(), &event1);\r
+\r
+    QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);\r
+    qApp->sendEvent(qApp->focusWidget(), &event2);\r
 }\r
 \r
-void MainWindow::setCursorToEnd()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onKeyUp\r
+///\r
+/// フォーカスウィジェットに↑キーイベントを送信します。\r
+///\r
+void MainWindow::onKeyUp()\r
 {\r
-    qDebug() << "MainWindow::setCursorToEnd();";\r
+    qDebug() << "MainWindow::onKeyUp()";\r
 \r
-    QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);\r
-    QApplication::sendEvent(QApplication::focusWidget(), &event1);\r
-\r
-    QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);\r
-    QApplication::sendEvent(QApplication::focusWidget(), &event2);\r
+    QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);\r
+    qApp->sendEvent(qApp->focusWidget(), &event);\r
 }\r
 \r
-void MainWindow::setCursorToBeginOther()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onKeyHomeOther\r
+///\r
+/// 非フォーカスビューにHOME, Ctrl+HOMEキーイベントを送信します。\r
+///\r
+void MainWindow::onKeyHomeOther()\r
 {\r
-    qDebug() << "MainWindow::setCursorToBeginOther();";\r
+    qDebug() << "MainWindow::onKeyHomeOther()";\r
 \r
     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);\r
     sendEventOther(&event1);\r
@@ -1090,25 +1404,40 @@ void MainWindow::setCursorToBeginOther()
     sendEventOther(&event2);\r
 }\r
 \r
-void MainWindow::cursorDownOther()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onKeyDownOther\r
+///\r
+/// 非フォーカスビューに↓キーイベントを送信します。\r
+///\r
+void MainWindow::onKeyDownOther()\r
 {\r
-    qDebug() << "MainWindow::cursorDownOther();";\r
+    qDebug() << "MainWindow::onKeyDownOther()";\r
 \r
     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);\r
     sendEventOther(&event);\r
 }\r
 \r
-void MainWindow::cursorUpOther()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onKeyUpOther\r
+///\r
+/// 非フォーカスビューに↑キーイベントを送信します。\r
+///\r
+void MainWindow::onKeyUpOther()\r
 {\r
-    qDebug() << "MainWindow::cursorUpOther();";\r
+    qDebug() << "MainWindow::onKeyUpOther()";\r
 \r
     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);\r
     sendEventOther(&event);\r
 }\r
 \r
-void MainWindow::setCursorToEndOther()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onKeyEndOther\r
+///\r
+/// 非フォーカスビューにEND, Ctrl+ENDキーイベントを送信します。\r
+///\r
+void MainWindow::onKeyEndOther()\r
 {\r
-    qDebug() << "MainWindow::setCursorToEndOther();";\r
+    qDebug() << "MainWindow::onKeyEndOther()";\r
 \r
     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);\r
     sendEventOther(&event1);\r
@@ -1117,287 +1446,233 @@ void MainWindow::setCursorToEndOther()
     sendEventOther(&event2);\r
 }\r
 \r
-void MainWindow::setFontSizeDown()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onScaleDown\r
+///\r
+/// 表示を縮小します。\r
+///\r
+void MainWindow::onScaleDown()\r
 {\r
-    qDebug() << "MainWindow::setFontSizeDown();";\r
-\r
-    changeFontSize(-1);\r
-}\r
+    qDebug() << "MainWindow::onScaleDown()";\r
 \r
-void MainWindow::setFontSizeUp()\r
-{\r
-    qDebug() << "MainWindow::setFontSizeUp();";\r
+    AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());\r
+    if (view) {\r
+        view->scaleDown();\r
+    }\r
 \r
-    changeFontSize(1);\r
+    ui->LPanel->updateAppearance();\r
+    ui->RPanel->updateAppearance();\r
+    ui->FPanel->updateAppearance();\r
 }\r
 \r
-void MainWindow::changeFontSize(int diff)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onScaleUp\r
+///\r
+/// 表示を拡大します。\r
+///\r
+void MainWindow::onScaleUp()\r
 {\r
-    qDebug() << "MainWindow::changeFontSize(;";\r
-\r
-    QSettings settings;\r
-    QFont font;\r
+    qDebug() << "MainWindow::onScaleUp()";\r
 \r
-    // フォルダビューのフォントサイズ変更\r
-    if (ui->pane1->folderPanel()->folderView()->hasFocus() ||\r
-        ui->pane2->folderPanel()->folderView()->hasFocus())\r
-    {\r
-        font = settings.value(IniKey_ViewFont).value<QFont>();\r
-        font.setPointSize(font.pointSize() + diff);\r
-        settings.setValue(IniKey_ViewFont, font);\r
-\r
-        ui->pane1->folderPanel()->updateAppearance();\r
-        ui->pane2->folderPanel()->updateAppearance();\r
+    AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());\r
+    if (view) {\r
+        view->scaleUp();\r
     }\r
 \r
-    // テキストビューのフォントサイズ変更\r
-    if (ui->pane1->textView()->hasFocus() ||\r
-        ui->pane2->textView()->hasFocus() ||\r
-        ui->pane3->textView()->hasFocus())\r
-    {\r
-        font = settings.value(IniKey_ViewerFont).value<QFont>();\r
-        font.setPointSize(font.pointSize() + diff);\r
-        settings.setValue(IniKey_ViewerFont, font);\r
-\r
-        ui->pane1->textView()->updateAppearance();\r
-        ui->pane2->textView()->updateAppearance();\r
-        ui->pane3->textView()->updateAppearance();\r
-    }\r
-\r
-    if (ui->pane1->imageView()->hasFocus() ||\r
-        ui->pane2->imageView()->hasFocus() ||\r
-        ui->pane3->imageView()->hasFocus())\r
-    {\r
-        ui->pane1->imageView()->changeScale(diff > 0);\r
-        ui->pane2->imageView()->changeScale(diff > 0);\r
-        ui->pane3->imageView()->changeScale(diff > 0);\r
-    }\r
+    ui->LPanel->updateAppearance();\r
+    ui->RPanel->updateAppearance();\r
+    ui->FPanel->updateAppearance();\r
 }\r
 \r
-void MainWindow::initBookmark()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::initBookmarkMenu\r
+///\r
+/// ブックマークメニューを初期化します。\r
+///\r
+void MainWindow::initBookmarkMenu()\r
 {\r
-    QSettings settings;\r
+    qDebug() << "MainWindow::initBookmarkMenu()";\r
+\r
+    Preferences prefs(this);\r
     QFileIconProvider iconProvider;\r
 \r
     ui->menu_Bookmark->clear();\r
-    ui->menu_Bookmark->addAction(ui->bookmark_Edit);\r
+    ui->menu_Bookmark->addAction(ui->action_AddBookmark);\r
+    ui->menu_Bookmark->addAction(ui->action_EditBookmark);\r
     ui->menu_Bookmark->addSeparator();\r
-    int i = 0;\r
-    while (!settings.value(IniKey_BookmarkEntryName(i), "").toString().isEmpty()) {\r
-        QString path = settings.value(IniKey_BookmarkEntryPath(i)).toString();\r
-        QAction *action = new QAction(this);\r
-        action->setText(settings.value(IniKey_BookmarkEntryName(i)).toString());\r
-        action->setData(i);\r
-        action->setIcon(iconProvider.icon(QFileInfo(path)));\r
-        ui->menu_Bookmark->addAction(action);\r
-        connect(action, SIGNAL(triggered()), this, SLOT(openBookmark()));\r
-        i++;\r
+    for (int n = 1; ; n++) {\r
+        QString name = prefs.getBookmarkEntry(n);\r
+        if (name.isEmpty()) {\r
+            break;\r
+        }\r
+        QString path = prefs.getBookmarkPath(n);\r
+\r
+        QAction *action = ui->menu_Bookmark->addAction(\r
+                    iconProvider.icon(QFileInfo(path)), name, this,\r
+                    SLOT(onOpenBookmark()));\r
+        action->setData(n);\r
     }\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::sendEventOther\r
+/// \param event    送信するイベント\r
+///\r
+/// 非フォーカスのビューにイベントを送信します。\r
+///\r
 void MainWindow::sendEventOther(QEvent *event)\r
 {\r
-    qDebug() << "MainWindow::sendEventOther();";\r
-\r
-    QWidget *widget = NULL;\r
+    qDebug() << "MainWindow::sendEventOther()";\r
 \r
-    if (m_viewMode & ModeBasic) {\r
-        // 検索ボックスにフォーカスがある場合も考慮して、\r
-        // FolderPanalを介してViewを取得する\r
-        FolderPanel *fp = qobject_cast<FolderPanel*>(qApp->focusWidget()->parentWidget());\r
-        Q_CHECK_PTR(fp);\r
-\r
-        widget = otherSideFolderView(fp->folderView());\r
-    }\r
-    else if (m_viewMode & ModeHalfView) {\r
-        AnyView *focusedView = qobject_cast<AnyView*>(qApp->focusWidget()->parentWidget());\r
-        if (!focusedView) {\r
-            focusedView = qobject_cast<AnyView*>(qApp->focusWidget()->parentWidget()->parentWidget());\r
-        }\r
-        Q_CHECK_PTR(focusedView);\r
-\r
-        if (focusedView == ui->pane1) {\r
-            widget = ui->pane2->visibleView();\r
-        }\r
-        else {\r
-            Q_ASSERT(focusedView == ui->pane2);\r
-            widget = ui->pane1->visibleView();\r
+    // フォーカスを持たない、可視状態のビューを検索する\r
+    foreach (QWidget *w, findChildren<QWidget*>()) {\r
+        AbstractView *view = dynamic_cast<AbstractView*>(w);\r
+        if (view) {\r
+            if (w->isVisible() && !w->hasFocus()) {\r
+                qDebug() << "Send event to" << w->objectName();\r
+                qApp->sendEvent(w, event);\r
+            }\r
         }\r
     }\r
-    else {\r
-        return;\r
-    }\r
-\r
-    Q_CHECK_PTR(widget);\r
-    QApplication::sendEvent(widget, event);\r
-}\r
-\r
-void MainWindow::setPathFromOther()\r
-{\r
-    qDebug() << "MainWindow::setPathFromOther();";\r
-\r
-    FolderView *other = otherSideFolderView(m_activeView);\r
-\r
-    m_activeView->setPath(other->dir(), true);\r
 }\r
 \r
-void MainWindow::setPathToHome()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onSyncPanel\r
+///\r
+/// 隣のパネルと同じフォルダを表示します。\r
+///\r
+void MainWindow::onSyncPanel()\r
 {\r
-    qDebug() << "MainWindow::setPathToHome();";\r
+    qDebug() << "MainWindow::onSyncPanel()";\r
 \r
-    m_activeView->setPath(QDir::homePath(), true);\r
+    activeModel()->setRootPath(inactiveModel()->rootPath());\r
 }\r
 \r
-void MainWindow::setPathToOther()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onSyncPanelTo\r
+///\r
+/// 隣のパネルに同じフォルダを表示します。\r
+///\r
+void MainWindow::onSyncPanelTo()\r
 {\r
-    qDebug() << "MainWindow::setPathToOther();";\r
-\r
-    FolderView *other = otherSideFolderView(m_activeView);\r
+    qDebug() << "MainWindow::onSyncPanelTo()";\r
 \r
-    other->setPath(m_activeView->dir(), true);\r
+    inactiveModel()->setRootPath(activeModel()->rootPath());\r
 }\r
 \r
-void MainWindow::setPathToParent()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onToggleFullMode\r
+/// \param checked  メニューのチェック状態\r
+///\r
+/// 単画面/二画面を切り替えます。\r
+///\r
+void MainWindow::onToggleFullMode(bool checked)\r
 {\r
-    qDebug() << "MainWindow::setPathToParent();";\r
+    qDebug() << "MainWindow::onToggleFullMode()" << checked;\r
 \r
-    QDir dir(m_activeView->dir());\r
-    if (!dir.isRoot()) {\r
-        dir.cdUp();\r
-        m_activeView->setPath(dir.absolutePath(), true);\r
+    if (checked) {\r
+        setViewMode(ModeFull);\r
+    }\r
+    else {\r
+        setViewMode(ModeBasic);\r
     }\r
 }\r
 \r
-void MainWindow::setPathToRoot()\r
-{\r
-    qDebug() << "MainWindow::setPathToRoot();";\r
-\r
-    m_activeView->setPath(QDir::rootPath(), true);\r
-}\r
 \r
-void MainWindow::toggleSearchBox(bool checked)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onToggleSearch\r
+/// \param checked  メニューのチェック状態\r
+///\r
+/// 検索ボックスの表示/非表示を切り替えます。\r
+///\r
+void MainWindow::onToggleSearch(bool checked)\r
 {\r
-    qDebug() << "MainWindow::toggleSearchBox" << checked;\r
-\r
-    FolderView *view;\r
-    SearchBox *box;\r
+    qDebug() << "MainWindow::onToggleSearch" << checked;\r
 \r
-    if (checked) {\r
-        setViewMode(m_viewMode | ModeSearch);\r
-\r
-        box = m_activeView->parent()->findChild<SearchBox*>("searchBox");\r
-        Q_CHECK_PTR(box);\r
-\r
-        box->setVisible(true);\r
-        box->setFocus();\r
-        box->selectAll();\r
-    }\r
-    else {\r
-        setViewMode(m_viewMode ^ ModeSearch);\r
-        if (ui->pane1->folderPanel()->searchBox()->isVisible()) {\r
-            box = ui->pane1->folderPanel()->searchBox();\r
-            view = ui->pane1->folderPanel()->folderView();\r
-        }\r
-        else {\r
-            Q_ASSERT(ui->pane2->folderPanel()->searchBox()->isVisible());\r
-            box = ui->pane2->folderPanel()->searchBox();\r
-            view = ui->pane2->folderPanel()->folderView();\r
-        }\r
-\r
-        if (box->hasFocus()) {\r
-            view->setFocus();\r
-        }\r
-        box->setVisible(false);\r
-    }\r
+    // 丸投げ\r
+    ui->LPanel->folderPanel()->toggleSearch(checked);\r
+    ui->RPanel->folderPanel()->toggleSearch(checked);\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::showPreferenceDialog\r
+///\r
+/// 環境設定ダイアログを表示します。\r
+///\r
 void MainWindow::showPreferenceDialog()\r
 {\r
     qDebug() << "MainWindow::showPreferenceDialog";\r
 \r
     PreferenceDialog dlg(this);\r
     if (dlg.exec() == QDialog::Accepted) {\r
-        bool dark1 = m_activeView != ui->pane1->folderPanel()->folderView();\r
-        bool dark2 = m_activeView != ui->pane2->folderPanel()->folderView();\r
-\r
-        ui->pane1->folderPanel()->updateAppearance(dark1);\r
-        ui->pane2->folderPanel()->updateAppearance(dark2);\r
-        ui->pane1->textView()->updateAppearance();\r
-        ui->pane2->textView()->updateAppearance();\r
-        ui->pane3->textView()->updateAppearance();\r
-\r
-        updateActions();\r
+        ui->LPanel->updateAppearance();\r
+        ui->RPanel->updateAppearance();\r
+        ui->FPanel->updateAppearance();\r
     }\r
 }\r
 \r
-void MainWindow::toggleShowHiddenFiles(bool checked)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onToggleHidden\r
+/// \param checked  メニューのチェック状態\r
+///\r
+/// 隠しファイルの表示/非表示を切り替えます。\r
+///\r
+void MainWindow::onToggleHidden(bool checked)\r
 {\r
-    qDebug() << "MainWindow::toggleShowHiddenFiles" << checked;\r
+    qDebug() << "MainWindow::onToggleHidden" << checked;\r
 \r
-    ui->pane1->folderPanel()->folderView()->setFilter(QDir::Hidden, checked);\r
-    ui->pane1->folderPanel()->folderView()->refresh();\r
+    if (checked) {\r
+        activeModel()->setFilter(activeModel()->filter() | QDir::Hidden);\r
+    }\r
+    else {\r
+        activeModel()->setFilter(activeModel()->filter() ^ QDir::Hidden);\r
+    }\r
 \r
-    ui->pane2->folderPanel()->folderView()->setFilter(QDir::Hidden, checked);\r
-    ui->pane2->folderPanel()->folderView()->refresh();\r
+    activeModel()->refresh();\r
 }\r
 \r
-void MainWindow::toggleShowSystemFiles(bool checked)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onToggleSystem\r
+/// \param checked  メニューのチェック状態\r
+///\r
+/// システムファイルの表示/非表示を切り替えます。\r
+///\r
+void MainWindow::onToggleSystem(bool checked)\r
 {\r
-    qDebug() << "MainWindow::toggleShowSystemFiles" << checked;\r
+    qDebug() << "MainWindow::onToggleSystem" << checked;\r
 \r
-    ui->pane1->folderPanel()->folderView()->setFilter(QDir::System, checked);\r
-    ui->pane1->folderPanel()->folderView()->refresh();\r
+    if (checked) {\r
+        activeModel()->setFilter(activeModel()->filter() | QDir::System);\r
+    }\r
+    else {\r
+        activeModel()->setFilter(activeModel()->filter() ^ QDir::System);\r
+    }\r
 \r
-    ui->pane2->folderPanel()->folderView()->setFilter(QDir::System, checked);\r
-    ui->pane2->folderPanel()->folderView()->refresh();\r
+    activeModel()->refresh();\r
 }\r
 \r
-void MainWindow::showContextMenu(QContextMenuEvent *event)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onToggleThumbnailMode\r
+/// \param checked  メニューのチェック状態\r
+///\r
+/// サムネイルモードの切り替えを行います。\r
+///\r
+void MainWindow::onToggleThumbnailMode(bool checked)\r
 {\r
-    qDebug() << "MainWindow::showContextMenu();";\r
-\r
-    FolderView *view = static_cast<FolderView*>(sender());\r
-    Q_CHECK_PTR(view);\r
-\r
-    QModelIndex index = view->indexAt(event->pos());\r
-\r
-    QMenu menu(this);\r
-    if (index.isValid()) {\r
-        menu.addAction(ui->action_Open);\r
-        menu.addAction(ui->action_Exec);\r
-        menu.addAction(ui->action_OpenEditor);\r
-        menu.addAction(ui->action_OpenTerminal);\r
-        menu.addAction(ui->action_OpenArchiver);\r
-        menu.addSeparator();\r
-        menu.addAction(ui->cmd_Copy);\r
-        menu.addAction(ui->cmd_Move);\r
-        menu.addSeparator();\r
-        menu.addAction(ui->cmd_Delete);\r
-        menu.addSeparator();\r
-        menu.addAction(ui->copy_Filename);\r
-        menu.addAction(ui->copy_Fullpath);\r
-        menu.addSeparator();\r
-        menu.addAction(ui->cmd_Rename);\r
-    }\r
-    else {\r
-        menu.addAction(ui->move_Back);\r
-        menu.addAction(ui->move_Forward);\r
-        menu.addSeparator();\r
-        menu.addAction(ui->move_Parent);\r
-        menu.addAction(ui->move_Home);\r
-        menu.addAction(ui->move_Root);\r
-        menu.addAction(ui->move_Jump);\r
-        menu.addSeparator();\r
-        menu.addAction(ui->cmd_NewFile);\r
-        menu.addAction(ui->cmd_NewFolder);\r
-    }\r
+    qDebug() << "MainWindow::onToggleThumbnailMode()" << checked;\r
 \r
-    menu.exec(event->globalPos());\r
+    activePanel()->folderPanel()->toggleView(checked);\r
 }\r
 \r
-void MainWindow::checkUpdate(bool silent)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onCheckUpdate\r
+/// \param silent   最新版を使用している場合に何も表示しないならtrue\r
+///\r
+/// アップデートの有無を確認します。\r
+///\r
+void MainWindow::onCheckUpdate(bool silent)\r
 {\r
-    qDebug() << "MainWindow::checkUpdate()" << silent;\r
+    qDebug() << "MainWindow::onCheckUpdate()" << silent;\r
 \r
     QNetworkAccessManager *manager = new QNetworkAccessManager(this);\r
 \r
@@ -1451,124 +1726,290 @@ void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)
     }\r
 }\r
 \r
-void MainWindow::viewFinish()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::initActions\r
+///\r
+/// アクションを初期化します。\r
+///\r
+void MainWindow::initActions()\r
 {\r
-    qDebug() << "MainWindow::viewFinish();" << sender()->objectName();\r
+    qDebug() << "MainWindow::initActions()";\r
+\r
+    QList<QKeySequence> shortcuts;\r
+\r
+    //>>>>> 追加のショートカットキーを設定する\r
+    appendActionShortcut(ui->action_Open, "M");\r
+    appendActionShortcut(ui->action_OpenWith, "Shift+M");\r
+    appendActionShortcut(ui->view_Back, "Backspace");\r
+    // MacだとShift+の形で認識されてしまうもの\r
+    appendActionShortcut(ui->action_ScaleUp, "Shift++");\r
+    appendActionShortcut(ui->action_Filter, "Shift+*");\r
+    appendActionShortcut(ui->action_OpenTerminal, "Shift+>");\r
+    appendActionShortcut(ui->action_About, "Shift+?");\r
+    appendActionShortcut(ui->image_ScaleNormal, "Shift+=");\r
+\r
+    // SIGNAL -> SLOT\r
+    connect(ui->action_About, SIGNAL(triggered()), this, SLOT(onAbout()));\r
+    connect(ui->action_AddBookmark, SIGNAL(triggered()), this, SLOT(onAddBookmark()));\r
+    connect(ui->action_Cd, SIGNAL(triggered()), this, SLOT(onChooseFolder()));\r
+    connect(ui->action_CheckUpdate, SIGNAL(triggered()), this, SLOT(onCheckUpdate()));\r
+    connect(ui->action_Copy, SIGNAL(triggered()), this, SLOT(onCopy()));\r
+    connect(ui->action_CopyFileName, SIGNAL(triggered()), this, SLOT(onCopyFileName()));\r
+    connect(ui->action_CopyFilePath, SIGNAL(triggered()), this, SLOT(onCopyFilePath()));\r
+    connect(ui->action_CreateFile, SIGNAL(triggered()), this, SLOT(onCreateFile()));\r
+    connect(ui->action_CreateFolder, SIGNAL(triggered()), this, SLOT(onCreateFolder()));\r
+    connect(ui->action_Delete, SIGNAL(triggered()), this, SLOT(onDelete()));\r
+    connect(ui->action_EditBookmark, SIGNAL(triggered()), this, SLOT(onEditBookmark()));\r
+    connect(ui->action_ExpandLeft, SIGNAL(triggered()), this, SLOT(onExpandLeft()));\r
+    connect(ui->action_ExpandRight, SIGNAL(triggered()), this, SLOT(onExpandRight()));\r
+    connect(ui->action_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));\r
+    connect(ui->action_History, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));\r
+    connect(ui->action_KeyDown, SIGNAL(triggered()), this, SLOT(onKeyDown()));\r
+    connect(ui->action_KeyDownOther, SIGNAL(triggered()), this, SLOT(onKeyDownOther()));\r
+    connect(ui->action_KeyEnd, SIGNAL(triggered()), this, SLOT(onKeyEnd()));\r
+    connect(ui->action_KeyEndOther, SIGNAL(triggered()), this, SLOT(onKeyEndOther()));\r
+    connect(ui->action_KeyHome, SIGNAL(triggered()), this, SLOT(onKeyHome()));\r
+    connect(ui->action_KeyHomeOther, SIGNAL(triggered()), this, SLOT(onKeyHomeOther()));\r
+    connect(ui->action_KeyLeft, SIGNAL(triggered()), this, SLOT(onKeyLeft()));\r
+    connect(ui->action_KeyUp, SIGNAL(triggered()), this, SLOT(onKeyUp()));\r
+    connect(ui->action_KeyUpOther, SIGNAL(triggered()), this, SLOT(onKeyUpOther()));\r
+    connect(ui->action_Move, SIGNAL(triggered()), this, SLOT(onMove()));\r
+    connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(onOpen()));\r
+    connect(ui->action_OpenArchiver, SIGNAL(triggered()), this, SLOT(onOpenArchiver()));\r
+    connect(ui->action_OpenEditor, SIGNAL(triggered()), this, SLOT(onOpenEditor()));\r
+    connect(ui->action_OpenTerminal, SIGNAL(triggered()), this, SLOT(onOpenTerminal()));\r
+    connect(ui->action_OpenWith, SIGNAL(triggered()), this, SLOT(onOpenWith()));\r
+    connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));\r
+    connect(ui->action_Rename, SIGNAL(triggered()), this, SLOT(onRename()));\r
+    connect(ui->action_KeyRight, SIGNAL(triggered()), this, SLOT(onKeyRight()));\r
+    connect(ui->action_RunCommand, SIGNAL(triggered()), this, SLOT(onRunCommand()));\r
+    connect(ui->action_ScaleDown, SIGNAL(triggered()), this, SLOT(onScaleDown()));\r
+    connect(ui->action_ScaleUp, SIGNAL(triggered()), this, SLOT(onScaleUp()));\r
+    connect(ui->action_SearchNext, SIGNAL(triggered()), this, SLOT(onSearchNext()));\r
+    connect(ui->action_SearchPrev, SIGNAL(triggered()), this, SLOT(onSearchPrev()));\r
+    connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));\r
+    connect(ui->action_ShowBookmark, SIGNAL(triggered()), this, SLOT(showBookmarkDialog()));\r
+    connect(ui->action_Sort, SIGNAL(triggered()), this, SLOT(showSortDialog()));\r
+    connect(ui->action_SplitCenter, SIGNAL(triggered()), this, SLOT(onSplitCenter()));\r
+    connect(ui->action_Swap, SIGNAL(triggered()), this, SLOT(onSwap()));\r
+    connect(ui->action_SyncPanel, SIGNAL(triggered()), this, SLOT(onSyncPanel()));\r
+    connect(ui->action_SyncPanelTo, SIGNAL(triggered()), this, SLOT(onSyncPanelTo()));\r
+\r
+    connect(ui->toggle_FullMode, SIGNAL(toggled(bool)), this, SLOT(onToggleFullMode(bool)));\r
+    connect(ui->toggle_Hidden, SIGNAL(toggled(bool)), this, SLOT(onToggleHidden(bool)));\r
+    connect(ui->toggle_Mark, SIGNAL(triggered()), this, SLOT(onToggleMark()));\r
+    connect(ui->toggle_PreviewMode, SIGNAL(toggled(bool)), this, SLOT(onTogglePreviewMode(bool)));\r
+    connect(ui->toggle_Search, SIGNAL(toggled(bool)), this, SLOT(onToggleSearch(bool)));\r
+    connect(ui->toggle_System, SIGNAL(toggled(bool)), this, SLOT(onToggleSystem(bool)));\r
+    connect(ui->toggle_ThumbnailMode, SIGNAL(toggled(bool)), this, SLOT(onToggleThumbnailMode(bool)));\r
+\r
+    connect(ui->view_Back, SIGNAL(triggered()), this, SLOT(view_finished()));\r
 \r
-    ui->statusBar->findChild<QLabel*>("Right")->setText("");\r
-    ui->pane3->setVisible(false);\r
-    ui->splitter->setVisible(true);\r
-    m_activeView->setFocus();\r
 }\r
 \r
-void MainWindow::initActionConnections()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::setActiveModel\r
+/// \param m    新しいアクティブモデル\r
+///\r
+/// アクティブモデルを変更します。\r
+///\r
+void MainWindow::setActiveModel(FolderModel *m)\r
 {\r
-    qDebug() << "MainWindow::initActionConnections";\r
+    qDebug() << "MainWindow::setActiveModel()" << m;\r
 \r
-    connect(ui->key_Left, SIGNAL(triggered()), this, SLOT(leftKeyPress()));\r
-    connect(ui->key_Right, SIGNAL(triggered()), this, SLOT(rightKeyPress()));\r
+    if (activeModel()) {\r
+        activeModel()->disconnect(this);\r
+        ui->action_CdHome->disconnect();\r
+        ui->action_CdRoot->disconnect();\r
+        ui->action_CdUp->disconnect();\r
+        ui->action_historyBack->disconnect();\r
+        ui->action_HistoryForward->disconnect();\r
+        ui->action_MarkAll->disconnect();\r
+        ui->action_MarkAllFiles->disconnect();\r
+        ui->action_MarkAllOff->disconnect();\r
+        ui->action_MarkInvert->disconnect();\r
+        ui->action_Refresh->disconnect();\r
+    }\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_OpenArchiver, SIGNAL(triggered()), this, SLOT(openArchiver()));\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_Up, SIGNAL(triggered()), this, SLOT(cursorUp()));\r
-    connect(ui->move_BeginOther, SIGNAL(triggered()), this, SLOT(setCursorToBeginOther()));\r
-    connect(ui->move_DownOther, SIGNAL(triggered()), this, SLOT(cursorDownOther()));\r
-    connect(ui->move_EndOther, SIGNAL(triggered()), this, SLOT(setCursorToEndOther()));\r
-    connect(ui->move_UpOther, SIGNAL(triggered()), this, SLOT(cursorUpOther()));\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->view_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));\r
-    connect(ui->view_FontSizeDown, SIGNAL(triggered()), this, SLOT(setFontSizeDown()));\r
-    connect(ui->view_FontSizeUp, SIGNAL(triggered()), this, SLOT(setFontSizeUp()));\r
-    connect(ui->view_FromOther, SIGNAL(triggered()), this, SLOT(setPathFromOther()));\r
-    connect(ui->view_HalfMode, SIGNAL(toggled(bool)), this, SLOT(switchHalfMode(bool)));\r
-    connect(ui->view_Hidden, SIGNAL(toggled(bool)), this, SLOT(toggleShowHiddenFiles(bool)));\r
-    connect(ui->view_Refresh, SIGNAL(triggered()), this, SLOT(refresh()));\r
-\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
-    connect(ui->bookmark_Edit, SIGNAL(triggered()), this, SLOT(editBookmark()));\r
-    connect(ui->bookmark_Show, SIGNAL(triggered()), this, SLOT(showBookmarkDialog()));\r
-    connect(ui->split_Center, SIGNAL(triggered()), this, SLOT(splitCenter()));\r
-    connect(ui->expand_Left, SIGNAL(triggered()), this, SLOT(expandLeft()));\r
-    connect(ui->expand_Right, SIGNAL(triggered()), this, SLOT(expandRight()));\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
+    m->setActive();\r
+\r
+    connect(activeModel(), SIGNAL(modelAboutToBeReset()), this, SLOT(model_PreReset()));\r
+    connect(activeModel(), SIGNAL(modelReset()), this, SLOT(model_PostReset()));\r
+    connect(ui->action_CdHome, SIGNAL(triggered()), activeModel(), SLOT(onCdHome()));\r
+    connect(ui->action_CdRoot, SIGNAL(triggered()), activeModel(), SLOT(onCdRoot()));\r
+    connect(ui->action_CdUp, SIGNAL(triggered()), activeModel(), SLOT(onCdUp()));\r
+    connect(ui->action_historyBack, SIGNAL(triggered()), activeModel(), SLOT(onHistoryBack()));\r
+    connect(ui->action_HistoryForward, SIGNAL(triggered()), activeModel(), SLOT(onHistoryForward()));\r
+    connect(ui->action_MarkAll, SIGNAL(triggered()), activeModel(), SLOT(onMarkAll()));\r
+    connect(ui->action_MarkAllFiles, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllFiles()));\r
+    connect(ui->action_MarkAllOff, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllOff()));\r
+    connect(ui->action_MarkInvert, SIGNAL(triggered()), activeModel(), SLOT(onMarkInvert()));\r
+    connect(ui->action_Refresh, SIGNAL(triggered()), activeModel(), SLOT(refresh()));\r
+\r
+    ui->LPanel->updateAppearance();\r
+    ui->RPanel->updateAppearance();\r
+    ui->FPanel->updateAppearance();\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::activeModel\r
+/// \return アクティブなフォルダモデルを返します。\r
+///\r
+FolderModel *MainWindow::activeModel() const\r
+{\r
+    return FolderModel::activeModel();\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::activePanel\r
+/// \return アクティブモデルを所有している可視状態のパネルを返します。\r
+///\r
+Panel *MainWindow::activePanel() const\r
+{\r
+    if (ui->FPanel->model() == activeModel() && ui->FPanel->isVisible()) {\r
+        return ui->FPanel;\r
     }\r
-    else {\r
-        str.replace("$D", info.absolutePath());\r
+    if (ui->LPanel->model() == activeModel() && ui->LPanel->isVisible()) {\r
+        return ui->LPanel;\r
+    }\r
+    if (ui->RPanel->model() == activeModel() && ui->RPanel->isVisible()) {\r
+        return ui->RPanel;\r
     }\r
-    str.replace("$P", info.absoluteFilePath());\r
+\r
+    qDebug() << ">>>>>>>>>> activePanel() Logic error <<<<<<<<<<";\r
+    return NULL;\r
 }\r
 \r
-FolderView* MainWindow::otherSideFolderView(const FolderView *view) const\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::inactiveModel\r
+/// \return 非アクティブなフォルダモデルを返します。\r
+///\r
+FolderModel *MainWindow::inactiveModel() const\r
 {\r
-    qDebug() << "MainWindow::otherSideFolderView()";\r
+    if (ui->LPanel->model()->isActive()) {\r
+        return ui->RPanel->model();\r
+    }\r
+    Q_ASSERT(ui->RPanel->model()->isActive());\r
+    return ui->LPanel->model();\r
+}\r
 \r
-    if (view == ui->pane1->folderPanel()->folderView()) {\r
-        return ui->pane2->folderPanel()->folderView();\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::inactivePanel\r
+/// \return 非アクティブモデルを所有している可視状態のパネルを返します。\r
+///\r
+Panel *MainWindow::inactivePanel() const\r
+{\r
+    if (ui->LPanel->model() == inactiveModel() && ui->LPanel->isVisible()) {\r
+        return ui->LPanel;\r
     }\r
-    else {\r
-        Q_ASSERT(view == ui->pane2->folderPanel()->folderView());\r
-        return ui->pane1->folderPanel()->folderView();\r
+    if (ui->RPanel->model() == inactiveModel() && ui->RPanel->isVisible()) {\r
+        return ui->RPanel;\r
+    }\r
+    if (ui->FPanel->model() == inactiveModel() && ui->FPanel->isVisible()) {\r
+        return ui->FPanel;\r
     }\r
+\r
+    qDebug() << ">>>>>>>>>> inactivePanel() Logic error <<<<<<<<<<";\r
+    return NULL;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::selectedItems\r
+/// \return マークされているアイテムまたはカレントアイテムのリスト\r
+///\r
+QFileInfoList MainWindow::selectedItems() const\r
+{\r
+    QFileInfoList list = activeModel()->markedItems();\r
+    if (list.isEmpty()) {\r
+        qDebug() << focusItemView();\r
+        qDebug() << focusItemView()->currentIndex();\r
+        Q_ASSERT(focusItemView()->currentIndex().isValid());\r
+        list << activeModel()->fileInfo(focusItemView()->currentIndex());\r
+    }\r
+\r
+    return list;\r
 }\r
 \r
-void MainWindow::setViewMode(ModeFlags flags)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::focusItemView\r
+/// \return フォーカスを持つアイテムビュー\r
+///\r
+QAbstractItemView *MainWindow::focusItemView() const\r
 {\r
-    qDebug() << "MainWindow::setViewMode();" << flags;\r
-    m_viewMode = flags;\r
+    return static_cast<QAbstractItemView*>(qApp->focusWidget());\r
 }\r
 \r
-bool MainWindow::startProcess(const QString &cmd, const QString &workDir, const QString &errMsg)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::setViewMode\r
+/// \param mode 新しいビューモード\r
+///\r
+/// ビューモードを変更します。\r
+///\r
+void MainWindow::setViewMode(Mode mode)\r
 {\r
-    qDebug() << "MainWindow::startProcess" << cmd << workDir << errMsg;\r
+    qDebug() << "MainWindow::setViewMode()" << mode;\r
+\r
+    QWidget *newFocusWidget = NULL;\r
+\r
+    switch (mode) {\r
+    case ModeBasic:\r
+        ui->FPanel->setVisible(false);\r
+        ui->splitter->setVisible(true);\r
+        ui->LPanel->setViewItem();\r
+        ui->RPanel->setViewItem();\r
+        if (m_viewMode == ModeFull) {\r
+            activePanel()->folderPanel()->itemView()->setCurrentIndex(\r
+                        focusItemView()->currentIndex());\r
+            ui->FPanel->setModel(NULL);\r
+        }\r
+        newFocusWidget = activePanel()->folderPanel()->itemView();\r
+        break;\r
+\r
+    case ModeFull:\r
+        if (m_viewMode == ModeBasic) {\r
+            ui->FPanel->setModel(activeModel());\r
+            ui->splitter->setVisible(false);\r
+            ui->FPanel->setVisible(true);\r
+            ui->FPanel->folderPanel()->itemView()->setCurrentIndex(\r
+                            focusItemView()->currentIndex());\r
+        }\r
+        ui->FPanel->setViewItem();\r
+        newFocusWidget = activePanel()->folderPanel()->itemView();\r
+        break;\r
+\r
+    case ModeView:\r
+        ui->FPanel->setViewItem(focusItemView()->currentIndex());\r
+        ui->splitter->setVisible(false);\r
+        ui->FPanel->setVisible(true);\r
+        newFocusWidget = ui->FPanel->visibleView();\r
+        break;\r
+\r
+    case ModePreview:\r
+        inactivePanel()->setViewItem(focusItemView()->currentIndex());\r
+        break;\r
+    }\r
+\r
+    m_prevMode = m_viewMode;\r
+    m_viewMode = mode;\r
+\r
+    if (newFocusWidget)\r
+        newFocusWidget->setFocus();\r
+    else\r
+        updateActions();\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::startProcess\r
+/// \param cmd      実行するコマンド\r
+/// \param errMsg   エラー時の表示メッセージ\r
+/// \return true:成功, false:失敗\r
+///\r
+bool MainWindow::startProcess(const QString &cmd, const QString &errMsg)\r
+{\r
+    qDebug() << "MainWindow::startProcess" << cmd << errMsg;\r
 \r
     QProcess process(this);\r
-    process.setWorkingDirectory(workDir);\r
+    process.setWorkingDirectory(activeModel()->rootPath());\r
     if (!process.startDetached(cmd)) {\r
         QMessageBox::critical(this, tr("エラー"), errMsg + "<br/>" + cmd);\r
         return false;\r
@@ -1576,11 +2017,160 @@ bool MainWindow::startProcess(const QString &cmd, const QString &workDir, const
     return true;\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::updateActions\r
+///\r
+/// アクションの有効/無効を設定します。\r
+///\r
 void MainWindow::updateActions()\r
 {\r
-    qDebug() << "MainWindow::updateActions" << m_viewMode;\r
+    qDebug() << "MainWindow::updateActions";\r
+\r
+    bool isView = true;\r
+    bool isSearch = false;\r
+    bool isImageView = false;\r
+    bool toggleSearch = true;\r
+\r
 \r
     QWidget *w = qApp->focusWidget();\r
+    if (w->objectName() == "folderView" || w->objectName() == "thumbnailView") {\r
+        setEnabledAllActions(true);\r
+\r
+        // 現在の選択アイテムが".."の場合、ファイル操作系アクションは無効にする\r
+        QFileInfoList list = selectedItems();\r
+        if (list.size() == 1 && list[0].fileName() == "..") {\r
+            ui->action_Copy->setEnabled(false);\r
+            ui->action_Delete->setEnabled(false);\r
+            ui->action_Move->setEnabled(false);\r
+            ui->action_Rename->setEnabled(false);\r
+        }\r
+\r
+        // 非二画面の場合、隣のパネルが必要な操作は無効にする\r
+        if (!ui->LPanel->folderPanel()->isVisible() ||\r
+            !ui->RPanel->folderPanel()->isVisible())\r
+        {\r
+            ui->action_Copy->setEnabled(false);\r
+            ui->action_Move->setEnabled(false);\r
+            ui->action_Swap->setEnabled(false);\r
+            ui->action_SyncPanel->setEnabled(false);\r
+            ui->action_SyncPanelTo->setEnabled(false);\r
+        }\r
+\r
+        // 単画面の場合、プレビューモードは無効にする\r
+        if (m_viewMode == ModeFull) {\r
+            ui->toggle_PreviewMode->setEnabled(false);\r
+        }\r
+\r
+        // サムネイル表示の場合、左右キーはカーソル移動\r
+        if (w->objectName() == "thumbnailView") {\r
+            ui->action_KeyLeft->setEnabled(false);\r
+            ui->action_KeyRight->setEnabled(false);\r
+        }\r
+    }\r
+    else if (w->objectName() == "searchBox"){\r
+        setEnabledAllActions(false);\r
+        isView = false;\r
+        isSearch = true;\r
+    }\r
+    else if (w->objectName() == "locationBox") {\r
+        setEnabledAllActions(false);\r
+        isView = false;\r
+    }\r
+    else if (w->objectName() == "textView") {\r
+        SimpleTextView *v = static_cast<SimpleTextView*>(w);\r
+        setEnabledAllActions(false);\r
+        toggleSearch = false;\r
+\r
+        ui->text_ConvertFromEUC->setEnabled(true);\r
+        ui->text_ConvertFromEUC->disconnect();\r
+        connect(ui->text_ConvertFromEUC, SIGNAL(triggered()), v, SLOT(convertFromEUC()));\r
+\r
+        ui->text_ConvertFromJIS->setEnabled(true);\r
+        ui->text_ConvertFromJIS->disconnect();\r
+        connect(ui->text_ConvertFromJIS, SIGNAL(triggered()), v, SLOT(convertFromJIS()));\r
+\r
+        ui->text_ConvertFromSJIS->setEnabled(true);\r
+        ui->text_ConvertFromSJIS->disconnect();\r
+        connect(ui->text_ConvertFromSJIS, SIGNAL(triggered()), v, SLOT(convertFromSJIS()));\r
+\r
+        ui->text_ConvertFromUTF8->setEnabled(true);\r
+        ui->text_ConvertFromUTF8->disconnect();\r
+        connect(ui->text_ConvertFromUTF8, SIGNAL(triggered()), v, SLOT(convertFromUTF8()));\r
+\r
+        ui->text_ConvertFromUTF16->setEnabled(true);\r
+        ui->text_ConvertFromUTF16->disconnect();\r
+        connect(ui->text_ConvertFromUTF16, SIGNAL(triggered()), v, SLOT(convertFromUTF16()));\r
+\r
+        ui->text_ConvertFromUTF16BE->setEnabled(true);\r
+        ui->text_ConvertFromUTF16BE->disconnect();\r
+        connect(ui->text_ConvertFromUTF16BE, SIGNAL(triggered()), v, SLOT(convertFromUTF16BE()));\r
+\r
+        ui->text_ConvertFromUTF16LE->setEnabled(true);\r
+        ui->text_ConvertFromUTF16LE->disconnect();\r
+        connect(ui->text_ConvertFromUTF16LE, SIGNAL(triggered()), v, SLOT(convertFromUTF16LE()));\r
+\r
+        ui->text_Copy->disconnect();\r
+        connect(ui->text_Copy, SIGNAL(triggered()), v, SLOT(copy()));\r
+\r
+    }\r
+    else if (w->objectName() == "imageView") {\r
+        SimpleImageView *v = static_cast<SimpleImageView*>(w);\r
+        setEnabledAllActions(false);\r
+        toggleSearch = false;\r
+        isImageView = true;\r
+\r
+        ui->image_FitToWindow->setEnabled(true);\r
+        ui->image_FitToWindow->disconnect();\r
+        connect(ui->image_FitToWindow, SIGNAL(toggled(bool)), v, SLOT(fitToWindow(bool)));\r
+\r
+        ui->image_ScaleNormal->setEnabled(true);\r
+        ui->image_ScaleNormal->disconnect();\r
+        connect(ui->image_ScaleNormal, SIGNAL(triggered()), v, SLOT(scaleNormal()));\r
+\r
+        ui->image_Rotate90->setEnabled(true);\r
+        ui->image_Rotate90->disconnect();\r
+        connect(ui->image_Rotate90, SIGNAL(triggered()), v, SLOT(rotate90()));\r
+\r
+        ui->image_Rotate180->setEnabled(true);\r
+        ui->image_Rotate180->disconnect();\r
+        connect(ui->image_Rotate180, SIGNAL(triggered()), v, SLOT(rotate180()));\r
+    }\r
+\r
+    ui->action_About->setEnabled(true);\r
+    ui->action_CheckUpdate->setEnabled(true);\r
+    ui->action_KeyDown->setEnabled(isView);\r
+    ui->action_KeyEnd->setEnabled(isView);\r
+    ui->action_KeyHome->setEnabled(isView);\r
+    ui->action_KeyUp->setEnabled(isView);\r
+    ui->action_Quit->setEnabled(true);\r
+    ui->action_ScaleDown->setEnabled(isView);\r
+    ui->action_ScaleUp->setEnabled(isView);\r
+    ui->action_SearchNext->setEnabled(isSearch);\r
+    ui->action_SearchPrev->setEnabled(isSearch);\r
+    ui->action_Setting->setEnabled(true);\r
+    ui->toggle_Search->setEnabled(toggleSearch);\r
+    ui->view_Back->setEnabled(m_viewMode == ModeView);\r
+\r
+    if (isImageView) {\r
+        ui->action_ScaleDown->setText(tr("縮小"));\r
+        ui->action_ScaleUp->setText(tr("拡大"));\r
+    }\r
+    else {\r
+        ui->action_ScaleDown->setText(tr("文字を小さく"));\r
+        ui->action_ScaleUp->setText(tr("文字を大きく"));\r
+    }\r
+\r
+    if (m_viewMode == ModeBasic || m_viewMode == ModeFull) {\r
+        ui->toggle_FullMode->setEnabled(true);\r
+    }\r
+    else {\r
+        ui->toggle_FullMode->setEnabled(false);\r
+    }\r
+\r
+    ui->action_historyBack->setEnabled(!activeModel()->isHistoryBegin());\r
+    ui->action_HistoryForward->setEnabled(!activeModel()->isHistoryEnd());\r
+\r
+#if 0\r
     FolderView *view;\r
     if ((view = qobject_cast<FolderView*>(w))) {\r
         setEnabledAllActions(true);\r
@@ -1589,14 +2179,14 @@ void MainWindow::updateActions()
         ui->action_SearchPrev->setEnabled(false);\r
 \r
         // 「開く」アクションを変更する\r
-        QFileInfo info(view->currentItem());\r
+        QFileInfo info(activeModel()->fileInfo(view->currentIndex()));\r
         if (info.isDir()) {\r
-            ui->action_Open->setIcon(QIcon(":/images/Open.png"));\r
+            ui->action_Open->setIcon(QIcon("://images/Open.png"));\r
             ui->action_Open->setText(tr("開く"));\r
             ui->action_Open->setToolTip(tr("開く"));\r
         }\r
         else {\r
-            ui->action_Open->setIcon(QIcon(":/images/Search text.png"));\r
+            ui->action_Open->setIcon(QIcon("://images/Search text.png"));\r
             ui->action_Open->setText(tr("内蔵ビューアで開く"));\r
             ui->action_Open->setToolTip(tr("内蔵ビューアで開く"));\r
 \r
@@ -1612,12 +2202,12 @@ void MainWindow::updateActions()
             }\r
         }\r
 \r
-        if (info.fileName() == ".." && view->checkedItems().isEmpty()) {\r
+        if (info.fileName() == ".." && activeModel()->markedItems().isEmpty()) {\r
             // ファイル操作を抑止\r
-            ui->cmd_Copy->setEnabled(false);\r
-            ui->cmd_Delete->setEnabled(false);\r
-            ui->cmd_Move->setEnabled(false);\r
-            ui->cmd_Rename->setEnabled(false);\r
+            ui->action_Copy->setEnabled(false);\r
+            ui->action_Delete->setEnabled(false);\r
+            ui->action_Move->setEnabled(false);\r
+            ui->action_Rename->setEnabled(false);\r
         }\r
 \r
         if (m_viewMode & ModeBasic) {\r
@@ -1625,8 +2215,8 @@ void MainWindow::updateActions()
             ui->action_SearchNext->setEnabled(false);\r
             ui->action_SearchPrev->setEnabled(false);\r
 \r
-            ui->move_Back->setEnabled(!view->history()->isBegin());\r
-            ui->move_Forward->setEnabled(!view->history()->isEnd());\r
+            ui->action_historyBack->setEnabled(!activeModel()->isHistoryBegin());\r
+            ui->action_HistoryForward->setEnabled(!activeModel()->isHistoryEnd());\r
 \r
             QSettings settings;\r
             ui->action_OpenEditor->setEnabled(!settings.value(IniKey_PathEditor).toString().isEmpty());\r
@@ -1635,19 +2225,19 @@ void MainWindow::updateActions()
         }\r
         else if (!otherSideFolderView(view)->isVisible()) {\r
             qDebug() << ">>>>> ハーフモードのメニュー設定 <<<<<";\r
-            ui->view_FromOther->setEnabled(false);\r
-            ui->view_ToOther->setEnabled(false);\r
-            ui->cmd_Copy->setEnabled(false);\r
-            ui->cmd_Move->setEnabled(false);\r
+            ui->action_SyncPanel->setEnabled(false);\r
+            ui->action_SyncPanelTo->setEnabled(false);\r
+            ui->action_Copy->setEnabled(false);\r
+            ui->action_Move->setEnabled(false);\r
         }\r
     }\r
     else if (qobject_cast<SearchBox*>(w)) {\r
         qDebug() << ">>>>> 検索モードのメニュー設定 <<<<<";\r
         setEnabledAllActions(false);\r
-        ui->action_Search->setEnabled(true);\r
+        ui->toggle_Search->setEnabled(true);\r
         ui->action_SearchNext->setEnabled(true);\r
         ui->action_SearchPrev->setEnabled(true);\r
-        ui->help_About->setEnabled(true);\r
+        ui->action_About->setEnabled(true);\r
     }\r
     else if (qobject_cast<SimpleImageView*>(w) ||\r
              qobject_cast<SimpleTextView*>(w))\r
@@ -1656,54 +2246,66 @@ void MainWindow::updateActions()
         setEnabledAllActions(false);\r
         ui->action_Quit->setEnabled(true);\r
         ui->action_Setting->setEnabled(true);\r
-        ui->check_Update->setEnabled(true);\r
+        ui->action_CheckUpdate->setEnabled(true);\r
         ui->view_FontSizeDown->setEnabled(true);\r
         ui->view_FontSizeUp->setEnabled(true);\r
-        ui->move_Begin->setEnabled(true);\r
-        ui->move_Down->setEnabled(true);\r
-        ui->move_End->setEnabled(true);\r
-        ui->move_Up->setEnabled(true);\r
-        ui->help_About->setEnabled(true);\r
+        ui->action_KeyDown->setEnabled(true);\r
+        ui->action_KeyEnd->setEnabled(true);\r
+        ui->action_KeyHome->setEnabled(true);\r
+        ui->action_KeyUp->setEnabled(true);\r
+        ui->action_About->setEnabled(true);\r
         ui->key_Left->setEnabled(true);\r
         ui->key_Right->setEnabled(true);\r
-        if (m_viewMode & ModeHalfView) {\r
+        if (m_viewMode == ModePreview) {\r
             ui->view_HalfMode->setEnabled(true);\r
         }\r
     }\r
+#endif\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::setEnabledAllActions\r
+/// \param enable   有効にする場合はtrue\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
+    qDebug() << "MainWindow::setEnabledAllActions()" << enable;\r
+    foreach (QAction *action, findChildren<QAction*>()) {\r
+        action->setEnabled(enable);\r
     }\r
 }\r
 \r
-void MainWindow::about()\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::onAbout\r
+///\r
+/// Aboutダイアログを表示します。\r
+///\r
+void MainWindow::onAbout()\r
 {\r
-    qDebug() << ">>>>> about <<<<<";\r
-\r
     QMessageBox::about(\r
                 this,\r
                 tr("げふぅ について"),\r
-                tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +\r
+                qApp->applicationDisplayName() +\r
                 tr("<center>Gefu is an Experimental File Utility.<br/>"\r
                    "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"\r
-                   "<p>最新版の情報は<a href='https://sourceforge.jp/projects/gefu/'>プロジェクトサイト</a>で公開しています。</p>"\r
+                   "<p>最新版の情報は<a href='http://gefu.sourceforge.jp/'>公式サイト</a>で公開しています。</p>"\r
                    "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));\r
 }\r
 \r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::closeEvent\r
+/// \param event    クローズイベント\r
+///\r
+/// 終了処理を行います。\r
+///\r
 void MainWindow::closeEvent(QCloseEvent *event)\r
 {\r
-    qDebug() << "MainWindow::closeEvent();";\r
-    qDebug() << ">>>>> アプリケーションの終了要求 <<<<<";\r
-    QSettings settings;\r
+    qDebug() << "MainWindow::closeEvent()";\r
+    Preferences prefs(this);\r
 \r
-    if (settings.value(IniKey_ConfirmExit).toBool()) {\r
+    if (prefs.isConfirmQuit()) {\r
         QMessageBox msgBox;\r
         QCheckBox *checkBox = new QCheckBox();\r
         checkBox->setText(tr("次回以降は確認しない"));\r
@@ -1717,31 +2319,40 @@ void MainWindow::closeEvent(QCloseEvent *event)
             event->ignore();\r
             return;\r
         }\r
-        settings.setValue(IniKey_ConfirmExit, !checkBox->isChecked());\r
+        prefs.setConfirmQuit(!checkBox->isChecked());\r
     }\r
 \r
-    settings.setValue(QString("Left/") + IniKey_Dir, ui->pane1->folderPanel()->folderView()->dir());\r
-    settings.setValue(QString("Right/") + IniKey_Dir, ui->pane2->folderPanel()->folderView()->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
+    prefs.saveModel("Left", ui->LPanel->model());\r
+    prefs.saveModel("Right", ui->RPanel->model());\r
+    prefs.saveWindow(this);\r
     QMainWindow::closeEvent(event);\r
 }\r
 \r
-\r
-void MainWindow::keyPressEvent(QKeyEvent *event)\r
+///////////////////////////////////////////////////////////////////////////////\r
+/// \brief MainWindow::eventFilter\r
+/// \param watched  イベントの発生元オブジェクト\r
+/// \param e        発生したイベント\r
+/// \return イベントを処理した場合はtrueを返します。\r
+///\r
+bool MainWindow::eventFilter(QObject *watched, QEvent *e)\r
 {\r
+    switch (e->type()) {\r
+    case QEvent::KeyPress:\r
+        // キーイベントの処理\r
+        return onKeyPressEvent(watched, static_cast<QKeyEvent*>(e));\r
 \r
-    QString ksq = KeyEventToSequence(event);\r
+    case QEvent::ContextMenu:\r
+        // コンテキストメニューイベントの処理\r
+        return onContextMenuEvent(watched, static_cast<QContextMenuEvent*>(e));\r
 \r
-    qDebug() << ">>>>> キーイベントを受信(MainWindow)" << ksq << "<<<<<";\r
-    qDebug() << qApp->keyboardModifiers().testFlag(Qt::ShiftModifier);\r
+    case QEvent::Drop:\r
+        qDebug() << "QEvent::Drop";\r
+        // ドロップイベントの処理\r
+        return onDropEvent(watched, static_cast<QDropEvent*>(e));\r
 \r
-    if (ProcessShortcut(ksq, this)) {\r
-        event->accept();\r
-        return;\r
+    default:\r
+        break;\r
     }\r
 \r
-    QMainWindow::keyPressEvent(event);\r
+    return false;\r
 }\r
index 484b908..bfef3e2 100644 (file)
@@ -1,15 +1,17 @@
 #ifndef MAINWINDOW_H\r
 #define MAINWINDOW_H\r
 \r
+#include "overwritedialog.h"\r
+\r
 #include <QFileInfo>\r
 #include <QModelIndex>\r
+#include <QNetworkReply>\r
+#include <QAbstractItemView>\r
 #include <QMainWindow>\r
-class QNetworkReply;\r
-class OverWriteDialog;\r
-class QLabel;\r
+\r
 class FolderView;\r
-class SearchBox;\r
-class AnyView;\r
+class FolderModel;\r
+class Panel;\r
 \r
 namespace Ui {\r
 class MainWindow;\r
@@ -27,121 +29,113 @@ public:
     ~MainWindow();\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 currentChange(const QFileInfo &info);\r
-    void dropAccept(const QFileInfoList &list, QDropEvent *event);\r
-    void focusChange(QWidget * old, QWidget * now);\r
-    void leftKeyPress();\r
-    void rightKeyPress();\r
-    void showFileInfo(const QString &str);\r
+private slots:\r
+    void    app_focusChange(QWidget *old, QWidget *now);\r
+    void    checkUpdateFinished(QNetworkReply *reply, bool silent = false);\r
+    void    checkUpdateFinishedSilent(QNetworkReply *reply);\r
+    void    model_PreReset();\r
+    void    model_PostReset();\r
+    void    onAbout();\r
+    void    onCheckUpdate(bool silent = false);\r
+    void    onChooseFolder();\r
+    void    onCopy();\r
+    void    onCopyFileName();\r
+    void    onCopyFilePath();\r
+    void    onCreateFile();\r
+    void    onCreateFolder();\r
+    void    onDelete();\r
+    void    onEditBookmark();\r
+    void    onExpandLeft();\r
+    void    onExpandRight();\r
+    void    onKeyDown();\r
+    void    onKeyDownOther();\r
+    void    onKeyEnd();\r
+    void    onKeyEndOther();\r
+    void    onKeyHome();\r
+    void    onKeyHomeOther();\r
+    void    onKeyLeft();\r
+    void    onKeyRight();\r
+    void    onKeyUp();\r
+    void    onKeyUpOther();\r
+    void    onMove();\r
+    void    onOpenArchiver();\r
+    void    onOpenBookmark();\r
+    void    onOpenEditor(const QModelIndex &index = QModelIndex());\r
+    void    onOpenTerminal();\r
+    void    onOpenWith();\r
+    void    onRename();\r
+    void    onRunCommand();\r
+    void    onScaleDown();\r
+    void    onScaleUp();\r
+    void    onSearchNext();\r
+    void    onSearchPrev();\r
+    void    onSplitCenter();\r
+    void    onSwap();\r
+    void    onSyncPanel();\r
+    void    onSyncPanelTo();\r
+    void    onToggleFullMode(bool checked);\r
+    void    onToggleHidden(bool checked);\r
+    void    onToggleMark();\r
+    void    onTogglePreviewMode(bool checked);\r
+    void    onToggleSearch(bool checked);\r
+    void    onToggleSystem(bool checked);\r
+    void    onToggleThumbnailMode(bool checked);\r
+    void    showBookmarkDialog();\r
+    void    showFilterDialog();\r
+    void    showHistoryDialog();\r
+    void    showPreferenceDialog();\r
+    void    showSortDialog();\r
 \r
-    void about();\r
-    void checkUpdate(bool silent = false);\r
-    void checkUpdateFinished(QNetworkReply *reply, bool silent = false);\r
-    void checkUpdateFinishedSilent(QNetworkReply *reply);\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 cursorDownOther();\r
-    void cursorUpOther();\r
-    void deleteItems();\r
-    void editBookmark();\r
-    void executeCommand();\r
-    void expandLeft();\r
-    void expandRight();\r
-    void historyBack();\r
-    void historyForward();\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 openArchiver();\r
-    void openBookmark();\r
-    void refresh();\r
-    void renameItems();\r
-    void searchNext();\r
-    void searchPrev();\r
-    void setCursorToBegin();\r
-    void setCursorToEnd();\r
-    void setCursorToBeginOther();\r
-    void setCursorToEndOther();\r
-    void setFontSizeDown();\r
-    void setFontSizeUp();\r
-    void setPathFromOther();\r
-    void setPathToHome();\r
-    void setPathToOther();\r
-    void setPathToParent();\r
-    void setPathToRoot();\r
-    void shellExecute();\r
-    void showBookmarkDialog();\r
-    void showFilterDialog();\r
-    void showHistoryDialog();\r
-    void showPreferenceDialog();\r
-    void showSortDialog();\r
-    void splitCenter();\r
-    void swapView();\r
-    void switchHalfMode(bool checked);\r
-    void toggleSearchBox(bool checked);\r
-    void toggleShowHiddenFiles(bool checked);\r
-    void toggleShowSystemFiles(bool checked);\r
-\r
-    void showContextMenu(QContextMenuEvent *event);\r
-\r
-    void viewFinish();\r
+public slots:\r
+    void    askOverWrite(QString *copyMethod, QString *alias,\r
+                          const QString &srcPath, const QString &tgtPath);\r
+    void    onAddBookmark();\r
+    void    onOpen(const QModelIndex &index = QModelIndex());\r
+    void    view_copyAvailable(bool yes);\r
+    void    view_currentChanged(const QModelIndex & current, const QModelIndex & previous);\r
+    void    view_finished();\r
+    void    view_statusChanged(const QString &text);\r
 \r
 private:\r
     enum Mode {\r
-        ModeBasic = 0x01,\r
-        ModeSearch = 0x02,\r
-        ModeFullView = 0x04,\r
-        ModeHalfView = 0x08,\r
+        ModeBasic,      // 二画面モード\r
+        ModeFull,       // 単画面モード\r
+        ModeView,       // ビューモード\r
+        ModePreview,    // プレビューモード\r
     };\r
-    typedef QFlags<Mode> ModeFlags;\r
-\r
     Ui::MainWindow *ui;\r
-    FolderView *m_activeView;\r
-    OverWriteDialog *m_overwriteDialog;\r
-    ModeFlags m_viewMode;\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 showNameFilters(FolderView *view);\r
-    void copyItems(const QFileInfoList &list, const QString &tgtDir);\r
-    void moveItems(const QFileInfoList &list, const QString &tgtDir);\r
-    void changeFontSize(int diff);\r
-    void initBookmark();\r
-    void sendEventOther(QEvent *event);\r
-\r
-    // getter\r
-    FolderView* otherSideFolderView(const FolderView *view) const;\r
-\r
-    // setter\r
-    void setViewMode(ModeFlags flags);\r
+    OverWriteDialog m_overwriteDialog;\r
+    Mode m_viewMode;\r
+    Mode m_prevMode;\r
+\r
+    FolderModel*        activeModel() const;\r
+    Panel*              activePanel() const;\r
+    void                copyItems(const QFileInfoList &list, const QString &tgtDir);\r
+    QAbstractItemView*  focusItemView() const;\r
+    FolderModel*        inactiveModel() const;\r
+    Panel*              inactivePanel() const;\r
+    void                initActions();\r
+    void                initBookmarkMenu();\r
+    void                moveItems(const QFileInfoList &list, const QString &tgtDir);\r
+    bool                onContextMenuEvent(QObject *obj, QContextMenuEvent *e);\r
+    bool                onDropEvent(QObject *obj, QDropEvent *e);\r
+    bool                onKeyPressEvent(QObject *obj, QKeyEvent *e);\r
+    QFileInfoList       selectedItems() const;\r
+    void                sendEventOther(QEvent *event);\r
+    void                setActiveModel(FolderModel *m);\r
+    void                setEnabledAllActions(bool enable);\r
+    void                setViewMode(Mode mode);\r
+    bool                startProcess(const QString &cmd, const QString &errMsg);\r
+    void                updateActions();\r
 \r
     // QWidget interface\r
 protected:\r
     void closeEvent(QCloseEvent *event);\r
-    void keyPressEvent(QKeyEvent *event);\r
+\r
+    // QObject interface\r
+public:\r
+    bool eventFilter(QObject *watched, QEvent *e);\r
 };\r
 \r
 #endif // MAINWINDOW_H\r
index d0138cd..8a44a8c 100644 (file)
@@ -6,8 +6,8 @@
    <rect>\r
     <x>0</x>\r
     <y>0</y>\r
-    <width>656</width>\r
-    <height>133</height>\r
+    <width>669</width>\r
+    <height>433</height>\r
    </rect>\r
   </property>\r
   <property name="windowTitle">\r
   </property>\r
   <widget class="QWidget" name="centralWidget">\r
    <layout class="QVBoxLayout" name="verticalLayout">\r
+    <property name="spacing">\r
+     <number>0</number>\r
+    </property>\r
+    <property name="leftMargin">\r
+     <number>0</number>\r
+    </property>\r
+    <property name="topMargin">\r
+     <number>0</number>\r
+    </property>\r
+    <property name="rightMargin">\r
+     <number>0</number>\r
+    </property>\r
+    <property name="bottomMargin">\r
+     <number>0</number>\r
+    </property>\r
     <item>\r
      <widget class="QSplitter" name="splitter">\r
       <property name="orientation">\r
        <enum>Qt::Horizontal</enum>\r
       </property>\r
-      <widget class="AnyView" name="pane1" 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>\r
-      <widget class="AnyView" name="pane2" 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>\r
+      <widget class="Panel" name="LPanel" native="true"/>\r
+      <widget class="Panel" name="RPanel" native="true"/>\r
      </widget>\r
     </item>\r
     <item>\r
-     <widget class="AnyView" name="pane3" 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>\r
+     <widget class="Panel" name="FPanel" native="true"/>\r
     </item>\r
    </layout>\r
   </widget>\r
    <attribute name="toolBarBreak">\r
     <bool>false</bool>\r
    </attribute>\r
-   <addaction name="action_Search"/>\r
+   <addaction name="toggle_Search"/>\r
    <addaction name="action_Setting"/>\r
    <addaction name="separator"/>\r
-   <addaction name="mark_All"/>\r
-   <addaction name="mark_AllFiles"/>\r
-   <addaction name="mark_AllOff"/>\r
+   <addaction name="action_MarkAll"/>\r
+   <addaction name="action_MarkAllFiles"/>\r
+   <addaction name="action_MarkAllOff"/>\r
    <addaction name="separator"/>\r
-   <addaction name="view_Refresh"/>\r
-   <addaction name="view_HalfMode"/>\r
-   <addaction name="view_Filter"/>\r
+   <addaction name="action_Refresh"/>\r
+   <addaction name="toggle_FullMode"/>\r
+   <addaction name="toggle_ThumbnailMode"/>\r
+   <addaction name="toggle_PreviewMode"/>\r
+   <addaction name="action_Filter"/>\r
    <addaction name="separator"/>\r
-   <addaction name="move_Back"/>\r
-   <addaction name="move_Forward"/>\r
-   <addaction name="move_Root"/>\r
-   <addaction name="move_Home"/>\r
-   <addaction name="move_Jump"/>\r
+   <addaction name="action_historyBack"/>\r
+   <addaction name="action_HistoryForward"/>\r
+   <addaction name="action_CdRoot"/>\r
+   <addaction name="action_CdHome"/>\r
+   <addaction name="action_Cd"/>\r
    <addaction name="separator"/>\r
-   <addaction name="cmd_NewFile"/>\r
-   <addaction name="cmd_NewFolder"/>\r
+   <addaction name="action_CreateFile"/>\r
+   <addaction name="action_CreateFolder"/>\r
    <addaction name="separator"/>\r
-   <addaction name="help_About"/>\r
+   <addaction name="action_About"/>\r
   </widget>\r
   <widget class="QStatusBar" name="statusBar"/>\r
   <widget class="QMenuBar" name="menuBar">\r
@@ -98,7 +94,7 @@
     <rect>\r
      <x>0</x>\r
      <y>0</y>\r
-     <width>656</width>\r
+     <width>669</width>\r
      <height>22</height>\r
     </rect>\r
    </property>\r
     <property name="title">\r
      <string>ファイル(&amp;F)</string>\r
     </property>\r
-    <addaction name="action_Open"/>\r
-    <addaction name="action_Exec"/>\r
+    <addaction name="action_OpenWith"/>\r
     <addaction name="action_OpenEditor"/>\r
     <addaction name="action_OpenTerminal"/>\r
     <addaction name="action_OpenArchiver"/>\r
-    <addaction name="action_Command"/>\r
+    <addaction name="action_RunCommand"/>\r
     <addaction name="separator"/>\r
-    <addaction name="action_Search"/>\r
+    <addaction name="toggle_Search"/>\r
     <addaction name="action_SearchNext"/>\r
     <addaction name="action_SearchPrev"/>\r
     <addaction name="separator"/>\r
     <property name="title">\r
      <string>マーク(&amp;M)</string>\r
     </property>\r
-    <addaction name="mark_Toggle"/>\r
-    <addaction name="mark_All"/>\r
-    <addaction name="mark_AllFiles"/>\r
-    <addaction name="mark_AllOff"/>\r
-    <addaction name="mark_Invert"/>\r
+    <addaction name="action_MarkAll"/>\r
+    <addaction name="action_MarkAllFiles"/>\r
+    <addaction name="action_MarkAllOff"/>\r
+    <addaction name="action_MarkInvert"/>\r
    </widget>\r
    <widget class="QMenu" name="menu_View">\r
     <property name="title">\r
      <string>表示(&amp;V)</string>\r
     </property>\r
-    <addaction name="view_FromOther"/>\r
-    <addaction name="view_ToOther"/>\r
-    <addaction name="view_Swap"/>\r
-    <addaction name="view_Refresh"/>\r
-    <addaction name="view_HalfMode"/>\r
+    <addaction name="action_SyncPanel"/>\r
+    <addaction name="action_SyncPanelTo"/>\r
+    <addaction name="action_Swap"/>\r
+    <addaction name="action_Refresh"/>\r
+    <addaction name="toggle_FullMode"/>\r
+    <addaction name="toggle_ThumbnailMode"/>\r
+    <addaction name="toggle_PreviewMode"/>\r
     <addaction name="separator"/>\r
-    <addaction name="view_Hidden"/>\r
-    <addaction name="view_System"/>\r
+    <addaction name="toggle_Hidden"/>\r
+    <addaction name="toggle_System"/>\r
     <addaction name="separator"/>\r
-    <addaction name="view_FontSizeUp"/>\r
-    <addaction name="view_FontSizeDown"/>\r
+    <addaction name="action_ScaleUp"/>\r
+    <addaction name="action_ScaleDown"/>\r
     <addaction name="separator"/>\r
-    <addaction name="view_Sort"/>\r
-    <addaction name="view_Filter"/>\r
+    <addaction name="action_Sort"/>\r
+    <addaction name="action_Filter"/>\r
    </widget>\r
    <widget class="QMenu" name="menu_Move">\r
     <property name="title">\r
      <string>移動(&amp;E)</string>\r
     </property>\r
-    <addaction name="move_Back"/>\r
-    <addaction name="move_Forward"/>\r
-    <addaction name="move_History"/>\r
+    <addaction name="action_historyBack"/>\r
+    <addaction name="action_HistoryForward"/>\r
+    <addaction name="action_History"/>\r
     <addaction name="separator"/>\r
-    <addaction name="move_Home"/>\r
-    <addaction name="move_Parent"/>\r
-    <addaction name="move_Root"/>\r
-    <addaction name="move_Jump"/>\r
+    <addaction name="action_CdHome"/>\r
+    <addaction name="action_CdUp"/>\r
+    <addaction name="action_CdRoot"/>\r
+    <addaction name="action_Cd"/>\r
     <addaction name="separator"/>\r
-    <addaction name="move_Up"/>\r
-    <addaction name="move_Down"/>\r
-    <addaction name="move_Begin"/>\r
-    <addaction name="move_End"/>\r
+    <addaction name="action_KeyUp"/>\r
+    <addaction name="action_KeyDown"/>\r
+    <addaction name="action_KeyHome"/>\r
+    <addaction name="action_KeyEnd"/>\r
     <addaction name="separator"/>\r
-    <addaction name="move_UpOther"/>\r
-    <addaction name="move_DownOther"/>\r
-    <addaction name="move_BeginOther"/>\r
-    <addaction name="move_EndOther"/>\r
+    <addaction name="action_KeyUpOther"/>\r
+    <addaction name="action_KeyDownOther"/>\r
+    <addaction name="action_KeyHomeOther"/>\r
+    <addaction name="action_KeyEndOther"/>\r
    </widget>\r
    <widget class="QMenu" name="menu_Operate">\r
     <property name="title">\r
      <string>操作(&amp;O)</string>\r
     </property>\r
-    <addaction name="cmd_Copy"/>\r
-    <addaction name="cmd_Move"/>\r
-    <addaction name="cmd_Delete"/>\r
+    <addaction name="action_Copy"/>\r
+    <addaction name="action_Move"/>\r
+    <addaction name="action_Delete"/>\r
     <addaction name="separator"/>\r
-    <addaction name="cmd_Rename"/>\r
+    <addaction name="action_Rename"/>\r
     <addaction name="separator"/>\r
-    <addaction name="cmd_NewFile"/>\r
-    <addaction name="cmd_NewFolder"/>\r
+    <addaction name="action_CreateFile"/>\r
+    <addaction name="action_CreateFolder"/>\r
     <addaction name="separator"/>\r
-    <addaction name="copy_Filename"/>\r
-    <addaction name="copy_Fullpath"/>\r
+    <addaction name="action_CopyFileName"/>\r
+    <addaction name="action_CopyFilePath"/>\r
    </widget>\r
    <widget class="QMenu" name="menu_Help">\r
     <property name="title">\r
      <string>ヘルプ(&amp;H)</string>\r
     </property>\r
-    <addaction name="check_Update"/>\r
-    <addaction name="help_About"/>\r
+    <addaction name="action_CheckUpdate"/>\r
+    <addaction name="action_About"/>\r
    </widget>\r
    <widget class="QMenu" name="menu_Bookmark">\r
     <property name="title">\r
      <string>ブックマーク(&amp;B)</string>\r
     </property>\r
-    <addaction name="bookmark_Edit"/>\r
+    <addaction name="action_EditBookmark"/>\r
     <addaction name="separator"/>\r
    </widget>\r
    <widget class="QMenu" name="menu_Panel">\r
     <property name="title">\r
      <string>パネル(&amp;P)</string>\r
     </property>\r
-    <addaction name="split_Center"/>\r
-    <addaction name="expand_Left"/>\r
-    <addaction name="expand_Right"/>\r
+    <addaction name="action_SplitCenter"/>\r
+    <addaction name="action_ExpandLeft"/>\r
+    <addaction name="action_ExpandRight"/>\r
    </widget>\r
    <addaction name="menu_File"/>\r
    <addaction name="menu_Mark"/>\r
    <addaction name="menu_Panel"/>\r
    <addaction name="menu_Help"/>\r
   </widget>\r
+  <widget class="QToolBar" name="toolBar">\r
+   <property name="windowTitle">\r
+    <string>toolBar</string>\r
+   </property>\r
+   <attribute name="toolBarArea">\r
+    <enum>TopToolBarArea</enum>\r
+   </attribute>\r
+   <attribute name="toolBarBreak">\r
+    <bool>false</bool>\r
+   </attribute>\r
+  </widget>\r
   <action name="action_Quit">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
     <string>Return</string>\r
    </property>\r
   </action>\r
-  <action name="action_Exec">\r
+  <action name="action_OpenWith">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Play.png</normaloff>:/images/Play.png</iconset>\r
     <string>Shift+Return</string>\r
    </property>\r
   </action>\r
-  <action name="view_FromOther">\r
+  <action name="action_SyncPanel">\r
    <property name="icon">\r
-    <iconset theme="隣のパネルと同じフォルダを表示"/>\r
+    <iconset theme="隣のパネルと同じフォルダを表示">\r
+     <normaloff/>\r
+    </iconset>\r
    </property>\r
    <property name="text">\r
     <string>隣のパネルと同じフォルダを表示</string>\r
     <string>O</string>\r
    </property>\r
   </action>\r
-  <action name="view_ToOther">\r
+  <action name="action_SyncPanelTo">\r
    <property name="text">\r
     <string>隣のパネルに同じフォルダを表示</string>\r
    </property>\r
     <string>Shift+O</string>\r
    </property>\r
   </action>\r
-  <action name="mark_Toggle">\r
+  <action name="toggle_Mark">\r
    <property name="text">\r
     <string>マーク/解除</string>\r
    </property>\r
     <string>Space</string>\r
    </property>\r
   </action>\r
-  <action name="mark_All">\r
+  <action name="action_MarkAll">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Ok.png</normaloff>:/images/Ok.png</iconset>\r
     <string>Shift+A</string>\r
    </property>\r
   </action>\r
-  <action name="mark_AllFiles">\r
+  <action name="action_MarkAllFiles">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Check boxes.png</normaloff>:/images/Check boxes.png</iconset>\r
     <string>A</string>\r
    </property>\r
   </action>\r
-  <action name="mark_AllOff">\r
+  <action name="action_MarkAllOff">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Cancel.png</normaloff>:/images/Cancel.png</iconset>\r
     <string>U</string>\r
    </property>\r
   </action>\r
-  <action name="mark_Invert">\r
+  <action name="action_MarkInvert">\r
    <property name="text">\r
     <string>マークを反転</string>\r
    </property>\r
     <string>I</string>\r
    </property>\r
   </action>\r
-  <action name="view_Swap">\r
+  <action name="action_Swap">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Flip.png</normaloff>:/images/Flip.png</iconset>\r
     <enum>QAction::PreferencesRole</enum>\r
    </property>\r
   </action>\r
-  <action name="view_Hidden">\r
+  <action name="toggle_Hidden">\r
    <property name="checkable">\r
     <bool>true</bool>\r
    </property>\r
     <string>Shift+H</string>\r
    </property>\r
   </action>\r
-  <action name="view_Sort">\r
+  <action name="action_Sort">\r
    <property name="text">\r
     <string>ソート方法...</string>\r
    </property>\r
     <string>S</string>\r
    </property>\r
   </action>\r
-  <action name="move_Down">\r
+  <action name="action_KeyDown">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Go down.png</normaloff>:/images/Go down.png</iconset>\r
     <string>J</string>\r
    </property>\r
   </action>\r
-  <action name="move_Up">\r
+  <action name="action_KeyUp">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Go up.png</normaloff>:/images/Go up.png</iconset>\r
     <string>K</string>\r
    </property>\r
   </action>\r
-  <action name="move_Back">\r
+  <action name="action_historyBack">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Back.png</normaloff>:/images/Back.png</iconset>\r
     <string>[</string>\r
    </property>\r
   </action>\r
-  <action name="move_Forward">\r
+  <action name="action_HistoryForward">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Forward.png</normaloff>:/images/Forward.png</iconset>\r
     <string>]</string>\r
    </property>\r
   </action>\r
-  <action name="move_History">\r
+  <action name="action_History">\r
    <property name="text">\r
     <string>履歴...</string>\r
    </property>\r
     <string>R</string>\r
    </property>\r
   </action>\r
-  <action name="move_Parent">\r
+  <action name="action_CdUp">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Up.png</normaloff>:/images/Up.png</iconset>\r
     <string>Backspace</string>\r
    </property>\r
   </action>\r
-  <action name="move_Root">\r
+  <action name="action_CdRoot">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Monitor.png</normaloff>:/images/Monitor.png</iconset>\r
     <string>Shift+Backspace</string>\r
    </property>\r
   </action>\r
-  <action name="move_Jump">\r
+  <action name="action_Cd">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Folder.png</normaloff>:/images/Folder.png</iconset>\r
     <string>G</string>\r
    </property>\r
   </action>\r
-  <action name="move_Home">\r
+  <action name="action_CdHome">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Home.png</normaloff>:/images/Home.png</iconset>\r
     <string>H</string>\r
    </property>\r
   </action>\r
-  <action name="move_Begin">\r
+  <action name="action_KeyHome">\r
    <property name="text">\r
     <string>カーソルを先頭に</string>\r
    </property>\r
     <string>Shift+J</string>\r
    </property>\r
   </action>\r
-  <action name="move_End">\r
+  <action name="action_KeyEnd">\r
    <property name="text">\r
     <string>カーソルを末尾に</string>\r
    </property>\r
     <string>E</string>\r
    </property>\r
   </action>\r
-  <action name="action_Command">\r
+  <action name="action_RunCommand">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Export.png</normaloff>:/images/Export.png</iconset>\r
     <string>X</string>\r
    </property>\r
   </action>\r
-  <action name="cmd_Copy">\r
+  <action name="action_Copy">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Copy.png</normaloff>:/images/Copy.png</iconset>\r
     <string>Ctrl+C</string>\r
    </property>\r
   </action>\r
-  <action name="cmd_Move">\r
+  <action name="action_Move">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Paste.png</normaloff>:/images/Paste.png</iconset>\r
     <string>Ctrl+M</string>\r
    </property>\r
   </action>\r
-  <action name="cmd_Delete">\r
+  <action name="action_Delete">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Close file.png</normaloff>:/images/Close file.png</iconset>\r
     <string>Ctrl+D</string>\r
    </property>\r
   </action>\r
-  <action name="cmd_Rename">\r
+  <action name="action_Rename">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Rename.png</normaloff>:/images/Rename.png</iconset>\r
     <string>Ctrl+R</string>\r
    </property>\r
   </action>\r
-  <action name="cmd_NewFile">\r
+  <action name="action_CreateFile">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/New file.png</normaloff>:/images/New file.png</iconset>\r
     <string>Ctrl+E</string>\r
    </property>\r
   </action>\r
-  <action name="cmd_NewFolder">\r
+  <action name="action_CreateFolder">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Add folder.png</normaloff>:/images/Add folder.png</iconset>\r
     <string>Ctrl+K</string>\r
    </property>\r
   </action>\r
-  <action name="help_About">\r
+  <action name="action_About">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Help.png</normaloff>:/images/Help.png</iconset>\r
     <enum>QAction::AboutRole</enum>\r
    </property>\r
   </action>\r
-  <action name="view_System">\r
+  <action name="toggle_System">\r
    <property name="checkable">\r
     <bool>true</bool>\r
    </property>\r
     <string>Shift+S</string>\r
    </property>\r
   </action>\r
-  <action name="view_Refresh">\r
+  <action name="action_Refresh">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Refresh.png</normaloff>:/images/Refresh.png</iconset>\r
     <string>&gt;</string>\r
    </property>\r
   </action>\r
-  <action name="view_Filter">\r
+  <action name="action_Filter">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Funnel.png</normaloff>:/images/Funnel.png</iconset>\r
     <string>*</string>\r
    </property>\r
   </action>\r
-  <action name="check_Update">\r
+  <action name="action_CheckUpdate">\r
    <property name="text">\r
     <string>アップデートを確認</string>\r
    </property>\r
     <string>Shift+Z</string>\r
    </property>\r
   </action>\r
-  <action name="copy_Filename">\r
+  <action name="action_CopyFileName">\r
    <property name="text">\r
     <string>ファイル名をクリップボードにコピー</string>\r
    </property>\r
     <string>C</string>\r
    </property>\r
   </action>\r
-  <action name="copy_Fullpath">\r
+  <action name="action_CopyFilePath">\r
    <property name="text">\r
     <string>フルパス名をクリップボードにコピー</string>\r
    </property>\r
     <string>Shift+C</string>\r
    </property>\r
   </action>\r
-  <action name="action_Search">\r
+  <action name="toggle_Search">\r
    <property name="checkable">\r
     <bool>true</bool>\r
    </property>\r
     <string>Shift+Return</string>\r
    </property>\r
   </action>\r
-  <action name="view_FontSizeUp">\r
+  <action name="action_ScaleUp">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Zoom in.png</normaloff>:/images/Zoom in.png</iconset>\r
     <string>+</string>\r
    </property>\r
   </action>\r
-  <action name="view_FontSizeDown">\r
+  <action name="action_ScaleDown">\r
    <property name="icon">\r
     <iconset resource="resource.qrc">\r
      <normaloff>:/images/Zoom out.png</normaloff>:/images/Zoom out.png</iconset>\r
     <string>-</string>\r
    </property>\r
   </action>\r
-  <action name="move_UpOther">\r
+  <action name="action_KeyUpOther">\r
    <property name="text">\r
-    <string>隣ペインのカーソルを上に</string>\r
-   </property>\r
-   <property name="toolTip">\r
-    <string>隣ペインのカーソルを上に</string>\r
+    <string>隣パネルのカーソルを上に</string>\r
    </property>\r
    <property name="shortcut">\r
     <string>Shift+Up</string>\r
    </property>\r
   </action>\r
-  <action name="move_DownOther">\r
+  <action name="action_KeyDownOther">\r
    <property name="text">\r
-    <string>隣ペインのカーソルを下に</string>\r
-   </property>\r
-   <property name="toolTip">\r
-    <string>隣ペインのカーソルを下に</string>\r
+    <string>隣パネルのカーソルを下に</string>\r
    </property>\r
    <property name="shortcut">\r
     <string>Shift+Down</string>\r
    </property>\r
   </action>\r
-  <action name="move_BeginOther">\r
+  <action name="action_KeyHomeOther">\r
    <property name="text">\r
-    <string>隣ペインのカーソルを先頭に</string>\r
-   </property>\r
-   <property name="toolTip">\r
-    <string>隣ペインのカーソルを先頭に</string>\r
+    <string>隣パネルのカーソルを先頭に</string>\r
    </property>\r
    <property name="shortcut">\r
     <string>Alt+Up</string>\r
    </property>\r
   </action>\r
-  <action name="move_EndOther">\r
+  <action name="action_KeyEndOther">\r
    <property name="text">\r
-    <string>隣ペインのカーソルを末尾に</string>\r
-   </property>\r
-   <property name="toolTip">\r
-    <string>隣ペインのカーソルを末尾に</string>\r
+    <string>隣パネルのカーソルを末尾に</string>\r
    </property>\r
    <property name="shortcut">\r
     <string>Alt+Down</string>\r
    </property>\r
   </action>\r
-  <action name="key_Left">\r
+  <action name="action_KeyLeft">\r
    <property name="text">\r
     <string>key_Left</string>\r
    </property>\r
     <string>Left</string>\r
    </property>\r
   </action>\r
-  <action name="key_Right">\r
+  <action name="action_KeyRight">\r
    <property name="text">\r
     <string>key_Right</string>\r
    </property>\r
     <string>Right</string>\r
    </property>\r
   </action>\r
-  <action name="view_HalfMode">\r
+  <action name="toggle_PreviewMode">\r
    <property name="checkable">\r
     <bool>true</bool>\r
    </property>\r
     <string>P</string>\r
    </property>\r
   </action>\r
-  <action name="bookmark_Edit">\r
+  <action name="action_EditBookmark">\r
    <property name="text">\r
     <string>ブックマークを編集...</string>\r
    </property>\r
     <string>Shift+B</string>\r
    </property>\r
   </action>\r
-  <action name="bookmark_Show">\r
+  <action name="action_ShowBookmark">\r
    <property name="text">\r
     <string>ブックマークを表示</string>\r
    </property>\r
     <string>B</string>\r
    </property>\r
   </action>\r
-  <action name="split_Center">\r
+  <action name="action_SplitCenter">\r
    <property name="text">\r
     <string>中央で分割</string>\r
    </property>\r
     <string>Shift+Space</string>\r
    </property>\r
   </action>\r
-  <action name="expand_Left">\r
+  <action name="action_ExpandLeft">\r
    <property name="text">\r
     <string>左パネルを拡大</string>\r
    </property>\r
     <string>Shift+Right</string>\r
    </property>\r
   </action>\r
-  <action name="expand_Right">\r
+  <action name="action_ExpandRight">\r
    <property name="text">\r
     <string>右パネルを拡大</string>\r
    </property>\r
     <string>Shift+U</string>\r
    </property>\r
   </action>\r
+  <action name="text_ConvertFromEUC">\r
+   <property name="text">\r
+    <string>EUC-JPで再読込</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Ctrl+E</string>\r
+   </property>\r
+  </action>\r
+  <action name="text_ConvertFromJIS">\r
+   <property name="text">\r
+    <string>ISO 2022-JP(JIS)で再読込</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Ctrl+J</string>\r
+   </property>\r
+  </action>\r
+  <action name="text_ConvertFromSJIS">\r
+   <property name="text">\r
+    <string>Shift-JISで再読込</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Ctrl+S</string>\r
+   </property>\r
+  </action>\r
+  <action name="text_ConvertFromUTF8">\r
+   <property name="text">\r
+    <string>UTF-8で再読込</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Ctrl+U</string>\r
+   </property>\r
+  </action>\r
+  <action name="text_ConvertFromUTF16">\r
+   <property name="text">\r
+    <string>UTF-16で再読込</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Ctrl+I</string>\r
+   </property>\r
+  </action>\r
+  <action name="text_ConvertFromUTF16BE">\r
+   <property name="text">\r
+    <string>UTF-16BEで再読込</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Ctrl+O</string>\r
+   </property>\r
+  </action>\r
+  <action name="text_ConvertFromUTF16LE">\r
+   <property name="text">\r
+    <string>UTF-16LEで再読込</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Ctrl+P</string>\r
+   </property>\r
+  </action>\r
+  <action name="text_Copy">\r
+   <property name="text">\r
+    <string>選択範囲をクリップボードにコピー</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Ctrl+C</string>\r
+   </property>\r
+  </action>\r
+  <action name="view_Back">\r
+   <property name="text">\r
+    <string>戻る</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Return</string>\r
+   </property>\r
+  </action>\r
+  <action name="image_FitToWindow">\r
+   <property name="checkable">\r
+    <bool>true</bool>\r
+   </property>\r
+   <property name="text">\r
+    <string>ウィンドウにフィット</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Space</string>\r
+   </property>\r
+  </action>\r
+  <action name="image_ScaleNormal">\r
+   <property name="text">\r
+    <string>等倍</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>=</string>\r
+   </property>\r
+  </action>\r
+  <action name="image_Rotate90">\r
+   <property name="text">\r
+    <string>右に90度回転</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>9</string>\r
+   </property>\r
+  </action>\r
+  <action name="image_Rotate180">\r
+   <property name="text">\r
+    <string>右に180度回転</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>0</string>\r
+   </property>\r
+  </action>\r
+  <action name="action_AddBookmark">\r
+   <property name="icon">\r
+    <iconset resource="resource.qrc">\r
+     <normaloff>:/images/Favourites.png</normaloff>:/images/Favourites.png</iconset>\r
+   </property>\r
+   <property name="text">\r
+    <string>現在のフォルダをブックマークに追加</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Ctrl+B</string>\r
+   </property>\r
+  </action>\r
+  <action name="toggle_FullMode">\r
+   <property name="checkable">\r
+    <bool>true</bool>\r
+   </property>\r
+   <property name="icon">\r
+    <iconset resource="resource.qrc">\r
+     <normaloff>:/images/windows_fullscreen.png</normaloff>:/images/windows_fullscreen.png</iconset>\r
+   </property>\r
+   <property name="text">\r
+    <string>単画面モード</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>,</string>\r
+   </property>\r
+  </action>\r
+  <action name="toggle_ThumbnailMode">\r
+   <property name="checkable">\r
+    <bool>true</bool>\r
+   </property>\r
+   <property name="icon">\r
+    <iconset resource="resource.qrc">\r
+     <normaloff>:/images/Pictures.png</normaloff>:/images/Pictures.png</iconset>\r
+   </property>\r
+   <property name="text">\r
+    <string>サムネイルモード</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>.</string>\r
+   </property>\r
+  </action>\r
  </widget>\r
  <layoutdefault spacing="6" margin="11"/>\r
  <customwidgets>\r
   <customwidget>\r
-   <class>AnyView</class>\r
+   <class>Panel</class>\r
    <extends>QWidget</extends>\r
-   <header>anyview.h</header>\r
+   <header>panel.h</header>\r
    <container>1</container>\r
   </customwidget>\r
  </customwidgets>\r
index 839952a..13a29d4 100644 (file)
@@ -1,4 +1,3 @@
-#include "common.h"\r
 #include "mainwindow.h"\r
 #include "operationdialog.h"\r
 #include "ui_operationdialog.h"\r
index a44bd47..9aa56c1 100644 (file)
@@ -1,11 +1,10 @@
-#include "common.h"\r
+#include "preferences.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
@@ -32,9 +31,8 @@ OverWriteDialog::~OverWriteDialog()
 \r
 void OverWriteDialog::reset()\r
 {\r
-    QSettings settings;\r
-    QString method = settings.value(IniKey_DefaultOnCopy).toString();\r
-    QRadioButton *radio = findChild<QRadioButton*>(method);\r
+    QString method = Preferences(this).getCopyBehavior();\r
+    QRadioButton *radio = findChild<QRadioButton*>("rb" + method);\r
     if (radio == NULL) {\r
         radio = ui->rbOverWriteIfNew;\r
     }\r
diff --git a/panel.cpp b/panel.cpp
new file mode 100644 (file)
index 0000000..c39332f
--- /dev/null
+++ b/panel.cpp
@@ -0,0 +1,173 @@
+#include "foldermodel.h"
+#include "folderview.h"
+#include "mainwindow.h"
+#include "preferences.h"
+#include "panel.h"
+#include "ui_panel.h"
+
+#include <QDebug>
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief Panel::Panel
+/// \param parent   親ウィジェット
+///
+/// コンストラクタ
+///
+Panel::Panel(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::Panel)
+{
+    ui->setupUi(this);
+    ui->imageView->setVisible(false);
+    ui->textView->setVisible(false);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief Panel::~Panel
+///
+/// デストラクタ
+///
+Panel::~Panel()
+{
+    delete ui;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief Panel::folderPanel
+/// \return フォルダパネルを返します。
+///
+FolderPanel *Panel::folderPanel() const
+{
+    return ui->folderPanel;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief Panel::initialize
+/// \param w メインウィンドウオブジェクト
+///
+/// パネルを初期化します。
+///
+void Panel::initialize(MainWindow *w)
+{
+    qDebug() << "Panel::initialize()";
+
+    ui->imageView->initialize(w);
+    ui->folderPanel->initialize(w);
+    ui->textView->initialize(w);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief Panel::model
+/// \return フォルダモデルを返します。
+///
+FolderModel *Panel::model() const
+{
+    return ui->folderPanel->model();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief Panel::setModel
+/// \param m    設定するモデル
+///
+/// モデルを設定します。
+///
+void Panel::setModel(FolderModel *m)
+{
+    qDebug() << "Panel::setModel()";
+
+    ui->folderPanel->setModel(m);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief Panel::setViewItem
+/// \param index    設定するアイテムのインデックス
+///
+/// ビューにアイテムを設定し、表示します。
+///
+void Panel::setViewItem(const QModelIndex &index)
+{
+    qDebug() << "Panel::setViewItem()" << index;
+
+    if (!index.isValid()) {
+        ui->imageView->setVisible(false);
+        ui->textView->setVisible(false);
+        ui->folderPanel->setVisible(true);
+        return;
+    }
+
+    const FolderModel *m = static_cast<const FolderModel*>(index.model());
+    QString path = m->filePath(index);
+    if (m->isDir(index)) {
+        model()->setRootPath(path);
+        ui->imageView->setVisible(false);
+        ui->textView->setVisible(false);
+        ui->folderPanel->setVisible(true);
+        return;
+    }
+
+    QPixmap pixmap(path);
+    if (!pixmap.isNull()) {
+        ui->imageView->setSource(pixmap);
+        ui->folderPanel->setVisible(false);
+        ui->textView->setVisible(false);
+        ui->imageView->setVisible(true);
+        return;
+    }
+
+    QFile file(path);
+    QByteArray data;
+    if (file.open(QIODevice::ReadOnly)) {
+        data = file.readAll();
+        file.close();
+    }
+
+    ui->textView->setSource(data);
+    ui->folderPanel->setVisible(false);
+    ui->imageView->setVisible(false);
+    ui->textView->setVisible(true);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief Panel::updateAppearance
+///
+/// 外観を変更します。
+///
+void Panel::updateAppearance()
+{
+    qDebug() << "Panel::updateAppearance()";
+
+    Preferences prefs(this);
+    QPalette pal;
+
+    pal = ui->imageView->palette();
+    pal.setColor(QPalette::Base, prefs.getImageViewBgColor());
+    ui->imageView->setPalette(pal);
+
+    pal = ui->textView->palette();
+    pal.setColor(QPalette::Base, prefs.getTextViewBgColor());
+    pal.setColor(QPalette::Text, prefs.getTextViewFgColor());
+    ui->textView->setPalette(pal);
+    ui->textView->setFont(prefs.getTextViewFont());
+
+    ui->folderPanel->updateAppearance();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief Panel::visibleView
+/// \return 可視状態のビューを返します。
+///
+QWidget *Panel::visibleView() const
+{
+    if (ui->textView->isVisible()) {
+        return ui->textView;
+    }
+    if (ui->imageView->isVisible()) {
+        return ui->imageView;
+    }
+    if (ui->folderPanel->isVisible()) {
+        return ui->folderPanel->itemView();
+    }
+
+    qDebug() << ">>>>>>>>>> visibleView() Logic error <<<<<<<<<<";
+    return NULL;
+}
diff --git a/panel.h b/panel.h
new file mode 100644 (file)
index 0000000..d10cb2c
--- /dev/null
+++ b/panel.h
@@ -0,0 +1,34 @@
+#ifndef PANEL_H
+#define PANEL_H
+
+#include <QWidget>
+#include <QModelIndex>
+class MainWindow;
+class FolderPanel;
+class FolderModel;
+
+namespace Ui {
+class Panel;
+}
+
+class Panel : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit Panel(QWidget *parent = 0);
+    ~Panel();
+
+    FolderPanel*    folderPanel() const;
+    void            initialize(MainWindow *w);
+    FolderModel*    model() const;
+    void            setModel(FolderModel *m);
+    void            setViewItem(const QModelIndex &index = QModelIndex());
+    void            updateAppearance();
+    QWidget*        visibleView() const;
+
+private:
+    Ui::Panel *ui;
+};
+
+#endif // PANEL_H
similarity index 70%
rename from anyview.ui
rename to panel.ui
index f9ce915..7d3d7b2 100644 (file)
+++ b/panel.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>AnyView</class>
- <widget class="QWidget" name="AnyView">
+ <class>Panel</class>
+ <widget class="QWidget" name="Panel">
   <property name="geometry">
    <rect>
     <x>0</x>
    </property>
    <item>
     <widget class="SimpleTextView" name="textView">
-     <property name="acceptDrops">
-      <bool>false</bool>
-     </property>
-     <property name="tabChangesFocus">
-      <bool>true</bool>
-     </property>
-     <property name="readOnly">
-      <bool>true</bool>
-     </property>
      <property name="plainText">
-      <string>Simple Text View</string>
+      <string>TextView</string>
      </property>
     </widget>
    </item>
    <item>
-    <widget class="SimpleImageView" name="graphicsView"/>
+    <widget class="FolderPanel" name="folderPanel" native="true"/>
    </item>
    <item>
-    <widget class="FolderPanel" name="folderPanel" native="true">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-    </widget>
+    <widget class="SimpleImageView" name="imageView"/>
    </item>
   </layout>
  </widget>
  <customwidgets>
   <customwidget>
-   <class>SimpleTextView</class>
-   <extends>QPlainTextEdit</extends>
-   <header>simpletextview.h</header>
-  </customwidget>
-  <customwidget>
    <class>FolderPanel</class>
    <extends>QWidget</extends>
    <header>folderpanel.h</header>
    <container>1</container>
   </customwidget>
   <customwidget>
+   <class>SimpleTextView</class>
+   <extends>QPlainTextEdit</extends>
+   <header>simpletextview.h</header>
+  </customwidget>
+  <customwidget>
    <class>SimpleImageView</class>
    <extends>QGraphicsView</extends>
    <header>simpleimageview.h</header>
index 1a6a2e7..075da0e 100644 (file)
-#include "colorsamplemodel.h"
-#include"common.h"
+#include "global.h"
+#include "preferences.h"
 #include "preferencedialog.h"
 #include "ui_preferencedialog.h"
 
-#include <QAbstractTableModel>
 #include <QColorDialog>
-#include <QSettings>
 #include <QDebug>
 #include <QDir>
 #include <QFileDialog>
-#include <QStandardPaths>
 #include <QFontDialog>
+#include <QStandardPaths>
 
 PreferenceDialog::PreferenceDialog(QWidget *parent) :
     QDialog(parent),
-    ui(new Ui::PreferenceDialog),
-    m_model(),
-    m_colorMap()
+    ui(new Ui::PreferenceDialog)
 {
-    m_model.setColorMap(&m_colorMap);
-
     ui->setupUi(this);
     ui->tabWidget->setCurrentIndex(0);
-    // アドレスボックスの外観サンプル
-    ui->sampleEdit->setText(QDir::homePath());
-    // ファイルビューの外観サンプル
-    ui->sampleTable->setModel(&m_model);
-
-    QHeaderView *header;
-    header = ui->sampleTable->horizontalHeader();
-    header->setSectionResizeMode(0, QHeaderView::Stretch);
-    header->setSectionResizeMode(1, QHeaderView::ResizeToContents);
-    header->setSectionResizeMode(2, QHeaderView::ResizeToContents);
-    header = ui->sampleTable->verticalHeader();
-    header->setDefaultSectionSize(header->defaultSectionSize() * 0.75);
-
-    // シグナル&スロット
-    connect(ui->bootSize, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
-    connect(ui->sizeAbsolute, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
-    connect(ui->sizeRelative, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
-    connect(ui->bootPos, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
-    connect(ui->posAbsolute, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
-    connect(ui->posRelative, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
-
-    connect(ui->boxClrBg, SIGNAL(clicked()), this, SLOT(selectBoxColor()));
-    connect(ui->boxClrFg, SIGNAL(clicked()), this, SLOT(selectBoxColor()));
-    connect(ui->chooseBoxFont, SIGNAL(clicked()), this, SLOT(chooseFont()));
-
-    connect(ui->clrBgMark, SIGNAL(clicked()), this, SLOT(selectViewColor()));
-    connect(ui->clrBgNormal, SIGNAL(clicked()), this, SLOT(selectViewColor()));
-    connect(ui->clrFgHidden, SIGNAL(clicked()), this, SLOT(selectViewColor()));
-    connect(ui->clrFgMark, SIGNAL(clicked()), this, SLOT(selectViewColor()));
-    connect(ui->clrFgNormal, SIGNAL(clicked()), this, SLOT(selectViewColor()));
-    connect(ui->clrFgReadonly, SIGNAL(clicked()), this, SLOT(selectViewColor()));
-    connect(ui->clrFgSystem, SIGNAL(clicked()), this, SLOT(selectViewColor()));
-    connect(ui->chooseViewFont, SIGNAL(clicked()), this, SLOT(chooseFont()));
+    ui->lBoxSample->setText(QDir::homePath());
+
+    connect(ui->fvNormal, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->fvNormalBg, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->fvMarked, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->fvMarkedBg, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->fvSystem, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->fvHidden, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->fvReadOnly, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->lBoxBg, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->lBoxFg, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->sBoxNormal, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->sBoxNormalBg, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->sBoxUnmatch, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->sBoxUnmatchBg, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->tvBg, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->tvFg, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->gvBg, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->allBg, SIGNAL(clicked()), this, SLOT(chooseColor()));
+    connect(ui->allFg, SIGNAL(clicked()), this, SLOT(chooseColor()));
+
+    connect(ui->fvFont, SIGNAL(clicked()), this, SLOT(chooseFont()));
+    connect(ui->lBoxFont, SIGNAL(clicked()), this, SLOT(chooseFont()));
+    connect(ui->sBoxFont, SIGNAL(clicked()), this, SLOT(chooseFont()));
+    connect(ui->tvFont, SIGNAL(clicked()), this, SLOT(chooseFont()));
+    connect(ui->allFont, SIGNAL(clicked()), this, SLOT(chooseFont()));
+
+    connect(ui->browseArchiver, SIGNAL(clicked()), this, SLOT(choosePath()));
+    connect(ui->browseEditor, SIGNAL(clicked()), this, SLOT(choosePath()));
+    connect(ui->browseTerminal, SIGNAL(clicked()), this, SLOT(choosePath()));
 
-    connect(ui->importAppearance, SIGNAL(clicked()), this, SLOT(importAppearance()));
     connect(ui->exportAppearance, SIGNAL(clicked()), this, SLOT(exportAppearance()));
+    connect(ui->importAppearance, SIGNAL(clicked()), this, SLOT(importAppearance()));
 
-    connect(ui->browseArchiver, SIGNAL(clicked()), this, SLOT(browseApp()));
-    connect(ui->browseEditor, SIGNAL(clicked()), this, SLOT(browseApp()));
-    connect(ui->browseTerminal, SIGNAL(clicked()), this, SLOT(browseApp()));
-
-    connect(ui->chooseViewerFont, SIGNAL(clicked()), this, SLOT(chooseFont()));
-    connect(ui->viewerClrBg, SIGNAL(clicked()), this, SLOT(selectViewerColor()));
-    connect(ui->viewerClrFg, SIGNAL(clicked()), this, SLOT(selectViewerColor()));
-    connect(ui->viewerInherit, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
-    connect(ui->enableViewerIgnoreExt, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
-    connect(ui->defaultIgnoreExt, SIGNAL(clicked()), this, SLOT(setIgnoreExtDefault()));
-
-    // 現在の設定で各コントロールを初期化する
-    QSettings settings;
-    QString strValue;
-    QSize size;
-    QPoint point;
-    QRadioButton *radioBtn;
-
-    //>>>>> 起動と終了
-    // 起動時のサイズ
-    ui->bootSize->setChecked(true);
-    strValue = settings.value(IniKey_BootSizeSpec).toString();
-    radioBtn = findChild<QRadioButton*>(strValue);
-    if (radioBtn == NULL) {
-        radioBtn = ui->sizeRelative;
-    }
-    radioBtn->setChecked(true);
-    if (strValue.isEmpty()) {
-        ui->bootSize->setChecked(false);
-    }
-    size = settings.value(IniKey_BootSizeAbs).toSize();
-    ui->absoluteWidth->setValue(size.width());
-    ui->absoluteHeight->setValue(size.height());
-    size = settings.value(IniKey_BootSizeRel).toSize();
-    ui->relativeWidth->setValue(size.width());
-    ui->relativeHeight->setValue(size.height());
-    // 起動時の位置
-    ui->bootPos->setChecked(true);
-    strValue = settings.value(IniKey_BootPosSpec).toString();
-    radioBtn = findChild<QRadioButton*>(strValue);
-    if (radioBtn == NULL) {
-        radioBtn = ui->posCenter;
-    }
-    radioBtn->setChecked(true);
-    if (strValue.isEmpty()) {
-        ui->bootPos->setChecked(false);
-    }
-    point = settings.value(IniKey_BootPosAbs).toPoint();
-    ui->absoluteLeft->setValue(point.x());
-    ui->absoluteTop->setValue(point.y());
-    point = settings.value(IniKey_BootPosRel).toPoint();
-    ui->relativeLeft->setValue(point.x());
-    ui->relativeTop->setValue(point.y());
-    // 起動時の設定削除
-    ui->resetOnBoot->setChecked(settings.value(IniKey_ResetOnBoot).toBool());
-    // アップデートの確認
-    ui->checkUpdates->setChecked(settings.value(IniKey_CheckUpdates).toBool());
-    // 終了時の確認ダイアログ
-    ui->confirmExit->setChecked(settings.value(IniKey_ConfirmExit).toBool());
-
-    //>>>>> 色とフォント、テキストビューア
-    loadAppearance(settings, false);
-    ui->dark->setValue(settings.value(IniKey_Darkness).toInt());
-
-    //>>>>> ファイル操作
-    // 確認ダイアログの表示
-    ui->confirmCopy->setChecked(settings.value(IniKey_ConfirmCopy).toBool());
-    ui->confirmDelete->setChecked(settings.value(IniKey_ConfirmDelete).toBool());
-    ui->confirmMove->setChecked(settings.value(IniKey_ConfirmMove).toBool());
-    ui->confirmRename->setChecked(settings.value(IniKey_ConfirmRename).toBool());
-    // 完了ダイアログの自動クローズ
-    ui->autoCloseCopy->setChecked(settings.value(IniKey_AutoCloseCopy).toBool());
-    ui->autoCloseDelete->setChecked(settings.value(IniKey_AutoCloseDelete).toBool());
-    ui->autoCloseMove->setChecked(settings.value(IniKey_AutoCloseMove).toBool());
-    ui->autoCloseRename->setChecked(settings.value(IniKey_AutoCloseRename).toBool());
-    // 上書き時の既定動作
-    strValue = settings.value(IniKey_DefaultOnCopy).toString();
-    if (strValue.isEmpty()) {
-        strValue = "owDefIfNew";
-    }
-    radioBtn = findChild<QRadioButton*>(strValue);
-    if (radioBtn == NULL) {
-        radioBtn = ui->rbOverWriteIfNew;
-    }
-    radioBtn->setChecked(true);
-    ui->moveAfterCreate->setChecked(settings.value(IniKey_MoveAfterCreateFolder).toBool());
-    ui->openAfterCreate->setChecked(settings.value(IniKey_OpenAfterCreateFile).toBool());
-
-    //>>>>> パス設定
-    // エディタ
-    ui->editorPath->setText(settings.value(IniKey_PathEditor).toString());
-    // ターミナル
-    ui->terminalPath->setText(settings.value(IniKey_PathTerminal).toString());
-    // アーカイバ
-    ui->archiverPath->setText(settings.value(IniKey_PathArchiver).toString());
-
-    //>>>>> テキストビューア
-    ui->enableViewerIgnoreExt->setChecked(true);
-    ui->enableViewerIgnoreExt->setChecked(!settings.value(IniKey_ViewerForceOpen).toBool());
-    ui->viewerIgnoreExt->setPlainText(settings.value(IniKey_ViewerIgnoreExt).toString());
+    Preferences prefs(this);
+
+    // [全般]
+    ui->checkUpdate->setChecked(prefs.isCheckUpdate());
+    ui->confirmQuit->setChecked(prefs.isConfirmQuit());
+    ui->moveAfterCreation->setChecked(prefs.isMoveAfterCreation());
+    ui->openAfterCreation->setChecked(prefs.isOpenAfterCreation());
+    ui->confirmCopy->setChecked(prefs.isConfirmCopy());
+    ui->confirmMove->setChecked(prefs.isConfirmMove());
+    ui->confirmDelete->setChecked(prefs.isConfirmDelete());
+    ui->confirmRename->setChecked(prefs.isConfirmRename());
+    ui->autoCloseCopy->setChecked(prefs.isAutoCloseCopy());
+    ui->autoCloseMove->setChecked(prefs.isAutoCloseMove());
+    ui->autoCloseDelete->setChecked(prefs.isAutoCloseDelete());
+    ui->autoCloseRename->setChecked(prefs.isAutoCloseRename());
+    QRadioButton *radio = findChild<QRadioButton*>("rb" + prefs.getCopyBehavior());
+    if (radio)
+        radio->setChecked(true);
+    else
+        ui->rbOverWriteIfNew->setChecked(true);
+    ui->preferExtensions->setPlainText(prefs.getPreferExtensions());
+
+    // [外観(色)]
+    loadAppearance(prefs);
+
+    // [外観(フォント)]
+    setFont(ui->fvFontSpec, prefs.getFolderViewFont());
+    setFont(ui->lBoxFontSpec, prefs.getLocationBoxFont());
+    setFont(ui->sBoxFontSpec, prefs.getSearchBoxFont());
+    setFont(ui->tvFontSpec, prefs.getTextViewFont());
+
+    ui->lineHeight->setValue(prefs.getLineHeight());
+
+    // [プログラムパス]
+    ui->editorPath->setText(prefs.getEditorPath());
+    ui->terminalPath->setText(prefs.getTerminalPath());
+    ui->archiverPath->setText(prefs.getArchiverPath());
 }
 
 PreferenceDialog::~PreferenceDialog()
@@ -166,273 +94,263 @@ PreferenceDialog::~PreferenceDialog()
     delete ui;
 }
 
-void PreferenceDialog::saveAppearance(QSettings &settings)
+void PreferenceDialog::loadAppearance(Preferences &prefs)
 {
-    QFont font = ui->sampleEdit->font();
-    QPalette palette = ui->sampleEdit->palette();
-    settings.setValue(IniKey_BoxColorBg, palette.base().color());
-    settings.setValue(IniKey_BoxColorFg, palette.text().color());
-    settings.setValue(IniKey_BoxFont, font);
-
-    settings.setValue(IniKey_ViewColorBgMark, m_colorMap["clrBgMark"]);
-    settings.setValue(IniKey_ViewColorBgNormal, m_colorMap["clrBgNormal"]);
-    settings.setValue(IniKey_ViewColorFgHidden, m_colorMap["clrFgHidden"]);
-    settings.setValue(IniKey_ViewColorFgMark, m_colorMap["clrFgMark"]);
-    settings.setValue(IniKey_ViewColorFgNormal, m_colorMap["clrFgNormal"]);
-    settings.setValue(IniKey_ViewColorFgReadonly, m_colorMap["clrFgReadonly"]);
-    settings.setValue(IniKey_ViewColorFgSystem, m_colorMap["clrFgSystem"]);
-    settings.setValue(IniKey_ViewFont, m_model.font());
-}
+    setPalette(ui->fvNormalSample, QPalette::Base, prefs.getFolderViewBgColor());
+    setPalette(ui->fvNormalSample, QPalette::Text, prefs.getFolderViewFgColor());
 
-void PreferenceDialog::loadAppearance(QSettings &settings, bool import)
-{
-    QPalette palette;
-    QColor color;
-    QFont font;
+    setPalette(ui->fvMarkedSample, QPalette::Base, prefs.getFolderViewMarkedBgColor());
+    setPalette(ui->fvMarkedSample, QPalette::Text, prefs.getFolderViewMarkedFgColor());
 
-    //>>>> アドレスボックス
-    palette = QPalette();
-    // 背景色
-    color = settings.value(IniKey_BoxColorBg).value<QColor>();
-    palette.setColor(QPalette::Base, color);
-    // 文字色
-    color = settings.value(IniKey_BoxColorFg).value<QColor>();
-    palette.setColor(QPalette::Text, color);
-    // フォント
-    font = settings.value(IniKey_BoxFont).value<QFont>();
-    ui->boxFont->setText(tr("%1, %2pt").arg(font.family()).arg(font.pointSize()));
-    // サンプル表示
-    ui->sampleEdit->setPalette(palette);
-    ui->sampleEdit->setFont(font);
-
-    //>>>> ファイルビュー
-    // 背景色
-    color = settings.value(IniKey_ViewColorBgMark).value<QColor>();
-    m_colorMap["clrBgMark"] = color;
-    color = settings.value(IniKey_ViewColorBgNormal).value<QColor>();
-    m_colorMap["clrBgNormal"] = color;
-    // 文字色
-    color = settings.value(IniKey_ViewColorFgHidden).value<QColor>();
-    m_colorMap["clrFgHidden"] = color;
-    color = settings.value(IniKey_ViewColorFgMark).value<QColor>();
-    m_colorMap["clrFgMark"] = color;
-    color = settings.value(IniKey_ViewColorFgNormal).value<QColor>();
-    m_colorMap["clrFgNormal"] = color;
-    color = settings.value(IniKey_ViewColorFgReadonly).value<QColor>();
-    m_colorMap["clrFgReadonly"] = color;
-    color = settings.value(IniKey_ViewColorFgSystem).value<QColor>();
-    m_colorMap["clrFgSystem"] = color;
-    // フォント
-    font = settings.value(IniKey_ViewFont).value<QFont>();
-    ui->viewFont->setText(tr("%1, %2pt").arg(font.family()).arg(font.pointSize()));
-    // サンプル表示
-    QHeaderView *header = ui->sampleTable->verticalHeader();
-    header->setDefaultSectionSize(QFontMetrics(font).height() * 1.5);
-    ui->sampleTable->setMinimumHeight(header->sectionSize(0) * 5);
-    ui->sampleTable->setMaximumHeight(ui->sampleTable->minimumHeight() + 2);
-    m_model.setFont(font);
-    m_model.update();
-
-    //>>>> テキストビューア
-    // 文字色と背景色
-    if (settings.value(IniKey_ViewerInherit).toBool()) {
-        ui->viewerInherit->setChecked(true);
-        color = settings.value(IniKey_ViewColorBgNormal).value<QColor>();
-        palette.setColor(QPalette::Base, color);
-        color = settings.value(IniKey_ViewColorFgNormal).value<QColor>();
-        palette.setColor(QPalette::Text, color);
-    }
-    else if (!import){
-        ui->viewerInherit->setChecked(false);
-        color = settings.value(IniKey_ViewerColorBg).value<QColor>();
-        palette.setColor(QPalette::Base, color);
-        color = settings.value(IniKey_ViewerColorFg).value<QColor>();
-        palette.setColor(QPalette::Text, color);
-    }
-    ui->viewerSample->setPalette(palette);
-    // フォント
-    if (!import) {
-        font = settings.value(IniKey_ViewerFont).value<QFont>();
-        ui->viewerFont->setText(tr("%1, %2pt").arg(font.family()).arg(font.pointSize()));
-        ui->viewerSample->setFont(font);
-    }
+    setPalette(ui->fvSystemSample, QPalette::Base, prefs.getFolderViewBgColor());
+    setPalette(ui->fvSystemSample, QPalette::Text, prefs.getFolderViewSystemColor());
+
+    setPalette(ui->fvHiddenSample, QPalette::Base, prefs.getFolderViewBgColor());
+    setPalette(ui->fvHiddenSample, QPalette::Text, prefs.getFolderViewHiddenColor());
+
+    setPalette(ui->fvReadOnlySample, QPalette::Base, prefs.getFolderViewBgColor());
+    setPalette(ui->fvReadOnlySample, QPalette::Text, prefs.getFolderViewReadOnlyColor());
+
+    setPalette(ui->lBoxSample, QPalette::Base, prefs.getLocationBoxBgColor());
+    setPalette(ui->lBoxSample, QPalette::Text, prefs.getLocationBoxFgColor());
+
+    setPalette(ui->sBoxNormalSample, QPalette::Base, prefs.getSearchBoxBgColor());
+    setPalette(ui->sBoxNormalSample, QPalette::Text, prefs.getSearchBoxFgColor());
+
+    setPalette(ui->sBoxUnmatchSample, QPalette::Base, prefs.getSearchBoxUnmatchBgColor());
+    setPalette(ui->sBoxUnmatchSample, QPalette::Text, prefs.getSearchBoxUnmatchFgColor());
+
+    setPalette(ui->tvSample, QPalette::Base, prefs.getTextViewBgColor());
+    setPalette(ui->tvSample, QPalette::Text, prefs.getTextViewFgColor());
+
+    setPalette(ui->gvSample, QPalette::Base, prefs.getImageViewBgColor());
+
+    ui->darkFactor->setValue(prefs.getDarkFacotr());
 }
 
-void PreferenceDialog::chooseFont()
+void PreferenceDialog::saveAppearance(Preferences &prefs)
 {
-    bool ok;
-    QFont font;
-    QLabel *label = NULL;
+    prefs.setFolderViewBgColor(ui->fvNormalSample->palette().base().color());
+    prefs.setFolderViewFgColor(ui->fvNormalSample->palette().text().color());
 
-    if (sender() == ui->chooseViewerFont) {
-        font = ui->viewerSample->font();
-    }
-    else if (sender() == ui->chooseBoxFont) {
-        font = ui->sampleEdit->font();
-    }
-    else if (sender() == ui->chooseViewFont) {
-        font = m_model.font();
-    }
+    prefs.setFolderViewMarkedBgColor(ui->fvMarkedSample->palette().base().color());
+    prefs.setFolderViewMarkedFgColor(ui->fvMarkedSample->palette().text().color());
 
-    font = QFontDialog::getFont(&ok, font, this);
+    prefs.setFolderViewHiddenColor(ui->fvHiddenSample->palette().text().color());
+    prefs.setFolderViewReadOnlyColor(ui->fvReadOnlySample->palette().text().color());
+    prefs.setFolderViewSystemColor(ui->fvSystemSample->palette().text().color());
 
-    if (sender() == ui->chooseViewerFont) {
-        ui->viewerSample->setFont(font);
-        label = ui->viewerFont;
-    }
-    else if (sender() == ui->chooseBoxFont) {
-        ui->sampleEdit->setFont(font);
-        label = ui->boxFont;
-    }
-    else if (sender() == ui->chooseViewFont) {
-        QHeaderView *header = ui->sampleTable->verticalHeader();
-        header->setDefaultSectionSize(QFontMetrics(font).height() * 1.5);
-        ui->sampleTable->setMinimumHeight(header->sectionSize(0) * 5);
-        ui->sampleTable->setMaximumHeight(ui->sampleTable->minimumHeight() + 2);
-        m_model.setFont(font);
-        m_model.update();
-        label = ui->viewFont;
-    }
-    label->setText(tr("%1, %2pt").arg(font.family()).arg(font.pointSize()));
+    prefs.setLocationBoxBgColor(ui->lBoxSample->palette().base().color());
+    prefs.setLocationBoxFgColor(ui->lBoxSample->palette().text().color());
+
+    prefs.setSearchBoxBgColor(ui->sBoxNormalSample->palette().base().color());
+    prefs.setSearchBoxFgColor(ui->sBoxNormalSample->palette().text().color());
+
+    prefs.setSearchBoxUnmatchBgColor(ui->sBoxUnmatchSample->palette().base().color());
+    prefs.setSearchBoxUnmatchFgColor(ui->sBoxUnmatchSample->palette().text().color());
+
+    prefs.setTextViewBgColor(ui->tvSample->palette().base().color());
+    prefs.setTextViewFgColor(ui->tvSample->palette().text().color());
 
+    prefs.setImageViewBgColor(ui->gvSample->palette().base().color());
+
+    prefs.setDarkFacotr(ui->darkFactor->value());
 }
 
-void PreferenceDialog::setControlsEnabled(bool enabled)
+void PreferenceDialog::setFont(QLabel *label, const QFont &font)
 {
-    if (sender() == ui->bootSize) {
-        ui->sizeAbsolute->setEnabled(enabled);
-        ui->sizeLast->setEnabled(enabled);
-        ui->sizeRelative->setEnabled(enabled);
-        if (enabled) {
-            emit ui->sizeAbsolute->toggled(ui->sizeAbsolute->isChecked());
-            emit ui->sizeRelative->toggled(ui->sizeRelative->isChecked());
-        }
-        else {
-            emit ui->sizeAbsolute->toggled(false);
-            emit ui->sizeRelative->toggled(false);
-        }
-    }
-    else if (sender() == ui->sizeAbsolute) {
-        ui->absoluteHeight->setEnabled(enabled);
-        ui->absoluteWidth->setEnabled(enabled);
-    }
-    else if (sender() == ui->sizeRelative) {
-        ui->relativeHeight->setEnabled(enabled);
-        ui->relativeWidth->setEnabled(enabled);
-    }
-    else if (sender() == ui->bootPos) {
-        ui->posAbsolute->setEnabled(enabled);
-        ui->posCenter->setEnabled(enabled);
-        ui->posLast->setEnabled(enabled);
-        ui->posRelative->setEnabled(enabled);
-        if (enabled) {
-            emit ui->posAbsolute->toggled(ui->posAbsolute->isChecked());
-            emit ui->posRelative->toggled(ui->posRelative->isChecked());
-        }
-        else {
-            emit ui->posAbsolute->toggled(false);
-            emit ui->posRelative->toggled(false);
-        }
-    }
-    else if (sender() == ui->posAbsolute) {
-        ui->absoluteLeft->setEnabled(enabled);
-        ui->absoluteTop->setEnabled(enabled);
-    }
-    else if (sender() == ui->posRelative) {
-        ui->relativeLeft->setEnabled(enabled);
-        ui->relativeTop->setEnabled(enabled);
-    }
-    else if (sender() == ui->viewerInherit) {
-        ui->viewerClrBg->setEnabled(!enabled);
-        ui->viewerClrFg->setEnabled(!enabled);
-        // サンプル表示も更新
-        QPalette pal = ui->viewerSample->palette();
-        if (enabled) {
-            pal.setColor(QPalette::Base, m_colorMap["clrBgNormal"]);
-            pal.setColor(QPalette::Text, m_colorMap["clrFgNormal"]);
-        }
-        else {
-            QSettings settings;
-            pal.setColor(QPalette::Base, settings.value(IniKey_ViewerColorBg).value<QColor>());
-            pal.setColor(QPalette::Text, settings.value(IniKey_ViewerColorFg).value<QColor>());
-        }
-        ui->viewerSample->setPalette(pal);
-    }
-    else if (sender() == ui->enableViewerIgnoreExt) {
-        ui->viewerIgnoreExt->setEnabled(enabled);
-    }
+    label->setFont(font);
+    label->setText(QString("%1, %2pt").arg(font.family()).arg(font.pointSize()));
 }
 
-void PreferenceDialog::setIgnoreExtDefault()
+void PreferenceDialog::setPalette(QWidget *w, QPalette::ColorRole role, const QColor &color)
 {
-    ui->viewerIgnoreExt->setPlainText(ViewerIgnoreExt());
+    QPalette pal = w->palette();
+    pal.setColor(role, color);
+    w->setPalette(pal);
 }
 
-void PreferenceDialog::selectBoxColor()
+void PreferenceDialog::chooseColor()
 {
     QColor color;
-    QPalette palette = ui->sampleEdit->palette();
-    if (sender() == ui->boxClrBg) {
-        color = palette.background().color();
+
+    if (sender() == ui->fvNormal) {
+        color = ui->fvNormalSample->palette().text().color();
     }
-    else if (sender() == ui->boxClrFg) {
-        color = palette.text().color();
+    else if (sender() == ui->fvNormalBg) {
+        color = ui->fvNormalSample->palette().base().color();
     }
-
-    color = QColorDialog::getColor(color, this, tr("色選択"));
-    if (!color.isValid()) {
-        return;
+    else if (sender() == ui->fvMarked) {
+        color = ui->fvMarkedSample->palette().text().color();
     }
-
-    if (sender() == ui->boxClrBg) {
-        palette.setColor(QPalette::Base, color);
+    else if (sender() == ui->fvMarkedBg) {
+        color = ui->fvMarkedSample->palette().base().color();
     }
-    else if (sender() == ui->boxClrFg) {
-        palette.setColor(QPalette::Text, color);
+    else if (sender() == ui->fvSystem) {
+        color = ui->fvSystemSample->palette().text().color();
+    }
+    else if (sender() == ui->fvHidden) {
+        color = ui->fvHiddenSample->palette().text().color();
+    }
+    else if (sender() == ui->fvReadOnly) {
+        color = ui->fvReadOnlySample->palette().text().color();
+    }
+    else if (sender() == ui->lBoxBg) {
+        color = ui->lBoxSample->palette().base().color();
+    }
+    else if (sender() == ui->lBoxFg) {
+        color = ui->lBoxSample->palette().text().color();
+    }
+    else if (sender() == ui->sBoxNormal) {
+        color = ui->sBoxNormalSample->palette().text().color();
+    }
+    else if (sender() == ui->sBoxNormalBg) {
+        color = ui->sBoxNormalSample->palette().base().color();
+    }
+    else if (sender() == ui->sBoxUnmatch) {
+        color = ui->sBoxUnmatchSample->palette().text().color();
+    }
+    else if (sender() == ui->sBoxUnmatchBg) {
+        color = ui->sBoxUnmatchSample->palette().base().color();
+    }
+    else if (sender() == ui->tvBg) {
+        color = ui->tvSample->palette().base().color();
+    }
+    else if (sender() == ui->tvFg) {
+        color = ui->tvSample->palette().text().color();
+    }
+    else if (sender() == ui->gvBg) {
+        color = ui->gvSample->palette().base().color();
+    }
+    else if (sender() == ui->allBg) {
+        color = ui->fvNormalSample->palette().base().color();
+    }
+    else if (sender() == ui->allFg) {
+        color = ui->fvNormalSample->palette().text().color();
     }
-    ui->sampleEdit->setPalette(palette);
-}
-
-void PreferenceDialog::selectViewColor()
-{
-    const QString objName = sender()->objectName();
-    QColor color = m_colorMap[objName];
 
-    color = QColorDialog::getColor(color, this, tr("色選択"));
+    color = QColorDialog::getColor(color, this, tr("色選択"));
     if (!color.isValid()) {
         return;
     }
 
-    m_colorMap[objName] = color;
-    m_model.update();
+    QPalette pal;
+    if (sender() == ui->fvNormal) {
+        setPalette(ui->fvNormalSample, QPalette::Text, color);
+    }
+    else if (sender() == ui->fvNormalBg) {
+        setPalette(ui->fvNormalSample, QPalette::Base, color);
+        setPalette(ui->fvHiddenSample, QPalette::Base, color);
+        setPalette(ui->fvReadOnlySample, QPalette::Base, color);
+        setPalette(ui->fvSystemSample, QPalette::Base, color);
+    }
+    else if (sender() == ui->fvMarked) {
+        setPalette(ui->fvMarkedSample, QPalette::Text, color);
+    }
+    else if (sender() == ui->fvMarkedBg) {
+        setPalette(ui->fvMarkedSample, QPalette::Base, color);
+    }
+    else if (sender() == ui->fvSystem) {
+        setPalette(ui->fvSystemSample, QPalette::Text, color);
+    }
+    else if (sender() == ui->fvHidden) {
+        setPalette(ui->fvHiddenSample, QPalette::Text, color);
+    }
+    else if (sender() == ui->fvReadOnly) {
+        setPalette(ui->fvReadOnlySample, QPalette::Text, color);
+    }
+    else if (sender() == ui->lBoxBg) {
+        setPalette(ui->lBoxSample, QPalette::Base, color);
+    }
+    else if (sender() == ui->lBoxFg) {
+        setPalette(ui->lBoxSample, QPalette::Text, color);
+    }
+    else if (sender() == ui->sBoxNormal) {
+        setPalette(ui->sBoxNormalSample, QPalette::Text, color);
+    }
+    else if (sender() == ui->sBoxNormalBg) {
+        setPalette(ui->sBoxNormalSample, QPalette::Base, color);
+    }
+    else if (sender() == ui->sBoxUnmatch) {
+        setPalette(ui->sBoxUnmatchSample, QPalette::Text, color);
+    }
+    else if (sender() == ui->sBoxUnmatchBg) {
+        setPalette(ui->sBoxUnmatchSample, QPalette::Base, color);
+    }
+    else if (sender() == ui->tvBg) {
+        setPalette(ui->tvSample, QPalette::Base, color);
+    }
+    else if (sender() == ui->tvFg) {
+        setPalette(ui->tvSample, QPalette::Text, color);
+    }
+    else if (sender() == ui->gvBg) {
+        setPalette(ui->gvSample, QPalette::Base, color);
+    }
+    else if (sender() == ui->allBg) {
+        setPalette(ui->fvNormalSample, QPalette::Base, color);
+        setPalette(ui->fvHiddenSample, QPalette::Base, color);
+        setPalette(ui->fvReadOnlySample, QPalette::Base, color);
+        setPalette(ui->fvSystemSample, QPalette::Base, color);
+        setPalette(ui->lBoxSample, QPalette::Base, color);
+        setPalette(ui->sBoxNormalSample, QPalette::Base, color);
+        setPalette(ui->tvSample, QPalette::Base, color);
+        setPalette(ui->gvSample, QPalette::Base, color);
+    }
+    else if (sender() == ui->allFg) {
+        setPalette(ui->fvNormalSample, QPalette::Text, color);
+        setPalette(ui->lBoxSample, QPalette::Text, color);
+        setPalette(ui->sBoxNormalSample, QPalette::Text, color);
+        setPalette(ui->tvSample, QPalette::Text, color);
+    }
 }
 
-void PreferenceDialog::selectViewerColor()
+void PreferenceDialog::chooseFont()
 {
-    QColor color;
-    QPalette palette = ui->viewerSample->palette();
-    if (sender() == ui->viewerClrBg) {
-        color = palette.background().color();
+    QFont font;
+    if (sender() == ui->fvFont) {
+        font = ui->fvFontSpec->font();
+    }
+    else if (sender() == ui->lBoxFont) {
+        font = ui->lBoxFontSpec->font();
     }
-    else if (sender() == ui->viewerClrFg) {
-        color = palette.text().color();
+    else if (sender() == ui->sBoxFont) {
+        font = ui->sBoxFontSpec->font();
+    }
+    else if (sender() == ui->tvFont) {
+        font = ui->tvFontSpec->font();
+    }
+    else if (sender() == ui->allFont) {
+        font = ui->fvFontSpec->font();
     }
 
-    color = QColorDialog::getColor(color, this, tr("色選択"));
-    if (!color.isValid()) {
+    bool ok;
+    font = QFontDialog::getFont(&ok, font, this, tr("フォントを選択"));
+
+    if (!ok) {
         return;
     }
 
-    if (sender() == ui->viewerClrBg) {
-        palette.setColor(QPalette::Base, color);
+    if (sender() == ui->fvFont) {
+        setFont(ui->fvFontSpec, font);
+    }
+    else if (sender() == ui->lBoxFont) {
+        setFont(ui->lBoxFontSpec, font);
+    }
+    else if (sender() == ui->sBoxFont) {
+        setFont(ui->sBoxFontSpec, font);
     }
-    else if (sender() == ui->viewerClrFg) {
-        palette.setColor(QPalette::Text, color);
+    else if (sender() == ui->tvFont) {
+        setFont(ui->tvFontSpec, font);
+    }
+    else if (sender() == ui->allFont) {
+        setFont(ui->fvFontSpec, font);
+        setFont(ui->lBoxFontSpec, font);
+        setFont(ui->sBoxFontSpec, font);
+        setFont(ui->tvFontSpec, font);
     }
-    ui->viewerSample->setPalette(palette);
 }
 
-void PreferenceDialog::browseApp()
+void PreferenceDialog::choosePath()
 {
     QStringList list = QStandardPaths::standardLocations(
                 QStandardPaths::ApplicationsLocation);
@@ -449,134 +367,94 @@ void PreferenceDialog::browseApp()
                 this, tr("アプリケーションを選択"), list.at(0),
                 tr("すべてのファイル (*)"));
 #endif
-    if (!path.isEmpty()) {
-        if (path.indexOf(" ") != -1) {
-            path = QQ(path);
-        }
-
-        if (sender() == ui->browseEditor) {
-            ui->editorPath->setText(path);
-        }
-        else if (sender() == ui->browseTerminal) {
-            ui->terminalPath->setText(path);
-        }
-        else if (sender() == ui->browseArchiver) {
-            ui->archiverPath->setText(path);
-        }
+    if (path.isEmpty()) {
+        return;
+    }
+
+    if (path.indexOf(" ") != -1) {
+        path = QQ(path);
+    }
+
+    if (sender() == ui->browseEditor) {
+        ui->editorPath->setText(path);
+    }
+    else if (sender() == ui->browseTerminal) {
+        ui->terminalPath->setText(path);
+    }
+    else if (sender() == ui->browseArchiver) {
+        ui->archiverPath->setText(path);
     }
 }
 
-void PreferenceDialog::importAppearance()
+void PreferenceDialog::exportAppearance()
 {
     QStringList list = QStandardPaths::standardLocations(
                 QStandardPaths::DocumentsLocation);
-    QString path = QFileDialog::getOpenFileName(
-                this, tr("ファイルを選択"), list.at(0),
+    QString path = QFileDialog::getSaveFileName(
+                this, tr("ファイルを選択"), list.at(0) + "/gefu_appearance.ini",
                 tr("設定ファイル (*.ini);;すべてのファイル (*)"));
     if (path.isEmpty()) {
         return;
     }
 
-    QSettings settings(path, QSettings::IniFormat);
-    loadAppearance(settings, true);
+    Preferences prefs(path, this);
+    saveAppearance(prefs);
 }
 
-void PreferenceDialog::exportAppearance()
+void PreferenceDialog::importAppearance()
 {
     QStringList list = QStandardPaths::standardLocations(
                 QStandardPaths::DocumentsLocation);
-    QString path = QFileDialog::getSaveFileName(
-                this, tr("ファイルを選択"), list.at(0) + "/gefu_appearance.ini",
+    QString path = QFileDialog::getOpenFileName(
+                this, tr("ファイルを選択"), list.at(0),
                 tr("設定ファイル (*.ini);;すべてのファイル (*)"));
     if (path.isEmpty()) {
         return;
     }
 
-    QSettings settings(path, QSettings::IniFormat);
-    saveAppearance(settings);
+    Preferences prefs(path, this);
+    loadAppearance(prefs);
 }
 
 void PreferenceDialog::accept()
 {
-    QSettings settings;
-    QAbstractButton *selected;
-
-    //>>>>> 起動と終了
-    // 起動時のサイズ
-    if (!ui->bootSize->isChecked()) {
-        settings.setValue(IniKey_BootSizeSpec, "");
-    }
-    else {
-        selected = ui->sizeOptions->checkedButton();
-        settings.setValue(IniKey_BootSizeSpec, selected->objectName());
-        QSize size;
-        // 絶対指定
-        size = QSize(ui->absoluteWidth->value(), ui->absoluteHeight->value());
-        settings.setValue(IniKey_BootSizeAbs, size);
-        // 相対指定
-        size = QSize(ui->relativeWidth->value(), ui->relativeHeight->value());
-        settings.setValue(IniKey_BootSizeRel, size);
-    }
-    // 起動時の位置
-    if (!ui->bootPos->isChecked()) {
-        settings.setValue(IniKey_BootPosSpec, "");
-    }
-    else {
-        selected = ui->posOptions->checkedButton();
-        settings.setValue(IniKey_BootPosSpec, selected->objectName());
-        // 絶対指定
-        QPoint pos;
-        pos = QPoint(ui->absoluteLeft->value(), ui->absoluteTop->value());
-        settings.setValue(IniKey_BootPosAbs, pos);
-        // 相対指定
-        pos = QPoint(ui->relativeLeft->value(), ui->relativeTop->value());
-        settings.setValue(IniKey_BootPosRel, pos);
-    }
-    // 起動時の設定削除
-    settings.setValue(IniKey_ResetOnBoot, ui->resetOnBoot->isChecked());
-    // 終了時の確認ダイアログ
-    settings.setValue(IniKey_ConfirmExit, ui->confirmExit->isChecked());
-    // アップデートのチェック
-    settings.setValue(IniKey_CheckUpdates, ui->checkUpdates->isChecked());
-
-    //>>>>> 色とフォント
-    saveAppearance(settings);
-    settings.setValue(IniKey_Darkness, ui->dark->value());
-
-    //>>>>> ファイル操作
-    settings.setValue(IniKey_ConfirmCopy, ui->confirmCopy->isChecked());
-    settings.setValue(IniKey_ConfirmDelete, ui->confirmDelete->isChecked());
-    settings.setValue(IniKey_ConfirmMove, ui->confirmMove->isChecked());
-    settings.setValue(IniKey_ConfirmRename, ui->confirmRename->isChecked());
-
-    settings.setValue(IniKey_AutoCloseCopy, ui->autoCloseCopy->isChecked());
-    settings.setValue(IniKey_AutoCloseDelete, ui->autoCloseDelete->isChecked());
-    settings.setValue(IniKey_AutoCloseMove, ui->autoCloseMove->isChecked());
-    settings.setValue(IniKey_AutoCloseRename, ui->autoCloseRename->isChecked());
-
-    selected = ui->overwriteOptions->checkedButton();
-    settings.setValue(IniKey_DefaultOnCopy, selected->objectName());
-
-    settings.setValue(IniKey_MoveAfterCreateFolder, ui->moveAfterCreate->isChecked());
-    settings.setValue(IniKey_OpenAfterCreateFile, ui->openAfterCreate->isChecked());
-
-    //>>>>> パス設定
-    settings.setValue(IniKey_PathEditor, ui->editorPath->text().trimmed());
-    settings.setValue(IniKey_PathTerminal, ui->terminalPath->text().trimmed());
-    settings.setValue(IniKey_PathArchiver, ui->archiverPath->text().trimmed());
-
-    //>>>>> テキストビューア
-    settings.setValue(IniKey_ViewerFont, ui->viewerSample->font());
-    settings.setValue(IniKey_ViewerColorBg, ui->viewerSample->palette().base().color());
-    settings.setValue(IniKey_ViewerColorFg, ui->viewerSample->palette().text().color());
-    settings.setValue(IniKey_ViewerInherit, ui->viewerInherit->isChecked());
-    settings.setValue(IniKey_ViewerForceOpen, !ui->enableViewerIgnoreExt->isChecked());
-    QStringList list = ui->viewerIgnoreExt->toPlainText().split(",", QString::SkipEmptyParts);
-    QStringList::iterator it;
-    for (it = list.begin(); it != list.end(); it++) {
-        *it = it->trimmed();
-    }
-    settings.setValue(IniKey_ViewerIgnoreExt, list.join(","));
+    Preferences prefs(this);
+
+    // [全般]
+    prefs.setCheckUpdate(ui->checkUpdate->isChecked());
+    prefs.setConfirmQuit(ui->confirmQuit->isChecked());
+    prefs.setMoveAfterCreation(ui->moveAfterCreation->isChecked());
+    prefs.setOpenAfterCreation(ui->openAfterCreation->isChecked());
+    prefs.setConfirmCopy(ui->confirmCopy->isChecked());
+    prefs.setConfirmMove(ui->confirmMove->isChecked());
+    prefs.setConfirmDelete(ui->confirmDelete->isChecked());
+    prefs.setConfirmRename(ui->confirmRename->isChecked());
+    prefs.setAutoCloseCopy(ui->autoCloseCopy->isChecked());
+    prefs.setAutoCloseMove(ui->autoCloseMove->isChecked());
+    prefs.setAutoCloseDelete(ui->autoCloseDelete->isChecked());
+    prefs.setAutoCloseRename(ui->autoCloseRename->isChecked());
+
+    QAbstractButton *checked = ui->copyBehavior->checkedButton();
+    prefs.setCopyBehavior(checked->objectName().mid(2));
+
+    prefs.setPreferExtensions(ui->preferExtensions->toPlainText());
+
+    // [外観(色)]
+    saveAppearance(prefs);
+
+    // [外観(フォント)]
+    prefs.setFolderViewFont(ui->fvFontSpec->font());
+    prefs.setLocationBoxFont(ui->lBoxFontSpec->font());
+    prefs.setSearchBoxFont(ui->sBoxFontSpec->font());
+    prefs.setTextViewFont(ui->tvFontSpec->font());
+
+    prefs.setLineHeight(ui->lineHeight->value());
+
+    // [プログラムパス]
+    prefs.setEditorPath(ui->editorPath->text());
+    prefs.setTerminalPath(ui->terminalPath->text());
+    prefs.setArchiverPath(ui->archiverPath->text());
 
     QDialog::accept();
 }
+
index 9385208..0f7ab9c 100644 (file)
@@ -1,11 +1,9 @@
 #ifndef PREFERENCEDIALOG_H
 #define PREFERENCEDIALOG_H
 
-#include "colorsamplemodel.h"
-
 #include <QDialog>
-#include <QAbstractTableModel>
-#include <QSettings>
+#include <QLabel>
+class Preferences;
 
 namespace Ui {
 class PreferenceDialog;
@@ -21,22 +19,18 @@ public:
 
 private:
     Ui::PreferenceDialog *ui;
-    ColorSampleModel m_model;
-    ColorMap m_colorMap;
 
-    void saveAppearance(QSettings &settings);
-    void loadAppearance(QSettings &settings, bool import);
+    void    loadAppearance(Preferences &prefs);
+    void    saveAppearance(Preferences &prefs);
+    void    setFont(QLabel *label, const QFont &font);
+    void    setPalette(QWidget *w, QPalette::ColorRole role, const QColor &color);
 
 private slots:
-    void chooseFont();
-    void setControlsEnabled(bool enabled);
-    void setIgnoreExtDefault();
-    void selectBoxColor();
-    void selectViewColor();
-    void selectViewerColor();
-    void browseApp();
-    void importAppearance();
-    void exportAppearance();
+    void    chooseColor();
+    void    chooseFont();
+    void    choosePath();
+    void    exportAppearance();
+    void    importAppearance();
 
     // QDialog interface
 public slots:
index d9e4d19..052cd28 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>671</width>
-    <height>535</height>
+    <width>673</width>
+    <height>553</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -19,7 +19,7 @@
   <property name="windowTitle">
    <string>環境設定</string>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout_9">
+  <layout class="QVBoxLayout" name="verticalLayout_2">
    <item>
     <widget class="QTabWidget" name="tabWidget">
      <property name="font">
      <property name="focusPolicy">
       <enum>Qt::StrongFocus</enum>
      </property>
+     <property name="tabShape">
+      <enum>QTabWidget::Rounded</enum>
+     </property>
      <property name="currentIndex">
-      <number>4</number>
+      <number>0</number>
      </property>
-     <widget class="QWidget" name="tabBoot_Exit">
+     <widget class="QWidget" name="tabGeneral">
       <attribute name="title">
-       <string>起動と終了</string>
+       <string>全般</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout">
        <item>
-        <widget class="QGroupBox" name="bootSize">
-         <property name="title">
-          <string>起動時のウィンドウサイズを指定する</string>
+        <widget class="QCheckBox" name="checkUpdate">
+         <property name="focusPolicy">
+          <enum>Qt::StrongFocus</enum>
          </property>
-         <property name="flat">
-          <bool>true</bool>
+         <property name="text">
+          <string>起動時にアップデートを確認する</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QCheckBox" name="confirmQuit">
+         <property name="focusPolicy">
+          <enum>Qt::StrongFocus</enum>
          </property>
-         <property name="checkable">
-          <bool>true</bool>
+         <property name="text">
+          <string>終了時に確認ダイアログを表示する</string>
          </property>
-         <layout class="QHBoxLayout" name="horizontalLayout_9">
-          <item>
-           <layout class="QGridLayout" name="gridLayout_2">
+        </widget>
+       </item>
+       <item>
+        <widget class="QCheckBox" name="moveAfterCreation">
+         <property name="focusPolicy">
+          <enum>Qt::StrongFocus</enum>
+         </property>
+         <property name="text">
+          <string>フォルダ作成後は、そのフォルダに移動する</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QCheckBox" name="openAfterCreation">
+         <property name="focusPolicy">
+          <enum>Qt::StrongFocus</enum>
+         </property>
+         <property name="text">
+          <string>ファイル作成後は、そのファイルを外部エディタで開く</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_26">
+         <item>
+          <widget class="QGroupBox" name="groupBox_12">
+           <property name="title">
+            <string>操作の開始時、確認ダイアログを表示する</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_27">
             <property name="spacing">
              <number>-1</number>
             </property>
-            <item row="0" column="0">
-             <widget class="QRadioButton" name="sizeAbsolute">
-              <property name="minimumSize">
-               <size>
-                <width>0</width>
-                <height>24</height>
-               </size>
-              </property>
+            <property name="leftMargin">
+             <number>12</number>
+            </property>
+            <property name="topMargin">
+             <number>12</number>
+            </property>
+            <property name="rightMargin">
+             <number>12</number>
+            </property>
+            <property name="bottomMargin">
+             <number>12</number>
+            </property>
+            <item>
+             <widget class="QCheckBox" name="confirmCopy">
               <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 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="suffix">
-                 <string> px</string>
-                </property>
-                <property name="maximum">
-                 <number>9999</number>
-                </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="suffix">
-                 <string> px</string>
-                </property>
-                <property name="maximum">
-                 <number>9999</number>
-                </property>
-               </widget>
-              </item>
-             </layout>
+            <item>
+             <widget class="QCheckBox" name="confirmMove">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>移動</string>
+              </property>
+             </widget>
             </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>
+            <item>
+             <widget class="QCheckBox" name="confirmDelete">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
               </property>
-              <property name="minimumSize">
-               <size>
-                <width>0</width>
-                <height>24</height>
-               </size>
+              <property name="text">
+               <string>削除</string>
               </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="confirmRename">
               <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 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="suffix">
-                 <string> %</string>
-                </property>
-                <property name="maximum">
-                 <number>100</number>
-                </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>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="groupBox_13">
+           <property name="title">
+            <string>操作の成功時、進捗ダイアログを自動で閉じる</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_33">
+            <property name="spacing">
+             <number>-1</number>
+            </property>
+            <property name="leftMargin">
+             <number>12</number>
+            </property>
+            <property name="topMargin">
+             <number>12</number>
+            </property>
+            <property name="rightMargin">
+             <number>12</number>
+            </property>
+            <property name="bottomMargin">
+             <number>12</number>
+            </property>
+            <item>
+             <widget class="QCheckBox" name="autoCloseCopy">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>コピー</string>
+              </property>
+             </widget>
             </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="suffix">
-                 <string> %</string>
-                </property>
-                <property name="prefix">
-                 <string/>
-                </property>
-                <property name="maximum">
-                 <number>100</number>
-                </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>
+             <widget class="QCheckBox" name="autoCloseMove">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>移動</string>
+              </property>
+             </widget>
             </item>
-            <item row="2" column="0" colspan="2">
-             <widget class="QRadioButton" name="sizeLast">
-              <property name="minimumSize">
-               <size>
-                <width>0</width>
-                <height>24</height>
-               </size>
+            <item>
+             <widget class="QCheckBox" name="autoCloseDelete">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
               </property>
+              <property name="text">
+               <string>削除</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="autoCloseRename">
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>å\89\8då\9b\9eçµ\82äº\86æ\99\82ã\81®ã\82µã\82¤ã\82º</string>
+               <string>å\90\8då\89\8då¤\89æ\9b´</string>
               </property>
-              <attribute name="buttonGroup">
-               <string notr="true">sizeOptions</string>
-              </attribute>
              </widget>
             </item>
            </layout>
-          </item>
-          <item>
-           <spacer name="horizontalSpacer">
-            <property name="orientation">
-             <enum>Qt::Horizontal</enum>
-            </property>
-            <property name="sizeHint" stdset="0">
-             <size>
-              <width>95</width>
-              <height>20</height>
-             </size>
-            </property>
-           </spacer>
-          </item>
-         </layout>
-        </widget>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_11">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>1</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
        </item>
        <item>
-        <widget class="QGroupBox" name="bootPos">
-         <property name="title">
-          <string>起動時のウィンドウ位置を指定する</string>
-         </property>
-         <property name="flat">
-          <bool>true</bool>
-         </property>
-         <property name="checkable">
-          <bool>true</bool>
-         </property>
-         <layout class="QHBoxLayout" name="horizontalLayout_10">
-          <item>
-           <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>
+        <layout class="QHBoxLayout" name="horizontalLayout">
+         <item>
+          <widget class="QGroupBox" name="groupBox_14">
+           <property name="title">
+            <string>同名ファイル存在時の既定の動作</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_34">
+            <item>
+             <widget class="QRadioButton" name="rbOverWrite">
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>絶対指定</string>
+               <string>上書き</string>
               </property>
               <attribute name="buttonGroup">
-               <string notr="true">posOptions</string>
+               <string notr="true">copyBehavior</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="suffix">
-                 <string> px</string>
-                </property>
-                <property name="maximum">
-                 <number>9999</number>
-                </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="suffix">
-                 <string> px</string>
-                </property>
-                <property name="maximum">
-                 <number>9999</number>
-                </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>
+            <item>
+             <widget class="QRadioButton" name="rbOverWriteIfNew">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>新しければ上書き</string>
               </property>
+              <attribute name="buttonGroup">
+               <string notr="true">copyBehavior</string>
+              </attribute>
+             </widget>
+            </item>
+            <item>
+             <widget class="QRadioButton" name="rbSkip">
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>相対指定</string>
+               <string>スキップ</string>
               </property>
               <attribute name="buttonGroup">
-               <string notr="true">posOptions</string>
+               <string notr="true">copyBehavior</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="suffix">
-                 <string> %</string>
-                </property>
-                <property name="maximum">
-                 <number>100</number>
-                </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="suffix">
-                 <string> %</string>
-                </property>
-                <property name="maximum">
-                 <number>100</number>
-                </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>
+            <item>
+             <widget class="QRadioButton" name="rbAppendNumber">
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>画面中央</string>
+               <string>ファイル名末尾に数字を付与</string>
               </property>
               <attribute name="buttonGroup">
-               <string notr="true">posOptions</string>
+               <string notr="true">copyBehavior</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>
+            <item>
+             <widget class="QRadioButton" name="rbRename">
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>å\89\8då\9b\9eçµ\82äº\86æ\99\82ã\81®ä½\8dç½®</string>
+               <string>å\90\8då\89\8dã\82\92å¤\89æ\9b´</string>
               </property>
               <attribute name="buttonGroup">
-               <string notr="true">posOptions</string>
+               <string notr="true">copyBehavior</string>
               </attribute>
              </widget>
             </item>
            </layout>
-          </item>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_14">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>1</width>
+             <height>41</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="groupBox_5">
+         <property name="title">
+          <string>外部アプリを優先する拡張子</string>
+         </property>
+         <layout class="QHBoxLayout" name="horizontalLayout_2">
           <item>
-           <spacer name="horizontalSpacer_4">
-            <property name="orientation">
-             <enum>Qt::Horizontal</enum>
-            </property>
-            <property name="sizeHint" stdset="0">
-             <size>
-              <width>40</width>
-              <height>20</height>
-             </size>
-            </property>
-           </spacer>
+           <widget class="QPlainTextEdit" name="preferExtensions"/>
           </item>
          </layout>
         </widget>
        </item>
        <item>
-        <widget class="QCheckBox" name="checkUpdates">
-         <property name="focusPolicy">
-          <enum>Qt::StrongFocus</enum>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
          </property>
-         <property name="text">
-          <string>起動時にアップデートを確認する</string>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>0</height>
+          </size>
          </property>
-        </widget>
+        </spacer>
        </item>
        <item>
         <widget class="QCheckBox" name="resetOnBoot">
          </property>
         </widget>
        </item>
-       <item>
-        <widget class="QCheckBox" name="confirmExit">
-         <property name="focusPolicy">
-          <enum>Qt::StrongFocus</enum>
-         </property>
-         <property name="text">
-          <string>終了時に確認ダイアログを表示する</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <spacer name="verticalSpacer">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>45</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
       </layout>
      </widget>
-     <widget class="QWidget" name="tabAppearance">
+     <widget class="QWidget" name="tabAppearance1">
       <attribute name="title">
-       <string>色とフォント</string>
+       <string>外観(色)</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_4">
        <item>
-        <widget class="QGroupBox" name="groupBox">
+        <widget class="QGroupBox" name="groupBox_2">
          <property name="title">
-          <string>ã\82¢ã\83\89ã\83¬ã\82¹ã\83\9cã\83\83ã\82¯ã\82¹</string>
+          <string>ã\83\95ã\82©ã\83«ã\83\80ã\83\93ã\83¥ã\83¼</string>
          </property>
-         <layout class="QVBoxLayout" name="verticalLayout_2">
-          <property name="spacing">
-           <number>0</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>
+         <layout class="QHBoxLayout" name="horizontalLayout_3">
           <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_16">
-            <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_17">
+           <layout class="QGridLayout" name="gridLayout_6">
+            <item row="0" column="0">
+             <widget class="QPushButton" name="fvNormal">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="minimumSize">
+               <size>
+                <width>100</width>
+                <height>0</height>
+               </size>
+              </property>
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
               <property name="text">
-               <string>フォント:</string>
+               <string>通 常</string>
               </property>
              </widget>
             </item>
-            <item>
-             <widget class="QLabel" name="boxFont">
+            <item row="0" column="1" colspan="2">
+             <widget class="QLineEdit" name="fvNormalSample">
+              <property name="focusPolicy">
+               <enum>Qt::NoFocus</enum>
+              </property>
               <property name="text">
-               <string>font family, point</string>
+               <string>Normal</string>
+              </property>
+              <property name="readOnly">
+               <bool>true</bool>
               </property>
              </widget>
             </item>
-            <item>
-             <widget class="QPushButton" name="chooseBoxFont">
+            <item row="1" column="0">
+             <widget class="QPushButton" name="fvMarked">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="minimumSize">
+               <size>
+                <width>100</width>
+                <height>0</height>
+               </size>
+              </property>
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>選択</string>
+               <string> マーク </string>
               </property>
              </widget>
             </item>
-            <item>
-             <spacer name="horizontalSpacer_13">
+            <item row="1" column="1" colspan="2">
+             <widget class="QLineEdit" name="fvMarkedSample">
+              <property name="focusPolicy">
+               <enum>Qt::NoFocus</enum>
+              </property>
+              <property name="text">
+               <string>Marked</string>
+              </property>
+              <property name="readOnly">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="0">
+             <spacer name="horizontalSpacer">
               <property name="orientation">
                <enum>Qt::Horizontal</enum>
               </property>
               <property name="sizeHint" stdset="0">
                <size>
-                <width>40</width>
+                <width>85</width>
                 <height>20</height>
                </size>
               </property>
              </spacer>
             </item>
-            <item>
-             <widget class="QPushButton" name="boxClrFg">
+            <item row="2" column="1">
+             <widget class="QPushButton" name="fvNormalBg">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>背景</string>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="2">
+             <widget class="QPushButton" name="fvMarkedBg">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>マーク背景</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QGridLayout" name="gridLayout_2">
+            <item row="0" column="0">
+             <widget class="QPushButton" name="fvSystem">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
                 <horstretch>0</horstretch>
                 <verstretch>0</verstretch>
                </sizepolicy>
               </property>
+              <property name="minimumSize">
+               <size>
+                <width>100</width>
+                <height>0</height>
+               </size>
+              </property>
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>文字色</string>
+               <string>システム</string>
               </property>
              </widget>
             </item>
-            <item>
-             <widget class="QPushButton" name="boxClrBg">
+            <item row="0" column="1">
+             <widget class="QLineEdit" name="fvSystemSample">
+              <property name="focusPolicy">
+               <enum>Qt::NoFocus</enum>
+              </property>
+              <property name="text">
+               <string>System</string>
+              </property>
+              <property name="readOnly">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QPushButton" name="fvHidden">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="minimumSize">
+               <size>
+                <width>100</width>
+                <height>0</height>
+               </size>
+              </property>
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>背景色</string>
+               <string>隠し属性</string>
               </property>
              </widget>
             </item>
-           </layout>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_17">
-            <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="QLineEdit" name="sampleEdit">
+            <item row="2" column="0">
+             <widget class="QPushButton" name="fvReadOnly">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="minimumSize">
+               <size>
+                <width>100</width>
+                <height>0</height>
+               </size>
+              </property>
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>読取専用</string>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="1">
+             <widget class="QLineEdit" name="fvReadOnlySample">
+              <property name="focusPolicy">
+               <enum>Qt::NoFocus</enum>
+              </property>
+              <property name="text">
+               <string>ReadOnly</string>
+              </property>
+              <property name="readOnly">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item row="1" column="1">
+             <widget class="QLineEdit" name="fvHiddenSample">
+              <property name="focusPolicy">
+               <enum>Qt::NoFocus</enum>
+              </property>
               <property name="text">
-               <string>サンプルテキスト</string>
+               <string>Hidden</string>
+              </property>
+              <property name="readOnly">
+               <bool>true</bool>
               </property>
              </widget>
             </item>
         </widget>
        </item>
        <item>
-        <widget class="QGroupBox" name="groupBox_2">
-         <property name="title">
-          <string>ファイルビュー</string>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_3">
-          <property name="spacing">
-           <number>0</number>
-          </property>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_21">
-            <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">
+        <layout class="QHBoxLayout" name="horizontalLayout_5">
+         <item>
+          <widget class="QGroupBox" name="groupBox">
+           <property name="title">
+            <string>ロケーションボックス</string>
+           </property>
+           <layout class="QGridLayout" name="gridLayout_3">
+            <property name="verticalSpacing">
              <number>4</number>
             </property>
-            <item>
-             <widget class="QLabel" name="label_23">
+            <item row="0" column="1">
+             <widget class="QPushButton" name="lBoxBg">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
               <property name="text">
-               <string>フォント:</string>
+               <string>背景</string>
               </property>
              </widget>
             </item>
-            <item>
-             <widget class="QLabel" name="viewFont">
+            <item row="0" column="0">
+             <widget class="QPushButton" name="lBoxFg">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
               <property name="text">
-               <string>font family, point</string>
+               <string>文字</string>
               </property>
              </widget>
             </item>
-            <item>
-             <widget class="QPushButton" name="chooseViewFont">
+            <item row="1" column="0" colspan="2">
+             <widget class="QLineEdit" name="lBoxSample">
               <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
+               <enum>Qt::NoFocus</enum>
               </property>
-              <property name="text">
-               <string>選択</string>
+              <property name="readOnly">
+               <bool>true</bool>
               </property>
              </widget>
             </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="groupBox_6">
+           <property name="title">
+            <string>検索ボックス</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_4">
             <item>
-             <spacer name="horizontalSpacer_12">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>40</width>
-                <height>20</height>
-               </size>
+             <layout class="QGridLayout" name="gridLayout">
+              <property name="verticalSpacing">
+               <number>4</number>
               </property>
-             </spacer>
+              <item row="0" column="0">
+               <widget class="QLabel" name="label">
+                <property name="text">
+                 <string>通 常</string>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="1">
+               <widget class="QPushButton" name="sBoxNormal">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="minimumSize">
+                 <size>
+                  <width>0</width>
+                  <height>0</height>
+                 </size>
+                </property>
+                <property name="focusPolicy">
+                 <enum>Qt::StrongFocus</enum>
+                </property>
+                <property name="text">
+                 <string>文字</string>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="2">
+               <widget class="QPushButton" name="sBoxNormalBg">
+                <property name="minimumSize">
+                 <size>
+                  <width>0</width>
+                  <height>0</height>
+                 </size>
+                </property>
+                <property name="focusPolicy">
+                 <enum>Qt::StrongFocus</enum>
+                </property>
+                <property name="text">
+                 <string>背景</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="0" colspan="3">
+               <widget class="QLineEdit" name="sBoxNormalSample">
+                <property name="focusPolicy">
+                 <enum>Qt::NoFocus</enum>
+                </property>
+                <property name="text">
+                 <string>abc123あいう</string>
+                </property>
+                <property name="readOnly">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+             </layout>
             </item>
             <item>
-             <widget class="QPushButton" name="clrFgNormal">
+             <layout class="QGridLayout" name="gridLayout_4">
+              <property name="verticalSpacing">
+               <number>4</number>
+              </property>
+              <item row="0" column="0">
+               <widget class="QLabel" name="label_2">
+                <property name="text">
+                 <string>不一致</string>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="1">
+               <widget class="QPushButton" name="sBoxUnmatch">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="minimumSize">
+                 <size>
+                  <width>0</width>
+                  <height>0</height>
+                 </size>
+                </property>
+                <property name="focusPolicy">
+                 <enum>Qt::StrongFocus</enum>
+                </property>
+                <property name="text">
+                 <string>文字</string>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="2">
+               <widget class="QPushButton" name="sBoxUnmatchBg">
+                <property name="minimumSize">
+                 <size>
+                  <width>0</width>
+                  <height>0</height>
+                 </size>
+                </property>
+                <property name="focusPolicy">
+                 <enum>Qt::StrongFocus</enum>
+                </property>
+                <property name="text">
+                 <string>背景</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="0" colspan="3">
+               <widget class="QLineEdit" name="sBoxUnmatchSample">
+                <property name="focusPolicy">
+                 <enum>Qt::NoFocus</enum>
+                </property>
+                <property name="text">
+                 <string>abc123あいう</string>
+                </property>
+                <property name="readOnly">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>13</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_8">
+         <item>
+          <widget class="QGroupBox" name="groupBox_3">
+           <property name="title">
+            <string>内蔵テキストビューア</string>
+           </property>
+           <layout class="QGridLayout" name="gridLayout_5">
+            <property name="verticalSpacing">
+             <number>4</number>
+            </property>
+            <item row="0" column="0">
+             <widget class="QPushButton" name="tvFg">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>文字</string>
+               <string>文字</string>
               </property>
              </widget>
             </item>
-            <item>
-             <widget class="QPushButton" name="clrBgNormal">
+            <item row="0" column="1">
+             <widget class="QPushButton" name="tvBg">
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>背景</string>
+               <string>背景</string>
               </property>
              </widget>
             </item>
-           </layout>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_14">
-            <property name="spacing">
-             <number>-1</number>
-            </property>
-            <item>
-             <widget class="QGroupBox" name="groupBox_3">
-              <property name="title">
-               <string>文字色</string>
-              </property>
-              <layout class="QHBoxLayout" name="horizontalLayout_13">
-               <property name="topMargin">
-                <number>12</number>
-               </property>
-               <item>
-                <widget class="QPushButton" name="clrFgSystem">
-                 <property name="sizePolicy">
-                  <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-                   <horstretch>0</horstretch>
-                   <verstretch>0</verstretch>
-                  </sizepolicy>
-                 </property>
-                 <property name="minimumSize">
-                  <size>
-                   <width>100</width>
-                   <height>0</height>
-                  </size>
-                 </property>
-                 <property name="focusPolicy">
-                  <enum>Qt::StrongFocus</enum>
-                 </property>
-                 <property name="text">
-                  <string>システム</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QPushButton" name="clrFgMark">
-                 <property name="sizePolicy">
-                  <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-                   <horstretch>0</horstretch>
-                   <verstretch>0</verstretch>
-                  </sizepolicy>
-                 </property>
-                 <property name="minimumSize">
-                  <size>
-                   <width>100</width>
-                   <height>0</height>
-                  </size>
-                 </property>
-                 <property name="focusPolicy">
-                  <enum>Qt::StrongFocus</enum>
-                 </property>
-                 <property name="text">
-                  <string> マーク </string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QPushButton" name="clrFgHidden">
-                 <property name="sizePolicy">
-                  <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-                   <horstretch>0</horstretch>
-                   <verstretch>0</verstretch>
-                  </sizepolicy>
-                 </property>
-                 <property name="minimumSize">
-                  <size>
-                   <width>100</width>
-                   <height>0</height>
-                  </size>
-                 </property>
-                 <property name="focusPolicy">
-                  <enum>Qt::StrongFocus</enum>
-                 </property>
-                 <property name="text">
-                  <string>隠し属性</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QPushButton" name="clrFgReadonly">
-                 <property name="sizePolicy">
-                  <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-                   <horstretch>0</horstretch>
-                   <verstretch>0</verstretch>
-                  </sizepolicy>
-                 </property>
-                 <property name="minimumSize">
-                  <size>
-                   <width>100</width>
-                   <height>0</height>
-                  </size>
-                 </property>
-                 <property name="focusPolicy">
-                  <enum>Qt::StrongFocus</enum>
-                 </property>
-                 <property name="text">
-                  <string>読取専用</string>
-                 </property>
-                </widget>
-               </item>
-              </layout>
-             </widget>
-            </item>
-            <item>
-             <spacer name="horizontalSpacer_9">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
+            <item row="1" column="0" colspan="2">
+             <widget class="QLineEdit" name="tvSample">
+              <property name="focusPolicy">
+               <enum>Qt::NoFocus</enum>
               </property>
-              <property name="sizeType">
-               <enum>QSizePolicy::Fixed</enum>
+              <property name="text">
+               <string>abc123あいう</string>
               </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>10</width>
-                <height>20</height>
-               </size>
+              <property name="readOnly">
+               <bool>true</bool>
               </property>
-             </spacer>
-            </item>
-            <item>
-             <widget class="QGroupBox" name="groupBox_4">
-              <property name="title">
-               <string>背景色</string>
-              </property>
-              <layout class="QHBoxLayout" name="horizontalLayout_20">
-               <item>
-                <widget class="QPushButton" name="clrBgMark">
-                 <property name="focusPolicy">
-                  <enum>Qt::StrongFocus</enum>
-                 </property>
-                 <property name="text">
-                  <string>マーク</string>
-                 </property>
-                </widget>
-               </item>
-              </layout>
              </widget>
             </item>
-            <item>
-             <spacer name="horizontalSpacer_3">
-              <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_11">
-            <item>
-             <widget class="QLabel" name="label_18">
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="groupBox_4">
+           <property name="title">
+            <string>内蔵画像ビューア</string>
+           </property>
+           <layout class="QGridLayout" name="gridLayout_7">
+            <property name="verticalSpacing">
+             <number>4</number>
+            </property>
+            <item row="0" column="0">
+             <widget class="QPushButton" name="gvBg">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
               <property name="text">
-               <string>非アクティブパネルの暗さ(0〜100)</string>
+               <string>背景</string>
               </property>
              </widget>
             </item>
-            <item>
-             <widget class="QSpinBox" name="dark">
-              <property name="prefix">
-               <string/>
+            <item row="1" column="0">
+             <widget class="QLineEdit" name="gvSample">
+              <property name="focusPolicy">
+               <enum>Qt::NoFocus</enum>
               </property>
-              <property name="maximum">
-               <number>100</number>
+              <property name="readOnly">
+               <bool>true</bool>
               </property>
              </widget>
             </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>
-          <item>
-           <widget class="QTableView" name="sampleTable">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="minimumSize">
-             <size>
-              <width>0</width>
-              <height>100</height>
-             </size>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>16777215</width>
-              <height>100</height>
-             </size>
-            </property>
-            <property name="focusPolicy">
-             <enum>Qt::ClickFocus</enum>
-            </property>
-            <property name="selectionMode">
-             <enum>QAbstractItemView::SingleSelection</enum>
-            </property>
-            <property name="selectionBehavior">
-             <enum>QAbstractItemView::SelectRows</enum>
-            </property>
-            <property name="textElideMode">
-             <enum>Qt::ElideMiddle</enum>
-            </property>
-            <property name="showGrid">
-             <bool>false</bool>
-            </property>
-            <property name="wordWrap">
-             <bool>false</bool>
-            </property>
-            <attribute name="horizontalHeaderVisible">
-             <bool>false</bool>
-            </attribute>
-            <attribute name="verticalHeaderVisible">
-             <bool>false</bool>
-            </attribute>
-           </widget>
-          </item>
-         </layout>
-        </widget>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>13</width>
+             <height>17</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <layout class="QVBoxLayout" name="verticalLayout_3">
+           <item>
+            <widget class="QPushButton" name="allFg">
+             <property name="focusPolicy">
+              <enum>Qt::StrongFocus</enum>
+             </property>
+             <property name="text">
+              <string>全ての通常文字を一括指定</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QPushButton" name="allBg">
+             <property name="focusPolicy">
+              <enum>Qt::StrongFocus</enum>
+             </property>
+             <property name="text">
+              <string>全ての通常背景を一括指定</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+        </layout>
        </item>
        <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_28">
-         <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>
+        <layout class="QHBoxLayout" name="horizontalLayout_6">
          <item>
-          <widget class="QPushButton" name="importAppearance">
-           <property name="focusPolicy">
-            <enum>Qt::StrongFocus</enum>
-           </property>
+          <widget class="QLabel" name="label_3">
            <property name="text">
-            <string>インポート</string>
+            <string>非アクティブパネルの暗さ(0〜1)</string>
            </property>
           </widget>
          </item>
          <item>
-          <widget class="QPushButton" name="exportAppearance">
-           <property name="focusPolicy">
-            <enum>Qt::StrongFocus</enum>
+          <widget class="QDoubleSpinBox" name="darkFactor">
+           <property name="maximum">
+            <double>1.000000000000000</double>
            </property>
-           <property name="text">
-            <string>エクスポート</string>
+           <property name="singleStep">
+            <double>0.010000000000000</double>
            </property>
           </widget>
          </item>
          <item>
-          <spacer name="horizontalSpacer_17">
+          <spacer name="horizontalSpacer_5">
            <property name="orientation">
             <enum>Qt::Horizontal</enum>
            </property>
            <property name="sizeHint" stdset="0">
             <size>
-             <width>40</width>
-             <height>20</height>
+             <width>13</width>
+             <height>17</height>
             </size>
            </property>
           </spacer>
          <property name="sizeHint" stdset="0">
           <size>
            <width>20</width>
-           <height>1</height>
+           <height>0</height>
           </size>
          </property>
         </spacer>
        </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tabOperation">
-      <attribute name="title">
-       <string>ファイル操作</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_6">
        <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_12">
+        <layout class="QHBoxLayout" name="horizontalLayout_7">
          <item>
-          <widget class="QGroupBox" name="groupBox_5">
-           <property name="title">
-            <string>操作の開始時、確認ダイアログを表示する</string>
+          <widget class="QPushButton" name="importAppearance">
+           <property name="focusPolicy">
+            <enum>Qt::StrongFocus</enum>
+           </property>
+           <property name="text">
+            <string>インポート</string>
            </property>
-           <layout class="QHBoxLayout" name="horizontalLayout_24">
-            <property name="spacing">
-             <number>-1</number>
-            </property>
-            <property name="leftMargin">
-             <number>12</number>
-            </property>
-            <property name="topMargin">
-             <number>12</number>
-            </property>
-            <property name="rightMargin">
-             <number>12</number>
-            </property>
-            <property name="bottomMargin">
-             <number>12</number>
-            </property>
-            <item>
-             <widget class="QCheckBox" name="confirmCopy">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>コピー</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QCheckBox" name="confirmMove">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>移動</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QCheckBox" name="confirmDelete">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>削除</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QCheckBox" name="confirmRename">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>名前変更</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
           </widget>
          </item>
          <item>
-          <widget class="QGroupBox" name="groupBox_6">
-           <property name="title">
-            <string>操作の成功時、進捗ダイアログを自動で閉じる</string>
+          <widget class="QPushButton" name="exportAppearance">
+           <property name="focusPolicy">
+            <enum>Qt::StrongFocus</enum>
+           </property>
+           <property name="text">
+            <string>エクスポート</string>
            </property>
-           <layout class="QHBoxLayout" name="horizontalLayout_25">
-            <property name="spacing">
-             <number>-1</number>
-            </property>
-            <property name="leftMargin">
-             <number>12</number>
-            </property>
-            <property name="topMargin">
-             <number>12</number>
-            </property>
-            <property name="rightMargin">
-             <number>12</number>
-            </property>
-            <property name="bottomMargin">
-             <number>12</number>
-            </property>
-            <item>
-             <widget class="QCheckBox" name="autoCloseCopy">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>コピー</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QCheckBox" name="autoCloseMove">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>移動</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QCheckBox" name="autoCloseDelete">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>削除</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QCheckBox" name="autoCloseRename">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>名前変更</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
           </widget>
          </item>
          <item>
-          <spacer name="horizontalSpacer_10">
+          <spacer name="horizontalSpacer_4">
            <property name="orientation">
             <enum>Qt::Horizontal</enum>
            </property>
          </item>
         </layout>
        </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="tabAppearance2">
+      <attribute name="title">
+       <string>外観(フォント)</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_5">
        <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_15">
-         <item>
-          <widget class="QGroupBox" name="groupBox_7">
-           <property name="title">
-            <string>同名ファイル存在時の既定の動作</string>
+        <layout class="QGridLayout" name="gridLayout_8">
+         <item row="0" column="0">
+          <widget class="QPushButton" name="fvFont">
+           <property name="focusPolicy">
+            <enum>Qt::StrongFocus</enum>
+           </property>
+           <property name="text">
+            <string>フォルダビューのフォント</string>
+           </property>
+          </widget>
+         </item>
+         <item row="0" column="1" colspan="2">
+          <widget class="QLabel" name="fvFontSpec">
+           <property name="text">
+            <string>font family, point</string>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="0">
+          <widget class="QPushButton" name="lBoxFont">
+           <property name="focusPolicy">
+            <enum>Qt::StrongFocus</enum>
+           </property>
+           <property name="text">
+            <string>ロケーションボックスのフォント</string>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="1" colspan="2">
+          <widget class="QLabel" name="lBoxFontSpec">
+           <property name="text">
+            <string>font family, point</string>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="0">
+          <widget class="QPushButton" name="sBoxFont">
+           <property name="focusPolicy">
+            <enum>Qt::StrongFocus</enum>
+           </property>
+           <property name="text">
+            <string>検索ボックスのフォント</string>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="1" colspan="2">
+          <widget class="QLabel" name="sBoxFontSpec">
+           <property name="text">
+            <string>font family, point</string>
            </property>
-           <layout class="QHBoxLayout" name="horizontalLayout_18">
-            <item>
-             <widget class="QRadioButton" name="rbOverWrite">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>上書き</string>
-              </property>
-              <attribute name="buttonGroup">
-               <string notr="true">overwriteOptions</string>
-              </attribute>
-             </widget>
-            </item>
-            <item>
-             <widget class="QRadioButton" name="rbOverWriteIfNew">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>新しければ上書き</string>
-              </property>
-              <attribute name="buttonGroup">
-               <string notr="true">overwriteOptions</string>
-              </attribute>
-             </widget>
-            </item>
-            <item>
-             <widget class="QRadioButton" name="rbSkip">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>スキップ</string>
-              </property>
-              <attribute name="buttonGroup">
-               <string notr="true">overwriteOptions</string>
-              </attribute>
-             </widget>
-            </item>
-            <item>
-             <widget class="QRadioButton" name="rbAppendNumber">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>ファイル名末尾に数字を付与</string>
-              </property>
-              <attribute name="buttonGroup">
-               <string notr="true">overwriteOptions</string>
-              </attribute>
-             </widget>
-            </item>
-            <item>
-             <widget class="QRadioButton" name="rbRename">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>名前を変更</string>
-              </property>
-              <attribute name="buttonGroup">
-               <string notr="true">overwriteOptions</string>
-              </attribute>
-             </widget>
-            </item>
-           </layout>
           </widget>
          </item>
+         <item row="3" column="0">
+          <widget class="QPushButton" name="tvFont">
+           <property name="focusPolicy">
+            <enum>Qt::StrongFocus</enum>
+           </property>
+           <property name="text">
+            <string>内蔵テキストビューアのフォント</string>
+           </property>
+          </widget>
+         </item>
+         <item row="3" column="1" colspan="2">
+          <widget class="QLabel" name="tvFontSpec">
+           <property name="text">
+            <string>font family, point</string>
+           </property>
+          </widget>
+         </item>
+         <item row="4" column="0">
+          <widget class="QLabel" name="label_4">
+           <property name="text">
+            <string>フォルダビューの行の高さ(1〜2)</string>
+           </property>
+          </widget>
+         </item>
+         <item row="4" column="1">
+          <widget class="QDoubleSpinBox" name="lineHeight">
+           <property name="decimals">
+            <number>2</number>
+           </property>
+           <property name="minimum">
+            <double>1.000000000000000</double>
+           </property>
+           <property name="maximum">
+            <double>2.000000000000000</double>
+           </property>
+           <property name="singleStep">
+            <double>0.010000000000000</double>
+           </property>
+           <property name="value">
+            <double>1.500000000000000</double>
+           </property>
+          </widget>
+         </item>
+         <item row="4" column="2">
+          <spacer name="horizontalSpacer_6">
+           <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>
-        <widget class="QCheckBox" name="moveAfterCreate">
-         <property name="focusPolicy">
-          <enum>Qt::StrongFocus</enum>
+        <spacer name="verticalSpacer_7">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
          </property>
-         <property name="text">
-          <string>フォルダ作成後は、そのフォルダに移動する</string>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>223</height>
+          </size>
          </property>
-        </widget>
+        </spacer>
        </item>
        <item>
-        <widget class="QCheckBox" name="openAfterCreate">
+        <widget class="QPushButton" name="allFont">
          <property name="focusPolicy">
           <enum>Qt::StrongFocus</enum>
          </property>
          <property name="text">
-          <string>ファイル作成後は、そのファイルをエディタで開く</string>
+          <string>全てのフォントを一括指定</string>
          </property>
         </widget>
        </item>
-       <item>
-        <spacer name="verticalSpacer_3">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>102</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tabPath">
       <attribute name="title">
-       <string>ã\83\91ã\82¹è¨­å®\9a</string>
+       <string>ã\83\97ã\83­ã\82°ã\83©ã\83 ã\83\91ã\82¹</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_7">
        <item>
           </item>
           <item>
            <widget class="QPushButton" name="browseEditor">
+            <property name="focusPolicy">
+             <enum>Qt::StrongFocus</enum>
+            </property>
             <property name="text">
              <string>参照</string>
             </property>
           </item>
           <item>
            <widget class="QPushButton" name="browseTerminal">
+            <property name="focusPolicy">
+             <enum>Qt::StrongFocus</enum>
+            </property>
             <property name="text">
              <string>参照</string>
             </property>
           </item>
           <item>
            <widget class="QPushButton" name="browseArchiver">
+            <property name="focusPolicy">
+             <enum>Qt::StrongFocus</enum>
+            </property>
             <property name="text">
              <string>参照</string>
             </property>
        </item>
       </layout>
      </widget>
-     <widget class="QWidget" name="tabTextViewer">
-      <attribute name="title">
-       <string>内蔵ビューア</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_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="QGroupBox" name="groupBox_8">
-         <property name="title">
-          <string>テキストビューアの外観</string>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_12">
-          <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>
-           <layout class="QHBoxLayout" name="horizontalLayout_29">
-            <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_21">
-              <property name="text">
-               <string>フォント:</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QLabel" name="viewerFont">
-              <property name="text">
-               <string>font family, point</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QPushButton" name="chooseViewerFont">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>選択</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <spacer name="horizontalSpacer_18">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>40</width>
-                <height>20</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-            <item>
-             <widget class="QPushButton" name="viewerClrFg">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>文字色</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QPushButton" name="viewerClrBg">
-              <property name="focusPolicy">
-               <enum>Qt::StrongFocus</enum>
-              </property>
-              <property name="text">
-               <string>背景色</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_30">
-            <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>
-             <spacer name="horizontalSpacer_19">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>40</width>
-                <height>20</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-            <item>
-             <widget class="QCheckBox" name="viewerInherit">
-              <property name="text">
-               <string>文字色と背景色はファイルビューを継承</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-          <item>
-           <widget class="QPlainTextEdit" name="viewerSample">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="minimumSize">
-             <size>
-              <width>0</width>
-              <height>130</height>
-             </size>
-            </property>
-            <property name="maximumSize">
-             <size>
-              <width>16777215</width>
-              <height>130</height>
-             </size>
-            </property>
-            <property name="readOnly">
-             <bool>true</bool>
-            </property>
-            <property name="plainText">
-             <string>01234567890
-abcdefghijklmnopqrstuvwxyz
-ABCDEFGHIJKLMNOPQRSTUVWXYZ
-!&quot;#$%&amp;'()+-*=^~¥|@`[]{}&lt;&gt;;:,./?_
-あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <layout class="QVBoxLayout" name="verticalLayout_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>
-          <layout class="QHBoxLayout" name="horizontalLayout_31">
-           <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="QCheckBox" name="enableViewerIgnoreExt">
-             <property name="text">
-              <string>以下の拡張子は外部アプリを優先する</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <spacer name="horizontalSpacer_21">
-             <property name="orientation">
-              <enum>Qt::Horizontal</enum>
-             </property>
-             <property name="sizeHint" stdset="0">
-              <size>
-               <width>40</width>
-               <height>20</height>
-              </size>
-             </property>
-            </spacer>
-           </item>
-           <item>
-            <widget class="QPushButton" name="defaultIgnoreExt">
-             <property name="text">
-              <string>デフォルトに戻す</string>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </item>
-         <item>
-          <layout class="QHBoxLayout" name="horizontalLayout_32">
-           <property name="spacing">
-            <number>4</number>
-           </property>
-           <property name="sizeConstraint">
-            <enum>QLayout::SetDefaultConstraint</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_20">
-             <property name="orientation">
-              <enum>Qt::Horizontal</enum>
-             </property>
-             <property name="sizeType">
-              <enum>QSizePolicy::Fixed</enum>
-             </property>
-             <property name="sizeHint" stdset="0">
-              <size>
-               <width>13</width>
-               <height>17</height>
-              </size>
-             </property>
-            </spacer>
-           </item>
-           <item>
-            <widget class="QPlainTextEdit" name="viewerIgnoreExt">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
-             <property name="minimumSize">
-              <size>
-               <width>0</width>
-               <height>100</height>
-              </size>
-             </property>
-             <property name="maximumSize">
-              <size>
-               <width>16777215</width>
-               <height>110</height>
-              </size>
-             </property>
-             <property name="font">
-              <font>
-               <family>Monaco</family>
-               <pointsize>13</pointsize>
-              </font>
-             </property>
-             <property name="plainText">
-              <string>1
-2
-3
-4
-5
-6</string>
-             </property>
-            </widget>
-           </item>
-          </layout>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <spacer name="verticalSpacer_5">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>3</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </widget>
     </widget>
    </item>
    <item>
@@ -1797,41 +1292,10 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ
   </layout>
  </widget>
  <tabstops>
-  <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>
-  <tabstop>absoluteLeft</tabstop>
-  <tabstop>absoluteTop</tabstop>
-  <tabstop>posRelative</tabstop>
-  <tabstop>relativeLeft</tabstop>
-  <tabstop>relativeTop</tabstop>
-  <tabstop>posCenter</tabstop>
-  <tabstop>posLast</tabstop>
-  <tabstop>checkUpdates</tabstop>
-  <tabstop>resetOnBoot</tabstop>
-  <tabstop>confirmExit</tabstop>
-  <tabstop>chooseBoxFont</tabstop>
-  <tabstop>boxClrFg</tabstop>
-  <tabstop>boxClrBg</tabstop>
-  <tabstop>sampleEdit</tabstop>
-  <tabstop>chooseViewFont</tabstop>
-  <tabstop>clrFgNormal</tabstop>
-  <tabstop>clrBgNormal</tabstop>
-  <tabstop>clrFgSystem</tabstop>
-  <tabstop>clrFgMark</tabstop>
-  <tabstop>clrFgHidden</tabstop>
-  <tabstop>clrFgReadonly</tabstop>
-  <tabstop>clrBgMark</tabstop>
-  <tabstop>dark</tabstop>
-  <tabstop>importAppearance</tabstop>
-  <tabstop>exportAppearance</tabstop>
+  <tabstop>checkUpdate</tabstop>
+  <tabstop>confirmQuit</tabstop>
+  <tabstop>moveAfterCreation</tabstop>
+  <tabstop>openAfterCreation</tabstop>
   <tabstop>confirmCopy</tabstop>
   <tabstop>confirmMove</tabstop>
   <tabstop>confirmDelete</tabstop>
@@ -1845,20 +1309,37 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ
   <tabstop>rbSkip</tabstop>
   <tabstop>rbAppendNumber</tabstop>
   <tabstop>rbRename</tabstop>
-  <tabstop>moveAfterCreate</tabstop>
-  <tabstop>openAfterCreate</tabstop>
+  <tabstop>preferExtensions</tabstop>
+  <tabstop>resetOnBoot</tabstop>
+  <tabstop>fvNormal</tabstop>
+  <tabstop>fvMarked</tabstop>
+  <tabstop>fvNormalBg</tabstop>
+  <tabstop>fvMarkedBg</tabstop>
+  <tabstop>fvSystem</tabstop>
+  <tabstop>fvHidden</tabstop>
+  <tabstop>fvReadOnly</tabstop>
+  <tabstop>lBoxFg</tabstop>
+  <tabstop>lBoxBg</tabstop>
+  <tabstop>sBoxNormal</tabstop>
+  <tabstop>sBoxNormalBg</tabstop>
+  <tabstop>sBoxUnmatch</tabstop>
+  <tabstop>sBoxUnmatchBg</tabstop>
+  <tabstop>tvFg</tabstop>
+  <tabstop>tvBg</tabstop>
+  <tabstop>gvBg</tabstop>
+  <tabstop>importAppearance</tabstop>
+  <tabstop>exportAppearance</tabstop>
+  <tabstop>fvFont</tabstop>
+  <tabstop>lBoxFont</tabstop>
+  <tabstop>sBoxFont</tabstop>
+  <tabstop>tvFont</tabstop>
+  <tabstop>allFont</tabstop>
   <tabstop>editorPath</tabstop>
   <tabstop>browseEditor</tabstop>
   <tabstop>terminalPath</tabstop>
   <tabstop>browseTerminal</tabstop>
-  <tabstop>chooseViewerFont</tabstop>
-  <tabstop>viewerClrFg</tabstop>
-  <tabstop>viewerClrBg</tabstop>
-  <tabstop>viewerInherit</tabstop>
-  <tabstop>viewerSample</tabstop>
-  <tabstop>enableViewerIgnoreExt</tabstop>
-  <tabstop>viewerIgnoreExt</tabstop>
-  <tabstop>defaultIgnoreExt</tabstop>
+  <tabstop>archiverPath</tabstop>
+  <tabstop>browseArchiver</tabstop>
   <tabstop>buttonBox</tabstop>
  </tabstops>
  <resources/>
@@ -1897,8 +1378,6 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ
   </connection>
  </connections>
  <buttongroups>
-  <buttongroup name="overwriteOptions"/>
-  <buttongroup name="sizeOptions"/>
-  <buttongroup name="posOptions"/>
+  <buttongroup name="copyBehavior"/>
  </buttongroups>
 </ui>
diff --git a/preferences.cpp b/preferences.cpp
new file mode 100644 (file)
index 0000000..32fb146
--- /dev/null
@@ -0,0 +1,340 @@
+#include "foldermodel.h"
+#include "global.h"
+#include "preferences.h"
+
+#include <QApplication>
+#include <QDebug>
+#include <QDesktopWidget>
+
+QString DefaultPreferExtensions()
+{
+    QStringList list;
+
+    // 画像系
+    list << "ico" << "ai" << "psd" << "xcf" << "tif" << "tiff" << "wmf";
+    // 音・動画系
+    list << "wav" << "mp3" << "ogg" << "midi" << "mid" << "aif" << "aiff";
+    list << "mov" << "mpg" << "mpeg" << "wma" << "wmv" << "asf" << "avi";
+    list << "flac" << "mkv";
+    // 実行ファイル系
+    list << "exe" << "com" << "msi" << "scr";
+    // アーカイブ系
+    list << "lzh" << "zip" << "cab" << "tar" << "rar" << "gz" << "tgz";
+    list << "bz2" << "xz" << "jar" << "7z" << "dmg";
+    // ドキュメント系
+    list << "pdf" << "doc" << "docx" << "xls" << "xlsx" << "ppt" << "pptx";
+    // フォント
+    list << "ttf" << "ttc";
+
+    list.sort();
+
+    return list.join(",");
+}
+
+QFont DefaultFixedFont()
+{
+    QFont font = qApp->font();
+#ifdef Q_OS_WIN
+    font.setFamily("MS ゴシック");
+#elif defined(Q_OS_MAC)
+    font.setFamily("Monaco");
+#else
+#endif
+    return font;
+}
+
+Preferences::Preferences(QObject *parent) :
+    QSettings(QSettings::IniFormat,
+              QSettings::UserScope,
+              qApp->organizationName(),
+              qApp->applicationName(),
+              parent)
+{
+}
+
+Preferences::Preferences(const QString &path, QObject *parent) :
+    QSettings(path, QSettings::IniFormat, parent)
+{
+}
+
+#define Key_Filter(side)        (side + "/Filter")
+#define Key_NameFilter(side)    (side + "/NameFilter")
+#define Key_Sort(side)          (side + "/Sort")
+#define Key_Path(side)          (side + "/Path")
+void Preferences::restoreModel(const QString &side, FolderModel *m)
+{
+    qDebug() << "Preferences::restoreModel()" << side;
+
+    int filter = value(Key_Filter(side), 0).toInt();
+    filter |= QDir::NoDot | QDir::AllDirs | QDir::Files;
+    m->setFilter(QFlag(filter));
+
+    QString nameFilter = value(Key_NameFilter(side), "*").toString();
+    m->setNameFilters(nameFilter.split(" ", QString::SkipEmptyParts));
+
+    int sort = QDir::Name | QDir::DirsFirst | QDir::IgnoreCase;
+    sort = value(Key_Sort(side), sort).toInt();
+    m->setSorting(QFlag(sort));
+
+    QString path = QDir::homePath();
+    path = value(Key_Path(side), path).toString();
+    m->setRootPath(path);
+}
+
+void Preferences::saveModel(const QString &side, const FolderModel *m)
+{
+    qDebug() << "Preferences::saveModel()" << side;
+
+    setValue(Key_Filter(side), static_cast<int>(m->filter()));
+    setValue(Key_Sort(side), static_cast<int>(m->sorting()));
+    setValue(Key_Path(side), m->rootPath());
+}
+
+#define Key_WindowGeometry  "WindowGeometry"
+#define Key_WindowState     "WindowState"
+void Preferences::restoreWindow(QMainWindow *w)
+{
+    qDebug() << "Preferences::restoreWindow()";
+
+    QByteArray geometry = value(Key_WindowGeometry).toByteArray();
+    if (geometry.isNull()) {
+        QSize size(700, 400);
+        QPoint point;
+        point.setX((qApp->desktop()->width() - size.width()) / 2);
+        point.setY((qApp->desktop()->height() - size.height()) / 2);
+        w->setGeometry(QRect(point, size));
+    }
+    else {
+        w->restoreGeometry(geometry);
+    }
+
+    QByteArray state = value(Key_WindowState).toByteArray();
+    if (!state.isEmpty()) {
+        w->restoreState(state);
+    }
+}
+
+void Preferences::saveWindow(const QMainWindow *w)
+{
+    setValue(Key_WindowGeometry, w->saveGeometry());
+    setValue(Key_WindowState, w->saveState());
+}
+
+///////////////////////////////////////////////////////////////////////////////
+#define Key_BookmarkEntry(i)    QString("Bookmark/Entry%1").arg(i)
+#define Key_BookmarkPath(i)     QString("Bookmark/Path%1").arg(i)
+void Preferences::addBookmark(const QString &name, const QString &path)
+{
+    int n;
+    for (n = 1; !value(Key_BookmarkEntry(n)).isNull(); n++)
+        ;
+
+    setValue(Key_BookmarkEntry(n), name);
+    setValue(Key_BookmarkPath(n), path);
+}
+
+void Preferences::clearBookmark()
+{
+    beginGroup("Bookmark");
+    remove("");
+    endGroup();
+}
+
+QString Preferences::getBookmarkEntry(int n) const
+{
+    return value(Key_BookmarkEntry(n)).toString();
+}
+
+QString Preferences::getBookmarkPath(int n) const
+{
+    return value(Key_BookmarkPath(n)).toString();
+}
+
+QColor Preferences::folderViewFgColor(bool active)
+{
+    int darkFactor = 100;
+    if (!active) {
+        darkFactor += getDarkFacotr() * 100;
+    }
+    return getFolderViewFgColor().darker(darkFactor);
+}
+
+QColor Preferences::folderViewBgColor(bool active)
+{
+    int darkFactor = 100;
+    if (!active) {
+        darkFactor += getDarkFacotr() * 100;
+    }
+    return getFolderViewBgColor().darker(darkFactor);
+}
+
+QColor Preferences::folderViewMarkedFgColor(bool active)
+{
+    int darkFactor = 100;
+    if (!active) {
+        darkFactor += getDarkFacotr() * 100;
+    }
+    return getFolderViewMarkedFgColor().darker(darkFactor);
+}
+
+QColor Preferences::folderViewMarkedBgColor(bool active)
+{
+    int darkFactor = 100;
+    if (!active) {
+        darkFactor += getDarkFacotr() * 100;
+    }
+    return getFolderViewMarkedBgColor().darker(darkFactor);
+}
+
+QColor Preferences::folderViewSystemColor(bool active)
+{
+    int darkFactor = 100;
+    if (!active) {
+        darkFactor += getDarkFacotr() * 100;
+    }
+    return getFolderViewSystemColor().darker(darkFactor);
+}
+
+QColor Preferences::folderViewHiddenColor(bool active)
+{
+    int darkFactor = 100;
+    if (!active) {
+        darkFactor += getDarkFacotr() * 100;
+    }
+    return getFolderViewHiddenColor().darker(darkFactor);
+}
+
+QColor Preferences::folderViewReadOnlyColor(bool active)
+{
+    int darkFactor = 100;
+    if (!active) {
+        darkFactor += getDarkFacotr() * 100;
+    }
+    return getFolderViewReadOnlyColor().darker(darkFactor);
+}
+
+QColor Preferences::locationBoxFgColor(bool active)
+{
+    int darkFactor = 100;
+    if (!active) {
+        darkFactor += getDarkFacotr() * 100;
+    }
+    return getLocationBoxFgColor().darker(darkFactor);
+}
+
+QColor Preferences::locationBoxBgColor(bool active)
+{
+    int darkFactor = 100;
+    if (!active) {
+        darkFactor += getDarkFacotr() * 100;
+    }
+    return getLocationBoxBgColor().darker(darkFactor);
+}
+
+#define IMPLEMENT_BOOL(key, defVal)                 \
+    bool Preferences::is##key() const {             \
+        return value(#key, def##key()).toBool();    \
+    }                                               \
+    bool Preferences::def##key() const {            \
+        return defVal;                              \
+    }                                               \
+    void Preferences::set##key(bool value) {        \
+        setValue(#key, value);                      \
+    }
+
+IMPLEMENT_BOOL(CheckUpdate, true)
+IMPLEMENT_BOOL(ConfirmQuit, true)
+IMPLEMENT_BOOL(ConfirmCopy, true)
+IMPLEMENT_BOOL(AutoCloseCopy, false)
+IMPLEMENT_BOOL(ConfirmMove, true)
+IMPLEMENT_BOOL(AutoCloseMove, false)
+IMPLEMENT_BOOL(ConfirmDelete, true)
+IMPLEMENT_BOOL(AutoCloseDelete, false)
+IMPLEMENT_BOOL(ConfirmRename, true)
+IMPLEMENT_BOOL(AutoCloseRename, false)
+IMPLEMENT_BOOL(OpenAfterCreation, false)
+IMPLEMENT_BOOL(MoveAfterCreation, false)
+
+#define IMPLEMENT_STRING(key, defVal)                   \
+    QString Preferences::get##key() const {             \
+        return value(#key, def##key()).toString();      \
+    }                                                   \
+    QString Preferences::def##key() const {             \
+        return defVal;                                  \
+    }                                                   \
+    void Preferences::set##key(const QString &value) {  \
+        setValue(#key, value);                          \
+    }
+
+#ifdef Q_OS_LINUX
+
+#elif defined(Q_OS_MAC)
+    IMPLEMENT_STRING(ArchiverPath, QQ("/System/Library/CoreServices/Archive Utility.app"))
+    IMPLEMENT_STRING(EditorPath, "/Applications/TextEdit.app")
+    IMPLEMENT_STRING(TerminalPath, "/Applications/Utilities/Terminal.app --args -c cd")
+#else
+    IMPLEMENT_STRING(ArchiverPath, QQ("C:/Program Files/Lhaplus/Lhaplus.exe"))
+    IMPLEMENT_STRING(EditorPath, "notepad.exe")
+    IMPLEMENT_STRING(TerminalPath, "cmd.exe /k cd")
+#endif
+
+IMPLEMENT_STRING(CopyBehavior, "OverWriteIfNew")
+IMPLEMENT_STRING(PreferExtensions, DefaultPreferExtensions())
+
+#define IMPLEMENT_COLOR(key, defVal)                                    \
+    QColor Preferences::get##key() const {                              \
+        return value("Appearance/"#key, def##key()).value<QColor>();    \
+    }                                                                   \
+    QColor Preferences::def##key() const {                              \
+        return defVal;                                                  \
+    }                                                                   \
+    void Preferences::set##key(const QColor &value) {                   \
+        setValue("Appearance/"#key, value);                             \
+    }
+
+IMPLEMENT_COLOR(FolderViewFgColor, QPalette().text().color())
+IMPLEMENT_COLOR(FolderViewBgColor, QPalette().base().color())
+IMPLEMENT_COLOR(FolderViewMarkedFgColor, QColor(128, 0, 0))
+IMPLEMENT_COLOR(FolderViewMarkedBgColor, QColor(0, 192, 0))
+IMPLEMENT_COLOR(FolderViewSystemColor, QColor(128, 0, 128))
+IMPLEMENT_COLOR(FolderViewHiddenColor, QColor(128, 128, 128))
+IMPLEMENT_COLOR(FolderViewReadOnlyColor, QColor(0, 128, 0))
+IMPLEMENT_COLOR(LocationBoxFgColor, QPalette().text().color())
+IMPLEMENT_COLOR(LocationBoxBgColor, QPalette().base().color())
+IMPLEMENT_COLOR(SearchBoxFgColor, QPalette().text().color())
+IMPLEMENT_COLOR(SearchBoxBgColor, QPalette().base().color())
+IMPLEMENT_COLOR(SearchBoxUnmatchFgColor, QColor(255, 0, 0))
+IMPLEMENT_COLOR(SearchBoxUnmatchBgColor, QPalette().base().color())
+IMPLEMENT_COLOR(TextViewFgColor, QPalette().text().color())
+IMPLEMENT_COLOR(TextViewBgColor, QPalette().base().color())
+IMPLEMENT_COLOR(ImageViewBgColor, QPalette().base().color())
+
+#define IMPLEMENT_DOUBLE(key, defVal)                           \
+    double Preferences::get##key() const {                      \
+        return value("Appearance/"#key, def##key()).toDouble(); \
+    }                                                           \
+    double Preferences::def##key() const {                      \
+        return defVal;                                          \
+    }                                                           \
+    void Preferences::set##key(double value) {                  \
+        setValue("Appearance/"#key, value);                     \
+    }
+
+IMPLEMENT_DOUBLE(DarkFacotr, 0)
+IMPLEMENT_DOUBLE(LineHeight, 1.5)
+
+#define IMPLEMENT_FONT(key, defVal)                                 \
+    QFont Preferences::get##key() const {                           \
+        return value("Appearance/"#key, def##key()).value<QFont>(); \
+    }                                                               \
+    QFont Preferences::def##key() const {                           \
+        return defVal;                                              \
+    }                                                               \
+    void Preferences::set##key(const QFont &value) {                \
+        setValue("Appearance/"#key, value);                         \
+    }
+
+IMPLEMENT_FONT(FolderViewFont, DefaultFixedFont())
+IMPLEMENT_FONT(LocationBoxFont, DefaultFixedFont())
+IMPLEMENT_FONT(SearchBoxFont, DefaultFixedFont())
+IMPLEMENT_FONT(TextViewFont, DefaultFixedFont())
diff --git a/preferences.h b/preferences.h
new file mode 100644 (file)
index 0000000..04d3dd0
--- /dev/null
@@ -0,0 +1,103 @@
+#ifndef PREFERENCES_H
+#define PREFERENCES_H
+
+#include <QMainWindow>
+#include <QSettings>
+class FolderModel;
+
+#define DECLARE_BOOL(key)           \
+    bool    is##key() const;        \
+    bool    def##key() const;       \
+    void    set##key(bool value)
+
+#define DECLARE_OBJECT(Type, key)       \
+    Type    get##key() const;           \
+    Type    def##key() const;           \
+    void    set##key(const Type &value)
+
+#define DECLARE_PRIMITIVE(Type, key)    \
+    Type    get##key() const;           \
+    Type    def##key() const;           \
+    void    set##key(Type value)
+
+class Preferences : public QSettings
+{
+    Q_OBJECT
+public:
+    explicit Preferences(QObject *parent = 0);
+    Preferences(const QString &path, QObject *parent = 0);
+
+    void    restoreModel(const QString &side, FolderModel *m);
+    void    saveModel(const QString &side, const FolderModel *m);
+
+    void    restoreWindow(QMainWindow *w);
+    void    saveWindow(const QMainWindow *w);
+
+    void    addBookmark(const QString &name, const QString &path);
+    void    clearBookmark();
+    QString getBookmarkEntry(int n) const;
+    QString getBookmarkPath(int n) const;
+
+    QColor folderViewFgColor(bool active);
+    QColor folderViewBgColor(bool active);
+    QColor folderViewMarkedFgColor(bool active);
+    QColor folderViewMarkedBgColor(bool active);
+    QColor folderViewSystemColor(bool active);
+    QColor folderViewHiddenColor(bool active);
+    QColor folderViewReadOnlyColor(bool active);
+    QColor locationBoxFgColor(bool active);
+    QColor locationBoxBgColor(bool active);
+
+    DECLARE_BOOL(CheckUpdate);
+    DECLARE_BOOL(ConfirmQuit);
+    DECLARE_BOOL(ConfirmCopy);
+    DECLARE_BOOL(AutoCloseCopy);
+    DECLARE_BOOL(ConfirmMove);
+    DECLARE_BOOL(AutoCloseMove);
+    DECLARE_BOOL(ConfirmDelete);
+    DECLARE_BOOL(AutoCloseDelete);
+    DECLARE_BOOL(ConfirmRename);
+    DECLARE_BOOL(AutoCloseRename);
+    DECLARE_BOOL(OpenAfterCreation);
+    DECLARE_BOOL(MoveAfterCreation);
+
+    DECLARE_OBJECT(QString, ArchiverPath);
+    DECLARE_OBJECT(QString, EditorPath);
+    DECLARE_OBJECT(QString, TerminalPath);
+    DECLARE_OBJECT(QString, CopyBehavior);
+    DECLARE_OBJECT(QString, PreferExtensions);
+
+    DECLARE_OBJECT(QColor, FolderViewFgColor);
+    DECLARE_OBJECT(QColor, FolderViewBgColor);
+    DECLARE_OBJECT(QColor, FolderViewMarkedFgColor);
+    DECLARE_OBJECT(QColor, FolderViewMarkedBgColor);
+    DECLARE_OBJECT(QColor, FolderViewSystemColor);
+    DECLARE_OBJECT(QColor, FolderViewHiddenColor);
+    DECLARE_OBJECT(QColor, FolderViewReadOnlyColor);
+    DECLARE_OBJECT(QColor, LocationBoxFgColor);
+    DECLARE_OBJECT(QColor, LocationBoxBgColor);
+    DECLARE_OBJECT(QColor, SearchBoxFgColor);
+    DECLARE_OBJECT(QColor, SearchBoxBgColor);
+    DECLARE_OBJECT(QColor, SearchBoxUnmatchFgColor);
+    DECLARE_OBJECT(QColor, SearchBoxUnmatchBgColor);
+    DECLARE_OBJECT(QColor, TextViewFgColor);
+    DECLARE_OBJECT(QColor, TextViewBgColor);
+    DECLARE_OBJECT(QColor, ImageViewBgColor);
+
+    DECLARE_PRIMITIVE(double, DarkFacotr);
+    DECLARE_PRIMITIVE(double, LineHeight);
+
+    DECLARE_OBJECT(QFont, FolderViewFont);
+    DECLARE_OBJECT(QFont, LocationBoxFont);
+    DECLARE_OBJECT(QFont, SearchBoxFont);
+    DECLARE_OBJECT(QFont, TextViewFont);
+
+
+
+signals:
+
+public slots:
+
+};
+
+#endif // PREFERENCES_H
index d7f4021..e3c946e 100644 (file)
@@ -4,7 +4,7 @@
 #include <QMessageBox>\r
 \r
 RenameMultiDialog::RenameMultiDialog(QWidget *parent) :\r
-    IRenameDialog(parent),\r
+    AbstractRenameDialog(parent),\r
     ui(new Ui::RenameMultiDialog)\r
 {\r
     ui->setupUi(this);\r
@@ -164,6 +164,6 @@ void RenameMultiDialog::accept()
         }\r
     }\r
 \r
-    IRenameDialog::accept();\r
+    AbstractRenameDialog::accept();\r
 }\r
 \r
index 4336438..cf907eb 100644 (file)
@@ -2,13 +2,13 @@
 #define RENAMEMULTIDIALOG_H\r
 \r
 #include <QAbstractButton>\r
-#include "irenamedialog.h"\r
+#include "abstractrenamedialog.h"\r
 \r
 namespace Ui {\r
 class RenameMultiDialog;\r
 }\r
 \r
-class RenameMultiDialog : public IRenameDialog\r
+class RenameMultiDialog : public AbstractRenameDialog\r
 {\r
     Q_OBJECT\r
 \r
index a1adf90..e658d36 100644 (file)
@@ -3,7 +3,7 @@
 #include <QMessageBox>\r
 \r
 RenameSingleDialog::RenameSingleDialog(QWidget *parent) :\r
-    IRenameDialog(parent),\r
+    AbstractRenameDialog(parent),\r
     ui(new Ui::RenameSingleDialog)\r
 {\r
     ui->setupUi(this);\r
@@ -51,5 +51,5 @@ void RenameSingleDialog::accept()
                            m_dir.absoluteFilePath(ui->nameAfter->text()));\r
     }\r
 \r
-    IRenameDialog::accept();\r
+    AbstractRenameDialog::accept();\r
 }\r
index 2b85c3b..b6cb4c9 100644 (file)
@@ -1,13 +1,13 @@
 #ifndef RENAMESINGLEDIALOG_H\r
 #define RENAMESINGLEDIALOG_H\r
 \r
-#include "irenamedialog.h"\r
+#include "abstractrenamedialog.h"\r
 \r
 namespace Ui {\r
 class RenameSingleDialog;\r
 }\r
 \r
-class RenameSingleDialog : public IRenameDialog\r
+class RenameSingleDialog : public AbstractRenameDialog\r
 {\r
     Q_OBJECT\r
 \r
index f571501..a2ba4e6 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef RENAMEWORKER_H\r
 #define RENAMEWORKER_H\r
 \r
-#include "common.h"\r
 #include "abstractworker.h"\r
+#include "global.h"\r
 \r
 class RenameWorker : public AbstractWorker\r
 {\r
index 31540ba..a073f60 100644 (file)
@@ -34,8 +34,9 @@
         <file>images/Zoom in.png</file>
         <file>images/Zoom out.png</file>
         <file>images/Search text.png</file>
-        <file>images/Picture.png</file>
         <file>images/Lightbrown Zip.png</file>
         <file>images/file-manager.png</file>
+        <file>images/windows_fullscreen.png</file>
+        <file>images/Pictures.png</file>
     </qresource>
 </RCC>
diff --git a/searchbox.cpp b/searchbox.cpp
deleted file mode 100644 (file)
index b78565f..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-#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);
-
-}
diff --git a/searchbox.h b/searchbox.h
deleted file mode 100644 (file)
index 0f901df..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef SEARCHBOX_H
-#define SEARCHBOX_H
-
-#include <QLineEdit>
-
-class SearchBox : public QLineEdit
-{
-    Q_OBJECT
-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 4978785..604d689 100644 (file)
@@ -1,4 +1,4 @@
-#include "common.h"
+#include "mainwindow.h"
 #include "simpleimageview.h"
 
 #include <QDebug>
 #include <QAction>
 #include <QMenu>
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::SimpleImageView
+/// \param parent   親ウィジェット
+///
+/// コンストラクタ
+///
 SimpleImageView::SimpleImageView(QWidget *parent) :
     QGraphicsView(parent),
-    m_back(NULL),
-    m_fitToWindow(NULL),
-    m_scaleUp(NULL),
-    m_scaleDown(NULL),
-    m_scaleNormal(NULL),
-    m_rot90(NULL),
-    m_rot180(NULL),
+    AbstractView(),
     m_imgSrc(),
+    m_scene(this),
     m_scaleFactor(0),
     m_rotateDeg(0)
 {
-    QSettings settings;
-    QPalette pal = palette();
-    pal.setColor(QPalette::Base, settings.value(IniKey_ViewColorBgNormal).value<QColor>());
-    setBackgroundRole(QPalette::Base);
-    setPalette(pal);
-
-    setContextMenuPolicy(Qt::DefaultContextMenu);
-
-    QList<QKeySequence> shortcuts;
-    //>>>>> 「戻る」メニュー
-    m_back = new QAction(tr("戻る"), this);
-    m_back->setObjectName("back");
-    shortcuts.clear();
-    shortcuts << QKeySequence("Return");
-    shortcuts << QKeySequence("Backspace");
-    m_back->setShortcuts(shortcuts);
-
-    //>>>>> 「ウィンドウにフィット」メニュー
-    m_fitToWindow = new QAction(tr("ウィンドウにフィット"), this);
-    m_fitToWindow->setObjectName("fitToWindow");
-    m_fitToWindow->setCheckable(true);
-    m_fitToWindow->setChecked(true);
-    m_fitToWindow->setShortcut(QKeySequence("Space"));
-
-    //>>>>> 「拡大」メニュー
-    m_scaleUp = new QAction(tr("拡大"), this);
-    m_scaleUp->setObjectName("scaleUp");
-    shortcuts.clear();
-    shortcuts << QKeySequence("+");
-    shortcuts << QKeySequence("Shift++");
-    m_scaleUp->setShortcuts(shortcuts);
-
-    //>>>>> 「縮小」メニュー
-    m_scaleDown = new QAction(tr("縮小"), this);
-    m_scaleDown->setObjectName("scaleDown");
-    m_scaleDown->setShortcut(QKeySequence("-"));
-
-    //>>>>> 「等倍」メニュー
-    m_scaleNormal = new QAction(tr("等倍"), this);
-    m_scaleNormal->setObjectName("scaleNormal");
-    shortcuts.clear();
-    shortcuts << QKeySequence("=");
-    shortcuts << QKeySequence("Shift+=");
-    m_scaleNormal->setShortcuts(shortcuts);
-
-    //>>>>> 「右に90度回転」メニュー
-    m_rot90 = new QAction(tr("右に90度回転"), this);
-    m_rot90->setObjectName("rot90");
-    m_rot90->setShortcut(QKeySequence("9"));
-
-    //>>>>> 「右に180度回転」メニュー
-    m_rot180 = new QAction(tr("右に180度回転"), this);
-    m_rot180->setObjectName("rot180");
-    m_rot180->setShortcut(QKeySequence("0"));
-
-    connect(m_back, SIGNAL(triggered()), this, SIGNAL(viewFinished()));
-    connect(m_fitToWindow, SIGNAL(toggled(bool)), this, SLOT(fitToWindow(bool)));
-    connect(m_scaleDown, SIGNAL(triggered()), this, SLOT(scaleDown()));
-    connect(m_scaleNormal, SIGNAL(triggered()), this, SLOT(scaleNormal()));
-    connect(m_scaleUp, SIGNAL(triggered()), this, SLOT(scaleUp()));
-    connect(m_rot90, SIGNAL(triggered()), this, SLOT(rotate90()));
-    connect(m_rot180, SIGNAL(triggered()), this, SLOT(rotate180()));
-
+    setContextMenuPolicy(Qt::NoContextMenu);
     setDragMode(ScrollHandDrag);
+    setScene(&m_scene);
 }
 
-bool SimpleImageView::setSource(const QString &path)
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::initialize
+/// \param w    メインウィンドウオブジェクト
+///
+/// 初期化処理を行います。
+///
+void SimpleImageView::initialize(MainWindow *w)
 {
-    QPixmap pixmap(path);
-    if (pixmap.isNull()) {
-        return false;
-    }
+    connect(this, SIGNAL(statusChanged(QString)), w, SLOT(view_statusChanged(QString)));
+    installEventFilter(w);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::setSource
+/// \param pixmap
+///
+void SimpleImageView::setSource(const QPixmap &pixmap)
+{
+    qDebug() << "SimpleImageView::setSource()";
 
     m_imgSrc = pixmap;
     m_rotateDeg = 0;
-    m_scaleFactor = 0;
-    m_fitToWindow->blockSignals(true);
-    m_fitToWindow->setChecked(true);
-    m_fitToWindow->blockSignals(false);
+    m_scaleFactor = -1;
 
-    QGraphicsScene *scene = new QGraphicsScene(this);
-    scene->addPixmap(pixmap);
-    setScene(scene);
     resizeImage();
-
-    return true;
 }
 
-void SimpleImageView::changeScale(bool up)
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::scaleFactor
+/// \return 倍率を返します。
+///
+double SimpleImageView::scaleFactor()
 {
-    if (up) {
-        scaleUp();
+    // すでに倍率が指定されている場合は、そのまま。
+    if (m_scaleFactor > 0) {
+        return m_scaleFactor;
     }
-    else {
-        scaleDown();
-    }
-}
 
-double SimpleImageView::scaleFactor(const QSize &size)
-{
-    double scaleFactor;
-    if (m_scaleFactor == 0) {
-        double scaleX, scaleY;
-        if (m_rotateDeg == 90 || m_rotateDeg == 270) {
-            scaleX = 1.0 * size.width() / m_imgSrc.height();
-            scaleY = 1.0 * size.height() / m_imgSrc.width();
-        }
-        else {
-            scaleX = 1.0 * size.width() / m_imgSrc.width();
-            scaleY = 1.0 * size.height() / m_imgSrc.height();
-        }
-        scaleFactor =  (scaleX > scaleY) ? scaleY : scaleX;
+    // ビューポートに対する適切な倍率を計算する
+    double scaleFactor, scaleX, scaleY;
+    if (m_rotateDeg == 90 || m_rotateDeg == 270) {
+        scaleX = 1.0 * viewport()->width() / m_imgSrc.height();
+        scaleY = 1.0 * viewport()->height() / m_imgSrc.width();
     }
     else {
-        scaleFactor = m_scaleFactor;
+        scaleX = 1.0 * viewport()->width() / m_imgSrc.width();
+        scaleY = 1.0 * viewport()->height() / m_imgSrc.height();
+    }
+    scaleFactor =  (scaleX > scaleY) ? scaleY : scaleX;
+
+    // 縮小もしくは等倍の場合
+    if (m_scaleFactor == -1) {
+        return (scaleFactor > 1) ? 1 : scaleFactor;
     }
 
     return scaleFactor;
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::sizeChanged
+///
+/// サイズ変更後の処理を行います。
+///
 void SimpleImageView::sizeChanged()
 {
     QString str;
@@ -149,28 +98,40 @@ void SimpleImageView::sizeChanged()
             .arg(m_imgSrc.width())
             .arg(m_imgSrc.height())
             .arg(m_imgSrc.depth())
-            .arg(int(scaleFactor(viewport()->size()) * 100));
-    emit fileInfo(str);
+            .arg(int(scaleFactor() * 100));
+    emit statusChanged(str);
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::resizeImage
+/// \return 倍率
+///
+/// イメージの拡大・縮小と回転を行います。
+///
 double SimpleImageView::resizeImage()
 {
-    if (m_imgSrc.isNull()) {
-        return 1;
-    }
-
-    double scaleFactor = this->scaleFactor(viewport()->size());
-    m_rotateDeg %= 360;
-
+    double scaleFactor = this->scaleFactor();
+    QPixmap scaledImg = m_imgSrc.scaled(scaleFactor * m_imgSrc.width(),
+                                        scaleFactor * m_imgSrc.height(),
+                                        Qt::IgnoreAspectRatio,
+                                        Qt::SmoothTransformation);
+    this->scene()->clear();
+    this->scene()->addPixmap(scaledImg);
+    this->setSceneRect(scaledImg.rect());
     this->setTransform(QTransform());
     this->translate(width() / 2, height() / 2);
     this->rotate(m_rotateDeg);
-    this->scale(scaleFactor, scaleFactor);
     sizeChanged();
 
     return scaleFactor;
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::fitToWindow
+/// \param checked  メニューのチェック状態
+///
+/// ウィンドウへのフィットを切り替えます。
+///
 void SimpleImageView::fitToWindow(bool checked)
 {
     if (checked) {
@@ -182,92 +143,67 @@ void SimpleImageView::fitToWindow(bool checked)
     if (!checked) {
         m_scaleFactor = scaleFactor;
     }
-
-    sizeChanged();
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::scaleNormal
+///
+/// 等倍で表示します。
+///
 void SimpleImageView::scaleNormal()
 {
     m_scaleFactor = 1;
     resizeImage();
-
-    m_fitToWindow->blockSignals(true);
-    m_fitToWindow->setChecked(false);
-    m_fitToWindow->blockSignals(false);
-}
-
-void SimpleImageView::scaleUp()
-{
-    m_scaleFactor = scaleFactor(viewport()->size()) * 1.25;
-    resizeImage();
-
-    m_fitToWindow->blockSignals(true);
-    m_fitToWindow->setChecked(false);
-    m_fitToWindow->blockSignals(false);
-}
-
-void SimpleImageView::scaleDown()
-{
-    m_scaleFactor = scaleFactor(viewport()->size()) * 0.8;
-    resizeImage();
-
-    m_fitToWindow->blockSignals(true);
-    m_fitToWindow->setChecked(false);
-    m_fitToWindow->blockSignals(false);
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::rotate90
+///
+/// 右に90度回転します。
+///
 void SimpleImageView::rotate90()
 {
     m_rotateDeg += 90;
+    m_rotateDeg %= 360;
     resizeImage();
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::rotate180
+///
+/// 180度回転します。
+///
 void SimpleImageView::rotate180()
 {
     m_rotateDeg += 180;
+    m_rotateDeg %= 360;
     resizeImage();
 }
 
-void SimpleImageView::keyPressEvent(QKeyEvent *event)
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::resizeEvent
+/// \param event
+///
+void SimpleImageView::resizeEvent(QResizeEvent *event)
 {
-    qDebug() << "SimpleImageView::keyPressEvent();";
-
-    QString ksq = KeyEventToSequence(event);
-
-    if (ProcessShortcut(ksq, this)) {
-        event->accept();
-        return;
-    }
-
-    QGraphicsView::keyReleaseEvent(event);
-    if (IsKeyUpDown(event)) {
-        event->accept();
-        return;
-    }
-
-    // MainWindowへ
-    event->ignore();
+    resizeImage();
+    QGraphicsView::resizeEvent(event);
 }
 
-void SimpleImageView::contextMenuEvent(QContextMenuEvent *event)
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::scaleUp
+///
+void SimpleImageView::scaleUp()
 {
-    qDebug() << "SimpleImageView::contextMenuEvent();";
-
-    QMenu menu(this);
-    menu.addAction(m_fitToWindow);
-    menu.addAction(m_scaleUp);
-    menu.addAction(m_scaleDown);
-    menu.addAction(m_scaleNormal);
-    menu.addSeparator();
-    menu.addAction(m_rot90);
-    menu.addAction(m_rot180);
-    menu.addSeparator();
-    menu.addAction(m_back);
-    menu.exec(event->globalPos());
+    m_scaleFactor = scaleFactor() * 1.25;
+    resizeImage();
 }
 
-void SimpleImageView::resizeEvent(QResizeEvent *event)
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleImageView::scaleDown
+///
+void SimpleImageView::scaleDown()
 {
+    m_scaleFactor = scaleFactor() * 0.8;
     resizeImage();
-    QGraphicsView::resizeEvent(event);
 }
index 58b6bef..d7ceef7 100644 (file)
@@ -1,53 +1,49 @@
 #ifndef SIMPLEIMAGEVIEW_H
 #define SIMPLEIMAGEVIEW_H
 
+#include "abstractview.h"
+
 #include <QGraphicsView>
 
-class SimpleImageView : public QGraphicsView
+class MainWindow;
+
+class SimpleImageView : public QGraphicsView, public AbstractView
 {
     Q_OBJECT
 public:
     explicit SimpleImageView(QWidget *parent = 0);
 
-    bool setSource(const QString &path);
-
-    void changeScale(bool up);
+    void    initialize(MainWindow *w);
+    void    setSource(const QPixmap &pixmap);
 
 private:
-    QAction *m_back;
-    QAction *m_fitToWindow;
-    QAction *m_scaleUp;
-    QAction *m_scaleDown;
-    QAction *m_scaleNormal;
-    QAction *m_rot90;
-    QAction *m_rot180;
-    QPixmap m_imgSrc;
-    double m_scaleFactor;
-    int m_rotateDeg;
+    QPixmap         m_imgSrc;
+    QGraphicsScene  m_scene;
+    double          m_scaleFactor;
+    int             m_rotateDeg;
 
 private:
-    double scaleFactor(const QSize &size);
-    void updateActions();
-    void sizeChanged();
-    double resizeImage();
+    double  scaleFactor();
+    void    sizeChanged();
+    double  resizeImage();
 
 signals:
-    void viewFinished();
-    void fileInfo(const QString &info);
+    void    statusChanged(const QString &info);
 
-private slots:
-    void fitToWindow(bool checked);
-    void scaleNormal();
-    void scaleUp();
-    void scaleDown();
-    void rotate90();
-    void rotate180();
+public slots:
+    void    fitToWindow(bool checked);
+    void    scaleNormal();
+    void    rotate90();
+    void    rotate180();
 
     // QWidget interface
 protected:
-    void keyPressEvent(QKeyEvent *event);
-    void contextMenuEvent(QContextMenuEvent *event);
     void resizeEvent(QResizeEvent *event);
+
+    // AbstractView interface
+public slots:
+    void    scaleUp();
+    void    scaleDown();
 };
 
 #endif // SIMPLEIMAGEVIEW_H
index deadb64..d78482b 100644 (file)
@@ -1,6 +1,6 @@
-#include "common.h"
-#include "simpletextview.h"
 #include "mainwindow.h"
+#include "preferences.h"
+#include "simpletextview.h"
 
 #include <QDebug>
 #include <QMenu>
 #include <QApplication>
 
 ///////////////////////////////////////////////////////////////////////////////
-/// \brief KeyEventToSequence
-/// \param event キーイベントオブジェクト
-/// \return キーシーケンスの文字列(Ctrl+C等)
+/// \brief SimpleTextView::SimpleTextView
+/// \param parent   親ウィジェット
 ///
-/// ã\82­ã\83¼ã\82¤ã\83\99ã\83³ã\83\88ã\81§æ\8a¼ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\82­ã\83¼ã\82\92ã\82­ã\83¼ã\82·ã\83¼ã\82±ã\83³ã\82¹æ\96\87å­\97å\88\97ã\81«å¤\89æ\8f\9bã\81\97ã\81¾ã\81\99
+/// ã\82³ã\83³ã\82¹ã\83\88ã\83©ã\82¯ã\82¿
 ///
-QString KeyEventToSequence(const QKeyEvent *event)
+SimpleTextView::SimpleTextView(QWidget *parent) :
+    QPlainTextEdit(parent),
+    AbstractView(),
+    m_source()
 {
-    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 modifier + key;
+    setReadOnly(true);
+    setContextMenuPolicy(Qt::NoContextMenu);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-/// \brief IsKeyUpDown
-/// \param event キーイベントオブジェクト
-/// \return (Up/Down/Home/End)+(!Shift)の場合true
+/// \brief SimpleTextView::initialize
+/// \param w    メインウィンドウオブジェクト
 ///
-/// カーソル移動系のキーが押されたかを判定します
+/// 初期化処理を行います。
 ///
-bool IsKeyUpDown(const QKeyEvent *event)
-{
-    QString ksq = KeyEventToSequence(event);
-
-    switch (event->key()) {
-    case Qt::Key_Up:
-    case Qt::Key_Down:
-    case Qt::Key_Home:
-    case Qt::Key_End:
-        if (event->modifiers() & Qt::ShiftModifier) {
-            return false;
-        }
-        else {
-            return true;
-        }
-    }
-    return false;
-}
-
-SimpleTextView::SimpleTextView(QWidget *parent) :
-    QPlainTextEdit(parent),
-    m_convEUC(NULL),
-    m_convJIS(NULL),
-    m_convSJIS(NULL),
-    m_convUTF8(NULL),
-    m_convUTF16BE(NULL),
-    m_convUTF16LE(NULL),
-    m_copy(NULL),
-    m_back(NULL)
+void SimpleTextView::initialize(MainWindow *w)
 {
-    setReadOnly(true);
-    updateAppearance();
-
-    setContextMenuPolicy(Qt::DefaultContextMenu);
-    m_convEUC = new QAction(tr("EUC-JPで再読込"), this);
-    m_convJIS = new QAction(tr("ISO 2022-JP(JIS)で再読込"), this);
-    m_convSJIS = new QAction(tr("Shift-JISで再読込"), this);
-    m_convUTF8 = new QAction(tr("UTF-8で再読込"), this);
-    m_convUTF16 = new QAction(tr("UTF-16で再読込"), this);
-    m_convUTF16BE = new QAction(tr("UTF-16BEで再読込"), this);
-    m_convUTF16LE = new QAction(tr("UTF-16LEで再読込"), this);
-    m_copy = new QAction(tr("選択範囲をクリップボードにコピー"), this);
-    m_back = new QAction(tr("戻る"), this);
-
-    m_convEUC->setObjectName("convertFromEUC");
-    m_convJIS->setObjectName("convertFromJIS");
-    m_convSJIS->setObjectName("convertFromSJIS");
-    m_convUTF8->setObjectName("convertFromUTF8");
-    m_convUTF16->setObjectName("convertFromUTF16");
-    m_convUTF16BE->setObjectName("convertFromUTF16BE");
-    m_convUTF16LE->setObjectName("convertFromUTF16LE");
-    m_copy->setObjectName("copy");
-    m_back->setObjectName("back");
+    qDebug() << "SimpleTextView::initialize()";
 
-    m_convEUC->setShortcut(QKeySequence("Ctrl+E"));
-    m_convJIS->setShortcut(QKeySequence("Ctrl+J"));
-    m_convSJIS->setShortcut(QKeySequence("Ctrl+S"));
-    m_convUTF8->setShortcut(QKeySequence("Ctrl+U"));
-    m_convUTF16->setShortcut(QKeySequence("Ctrl+I"));
-    m_convUTF16BE->setShortcut(QKeySequence("Ctrl+O"));
-    m_convUTF16LE->setShortcut(QKeySequence("Ctrl+P"));
-    m_copy->setShortcut(QKeySequence::Copy);
+    connect(this, SIGNAL(statusChanged(QString)), w, SLOT(view_statusChanged(QString)));
+    connect(this, SIGNAL(copyAvailable(bool)), w, SLOT(view_copyAvailable(bool)));
 
-    QList<QKeySequence> shortcuts;
-    shortcuts << QKeySequence("Return");
-    shortcuts << QKeySequence("Backspace");
-    m_back->setShortcuts(shortcuts);
-
-    connect(m_convEUC, SIGNAL(triggered()), this, SLOT(convertFromEUC()));
-    connect(m_convJIS, SIGNAL(triggered()), this, SLOT(convertFromJIS()));
-    connect(m_convSJIS, SIGNAL(triggered()), this, SLOT(convertFromSJIS()));
-    connect(m_convUTF8, SIGNAL(triggered()), this, SLOT(convertFromUTF8()));
-    connect(m_convUTF16, SIGNAL(triggered()), this, SLOT(convertFromUTF16()));
-    connect(m_convUTF16BE, SIGNAL(triggered()), this, SLOT(convertFromUTF16BE()));
-    connect(m_convUTF16LE, SIGNAL(triggered()), this, SLOT(convertFromUTF16LE()));
-    connect(m_copy, SIGNAL(triggered()), this, SLOT(copy()));
-    connect(m_back, SIGNAL(triggered()), this, SLOT(back()));
-
-    connect(this, SIGNAL(copyAvailable(bool)), this, SLOT(onCopyAvailable(bool)));
-
-    m_copy->setEnabled(false);
+    installEventFilter(w);
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleTextView::setSource
+/// \param source   表示するデータ
+///
+/// データを表示します。
+///
 void SimpleTextView::setSource(const QByteArray &source)
 {
+    qDebug() << "SimpleTextView::setSource()" << source.size();
+
     m_source = source;
     if (m_source.size() == 0) {
         setPlainText("");
-        emit fileInfo("");
+        emit statusChanged("");
         return;
     }
 
@@ -135,125 +63,56 @@ void SimpleTextView::setSource(const QByteArray &source)
 
     setPlainText(codec->toUnicode(m_source));
 
-    emit fileInfo(code.c_str());
-}
-
-void SimpleTextView::updateAppearance()
-{
-    QSettings settings;
-
-    QPalette pal = this->palette();
-    if (settings.value(IniKey_ViewerInherit).toBool()) {
-        pal.setColor(QPalette::Base,
-                     settings.value(IniKey_ViewColorBgNormal).value<QColor>());
-        pal.setColor(QPalette::Text,
-                     settings.value(IniKey_ViewColorFgNormal).value<QColor>());
-    }
-    else {
-        pal.setColor(QPalette::Base,
-                     settings.value(IniKey_ViewerColorBg).value<QColor>());
-        pal.setColor(QPalette::Text,
-                     settings.value(IniKey_ViewerColorFg).value<QColor>());
-    }
-    setPalette(pal);
-    setFont(settings.value(IniKey_ViewerFont).value<QFont>());
+    emit statusChanged(code.c_str());
 }
 
 void SimpleTextView::convertFromEUC()
 {
     QTextCodec *codec = QTextCodec::codecForName("EUC-JP");
     setPlainText(codec->toUnicode(m_source));
-    emit fileInfo("EUC-JP");
+    emit statusChanged("EUC-JP");
 }
 
 void SimpleTextView::convertFromJIS()
 {
     QTextCodec *codec = QTextCodec::codecForName("ISO 2022-JP");
     setPlainText(codec->toUnicode(m_source));
-    emit fileInfo("ISO 2022-JP");
+    emit statusChanged("ISO 2022-JP");
 }
 
 void SimpleTextView::convertFromSJIS()
 {
     QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");
     setPlainText(codec->toUnicode(m_source));
-    emit fileInfo("Shift-JIS");
+    emit statusChanged("Shift-JIS");
 }
 
 void SimpleTextView::convertFromUTF8()
 {
     QTextCodec *codec = QTextCodec::codecForName("UTF-8");
     setPlainText(codec->toUnicode(m_source));
-    emit fileInfo("UTF-8");
+    emit statusChanged("UTF-8");
 }
 
 void SimpleTextView::convertFromUTF16()
 {
     QTextCodec *codec = QTextCodec::codecForName("UTF-16");
     setPlainText(codec->toUnicode(m_source));
-    emit fileInfo("UTF-16");
+    emit statusChanged("UTF-16");
 }
 
 void SimpleTextView::convertFromUTF16BE()
 {
     QTextCodec *codec = QTextCodec::codecForName("UTF-16BE");
     setPlainText(codec->toUnicode(m_source));
-    emit fileInfo("UTF-16BE");
+    emit statusChanged("UTF-16BE");
 }
 
 void SimpleTextView::convertFromUTF16LE()
 {
     QTextCodec *codec = QTextCodec::codecForName("UTF-16LE");
     setPlainText(codec->toUnicode(m_source));
-    emit fileInfo("UTF-16LE");
-}
-
-void SimpleTextView::onCopyAvailable(bool yes)
-{
-    m_copy->setEnabled(yes);
-}
-
-void SimpleTextView::back()
-{
-    emit viewFinished();
-}
-
-void SimpleTextView::keyPressEvent(QKeyEvent *event)
-{
-    QString ksq = KeyEventToSequence(event);
-
-    if (ProcessShortcut(ksq, this)) {
-        event->accept();
-        return;
-    }
-
-    QPlainTextEdit::keyPressEvent(event);
-    if (IsKeyUpDown(event)) {
-        event->accept();
-        return;
-    }
-
-    // MainWindowへ
-    event->ignore();
-}
-
-
-void SimpleTextView::contextMenuEvent(QContextMenuEvent *event)
-{
-    qDebug() << "SimpleTextView::contextMenuEvent();";
-
-    QMenu menu(this);
-    menu.addAction(m_convEUC);
-    menu.addAction(m_convJIS);
-    menu.addAction(m_convSJIS);
-    menu.addAction(m_convUTF8);
-    menu.addAction(m_convUTF16BE);
-    menu.addAction(m_convUTF16LE);
-    menu.addSeparator();
-    menu.addAction(m_copy);
-    menu.addSeparator();
-    menu.addAction(m_back);
-    menu.exec(event->globalPos());
+    emit statusChanged("UTF-16LE");
 }
 
 // http://dobon.net/vb/dotnet/string/detectcode.html より拝借
@@ -394,3 +253,24 @@ std::string SimpleTextView::detectCode(const QByteArray &bytes)
     return "UTF-8";
 #endif
 }
+
+
+void SimpleTextView::scaleUp()
+{
+    qDebug() << "SimpleTextView::scaleUp()";
+
+    Preferences prefs(this);
+    QFont font = prefs.getTextViewFont();
+    font.setPointSize(font.pointSize() + 1);
+    prefs.setTextViewFont(font);
+}
+
+void SimpleTextView::scaleDown()
+{
+    qDebug() << "SimpleTextView::scaleDown()";
+
+    Preferences prefs(this);
+    QFont font = prefs.getTextViewFont();
+    font.setPointSize(font.pointSize() - 1);
+    prefs.setTextViewFont(font);
+}
index 5e4626f..02056f1 100644 (file)
@@ -1,52 +1,42 @@
 #ifndef SIMPLETEXTVIEW_H
 #define SIMPLETEXTVIEW_H
 
+#include "abstractview.h"
+
 #include <QPlainTextEdit>
 
-class SimpleTextView : public QPlainTextEdit
+class MainWindow;
+
+class SimpleTextView : public QPlainTextEdit, public AbstractView
 {
     Q_OBJECT
 public:
     explicit SimpleTextView(QWidget *parent = 0);
 
-    void setSource(const QByteArray &source);
-    void updateAppearance();
+    void    initialize(MainWindow *w);
+    void    setSource(const QByteArray &source);
 
 private:
-    QAction *m_convEUC;
-    QAction *m_convJIS;
-    QAction *m_convSJIS;
-    QAction *m_convUTF8;
-    QAction *m_convUTF16;
-    QAction *m_convUTF16BE;
-    QAction *m_convUTF16LE;
-    QAction *m_copy;
-    QAction *m_back;
     QByteArray m_source;
 
-    std::string detectCode(const QByteArray &bytes);
+    static std::string  detectCode(const QByteArray &bytes);
 
 signals:
-    void viewFinished();
-    void fileInfo(const QString &info);
+    void    statusChanged(const QString &info);
 
 public slots:
-
-private slots:
-    void convertFromEUC();
-    void convertFromJIS();
-    void convertFromSJIS();
-    void convertFromUTF8();
-    void convertFromUTF16();
-    void convertFromUTF16BE();
-    void convertFromUTF16LE();
-    void onCopyAvailable(bool yes);
-    void back();
-
-    // QWidget interface
-protected:
-    void keyPressEvent(QKeyEvent *event);
-    void contextMenuEvent(QContextMenuEvent *event);
+    void    convertFromEUC();
+    void    convertFromJIS();
+    void    convertFromSJIS();
+    void    convertFromUTF8();
+    void    convertFromUTF16();
+    void    convertFromUTF16BE();
+    void    convertFromUTF16LE();
+
+    // AbstractView interface
+public:
+    void    scaleUp();
+    void    scaleDown();
 };
 
 #endif // SIMPLETEXTVIEW_H
index fd3b967..9f40f7a 100644 (file)
@@ -1,13 +1,11 @@
-#include "common.h"\r
+#include "foldermodel.h"\r
 #include "sortdialog.h"\r
 #include "ui_sortdialog.h"\r
-#include <QSettings>\r
-#include <QDir>\r
 \r
 SortDialog::SortDialog(QWidget *parent) :\r
     QDialog(parent),\r
     ui(new Ui::SortDialog),\r
-    m_RightOrLeft()\r
+    m_model(NULL)\r
 {\r
     ui->setupUi(this);\r
 }\r
@@ -17,87 +15,84 @@ SortDialog::~SortDialog()
     delete ui;\r
 }\r
 \r
-void SortDialog::setRightOrLeft(const QString &s)\r
+void SortDialog::setModel(FolderModel *m)\r
 {\r
-    QSettings settings;\r
+    m_model = m;\r
+    QDir::SortFlags sort = m->sorting();\r
 \r
-    m_RightOrLeft = s;\r
-    int sortBy = settings.value(m_RightOrLeft + slash + IniKey_SortBy).toInt();\r
-    if (sortBy == SortByType) {\r
-        ui->sortByType->setChecked(true);\r
+    if (sort & QDir::Time) {\r
+        ui->sortByDate->setChecked(true);\r
+        if (sort & QDir::Reversed)\r
+            ui->orderAsc->setChecked(true);\r
     }\r
-    else if (sortBy == SortBySize) {\r
+    else if (sort & QDir::Size) {\r
         ui->sortBySize->setChecked(true);\r
+        if (sort & QDir::Reversed)\r
+            ui->orderAsc->setChecked(true);\r
     }\r
-    else if (sortBy == SortByDate) {\r
-        ui->sortByDate->setChecked(true);\r
+    else if (sort & QDir::Type) {\r
+        ui->sortByType->setChecked(true);\r
+        if (sort & QDir::Reversed)\r
+            ui->orderDesc->setChecked(true);\r
     }\r
     else {\r
         ui->sortByName->setChecked(true);\r
+        if (sort & QDir::Reversed)\r
+            ui->orderDesc->setChecked(true);\r
     }\r
 \r
-    int orderBy = settings.value(m_RightOrLeft + slash + IniKey_OrderBy).toInt();\r
-    if (orderBy == OrderByDesc) {\r
-        ui->orderDesc->setChecked(true);\r
-    }\r
-    else {\r
-        ui->orderAsc->setChecked(true);\r
-    }\r
-\r
-    int putDirs = settings.value(m_RightOrLeft + slash + IniKey_PutDirs).toInt();\r
-    if (putDirs == PutDirsDefault) {\r
-        ui->dirsDefault->setChecked(true);\r
+    if (sort & QDir::DirsFirst) {\r
+        ui->dirsFirst->setChecked(true);\r
     }\r
-    else if (putDirs == PutDirsLast) {\r
+    else if (sort & QDir::DirsLast) {\r
         ui->dirsLast->setChecked(true);\r
     }\r
     else {\r
-        ui->dirsFirst->setChecked(true);\r
+        ui->dirsLast->setChecked(true);\r
     }\r
 \r
-    bool ignoreCase = settings.value(m_RightOrLeft + slash + IniKey_IgnoreCase).toBool();\r
-    ui->ignoreCase->setChecked(ignoreCase);\r
+    if (sort & QDir::IgnoreCase)\r
+        ui->ignoreCase->setChecked(true);\r
 }\r
 \r
+\r
 void SortDialog::accept()\r
 {\r
-    QSettings settings;\r
+    QDir::SortFlags sort;\r
 \r
-    QString key = m_RightOrLeft + slash + IniKey_SortBy;\r
     if (ui->sortByDate->isChecked()) {\r
-        settings.setValue(key, SortByDate);\r
-    }\r
-    else if (ui->sortByName->isChecked()) {\r
-        settings.setValue(key, SortByName);\r
+        sort |= QDir::Time;\r
+        if (ui->orderAsc->isChecked())\r
+            sort |= QDir::Reversed;\r
     }\r
     else if (ui->sortBySize->isChecked()) {\r
-        settings.setValue(key, SortBySize);\r
+        sort |= QDir::Size;\r
+        if (ui->orderAsc->isChecked())\r
+            sort |= QDir::Reversed;\r
     }\r
-    else {\r
-        settings.setValue(key, SortByType);\r
-    }\r
-\r
-    key = m_RightOrLeft + slash + IniKey_OrderBy;\r
-    if (ui->orderAsc->isChecked()) {\r
-        settings.setValue(key, OrderByAsc);\r
+    else if (ui->sortByType->isChecked()) {\r
+        sort |= QDir::Type;\r
+        if (ui->orderDesc->isChecked())\r
+            sort |= QDir::Reversed;\r
     }\r
     else {\r
-        settings.setValue(key, OrderByDesc);\r
+        sort |= QDir::Name;\r
+        if (ui->orderDesc->isChecked())\r
+            sort |= QDir::Reversed;\r
     }\r
 \r
-    key = m_RightOrLeft + slash + IniKey_PutDirs;\r
-    if (ui->dirsDefault->isChecked()) {\r
-        settings.setValue(key, PutDirsDefault);\r
-    }\r
-    else if (ui->dirsFirst->isChecked()) {\r
-        settings.setValue(key, PutDirsFirst);\r
+    if (ui->dirsFirst->isChecked()) {\r
+        sort |= QDir::DirsFirst;\r
     }\r
-    else {\r
-        settings.setValue(key, PutDirsLast);\r
+    else if (ui->dirsLast->isChecked()) {\r
+        sort |= QDir::DirsLast;\r
     }\r
 \r
-    key = m_RightOrLeft + slash + IniKey_IgnoreCase;\r
-    settings.setValue(key, ui->ignoreCase->isChecked());\r
+    if (ui->ignoreCase->isChecked())\r
+        sort |= QDir::IgnoreCase;\r
+\r
+    m_model->setSorting(sort);\r
+    m_model->refresh();\r
 \r
     QDialog::accept();\r
 }\r
index 04b5ce5..79c4988 100644 (file)
@@ -2,6 +2,7 @@
 #define SORTDIALOG_H\r
 \r
 #include <QDialog>\r
+class FolderModel;\r
 \r
 namespace Ui {\r
 class SortDialog;\r
@@ -15,14 +16,14 @@ public:
     explicit SortDialog(QWidget *parent = 0);\r
     ~SortDialog();\r
 \r
-    void setRightOrLeft(const QString &s);\r
+    void    setModel(FolderModel *m);\r
 \r
 protected:\r
     void accept();\r
 \r
 private:\r
     Ui::SortDialog *ui;\r
-    QString m_RightOrLeft;\r
+    FolderModel *m_model;\r
 };\r
 \r
 #endif // SORTDIALOG_H\r
diff --git a/thumbnaildelegate.cpp b/thumbnaildelegate.cpp
new file mode 100644 (file)
index 0000000..fcb79c6
--- /dev/null
@@ -0,0 +1,90 @@
+#include "foldermodel.h"
+#include "thumbnaildelegate.h"
+
+#include <QApplication>
+#include <QDebug>
+#include <QPainter>
+#include <QStylePainter>
+
+ThumbnailDelegate::ThumbnailDelegate(QObject *parent) :
+    QStyledItemDelegate(parent),
+    m_pixmapCache()
+{
+}
+
+void ThumbnailDelegate::model_Reset()
+{
+    m_pixmapCache.clear();
+}
+
+void ThumbnailDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+    const FolderModel *model = static_cast<const FolderModel*>(index.model());
+    bool checked = model->data(index, Qt::CheckStateRole).toInt() == Qt::Checked;
+
+    // マーク
+    if (checked) {
+        painter->fillRect(option.rect, model->data(index, Qt::BackgroundRole).value<QBrush>());
+    }
+    // ハイライト
+    if (option.state & QStyle::State_Selected) {
+        painter->fillRect(option.rect, option.palette.highlight());
+    }
+
+    // ファイル名
+    QFont font = model->data(index, Qt::FontRole).value<QFont>();
+    QFontMetrics fm(font);
+    QSize padding(20, fm.height());
+    QRect rc(option.rect);
+    rc.setLeft(rc.left() + padding.width());
+    QString name = fm.elidedText(model->fileName(index), Qt::ElideMiddle, rc.width());
+    painter->setFont(font);
+    painter->setPen(model->data(index, Qt::ForegroundRole).value<QBrush>().color());
+    painter->drawText(rc, name, Qt::AlignCenter | Qt::AlignBottom);
+
+    // チェックボックス
+    if (model->flags(index) & Qt::ItemIsUserCheckable) {
+        QStyleOptionButton optBtn;
+        optBtn.rect = option.rect;
+        optBtn.state = option.state;
+        if (checked)
+            optBtn.state |= QStyle::State_On;
+        qApp->style()->drawControl(QStyle::CE_CheckBox, &optBtn, painter);
+    }
+
+    // アイコンまたは画像
+    QSize size(option.rect.size());
+    size -= padding;
+    if (m_pixmapCache.find(model->fileName(index)) == m_pixmapCache.end()) {
+        QPixmap pixmap(model->filePath(index));
+        if (pixmap.isNull()) {
+            pixmap = model->fileIcon(index).pixmap(32, 32);
+        }
+        if (pixmap.width() > size.width() || pixmap.height() > size.height()) {
+            double scaleX = 1.0 * size.width() / pixmap.width();
+            double scaleY = 1.0 * size.height() / pixmap.height();
+            double scaleFactor = (scaleX > scaleY) ? scaleY : scaleX;
+            pixmap = pixmap.scaled(pixmap.size() * scaleFactor,
+                                   Qt::IgnoreAspectRatio,
+                                   Qt::SmoothTransformation);
+        }
+        const_cast<ThumbnailDelegate*>(this)->m_pixmapCache[model->fileName(index)] = pixmap;
+    }
+    const QPixmap &pixmap = m_pixmapCache[model->fileName(index)];
+
+    painter->drawPixmap(padding.width() + option.rect.left() + (size.width() - pixmap.width()) / 2,
+                        option.rect.top() + (size.height() - pixmap.height()) / 2,
+                        pixmap);
+
+    //QStyledItemDelegate::paint(painter, option, index);
+}
+
+QSize ThumbnailDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+    Q_UNUSED(option);
+
+    const FolderModel *model = static_cast<const FolderModel*>(index.model());
+    int pointSize = model->data(index, Qt::FontRole).value<QFont>().pointSize();
+
+    return QSize(pointSize * 10, pointSize * 10 * 11 / 16);
+}
diff --git a/thumbnaildelegate.h b/thumbnaildelegate.h
new file mode 100644 (file)
index 0000000..75207b6
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef THUMBNAILDELEGATE_H
+#define THUMBNAILDELEGATE_H
+
+#include <QStyledItemDelegate>
+
+class ThumbnailDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT
+public:
+    explicit ThumbnailDelegate(QObject *parent = 0);
+
+private:
+    typedef QMap<QString, QPixmap> ImageMap;
+    ImageMap m_pixmapCache;
+
+signals:
+
+public slots:
+    void    model_Reset();
+
+    // QAbstractItemDelegate interface
+public:
+    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
+};
+
+#endif // THUMBNAILDELEGATE_H
diff --git a/thumbnailview.cpp b/thumbnailview.cpp
new file mode 100644 (file)
index 0000000..be1ef6c
--- /dev/null
@@ -0,0 +1,61 @@
+#include "mainwindow.h"
+#include "thumbnaildelegate.h"
+#include "thumbnailview.h"
+
+#include <QDebug>
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief ThumbnailView::ThumbnailView
+/// \param parent   親ウィジェット
+///
+/// コンストラクタ
+///
+ThumbnailView::ThumbnailView(QWidget *parent) :
+    QListView(parent)
+{
+    setItemDelegate(new ThumbnailDelegate(this));
+    setSpacing(12);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief ThumbnailView::initialize
+/// \param w    メインウィンドウオブジェクト
+///
+/// 初期化処理を行います。
+///
+void ThumbnailView::initialize(MainWindow *w)
+{
+    qDebug() << "ThumbnailView::initialize()";
+
+    connect(this, SIGNAL(doubleClicked(QModelIndex)), w, SLOT(onOpen(QModelIndex)));
+    connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
+            w, SLOT(view_currentChanged(QModelIndex,QModelIndex)));
+
+    installEventFilter(w);
+    viewport()->installEventFilter(w);
+}
+
+void ThumbnailView::scaleUp()
+{
+    // TODO
+}
+
+void ThumbnailView::scaleDown()
+{
+    // TODO
+}
+
+void ThumbnailView::setModel(QAbstractItemModel *model)
+{
+    ThumbnailDelegate *delegate = static_cast<ThumbnailDelegate*>(itemDelegate());
+    if (this->model()) {
+        this->model()->disconnect(delegate);
+    }
+
+    QListView::setModel(model);
+
+    if (this->model()) {
+        connect(this->model(), SIGNAL(modelReset()), delegate, SLOT(model_Reset()));
+    }
+}
+
diff --git a/thumbnailview.h b/thumbnailview.h
new file mode 100644 (file)
index 0000000..d5c3c27
--- /dev/null
@@ -0,0 +1,34 @@
+#ifndef THUMBNAILVIEW_H
+#define THUMBNAILVIEW_H
+
+#include "abstractview.h"
+
+#include <QListView>
+
+class MainWindow;
+
+class ThumbnailView : public QListView, public AbstractView
+{
+    Q_OBJECT
+public:
+    explicit ThumbnailView(QWidget *parent = 0);
+
+    void    initialize(MainWindow *w);
+
+signals:
+
+public slots:
+
+
+    // AbstractView interface
+public:
+    void scaleUp();
+    void scaleDown();
+
+    // QAbstractItemView interface
+public:
+    void setModel(QAbstractItemModel *model);
+
+};
+
+#endif // THUMBNAILVIEW_H
diff --git a/win32.cpp b/win32.cpp
new file mode 100644 (file)
index 0000000..8fd8a27
--- /dev/null
+++ b/win32.cpp
@@ -0,0 +1,22 @@
+//#define Q_OS_WIN
+
+#include "win32.h"
+
+#ifdef Q_OS_WIN
+    #include <windows.h>
+#endif
+
+bool Win32::hasSystemAttribute(const QString &path)
+{
+#ifdef Q_OS_WIN
+    DWORD dwFlags = ::GetFileAttributes(path.toStdWString().c_str());
+    if (dwFlags != DWORD(-1) &&
+        (dwFlags & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM)
+    {
+        return true;
+    }
+#else
+    Q_UNUSED(path);
+#endif
+    return false;
+}
diff --git a/win32.h b/win32.h
new file mode 100644 (file)
index 0000000..74228ab
--- /dev/null
+++ b/win32.h
@@ -0,0 +1,11 @@
+#ifndef WIN32_H
+#define WIN32_H
+
+#include <QString>
+
+namespace Win32 {
+
+bool hasSystemAttribute(const QString &path);
+
+}
+#endif // WIN32_H