using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.PPC.Jobs.Models; namespace Tango.PPC.Jobs.UndoRedoCommands { public class RepeatCommand : IUndoRedoCommand { private JobModel _jobModel; private Dictionary _indexToSegmentsDict; private SegmentsGroupModel _group; public RepeatCommand(JobModel job) { _jobModel = job; _indexToSegmentsDict = new Dictionary(); for (int index = 0; index < _jobModel.GroupingSegments.Count; index++) { var segment = _jobModel.GroupingSegments[index]; if (segment.IsSelected ) { _indexToSegmentsDict[index] = segment; } else if (_indexToSegmentsDict.Count > 0)//selected items should be in turn { break; } } } public void Execute() { if (_indexToSegmentsDict.Count == 0) return; List selectedsegments = new List(); foreach (var obj in _indexToSegmentsDict) { if (obj.Value is SegmentModel simpleSegment) { selectedsegments.Add(simpleSegment); _jobModel.GroupingSegments.Remove(simpleSegment); } else if (obj.Value is SegmentsGroupModel segmentsGroup) { selectedsegments.AddRange(segmentsGroup.Segments); _jobModel.SegmentsGroups.Remove(segmentsGroup); _jobModel.GroupingSegments.Remove(segmentsGroup); } obj.Value.IsSelected = false; } _group = new SegmentsGroupModel(_jobModel, selectedsegments) ; selectedsegments.ForEach(x => x.SegmentsGroupModel = _group); _group.SegmentIndex = _group.FirstSegmentIndex; _jobModel.SegmentsGroups.Add(_group); if((_group.SegmentIndex - 1) < _jobModel.GroupingSegments.Count) { _jobModel.GroupingSegments.Insert((_group.SegmentIndex - 1), _group); } else _jobModel.GroupingSegments.Add( _group); _jobModel.ArrangeSegmentsIndixes(); } public void UnExecute() { if (_indexToSegmentsDict.Count == 0) return; _jobModel.SegmentsGroups.Remove(_group); _jobModel.GroupingSegments.Remove(_group); foreach (var obj in _indexToSegmentsDict) { if (obj.Value is SegmentModel innerSegment) { innerSegment.SegmentsGroupModel = null; } else if (obj.Value is SegmentsGroupModel group) { _jobModel.SegmentsGroups.Add(group); group.Segments.ToList().ForEach(x => x.SegmentsGroupModel = group); } if (_jobModel.GroupingSegments.Count <= obj.Key) _jobModel.GroupingSegments.Add(obj.Value); else { _jobModel.GroupingSegments.Insert(obj.Key, obj.Value); } } _jobModel.ArrangeSegmentsIndixes(); } } }