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);
/*
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;
s_editorData.trackData.editText = 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void onArrowLeft(int modifiers)
enum ArrowDirection
{
const int current_track = getActiveTrack();
int track = getPrevTrack();
endEditing();
ARROW_LEFT,
ARROW_RIGHT,
};
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)
t->group->folded = true;
t->group->folded = shouldFold;
}
else
t->folded = true;
t->folded = shouldFold;
Editor_updateTrackScroll();
Editor_update();
return true;
return;
}
if (modifiers & EMGUI_KEY_COMMAND)
track = 0;
if (dir == ARROW_LEFT)
{
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);
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();
}
if (modifiers & EMGUI_KEY_SHIFT)
if (keyMod & 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);
setActiveTrack(activeTrack);
else
viewInfo->selectStopTrack = track;
break;
}
viewInfo->selectStartRow = viewInfo->selectStopRow = row_pos;
viewInfo->selectStartTrack = viewInfo->selectStopTrack = track;
handled_key = true;
else
{
viewInfo->selectStartRow = viewInfo->selectStopRow = row;
viewInfo->selectStartTrack = viewInfo->selectStopTrack = track;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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)
{
Track* t = getTrackData()[activeTrack];
TrackViewInfo* viewInfo = getTrackViewInfo();
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 (track->keys)
@ -734,11 +697,11 @@ static void onArrowUp(int row, sync_track* track, int activeTrack, int modifiers
if (modifiers & EMGUI_KEY_SHIFT)
{
viewInfo->selectStopRow = row;
break;
return;
}
viewInfo->selectStartRow = viewInfo->selectStopRow = row;
viewInfo->selectStartTrack = viewInfo->selectStopTrack = active_track;
viewInfo->selectStartTrack = viewInfo->selectStopTrack = activeTrack;
}
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();
TrackViewInfo* viewInfo = getTrackViewInfo();
if (modifiers & EMGUI_KEY_CTRL)
{
struct sync_track* t = getTracks()[active_track];
if (t->keys)
if (track->keys)
{
int idx = key_idx_floor(t, row_pos);
int idx = key_idx_floor(track, rowPos);
if (idx < 0)
row = t->keys[0].row;
else if (idx > (int)t->num_keys - 2)
row = t->keys[t->num_keys - 1].row;
row = track->keys[0].row;
else if (idx > (int)track->num_keys - 2)
row = track->keys[track->num_keys - 1].row;
else
row = t->keys[idx + 1].row;
row = track->keys[idx + 1].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->selectStartTrack = viewInfo->selectStopTrack = active_track;
viewInfo->selectStartTrack = viewInfo->selectStopTrack = activeTrack;
}
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();
switch (key)
{
case EMGUI_ARROW_DOWN: onArrowDown(rowPos, track, activetrack, modifiers); break;
case EMGUI_ARROW_UP: onArrowUp(rowPos, track, activetrack, modifiers); break;
case EMGUI_ARROW_RIGHT: onArrowRight(rowPos, track, activetrack, modifiers); break;
case EMGUI_ARROW_LEFT: onArrowLeft(rowPos, track, activetrack, modifiers); break;
case EMGUI_ARROW_DOWN: onArrowDown(rowPos, trackData, track, activeTrack, modifiers); break;
case EMGUI_ARROW_UP: onArrowUp(rowPos, trackData, track, activeTrack, modifiers); break;
case EMGUI_ARROW_RIGHT: onArrowSide(ARROW_RIGHT, rowPos, trackData, 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_UP:
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;
}
case EMGUI_ARROW_LEFT:
{
break;
}
case EMGUI_ARROW_RIGHT:
{
break;
return true;
}
default : handled_key = false; break;
@ -1082,13 +1035,10 @@ bool Editor_keyDown(int key, int keyCode, int modifiers)
if (idx < 0)
return false;
// copy and modify
newKey = track->keys[idx];
newKey.type = ((newKey.type + 1) % KEY_TYPE_COUNT);
sync_set_key(track, &newKey);
RemoteConnection_sendSetKeyCommand(track->name, &newKey);
Commands_addOrUpdateKey(active_track, &newKey);
handled_key = true;
}