Support for groups when connecting to demo

This commit is contained in:
Daniel Collin 2012-11-24 15:17:23 +01:00
parent 83e62e15eb
commit 3faa0630a3
3 changed files with 104 additions and 106 deletions

View File

@ -70,7 +70,6 @@ static inline int getActiveTrack()
return s_editorData.trackData.activeTrack;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static inline int getTrackCount()
@ -166,6 +165,8 @@ void Editor_init()
{
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static char s_currentTrack[64] = "0";
static char s_currentRow[64] = "0";
static char s_startRow[64] = "0";
@ -438,6 +439,13 @@ bool Editor_keyDown(int key, int modifiers)
switch (key)
{
case EMGUI_KEY_BACKSPACE:
{
deleteArea(row_pos, active_track, 1, 1);
break;
}
case EMGUI_ARROW_DOWN:
{
int row = row_pos;
@ -491,14 +499,18 @@ bool Editor_keyDown(int key, int modifiers)
case EMGUI_ARROW_LEFT:
{
const int current_track = getActiveTrack();
int track = getPrevTrack();
if (modifiers & EMGUI_KEY_ALT)
{
Track* t = &trackData->tracks[getActiveTrack()];
Track* t = &trackData->tracks[current_track];
if (modifiers & EMGUI_KEY_CTRL)
{
if (t->group->trackCount > 1)
t->group->folded = true;
}
else
t->folded = true;
@ -513,7 +525,15 @@ bool Editor_keyDown(int key, int modifiers)
if (modifiers & EMGUI_KEY_SHIFT)
{
Track* t = &trackData->tracks[track];
// if this track has a folded group we can't select it so set back the selection to the old one
if (t->group->folded)
setActiveTrack(current_track);
else
viewInfo->selectStopTrack = track;
break;
}
@ -527,15 +547,19 @@ bool Editor_keyDown(int key, int modifiers)
case EMGUI_ARROW_RIGHT:
{
const int current_track = getActiveTrack();
int track = getNextTrack();
int track_count = getTrackCount();
if (modifiers & EMGUI_KEY_ALT)
{
Track* t = &trackData->tracks[getActiveTrack()];
Track* t = &trackData->tracks[current_track];
if (modifiers & EMGUI_KEY_CTRL)
{
if (t->group->trackCount > 1)
t->group->folded = false;
}
else
t->folded = false;
@ -553,6 +577,10 @@ bool Editor_keyDown(int key, int modifiers)
if (modifiers & EMGUI_KEY_SHIFT)
{
Track* t = &trackData->tracks[track];
if (t->group->folded)
setActiveTrack(current_track);
else
viewInfo->selectStopTrack = track;
break;
}
@ -780,6 +808,8 @@ static int processCommands()
// setup remap and send the keyframes to the demo
RemoteConnection_mapTrackName(trackName);
RemoteConnection_sendKeyFrames(trackName, s_editorData.trackData.syncData.tracks[serverIndex]);
TrackData_linkTrack(serverIndex, trackName, &s_editorData.trackData);
ret = 1;
break;

View File

@ -56,120 +56,87 @@ static int findSeparator(const char* name)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static int countGroup(const char* name, struct sync_data* syncData, int index)
Group* findOrCreateGroup(const char* name, TrackData* trackData)
{
int i, group_count = 0, count = syncData->num_tracks;
Group* group;
int i, group_count = trackData->groupCount;
Group* groups = trackData->groups;
for (i = index; i < count; ++i)
for (i = 0; i < group_count; ++i)
{
if (strstr(syncData->tracks[i]->name, name))
group_count++;
}
group = &groups[i];
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)
{
char* split_name;
if (processedTracks[i])
if (!group->name)
continue;
if ((split_name = strstr(sync->tracks[i]->name, name)))
{
Track* t = &trackData->tracks[i];
int sep = findSeparator(sync->tracks[i]->name);
rlog(R_DEBUG, "Inserted track %s into group %s (%s)\n", sync->tracks[i]->name, group->name, split_name);
t->displayName = strdup(&split_name[sep + 1]);
t->group = group;
group->t.tracks[group_index++] = t;
processedTracks[i] = true;
}
if (!strcmp(name, group->name))
return &groups[i];
}
group = &groups[trackData->groupCount++];
memset(group, 0, sizeof(Group));
group->type = GROUP_TYPE_GROUP;
group->name = strdup(name);
group->displayName = strdup(name);
group->displayName[strlen(name)-1] = 0;
group->trackCount = 0;
return group;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TrackData_linkGroups(TrackData* trackData)
void TrackData_linkTrack(int index, const char* name, TrackData* trackData)
{
int i, found, current_group = 0, track_count;
int found;
char group_name[256];
bool processed_tracks[EDITOR_MAX_TRACKS];
struct sync_data* sync = &trackData->syncData;
Group* group;
Group* groups = trackData->groups;
Track* track = &trackData->tracks[index];
// set whatever we have processed a track or not
memset(processed_tracks, 0, sizeof(processed_tracks));
trackData->groupCount = 0;
if (!sync->tracks)
if (track->group)
return;
for (i = 0, track_count = sync->num_tracks; i < track_count; ++i)
{
int group_count;
Track* track;
const char* track_name = sync->tracks[i]->name;
Group* group = &trackData->groups[current_group];
if (processed_tracks[i])
continue;
track = &trackData->tracks[i];
found = findSeparator(track_name);
found = findSeparator(name);
if (found == -1)
{
rlog(R_DEBUG, "Track %s didn't have any group. Adding as single track\n", track_name);
Group* group = &groups[trackData->groupCount++];
memset(group, 0, sizeof(Group));
group->type = GROUP_TYPE_TRACK;
group->t.track = track;
group->trackCount = 1;
processed_tracks[i] = true;
track->group = group;
track->displayName = (char*)track_name;
current_group++;
continue;
track->displayName = strdup(name);
return;
}
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);
memcpy(group_name, name, found + 1);
group->name = strdup(group_name);
group->displayName = strdup(group_name);
group->type = GROUP_TYPE_GROUP;
group->displayName[found] = 0;
group = findOrCreateGroup(group_name, trackData);
rlog(R_DEBUG, "Group name %s\n", group_name);
if (group->trackCount == 0)
group->t.tracks = (Track**)malloc(sizeof(Track**));
else
group->t.tracks = (Track**)realloc(group->t.tracks, sizeof(Track**) * group->trackCount + 1);
// count tracks that are in the group and allocate space for them
group->t.tracks[group->trackCount++] = track;
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);
current_group++;
}
trackData->groupCount = current_group;
rlog(R_DEBUG, "Total amount of groups (and separate tracks) %d\n", current_group);
track->group = group;
track->displayName = strdup(&name[found + 1]);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TrackData_linkGroups(TrackData* trackData)
{
int i, track_count;
struct sync_data* sync = &trackData->syncData;
for (i = 0, track_count = sync->num_tracks; i < track_count; ++i)
TrackData_linkTrack(i, sync->tracks[i]->name, trackData);
}

View File

@ -74,4 +74,5 @@ typedef struct TrackData
int TrackData_createGetTrack(TrackData* trackData, const char* name);
uint32_t TrackData_getNextColor(TrackData* trackData);
void TrackData_linkGroups(TrackData* trackData);
void TrackData_linkTrack(int index, const char* name, TrackData* trackData);