11using Definitions . ObjectModels . Objects . Region ;
22using Definitions . ObjectModels . Types ;
3+ using Gui . Models ;
4+ using ReactiveUI ;
5+ using System . Collections . Generic ;
36using System . ComponentModel ;
7+ using System . Linq ;
8+ using System . Reactive ;
9+ using System . Text . Json ;
10+ using System . Threading . Tasks ;
411
512namespace Gui . ViewModels ;
613
7- public class RegionViewModel ( RegionObject model )
8- : BaseViewModel < RegionObject > ( model )
14+ public class RegionViewModel : BaseViewModel < RegionObject >
915{
16+ readonly ObjectEditorContext ? editorContext ;
17+
18+ public RegionViewModel ( RegionObject model , ObjectEditorContext ? editorContext = null )
19+ : base ( model )
20+ {
21+ this . editorContext = editorContext ;
22+
23+ DependentObjects = new BindingList < ObjectModelHeader > ( model . DependentObjects ) ;
24+ CargoInfluenceObjects = new BindingList < ObjectModelHeader > ( model . CargoInfluenceObjects ) ;
25+ CargoInfluenceTownFilter = new BindingList < CargoInfluenceTownFilterType > ( model . CargoInfluenceTownFilter ) ;
26+
27+ PopulateDependentObjectsFromFolderCommand = ReactiveCommand . CreateFromTask ( PopulateDependentObjectsFromFolder ) ;
28+ CopyDependentObjectsCommand = ReactiveCommand . CreateFromTask ( CopyDependentObjectsAsync ) ;
29+ PasteDependentObjectsCommand = ReactiveCommand . CreateFromTask ( PasteDependentObjectsAsync ) ;
30+ ClearDependentObjectsCommand = ReactiveCommand . Create ( ClearDependentObjects ) ;
31+ }
32+
1033 public DrivingSide VehiclesDriveOnThe
1134 {
1235 get => Model . VehiclesDriveOnThe ;
@@ -19,11 +42,82 @@ public uint8_t pad_07
1942 set => Model . pad_07 = value ;
2043 }
2144
22- public BindingList < ObjectModelHeader > DependentObjects { get ; init ; } = new ( model . DependentObjects ) ;
45+ [ Browsable ( false ) ]
46+ public BindingList < ObjectModelHeader > DependentObjects { get ; }
2347
2448 [ Category ( "Cargo" ) ]
25- public BindingList < ObjectModelHeader > CargoInfluenceObjects { get ; init ; } = new ( model . CargoInfluenceObjects ) ;
49+ public BindingList < ObjectModelHeader > CargoInfluenceObjects { get ; }
2650
2751 [ Category ( "Cargo" ) ]
28- public BindingList < CargoInfluenceTownFilterType > CargoInfluenceTownFilter { get ; init ; } = new ( model . CargoInfluenceTownFilter ) ;
52+ public BindingList < CargoInfluenceTownFilterType > CargoInfluenceTownFilter { get ; }
53+
54+ [ Browsable ( false ) ]
55+ public ReactiveCommand < Unit , Unit > PopulateDependentObjectsFromFolderCommand { get ; }
56+
57+ [ Browsable ( false ) ]
58+ public ReactiveCommand < Unit , Unit > CopyDependentObjectsCommand { get ; }
59+
60+ [ Browsable ( false ) ]
61+ public ReactiveCommand < Unit , Unit > PasteDependentObjectsCommand { get ; }
62+
63+ [ Browsable ( false ) ]
64+ public ReactiveCommand < Unit , Unit > ClearDependentObjectsCommand { get ; }
65+
66+ Task PopulateDependentObjectsFromFolder ( )
67+ {
68+ var objectIndex = editorContext ? . ObjectIndex ;
69+ if ( objectIndex == null )
70+ {
71+ return Task . CompletedTask ;
72+ }
73+
74+ DependentObjects . Clear ( ) ;
75+ foreach ( var entry in objectIndex . Objects . Where ( x => x . DatChecksum . HasValue ) )
76+ {
77+ DependentObjects . Add ( new ObjectModelHeader ( entry . DisplayName , entry . ObjectType , entry . ObjectSource , entry . DatChecksum ! . Value ) ) ;
78+ }
79+
80+ return Task . CompletedTask ;
81+ }
82+
83+ async Task CopyDependentObjectsAsync ( )
84+ {
85+ var json = JsonSerializer . Serialize ( DependentObjects . ToList ( ) , JsonSerializerOptions ) ;
86+ await PlatformSpecific . SetClipboardTextAsync ( json ) ;
87+ }
88+
89+ async Task PasteDependentObjectsAsync ( )
90+ {
91+ var text = await PlatformSpecific . GetClipboardTextAsync ( ) ;
92+ if ( string . IsNullOrWhiteSpace ( text ) )
93+ {
94+ return ;
95+ }
96+
97+ List < ObjectModelHeader > ? headers ;
98+ try
99+ {
100+ headers = JsonSerializer . Deserialize < List < ObjectModelHeader > > ( text , JsonSerializerOptions ) ;
101+ }
102+ catch ( JsonException )
103+ {
104+ return ;
105+ }
106+
107+ if ( headers == null )
108+ {
109+ return ;
110+ }
111+
112+ DependentObjects . Clear ( ) ;
113+ foreach ( var header in headers )
114+ {
115+ DependentObjects . Add ( header ) ;
116+ }
117+ }
118+
119+ void ClearDependentObjects ( )
120+ => DependentObjects . Clear ( ) ;
121+
122+ static readonly JsonSerializerOptions JsonSerializerOptions = new ( ) { WriteIndented = false } ;
29123}
0 commit comments