#pragma once #include "common.h" #include #include #include struct ArcDir; namespace Arc { Q_NAMESPACE enum Column { ColumnSize, ColumnName, ColumnMax, }; Q_ENUM_NS(Column) enum FileType { FileNormal, FileLabel, FilePalette = 64, FileTexture, FilePicture, FileSound, FileMipTexture, }; Q_ENUM_NS(FileType) enum ArchiveType { ArcNone, ArcPack, ArcWad2, }; Q_ENUM_NS(ArchiveType) Arc::FileType getFileType(int n); Arc::ArchiveType getArchiveType(std::istream &st) noexcept; ArcDir readArchive(std::istream &st); } struct ArcNode; struct ArcDir : public std::vector { using std::vector::vector; ArcDir::iterator findNode(std::string const &name); }; Q_DECLARE_METATYPE(ArcDir) struct ArcFile : public QByteArray { using QByteArray::QByteArray; }; Q_DECLARE_METATYPE(ArcFile) struct ArcNode : public std::variant { using super_type = std::variant; ArcNode() = default; ArcNode(ArcDir &&f, std::string &&n, Arc::FileType t = Arc::FileNormal); ArcNode(ArcFile &&f, std::string &&n, Arc::FileType t = Arc::FileNormal); ArcNode(ArcNode const &) = default; ArcNode(ArcNode &&) = default; std::string name; Arc::FileType type; }; Q_DECLARE_METATYPE(ArcNode) class ArcModel : public QAbstractItemModel { Q_OBJECT public: explicit ArcModel(ArcDir const *root, QObject *parent); ~ArcModel(); 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 &) const override; int rowCount(QModelIndex const &) const override; int columnCount(QModelIndex const &) const override; private: ArcDir const *const m_root; }; // EOF