OSDN Git Service

ソート機能を実装。
authorMasayuki Satoh <miyabi.satoh@gmail.com>
Mon, 18 Aug 2014 09:27:24 +0000 (18:27 +0900)
committerMasayuki Satoh <miyabi.satoh@gmail.com>
Mon, 18 Aug 2014 09:27:24 +0000 (18:27 +0900)
12 files changed:
Gefu.pro
README.md
common.h
filetablewidget.cpp
folderpanel.cpp
folderpanel.h
mainwindow.cpp
mainwindow.h
mainwindow.ui
sortdialog.cpp [new file with mode: 0644]
sortdialog.h [new file with mode: 0644]
sortdialog.ui [new file with mode: 0644]

index 8309267..4bd8473 100644 (file)
--- a/Gefu.pro
+++ b/Gefu.pro
@@ -24,7 +24,8 @@ SOURCES += main.cpp\
     deleteworker.cpp \\r
     overwritedialog.cpp \\r
     copymoveworker.cpp \\r
-    filetablewidget.cpp\r
+    filetablewidget.cpp \\r
+    sortdialog.cpp\r
 \r
 HEADERS  += mainwindow.h \\r
     folderpanel.h \\r
@@ -39,14 +40,16 @@ HEADERS  += mainwindow.h \
     deleteworker.h \\r
     overwritedialog.h \\r
     copymoveworker.h \\r
-    filetablewidget.h\r
+    filetablewidget.h \\r
+    sortdialog.h\r
 \r
 FORMS    += mainwindow.ui \\r
     folderpanel.ui \\r
     renamesingledialog.ui \\r
     renamemultidialog.ui \\r
     operationdialog.ui \\r
-    overwritedialog.ui\r
+    overwritedialog.ui \\r
+    sortdialog.ui\r
 \r
 RESOURCES += \\r
     resource.qrc\r
index 3fa08c9..a09c741 100644 (file)
--- a/README.md
+++ b/README.md
@@ -3,11 +3,20 @@ Gefu
 
 Gefu is Experimental File Utility.
 
-#### 2014.08.XX Ver0.01
+### TODO
+- フォルダ履歴
+- 環境設定ダイアログ
+- QTableWidget -> QTableView + Modelへの変更(速くなるかな?)
+- 高速化(Win32 APIの使用も考慮)
+
+#### 2014.08.18 Ver0.01 作業中
 - 名前変更ダイアログ(単一)のレイアウトを修正。
 - すべて選択等で、カーソル位置が変わらないようにした。
 - マークしているフォルダ数、ファイル数、合計ファイルサイズの表示を追加。
 - ファイルサイズを小数点第一位まで表示するようにした。
+- システム属性ファイルの表示/非表示機能を追加。
+- 名前ソートで大文字小文字を区別しないようにした。
+- ソート方法の選択機能を追加。
 
-#### 2014.08.18 Ver0.00
-- 新規公開
+#### 2014.08.18 Ver0.00 公開
+- 新規
index 75f4a81..1285ac4 100644 (file)
--- a/common.h
+++ b/common.h
@@ -14,4 +14,39 @@ extern QString FilesizeToString(quint64 size);
 #define VERSION_STRING  "0.01"\r
 #define VERSION_VALUE   0.01\r
 \r
+#define slash   QString("/")\r
+\r
+#define IniKey_ShowHidden       "Common/ShowHidden"\r
+#define IniKey_ShowSystem       "Common/ShowSystem"\r
+#define IniSec_Left             "Left"\r
+#define IniSec_Right            "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
+#define IniKey_LeftDir          IniSec_Left"/"IniKey_Dir\r
+#define IniKey_LeftSortBy       IniSec_Left"/"IniKey_SortBy\r
+#define IniKey_LeftOrderBy      IniSec_Left"/"IniKey_OrderBy\r
+#define IniKey_LeftPutDirs    IniSec_Left"/"IniKey_PutDirs\r
+#define IniKey_LeftIgnoreCase   IniSec_Left"/"IniKey_IgnoreCase\r
+#define IniKey_RightDir         IniSec_Right"/"IniKey_Dir\r
+#define IniKey_RightSortBy      IniSec_Right"/"IniKey_SortBy\r
+#define IniKey_RightOrderBy     IniSec_Right"/"IniKey_OrderBy\r
+#define IniKey_RightPutDirs   IniSec_Right"/"IniKey_PutDirs\r
+#define IniKey_RightIgnoreCase  IniSec_Right"/"IniKey_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
+\r
 #endif // COMMON_H\r
