Skip to content

Commit 25d76fb

Browse files
committed
Update Sorting for #79; update FrmEditFile to work with DEs
1 parent 8837a0b commit 25d76fb

9 files changed

Lines changed: 282 additions & 207 deletions

FrmEditFileData.cs

Lines changed: 103 additions & 82 deletions
Large diffs are not rendered by default.

FrmMainApp.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public partial class FrmMainApp : Form
6363
public const string NullStringEquivalentZero = "0"; // fml.
6464
public const int NullIntEquivalent = 0;
6565
public const double NullDoubleEquivalent = 0.0;
66+
public static readonly DateTime NullDateTimeEquivalent = new DateTime(1, 1, 1, 0, 0, 0);
6667

6768
internal static DataTable DtLanguageLabels;
6869
internal static DataTable DtFavourites;

FrmPasteWhat.cs

Lines changed: 32 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -294,131 +294,68 @@ private async void btn_OK_Click(object sender,
294294

295295
// there must be a better way around this
296296
Type typeOfAttribute = GetAttributeType(attribute: attribute);
297-
string pasteValueStr = null;
298-
double? pasteValueDbl = null;
299-
int? pasteValueInt = null;
297+
IConvertible pasteConvertible = null;
300298

301299
// by this point we know that _there is_ something to paste.
302300
btn_OK.Enabled = false;
303301
btn_Cancel.Enabled = false;
304302

305-
// check it's sitting somewhere already?
303+
// check it's sitting somewhere already? -- can't be null.
304+
DirectoryElement.AttributeVersion maxAttributeVersion = DirectoryElement.AttributeVersion.Original;
305+
bool dataExistsSomewhere = false;
306306

307-
bool dataInStage1QueuedInEditForm = false;
308-
bool dataInStage3ReadyToWrite = false;
309-
bool dataInFile = false;
307+
List<DirectoryElement.AttributeVersion> relevantAttributeVersions = new()
308+
{
309+
// DO NOT reorder!
310+
DirectoryElement.AttributeVersion.Stage1EditFormIntraTabTransferQueue,
311+
DirectoryElement.AttributeVersion.Stage3ReadyToWrite,
312+
DirectoryElement.AttributeVersion.Original
313+
};
310314

311315
if (dirElemFileToCopyFrom != null)
312316
{
313-
dataInStage1QueuedInEditForm = dirElemFileToCopyFrom.HasSpecificAttributeWithVersion(
314-
attribute: attribute,
315-
version: DirectoryElement.AttributeVersion.Stage1EditFormIntraTabTransferQueue);
316-
317-
dataInStage3ReadyToWrite = dirElemFileToCopyFrom.HasSpecificAttributeWithVersion(
318-
attribute: attribute,
319-
version: DirectoryElement.AttributeVersion.Stage3ReadyToWrite);
320-
321-
dataInFile = dirElemFileToCopyFrom.HasSpecificAttributeWithVersion(attribute: attribute,
322-
version: DirectoryElement.AttributeVersion.Original);
323-
324-
// see if data in temp-queue
325-
if (dataInStage1QueuedInEditForm)
317+
//
318+
foreach (DirectoryElement.AttributeVersion relevantAttributeVersion in relevantAttributeVersions)
326319
{
327-
pasteValueStr = dirElemFileToCopyFrom.GetAttributeValueString(attribute: attribute, version: DirectoryElement.AttributeVersion.Stage1EditFormIntraTabTransferQueue);
328-
329-
if (typeOfAttribute == typeof(double))
330-
{
331-
pasteValueDbl = dirElemFileToCopyFrom.GetAttributeValue<double>(
320+
if (dirElemFileToCopyFrom.HasSpecificAttributeWithVersion(
332321
attribute: attribute,
333-
version: DirectoryElement.AttributeVersion.Stage1EditFormIntraTabTransferQueue);
334-
}
335-
else if (typeOfAttribute == typeof(int))
322+
version: relevantAttributeVersion))
336323
{
337-
pasteValueInt = dirElemFileToCopyFrom.GetAttributeValue<int>(
338-
attribute: attribute,
339-
version: DirectoryElement.AttributeVersion.Stage1EditFormIntraTabTransferQueue);
324+
maxAttributeVersion = relevantAttributeVersion;
325+
dataExistsSomewhere = true;
326+
break;
340327
}
341328
}
342-
// see if data is ready to be written
343-
else if (dataInStage3ReadyToWrite)
344-
{
345-
pasteValueStr = dirElemFileToCopyFrom.GetAttributeValueString(attribute: attribute, version: DirectoryElement.AttributeVersion.Stage3ReadyToWrite);
346329

347-
if (typeOfAttribute == typeof(double))
330+
if (dataExistsSomewhere)
331+
{
332+
if (typeOfAttribute == typeof(string))
348333
{
349-
pasteValueDbl = dirElemFileToCopyFrom.GetAttributeValue<double>(
350-
attribute: attribute,
351-
version: DirectoryElement.AttributeVersion.Stage3ReadyToWrite);
334+
dirElemFileToCopyFrom.GetAttributeValueString(attribute: attribute,
335+
version: maxAttributeVersion);
352336
}
353337
else if (typeOfAttribute == typeof(int))
354338
{
355-
pasteValueInt = dirElemFileToCopyFrom.GetAttributeValue<int>(
339+
pasteConvertible = dirElemFileToCopyFrom.GetAttributeValue<int>(
356340
attribute: attribute,
357-
version: DirectoryElement.AttributeVersion.Stage3ReadyToWrite);
341+
version: maxAttributeVersion);
358342
}
359-
}
360-
// take it from the file then
361-
else if (dataInFile)
362-
{
363-
pasteValueStr = dirElemFileToCopyFrom.GetAttributeValueString(attribute: attribute, version: DirectoryElement.AttributeVersion.Original);
364-
if (typeOfAttribute == typeof(double))
343+
else if (typeOfAttribute == typeof(double))
365344
{
366-
pasteValueDbl = dirElemFileToCopyFrom.GetAttributeValue<double>(
345+
pasteConvertible = dirElemFileToCopyFrom.GetAttributeValue<double>(
367346
attribute: attribute,
368-
version: DirectoryElement.AttributeVersion.Original);
347+
version: maxAttributeVersion);
369348
}
370-
else if (typeOfAttribute == typeof(int))
349+
else if (typeOfAttribute == typeof(DateTime))
371350
{
372-
pasteValueInt = dirElemFileToCopyFrom.GetAttributeValue<int>(
351+
pasteConvertible = dirElemFileToCopyFrom.GetAttributeValue<DateTime>(
373352
attribute: attribute,
374-
version: DirectoryElement.AttributeVersion.Original);
353+
version: maxAttributeVersion);
375354
}
376-
}
377355

378-
else
379-
{
380-
pasteValueStr = FrmMainApp.NullStringEquivalentGeneric;
356+
copyPasteDict.Add(key: attribute, value: pasteConvertible);
381357
}
382358
}
383-
384-
if (pasteValueStr == FrmMainApp.NullStringEquivalentGeneric || pasteValueStr is null)
385-
{
386-
if (typeOfAttribute == typeof(double))
387-
{
388-
pasteValueStr = FrmMainApp.NullStringEquivalentZero;
389-
pasteValueDbl = FrmMainApp.NullDoubleEquivalent;
390-
}
391-
else if (typeOfAttribute == typeof(int))
392-
{
393-
pasteValueStr = FrmMainApp.NullStringEquivalentZero;
394-
pasteValueInt = FrmMainApp.NullIntEquivalent;
395-
}
396-
else if (typeOfAttribute == typeof(string))
397-
{
398-
pasteValueStr = FrmMainApp.NullStringEquivalentBlank;
399-
}
400-
else
401-
{
402-
throw new ArgumentException(message: "Trying to get attribute type of unknown attribute with value " + attributeStr);
403-
}
404-
}
405-
406-
if (typeOfAttribute == typeof(string))
407-
{
408-
copyPasteDict.Add(key: attribute, value: pasteValueStr);
409-
}
410-
else if (typeOfAttribute == typeof(int))
411-
{
412-
copyPasteDict.Add(key: attribute, value: pasteValueInt);
413-
}
414-
else if (typeOfAttribute == typeof(double))
415-
{
416-
copyPasteDict.Add(key: attribute, value: pasteValueDbl);
417-
}
418-
else
419-
{
420-
throw new ArgumentException(message: "Trying to get attribute type of unknown attribute with value " + attributeStr);
421-
}
422359
}
423360

424361
if (frmEditFileDataInstance != null)

Helpers/HelperGenericTypeOperations.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ internal static class HelperGenericTypeOperations
2020
: null;
2121
}
2222

