Hello Sir. Please, if possible, could you help me find a solution for this issue?
This Swap Events script handles 4 scenarios cases;
1º Scenario = Swap 1 to 1
2º Scenario = Swap 1 to N
3º Scenario = Swap N to 1
4º Scenario = Swap N to N
All those Scenarios are working perfect.
Then, after the Swap is done, a deleted message box is prompt with Yes and No options. Yes to delete the event or events swapped, and No to not delete the event or events swapped.
1º Scenario = Swap 1 to 1 - The delete logic works.
2º Scenario = Swap 1 to N - The delete logic works.
3º Scenario = Swap N to 1 - The delete logic DOES NOT Work properly. Only when I press the "NO" option works, but if I press "YES" does not work, and it is Here that rises my issue.
4º Scenario = Swap N to N - The delete logic works.
How I do the delete logic works properly for the 3º Scenario = Swap N to 1?
using ScriptPortal.Vegas; using System.Collections.Generic; using System.Windows.Forms; public class EntryPoint { public void FromVegas(Vegas vegas) { List<TrackEvent> selectedEvents = new List<TrackEvent>(); List<TrackEvent> eventsToDelete = new List<TrackEvent>(); // List to track multiple events to delete TrackEvent eventToDelete = null; // Keep original logic for single event deletion bool swapDone = false; bool isOneToManySwap = false; // Flag for 1-to-N swap bool isManyToOneSwap = false; // Flag for N-to-1 swap // Collect selected events foreach (Track track in vegas.Project.Tracks) { foreach (TrackEvent trackEvent in track.Events) { if (trackEvent.Selected && (trackEvent.IsVideo() || trackEvent.IsAudio())) { selectedEvents.Add(trackEvent); } } } // Handle the 1-to-1 swap case if (selectedEvents.Count == 2) { TrackEvent event1 = selectedEvents[0]; TrackEvent event2 = selectedEvents[1]; // Ensure the selected events are on different tracks if (event1.Track == event2.Track) { MessageBox.Show("Selected events must be on different tracks."); return; } // Swap tracks of the two selected events Track tempTrack = event1.Track; event1.Track = event2.Track; event2.Track = tempTrack; swapDone = true; eventToDelete = event2; // Maintain the original single event deletion logic } else if (selectedEvents.Count < 2 || selectedEvents.Count > 1000) // Ensure between 2 and 1000 selected events { MessageBox.Show("Please select between 2 to 1000 video or audio events."); return; } // Handle the 1-to-N swap case (Scenario 2) if (selectedEvents.Count <= 101) // Up to 1-to-100 events { TrackEvent singleEvent = null; List<TrackEvent> multipleEvents = new List<TrackEvent>(); Dictionary<Track, int> trackCounts = new Dictionary<Track, int>(); // Count the number of events per track foreach (TrackEvent evt in selectedEvents) { if (!trackCounts.ContainsKey(evt.Track)) trackCounts[evt.Track] = 0; trackCounts[evt.Track]++; } // Find the single event and multiple events based on track counts foreach (TrackEvent evt in selectedEvents) { if (trackCounts[evt.Track] == 1 && singleEvent == null) { singleEvent = evt; // Identify the single event } else { multipleEvents.Add(evt); // Identify the multiple events } } // Check if we are in a valid "1-to-N" swap case if (singleEvent != null && multipleEvents.Count >= 1 && multipleEvents.Count <= 100) { // Perform the "1-to-N" swap Track swapTargetTrack = multipleEvents[0].Track; // Track where multiple events are located Track swapSourceTrack = singleEvent.Track; // Track where the single event is located foreach (TrackEvent multiEvent in multipleEvents) { multiEvent.Track = swapSourceTrack; // Move multiple events to the single event's track } singleEvent.Track = swapTargetTrack; // Move the single event to the target track swapDone = true; isOneToManySwap = true; // Set flag to indicate 1-to-N swap occurred eventsToDelete.AddRange(multipleEvents); // Add the multiple events to the delete list } } // Handle the N-to-1 swap case (Scenario 3) else if (selectedEvents.Count > 1 && selectedEvents.Count <= 101) // N-to-1 case { TrackEvent singleEvent = null; List<TrackEvent> multipleEvents = new List<TrackEvent>(); Dictionary<Track, int> trackCounts = new Dictionary<Track, int>(); // Count the number of events per track foreach (TrackEvent evt in selectedEvents) { if (!trackCounts.ContainsKey(evt.Track)) trackCounts[evt.Track] = 0; trackCounts[evt.Track]++; } // Find the single event and multiple events based on track counts foreach (TrackEvent evt in selectedEvents) { if (trackCounts[evt.Track] == 1 && singleEvent == null) { singleEvent = evt; // Identify the single event } else { multipleEvents.Add(evt); // Identify the multiple events } } // Check if we are in a valid "N-to-1" swap case if (singleEvent != null && multipleEvents.Count >= 1 && multipleEvents.Count <= 100) { // Perform the "N-to-1" swap Track swapTargetTrack = singleEvent.Track; // Track where the single event is located Track swapSourceTrack = multipleEvents[0].Track; // Track where the multiple events are located foreach (TrackEvent multiEvent in multipleEvents) { multiEvent.Track = swapTargetTrack; // Move multiple events to the single event's track } singleEvent.Track = swapSourceTrack; // Move the single event to the target track swapDone = true; isManyToOneSwap = true; // Set flag to indicate N-to-1 swap occurred eventToDelete = singleEvent; // Add the single event to delete list } } // Handle the n-to-n toggle case (Scenario 1) if (selectedEvents.Count % 2 == 0 && selectedEvents.Count <= 1000) { int halfCount = selectedEvents.Count / 2; Track trackGroup1 = selectedEvents[0].Track; Track trackGroup2 = selectedEvents[halfCount].Track; // Validate both groups bool validGroups = true; for (int i = 0; i < halfCount; i++) { if (selectedEvents[i].Track != trackGroup1 || selectedEvents[i + halfCount].Track != trackGroup2) { validGroups = false; break; } } if (validGroups && trackGroup1 != trackGroup2) { // Perform the swap for n-to-n toggle for (int i = 0; i < halfCount; i++) { Track tempTrack = selectedEvents[i].Track; selectedEvents[i].Track = selectedEvents[i + halfCount].Track; selectedEvents[i + halfCount].Track = tempTrack; } swapDone = true; eventsToDelete.AddRange(selectedEvents.GetRange(halfCount, halfCount)); // Add the second group to delete list } } // If a swap was done, ask for event deletion confirmation if (swapDone) { DialogResult result = MessageBox.Show("Do you want to delete the swapped event(s)?", "Confirmation", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { if (isOneToManySwap) { // In a 1-to-N swap, we delete the multiple events only foreach (TrackEvent evtToDelete in eventsToDelete) { if (IsValidEvent(evtToDelete)) { DeleteEvent(vegas, evtToDelete); } } } else if (isManyToOneSwap) { // In an N-to-1 swap, we delete the single event only if (IsValidEvent(eventToDelete)) { DeleteEvent(vegas, eventToDelete); } } else if (eventsToDelete.Count > 0) { // Validate and delete multiple events in n-to-n and other scenarios foreach (TrackEvent evtToDelete in eventsToDelete) { if (IsValidEvent(evtToDelete)) { DeleteEvent(vegas, evtToDelete); } } } } } } private bool IsValidEvent(TrackEvent evt) { try { // Attempt to access the Track property to verify the event is still valid return evt.Track != null; } catch { return false; } } private void DeleteEvent(Vegas vegas, TrackEvent eventToDelete) { if (eventToDelete != null && eventToDelete.Track != null) { eventToDelete.Track.Events.Remove(eventToDelete); } } }