Skip to content

Commit

Permalink
Fix launch behavior
Browse files Browse the repository at this point in the history
Fixes #23
Fixes #371
  • Loading branch information
jordanbaird committed Oct 1, 2024
1 parent 5720a99 commit ab9857d
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 41 deletions.
36 changes: 13 additions & 23 deletions Ice/Main/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
return
}

// Assign and close the various windows.
let windowAssignments: KeyValuePairs = [
Constants.settingsWindowID: appState.assignSettingsWindow,
Constants.permissionsWindowID: appState.assignPermissionsWindow,
]
for (identifier, assign) in windowAssignments {
if let window = NSApp.window(withIdentifier: identifier) {
assign(window)
window.close()
}
}
// Dismiss the windows.
appState.dismissSettingsWindow()
appState.dismissPermissionsWindow()

// Hide the main menu to make more space in the menu bar.
if let mainMenu = NSApp.mainMenu {
Expand All @@ -52,17 +44,19 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
}
}

if !appState.isPreview {
// Perform setup after a small delay to ensure that the settings window
// has been assigned.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
guard !appState.isPreview else {
return
}
// If we have the required permissions, set up the shared app state.
// Otherwise, open the permissions window.
if appState.permissionsManager.hasAllPermissions {
appState.performSetup()
} else if let permissionsWindow = appState.permissionsWindow {
appState.activate(withPolicy: .regular)
permissionsWindow.center()
permissionsWindow.makeKeyAndOrderFront(nil)
} else {
Logger.appDelegate.error("Failed to open permissions window")
appState.activate(withPolicy: .regular)
appState.openPermissionsWindow()
}
}
}
Expand Down Expand Up @@ -90,18 +84,14 @@ final class AppDelegate: NSObject, NSApplicationDelegate {

/// Opens the settings window and activates the app.
@objc func openSettingsWindow() {
guard
let appState,
let settingsWindow = appState.settingsWindow
else {
guard let appState else {
Logger.appDelegate.error("Failed to open settings window")
return
}
// Small delay makes this more reliable.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
appState.activate(withPolicy: .regular)
settingsWindow.center()
settingsWindow.makeKeyAndOrderFront(nil)
appState.openSettingsWindow()
}
}
}
Expand Down
46 changes: 38 additions & 8 deletions Ice/Main/AppState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -188,21 +188,51 @@ final class AppState: ObservableObject {
}

/// Assigns the settings window to the app state.
func assignSettingsWindow(_ settingsWindow: NSWindow) {
guard self.settingsWindow == nil else {
Logger.appState.warning("Multiple attempts made to assign settings window")
func assignSettingsWindow(_ window: NSWindow) {
guard window.identifier?.rawValue == Constants.settingsWindowID else {
Logger.appState.warning("Window \(window.identifier?.rawValue ?? "<NIL>") is not the settings window!")
return
}
self.settingsWindow = settingsWindow
settingsWindow = window
configureCancellables()
}

/// Assigns the permissions window to the app state.
func assignPermissionsWindow(_ permissionsWindow: NSWindow) {
guard self.permissionsWindow == nil else {
Logger.appState.warning("Multiple attempts made to assign permissions window")
func assignPermissionsWindow(_ window: NSWindow) {
guard window.identifier?.rawValue == Constants.permissionsWindowID else {
Logger.appState.warning("Window \(window.identifier?.rawValue ?? "<NIL>") is not the permissions window!")
return
}
self.permissionsWindow = permissionsWindow
permissionsWindow = window
configureCancellables()
}

/// Opens the settings window.
func openSettingsWindow() {
with(EnvironmentValues()) { environment in
environment.openWindow(id: Constants.settingsWindowID)
}
}

/// Dismisses the settings window.
func dismissSettingsWindow() {
with(EnvironmentValues()) { environment in
environment.dismissWindow(id: Constants.settingsWindowID)
}
}

/// Opens the permissions window.
func openPermissionsWindow() {
with(EnvironmentValues()) { environment in
environment.openWindow(id: Constants.permissionsWindowID)
}
}

/// Dismisses the permissions window.
func dismissPermissionsWindow() {
with(EnvironmentValues()) { environment in
environment.dismissWindow(id: Constants.permissionsWindowID)
}
}

/// Activates the app and sets its activation policy to the given value.
Expand Down
14 changes: 8 additions & 6 deletions Ice/Permissions/PermissionsWindow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,20 @@
import SwiftUI

struct PermissionsWindow: Scene {
@ObservedObject var permissionsManager: PermissionsManager

init(appState: AppState) {
self.permissionsManager = appState.permissionsManager
}
@ObservedObject var appState: AppState

var body: some Scene {
Window(Constants.permissionsWindowTitle, id: Constants.permissionsWindowID) {
PermissionsView()
.readWindow { window in
guard let window else {
return
}
appState.assignPermissionsWindow(window)
}
}
.windowResizability(.contentSize)
.windowStyle(.hiddenTitleBar)
.environmentObject(permissionsManager)
.environmentObject(appState.permissionsManager)
}
}
8 changes: 4 additions & 4 deletions Ice/Settings/SettingsWindow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ import SwiftUI

struct SettingsWindow: Scene {
@ObservedObject var appState: AppState
@Environment(\.openWindow) private var openWindow

var body: some Scene {
Window(Constants.settingsWindowTitle, id: Constants.settingsWindowID) {
SettingsView()
.onAppear {
if !appState.permissionsManager.hasAllPermissions {
openWindow(id: Constants.permissionsWindowID)
.readWindow { window in
guard let window else {
return
}
appState.assignSettingsWindow(window)
}
}
.commandsRemoved()
Expand Down

0 comments on commit ab9857d

Please sign in to comment.