resourceModel basics

This commit is contained in:
mrbesen 2023-01-09 22:26:00 +01:00
parent a079802abb
commit 8b2cb8fc5a
Signed by: MrBesen
GPG Key ID: 596B2350DCD67504
4 changed files with 131 additions and 3 deletions

30
include/qtresourcemodel.h Normal file
View File

@ -0,0 +1,30 @@
#pragma once
#include <QDir>
#include <QFileSystemModel>
#include <QVector>
class QFileInfo;
class QtResourceModel : public QAbstractItemModel {
public:
QtResourceModel( const QDir& root, QObject* parent = nullptr );
virtual ~QtResourceModel();
virtual QModelIndex index(int, int, const QModelIndex&) const override;
virtual QModelIndex parent(const QModelIndex&) const override;
virtual int rowCount(const QModelIndex&) const override;
virtual int columnCount(const QModelIndex&) const override;
virtual QVariant data(const QModelIndex&, int) const override;
private:
using internalData = QFileInfo;
QDir root;
QVector<internalData*> internals;
};

View File

@ -30,10 +30,12 @@ INCLUDEPATH += $$PWD/include/
SOURCES += \
src/injector.cpp \
src/qtdebugger.cpp \
src/qtresourcemodel.cpp \
src/resourceexplorer.cpp
HEADERS += \
include/qtdebugger.h \
include/qtresourcemodel.h \
include/resourceexplorer.h
FORMS += \

97
src/qtresourcemodel.cpp Normal file
View File

@ -0,0 +1,97 @@
#include "qtresourcemodel.h"
#include <QFileInfo>
QtResourceModel::QtResourceModel( const QDir& root, QObject* parent ) :
QAbstractItemModel( parent ),
root( root.absolutePath() )
{
}
QtResourceModel::~QtResourceModel() {
for( internalData* inter : internals ) {
delete inter;
}
internals.clear();
}
QModelIndex QtResourceModel::index(int row, int column, const QModelIndex& parent) const {
if (!hasIndex(row, column, parent))
return QModelIndex();
internalData* parentItem;
if (parent.isValid()) {
parentItem = static_cast<internalData*>(parent.internalPointer());
} else {
parentItem = new internalData( root, "." );
// internals.append( parentItem );
}
if (parentItem->isDir()) {
QDir parentDir( parentItem->absolutePath() );
QFileInfoList entrys = parentDir.entryInfoList(QDir::Filter::AllEntries, QDir::SortFlag::DirsFirst | QDir::SortFlag::Name );
if ( entrys.size() < row ) {
internalData* childItem = new internalData( entrys.at(row) );
// internals.append( childItem );
return createIndex(row, column, childItem);
}
}
return QModelIndex();
}
QModelIndex QtResourceModel::parent(const QModelIndex& index) const {
if (!index.isValid())
return QModelIndex();
internalData* childItem = static_cast<internalData*>(index.internalPointer());
internalData* parentItem = new internalData( childItem->dir().absolutePath() );
// internals.append( parentItem );
if (parentItem->absolutePath() == root.absolutePath())
return QModelIndex();
return createIndex(0, 0, parentItem);
}
int QtResourceModel::rowCount(const QModelIndex& parent) const {
if (parent.column() > 0)
return 0;
QDir parentDir;
if( parent.isValid() ) {
internalData* parentItem = static_cast<internalData*>(parent.internalPointer());
if ( ! parentItem->isDir()) {
return 0;
}
parentDir = QDir( parentItem->absolutePath() );
} else {
parentDir = root;
}
QFileInfoList entrys = parentDir.entryInfoList(QDir::Filter::AllEntries, QDir::SortFlag::DirsFirst | QDir::SortFlag::Name );
return entrys.size();
}
int QtResourceModel::columnCount(const QModelIndex& parent) const {
return 2;
}
QVariant QtResourceModel::data(const QModelIndex& index, int role) const {
if (!index.isValid())
return QVariant();
internalData* item = static_cast<internalData*>( index.internalPointer() );
if (role == Qt::DisplayRole) {
if ( index.column() == 0)
return QVariant( item->fileName() );
if ( index.column() == 1)
return QVariant( item->size() );
}
return QVariant();
}

View File

@ -1,13 +1,12 @@
#include "resourceexplorer.h"
#include "ui_resourceexplorer.h"
#include <QFileSystemModel>
#include "qtresourcemodel.h"
ResourceExplorer::ResourceExplorer(QWidget *parent) : QMainWindow( parent ), ui(new Ui::ResourceExplorer) {
this->ui->setupUi(this);
QFileSystemModel* model = new QFileSystemModel;
model->setRootPath( ":/" );
QtResourceModel* model = new QtResourceModel( QDir( ":/" ), this );
this->ui->treeView->setModel( model );
}