- AppSettings: snake_case Codable model — argyll_binary_dir, default_instrument (stored, never applied to argv), log_level (nil -> Debug debug / Info release), delta_e thresholds (2.0/5.0), custom_presets, enable_i1pro2_leds, calibration_stale_days 30, default_install_location user, ask_before_overwrite_profile, open_color_panel_after_install - Validation with the exact contract strings; save() refuses invalid settings; corrupt/missing JSON -> defaults; settingsDidChange notification posted on save (for #20) - LogSink: rolling file at ~/Library/Logs/com.gronod.iccery2/ iccery.log, 5 MiB x 5 segments, runtime setLevel applied at startup and on save (#158); AppLogger gates os_log+file through it - SettingsView sheet: Argyll dir picker, instrument (display-only caveat), i1Pro2 LEDs, ΔE fields + inline errors, stale days, install location, overwrite + ColorSync toggles, log level, open-log-folder / copy-path / copy-excerpt - v1 settings path never read; writes atomic via AtomicFileWriter - 13 new tests; 60/60 green Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
41 lines
1.3 KiB
Swift
41 lines
1.3 KiB
Swift
import SwiftUI
|
|
|
|
/// Root layout: 270 pt sidebar + main stage area with the notification
|
|
/// banner pinned to the top (docs/21 §Shell).
|
|
struct RootView: View {
|
|
@Bindable var model: WizardViewModel
|
|
@State private var showingSettings = false
|
|
@State private var showingAbout = false
|
|
|
|
var body: some View {
|
|
HStack(spacing: 0) {
|
|
SidebarView(
|
|
model: model,
|
|
onOpenSettings: { showingSettings = true },
|
|
onOpenAbout: { showingAbout = true }
|
|
)
|
|
|
|
Rectangle()
|
|
.fill(Theme.border)
|
|
.frame(width: 1)
|
|
|
|
VStack(spacing: 0) {
|
|
if let notice = model.notice {
|
|
NoticeBanner(notice: notice, onClose: model.dismissNotice)
|
|
}
|
|
StagePlaceholderView(stage: model.stage)
|
|
}
|
|
}
|
|
.frame(minWidth: 1100, minHeight: 700)
|
|
.background(Theme.background)
|
|
.sheet(isPresented: $showingSettings) {
|
|
SettingsView()
|
|
}
|
|
.alert("ICCery 2.0.0", isPresented: $showingAbout) {
|
|
Button("OK") {}
|
|
} message: {
|
|
Text("Native macOS printer profiling workstation.\nFull About dialog lands in issue #31.")
|
|
}
|
|
}
|
|
}
|