From 04b8e82b21c68219000a1041eddc907f3aaef2df Mon Sep 17 00:00:00 2001 From: Neko Ayaka Date: Thu, 23 Oct 2025 21:40:57 +0800 Subject: [PATCH] refactor(stage-tamagotchi): cleanup code --- .../composables/tauri-global-shortcuts.ts | 34 -- .../renderer/composables/tauri-positioner.ts | 42 -- .../src/renderer/composables/tauri-rdev.ts | 117 ----- .../tauri-window-pass-through-on-hover.ts | 134 ------ .../composables/tauri-window-state.ts | 77 ---- .../src/renderer/composables/tauri.ts | 340 --------------- .../renderer/composables/use-rdev-mouse.ts | 30 -- .../src/renderer/pages/index.vue | 30 +- .../src/renderer/pages/onboarding.vue | 2 - .../src/renderer/stores/window-controls.ts | 73 ---- .../src/renderer/stores/window.ts | 10 +- .../src/renderer/tauri/invoke.ts | 35 -- .../src/renderer/tauri/rdev.ts | 407 ------------------ .../src/renderer/tauri/vad/index.ts | 3 - .../src/renderer/tauri/vad/manager.ts | 2 - .../src/renderer/tauri/vad/process.worklet.ts | 53 --- .../src/renderer/tauri/vad/vad.ts | 217 ---------- .../src/renderer/types/window-controls.ts | 6 - 18 files changed, 6 insertions(+), 1606 deletions(-) delete mode 100644 apps/stage-tamagotchi/src/renderer/composables/tauri-global-shortcuts.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/composables/tauri-positioner.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/composables/tauri-rdev.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/composables/tauri-window-pass-through-on-hover.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/composables/tauri-window-state.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/composables/tauri.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/composables/use-rdev-mouse.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/stores/window-controls.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/tauri/invoke.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/tauri/rdev.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/tauri/vad/index.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/tauri/vad/manager.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/tauri/vad/process.worklet.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/tauri/vad/vad.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/types/window-controls.ts diff --git a/apps/stage-tamagotchi/src/renderer/composables/tauri-global-shortcuts.ts b/apps/stage-tamagotchi/src/renderer/composables/tauri-global-shortcuts.ts deleted file mode 100644 index a802211b2..000000000 --- a/apps/stage-tamagotchi/src/renderer/composables/tauri-global-shortcuts.ts +++ /dev/null @@ -1,34 +0,0 @@ -// import { useMagicKeys } from '@vueuse/core' -// import { until, whenever } from '@vueuse/shared' -// import { storeToRefs } from 'pinia' -// import { watch } from 'vue' - -// import { useShortcutsStore } from '../stores/shortcuts' -// import { useAppRuntime } from './runtime' -// import { useTauriRdevEventTarget } from './tauri-rdev' - -// export function useTauriGlobalShortcuts() { -// const { shortcuts } = storeToRefs(useShortcutsStore()) -// const { platform, isInitialized } = useAppRuntime() -// const eventTarget = useTauriRdevEventTarget() -// const keys = useMagicKeys({ target: eventTarget }) - -// watch(shortcuts, async () => { -// await until(isInitialized).toBeTruthy() -// if (platform.value === 'web') { -// return -// } - -// for (const handler of shortcuts.value) { -// if (!handler.shortcut) { -// return -// } - -// whenever(keys[handler.shortcut], async () => { -// handler.handle().catch((error) => { -// console.error('Error handling shortcut', error) -// }) -// }) -// } -// }, { immediate: true }) -// } diff --git a/apps/stage-tamagotchi/src/renderer/composables/tauri-positioner.ts b/apps/stage-tamagotchi/src/renderer/composables/tauri-positioner.ts deleted file mode 100644 index 5181635b7..000000000 --- a/apps/stage-tamagotchi/src/renderer/composables/tauri-positioner.ts +++ /dev/null @@ -1,42 +0,0 @@ -// import type { Position } from '@tauri-apps/plugin-positioner' - -// import { computedAsync, until } from '@vueuse/core' - -// import { useAppRuntime } from './runtime' -// import { untilImported } from './tauri' - -// export function useTauriPositioner() { -// const { platform, isInitialized } = useAppRuntime() - -// const tauriPositionerApi = computedAsync(async () => { -// await until(isInitialized).toBeTruthy() - -// if (platform.value !== 'web') { -// return untilImported(() => import('@tauri-apps/plugin-positioner'), console.warn) -// } -// }) - -// async function ensureImported() { -// await until(isInitialized).toBeTruthy() - -// if (platform.value === 'web') { -// console.warn('Attempted to use Tauri positioner in web platform') -// return -// } - -// await until(tauriPositionerApi).toBeTruthy() -// const imported = await tauriPositionerApi.value -// if (!imported) { -// throw new Error('Tauri positioner API not available') -// } -// } - -// async function moveWindow(to: Position) { -// await ensureImported() -// return tauriPositionerApi.value?.moveWindow(to) -// } - -// return { -// moveWindow, -// } -// } diff --git a/apps/stage-tamagotchi/src/renderer/composables/tauri-rdev.ts b/apps/stage-tamagotchi/src/renderer/composables/tauri-rdev.ts deleted file mode 100644 index 452b37b2c..000000000 --- a/apps/stage-tamagotchi/src/renderer/composables/tauri-rdev.ts +++ /dev/null @@ -1,117 +0,0 @@ -// import type { AiriTamagotchiEvents } from './tauri' - -// import { onMounted, onUnmounted } from 'vue' - -// import { KeyCode, mapKeyCode, mapKeyKey } from '../tauri/rdev' -// import { useTauriEvent } from './tauri' - -// export function useTauriRdevEventTarget(): EventTarget { -// const unListenFuncs: (() => void)[] = [] -// const eventTarget = new EventTarget() - -// const { listen } = useTauriEvent() - -// async function setup() { -// window.addEventListener('keyup', (event) => { -// event.preventDefault() -// event.stopPropagation() - -// const e = new KeyboardEvent('keyup', { -// key: event.key, -// code: event.code, -// metaKey: event.metaKey, -// ctrlKey: event.ctrlKey, -// altKey: event.altKey, -// shiftKey: event.shiftKey, -// }) -// eventTarget.dispatchEvent(e) -// }) - -// window.addEventListener('keydown', (event) => { -// event.preventDefault() -// event.stopPropagation() - -// const e = new KeyboardEvent('keydown', { -// key: event.key, -// code: event.code, -// metaKey: event.metaKey, -// ctrlKey: event.ctrlKey, -// altKey: event.altKey, -// shiftKey: event.shiftKey, -// }) -// eventTarget.dispatchEvent(e) -// }) - -// unListenFuncs.push(await listen('tauri-plugins:tauri-plugin-rdev:mousemove', (event) => { -// if (event.payload.event_type.MouseMove) { -// const { x, y } = event.payload.event_type.MouseMove -// const e = new MouseEvent('mousemove', { -// clientX: x, -// clientY: y, -// }) -// eventTarget.dispatchEvent(e) -// } -// })) - -// unListenFuncs.push(await listen('tauri-plugins:tauri-plugin-rdev:keyup', (event) => { -// if (typeof event.payload.event_type.KeyRelease === 'object' && 'Unknown' in event.payload.event_type.KeyRelease) { -// if (event.payload.event_type.KeyRelease.Unknown === 62) { -// event.payload.event_type = { KeyRelease: KeyCode.ControlLeft } -// } -// } -// if (typeof event.payload.event_type.KeyRelease !== 'string') { -// console.warn('unknown key release event:', event.payload.event_type.KeyRelease) -// return -// } - -// const e = new KeyboardEvent('keyup', { -// key: mapKeyKey[event.payload.event_type.KeyRelease], -// code: mapKeyCode[event.payload.event_type.KeyRelease], -// metaKey: mapKeyKey[event.payload.event_type.KeyRelease] === 'Meta', -// ctrlKey: mapKeyKey[event.payload.event_type.KeyRelease] === 'Control', -// altKey: mapKeyKey[event.payload.event_type.KeyRelease] === 'Alt', -// shiftKey: mapKeyKey[event.payload.event_type.KeyRelease] === 'Shift', -// }) - -// eventTarget.dispatchEvent(e) -// })) - -// unListenFuncs.push(await listen('tauri-plugins:tauri-plugin-rdev:keydown', (event) => { -// if (typeof event.payload.event_type.KeyPress === 'object' && 'Unknown' in event.payload.event_type.KeyPress) { -// if (event.payload.event_type.KeyPress.Unknown === 62) { -// event.payload.event_type = { KeyPress: KeyCode.ControlLeft } -// } -// } -// if (typeof event.payload.event_type.KeyPress !== 'string') { -// console.warn('unknown key release event:', event.payload.event_type.KeyPress) -// return -// } - -// const e = new KeyboardEvent('keydown', { -// key: mapKeyKey[event.payload.event_type.KeyPress], -// code: mapKeyCode[event.payload.event_type.KeyPress], -// metaKey: mapKeyKey[event.payload.event_type.KeyPress] === 'Meta', -// ctrlKey: mapKeyKey[event.payload.event_type.KeyPress] === 'Control', -// altKey: mapKeyKey[event.payload.event_type.KeyPress] === 'Alt', -// shiftKey: mapKeyKey[event.payload.event_type.KeyPress] === 'Shift', -// }) - -// eventTarget.dispatchEvent(e) -// })) -// } - -// function cleanup() { -// unListenFuncs.forEach(unListen => unListen()) -// unListenFuncs.length = 0 -// } - -// onMounted(() => setup()) -// onUnmounted(() => cleanup()) - -// if (import.meta.hot) { // For better DX -// import.meta.hot.on('vite:beforeUpdate', () => cleanup()) -// import.meta.hot.on('vite:afterUpdate', async () => await setup()) -// } - -// return eventTarget -// } diff --git a/apps/stage-tamagotchi/src/renderer/composables/tauri-window-pass-through-on-hover.ts b/apps/stage-tamagotchi/src/renderer/composables/tauri-window-pass-through-on-hover.ts deleted file mode 100644 index 92031a6f8..000000000 --- a/apps/stage-tamagotchi/src/renderer/composables/tauri-window-pass-through-on-hover.ts +++ /dev/null @@ -1,134 +0,0 @@ -// import type { MaybeRefOrGetter } from 'vue' - -// import type { AiriTamagotchiEvents, Point, WindowFrame } from './tauri' - -// import { onMounted, onUnmounted, ref, toValue, watch } from 'vue' - -// import { startClickThrough, stopClickThrough } from '../utils/windows' -// import { useAppRuntime } from './runtime' -// import { useTauriCore, useTauriEvent } from './tauri' - -// export function useTauriPointAndWindowFrame() { -// const { listen } = useTauriEvent() -// const { invoke } = useTauriCore() - -// const unListenFuncs = ref<(() => void)[]>([]) - -// const mousePos = ref({ x: 0, y: 0 }) -// const windowFrame = ref({ -// origin: { x: 0, y: 0 }, -// size: { width: 0, height: 0 }, -// }) - -// function _onCursorPosition(event: { payload: Point }) { -// mousePos.value = event.payload -// } - -// function _onWindowFrame(event: { payload: WindowFrame }) { -// windowFrame.value = event.payload -// } - -// function addListeners() { -// listen('tauri-plugins:tauri-plugin-window-pass-through-on-hover:cursor-position', (event) => { -// _onCursorPosition(event) -// }).then((fn) => { -// unListenFuncs.value.push(fn) -// }) - -// listen('tauri-plugins:tauri-plugin-window-pass-through-on-hover:window-frame', (event) => { -// _onWindowFrame(event) -// }).then((fn) => { -// unListenFuncs.value.push(fn) -// }) -// } - -// onMounted(() => { -// addListeners() -// invoke('plugin:window-pass-through-on-hover|start_tracing_cursor') -// }) - -// onUnmounted(() => { -// unListenFuncs.value.forEach(fn => fn?.()) -// unListenFuncs.value.length = 0 - -// invoke('plugin:window-pass-through-on-hover|stop_tracing_cursor') -// }) - -// if (import.meta.hot) { // For better DX -// import.meta.hot.on('vite:beforeUpdate', () => { -// unListenFuncs.value.forEach(fn => fn?.()) -// unListenFuncs.value.length = 0 - -// invoke('plugin:window-pass-through-on-hover|stop_tracing_cursor') -// }) - -// import.meta.hot.on('vite:afterUpdate', () => { -// addListeners() -// invoke('plugin:window-pass-through-on-hover|start_tracing_cursor') -// }) -// } - -// return { -// mousePos, -// windowFrame, -// } -// } - -// export function useTauriWindowClickThrough(live2DLookAtDefault: MaybeRefOrGetter<{ x: number, y: number }>) { -// const { platform, isInitialized } = useAppRuntime() -// const { mousePos, windowFrame } = useTauriPointAndWindowFrame() - -// const live2dLookAtX = ref(toValue(live2DLookAtDefault).x) -// const live2dLookAtY = ref(toValue(live2DLookAtDefault).y) - -// const isCursorInside = ref(false) - -// function updateLive2DLookAt() { -// if (platform.value === 'macos') { -// live2dLookAtX.value = mousePos.value.x - windowFrame.value.origin.x -// live2dLookAtY.value = windowFrame.value.size.height - mousePos.value.y + windowFrame.value.origin.y - -// return -// } - -// live2dLookAtX.value = mousePos.value.x - windowFrame.value.origin.x -// live2dLookAtY.value = mousePos.value.y - windowFrame.value.origin.y -// } - -// watch(mousePos, () => { -// updateLive2DLookAt() -// }) - -// function updateIsCursorInside() { -// isCursorInside.value -// = mousePos.value.x >= windowFrame.value.origin.x -// && mousePos.value.x <= windowFrame.value.origin.x + windowFrame.value.size.width -// && mousePos.value.y >= windowFrame.value.origin.y -// && mousePos.value.y <= windowFrame.value.origin.y + windowFrame.value.size.height -// } - -// watch([mousePos, windowFrame], () => { -// updateIsCursorInside() -// }) - -// watch(isInitialized, async (initialized) => { -// if (initialized) { -// updateLive2DLookAt() -// updateIsCursorInside() -// } -// }) - -// onMounted(async () => { -// await startClickThrough() -// }) - -// onUnmounted(async () => { -// await stopClickThrough() -// }) - -// return { -// isCursorInside, -// live2dLookAtX, -// live2dLookAtY, -// } -// } diff --git a/apps/stage-tamagotchi/src/renderer/composables/tauri-window-state.ts b/apps/stage-tamagotchi/src/renderer/composables/tauri-window-state.ts deleted file mode 100644 index 4bb1e1f0c..000000000 --- a/apps/stage-tamagotchi/src/renderer/composables/tauri-window-state.ts +++ /dev/null @@ -1,77 +0,0 @@ -// import { computedAsync, until } from '@vueuse/core' - -// import { useAppRuntime } from './runtime' -// import { untilImported } from './tauri' - -// export enum StateFlags { -// SIZE = 1, -// POSITION = 2, -// MAXIMIZED = 4, -// VISIBLE = 8, -// DECORATIONS = 16, -// FULLSCREEN = 32, -// ALL = 63, -// } - -// export function useTauriWindowState() { -// const { platform, isInitialized } = useAppRuntime() - -// const tauriWindowStateApi = computedAsync(async () => { -// await until(isInitialized).toBeTruthy() - -// if (platform.value !== 'web') { -// return untilImported(() => import('@tauri-apps/plugin-window-state'), console.warn) -// } -// }) - -// async function ensureImported() { -// await until(isInitialized).toBeTruthy() - -// if (platform.value === 'web') { -// console.warn('Attempted to save window state in web platform') -// return -// } - -// await until(tauriWindowStateApi).toBeTruthy() -// const imported = await tauriWindowStateApi.value -// if (!imported) { -// throw new Error('Tauri window state API not available') -// } -// } - -// async function saveWindowState(stateFlag?: StateFlags) { -// await ensureImported() -// if (stateFlag != null) { -// return tauriWindowStateApi.value?.saveWindowState(stateFlag) -// } -// else { -// return tauriWindowStateApi.value?.saveWindowState(tauriWindowStateApi.value.StateFlags.ALL) -// } -// } - -// async function restoreState(stateFlag?: StateFlags, windowLabel = 'main') { -// await ensureImported() -// if (stateFlag != null) { -// return tauriWindowStateApi.value?.restoreState(windowLabel, stateFlag) -// } -// else { -// return tauriWindowStateApi.value?.restoreState(windowLabel, tauriWindowStateApi.value.StateFlags.ALL) -// } -// } - -// async function restoreStateCurrent(stateFlag?: StateFlags) { -// await ensureImported() -// if (stateFlag != null) { -// return tauriWindowStateApi.value?.restoreStateCurrent(stateFlag) -// } -// else { -// return tauriWindowStateApi.value?.restoreStateCurrent(tauriWindowStateApi.value.StateFlags.ALL) -// } -// } - -// return { -// saveWindowState, -// restoreState, -// restoreStateCurrent, -// } -// } diff --git a/apps/stage-tamagotchi/src/renderer/composables/tauri.ts b/apps/stage-tamagotchi/src/renderer/composables/tauri.ts deleted file mode 100644 index f08fdaf34..000000000 --- a/apps/stage-tamagotchi/src/renderer/composables/tauri.ts +++ /dev/null @@ -1,340 +0,0 @@ -// import type { InvokeArgs, InvokeOptions } from '@tauri-apps/api/core' -// import type { EventCallback, EventName, UnlistenFn } from '@tauri-apps/api/event' -// import type { Monitor } from '@tauri-apps/api/window' - -// import type { InvokeMethods, InvokeMethodShape } from '../tauri/invoke' -// import type { KeyCode } from '../tauri/rdev' - -// import { withRetry } from '@moeru/std' -// import { computedAsync, until } from '@vueuse/core' - -// import { useAppRuntime } from './runtime' - -// export async function untilNoError(fn: () => Promise, onError?: (err?: unknown | null) => void): Promise { -// const fnRetry = withRetry(fn, { retryDelay: 5000, retry: 5, onError }) -// return await fnRetry() -// } - -// export async function untilImported(fn: () => Promise, onError?: (err?: unknown | null) => void): Promise { -// return await untilNoError(fn, onError) -// } - -// export interface Point { -// x: number -// y: number -// } - -// export interface Size { -// width: number -// height: number -// } - -// export interface WindowFrame { -// origin: Point -// size: Size -// } - -// interface Events { -// 'tauri://resize': unknown -// 'tauri://move': { x: number, y: number } -// 'tauri://close-requested': unknown -// 'tauri://destroyed': unknown -// 'tauri://focus': unknown -// 'tauri://blur': unknown -// 'tauri://scale-change': unknown -// 'tauri://theme-changed': unknown -// 'tauri://window-created': unknown -// 'tauri://webview-created': unknown -// 'tauri://drag-enter': unknown -// 'tauri://drag-over': unknown -// 'tauri://drag-drop': unknown -// 'tauri://drag-leave': unknown -// } - -// export interface AiriTamagotchiEvents extends Events { -// // from main -// 'tauri-main:main:window-mode:fade-on-hover': true -// 'tauri-main:main:window-mode:move': true -// 'tauri-main:main:window-mode:resize': true - -// // from tauri-plugin-window-pass-through-on-hover -// 'tauri-plugins:tauri-plugin-window-pass-through-on-hover:cursor-position': Point -// 'tauri-plugins:tauri-plugin-window-pass-through-on-hover:window-frame': WindowFrame -// 'tauri-plugins:tauri-plugin-window-pass-through-on-hover:pass-through-enabled': boolean - -// // from tauri-plugin-ipc-audio-transcription-ort -// 'tauri-plugins:tauri-plugin-ipc-audio-vad-ort:load-model-silero-vad-progress': [boolean, string, number, number, number] -// // from tauri-plugin-ipc-audio-vad-ort -// 'tauri-plugins:tauri-plugin-ipc-audio-transcription-ort:load-model-whisper-progress': [boolean, string, number, number, number] - -// // from tauri-plugin-rdev -// 'tauri-plugins:tauri-plugin-rdev:keydown': { time: { secs_since_epoch: number, nanos_since_epoch: number }, name: string, event_type: { KeyPress: KeyCode | { Unknown: number } } } // similar to 'keydown' events from DOM elements -// 'tauri-plugins:tauri-plugin-rdev:keyup': { time: { secs_since_epoch: number, nanos_since_epoch: number }, name: string, event_type: { KeyRelease: KeyCode | { Unknown: number } } } // similar to 'keyup' events from DOM elements -// 'tauri-plugins:tauri-plugin-rdev:mousedown': { time: { secs_since_epoch: number, nanos_since_epoch: number }, name: string, event_type: { ButtonPress: string } } // similar to 'mousedown' events from DOM elements -// 'tauri-plugins:tauri-plugin-rdev:mouseup': { time: { secs_since_epoch: number, nanos_since_epoch: number }, name: string, event_type: { ButtonRelease: string } } // similar to 'mouseup' events from DOM elements -// 'tauri-plugins:tauri-plugin-rdev:mousemove': { time: { secs_since_epoch: number, nanos_since_epoch: number }, name: string, event_type: { MouseMove: { x: number, y: number } } } // similar to 'mousemove' events from DOM elements - -// // MCP -// 'mcp_plugin_destroyed': undefined -// } - -// export interface DisplayInfo { -// monitors: Monitor[] -// primaryMonitor: Monitor -// } - -// export enum PlacementStrategy { -// Center = 'Center', -// TopLeft = 'TopLeft', -// TopRight = 'TopRight', -// BottomLeft = 'BottomLeft', -// BottomRight = 'BottomRight', -// NearCursor = 'NearCursor', -// RestorePrevious = 'RestorePrevious', -// AvoidOverlap = 'AvoidOverlap', -// } - -// export interface WindowPlacementRequest { -// window_size: Size -// preferred_position?: Point -// placement_strategy: PlacementStrategy -// } - -// export interface WindowPlacementResult { -// position: Point -// target_monitor_id: number -// is_constrained: boolean -// } - -// export function useTauriEvent() { -// const { platform, isInitialized } = useAppRuntime() - -// const tauriEventApi = computedAsync(async () => { -// await until(isInitialized).toBeTruthy() - -// if (platform.value !== 'web') { -// return untilImported(() => import('@tauri-apps/api/event'), console.warn) -// } -// }) - -// async function _listen(event: E, callback: EventCallback) { -// await until(isInitialized).toBeTruthy() - -// if (platform.value === 'web') { -// return () => {} -// } - -// await until(tauriEventApi).toBeTruthy() -// const imported = await tauriEventApi.value -// if (!imported) { -// throw new Error('Tauri event API not available') -// } - -// return await imported.listen(event as EventName, callback) -// } - -// async function listen(event: E, callback: EventCallback) { -// let cleanupListener: UnlistenFn | undefined - -// _listen(event, callback).then((listener) => { -// cleanupListener = listener -// }) - -// return () => { -// cleanupListener?.() -// } -// } - -// return { -// listen, -// } -// } - -// export function useTauriCore = InvokeMethods>() { -// const { platform, isInitialized } = useAppRuntime() - -// const tauriCoreApi = computedAsync(async () => { -// await until(isInitialized).toBeTruthy() - -// if (platform.value !== 'web') { -// return untilImported(() => import('@tauri-apps/api/core'), console.warn) -// } -// }) - -// const tauriCoreApiInvoke = computedAsync(async () => { -// await until(isInitialized).toBeTruthy() - -// if (platform.value !== 'web') { -// return untilImported(() => import('../tauri/invoke'), console.warn) -// } -// }) - -// async function invoke( -// command: C, -// args?: IM[C]['args'], -// options?: IM[C]['options'], -// ): Promise { -// await until(isInitialized).toBeTruthy() - -// if (platform.value === 'web') { -// console.warn(`Attempted to invoke Tauri command "${String(command)}" in web platform`) -// return -// } - -// await until(tauriCoreApiInvoke).toBeTruthy() -// const imported = await tauriCoreApiInvoke.value -// if (!imported) { -// throw new Error('Tauri core API not available') -// } - -// return await imported.invoke(command, args as InvokeArgs | undefined, options as InvokeOptions | undefined) -// } - -// return { -// invoke, -// core: tauriCoreApi, -// } -// } - -// export function useTauriDpi() { -// const { platform, isInitialized } = useAppRuntime() - -// const tauriDpiApi = computedAsync(async () => { -// await until(isInitialized).toBeTruthy() - -// if (platform.value !== 'web') { -// return untilImported(() => import('@tauri-apps/api/window'), console.warn) -// } -// }) - -// async function createLogicalPosition(x: number, y: number) { -// const imported = await tauriDpiApi.value -// if (!imported) { -// throw new Error('Tauri DPI API not available') -// } - -// return new imported.LogicalPosition(x, y) -// } - -// return { -// createLogicalPosition, -// } -// } - -// export function useTauriWindow() { -// const { platform, isInitialized } = useAppRuntime() -// const { createLogicalPosition } = useTauriDpi() - -// const tauriWindowApi = computedAsync(async () => { -// await until(isInitialized).toBeTruthy() - -// if (platform.value !== 'web') { -// return untilImported(() => import('@tauri-apps/api/window'), console.warn) -// } -// }) - -// async function _ensureImported() { -// await until(isInitialized).toBeTruthy() -// if (platform.value === 'web') { -// throw new Error('Tauri Window API is not available in web platform') -// } - -// await until(tauriWindowApi).toBeTruthy() -// const imported = await tauriWindowApi.value -// if (!imported) { -// throw new Error('Tauri Window API not available') -// } - -// return imported -// } - -// async function getCurrentMonitor() { -// try { -// return await _ensureImported().then(imported => imported.currentMonitor()) -// } -// catch (error) { -// console.error('Failed to get current monitor:', error) -// return undefined -// } -// } - -// async function getAvailableMonitors() { -// try { -// return await _ensureImported().then(imported => imported.availableMonitors()) -// } -// catch (error) { -// console.error('Failed to get available monitors:', error) -// return [] -// } -// } - -// async function getPrimaryMonitor() { -// try { -// return await _ensureImported().then(imported => imported.primaryMonitor()) -// } -// catch (error) { -// console.error('Failed to get primary monitor:', error) -// return undefined -// } -// } - -// async function setPosition(x: number, y: number) { -// try { -// const imported = await _ensureImported() -// const window = imported.getCurrentWindow() -// return await window.setPosition(await createLogicalPosition(x, y)) -// } -// catch (error) { -// console.error('Failed to set window position:', error) -// } -// } - -// async function getPosition() { -// try { -// const imported = await _ensureImported() -// const window = imported.getCurrentWindow() -// return await window.innerPosition() -// } -// catch (error) { -// console.error('Failed to get window position:', error) -// return undefined -// } -// } - -// async function closeWindow(label?: string) { -// try { -// const imported = await _ensureImported() -// if (!label) { -// const window = imported.getCurrentWindow() -// return await window.close() -// } -// else { -// const windows = await imported.getAllWindows() -// const targetWindow = windows.find(win => win.label === label) -// if (targetWindow) { -// return await targetWindow.close() -// } -// else { -// console.warn(`No window found with label: ${label}`) -// } -// } -// } -// catch (error) { -// console.error('Failed to close window:', error) -// } -// } - -// return { -// getAvailableMonitors, -// getCurrentMonitor, -// getPrimaryMonitor, -// setPosition, -// getPosition, -// closeWindow, -// } -// } - -// export function createTauriEventTarget(): EventTarget { -// const eventTarget = new EventTarget() -// return eventTarget -// } diff --git a/apps/stage-tamagotchi/src/renderer/composables/use-rdev-mouse.ts b/apps/stage-tamagotchi/src/renderer/composables/use-rdev-mouse.ts deleted file mode 100644 index 25abb9777..000000000 --- a/apps/stage-tamagotchi/src/renderer/composables/use-rdev-mouse.ts +++ /dev/null @@ -1,30 +0,0 @@ -// import type { AiriTamagotchiEvents } from './tauri' - -// import { createSharedComposable } from '@vueuse/core' -// import { ref } from 'vue' - -// import { useTauriEvent } from './tauri' - -// export const useRdevMouse = createSharedComposable(() => { -// const mouseX = ref(0) -// const mouseY = ref(0) - -// const { listen } = useTauriEvent() - -// async function setup() { -// await listen('tauri-plugins:tauri-plugin-rdev:mousemove', (event) => { -// if (event.payload.event_type.MouseMove) { -// const { x, y } = event.payload.event_type.MouseMove -// mouseX.value = x -// mouseY.value = y -// } -// }) -// } - -// setup() - -// return { -// mouseX, -// mouseY, -// } -// }) diff --git a/apps/stage-tamagotchi/src/renderer/pages/index.vue b/apps/stage-tamagotchi/src/renderer/pages/index.vue index 93ca574f0..865a93912 100644 --- a/apps/stage-tamagotchi/src/renderer/pages/index.vue +++ b/apps/stage-tamagotchi/src/renderer/pages/index.vue @@ -4,7 +4,7 @@ import { useCanvasPixelIsTransparentAtPoint } from '@proj-airi/stage-ui/composab import { useLive2d } from '@proj-airi/stage-ui/stores/live2d' import { debouncedRef, watchPausable } from '@vueuse/core' import { storeToRefs } from 'pinia' -import { computed, ref, toRef, watch } from 'vue' +import { ref, toRef, watch } from 'vue' import ControlsIsland from '../components/Widgets/ControlsIsland/index.vue' import ResourceStatusIsland from '../components/Widgets/ResourceStatusIsland/index.vue' @@ -12,8 +12,6 @@ import ResourceStatusIsland from '../components/Widgets/ResourceStatusIsland/ind import { electron } from '../../shared/electron' import { useElectronEventaInvoke, useElectronMouseInElement, useElectronRelativeMouse } from '../composables/electron-vueuse' import { useWindowStore } from '../stores/window' -import { useWindowControlStore } from '../stores/window-controls' -import { WindowControlMode } from '../types/window-controls' const resourceStatusIslandRef = ref>() const controlsIslandRef = ref>() @@ -24,7 +22,6 @@ const isPassingThrough = ref(false) const isLoading = ref(true) const componentStateStage = ref<'pending' | 'loading' | 'mounted'>('pending') -const windowControlStore = useWindowControlStore() const { x: relativeMouseX, y: relativeMouseY } = useElectronRelativeMouse() const isTransparent = useCanvasPixelIsTransparentAtPoint(stageCanvas, relativeMouseX, relativeMouseY) const setIgnoreMouseEvents = useElectronEventaInvoke(electron.window.setIgnoreMouseEvents) @@ -34,26 +31,12 @@ const isOutsideFor250Ms = debouncedRef(isOutside, 250) const { scale, positionInPercentageString } = storeToRefs(useLive2d()) const { live2dLookAtX, live2dLookAtY } = storeToRefs(useWindowStore()) -const modeIndicatorClass = computed(() => { - switch (windowControlStore.controlMode) { - case WindowControlMode.MOVE: - return 'cursor-move' - case WindowControlMode.RESIZE: - return 'cursor-se-resize' - case WindowControlMode.DEBUG: - return 'debug-mode' - default: - return '' - } -}) - watch(componentStateStage, () => isLoading.value = componentStateStage.value !== 'mounted', { immediate: true }) const { pause, resume } = watchPausable(isTransparent, (transparent) => { isClickThrough.value = transparent isPassingThrough.value = !transparent - windowControlStore.isIgnoringMouseEvent = !transparent - if (windowControlStore.isIgnoringMouseEvent) { + if (isPassingThrough.value) { setIgnoreMouseEvents([true, { forward: true }]) } else { @@ -65,14 +48,12 @@ watch(isOutsideFor250Ms, () => { if (!isOutsideFor250Ms.value) { isClickThrough.value = false isPassingThrough.value = false - windowControlStore.isIgnoringMouseEvent = false setIgnoreMouseEvents([false, { forward: true }]) pause() } else { isClickThrough.value = true isPassingThrough.value = true - windowControlStore.isIgnoringMouseEvent = true setIgnoreMouseEvents([true, { forward: true }]) resume() } @@ -81,7 +62,6 @@ watch(isOutsideFor250Ms, () => {