index 21247d2..56e845f 100644 (file)
@@ -168,6 +168,19 @@ void FileTableWidget::keyPressEvent(QKeyEvent *event)
         }\r
         break;\r
 \r
+    case Qt::Key_S:\r
+        // S            ソート方法を選択\r
+        // Shift + S    システムファイルを表示/非表示\r
+        if (event->modifiers() == Qt::NoModifier) {\r
+            getMainWnd()->onViewSort();\r
+            accepted = true;\r
+        }\r
+        else if (event->modifiers() == Qt::ShiftModifier) {\r
+            getMainWnd()->onViewSystem();\r
+            accepted = true;\r
+        }\r
+        break;\r
+\r
     case Qt::Key_U:\r
         // U    すべてのマークを解除\r
         if (event->modifiers() == Qt::NoModifier) {\r
index 8d25404..1a5bff7 100644 (file)
@@ -8,6 +8,10 @@
 #include <QDebug>\r
 #include <QDateTime>\r
 #include <QDesktopServices>\r
+#include <QSettings>\r
+#ifdef Q_OS_WIN32\r
+    #include <windows.h>\r
+#endif\r
 \r
 QString FilesizeToString(quint64 size)\r
 {\r
@@ -44,9 +48,18 @@ FolderPanel::FolderPanel(QWidget *parent) :
     header->setSectionResizeMode(2, QHeaderView::ResizeToContents);\r
     header->setSectionResizeMode(3, QHeaderView::ResizeToContents);\r
 \r
-    // フォルダの要素を表示\r
-    m_dir.setFilter(QDir::NoDot | QDir::AllEntries);\r
-    m_dir.setSorting(QDir::DirsFirst | QDir::Name);\r
+    QSettings settings;\r
+    // フィルタ初期化\r
+    m_dir.setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);\r
+    if (settings.value(IniKey_ShowHidden, false).toBool()) {\r
+        m_dir.setFilter(m_dir.filter() | QDir::Hidden);\r
+    }\r
+    if (settings.value(IniKey_ShowSystem, false).toBool()) {\r
+        m_dir.setFilter(m_dir.filter() | QDir::System);\r
+    }\r
+\r
+    // ソート順初期化\r
+    m_dir.setSorting(QDir::DirsFirst | QDir::IgnoreCase);\r
 }\r
 \r
 FolderPanel::~FolderPanel()\r
