2 #include "filetablemodel.h"
\r
6 #include <QApplication>
\r
10 #include <windows.h>
\r
13 FileTableModel::FileTableModel(QObject *parent) :
\r
14 QAbstractTableModel(parent),
\r
22 m_NormalTextBrush(),
\r
30 setFilter(QDir::NoDot | QDir::AllDirs | QDir::Files);
\r
33 bool FileTableModel::setPath(const QString &path)
\r
35 qDebug() << "FileTableModel::setPath" << path;
\r
37 if (!QFileInfo::exists(path)) {
\r
38 qDebug() << "パスが存在しません";
\r
42 QFileInfo info(path);
\r
43 if (!info.isDir()) {
\r
44 qDebug() << "フォルダではありません";
\r
51 m_dir.setPath(path);
\r
52 m_fileInfoList = m_dir.entryInfoList();
\r
53 m_checkStates.clear();
\r
55 if (m_fileInfoList.isEmpty()) {
\r
56 qDebug() << "ファイルリストを取得できません";
\r
60 QFileInfoList::iterator it;
\r
61 for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); ) {
\r
63 if (!(filter() & QDir::System)){
\r
64 DWORD dwFlags = ::GetFileAttributes(
\r
65 it->absoluteFilePath().toStdWString().c_str());
\r
66 if (dwFlags != DWORD(-1) && it->fileName() != ".." &&
\r
67 ((dwFlags & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM))
\r
69 qDebug() << it->fileName() << " is system file.";
\r
70 it = m_fileInfoList.erase(it);
\r
75 if (it->fileName() == "..") {
\r
76 if (m_dir.isRoot()) {
\r
77 qDebug() << m_dir.absolutePath() << " is root.";
\r
78 it = m_fileInfoList.erase(it);
\r
84 // ソート方法によらず、".."は必ず先頭にする
\r
85 QFileInfoList::iterator itRoot = m_fileInfoList.end();
\r
86 for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); it++) {
\r
87 if (it->fileName() == "..") {
\r
92 if (itRoot != m_fileInfoList.end()) {
\r
93 QFileInfo info(*itRoot);
\r
94 m_fileInfoList.erase(itRoot);
\r
95 m_fileInfoList.push_front(info);
\r
99 m_checkStates.resize(m_fileInfoList.size());
\r
100 m_checkStates.fill(Qt::Unchecked);
\r
102 m_fsWatcher.addPath(path);
\r
103 connect(&m_fsWatcher, SIGNAL(directoryChanged(QString)),
\r
104 this, SLOT(directoryChange(QString)));
\r
108 emit dataChanged(QModelIndex(), QModelIndex());
\r
110 return !m_fileInfoList.isEmpty();
\r
113 QFileInfo FileTableModel::fileInfo(const QModelIndex &index) const
\r
115 qDebug() << "FileTableModel::fileInfo()" << index;
\r
117 if (index.isValid()) {
\r
118 return m_fileInfoList[index.row()];
\r
120 return QFileInfo();
\r
123 void FileTableModel::updateAppearance(bool darker)
\r
125 qDebug() << "FileTableModel::updateAppearance();" << darker;
\r
127 QSettings settings;
\r
128 int darkness = 100;
\r
130 darkness += settings.value(IniKey_Darkness).toInt();
\r
132 m_font = settings.value(IniKey_ViewFont).value<QFont>();
\r
134 m_NormalBrush = QBrush(settings.value(IniKey_ViewColorBgNormal).value<QColor>().darker(darkness));
\r
135 m_NormalTextBrush = QBrush(settings.value(IniKey_ViewColorFgNormal).value<QColor>().darker(darkness));
\r
136 m_MarkBrush = QBrush(settings.value(IniKey_ViewColorBgMark).value<QColor>().darker(darkness));
\r
137 m_MarkTextBrush = QBrush(settings.value(IniKey_ViewColorFgMark).value<QColor>().darker(darkness));
\r
138 m_SystemBrush = QBrush(settings.value(IniKey_ViewColorFgSystem).value<QColor>().darker(darkness));
\r
139 m_HiddenBrush = QBrush(settings.value(IniKey_ViewColorFgHidden).value<QColor>().darker(darkness));
\r
140 m_ReadonlyBrush = QBrush(settings.value(IniKey_ViewColorFgReadonly).value<QColor>().darker(darkness));
\r
141 m_ReadonlyBrush = QBrush(settings.value(IniKey_ViewColorFgReadonly).value<QColor>().darker(darkness));
\r
144 void FileTableModel::directoryChange(const QString &path)
\r
146 qDebug() << "FileTableModel::directoryChange" << path;
\r
148 m_fsWatcher.removePath(m_dir.absolutePath());
\r
152 int FileTableModel::rowCount(const QModelIndex &parent) const
\r
155 return m_fileInfoList.size();
\r
158 int FileTableModel::columnCount(const QModelIndex &parent) const
\r
164 QVariant FileTableModel::data(const QModelIndex &index, int role) const
\r
166 if (!index.isValid()) {
\r
170 const QFileInfo &info = m_fileInfoList.at(index.row());
\r
171 int checked = m_checkStates.at(index.row());
\r
174 case Qt::DisplayRole:
\r
175 switch (index.column()) {
\r
176 case 0: // チェックボックス
\r
177 return QString("");
\r
180 if (info.isDir()) {
\r
181 return info.fileName();
\r
183 if (info.fileName().left(1) == ".") { // "."で始まるファイル
\r
184 int pos = info.fileName().lastIndexOf(".");
\r
186 return info.fileName();
\r
189 return info.completeBaseName();
\r
192 if (info.isDir()) {
\r
195 if (info.fileName().left(1) == ".") { // "."で始まるファイル
\r
196 int pos = info.fileName().lastIndexOf(".");
\r
201 return info.suffix();
\r
204 if (info.isDir()) {
\r
205 return QString("<DIR>");
\r
208 return FilesizeToString(info.size());
\r
213 return info.lastModified().toString("yy/MM/dd hh:mm");
\r
217 case Qt::DecorationRole:
\r
218 if (index.column() == 1) {
\r
219 if (info.fileName() == "..") {
\r
220 return QIcon(":/images/Up.png");
\r
223 // infoを使うと、正しいアイコンが取れない場合がある…なぜ?
\r
224 // return m_IconFactory.icon(QFileInfo(info.absoluteFilePath()));
\r
225 return m_IconFactory.icon(QFileInfo(info));
\r
233 case Qt::TextAlignmentRole:
\r
234 switch (index.column()) {
\r
237 return Qt::AlignRight + Qt::AlignVCenter;
\r
239 return Qt::AlignLeft + Qt::AlignVCenter;
\r
243 case Qt::BackgroundRole:
\r
245 return m_MarkBrush;
\r
247 return m_NormalBrush;
\r
249 case Qt::ForegroundRole:
\r
251 return m_MarkTextBrush;
\r
255 DWORD dwFlags = ::GetFileAttributes(
\r
256 info.absoluteFilePath().toStdWString().c_str());
\r
257 if (dwFlags != DWORD(-1) && (dwFlags & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM)
\r
259 return m_SystemBrush;
\r
263 if (info.isHidden() && info.fileName() != "..") {
\r
264 return m_HiddenBrush;
\r
266 if (!info.isWritable()) {
\r
267 return m_ReadonlyBrush;
\r
269 return m_NormalTextBrush;
\r
271 case Qt::CheckStateRole:
\r
272 if (index.column() == 0 && info.fileName() != "..") {
\r
281 QVariant FileTableModel::headerData(int section, Qt::Orientation orientation, int role) const
\r
283 if (role == Qt::DisplayRole) {
\r
284 if (orientation == Qt::Horizontal) {
\r
286 case 0: return QString("");
\r
287 case 1: return tr("名前");
\r
288 case 2: return tr("拡張子");
\r
289 case 3: return tr("サイズ");
\r
290 case 4: return tr("更新日時");
\r
297 Qt::ItemFlags FileTableModel::flags(const QModelIndex &index) const
\r
299 Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
\r
301 if (!index.isValid()) {
\r
302 return flags | Qt::ItemIsDropEnabled;
\r
305 if (m_fileInfoList[index.row()].fileName() != "..") {
\r
306 if (index.column() == 0) {
\r
307 flags |= Qt::ItemIsUserCheckable;
\r
309 flags |= Qt::ItemIsDropEnabled;
\r
314 bool FileTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
\r
316 qDebug() << "FileTableModel::setData()" << index;
\r
318 if (!index.isValid()) {
\r
323 case Qt::CheckStateRole:
\r
324 if (index.column() == 0) {
\r
325 m_checkStates[index.row()] = static_cast<Qt::CheckState>(value.toInt());
\r
326 emit dataChanged(index, index);
\r
335 Qt::DropActions FileTableModel::supportedDropActions() const
\r
337 qDebug() << "FileTableModel::supportedDropActions()";
\r
339 return Qt::CopyAction;
\r
342 QStringList FileTableModel::mimeTypes() const
\r
344 qDebug() << "FileTableModel::mimeTypes()";
\r
348 types << "text/uri-list";
\r