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