#pragma once #include #include namespace Pak { Q_NAMESPACE enum class Column { Size, Name, }; Q_ENUM_NS(Column) } struct PakNode; struct PakDir : public std::vector { using std::vector::vector; }; Q_DECLARE_METATYPE(PakDir) struct PakFile : public QByteArray { using QByteArray::QByteArray; }; Q_DECLARE_METATYPE(PakFile) struct PakNode : public std::variant { PakNode() = default; template 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; }; Q_DECLARE_METATYPE(PakNode) class PakDirRoot : public QObject, public PakDir { Q_OBJECT public: explicit PakDirRoot(PakDir &&root, QObject *parent); virtual ~PakDirRoot(); }; 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(); }; PakDir readPak(std::istream &st); // EOF