diff --git a/ogl_editor/src/Editor.c b/ogl_editor/src/Editor.c index c154ddd..6f345c0 100644 --- a/ogl_editor/src/Editor.c +++ b/ogl_editor/src/Editor.c @@ -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(); } diff --git a/ogl_editor/src/Editor.h b/ogl_editor/src/Editor.h index 4e4da23..5caab61 100644 --- a/ogl_editor/src/Editor.h +++ b/ogl_editor/src/Editor.h @@ -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 { diff --git a/ogl_editor/src/TrackData.c b/ogl_editor/src/TrackData.c index 9867606..3efd287 100644 --- a/ogl_editor/src/TrackData.c +++ b/ogl_editor/src/TrackData.c @@ -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; +} + diff --git a/ogl_editor/src/TrackData.h b/ogl_editor/src/TrackData.h index 73e3496..c6f423c 100644 --- a/ogl_editor/src/TrackData.h +++ b/ogl_editor/src/TrackData.h @@ -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); diff --git a/ogl_editor/src/TrackView.c b/ogl_editor/src/TrackView.c index cc7b7c2..b6194b4 100644 --- a/ogl_editor/src/TrackView.c +++ b/ogl_editor/src/TrackView.c @@ -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; diff --git a/ogl_editor/src/macosx/RocketView.m b/ogl_editor/src/macosx/RocketView.m index 5a92b29..c419486 100644 --- a/ogl_editor/src/macosx/RocketView.m +++ b/ogl_editor/src/macosx/RocketView.m @@ -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); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////