summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/filetreeitem.cpp24
-rw-r--r--src/filetreeitem.h2
-rw-r--r--src/filetreemodel.cpp71
-rw-r--r--src/filetreemodel.h3
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;