using System; using System.Collections.Generic; using System.Linq; namespace DatabaseImport { public class Zone //: BasePropertyChanged { public string Name { get; set; } public string Description { get; set; } public string Image { get; set; } private readonly TestObjectTemplate _template; public TemplateZone ISODllZone { get; } public Zone(Zone copy, TestObjectTemplate template) { ISODllZone = copy.ISODllZone; _template = template; Description = ISODllZone?.Description ?? ""; Image = ISODllZone?.Picture; _fileNames = new List(); PopulateFilenamesIfNeeded(); PictureIndex = copy.PictureIndex; PictureSource = copy.PictureSource; Name = ISODllZone.ZoneName; _regions = new List(copy.Regions); } public Zone(TemplateZone z, TestObjectTemplate template) { ISODllZone = z; _template = template; Description = z?.Description ?? ""; Image = z?.Picture; var path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ZonePictures"); if (!string.IsNullOrEmpty(Image)) { path = System.IO.Path.Combine(path, Image); if (!System.IO.File.Exists(path)) { PictureIndex = -1; } else { var src = new System.Windows.Media.Imaging.BitmapImage(); src.BeginInit(); src.UriSource = new Uri(path, UriKind.Absolute); try { src.EndInit(); PictureSource = src; _pictureIndex = AllPictures.ToList().IndexOf(Image); } catch { PictureIndex = -1; } } } if (z != null) { Name = z.ZoneName; _regions = new List(); foreach (var r in z.TemplateRegions) { var region = new Region(template, r); _regions.Add(region); } } } public class FileInfoComparer : IComparer { int IComparer.Compare(System.IO.FileInfo left, System.IO.FileInfo right) { if (left == right) { return 0; } if (left == null) { return -1; } return right == null ? 1 : string.Compare(left.FullName, right.FullName, StringComparison.Ordinal); } } private List _fileNames; private static object MyLock = new object(); public string[] AllPictures { get { lock (MyLock) { PopulateFilenamesIfNeeded(); return _fileNames.Select(fi => fi.Name).ToArray(); } } } public void PopulateFilenamesIfNeeded() { lock (MyLock) { if (null == _fileNames || _fileNames.Count == 0) { PopulateFilenames(); } } } private void PopulateFilenames() { lock (MyLock) { var files = new List(); files.AddRange(System.IO.Directory.EnumerateFiles( System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ZonePictures"))); _fileNames = new List(); foreach (var file in files) { _fileNames.Add(new System.IO.FileInfo(file)); } _fileNames.Sort(new FileInfoComparer()); } } private int _pictureIndex = -1; public int PictureIndex { get => _pictureIndex; set { if (value < 0) { PictureSource = null; } else { var src = new System.Windows.Media.Imaging.BitmapImage(); lock (MyLock) { PopulateFilenamesIfNeeded(); src.BeginInit(); src.UriSource = new Uri(_fileNames[value].FullName, UriKind.Absolute); src.EndInit(); } PictureSource = src; } _pictureIndex = value; } } public string GetPictureName() { return _pictureIndex < 0 ? "" : _fileNames[_pictureIndex].Name; } public System.Windows.Media.ImageSource PictureSource { get; set; } = null; private List _regions = new List(); public Region[] Regions { get => _regions.ToArray(); set => _regions = new List(value); } } }