2019-10-03 12:17:16 -07:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "common.h"
|
|
|
|
|
2019-10-04 10:37:34 -07:00
|
|
|
#include <QAbstractItemModel>
|
2019-10-03 12:17:16 -07:00
|
|
|
#include <QByteArray>
|
2019-10-04 10:37:34 -07:00
|
|
|
#include <QObject>
|
|
|
|
|
|
|
|
struct ArcDir;
|
2019-10-03 12:17:16 -07:00
|
|
|
|
|
|
|
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)
|
|
|
|
|
2019-10-04 10:37:34 -07:00
|
|
|
enum ArchiveType {
|
|
|
|
ArcNone,
|
|
|
|
ArcPack,
|
|
|
|
ArcWad2,
|
|
|
|
};
|
|
|
|
Q_ENUM_NS(ArchiveType)
|
|
|
|
|
2019-10-03 12:17:16 -07:00
|
|
|
Arc::FileType getFileType(int n);
|
2019-10-04 10:37:34 -07:00
|
|
|
Arc::ArchiveType getArchiveType(std::istream &st) noexcept;
|
|
|
|
|
|
|
|
ArcDir readArchive(std::istream &st);
|
2019-10-03 12:17:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
struct ArcNode;
|
|
|
|
|
|
|
|
struct ArcDir : public std::vector<ArcNode> {
|
|
|
|
using std::vector<ArcNode>::vector;
|
2019-10-03 14:06:05 -07:00
|
|
|
|
|
|
|
ArcDir::iterator findNode(std::string const &name);
|
2019-10-03 12:17:16 -07:00
|
|
|
};
|
|
|
|
Q_DECLARE_METATYPE(ArcDir)
|
|
|
|
|
|
|
|
struct ArcFile : public QByteArray {
|
|
|
|
using QByteArray::QByteArray;
|
|
|
|
};
|
|
|
|
Q_DECLARE_METATYPE(ArcFile)
|
|
|
|
|
|
|
|
struct ArcNode : public std::variant<ArcDir, ArcFile> {
|
|
|
|
using super_type = std::variant<ArcDir, ArcFile>;
|
|
|
|
|
|
|
|
ArcNode() = default;
|
|
|
|
|
2019-10-03 14:06:05 -07:00
|
|
|
ArcNode(ArcDir &&f, std::string &&n, Arc::FileType t = Arc::FileNormal);
|
|
|
|
ArcNode(ArcFile &&f, std::string &&n, Arc::FileType t = Arc::FileNormal);
|
2019-10-03 12:17:16 -07:00
|
|
|
|
|
|
|
ArcNode(ArcNode const &) = default;
|
|
|
|
ArcNode(ArcNode &&) = default;
|
|
|
|
|
|
|
|
std::string name;
|
|
|
|
Arc::FileType type;
|
|
|
|
};
|
|
|
|
Q_DECLARE_METATYPE(ArcNode)
|
|
|
|
|
2019-10-04 10:37:34 -07:00
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
2019-10-03 12:17:16 -07:00
|
|
|
// EOF
|