diff --git a/FASTER/MainWindow.xaml.cs b/FASTER/MainWindow.xaml.cs index 0b24bde..e3024bf 100644 --- a/FASTER/MainWindow.xaml.cs +++ b/FASTER/MainWindow.xaml.cs @@ -165,11 +165,27 @@ private void MetroWindow_Closing(object sender, CancelEventArgs e) Application.Current.Shutdown(); } + private static IEnumerable GetProfileToggleButtons(System.Windows.Controls.ListBox menu) + { + foreach (var item in menu.Items) + { + if (item is System.Windows.Controls.DockPanel dp) + { + var tb = dp.Children.OfType().FirstOrDefault(); + if (tb != null) yield return tb; + } + else if (item is ToggleButton t) + { + yield return t; + } + } + } + private void ToggleButton_Click(object sender, RoutedEventArgs e) { var list = new List(); list.AddRange(IMainMenuItems.Items.Cast().Where(i => i.IsChecked == true)); - list.AddRange(IServerProfilesMenu.Items.Cast().Where(i => i.IsChecked == true)); + list.AddRange(GetProfileToggleButtons(IServerProfilesMenu).Where(i => i.IsChecked == true)); list.AddRange(IOtherMenuItems.Items.Cast().Where(i => i.IsChecked == true)); if (sender is not ToggleButton nav || !NavEnabled) return; @@ -177,13 +193,13 @@ private void ToggleButton_Click(object sender, RoutedEventArgs e) //Don't navigate if same menu is clicked if (nav == lastNavButton) return; - + //Clear selected Buttons IServerProfilesMenu.SelectedItem = null; foreach (var item in list.Where(item => item.Name != nav.Name)) { item.IsChecked = false; } - + nav.IsChecked = true; lastNavButton = nav; @@ -216,7 +232,7 @@ private void ToggleButton_Click(object sender, RoutedEventArgs e) MainContent.Content = ContentAbout; break; default: - if (IServerProfilesMenu.Items.Cast().FirstOrDefault(p => p.Name == nav.Name) != null) + if (GetProfileToggleButtons(IServerProfilesMenu).FirstOrDefault(p => p.Name == nav.Name) != null) { var profile = new Profile(); MainContent.Content = profile; @@ -259,6 +275,14 @@ private void ICreateProfileButton_Click(object sender, RoutedEventArgs e) } } + private ToggleButton GetSelectedProfileToggleButton() + { + var selected = IServerProfilesMenu.SelectedItem; + if (selected is System.Windows.Controls.DockPanel dp) + return dp.Children.OfType().FirstOrDefault(); + return selected as ToggleButton; + } + private void MenuItemClone_Click(object sender, RoutedEventArgs e) { if (IServerProfilesMenu.SelectedIndex == -1) @@ -266,15 +290,16 @@ private void MenuItemClone_Click(object sender, RoutedEventArgs e) try { + var selectedBtn = GetSelectedProfileToggleButton(); var temp = Properties.Settings.Default.Profiles.FirstOrDefault(s => - s.Id == ((ToggleButton) IServerProfilesMenu.SelectedItem).Name); + s.Id == selectedBtn?.Name); if (temp == null) { DisplayMessage("Could not find the selected profile."); return; } - ServerProfile serverProfile = temp.Clone(); + ServerProfile serverProfile = temp.Clone(); ServerProfileCollection.AddServerProfile(serverProfile); } catch (Exception err) @@ -291,8 +316,9 @@ private void MenuItemDelete_Click(object sender, RoutedEventArgs e) try { + var selectedBtn = GetSelectedProfileToggleButton(); var temp = Properties.Settings.Default.Profiles.FirstOrDefault(s => - s.Id == ((ToggleButton)IServerProfilesMenu.SelectedItem).Name); + s.Id == selectedBtn?.Name); if (temp == null) { DisplayMessage("Could not find the selected profile."); @@ -435,11 +461,55 @@ public void LoadServerProfiles() HorizontalContentAlignment = HorizontalAlignment.Left, }; newItem.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display); - Dispatcher?.Invoke(() => { IServerProfilesMenu.Items.Add(newItem); }); + + var profileId = profile.Id; + + var btnUp = new System.Windows.Controls.Button + { + Content = "▲", + FontSize = 10, + Width = 18, + Height = 18, + Padding = new Thickness(0), + Margin = new Thickness(0, 0, 1, 0), + VerticalAlignment = VerticalAlignment.Center, + Style = (Style)FindResource("MahApps.Styles.Button.MetroSquare"), + BorderThickness = new Thickness(0), + ToolTip = "Move Up", + }; + btnUp.Click += (s, e) => { e.Handled = true; MoveProfileUp(profileId); }; + + var btnDown = new System.Windows.Controls.Button + { + Content = "▼", + FontSize = 10, + Width = 18, + Height = 18, + Padding = new Thickness(0), + Margin = new Thickness(0, 0, 2, 0), + VerticalAlignment = VerticalAlignment.Center, + Style = (Style)FindResource("MahApps.Styles.Button.MetroSquare"), + BorderThickness = new Thickness(0), + ToolTip = "Move Down", + }; + btnDown.Click += (s, e) => { e.Handled = true; MoveProfileDown(profileId); }; + + var rowPanel = new System.Windows.Controls.DockPanel + { + HorizontalAlignment = HorizontalAlignment.Stretch, + LastChildFill = true, + }; + System.Windows.Controls.DockPanel.SetDock(btnUp, System.Windows.Controls.Dock.Right); + System.Windows.Controls.DockPanel.SetDock(btnDown, System.Windows.Controls.Dock.Right); + rowPanel.Children.Add(btnDown); + rowPanel.Children.Add(btnUp); + rowPanel.Children.Add(newItem); + + Dispatcher?.Invoke(() => { IServerProfilesMenu.Items.Add(rowPanel); }); newItem.Click += ToggleButton_Click; - if (ContentProfileViews.Any(tab => profile.Id == tab.Profile.Id)) + if (ContentProfileViews.Any(tab => profile.Id == tab.Profile.Id)) continue; var p = new ProfileViewModel(profile); @@ -447,6 +517,32 @@ public void LoadServerProfiles() } } + private void MoveProfileUp(string profileId) + { + var profiles = Properties.Settings.Default.Profiles; + int idx = profiles.FindIndex(p => p.Id == profileId); + if (idx <= 0) return; + var item = profiles[idx]; + profiles.RemoveAt(idx); + profiles.Insert(idx - 1, item); + Properties.Settings.Default.Profiles = profiles; + Properties.Settings.Default.Save(); + LoadServerProfiles(); + } + + private void MoveProfileDown(string profileId) + { + var profiles = Properties.Settings.Default.Profiles; + int idx = profiles.FindIndex(p => p.Id == profileId); + if (idx < 0 || idx >= profiles.Count - 1) return; + var item = profiles[idx]; + profiles.RemoveAt(idx); + profiles.Insert(idx + 1, item); + Properties.Settings.Default.Profiles = profiles; + Properties.Settings.Default.Save(); + LoadServerProfiles(); + } + private async Task ModConversion() { var properties = Properties.Settings.Default; diff --git a/FASTER/Views/Mods.xaml.cs b/FASTER/Views/Mods.xaml.cs index 501a33f..cb8589e 100644 --- a/FASTER/Views/Mods.xaml.cs +++ b/FASTER/Views/Mods.xaml.cs @@ -74,7 +74,7 @@ private async void ImportLauncherFile_Click(object sender, RoutedEventArgs e) private async void CheckForUpdates_Click(object sender, RoutedEventArgs e) { - if (DataContext is ModsViewModel vm) await vm.CheckForUpdates(); + await ((ModsViewModel) DataContext)?.CheckForUpdates(); } private void UpdateAll_Click(object sender, RoutedEventArgs e) @@ -89,7 +89,7 @@ private async void DeleteAll_Click(object sender, RoutedEventArgs e) private async void PurgeAndReinstallAll_Click(object sender, RoutedEventArgs e) { - if (DataContext is ModsViewModel vm) await vm.PurgeAndReinstallAll(); + await ((ModsViewModel) DataContext)?.PurgeAndReinstallAll(); } private void PurgeAndReinstallSelected_Click(object sender, RoutedEventArgs e) @@ -99,7 +99,7 @@ private void PurgeAndReinstallSelected_Click(object sender, RoutedEventArgs e) private async void PurgeUnusedMods_Click(object sender, RoutedEventArgs e) { - if (DataContext is ModsViewModel vm) await vm.PurgeUnusedMods(); + await ((ModsViewModel) DataContext)?.PurgeUnusedMods(); } } }