Compare commits

..
Author SHA1 Message Date
gronodandDevin <158243242+devin-ai-integration[bot]@users.noreply.github.com> f43c275152 fix(ui): split ViewBuilders for Swift 5.7 ten-child limit (#146)
Actions run 33666 (Xcode 14.2, macOS 12) failed to compile: the
sidebar VStack had 14 children and SaveMediaRecipeDialog had 13,
over the Swift 5.7 ViewBuilder 10-child cap. Extracted
layout-transparent Group subviews (header/presetBlock/mediaBlock/
studioButtons/stepperAndProject; fields/readOnlyRows) — no id,
order, or layout change.

Refs #146

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-13 13:33:42 +01:00
gronod 48d2816c73 Merge pull request 'docs(m10): defaultInstrument seeds Spot Read; README floor is macOS 12' (#155) from chore/m10-docs-hygiene into milestone/m10-studio
macOS CI / build-and-test (pull_request) Failing after 1m23s
macOS CI / package (pull_request) Skipped
2026-09-13 12:24:23 +01:00
gronodandDevin <158243242+devin-ai-integration[bot]@users.noreply.github.com> b494b4fffd docs(m10): defaultInstrument seeds Spot Read; README floor is macOS 12
Refs #148

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-13 12:23:43 +01:00
gronod c39afe0dfd Merge pull request 'feat(project): .icceryproj index over basename and cwd + recipe + last ΔE (#149)' (#154) from feat/149-project-file into milestone/m10-studio 2026-09-13 11:29:58 +01:00
4 changed files with 50 additions and 7 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ All measurement, chart generation, and profile mathematics live in the [Gronod A
|---|---|
| Product | ICCery v2 for macOS |
| Bundle | `com.gronod.iccery2` |
| Floor | macOS 14 Sonoma, universal `arm64` + `x86_64` |
| Floor | macOS 12.0 Monterey, universal `arm64` + `x86_64` |
| Default branch | `develop` |
| M6 | Stage 0 calibration, CGATS import, SceneKit gamut viewer, packaging — shipped on `develop` |
| M7 | Pre-UAT hardening & baseline consolidation — shipped on `develop` |
+17 -3
View File
@@ -46,9 +46,11 @@ struct SaveMediaRecipeDialog: View {
|| media.captureColourSpaceMismatch
}
var body: some View {
VStack(alignment: .leading, spacing: 14) {
Text("Save Media Recipe").font(.title3).foregroundStyle(Theme.text)
// Swift 5.7 (Xcode 14.2 CI runner) caps a ViewBuilder body at 10
// children (#146); Group blocks are layout-transparent, so field
// order and every docs/21 id are unchanged.
private var fields: some View {
Group {
TextField("Name", text: $media.saveMediaName)
.textFieldStyle(.roundedBorder)
.accessibilityIdentifier("saveMediaName")
@@ -61,7 +63,11 @@ struct SaveMediaRecipeDialog: View {
TextField("Ink set", text: $media.saveMediaInk)
.textFieldStyle(.roundedBorder)
.accessibilityIdentifier("saveMediaInk")
}
}
private var readOnlyRows: some View {
Group {
captureRow("Printer", value: printerCaption,
identifier: "saveMediaPrinter")
captureRow("Preset",
@@ -74,6 +80,14 @@ struct SaveMediaRecipeDialog: View {
value: workflow.profile.calibrationFile.isEmpty
? "None" : workflow.profile.calibrationFile,
identifier: "saveMediaCal")
}
}
var body: some View {
VStack(alignment: .leading, spacing: 14) {
Text("Save Media Recipe").font(.title3).foregroundStyle(Theme.text)
fields
readOnlyRows
Toggle("Apply calibration to profile",
isOn: $media.saveMediaApplyCal)
.disabled(!media.calApplyable)
+31 -2
View File
@@ -37,6 +37,21 @@ struct SidebarView: View {
var body: some View {
VStack(alignment: .leading, spacing: 0) {
header
presetBlock
mediaBlock
studioButtons
stepperAndProject
}
.frame(width: Theme.Metrics.sidebarWidth)
.background(Theme.panel)
}
// Swift 5.7 (Xcode 14.2 CI runner) caps a ViewBuilder body at 10
// children (#146); these Group blocks are layout-transparent, so
// visual order, ids and the 270 pt column are unchanged.
private var header: some View {
Group {
HStack {
Image("ICCery-logo")
.resizable()
@@ -65,7 +80,11 @@ struct SidebarView: View {
.padding(12)
Divider().overlay(Theme.border)
}
}
private var presetBlock: some View {
Group {
// Preset select (`#presetSelect`) issue #11. Selection
// applies the preset immediately; names render via Text only.
Picker("Preset", selection: Binding(
@@ -97,7 +116,11 @@ struct SidebarView: View {
}
.padding(.horizontal, 12)
.padding(.bottom, 8)
}
}
private var mediaBlock: some View {
Group {
// Media library (`#mediaSelect`) issue #146. Selection
// applies the recipe immediately, like presets; names render
// via Text only (#114). Never reuses `presetSelect` (#137).
@@ -147,7 +170,11 @@ struct SidebarView: View {
}
.padding(.horizontal, 12)
.padding(.bottom, 8)
}
}
private var studioButtons: some View {
Group {
// Calibrate Printer (`#btnCalibratePrinter`).
Button(action: { model.enterCalibration() }) {
Label("Calibrate Printer", systemImage: "slider.horizontal.3")
@@ -187,7 +214,11 @@ struct SidebarView: View {
showing: $showingAllHelp)
.accessibilityIdentifier("btnSpotRead")
.padding(.horizontal, 12)
}
}
private var stepperAndProject: some View {
Group {
Divider().overlay(Theme.border)
.padding(.vertical, 8)
@@ -214,8 +245,6 @@ struct SidebarView: View {
ProjectChip(project: project, showingAllHelp: $showingAllHelp)
.padding(8)
}
.frame(width: Theme.Metrics.sidebarWidth)
.background(Theme.panel)
}
}
+1 -1
View File
@@ -7,7 +7,7 @@ Persisted at `{app_data}/settings.json` via `load_settings` / `save_settings`. I
| Field | Default | Notes |
|-------|---------|-------|
| `argyll_binary_dir` | `null` | Overrides bundled sidecars. `resolve_binary` checks this first. |
| `default_instrument` | `null` | **Stored but not applied to argv.** Stage 2 `#instrumentSelect` is the source of truth. Do not start honouring this without an explicit product decision. |
| `default_instrument` | `null` | Stored; seeds the Spot Read instrument picker when that instrument is present (#148). **Never** written into `printtarg -i` or `targen` argv. Stage 2 `#instrumentSelect` remains the printtarg instrument. |
| `log_level` | `null` | `error` / `warn` / `info` / `debug` / `trace`. `null` → Debug in debug builds, Info in release. Applied at startup **and** on save (#158). |
| `delta_e_good_max` | `2.0` | Stage 3 swatch traffic-light "Good". Must be ≥ 0. |
| `delta_e_warning_max` | `5.0` | Stage 3 "Warning" band. Must be **strictly greater** than good. |