introduce reverting avatar wearables on cancel

This commit is contained in:
Alexander Ivash 2018-05-09 21:47:41 +03:00
parent 9914a1d523
commit 51c8248463
5 changed files with 44 additions and 29 deletions

View file

@ -56,11 +56,22 @@ Rectangle {
adjustWearables.refreshWearable(message.entityID, message.wearableIndex, message.properties); adjustWearables.refreshWearable(message.entityID, message.wearableIndex, message.properties);
} else if(message.method === 'wearablesUpdated') { } else if(message.method === 'wearablesUpdated') {
var wearablesModel = currentAvatarModel.get(0).wearables; 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(); wearablesModel.clear();
message.wearables.forEach(function(wearable) { message.wearables.forEach(function(wearable) {
wearablesModel.append(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); adjustWearables.refresh(root.currentAvatar);
} else if(message.method === 'bookmarkLoaded') { } else if(message.method === 'bookmarkLoaded') {
setCurrentAvatar(message.reply.currentAvatar); setCurrentAvatar(message.reply.currentAvatar);
@ -210,10 +221,10 @@ Rectangle {
emitSendToScript({'method' : 'deleteWearable', 'entityID' : id, 'avatarName' : avatarName}); emitSendToScript({'method' : 'deleteWearable', 'entityID' : id, 'avatarName' : avatarName});
} }
onAdjustWearablesOpened: { onAdjustWearablesOpened: {
emitSendToScript({'method' : 'adjustWearablesOpened'}); emitSendToScript({'method' : 'adjustWearablesOpened', 'avatarName' : avatarName});
} }
onAdjustWearablesClosed: { onAdjustWearablesClosed: {
emitSendToScript({'method' : 'adjustWearablesClosed'}); emitSendToScript({'method' : 'adjustWearablesClosed', 'save' : status, 'avatarName' : avatarName});
} }
onWearableSelected: { onWearableSelected: {
emitSendToScript({'method' : 'selectWearable', 'entityID' : id}); emitSendToScript({'method' : 'selectWearable', 'entityID' : id});

View file

@ -16,7 +16,7 @@ Rectangle {
signal wearableDeleted(string avatarName, var id); signal wearableDeleted(string avatarName, var id);
signal adjustWearablesOpened(); signal adjustWearablesOpened();
signal adjustWearablesClosed(); signal adjustWearablesClosed(bool status);
property bool modified: false; property bool modified: false;
Component.onCompleted: { Component.onCompleted: {
@ -27,20 +27,10 @@ Rectangle {
console.debug('modified: ', modified) console.debug('modified: ', modified)
} }
property var onButton2Clicked;
property var onButton1Clicked;
property var jointNames; property var jointNames;
property var wearables: ({})
property string avatarName: '' property string avatarName: ''
property var wearablesModel; 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) { function open(avatar) {
adjustWearablesOpened(); adjustWearablesOpened();
console.debug('AdjustWearables.qml: open: ', JSON.stringify(avatar, null, '\t')); console.debug('AdjustWearables.qml: open: ', JSON.stringify(avatar, null, '\t'));
@ -48,13 +38,15 @@ Rectangle {
visible = true; visible = true;
avatarName = avatar.name; avatarName = avatar.name;
wearablesModel = avatar.wearables; wearablesModel = avatar.wearables;
wearables = {};
refresh(avatar); refresh(avatar);
backupWearables(avatar);
} }
function refresh(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(); wearablesCombobox.model.clear();
console.debug('AdjustWearables.qml: open: avatar.wearables.count: ', avatar.wearables.count); console.debug('AdjustWearables.qml: open: avatar.wearables.count: ', avatar.wearables.count);
for(var i = 0; i < avatar.wearables.count; ++i) { for(var i = 0; i < avatar.wearables.count; ++i) {
@ -109,9 +101,9 @@ Rectangle {
} }
} }
function close() { function close(status) {
visible = false; visible = false;
adjustWearablesClosed(); adjustWearablesClosed(status);
} }
HifiConstants { id: hifi } HifiConstants { id: hifi }
@ -324,19 +316,11 @@ Rectangle {
noText: "CANCEL" noText: "CANCEL"
onYesClicked: function() { onYesClicked: function() {
if(onButton2Clicked) { root.close(true);
onButton2Clicked();
} else {
root.close();
}
} }
onNoClicked: function() { onNoClicked: function() {
if(onButton1Clicked) { root.close(false);
onButton1Clicked();
} else {
root.close();
}
} }
} }
} }

View file

@ -136,6 +136,14 @@ void AvatarBookmarks::removeBookmark(const QString& bookmarkName) {
} }
} }
void AvatarBookmarks::updateAvatarEntities(const QVariantList &avatarEntities)
{
auto myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
myAvatar->removeAvatarEntities();
addAvatarEntities(avatarEntities);
}
void AvatarBookmarks::loadBookmark(const QString& bookmarkName) { void AvatarBookmarks::loadBookmark(const QString& bookmarkName) {
if (QThread::currentThread() != thread()) { if (QThread::currentThread() != thread()) {
BLOCKING_INVOKE_METHOD(this, "loadBookmark", Q_ARG(QString, bookmarkName)); BLOCKING_INVOKE_METHOD(this, "loadBookmark", Q_ARG(QString, bookmarkName));

View file

@ -43,6 +43,7 @@ public slots:
void saveBookmark(const QString& bookmarkName); void saveBookmark(const QString& bookmarkName);
void loadBookmark(const QString& bookmarkName); void loadBookmark(const QString& bookmarkName);
void removeBookmark(const QString& bookmarkName); void removeBookmark(const QString& bookmarkName);
void updateAvatarEntities(const QVariantList& avatarEntities);
QVariantMap getBookmarks() { return _bookmarks; } QVariantMap getBookmarks() { return _bookmarks; }
signals: signals:

View file

@ -96,6 +96,7 @@ var adjustWearables = {
} }
} }
var currentAvatarWearablesBackup = null;
var currentAvatar = getMyAvatar(); var currentAvatar = getMyAvatar();
var selectedAvatarEntityGrabbable = false; var selectedAvatarEntityGrabbable = false;
var selectedAvatarEntity = null; var selectedAvatarEntity = null;
@ -128,10 +129,20 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See
AvatarBookmarks.loadBookmark(message.name); AvatarBookmarks.loadBookmark(message.name);
break; break;
case 'adjustWearablesOpened': case 'adjustWearablesOpened':
currentAvatarWearablesBackup = getMyAvatarWearables();
adjustWearables.setOpened(true); adjustWearables.setOpened(true);
Entities.mousePressOnEntity.connect(onSelectedEntity); Entities.mousePressOnEntity.connect(onSelectedEntity);
break; break;
case 'adjustWearablesClosed': 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); adjustWearables.setOpened(false);
ensureWearableSelected(null); ensureWearableSelected(null);
Entities.mousePressOnEntity.disconnect(onSelectedEntity); Entities.mousePressOnEntity.disconnect(onSelectedEntity);