Better handling of cursor position / rendering of tracks that may have variable size

This commit is contained in:
Daniel Collin 2012-11-10 22:16:22 +01:00
parent 8ac2c68b99
commit 9b7f5c5a27
3 changed files with 72 additions and 28 deletions

View File

@ -8,6 +8,7 @@ int TrackData_createGetTrack(TrackData* trackData, const char* name)
if (index < 0) if (index < 0)
{ {
index = sync_create_track(&trackData->syncData, name); index = sync_create_track(&trackData->syncData, name);
trackData->colors[index] = TrackData_getNextColor(trackData);
trackData->order[trackData->orderCount] = index; trackData->order[trackData->orderCount] = index;
trackData->orderCount++; trackData->orderCount++;
} }

View File

@ -85,7 +85,7 @@ static int renderTrackName(const struct TrackInfo* info, struct sync_track* trac
int size = min_track_size; int size = min_track_size;
if (!track) if (!track)
return folded ? track_size_folded : size; return folded ? 1 : size;
int text_size; int text_size;
int x_adjust = 0; int x_adjust = 0;
@ -100,7 +100,16 @@ static int renderTrackName(const struct TrackInfo* info, struct sync_track* trac
else else
size = text_size + 1; size = text_size + 1;
Emgui_drawText(track->name, (startX + 3) + x_adjust, info->startY - font_size * 2, Emgui_color32(0xff, 0xff, 0xff, 0xff)); if (folded)
{
Emgui_drawTextFlipped(track->name, (startX + 3), info->startY + text_size, Emgui_color32(0xff, 0xff, 0xff, 0xff));
size = text_size;
}
else
{
Emgui_drawText(track->name, (startX + 3) + x_adjust, info->startY - font_size * 2, Emgui_color32(0xff, 0xff, 0xff, 0xff));
}
Emgui_setDefaultFont(); Emgui_setDefaultFont();
return size; return size;
@ -134,21 +143,32 @@ static void renderInterpolation(const struct TrackInfo* info, struct sync_track*
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void renderText(const struct TrackInfo* info, struct sync_track* track, int idx, int x, int y, bool editRow, bool folded) static void renderText(const struct TrackInfo* info, struct sync_track* track, int row, int idx, int x, int y, bool editRow, bool folded)
{ {
if (idx >= 0) uint32_t color = (row & 7) ? Emgui_color32(0x4f, 0x4f, 0x4f, 0xff) : Emgui_color32(0x7f, 0x7f, 0x7f, 0xff);
{
char temp[256];
float value = track->keys[idx].value;
snprintf(temp, 256, "% .2f", value);
if (!editRow) if (folded)
Emgui_drawText(temp, x, y - font_size_half, Emgui_color32(255, 255, 255, 255)); {
if (idx >= 0)
Emgui_fill(color, x, y - font_size_half, 8, 8);
else
Emgui_drawText("-", x, y - font_size_half, color);
} }
else else
{ {
uint32_t color = (y & 7) ? Emgui_color32(0x4f, 0x4f, 0x4f, 0xff) : Emgui_color32(0x7f, 0x7f, 0x7f, 0xff); if (idx >= 0)
Emgui_drawText("---", x, y - font_size_half, color); {
char temp[256];
float value = track->keys[idx].value;
snprintf(temp, 256, "% .2f", value);
if (!editRow)
Emgui_drawText(temp, x, y - font_size_half, Emgui_color32(255, 255, 255, 255));
}
else
{
Emgui_drawText("---", x, y - font_size_half, color);
}
} }
} }
@ -157,6 +177,7 @@ static void renderText(const struct TrackInfo* info, struct sync_track* track, i
static int renderChannel(const struct TrackInfo* info, int startX, int editRow, int trackIndex) static int renderChannel(const struct TrackInfo* info, int startX, int editRow, int trackIndex)
{ {
int y, y_offset; int y, y_offset;
int text_size = 0;
int size = min_track_size; int size = min_track_size;
int startPos = info->startPos; int startPos = info->startPos;
const int endPos = info->endPos; const int endPos = info->endPos;
@ -170,6 +191,12 @@ static int renderChannel(const struct TrackInfo* info, int startX, int editRow,
size = renderTrackName(info, track, startX, folded); size = renderTrackName(info, track, startX, folded);
if (folded)
{
text_size = size;
size = track_size_folded;
}
Emgui_drawBorder(borderColor, borderColor, startX, info->startY - font_size * 4, size, info->endSizeY); Emgui_drawBorder(borderColor, borderColor, startX, info->startY - font_size * 4, size, info->endSizeY);
if (drawColorButton(color, startX + 4, info->startY - font_size * 3, size)) if (drawColorButton(color, startX + 4, info->startY - font_size * 3, size))
@ -179,6 +206,19 @@ static int renderChannel(const struct TrackInfo* info, int startX, int editRow,
y_offset = info->startY; y_offset = info->startY;
// if folded we should skip rendering the rows that are covered by the text
if (folded)
{
int skip_rows = (text_size + font_size * 2) / font_size;
if (startPos + skip_rows > 0)
{
startPos += skip_rows;
y_offset += skip_rows * font_size;
}
}
if (startPos < 0) if (startPos < 0)
{ {
y_offset = info->startY + (font_size * -startPos); y_offset = info->startY + (font_size * -startPos);
@ -197,7 +237,7 @@ static int renderChannel(const struct TrackInfo* info, int startX, int editRow,
idx = sync_find_key(track, y); idx = sync_find_key(track, y);
renderInterpolation(info, track, size, idx, offset, y_offset, folded); renderInterpolation(info, track, size, idx, offset, y_offset, folded);
renderText(info, track, idx, offset, y_offset, y == editRow, folded); renderText(info, track, y, idx, offset, y_offset, y == editRow, folded);
selected = (trackIndex >= info->selectLeft && trackIndex <= info->selectRight) && selected = (trackIndex >= info->selectLeft && trackIndex <= info->selectRight) &&
(y >= info->selectTop && y < info->selectBottom); (y >= info->selectTop && y < info->selectBottom);
@ -216,15 +256,13 @@ static int renderChannel(const struct TrackInfo* info, int startX, int editRow,
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TrackView_render(const TrackViewInfo* viewInfo, TrackData* trackData) void TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData)
{ {
struct TrackInfo info; struct TrackInfo info;
struct sync_data* syncData = &trackData->syncData; struct sync_data* syncData = &trackData->syncData;
const int sel_track = trackData->activeTrack; const int sel_track = trackData->activeTrack;
//uint32_t color = Emgui_color32(127, 127, 127, 56); //uint32_t color = Emgui_color32(127, 127, 127, 56);
int num_tracks; int start_track = viewInfo->startTrack;
int max_render_tracks;
int start_track = 0;
int x_pos = 40; int x_pos = 40;
int end_track = 0; int end_track = 0;
int i = 0; int i = 0;
@ -266,16 +304,7 @@ void TrackView_render(const TrackViewInfo* viewInfo, TrackData* trackData)
return; return;
} }
num_tracks = syncData->num_tracks; end_track = syncData->num_tracks;
max_render_tracks = viewInfo->windowSizeX / min_track_size;
if (num_tracks > max_render_tracks)
num_tracks = max_render_tracks;
if (sel_track > 3)
start_track = sel_track - 3;
end_track = emini(start_track + num_tracks, syncData->num_tracks);
for (i = start_track; i < end_track; ++i) for (i = start_track; i < end_track; ++i)
{ {
@ -299,12 +328,25 @@ void TrackView_render(const TrackViewInfo* viewInfo, TrackData* trackData)
else else
{ {
if (sel_track == i) if (sel_track == i)
{
Emgui_fill(Emgui_color32(0x7f, 0x7f, 0x7f, 0x80), x_pos, mid_screen_y + adjust_top_size, size, font_size + 1); Emgui_fill(Emgui_color32(0x7f, 0x7f, 0x7f, 0x80), x_pos, mid_screen_y + adjust_top_size, size, font_size + 1);
}
} }
x_pos += size; x_pos += size;
if (x_pos >= viewInfo->windowSizeX)
{
if (sel_track + 1 >= i)
viewInfo->startTrack++;
break;
}
} }
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_fill(Emgui_color32(127, 127, 127, 56), 0, mid_screen_y + adjust_top_size, viewInfo->windowSizeX, font_size + 1);
} }

View File

@ -13,6 +13,7 @@ typedef struct TrackViewInfo
int rowPos; int rowPos;
int startRow; int startRow;
int endRow; int endRow;
int startTrack;
int smallFontId; int smallFontId;
int selectStartTrack; int selectStartTrack;
int selectStopTrack; int selectStopTrack;
@ -24,5 +25,5 @@ typedef struct TrackViewInfo
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TrackView_init(); void TrackView_init();
void TrackView_render(const TrackViewInfo* viewInfo, struct TrackData* trackData); void TrackView_render(TrackViewInfo* viewInfo, struct TrackData* trackData);