488 lines
No EOL
16 KiB
C++
488 lines
No EOL
16 KiB
C++
#ifndef MODELS_H
|
|
#define MODELS_H
|
|
|
|
#include "widgets.h"
|
|
|
|
class Folder;
|
|
class IFunction;
|
|
class License;
|
|
class FileFolder;
|
|
class InternalFile;
|
|
class PropertyManager;
|
|
|
|
enum NodeType {
|
|
NODE_ROOT,
|
|
NODE_ARCHITECTURE,
|
|
NODE_OPTIONS,
|
|
NODE_SCRIPT,
|
|
NODE_SCRIPT_BOOKMARK,
|
|
NODE_LOAD_COMMANDS,
|
|
NODE_LOAD_COMMAND,
|
|
NODE_SEGMENTS,
|
|
NODE_SEGMENT,
|
|
NODE_SECTION,
|
|
NODE_IMPORTS,
|
|
NODE_IMPORT,
|
|
NODE_IMPORT_FOLDER,
|
|
NODE_IMPORT_FUNCTION,
|
|
NODE_EXPORTS,
|
|
NODE_EXPORT_FOLDER,
|
|
NODE_EXPORT,
|
|
NODE_MAP_FOLDER,
|
|
NODE_MAP_FUNCTION,
|
|
NODE_FUNCTIONS,
|
|
NODE_FOLDER,
|
|
NODE_FUNCTION,
|
|
NODE_RESOURCES,
|
|
NODE_RESOURCE_FOLDER,
|
|
NODE_RESOURCE,
|
|
NODE_LICENSES,
|
|
NODE_LICENSE,
|
|
NODE_FILES,
|
|
NODE_FILE,
|
|
NODE_FILE_FOLDER,
|
|
NODE_COMMAND,
|
|
NODE_WATERMARK,
|
|
NODE_PROPERTY,
|
|
NODE_DUMP,
|
|
NODE_CALC,
|
|
NODE_MESSAGE,
|
|
NODE_WARNING,
|
|
NODE_ERROR,
|
|
NODE_TEMPLATE,
|
|
NODE_ASSEMBLIES,
|
|
};
|
|
|
|
class ProjectNode
|
|
{
|
|
public:
|
|
ProjectNode(ProjectNode *parent, NodeType type, void *data = NULL);
|
|
~ProjectNode();
|
|
void clear();
|
|
NodeType type() const { return type_; }
|
|
QString text(int column = 0) const;
|
|
bool contains(const QRegExp &filter) const;
|
|
QString path() const;
|
|
void *data() const { return data_; }
|
|
QIcon icon() const { return icon_; }
|
|
ProjectNode *child(int index) const { return children_[index]; };
|
|
int childCount() const { return children_.size(); }
|
|
void setData(void *data) { data_ = data; }
|
|
void setText(const QString &text) { text_ = text; }
|
|
void setIcon(const QIcon &icon) { icon_ = icon; }
|
|
QList<ProjectNode *> children() const { return children_; };
|
|
ProjectNode *parent() const { return parent_; };
|
|
void addChild(ProjectNode *child);
|
|
void insertChild(int index, ProjectNode *child);
|
|
void removeChild(ProjectNode *child);
|
|
void setPropertyManager(PropertyManager *propertyManager);
|
|
ProjectNode *properties() const { return properties_; };
|
|
void localize();
|
|
private:
|
|
ProjectNode *parent_;
|
|
void *data_;
|
|
NodeType type_;
|
|
QString text_;
|
|
QIcon icon_;
|
|
QList<ProjectNode *> children_;
|
|
ProjectNode *properties_;
|
|
|
|
// no copy ctr or assignment op
|
|
ProjectNode(const ProjectNode &);
|
|
ProjectNode &operator =(const ProjectNode &);
|
|
};
|
|
|
|
class IProjectNodesModel
|
|
{
|
|
public:
|
|
virtual ProjectNode *indexToNode(const QModelIndex &index) const = 0;
|
|
};
|
|
|
|
class Core;
|
|
class BaseModel : public QAbstractItemModel, public IProjectNodesModel
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
BaseModel(QObject *parent = 0);
|
|
~BaseModel();
|
|
virtual void setCore(Core *core);
|
|
bool isEmpty() const { return root_->childCount() == 0; }
|
|
virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
|
|
virtual QModelIndex parent(const QModelIndex &index) const;
|
|
virtual int rowCount(const QModelIndex &parent) const;
|
|
virtual int columnCount(const QModelIndex &parent) const;
|
|
virtual QVariant data(const QModelIndex &index, int role) const;
|
|
ProjectNode *indexToNode(const QModelIndex &index) const;
|
|
QModelIndex nodeToIndex(ProjectNode *node) const;
|
|
QModelIndex objectToIndex(void *object) const;
|
|
ProjectNode *objectToNode(void *object) const;
|
|
void setObjectNode(void *object, ProjectNode *node);
|
|
ProjectNode *root() const { return root_; }
|
|
Core *core() const { return core_; }
|
|
void localize();
|
|
signals:
|
|
void nodeUpdated(ProjectNode *node);
|
|
void nodeRemoved(ProjectNode *node);
|
|
void objectRemoved(void *object);
|
|
protected:
|
|
void clear();
|
|
bool removeNode(void *object);
|
|
void updateNode(ProjectNode *node);
|
|
void removeObject(void *object);
|
|
void createFunctionsTree(ProjectNode *root);
|
|
private:
|
|
ProjectNode *root_;
|
|
Core *core_;
|
|
QMap<void *, ProjectNode *> objectToNode_;
|
|
};
|
|
|
|
class ProjectModel : public BaseModel
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
ProjectModel(QObject *parent = 0);
|
|
~ProjectModel();
|
|
virtual void setCore(Core *core);
|
|
//virtual QVariant data(const QModelIndex &index, int role) const;
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
virtual Qt::DropActions supportedDragActions() const { return Qt::MoveAction; }
|
|
virtual Qt::DropActions supportedDropActions() const { return Qt::MoveAction; }
|
|
virtual Qt::ItemFlags flags(const QModelIndex & index) const;
|
|
virtual QStringList mimeTypes() const;
|
|
virtual QMimeData *mimeData(const QModelIndexList &indexes) const;
|
|
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
|
|
void addFolder(Folder *folder);
|
|
void updateFolder(Folder *folder);
|
|
void removeFolder(Folder *folder);
|
|
void addFunction(IFunction *func);
|
|
void updateFunction(IFunction *func);
|
|
void removeFunction(IFunction *func);
|
|
void updateScript();
|
|
QModelIndex optionsIndex() const { return nodeToIndex(nodeOptions_); }
|
|
#ifndef LITE
|
|
QModelIndex scriptIndex() const { return nodeToIndex(nodeScript_); }
|
|
uptr_t bookmarkNodeToPos(ProjectNode *node) const;
|
|
void updateScriptBookmarks();
|
|
#endif
|
|
#ifdef ULTIMATE
|
|
QModelIndex licensesIndex() const { return nodeToIndex(nodeLicenses_); }
|
|
void addLicense(License *license);
|
|
void updateLicense(License *license);
|
|
void removeLicense(License *license);
|
|
void addFileFolder(FileFolder *folder);
|
|
void updateFileFolder(FileFolder *folder);
|
|
void removeFileFolder(FileFolder *folder);
|
|
void addFile(InternalFile *file);
|
|
void updateFile(InternalFile *file);
|
|
void removeFile(InternalFile *file);
|
|
void updateFiles();
|
|
#endif
|
|
void sortNode(ProjectNode *node, int field);
|
|
signals:
|
|
void modified();
|
|
private:
|
|
ProjectNode *internalAddFolder(Folder *folder);
|
|
ProjectNode *internalUpdateFolder(Folder *folder);
|
|
ProjectNode *internalAddFunction(IFunction *func);
|
|
ProjectNode *internalUpdateFunction(IFunction *func);
|
|
#ifdef ULTIMATE
|
|
ProjectNode *internalAddLicense(License *license);
|
|
ProjectNode *internalUpdateLicense(License *license);
|
|
ProjectNode *internalAddFileFolder(FileFolder *folder);
|
|
ProjectNode *internalUpdateFileFolder(FileFolder *folder);
|
|
ProjectNode *internalAddFile(InternalFile *file);
|
|
ProjectNode *internalUpdateFile(InternalFile *file);
|
|
#endif
|
|
ProjectNode *addObject(ProjectNode *parent, NodeType type, void *object);
|
|
ProjectNode *nodeFunctions_;
|
|
#ifdef ULTIMATE
|
|
ProjectNode *nodeLicenses_;
|
|
ProjectNode *nodeFiles_;
|
|
#endif
|
|
#ifndef LITE
|
|
ProjectNode *nodeScript_;
|
|
#endif
|
|
ProjectNode *nodeOptions_;
|
|
};
|
|
|
|
class FunctionsModel : public BaseModel
|
|
{
|
|
public:
|
|
FunctionsModel(QObject *parent = 0);
|
|
virtual void setCore(Core *core);
|
|
void updateFunction(IFunction *func);
|
|
void removeFunction(IFunction *func);
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
};
|
|
|
|
class IResource;
|
|
class IArchitecture;
|
|
class ISection;
|
|
class IImport;
|
|
|
|
class InfoModel : public BaseModel
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
InfoModel(QObject *parent = 0);
|
|
virtual void setCore(Core *core);
|
|
void updateResource(IResource *resource);
|
|
void updateSegment(ISection *segment);
|
|
void updateImport(IImport *import);
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
QModelIndex dumpIndex(IArchitecture *file) const { return objectToIndex(file); }
|
|
signals:
|
|
void modified();
|
|
};
|
|
|
|
class SearchModel : public QAbstractItemModel
|
|
{
|
|
public:
|
|
SearchModel(QObject *parent = 0);
|
|
void search(ProjectNode *directory, const QString &text, bool protectedFunctionsOnly = false);
|
|
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
|
|
virtual QModelIndex parent(const QModelIndex &index) const;
|
|
virtual int rowCount(const QModelIndex &parent) const;
|
|
virtual int columnCount(const QModelIndex &parent) const;
|
|
virtual QVariant data(const QModelIndex &index, int role) const;
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
virtual bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex());
|
|
QModelIndex nodeToIndex(ProjectNode *node) const;
|
|
void updateNode(ProjectNode *node);
|
|
void removeNode(ProjectNode *node);
|
|
void clear();
|
|
ProjectNode *indexToNode(const QModelIndex &index) const;
|
|
private:
|
|
QList<ProjectNode *> items_;
|
|
};
|
|
|
|
class DirectoryModel : public QAbstractItemModel, public IProjectNodesModel
|
|
{
|
|
public:
|
|
DirectoryModel(QObject *parent = 0);
|
|
void setDirectory(ProjectNode *directory);
|
|
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
|
|
virtual QModelIndex parent(const QModelIndex &index) const;
|
|
virtual int rowCount(const QModelIndex &parent) const;
|
|
virtual int columnCount(const QModelIndex &parent) const;
|
|
virtual Qt::ItemFlags flags(const QModelIndex &index) const;
|
|
virtual QVariant data(const QModelIndex &index, int role) const;
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
virtual bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex());
|
|
QModelIndex nodeToIndex(ProjectNode *node) const;
|
|
void updateNode(ProjectNode *node);
|
|
void removeNode(ProjectNode *node);
|
|
private:
|
|
ProjectNode *indexToNode(const QModelIndex &index) const;
|
|
QList<ProjectNode *> items_;
|
|
ProjectNode *directory_;
|
|
};
|
|
|
|
class IFile;
|
|
class MapFunctionBundle;
|
|
class MapFunctionBundleListModel : public QAbstractItemModel
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
MapFunctionBundleListModel(IFile &file, bool codeOnly, QObject *parent = 0);
|
|
virtual int rowCount(const QModelIndex &parent) const;
|
|
virtual int columnCount(const QModelIndex &parent) const;
|
|
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
|
|
virtual QModelIndex parent(const QModelIndex &index) const;
|
|
virtual QVariant data(const QModelIndex &index, int role) const;
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
void search(const QString &text);
|
|
virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
|
|
private:
|
|
QList<MapFunctionBundle*> mapFunctionList_;
|
|
QList<MapFunctionBundle*> items_;
|
|
};
|
|
|
|
class MapFunction;
|
|
class MapFunctionListModel : public QAbstractItemModel
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
MapFunctionListModel(IArchitecture &file, bool codeOnly, QObject *parent = 0);
|
|
virtual int rowCount(const QModelIndex &parent) const;
|
|
virtual int columnCount(const QModelIndex &parent) const;
|
|
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
|
|
virtual QModelIndex parent(const QModelIndex &index) const;
|
|
virtual QVariant data(const QModelIndex &index, int role) const;
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
void search(const QString &text);
|
|
virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
|
|
private:
|
|
QList<MapFunction*> mapFunctionList_;
|
|
QList<MapFunction*> items_;
|
|
};
|
|
|
|
class WatermarkManager;
|
|
class Watermark;
|
|
|
|
class WatermarksModel : public BaseModel
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
WatermarksModel(QObject *parent = 0);
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
virtual Qt::ItemFlags flags(const QModelIndex & index) const;
|
|
WatermarkManager *manager() const;
|
|
void setCore(Core *core);
|
|
void addWatermark(Watermark *watermark);
|
|
void updateWatermark(Watermark *watermark);
|
|
void removeWatermark(Watermark *watermark);
|
|
QModelIndex indexByName(const QString &watermarkName) const;
|
|
private:
|
|
ProjectNode *internalAddWatermark(Watermark *watermark);
|
|
ProjectNode *internalUpdateWatermark(Watermark *watermark);
|
|
};
|
|
|
|
class WatermarkScanModel : public QAbstractItemModel
|
|
{
|
|
public:
|
|
WatermarkScanModel(QObject *parent = 0);
|
|
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
|
|
virtual QModelIndex parent(const QModelIndex &index) const;
|
|
virtual int rowCount(const QModelIndex &parent) const;
|
|
virtual int columnCount(const QModelIndex &parent) const;
|
|
virtual QVariant data(const QModelIndex &index, int role) const;
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
Watermark *indexToWatermark(const QModelIndex &index) const;
|
|
void setWatermarkData(std::map<Watermark *, size_t> data);
|
|
void removeWatermark(Watermark *watermark);
|
|
void clear();
|
|
private:
|
|
QMap<Watermark *, size_t> items_;
|
|
};
|
|
|
|
class ProjectTemplate;
|
|
class TemplatesModel : public BaseModel
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
TemplatesModel(QObject *parent = 0);
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
virtual QVariant data(const QModelIndex &index, int role) const;
|
|
virtual Qt::ItemFlags flags(const QModelIndex & index) const;
|
|
void setCore(Core *core);
|
|
void addTemplate(ProjectTemplate * pt);
|
|
void updateTemplate(ProjectTemplate *pt);
|
|
void removeTemplate(ProjectTemplate *pt);
|
|
private:
|
|
ProjectNode *internalAddTemplate(ProjectTemplate * pt);
|
|
ProjectNode *internalUpdateTemplate(ProjectTemplate * pt);
|
|
};
|
|
|
|
class LogModel : public BaseModel
|
|
{
|
|
public:
|
|
LogModel(QObject *parent = 0);
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
void clear();
|
|
void addMessage(MessageType type, IObject *sender, const QString &text);
|
|
void removeObject(void *object);
|
|
};
|
|
|
|
class ProjectTreeDelegate : public TreeViewItemDelegate
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
ProjectTreeDelegate(QObject *parent = 0);
|
|
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const;
|
|
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
|
|
};
|
|
|
|
class WatermarksTreeDelegate : public TreeViewItemDelegate
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
WatermarksTreeDelegate(QObject *parent = 0);
|
|
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const;
|
|
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
|
|
};
|
|
|
|
class TemplatesTreeDelegate : public TreeViewItemDelegate
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
TemplatesTreeDelegate(QObject *parent = 0);
|
|
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const;
|
|
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
|
|
};
|
|
|
|
class DumpModel : public QAbstractItemModel
|
|
{
|
|
public:
|
|
DumpModel(QObject *parent = 0);
|
|
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
|
|
virtual QModelIndex parent(const QModelIndex &index) const;
|
|
virtual int rowCount(const QModelIndex &parent) const;
|
|
virtual int columnCount(const QModelIndex &parent) const;
|
|
virtual QVariant data(const QModelIndex &index, int role) const;
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
void setFile(IArchitecture *file);
|
|
QModelIndex addressToIndex(uint64_t address);
|
|
private:
|
|
QByteArray read(uint64_t address, int size) const;
|
|
uint64_t indexToAddress(const QModelIndex &index) const;
|
|
|
|
IArchitecture *file_;
|
|
QMap<uint64_t, int> addrsToRows_;
|
|
mutable int rowCountCache_;
|
|
mutable uint64_t cacheAddress_;
|
|
mutable QByteArray cache_;
|
|
};
|
|
|
|
class ICommand;
|
|
class DisasmModel : public QAbstractItemModel
|
|
{
|
|
public:
|
|
DisasmModel(QObject *parent = 0);
|
|
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
|
|
virtual QModelIndex parent(const QModelIndex &index) const;
|
|
virtual int rowCount(const QModelIndex &parent) const;
|
|
virtual int columnCount(const QModelIndex &parent) const;
|
|
virtual QVariant data(const QModelIndex &index, int role) const;
|
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
void setFile(IArchitecture *file);
|
|
QModelIndex addressToIndex(uint64_t address);
|
|
ICommand *indexToCommand(const QModelIndex &index) const;
|
|
IArchitecture *file() const { return file_; }
|
|
private:
|
|
int addressOffset(uint64_t address) const;
|
|
uint64_t offsetToAddress(int offset) const;
|
|
void funcClear() const;
|
|
|
|
IArchitecture *file_;
|
|
mutable int rowCountCache_;
|
|
QMap<uint64_t, int> addrsToRows_;
|
|
IFunction *func_;
|
|
};
|
|
|
|
class ItemModelSearcher
|
|
{
|
|
public:
|
|
ItemModelSearcher(QAbstractItemModel *where, QModelIndex from, const QRegExp *term, bool forward, bool incremental) :
|
|
where_(where), from_(from), term_(term), forward_(forward), incremental_(incremental), current_match_(NULL)
|
|
{
|
|
result_ = find();
|
|
}
|
|
QModelIndex result() { return result_; }
|
|
|
|
private:
|
|
QModelIndex find();
|
|
QModelIndex result_;
|
|
|
|
bool extractMatchingIndexes(const QModelIndex &parent);
|
|
|
|
QAbstractItemModel *where_;
|
|
const QRegExp *term_;
|
|
const bool forward_, incremental_;
|
|
const QModelIndex from_;
|
|
|
|
QModelIndex match_before_, match_after_;
|
|
QModelIndex *current_match_;
|
|
};
|
|
|
|
#endif |