@@ -67,10 +80,13 @@ const FileTableWidget *FolderPanel::fileTable() const
 \r
 void FolderPanel::setCurrentFolder(const QString &path)\r
 {\r
+    QSettings settings;\r
+\r
     getMainWnd()->setStatusText(tr("ファイルリストを更新中..."));\r
     QString curDir = m_dir.absolutePath();\r
     m_dir.setPath(QDir::cleanPath(path));\r
     m_dir.canonicalPath();\r
+\r
     QFileInfoList list = m_dir.entryInfoList();\r
 \r
     if (list.empty()) {\r
@@ -87,6 +103,11 @@ void FolderPanel::setCurrentFolder(const QString &path)
     // フォルダの変更監視\r
     InstallWatcher();\r
 \r
+    // QtはWindowsのシステムファイル属性をうまく判定できていないため、\r
+    // GetFileAttributes APIを使ってフィルタする\r
+    bool showSystem;\r
+    showSystem = settings.value(IniKey_ShowSystem, false).toBool();\r
+\r
     beginUpdate();\r
     ui->fileTable->model()->removeRows(0, ui->fileTable->rowCount());\r
     for (int i = 0; i < list.size(); i++) {\r
@@ -95,6 +116,13 @@ void FolderPanel::setCurrentFolder(const QString &path)
             continue;\r
         }\r
 \r
+#ifdef Q_OS_WIN32\r
+        DWORD dwFlags = ::GetFileAttributes(info.absoluteFilePath().toStdWString().c_str());\r
+        if (!showSystem && dwFlags != DWORD(-1) && (dwFlags & FILE_ATTRIBUTE_SYSTEM)) {\r
+            continue;\r
+        }\r
+#endif\r
+\r
         int row = ui->fileTable->rowCount();\r
         ui->fileTable->insertRow(row);\r
 \r
@@ -117,24 +145,9 @@ void FolderPanel::setCurrentFolder(const QString &path)
         else {\r
             str = FilesizeToString(info.size());\r
         }\r
-#if 0\r
-        else if (info.size() >= 1024 * 1024 * 1024) {\r
-            str = tr("%1GB").arg(int(info.size() / (1024 * 1024 * 1024)));\r
-        }\r
-        else if (info.size() >= 1024 * 1024) {\r
-            str = tr("%1MB").arg(int(info.size() / (1024 * 1024)));\r
-        }\r
-        else if (info.size() >= 1024) {\r
-            str = tr("%1KB").arg(int(info.size() / 1024));\r
-        }\r
-        else {\r
-            str = tr("%1B").arg(info.size());\r
-        }\r
-#endif\r
         QTableWidgetItem *iSize = new QTableWidgetItem(str);\r
         iSize->setFlags(iSize->flags() ^ Qt::ItemIsEditable);\r
         iSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
-\r
         ui->fileTable->setItem(row, 2, iSize);\r
 \r
         // 最終更新日時\r
index 1a9e374..673a9a7 100644 (file)
@@ -31,8 +31,15 @@ public:
     void InstallWatcher();\r
     void UninstallWatcher();\r
 \r
-    void beginUpdate()      { m_bUpdating = true; }\r
-    void endUpdate()        { m_bUpdating = false; onUpdateMark(0, 0);}\r
+    void beginUpdate() {\r
+        m_bUpdating = true;\r
+//        setUpdatesEnabled(false);\r
+    }\r
+    void endUpdate() {\r
+        m_bUpdating = false;\r
+//        setUpdatesEnabled(true);\r
+        onUpdateMark(0, 0);\r
+    }\r
     bool isUpdating() const { return m_bUpdating; }\r
 \r
 private:\r
index 35549b2..e45287f 100644 (file)
@@ -6,6 +6,7 @@
 #include "renamemultidialog.h"\r
 #include "renamesingledialog.h"\r
 #include "renameworker.h"\r
+#include "sortdialog.h"\r
 #include "ui_mainwindow.h"\r
 #include <QFileSystemModel>\r
 #include <QDebug>\r
@@ -25,8 +26,12 @@ MainWindow::MainWindow(QWidget *parent) :
     ui->setupUi(this);\r
 \r
     QSettings settings;\r
-    bool checked = settings.value("Common/ShowHidden", false).toBool();\r
-    ui->view_Hidden->setChecked(checked);\r
+    if (settings.value(IniKey_ShowHidden, false).toBool()) {\r
+        ui->view_Hidden->setChecked(true);\r
+    }\r
+    if (settings.value(IniKey_ShowSystem, false).toBool()) {\r
+        ui->view_System->setChecked(true);\r
+    }\r
 \r
     // メニューのシグナル/スロットを設定する\r
     connect(ui->action_Command, SIGNAL(triggered()), this, SLOT(onActionCommand()));\r
@@ -55,7 +60,9 @@ MainWindow::MainWindow(QWidget *parent) :
     connect(ui->view_FromOther, SIGNAL(triggered()), this, SLOT(onViewFromOther()));\r
     connect(ui->view_ToOther, SIGNAL(triggered()), this, SLOT(onViewToOther()));\r
     connect(ui->view_Hidden, SIGNAL(triggered()), this, SLOT(onViewHidden()));\r
+    connect(ui->view_Sort, SIGNAL(triggered()), this, SLOT(onViewSort()));\r
     connect(ui->view_Swap, SIGNAL(triggered()), this, SLOT(onViewSwap()));\r
+    connect(ui->view_System, SIGNAL(triggered()), this, SLOT(onViewSystem()));\r
 \r
     connect(ui->cmd_Copy, SIGNAL(triggered()), this, SLOT(onCmdCopy()));\r
     connect(ui->cmd_Delete, SIGNAL(triggered()), this, SLOT(onCmdDelete()));\r
@@ -67,19 +74,80 @@ MainWindow::MainWindow(QWidget *parent) :
     connect(ui->help_About, SIGNAL(triggered()), this, SLOT(onHelpAbout()));\r
 \r
     // ウィンドウタイトルを設定する\r
-    setWindowTitle(tr("げふぅ v0.00"));\r
+    setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));\r
     // ウィンドウアイコンを設定する\r
     setWindowIcon(QIcon(":/images/Gefu.png"));\r
 \r
     // ウィンドウ初期サイズを設定する\r
     resize(800, 600);\r
 \r
