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);
}
}
}