// // WindowState.swift // Zyquo Atlas // // Author: Simon-Pierre Boucher // Mail: contact@spboucher.ai // // Per-window UI state and the command target. Held by BrowserWindowView and // published as a focused-scene value so the app's menu/keyboard commands // (AtlasCommands) route to whichever window is focused. Panels (find, // history, bookmarks, downloads, AI) are driven by these published flags. // import SwiftUI import Combine @MainActor final class WindowState: ObservableObject { weak var tabManager: TabManager? weak var env: AppEnvironment? @Published var showAISidebar = false @Published var showFindBar = false @Published var showHistory = false @Published var showBookmarksManager = false @Published var showDownloads = false @Published var showCustomize = false @Published var showReader = false /// Incremented to ask the omnibox to take focus (⌘L). @Published var omniboxFocusToken = 0 /// A pending "ask AI" query from the omnibox, with a token to trigger it. @Published var pendingAskToken = 0 var pendingAsk: String? /// A pending selection action (from the floating selection toolbar). @Published var pendingSelectionToken = 0 var pendingSelection: (action: AIAction, text: String)? /// Routes a selection action to the AI sidebar. func runSelection(_ action: AIAction, text: String) { pendingSelection = (action, text) showAISidebar = true pendingSelectionToken += 1 } // MARK: - Command actions func newTab() { tabManager?.newTab() } func closeActiveTab() { if let id = tabManager?.activeTabID { tabManager?.closeTab(id) } } func focusOmnibox() { omniboxFocusToken += 1 } func quickAsk() { showAISidebar = true; focusOmnibox() } func toggleAISidebar() { showAISidebar.toggle() } func toggleReader() { showReader.toggle() } /// Routes an omnibox "ask AI" query to the AI sidebar. func askOmnibox(_ query: String) { pendingAsk = query showAISidebar = true pendingAskToken += 1 } func toggleFind() { showFindBar.toggle() } func reload() { tabManager?.activeTab?.reload() } func goBack() { tabManager?.activeTab?.goBack() } func goForward() { tabManager?.activeTab?.goForward() } func selectTab(_ index: Int) { tabManager?.selectTab(atIndex: index) } func selectLastTab() { if let n = tabManager?.tabs.count, n > 0 { tabManager?.selectTab(atIndex: n - 1) } } func toggleBookmarkActiveTab() { guard let tab = tabManager?.activeTab, let url = tab.url?.absoluteString, let bookmarks = env?.bookmarks else { return } bookmarks.toggle(title: tab.title, url: url) } } // MARK: - Focused value plumbing private struct WindowStateKey: FocusedValueKey { typealias Value = WindowState } extension FocusedValues { var windowState: WindowState? { get { self[WindowStateKey.self] } set { self[WindowStateKey.self] = newValue } } }