+
Settings
Manage your HaexHub preferences and configuration
@@ -21,9 +21,7 @@
-
- Theme
-
+
Theme
Choose your preferred theme
@@ -65,7 +63,6 @@
Lock vault after inactivity
-
@@ -77,12 +74,20 @@
- Version
- 0.1.0
+ Version
+ 0.1.0
- Platform
- Tauri + Vue
+ Platform
+ Tauri + Vue
diff --git a/src/stores/desktop/index.ts b/src/stores/desktop/index.ts
index bc1c227..a6a55ac 100644
--- a/src/stores/desktop/index.ts
+++ b/src/stores/desktop/index.ts
@@ -163,15 +163,13 @@ export const useDesktopStore = defineStore('desktopStore', () => {
)
if (extension) {
- windowManager.openWindow(
- 'extension',
- extension.id,
- extension.name,
- extension.icon || undefined,
- undefined, // Use default viewport-aware width
- undefined, // Use default viewport-aware height
+ windowManager.openWindowAsync({
+ sourceId: extension.id,
+ type: 'extension',
+ icon: extension.icon,
+ title: extension.name,
sourcePosition,
- )
+ })
}
}
// Für später: file und folder handling
diff --git a/src/stores/desktop/windowManager.ts b/src/stores/desktop/windowManager.ts
index 73974f3..edca67c 100644
--- a/src/stores/desktop/windowManager.ts
+++ b/src/stores/desktop/windowManager.ts
@@ -6,7 +6,7 @@ export interface IWindow {
type: 'system' | 'extension'
sourceId: string // extensionId or systemWindowId (depends on type)
title: string
- icon?: string
+ icon?: string | null
x: number
y: number
width: number
@@ -35,9 +35,6 @@ export interface SystemWindowDefinition {
}
export const useWindowManagerStore = defineStore('windowManager', () => {
- const workspaceStore = useWorkspaceStore()
- const { currentWorkspace, workspaces } = storeToRefs(workspaceStore)
-
const windows = ref
([])
const activeWindowId = ref(null)
const nextZIndex = ref(100)
@@ -83,9 +80,9 @@ export const useWindowManagerStore = defineStore('windowManager', () => {
// Get windows for current workspace only
const currentWorkspaceWindows = computed(() => {
- if (!currentWorkspace.value) return []
+ if (!useWorkspaceStore().currentWorkspace) return []
return windows.value.filter(
- (w) => w.workspaceId === currentWorkspace.value?.id,
+ (w) => w.workspaceId === useWorkspaceStore().currentWorkspace?.id,
)
})
@@ -102,18 +99,18 @@ export const useWindowManagerStore = defineStore('windowManager', () => {
windowsFrom.value.forEach((window) => (window.workspaceId = toWorkspaceId))
}
- const openWindow = ({
- height,
- icon,
+ const openWindowAsync = async ({
+ height = 800,
+ icon = '',
sourceId,
sourcePosition,
title,
type,
- width,
+ width = 600,
workspaceId,
}: {
height?: number
- icon?: string
+ icon?: string | null
sourceId: string
sourcePosition?: { x: number; y: number; width: number; height: number }
title?: string
@@ -121,107 +118,105 @@ export const useWindowManagerStore = defineStore('windowManager', () => {
width?: number
workspaceId?: string
}) => {
- // Wenn kein workspaceId angegeben ist, nutze die current workspace
- const targetWorkspaceId = workspaceId || currentWorkspace.value?.id
+ try {
+ // Wenn kein workspaceId angegeben ist, nutze die current workspace
+ const targetWorkspaceId =
+ workspaceId || useWorkspaceStore().currentWorkspace?.id
- if (!targetWorkspaceId) {
- console.error('Cannot open window: No active workspace')
- return
- }
-
- // Sicherheitscheck
- if (!targetWorkspaceId) {
- console.error('Cannot open window: No workspace available')
- return
- }
-
- const workspace = workspaces.value?.find((w) => w.id === targetWorkspaceId)
- if (!workspace) {
- console.error('Cannot open window: Invalid workspace')
- return
- }
-
- // System Window specific handling
- if (type === 'system') {
- const systemWindowDef = getSystemWindow(sourceId)
- if (!systemWindowDef) {
- console.error(`System window '${sourceId}' not found in registry`)
+ if (!targetWorkspaceId) {
+ console.error('Cannot open window: No active workspace')
return
}
- // Singleton check: If already open, activate existing window
- if (systemWindowDef.singleton) {
- const existingWindow = windows.value.find(
- (w) => w.type === 'system' && w.sourceId === sourceId,
- )
- if (existingWindow) {
- activateWindow(existingWindow.id)
- return existingWindow.id
+ const workspace = useWorkspaceStore().workspaces?.find(
+ (w) => w.id === targetWorkspaceId,
+ )
+ if (!workspace) {
+ console.error('Cannot open window: Invalid workspace')
+ return
+ }
+
+ // System Window specific handling
+ if (type === 'system') {
+ const systemWindowDef = getSystemWindow(sourceId)
+ if (!systemWindowDef) {
+ console.error(`System window '${sourceId}' not found in registry`)
+ return
}
+
+ // Singleton check: If already open, activate existing window
+ if (systemWindowDef.singleton) {
+ const existingWindow = windows.value.find(
+ (w) => w.type === 'system' && w.sourceId === sourceId,
+ )
+ if (existingWindow) {
+ activateWindow(existingWindow.id)
+ return existingWindow.id
+ }
+ }
+
+ // Use system window defaults
+ title = title ?? systemWindowDef.name
+ icon = icon ?? systemWindowDef.icon
+ width = width ?? systemWindowDef.defaultWidth
+ height = height ?? systemWindowDef.defaultHeight
}
- // Use system window defaults
- title = title ?? systemWindowDef.name
- icon = icon ?? systemWindowDef.icon
- width = width ?? systemWindowDef.defaultWidth
- height = height ?? systemWindowDef.defaultHeight
- }
+ // Create new window
+ const windowId = crypto.randomUUID()
- // Create new window
- const windowId = crypto.randomUUID()
+ // Calculate viewport-aware size
+ const viewportWidth = window.innerWidth
+ const viewportHeight = window.innerHeight
- // Calculate viewport-aware size
- const viewportWidth = window.innerWidth
- const viewportHeight = window.innerHeight
- const isMobile = viewportWidth < 768 // Tailwind md breakpoint
+ const windowWidth = width > viewportWidth ? viewportWidth : width
+ const windowHeight = height > viewportHeight ? viewportHeight : height
- // Default size based on viewport
- const defaultWidth = isMobile ? Math.floor(viewportWidth * 0.95) : 800
- const defaultHeight = isMobile ? Math.floor(viewportHeight * 0.85) : 600
+ // Calculate centered position with cascading offset (only count windows in current workspace)
+ const offset = currentWorkspaceWindows.value.length * 30
+ const centerX = Math.max(0, (viewportWidth - windowWidth) / 1 / 3)
+ const centerY = Math.max(0, (viewportHeight - windowHeight) / 1 / 3)
+ const x = Math.min(centerX + offset, viewportWidth - windowWidth)
+ const y = Math.min(centerY + offset, viewportHeight - windowHeight)
- const windowWidth = width ?? defaultWidth
- const windowHeight = height ?? defaultHeight
-
- // Calculate centered position with cascading offset (only count windows in current workspace)
- const offset = currentWorkspaceWindows.value.length * 30
- const centerX = Math.max(0, (viewportWidth - windowWidth) / 2)
- const centerY = Math.max(0, (viewportHeight - windowHeight) / 2)
- const x = Math.min(centerX + offset, viewportWidth - windowWidth)
- const y = Math.min(centerY + offset, viewportHeight - windowHeight)
-
- const newWindow: IWindow = {
- id: windowId,
- workspaceId: workspace.id,
- type,
- sourceId,
- title: title!,
- icon,
- x,
- y,
- width: windowWidth,
- height: windowHeight,
- isMinimized: false,
- zIndex: nextZIndex.value++,
- sourceX: sourcePosition?.x,
- sourceY: sourcePosition?.y,
- sourceWidth: sourcePosition?.width,
- sourceHeight: sourcePosition?.height,
- isOpening: true,
- isClosing: false,
- }
-
- windows.value.push(newWindow)
- activeWindowId.value = windowId
-
- // Remove opening flag after animation
- setTimeout(() => {
- const window = windows.value.find((w) => w.id === windowId)
- if (window) {
- window.isOpening = false
+ const newWindow: IWindow = {
+ id: windowId,
+ workspaceId: workspace.id,
+ type,
+ sourceId,
+ title: title!,
+ icon,
+ x,
+ y,
+ width: windowWidth,
+ height: windowHeight,
+ isMinimized: false,
+ zIndex: nextZIndex.value++,
+ sourceX: sourcePosition?.x,
+ sourceY: sourcePosition?.y,
+ sourceWidth: sourcePosition?.width,
+ sourceHeight: sourcePosition?.height,
+ isOpening: true,
+ isClosing: false,
}
- }, windowAnimationDuration.value)
- return windowId
+ windows.value.push(newWindow)
+ activeWindowId.value = windowId
+
+ // Remove opening flag after animation
+ setTimeout(() => {
+ const window = windows.value.find((w) => w.id === windowId)
+ if (window) {
+ window.isOpening = false
+ }
+ }, windowAnimationDuration.value)
+
+ return windowId
+ } catch (error) {
+ console.error('Error opening window:', error)
+ // Optional: Fehler weiterwerfen wenn nötig
+ throw error
+ }
}
/*****************************************************************************************************
@@ -324,7 +319,7 @@ export const useWindowManagerStore = defineStore('windowManager', () => {
isWindowActive,
minimizeWindow,
moveWindowsToWorkspace,
- openWindow,
+ openWindowAsync,
restoreWindow,
updateWindowPosition,
updateWindowSize,