@@ -16,21 +16,15 @@ class MainWindow : Window
1616 const string InstallUnityUrl = "https://unity.com/releases/editor/archive" ;
1717
1818 public static MainWindow Instance { get ; set ; }
19+
1920 static ListBox s_unityInstallationsParent ;
2021
2122 static ListBox s_unityInstalltionSearchPathsParent ;
2223 static Button s_unityInstallationSearchRemoveBtn ;
2324
2425 static SubmitableListBox s_unityProjectsParent ;
25- static Button s_revealBtn ;
26- static Button s_removeFromListBtn ;
27- static Button s_openWithBtn ;
2826 static AutoCompleteBox s_projectSearchBoxAutoComplete ;
2927
30- static MenuItem s_removeFromListMenuItem ;
31- static MenuItem s_revealInFileExplorerMenuItem ;
32- static MenuItem s_openInDifferentVersionMenuItem ;
33-
3428 static DockPanel s_transparentPanel ;
3529 static Slider s_backgroundBlurIntensitySlider ;
3630
@@ -94,10 +88,13 @@ public static void ReloadEverything()
9488 UpdateUnityProjectViews ( ) ;
9589 }
9690
97- public static void OnOpenWithClicked ( )
91+ public static void OpenSelectedProjectWith ( )
9892 {
99- var dialogue = new OpenWithDialogue ( UnityHubUtils . UnityProjects [ GetUnityProjectSelectedIndex ( ) ] ) ;
100- dialogue . ShowDialog ( Instance ) ;
93+ if ( TryGetSelectedProject ( out var unityProject ) )
94+ {
95+ var dialogue = new OpenWithDialogue ( unityProject ) ;
96+ dialogue . ShowDialog ( Instance ) ;
97+ }
10198 }
10299
103100 public static void OnRemoveProjectFromListClicked ( )
@@ -132,9 +129,9 @@ public static void UpdateUnityProjectViews()
132129 ( ( UnityProjectView ) s_unityProjectsParent . Items [ i ] ! ) . Update ( UnityHubUtils . UnityProjects [ i ] ) ;
133130 }
134131
135- public static void MoveUnityProjectUp ( UnityProject unityProject )
132+ public static void MoveSelectedProjectUp ( )
136133 {
137- if ( unityProject is null )
134+ if ( ! TryGetSelectedProject ( out var unityProject ) || unityProject is null )
138135 return ;
139136 var ind = UnityHubUtils . UnityProjects . IndexOf ( unityProject ) ;
140137 if ( ind == - 1 )
@@ -150,9 +147,9 @@ public static void MoveUnityProjectUp(UnityProject unityProject)
150147 ( ( UnityProjectView ) s_unityProjectsParent . Items [ ind + 1 ] ) . Update ( UnityHubUtils . UnityProjects [ ind + 1 ] ) ;
151148 }
152149
153- public static void MoveUnityProjectDown ( UnityProject unityProject )
150+ public static void MoveSelectedProjectDown ( )
154151 {
155- if ( unityProject is null )
152+ if ( ! TryGetSelectedProject ( out var unityProject ) || unityProject is null )
156153 return ;
157154 var ind = UnityHubUtils . UnityProjects . IndexOf ( unityProject ) ;
158155 if ( ind == - 1 )
@@ -181,7 +178,7 @@ public static void MoveUnityProjectDown(UnityProject unityProject)
181178 ( [
182179 new MenuItem
183180 {
184- Header = "_Project "
181+ Header = "_File "
185182 } . AddItems
186183 ( [
187184 new MenuItem
@@ -196,25 +193,6 @@ public static void MoveUnityProjectDown(UnityProject unityProject)
196193 HotKey = new KeyGesture ( Key . N , KeyModifiers . Control | KeyModifiers . Shift ) ,
197194 InputGesture = new KeyGesture ( Key . N , KeyModifiers . Control | KeyModifiers . Shift )
198195 } . OnClick ( OnAddExistingProjectClicked ) ,
199- s_removeFromListMenuItem = new MenuItem
200- {
201- Header = "_Remove From List" ,
202- HotKey = new KeyGesture ( Key . Subtract , KeyModifiers . Control ) ,
203- InputGesture = new KeyGesture ( Key . Subtract , KeyModifiers . Control )
204- } . OnClick ( OnRemoveProjectFromListClicked ) ,
205- new Separator ( ) ,
206- s_revealInFileExplorerMenuItem = new MenuItem
207- {
208- Header = "_Reveal In File Explorer" ,
209- HotKey = new KeyGesture ( Key . F , KeyModifiers . Control ) ,
210- InputGesture = new KeyGesture ( Key . F , KeyModifiers . Control ) ,
211- } . OnClick ( OnRevealProjectClicked ) ,
212- s_openInDifferentVersionMenuItem = new MenuItem
213- {
214- Header = "_Open In Different Version" ,
215- HotKey = new KeyGesture ( Key . O , KeyModifiers . Control ) ,
216- InputGesture = new KeyGesture ( Key . O , KeyModifiers . Control ) ,
217- } . OnClick ( OnOpenWithClicked ) ,
218196 new MenuItem
219197 {
220198 Header = "_Reload Data" ,
@@ -223,6 +201,11 @@ public static void MoveUnityProjectDown(UnityProject unityProject)
223201 } . OnClick ( ReloadEverything ) ,
224202 ] ) ,
225203 new MenuItem
204+ {
205+ Header = "_Project" ,
206+ } . AddItems
207+ ( CreateProjectMenuItems ( ( ) => ( s_unityProjectsParent . SelectedItem as UnityProjectView ) ? . unityProject ?? null ) ) ,
208+ new MenuItem
226209 {
227210 Header = "_Window" ,
228211 } . AddItems
@@ -271,37 +254,6 @@ public static void MoveUnityProjectDown(UnityProject unityProject)
271254 u . unityProject . OpenProject ( ) ;
272255 return ;
273256 } ) . SetDock ( Dock . Top ) ,
274- new StackPanel
275- {
276- Orientation = Orientation . Horizontal ,
277- Margin = new ( 0 , 5 ) ,
278- Spacing = 2 ,
279- } . SetDock ( Dock . Top ) . AddChildren
280- ( [
281- s_revealBtn = new Button
282- {
283- Content = "Reveal" ,
284- IsEnabled = false ,
285- } . OnClick ( OnRevealProjectClicked ) ,
286- s_removeFromListBtn = new Button
287- {
288- Content = "Remove From List" ,
289- IsEnabled = false ,
290- } . OnClick ( OnRemoveProjectFromListClicked ) ,
291- new Button
292- {
293- Content = "Create New"
294- } . OnClick ( OnCreateNewProjectClicked ) ,
295- new Button
296- {
297- Content = "Add Existing"
298- } . OnClick ( OnAddExistingProjectClicked ) ,
299- s_openWithBtn = new Button
300- {
301- Content = "Open With" ,
302- IsEnabled = false ,
303- } . OnClick ( OnOpenWithClicked ) ,
304- ] ) ,
305257 new DockPanel
306258 {
307259 Margin = new ( 0 , 10 )
@@ -531,6 +483,52 @@ public static void MoveUnityProjectDown(UnityProject unityProject)
531483 ] )
532484 ] ) ;
533485
486+ public static MenuItem [ ] CreateProjectMenuItems ( Func < UnityProject > unityProjectGetter )
487+ {
488+ return
489+ [
490+ new MenuItem
491+ {
492+ Header = "Open" ,
493+ HotKey = new ( Key . Enter ) ,
494+ InputGesture = new ( Key . Enter ) ,
495+ } . OnLayoutUpdate ( ( item ) => item . IsEnabled = unityProjectGetter ( ) ? . unity . HasValue == true )
496+ . OnClick ( OpenSelectedProject ) ,
497+ new MenuItem
498+ {
499+ Header = "Open With" ,
500+ HotKey = new ( Key . Enter , KeyModifiers . Alt ) ,
501+ InputGesture = new ( Key . Enter , KeyModifiers . Alt ) ,
502+ } . OnClick ( OpenSelectedProjectWith ) ,
503+ new MenuItem
504+ {
505+ Header = "_Reveal In File Explorer" ,
506+ HotKey = new KeyGesture ( Key . F , KeyModifiers . Control ) ,
507+ InputGesture = new KeyGesture ( Key . F , KeyModifiers . Control ) ,
508+ } . OnClick ( RevealSelectedProject ) ,
509+ new MenuItem
510+ {
511+ Header = "Move Up In List" ,
512+ HotKey = new ( Key . Up , KeyModifiers . Alt | KeyModifiers . Shift ) ,
513+ InputGesture = new ( Key . Up , KeyModifiers . Alt | KeyModifiers . Shift ) ,
514+ } . OnLayoutUpdate ( ( item ) => item . IsEnabled = unityProjectGetter is not null && UnityHubUtils . UnityProjects . Skip ( 1 ) . Contains ( unityProjectGetter ( ) ) )
515+ . OnClick ( MoveSelectedProjectUp ) ,
516+ new MenuItem
517+ {
518+ Header = "Move Down In List" ,
519+ HotKey = new ( Key . Down , KeyModifiers . Alt | KeyModifiers . Shift ) ,
520+ InputGesture = new ( Key . Down , KeyModifiers . Alt | KeyModifiers . Shift ) ,
521+ } . OnLayoutUpdate ( ( item ) => item . IsEnabled = unityProjectGetter is not null && UnityHubUtils . UnityProjects . SkipLast ( 1 ) . Contains ( unityProjectGetter ( ) ) )
522+ . OnClick ( MoveSelectedProjectDown ) ,
523+ ] ;
524+ }
525+
526+ static void OpenSelectedProject ( )
527+ {
528+ if ( s_unityProjectsParent . SelectedItem is UnityProjectView view )
529+ view . OpenProject ( ) ;
530+ }
531+
534532 static void OnCloseAfterOpenProjectCheckboxChanged ( )
535533 {
536534 UnityHubNativeNetApp . Config . closeAfterProjectOpen = ! UnityHubNativeNetApp . Config . closeAfterProjectOpen ;
@@ -613,12 +611,6 @@ static void UnityProjectSelectedIndexChanged()
613611 var index = GetUnityProjectSelectedIndex ( ) ;
614612 Debug . WriteLine ( $ "selection changed to { index } ") ;
615613 bool isAnySelected = IsAnyProjectSelected ( ) ;
616-
617- // menu bar buttons
618- s_revealBtn . IsEnabled = s_removeFromListBtn . IsEnabled = s_openWithBtn . IsEnabled = isAnySelected ;
619-
620- // menu items
621- s_removeFromListMenuItem . IsEnabled = s_revealInFileExplorerMenuItem . IsEnabled = s_openInDifferentVersionMenuItem . IsEnabled = isAnySelected ;
622614 }
623615
624616 static async void AddNewUnitySearchPath ( )
@@ -661,6 +653,18 @@ static async void AddNewUnitySearchPath()
661653
662654 static int GetUnityProjectSelectedIndex ( ) => s_unityProjectsParent . SelectedIndex ;
663655
656+ static bool TryGetSelectedProject ( out UnityProject unityProject )
657+ {
658+ var ind = GetUnityProjectSelectedIndex ( ) ;
659+ if ( ind < 0 || ind >= UnityHubUtils . UnityProjects . Count )
660+ {
661+ unityProject = default ;
662+ return false ;
663+ }
664+ unityProject = UnityHubUtils . UnityProjects [ ind ] ;
665+ return true ;
666+ }
667+
664668 static bool IsAnyProjectSelected ( )
665669 {
666670 var ind = GetUnityProjectSelectedIndex ( ) ;
@@ -711,7 +715,11 @@ static async void OnAddExistingProjectClicked()
711715
712716 static void OnCreateNewProjectClicked ( ) => new CreateNewProjectDialogue ( ) . ShowDialog ( Instance ) ;
713717
714- static void OnRevealProjectClicked ( ) => OsUtils . OpenExplorer ( UnityHubUtils . UnityProjects [ GetUnityProjectSelectedIndex ( ) ] . path ) ;
718+ static void RevealSelectedProject ( )
719+ {
720+ if ( TryGetSelectedProject ( out var unityProject ) )
721+ OsUtils . OpenExplorer ( unityProject . path ) ;
722+ }
715723
716724 static void OnAboutClicked ( MenuItem item , RoutedEventArgs args ) => new AboutDialogue ( ) . ShowDialog ( Instance ) ;
717725
0 commit comments