From ca73e5748a4dfbd693092514020c8fad73ce6664 Mon Sep 17 00:00:00 2001 From: Daniel Collin Date: Sun, 4 Nov 2012 10:17:49 +0100 Subject: [PATCH] Made it possible to do selection of rows and tracks (shift + arrow keys) --- ogl_editor/src/Editor.c | 48 ++++++++++++++++++++++++++++++++++---- ogl_editor/src/TrackView.c | 58 +++++++++++++++++----------------------------- ogl_editor/src/TrackView.h | 4 ++++ ogl_editor/src/minmax.h | 22 ++++++++++++++++++ 4 files changed, 90 insertions(+), 42 deletions(-) create mode 100644 ogl_editor/src/minmax.h diff --git a/ogl_editor/src/Editor.c b/ogl_editor/src/Editor.c index c449bd4..0634dc5 100644 --- a/ogl_editor/src/Editor.c +++ b/ogl_editor/src/Editor.c @@ -8,6 +8,7 @@ #include "LoadSave.h" #include "TrackView.h" #include "rlog.h" +#include "minmax.h" #include "TrackData.h" #include "RemoteConnection.h" #include "MinecraftiaFont.h" @@ -149,10 +150,11 @@ static bool is_editing = false; bool Editor_keyDown(int key, int modifiers) { bool handled_key = true; + TrackViewInfo* viewInfo = &s_editorData.trackViewInfo; bool paused = RemoteConnection_isPaused(); struct sync_track** tracks = getTracks(); int active_track = getActiveTrack(); - int row_pos = s_editorData.trackViewInfo.rowPos; + int row_pos = viewInfo->rowPos; if (key == ' ') { @@ -174,7 +176,16 @@ bool Editor_keyDown(int key, int modifiers) int row = row_pos; row += modifiers & EDITOR_KEY_ALT ? 8 : 1; - s_editorData.trackViewInfo.rowPos = row; + viewInfo->rowPos = row; + + if (modifiers & EDITOR_KEY_SHIFT) + { + viewInfo->selectStopRow = row; + break; + } + + viewInfo->selectStartRow = viewInfo->selectStopRow = row; + viewInfo->selectStartTrack = viewInfo->selectStopTrack = active_track; RemoteConnection_sendSetRowCommand(row); @@ -190,7 +201,16 @@ bool Editor_keyDown(int key, int modifiers) if ((modifiers & EDITOR_KEY_COMMAND) || row < 0) row = 0; - s_editorData.trackViewInfo.rowPos = row; + viewInfo->rowPos = row; + + if (modifiers & EDITOR_KEY_SHIFT) + { + viewInfo->selectStopRow = row; + break; + } + + viewInfo->selectStartRow = viewInfo->selectStopRow = row; + viewInfo->selectStartTrack = viewInfo->selectStopTrack = active_track; RemoteConnection_sendSetRowCommand(row); handled_key = true; @@ -207,6 +227,15 @@ bool Editor_keyDown(int key, int modifiers) setActiveTrack(track < 0 ? 0 : track); + if (modifiers & EDITOR_KEY_SHIFT) + { + viewInfo->selectStopTrack = track; + break; + } + + viewInfo->selectStartRow = viewInfo->selectStopRow = row_pos; + viewInfo->selectStartTrack = viewInfo->selectStopTrack = track; + handled_key = true; break; @@ -225,6 +254,15 @@ bool Editor_keyDown(int key, int modifiers) setActiveTrack(track); + if (modifiers & EDITOR_KEY_SHIFT) + { + viewInfo->selectStopTrack = track; + break; + } + + viewInfo->selectStartRow = viewInfo->selectStopRow = row_pos; + viewInfo->selectStartTrack = viewInfo->selectStopTrack = track; + handled_key = true; break; @@ -238,7 +276,7 @@ bool Editor_keyDown(int key, int modifiers) if ((key >= '1' && key <= '9') && ((modifiers & EDITOR_KEY_CTRL) || (modifiers & EDITOR_KEY_ALT))) { struct sync_track* track = tracks[active_track]; - int row = s_editorData.trackViewInfo.rowPos; + int row = viewInfo->rowPos; float bias_value = 0.0f; @@ -310,7 +348,7 @@ bool Editor_keyDown(int key, int modifiers) if (key == 'i') { struct sync_track* track = tracks[active_track]; - int row = s_editorData.trackViewInfo.rowPos; + int row = viewInfo->rowPos; int idx = key_idx_floor(track, row); if (idx < 0) diff --git a/ogl_editor/src/TrackView.c b/ogl_editor/src/TrackView.c index e27f11c..19596e2 100644 --- a/ogl_editor/src/TrackView.c +++ b/ogl_editor/src/TrackView.c @@ -5,6 +5,7 @@ #include #include "TrackData.h" #include "rlog.h" +#include "minmax.h" #include "../../sync/sync.h" #include "../../sync/data.h" #include "../../sync/track.h" @@ -52,7 +53,8 @@ static void printRowNumbers(int x, int y, int rowCount, int rowOffset, int rowSp /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// static int renderChannel(const TrackViewInfo* viewInfo, struct sync_track* track, - int startX, int startY, int startPos, int endPos, int endSizeY) + int startX, int startY, int startPos, int endPos, int endSizeY, + int trackId, int selectLeft, int selectRight, int selectTop, int selectBottom) { uint y; int size = min_track_size; @@ -63,11 +65,8 @@ static int renderChannel(const TrackViewInfo* viewInfo, struct sync_track* track int x_adjust = 0; Emgui_setFont(viewInfo->smallFontId); - text_size = Emgui_getTextSize(track->name) + 4; - rlog(R_INFO, "t %s size %d\n", track->name, text_size); - // if text is smaller than min size we center the text if (text_size < min_track_size) @@ -75,8 +74,6 @@ static int renderChannel(const TrackViewInfo* viewInfo, struct sync_track* track else size = text_size + 1; - rlog(R_INFO, "t %s size %d adjust %d\n", track->name, text_size, x_adjust); - Emgui_drawText(track->name, (startX + 3) + x_adjust, startY - 12, Emgui_color32(0xff, 0xff, 0xff, 0xff)); Emgui_setDefaultFont(); } @@ -135,16 +132,15 @@ static int renderChannel(const TrackViewInfo* viewInfo, struct sync_track* track } else { - uint32_t color = 0; - - if (y & 7) - color = Emgui_color32(0x4f, 0x4f, 0x4f, 0xff); - else - color = Emgui_color32(0x7f, 0x7f, 0x7f, 0xff); - + uint32_t color = (y & 7) ? Emgui_color32(0x4f, 0x4f, 0x4f, 0xff) : Emgui_color32(0x7f, 0x7f, 0x7f, 0xff); Emgui_drawText("---", offset, y_offset - font_size / 2, color); } + bool selected = (trackId >= selectLeft && trackId <= selectRight) && (y >= selectTop && y < selectBottom); + + if (selected) + Emgui_fill(Emgui_color32(0x4f, 0x4f, 0x4f, 0x3f), startX, y_offset - font_size/2, size, font_size); + y_offset += font_size; if (y_offset > (endSizeY + font_size/2)) @@ -156,27 +152,6 @@ static int renderChannel(const TrackViewInfo* viewInfo, struct sync_track* track /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -int doMax(int a, int b) -{ - if (b >= a) - return b; - else - return a; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -static inline int min(int a, int b) -{ - if (a < b) - return a; - else - return b; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// foo - void TrackView_render(const TrackViewInfo* viewInfo, TrackData* trackData) { uint i = 0; @@ -198,12 +173,20 @@ void TrackView_render(const TrackViewInfo* viewInfo, TrackData* trackData) if (syncData->num_tracks == 0) { - renderChannel(0, 0, 40 + (i * 64), adjust_top_size, y_pos_row, y_pos_row + end_row, y_end_border); + renderChannel(0, 0, 40 + (i * 64), adjust_top_size, y_pos_row, y_pos_row + end_row, y_end_border, + 0, 0, 0, 0, 0); uint32_t color = Emgui_color32(127, 127, 127, 56); Emgui_fill(color, 0, mid_screen_y + adjust_top_size, viewInfo->windowSizeX, font_size + 2); return; } + int selectLeft = mini(viewInfo->selectStartTrack, viewInfo->selectStopTrack); + int selectRight = maxi(viewInfo->selectStartTrack, viewInfo->selectStopTrack); + int selectTop = mini(viewInfo->selectStartRow, viewInfo->selectStopRow); + int selectBottom = maxi(viewInfo->selectStartRow, viewInfo->selectStopRow); + + rlog(R_INFO, "%d %d %d %d\n", selectLeft, selectRight, selectTop, selectBottom); + int num_tracks = syncData->num_tracks; int max_render_tracks = viewInfo->windowSizeX / min_track_size; @@ -218,11 +201,12 @@ void TrackView_render(const TrackViewInfo* viewInfo, TrackData* trackData) int x_pos = 40; - const int end_track = min(start_track + num_tracks, syncData->num_tracks); + const int end_track = mini(start_track + num_tracks, syncData->num_tracks); for (i = start_track; i < end_track; ++i) { - int size = renderChannel(viewInfo, syncData->tracks[i], x_pos, adjust_top_size, y_pos_row, y_pos_row + end_row, y_end_border); + int size = renderChannel(viewInfo, syncData->tracks[i], x_pos, adjust_top_size, y_pos_row, y_pos_row + end_row, y_end_border, + i, selectLeft, selectRight, selectTop, selectBottom); if (sel_track == i) { diff --git a/ogl_editor/src/TrackView.h b/ogl_editor/src/TrackView.h index 7b8cee0..123fad9 100644 --- a/ogl_editor/src/TrackView.h +++ b/ogl_editor/src/TrackView.h @@ -12,6 +12,10 @@ typedef struct TrackViewInfo int windowSizeY; int rowPos; int smallFontId; + int selectStartTrack; + int selectStopTrack; + int selectStartRow; + int selectStopRow; } TrackViewInfo; diff --git a/ogl_editor/src/minmax.h b/ogl_editor/src/minmax.h new file mode 100644 index 0000000..6e239e6 --- /dev/null +++ b/ogl_editor/src/minmax.h @@ -0,0 +1,22 @@ +#pragma once + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +static inline int maxi(int a, int b) +{ + if (a > b) + return a; + + return b; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +static inline int mini(int a, int b) +{ + if (a < b) + return a; + + return b; +} +