Lots of work on getting proper scrolling and track selection

This commit is contained in:
Daniel Collin 2012-11-26 23:08:53 +01:00
parent 9f5230de8e
commit 28cd240b2e
6 changed files with 140 additions and 50 deletions

View File

@ -72,10 +72,7 @@ static inline TrackData* getTrackData()
static inline void setActiveTrack(int track)
{
const int current_track = s_editorData.trackData.activeTrack;
s_editorData.trackData.tracks[current_track].selected = false;
s_editorData.trackData.tracks[track].selected = true;
s_editorData.trackData.activeTrack = track;
TrackData_setActiveTrack(getTrackData(), track);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -163,6 +160,8 @@ void Editor_create()
s_editorData.trackViewInfo.endRow = 10000;
Emgui_setDefaultFont();
LoadSave_loadRocketXML("/Users/emoon/code/amiga/tbl-newage/OriginalData/Demo4.rocket", getTrackData());
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -303,20 +302,23 @@ static void drawStatus()
static void drawHorizonalSlider()
{
int track_size;
int track_size, large_val;
TrackViewInfo* info = getTrackViewInfo();
const int old_start = s_editorData.trackViewInfo.startTrack;
//const int old_start = s_editorData.trackViewInfo.startTrack;
const int total_track_width = TrackView_getWidth(getTrackViewInfo(), getTrackData());
track_size = emaxi(total_track_width - info->windowSizeX, 0) / 128;
track_size = emaxi(total_track_width - info->windowSizeX, 0);
large_val = emaxi(track_size / 10, 1);
Emgui_slider(0, info->windowSizeY - 36, info->windowSizeX, 14, 0, track_size, EMGUI_SLIDERDIR_HORIZONTAL, 1,
&s_editorData.trackViewInfo.startPixel);
Emgui_slider(0, info->windowSizeY - 36, info->windowSizeX, 14, 0, track_size, large_val,
EMGUI_SLIDERDIR_HORIZONTAL, 1, &s_editorData.trackViewInfo.startPixel);
/*
if (old_start != s_editorData.trackViewInfo.startTrack)
{
setActiveTrack(s_editorData.trackViewInfo.startTrack);
}
*/
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -858,25 +860,18 @@ bool Editor_keyDown(int key, int modifiers)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Editor_scroll(int deltaX, int deltaY)
void Editor_scroll(float deltaX, float deltaY)
{
int i, current_row = s_editorData.trackViewInfo.rowPos;
int current_row = s_editorData.trackViewInfo.rowPos;
int pixel_offset = s_editorData.trackViewInfo.startPixel;
TrackViewInfo* viewInfo = &s_editorData.trackViewInfo;
const int total_track_width = TrackView_getWidth(getTrackViewInfo(), getTrackData());
current_row += deltaY;
current_row += (int)deltaY;
pixel_offset += (int)(deltaX * 4.0f);
s_editorData.trackViewInfo.rowPos = eclampi(current_row, viewInfo->startRow, viewInfo->endRow);
if (deltaX < 0)
{
for (i = 0; i < -deltaX; ++i)
setActiveTrack(getPrevTrack());
}
else if (deltaX > 0)
{
for (i = 0; i < deltaX; ++i)
setActiveTrack(getNextTrack());
}
s_editorData.trackViewInfo.startPixel = eclampi(pixel_offset, 0, total_track_width);
Editor_update();
}

View File

@ -10,7 +10,7 @@ void Editor_timedUpdate();
bool Editor_keyDown(int keyCode, int mod);
void Editor_setWindowSize(int x, int y);
void Editor_menuEvent(int menuItem);
void Editor_scroll(int deltaX, int deltaY);
void Editor_scroll(float deltaX, float deltaY);
enum
{

View File

@ -140,3 +140,13 @@ void TrackData_linkGroups(TrackData* trackData)
TrackData_linkTrack(i, sync->tracks[i]->name, trackData);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TrackData_setActiveTrack(TrackData* trackData, int track)
{
const int current_track = trackData->activeTrack;
trackData->tracks[current_track].selected = false;
trackData->tracks[track].selected = true;
trackData->activeTrack = track;
}

View File

@ -78,4 +78,5 @@ 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);
void TrackData_setActiveTrack(TrackData* trackData, int track);

View File

@ -80,7 +80,7 @@ static void printRowNumbers(int x, int y, int rowCount, int rowOffset, int rowSp
{
char rowText[16];
memset(rowText, 0, sizeof(rowText));
sprintf(rowText, "%04d", rowOffset);
sprintf(rowText, "%05d", rowOffset);
if (rowOffset % maskBpm)
Emgui_drawText(rowText, x, y, Emgui_color32(0xa0, 0xa0, 0xa0, 0xff));
@ -140,7 +140,7 @@ static int renderName(const char* name, int x, int y, int minSize, bool folded,
if (folded)
{
Emgui_drawTextFlipped(name, x + 4, y + text_size - 10, color);
size = text_size - 30;
size = text_size - spacing;
}
else
{
@ -238,13 +238,14 @@ static int findStartTrack(Group* group, Track* startTrack)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static int getTrackSize(Track* track)
static int getTrackSize(TrackViewInfo* viewInfo, Track* track)
{
if (track->folded)
return track_size_folded;
if (track->width == 0)
{
Emgui_setFont(viewInfo->smallFontId);
track->width = (Emgui_getTextSize(track->displayName) & 0xffff) + 31;
track->width = emaxi(track->width, min_track_size);
}
@ -254,7 +255,7 @@ static int getTrackSize(Track* track)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int getGroupSize(Group* group, int startTrack)
int getGroupSize(TrackViewInfo* viewInfo, Group* group, int startTrack)
{
int i, size = 0, count = group->trackCount;
@ -265,7 +266,7 @@ int getGroupSize(Group* group, int startTrack)
return track_size_folded;
for (i = startTrack; i < count; ++i)
size += getTrackSize(group->t.tracks[i]);
size += getTrackSize(viewInfo, group->t.tracks[i]);
size = emaxi(size, group->width);
@ -295,7 +296,6 @@ static int renderChannel(struct TrackInfo* info, int startX, Track* trackData, b
if (info->trackData->syncData.tracks)
track = info->trackData->syncData.tracks[trackData->index];
Emgui_setFont(info->viewInfo->smallFontId);
size = renderName(trackData->displayName, startX, info->startY - (font_size * 2), min_track_size, folded, trackData->active);
@ -328,7 +328,7 @@ static int renderChannel(struct TrackInfo* info, int startX, Track* trackData, b
folded = valuesOnly ? true : folded;
size = valuesOnly ? track_size_folded : size;
Emgui_drawBorder(border_color, border_color, startX, info->startY - font_size * 4, size, (info->endSizeY - info->startY) + 40);
Emgui_fill(border_color, startX + size, info->startY - font_size * 4, 2, (info->endSizeY - info->startY) + 40);
// if folded we should skip rendering the rows that are covered by the text
@ -407,7 +407,7 @@ static int renderGroup(Group* group, Track* startTrack, int posX, int* trackOffs
startTrackIndex = findStartTrack(group, startTrack);
size = getGroupSize(group, startTrackIndex);
size = getGroupSize(info.viewInfo, group, startTrackIndex);
printf("size %d\n", size);
@ -448,12 +448,86 @@ static int renderGroup(Group* group, Track* startTrack, int posX, int* trackOffs
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static int processTrack(Track* track, int posX, int* startTrack, int* endTrack, TrackViewInfo* viewInfo)
{
int track_size = getTrackSize(viewInfo, track);
if (posX > 0 && *startTrack == -1)
*startTrack = track->index;
if (((posX + 50 + track_size) > (viewInfo->windowSizeX - 80)) && *endTrack == -1)
*endTrack = track->index;
return track_size;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static int setActiveTrack(TrackViewInfo* viewInfo, TrackData* trackData, int activeTrack, int posX)
{
int i, j, track_count = trackData->syncData.num_tracks;
int start_track = -1, end_track = -1;
posX -= 40;
for (i = 0; i < track_count; )
{
Track* track = &trackData->tracks[i];
Group* group = track->group;
if (group->trackCount == 1)
{
posX += processTrack(track, posX, &start_track, &end_track, viewInfo);
}
else
{
if (group->folded)
{
posX += processTrack(group->t.tracks[0], posX, &start_track, &end_track, viewInfo);
}
else
{
for (j = 0; j < group->trackCount; ++j)
posX += processTrack(group->t.tracks[j], posX, &start_track, &end_track, viewInfo);
}
}
i += group->trackCount;
}
if (activeTrack > start_track && activeTrack < end_track)
{
if (activeTrack == -1)
__asm__ ("int $3");
return activeTrack;
}
if (activeTrack < start_track)
{
if (start_track == -1)
__asm__ ("int $3");
return start_track;
}
if (activeTrack > end_track)
{
if (end_track == -1)
__asm__ ("int $3");
return end_track;
}
return activeTrack;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData)
{
struct TrackInfo info;
const int sel_track = trackData->activeTrack;
int start_track = viewInfo->startTrack;
int x_pos = 40;
int sel_track = 0; //trackData->activeTrack;
int start_track = 0; //viewInfo->startTrack;
int x_pos = 128;
int end_track = 0;
int i = 0;
//int track_size;
@ -492,24 +566,37 @@ bool TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData)
if (trackData->groupCount == 0)
return false;
x_pos = 50 + -viewInfo->startPixel;
printRowNumbers(2, adjust_top_size, end_row, y_pos_row, font_size, 8, y_end_border);
Emgui_drawBorder(border_color, border_color, 48, info.startY - font_size * 4, viewInfo->windowSizeX - 80, (info.endSizeY - info.startY) + 40);
Emgui_setLayer(1);
Emgui_setScissor(48, 0, viewInfo->windowSizeX - 80, viewInfo->windowSizeY);
Emgui_setFont(viewInfo->smallFontId);
sel_track = setActiveTrack(viewInfo, trackData, trackData->activeTrack, x_pos);
if (sel_track != trackData->activeTrack)
TrackData_setActiveTrack(trackData, sel_track);
for (i = start_track, end_track = trackData->syncData.num_tracks; i < end_track; )
{
Track* track = &trackData->tracks[i];
Group* group = track->group;
//track_size = getTrackSize(trackData, track);
if (group->trackCount == 1)
{
if (x_pos >= viewInfo->windowSizeX)
int track_size = getTrackSize(viewInfo, track);
if ((x_pos + track_size > 0) && (x_pos < viewInfo->windowSizeX))
{
if (sel_track >= i)
viewInfo->startTrack++;
// if selected track is less than the first rendered track then we need to reset it to this one
break;
renderChannel(&info, x_pos, track, false);
}
x_pos += renderChannel(&info, x_pos, track, false);
x_pos += track_size;
++i;
}
else
@ -520,13 +607,10 @@ bool TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData)
Emgui_setDefaultFont();
printRowNumbers(2, adjust_top_size, end_row, y_pos_row, font_size, 8, y_end_border);
if (sel_track < start_track)
viewInfo->startTrack = emaxi(viewInfo->startTrack - 1, 0);
Emgui_fill(Emgui_color32(127, 127, 127, 56), 0, mid_screen_y + adjust_top_size, viewInfo->windowSizeX, font_size + 1);
Emgui_setLayer(0);
return s_needsUpdate;
}
@ -545,9 +629,9 @@ int TrackView_getWidth(TrackViewInfo* viewInfo, struct TrackData* trackData)
Group* group = &trackData->groups[i];
if (group->trackCount == 1)
size += getTrackSize(group->t.track);
size += getTrackSize(viewInfo, group->t.track);
else
size += getGroupSize(group, 0);
size += getGroupSize(viewInfo, group, 0);
}
return size;

View File

@ -168,7 +168,7 @@ NSOpenGLContext* g_context = 0;
float y = (float)[theEvent deltaY];
printf("%f %f\n", x, y);
Editor_scroll((int)-x, (int)-y);
Editor_scroll(-x, -y);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////