2 #include "filetablemodel.h"
\r
6 #include <QApplication>
\r
11 #include <QMessageBox>
\r
13 #include <windows.h>
\r
16 FileTableModel::FileTableModel(QObject *parent) :
\r
17 QAbstractTableModel(parent),
\r
25 m_NormalTextBrush(),
\r
34 bool FileTableModel::setPath(const QString &path)
\r
36 if (!QFileInfo::exists(path)) {
\r
37 qDebug() << "パスが存在しません";
\r
41 QFileInfo info(path);
\r
42 if (!info.isDir()) {
\r
43 qDebug() << "フォルダではありません";
\r
50 m_dir.setPath(path);
\r
51 m_fileInfoList = m_dir.entryInfoList();
\r
52 m_checkStates.clear();
\r
54 if (m_fileInfoList.isEmpty()) {
\r
55 qDebug() << "ファイルリストを取得できません";
\r
59 QFileInfoList::iterator it, itRoot = m_fileInfoList.end();
\r
60 for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); ) {
\r
61 if (it->fileName() == "..") {
\r
62 if (m_dir.isRoot()) {
\r
63 it = m_fileInfoList.erase(it);
\r
64 itRoot = m_fileInfoList.end();
\r
72 if (!(filter() & QDir::System)){
\r
73 DWORD dwFlags = ::GetFileAttributes(
\r
74 it->absoluteFilePath().toStdWString().c_str());
\r
75 if (dwFlags != DWORD(-1) && it->fileName() != ".." &&
\r
76 ((dwFlags & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM))
\r
78 qDebug() << it->fileName() << " is system file.";
\r
79 it = m_fileInfoList.erase(it);
\r
86 // ソート方法によらず、".."は必ず先頭にする
\r
87 if (itRoot != m_fileInfoList.begin() && itRoot != m_fileInfoList.end()) {
\r
88 QFileInfo info(*itRoot);
\r
89 m_fileInfoList.erase(itRoot);
\r
90 m_fileInfoList.push_front(info);
\r
94 m_checkStates.resize(m_fileInfoList.size());
\r
95 m_checkStates.fill(Qt::Unchecked);
\r
100 m_fsWatcher = new QFileSystemWatcher(this);
\r
101 m_fsWatcher->addPath(path);
\r
102 connect(m_fsWatcher, SIGNAL(directoryChanged(QString)),
\r
103 // this, SLOT(refresh()));
\r
104 this, SIGNAL(listUpdated()));
\r
108 emit rootChanged(m_dir.absolutePath());
\r
111 return !m_fileInfoList.isEmpty();
\r
114 Qt::CheckState FileTableModel::checkState(const QModelIndex &index) const
\r
116 return m_checkStates[index.row()];
\r
119 void FileTableModel::setCheckState(const QModelIndex &index, Qt::CheckState state)
\r
122 m_checkStates[index.row()] = state;
\r
123 if (state == Qt::Checked && index.row() == 0 &&
\r
124 m_fileInfoList[0].fileName() == "..")
\r
126 m_checkStates[0] = Qt::Unchecked;
\r
129 emit dataChanged(index, this->index(index.row(), 3));
\r
134 void FileTableModel::setCheckStateAll(Qt::CheckState state)
\r
137 m_checkStates.fill(state);
\r
138 if (state == Qt::Checked && m_fileInfoList.size() > 1 &&
\r
139 m_fileInfoList[0].fileName() == "..")
\r
141 m_checkStates[0] = Qt::Unchecked;
\r
149 bool FileTableModel::isDir(const QModelIndex &index) const
\r
151 return m_fileInfoList[index.row()].isDir();
\r
154 const QString FileTableModel::absoluteFilePath(const QModelIndex &index) const
\r
156 return m_dir.absoluteFilePath(m_fileInfoList[index.row()].fileName());
\r
159 QFileInfo FileTableModel::fileInfo(const QModelIndex &index) const
\r
161 return m_fileInfoList[index.row()];
\r
164 #define Brush(x, y, z) QBrush((x).value((y), (z)).value<QColor>());
\r
167 void FileTableModel::updateAppearance()
\r
169 QSettings settings;
\r
170 QPalette palette(QApplication::palette("QTableView"));
\r
172 m_font = settings.value(IniKey_ViewFont, QApplication::font()).value<QFont>();
\r
173 m_NormalBrush = Brush(settings, IniKey_ViewColorBgNormal, palette.base());
\r
174 m_NormalTextBrush = Brush(settings, IniKey_ViewColorFgNormal, palette.text());
\r
175 m_MarkBrush = Brush(settings, IniKey_ViewColorBgMark, DefaultMarkBgColor);
\r
176 m_MarkTextBrush = Brush(settings, IniKey_ViewColorFgMark, DefaultMarkFgColor);
\r
177 m_SystemBrush = Brush(settings, IniKey_ViewColorFgSystem, DefaultSystemColor);
\r
178 m_HiddenBrush = Brush(settings, IniKey_ViewColorFgHidden, DefaultHiddenColor);
\r
179 m_ReadonlyBrush = Brush(settings, IniKey_ViewColorFgReadonly, DefaultReadonlyColor);
\r
185 //void FileTableModel::refresh()
\r
187 // setPath(m_dir.absolutePath());
\r
191 void FileTableModel::stateChanged()
\r
195 quint64 totalSize = 0;
\r
196 for (int n = 0; n < m_checkStates.size(); n++) {
\r
197 if (m_checkStates[n] == Qt::Checked) {
\r
198 if (m_fileInfoList[n].isDir()) {
\r
203 totalSize += m_fileInfoList[n].size();
\r
208 emit stateChanged(numFolder, numFile, totalSize);
\r
211 QFileInfoList FileTableModel::checkedItems() const
\r
213 QFileInfoList list;
\r
214 for (int n = 0; n < m_checkStates.size(); n++) {
\r
215 if (m_fileInfoList[n].fileName() != ".." &&
\r
216 m_checkStates[n] == Qt::Checked)
\r
218 list.append(m_fileInfoList[n]);
\r
224 int FileTableModel::rowCount(const QModelIndex &parent) const
\r
227 return m_fileInfoList.size();
\r
230 int FileTableModel::columnCount(const QModelIndex &parent) const
\r
236 QVariant FileTableModel::data(const QModelIndex &index, int role) const
\r
238 if (!index.isValid()) {
\r
242 const QFileInfo &info = m_fileInfoList.at(index.row());
\r
243 int checked = m_checkStates.at(index.row());
\r
246 case Qt::DisplayRole:
\r
247 switch (index.column()) {
\r
248 case 0: // チェックボックス
\r
249 return QString("");
\r
251 return info.fileName();
\r
253 if (info.isDir()) {
\r
254 return QString("<DIR>");
\r
257 return FilesizeToString(info.size());
\r
261 return info.lastModified().toString("yy/MM/dd hh:mm");
\r
265 case Qt::DecorationRole:
\r
266 if (index.column() == 1) {
\r
267 if (info.fileName() == "..") {
\r
268 return QIcon(":/images/Up.png");
\r
271 // infoを使うと、正しいアイコンが取れない場合がある…なぜ?
\r
272 return m_IconFactory.icon(QFileInfo(info.absoluteFilePath()));
\r
280 case Qt::TextAlignmentRole:
\r
281 switch (index.column()) {
\r
284 return Qt::AlignLeft + Qt::AlignVCenter;
\r
287 return Qt::AlignRight + Qt::AlignVCenter;
\r
291 case Qt::BackgroundRole:
\r
293 return m_MarkBrush;
\r
295 return m_NormalBrush;
\r
297 case Qt::ForegroundRole:
\r
299 return m_MarkTextBrush;
\r
303 DWORD dwFlags = ::GetFileAttributes(
\r
304 info.absoluteFilePath().toStdWString().c_str());
\r
305 if (dwFlags != DWORD(-1) && (dwFlags & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM)
\r
307 return m_SystemBrush;
\r
311 if (info.isHidden() && info.fileName() != "..") {
\r
312 return m_HiddenBrush;
\r
314 if (!info.isWritable()) {
\r
315 return m_ReadonlyBrush;
\r
317 return m_NormalTextBrush;
\r
319 case Qt::CheckStateRole:
\r
320 if (index.column() == 0 && info.fileName() != "..") {
\r
329 QVariant FileTableModel::headerData(int section, Qt::Orientation orientation, int role) const
\r
331 if (role == Qt::DisplayRole) {
\r
332 if (orientation == Qt::Horizontal) {
\r
334 case 0: return QString("");
\r
335 case 1: return tr("名前");
\r
336 case 2: return tr("サイズ");
\r
337 case 3: return tr("更新日時");
\r
344 Qt::ItemFlags FileTableModel::flags(const QModelIndex &index) const
\r
346 Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
\r
347 if (!index.isValid()) {
\r
348 flags |= Qt::ItemIsDropEnabled;
\r
350 else if (m_fileInfoList[index.row()].fileName() != "..") {
\r
351 if (index.column() == 0) {
\r
352 flags |= Qt::ItemIsUserCheckable;
\r
355 // flags |= Qt::ItemIsDragEnabled;
\r
356 flags |= Qt::ItemIsDropEnabled;
\r
361 bool FileTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
\r
363 if (!index.isValid()) {
\r
368 case Qt::CheckStateRole:
\r
369 if (index.column() == 0) {
\r
370 m_checkStates[index.row()] = static_cast<Qt::CheckState>(value.toInt());
\r
371 emit dataChanged(index, this->index(index.row(), 3));
\r
381 Qt::DropActions FileTableModel::supportedDropActions() const
\r
383 return Qt::CopyAction | Qt::MoveAction;
\r
386 QStringList FileTableModel::mimeTypes() const
\r
390 types << "text/uri-list";
\r
395 bool FileTableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
\r
399 qDebug() << action << row << column;
\r
401 if (action == Qt::IgnoreAction)
\r
404 if (!data->hasFormat("text/uri-list"))
\r
411 msg = "ドロップを検知しました。<br/>";
\r
412 foreach (const QUrl &url, data->urls()) {
\r
413 msg += url.toLocalFile() + "<br/>";
\r
414 qDebug() << url.toLocalFile();
\r
416 QMessageBox::information(NULL, "info", msg);
\r