|
1 | | -using CommunityToolkit.Mvvm.ComponentModel; |
| 1 | +using Avalonia.Media; |
| 2 | +using CommunityToolkit.Mvvm.ComponentModel; |
2 | 3 | using EDSEditorGUI2.Mapper; |
| 4 | +using System; |
| 5 | +using System.Collections.Generic; |
3 | 6 | using System.Collections.ObjectModel; |
4 | 7 |
|
5 | 8 | namespace EDSEditorGUI2.ViewModels; |
@@ -33,13 +36,115 @@ public void AddNewDevice(object sender) |
33 | 36 | var DeviceView = ProtobufferViewModelMapper.MapFromProtobuffer(device); |
34 | 37 | Network.Add(DeviceView); |
35 | 38 | } |
| 39 | + |
| 40 | + public void InitMergeStatus(Device profile, List<int> offsets) |
| 41 | + { |
| 42 | + MergeStatus.Clear(); |
| 43 | + if (SelectedDevice is not null) |
| 44 | + { |
| 45 | + foreach (var obj in profile.Objects) |
| 46 | + { |
| 47 | + int mergeIndex = Int32.Parse(obj.Key); |
| 48 | + List<ODIndexMergeOffsetStatus> objectOffset = []; |
| 49 | + foreach (var offset in offsets) |
| 50 | + { |
| 51 | + objectOffset.Add(new(mergeIndex + offset, false)); |
| 52 | + } |
| 53 | + |
| 54 | + ODIndexMergeStatus ms = new() |
| 55 | + { |
| 56 | + Insert = true, |
| 57 | + OriginalObject = $"0x{mergeIndex:x} - {obj.Value.Name}", |
| 58 | + Offsets = objectOffset, |
| 59 | + OriginalIndex = mergeIndex, |
| 60 | +#pragma warning disable MVVMTK0034 // Direct field reference to [ObservableProperty] backing field |
| 61 | + _object = obj.Value, |
| 62 | +#pragma warning restore MVVMTK0034 // Direct field reference to [ObservableProperty] backing field |
| 63 | + TextBrush = new SolidColorBrush(Colors.Black), |
| 64 | + }; |
| 65 | + |
| 66 | + MergeStatus.Add(ms); |
| 67 | + } |
| 68 | + UpdateMergeStatus(offsets); |
| 69 | + } |
| 70 | + } |
| 71 | + |
| 72 | + /// <summary> |
| 73 | + /// Update profile merge status by checking for collisions |
| 74 | + /// </summary> |
| 75 | + /// <param name="offsets">list of offsets in profile import</param> |
| 76 | + public void UpdateMergeStatus(List<int> offsets) |
| 77 | + { |
| 78 | + if (SelectedDevice is not null && MergeStatus.Count != 0) |
| 79 | + { |
| 80 | + foreach (var obj in MergeStatus) |
| 81 | + { |
| 82 | + //first calculate all the offsets |
| 83 | + //remember that the number of offsets could have changed |
| 84 | + List<ODIndexMergeOffsetStatus> objectOffset = []; |
| 85 | + foreach (var offset in offsets) |
| 86 | + { |
| 87 | + int mergeIndex = obj.OriginalIndex + offset; |
| 88 | + objectOffset.Add(new(mergeIndex, false)); |
| 89 | + } |
| 90 | + obj.Offsets = objectOffset; |
| 91 | + } |
| 92 | + |
| 93 | + // check for collision with selected device objects |
| 94 | + foreach (var obj in MergeStatus) |
| 95 | + { |
| 96 | + foreach (var offsetStatus in obj.Offsets) |
| 97 | + { |
| 98 | + foreach (var ob in SelectedDevice.Objects) |
| 99 | + { |
| 100 | + if (offsetStatus.Index == ob.Key.ToInteger()) |
| 101 | + { |
| 102 | + offsetStatus.Collision = true; |
| 103 | + offsetStatus.Index *= -1; |
| 104 | + } |
| 105 | + } |
| 106 | + } |
| 107 | + } |
| 108 | + |
| 109 | + // check for collision with other offsets objects, collum by collum |
| 110 | + var numberOfOffsets = MergeStatus[0].Offsets.Count; |
| 111 | + |
| 112 | + // Check each collum from left to right. |
| 113 | + // you only check for collision with collums to the left |
| 114 | + for (int i = 0; i < numberOfOffsets; i++) |
| 115 | + { |
| 116 | + foreach (var leftRow in MergeStatus) |
| 117 | + { |
| 118 | + int rightCollumIndex = leftRow.Offsets[i].Index; |
| 119 | + for (int j = i; j >= 0; j--) |
| 120 | + { |
| 121 | + if (j != i) |
| 122 | + { |
| 123 | + foreach (var rightRow in MergeStatus) |
| 124 | + { |
| 125 | + int leftCollumIndex = rightRow.Offsets[j].Index; |
| 126 | + if (rightCollumIndex == leftCollumIndex) |
| 127 | + { |
| 128 | + leftRow.Offsets[i].Collision = true; |
| 129 | + } |
| 130 | + } |
| 131 | + } |
| 132 | + } |
| 133 | + } |
| 134 | + } |
| 135 | + } |
| 136 | + } |
36 | 137 | #pragma warning disable CA1822 // Mark members as static |
37 | 138 | public string Greeting => "Welcome to Avalonia!"; |
38 | 139 | #pragma warning restore CA1822 // Mark members as static |
39 | 140 | public ObservableCollection<Device> Network { get; set; } = []; |
40 | 141 |
|
41 | | - [ObservableProperty] |
42 | | - public Device? selectedDevice; |
| 142 | + //Used for profile import |
| 143 | + public ObservableCollection<ODIndexMergeStatus> MergeStatus { get; set; } = []; |
43 | 144 |
|
| 145 | + [ObservableProperty] |
| 146 | + public int _insertObjectsOffset; |
44 | 147 |
|
| 148 | + [ObservableProperty] |
| 149 | + public Device? _selectedDevice; |
45 | 150 | } |
0 commit comments