Skip to content

Commit d31ca5c

Browse files
committed
WinUIBackend: Implement progress bar/spinner support
1 parent 41f7e10 commit d31ca5c

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

Sources/WinUIBackend/WinUIBackend.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,15 @@ public final class WinUIBackend: AppBackend {
449449
// The default minimum picker height is 32 pixels
450450
max(Int(labelSize.height) + 12, 32)
451451
)
452+
} else if let spinner = widget as? ProgressRing {
453+
// ProgressRing appears to kind of grow to fill by default, but
454+
// SwiftCrossUI expects progress spinners to be fixed size, which
455+
// results in WinUI progress rings getting given astronomically
456+
// large fixed dimensions and causing crashes. To work around that,
457+
// we just override their 'natural size' to 32x32, which is based off
458+
// the defaults set in the following code from the WinUI repository:
459+
// https://github.com/marcelwgn/microsoft-ui-xaml/blob/ff21f9b212cea2191b959649e45e52486c8465aa/src/controls/dev/ProgressRing/ProgressRing.xaml#L12
460+
return SIMD2(32, 32)
452461
}
453462

454463
let oldWidth = widget.width
@@ -1117,6 +1126,32 @@ public final class WinUIBackend: AppBackend {
11171126
tapGestureTarget.height = tapGestureTarget.child!.height
11181127
}
11191128

1129+
public func createProgressSpinner() -> Widget {
1130+
let spinner = ProgressRing()
1131+
spinner.isIndeterminate = true
1132+
return spinner
1133+
}
1134+
1135+
public func createProgressBar() -> Widget {
1136+
let progressBar = ProgressBar()
1137+
progressBar.maximum = 10_000
1138+
return progressBar
1139+
}
1140+
1141+
public func updateProgressBar(
1142+
_ widget: Widget,
1143+
progressFraction: Double?,
1144+
environment: EnvironmentValues
1145+
) {
1146+
let progressBar = widget as! ProgressBar
1147+
if let progressFraction = progressFraction {
1148+
progressBar.isIndeterminate = false
1149+
progressBar.value = progressBar.maximum * progressFraction
1150+
} else {
1151+
progressBar.isIndeterminate = true
1152+
}
1153+
}
1154+
11201155
// public func createTable(rows: Int, columns: Int) -> Widget {
11211156
// let grid = Grid()
11221157
// grid.columnSpacing = 10

0 commit comments

Comments
 (0)