Drag-Drop-Move

This commit is contained in:
2023-05-03 18:12:50 -07:00
parent 07ecbeb76c
commit e6acce3852
24 changed files with 853 additions and 160 deletions

View File

@ -1,6 +1,7 @@
using Humanizer;
using ShellProgressBar;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Text.Json;
using System.Text.RegularExpressions;
using View_by_Distance.Shared.Models;
@ -1122,35 +1123,43 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
SaveContainers(saveIndividually, totalNotMapped, null, saveContainers);
}
private List<SaveShortcutsForOutputResolutions> GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary<long, List<int>> personKeyToIds, ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Mapping[] mappingCollection)
private List<SaveShortcutsForOutputResolutions> GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary<long, List<int>> personKeyToIds, Mapping[] mappingCollection)
{
List<SaveShortcutsForOutputResolutions> results = new();
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
int season;
string? model;
long personKey;
string fileName;
string directory;
int dateCount = 0;
string weekOfYear;
string description;
DateTime? dateTime;
string directoryName;
List<long>? personKeys;
string personKeyFormatted;
Calendar calendar = new CultureInfo("en-US").Calendar;
IReadOnlyList<MetadataExtractor.Directory> directories;
List<LocationContainer<MetadataExtractor.Directory>>? locationContainers;
Dictionary<int, List<long>> idToPersonKeys = Stateless.Methods.IMapLogic.GetIdToPersonKeys(personKeyToIds);
foreach (Mapping mapping in mappingCollection)
{
if (mapping.MappingFromLocation is null || mapping.MappingFromItem.ImageFileHolder.DirectoryName is null || mapping.MappingFromPerson is null)
continue;
if (!idToLocationContainers.TryGetValue(mapping.MappingFromItem.Id, out locationContainers) || !locationContainers.Any())
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mapping.MappingFromItem.ResizedFileHolder.FullName);
else
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mapping.MappingFromItem.ResizedFileHolder.FullName);
dateTime = Metadata.Models.Stateless.Methods.IMetadata.GetMinimumDateTime(directories);
description = mapping.MappingFromLocation is null ? mapping.MappingFromItem.Id.ToString() : mapping.MappingFromLocation.DeterministicHashCodeKey;
if (dateTime is not null)
{
directories = locationContainers.First().Directories;
model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories);
if (model is null)
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mapping.MappingFromItem.ResizedFileHolder.FullName);
dateCount++;
(season, _) = IProperty.GetSeason(dateTime.Value.DayOfYear);
weekOfYear = calendar.GetWeekOfYear(dateTime.Value, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
directory = Path.Combine($"{eDistanceContentDirectory}---", "Date Shortcuts", $"{dateTime.Value.Year}.{season}-MM{dateTime.Value.Month:00}-WW{weekOfYear}");
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk");
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, description, MakeAllHidden: false));
}
model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories);
if (mapping.MappingFromItem.ImageFileHolder.DirectoryName is null)
continue;
directoryName = Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName);
if (!string.IsNullOrEmpty(model) && !string.IsNullOrEmpty(model.Trim()))
{
@ -1158,8 +1167,10 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
model = Regex.Replace(model.Trim(), @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_");
directory = Path.Combine($"{eDistanceContentDirectory}---", "Model Shortcuts", model, directoryName);
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk");
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey, MakeAllHidden: false));
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, description, MakeAllHidden: false));
}
if (mapping.MappingFromPerson is null)
continue;
if (!idToPersonKeys.TryGetValue(mapping.MappingFromItem.Id, out personKeys))
continue;
personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks;
@ -1168,22 +1179,22 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday);
directory = Path.Combine($"{eDistanceContentDirectory}---", "Person Key Shortcuts", personKeyFormatted, directoryName);
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk");
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey, MakeAllHidden: false));
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, description, MakeAllHidden: false));
if (IPerson.IsDefaultName(_Configuration.MappingDefaultName, mapping.MappingFromPerson.DisplayDirectoryName))
continue;
directory = Path.Combine($"{eDistanceContentDirectory}---", "Name Shortcuts", mapping.MappingFromPerson.DisplayDirectoryName, directoryName);
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk");
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey, MakeAllHidden: false));
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, description, MakeAllHidden: false));
}
return results;
}
public void SaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary<long, List<int>> personKeyToIds, ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Mapping[] mappingCollection)
public void SaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary<long, List<int>> personKeyToIds, Mapping[] mappingCollection)
{
string hiddenFile;
WindowsShortcut windowsShortcut;
List<SaveShortcutsForOutputResolutions> collection = new();
collection = GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, idToLocationContainers, mappingCollection);
collection = GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, mappingCollection);
string[] distinctDirectories = (from l in collection select l.Directory).Distinct().ToArray();
foreach (string directory in distinctDirectories)
{
@ -1308,13 +1319,14 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return new(directoriesAndDateTimes, collection);
}
public void SaveShortcutsForOutputResolutionsDuringMapLogic(Dictionary<long, List<int>> personKeyToIds, string dFacesContentDirectory, List<Item> filteredItems, Mapping[] mappingCollection)
public void SaveShortcutsForOutputResolutionsDuringMapLogic(Container[] containers, Dictionary<long, List<int>> personKeyToIds, string dFacesContentDirectory, Mapping[] mappingCollection)
{
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
WindowsShortcut windowsShortcut;
List<(string, DateTime[])> directoriesAndDateTimes;
List<SaveShortcutsForOutputResolutions> collection;
List<Item> filteredItems = IContainer.GetItems(_PropertyConfiguration, containers, distinctItems: true, filterItems: true);
(directoriesAndDateTimes, collection) = GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(personKeyToIds, dFacesContentDirectory, filteredItems, mappingCollection);
string[] directories = (from l in collection select l.Directory).Distinct().ToArray();
foreach (string directory in directories)

View File

@ -993,14 +993,39 @@ internal abstract class MapLogic
return results;
}
internal static Mapping[] GetSelectedMappingCollection(List<Face> distinctFilteredFaces)
internal static Mapping[] GetSelectedMappingCollection(List<Face> faces)
{
Mapping[] results;
IEnumerable<Mapping> collection = from l in distinctFilteredFaces orderby l.Mapping?.MappingFromItem.Id select l.Mapping;
IEnumerable<Mapping> collection = from l in faces orderby l.Mapping?.MappingFromItem.Id select l.Mapping;
results = (from l in collection where l is not null select l).ToArray();
return results;
}
internal static List<Face> GetFaces(List<Item> items)
{
List<Face> results = new();
foreach (Item item in items)
{
if (item.Property?.Id is null || item.ResizedFileHolder is null)
continue;
foreach (Face face in item.Faces)
{
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
continue;
results.Add(face);
}
}
return results;
}
internal static Mapping[] GetSelectedMappingCollection(List<Item> items)
{
Mapping[] results;
List<Face> faces = GetFaces(items);
results = GetSelectedMappingCollection(faces);
return results;
}
internal static Dictionary<int, Dictionary<int, Mapping>> GetIdToNormalizedRectangleToFace(Mapping[] mappingCollection)
{
Dictionary<int, Dictionary<int, Mapping>> results = new();

View File

@ -8,10 +8,20 @@ public interface IMapLogic
static Dictionary<int, List<long>> GetIdToPersonKeys(Dictionary<long, List<int>> personKeyToIds) =>
MapLogic.GetIdToPersonKeys(personKeyToIds);
Shared.Models.Mapping[] TestStatic_GetSelectedMappingCollection(List<Shared.Models.Face> distinctFilteredFaces) =>
GetSelectedMappingCollection(distinctFilteredFaces);
static Shared.Models.Mapping[] GetSelectedMappingCollection(List<Shared.Models.Face> distinctFilteredFaces) =>
MapLogic.GetSelectedMappingCollection(distinctFilteredFaces);
List<Shared.Models.Face> TestStatic_GetFaces(List<Shared.Models.Item> items) =>
GetFaces(items);
static List<Shared.Models.Face> GetFaces(List<Shared.Models.Item> items) =>
MapLogic.GetFaces(items);
Shared.Models.Mapping[] TestStatic_GetSelectedMappingCollection(List<Shared.Models.Item> items) =>
GetSelectedMappingCollection(items);
static Shared.Models.Mapping[] GetSelectedMappingCollection(List<Shared.Models.Item> items) =>
MapLogic.GetSelectedMappingCollection(items);
Shared.Models.Mapping[] TestStatic_GetSelectedMappingCollection(List<Shared.Models.Face> faces) =>
GetSelectedMappingCollection(faces);
static Shared.Models.Mapping[] GetSelectedMappingCollection(List<Shared.Models.Face> faces) =>
MapLogic.GetSelectedMappingCollection(faces);
Dictionary<int, Dictionary<int, Shared.Models.Mapping>> TestStatic_GetIdToNormalizedRectangleToFace(Shared.Models.Mapping[] mappingCollection) =>
GetIdToNormalizedRectangleToFace(mappingCollection);