From bb784965d5e8cc1f14863acc83d3503d7697a6dc Mon Sep 17 00:00:00 2001 From: Daniel Collin Date: Mon, 26 Nov 2012 00:07:30 +0100 Subject: [PATCH] Latest --- ogl_editor/src/Editor.c | 36 +++++++++++++---- ogl_editor/src/TrackData.h | 2 + ogl_editor/src/TrackView.c | 79 ++++++++++++++++++++++++++++---------- ogl_editor/src/TrackView.h | 2 + ogl_editor/src/macosx/RocketView.m | 14 +++++++ 5 files changed, 106 insertions(+), 27 deletions(-) diff --git a/ogl_editor/src/Editor.c b/ogl_editor/src/Editor.c index f55edda..9ebf739 100644 --- a/ogl_editor/src/Editor.c +++ b/ogl_editor/src/Editor.c @@ -56,6 +56,20 @@ static inline struct sync_track** getTracks() /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static inline TrackViewInfo* getTrackViewInfo() +{ + return &s_editorData.trackViewInfo; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +static inline TrackData* getTrackData() +{ + return &s_editorData.trackData; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + static inline void setActiveTrack(int track) { const int current_track = s_editorData.trackData.activeTrack; @@ -281,22 +295,30 @@ 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(); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* static void drawHorizonalSlider() { - const int sizeY = s_editorData.trackViewInfo.windowSizeY; - const int sizeX = s_editorData.trackViewInfo.windowSizeX; + int track_size; + TrackViewInfo* info = getTrackViewInfo(); + const int old_start = s_editorData.trackViewInfo.startTrack; + const int total_track_width = TrackView_getWidth(getTrackViewInfo(), getTrackData()); - static int value = 0; + track_size = emaxi(total_track_width - info->windowSizeX, 0) / 128; - Emgui_slider(sizeX - 20, 2, 14, sizeY - 20, 0, 40, EMGUI_SLIDERDIR_VERTICAL, 1, &value); + Emgui_slider(0, info->windowSizeY - 36, info->windowSizeX, 14, 0, track_size, EMGUI_SLIDERDIR_HORIZONTAL, 1, + &s_editorData.trackViewInfo.startPixel); + + if (old_start != s_editorData.trackViewInfo.startTrack) + { + setActiveTrack(s_editorData.trackViewInfo.startTrack); + } } -*/ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // In some cases we need an extra update in case some controls has been re-arranged in such fashion so @@ -308,7 +330,7 @@ static bool internalUpdate() Emgui_begin(); drawStatus(); - //drawHorizonalSlider(); + drawHorizonalSlider(); refresh = TrackView_render(&s_editorData.trackViewInfo, &s_editorData.trackData); Emgui_end(); diff --git a/ogl_editor/src/TrackData.h b/ogl_editor/src/TrackData.h index 8f39df9..73e3496 100644 --- a/ogl_editor/src/TrackData.h +++ b/ogl_editor/src/TrackData.h @@ -28,6 +28,7 @@ typedef struct Track struct Group* group; uint32_t color; + int width; // width in pixels of the track int index; bool hidden; bool folded; @@ -43,6 +44,7 @@ typedef struct Group { const char* name; char* displayName; + int width; bool folded; union diff --git a/ogl_editor/src/TrackView.c b/ogl_editor/src/TrackView.c index 75e82f6..cc7b7c2 100644 --- a/ogl_editor/src/TrackView.c +++ b/ogl_editor/src/TrackView.c @@ -11,6 +11,15 @@ #include "../../sync/data.h" #include "../../sync/track.h" +#if defined(__APPLE__) +#include +#include +#else +#define WIN32_LEAN_AND_MEAN +#include +#include +#endif + #define font_size 8 int track_size_folded = 20; int min_track_size = 100; @@ -229,33 +238,36 @@ static int findStartTrack(Group* group, Track* startTrack) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -static int getTrackSize(TrackData* trackData, Track* track) +static int getTrackSize(Track* track) { - int size = 0; - if (track->folded) return track_size_folded; - size = (Emgui_getTextSize(track->displayName) & 0xffff) + 31; - size = emaxi(size, min_track_size); + if (track->width == 0) + { + track->width = (Emgui_getTextSize(track->displayName) & 0xffff) + 31; + track->width = emaxi(track->width, min_track_size); + } - return size; + return track->width; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -int getGroupSize(TrackData* trackData, Group* group, int startTrack) +int getGroupSize(Group* group, int startTrack) { int i, size = 0, count = group->trackCount; - int text_size = (Emgui_getTextSize(group->name) & 0xffff) + 40; + + if (group->width == 0) + group->width = (Emgui_getTextSize(group->name) & 0xffff) + 40; if (group->folded) return track_size_folded; for (i = startTrack; i < count; ++i) - size += getTrackSize(trackData, group->t.tracks[i]); + size += getTrackSize(group->t.tracks[i]); - size = emaxi(size, text_size); + size = emaxi(size, group->width); return size; } @@ -395,7 +407,7 @@ static int renderGroup(Group* group, Track* startTrack, int posX, int* trackOffs startTrackIndex = findStartTrack(group, startTrack); - size = getGroupSize(trackData, group, startTrackIndex); + size = getGroupSize(group, startTrackIndex); printf("size %d\n", size); @@ -444,7 +456,7 @@ bool TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData) int x_pos = 40; int end_track = 0; int i = 0; - int track_size; + //int track_size; int adjust_top_size; int mid_screen_y ; int y_pos_row, end_row, y_end_border; @@ -460,9 +472,7 @@ bool TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData) // TODO: Calculate how many channels we can draw given the width end_row = viewInfo->windowSizeY / font_size; - y_end_border = viewInfo->windowSizeY - 32; // adjust to have some space at the end of the screen - - printRowNumbers(2, adjust_top_size, end_row, y_pos_row, font_size, 8, y_end_border); + y_end_border = viewInfo->windowSizeY - 48; // adjust to have some space at the end of the screen // Shared info for all tracks @@ -482,23 +492,25 @@ bool TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData) if (trackData->groupCount == 0) return false; - for (i = start_track, end_track = (int)trackData->syncData.num_tracks; i < end_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); + //track_size = getTrackSize(trackData, track); if (group->trackCount == 1) { - x_pos += renderChannel(&info, x_pos, track, false); ++i; - - if (x_pos + track_size >= viewInfo->windowSizeX) + if (x_pos >= viewInfo->windowSizeX) { if (sel_track >= i) viewInfo->startTrack++; break; } + + x_pos += renderChannel(&info, x_pos, track, false); + + ++i; } else { @@ -506,6 +518,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); @@ -514,3 +530,26 @@ bool TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData) return s_needsUpdate; } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int TrackView_getWidth(TrackViewInfo* viewInfo, struct TrackData* trackData) +{ + int i, size = 0, group_count = trackData->groupCount; + + if (trackData->groupCount == 0) + return 0; + + for (i = 0; i < group_count; ++i) + { + Group* group = &trackData->groups[i]; + + if (group->trackCount == 1) + size += getTrackSize(group->t.track); + else + size += getGroupSize(group, 0); + } + + return size; +} + diff --git a/ogl_editor/src/TrackView.h b/ogl_editor/src/TrackView.h index 72e8a01..9b9a65f 100644 --- a/ogl_editor/src/TrackView.h +++ b/ogl_editor/src/TrackView.h @@ -16,6 +16,7 @@ typedef struct TrackViewInfo int startRow; int endRow; int startTrack; + int startPixel; int smallFontId; int selectStartTrack; int selectStopTrack; @@ -28,4 +29,5 @@ typedef struct TrackViewInfo void TrackView_init(); bool TrackView_render(TrackViewInfo* viewInfo, struct TrackData* trackData); +int TrackView_getWidth(TrackViewInfo* viewInfo, struct TrackData* trackData); diff --git a/ogl_editor/src/macosx/RocketView.m b/ogl_editor/src/macosx/RocketView.m index 558f450..5a92b29 100644 --- a/ogl_editor/src/macosx/RocketView.m +++ b/ogl_editor/src/macosx/RocketView.m @@ -148,6 +148,20 @@ NSOpenGLContext* g_context = 0; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +- (void)mouseDragged:(NSEvent *)event +{ + NSWindow* window = [self window]; + NSRect originalFrame = [window frame]; + NSPoint location = [window mouseLocationOutsideOfEventStream]; + NSRect adjustFrame = [NSWindow contentRectForFrameRect: originalFrame styleMask: NSTitledWindowMask]; + + Emgui_setMousePos((int)location.x, (int)adjustFrame.size.height - (int)location.y); + Editor_update(); +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + - (void)scrollWheel:(NSEvent *)theEvent { float x = (float)[theEvent deltaX];