SPB Git

spb/zyquo-atlas Public License

The AI-native macOS web browser — every surface, intelligent.

Swift 75.2% JavaScript 22% Shell 2% Makefile 0.9%
2.9 KB · 86 lines swift
Raw Blame History
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