Overte C++ Documentation
AvatarProject.h
1 //
2 // AvatarProject.h
3 //
4 //
5 // Created by Thijs Wenker on 12/7/2018
6 // Copyright 2018 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #pragma once
13 #ifndef hifi_AvatarProject_h
14 #define hifi_AvatarProject_h
15 
16 #include "AvatarDoctor.h"
17 #include "ProjectFile.h"
18 #include "FST.h"
19 
20 #include <QObject>
21 #include <QDir>
22 #include <QVariantHash>
23 #include <QStandardPaths>
24 
25 namespace AvatarProjectStatus {
26  Q_NAMESPACE
27  enum AvatarProjectStatus {
28  NONE,
29  SUCCESS,
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,
38  ERROR_OPEN_FIND_FST,
39  ERROR_OPEN_OPEN_FST,
40  ERROR_OPEN_FIND_MODEL
41  };
42  Q_ENUM_NS(AvatarProjectStatus)
43 }
44 
45 
46 class AvatarProject : public QObject {
47  Q_OBJECT
48  Q_PROPERTY(FST* fst READ getFST CONSTANT)
49 
50  Q_PROPERTY(QStringList projectFiles READ getProjectFiles NOTIFY projectFilesChanged)
51 
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)
57 
58 public:
59  Q_INVOKABLE QStringList getProjectFiles() const;
60  Q_INVOKABLE AvatarDoctor* diagnose();
61 
62 
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);
67  _fst->write();
68  emit nameChanged();
69  }
70  }
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()));
75  }
76  Q_INVOKABLE bool getHasErrors() const { return _hasErrors; }
77  Q_INVOKABLE void setHasErrors(bool hasErrors) {
78  _hasErrors = hasErrors;
79  emit hasErrorsChanged();
80  }
81 
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);
91 
92  static bool isValidNewProjectName(const QString& projectPath, const QString& projectName);
93 
94  static QString getDefaultProjectsPath() {
95  return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/Overte Projects";
96  }
97 
98 signals:
99  void nameChanged();
100  void projectFilesChanged();
101  void hasErrorsChanged();
102 
103 private:
104  AvatarProject(const QString& fstPath, const QByteArray& data);
105  AvatarProject(FST* fst);
106 
107  ~AvatarProject() { _fst->deleteLater(); }
108 
109  FST* getFST() { return _fst; }
110 
111  void refreshProjectFiles();
112  void appendDirectory(const QString& prefix, const QDir& dir);
113  QStringList getScriptPaths(const QDir& scriptsDir) const;
114 
115  FST* _fst;
116 
117  QDir _directory;
118  QList<ProjectFilePath> _projectFiles{};
119  QString _projectPath;
120 
121  bool _hasErrors { false };
122 };
123 
124 #endif // hifi_AvatarProject_h