+\r
+    int sortBy, orderBy;\r
+    // 左ペインのソート初期値\r
+    QDir *dir;\r
+    dir = ui->folderPanel_L->dir();\r
+    dir->setSorting(QDir::Name);  // 0\r
+\r
+    sortBy = settings.value(IniKey_LeftSortBy, SortByName).toInt();\r
+    switch (sortBy) {\r
+    case SortByDate:    dir->setSorting(dir->sorting() | QDir::Time); break;\r
+    case SortBySize:    dir->setSorting(dir->sorting() | QDir::Size); break;\r
+    case SortByType:    dir->setSorting(dir->sorting() | QDir::Type); break;\r
+    default:            dir->setSorting(dir->sorting() | QDir::Name); break;\r
+    }\r
+\r
+    // デフォルトだと文字列は昇順で、数値は降順…orz\r
+    orderBy = settings.value(IniKey_LeftOrderBy, OrderByDesc).toInt();\r
+    if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
+        ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
+    {\r
+        dir->setSorting(dir->sorting() | QDir::Reversed);\r
+    }\r
+\r
+    switch (settings.value(IniKey_LeftPutDirs, PutDirsFirst).toInt()) {\r
+    case PutDirsFirst:  dir->setSorting(dir->sorting() | QDir::DirsFirst); break;\r
+    case PutDirsLast:   dir->setSorting(dir->sorting() | QDir::DirsLast); break;\r
+    }\r
+\r
+    if (settings.value(IniKey_LeftIgnoreCase, true).toBool()) {\r
+        dir->setSorting(dir->sorting() | QDir::IgnoreCase);\r
+    }\r
+\r
+    // 右ペインのソート初期値\r
+    dir = ui->folderPanel_R->dir();\r
+    dir->setSorting(QDir::Name);  // 0\r
+\r
+    sortBy = settings.value(IniKey_RightSortBy, SortByName).toInt();\r
+    switch (sortBy) {\r
+    case SortByDate:    dir->setSorting(dir->sorting() | QDir::Time); break;\r
+    case SortBySize:    dir->setSorting(dir->sorting() | QDir::Size); break;\r
+    case SortByType:    dir->setSorting(dir->sorting() | QDir::Type); break;\r
+    default:            dir->setSorting(dir->sorting() | QDir::Name); break;\r
+    }\r
+\r
+    // デフォルトだと文字列は昇順で、数値は降順…orz\r
+    orderBy = settings.value(IniKey_RightOrderBy, OrderByDesc).toInt();\r
+    if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
+        ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
+    {\r
+        dir->setSorting(dir->sorting() | QDir::Reversed);\r
+    }\r
+\r
+    switch (settings.value(IniKey_RightPutDirs, PutDirsFirst).toInt()) {\r
+    case PutDirsFirst:  dir->setSorting(dir->sorting() | QDir::DirsFirst); break;\r
+    case PutDirsLast:   dir->setSorting(dir->sorting() | QDir::DirsLast); break;\r
+    }\r
+\r
+    if (settings.value(IniKey_RightIgnoreCase, true).toBool()) {\r
+        dir->setSorting(dir->sorting() | QDir::IgnoreCase);\r
+    }\r
+\r
     QString path;\r
 \r
-    path = settings.value("Left/dir", QDir::homePath()).toString();\r
+    path = settings.value(IniKey_LeftDir, QDir::homePath()).toString();\r
     ui->folderPanel_L->setCurrentFolder(path);\r
 \r
-    path = settings.value("Right/dir", QDir::homePath()).toString();\r
+    path = settings.value(IniKey_RightDir, QDir::homePath()).toString();\r
     ui->folderPanel_R->setCurrentFolder(path);\r
 }\r
 \r
@@ -87,8 +155,8 @@ MainWindow::~MainWindow()
 {\r
     QSettings settings;\r
 \r
-    settings.setValue("Left/dir", ui->folderPanel_L->dir()->absolutePath());\r
-    settings.setValue("Right/dir", ui->folderPanel_R->dir()->absolutePath());\r
+    settings.setValue(IniKey_LeftDir, ui->folderPanel_L->dir()->absolutePath());\r
+    settings.setValue(IniKey_RightDir, ui->folderPanel_R->dir()->absolutePath());\r
 \r
     delete ui;\r
 }\r
@@ -608,12 +676,14 @@ void MainWindow::onViewToOther()
 /// \brief MainWindow::onViewHidden\r
 ///\r
 /// 隠しファイルの表示/非表示を切り替えます(Shift + H)\r
