diff --git a/interface/resources/qml/hifi/AvatarApp.qml b/interface/resources/qml/hifi/AvatarApp.qml index a6edf4b1cb..1a9025f02c 100644 --- a/interface/resources/qml/hifi/AvatarApp.qml +++ b/interface/resources/qml/hifi/AvatarApp.qml @@ -79,6 +79,31 @@ Rectangle { var avatarIndex = allAvatars.findAvatarIndex(selectedAvatarId); allAvatars.move(avatarIndex, 0, 1); view.setPage(0); + } else if(message.method === 'bookmarkDeleted') { + pageOfAvatars.isUpdating = true; + + var index = pageOfAvatars.findAvatarIndex(message.name); + var absoluteIndex = view.currentPage * view.itemsPerPage + index + console.debug('removed ', absoluteIndex, 'view.currentPage', view.currentPage, + 'view.itemsPerPage: ', view.itemsPerPage, 'index', index, 'pageOfAvatars', pageOfAvatars, 'pageOfAvatars.count', pageOfAvatars) + + allAvatars.remove(absoluteIndex) + pageOfAvatars.remove(index); + + var itemsOnPage = pageOfAvatars.count; + var newItemIndex = view.currentPage * view.itemsPerPage + itemsOnPage; + + console.debug('newItemIndex: ', newItemIndex, 'allAvatars.count - 1: ', allAvatars.count - 1, 'pageOfAvatars.count:', pageOfAvatars.count); + + if(newItemIndex <= (allAvatars.count - 1)) { + pageOfAvatars.append(allAvatars.get(newItemIndex)); + } else { + if(!pageOfAvatars.hasGetAvatars()) + pageOfAvatars.appendGetAvatars(); + } + + console.debug('removed ', absoluteIndex, 'newItemIndex: ', newItemIndex, 'allAvatars.count:', allAvatars.count, 'pageOfAvatars.count:', pageOfAvatars.count) + pageOfAvatars.isUpdating = false; } else if(message.method === getAvatarsMethod) { var getAvatarsReply = message.reply; allAvatars.populate(getAvatarsReply.bookmarks); @@ -144,10 +169,6 @@ Rectangle { console.debug('onSelectedAvatarChanged.selectedAvatar: ', JSON.stringify(selectedAvatar, null, '\t')); } - function isEqualById(avatar, avatarId) { - return (avatar.name) === avatarId - } - property string avatarName: selectedAvatar ? selectedAvatar.name : '' property string avatarUrl: selectedAvatar ? selectedAvatar.url : null property int avatarWearablesCount: selectedAvatar ? selectedAvatar.wearables.count : 0 @@ -525,28 +546,12 @@ Rectangle { emitSendToScript({'method' : 'selectAvatar', 'name' : avatar.name}) } + function deleteAvatar(avatar) { + emitSendToScript({'method' : 'deleteAvatar', 'name' : avatar.name}) + } + AvatarsModel { id: allAvatars - - function findAvatarIndex(avatarId) { - for(var i = 0; i < count; ++i) { - if(isEqualById(get(i), avatarId)) { - console.debug('avatar found by index: ', i) - return i; - } - } - return -1; - } - - function findAvatar(avatarId) { - console.debug('AvatarsModel: find avatar by', avatarId); - - var avatarIndex = findAvatarIndex(avatarId); - if(avatarIndex === -1) - return undefined; - - return get(avatarIndex); - } } property int itemsPerPage: 8 @@ -593,25 +598,12 @@ Rectangle { pageOfAvatars.isUpdating = false; } - model: ListModel { + model: AvatarsModel { id: pageOfAvatars property bool isUpdating: false; property var getMoreAvatarsEntry: {'url' : '', 'name' : '', 'getMoreAvatars' : true} - function findAvatar(avatarId) { - console.debug('pageOfAvatars.findAvatar: ', avatarId); - - for(var i = 0; i < count; ++i) { - if(isEqualById(get(i), avatarId)) { - console.debug('avatar found by index: ', i) - return i; - } - } - - return -1; - } - function appendGetAvatars() { append(getMoreAvatarsEntry); } @@ -682,31 +674,7 @@ Rectangle { if(isInManageState) { var currentItem = delegateRoot.GridView.view.model.get(index); popup.showDeleteFavorite(currentItem.name, function() { - pageOfAvatars.isUpdating = true; - - console.debug('removing ', index) - - var absoluteIndex = view.currentPage * view.itemsPerPage + index - console.debug('removed ', absoluteIndex, 'view.currentPage', view.currentPage, - 'view.itemsPerPage: ', view.itemsPerPage, 'index', index, 'pageOfAvatars', pageOfAvatars, 'pageOfAvatars.count', pageOfAvatars) - - allAvatars.remove(absoluteIndex) - pageOfAvatars.remove(index); - - var itemsOnPage = pageOfAvatars.count; - var newItemIndex = view.currentPage * view.itemsPerPage + itemsOnPage; - - console.debug('newItemIndex: ', newItemIndex, 'allAvatars.count - 1: ', allAvatars.count - 1, 'pageOfAvatars.count:', pageOfAvatars.count); - - if(newItemIndex <= (allAvatars.count - 1)) { - pageOfAvatars.append(allAvatars.get(newItemIndex)); - } else { - if(!pageOfAvatars.hasGetAvatars()) - pageOfAvatars.appendGetAvatars(); - } - - console.debug('removed ', absoluteIndex, 'newItemIndex: ', newItemIndex, 'allAvatars.count:', allAvatars.count, 'pageOfAvatars.count:', pageOfAvatars.count) - pageOfAvatars.isUpdating = false; + view.deleteAvatar(currentItem); }); } else { if(delegateRoot.GridView.view.currentIndex !== index) { diff --git a/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml b/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml index 6a90b23c50..681ba7b58f 100644 --- a/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml +++ b/interface/resources/qml/hifi/avatarapp/AvatarsModel.qml @@ -31,4 +31,25 @@ ListModel { append(avatarEntry); } } + + function findAvatarIndex(avatarName) { + for(var i = 0; i < count; ++i) { + if(get(i).name === avatarName) { + console.debug('avatar found by index: ', i) + return i; + } + } + return -1; + } + + function findAvatar(avatarName) { + console.debug('AvatarsModel: find avatar by', avatarName); + + var avatarIndex = findAvatarIndex(avatarName); + if(avatarIndex === -1) + return undefined; + + return get(avatarIndex); + } + } diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index 73e416b354..25d7a472a4 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -134,6 +134,8 @@ void AvatarBookmarks::removeBookmark(const QString& bookmarkName) { if (_bookmarksMenu->actions().count() == 0) { enableMenuItems(false); } + + emit bookmarkDeleted(bookmarkName); } void AvatarBookmarks::updateAvatarEntities(const QVariantList &avatarEntities) diff --git a/interface/src/AvatarBookmarks.h b/interface/src/AvatarBookmarks.h index af6f942770..8a5a9ce318 100644 --- a/interface/src/AvatarBookmarks.h +++ b/interface/src/AvatarBookmarks.h @@ -48,6 +48,7 @@ public slots: signals: void bookmarkLoaded(const QString& bookmarkName); + void bookmarkDeleted(const QString& bookmarkName); protected: void addBookmarkToMenu(Menu* menubar, const QString& name, const QVariant& bookmark) override; diff --git a/scripts/system/avatarapp.js b/scripts/system/avatarapp.js index c4e4a06d29..c44aadde48 100644 --- a/scripts/system/avatarapp.js +++ b/scripts/system/avatarapp.js @@ -128,6 +128,10 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See console.debug('avatarapp.js: selecting avatar: ', message.name); AvatarBookmarks.loadBookmark(message.name); break; + case 'deleteAvatar': + console.debug('avatarapp.js: deleting avatar: ', message.name); + AvatarBookmarks.removeBookmark(message.name); + break; case 'adjustWearablesOpened': currentAvatarWearablesBackup = getMyAvatarWearables(); adjustWearables.setOpened(true); @@ -254,6 +258,11 @@ function onBookmarkLoaded(bookmarkName) { sendToQml({'method' : 'bookmarkLoaded', 'reply' : {'name' : bookmarkName, 'currentAvatar' : currentAvatar} }); } +function onBookmarkDeleted(bookmarkName) { + console.debug('avatarapp.js: onBookmarkDeleted: ', bookmarkName); + sendToQml({'method' : 'bookmarkDeleted', 'name' : bookmarkName}); +} + // // Manage the connection between the button and the window. // @@ -272,6 +281,7 @@ function startup() { button.clicked.connect(onTabletButtonClicked); tablet.screenChanged.connect(onTabletScreenChanged); AvatarBookmarks.bookmarkLoaded.connect(onBookmarkLoaded); + AvatarBookmarks.bookmarkDeleted.connect(onBookmarkDeleted); // Window.domainChanged.connect(clearLocalQMLDataAndClosePAL); // Window.domainConnectionRefused.connect(clearLocalQMLDataAndClosePAL); @@ -373,6 +383,7 @@ function shutdown() { tablet.removeButton(button); tablet.screenChanged.disconnect(onTabletScreenChanged); AvatarBookmarks.bookmarkLoaded.disconnect(onBookmarkLoaded); + AvatarBookmarks.bookmarkDeleted.disconnect(onBookmarkDeleted); // Window.domainChanged.disconnect(clearLocalQMLDataAndClosePAL); // Window.domainConnectionRefused.disconnect(clearLocalQMLDataAndClosePAL);