OSDN Git Service

Ver0.11
[gefu/Gefu.git] / filetablemodel.cpp
index 834a046..4b89099 100644 (file)
@@ -3,6 +3,9 @@
 \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
@@ -13,8 +16,18 @@ FileTableModel::FileTableModel(QObject *parent) :
     m_fileInfoList(),\r
     m_checkStates(),\r
     m_IconFactory(),\r
-    m_fsWatcher(NULL)\r
+    m_fsWatcher(NULL),\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
@@ -41,24 +54,46 @@ bool FileTableModel::setPath(const QString &path)
         qDebug() << "ファイルリストを取得できません";\r
         qDebug() << path;\r
     }\r
-#ifdef Q_OS_WIN32\r
-    else if (!(filter() & QDir::System)){\r
+    else {\r
         QFileInfoList::iterator it;\r
         for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); ) {\r
-            DWORD dwFlags = ::GetFileAttributes(\r
-                        it->absoluteFilePath().toStdWString().c_str());\r
-            if (dwFlags != DWORD(-1) && it->fileName() != ".." &&\r
-                ((dwFlags & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM))\r
-            {\r
-                qDebug() << it->fileName() << " is system file.";\r
-                it = m_fileInfoList.erase(it);\r
+#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
-            else {\r
-                it++;\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
-#endif\r
+\r
     m_checkStates.resize(m_fileInfoList.size());\r
     m_checkStates.fill(Qt::Unchecked);\r
 \r
@@ -68,13 +103,14 @@ bool FileTableModel::setPath(const QString &path)
     m_fsWatcher = new QFileSystemWatcher(this);\r
     m_fsWatcher->addPath(path);\r
     connect(m_fsWatcher, SIGNAL(directoryChanged(QString)),\r
-            this, SLOT(refresh()));\r
+            this, SLOT(directoryChange(QString)));\r
 \r
     endResetModel();\r
 \r
-    emit rootChanged(m_dir.absolutePath());\r
-    stateChanged();\r
+//    emit rootChanged(m_dir.absolutePath());\r
+//    stateChanged();\r
 \r
+    emit dataChanged(QModelIndex(), QModelIndex());\r
     return !m_fileInfoList.isEmpty();\r
 }\r
 \r
@@ -85,55 +121,89 @@ Qt::CheckState FileTableModel::checkState(const QModelIndex &index) const
 \r
 void FileTableModel::setCheckState(const QModelIndex &index, Qt::CheckState state)\r
 {\r
+    beginResetModel();\r
     m_checkStates[index.row()] = state;\r
-    stateChanged();\r
+    if (state == Qt::Checked && index.row() == 0 &&\r
+        m_fileInfoList[0].fileName() == "..")\r
+    {\r
+        m_checkStates[0] = Qt::Unchecked;\r
+    }\r
+    endResetModel();;\r
+    emit dataChanged(index, this->index(index.row(), 3));\r
+\r
+//    stateChanged();\r
 }\r
 \r
 void FileTableModel::setCheckStateAll(Qt::CheckState state)\r
 {\r
     beginResetModel();\r
     m_checkStates.fill(state);\r
+    if (state == Qt::Checked && m_fileInfoList.size() > 1 &&\r
+        m_fileInfoList[0].fileName() == "..")\r
+    {\r
+        m_checkStates[0] = Qt::Unchecked;\r
+    }\r
     endResetModel();\r
+    emit dataChanged(QModelIndex(), QModelIndex());\r
 \r
-    stateChanged();\r
+//    stateChanged();\r
 }\r
 \r
-\r
-bool FileTableModel::isDir(const QModelIndex &index) const\r
+QFileInfo FileTableModel::fileInfo(const QModelIndex &index) const\r
 {\r
-    return m_fileInfoList[index.row()].isDir();\r
+    if (!index.isValid()) {\r
+        qDebug() << "fileInfo() : index is invalid.";\r
+        return QFileInfo();\r
+    }\r
+    return m_fileInfoList[index.row()];\r
 }\r
 \r
-const QString FileTableModel::absoluteFilePath(const QModelIndex &index) const\r
+void FileTableModel::updateAppearance()\r
 {\r
-    return m_dir.absoluteFilePath(m_fileInfoList[index.row()].fileName());\r
-}\r
+    QSettings settings;\r
+    QPalette palette(QApplication::palette("QTableView"));\r
+\r
+    m_font = settings.value(IniKey_ViewFont).value<QFont>();\r
+    m_NormalBrush = QBrush(settings.value(IniKey_ViewColorBgNormal).value<QColor>());\r
+    m_NormalTextBrush = QBrush(settings.value(IniKey_ViewColorFgNormal).value<QColor>());\r
+    m_MarkBrush = QBrush(settings.value(IniKey_ViewColorBgMark).value<QColor>());\r
+    m_MarkTextBrush = QBrush(settings.value(IniKey_ViewColorFgMark).value<QColor>());\r
+    m_SystemBrush = QBrush(settings.value(IniKey_ViewColorFgSystem).value<QColor>());\r
+    m_HiddenBrush = QBrush(settings.value(IniKey_ViewColorFgHidden).value<QColor>());\r
+    m_ReadonlyBrush = QBrush(settings.value(IniKey_ViewColorFgReadonly).value<QColor>());\r
+    m_ReadonlyBrush = QBrush(settings.value(IniKey_ViewColorFgReadonly).value<QColor>());\r
 \r
-QFileInfo FileTableModel::fileInfo(const QModelIndex &index) const\r
-{\r
-    return m_fileInfoList[index.row()];\r
+    beginResetModel();\r
+    endResetModel();\r
 }\r
 \r
-void FileTableModel::stateChanged()\r
+void FileTableModel::directoryChange(const QString &path)\r
 {\r
-    int numFolder = 0;\r
-    int numFile = 0;\r
-    quint64 totalSize = 0;\r
-    for (int n = 0; n < m_checkStates.size(); n++) {\r
-        if (m_checkStates[n] == Qt::Checked) {\r
-            if (m_fileInfoList[n].isDir()) {\r
-                numFolder++;\r
-            }\r
-            else {\r
-                numFile++;\r
-                totalSize += m_fileInfoList[n].size();\r
-            }\r
-        }\r
-    }\r
+    qDebug() << "FileTableModel::directoryChange";\r
 \r
-    emit stateChanged(numFolder, numFile, totalSize);\r
+    setPath(path);\r
 }\r
 \r
+//void FileTableModel::stateChanged()\r
+//{\r
+//    int numFolder = 0;\r
+//    int numFile = 0;\r
+//    quint64 totalSize = 0;\r
+//    for (int n = 0; n < m_checkStates.size(); n++) {\r
+//        if (m_checkStates[n] == Qt::Checked) {\r
+//            if (m_fileInfoList[n].isDir()) {\r
+//                numFolder++;\r
+//            }\r
+//            else {\r
+//                numFile++;\r
+//                totalSize += m_fileInfoList[n].size();\r
+//            }\r
+//        }\r
+//    }\r
+\r
+//    emit selectionChanged(numFolder, numFile, totalSize);\r
+//}\r
+\r
 QFileInfoList FileTableModel::checkedItems() const\r
 {\r
     QFileInfoList list;\r
@@ -200,6 +270,9 @@ QVariant FileTableModel::data(const QModelIndex &index, int role) const
         }\r
         break;\r
 \r
+    case Qt::FontRole:\r
+        return m_font;\r
+\r
     case Qt::TextAlignmentRole:\r
         switch (index.column()) {\r
         case 0:\r
@@ -211,6 +284,34 @@ QVariant FileTableModel::data(const QModelIndex &index, int role) const
         }\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
@@ -239,20 +340,30 @@ QVariant FileTableModel::headerData(int section, Qt::Orientation orientation, in
 Qt::ItemFlags FileTableModel::flags(const QModelIndex &index) const\r
 {\r
     Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;\r
-    if (index.column() == 0 && m_fileInfoList[index.row()].fileName() != "..")\r
-    {\r
-        flags |= Qt::ItemIsUserCheckable;\r
+    if (!index.isValid()) {\r
+        flags |= Qt::ItemIsDropEnabled;\r
+    }\r
+    else 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
+    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
-            stateChanged();\r
+            emit dataChanged(index, this->index(index.row(), 3));\r
+//            stateChanged();\r
             return true;\r
         }\r
         break;\r
@@ -260,3 +371,17 @@ bool FileTableModel::setData(const QModelIndex &index, const QVariant &value, in
 \r
     return false;\r
 }\r
+\r
+Qt::DropActions FileTableModel::supportedDropActions() const\r
+{\r
+    return Qt::CopyAction | Qt::MoveAction;\r
+}\r
+\r
+QStringList FileTableModel::mimeTypes() const\r
+{\r
+    QStringList types;\r
+\r
+    types << "text/uri-list";\r
+\r
+    return types;\r
+}\r