@@ -19,10 +19,10 @@ extension App {
1919} 
2020
2121class  WinUIApplication :  SwiftApplication  { 
22-     static  var  callback :  ( ( )  ->  Void ) ? 
22+     static  var  callback :  ( ( WinUIApplication )  ->  Void ) ? 
2323
2424    override func  onLaunched( _ args:  WinUI . LaunchActivatedEventArgs )  { 
25-         Self . callback ? ( ) 
25+         Self . callback ? ( self ) 
2626    } 
2727} 
2828
@@ -57,7 +57,12 @@ public struct WinUIBackend: AppBackend {
5757    } 
5858
5959    public  func  runMainLoop( _ callback:  @escaping  ( )  ->  Void )  { 
60-         WinUIApplication . callback =  { 
60+         WinUIApplication . callback =  {  application in 
61+             // Toggle Switch has annoying default 'internal margins' (not Control
62+             // margins that we can set directly) that we can luckily get rid of by
63+             // overriding the relevant resource values.
64+             application. resources. insert ( " ToggleSwitchPreContentMargin " ,  0.0  as  Double ) 
65+             application. resources. insert ( " ToggleSwitchPostContentMargin " ,  0.0  as  Double ) 
6166            callback ( ) 
6267        } 
6368        WinUIApplication . main ( ) 
@@ -181,7 +186,9 @@ public struct WinUIBackend: AppBackend {
181186    public  func  computeRootEnvironment( 
182187        defaultEnvironment:  EnvironmentValues 
183188    )  ->  EnvironmentValues  { 
184-         return  defaultEnvironment
189+         return 
190+             defaultEnvironment
191+             . with ( \. font,  . system( size:  14 ) ) 
185192    } 
186193
187194    private  func  fatalError( _ message:  String )  ->  Never  { 
@@ -271,6 +278,15 @@ public struct WinUIBackend: AppBackend {
271278                18  +  8 , 
272279                18  +  8 
273280            ) 
281+         }  else  if  widget is WinUI . ToggleSwitch  { 
282+             // WinUI sets the min-width of switches to 154 for whatever reason,
283+             // and I don't know how to override that default from Swift, so I'm
284+             // just hardcoding the size. This keeps getting jankier and
285+             // jankier...
286+             return  SIMD2 ( 
287+                 40 , 
288+                 20 
289+             ) 
274290        }  else  if  let  picker =  widget as?  CustomComboBox ,  picker. padding ==  noPadding { 
275291            let  label  =  TextBlock ( ) 
276292            label. text =  picker. options [ Int ( max ( picker. selectedIndex,  0 ) ) ] 
@@ -334,6 +350,14 @@ public struct WinUIBackend: AppBackend {
334350                11  +  11  +  2 , 
335351                5  +  6  +  2 
336352            ) 
353+         }  else  if  let  toggleButton =  widget as?  WinUI . ToggleButton , 
354+             toggleButton. padding ==  noPadding
355+         { 
356+             // See the above comment regarding Button. Very similar situation.
357+             adjustment =  SIMD2 ( 
358+                 11  +  11  +  2 , 
359+                 5  +  6  +  2 
360+             ) 
337361        }  else  if  let  textField =  widget as?  WinUI . TextBox ,  textField. padding ==  noPadding { 
338362            // The default padding applied to text boxes can be found here:
339363            // https://github.com/microsoft/microsoft-ui-xaml/blob/650b2c1bad272393400403ca323b3cb8745f95d0/src/controls/dev/CommonStyles/Common_themeresources.xaml#L12
@@ -655,6 +679,54 @@ public struct WinUIBackend: AppBackend {
655679        } 
656680    } 
657681
682+     public  func  createToggle( )  ->  Widget  { 
683+         let  toggle  =  ToggleButton ( ) 
684+         toggle. click. addHandler  {  [ weak internalState]  _,  _ in 
685+             guard  let  internalState =  internalState else  { 
686+                 return 
687+             } 
688+             internalState. toggleClickActions [ ObjectIdentifier ( toggle) ] ? ( toggle. isChecked ??  false ) 
689+         } 
690+         return  toggle
691+     } 
692+ 
693+     public  func  updateToggle( _ toggle:  Widget ,  label:  String ,  onChange:  @escaping  ( Bool )  ->  Void )  { 
694+         let  toggle  =  toggle as!  ToggleButton 
695+         let  block  =  TextBlock ( ) 
696+         block. text =  label
697+         toggle. content =  block
698+         internalState. toggleClickActions [ ObjectIdentifier ( toggle) ]  =  onChange
699+     } 
700+ 
701+     public  func  setState( ofToggle toggle:  Widget ,  to state:  Bool )  { 
702+         ( toggle as!  ToggleButton ) . isChecked =  state
703+     } 
704+ 
705+     public  func  createSwitch( )  ->  Widget  { 
706+         let  toggleSwitch  =  ToggleSwitch ( ) 
707+         toggleSwitch. offContent =  " " 
708+         toggleSwitch. onContent =  " " 
709+         toggleSwitch. padding =  Thickness ( left:  0 ,  top:  0 ,  right:  0 ,  bottom:  0 ) 
710+         toggleSwitch. toggled. addHandler  {  [ weak internalState]  _,  _ in 
711+             guard  let  internalState =  internalState else  { 
712+                 return 
713+             } 
714+             internalState. switchClickActions [ ObjectIdentifier ( toggleSwitch) ] ? ( toggleSwitch. isOn) 
715+         } 
716+         return  toggleSwitch
717+     } 
718+ 
719+     public  func  updateSwitch( _ toggleSwitch:  Widget ,  onChange:  @escaping  ( Bool )  ->  Void )  { 
720+         internalState. switchClickActions [ ObjectIdentifier ( toggleSwitch) ]  =  onChange
721+     } 
722+ 
723+     public  func  setState( ofSwitch switchWidget:  Widget ,  to state:  Bool )  { 
724+         let  switchWidget  =  switchWidget as!  ToggleSwitch 
725+         if  switchWidget. isOn !=  state { 
726+             switchWidget. isOn =  state
727+         } 
728+     } 
729+ 
658730    // public func createTable(rows: Int, columns: Int) -> Widget {
659731    //     let grid = Grid()
660732    //     grid.columnSpacing = 10
@@ -699,47 +771,6 @@ public struct WinUIBackend: AppBackend {
699771    //     Grid.setRow(widget, Int32(position.row))
700772    //     grid.children.append(widget)
701773    // }
702- 
703-     // public func createToggle() -> Widget {
704-     //     let toggle = ToggleButton()
705-     //     toggle.click.addHandler { [weak internalState] _, _ in
706-     //         guard let internalState = internalState else {
707-     //             return
708-     //         }
709-     //         internalState.toggleClickActions[ObjectIdentifier(toggle)]?(toggle.isChecked ?? false)
710-     //     }
711-     //     return toggle
712-     // }
713- 
714-     // public func updateToggle(_ toggle: Widget, label: String, onChange: @escaping (Bool) -> Void) {
715-     //     (toggle as! ToggleButton).content = label
716-     //     internalState.toggleClickActions[ObjectIdentifier(toggle)] = onChange
717-     // }
718- 
719-     // public func setState(ofToggle toggle: Widget, to state: Bool) {
720-     //     (toggle as! ToggleButton).isChecked = state
721-     // }
722- 
723-     // public func createSwitch() -> Widget {
724-     //     let toggleSwitch = ToggleSwitch()
725-     //     toggleSwitch.onContent = ""
726-     //     toggleSwitch.offContent = ""
727-     //     toggleSwitch.toggled.addHandler { [weak internalState] _, _ in
728-     //         guard let internalState = internalState else {
729-     //             return
730-     //         }
731-     //         internalState.switchClickActions[ObjectIdentifier(toggleSwitch)]?(toggleSwitch.isOn)
732-     //     }
733-     //     return toggleSwitch
734-     // }
735- 
736-     // public func updateSwitch(_ toggleSwitch: Widget, onChange: @escaping (Bool) -> Void) {
737-     //     internalState.switchClickActions[ObjectIdentifier(toggleSwitch)] = onChange
738-     // }
739- 
740-     // public func setState(ofSwitch switchWidget: Widget, to state: Bool) {
741-     //     (switchWidget as! ToggleSwitch).isOn = state
742-     // }
743774} 
744775
745776extension  SwiftCrossUI . Color  { 
0 commit comments