simplify code a bit

explicite store attachments in model
use models for comparison instead JS Objects
This commit is contained in:
Alexander Ivash 2018-05-11 10:53:05 +03:00
parent 47ffcf8c42
commit fe8bb3c8ea
3 changed files with 82 additions and 42 deletions

View file

@ -31,12 +31,20 @@ Rectangle {
property var jointNames; property var jointNames;
property string avatarName: currentAvatar ? currentAvatar.name : ''
property string avatarUrl: currentAvatar ? currentAvatar.url : null
property bool isAvatarInFavorites: currentAvatar ? allAvatars.findAvatar(currentAvatar.name) !== undefined : false
property int avatarWearablesCount: currentAvatar ? currentAvatar.wearables.count : 0
property var currentAvatar: null; property var currentAvatar: null;
function setCurrentAvatar(avatar) { function setCurrentAvatar(avatar) {
var avatarThumbnailUrl = allAvatars.makeThumbnailUrl(avatar.avatarUrl);
var currentAvatarObject = { var currentAvatarObject = {
'name' : '', 'name' : '',
'url' : allAvatars.makeThumbnailUrl(avatar.avatarUrl), 'scale' : avatar.avatarScale,
'url' : avatarThumbnailUrl,
'wearables' : avatar.avatarEntites ? avatar.avatarEntites : [], 'wearables' : avatar.avatarEntites ? avatar.avatarEntites : [],
'attachments' : avatar.attachments ? avatar.attachments : [],
'entry' : avatar, 'entry' : avatar,
'getMoreAvatars' : false 'getMoreAvatars' : false
}; };
@ -72,11 +80,11 @@ Rectangle {
console.debug('wearable: ', wearablesModel.get(i).properties.id); console.debug('wearable: ', wearablesModel.get(i).properties.id);
} }
adjustWearables.refresh(root.currentAvatar); adjustWearables.refresh(currentAvatar);
} else if(message.method === 'bookmarkLoaded') { } else if(message.method === 'bookmarkLoaded') {
setCurrentAvatar(message.reply.currentAvatar); setCurrentAvatar(message.reply.currentAvatar);
selectedAvatarId = message.reply.name; selectedAvatarName = message.reply.name;
var avatarIndex = allAvatars.findAvatarIndex(selectedAvatarId); var avatarIndex = allAvatars.findAvatarIndex(selectedAvatarName);
allAvatars.move(avatarIndex, 0, 1); allAvatars.move(avatarIndex, 0, 1);
view.setPage(0); view.setPage(0);
} else if(message.method === 'bookmarkDeleted') { } else if(message.method === 'bookmarkDeleted') {
@ -110,38 +118,33 @@ Rectangle {
setCurrentAvatar(getAvatarsReply.currentAvatar); setCurrentAvatar(getAvatarsReply.currentAvatar);
console.debug('currentAvatar: ', JSON.stringify(currentAvatar, null, '\t')); console.debug('currentAvatar: ', JSON.stringify(currentAvatar, null, '\t'));
var bookmarkAvatarIndex = allAvatars.findAvatarIndexByValue(currentAvatar); updateCurrentAvatarInBookmarks(currentAvatar);
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(bookmarkAvatarIndex));
}
} else if(message.method === 'selectAvatarEntity') { } else if(message.method === 'selectAvatarEntity') {
adjustWearables.selectWearableByID(message.entityID); adjustWearables.selectWearableByID(message.entityID);
} }
} }
property string selectedAvatarId: '' function updateCurrentAvatarInBookmarks(avatar) {
onSelectedAvatarIdChanged: { var bookmarkAvatarIndex = allAvatars.findAvatarIndexByValue(avatar);
console.debug('selectedAvatarId: ', selectedAvatarId)
selectedAvatar = allAvatars.findAvatar(selectedAvatarId); if(bookmarkAvatarIndex === -1) {
console.debug('bookmarkAvatarIndex = -1, avatar is not favorite')
avatar.name = '';
selectedAvatarName = '';
view.setPage(0);
} else {
console.debug('bookmarkAvatarIndex = ', bookmarkAvatarIndex, 'avatar is among favorites!')
var bookmarkAvatar = allAvatars.get(bookmarkAvatarIndex);
avatar.name = bookmarkAvatar.name;
view.selectAvatar(bookmarkAvatar);
}
} }
property var selectedAvatar; property string selectedAvatarName: ''
onSelectedAvatarChanged: { onSelectedAvatarNameChanged: {
console.debug('onSelectedAvatarChanged.selectedAvatar: ', JSON.stringify(selectedAvatar, null, '\t')); console.debug('selectedAvatarId: ', selectedAvatarName)
} }
property string avatarName: selectedAvatar ? selectedAvatar.name : ''
property string avatarUrl: selectedAvatar ? selectedAvatar.url : null
property int avatarWearablesCount: selectedAvatar ? selectedAvatar.wearables.count : 0
property bool isAvatarInFavorites: selectedAvatar ? allAvatars.findAvatar(selectedAvatar.name) !== undefined : false
property bool isInManageState: false property bool isInManageState: false
Component.onCompleted: { Component.onCompleted: {
@ -214,6 +217,9 @@ Rectangle {
} }
onAdjustWearablesClosed: { onAdjustWearablesClosed: {
emitSendToScript({'method' : 'adjustWearablesClosed', 'save' : status, 'avatarName' : avatarName}); emitSendToScript({'method' : 'adjustWearablesClosed', 'save' : status, 'avatarName' : avatarName});
if(status) {
updateCurrentAvatarInBookmarks(currentAvatar);
}
} }
onWearableSelected: { onWearableSelected: {
emitSendToScript({'method' : 'selectWearable', 'entityID' : id}); emitSendToScript({'method' : 'selectWearable', 'entityID' : id});
@ -340,16 +346,28 @@ Rectangle {
enabled: !isAvatarInFavorites enabled: !isAvatarInFavorites
anchors.fill: star anchors.fill: star
onClicked: { onClicked: {
console.debug('selectedAvatar.url', selectedAvatar.url)
createFavorite.onSaveClicked = function() { createFavorite.onSaveClicked = function() {
var newAvatar = JSON.parse(JSON.stringify(selectedAvatar)); var entry = currentAvatar.entry;
console.debug('was: ', JSON.stringify(entry, 0, 4));
var wearables = [];
for(var i = 0; i < currentAvatar.wearables.count; ++i) {
wearables.push(currentAvatar.wearables.get(i));
}
entry.avatarEntites = wearables;
console.debug('became: ', JSON.stringify(entry, 0, 4));
/*
var newAvatar = JSON.parse(JSON.stringify(currentAvatar));
newAvatar.name = createFavorite.favoriteNameText; newAvatar.name = createFavorite.favoriteNameText;
allAvatars.append(newAvatar); allAvatars.append(newAvatar);
view.selectAvatar(newAvatar); view.selectAvatar(newAvatar);
*/
createFavorite.close(); createFavorite.close();
} }
createFavorite.open(selectedAvatar); createFavorite.open(root.currentAvatar);
} }
} }
@ -505,7 +523,7 @@ Rectangle {
id: view id: view
anchors.fill: parent anchors.fill: parent
interactive: false; interactive: false;
currentIndex: (selectedAvatarId !== '' && !pageOfAvatars.isUpdating) ? pageOfAvatars.findAvatarIndex(selectedAvatarId) : -1 currentIndex: (selectedAvatarName !== '' && !pageOfAvatars.isUpdating) ? pageOfAvatars.findAvatarIndex(selectedAvatarName) : -1
property int horizontalSpacing: 18 property int horizontalSpacing: 18
property int verticalSpacing: 44 property int verticalSpacing: 44
@ -532,7 +550,7 @@ Rectangle {
onCurrentPageChanged: { onCurrentPageChanged: {
console.debug('currentPage: ', currentPage) console.debug('currentPage: ', currentPage)
currentIndex = Qt.binding(function() { currentIndex = Qt.binding(function() {
return (selectedAvatarId !== '' && !pageOfAvatars.isUpdating) ? pageOfAvatars.findAvatar(selectedAvatarId) : -1 return (selectedAvatarName !== '' && !pageOfAvatars.isUpdating) ? pageOfAvatars.findAvatar(selectedAvatarName) : -1
}) })
} }

View file

@ -18,13 +18,16 @@ ListModel {
function populate(bookmarks) { function populate(bookmarks) {
for(var avatarName in bookmarks) { for(var avatarName in bookmarks) {
var avatarThumbnailUrl = makeThumbnailUrl(bookmarks[avatarName].avatarUrl); var avatar = bookmarks[avatarName];
var avatarThumbnailUrl = makeThumbnailUrl(avatar.avatarUrl);
var avatarEntry = { var avatarEntry = {
'name' : avatarName, 'name' : avatarName,
'scale' : avatar.avatarScale,
'url' : avatarThumbnailUrl, 'url' : avatarThumbnailUrl,
'wearables' : bookmarks[avatarName].avatarEntites ? bookmarks[avatarName].avatarEntites : [], 'wearables' : avatar.avatarEntites ? avatar.avatarEntites : [],
'entry' : bookmarks[avatarName], 'attachments' : avatar.attachments ? avatar.attachments : [],
'entry' : avatar,
'getMoreAvatars' : false 'getMoreAvatars' : false
}; };
@ -52,6 +55,25 @@ ListModel {
return true; return true;
} }
function modelsAreEqual(m1, m2, comparer) {
if(m1.count !== m2.count) {
return false;
}
for(var i = 0; i < m1.count; ++i) {
var e1 = m1.get(i);
var e2 = m2.get(i);
console.debug('comparing ', JSON.stringify(e1), JSON.stringify(e2));
if(!comparer(e1, e2)) {
return false;
}
}
return true;
}
function compareArrays(a1, a2, props) { function compareArrays(a1, a2, props) {
for(var prop in props) { for(var prop in props) {
if(JSON.stringify(a1[prop]) !== JSON.stringify(a2[prop])) { if(JSON.stringify(a1[prop]) !== JSON.stringify(a2[prop])) {
@ -73,25 +95,25 @@ ListModel {
function findAvatarIndexByValue(avatar) { function findAvatarIndexByValue(avatar) {
var index = -1; var index = -1;
var avatarObject = avatar.entry; console.debug('findAvatarIndexByValue: ', JSON.stringify(avatar));
// 2DO: find better way of determining selected avatar in bookmarks // 2DO: find better way of determining selected avatar in bookmarks
console.debug('allAvatars.count: ', allAvatars.count); console.debug('allAvatars.count: ', allAvatars.count);
for(var i = 0; i < allAvatars.count; ++i) { for(var i = 0; i < allAvatars.count; ++i) {
var thesame = true; var thesame = true;
var bookmarkedAvatarObject = allAvatars.get(i).entry; var bookmarkedAvatar = allAvatars.get(i);
if(bookmarkedAvatarObject.avatarUrl !== avatarObject.avatarUrl) if(bookmarkedAvatar.avatarUrl !== avatar.avatarUrl)
continue; continue;
if(bookmarkedAvatarObject.avatarScale !== avatarObject.avatarScale) if(bookmarkedAvatar.avatarScale !== avatar.avatarScale)
continue; continue;
if(!arraysAreEqual(bookmarkedAvatarObject.attachments, avatarObject.attachments, compareAttachments)) { if(!modelsAreEqual(bookmarkedAvatar.attachments, avatar.attachments, compareAttachments)) {
continue; continue;
} }
if(!arraysAreEqual(bookmarkedAvatarObject.avatarEntities, avatarObject.avatarEntities, compareWearables)) { if(!modelsAreEqual(bookmarkedAvatar.wearables, avatar.wearables, compareWearables)) {
continue; continue;
} }

View file

@ -27,7 +27,7 @@ Rectangle {
function open(avatar) { function open(avatar) {
favoriteName.text = ''; favoriteName.text = '';
avatarImageUrl = avatar.url; avatarImageUrl = avatar.url;
wearablesCount = avatar.wearables !== '' ? avatar.wearables.split('|').length : 0; wearablesCount = avatar.wearables.count;
visible = true; visible = true;
} }