+///\r
 void MainWindow::onViewHidden()\r
 {\r
     QSettings settings;\r
-    bool checked = !settings.value("Common/ShowHidden", false).toBool();\r
-    settings.setValue("Common/ShowHidden", checked);\r
-\r
+    bool checked = !settings.value(IniKey_ShowHidden, false).toBool();\r
+    settings.setValue(IniKey_ShowHidden, checked);\r
+    ui->view_Hidden->setChecked(checked);\r
+#if 1\r
     if (checked) {\r
         ui->folderPanel_L->dir()->setFilter(ui->folderPanel_L->dir()->filter() | QDir::Hidden);\r
         ui->folderPanel_R->dir()->setFilter(ui->folderPanel_R->dir()->filter() | QDir::Hidden);\r
@@ -622,11 +692,62 @@ void MainWindow::onViewHidden()
         ui->folderPanel_L->dir()->setFilter(ui->folderPanel_L->dir()->filter() ^ QDir::Hidden);\r
         ui->folderPanel_R->dir()->setFilter(ui->folderPanel_R->dir()->filter() ^ QDir::Hidden);\r
     }\r
-\r
+#endif\r
     ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());\r
     ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());\r
 }\r
 \r
+void MainWindow::onViewSort()\r
+{\r
+    FolderPanel *fp = activePanel();\r
+    if (!fp) {\r
+        return;\r
+    }\r
+\r
+    QString iniSec;\r
+    SortDialog dlg(this);\r
+    if (fp == ui->folderPanel_L) {\r
+        iniSec = IniSec_Left;\r
+    }\r
+    else {\r
+        iniSec = IniSec_Right;\r
+    }\r
+\r
+    dlg.setRightOrLeft(iniSec);\r
+    if (dlg.exec() == QDialog::Accepted) {\r
+        QSettings settings;\r
+        QDir *dir = fp->dir();\r
+        dir->setSorting(QDir::Name);  // 0\r
+\r
+        int sortBy = settings.value(iniSec + slash + IniKey_SortBy, 0).toInt();\r
+        switch (sortBy) {\r
+        case SortByDate:    dir->setSorting(dir->sorting() | QDir::Time); break;\r
+        case SortBySize:    dir->setSorting(dir->sorting() | QDir::Size); break;\r
+        case SortByType:    dir->setSorting(dir->sorting() | QDir::Type); break;\r
+        default:            dir->setSorting(dir->sorting() | QDir::Name); break;\r
+        }\r
+\r
+        // デフォルトだと文字列は昇順で、数値は降順…orz\r
+        int orderBy = settings.value(iniSec + slash + IniKey_OrderBy, 0).toInt();\r
+        if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
+            ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
+        {\r
+            dir->setSorting(dir->sorting() | QDir::Reversed);\r
+        }\r
+\r
+        switch (settings.value(iniSec + slash + IniKey_PutDirs, 0).toInt()) {\r
+        case PutDirsFirst:  dir->setSorting(dir->sorting() | QDir::DirsFirst); break;\r
+        case PutDirsLast:   dir->setSorting(dir->sorting() | QDir::DirsLast); break;\r
+        }\r
+\r
+        if (settings.value(iniSec + slash + IniKey_IgnoreCase, true).toBool()) {\r
+            dir->setSorting(dir->sorting() | QDir::IgnoreCase);\r
+        }\r
+\r
+        fp->setCurrentFolder(fp->dir()->absolutePath());\r
+    }\r
+}\r
+\r
 ///\r
 /// \brief MainWindow::onViewSwap\r
 ///\r
@@ -648,6 +769,34 @@ void MainWindow::onViewSwap()
 }\r
 \r
 ///\r
+/// \brief MainWindow::onViewSystem\r
+///\r
+/// システムファイルの表示/非表示を切り替えます(Shift + H)\r
+///\r
+void MainWindow::onViewSystem()\r
+{\r
+    QSettings settings;\r
+    bool checked = !settings.value(IniKey_ShowSystem, false).toBool();\r
+    settings.setValue(IniKey_ShowSystem, checked);\r
+    ui->view_System->setChecked(checked);\r
+#if 1\r
+    QDir *dirs[2];\r
+    dirs[0] = ui->folderPanel_L->dir();\r
+    dirs[1] = ui->folderPanel_R->dir();\r
+    for (int n = 0; n < 2; n++) {\r
+        if (checked) {\r
+            dirs[n]->setFilter(dirs[n]->filter() | QDir::System);\r
+        }\r
+        else {\r
+            dirs[n]->setFilter(dirs[n]->filter() ^ QDir::System);\r
+        }\r
+    }\r
+#endif\r
+    ui->folderPanel_L->setCurrentFolder(ui->folderPanel_L->dir()->absolutePath());\r
+    ui->folderPanel_R->setCurrentFolder(ui->folderPanel_R->dir()->absolutePath());\r
+}\r
+\r
+///\r
 /// \brief MainWindow::onCmdMove\r
 ///\r
 /// ファイルを移動します(Ctrl + M)\r