23+
public static DateTime? TryParseNullableDateTime(string val)
24+
{
25+
DateTime.TryParse(
26+
s: val,
27+
provider: CultureInfo.CurrentCulture,
28+
styles: DateTimeStyles.None,
29+
result: out DateTime outValue
30+
);
31+
32+
return outValue;
33+
}
34+
2335
/// <summary>
2436
/// A "coalesce" function.
2537
/// </summary>

Model/DirectoryElement.cs

Lines changed: 81 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,21 @@ public AttributeValuesDouble(double? initialValue = null,
123123
}
124124
}
125125

126+
internal class AttributeValuesDateTime : AttributeValueContainer
127+
{
128+
public AttributeValuesDateTime(DateTime? initialValue = null,
129+
AttributeVersion initialVersion = AttributeVersion.Original,
130+
bool isMarkedForDeletion = false)
131+
{
132+
_myValueType = typeof(DateTime);
133+
_valueDict = new Dictionary<AttributeVersion, Tuple<DateTime, bool>>();
134+
if (initialValue != null)
135+
{
136+
_valueDict[key: initialVersion] = new Tuple<DateTime, bool>(item1: (DateTime)initialValue, item2: isMarkedForDeletion);
137+
}
138+
}
139+
}
140+
126141
#endregion
127142

