1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-13 23:00:24 +02:00

fixing sort by time bug and refactoring sort by name code. Also making name sort semi case sensitive.

This commit is contained in:
mchinen 2010-05-09 18:40:09 +00:00
parent b52315f111
commit 26b59b363b
2 changed files with 41 additions and 41 deletions

View File

@ -1965,40 +1965,54 @@ double AudacityProject::GetTime(Track *t)
return stime;
}
void AudacityProject::OnSortTime()
//sort based on flags. see Project.h for sort flags
void AudacityProject::SortTracks(int flags)
{
int ndx;
wxArrayPtrVoid warr, marr;
int cmpValue;
wxArrayPtrVoid arr;
TrackListIterator iter(mTracks);
Track *track = iter.First();
bool lastTrackLinked = false;
//sort by linked tracks. Assumes linked track follows owner in list.
while (track) {
if (track->GetKind() == Track::Wave) {
for (ndx = 0; ndx < (int)warr.GetCount(); ndx++) {
if (GetTime(track) < GetTime((Track *) warr[ndx])) {
break;
}
}
warr.Insert(track, ndx);
if(lastTrackLinked) {
//insert after the last track since this track should be linked to it.
ndx++;
}
else {
for (ndx = 0; ndx < (int)marr.GetCount(); ndx++) {
if (GetTime(track) < GetTime((Track *) marr[ndx])) {
break;
for (ndx = 0; ndx < (int)arr.GetCount(); ndx++) {
if(flags & kAudacitySortByName){
//do case insensitive sort - cmpNoCase returns less than zero if the string is 'less than' its argument
//also if we have case insensitive equality, then we need to sort by case as well
//We sort 'b' before 'B' accordingly. We uncharacteristically use greater than for the case sensitive
//compare because 'b' is greater than 'B' in ascii.
cmpValue = track->GetName().CmpNoCase(((Track *) arr[ndx])->GetName());
if (cmpValue < 0 ||
(0 == cmpValue && track->GetName().CompareTo(((Track *) arr[ndx])->GetName()) > 0) )
break;
}
//sort by time otherwise
else if(flags & kAudacitySortByTime){
if (GetTime(track) < GetTime((Track *) arr[ndx]))
break;
}
}
marr.Insert(track, ndx);
}
arr.Insert(track, ndx);
lastTrackLinked = track->GetLinked();
track = iter.RemoveCurrent();
}
for (ndx = 0; ndx < (int)marr.GetCount(); ndx++) {
mTracks->Add((Track *)marr[ndx]);
for (ndx = 0; ndx < (int)arr.GetCount(); ndx++) {
mTracks->Add((Track *)arr[ndx]);
}
}
for (ndx = 0; ndx < (int)warr.GetCount(); ndx++) {
mTracks->Add((Track *)warr[ndx]);
}
void AudacityProject::OnSortTime()
{
SortTracks(kAudacitySortByTime);
PushState(_("Tracks sorted by time"), _("Sort By Time"));
@ -2007,28 +2021,8 @@ void AudacityProject::OnSortTime()
void AudacityProject::OnSortName()
{
int ndx;
wxArrayPtrVoid arr;
TrackListIterator iter(mTracks);
Track *track = iter.First();
//Assumes that linked channels have the same name.
//if this is not true a crash will occur during redraw after the sort.
while (track) {
for (ndx = 0; ndx < (int)arr.GetCount(); ndx++) {
//do case insensitive sort - cmpNoCase returns less than zero if the string is 'less than' its argument
if (track->GetName().CmpNoCase(((Track *) arr[ndx])->GetName()) < 0) {
break;
}
}
arr.Insert(track, ndx);
track = iter.RemoveCurrent();
}
for (ndx = 0; ndx < (int)arr.GetCount(); ndx++) {
mTracks->Add((Track *)arr[ndx]);
}
SortTracks(kAudacitySortByName);
PushState(_("Tracks sorted by name"), _("Sort By Name"));
mTrackPanel->Refresh(false);

View File

@ -499,6 +499,12 @@ class AUDACITY_DLL_API AudacityProject: public wxFrame,
bool IsTimerRecordCancelled(){return mTimerRecordCanceled;}
void ResetTimerRecordFlag(){mTimerRecordCanceled=false;}
private:
//sort method used by OnSortName and OnSortTime
//currently only supported flags are kAudacitySortByName and kAudacitySortByName
//in the future we might have 0x01 as sort ascending and we can bit or it
#define kAudacitySortByTime (1 << 1)
#define kAudacitySortByName (1 << 2)
void SortTracks(int flags);
int mAudioIOToken;