diff options
| -rw-r--r-- | src/filetreeitem.cpp | 24 | ||||
| -rw-r--r-- | src/filetreeitem.h | 2 | ||||
| -rw-r--r-- | src/filetreemodel.cpp | 71 | ||||
| -rw-r--r-- | src/filetreemodel.h | 3 |
4 files changed, 70 insertions, 30 deletions
diff --git a/src/filetreeitem.cpp b/src/filetreeitem.cpp index cfcf891a..e7510279 100644 --- a/src/filetreeitem.cpp +++ b/src/filetreeitem.cpp @@ -102,8 +102,28 @@ QFont FileTreeItem::font() const const FileTreeItem::Meta& FileTreeItem::meta() const { if (!m_meta) { - QFile f(m_realPath); - m_meta = {static_cast<uint64_t>(f.size())}; + QFileInfo fi(m_realPath); + + SHFILEINFOW sfi = {}; + const auto r = SHGetFileInfoW( + m_realPath.toStdWString().c_str(), 0, &sfi, sizeof(sfi), + SHGFI_TYPENAME); + + if (!r) { + const auto e = GetLastError(); + + log::error( + "SHGetFileInfoW failed for '{}', {}", + m_realPath, e); + + sfi = {}; + } + + m_meta = { + static_cast<uint64_t>(fi.size()), + fi.lastModified(), + QString::fromWCharArray(sfi.szTypeName) + }; } return *m_meta; diff --git a/src/filetreeitem.h b/src/filetreeitem.h index 445b1ea8..01cd01a7 100644 --- a/src/filetreeitem.h +++ b/src/filetreeitem.h @@ -20,6 +20,8 @@ public: struct Meta { uint64_t size; + QDateTime lastModified; + QString type; }; diff --git a/src/filetreemodel.cpp b/src/filetreemodel.cpp index 351e0d2f..5424d14b 100644 --- a/src/filetreemodel.cpp +++ b/src/filetreemodel.cpp @@ -246,32 +246,7 @@ QVariant FileTreeModel::data(const QModelIndex& index, int role) const case Qt::DisplayRole: { if (auto* item=itemFromIndex(index)) { - switch (index.column()) - { - case Filename: - { - return item->filename(); - } - - case ModName: - { - return item->mod(); - } - - case FileSize: - { - if (item->isDirectory()) { - return {}; - } else { - return localizedByteSize(item->meta().size); - } - } - - default: - { - break; - } - } + return displayData(item, index.column()); } break; @@ -326,11 +301,11 @@ QVariant FileTreeModel::data(const QModelIndex& index, int role) const QVariant FileTreeModel::headerData(int i, Qt::Orientation ori, int role) const { static const std::array<QString, ColumnCount> names = { - tr("File"), tr("Mod"), tr("Size") + tr("Name"), tr("Mod"), tr("Type"), tr("Size"), tr("Date modified") }; if (role == Qt::DisplayRole) { - if (i > 0 && i < static_cast<int>(names.size())) { + if (i >= 0 && i < static_cast<int>(names.size())) { return names[static_cast<std::size_t>(i)]; } } @@ -671,6 +646,46 @@ std::unique_ptr<FileTreeItem> FileTreeModel::createFileItem( return item; } +QVariant FileTreeModel::displayData(const FileTreeItem* item, int column) const +{ + switch (column) + { + case Filename: + { + return item->filename(); + } + + case ModName: + { + return item->mod(); + } + + case FileType: + { + return item->meta().type; + } + + case FileSize: + { + if (item->isDirectory()) { + return {}; + } else { + return localizedByteSize(item->meta().size); + } + } + + case LastModified: + { + return item->meta().lastModified.toString(Qt::SystemLocaleDate); + } + + default: + { + break; + } + } +} + std::wstring FileTreeModel::makeModName( const MOShared::FileEntry& file, int originID) const { diff --git a/src/filetreemodel.h b/src/filetreemodel.h index 7de6830d..96e9e5a7 100644 --- a/src/filetreemodel.h +++ b/src/filetreemodel.h @@ -24,7 +24,9 @@ public: { Filename = 0, ModName, + FileType, FileSize, + LastModified, ColumnCount }; @@ -124,6 +126,7 @@ private: const MOShared::FileEntry& file); + QVariant displayData(const FileTreeItem* item, int column) const; std::wstring makeModName(const MOShared::FileEntry& file, int originID) const; void ensureLoaded(FileTreeItem* item) const; |
