Skip to content

Commit d46c1c6

Browse files
restructured menus to be more consistent
1 parent a969b09 commit d46c1c6

File tree

4 files changed

+89
-109
lines changed

4 files changed

+89
-109
lines changed

UnityHubNative.Net/ControlsExtensions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ public static MenuItem OnClick(this MenuItem menuItem, Action callback)
111111
return menuItem;
112112
}
113113

114+
public static MenuItem OnLayoutUpdate(this MenuItem menuItem, Action<MenuItem> callback)
115+
{
116+
menuItem.LayoutUpdated += (obj, args) => callback((MenuItem)obj);
117+
return menuItem;
118+
}
119+
114120
public static MenuFlyoutItem OnClick(this MenuFlyoutItem menuItem, params Action[] callbacks)
115121
{
116122
for (int i = 0; i < callbacks.Length; i++)

UnityHubNative.Net/MainWindow.cs

Lines changed: 80 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -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

UnityHubNative.Net/UnityHubNativeNetApp.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ public static void Run(string[] args)
2828
public override void Initialize()
2929
{
3030
RequestedThemeVariant = ThemeVariant.Default;
31+
Styles.Add(new FluentAvaloniaTheme() { });
3132
//Styles.Add(new FluentTheme() { DensityStyle = DensityStyle.Compact });
3233
//Styles.Add(new SimpleTheme());
33-
Styles.Add(new FluentAvaloniaTheme() { });
3434
}
3535

3636
public override void OnFrameworkInitializationCompleted()

UnityHubNative.Net/UnityProjectView.cs

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,12 @@
22
using Avalonia.Controls;
33
using Avalonia.Layout;
44
using Avalonia.Media;
5-
using FluentAvalonia.UI.Controls;
65

76
namespace UnityHubNative.Net;
87

98
internal sealed class UnityProjectView : Panel
109
{
1110
public UnityProject unityProject;
12-
private MenuItem _moveUpMenuItem;
13-
private MenuItem _moveDownMenuItem;
1411
readonly ComboBox _unityVersionComboBox;
1512
readonly TextBlock _titleTextBlock;
1613
readonly TextBlock _pathTextBlock;
@@ -29,28 +26,7 @@ public UnityProjectView() : base()
2926
ContextFlyout = new MenuFlyout
3027
{
3128
}.AddItems
32-
([
33-
new MenuItem
34-
{
35-
Header = "Open"
36-
}.OnClick(OpenProject),
37-
new MenuItem
38-
{
39-
Header = "Open With",
40-
}.OnClick(MainWindow.OnOpenWithClicked),
41-
new MenuItem
42-
{
43-
Header = "Remove From List",
44-
}.OnClick(MainWindow.OnRemoveProjectFromListClicked),
45-
_moveUpMenuItem = new MenuItem
46-
{
47-
Header = "Move Up In List",
48-
}.OnClick(OnMoveUpClicked),
49-
_moveDownMenuItem = new MenuItem
50-
{
51-
Header = "Move Down In List",
52-
}.OnClick(OnMoveDownClicked),
53-
]),
29+
(MainWindow.CreateProjectMenuItems(() => unityProject)),
5430
ClipToBounds = false,
5531
Child = new DockPanel
5632
{
@@ -91,14 +67,7 @@ public UnityProjectView() : base()
9167
ActualThemeVariantChanged += (_, _) => UpdateUnityVersionWarning();
9268
}
9369

94-
private void OnMoveDownClicked() => MainWindow.MoveUnityProjectUp(unityProject);
95-
96-
private void OnMoveUpClicked() => MainWindow.MoveUnityProjectDown(unityProject);
97-
98-
private void OnPathLinkClicked()
99-
{
100-
OsUtils.OpenExplorer(unityProject.path);
101-
}
70+
private void OnPathLinkClicked() => OsUtils.OpenExplorer(unityProject.path);
10271

10372
public async void OpenProject()
10473
{
@@ -126,9 +95,6 @@ void DropDownClosed(object? sender, EventArgs e)
12695
public void Update(UnityProject unityProject)
12796
{
12897
this.unityProject = unityProject;
129-
var index = UnityHubUtils.UnityProjects.IndexOf(unityProject);
130-
_moveDownMenuItem.IsEnabled = index >= 0 && index < UnityHubUtils.UnityProjects.Count - 1;
131-
_moveUpMenuItem.IsEnabled = index > 0 && index < UnityHubUtils.UnityProjects.Count;
13298
_titleTextBlock.Text = unityProject.name;
13399
_pathTextBlock.Text = unityProject.path;
134100
_unityVersionComboBox.SelectedIndex = unityProject.unity.HasValue

0 commit comments

Comments
 (0)