@@ -281,6 +281,28 @@ public final class WinUIBackend: AppBackend {
281
281
canvas. background = brush
282
282
}
283
283
284
+ public func setCornerRadius( of widget: Widget , to radius: Int ) {
285
+ let visual : WinAppSDK . Visual = try ! widget. getVisualInternal ( )
286
+
287
+ let geometry = try ! visual. compositor. createRoundedRectangleGeometry ( ) !
288
+ geometry. cornerRadius = WindowsFoundation . Vector2 (
289
+ x: Float ( radius) ,
290
+ y: Float ( radius)
291
+ )
292
+
293
+ // We assume that SwiftCrossUI has explicitly set the size of the
294
+ // underlying widget.
295
+ geometry. size = WindowsFoundation . Vector2 (
296
+ x: Float ( widget. width) ,
297
+ y: Float ( widget. height)
298
+ )
299
+
300
+ let clip = try ! visual. compositor. createGeometricClip ( ) !
301
+ clip. geometry = geometry
302
+
303
+ visual. clip = clip
304
+ }
305
+
284
306
public func naturalSize( of widget: Widget ) -> SIMD2 < Int > {
285
307
let allocation = WindowsFoundation . Size (
286
308
width: . infinity,
@@ -823,6 +845,37 @@ public final class WinUIBackend: AppBackend {
823
845
}
824
846
}
825
847
848
+ public func createClickTarget( wrapping child: Widget ) -> Widget {
849
+ let clickTarget = ClickTarget ( )
850
+ addChild ( child, to: clickTarget)
851
+ clickTarget. child = child
852
+
853
+ // Set a background so that the click target's entire area gets hit
854
+ // tested. The background we set is transparent so that it doesn't
855
+ // change the visual appearance of the view.
856
+ let brush = SolidColorBrush ( )
857
+ brush. color = UWP . Color ( a: 0 , r: 0 , g: 0 , b: 0 )
858
+ clickTarget. background = brush
859
+
860
+ clickTarget. pointerPressed. addHandler { [ weak clickTarget] _, _ in
861
+ guard let clickTarget else {
862
+ return
863
+ }
864
+ clickTarget. clickHandler ? ( )
865
+ }
866
+ return clickTarget
867
+ }
868
+
869
+ public func updateClickTarget(
870
+ _ clickTarget: Widget ,
871
+ clickHandler handleClick: @escaping ( ) -> Void
872
+ ) {
873
+ let clickTarget = clickTarget as! ClickTarget
874
+ clickTarget. clickHandler = handleClick
875
+ clickTarget. width = clickTarget. child!. width
876
+ clickTarget. height = clickTarget. child!. height
877
+ }
878
+
826
879
// public func createTable(rows: Int, columns: Int) -> Widget {
827
880
// let grid = Grid()
828
881
// grid.columnSpacing = 10
@@ -943,3 +996,8 @@ final class CustomComboBox: ComboBox {
943
996
final class CustomSplitView : SplitView {
944
997
var sidebarResizeHandler : ( ( ) -> Void ) ?
945
998
}
999
+
1000
+ final class ClickTarget : WinUI . Canvas {
1001
+ var clickHandler : ( ( ) -> Void ) ?
1002
+ var child : WinUI . FrameworkElement ?
1003
+ }
0 commit comments