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 @@
-
-
-
-
-
-
-
-
@@ -480,30 +393,6 @@
-
-
- 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]];
+}
+