13 #ifndef hifi_AvatarProject_h
14 #define hifi_AvatarProject_h
16 #include "AvatarDoctor.h"
17 #include "ProjectFile.h"
22 #include <QVariantHash>
23 #include <QStandardPaths>
25 namespace AvatarProjectStatus {
27 enum AvatarProjectStatus {
30 ERROR_CREATE_PROJECT_NAME,
31 ERROR_CREATE_CREATING_DIRECTORIES,
32 ERROR_CREATE_FIND_MODEL,
33 ERROR_CREATE_OPEN_MODEL,
34 ERROR_CREATE_READ_MODEL,
35 ERROR_CREATE_WRITE_FST,
36 ERROR_OPEN_INVALID_FILE_TYPE,
37 ERROR_OPEN_PROJECT_FOLDER,
42 Q_ENUM_NS(AvatarProjectStatus)
46 class AvatarProject :
public QObject {
48 Q_PROPERTY(FST* fst READ getFST CONSTANT)
50 Q_PROPERTY(QStringList projectFiles READ getProjectFiles NOTIFY projectFilesChanged)
52 Q_PROPERTY(QString projectFolderPath READ getProjectPath CONSTANT)
53 Q_PROPERTY(QString projectFSTPath READ getFSTPath CONSTANT)
54 Q_PROPERTY(QString projectFBXPath READ getFBXPath CONSTANT)
55 Q_PROPERTY(QString name READ getProjectName WRITE setProjectName NOTIFY nameChanged)
56 Q_PROPERTY(
bool hasErrors READ getHasErrors WRITE setHasErrors NOTIFY hasErrorsChanged)
59 Q_INVOKABLE QStringList getProjectFiles()
const;
60 Q_INVOKABLE AvatarDoctor* diagnose();
63 Q_INVOKABLE QString getProjectName()
const {
return _fst->getName(); }
64 Q_INVOKABLE
void setProjectName(
const QString& newProjectName) {
65 if (newProjectName.trimmed().length() > 0) {
66 _fst->setName(newProjectName);
71 Q_INVOKABLE QString getProjectPath()
const {
return _projectPath; }
72 Q_INVOKABLE QString getFSTPath()
const {
return _fst->getPath(); }
73 Q_INVOKABLE QString getFBXPath()
const {
74 return QDir::cleanPath(QDir(_projectPath).absoluteFilePath(_fst->getModelPath()));
76 Q_INVOKABLE
bool getHasErrors()
const {
return _hasErrors; }
77 Q_INVOKABLE
void setHasErrors(
bool hasErrors) {
78 _hasErrors = hasErrors;
79 emit hasErrorsChanged();
85 static AvatarProject* openAvatarProject(
const QString& path, AvatarProjectStatus::AvatarProjectStatus& status);
86 static AvatarProject* createAvatarProject(
const QString& projectsFolder,
87 const QString& avatarProjectName,
88 const QString& avatarModelPath,
89 const QString& textureFolder,
90 AvatarProjectStatus::AvatarProjectStatus& status);
92 static bool isValidNewProjectName(
const QString& projectPath,
const QString& projectName);
94 static QString getDefaultProjectsPath() {
95 return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) +
"/Overte Projects";
100 void projectFilesChanged();
101 void hasErrorsChanged();
104 AvatarProject(
const QString& fstPath,
const QByteArray& data);
105 AvatarProject(FST* fst);
107 ~AvatarProject() { _fst->deleteLater(); }
109 FST* getFST() {
return _fst; }
111 void refreshProjectFiles();
112 void appendDirectory(
const QString& prefix,
const QDir& dir);
113 QStringList getScriptPaths(
const QDir& scriptsDir)
const;
118 QList<ProjectFilePath> _projectFiles{};
119 QString _projectPath;
121 bool _hasErrors {
false };