resource explorer working

This commit is contained in:
mrbesen 2023-01-12 18:11:29 +01:00
parent 69f7ed2a2e
commit ac2989f12b
Signed by: MrBesen
GPG Key ID: 596B2350DCD67504
3 changed files with 73 additions and 5 deletions

View File

@ -10,6 +10,8 @@ namespace Ui {
class ResourceExplorer;
}
class QTreeWidgetItem;
class ResourceExplorer : public QMainWindow {
Q_OBJECT
@ -31,6 +33,8 @@ private:
};
struct ResourceNode {
~ResourceNode();
QString name;
ResourceFlags flags;
uint32_t size;
@ -40,6 +44,8 @@ private:
uint64_t lastModTimeMS;
uint32_t hash;
std::vector<ResourceNode*> children;
bool isDir() const;
};
using data = const unsigned char*;
@ -48,6 +54,8 @@ private:
std::vector<MemoryMap> readMemoryMaps();
std::vector<ResourceExplorer::ResourceNode*> parseResource(int version, data library, data names, data data );
QTreeWidgetItem* resourceNodeToItem(ResourceNode* node, const QString& path );
static QString approxFileSize( uint64_t size );
Ui::ResourceExplorer *ui;
};

View File

@ -3,6 +3,7 @@
#include <QFile>
#include <QFileInfo>
#include <QDateTime>
#include <QDebug>
#include <endian.h>
@ -58,6 +59,16 @@ ResourceExplorer::~ResourceExplorer() {
delete this->ui;
}
ResourceExplorer::ResourceNode::~ResourceNode() {
for ( ResourceNode* rn : this->children ) {
delete rn;
}
}
bool ResourceExplorer::ResourceNode::isDir() const {
return this->flags & ResourceFlags::Directory;
}
void ResourceExplorer::rebuild() {
this->ui->treeWidget->clear();
@ -88,6 +99,11 @@ void ResourceExplorer::rebuild() {
std::shared_ptr<RegisteredResource> r = it.second;
std::vector<ResourceNode*> resources = parseResource(r->version, r->resourceStruct, r->resourceName, r->resourceData);
for ( ResourceNode* rnode : resources ) {
QTreeWidgetItem* item = this->resourceNodeToItem( rnode, "" );
resItem->addChild( item );
}
this->ui->treeWidget->addTopLevelItem( resItem );
}
}
@ -192,12 +208,12 @@ std::vector<ResourceExplorer::ResourceNode*> ResourceExplorer::parseResource(int
newNode->language = be16toh(entry->content.file.language);
uint32_t dataOffset = be32toh(entry->content.file.dataOffset);
const unsigned char* dataBegin = data + dataOffset;
newNode->size = *((const uint32_t*) dataBegin);
newNode->size = be32toh(*((const uint32_t*) dataBegin));
newNode->start = dataBegin + 4;
}
if ( version >= 2 ) {
newNode->lastModTimeMS = entry->lastModTimeMS;
newNode->lastModTimeMS = be64toh( entry->lastModTimeMS );
}
task.second->push_back( newNode );
@ -205,3 +221,42 @@ std::vector<ResourceExplorer::ResourceNode*> ResourceExplorer::parseResource(int
return out;
}
QTreeWidgetItem* ResourceExplorer::resourceNodeToItem( ResourceNode* node, const QString& path ) {
if ( ! node ) return nullptr;
QTreeWidgetItem* item = new QTreeWidgetItem();
const QString ownPath = path + node->name;
item->setText( 0, node->isDir() ? (node->name + "/" ) : node->name);
item->setToolTip(0, ownPath);
if ( node->isDir() ) {
std::size_t size = node->children.size();
item->setText( 1, QString::number( size ) );
item->setToolTip( 1, QString::number( size ) );
} else {
std::size_t size = node->size;
item->setText( 1, approxFileSize( size ) );
item->setToolTip( 1, QString::number( size ) );
}
if( node->lastModTimeMS ) {
QDateTime lastModTime = QDateTime::fromMSecsSinceEpoch( node->lastModTimeMS );
item->setText( 2, lastModTime.toString( "yyyy-MM-dd HH:mm:ss.zzz t" ) );
} else {
item->setText( 2, "-" );
}
for ( ResourceNode* subnode : node->children ) {
QTreeWidgetItem* sub = resourceNodeToItem( subnode, ownPath + "/" );
item->addChild( sub );
}
return item;
}
QString ResourceExplorer::approxFileSize( uint64_t size ) {
return QLocale().formattedDataSize( size );
}

View File

@ -18,7 +18,7 @@
<item row="0" column="0">
<widget class="QTreeWidget" name="treeWidget">
<property name="columnCount">
<number>2</number>
<number>3</number>
</property>
<attribute name="headerMinimumSectionSize">
<number>50</number>
@ -28,12 +28,17 @@
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
<string notr="true">Name</string>
</property>
</column>
<column>
<property name="text">
<string notr="true">2</string>
<string notr="true">Size</string>
</property>
</column>
<column>
<property name="text">
<string>Last Modification</string>
</property>
</column>
</widget>