mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-05-03 13:36:04 +02:00
fix: gallery animation emoji layout
This commit is contained in:
+67
-36
@@ -90,9 +90,17 @@
|
|||||||
:class="compareCurrentProfilePic(image.id) ? 'x-highlight-ring' : ''"
|
:class="compareCurrentProfilePic(image.id) ? 'x-highlight-ring' : ''"
|
||||||
as-child>
|
as-child>
|
||||||
<div
|
<div
|
||||||
v-if="image.versions && image.versions.length > 0 && image.versions[image.versions.length - 1].file.url"
|
v-if="
|
||||||
|
image.versions &&
|
||||||
|
image.versions.length > 0 &&
|
||||||
|
image.versions[image.versions.length - 1].file.url
|
||||||
|
"
|
||||||
class="overflow-hidden rounded-[inherit]">
|
class="overflow-hidden rounded-[inherit]">
|
||||||
<ItemHeader class="cursor-pointer" @click="showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)">
|
<ItemHeader
|
||||||
|
class="cursor-pointer"
|
||||||
|
@click="
|
||||||
|
showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)
|
||||||
|
">
|
||||||
<img
|
<img
|
||||||
:src="image.versions[image.versions.length - 1].file.url"
|
:src="image.versions[image.versions.length - 1].file.url"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
@@ -162,9 +170,17 @@
|
|||||||
:class="compareCurrentVRCPlusIcon(image.id) ? 'x-highlight-ring' : ''"
|
:class="compareCurrentVRCPlusIcon(image.id) ? 'x-highlight-ring' : ''"
|
||||||
as-child>
|
as-child>
|
||||||
<div
|
<div
|
||||||
v-if="image.versions && image.versions.length > 0 && image.versions[image.versions.length - 1].file.url"
|
v-if="
|
||||||
|
image.versions &&
|
||||||
|
image.versions.length > 0 &&
|
||||||
|
image.versions[image.versions.length - 1].file.url
|
||||||
|
"
|
||||||
class="overflow-hidden rounded-[inherit]">
|
class="overflow-hidden rounded-[inherit]">
|
||||||
<ItemHeader class="cursor-pointer" @click="showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)">
|
<ItemHeader
|
||||||
|
class="cursor-pointer"
|
||||||
|
@click="
|
||||||
|
showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)
|
||||||
|
">
|
||||||
<img
|
<img
|
||||||
:src="image.versions[image.versions.length - 1].file.url"
|
:src="image.versions[image.versions.length - 1].file.url"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
@@ -200,6 +216,7 @@
|
|||||||
accept="image/*"
|
accept="image/*"
|
||||||
@change="onFileChangeEmoji"
|
@change="onFileChangeEmoji"
|
||||||
style="display: none" />
|
style="display: none" />
|
||||||
|
<div class="flex flex-col gap-2">
|
||||||
<div class="flex items-center gap-2">
|
<div class="flex items-center gap-2">
|
||||||
<ButtonGroup>
|
<ButtonGroup>
|
||||||
<Button variant="outline" size="sm" @click="refreshEmojiTable">
|
<Button variant="outline" size="sm" @click="refreshEmojiTable">
|
||||||
@@ -241,11 +258,9 @@
|
|||||||
<Checkbox v-model="emojiAnimType" />
|
<Checkbox v-model="emojiAnimType" />
|
||||||
<span>{{ t('dialog.gallery_icons.emoji_animation_type') }}</span>
|
<span>{{ t('dialog.gallery_icons.emoji_animation_type') }}</span>
|
||||||
</label>
|
</label>
|
||||||
<template v-if="emojiAnimType">
|
</div>
|
||||||
<Button
|
<div v-if="emojiAnimType" class="flex items-center gap-2">
|
||||||
size="sm"
|
<Button size="sm" variant="outline" @click="openExternalLink('https://vrcemoji.com')">
|
||||||
variant="outline"
|
|
||||||
@click="openExternalLink('https://vrcemoji.com')">
|
|
||||||
{{ t('dialog.gallery_icons.create_animated_emoji') }}
|
{{ t('dialog.gallery_icons.create_animated_emoji') }}
|
||||||
</Button>
|
</Button>
|
||||||
<span class="text-sm">{{ t('dialog.gallery_icons.emoji_animation_fps') }}</span>
|
<span class="text-sm">{{ t('dialog.gallery_icons.emoji_animation_fps') }}</span>
|
||||||
@@ -262,9 +277,7 @@
|
|||||||
<NumberFieldIncrement />
|
<NumberFieldIncrement />
|
||||||
</NumberFieldContent>
|
</NumberFieldContent>
|
||||||
</NumberField>
|
</NumberField>
|
||||||
<span class="text-sm">{{
|
<span class="text-sm">{{ t('dialog.gallery_icons.emoji_animation_frame_count') }}</span>
|
||||||
t('dialog.gallery_icons.emoji_animation_frame_count')
|
|
||||||
}}</span>
|
|
||||||
<NumberField
|
<NumberField
|
||||||
v-model="emojiAnimFrameCount"
|
v-model="emojiAnimFrameCount"
|
||||||
:min="2"
|
:min="2"
|
||||||
@@ -282,8 +295,10 @@
|
|||||||
<Checkbox v-model="emojiAnimLoopPingPong" />
|
<Checkbox v-model="emojiAnimLoopPingPong" />
|
||||||
<span>{{ t('dialog.gallery_icons.emoji_loop_pingpong') }}</span>
|
<span>{{ t('dialog.gallery_icons.emoji_loop_pingpong') }}</span>
|
||||||
</label>
|
</label>
|
||||||
</template>
|
</div>
|
||||||
<span v-if="emojiAnimType" class="basis-full text-sm text-muted-foreground">{{ t('dialog.gallery_icons.flipbook_info') }}</span>
|
<span v-if="emojiAnimType" class="basis-full text-sm text-muted-foreground">{{
|
||||||
|
t('dialog.gallery_icons.flipbook_info')
|
||||||
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<ItemGroup
|
<ItemGroup
|
||||||
class="grid gap-3 mt-3"
|
class="grid gap-3 mt-3"
|
||||||
@@ -296,11 +311,20 @@
|
|||||||
class="p-0 x-hover-card hover:bg-accent hover:shadow-sm"
|
class="p-0 x-hover-card hover:bg-accent hover:shadow-sm"
|
||||||
as-child>
|
as-child>
|
||||||
<div
|
<div
|
||||||
v-if="image.versions && image.versions.length > 0 && image.versions[image.versions.length - 1].file.url"
|
v-if="
|
||||||
|
image.versions &&
|
||||||
|
image.versions.length > 0 &&
|
||||||
|
image.versions[image.versions.length - 1].file.url
|
||||||
|
"
|
||||||
class="overflow-hidden">
|
class="overflow-hidden">
|
||||||
<ItemHeader
|
<ItemHeader
|
||||||
class="cursor-pointer"
|
class="cursor-pointer"
|
||||||
@click="showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url, getEmojiFileName(image))">
|
@click="
|
||||||
|
showFullscreenImageDialog(
|
||||||
|
image.versions[image.versions.length - 1].file.url,
|
||||||
|
getEmojiFileName(image)
|
||||||
|
)
|
||||||
|
">
|
||||||
<Emoji
|
<Emoji
|
||||||
:imageUrl="image.versions[image.versions.length - 1].file.url"
|
:imageUrl="image.versions[image.versions.length - 1].file.url"
|
||||||
:size="200"
|
:size="200"
|
||||||
@@ -364,9 +388,17 @@
|
|||||||
class="p-0 x-hover-card hover:bg-accent hover:shadow-sm"
|
class="p-0 x-hover-card hover:bg-accent hover:shadow-sm"
|
||||||
as-child>
|
as-child>
|
||||||
<div
|
<div
|
||||||
v-if="image.versions && image.versions.length > 0 && image.versions[image.versions.length - 1].file.url"
|
v-if="
|
||||||
|
image.versions &&
|
||||||
|
image.versions.length > 0 &&
|
||||||
|
image.versions[image.versions.length - 1].file.url
|
||||||
|
"
|
||||||
class="overflow-hidden">
|
class="overflow-hidden">
|
||||||
<ItemHeader class="cursor-pointer" @click="showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)">
|
<ItemHeader
|
||||||
|
class="cursor-pointer"
|
||||||
|
@click="
|
||||||
|
showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)
|
||||||
|
">
|
||||||
<img
|
<img
|
||||||
:src="image.versions[image.versions.length - 1].file.url"
|
:src="image.versions[image.versions.length - 1].file.url"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
@@ -433,7 +465,9 @@
|
|||||||
class="p-0 x-hover-card hover:bg-accent hover:shadow-sm"
|
class="p-0 x-hover-card hover:bg-accent hover:shadow-sm"
|
||||||
as-child>
|
as-child>
|
||||||
<div class="overflow-hidden">
|
<div class="overflow-hidden">
|
||||||
<ItemHeader class="cursor-pointer" @click="showFullscreenImageDialog(image.files.image, getPrintFileName(image))">
|
<ItemHeader
|
||||||
|
class="cursor-pointer"
|
||||||
|
@click="showFullscreenImageDialog(image.files.image, getPrintFileName(image))">
|
||||||
<img
|
<img
|
||||||
:src="image.files.image"
|
:src="image.files.image"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
@@ -518,17 +552,23 @@
|
|||||||
{{ formatDateFilter(item.created_at, 'long') }}
|
{{ formatDateFilter(item.created_at, 'long') }}
|
||||||
</ItemDescription>
|
</ItemDescription>
|
||||||
<ItemDescription class="text-xs">
|
<ItemDescription class="text-xs">
|
||||||
<span v-if="item.itemType === 'prop'">{{ t('dialog.gallery_icons.item') }}</span>
|
<span v-if="item.itemType === 'prop'">{{
|
||||||
<span v-else-if="item.itemType === 'sticker'">{{ t('dialog.gallery_icons.sticker') }}</span>
|
t('dialog.gallery_icons.item')
|
||||||
<span v-else-if="item.itemType === 'droneskin'">{{ t('dialog.gallery_icons.drone_skin') }}</span>
|
}}</span>
|
||||||
<span v-else-if="item.itemType === 'emoji'">{{ t('dialog.gallery_icons.emoji') }}</span>
|
<span v-else-if="item.itemType === 'sticker'">{{
|
||||||
|
t('dialog.gallery_icons.sticker')
|
||||||
|
}}</span>
|
||||||
|
<span v-else-if="item.itemType === 'droneskin'">{{
|
||||||
|
t('dialog.gallery_icons.drone_skin')
|
||||||
|
}}</span>
|
||||||
|
<span v-else-if="item.itemType === 'emoji'">{{
|
||||||
|
t('dialog.gallery_icons.emoji')
|
||||||
|
}}</span>
|
||||||
<span v-else v-text="item.itemTypeLabel"></span>
|
<span v-else v-text="item.itemTypeLabel"></span>
|
||||||
</ItemDescription>
|
</ItemDescription>
|
||||||
</ItemContent>
|
</ItemContent>
|
||||||
<ItemFooter v-if="item.itemType === 'bundle'" class="p-2">
|
<ItemFooter v-if="item.itemType === 'bundle'" class="p-2">
|
||||||
<Button
|
<Button size="sm" @click="consumeInventoryBundle(item.id)">
|
||||||
size="sm"
|
|
||||||
@click="consumeInventoryBundle(item.id)">
|
|
||||||
{{ t('dialog.gallery_icons.consume_bundle') }}
|
{{ t('dialog.gallery_icons.consume_bundle') }}
|
||||||
</Button>
|
</Button>
|
||||||
</ItemFooter>
|
</ItemFooter>
|
||||||
@@ -779,16 +819,7 @@
|
|||||||
* errorMessage?: string
|
* errorMessage?: string
|
||||||
* }} options
|
* }} options
|
||||||
*/
|
*/
|
||||||
function openImageUploadFlow(
|
function openImageUploadFlow(e, { inputSelector, aspectRatio, beforeCrop, upload, errorMessage = 'Failed to upload' }) {
|
||||||
e,
|
|
||||||
{
|
|
||||||
inputSelector,
|
|
||||||
aspectRatio,
|
|
||||||
beforeCrop,
|
|
||||||
upload,
|
|
||||||
errorMessage = 'Failed to upload'
|
|
||||||
}
|
|
||||||
) {
|
|
||||||
const { file, clearInput } = handleImageUploadInput(e, {
|
const { file, clearInput } = handleImageUploadInput(e, {
|
||||||
inputSelector,
|
inputSelector,
|
||||||
tooLargeMessage: () => t('message.file.too_large'),
|
tooLargeMessage: () => t('message.file.too_large'),
|
||||||
|
|||||||
Reference in New Issue
Block a user