#pragma once #include "common.h" #include #include #include namespace Arc { Q_NAMESPACE struct Node; struct Dir; enum Column { ColumnSize, ColumnType, ColumnName, }; Q_ENUM_NS(Column) enum class FileType { Label, MipTexture, Normal, Palette, Picture, Sound, Texture, }; Q_ENUM_NS(FileType) enum ArchiveType { ArcPack, ArcWad2, }; Q_ENUM_NS(ArchiveType) Option getArchiveType(std::istream &st) noexcept; Dir readArchive(std::istream &st); struct Dir : public std::vector { using std::vector::vector; Dir::iterator findNode(std::string const &name); }; struct File : public QByteArray { using QByteArray::QByteArray; }; struct Node : public std::variant { using super_type = std::variant; Node() = default; Node(Dir &&f, std::string &&n, FileType t = FileType::Normal); Node(File &&f, std::string &&n, FileType t = FileType::Normal); Node(Node const &) = default; Node(Node &&) = default; std::string name; FileType type; }; class Model : public QAbstractItemModel { Q_OBJECT public: explicit Model(QObject *parent); ~Model(); 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 = QModelIndex()) const override; QModelIndex parent(QModelIndex const &index = QModelIndex()) const override; int rowCount(QModelIndex const &index = QModelIndex()) const override; int columnCount(QModelIndex const &index = QModelIndex()) const override; Dir *dir() const; public slots: void setDir(Dir *dir); signals: void dirChanged(Dir *dir); private: Dir *m_dir; }; } Q_DECLARE_METATYPE(Arc::Dir) Q_DECLARE_METATYPE(Arc::File) Q_DECLARE_METATYPE(Arc::Node) // EOF