Skip to content

Commit e2fa53d

Browse files
committed
Add button to clear the model
1 parent d8a2ff7 commit e2fa53d

File tree

3 files changed

+46
-24
lines changed

3 files changed

+46
-24
lines changed

Source/Yasba/Views/Sieve Script Builder/SieveScriptBuilderView.swift

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import AppKit
77
// MARK: - Root
88

99
struct SieveScriptBuilderView: View {
10-
@State var model: SieveScriptViewModel
10+
@StateObject var model: SieveScriptViewModel
1111
@State private var libraryWidth: CGFloat = 320
1212
@State private var shouldPresentSheet = false
1313
@State private var renderedScriptText: String = ""
@@ -18,13 +18,16 @@ struct SieveScriptBuilderView: View {
1818
Color.primary.colorInvert()
1919
.ignoresSafeArea()
2020

21-
Toolbar() {
22-
renderedScriptText = model.render()
23-
shouldPresentSheet = true
24-
}
21+
Toolbar(
22+
onRender: {
23+
renderedScriptText = model.render()
24+
shouldPresentSheet = true
25+
}, onNew: {
26+
model.clear()
27+
})
2528
.ignoresSafeArea()
2629

27-
SieveScriptView(viewModel: $model)
30+
SieveScriptView(viewModel: model)
2831
.padding([.leading, .top], 24)
2932
.frame(minWidth: 420,
3033
maxWidth: .infinity,
@@ -53,26 +56,38 @@ struct SieveScriptBuilderView: View {
5356
}
5457

5558
private struct Toolbar: View {
56-
var onRender: (() -> Void)
59+
var onRender: () -> Void
60+
var onNew: () -> Void
5761

5862
var body: some View {
59-
HStack {
63+
HStack(spacing: 32) {
6064
Spacer()
61-
Button {
62-
onRender()
63-
} label: {
64-
Image(systemName: "note.text")
65-
.resizable()
66-
.frame(width: 18, height: 18)
67-
}
68-
.buttonStyle(.plain)
69-
65+
ToolbarButton(icon: "document.badge.plus") { onNew() }
66+
ToolbarButton(icon: "note.text") { onRender() }
7067
}
7168
.padding(.trailing, 24)
7269
.frame(height: 50)
7370
}
7471
}
7572

73+
private struct ToolbarButton: View {
74+
private let size: CGFloat = 22
75+
76+
let icon: String
77+
let action: () -> Void
78+
79+
var body: some View {
80+
Button {
81+
action()
82+
} label: {
83+
Image(systemName: icon)
84+
.resizable()
85+
.frame(width: size, height: size)
86+
}
87+
.buttonStyle(.plain)
88+
}
89+
}
90+
7691
#Preview {
7792
SieveScriptBuilderView(model: SieveScriptViewModel())
7893
.frame(width: 1120, height: 720)

Source/Yasba/Views/Sieve Script/SieveScriptView.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import SwiftUI
22
import UniformTypeIdentifiers
33

44
struct SieveScriptView: View {
5-
@Binding private var viewModel: SieveScriptViewModel
5+
@ObservedObject private var viewModel: SieveScriptViewModel
66
@State private var draggedRange: Range<Int>? = nil
77
@State private var dropGapIndex: Int? = nil
88
@State private var rowHeights: [Int: CGFloat] = [:]
@@ -12,6 +12,10 @@ struct SieveScriptView: View {
1212
var tokens: [RowToken] { viewModel.rowTokens }
1313
var indents: [Int] { viewModel.indentation(for: tokens) }
1414

15+
init(viewModel: SieveScriptViewModel) {
16+
self.viewModel = viewModel
17+
}
18+
1519
var filteredIndices: [Int] {
1620
if let span = draggedRange { return Array(tokens.indices).filter { !span.contains($0) } }
1721
return Array(tokens.indices)
@@ -29,10 +33,6 @@ struct SieveScriptView: View {
2933
return CGFloat(indents.last ?? 0) * 24
3034
}
3135

32-
init(viewModel: Binding<SieveScriptViewModel>) {
33-
self._viewModel = viewModel
34-
}
35-
3636
var body: some View {
3737
ZStack(alignment: .center) {
3838
HStack {
@@ -207,10 +207,10 @@ struct SieveScriptView: View {
207207
AddFlagCommand(tag: "Tag 2"),
208208
StopCommand()
209209
])
210-
SieveScriptView(viewModel: $viewModel)
210+
SieveScriptView(viewModel: viewModel)
211211
}
212212

213213
#Preview("Empty") {
214214
@Previewable @State var viewModel = SieveScriptViewModel()
215-
SieveScriptView(viewModel: $viewModel)
215+
SieveScriptView(viewModel: viewModel)
216216
}

Source/Yasba/Views/Sieve Script/SieveScriptViewModel.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,15 @@ final class SieveScriptViewModel: ObservableObject {
5252
func render() -> String {
5353
return scriptRenderer.render(commands: script)
5454
}
55+
56+
func clear() {
57+
applyTokenEdit { tokens in
58+
tokens = []
59+
}
60+
}
5561

5662
private func applyTokenEdit(_ transform: (inout [RowToken]) -> Void) {
63+
objectWillChange.send()
5764
var tokens = mapper.tokens(from: script)
5865
transform(&tokens)
5966
self.script = mapper.script(from: tokens)

0 commit comments

Comments
 (0)