package bridge import ( "cursor/internal/buildinfo" "cursor/internal/client" "cursor/internal/updater" "fmt" "os" "os/exec" goruntime "runtime" "sync" "github.com/leaanthony/u" "github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/events" ) // WindowService 定义了当前模块中的 WindowService 类型。 type WindowService struct { app *application.App updater *updater.Manager modelConfigWindow *application.WebviewWindow mu sync.RWMutex } // NewWindowService 用于处理与 NewWindowService 相关的逻辑。 func NewWindowService() *WindowService { return &WindowService{} } // SetApp 用于处理与 SetApp 相关的逻辑。 func (s *WindowService) SetApp(app *application.App) { s.mu.Lock() defer s.mu.Unlock() s.app = app } // SetUpdater 关联更新管理器,供前端手动触发检查更新。 func (s *WindowService) SetUpdater(manager *updater.Manager) { s.mu.Lock() defer s.mu.Unlock() s.updater = manager } // GetAppVersion 返回当前应用版本号。 func (s *WindowService) GetAppVersion() string { return buildinfo.CurrentVersion() } // CheckForUpdates 触发一次手动检查更新。 func (s *WindowService) CheckForUpdates() { s.mu.RLock() manager := s.updater s.mu.RUnlock() if manager == nil { return } manager.CheckNow(true) } // InstallReadyUpdate 安装当前已下载完成的更新。 func (s *WindowService) InstallReadyUpdate() error { s.mu.RLock() manager := s.updater s.mu.RUnlock() if manager == nil { return fmt.Errorf("更新管理器未初始化") } return manager.InstallReadyUpdate() } // OpenConfigWindow 打开本地设置目录。 func (s *WindowService) OpenConfigWindow() { _ = os.MkdirAll(client.ResolveSettingsRootPath(), 0o755) openDirectory(client.ResolveSettingsRootPath()) } // OpenModelConfigWindow 打开模型配置独立窗口。如果窗口已存在则聚焦。 func (s *WindowService) OpenModelConfigWindow() { s.mu.Lock() defer s.mu.Unlock() if s.app == nil { return } if s.modelConfigWindow != nil { s.modelConfigWindow.Show() s.modelConfigWindow.Focus() return } win := s.app.Window.NewWithOptions(application.WebviewWindowOptions{ Title: "模型配置", Width: 980, Height: 700, MinWidth: 980, MinHeight: 700, DisableResize: false, Frameless: goruntime.GOOS == "windows", URL: "/#/model-config", Hidden: false, HideOnEscape: false, MinimiseButtonState: application.ButtonEnabled, MaximiseButtonState: application.ButtonEnabled, CloseButtonState: application.ButtonEnabled, BackgroundColour: application.RGBA{Red: 25, Green: 25, Blue: 25, Alpha: 255}, Mac: application.MacWindow{ Backdrop: application.MacBackdropLiquidGlass, DisableShadow: false, TitleBar: application.MacTitleBar{ AppearsTransparent: true, Hide: false, HideTitle: true, FullSizeContent: true, UseToolbar: false, HideToolbarSeparator: true, }, WebviewPreferences: application.MacWebviewPreferences{ FullscreenEnabled: u.True, TextInteractionEnabled: u.True, AllowsBackForwardNavigationGestures: u.False, }, }, Windows: application.WindowsWindow{ HiddenOnTaskbar: false, }, }) win.RegisterHook(events.Common.WindowClosing, func(e *application.WindowEvent) { s.mu.Lock() defer s.mu.Unlock() s.modelConfigWindow = nil }) s.modelConfigWindow = win } // OpenHistoryWindow 用于处理与 OpenHistoryWindow 相关的逻辑。 func (s *WindowService) OpenHistoryWindow() { _ = os.MkdirAll(client.ResolveLogsRootPath(), 0o755) openDirectory(client.ResolveLogsRootPath()) } // openDirectory 用于处理与 openDirectory 相关的逻辑。 func openDirectory(path string) { if path == "" { return } switch goruntime.GOOS { case "darwin": _ = exec.Command("open", path).Start() case "windows": _ = exec.Command("explorer", path).Start() default: _ = exec.Command("xdg-open", path).Start() } }