1+ using System . Collections . ObjectModel ;
2+ using System . ComponentModel ;
3+ using System . Runtime . CompilerServices ;
4+ using System . Windows . Input ;
5+
6+ using Orbit . Input ;
7+
8+ namespace Platformer ;
9+
10+ public class GameControllerPageViewModel : INotifyPropertyChanged
11+ {
12+ private Orbit . Input . GameController ? selectedGameController ;
13+ private readonly Orbit . Input . GameControllerManager gameControllerManager ;
14+
15+ public ObservableCollection < Orbit . Input . GameController > GameControllers { get ; } = [ ] ;
16+ public ObservableCollection < ChangeViewModel > Changes { get ; } = [ ] ;
17+
18+ public Orbit . Input . GameController ? SelectedGameController
19+ {
20+ get => selectedGameController ;
21+ set
22+ {
23+ if ( selectedGameController is not null )
24+ {
25+ selectedGameController . ButtonChanged -= SelectedGameControllerOnButtonChanged ;
26+ selectedGameController . ValueChanged -= SelectedGameControllerOnValueChanged ;
27+ }
28+
29+ if ( SetField ( ref selectedGameController , value ) )
30+ {
31+ if ( selectedGameController is not null )
32+ {
33+ AddChange ( $ "Connected to controller '{ selectedGameController . Name } '") ;
34+ selectedGameController . ButtonChanged += SelectedGameControllerOnButtonChanged ;
35+ selectedGameController . ValueChanged += SelectedGameControllerOnValueChanged ;
36+ }
37+ }
38+ }
39+ }
40+
41+ private void SelectedGameControllerOnValueChanged ( object ? sender , GameControllerValueChangedEventArgs e )
42+ {
43+ AddChange ( $ "'{ e . ButtonName } ' button changed to { e . Value } ") ;
44+ }
45+
46+ private void SelectedGameControllerOnButtonChanged ( object ? sender , GameControllerButtonChangedEventArgs e )
47+ {
48+ AddChange ( $ "'{ e . ButtonName } ' was { ( e . IsPressed ? "Pressed" : "Released" ) } ") ;
49+ }
50+
51+ private void AddChange ( string description )
52+ {
53+ Changes . Add ( new ChangeViewModel ( $ "{ DateTime . Now : O} - { description } ") ) ;
54+ }
55+
56+ public ICommand RefreshCommand { get ; }
57+
58+ public GameControllerPageViewModel ( Orbit . Input . GameControllerManager gameControllerManager )
59+ {
60+ this . gameControllerManager = gameControllerManager ;
61+
62+ this . gameControllerManager . GameControllerConnected += GameControllerManagerOnGameControllerConnected ;
63+
64+ RefreshCommand = new Command ( OnRefresh ) ;
65+ }
66+
67+ private void GameControllerManagerOnGameControllerConnected ( object ? sender , GameControllerConnectedEventArgs e )
68+ {
69+ GameControllers . Add ( e . GameController ) ;
70+ }
71+
72+ private void OnRefresh ( )
73+ {
74+ try
75+ {
76+ GameControllers . Clear ( ) ;
77+
78+ _ = this . gameControllerManager . StartDiscovery ( ) ;
79+
80+ foreach ( var gameController in gameControllerManager . GameControllers )
81+ {
82+ GameControllers . Add ( gameController ) ;
83+ }
84+ }
85+ catch ( Exception e )
86+ {
87+ Console . WriteLine ( e ) ;
88+ throw ;
89+ }
90+ }
91+
92+ public event PropertyChangedEventHandler ? PropertyChanged ;
93+
94+ protected virtual void OnPropertyChanged ( [ CallerMemberName ] string ? propertyName = null )
95+ {
96+ PropertyChanged ? . Invoke ( this , new PropertyChangedEventArgs ( propertyName ) ) ;
97+ }
98+
99+ private bool SetField < T > ( ref T field , T value , [ CallerMemberName ] string ? propertyName = null )
100+ {
101+ if ( EqualityComparer < T > . Default . Equals ( field , value ) ) return false ;
102+ field = value ;
103+ OnPropertyChanged ( propertyName ) ;
104+ return true ;
105+ }
106+ }
0 commit comments