2019-09-27 00:09:09 -07:00
|
|
|
#pragma once
|
|
|
|
|
2019-09-28 22:29:31 -07:00
|
|
|
#include <QAbstractItemModel>
|
|
|
|
#include <QSortFilterProxyModel>
|
2019-09-28 03:54:04 -07:00
|
|
|
|
|
|
|
namespace Pak {
|
2019-09-29 22:30:32 -07:00
|
|
|
Q_NAMESPACE
|
|
|
|
|
|
|
|
enum class Column {
|
|
|
|
Size,
|
|
|
|
Name,
|
2019-09-28 03:54:04 -07:00
|
|
|
};
|
2019-09-29 22:30:32 -07:00
|
|
|
Q_ENUM_NS(Column)
|
2019-09-28 03:54:04 -07:00
|
|
|
}
|
|
|
|
|
2019-09-27 23:09:51 -07:00
|
|
|
struct PakNode;
|
|
|
|
|
2019-09-28 22:29:31 -07:00
|
|
|
struct PakDir : public std::vector<PakNode> {
|
|
|
|
using std::vector<PakNode>::vector;
|
2019-09-27 23:09:51 -07:00
|
|
|
};
|
2019-09-28 01:17:55 -07:00
|
|
|
Q_DECLARE_METATYPE(PakDir)
|
2019-09-27 23:09:51 -07:00
|
|
|
|
|
|
|
struct PakFile : public QByteArray {
|
|
|
|
using QByteArray::QByteArray;
|
|
|
|
};
|
2019-09-28 01:17:55 -07:00
|
|
|
Q_DECLARE_METATYPE(PakFile)
|
2019-09-27 23:09:51 -07:00
|
|
|
|
|
|
|
struct PakNode : public std::variant<PakDir, PakFile> {
|
2019-09-28 22:29:31 -07:00
|
|
|
PakNode() = default;
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
constexpr PakNode(T &&t, std::string &&n) :
|
|
|
|
variant(std::move(t)),
|
|
|
|
name(std::move(n)) {
|
|
|
|
}
|
|
|
|
|
|
|
|
PakNode(PakNode const &) = default;
|
|
|
|
PakNode(PakNode &&) = default;
|
|
|
|
|
|
|
|
std::string name;
|
2019-09-27 00:09:09 -07:00
|
|
|
};
|
2019-09-28 01:17:55 -07:00
|
|
|
Q_DECLARE_METATYPE(PakNode)
|
2019-09-27 00:09:09 -07:00
|
|
|
|
2019-09-29 22:30:32 -07:00
|
|
|
class PakDirRoot : public QObject, public PakDir {
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
explicit PakDirRoot(PakDir &&root, QObject *parent);
|
|
|
|
virtual ~PakDirRoot();
|
|
|
|
};
|
|
|
|
|
2019-09-28 22:29:31 -07:00
|
|
|
class PakDirModel : public QAbstractItemModel {
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
explicit PakDirModel(PakDir const *root, QObject *parent);
|
|
|
|
virtual ~PakDirModel();
|
|
|
|
|
|
|
|
QVariant data(QModelIndex const &index, int role) const override;
|
|
|
|
Qt::ItemFlags flags(QModelIndex const &index) const override;
|
|
|
|
QVariant headerData(int section, Qt::Orientation orientation, int role)
|
|
|
|
const override;
|
|
|
|
QModelIndex index(int row, int col, QModelIndex const &parent)
|
|
|
|
const override;
|
|
|
|
QModelIndex parent(QModelIndex const &index) const override;
|
|
|
|
int rowCount(QModelIndex const &parent) const override;
|
|
|
|
int columnCount(QModelIndex const &parent) const override;
|
|
|
|
|
|
|
|
private:
|
|
|
|
PakDir const *const m_root;
|
|
|
|
};
|
|
|
|
|
|
|
|
class PakDirModelSorter : public QSortFilterProxyModel {
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
using QSortFilterProxyModel::QSortFilterProxyModel;
|
|
|
|
virtual ~PakDirModelSorter();
|
|
|
|
};
|
|
|
|
|
2019-09-27 23:09:51 -07:00
|
|
|
PakDir readPak(std::istream &st);
|
2019-09-27 00:09:09 -07:00
|
|
|
|
|
|
|
// EOF
|