spb/zyquo-atlas Public License
The AI-native macOS web browser — every surface, intelligent.
Swift 75.2%
JavaScript 22%
Shell 2%
Makefile 0.9%
1//2// WindowState.swift3// Zyquo Atlas4//5// Author: Simon-Pierre Boucher6// Mail: contact@spboucher.ai7//8// Per-window UI state and the command target. Held by BrowserWindowView and9// published as a focused-scene value so the app's menu/keyboard commands10// (AtlasCommands) route to whichever window is focused. Panels (find,11// history, bookmarks, downloads, AI) are driven by these published flags.12//1314import SwiftUI15import Combine1617@MainActor18final class WindowState: ObservableObject {19 weak var tabManager: TabManager?20 weak var env: AppEnvironment?2122 @Published var showAISidebar = false23 @Published var showFindBar = false24 @Published var showHistory = false25 @Published var showBookmarksManager = false26 @Published var showDownloads = false27 @Published var showCustomize = false28 @Published var showReader = false29 /// Incremented to ask the omnibox to take focus (⌘L).30 @Published var omniboxFocusToken = 031 /// A pending "ask AI" query from the omnibox, with a token to trigger it.32 @Published var pendingAskToken = 033 var pendingAsk: String?34 /// A pending selection action (from the floating selection toolbar).35 @Published var pendingSelectionToken = 036 var pendingSelection: (action: AIAction, text: String)?3738 /// Routes a selection action to the AI sidebar.39 func runSelection(_ action: AIAction, text: String) {40 pendingSelection = (action, text)41 showAISidebar = true42 pendingSelectionToken += 143 }4445 // MARK: - Command actions4647 func newTab() { tabManager?.newTab() }48 func closeActiveTab() { if let id = tabManager?.activeTabID { tabManager?.closeTab(id) } }49 func focusOmnibox() { omniboxFocusToken += 1 }50 func quickAsk() { showAISidebar = true; focusOmnibox() }51 func toggleAISidebar() { showAISidebar.toggle() }52 func toggleReader() { showReader.toggle() }5354 /// Routes an omnibox "ask AI" query to the AI sidebar.55 func askOmnibox(_ query: String) {56 pendingAsk = query57 showAISidebar = true58 pendingAskToken += 159 }60 func toggleFind() { showFindBar.toggle() }61 func reload() { tabManager?.activeTab?.reload() }62 func goBack() { tabManager?.activeTab?.goBack() }63 func goForward() { tabManager?.activeTab?.goForward() }64 func selectTab(_ index: Int) { tabManager?.selectTab(atIndex: index) }65 func selectLastTab() { if let n = tabManager?.tabs.count, n > 0 { tabManager?.selectTab(atIndex: n - 1) } }6667 func toggleBookmarkActiveTab() {68 guard let tab = tabManager?.activeTab, let url = tab.url?.absoluteString,69 let bookmarks = env?.bookmarks else { return }70 bookmarks.toggle(title: tab.title, url: url)71 }72}7374// MARK: - Focused value plumbing7576private struct WindowStateKey: FocusedValueKey {77 typealias Value = WindowState78}7980extension FocusedValues {81 var windowState: WindowState? {82 get { self[WindowStateKey.self] }83 set { self[WindowStateKey.self] = newValue }84 }85}86