From 59d3ead781c0aa548d4bedd7343b4a204dfd0eb5 Mon Sep 17 00:00:00 2001 From: Natsumi Date: Fri, 11 Apr 2025 14:08:43 +1000 Subject: [PATCH] Avatar dialog view/set styles --- src/app.js | 2 +- src/classes/request/avatar.js | 15 ++ .../favorites/FavoritesAvatarTab.vue | 4 +- .../favorites/FavoritesWorldTab.vue | 4 +- src/localization/en/en.json | 11 ++ src/mixins/dialogs/currentUser.pug | 1 - .../dialogs/avatarDialog/AvatarDialog.vue | 55 +++++++- .../avatarDialog/SetAvatarStylesDialog.vue | 130 ++++++++++++++++++ .../avatarDialog/SetAvatarTagsDialog.vue | 10 +- 9 files changed, 220 insertions(+), 12 deletions(-) create mode 100644 src/views/dialogs/avatarDialog/SetAvatarStylesDialog.vue diff --git a/src/app.js b/src/app.js index e8bbccb4..da5508fa 100644 --- a/src/app.js +++ b/src/app.js @@ -2672,7 +2672,7 @@ console.log(`isLinux: ${LINUX}`); $app.data.vrcxId = ''; $app.methods.loadVrcxId = async function () { - vrcxId = await configRepository.getString( + this.vrcxId = await configRepository.getString( 'VRCX_id', crypto.randomUUID() ); diff --git a/src/classes/request/avatar.js b/src/classes/request/avatar.js index 3828ec89..172381ed 100644 --- a/src/classes/request/avatar.js +++ b/src/classes/request/avatar.js @@ -152,6 +152,21 @@ const avatarReq = { // window.API.$emit('AVATAR:IMPOSTER:DELETE', args); return args; }); + }, + + /** + * @returns {Promise<{json: any, params}>} + */ + getAvailableAvatarStyles() { + return window.API.call('avatarStyles', { + method: 'GET' + }).then((json) => { + const args = { + json + }; + // window.API.$emit('AVATAR:STYLES', args); + return args; + }); } }; // #endregion diff --git a/src/components/favorites/FavoritesAvatarTab.vue b/src/components/favorites/FavoritesAvatarTab.vue index 86aff743..8600d999 100644 --- a/src/components/favorites/FavoritesAvatarTab.vue +++ b/src/components/favorites/FavoritesAvatarTab.vue @@ -312,7 +312,7 @@ for (let j = 0; j < this.localAvatarFavorites[group].length; ++j) { ref = this.localAvatarFavorites[group][j]; if ( - typeof ref === 'undefined' || + !ref || typeof ref.id === 'undefined' || typeof ref.name === 'undefined' || typeof ref.authorName === 'undefined' @@ -330,7 +330,7 @@ for (let i = 0; i < this.favoriteAvatars.length; ++i) { ref = this.favoriteAvatars[i].ref; if ( - typeof ref === 'undefined' || + !ref || typeof ref.id === 'undefined' || typeof ref.name === 'undefined' || typeof ref.authorName === 'undefined' diff --git a/src/components/favorites/FavoritesWorldTab.vue b/src/components/favorites/FavoritesWorldTab.vue index 1acb3f55..1969defd 100644 --- a/src/components/favorites/FavoritesWorldTab.vue +++ b/src/components/favorites/FavoritesWorldTab.vue @@ -399,7 +399,7 @@ for (let j = 0; j < this.localWorldFavorites[group].length; ++j) { ref = this.localWorldFavorites[group][j]; if ( - typeof ref === 'undefined' || + !ref || typeof ref.id === 'undefined' || typeof ref.name === 'undefined' || typeof ref.authorName === 'undefined' @@ -417,7 +417,7 @@ for (let i = 0; i < this.favoriteWorlds.length; ++i) { ref = this.favoriteWorlds[i].ref; if ( - typeof ref === 'undefined' || + !ref || typeof ref.id === 'undefined' || typeof ref.name === 'undefined' || typeof ref.authorName === 'undefined' diff --git a/src/localization/en/en.json b/src/localization/en/en.json index 68adc343..af6e84f8 100644 --- a/src/localization/en/en.json +++ b/src/localization/en/en.json @@ -960,6 +960,7 @@ "rename": "Rename", "change_description": "Change Description", "change_content_tags": "Change Content Tags", + "change_styles": "Change Styles", "change_image": "Change Image", "download_package": "Download Unity Package", "delete": "Delete", @@ -1242,6 +1243,16 @@ "cancel": "Cancel", "save": "Save" }, + "set_avatar_styles": { + "header": "Set Avatar Styles", + "primary_style": "Primary Style", + "secondary_style": "Secondary Style", + "select_style": "Select Style", + "save_success": "Avatar styles changed successfully", + "save_failed": "Failed to change avatar styles", + "cancel": "Cancel", + "save": "Save" + }, "vrcx_updater": { "header": "VRCX Updater", "latest_version": "VRCX is up to date.", diff --git a/src/mixins/dialogs/currentUser.pug b/src/mixins/dialogs/currentUser.pug index fd74e582..efca49eb 100644 --- a/src/mixins/dialogs/currentUser.pug +++ b/src/mixins/dialogs/currentUser.pug @@ -83,7 +83,6 @@ mixin currentUser ref='bioDialog' :visible.sync='bioDialog.visible' :title='$t("dialog.bio.header")' - :close-on-click-modal='false' width='600px') div(v-loading='bioDialog.loading') el-input( diff --git a/src/views/dialogs/avatarDialog/AvatarDialog.vue b/src/views/dialogs/avatarDialog/AvatarDialog.vue index 9bad2ccf..193f0d0f 100644 --- a/src/views/dialogs/avatarDialog/AvatarDialog.vue +++ b/src/views/dialogs/avatarDialog/AvatarDialog.vue @@ -125,6 +125,26 @@  {{ t('dialog.avatar.tags.cache') }} + Styles + {{ avatarDialog.ref.styles.primary }} + {{ avatarDialog.ref.styles.secondary }} + {{ t('dialog.avatar.actions.change_content_tags') }} + {{ + t('dialog.avatar.actions.change_styles') + }} {{ t('dialog.avatar.actions.change_image') }} @@ -482,6 +505,7 @@ + @@ -494,6 +518,7 @@ import $utils from '../../../classes/utils'; import SetAvatarTagsDialog from './SetAvatarTagsDialog.vue'; + import SetAvatarStylesDialog from './SetAvatarStylesDialog.vue'; const API = inject('API'); const beforeDialogClose = inject('beforeDialogClose'); @@ -550,6 +575,17 @@ contentAdult: false, contentSex: false }); + const setAvatarStylesDialog = reactive({ + visible: false, + loading: false, + avatarId: '', + initialPrimaryStyle: '', + initialSecondaryStyle: '', + primaryStyle: '', + secondaryStyle: '', + availableAvatarStyles: [], + availableAvatarStylesMap: new Map() + }); const avatarDialogPlatform = computed(() => { const { ref } = props.avatarDialog; @@ -653,6 +689,9 @@ case 'Change Content Tags': showSetAvatarTagsDialog(D.id); break; + case 'Change Styles': + showSetAvatarStylesDialog(D.id); + break; case 'Download Unity Package': openExternalLink(utils.replaceVrcPackageUrl(props.avatarDialog.ref.unityPackageUrl)); break; @@ -894,7 +933,7 @@ memo: memo.value }); } else { - database.deleteAvatarMemo(props.avatarDialog.avatarId); + database.deleteAvatarMemo(props.avatarDialog.id); } } @@ -1049,6 +1088,20 @@ }); } + function showSetAvatarStylesDialog() { + const D = setAvatarStylesDialog; + D.visible = true; + D.loading = true; + D.avatarId = props.avatarDialog.id; + D.primaryStyle = props.avatarDialog.ref.styles?.primary || ''; + D.secondaryStyle = props.avatarDialog.ref.styles?.secondary || ''; + D.initialPrimaryStyle = D.primaryStyle; + D.initialSecondaryStyle = D.secondaryStyle; + nextTick(() => { + D.loading = false; + }); + } + function downloadAndSaveJson(fileName, data) { utils.downloadAndSaveJson(fileName, data); } diff --git a/src/views/dialogs/avatarDialog/SetAvatarStylesDialog.vue b/src/views/dialogs/avatarDialog/SetAvatarStylesDialog.vue new file mode 100644 index 00000000..171d78e4 --- /dev/null +++ b/src/views/dialogs/avatarDialog/SetAvatarStylesDialog.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/views/dialogs/avatarDialog/SetAvatarTagsDialog.vue b/src/views/dialogs/avatarDialog/SetAvatarTagsDialog.vue index 0c8dabdb..fcdc41b9 100644 --- a/src/views/dialogs/avatarDialog/SetAvatarTagsDialog.vue +++ b/src/views/dialogs/avatarDialog/SetAvatarTagsDialog.vue @@ -177,15 +177,15 @@ D.selectedCount++; } ref.$tagString = ''; - const conentTags = []; + const contentTags = []; ref.tags.forEach((tag) => { if (tag.startsWith('content_')) { - conentTags.push(tag.substring(8)); + contentTags.push(tag.substring(8)); } }); - for (let i = 0; i < conentTags.length; ++i) { - const tag = conentTags[i]; - if (i < conentTags.length - 1) { + for (let i = 0; i < contentTags.length; ++i) { + const tag = contentTags[i]; + if (i < contentTags.length - 1) { ref.$tagString += `${tag}, `; } else { ref.$tagString += tag;