resource explorer working
This commit is contained in:
parent
69f7ed2a2e
commit
ac2989f12b
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue