Added linking of the groups when loading .rocket files
This commit is contained in:
parent
d33792841c
commit
d03bd9e991
@ -1,4 +1,5 @@
|
|||||||
#include "TrackData.h"
|
#include "TrackData.h"
|
||||||
|
#include "rlog.h"
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -37,3 +38,120 @@ uint32_t TrackData_getNextColor(TrackData* trackData)
|
|||||||
return s_colors[(trackData->lastColor++) & 0x7];
|
return s_colors[(trackData->lastColor++) & 0x7];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static int findSeparator(const char* name)
|
||||||
|
{
|
||||||
|
int i, len = strlen(name);
|
||||||
|
|
||||||
|
for (i = 0; i < len; ++i)
|
||||||
|
{
|
||||||
|
if (name[i] == ':')
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static int countGroup(const char* name, struct sync_data* syncData, int index)
|
||||||
|
{
|
||||||
|
int i, group_count = 0, count = syncData->num_tracks;
|
||||||
|
|
||||||
|
for (i = index; i < count; ++i)
|
||||||
|
{
|
||||||
|
if (strstr(syncData->tracks[i]->name, name))
|
||||||
|
group_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return group_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static void insertTracksInGroup(Group* group, const char* name, bool* processedTracks, TrackData* trackData, int index)
|
||||||
|
{
|
||||||
|
int i, group_index = 0, count = trackData->syncData.num_tracks;
|
||||||
|
struct sync_data* sync = &trackData->syncData;
|
||||||
|
|
||||||
|
for (i = index; i < count; ++i)
|
||||||
|
{
|
||||||
|
if (processedTracks[i])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (strstr(sync->tracks[i]->name, name))
|
||||||
|
{
|
||||||
|
rlog(R_DEBUG, "Inserted track %s into group %s\n", sync->tracks[i]->name, group->name);
|
||||||
|
group->t.tracks[group_index++] = &trackData->tracks[i];
|
||||||
|
processedTracks[i] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void TrackData_linkGroups(TrackData* trackData)
|
||||||
|
{
|
||||||
|
int i, found, current_group = 0, track_count;
|
||||||
|
char group_name[256];
|
||||||
|
bool processed_tracks[EDITOR_MAX_TRACKS];
|
||||||
|
struct sync_data* sync = &trackData->syncData;
|
||||||
|
|
||||||
|
// set whatever we have processed a track or not
|
||||||
|
|
||||||
|
memset(processed_tracks, 0, sizeof(processed_tracks));
|
||||||
|
|
||||||
|
trackData->groupCount = 0;
|
||||||
|
|
||||||
|
if (!sync->tracks)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0, track_count = sync->num_tracks; i < track_count; ++i)
|
||||||
|
{
|
||||||
|
int group_count;
|
||||||
|
const char* track_name = sync->tracks[i]->name;
|
||||||
|
Group* group = &trackData->groups[current_group];
|
||||||
|
|
||||||
|
if (processed_tracks[i])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Track* track = &trackData->tracks[i];
|
||||||
|
found = findSeparator(track_name);
|
||||||
|
|
||||||
|
if (found == -1)
|
||||||
|
{
|
||||||
|
rlog(R_DEBUG, "Track %s didn't have any group. Adding as single track\n", track_name);
|
||||||
|
group->type = GROUP_TYPE_TRACK;
|
||||||
|
group->t.track = track;
|
||||||
|
group->trackCount = 1;
|
||||||
|
processed_tracks[i] = true;
|
||||||
|
current_group++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rlog(R_DEBUG, "Found track with grouping %s\n", track_name);
|
||||||
|
|
||||||
|
// Found a group, lets dig out the groupname
|
||||||
|
|
||||||
|
memset(group_name, 0, sizeof(group_name));
|
||||||
|
memcpy(group_name, track_name, found + 1);
|
||||||
|
|
||||||
|
group->name = strdup(group_name);
|
||||||
|
group->type = GROUP_TYPE_GROUP;
|
||||||
|
|
||||||
|
rlog(R_DEBUG, "Group name %s\n", group_name);
|
||||||
|
|
||||||
|
// count tracks that are in the group and allocate space for them
|
||||||
|
|
||||||
|
group_count = countGroup(group_name, sync, i);
|
||||||
|
|
||||||
|
rlog(R_DEBUG, "Found %d tracks for group %s\n", group_count, group_name);
|
||||||
|
|
||||||
|
group->t.tracks = (Track**)malloc(sizeof(Track**) * group_count);
|
||||||
|
group->trackCount = group_count;
|
||||||
|
|
||||||
|
insertTracksInGroup(group, group_name, processed_tracks, trackData, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -33,8 +33,14 @@ typedef struct Track
|
|||||||
|
|
||||||
typedef struct Group
|
typedef struct Group
|
||||||
{
|
{
|
||||||
|
const char* name;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
Track* track;
|
||||||
|
Track** tracks;
|
||||||
|
} t;
|
||||||
|
|
||||||
enum GroupType type;
|
enum GroupType type;
|
||||||
Track** track;
|
|
||||||
int trackCount;
|
int trackCount;
|
||||||
} Group;
|
} Group;
|
||||||
|
|
||||||
@ -45,6 +51,7 @@ typedef struct TrackData
|
|||||||
struct sync_data syncData;
|
struct sync_data syncData;
|
||||||
Track tracks[EDITOR_MAX_TRACKS];
|
Track tracks[EDITOR_MAX_TRACKS];
|
||||||
Group groups[EDITOR_MAX_TRACKS];
|
Group groups[EDITOR_MAX_TRACKS];
|
||||||
|
int groupCount;
|
||||||
int activeTrack;
|
int activeTrack;
|
||||||
int lastColor;
|
int lastColor;
|
||||||
int trackCount;
|
int trackCount;
|
||||||
@ -56,4 +63,5 @@ typedef struct TrackData
|
|||||||
|
|
||||||
int TrackData_createGetTrack(TrackData* trackData, const char* name);
|
int TrackData_createGetTrack(TrackData* trackData, const char* name);
|
||||||
uint32_t TrackData_getNextColor(TrackData* trackData);
|
uint32_t TrackData_getNextColor(TrackData* trackData);
|
||||||
|
void TrackData_linkGroups(TrackData* trackData);
|
||||||
|
|
||||||
|
|||||||
@ -128,6 +128,8 @@ static void parseXml(mxml_node_t* rootNode, TrackData* trackData)
|
|||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TrackData_linkGroups(trackData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user