@@ -18,13 +18,42 @@ struct StatusView: View {
18
18
if case . running = generation. state { return }
19
19
Task {
20
20
generation. state = . running( nil )
21
- let interval : TimeInterval ?
22
- let image : CGImage ?
23
- ( image, interval) = await generation. generate ( ) ?? ( nil , nil )
24
- generation. state = . complete( generation. positivePrompt, image, interval)
21
+ do {
22
+ let result = try await generation. generate ( )
23
+ generation. state = . complete( generation. positivePrompt, result. image, result. lastSeed, result. interval)
24
+ } catch {
25
+ generation. state = . failed( error)
26
+ }
25
27
}
26
28
}
27
-
29
+
30
+ func errorWithDetails( _ message: String , error: Error ) -> any View {
31
+ HStack {
32
+ Text ( message)
33
+ Spacer ( )
34
+ Button {
35
+ showErrorPopover. toggle ( )
36
+ } label: {
37
+ Image ( systemName: " info.circle " )
38
+ } . buttonStyle ( . plain)
39
+ . popover ( isPresented: $showErrorPopover) {
40
+ VStack {
41
+ Text ( verbatim: " \( error) " )
42
+ . lineLimit ( nil )
43
+ . padding ( . all, 5 )
44
+ Button {
45
+ showErrorPopover. toggle ( )
46
+ } label: {
47
+ Text ( " Dismiss " ) . frame ( maxWidth: 200 )
48
+ }
49
+ . padding ( . bottom)
50
+ }
51
+ . frame ( minWidth: 400 , idealWidth: 400 , maxWidth: 400 )
52
+ . fixedSize ( )
53
+ }
54
+ }
55
+ }
56
+
28
57
func generationStatusView( ) -> any View {
29
58
switch generation. state {
30
59
case . startup: return EmptyView ( )
@@ -42,7 +71,7 @@ struct StatusView: View {
42
71
Text ( " Generating \( Int ( round ( 100 * fraction) ) ) % " )
43
72
Spacer ( )
44
73
}
45
- case . complete( _, let image, let interval) :
74
+ case . complete( _, let image, let lastSeed , let interval) :
46
75
guard let _ = image else {
47
76
return HStack {
48
77
Text ( " Safety checker triggered, please try a different prompt or seed " )
@@ -55,9 +84,11 @@ struct StatusView: View {
55
84
Text ( intervalString)
56
85
Spacer ( )
57
86
} . frame ( maxHeight: 25 )
87
+ case . failed( let error) :
88
+ return errorWithDetails ( " Generation error " , error: error)
58
89
}
59
90
}
60
-
91
+
61
92
var body : some View {
62
93
switch pipelineState. wrappedValue {
63
94
case . downloading( let progress) :
@@ -80,30 +111,7 @@ struct StatusView: View {
80
111
AnyView ( generationStatusView ( ) )
81
112
}
82
113
case . failed( let error) :
83
- HStack {
84
- Text ( " Pipeline loading error " )
85
- Spacer ( )
86
- Button {
87
- showErrorPopover. toggle ( )
88
- } label: {
89
- Image ( systemName: " info.circle " )
90
- } . buttonStyle ( . plain)
91
- . popover ( isPresented: $showErrorPopover) {
92
- VStack {
93
- Text ( verbatim: " \( error) " )
94
- . lineLimit ( nil )
95
- . padding ( . all, 5 )
96
- Button {
97
- showErrorPopover. toggle ( )
98
- } label: {
99
- Text ( " Dismiss " ) . frame ( maxWidth: 200 )
100
- }
101
- . padding ( . bottom)
102
- }
103
- . frame ( minWidth: 400 , idealWidth: 400 , maxWidth: 400 )
104
- . fixedSize ( )
105
- }
106
- }
114
+ AnyView ( errorWithDetails ( " Pipeline loading error " , error: error) )
107
115
}
108
116
}
109
117
}
0 commit comments