1 using System; 2 using System.Collections.Generic; 3 using System.Collections.ObjectModel; 4 using System.ComponentModel; 5 using System.Globalization; 6 using System.Linq; 7 using Prism.Mvvm; 8 using TrainEditor2.Extensions; 9 using TrainEditor2.Models.Others; 10 11 namespace TrainEditor2.Models.Sounds 12 { 13 internal class Sound : BindableBase, ICloneable 14 { 15 private readonly CultureInfo culture; 16 17 private TreeViewItemModel treeItem; 18 private TreeViewItemModel selectedTreeItem; 19 20 private ListViewItemModel selectedListItem; 21 22 internal TreeViewItemModel TreeItem 23 { 24 get 25 { 26 return treeItem; 27 } 28 set 29 { 30 SetProperty(ref treeItem, value); 31 } 32 } 33 34 internal TreeViewItemModel SelectedTreeItem 35 { 36 get 37 { 38 return selectedTreeItem; 39 } 40 set 41 { 42 SetProperty(ref selectedTreeItem, value); 43 } 44 } 45 46 internal ListViewItemModel SelectedListItem 47 { 48 get 49 { 50 return selectedListItem; 51 } 52 set 53 { 54 SetProperty(ref selectedListItem, value); 55 } 56 } 57 58 internal ObservableCollection<SoundElement> SoundElements; 59 60 internal ObservableCollection<ListViewColumnHeaderModel> ListColumns; 61 internal ObservableCollection<ListViewItemModel> ListItems; 62 Sound()63 internal Sound() 64 { 65 culture = CultureInfo.InvariantCulture; 66 67 SoundElements = new ObservableCollection<SoundElement>(); 68 69 ListColumns = new ObservableCollection<ListViewColumnHeaderModel>(); 70 ListItems = new ObservableCollection<ListViewItemModel>(); 71 72 CreateTreeItem(); 73 SelectedTreeItem = TreeItem; 74 } 75 Clone()76 public object Clone() 77 { 78 Sound sound = (Sound)MemberwiseClone(); 79 80 sound.SoundElements = new ObservableCollection<SoundElement>(SoundElements.Select(x => (SoundElement)x.Clone())); 81 82 sound.ListColumns = new ObservableCollection<ListViewColumnHeaderModel>(); 83 sound.ListItems = new ObservableCollection<ListViewItemModel>(); 84 85 sound.CreateTreeItem(); 86 sound.SelectedTreeItem = sound.TreeItem; 87 88 return sound; 89 } 90 CreateTreeItem()91 internal void CreateTreeItem() 92 { 93 treeItem = new TreeViewItemModel(null) { Title = "Sound" }; 94 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Run" }); 95 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Flange" }); 96 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Motor" }); 97 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "FrontSwitch" }); 98 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "RearSwitch" }); 99 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Brake" }); 100 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Compressor" }); 101 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Suspension" }); 102 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "PrimaryHorn" }); 103 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "SecondaryHorn" }); 104 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "MusicHorn" }); 105 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Door" }); 106 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Ats" }); 107 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Buzzer" }); 108 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "PilotLamp" }); 109 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "BrakeHandle" }); 110 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "MasterController" }); 111 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Reverser" }); 112 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Breaker" }); 113 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "RequestStop" }); 114 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Touch" }); 115 treeItem.Children.Add(new TreeViewItemModel(TreeItem) { Title = "Others" }); 116 OnPropertyChanged(new PropertyChangedEventArgs(nameof(TreeItem))); 117 } 118 CreateListColumns()119 internal void CreateListColumns() 120 { 121 ListColumns.Clear(); 122 123 if (TreeItem.Children.Contains(SelectedTreeItem)) 124 { 125 ListColumns.Add(new ListViewColumnHeaderModel { Text = "Key" }); 126 ListColumns.Add(new ListViewColumnHeaderModel { Text = "FilePath" }); 127 ListColumns.Add(new ListViewColumnHeaderModel { Text = "Position" }); 128 ListColumns.Add(new ListViewColumnHeaderModel { Text = "Radius" }); 129 } 130 } 131 CreateListItems()132 internal void CreateListItems() 133 { 134 ListItems.Clear(); 135 136 IEnumerable<SoundElement> elements = null; 137 138 if (SelectedTreeItem == TreeItem.Children[0]) 139 { 140 elements = SoundElements.OfType<RunElement>(); 141 } 142 143 if (SelectedTreeItem == TreeItem.Children[1]) 144 { 145 elements = SoundElements.OfType<FlangeElement>(); 146 } 147 148 if (SelectedTreeItem == TreeItem.Children[2]) 149 { 150 elements = SoundElements.OfType<MotorElement>(); 151 } 152 153 if (SelectedTreeItem == TreeItem.Children[3]) 154 { 155 elements = SoundElements.OfType<FrontSwitchElement>(); 156 } 157 158 if (SelectedTreeItem == TreeItem.Children[4]) 159 { 160 elements = SoundElements.OfType<RearSwitchElement>(); 161 } 162 163 if (SelectedTreeItem == TreeItem.Children[5]) 164 { 165 elements = SoundElements.OfType<BrakeElement>(); 166 } 167 168 if (SelectedTreeItem == TreeItem.Children[6]) 169 { 170 elements = SoundElements.OfType<CompressorElement>(); 171 } 172 173 if (SelectedTreeItem == TreeItem.Children[7]) 174 { 175 elements = SoundElements.OfType<SuspensionElement>(); 176 } 177 178 if (SelectedTreeItem == TreeItem.Children[8]) 179 { 180 elements = SoundElements.OfType<PrimaryHornElement>(); 181 } 182 183 if (SelectedTreeItem == TreeItem.Children[9]) 184 { 185 elements = SoundElements.OfType<SecondaryHornElement>(); 186 } 187 188 if (SelectedTreeItem == TreeItem.Children[10]) 189 { 190 elements = SoundElements.OfType<MusicHornElement>(); 191 } 192 193 if (SelectedTreeItem == TreeItem.Children[11]) 194 { 195 elements = SoundElements.OfType<DoorElement>(); 196 } 197 198 if (SelectedTreeItem == TreeItem.Children[12]) 199 { 200 elements = SoundElements.OfType<AtsElement>(); 201 } 202 203 if (SelectedTreeItem == TreeItem.Children[13]) 204 { 205 elements = SoundElements.OfType<BuzzerElement>(); 206 } 207 208 if (SelectedTreeItem == TreeItem.Children[14]) 209 { 210 elements = SoundElements.OfType<PilotLampElement>(); 211 } 212 213 if (SelectedTreeItem == TreeItem.Children[15]) 214 { 215 elements = SoundElements.OfType<BrakeHandleElement>(); 216 } 217 218 if (SelectedTreeItem == TreeItem.Children[16]) 219 { 220 elements = SoundElements.OfType<MasterControllerElement>(); 221 } 222 223 if (SelectedTreeItem == TreeItem.Children[17]) 224 { 225 elements = SoundElements.OfType<ReverserElement>(); 226 } 227 228 if (SelectedTreeItem == TreeItem.Children[18]) 229 { 230 elements = SoundElements.OfType<BreakerElement>(); 231 } 232 233 if (SelectedTreeItem == TreeItem.Children[19]) 234 { 235 elements = SoundElements.OfType<RequestStopElement>(); 236 } 237 238 if (SelectedTreeItem == TreeItem.Children[20]) 239 { 240 elements = SoundElements.OfType<TouchElement>(); 241 } 242 243 if (SelectedTreeItem == TreeItem.Children[21]) 244 { 245 elements = SoundElements.OfType<OthersElement>(); 246 } 247 248 if (elements != null) 249 { 250 foreach (SoundElement element in elements) 251 { 252 ListViewItemModel newItem = new ListViewItemModel { Texts = new ObservableCollection<string>(new string[4]), Tag = element }; 253 UpdateListItem(newItem); 254 ListItems.Add(newItem); 255 } 256 } 257 } 258 UpdateListItem(ListViewItemModel item)259 internal void UpdateListItem(ListViewItemModel item) 260 { 261 SoundElement element = (SoundElement)item.Tag; 262 Enum key = element.Key as Enum; 263 264 item.Texts[0] = key != null ? key.GetStringValues().First() : element.Key.ToString(); 265 item.Texts[1] = element.FilePath; 266 item.Texts[2] = element.DefinedPosition ? $"{element.PositionX.ToString(culture)}, {element.PositionY.ToString(culture)}, {element.PositionZ.ToString(culture)}" : string.Empty; 267 item.Texts[3] = element.DefinedRadius ? element.Radius.ToString(culture) : string.Empty; 268 } 269 270 internal void AddElement<T>() where T : SoundElement<int>, new() 271 { 272 T t = new T(); 273 274 if (SoundElements.OfType<T>().Any()) 275 { 276 t.Key = SoundElements.OfType<T>().Last().Key + 1; 277 } 278 279 SoundElements.Add(t); 280 281 ListViewItemModel newItem = new ListViewItemModel { Texts = new ObservableCollection<string>(new string[4]), Tag = t }; 282 UpdateListItem(newItem); 283 ListItems.Add(newItem); 284 285 SelectedListItem = ListItems.Last(); 286 } 287 288 internal void AddElement<T, U>() where T : SoundElement<U>, new() 289 { 290 T t = new T 291 { 292 Key = Enum.GetValues(typeof(U)).OfType<U>().Except(SoundElements.OfType<T>().Select(x => x.Key)).First() 293 }; 294 295 SoundElements.Add(t); 296 297 ListViewItemModel newItem = new ListViewItemModel { Texts = new ObservableCollection<string>(new string[4]), Tag = t }; 298 UpdateListItem(newItem); 299 ListItems.Add(newItem); 300 301 SelectedListItem = ListItems.Last(); 302 } 303 304 internal void RemoveElement<T>() where T : SoundElement 305 { 306 T t = (T)SelectedListItem.Tag; 307 308 SoundElements.Remove(t); 309 310 ListItems.Remove(SelectedListItem); 311 312 SelectedListItem = null; 313 } 314 } 315 } 316