Refactoring of arrow handling (reduced the code with ~100 lines)

This commit is contained in:
Daniel Collin 2012-12-31 12:38:44 +01:00
parent 20aab75c7b
commit f6a94f38b5

View File

@ -579,133 +579,96 @@ static void endEditing()
Commands_addOrUpdateKey(active_track, &key); Commands_addOrUpdateKey(active_track, &key);
/*
sync_set_key(track, &key);
rlog(R_INFO, "Setting key %f at %d row %d (name %s)\n", key.value, active_track, key.row, track_name);
RemoteConnection_sendSetKeyCommand(track_name, &key);
*/
is_editing = false; is_editing = false;
s_editorData.trackData.editText = 0; s_editorData.trackData.editText = 0;
} }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void onArrowLeft(int modifiers) enum ArrowDirection
{ {
const int current_track = getActiveTrack(); ARROW_LEFT,
int track = getPrevTrack(); ARROW_RIGHT,
endEditing(); };
if (modifiers & EMGUI_KEY_ALT) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void onArrowSide(enum ArrowDirection dir, int row, TrackData* trackData, int activeTrack, int keyMod)
{
int track;
const bool shouldFold = dir == ARROW_LEFT ? true : false;
const int trackCount = getTrackCount();
TrackViewInfo* viewInfo = getTrackViewInfo();
if (keyMod & EMGUI_KEY_ALT)
{ {
Track* t = &trackData->tracks[current_track]; Track* t = &trackData->tracks[activeTrack];
if (modifiers & EMGUI_KEY_CTRL) if (keyMod & EMGUI_KEY_CTRL)
{ {
if (t->group->trackCount > 1) if (t->group->trackCount > 1)
t->group->folded = true; t->group->folded = shouldFold;
} }
else else
t->folded = true; t->folded = shouldFold;
Editor_updateTrackScroll(); Editor_updateTrackScroll();
Editor_update(); return;
return true;
} }
if (modifiers & EMGUI_KEY_COMMAND) if (dir == ARROW_LEFT)
track = 0; {
track = getPrevTrack();
track = emaxi(0, track); if (keyMod & EMGUI_KEY_COMMAND)
track = 0;
track = emaxi(0, track);
}
else
{
track = getNextTrack();
if (track >= trackCount)
track = trackCount - 1;
if (keyMod & EMGUI_KEY_COMMAND)
track = trackCount - 1;
}
setActiveTrack(track); setActiveTrack(track);
if (!TrackView_isSelectedTrackVisible(getTrackViewInfo(), getTrackData(), track)) if (!TrackView_isSelectedTrackVisible(viewInfo, trackData, track))
{ {
s_editorData.trackViewInfo.startPixel += TrackView_getTracksOffset(getTrackViewInfo(), getTrackData(), current_track, track); s_editorData.trackViewInfo.startPixel += TrackView_getTracksOffset(viewInfo, trackData, activeTrack, track);
Editor_updateTrackScroll(); Editor_updateTrackScroll();
} }
if (modifiers & EMGUI_KEY_SHIFT) if (keyMod & EMGUI_KEY_SHIFT)
{ {
Track* t = &trackData->tracks[track]; 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 this track has a folded group we can't select it so set back the selection to the old one
if (t->group->folded) if (t->group->folded)
setActiveTrack(current_track); setActiveTrack(activeTrack);
else else
viewInfo->selectStopTrack = track; viewInfo->selectStopTrack = track;
break;
} }
else
viewInfo->selectStartRow = viewInfo->selectStopRow = row_pos; {
viewInfo->selectStartTrack = viewInfo->selectStopTrack = track; viewInfo->selectStartRow = viewInfo->selectStopRow = row;
viewInfo->selectStartTrack = viewInfo->selectStopTrack = track;
handled_key = true; }
} }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void onArrowRight(int row, sync_track* track, int activeTrack, int modifiers) static void onArrowUp(int row, TrackData* trackData, struct sync_track* track, int activeTrack, int modifiers)
{ {
if (modifiers & EMGUI_KEY_ALT) TrackViewInfo* viewInfo = getTrackViewInfo();
{
Track* t = getTrackData()[activeTrack];
if (modifiers & EMGUI_KEY_CTRL)
{
if (t->group->trackCount > 1)
t->group->folded = false;
}
else
t->folded = false;
Editor_updateTrackScroll();
Editor_update();
return true;
}
if (track >= track_count)
track = track_count - 1;
if (modifiers & EMGUI_KEY_COMMAND)
track = track_count - 1;
setActiveTrack(track);
if (!TrackView_isSelectedTrackVisible(getTrackViewInfo(), getTrackData(), track))
{
s_editorData.trackViewInfo.startPixel += TrackView_getTracksOffset(getTrackViewInfo(), getTrackData(), current_track, track);
Editor_updateTrackScroll();
}
if (modifiers & EMGUI_KEY_SHIFT)
{
Track* t = &trackData->tracks[track];
if (t->group->folded)
setActiveTrack(current_track);
else
viewInfo->selectStopTrack = track;
break;
}
viewInfo->selectStartRow = viewInfo->selectStopRow = row_pos;
viewInfo->selectStartTrack = viewInfo->selectStopTrack = track;
handled_key = true;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void onArrowUp(int row, sync_track* track, int activeTrack, int modifiers)
{
if (modifiers & EMGUI_KEY_CTRL) if (modifiers & EMGUI_KEY_CTRL)
{ {
if (track->keys) if (track->keys)
@ -734,11 +697,11 @@ static void onArrowUp(int row, sync_track* track, int activeTrack, int modifiers
if (modifiers & EMGUI_KEY_SHIFT) if (modifiers & EMGUI_KEY_SHIFT)
{ {
viewInfo->selectStopRow = row; viewInfo->selectStopRow = row;
break; return;
} }
viewInfo->selectStartRow = viewInfo->selectStopRow = row; viewInfo->selectStartRow = viewInfo->selectStopRow = row;
viewInfo->selectStartTrack = viewInfo->selectStopTrack = active_track; viewInfo->selectStartTrack = viewInfo->selectStopTrack = activeTrack;
} }
RemoteConnection_sendSetRowCommand(row); RemoteConnection_sendSetRowCommand(row);
@ -746,25 +709,23 @@ static void onArrowUp(int row, sync_track* track, int activeTrack, int modifiers
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void onArrowDown(int rowPos, sync_track* track, int activeTrack, int modifiers) static void onArrowDown(int rowPos, TrackData* trackData, struct sync_track* track, int activeTrack, int modifiers)
{ {
const int active_track = getActiveTrack();
int row = getRowPos(); int row = getRowPos();
TrackViewInfo* viewInfo = getTrackViewInfo();
if (modifiers & EMGUI_KEY_CTRL) if (modifiers & EMGUI_KEY_CTRL)
{ {
struct sync_track* t = getTracks()[active_track]; if (track->keys)
if (t->keys)
{ {
int idx = key_idx_floor(t, row_pos); int idx = key_idx_floor(track, rowPos);
if (idx < 0) if (idx < 0)
row = t->keys[0].row; row = track->keys[0].row;
else if (idx > (int)t->num_keys - 2) else if (idx > (int)track->num_keys - 2)
row = t->keys[t->num_keys - 1].row; row = track->keys[track->num_keys - 1].row;
else else
row = t->keys[idx + 1].row; row = track->keys[idx + 1].row;
viewInfo->rowPos = row; viewInfo->rowPos = row;
@ -790,7 +751,7 @@ static void onArrowDown(int rowPos, sync_track* track, int activeTrack, int modi
} }
viewInfo->selectStartRow = viewInfo->selectStopRow = row; viewInfo->selectStartRow = viewInfo->selectStopRow = row;
viewInfo->selectStartTrack = viewInfo->selectStopTrack = active_track; viewInfo->selectStartTrack = viewInfo->selectStopTrack = activeTrack;
} }
RemoteConnection_sendSetRowCommand(row); RemoteConnection_sendSetRowCommand(row);
@ -798,16 +759,18 @@ static void onArrowDown(int rowPos, sync_track* track, int activeTrack, int modi
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void onArrow(int key, int modifiers, int rowPos, sync_track* track, int activeTrack) static void onArrow(int key, int modifiers, int rowPos, struct sync_track* track, int activeTrack)
{ {
TrackData* trackData = getTrackData();
endEditing(); endEditing();
switch (key) switch (key)
{ {
case EMGUI_ARROW_DOWN: onArrowDown(rowPos, track, activetrack, modifiers); break; case EMGUI_ARROW_DOWN: onArrowDown(rowPos, trackData, track, activeTrack, modifiers); break;
case EMGUI_ARROW_UP: onArrowUp(rowPos, track, activetrack, modifiers); break; case EMGUI_ARROW_UP: onArrowUp(rowPos, trackData, track, activeTrack, modifiers); break;
case EMGUI_ARROW_RIGHT: onArrowRight(rowPos, track, activetrack, modifiers); break; case EMGUI_ARROW_RIGHT: onArrowSide(ARROW_RIGHT, rowPos, trackData, activeTrack, modifiers); break;
case EMGUI_ARROW_LEFT: onArrowLeft(rowPos, track, activetrack, modifiers); break; case EMGUI_ARROW_LEFT: onArrowSide(ARROW_LEFT, rowPos, trackData, activeTrack, modifiers); break;
} }
} }
@ -855,24 +818,14 @@ bool Editor_keyDown(int key, int keyCode, int modifiers)
case EMGUI_ARROW_DOWN: case EMGUI_ARROW_DOWN:
case EMGUI_ARROW_UP: case EMGUI_ARROW_UP:
case EMGUI_ARROW_RIGHT: case EMGUI_ARROW_RIGHT:
case EMGUI_ARROW_LEFT: onArrow(key, modifiers); case EMGUI_ARROW_LEFT:
{ {
} onArrow(key, modifiers, row_pos, tracks[active_track], active_track);
case EMGUI_ARROW_UP: if (paused)
{ Editor_update();
break; return true;
}
case EMGUI_ARROW_LEFT:
{
break;
}
case EMGUI_ARROW_RIGHT:
{
break;
} }
default : handled_key = false; break; default : handled_key = false; break;
@ -1082,13 +1035,10 @@ bool Editor_keyDown(int key, int keyCode, int modifiers)
if (idx < 0) if (idx < 0)
return false; return false;
// copy and modify
newKey = track->keys[idx]; newKey = track->keys[idx];
newKey.type = ((newKey.type + 1) % KEY_TYPE_COUNT); newKey.type = ((newKey.type + 1) % KEY_TYPE_COUNT);
sync_set_key(track, &newKey); Commands_addOrUpdateKey(active_track, &newKey);
RemoteConnection_sendSetKeyCommand(track->name, &newKey);
handled_key = true; handled_key = true;
} }