\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
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
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
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
\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
}\r
break;\r
\r
+ case Qt::FontRole:\r
+ return m_font;\r
+\r
case Qt::TextAlignmentRole:\r
switch (index.column()) {\r
case 0:\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
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
\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