Add Custom Sound block
This commit is contained in:
		
							parent
							
								
									1e9b1158bd
								
							
						
					
					
						commit
						2958d93b33
					
				| @ -15,7 +15,7 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes | ||||
|             Value = value; | ||||
|         } | ||||
| 
 | ||||
|         public override string OutputText => PrefixText + " " + Value; | ||||
|         public override string OutputText => PrefixText + " \"" + Value + "\""; | ||||
| 
 | ||||
|         public override string SummaryText => string.Empty; | ||||
|         public override Color SummaryBackgroundColor => Colors.Transparent; | ||||
|  | ||||
| @ -0,0 +1,21 @@ | ||||
| using Filtration.ObjectModel.BlockItemBaseTypes; | ||||
| 
 | ||||
| namespace Filtration.ObjectModel.BlockItemTypes | ||||
| { | ||||
|     public class CustomSoundBlockItem : StringBlockItem | ||||
|     { | ||||
|         public CustomSoundBlockItem() | ||||
|         { | ||||
|             Value = ""; | ||||
|         } | ||||
| 
 | ||||
|         public CustomSoundBlockItem(string value) : base(value) | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public override string PrefixText => "CustomAlertSound"; | ||||
|         public override int MaximumAllowed => 1; | ||||
|         public override string DisplayHeading => "Custom Alert Sound"; | ||||
|         public override int SortOrder => 30; | ||||
|     } | ||||
| } | ||||
| @ -64,6 +64,7 @@ | ||||
|     <Compile Include="BlockItemTypes\BeamBlockItem.cs" /> | ||||
|     <Compile Include="BlockItemTypes\BorderColorBlockItem.cs" /> | ||||
|     <Compile Include="BlockItemTypes\ClassBlockItem.cs" /> | ||||
|     <Compile Include="BlockItemTypes\CustomSoundBlockItem.cs" /> | ||||
|     <Compile Include="BlockItemTypes\DisableDropSoundBlockItem.cs" /> | ||||
|     <Compile Include="BlockItemTypes\ElderMapBlockItem.cs" /> | ||||
|     <Compile Include="BlockItemTypes\GemLevelBlockItem.cs" /> | ||||
|  | ||||
| @ -235,6 +235,7 @@ namespace Filtration.Parser.Services | ||||
|                         // Only ever use the last PlayAlertSound item encountered as multiples aren't valid. | ||||
|                         RemoveExistingBlockItemsOfType<SoundBlockItem>(block); | ||||
|                         RemoveExistingBlockItemsOfType<PositionalSoundBlockItem>(block); | ||||
|                         RemoveExistingBlockItemsOfType<CustomSoundBlockItem>(block); | ||||
| 
 | ||||
|                         var match = Regex.Match(trimmedLine, @"\S+\s+(\S+)\s?(\d+)?\s*([#]?)(.*)"); | ||||
|                          | ||||
| @ -314,7 +315,7 @@ namespace Filtration.Parser.Services | ||||
|                         // Only ever use the last Icon item encountered as multiples aren't valid. | ||||
|                         RemoveExistingBlockItemsOfType<IconBlockItem>(block); | ||||
| 
 | ||||