index f30c370..d150c7b 100644 (file)
@@ -47,7 +47,9 @@ public slots:
     void onViewFromOther();\r
     void onViewToOther();\r
     void onViewHidden();\r
+    void onViewSort();\r
     void onViewSwap();\r
+    void onViewSystem();\r
 \r
     void onCmdMove();\r
     void onCmdCopy();\r
index 2ee3f2d..d26cf96 100644 (file)
     <addaction name="view_Swap"/>\r
     <addaction name="separator"/>\r
     <addaction name="view_Hidden"/>\r
+    <addaction name="view_System"/>\r
+    <addaction name="separator"/>\r
     <addaction name="view_Sort"/>\r
    </widget>\r
    <widget class="QMenu" name="menu_Move">\r
     <enum>QAction::AboutRole</enum>\r
    </property>\r
   </action>\r
+  <action name="view_System">\r
+   <property name="checkable">\r
+    <bool>true</bool>\r
+   </property>\r
+   <property name="text">\r
+    <string>システムファイルを表示</string>\r
+   </property>\r
+   <property name="toolTip">\r
+    <string>システムファイルを表示</string>\r
+   </property>\r
+   <property name="shortcut">\r
+    <string>Shift+S</string>\r
+   </property>\r
+  </action>\r
  </widget>\r
  <layoutdefault spacing="6" margin="11"/>\r
  <customwidgets>\r
