diff --git a/interface/resources/qml/hifi/AvatarApp.qml b/interface/resources/qml/hifi/AvatarApp.qml index 1a9025f02c..e6d911789a 100644 --- a/interface/resources/qml/hifi/AvatarApp.qml +++ b/interface/resources/qml/hifi/AvatarApp.qml @@ -107,51 +107,19 @@ Rectangle { } else if(message.method === getAvatarsMethod) { var getAvatarsReply = message.reply; allAvatars.populate(getAvatarsReply.bookmarks); + setCurrentAvatar(getAvatarsReply.currentAvatar); - var currentAvatar = getAvatarsReply.currentAvatar; console.debug('currentAvatar: ', JSON.stringify(currentAvatar, null, '\t')); - var selectedAvatarIndex = -1; + var bookmarkAvatarIndex = allAvatars.findAvatarIndexByValue(currentAvatar); - // 2DO: find better way of determining selected avatar in bookmarks - console.debug('allAvatars.count: ', allAvatars.count); - for(var i = 0; i < allAvatars.count; ++i) { - var thesame = true; - for(var prop in currentAvatar) { - // console.debug('prop', prop); - - var v1 = currentAvatar[prop]; - var v2 = allAvatars.get(i).entry[prop]; - console.debug('v1', v1, 'v2', v2); - - var s1 = JSON.stringify(v1); - var s2 = JSON.stringify(v2); - - // console.debug('comparing\n', s1, 'to\n', s2, '...'); - if(s1 !== s2) { - if(!(Array.isArray(v1) && v1.length === 0 && v2 === undefined)) { - thesame = false; - break; - } - } - // console.debug('values seems to be the same...'); - } - if(thesame) { - selectedAvatarIndex = i; - break; - } - } - - console.debug('selectedAvatarIndex = -1, avatar is not favorite') - - setCurrentAvatar(currentAvatar); - - if(selectedAvatarIndex === -1) { + if(bookmarkAvatarIndex === -1) { + console.debug('bookmarkAvatarIndex = -1, avatar is not favorite') selectedAvatar = root.currentAvatar; view.setPage(0); console.debug('selectedAvatar = ', JSON.stringify(selectedAvatar, null, '\t')) } else { - view.selectAvatar(allAvatars.get(selectedAvatarIndex)); + view.selectAvatar(allAvatars.get(bookmarkAvatarIndex)); } } else if(message.method === 'selectAvatarEntity') { adjustWearables.selectWearableByID(message.entityID); @@ -537,7 +505,7 @@ Rectangle { id: view anchors.fill: parent interactive: false; - currentIndex: (selectedAvatarId !== '' && !pageOfAvatars.isUpdating) ? pageOfAvatars.findAvatar(selectedAvatarId) : -1 + currentIndex: (selectedAvatarId !== '' && !pageOfAvatars.isUpdating) ? pageOfAvatars.findAvatarIndex(selectedAvatarId) : -1 property int horizontalSpacing: 18 property int verticalSpacing: 44 @@ -840,10 +808,9 @@ Rectangle { gotoAvatarAppPanel.visible = false; var i = allAvatars.count + 1; - var url = allAvatars.urls[i++ % allAvatars.urls.length] var avatar = { - 'url': Qt.resolvedUrl(url), + 'url': '', 'name': 'Lexi' + (++newAvatarIndex), 'wearables': [] }; diff --git a/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml b/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml index 681ba7b58f..9e35699ca7 100644 --- a/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml +++ b/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml @@ -32,6 +32,78 @@ ListModel { } } + function arraysAreEqual(a1, a2, comparer) { + if(Array.isArray(a1) && Array.isArray(a2)) { + if(a1.length !== a2.length) { + return false; + } + + for(var i = 0; i < a1.length; ++i) { + if(!comparer(a1[i], a2[i])) { + return false; + } + } + } else if(Array.isArray(a1)) { + return a1.length === 0; + } else if(Array.isArray(a2)) { + return a2.length === 0; + } + + return true; + } + + function compareArrays(a1, a2, props) { + for(var prop in props) { + if(JSON.stringify(a1[prop]) !== JSON.stringify(a2[prop])) { + return false; + } + } + + return true; + } + + function compareWearables(w1, w2) { + return compareArrays(w1, w2, ['modelUrl', 'parentJointIndex', 'marketplaceID', 'itemName', 'script', 'rotation']) + } + + function compareAttachments(a1, a2) { + return compareAttachments(a1, a2, ['position', 'orientation', 'parentJointIndex', 'modelurl']) + } + + function findAvatarIndexByValue(avatar) { + + var index = -1; + var avatarObject = avatar.entry; + + // 2DO: find better way of determining selected avatar in bookmarks + console.debug('allAvatars.count: ', allAvatars.count); + for(var i = 0; i < allAvatars.count; ++i) { + var thesame = true; + var bookmarkedAvatarObject = allAvatars.get(i).entry; + + if(bookmarkedAvatarObject.avatarUrl !== avatarObject.avatarUrl) + continue; + + if(bookmarkedAvatarObject.avatarScale !== avatarObject.avatarScale) + continue; + + if(!arraysAreEqual(bookmarkedAvatarObject.attachments, avatarObject.attachments, compareAttachments)) { + continue; + } + + if(!arraysAreEqual(bookmarkedAvatarObject.avatarEntities, avatarObject.avatarEntities, compareWearables)) { + continue; + } + + if(thesame) { + index = i; + break; + } + } + + return index; + } + function findAvatarIndex(avatarName) { for(var i = 0; i < count; ++i) { if(get(i).name === avatarName) {