@@ -60,43 +60,11 @@ public MainWindow()
6060
6161 await vm . TryLoadLastSessionAsync ( ) ;
6262
63- // Wire Merge Session menu (dynamic submenu listing other sessions)
64- var mergeMenuItem = this . FindControl < Avalonia . Controls . MenuItem > ( "MergeSessionMenuItem" ) ;
65- if ( mergeMenuItem != null )
66- {
67- mergeMenuItem . SubmenuOpened += ( _ , _ ) =>
68- {
69- mergeMenuItem . Items . Clear ( ) ;
70- var sources = vm . Sessions
71- . Where ( s => s != vm . ActiveSession && s . DatData != null && s . SprFile != null )
72- . ToList ( ) ;
73-
74- if ( sources . Count == 0 || vm . ActiveSession ? . DatData == null )
75- {
76- var empty = new Avalonia . Controls . MenuItem
77- {
78- Header = vm . ActiveSession ? . DatData == null
79- ? "Current session has no DAT loaded"
80- : "No other sessions with DAT/SPR loaded" ,
81- IsEnabled = false ,
82- } ;
83- mergeMenuItem . Items . Add ( empty ) ;
84- }
85- else
86- {
87- foreach ( var source in sources )
88- {
89- var mi = new Avalonia . Controls . MenuItem
90- {
91- Header = $ "{ source . Name } ({ source . DatData ! . Items . Count + source . DatData . Outfits . Count + source . DatData . Effects . Count + source . DatData . Missiles . Count } things)",
92- Tag = source ,
93- } ;
94- mi . Click += async ( _ , _ ) => await vm . MergeSessionAsync ( source ) ;
95- mergeMenuItem . Items . Add ( mi ) ;
96- }
97- }
98- } ;
99- }
63+ // Wire per-category Import menus (dynamic submenus listing other sessions)
64+ WireImportMenu ( "ImportItemsMenuItem" , ThingCategory . Item , vm ) ;
65+ WireImportMenu ( "ImportOutfitsMenuItem" , ThingCategory . Outfit , vm ) ;
66+ WireImportMenu ( "ImportEffectsMenuItem" , ThingCategory . Effect , vm ) ;
67+ WireImportMenu ( "ImportMissilesMenuItem" , ThingCategory . Missile , vm ) ;
10068
10169 // Wire confirmation dialog for palette delete operations
10270 if ( vm . Palette != null )
@@ -133,6 +101,46 @@ public MainWindow()
133101 } ;
134102 }
135103
104+ private void WireImportMenu ( string controlName , ThingCategory category , MainWindowViewModel vm )
105+ {
106+ var menuItem = this . FindControl < Avalonia . Controls . MenuItem > ( controlName ) ;
107+ if ( menuItem == null ) return ;
108+
109+ menuItem . SubmenuOpened += ( _ , _ ) =>
110+ {
111+ menuItem . Items . Clear ( ) ;
112+ var sources = vm . Sessions
113+ . Where ( s => s != vm . ActiveSession && s . DatData != null && s . SprFile != null )
114+ . ToList ( ) ;
115+
116+ if ( sources . Count == 0 || vm . ActiveSession ? . DatData == null )
117+ {
118+ var empty = new Avalonia . Controls . MenuItem
119+ {
120+ Header = vm . ActiveSession ? . DatData == null
121+ ? "Current session has no DAT loaded"
122+ : "No other sessions with DAT/SPR loaded" ,
123+ IsEnabled = false ,
124+ } ;
125+ menuItem . Items . Add ( empty ) ;
126+ }
127+ else
128+ {
129+ foreach ( var source in sources )
130+ {
131+ var dict = MainWindowViewModel . GetCategoryDict ( source . DatData ! , category ) ;
132+ var mi = new Avalonia . Controls . MenuItem
133+ {
134+ Header = $ "{ source . Name } ({ dict . Count } { category . ToString ( ) . ToLowerInvariant ( ) } s)",
135+ Tag = source ,
136+ } ;
137+ mi . Click += async ( _ , _ ) => await vm . MergeSessionAsync ( source , category ) ;
138+ menuItem . Items . Add ( mi ) ;
139+ }
140+ }
141+ } ;
142+ }
143+
136144 private bool _closeConfirmed ;
137145
138146 private async void OnWindowClosing ( object ? sender , WindowClosingEventArgs e )
0 commit comments