History

Merge branch 'atp' of github.com:birarda/hifi into atp-more

Ryan Huffman committed 10 years ago

Commit 2d4864e2 parents 76ed163 672bafc13 files · +261 −136Browse files

Showing the changes to interface/src/scripting/AssetMappingsScriptingInterface.cpp (1 of 13 files). Show all

Unified · Split

interface/src/scripting/AssetMappingsScriptingInterface.cpp+283−0
@@ -0,0 +1,283 @@
1//
2// AssetMappingsScriptingInterface.cpp
3// libraries/script-engine/src
4//
5// Created by Ryan Huffman on 2016-03-09.
6// Copyright 2016 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#include "AssetMappingsScriptingInterface.h"
13
14#include <QtScript/QScriptEngine>
15#include <QtCore/QFile>
16
17#include <AssetRequest.h>
18#include <AssetUpload.h>
19#include <MappingRequest.h>
20#include <NetworkLogging.h>
21#include <OffscreenUi.h>
22
23AssetMappingsScriptingInterface::AssetMappingsScriptingInterface() {
24 _proxyModel.setSourceModel(&_assetMappingModel);
25 _proxyModel.setSortRole(Qt::DisplayRole);
26 _proxyModel.setDynamicSortFilter(true);
27 _proxyModel.sort(0);
28}
29
30QString AssetMappingsScriptingInterface::getErrorString(int errorCode) const {
31 switch (errorCode) {
32 case MappingRequest::NoError:
33 return "No error";
34 case MappingRequest::NotFound:
35 return "Asset not found";
36 case MappingRequest::NetworkError:
37 return "Unable to communicate with Asset Server";
38 case MappingRequest::PermissionDenied:
39 return "Permission denied";
40 case MappingRequest::InvalidPath:
41 return "Path is invalid";
42 case MappingRequest::InvalidHash:
43 return "Hash is invalid";
44 case MappingRequest::UnknownError:
45 return "Asset Server internal error";
46 default:
47 return QString();
48 }
49}
50
51void AssetMappingsScriptingInterface::setMapping(QString path, QString hash, QJSValue callback) {
52 auto assetClient = DependencyManager::get<AssetClient>();
53 auto request = assetClient->createSetMappingRequest(path, hash);
54
55 connect(request, &SetMappingRequest::finished, this, [this, callback](SetMappingRequest* request) mutable {
56 if (callback.isCallable()) {
57 QJSValueList args { uint8_t(request->getError()) };
58 callback.call(args);
59 }
60
61 request->deleteLater();
62 });
63
64 request->start();
65}
66
67void AssetMappingsScriptingInterface::getMapping(QString path, QJSValue callback) {
68 auto assetClient = DependencyManager::get<AssetClient>();
69 auto request = assetClient->createGetMappingRequest(path);
70
71 connect(request, &GetMappingRequest::finished, this, [this, callback](GetMappingRequest* request) mutable {
72 if (callback.isCallable()) {
73 QJSValueList args { uint8_t(request->getError()) };
74 callback.call(args);
75 }
76
77 request->deleteLater();
78 });
79
80 request->start();
81}
82
83void AssetMappingsScriptingInterface::uploadFile(QString path, QString mapping, QJSValue callback) {
84 auto offscreenUi = DependencyManager::get<OffscreenUi>();
85 auto result = offscreenUi->inputDialog(OffscreenUi::ICON_NONE, "Enter asset path:", "", mapping);
86
87 if (!result.isValid()) {
88 return;
89 }
90 mapping = result.toString();
91
92 // Check for override
93 if (isKnownMapping(mapping)) {
94 auto message = path + "\n" + "This file already exists. Do you want to overwrite it?";
95 auto button = offscreenUi->messageBox(OffscreenUi::ICON_QUESTION, "Overwrite File", message,
96 QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
97 if (button == QMessageBox::No) {
98 return;
99 }
100 }
101
102 auto upload = DependencyManager::get<AssetClient>()->createUpload(path);
103 QObject::connect(upload, &AssetUpload::finished, this, [=](AssetUpload* upload, const QString& hash) mutable {
104 if (upload->getError() != AssetUpload::NoError) {
105 if (callback.isCallable()) {
106 QJSValueList args { uint8_t(upload->getError()) };
107 callback.call(args);
108 }
109 } else {
110 setMapping(mapping, hash, callback);
111 }
112
113 upload->deleteLater();
114 });
115
116 upload->start();
117}
118
119void AssetMappingsScriptingInterface::deleteMappings(QStringList paths, QJSValue callback) {
120 auto assetClient = DependencyManager::get<AssetClient>();
121 auto request = assetClient->createDeleteMappingsRequest(paths);
122
123 connect(request, &DeleteMappingsRequest::finished, this, [this, callback](DeleteMappingsRequest* request) mutable {
124 if (callback.isCallable()) {
125 QJSValueList args { uint8_t(request->getError()) };
126 callback.call(args);
127 }
128
129 request->deleteLater();
130 });
131
132 request->start();
133}
134
135void AssetMappingsScriptingInterface::getAllMappings(QJSValue callback) {
136 auto assetClient = DependencyManager::get<AssetClient>();
137 auto request = assetClient->createGetAllMappingsRequest();
138
139 connect(request, &GetAllMappingsRequest::finished, this, [this, callback](GetAllMappingsRequest* request) mutable {
140 auto mappings = request->getMappings();
141 auto map = callback.engine()->newObject();
142
143 for (auto& kv : mappings ) {
144 map.setProperty(kv.first, kv.second);
145 }
146
147 if (callback.isCallable()) {
148 QJSValueList args { uint8_t(request->getError()) };
149 callback.call(args);
150 }
151
152 request->deleteLater();
153 });
154
155 request->start();
156}
157
158void AssetMappingsScriptingInterface::renameMapping(QString oldPath, QString newPath, QJSValue callback) {
159 auto assetClient = DependencyManager::get<AssetClient>();
160 auto request = assetClient->createRenameMappingRequest(oldPath, newPath);
161
162 connect(request, &RenameMappingRequest::finished, this, [this, callback](RenameMappingRequest* request) mutable {
163 if (callback.isCallable()) {
164 QJSValueList args { uint8_t(request->getError()) };
165 callback.call(args);
166 }
167
168 request->deleteLater();
169 });
170
171 request->start();
172}
173
174
175AssetMappingItem::AssetMappingItem(const QString& name, const QString& fullPath, bool isFolder) :
176 name(name),
177 fullPath(fullPath),
178 isFolder(isFolder)
179{
180
181}
182
183static int assetMappingModelMetatypeId = qRegisterMetaType<AssetMappingModel*>("AssetMappingModel*");
184
185void AssetMappingModel::refresh() {
186 qDebug() << "Refreshing asset mapping model";
187 auto assetClient = DependencyManager::get<AssetClient>();
188 auto request = assetClient->createGetAllMappingsRequest();
189
190 connect(request, &GetAllMappingsRequest::finished, this, [this](GetAllMappingsRequest* request) mutable {
191 if (request->getError() == MappingRequest::NoError) {
192 auto mappings = request->getMappings();
193 auto existingPaths = _pathToItemMap.keys();
194 for (auto& mapping : mappings) {
195 auto& path = mapping.first;
196 auto parts = path.split("/");
197 auto length = parts.length();
198
199 existingPaths.removeOne(mapping.first);
200
201 QString fullPath = "/";
202
203 QStandardItem* lastItem = nullptr;
204
205 // start index at 1 to avoid empty string from leading slash
206 for (int i = 1; i < length; ++i) {
207 fullPath += (i == 1 ? "" : "/") + parts[i];
208
209 auto it = _pathToItemMap.find(fullPath);
210 if (it == _pathToItemMap.end()) {
211 auto item = new QStandardItem(parts[i]);
212 bool isFolder = i < length - 1;
213 item->setData(isFolder ? fullPath + "/" : fullPath, Qt::UserRole);
214 item->setData(isFolder, Qt::UserRole + 1);
215 item->setData(parts[i], Qt::UserRole + 2);
216 item->setData("atp:" + fullPath, Qt::UserRole + 3);
217 item->setData(fullPath, Qt::UserRole + 4);
218 if (lastItem) {
219 lastItem->setChild(lastItem->rowCount(), 0, item);
220 } else {
221 appendRow(item);
222 }
223
224 lastItem = item;
225 _pathToItemMap[fullPath] = lastItem;
226 }
227 else {
228 lastItem = it.value();
229 }
230 }
231
232 Q_ASSERT(fullPath == path);
233 }
234
235 // Remove folders from list
236 auto it = existingPaths.begin();
237 while (it != existingPaths.end()) {
238 Q_ASSERT(_pathToItemMap.contains(*it));
239 auto item = _pathToItemMap[*it];
240 if (item && item->data(Qt::UserRole + 1).toBool()) {
241 it = existingPaths.erase(it);
242 } else {
243 ++it;
244 }
245 }
246
247 for (auto& path : existingPaths) {
248 Q_ASSERT(_pathToItemMap.contains(path));
249
250 auto item = _pathToItemMap[path];
251
252 while (item) {
253 // During each iteration, delete item
254 QStandardItem* nextItem = nullptr;
255
256 auto fullPath = item->data(Qt::UserRole + 4).toString();
257 auto parent = item->parent();
258 if (parent) {
259 parent->removeRow(item->row());
260 if (parent->rowCount() > 0) {
261 // The parent still contains children, set the nextItem to null so we stop processing
262 nextItem = nullptr;
263 } else {
264 nextItem = parent;
265 }
266 } else {
267 auto removed = removeRow(item->row());
268 Q_ASSERT(removed);
269 }
270
271 Q_ASSERT(_pathToItemMap.contains(fullPath));
272 _pathToItemMap.remove(fullPath);
273
274 item = nextItem;
275 }
276 }
277 } else {
278 emit errorGettingMappings(static_cast<int>(request->getError()));
279 }
280 });
281
282 request->start();
283}