move some shortcuts to tools

This commit is contained in:
pa
2026-01-22 23:46:37 +09:00
parent fab14abdd6
commit 4e5acb990f
3 changed files with 182 additions and 73 deletions

View File

@@ -442,6 +442,24 @@
"inventory": "VRC+ Images & Inventory Management",
"inventory_description": "Manage VRC+ Images & Inventory"
},
"shortcuts": {
"header": "Shortcuts",
"vrcx_data": "VRCX Data",
"vrcx_data_description": "Open the VRCX data folder",
"vrchat_data": "VRChat Data",
"vrchat_data_description": "Open the VRChat data folder",
"crash_dumps": "Crash Dumps",
"crash_dumps_description": "Open the VRChat crash dumps folder"
},
"system_tools": {
"header": "System Tools",
"vrchat_config": "VRChat Config",
"vrchat_config_description": "Open VRChat config.json settings",
"launch_options": "Launch Options",
"launch_options_description": "Edit VRChat launch options",
"registry_backup": "VRChat Registry Backup",
"registry_backup_description": "Create or restore a VRChat registry backup"
},
"other": {
"header": "Other",
"edit_invite_message": "Edit Invite Messages",

View File

@@ -19,25 +19,6 @@
</ButtonGroup>
</div>
</div>
<div class="options-container">
<span class="header">{{ t('view.settings.advanced.advanced.common_folders') }}</span>
<div class="options-container-item" style="margin-top: 15px">
<ButtonGroup>
<Button variant="outline" size="sm" @click="openVrcxAppDataFolder()">
<Folder />
VRCX Data
</Button>
<Button variant="outline" size="sm" @click="openVrcAppDataFolder()">
<Folder />
VRChat Data
</Button>
<Button variant="outline" size="sm" @click="openCrashVrcCrashDumps()">
<Folder />
Crash Dumps
</Button>
</ButtonGroup>
</div>
</div>
<div class="options-container">
<span class="sub-header">{{ t('view.settings.advanced.advanced.primary_password.header') }}</span>
<simple-switch
@@ -384,12 +365,11 @@
</template>
<script setup>
import { Folder, Languages, Package, RefreshCcw, Settings, Trash2 } from 'lucide-vue-next';
import { Languages, Package, RefreshCcw, Settings, Trash2 } from 'lucide-vue-next';
import { computed, reactive, ref } from 'vue';
import { Button } from '@/components/ui/button';
import { ButtonGroup } from '@/components/ui/button-group';
import { storeToRefs } from 'pinia';
import { toast } from 'vue-sonner';
import { useI18n } from 'vue-i18n';
import VueJsonPretty from 'vue-json-pretty';
@@ -502,36 +482,6 @@
const isLinux = computed(() => LINUX);
function openVrcxAppDataFolder() {
AppApi.OpenVrcxAppDataFolder().then((result) => {
if (result) {
toast.success('Folder opened');
} else {
toast.error(t('message.file.folder_missing'));
}
});
}
function openVrcAppDataFolder() {
AppApi.OpenVrcAppDataFolder().then((result) => {
if (result) {
toast.success('Folder opened');
} else {
toast.error(t('message.file.folder_missing'));
}
});
}
function openCrashVrcCrashDumps() {
AppApi.OpenCrashVrcCrashDumps().then((result) => {
if (result) {
toast.success('Folder opened');
} else {
toast.error(t('message.file.folder_missing'));
}
});
}
function openShortcutFolder() {
AppApi.OpenShortcutFolder();
}

View File

@@ -4,28 +4,6 @@
<span class="header">{{ t('view.tools.header') }}</span>
<div class="tool-categories">
<div class="tool-category">
<div class="category-header" @click="toggleCategory('group')">
<ChevronDown
class="rotation-transition"
:class="{ 'is-rotated': categoryCollapsed['group'] }" />
<span class="category-title">{{ t('view.tools.group.header') }}</span>
</div>
<div class="tools-grid" v-show="!categoryCollapsed['group']">
<Card class="tool-card p-0 gap-0">
<div class="tool-content" @click="showGroupCalendarDialog">
<div class="tool-icon text-2xl">
<CalendarDays />
</div>
<div class="tool-info">
<div class="tool-name">{{ t('view.tools.group.calendar') }}</div>
<div class="tool-description">{{ t('view.tools.group.calendar_description') }}</div>
</div>
</div>
</Card>
</div>
</div>
<div class="tool-category">
<div class="category-header text-2xl" @click="toggleCategory('image')">
<ChevronDown
@@ -60,6 +38,17 @@
</div>
</div>
</Card>
</div>
</div>
<div class="tool-category">
<div class="category-header" @click="toggleCategory('shortcuts')">
<ChevronDown
class="rotation-transition"
:class="{ 'is-rotated': categoryCollapsed['shortcuts'] }" />
<span class="category-title">{{ t('view.tools.shortcuts.header') }}</span>
</div>
<div class="tools-grid" v-show="!categoryCollapsed['shortcuts']">
<Card class="tool-card p-0 gap-0">
<div class="tool-content" @click="openVrcPhotosFolder">
<div class="tool-icon text-2xl">
@@ -88,6 +77,117 @@
</div>
</div>
</Card>
<Card class="tool-card p-0 gap-0">
<div class="tool-content" @click="openVrcxAppDataFolder">
<div class="tool-icon text-2xl">
<Folder />
</div>
<div class="tool-info">
<div class="tool-name">{{ t('view.tools.shortcuts.vrcx_data') }}</div>
<div class="tool-description">
{{ t('view.tools.shortcuts.vrcx_data_description') }}
</div>
</div>
</div>
</Card>
<Card class="tool-card p-0 gap-0">
<div class="tool-content" @click="openVrcAppDataFolder">
<div class="tool-icon text-2xl">
<Folder />
</div>
<div class="tool-info">
<div class="tool-name">{{ t('view.tools.shortcuts.vrchat_data') }}</div>
<div class="tool-description">
{{ t('view.tools.shortcuts.vrchat_data_description') }}
</div>
</div>
</div>
</Card>
<Card class="tool-card p-0 gap-0">
<div class="tool-content" @click="openCrashVrcCrashDumps">
<div class="tool-icon text-2xl">
<Folder />
</div>
<div class="tool-info">
<div class="tool-name">{{ t('view.tools.shortcuts.crash_dumps') }}</div>
<div class="tool-description">
{{ t('view.tools.shortcuts.crash_dumps_description') }}
</div>
</div>
</div>
</Card>
</div>
</div>
<div class="tool-category">
<div class="category-header" @click="toggleCategory('system')">
<ChevronDown
class="rotation-transition"
:class="{ 'is-rotated': categoryCollapsed['system'] }" />
<span class="category-title">{{ t('view.tools.system_tools.header') }}</span>
</div>
<div class="tools-grid" v-show="!categoryCollapsed['system']">
<Card class="tool-card p-0 gap-0">
<div class="tool-content" @click="showVRChatConfig">
<div class="tool-icon text-2xl">
<Settings />
</div>
<div class="tool-info">
<div class="tool-name">{{ t('view.tools.system_tools.vrchat_config') }}</div>
<div class="tool-description">
{{ t('view.tools.system_tools.vrchat_config_description') }}
</div>
</div>
</div>
</Card>
<Card class="tool-card p-0 gap-0">
<div class="tool-content" @click="showLaunchOptions">
<div class="tool-icon text-2xl">
<Settings />
</div>
<div class="tool-info">
<div class="tool-name">{{ t('view.tools.system_tools.launch_options') }}</div>
<div class="tool-description">
{{ t('view.tools.system_tools.launch_options_description') }}
</div>
</div>
</div>
</Card>
<Card class="tool-card p-0 gap-0">
<div class="tool-content" @click="showRegistryBackupDialog">
<div class="tool-icon text-2xl">
<Package />
</div>
<div class="tool-info">
<div class="tool-name">{{ t('view.tools.system_tools.registry_backup') }}</div>
<div class="tool-description">
{{ t('view.tools.system_tools.registry_backup_description') }}
</div>
</div>
</div>
</Card>
</div>
</div>
<div class="tool-category">
<div class="category-header" @click="toggleCategory('group')">
<ChevronDown
class="rotation-transition"
:class="{ 'is-rotated': categoryCollapsed['group'] }" />
<span class="category-title">{{ t('view.tools.group.header') }}</span>
</div>
<div class="tools-grid" v-show="!categoryCollapsed['group']">
<Card class="tool-card p-0 gap-0">
<div class="tool-content" @click="showGroupCalendarDialog">
<div class="tool-icon text-2xl">
<CalendarDays />
</div>
<div class="tool-info">
<div class="tool-name">{{ t('view.tools.group.calendar') }}</div>
<div class="tool-description">{{ t('view.tools.group.calendar_description') }}</div>
</div>
</div>
</Card>
</div>
</div>
@@ -205,9 +305,12 @@
CalendarDays,
Camera,
ChevronDown,
Folder,
FolderOpen,
Images,
MessageSquare,
Package,
Settings,
SquarePen,
UserCheck
} from 'lucide-vue-next';
@@ -219,6 +322,9 @@
import { useI18n } from 'vue-i18n';
import { useFriendStore, useGalleryStore } from '../../stores';
import { useAdvancedSettingsStore } from '../../stores/settings/advanced';
import { useLaunchStore } from '../../stores/launch';
import { useVrcxStore } from '../../stores/vrcx';
const GroupCalendarDialog = defineAsyncComponent(() => import('./dialogs/GroupCalendarDialog.vue'));
const NoteExportDialog = defineAsyncComponent(() => import('./dialogs/NoteExportDialog.vue'));
@@ -233,10 +339,15 @@
const { showGalleryPage } = useGalleryStore();
const { friends } = storeToRefs(useFriendStore());
const { showVRChatConfig } = useAdvancedSettingsStore();
const { showLaunchOptions } = useLaunchStore();
const { showRegistryBackupDialog } = useVrcxStore();
const categoryCollapsed = ref({
group: false,
image: false,
shortcuts: false,
system: false,
user: false,
other: false
});
@@ -300,6 +411,36 @@
}
});
}
function openVrcxAppDataFolder() {
AppApi.OpenVrcxAppDataFolder().then((result) => {
if (result) {
toast.success('Folder opened');
} else {
toast.error(t('message.file.folder_missing'));
}
});
}
function openVrcAppDataFolder() {
AppApi.OpenVrcAppDataFolder().then((result) => {
if (result) {
toast.success('Folder opened');
} else {
toast.error(t('message.file.folder_missing'));
}
});
}
function openCrashVrcCrashDumps() {
AppApi.OpenCrashVrcCrashDumps().then((result) => {
if (result) {
toast.success('Folder opened');
} else {
toast.error(t('message.file.folder_missing'));
}
});
}
</script>
<style scoped>