diff --git a/sortdialog.cpp b/sortdialog.cpp
new file mode 100644 (file)
index 0000000..e2b1a2b
--- /dev/null
@@ -0,0 +1,110 @@
+#include "common.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
+{\r
+    ui->setupUi(this);\r
+}\r
+\r
+SortDialog::~SortDialog()\r
+{\r
+    delete ui;\r
+}\r
+\r
+void SortDialog::setRightOrLeft(const QString &s)\r
+{\r
+    QSettings settings;\r
+\r
+    m_RightOrLeft = s;\r
+    int sortBy = settings.value(\r
+                m_RightOrLeft + slash + IniKey_SortBy,\r
+                SortByName).toInt();\r
+    if (sortBy == SortByType) {\r
+        ui->sortByType->setChecked(true);\r
+    }\r
+    else if (sortBy == SortBySize) {\r
+        ui->sortBySize->setChecked(true);\r
+    }\r
+    else if (sortBy == SortByDate) {\r
+        ui->sortByDate->setChecked(true);\r
+    }\r
+    else {\r
+        ui->sortByName->setChecked(true);\r
+    }\r
+\r
+    int orderBy = settings.value(\r
+                m_RightOrLeft + slash + IniKey_OrderBy,\r
+                OrderByAsc).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(\r
+                m_RightOrLeft + slash + IniKey_PutDirs,\r
+                PutDirsFirst).toInt();\r
+    if (putDirs == PutDirsDefault) {\r
+        ui->dirsDefault->setChecked(true);\r
+    }\r
+    else if (putDirs == PutDirsLast) {\r
+        ui->dirsLast->setChecked(true);\r
+    }\r
+    else {\r
+        ui->dirsFirst->setChecked(true);\r
+    }\r
+\r
+    bool ignoreCase = settings.value(\r
+                m_RightOrLeft + slash + IniKey_IgnoreCase, true).toBool();\r
+    ui->ignoreCase->setChecked(ignoreCase);\r
+}\r
+\r
+void SortDialog::accept()\r
+{\r
+    QSettings settings;\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
+    }\r
+    else if (ui->sortBySize->isChecked()) {\r
+        settings.setValue(key, SortBySize);\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
+    }\r
+    else {\r
+        settings.setValue(key, OrderByDesc);\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
+    }\r
+    else {\r
+        settings.setValue(key, PutDirsLast);\r
+    }\r
+\r
+    key = m_RightOrLeft + slash + IniKey_IgnoreCase;\r
+    settings.setValue(key, ui->ignoreCase->isChecked());\r
+\r
+    QDialog::accept();\r
+}\r
diff --git a/sortdialog.h b/sortdialog.h
new file mode 100644 (file)
index 0000000..04b5ce5
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef SORTDIALOG_H\r
+#define SORTDIALOG_H\r
+\r
+#include <QDialog>\r
+\r
+namespace Ui {\r
+class SortDialog;\r
+}\r
+\r
+class SortDialog : public QDialog\r
+{\r
+    Q_OBJECT\r
+\r
+public:\r
+    explicit SortDialog(QWidget *parent = 0);\r
+    ~SortDialog();\r
+\r
+    void setRightOrLeft(const QString &s);\r
+\r
+protected:\r
+    void accept();\r
+\r
+private:\r
+    Ui::SortDialog *ui;\r
+    QString m_RightOrLeft;\r
+};\r
+\r
+#endif // SORTDIALOG_H\r
diff --git a/sortdialog.ui b/sortdialog.ui
new file mode 100644 (file)
index 0000000..c1841a0
--- /dev/null
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ui version="4.0">\r
+ <class>SortDialog</class>\r
+ <widget class="QDialog" name="SortDialog">\r
+  <property name="geometry">\r
+   <rect>\r
+    <x>0</x>\r
+    <y>0</y>\r
+    <width>273</width>\r
+    <height>185</height>\r
+   </rect>\r
+  </property>\r
+  <property name="windowTitle">\r
+   <string>ソート方法を選択</string>\r
+  </property>\r
+  <layout class="QGridLayout" name="gridLayout">\r
+   <item row="0" column="0">\r
+    <layout class="QVBoxLayout" name="verticalLayout">\r
+     <item>\r
+      <widget class="QRadioButton" name="sortByName">\r
+       <property name="text">\r
+        <string>名前順</string>\r
+       </property>\r
+       <attribute name="buttonGroup">\r
+        <string notr="true">buttonGroup</string>\r
+       </attribute>\r
+      </widget>\r
+     </item>\r
+     <item>\r
+      <widget class="QRadioButton" name="sortByDate">\r
+       <property name="text">\r
+        <string>更新日時順</string>\r
+       </property>\r
+       <attribute name="buttonGroup">\r
+        <string notr="true">buttonGroup</string>\r
+       </attribute>\r
+      </widget>\r
+     </item>\r
+     <item>\r
+      <widget class="QRadioButton" name="sortBySize">\r
+       <property name="text">\r
+        <string>サイズ順</string>\r
+       </property>\r
+       <attribute name="buttonGroup">\r
+        <string notr="true">buttonGroup</string>\r
+       </attribute>\r
+      </widget>\r
+     </item>\r
+     <item>\r
+      <widget class="QRadioButton" name="sortByType">\r
+       <property name="text">\r
+        <string>拡張子順</string>\r
+       </property>\r
+       <attribute name="buttonGroup">\r
+        <string notr="true">buttonGroup</string>\r
+       </attribute>\r
+      </widget>\r
+     </item>\r
+    </layout>\r
+   </item>\r
+   <item row="0" column="1">\r
+    <layout class="QVBoxLayout" name="verticalLayout_2">\r
+     <item>\r
+      <widget class="QRadioButton" name="orderAsc">\r
+       <property name="text">\r
+        <string>昇順</string>\r
+       </property>\r
+       <attribute name="buttonGroup">\r
+        <string notr="true">buttonGroup_2</string>\r
+       </attribute>\r
+      </widget>\r
+     </item>\r
+     <item>\r
+      <widget class="QRadioButton" name="orderDesc">\r
+       <property name="text">\r
+        <string>降順</string>\r
+       </property>\r
+       <attribute name="buttonGroup">\r
+        <string notr="true">buttonGroup_2</string>\r
+       </attribute>\r
+      </widget>\r
+     </item>\r
+     <item>\r
+      <spacer name="verticalSpacer">\r
+       <property name="orientation">\r
+        <enum>Qt::Vertical</enum>\r
+       </property>\r
+       <property name="sizeHint" stdset="0">\r
+        <size>\r
+         <width>20</width>\r
+         <height>40</height>\r
+        </size>\r
+       </property>\r
+      </spacer>\r
+     </item>\r
+    </layout>\r
+   </item>\r
+   <item row="1" column="0" colspan="2">\r
+    <layout class="QHBoxLayout" name="horizontalLayout">\r
+     <item>\r
+      <widget class="QLabel" name="label">\r
+       <property name="text">\r
+        <string>フォルダの位置:</string>\r
+       </property>\r
+      </widget>\r
+     </item>\r
+     <item>\r
+      <widget class="QRadioButton" name="dirsFirst">\r
+       <property name="text">\r
+        <string>先頭</string>\r
+       </property>\r
+       <attribute name="buttonGroup">\r
+        <string notr="true">buttonGroup_3</string>\r
+       </attribute>\r
+      </widget>\r
+     </item>\r
+     <item>\r
+      <widget class="QRadioButton" name="dirsLast">\r
+       <property name="text">\r
+        <string>最後</string>\r
+       </property>\r
+       <attribute name="buttonGroup">\r
+        <string notr="true">buttonGroup_3</string>\r
+       </attribute>\r
+      </widget>\r
+     </item>\r
+     <item>\r
+      <widget class="QRadioButton" name="dirsDefault">\r
+       <property name="text">\r
+        <string>優先なし</string>\r
+       </property>\r
+       <attribute name="buttonGroup">\r
+        <string notr="true">buttonGroup_3</string>\r
+       </attribute>\r
+      </widget>\r
+     </item>\r
+    </layout>\r
+   </item>\r
+   <item row="2" column="0" colspan="2">\r
+    <layout class="QHBoxLayout" name="horizontalLayout_2">\r
+     <item>\r
+      <widget class="QLabel" name="label_2">\r
+       <property name="text">\r
+        <string>大文字・小文字:</string>\r
+       </property>\r
+      </widget>\r
+     </item>\r
+     <item>\r
+      <widget class="QCheckBox" name="ignoreCase">\r
+       <property name="text">\r
+        <string>区別しない</string>\r
+       </property>\r
+      </widget>\r
+     </item>\r
+     <item>\r
+      <spacer name="horizontalSpacer">\r
+       <property name="orientation">\r
+        <enum>Qt::Horizontal</enum>\r
+       </property>\r
+       <property name="sizeHint" stdset="0">\r
+        <size>\r
+         <width>40</width>\r
+         <height>20</height>\r
+        </size>\r
+       </property>\r
+      </spacer>\r
+     </item>\r
+    </layout>\r
+   </item>\r
+   <item row="3" column="0" colspan="2">\r
+    <widget class="QDialogButtonBox" name="buttonBox">\r
+     <property name="orientation">\r
+      <enum>Qt::Horizontal</enum>\r
+     </property>\r
+     <property name="standardButtons">\r
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\r
+     </property>\r
+    </widget>\r
+   </item>\r
+  </layout>\r
+ </widget>\r
+ <tabstops>\r
+  <tabstop>sortByName</tabstop>\r
+  <tabstop>sortByDate</tabstop>\r
+  <tabstop>sortBySize</tabstop>\r
+  <tabstop>sortByType</tabstop>\r
+  <tabstop>orderAsc</tabstop>\r
+  <tabstop>orderDesc</tabstop>\r
+  <tabstop>dirsFirst</tabstop>\r
+  <tabstop>dirsLast</tabstop>\r
+  <tabstop>dirsDefault</tabstop>\r
+  <tabstop>ignoreCase</tabstop>\r
+ </tabstops>\r
+ <resources/>\r
+ <connections>\r
+  <connection>\r
+   <sender>buttonBox</sender>\r
+   <signal>accepted()</signal>\r
+   <receiver>SortDialog</receiver>\r
+   <slot>accept()</slot>\r
+   <hints>\r
+    <hint type="sourcelabel">\r
+     <x>248</x>\r
+     <y>254</y>\r
+    </hint>\r
+    <hint type="destinationlabel">\r
+     <x>157</x>\r
+     <y>274</y>\r
+    </hint>\r
+   </hints>\r
+  </connection>\r
+  <connection>\r
+   <sender>buttonBox</sender>\r
+   <signal>rejected()</signal>\r
+   <receiver>SortDialog</receiver>\r
+   <slot>reject()</slot>\r
+   <hints>\r
+    <hint type="sourcelabel">\r
+     <x>316</x>\r
+     <y>260</y>\r
+    </hint>\r
+    <hint type="destinationlabel">\r
+     <x>286</x>\r
+     <y>274</y>\r
+    </hint>\r
+   </hints>\r
+  </connection>\r
+ </connections>\r
+ <buttongroups>\r
+  <buttongroup name="buttonGroup_2"/>\r
+  <buttongroup name="buttonGroup_3"/>\r
+  <buttongroup name="buttonGroup"/>\r
+ </buttongroups>\r
+</ui>\r