static void execInsertKey(void* userData) { struct InsertKeyData* data = (struct InsertKeyData*)userData; struct sync_track* t = s_syncTracks[data->track]; sync_set_key(t, &data->key); RemoteConnection_sendSetKeyCommand(t->name, &data->key); }
static void execUpdateKey(void* userData) { struct UpdateKeyData* data = (struct UpdateKeyData*)userData; struct sync_track* t = s_syncTracks[data->track]; int idx = sync_find_key(t, data->key.row); data->oldKey = t->keys[idx]; sync_set_key(t, &data->key); RemoteConnection_sendSetKeyCommand(t->name, &data->key); }
static void undoDeleteKey(void* userData) { struct DeleteKeyData* data = (struct DeleteKeyData*)userData; struct sync_track* t = s_syncTracks[data->track]; if (data->noDelete) return; sync_set_key(t, &data->oldKey); RemoteConnection_sendSetKeyCommand(t->name, &data->oldKey); }
static void parseXml(mxml_node_t* rootNode, TrackData* trackData) { struct track_key k; int g, i, foldedGroupCount = 0, is_key, track_index = 0; mxml_node_t* node = rootNode; free(trackData->bookmarks); trackData->bookmarks = NULL; trackData->bookmarkCount = 0; trackData->highlightRowStep = 8; // Traverse the tracks node data while (1) { node = mxmlWalkNext(node, rootNode, MXML_DESCEND); if (!node) break; switch (mxmlGetType(node)) { case MXML_ELEMENT: { const char* element_name = mxmlGetElement(node); if (!strcmp("bookmark", element_name)) { const char* row = mxmlElementGetAttr(node, "row"); if (row) TrackData_toggleBookmark(trackData, atoi(row)); } if (!strcmp("group", element_name)) { s_foldedGroupNames[foldedGroupCount++] = strdup(mxmlElementGetAttr(node, "name")); } if (!strcmp("tracks", element_name)) { const char* start_row = mxmlElementGetAttr(node, "startRow"); const char* end_row = mxmlElementGetAttr(node, "endRow"); const char* hlrow_step = mxmlElementGetAttr(node, "highlightRowStep"); if (start_row) trackData->startRow = atoi(start_row); if (end_row) trackData->endRow = atoi(end_row); if (hlrow_step) trackData->highlightRowStep = atoi(hlrow_step); } if (!strcmp("track", element_name)) { int i; struct sync_track* track; Track* t; // TODO: Create the new track/channel here const char* track_name = mxmlElementGetAttr(node, "name"); const char* color_text = mxmlElementGetAttr(node, "color"); const char* folded_text = mxmlElementGetAttr(node, "folded"); track_index = TrackData_createGetTrack(trackData, track_name); t = &trackData->tracks[track_index]; track = trackData->syncData.tracks[track_index]; if (!color_text && t->color == 0) { t->color = TrackData_getNextColor(trackData); } else { if (color_text) t->color = strtoul(color_text, 0, 16); } if (folded_text) { if (folded_text[0] == '1') t->folded = true; } // If we already have this track loaded we delete all the existing keys for (i = 0; i < track->num_keys; ++i) { int row = track->keys[i].row; RemoteConnection_sendDeleteKeyCommand(track->name, row); } free(track->keys); track->keys = 0; track->num_keys = 0; } else if (!strcmp("key", element_name)) { struct sync_track* track = trackData->syncData.tracks[track_index]; const char* row = mxmlElementGetAttr(node, "row"); const char* value = mxmlElementGetAttr(node, "value"); const char* interpolation = mxmlElementGetAttr(node, "interpolation"); k.row = atoi(row); k.value = (float)(atof(value)); k.type = (atoi(interpolation)); is_key = is_key_frame(track, k.row); assert(!is_key); sync_set_key(track, &k); RemoteConnection_sendSetKeyCommand(track->name, &k); } } default: break; } } TrackData_linkGroups(trackData); // Apply fold status on the groups for (i = 0; i < foldedGroupCount; ++i) { for (g = 0; g < trackData->groupCount; ++g) { Group* group = &trackData->groups[g]; const char* groupName = group->name; const char* foldedName = s_foldedGroupNames[i]; // groups with 1 track is handled as non-grouped if (group->trackCount == 1) continue; if (!strcmp(foldedName, groupName)) { trackData->groups[g].folded = true; break; } } free(s_foldedGroupNames[i]); } trackData->tracks[0].selected = true; }
static void toggleMute(void* userData) { struct MuteData* data = (struct MuteData*)userData; // if we have mute data we should toggle back the track to it's old form if (data->track->muteBackup) { int i; sync_del_key(data->syncTrack, 0); RemoteConnection_sendDeleteKeyCommand(data->syncTrack->name, 0); for (i = 0; i < data->track->muteKeyCount; ++i) { struct track_key* key = &data->track->muteBackup[i]; sync_set_key(data->syncTrack, key); RemoteConnection_sendSetKeyCommand(data->syncTrack->name, key); } data->track->disabled = false; free(data->track->muteBackup); data->track->muteBackup = 0; data->track->muteKeyCount = 0; } else { struct track_key defKey; int i; size_t keysSize = sizeof(struct track_key) * data->syncTrack->num_keys; float currentValue = (float)sync_get_val(data->syncTrack, data->row); data->track->disabled = true; // No muteBackup, this means that we want to mute the channel data->track->muteBackup = malloc(keysSize); data->track->muteKeyCount = data->syncTrack->num_keys; memcpy(data->track->muteBackup, data->syncTrack->keys, keysSize); for (i = 0; i < data->syncTrack->num_keys; ++i) { int row = data->track->muteBackup[i].row; sync_del_key(data->syncTrack, row); RemoteConnection_sendDeleteKeyCommand(data->syncTrack->name, row); } defKey.row = 0; defKey.value = currentValue; defKey.type = KEY_STEP; // insert key with the current value sync_set_key(data->syncTrack, &defKey); RemoteConnection_sendSetKeyCommand(data->syncTrack->name, &defKey); } }