integrate deleting favorite avatars with backend

This commit is contained in:
Alexander Ivash 2018-05-11 02:07:51 +03:00
parent 6ff397e9e0
commit 512e72d6d1
5 changed files with 66 additions and 63 deletions

View file

@ -79,6 +79,31 @@ Rectangle {
var avatarIndex = allAvatars.findAvatarIndex(selectedAvatarId); var avatarIndex = allAvatars.findAvatarIndex(selectedAvatarId);
allAvatars.move(avatarIndex, 0, 1); allAvatars.move(avatarIndex, 0, 1);
view.setPage(0); 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) { } else if(message.method === getAvatarsMethod) {
var getAvatarsReply = message.reply; var getAvatarsReply = message.reply;
allAvatars.populate(getAvatarsReply.bookmarks); allAvatars.populate(getAvatarsReply.bookmarks);
@ -144,10 +169,6 @@ Rectangle {
console.debug('onSelectedAvatarChanged.selectedAvatar: ', JSON.stringify(selectedAvatar, null, '\t')); 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 avatarName: selectedAvatar ? selectedAvatar.name : ''
property string avatarUrl: selectedAvatar ? selectedAvatar.url : null property string avatarUrl: selectedAvatar ? selectedAvatar.url : null
property int avatarWearablesCount: selectedAvatar ? selectedAvatar.wearables.count : 0 property int avatarWearablesCount: selectedAvatar ? selectedAvatar.wearables.count : 0
@ -525,28 +546,12 @@ Rectangle {
emitSendToScript({'method' : 'selectAvatar', 'name' : avatar.name}) emitSendToScript({'method' : 'selectAvatar', 'name' : avatar.name})
} }
function deleteAvatar(avatar) {
emitSendToScript({'method' : 'deleteAvatar', 'name' : avatar.name})
}
AvatarsModel { AvatarsModel {
id: allAvatars 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 property int itemsPerPage: 8
@ -593,25 +598,12 @@ Rectangle {
pageOfAvatars.isUpdating = false; pageOfAvatars.isUpdating = false;
} }
model: ListModel { model: AvatarsModel {
id: pageOfAvatars id: pageOfAvatars
property bool isUpdating: false; property bool isUpdating: false;
property var getMoreAvatarsEntry: {'url' : '', 'name' : '', 'getMoreAvatars' : true} 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() { function appendGetAvatars() {
append(getMoreAvatarsEntry); append(getMoreAvatarsEntry);
} }
@ -682,31 +674,7 @@ Rectangle {
if(isInManageState) { if(isInManageState) {
var currentItem = delegateRoot.GridView.view.model.get(index); var currentItem = delegateRoot.GridView.view.model.get(index);
popup.showDeleteFavorite(currentItem.name, function() { popup.showDeleteFavorite(currentItem.name, function() {
pageOfAvatars.isUpdating = true; view.deleteAvatar(currentItem);
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;
}); });
} else { } else {
if(delegateRoot.GridView.view.currentIndex !== index) { if(delegateRoot.GridView.view.currentIndex !== index) {

View file

@ -31,4 +31,25 @@ ListModel {
append(avatarEntry); 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);
}
} }

View file

@ -134,6 +134,8 @@ void AvatarBookmarks::removeBookmark(const QString& bookmarkName) {
if (_bookmarksMenu->actions().count() == 0) { if (_bookmarksMenu->actions().count() == 0) {
enableMenuItems(false); enableMenuItems(false);
} }
emit bookmarkDeleted(bookmarkName);
} }
void AvatarBookmarks::updateAvatarEntities(const QVariantList &avatarEntities) void AvatarBookmarks::updateAvatarEntities(const QVariantList &avatarEntities)

View file

@ -48,6 +48,7 @@ public slots:
signals: signals:
void bookmarkLoaded(const QString& bookmarkName); void bookmarkLoaded(const QString& bookmarkName);
void bookmarkDeleted(const QString& bookmarkName);
protected: protected:
void addBookmarkToMenu(Menu* menubar, const QString& name, const QVariant& bookmark) override; void addBookmarkToMenu(Menu* menubar, const QString& name, const QVariant& bookmark) override;

View file

@ -128,6 +128,10 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See
console.debug('avatarapp.js: selecting avatar: ', message.name); console.debug('avatarapp.js: selecting avatar: ', message.name);
AvatarBookmarks.loadBookmark(message.name); AvatarBookmarks.loadBookmark(message.name);
break; break;
case 'deleteAvatar':
console.debug('avatarapp.js: deleting avatar: ', message.name);
AvatarBookmarks.removeBookmark(message.name);
break;
case 'adjustWearablesOpened': case 'adjustWearablesOpened':
currentAvatarWearablesBackup = getMyAvatarWearables(); currentAvatarWearablesBackup = getMyAvatarWearables();
adjustWearables.setOpened(true); adjustWearables.setOpened(true);
@ -254,6 +258,11 @@ function onBookmarkLoaded(bookmarkName) {
sendToQml({'method' : 'bookmarkLoaded', 'reply' : {'name' : bookmarkName, 'currentAvatar' : currentAvatar} }); 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. // Manage the connection between the button and the window.
// //
@ -272,6 +281,7 @@ function startup() {
button.clicked.connect(onTabletButtonClicked); button.clicked.connect(onTabletButtonClicked);
tablet.screenChanged.connect(onTabletScreenChanged); tablet.screenChanged.connect(onTabletScreenChanged);
AvatarBookmarks.bookmarkLoaded.connect(onBookmarkLoaded); AvatarBookmarks.bookmarkLoaded.connect(onBookmarkLoaded);
AvatarBookmarks.bookmarkDeleted.connect(onBookmarkDeleted);
// Window.domainChanged.connect(clearLocalQMLDataAndClosePAL); // Window.domainChanged.connect(clearLocalQMLDataAndClosePAL);
// Window.domainConnectionRefused.connect(clearLocalQMLDataAndClosePAL); // Window.domainConnectionRefused.connect(clearLocalQMLDataAndClosePAL);
@ -373,6 +383,7 @@ function shutdown() {
tablet.removeButton(button); tablet.removeButton(button);
tablet.screenChanged.disconnect(onTabletScreenChanged); tablet.screenChanged.disconnect(onTabletScreenChanged);
AvatarBookmarks.bookmarkLoaded.disconnect(onBookmarkLoaded); AvatarBookmarks.bookmarkLoaded.disconnect(onBookmarkLoaded);
AvatarBookmarks.bookmarkDeleted.disconnect(onBookmarkDeleted);
// Window.domainChanged.disconnect(clearLocalQMLDataAndClosePAL); // Window.domainChanged.disconnect(clearLocalQMLDataAndClosePAL);
// Window.domainConnectionRefused.disconnect(clearLocalQMLDataAndClosePAL); // Window.domainConnectionRefused.disconnect(clearLocalQMLDataAndClosePAL);