From 4da4fd889ae884dca0b83b4c565f6b6306cfec4c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 9 Mar 2016 11:04:49 -0800 Subject: [PATCH] Add AssetMappingModel --- interface/resources/qml/AssetServer.qml | 3 +- libraries/networking/src/AssetClient.cpp | 99 +++++++++++++++++++++++- libraries/networking/src/AssetClient.h | 24 +++++- 3 files changed, 122 insertions(+), 4 deletions(-) diff --git a/interface/resources/qml/AssetServer.qml b/interface/resources/qml/AssetServer.qml index 34f6502b40..3e2dba164d 100644 --- a/interface/resources/qml/AssetServer.qml +++ b/interface/resources/qml/AssetServer.qml @@ -33,7 +33,7 @@ Window { HifiConstants { id: hifi } property var scripts: ScriptDiscoveryService; - property var scriptsModel: scripts.scriptsModelFilter + property var scriptsModel: Assets.getAssetMappingModel() property var currentDirectory; Settings { @@ -45,6 +45,7 @@ Window { function reload() { print("reload"); + scriptsModel.refresh(); } function addToWorld() { print("addToWorld"); diff --git a/libraries/networking/src/AssetClient.cpp b/libraries/networking/src/AssetClient.cpp index 40838e3732..7eb49ff418 100644 --- a/libraries/networking/src/AssetClient.cpp +++ b/libraries/networking/src/AssetClient.cpp @@ -792,8 +792,11 @@ void AssetScriptingInterface::downloadData(QString urlString, QScriptValue callb assetRequest->start(); } +static int standardItemModelMetaTypeId = qRegisterMetaType("AssetMappingModel*"); + AssetMappingsScriptingInterface::AssetMappingsScriptingInterface(QJSEngine* engine) : - _engine(engine) + _engine(engine), + _assetMappingModel(this) { } @@ -867,3 +870,97 @@ void AssetMappingsScriptingInterface::getAllMappings(QJSValue callback) { request->start(); } + +AssetMappingModel::AssetMappingModel(QObject* parent) { +} + +void AssetMappingModel::refresh() { + qDebug() << "Refreshing asset mapping model"; + auto assetClient = DependencyManager::get(); + auto request = assetClient->createGetAllMappingsRequest(); + + connect(request, &GetAllMappingsRequest::finished, this, [this](GetAllMappingsRequest* request) mutable { + qDebug() << "Got response"; + auto mappings = request->getMappings(); +// clear(); + for (auto& mapping : mappings) { + auto& path = mapping.first; + auto parts = path.split("/"); + auto length = parts.length(); + + QString prefix = parts[0]; + + QStandardItem* lastItem = nullptr; + + auto it = _pathToItemMap.find(prefix); + if (it == _pathToItemMap.end()) { + lastItem = new QStandardItem(parts[0]); + _pathToItemMap[prefix] = lastItem; + appendRow(lastItem); + } else { + lastItem = it.value(); + } + + if (length > 1) { + for (int i = 1; i < length; ++i) { + prefix += "/" + parts[i]; + + auto it = _pathToItemMap.find(prefix); + if (it == _pathToItemMap.end()) { + qDebug() << "prefix not found: " << prefix; + auto item = new QStandardItem(parts[i]); + lastItem->setChild(lastItem->rowCount(), 0, item); + lastItem = item; + _pathToItemMap[prefix] = lastItem; + } else { + lastItem = it.value(); + } + } + } + + Q_ASSERT(prefix == path); + } + }); + + request->start(); +} + + +// QModelIndex AssetMappingModel::index(int row, int column, const QModelIndex& parent) const { +// if (row < 0 || column < 0) { +// return QModelIndex(); +// } + +// if (parent.isValid()) { +// auto item = static_cast(parent.internalPointer()); +// return createIndex(row, column, ) +// } +// return createIndex(row, column, getFolderNodes( +// static_cast(getTreeNodeFromIndex(parent))).at(row)); +// } + +// QModelIndex AssetMappingModel::parent(const QModelIndex& child) const { +// AssetMappingItem* parent = (static_cast(child.internalPointer()))->getParent(); +// if (!parent) { +// return QModelIndex(); +// } +// AssetMappingItem* grandParent = parent->getParent(); +// int row = getFolderNodes(grandParent).indexOf(parent); +// return createIndex(row, 0, parent); +// } + +// QVariant AssetMappingModel::data(const QModelIndex& index, int role) const { +// TreeNodeBase* node = getTreeNodeFromIndex(index); +// if (!node) { +// return QVariant(); +// } +// return QVariant(); +// } + +// int AssetMappingModel::rowCount(const QModelIndex& parent) const { +// return 1; +// } + +// int AssetMappingModel::columnCount(const QModelIndex& parent) const { +// return 1; +// } diff --git a/libraries/networking/src/AssetClient.h b/libraries/networking/src/AssetClient.h index cec1bd3872..f48be7f962 100644 --- a/libraries/networking/src/AssetClient.h +++ b/libraries/networking/src/AssetClient.h @@ -12,6 +12,7 @@ #ifndef hifi_AssetClient_h #define hifi_AssetClient_h +#include #include #include @@ -125,11 +126,31 @@ protected: }; + class AssetMappingModel : public QStandardItemModel { + Q_OBJECT + public: + AssetMappingModel(QObject* parent = nullptr); + + Q_INVOKABLE void refresh(); + private: + QHash _pathToItemMap; + }; + + //class AssetMappingItem : public QStandardItem { + //Q_OBJECT + //public: + //AssetMappingItem(); + //}; + + class AssetMappingsScriptingInterface : public QObject { Q_OBJECT + Q_PROPERTY(AssetMappingModel* mappingModel READ getAssetMappingModel CONSTANT) public: AssetMappingsScriptingInterface(QJSEngine* engine); + Q_INVOKABLE AssetMappingModel* getAssetMappingModel() { return &_assetMappingModel; }; + Q_INVOKABLE void setMapping(QString path, QString hash, QJSValue callback); Q_INVOKABLE void getMapping(QString path, QJSValue callback); Q_INVOKABLE void deleteMappings(QStringList paths, QJSValue callback); @@ -137,7 +158,6 @@ public: protected: QSet _pendingRequests; QJSEngine* _engine; + AssetMappingModel _assetMappingModel; }; - - #endif