128143
#region Private variables
@@ -293,6 +308,14 @@ public bool IsMarkedForDeletion(ElementAttribute attribute,
293308
.Item2;
294309
}
295310

311+
if (attributeType == typeof(DateTime))
312+
{
313+
IDictionary<AttributeVersion, Tuple<DateTime, bool>> DateTimeDict = (IDictionary<AttributeVersion, Tuple<DateTime, bool>>)avc.ValueDict;
314+
Tuple<DateTime, bool> doubleValue = DateTimeDict[key: version];
315+
return DateTimeDict[key: version]
316+
.Item2;
317+
}
318+
296319
// else
297320
// Should not get to here
298321
throw new ArgumentException(message: $"Failed to retrieve attribute '{GetAttributeName(attribute: attribute)}" +
@@ -373,6 +396,19 @@ public string GetAttributeValueString(ElementAttribute attribute,
373396
return doubleValue.Item1.ToString(provider: CultureInfo.InvariantCulture);
374397
}
375398

399+
if (attributeType == typeof(DateTime))
400+
{
401+
IDictionary<AttributeVersion, Tuple<DateTime, bool>> dateTimeDict = (IDictionary<AttributeVersion, Tuple<DateTime, bool>>)avc.ValueDict;
402+
Tuple<DateTime, bool> dateTimeValue = dateTimeDict[key: versionToReturn];
403+
if (dateTimeDict[key: versionToReturn]
404+
.Item2)
405+
{
406+
return FrmMainApp.NullStringEquivalentGeneric;
407+
}
408+
409+
return dateTimeValue.Item1.ToString(provider: CultureInfo.CurrentUICulture);
410+
}
411+
376412
// else
377413
// Should not get to here
378414
throw new ArgumentException(message: $"Failed to retrieve attribute '{GetAttributeName(attribute: attribute)}" +
@@ -446,8 +482,17 @@ public string GetAttributeValueString(ElementAttribute attribute,
446482
return (T)Convert.ChangeType(value: doubleValue, conversionType: typeof(T));
447483
}
448484
}
485+
else if (attributeType == typeof(DateTime))
486+
{
487+
IDictionary<AttributeVersion, Tuple<DateTime, bool>> DateTimeDict = (IDictionary<AttributeVersion, Tuple<DateTime, bool>>)avc.ValueDict;
488+
DateTime DateTimeValue = DateTimeDict[key: versionToReturn]
489+
.Item1;
490+
if (requestType == typeof(DateTime))
491+
{
492+
return (T)Convert.ChangeType(value: DateTimeValue, conversionType: typeof(T));
493+
}
494+
}
449495

450-
// else
451496
// Should not get to here
452497
throw new ArgumentException(message: $"Failed to retrieve attribute '{GetAttributeName(attribute: attribute)}" +
453498
$"' of type '{attributeType.Name}" +
@@ -467,6 +512,7 @@ public void SetAttributeValueAnyType(ElementAttribute attribute,
467512
bool isMarkedForDeletion)
468513
{
469514
Type typeOfAttribute = GetAttributeType(attribute: attribute);
515+
IConvertible writeValueConvertible = null;
470516

471517
if (typeOfAttribute == typeof(string))
472518
{
@@ -477,17 +523,25 @@ public void SetAttributeValueAnyType(ElementAttribute attribute,
477523
}
478524
else if (typeOfAttribute == typeof(double))
479525
{
480-
double? writeValueDbl = HelperGenericTypeOperations.TryParseNullableDouble(val: value);
526+
writeValueConvertible = HelperGenericTypeOperations.TryParseNullableDouble(val: value) ?? FrmMainApp.NullDoubleEquivalent;
481527
SetAttributeValue(attribute: attribute,
482-
value: writeValueDbl,
528+
value: writeValueConvertible,
483529
version: version,
484530
isMarkedForDeletion: isMarkedForDeletion);
485531
}
486532
else if (typeOfAttribute == typeof(int))
487533
{
488-
int? writeValueInt = HelperGenericTypeOperations.TryParseNullableInt(val: value);
534+
writeValueConvertible = HelperGenericTypeOperations.TryParseNullableInt(val: value) ?? FrmMainApp.NullIntEquivalent;
489535
SetAttributeValue(attribute: attribute,
490-
value: writeValueInt,
536+
value: writeValueConvertible,
537+
version: version,
538+
isMarkedForDeletion: isMarkedForDeletion);
539+
}
540+
else if (typeOfAttribute == typeof(DateTime))
541+
{
542+
writeValueConvertible = HelperGenericTypeOperations.TryParseNullableDateTime(val: value) ?? FrmMainApp.NullDateTimeEquivalent;
543+
SetAttributeValue(attribute: attribute,
544+
value: writeValueConvertible,
491545
version: version,
492546
isMarkedForDeletion: isMarkedForDeletion);
493547
}
@@ -551,6 +605,19 @@ public void SetAttributeValue(ElementAttribute attribute,
551605
.ValueDict[key: version] = new Tuple<int, bool>(item1: (int)value, item2: isMarkedForDeletion);
552606
}
553607
}
608+
else if (attributeType == typeof(DateTime))
609+
{
610+
if (setMarkedForDeletion)
611+
{
612+
_Attributes[key: attribute]
613+
.ValueDict[key: version] = new Tuple<DateTime, bool>(item1: FrmMainApp.NullDateTimeEquivalent, item2: isMarkedForDeletion);
614+
}
615+
else
616+
{
617+
_Attributes[key: attribute]
618+
.ValueDict[key: version] = new Tuple<DateTime, bool>(item1: (DateTime)value, item2: isMarkedForDeletion);
619+
}
620+
}
554621
else if (attributeType == typeof(string))
555622
{
556623
if (setMarkedForDeletion)
@@ -588,6 +655,11 @@ public void SetAttributeValue(ElementAttribute attribute,
588655
value ??= FrmMainApp.NullIntEquivalent;
589656
avc = new AttributeValuesInt(initialValue: (int)value, initialVersion: version, isMarkedForDeletion: isMarkedForDeletion);
590657
}
658+
else if (attributeType == typeof(DateTime))
659+
{
660+
value ??= FrmMainApp.NullDateTimeEquivalent;
661+
avc = new AttributeValuesDateTime(initialValue: (DateTime)value, initialVersion: version, isMarkedForDeletion: isMarkedForDeletion);
662+
}
591663
else
592664
{
593665
value ??= FrmMainApp.NullStringEquivalentGeneric;
@@ -780,8 +852,11 @@ private bool ParseAttribute(ElementAttribute attribute,
780852
case ElementAttribute.Fnumber:
781853
case ElementAttribute.FocalLength:
782854
case ElementAttribute.FocalLengthIn35mmFormat:
855+
resTyped = TagsToModelValueTransformations.T2M_F_FocalLength(attribute: attribute, parseResult: parseResult);
856+
break;
857+
783858
case ElementAttribute.ISO:
784-
resTyped = TagsToModelValueTransformations.T2M_F_FocalLength_ISO(attribute: attribute, parseResult: parseResult);
859+
resTyped = TagsToModelValueTransformations.T2M_F_ISO(attribute: attribute, parseResult: parseResult);
785860
break;
786861

787862
case ElementAttribute.TakenDate:

Model/SourcesAndAttributes.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -535,19 +535,19 @@ public static Type GetAttributeType(ElementAttribute attribute)
535535
case ElementAttribute.ExposureTime:
536536
return typeof(string);
537537
case ElementAttribute.Fnumber:
538-
return typeof(string);
538+
return typeof(double);
539539
case ElementAttribute.FocalLength:
540-
return typeof(string);
540+
return typeof(double);
541541
case ElementAttribute.FocalLengthIn35mmFormat:
542-
return typeof(string);
542+
return typeof(double);
543543
case ElementAttribute.ISO:
544-
return typeof(string);
544+
return typeof(int);
545545
case ElementAttribute.LensSpec:
546546
return typeof(string);
547547
case ElementAttribute.TakenDate:
548-
return typeof(string);
548+
return typeof(DateTime);
549549
case ElementAttribute.CreateDate:
550-
return typeof(string);
550+
return typeof(DateTime);
551551
case ElementAttribute.TakenDateDaysShift:
552552
return typeof(int);
553553
case ElementAttribute.TakenDateHoursShift:

0 commit comments

Comments
 (0)