104 lines
2.0 KiB
C++
104 lines
2.0 KiB
C++
#pragma once
|
|
|
|
#include "common.h"
|
|
|
|
#include <QAbstractItemModel>
|
|
#include <QByteArray>
|
|
#include <QObject>
|
|
|
|
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<ArchiveType> getArchiveType(std::istream &st) noexcept;
|
|
|
|
Dir readArchive(std::istream &st);
|
|
|
|
struct Dir : public std::vector<Node> {
|
|
using std::vector<Node>::vector;
|
|
|
|
Dir::iterator findNode(std::string const &name);
|
|
};
|
|
|
|
struct File : public QByteArray {
|
|
using QByteArray::QByteArray;
|
|
};
|
|
|
|
struct Node : public std::variant<Dir, File> {
|
|
using super_type = std::variant<Dir, File>;
|
|
|
|
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
|