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 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;
function setCurrentAvatar(avatar) {
var avatarThumbnailUrl = allAvatars.makeThumbnailUrl(avatar.avatarUrl);
var currentAvatarObject = {
'name' : '',
'url' : allAvatars.makeThumbnailUrl(avatar.avatarUrl),
'scale' : avatar.avatarScale,
'url' : avatarThumbnailUrl,
'wearables' : avatar.avatarEntites ? avatar.avatarEntites : [],
'attachments' : avatar.attachments ? avatar.attachments : [],
'entry' : avatar,
'getMoreAvatars' : false
};
@ -72,11 +80,11 @@ Rectangle {
console.debug('wearable: ', wearablesModel.get(i).properties.id);
}
adjustWearables.refresh(root.currentAvatar);
adjustWearables.refresh(currentAvatar);
} else if(message.method === 'bookmarkLoaded') {
setCurrentAvatar(message.reply.currentAvatar);
selectedAvatarId = message.reply.name;
var avatarIndex = allAvatars.findAvatarIndex(selectedAvatarId);
selectedAvatarName = message.reply.name;
var avatarIndex = allAvatars.findAvatarIndex(selectedAvatarName);
allAvatars.move(avatarIndex, 0, 1);
view.setPage(0);
} else if(message.method === 'bookmarkDeleted') {
@ -110,38 +118,33 @@ Rectangle {
setCurrentAvatar(getAvatarsReply.currentAvatar);
console.debug('currentAvatar: ', JSON.stringify(currentAvatar, null, '\t'));
var bookmarkAvatarIndex = allAvatars.findAvatarIndexByValue(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));
}
updateCurrentAvatarInBookmarks(currentAvatar);
} else if(message.method === 'selectAvatarEntity') {
adjustWearables.selectWearableByID(message.entityID);
}
}
property string selectedAvatarId: ''
onSelectedAvatarIdChanged: {
console.debug('selectedAvatarId: ', selectedAvatarId)
selectedAvatar = allAvatars.findAvatar(selectedAvatarId);
function updateCurrentAvatarInBookmarks(avatar) {
var bookmarkAvatarIndex = allAvatars.findAvatarIndexByValue(avatar);
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;
onSelectedAvatarChanged: {
console.debug('onSelectedAvatarChanged.selectedAvatar: ', JSON.stringify(selectedAvatar, null, '\t'));
property string selectedAvatarName: ''
onSelectedAvatarNameChanged: {
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
Component.onCompleted: {
@ -214,6 +217,9 @@ Rectangle {
}
onAdjustWearablesClosed: {
emitSendToScript({'method' : 'adjustWearablesClosed', 'save' : status, 'avatarName' : avatarName});
if(status) {
updateCurrentAvatarInBookmarks(currentAvatar);
}
}
onWearableSelected: {
emitSendToScript({'method' : 'selectWearable', 'entityID' : id});
@ -340,16 +346,28 @@ Rectangle {
enabled: !isAvatarInFavorites
anchors.fill: star
onClicked: {
console.debug('selectedAvatar.url', selectedAvatar.url)
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;
allAvatars.append(newAvatar);
view.selectAvatar(newAvatar);
*/
createFavorite.close();
}
createFavorite.open(selectedAvatar);
createFavorite.open(root.currentAvatar);
}
}
@ -505,7 +523,7 @@ Rectangle {
id: view
anchors.fill: parent
interactive: false;
currentIndex: (selectedAvatarId !== '' && !pageOfAvatars.isUpdating) ? pageOfAvatars.findAvatarIndex(selectedAvatarId) : -1
currentIndex: (selectedAvatarName !== '' && !pageOfAvatars.isUpdating) ? pageOfAvatars.findAvatarIndex(selectedAvatarName) : -1
property int horizontalSpacing: 18
property int verticalSpacing: 44
@ -532,7 +550,7 @@ Rectangle {
onCurrentPageChanged: {
console.debug('currentPage: ', currentPage)
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) {
for(var avatarName in bookmarks) {
var avatarThumbnailUrl = makeThumbnailUrl(bookmarks[avatarName].avatarUrl);
var avatar = bookmarks[avatarName];
var avatarThumbnailUrl = makeThumbnailUrl(avatar.avatarUrl);
var avatarEntry = {
'name' : avatarName,
'scale' : avatar.avatarScale,
'url' : avatarThumbnailUrl,
'wearables' : bookmarks[avatarName].avatarEntites ? bookmarks[avatarName].avatarEntites : [],
'entry' : bookmarks[avatarName],
'wearables' : avatar.avatarEntites ? avatar.avatarEntites : [],
'attachments' : avatar.attachments ? avatar.attachments : [],
'entry' : avatar,
'getMoreAvatars' : false
};
@ -52,6 +55,25 @@ ListModel {
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) {
for(var prop in props) {
if(JSON.stringify(a1[prop]) !== JSON.stringify(a2[prop])) {
@ -73,25 +95,25 @@ ListModel {
function findAvatarIndexByValue(avatar) {
var index = -1;
var avatarObject = avatar.entry;
console.debug('findAvatarIndexByValue: ', JSON.stringify(avatar));
// 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;
var bookmarkedAvatar = allAvatars.get(i);
if(bookmarkedAvatarObject.avatarUrl !== avatarObject.avatarUrl)
if(bookmarkedAvatar.avatarUrl !== avatar.avatarUrl)
continue;
if(bookmarkedAvatarObject.avatarScale !== avatarObject.avatarScale)
if(bookmarkedAvatar.avatarScale !== avatar.avatarScale)
continue;
if(!arraysAreEqual(bookmarkedAvatarObject.attachments, avatarObject.attachments, compareAttachments)) {
if(!modelsAreEqual(bookmarkedAvatar.attachments, avatar.attachments, compareAttachments)) {
continue;
}
if(!arraysAreEqual(bookmarkedAvatarObject.avatarEntities, avatarObject.avatarEntities, compareWearables)) {
if(!modelsAreEqual(bookmarkedAvatar.wearables, avatar.wearables, compareWearables)) {
continue;
}

View file

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