|                         var match = Regex.Match(trimmedLine, @"\S+\s+(\S+)"); | ||||
|                         var match = Regex.Match(trimmedLine, @"\S+\s+""(\S+)"""); | ||||
|                          | ||||
|                         if (match.Success) | ||||
|                         { | ||||
| @ -341,6 +342,25 @@ namespace Filtration.Parser.Services | ||||
|                         block.BlockItems.Add(beamBlockItem); | ||||
|                         break; | ||||
|                     } | ||||
|                     case "CustomAlertSound": | ||||
|                     { | ||||
|                         // Only ever use the last CustomSoundBlockItem item encountered as multiples aren't valid. | ||||
|                         RemoveExistingBlockItemsOfType<CustomSoundBlockItem>(block); | ||||
|                         RemoveExistingBlockItemsOfType<SoundBlockItem>(block); | ||||
|                         RemoveExistingBlockItemsOfType<PositionalSoundBlockItem>(block); | ||||
| 
 | ||||
|                         var match = Regex.Match(trimmedLine, @"\S+\s+""(\S+)"""); | ||||
|                          | ||||
|                         if (match.Success) | ||||
|                         { | ||||
|                             var blockItemValue = new CustomSoundBlockItem | ||||
|                             { | ||||
|                                 Value = match.Groups[1].Value | ||||
|                             }; | ||||
|                             block.BlockItems.Add(blockItemValue); | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|  | ||||
| @ -177,6 +177,25 @@ | ||||
|                             <userControls:ImageComboBoxControl/> | ||||
|                         </WrapPanel> | ||||
|                     </DataTemplate> | ||||
| 
 | ||||
|                     <!-- Custom Sound Template --> | ||||
|                     <DataTemplate DataType="{x:Type blockItemTypes:CustomSoundBlockItem}"> | ||||
|                         <Grid> | ||||
|                             <Grid.ColumnDefinitions> | ||||
|                                 <ColumnDefinition Width="20"/> | ||||
|                                 <ColumnDefinition Width="*"/> | ||||
|                             </Grid.ColumnDefinitions> | ||||
|                             <Button Grid.Column="0" Command="{Binding Path=DataContext.PlayCustomSoundCommand, RelativeSource={RelativeSource AncestorType={x:Type views:ItemFilterBlockView}}}" Width="20" Height="20" Background="Transparent" BorderBrush="Transparent"> | ||||
|                                 <Image Source="/Filtration;component/Resources/Icons/speaker_icon.png"  VerticalAlignment="Center" HorizontalAlignment="Center" /> | ||||
|                             </Button> | ||||
|                             <ComboBox Grid.Column="1" ItemsSource="{Binding Path=DataContext.CustomSoundsAvailable, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type views:ItemFilterBlockView}}}"  | ||||
|                                       SelectedValue="{Binding Value}" Style="{StaticResource MetroComboBox}"/> | ||||
|                             <Button Grid.Column="1" Command="{Binding Path=DataContext.CustomSoundFileDialogCommand, RelativeSource={RelativeSource AncestorType={x:Type views:ItemFilterBlockView}}}" | ||||
|                                     Width="20" Height="20" Background="Transparent" BorderBrush="Transparent" Margin="0,0,30,0" VerticalAlignment="Center" HorizontalAlignment="Right"> | ||||
|                                 <Image Grid.Column="1" Source="/Filtration;component/Resources/Icons/open_icon.png"/> | ||||
|                             </Button> | ||||
|                         </Grid> | ||||
|                     </DataTemplate> | ||||
|                 </ContentControl.Resources> | ||||
|             </ContentControl> | ||||
|         </Grid> | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Collections.ObjectModel; | ||||
| using System.Collections.Specialized; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Windows.Media; | ||||
| using Filtration.ObjectModel; | ||||
| @ -10,6 +11,7 @@ using Filtration.ObjectModel.BlockItemTypes; | ||||
| using Filtration.Services; | ||||
| using Filtration.Views; | ||||
| using GalaSoft.MvvmLight.CommandWpf; | ||||
| using Microsoft.Win32; | ||||
| using Xceed.Wpf.Toolkit; | ||||
| 
 | ||||
| namespace Filtration.ViewModels | ||||
| @ -28,6 +30,7 @@ namespace Filtration.ViewModels | ||||
|         private readonly IStaticDataService _staticDataService; | ||||
|         private readonly IReplaceColorsViewModel _replaceColorsViewModel; | ||||
|         private readonly MediaPlayer _mediaPlayer = new MediaPlayer(); | ||||
|         public static ObservableCollection<string> _customSoundsAvailable; | ||||
| 
 | ||||
|         private bool _displaySettingsPopupOpen; | ||||
|         private bool _isExpanded; | ||||
| @ -47,6 +50,16 @@ namespace Filtration.ViewModels | ||||
|             SwitchBlockItemsViewCommand = new RelayCommand(OnSwitchBlockItemsViewCommand); | ||||
|             PlaySoundCommand = new RelayCommand(OnPlaySoundCommand, () => HasSound); | ||||
|             PlayPositionalSoundCommand = new RelayCommand(OnPlayPositionalSoundCommand, () => HasPositionalSound); | ||||
|             PlayCustomSoundCommand = new RelayCommand(OnPlayCustomSoundCommand, () => HasCustomSound); | ||||
|             CustomSoundFileDialogCommand = new RelayCommand(OnCustomSoundFileDialog); | ||||
| 
 | ||||
|             if(_customSoundsAvailable == null || _customSoundsAvailable.Count < 1) | ||||
|             { | ||||
|                 _customSoundsAvailable = new ObservableCollection<string> { | ||||
|                     "1maybevaluable.mp3", "2currency.mp3", "3uniques.mp3", "4maps.mp3", "5highmaps.mp3", | ||||
|                     "6veryvaluable.mp3", "7chancing.mp3", "12leveling.mp3", "placeholder.mp3" | ||||
|                 }; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public override void Initialise(IItemFilterBlockBase itemFilterBlockBase, IItemFilterScriptViewModel parentScriptViewModel) | ||||
| @ -66,9 +79,16 @@ namespace Filtration.ViewModels | ||||
|             foreach (var blockItem in itemFilterBlock.BlockItems) | ||||
|             { | ||||
|                 blockItem.PropertyChanged += OnBlockItemChanged; | ||||
| 
 | ||||
|                 var customSoundBlockItem = blockItem as CustomSoundBlockItem; | ||||
|                 if (customSoundBlockItem != null) | ||||
|                 { | ||||
|                     if (_customSoundsAvailable.IndexOf(customSoundBlockItem.Value) < 0) | ||||
|                     { | ||||
|                         _customSoundsAvailable.Add(customSoundBlockItem.Value); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|             base.Initialise(itemFilterBlock, parentScriptViewModel); | ||||
|         } | ||||
| 
 | ||||
| @ -81,6 +101,8 @@ namespace Filtration.ViewModels | ||||
|         public RelayCommand PlaySoundCommand { get; } | ||||
|         public RelayCommand PlayPositionalSoundCommand { get; } | ||||
|         public RelayCommand SwitchBlockItemsViewCommand { get; } | ||||
|         public RelayCommand CustomSoundFileDialogCommand { get; } | ||||
|         public RelayCommand PlayCustomSoundCommand { get; } | ||||
| 
 | ||||
|         public IItemFilterBlock Block { get; private set; } | ||||
| 
 | ||||
| @ -176,7 +198,8 @@ namespace Filtration.ViewModels | ||||
|             typeof (PositionalSoundBlockItem), | ||||
|             typeof (DisableDropSoundBlockItem), | ||||
|             typeof (IconBlockItem), | ||||
|             typeof (BeamBlockItem) | ||||
|             typeof (BeamBlockItem), | ||||
|             typeof (CustomSoundBlockItem) | ||||
|         }; | ||||
| 
 | ||||
|         public bool BlockEnabled | ||||
| @ -212,6 +235,8 @@ namespace Filtration.ViewModels | ||||
| 
 | ||||
|         public ObservableCollection<ColorItem> AvailableColors => PathOfExileColors.DefaultColors; | ||||
| 
 | ||||
|         public ObservableCollection<string> CustomSoundsAvailable => _customSoundsAvailable; | ||||
| 
 | ||||
|         public Color DisplayTextColor => Block.DisplayTextColor; | ||||
|         public Color DisplayBackgroundColor => Block.DisplayBackgroundColor; | ||||
|         public Color DisplayBorderColor => Block.DisplayBorderColor; | ||||
| @ -221,6 +246,7 @@ namespace Filtration.ViewModels | ||||
| 
 | ||||
|         public bool HasSound => Block.HasBlockItemOfType<SoundBlockItem>(); | ||||
|         public bool HasPositionalSound => Block.HasBlockItemOfType<PositionalSoundBlockItem>(); | ||||
|         public bool HasCustomSound => Block.HasBlockItemOfType<CustomSoundBlockItem>(); | ||||
| 
 | ||||
|         public bool HasAudioVisualBlockItems => AudioVisualBlockItems.Any(); | ||||
| 
 | ||||
| @ -444,6 +470,8 @@ namespace Filtration.ViewModels | ||||
|             RaisePropertyChanged(nameof(DisplayIcon)); | ||||
|             RaisePropertyChanged(nameof(DisplayBeamColor)); | ||||
|             RaisePropertyChanged(nameof(HasSound)); | ||||
|             RaisePropertyChanged(nameof(HasPositionalSound)); | ||||
|             RaisePropertyChanged(nameof(HasCustomSound)); | ||||
|         } | ||||
| 
 | ||||
|         private void OnBlockItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) | ||||
| @ -453,5 +481,53 @@ namespace Filtration.ViewModels | ||||
|             RaisePropertyChanged(nameof(AudioVisualBlockItems)); | ||||
|             RaisePropertyChanged(nameof(HasAudioVisualBlockItems)); | ||||
|         } | ||||
| 
 | ||||
|         private void OnCustomSoundFileDialog() | ||||
|         { | ||||
|             OpenFileDialog fileDialog = new OpenFileDialog(); | ||||
|             fileDialog.DefaultExt = ".mp3"; | ||||
|             var poePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).ToString() + @"\My Games\Path of Exile\"; | ||||
|             fileDialog.InitialDirectory = poePath; | ||||
| 
 | ||||
|             Nullable<bool> result = fileDialog.ShowDialog(); | ||||
|             if (result == true) | ||||
|             { | ||||
|                 var fileName = fileDialog.FileName; | ||||
|                 if(fileName.StartsWith(poePath)) | ||||
|                 { | ||||
|                     fileName = fileName.Replace(poePath, ""); | ||||
|                 } | ||||
| 
 | ||||
|                 var customSoundBlockItem = BlockItems.First(b => b.GetType() == typeof(CustomSoundBlockItem)) as CustomSoundBlockItem; | ||||
| 
 | ||||
|                 if (CustomSoundsAvailable.IndexOf(fileName) < 0) | ||||
|                 { | ||||
|                     CustomSoundsAvailable.Add(fileName); | ||||
|                     RaisePropertyChanged(nameof(CustomSoundsAvailable)); | ||||
|                 } | ||||
|                 customSoundBlockItem.Value = fileName; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void OnPlayCustomSoundCommand() | ||||
|         { | ||||
|             var poePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).ToString() + @"\My Games\Path of Exile\"; | ||||
|             var identifier = BlockItems.OfType<CustomSoundBlockItem>().First().Value; | ||||
| 
 | ||||
|             if(!Path.IsPathRooted(identifier)) | ||||
|             { | ||||
|                 identifier = poePath + identifier; | ||||
|             } | ||||
| 
 | ||||
|             try | ||||
|             { | ||||
|                 _mediaPlayer.Open(new Uri(identifier, UriKind.Absolute)); | ||||
|                 _mediaPlayer.Play(); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 MessageBox.Show("Couldn't play the file. Please be sure it is a valid audio file."); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -161,6 +161,18 @@ | ||||
|                                         ToolTip="Click to preview drop sound"> | ||||
|                                     <Image Source="/Filtration;component/Resources/Icons/speaker_icon.png"  VerticalAlignment="Center" HorizontalAlignment="Center" /> | ||||
|                                 </Button> | ||||
|                                 <Button Command="{Binding PlayCustomSoundCommand}" | ||||
|                                         Width="25" | ||||
|                                         Height="25" | ||||
|                                         VerticalAlignment="Center" | ||||
|                                         HorizontalAlignment="Center" | ||||
|                                         Margin="0,0,3,0" | ||||
|                                         Visibility="{Binding HasCustomSound, Converter={StaticResource BooleanVisibilityConverter}}" | ||||
|                                         Background="Transparent" | ||||
|                                         BorderBrush="Transparent" | ||||
|                                         ToolTip="Click to preview drop sound"> | ||||
|                                     <Image Source="/Filtration;component/Resources/Icons/speaker_icon.png"  VerticalAlignment="Center" HorizontalAlignment="Center" /> | ||||
|                                 </Button> | ||||
|                                 <ToggleButton Margin="0,2,2,2" | ||||
|                                               Style="{StaticResource ChromelessToggleButton}" | ||||
|                                               x:Name="ItemPreviewButton" | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user