From 51c8248463c226308224fa40db7832b2b464f701 Mon Sep 17 00:00:00 2001 From: Alexander Ivash Date: Wed, 9 May 2018 21:47:41 +0300 Subject: [PATCH] introduce reverting avatar wearables on cancel --- interface/resources/qml/hifi/AvatarApp.qml | 17 +++++++-- .../qml/hifi/avatarapp/AdjustWearables.qml | 36 ++++++------------- interface/src/AvatarBookmarks.cpp | 8 +++++ interface/src/AvatarBookmarks.h | 1 + scripts/system/avatarapp.js | 11 ++++++ 5 files changed, 44 insertions(+), 29 deletions(-) diff --git a/interface/resources/qml/hifi/AvatarApp.qml b/interface/resources/qml/hifi/AvatarApp.qml index 5ce0c8eff0..1e2726bfc5 100644 --- a/interface/resources/qml/hifi/AvatarApp.qml +++ b/interface/resources/qml/hifi/AvatarApp.qml @@ -56,11 +56,22 @@ Rectangle { adjustWearables.refreshWearable(message.entityID, message.wearableIndex, message.properties); } else if(message.method === 'wearablesUpdated') { var wearablesModel = currentAvatarModel.get(0).wearables; + + console.debug('handling wearablesUpdated, new wearables count:', message.wearables.length, ': old wearables: '); + for(var i = 0; i < wearablesModel.count; ++i) { + console.debug('wearable: ', wearablesModel.get(i).properties.id); + } + wearablesModel.clear(); message.wearables.forEach(function(wearable) { wearablesModel.append(wearable); }); - console.debug('wearablesUpdated: ', JSON.stringify(wearablesModel, 0, 4), '*****', JSON.stringify(message.wearables, 0, 4)); + + console.debug('handling wearablesUpdated: new wearables: '); + for(var i = 0; i < wearablesModel.count; ++i) { + console.debug('wearable: ', wearablesModel.get(i).properties.id); + } + adjustWearables.refresh(root.currentAvatar); } else if(message.method === 'bookmarkLoaded') { setCurrentAvatar(message.reply.currentAvatar); @@ -210,10 +221,10 @@ Rectangle { emitSendToScript({'method' : 'deleteWearable', 'entityID' : id, 'avatarName' : avatarName}); } onAdjustWearablesOpened: { - emitSendToScript({'method' : 'adjustWearablesOpened'}); + emitSendToScript({'method' : 'adjustWearablesOpened', 'avatarName' : avatarName}); } onAdjustWearablesClosed: { - emitSendToScript({'method' : 'adjustWearablesClosed'}); + emitSendToScript({'method' : 'adjustWearablesClosed', 'save' : status, 'avatarName' : avatarName}); } onWearableSelected: { emitSendToScript({'method' : 'selectWearable', 'entityID' : id}); diff --git a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml index 3ae0e17ca8..ce51b497d0 100644 --- a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml +++ b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml @@ -16,7 +16,7 @@ Rectangle { signal wearableDeleted(string avatarName, var id); signal adjustWearablesOpened(); - signal adjustWearablesClosed(); + signal adjustWearablesClosed(bool status); property bool modified: false; Component.onCompleted: { @@ -27,20 +27,10 @@ Rectangle { console.debug('modified: ', modified) } - property var onButton2Clicked; - property var onButton1Clicked; property var jointNames; - property var wearables: ({}) property string avatarName: '' property var wearablesModel; - function backupWearables(avatar) { - for(var i = 0; i < avatar.wearables.count; ++i) { - var wearable = avatar.wearables.get(i).properties; - wearables[wearable.id] = JSON.stringify(wearable) - } - } - function open(avatar) { adjustWearablesOpened(); console.debug('AdjustWearables.qml: open: ', JSON.stringify(avatar, null, '\t')); @@ -48,13 +38,15 @@ Rectangle { visible = true; avatarName = avatar.name; wearablesModel = avatar.wearables; - wearables = {}; - refresh(avatar); - backupWearables(avatar); } function refresh(avatar) { + console.debug('refresh: '); + for(var i = 0; i < avatar.wearables.count; ++i) { + console.debug('wearable: ', avatar.wearables.get(i).properties.id); + } + wearablesCombobox.model.clear(); console.debug('AdjustWearables.qml: open: avatar.wearables.count: ', avatar.wearables.count); for(var i = 0; i < avatar.wearables.count; ++i) { @@ -109,9 +101,9 @@ Rectangle { } } - function close() { + function close(status) { visible = false; - adjustWearablesClosed(); + adjustWearablesClosed(status); } HifiConstants { id: hifi } @@ -324,19 +316,11 @@ Rectangle { noText: "CANCEL" onYesClicked: function() { - if(onButton2Clicked) { - onButton2Clicked(); - } else { - root.close(); - } + root.close(true); } onNoClicked: function() { - if(onButton1Clicked) { - onButton1Clicked(); - } else { - root.close(); - } + root.close(false); } } } diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index df3fbbfd24..73e416b354 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -136,6 +136,14 @@ void AvatarBookmarks::removeBookmark(const QString& bookmarkName) { } } +void AvatarBookmarks::updateAvatarEntities(const QVariantList &avatarEntities) +{ + auto myAvatar = DependencyManager::get()->getMyAvatar(); + myAvatar->removeAvatarEntities(); + + addAvatarEntities(avatarEntities); +} + void AvatarBookmarks::loadBookmark(const QString& bookmarkName) { if (QThread::currentThread() != thread()) { BLOCKING_INVOKE_METHOD(this, "loadBookmark", Q_ARG(QString, bookmarkName)); diff --git a/interface/src/AvatarBookmarks.h b/interface/src/AvatarBookmarks.h index d77e36d9ad..af6f942770 100644 --- a/interface/src/AvatarBookmarks.h +++ b/interface/src/AvatarBookmarks.h @@ -43,6 +43,7 @@ public slots: void saveBookmark(const QString& bookmarkName); void loadBookmark(const QString& bookmarkName); void removeBookmark(const QString& bookmarkName); + void updateAvatarEntities(const QVariantList& avatarEntities); QVariantMap getBookmarks() { return _bookmarks; } signals: diff --git a/scripts/system/avatarapp.js b/scripts/system/avatarapp.js index 8875ea2a3b..c4e4a06d29 100644 --- a/scripts/system/avatarapp.js +++ b/scripts/system/avatarapp.js @@ -96,6 +96,7 @@ var adjustWearables = { } } +var currentAvatarWearablesBackup = null; var currentAvatar = getMyAvatar(); var selectedAvatarEntityGrabbable = false; var selectedAvatarEntity = null; @@ -128,10 +129,20 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See AvatarBookmarks.loadBookmark(message.name); break; case 'adjustWearablesOpened': + currentAvatarWearablesBackup = getMyAvatarWearables(); adjustWearables.setOpened(true); Entities.mousePressOnEntity.connect(onSelectedEntity); break; case 'adjustWearablesClosed': + if(!message.save) { + // revert changes using snapshot of wearables + console.debug('reverting... '); + if(currentAvatarWearablesBackup !== null) { + AvatarBookmarks.updateAvatarEntities(currentAvatarWearablesBackup); + sendToQml({'method' : 'wearablesUpdated', 'wearables' : currentAvatarWearablesBackup, 'avatarName' : message.avatarName}) + } + } + adjustWearables.setOpened(false); ensureWearableSelected(null); Entities.mousePressOnEntity.disconnect(onSelectedEntity);