diff --git a/mktags.bash b/mktags.bash new file mode 100755 index 0000000..0178d0d --- /dev/null +++ b/mktags.bash @@ -0,0 +1 @@ +ctags --extra=+f -R * diff --git a/ogl_editor/data/macosx/appnib.xib b/ogl_editor/data/macosx/appnib.xib index 8a52af3..a9cfc87 100644 --- a/ogl_editor/data/macosx/appnib.xib +++ b/ogl_editor/data/macosx/appnib.xib @@ -69,92 +69,6 @@ - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide Rocket - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - YES @@ -376,7 +290,7 @@ _NSMainMenu - 15 + 13 2 {{335, 390}, {800, 600}} 1954021376 @@ -396,7 +310,6 @@ {800, 600} - _NS:9 RocketView @@ -480,30 +393,6 @@ - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - unhideAllApplications: - - - - 370 - - - showHelp: @@ -687,79 +576,22 @@ YES - - - - - - - - - 134 - - - - - 150 - - - - 136 - 144 - - - - - 129 - - - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - 149 - 145 - - - - - 130 - - - - 24 @@ -884,19 +716,10 @@ 124.IBPluginDependency 125.IBPluginDependency 126.IBPluginDependency - 129.IBPluginDependency - 130.IBPluginDependency - 131.IBPluginDependency - 134.IBPluginDependency 136.IBPluginDependency - 143.IBPluginDependency - 144.IBPluginDependency - 145.IBPluginDependency 149.IBPluginDependency - 150.IBPluginDependency 19.IBPluginDependency 23.IBPluginDependency - 236.IBPluginDependency 239.IBPluginDependency 24.IBPluginDependency 29.IBPluginDependency @@ -941,15 +764,6 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin {{928, 459}, {480, 360}} com.apple.InterfaceBuilder.CocoaPlugin diff --git a/ogl_editor/src/Editor.c b/ogl_editor/src/Editor.c index 6f345c0..89feb33 100644 --- a/ogl_editor/src/Editor.c +++ b/ogl_editor/src/Editor.c @@ -16,6 +16,8 @@ #include "../../sync/base.h" #include "../../sync/data.h" +extern void Window_setTitle(const char* title); + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef struct CopyEntry @@ -91,6 +93,13 @@ static inline int getTrackCount() /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static inline int getRowPos() +{ + return s_editorData.trackViewInfo.rowPos; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + static int getNextTrack() { TrackData* trackData = &s_editorData.trackData; @@ -160,8 +169,6 @@ void Editor_create() s_editorData.trackViewInfo.endRow = 10000; Emgui_setDefaultFont(); - - LoadSave_loadRocketXML("/Users/emoon/code/amiga/tbl-newage/OriginalData/Demo4.rocket", getTrackData()); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -170,6 +177,7 @@ void Editor_setWindowSize(int x, int y) { s_editorData.trackViewInfo.windowSizeX = x; s_editorData.trackViewInfo.windowSizeY = y; + Editor_updateTrackScroll(); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -210,13 +218,12 @@ static int drawCurrentValue(int posX, int sizeY) struct sync_track** tracks = getTracks(); active_track = getActiveTrack(); - current_row = s_editorData.trackViewInfo.rowPos; + current_row = getRowPos(); if (tracks) { const struct sync_track* track = tracks[active_track]; - int row = s_editorData.trackViewInfo.rowPos; - int idx = key_idx_floor(track, row); + int idx = key_idx_floor(track, current_row); if (idx >= 0) { @@ -230,7 +237,7 @@ static int drawCurrentValue(int posX, int sizeY) } } - value = sync_get_val(track, row); + value = sync_get_val(track, current_row); } snprintf(valueText, 256, "%f", value); @@ -293,32 +300,48 @@ static void drawStatus() size += drawNameValue("Start Row", size, sizeY, &s_editorData.trackViewInfo.startRow, 0, 10000000, s_startRow); size += drawNameValue("End Row", size, sizeY, &s_editorData.trackViewInfo.endRow, 0, 10000000, s_endRow); - printf("activeTrack %d\n", getActiveTrack()); - Emgui_setDefaultFont(); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Editor_updateTrackScroll() +{ + int track_start_offset, sel_track, total_track_width = 0; + int track_start_pixel = s_editorData.trackViewInfo.startPixel; + TrackData* track_data = getTrackData(); + TrackViewInfo* view_info = getTrackViewInfo(); + + total_track_width = TrackView_getWidth(getTrackViewInfo(), getTrackData()); + track_start_offset = TrackView_getStartOffset(); + + track_start_pixel = eclampi(track_start_pixel, 0, emaxi(total_track_width - (view_info->windowSizeX / 2), 0)); + + sel_track = TrackView_getScrolledTrack(view_info, track_data, track_data->activeTrack, + track_start_offset - track_start_pixel); + + if (sel_track != track_data->activeTrack) + TrackData_setActiveTrack(track_data, sel_track); + + s_editorData.trackViewInfo.startPixel = track_start_pixel; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + static void drawHorizonalSlider() { - int track_size, large_val; + int large_val; TrackViewInfo* info = getTrackViewInfo(); - //const int old_start = s_editorData.trackViewInfo.startTrack; - const int total_track_width = TrackView_getWidth(getTrackViewInfo(), getTrackData()); + const int old_start = s_editorData.trackViewInfo.startPixel; + const int total_track_width = TrackView_getWidth(info, getTrackData()) - (info->windowSizeX / 2); - track_size = emaxi(total_track_width - info->windowSizeX, 0); - large_val = emaxi(track_size / 10, 1); + large_val = emaxi(total_track_width / 10, 1); - Emgui_slider(0, info->windowSizeY - 36, info->windowSizeX, 14, 0, track_size, large_val, + Emgui_slider(0, info->windowSizeY - 36, info->windowSizeX, 14, 0, total_track_width, large_val, EMGUI_SLIDERDIR_HORIZONTAL, 1, &s_editorData.trackViewInfo.startPixel); - /* - if (old_start != s_editorData.trackViewInfo.startTrack) - { - setActiveTrack(s_editorData.trackViewInfo.startTrack); - } - */ + if (old_start != s_editorData.trackViewInfo.startPixel) + Editor_updateTrackScroll(); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -346,7 +369,10 @@ void Editor_update() bool need_update = internalUpdate(); if (need_update) + { + Editor_updateTrackScroll(); internalUpdate(); + } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -591,6 +617,7 @@ bool Editor_keyDown(int key, int modifiers) else t->folded = true; + Editor_updateTrackScroll(); Editor_update(); return true; } @@ -598,7 +625,15 @@ bool Editor_keyDown(int key, int modifiers) if (modifiers & EMGUI_KEY_COMMAND) track = 0; - setActiveTrack(track < 0 ? 0 : track); + track = emaxi(0, track); + + 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) { @@ -640,6 +675,7 @@ bool Editor_keyDown(int key, int modifiers) else t->folded = false; + Editor_updateTrackScroll(); Editor_update(); return true; } @@ -652,6 +688,12 @@ bool Editor_keyDown(int key, int modifiers) 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]; @@ -863,15 +905,21 @@ bool Editor_keyDown(int key, int modifiers) void Editor_scroll(float deltaX, float deltaY) { int current_row = s_editorData.trackViewInfo.rowPos; - int pixel_offset = s_editorData.trackViewInfo.startPixel; + int old_offset = s_editorData.trackViewInfo.startPixel; TrackViewInfo* viewInfo = &s_editorData.trackViewInfo; - const int total_track_width = TrackView_getWidth(getTrackViewInfo(), getTrackData()); current_row += (int)deltaY; - pixel_offset += (int)(deltaX * 4.0f); + if (current_row < viewInfo->startRow || current_row >= viewInfo->endRow) + return; + + s_editorData.trackViewInfo.startPixel += (int)(deltaX * 4.0f); s_editorData.trackViewInfo.rowPos = eclampi(current_row, viewInfo->startRow, viewInfo->endRow); - s_editorData.trackViewInfo.startPixel = eclampi(pixel_offset, 0, total_track_width); + + RemoteConnection_sendSetRowCommand(s_editorData.trackViewInfo.rowPos); + + if (old_offset != s_editorData.trackViewInfo.startPixel) + Editor_updateTrackScroll(); Editor_update(); } @@ -987,7 +1035,7 @@ void Editor_timedUpdate() { int processed_commands = 0; - RemoteConnection_updateListner(); + RemoteConnection_updateListner(getRowPos()); updateTrackStatus(); @@ -1002,17 +1050,35 @@ void Editor_timedUpdate() /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static void setWindowTitle(const char* path) +{ + char windowTitle[4096]; + sprintf(windowTitle, "RocketEditor - (%s)", path); + Window_setTitle(windowTitle); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + static void onOpen() { - if (LoadSave_loadRocketXMLDialog(&s_editorData.trackData)) + char path[2048]; + + if (LoadSave_loadRocketXMLDialog(path, &s_editorData.trackData)) + { Editor_update(); + setWindowTitle(path); + } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// static void onSave() { - LoadSave_saveRocketXMLDialog(&s_editorData.trackData); + char path[2048]; + if (!LoadSave_saveRocketXMLDialog(path, &s_editorData.trackData)) + return; + + setWindowTitle(path); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1022,7 +1088,6 @@ void Editor_menuEvent(int menuItem) printf("%d\n", menuItem); switch (menuItem) { - //case EDITOR_MENU_NEW : onNew(); break; case EDITOR_MENU_OPEN : onOpen(); break; case EDITOR_MENU_SAVE : case EDITOR_MENU_SAVE_AS : onSave(); break; diff --git a/ogl_editor/src/Editor.h b/ogl_editor/src/Editor.h index 5caab61..ee88066 100644 --- a/ogl_editor/src/Editor.h +++ b/ogl_editor/src/Editor.h @@ -11,6 +11,7 @@ bool Editor_keyDown(int keyCode, int mod); void Editor_setWindowSize(int x, int y); void Editor_menuEvent(int menuItem); void Editor_scroll(float deltaX, float deltaY); +void Editor_updateTrackScroll(); enum { diff --git a/ogl_editor/src/RemoteConnection.c b/ogl_editor/src/RemoteConnection.c index 424c2fd..e7dfa76 100644 --- a/ogl_editor/src/RemoteConnection.c +++ b/ogl_editor/src/RemoteConnection.c @@ -205,7 +205,7 @@ static SOCKET clientConnect(SOCKET serverSocket, struct sockaddr_in* host) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RemoteConnection_updateListner() +void RemoteConnection_updateListner(int currentRow) { SOCKET clientSocket; struct sockaddr_in client; @@ -225,7 +225,7 @@ void RemoteConnection_updateListner() s_socket = clientSocket; s_clientIndex = 0; RemoteConnection_sendPauseCommand(true); - //RemoteConnection_sendSetRowCommand(trackView->getEditRow()); + RemoteConnection_sendSetRowCommand(currentRow); } else { diff --git a/ogl_editor/src/RemoteConnection.h b/ogl_editor/src/RemoteConnection.h index 1717322..3487f68 100644 --- a/ogl_editor/src/RemoteConnection.h +++ b/ogl_editor/src/RemoteConnection.h @@ -9,7 +9,7 @@ struct sync_track; // Listen for incoming connections bool RemoteConnection_createListner(); -void RemoteConnection_updateListner(); +void RemoteConnection_updateListner(int currentRow); void RemoteConnection_close(); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/ogl_editor/src/TrackView.c b/ogl_editor/src/TrackView.c index b6194b4..eb442ad 100644 --- a/ogl_editor/src/TrackView.c +++ b/ogl_editor/src/TrackView.c @@ -463,7 +463,7 @@ static int processTrack(Track* track, int posX, int* startTrack, int* endTrack, /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -static int setActiveTrack(TrackViewInfo* viewInfo, TrackData* trackData, int activeTrack, int posX) +int TrackView_getScrolledTrack(TrackViewInfo* viewInfo, TrackData* trackData, int activeTrack, int posX) { int i, j, track_count = trackData->syncData.num_tracks; int start_track = -1, end_track = -1; @@ -496,25 +496,15 @@ static int setActiveTrack(TrackViewInfo* viewInfo, TrackData* trackData, int act } 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; + if (end_track != -1) + return end_track; } return activeTrack; @@ -525,7 +515,6 @@ static int setActiveTrack(TrackViewInfo* viewInfo, TrackData* trackData, int act bool TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData) { struct TrackInfo info; - int sel_track = 0; //trackData->activeTrack; int start_track = 0; //viewInfo->startTrack; int x_pos = 128; int end_track = 0; @@ -566,7 +555,7 @@ bool TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData) if (trackData->groupCount == 0) return false; - x_pos = 50 + -viewInfo->startPixel; + x_pos = TrackView_getStartOffset() + -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); @@ -575,10 +564,10 @@ bool TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData) Emgui_setScissor(48, 0, viewInfo->windowSizeX - 80, viewInfo->windowSizeY); Emgui_setFont(viewInfo->smallFontId); - sel_track = setActiveTrack(viewInfo, trackData, trackData->activeTrack, x_pos); + ///sel_track = setActiveTrack(viewInfo, trackData, trackData->activeTrack, x_pos); - if (sel_track != trackData->activeTrack) - TrackData_setActiveTrack(trackData, sel_track); + //if (sel_track != trackData->activeTrack) + // TrackData_setActiveTrack(trackData, sel_track); for (i = start_track, end_track = trackData->syncData.num_tracks; i < end_track; ) { @@ -637,3 +626,73 @@ int TrackView_getWidth(TrackViewInfo* viewInfo, struct TrackData* trackData) return size; } +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int TrackView_getStartOffset() +{ + return 50; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +bool TrackView_isSelectedTrackVisible(TrackViewInfo* viewInfo, TrackData* trackData, int track) +{ + return TrackView_getScrolledTrack(viewInfo, trackData, track, TrackView_getStartOffset() - viewInfo->startPixel) == track; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int TrackView_getTracksOffset(TrackViewInfo* viewInfo, TrackData* trackData, int prevTrack, int nextTrack) +{ + int i, j, size = 0; + bool flip = false; + + if (prevTrack == nextTrack) + return 0; + + // handle the case when tracks are flipped + + if (prevTrack > nextTrack) + { + int temp = nextTrack; + nextTrack = prevTrack; + prevTrack = temp; + flip = true; + } + + for (i = prevTrack; i < nextTrack; ) + { + Track* t = &trackData->tracks[i]; + + // if track has no group its always safe to assume that can select the track + + if (t->group->trackCount == 1) + { + size += getTrackSize(viewInfo, t); ++i; + continue; + } + + if (t->group->folded) + { + size += track_size_folded; + i += t->group->trackCount; + continue; + } + + for (j = 0; j < t->group->trackCount; ++j) + { + if (i + j == nextTrack) + goto end; + + size += getTrackSize(viewInfo, t->group->t.tracks[j]); + + } + + i += t->group->trackCount; + } + +end:; + + return flip ? -size : size; +} + diff --git a/ogl_editor/src/TrackView.h b/ogl_editor/src/TrackView.h index 9b9a65f..670e16a 100644 --- a/ogl_editor/src/TrackView.h +++ b/ogl_editor/src/TrackView.h @@ -5,6 +5,7 @@ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// struct TrackData* trackData; +struct TrackViewInfo; typedef struct TrackViewInfo { @@ -30,4 +31,8 @@ typedef struct TrackViewInfo void TrackView_init(); bool TrackView_render(TrackViewInfo* viewInfo, struct TrackData* trackData); int TrackView_getWidth(TrackViewInfo* viewInfo, struct TrackData* trackData); +int TrackView_getScrolledTrack(struct TrackViewInfo* viewInfo, struct TrackData* trackData, int activeTrack, int posX); +int TrackView_getStartOffset(); +int TrackView_getTracksOffset(struct TrackViewInfo* viewInfo, struct TrackData* trackData, int prevTrack, int nextTrack); +bool TrackView_isSelectedTrackVisible(struct TrackViewInfo* viewInfo, struct TrackData* trackData, int track); diff --git a/ogl_editor/src/loadsave.c b/ogl_editor/src/loadsave.c index d67cd0a..69f8462 100644 --- a/ogl_editor/src/loadsave.c +++ b/ogl_editor/src/loadsave.c @@ -162,10 +162,8 @@ int LoadSave_loadRocketXML(const char* path, TrackData* trackData) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -int LoadSave_loadRocketXMLDialog(TrackData* trackData) +int LoadSave_loadRocketXMLDialog(char* path, TrackData* trackData) { - char path[512]; - if (!Dialog_open(path)) return false; @@ -239,14 +237,11 @@ int LoadSave_saveRocketXML(const char* path, TrackData* trackData) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -int LoadSave_saveRocketXMLDialog(TrackData* trackData) +int LoadSave_saveRocketXMLDialog(char* path, TrackData* trackData) { - char path[512]; - if (!Dialog_save(path)) return false; - return LoadSave_saveRocketXML(path, trackData); } diff --git a/ogl_editor/src/loadsave.h b/ogl_editor/src/loadsave.h index 840f774..3723d7c 100644 --- a/ogl_editor/src/loadsave.h +++ b/ogl_editor/src/loadsave.h @@ -3,7 +3,7 @@ struct TrackData; int LoadSave_loadRocketXML(const char* path, struct TrackData* trackData); -int LoadSave_loadRocketXMLDialog(struct TrackData* trackData); +int LoadSave_loadRocketXMLDialog(char* path, struct TrackData* trackData); int LoadSave_saveRocketXML(const char* path, struct TrackData* trackData); -int LoadSave_saveRocketXMLDialog(struct TrackData* trackData); +int LoadSave_saveRocketXMLDialog(char* path, struct TrackData* trackData); diff --git a/ogl_editor/src/macosx/RocketView.m b/ogl_editor/src/macosx/RocketView.m index c419486..57f844f 100644 --- a/ogl_editor/src/macosx/RocketView.m +++ b/ogl_editor/src/macosx/RocketView.m @@ -5,6 +5,7 @@ #include NSOpenGLContext* g_context = 0; +NSWindow* g_window = 0; @implementation RocketView @@ -33,6 +34,7 @@ NSOpenGLContext* g_context = 0; [oglContext makeCurrentContext]; g_context = oglContext; + g_window = [self window]; EMGFXBackend_create(); Editor_create(); @@ -66,6 +68,7 @@ NSOpenGLContext* g_context = 0; - (void)drawRect:(NSRect)frameRect { [oglContext update]; + g_window = [self window]; EMGFXBackend_updateViewPort((int)frameRect.size.width, (int)frameRect.size.height); Editor_setWindowSize((int)frameRect.size.width, (int)frameRect.size.height); @@ -159,7 +162,6 @@ NSOpenGLContext* g_context = 0; Editor_update(); } - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - (void)scrollWheel:(NSEvent *)theEvent @@ -209,3 +211,11 @@ void swapBuffers() { [g_context flushBuffer]; } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void Window_setTitle(const char* title) +{ + [g_window setTitle:[NSString stringWithUTF8String:title]]; +} +