391 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			391 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.ComponentModel;
 | |
| using System.Diagnostics;
 | |
| using System.Globalization;
 | |
| using System.IO;
 | |
| using System.Linq;
 | |
| using System.Reflection;
 | |
| using System.Text.RegularExpressions;
 | |
| using System.Windows;
 | |
| using System.Windows.Controls;
 | |
| using System.Windows.Input;
 | |
| using System.Windows.Interop;
 | |
| using System.Windows.Navigation;
 | |
| 
 | |
| namespace unison
 | |
| {
 | |
|     public partial class Settings : Window
 | |
|     {
 | |
|         public static string GetVersion => Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;
 | |
| 
 | |
|         public static string GetLicense
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 try
 | |
|                 {
 | |
|                     StreamReader Reader = new("LICENSE");
 | |
|                     string file = "";
 | |
|                     file += Reader.ReadToEnd();
 | |
|                     return file;
 | |
|                 }
 | |
|                 catch (IOException e)
 | |
|                 {
 | |
|                     return e.Message;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         HotkeyHandler _hotkeys = (HotkeyHandler)Application.Current.Properties["hotkeys"];
 | |
| 
 | |
| 
 | |
|         public Settings()
 | |
|         {
 | |
|             InitHwnd();
 | |
|             InitializeComponent();
 | |
|             DataContext = this;
 | |
| 
 | |
|             WindowState = WindowState.Minimized;
 | |
| 
 | |
|             Initialize();
 | |
|         }
 | |
| 
 | |
|         void Initialize()
 | |
|         {
 | |
|             MpdHost.Text = Properties.Settings.Default.mpd_host;
 | |
|             MpdPort.Text = Properties.Settings.Default.mpd_port.ToString();
 | |
|             //MpdPassword.Text = Properties.Settings.Default.mpd_password;
 | |
|             SnapcastStartup.IsChecked = Properties.Settings.Default.snapcast_startup;
 | |
|             SnapcastWindow.IsChecked = Properties.Settings.Default.snapcast_window;
 | |
|             SnapcastPath.Text = Properties.Settings.Default.snapcast_path;
 | |
|             SnapcastPort.Text = Properties.Settings.Default.snapcast_port.ToString();
 | |
|             VolumeOffset.Text = Properties.Settings.Default.volume_offset.ToString();
 | |
| 
 | |
|             InitializeShortcuts();
 | |
|         }
 | |
| 
 | |
|         public void UpdateConnectionStatus()
 | |
|         {
 | |
|             MPDHandler mpd = (MPDHandler)Application.Current.Properties["mpd"];
 | |
|             if (mpd.IsConnected())
 | |
|             {
 | |
|                 ConnectionStatus.Text = $"{unison.Resources.Resources.Settings_ConnectionStatusConnected} {mpd.GetVersion()}.";
 | |
|                 ConnectButton.IsEnabled = false;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 ConnectionStatus.Text = unison.Resources.Resources.Settings_ConnectionStatusOffline;
 | |
|                 ConnectButton.IsEnabled = true;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void NumberValidationTextBox(object sender, TextCompositionEventArgs e)
 | |
|         {
 | |
|             Regex regex = new Regex("[^0-9]+");
 | |
|             e.Handled = regex.IsMatch(e.Text);
 | |
|         }
 | |
| 
 | |
|         private void MpdConnectTextBox(object sender, TextChangedEventArgs e)
 | |
|         {
 | |
|             TextBox textBox = (TextBox)sender;
 | |
| 
 | |
|             if (textBox.Text == Properties.Settings.Default.mpd_host)
 | |
|                 ConnectButton.IsEnabled = false;
 | |
|             else
 | |
|                 ConnectButton.IsEnabled = true;
 | |
| 
 | |
|             e.Handled = true;
 | |
|         }
 | |
| 
 | |
|         private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
 | |
|         {
 | |
|             ProcessStartInfo psi = new(e.Uri.AbsoluteUri);
 | |
|             psi.UseShellExecute = true;
 | |
|             Process.Start(psi);
 | |
|             e.Handled = true;
 | |
|         }
 | |
| 
 | |
|         private void MPDConnect_Clicked(object sender, RoutedEventArgs e)
 | |
|         {
 | |
|             if (!ConnectButton.IsEnabled)
 | |
|                 return;
 | |
| 
 | |
|             SaveSettings();
 | |
| 
 | |
|             MPDHandler mpd = (MPDHandler)Application.Current.Properties["mpd"];
 | |
|             if (mpd.IsConnected())
 | |
|                 mpd = new MPDHandler();
 | |
| 
 | |
|             ConnectButton.IsEnabled = false;
 | |
|             ConnectionStatus.Text = unison.Resources.Resources.Settings_ConnectionStatusConnecting;
 | |
| 
 | |
|             System.Threading.Tasks.Task.Run(() => { mpd.Connect(); });
 | |
|         }
 | |
| 
 | |
|         private void SnapcastReset_Clicked(object sender, RoutedEventArgs e)
 | |
|         {
 | |
|             SnapcastPath.Text = (string)Application.Current.FindResource("snapcastPath");
 | |
|             SnapcastPort.Text = (string)Application.Current.FindResource("snapcastPort");
 | |
|         }
 | |
| 
 | |
|         public void UpdateStats()
 | |
|         {
 | |
|             MPDHandler mpd = (MPDHandler)Application.Current.Properties["mpd"];
 | |
|             StatSong.Text = mpd.GetStats().Songs.ToString();
 | |
|             StatAlbum.Text = mpd.GetStats().Albums.ToString();
 | |
|             StatArtist.Text = mpd.GetStats().Artists.ToString();
 | |
|             StatTotalPlaytime.Text = mpd.GetStats().TotalPlaytime.ToString();
 | |
|             StatUptime.Text = mpd.GetStats().Uptime.ToString();
 | |
|             StatTotalTimePlayed.Text = mpd.GetStats().TotalTimePlayed.ToString();
 | |
|             StatDatabaseUpdate.Text = mpd.GetStats().DatabaseUpdate.ToString();
 | |
|         }
 | |
| 
 | |
|         private void ConnectHandler(object sender, KeyEventArgs e)
 | |
|         {
 | |
|             if (e.Key == Key.Return)
 | |
|                 MPDConnect_Clicked(null, null);
 | |
|         }
 | |
| 
 | |
|         private void Window_Closing(object sender, CancelEventArgs e)
 | |
|         {
 | |
|             e.Cancel = true;
 | |
|             SaveSettings();
 | |
|             WindowState = WindowState.Minimized;
 | |
|             Hide();
 | |
|         }
 | |
| 
 | |
|         public void InitHwnd()
 | |
|         {
 | |
|             WindowInteropHelper helper = new(this);
 | |
|             helper.EnsureHandle();
 | |
|         }
 | |
| 
 | |
|         public void SaveSettings()
 | |
|         {
 | |
|             Properties.Settings.Default.mpd_host = MpdHost.Text;
 | |
|             Properties.Settings.Default.mpd_port = int.Parse(MpdPort.Text, CultureInfo.InvariantCulture);
 | |
|             //Properties.Settings.Default.mpd_password = MpdPassword.Text;
 | |
|             Properties.Settings.Default.snapcast_startup = (bool)SnapcastStartup.IsChecked;
 | |
|             Properties.Settings.Default.snapcast_window = (bool)SnapcastWindow.IsChecked;
 | |
|             Properties.Settings.Default.snapcast_path = SnapcastPath.Text;
 | |
|             Properties.Settings.Default.snapcast_port = int.Parse(SnapcastPort.Text, CultureInfo.InvariantCulture);
 | |
|             Properties.Settings.Default.volume_offset = int.Parse(VolumeOffset.Text, CultureInfo.InvariantCulture);
 | |
| 
 | |
|             Properties.Settings.Default.nextTrack_mod = GetMod(Shortcut_NextTrack);
 | |
|             Properties.Settings.Default.nextTrack_vk = GetVk(Shortcut_NextTrack);
 | |
|             Properties.Settings.Default.previousTrack_mod = GetMod(Shortcut_PreviousTrack);
 | |
|             Properties.Settings.Default.previousTrack_vk = GetVk(Shortcut_PreviousTrack);
 | |
|             Properties.Settings.Default.playPause_mod = GetMod(Shortcut_PlayPause);
 | |
|             Properties.Settings.Default.playPause_vk = GetVk(Shortcut_PlayPause);
 | |
|             Properties.Settings.Default.volumeUp_mod = GetMod(Shortcut_VolumeUp);
 | |
|             Properties.Settings.Default.volumeUp_vk = GetVk(Shortcut_VolumeUp);
 | |
|             Properties.Settings.Default.volumeDown_mod = GetMod(Shortcut_VolumeDown);
 | |
|             Properties.Settings.Default.volumeDown_vk = GetVk(Shortcut_VolumeDown);
 | |
|             Properties.Settings.Default.volumeMute_mod = GetMod(Shortcut_VolumeMute);
 | |
|             Properties.Settings.Default.volumeMute_vk = GetVk(Shortcut_VolumeMute);
 | |
|             Properties.Settings.Default.showWindow_mod = GetMod(Shortcut_ShowWindow);
 | |
|             Properties.Settings.Default.showWindow_vk = GetVk(Shortcut_ShowWindow);
 | |
| 
 | |
|             Properties.Settings.Default.Save();
 | |
|         }
 | |
| 
 | |
| 
 | |
|         // Hotkeys
 | |
| 
 | |
|         void InitializeShortcuts()
 | |
|         {
 | |
|             System.Collections.Generic.IEnumerable<StackPanel> stackPanelCollection = RebindKeyWrapper.Children.OfType<StackPanel>();
 | |
|             StackPanel[] stackPanelList = stackPanelCollection.ToArray();
 | |
| 
 | |
|             // Default state
 | |
|             for (int i = 0; i < stackPanelList.Length; i++)
 | |
|             {
 | |
|                 ComboBox[] comboBoxList = stackPanelList[i].Children.OfType<ComboBox>().ToArray();
 | |
|                 foreach (ComboBox comboBox in comboBoxList) // default status (for reset)
 | |
|                 {
 | |
|                     comboBox.FontWeight = FontWeights.Light;
 | |
|                     comboBox.SelectedItem = "None";
 | |
|                 }
 | |
|                 TextBlock textBlock = (TextBlock)stackPanelList[i].Children.OfType<Button>().FirstOrDefault().Content;
 | |
|                 textBlock.Text = "None";
 | |
|             }
 | |
| 
 | |
|             // Populate values
 | |
|             for (int i = 0; i < stackPanelList.Length; i++)
 | |
|             {
 | |
|                 // setup MOD
 | |
|                 HotkeyHandler.MOD mod = _hotkeys._Shortcuts[i].mod;
 | |
| 
 | |
|                 HotkeyHandler.MOD[] MODList = System.Enum.GetValues(typeof(HotkeyHandler.MOD))
 | |
|                     .OfType<HotkeyHandler.MOD>()
 | |
|                     .Select(x => x & _hotkeys._Shortcuts[i].mod)
 | |
|                     .Where(x => x != HotkeyHandler.MOD.None)
 | |
|                     .ToArray();
 | |
| 
 | |
|                 ComboBox[] comboBox = stackPanelList[i].Children.OfType<ComboBox>().ToArray();
 | |
|                 for (int j = 0; j < MODList.Length; j++)
 | |
|                 {
 | |
|                     comboBox[j].SelectedItem = MODList[j].ToString();
 | |
|                     if (comboBox[j].SelectedItem.ToString() != "None")
 | |
|                         comboBox[j].FontWeight = FontWeights.Bold;
 | |
|                 }
 | |
| 
 | |
|                 // setup VK
 | |
|                 TextBlock textBlock = (TextBlock)stackPanelList[i].Children.OfType<Button>().FirstOrDefault().Content;
 | |
|                 textBlock.Text = _hotkeys._Shortcuts[i].vk.ToString();
 | |
|                 if (textBlock.Text != "None")
 | |
|                     textBlock.FontWeight = FontWeights.Bold;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void HotkeyChanged()
 | |
|         {
 | |
|             _hotkeys.RemoveHotkeys();
 | |
|             _hotkeys.AddHotkeys();
 | |
|         }
 | |
| 
 | |
|         private ref HotkeyHandler.HotkeyPair GetHotkeyVariable(string Name)
 | |
|         {
 | |
|             if (Name == "Shortcut_NextTrack")
 | |
|                 return ref _hotkeys._NextTrack;
 | |
|             if (Name == "Shortcut_PreviousTrack")
 | |
|                 return ref _hotkeys._PreviousTrack;
 | |
|             if (Name == "Shortcut_PlayPause")
 | |
|                 return ref _hotkeys._PlayPause;
 | |
|             if (Name == "Shortcut_VolumeUp")
 | |
|                 return ref _hotkeys._VolumeUp;
 | |
|             if (Name == "Shortcut_VolumeDown")
 | |
|                 return ref _hotkeys._VolumeDown;
 | |
|             if (Name == "Shortcut_VolumeMute")
 | |
|                 return ref _hotkeys._VolumeMute;
 | |
|             if (Name == "Shortcut_ShowWindow")
 | |
|                 return ref _hotkeys._ShowWindow;
 | |
|             return ref _hotkeys._NextTrack;
 | |
|         }
 | |
| 
 | |
|         private void UpdateHotkey_MOD(string Name, HotkeyHandler.MOD mod) => GetHotkeyVariable(Name).SetMOD(mod);
 | |
|         private void UpdateHotkey_VK(string Name, HotkeyHandler.VK vk) => GetHotkeyVariable(Name).SetVK(vk);
 | |
| 
 | |
|         private void MOD_SelectionChanged(object sender, SelectionChangedEventArgs e)
 | |
|         {
 | |
|             if (!IsLoaded)
 | |
|                 return;
 | |
| 
 | |
|             ComboBox comboBox = (ComboBox)sender;
 | |
|             StackPanel stackPanel = (StackPanel)comboBox.Parent;
 | |
|             System.Collections.Generic.IEnumerable<ComboBox> stackPanelCollection = stackPanel.Children.OfType<ComboBox>();
 | |
| 
 | |
|             HotkeyHandler.MOD MOD1, MOD2;
 | |
| 
 | |
|             // we need to do this because the element is modified -after- this function
 | |
|             if (comboBox.Tag.ToString() == "MOD1")
 | |
|             {
 | |
|                 MOD1 = GetMOD(e.AddedItems[0].ToString());
 | |
|                 MOD2 = GetMOD(stackPanelCollection.Last().Text);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 MOD1 = GetMOD(stackPanelCollection.First().Text);
 | |
|                 MOD2 = GetMOD(e.AddedItems[0].ToString());
 | |
|             }
 | |
| 
 | |
|             if (e.AddedItems[0].ToString() == "None")
 | |
|                 comboBox.FontWeight = FontWeights.Light;
 | |
|             else
 | |
|                 comboBox.FontWeight = FontWeights.Bold;
 | |
| 
 | |
|             HotkeyHandler.MOD ModKey = MOD1 | MOD2;
 | |
| 
 | |
|             UpdateHotkey_MOD(stackPanel.Name, ModKey);
 | |
|             HotkeyChanged();
 | |
|         }
 | |
| 
 | |
|         private void RemapKey_Clicked(object sender, RoutedEventArgs e)
 | |
|         {
 | |
|             Button button = (Button)sender;
 | |
|             TextBlock textBlock = (TextBlock)button.Content;
 | |
|             textBlock.Text = unison.Resources.Resources.Settings_ShortcutsKey;
 | |
|             textBlock.FontWeight = FontWeights.Bold;
 | |
|             button.PreviewKeyDown += DetectPressedKey;
 | |
|         }
 | |
| 
 | |
|         private void DetectPressedKey(object sender, KeyEventArgs e)
 | |
|         {
 | |
|             e.Handled = true;
 | |
| 
 | |
|             Key pressedKey = e.Key;
 | |
|             HotkeyHandler.VK VirtualKey = GetVirtualKey(pressedKey);
 | |
| 
 | |
|             Button button = (Button)sender;
 | |
|             TextBlock textBlock = (TextBlock)button.Content;
 | |
|             StackPanel stackPanel = (StackPanel)button.Parent;
 | |
| 
 | |
|             if (VirtualKey == HotkeyHandler.VK.None)
 | |
|             {
 | |
|                 pressedKey = Key.None;
 | |
|                 textBlock.FontWeight = FontWeights.Light;
 | |
|             }
 | |
|             else
 | |
|                 textBlock.FontWeight = FontWeights.Bold;
 | |
| 
 | |
|             textBlock.Text = pressedKey.ToString();
 | |
|             button.PreviewKeyDown -= DetectPressedKey;
 | |
| 
 | |
|             UpdateHotkey_VK(stackPanel.Name, VirtualKey);
 | |
|             HotkeyChanged();
 | |
|         }
 | |
| 
 | |
|         private HotkeyHandler.VK GetVirtualKey(Key key)
 | |
|         {
 | |
|             foreach (object value in System.Enum.GetValues(typeof(HotkeyHandler.VK)))
 | |
|             {
 | |
|                 if (key.ToString().ToLower() == value.ToString().ToLower())
 | |
|                     return (HotkeyHandler.VK)value;
 | |
|             }
 | |
|             return HotkeyHandler.VK.None;
 | |
|         }
 | |
| 
 | |
|         private HotkeyHandler.MOD GetMOD(string str)
 | |
|         {
 | |
|             foreach (object value in System.Enum.GetValues(typeof(HotkeyHandler.MOD)))
 | |
|             {
 | |
|                 if (str.ToLower() == value.ToString().ToLower())
 | |
|                     return (HotkeyHandler.MOD)value;
 | |
|             }
 | |
|             return HotkeyHandler.MOD.None;
 | |
|         }
 | |
| 
 | |
|         private void ShortcutsReset_Clicked(object sender, RoutedEventArgs e)
 | |
|         {
 | |
|             Properties.Settings.Default.nextTrack_mod = (uint)Application.Current.FindResource("nextTrack_mod");
 | |
|             Properties.Settings.Default.nextTrack_vk = (uint)Application.Current.FindResource("nextTrack_vk");
 | |
|             Properties.Settings.Default.previousTrack_mod = (uint)Application.Current.FindResource("previousTrack_mod");
 | |
|             Properties.Settings.Default.previousTrack_vk = (uint)Application.Current.FindResource("previousTrack_vk");
 | |
|             Properties.Settings.Default.playPause_mod = (uint)Application.Current.FindResource("playPause_mod");
 | |
|             Properties.Settings.Default.playPause_vk = (uint)Application.Current.FindResource("playPause_vk");
 | |
|             Properties.Settings.Default.volumeUp_mod = (uint)Application.Current.FindResource("volumeUp_mod");
 | |
|             Properties.Settings.Default.volumeUp_vk = (uint)Application.Current.FindResource("volumeUp_vk");
 | |
|             Properties.Settings.Default.volumeDown_mod = (uint)Application.Current.FindResource("volumeDown_mod");
 | |
|             Properties.Settings.Default.volumeDown_vk = (uint)Application.Current.FindResource("volumeDown_vk");
 | |
|             Properties.Settings.Default.volumeMute_mod = (uint)Application.Current.FindResource("volumeMute_mod");
 | |
|             Properties.Settings.Default.volumeMute_vk = (uint)Application.Current.FindResource("volumeMute_vk");
 | |
|             Properties.Settings.Default.showWindow_mod = (uint)Application.Current.FindResource("showWindow_mod");
 | |
|             Properties.Settings.Default.showWindow_vk = (uint)Application.Current.FindResource("showWindow_vk");
 | |
| 
 | |
|             _hotkeys.Initialize();
 | |
|             HotkeyChanged();
 | |
|             InitializeShortcuts();
 | |
|         }
 | |
| 
 | |
|         public uint GetMod(StackPanel stackPanel)
 | |
|         {
 | |
|             return (uint)(GetMOD(stackPanel.Children.OfType<ComboBox>().First().SelectedItem.ToString()) | GetMOD(stackPanel.Children.OfType<ComboBox>().Last().SelectedItem.ToString()));
 | |
|         }
 | |
| 
 | |
|         public uint GetVk(StackPanel stackPanel)
 | |
|         {
 | |
|             Button button = stackPanel.Children.OfType<Button>().First();
 | |
|             TextBlock textBlock = (TextBlock)button.Content;
 | |
|             return (uint)(HotkeyHandler.VK)System.Enum.Parse(typeof(HotkeyHandler.VK), textBlock.Text, true);
 | |
|         }
 | |
|     }
 | |
| } |