From 91e1714b0e4d4dbdb2636623197014a6739335c4 Mon Sep 17 00:00:00 2001 From: Alexander Ivash Date: Thu, 17 May 2018 00:57:07 +0300 Subject: [PATCH] external avatars support --- interface/resources/qml/hifi/AvatarApp.qml | 17 ++++++++--- .../qml/hifi/avatarapp/AvatarsModel.qml | 28 ++++++++++++++++++- .../qml/hifi/avatarapp/MessageBoxes.qml | 8 ++++++ scripts/system/avatarapp.js | 8 ++++++ 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/interface/resources/qml/hifi/AvatarApp.qml b/interface/resources/qml/hifi/AvatarApp.qml index 36393c75a1..973bae6b6c 100644 --- a/interface/resources/qml/hifi/AvatarApp.qml +++ b/interface/resources/qml/hifi/AvatarApp.qml @@ -46,6 +46,8 @@ Rectangle { console.debug('currentAvatar.wearables: ', currentAvatar.wearables); } + property url externalAvatarThumbnailUrl: '../../images/avatarapp/AvatarApp_Favorite_Elements_NoPicture.svg' + function fromScript(message) { console.debug('AvatarApp.qml: fromScript: ', JSON.stringify(message, null, '\t')) @@ -76,6 +78,11 @@ Rectangle { } else if(message.method === 'scaleChanged') { currentAvatar.avatarScale = message.value; updateCurrentAvatarInBookmarks(currentAvatar); + } else if(message.method === 'externalAvatarApplied') { + currentAvatar.isExternal = true; + currentAvatar.name = allAvatars.encodedName('', true); + currentAvatar.thumbnailUrl = externalAvatarThumbnailUrl.toString(); + updateCurrentAvatarInBookmarks(currentAvatar); } else if(message.method === 'settingChanged') { currentAvatarSettings[message.name] = message.value; } else if(message.method === 'changeSettings') { @@ -332,8 +339,7 @@ Rectangle { } entry.avatarEntites = wearables; - currentAvatar.name = createFavorite.favoriteNameText; - + currentAvatar.name = allAvatars.encodedName(createFavorite.favoriteNameText, currentAvatar.isExternal); console.debug('became: ', JSON.stringify(entry, 0, 4)); emitSendToScript({'method': 'addAvatar', 'name' : currentAvatar.name}); @@ -374,6 +380,8 @@ Rectangle { anchors.fill: parent onClicked: { popup.showSpecifyAvatarUrl(function() { + var url = popup.inputText.text; + emitSendToScript({'method' : 'applyExternalAvatar', 'avatarURL' : url}) }); } } @@ -509,15 +517,16 @@ Rectangle { property int verticalSpacing: 44 function selectAvatar(avatar) { - emitSendToScript({'method' : 'selectAvatar', 'name' : avatar.name}) + emitSendToScript({'method' : 'selectAvatar', 'name' : allAvatars.encodedName(avatar.name, avatar.isExternal)}) } function deleteAvatar(avatar) { - emitSendToScript({'method' : 'deleteAvatar', 'name' : avatar.name}) + emitSendToScript({'method' : 'deleteAvatar', 'name' : allAvatars.encodedName(avatar.name, avatar.isExternal)}) } AvatarsModel { id: allAvatars + externalAvatarThumbnailUrl: root.externalAvatarThumbnailUrl } property int itemsPerPage: 8 diff --git a/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml b/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml index 8555775c55..48cb0d26a7 100644 --- a/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml +++ b/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml @@ -2,6 +2,7 @@ import QtQuick 2.9 ListModel { id: model + property url externalAvatarThumbnailUrl; function makeThumbnailUrl(avatarUrl) { var splittedUrl = avatarUrl.split('/'); @@ -16,9 +17,33 @@ ListModel { return avatarThumbnailUrl; } + function encodedName(avatarName, isExternal) { + if(isExternal) { + if(avatarName.indexOf('external:') !== 0) { + return 'external:' + avatarName; + } + } + + return avatarName; + } + + function decodedName(avatarName, isExternal) { + if(isExternal) { + if(avatarName.indexOf('external:') === 0) { + avatarName = avatarName.replace('external:', ''); + } + } + + return avatarName; + } + function makeAvatarObject(avatar, avatarName) { console.debug('makeAvatarEntry: ', avatarName, JSON.stringify(avatar)); - var avatarThumbnailUrl = makeThumbnailUrl(avatar.avatarUrl); + var isExternal = avatarName.indexOf('external:') === 0; + avatarName = decodedName(avatarName, isExternal); + + var avatarThumbnailUrl = isExternal ? externalAvatarThumbnailUrl.toString() : makeThumbnailUrl(avatar.avatarUrl); + console.debug('isExternal:', isExternal, 'avatarThumbnailUrl:', avatarThumbnailUrl, 'externalAvatarThumbnailUrl:', externalAvatarThumbnailUrl); return { 'name' : avatarName, @@ -27,6 +52,7 @@ ListModel { 'wearables' : avatar.avatarEntites ? avatar.avatarEntites : [], 'attachments' : avatar.attachments ? avatar.attachments : [], 'entry' : avatar, + 'isExternal' : isExternal, 'getMoreAvatars' : false }; diff --git a/interface/resources/qml/hifi/avatarapp/MessageBoxes.qml b/interface/resources/qml/hifi/avatarapp/MessageBoxes.qml index 3cda5cbfb8..8cf73b7ed3 100644 --- a/interface/resources/qml/hifi/avatarapp/MessageBoxes.qml +++ b/interface/resources/qml/hifi/avatarapp/MessageBoxes.qml @@ -10,9 +10,17 @@ MessageBox { '(“.fst” extension) here. Learn to make a custom avatar by opening this link on your desktop.' popup.inputText.visible = true; popup.inputText.placeholderText = 'Enter Avatar Url'; + popup.inputText.forceActiveFocus(); popup.button1text = 'CANCEL'; popup.button2text = 'CONFIRM'; + popup.onButton2Clicked = function() { + if(callback) + callback(); + + popup.close(); + } + popup.open(); } diff --git a/scripts/system/avatarapp.js b/scripts/system/avatarapp.js index a1a9bf7029..7611fe782d 100644 --- a/scripts/system/avatarapp.js +++ b/scripts/system/avatarapp.js @@ -235,6 +235,14 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See UserActivityLogger.palAction("display_name_change", message.displayName); } break; + case 'applyExternalAvatar': + console.debug('avatarapp.js: applyExternalAvatar: ', message.avatarURL); + var currentAvatarURL = MyAvatar.getFullAvatarURLFromPreferences(); + if(currentAvatarURL !== message.avatarURL) { + MyAvatar.useFullAvatarURL(message.avatarURL); + sendToQml({'method' : 'externalAvatarApplied', 'avatarURL' : message.avatarURL}) + } + break; case 'navigate': console.debug('avatarapp.js: navigate: ', message.url); if(message.url.indexOf('app://') === 0) {