|
1 | 1 | import SwiftUI
|
2 | 2 |
|
3 |
| -func logLayoutStep(_ label: String, step: LogItem.Step, indent: Int) { |
| 3 | +func logLayoutStep(_ label: String, step: LogItem.Step) { |
4 | 4 | DispatchQueue.main.async {
|
5 |
| - // Coalesce layout steps if the response follows immediately after the proposal |
6 |
| - // for the same view. |
7 |
| - // |
8 |
| - // In this case, proposal and response can be shown in a single row in the log. |
9 |
| - if var lastLogItem = LogStore.shared.log.last, |
10 |
| - lastLogItem.label == label, |
11 |
| - case .proposal(let proposal) = lastLogItem.step, |
12 |
| - case .response(let response) = step |
13 |
| - { |
| 5 | + guard let prevEntry = LogStore.shared.log.last else { |
| 6 | + // First log entry → start at indent 0. |
| 7 | + LogStore.shared.log.append(LogItem(label: label, step: step, indent: 0)) |
| 8 | + return |
| 9 | + } |
| 10 | + |
| 11 | + var newEntry = LogItem(label: label, step: step, indent: prevEntry.indent) |
| 12 | + let isSameView = prevEntry.label == label |
| 13 | + switch (isSameView, prevEntry.step, step) { |
| 14 | + case (true, .proposal(let prop), .response(let resp)): |
| 15 | + // Response follows immediately after proposal for the same view. |
| 16 | + // → We want to display them in a single row. |
| 17 | + // → Coalesce both layout steps. |
14 | 18 | LogStore.shared.log.removeLast()
|
15 |
| - lastLogItem.step = .proposalAndResponse(proposal: proposal, response: response) |
16 |
| - LogStore.shared.log.append(lastLogItem) |
17 |
| - } else { |
18 |
| - LogStore.shared.log.append(.init(label: label, step: step, indent: indent)) |
| 19 | + newEntry = prevEntry |
| 20 | + newEntry.step = .proposalAndResponse(proposal: prop, response: resp) |
| 21 | + LogStore.shared.log.append(newEntry) |
| 22 | + |
| 23 | + case (_, .proposal, .proposal): |
| 24 | + // A proposal follows a proposal → nested view → increment indent. |
| 25 | + newEntry.indent += 1 |
| 26 | + LogStore.shared.log.append(newEntry) |
| 27 | + |
| 28 | + case (_, .response, .response), |
| 29 | + (_, .proposalAndResponse, .response): |
| 30 | + // A response follows a response → last child returns to parent → decrement indent. |
| 31 | + newEntry.indent -= 1 |
| 32 | + LogStore.shared.log.append(newEntry) |
| 33 | + |
| 34 | + default: |
| 35 | + // Keep current indentation. |
| 36 | + LogStore.shared.log.append(newEntry) |
19 | 37 | }
|
20 | 38 | }
|
21 | 39 | }
|
|
0 commit comments