2 #include "filetablemodel.h"
\r
10 FileTableModel::FileTableModel(QObject *parent) :
\r
11 QAbstractTableModel(parent),
\r
20 bool FileTableModel::setPath(const QString &path)
\r
22 if (!QFileInfo::exists(path)) {
\r
23 qDebug() << "パスが存在しません";
\r
27 QFileInfo info(path);
\r
28 if (!info.isDir()) {
\r
29 qDebug() << "フォルダではありません";
\r
36 m_dir.setPath(path);
\r
37 m_fileInfoList = m_dir.entryInfoList();
\r
38 m_checkStates.clear();
\r
40 if (m_fileInfoList.isEmpty()) {
\r
41 qDebug() << "ファイルリストを取得できません";
\r
45 else if (!(filter() & QDir::System)){
\r
46 QFileInfoList::iterator it;
\r
47 for (it = m_fileInfoList.begin(); it != m_fileInfoList.end(); ) {
\r
48 DWORD dwFlags = ::GetFileAttributes(
\r
49 it->absoluteFilePath().toStdWString().c_str());
\r
50 if (dwFlags != DWORD(-1) && it->fileName() != ".." &&
\r
51 ((dwFlags & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM))
\r
53 qDebug() << it->fileName() << " is system file.";
\r
54 it = m_fileInfoList.erase(it);
\r
62 m_checkStates.resize(m_fileInfoList.size());
\r
63 m_checkStates.fill(Qt::Unchecked);
\r
68 m_fsWatcher = new QFileSystemWatcher(this);
\r
69 m_fsWatcher->addPath(path);
\r
70 connect(m_fsWatcher, SIGNAL(directoryChanged(QString)),
\r
71 this, SLOT(refresh()));
\r
75 emit rootChanged(m_dir.absolutePath());
\r
78 return !m_fileInfoList.isEmpty();
\r
81 Qt::CheckState FileTableModel::checkState(const QModelIndex &index) const
\r
83 return m_checkStates[index.row()];
\r
86 void FileTableModel::setCheckState(const QModelIndex &index, Qt::CheckState state)
\r
88 m_checkStates[index.row()] = state;
\r
92 void FileTableModel::setCheckStateAll(Qt::CheckState state)
\r
95 m_checkStates.fill(state);
\r
102 bool FileTableModel::isDir(const QModelIndex &index) const
\r
104 return m_fileInfoList[index.row()].isDir();
\r
107 const QString FileTableModel::absoluteFilePath(const QModelIndex &index) const
\r
109 return m_dir.absoluteFilePath(m_fileInfoList[index.row()].fileName());
\r
112 QFileInfo FileTableModel::fileInfo(const QModelIndex &index) const
\r
114 return m_fileInfoList[index.row()];
\r
117 void FileTableModel::stateChanged()
\r
121 quint64 totalSize = 0;
\r
122 for (int n = 0; n < m_checkStates.size(); n++) {
\r
123 if (m_checkStates[n] == Qt::Checked) {
\r
124 if (m_fileInfoList[n].isDir()) {
\r
129 totalSize += m_fileInfoList[n].size();
\r
134 emit stateChanged(numFolder, numFile, totalSize);
\r
137 QFileInfoList FileTableModel::checkedItems() const
\r
139 QFileInfoList list;
\r
140 for (int n = 0; n < m_checkStates.size(); n++) {
\r
141 if (m_fileInfoList[n].fileName() != ".." &&
\r
142 m_checkStates[n] == Qt::Checked)
\r
144 list.append(m_fileInfoList[n]);
\r
150 int FileTableModel::rowCount(const QModelIndex &parent) const
\r
153 return m_fileInfoList.size();
\r
156 int FileTableModel::columnCount(const QModelIndex &parent) const
\r
162 QVariant FileTableModel::data(const QModelIndex &index, int role) const
\r
164 if (!index.isValid()) {
\r
168 const QFileInfo &info = m_fileInfoList.at(index.row());
\r
169 int checked = m_checkStates.at(index.row());
\r
172 case Qt::DisplayRole:
\r
173 switch (index.column()) {
\r
174 case 0: // チェックボックス
\r
175 return QString("");
\r
177 return info.fileName();
\r
179 if (info.isDir()) {
\r
180 return QString("<DIR>");
\r
183 return FilesizeToString(info.size());
\r
187 return info.lastModified().toString("yy/MM/dd hh:mm");
\r
191 case Qt::DecorationRole:
\r
192 if (index.column() == 1) {
\r
193 if (info.fileName() == "..") {
\r
194 return QIcon(":/images/Up.png");
\r
197 // infoを使うと、正しいアイコンが取れない場合がある…なぜ?
\r
198 return m_IconFactory.icon(QFileInfo(info.absoluteFilePath()));
\r
203 case Qt::TextAlignmentRole:
\r
204 switch (index.column()) {
\r
207 return Qt::AlignLeft + Qt::AlignVCenter;
\r
210 return Qt::AlignRight + Qt::AlignVCenter;
\r
214 case Qt::CheckStateRole:
\r
215 if (index.column() == 0 && info.fileName() != "..") {
\r
224 QVariant FileTableModel::headerData(int section, Qt::Orientation orientation, int role) const
\r
226 if (role == Qt::DisplayRole) {
\r
227 if (orientation == Qt::Horizontal) {
\r
229 case 0: return QString("");
\r
230 case 1: return tr("名前");
\r
231 case 2: return tr("サイズ");
\r
232 case 3: return tr("更新日時");
\r
239 Qt::ItemFlags FileTableModel::flags(const QModelIndex &index) const
\r
241 Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
\r
242 if (index.column() == 0 && m_fileInfoList[index.row()].fileName() != "..")
\r
244 flags |= Qt::ItemIsUserCheckable;
\r
249 bool FileTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
\r
252 case Qt::CheckStateRole:
\r
253 if (index.column() == 0) {
\r
254 m_checkStates[index.row()] = static_cast<Qt::CheckState>(value.toInt());
\r