bool Editor_keyDown(int key, int keyCode, int modifiers) { enum Selection selection = modifiers & EMGUI_KEY_SHIFT ? DO_SELECTION : NO_SELECTION; int highlightRowStep = getTrackData()->highlightRowStep; if (Emgui_hasKeyboardFocus()) { Editor_update(); return true; } // Update editing of values if (doEditing(key)) return true; switch (key) { case EMGUI_KEY_ARROW_UP : case EMGUI_KEY_ARROW_DOWN : case EMGUI_KEY_ARROW_LEFT : case EMGUI_KEY_ARROW_RIGHT : case EMGUI_KEY_TAB : case EMGUI_KEY_ENTER : { if (is_editing) { endEditing(); if (key == EMGUI_KEY_ENTER) return true; } break; } case EMGUI_KEY_ESC : { cancelEditing(); break; } } switch (key) { // this is a bit hacky but we don't want to have lots of combos in the menus // of arrow keys so this makes it a bit easier case EMGUI_KEY_ARROW_UP : { if (modifiers & EMGUI_KEY_CTRL) onPrevNextKey(true, selection); else if (modifiers & EMGUI_KEY_COMMAND) onBookmarkDir(ARROW_UP, selection); else if (modifiers & EMGUI_KEY_ALT) onRowStep(-highlightRowStep , selection); else onRowStep(-1, selection); break; } case EMGUI_KEY_ARROW_DOWN : { if (modifiers & EMGUI_KEY_CTRL) onPrevNextKey(false, selection); else if (modifiers & EMGUI_KEY_COMMAND) onBookmarkDir(ARROW_DOWN, selection); else if (modifiers & EMGUI_KEY_ALT) onRowStep(highlightRowStep, selection); else onRowStep(1, selection); break; } case EMGUI_KEY_ARROW_LEFT : onTrackSide(ARROW_LEFT, false, selection); break; case EMGUI_KEY_ARROW_RIGHT : onTrackSide(ARROW_RIGHT, false, selection); break; case EMGUI_KEY_TAB : onTab(); break; default : return false; } return true; }
static int renderChannel(struct TrackInfo* info, int startX, Track* trackData, bool valuesOnly) { int y, y_offset; int text_size = 0; int size = min_track_size; int startPos = info->startPos; const int trackIndex = trackData->index; const int endPos = info->endPos; struct sync_track* track = 0; const uint32_t color = trackData->color; bool folded = false; if (!valuesOnly) { drawFoldButton(startX + 6, info->startY - (font_size + 5), &trackData->folded, trackData->active); folded = trackData->folded; if (info->trackData->syncData.tracks) track = info->trackData->syncData.tracks[trackData->index]; size = renderName(trackData->displayName, startX, info->startY - (font_size * 2), min_track_size, folded, trackData->active); if (folded) { text_size = size; size = track_size_folded; } if (trackData->active) { if (drawColorButton(color, startX + 4, info->startY - colorbar_adjust, size)) { Dialog_showColorPicker(&trackData->color); if (trackData->color != color) s_needsUpdate = true; } } else { Emgui_fill(border_color, startX + 4, info->startY - colorbar_adjust, size - 8, 8); } } Emgui_setDefaultFont(); y_offset = info->startY; folded = valuesOnly ? true : folded; size = valuesOnly ? track_size_folded : size; if (valuesOnly) { Emgui_fill(border_color, startX + size, info->startY - font_size * 4, 2, (info->endSizeY - info->startY) + 40); Emgui_fill(border_color, startX, info->startY - font_size * 4, 2, (info->endSizeY - info->startY) + 40); } else { Emgui_drawBorder(border_color, border_color, startX, info->startY - font_size * 4, size, (info->endSizeY - info->startY) + 40); } // 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) { y_offset = info->startY + (font_size * -startPos); startPos = 0; } y_offset += font_size_half; for (y = startPos; y < endPos; ++y) { int idx = -1; int offset = startX + 6; bool selected; if (track) idx = sync_find_key(track, y); renderInterpolation(info, track, size, idx, offset, y_offset, folded); if (!(trackData->selected && info->viewInfo->rowPos == y && info->editText)) renderText(info, track, y, idx, offset, y_offset, folded); selected = (trackIndex >= info->selectLeft && trackIndex <= info->selectRight) && (y >= info->selectTop && y <= info->selectBottom); if (selected) Emgui_fill(selection_color, startX, y_offset - font_size_half, size, font_size); if (y != 0) { if (TrackData_hasBookmark(info->trackData, y)) Emgui_fill(bookmark_color, startX, y_offset - font_size_half, size, 8); } y_offset += font_size; if (y_offset > (info->endSizeY + font_size_half)) break; } if (!Emgui_hasKeyboardFocus()) { if (trackData->selected) { Emgui_fill(trackData->group->folded ? dark_active_track_color : active_track_color, startX, info->midPos, size, font_size + 1); if (info->editText) Emgui_drawText(info->editText, startX + 2, info->midPos, Emgui_color32(255, 255, 255, 255)); } } Emgui_setFont(info->viewInfo->smallFontId); return size; }
void Editor_menuEvent(int menuItem) { int highlightRowStep = getTrackData()->highlightRowStep; switch (menuItem) { case EDITOR_MENU_ENTER_CURRENT_V : case EDITOR_MENU_ROWS_UP : case EDITOR_MENU_ROWS_DOWN : case EDITOR_MENU_PREV_BOOKMARK : case EDITOR_MENU_NEXT_BOOKMARK : case EDITOR_MENU_PREV_KEY : case EDITOR_MENU_NEXT_KEY : case EDITOR_MENU_PLAY : { endEditing(); } } cancelEditing(); // If some internal control has focus we let it do its thing if (Emgui_hasKeyboardFocus()) { Editor_update(); return; } switch (menuItem) { // File case EDITOR_MENU_OPEN: onOpen(); break; case EDITOR_MENU_SAVE: onSave(); break; case EDITOR_MENU_SAVE_AS: onSaveAs(); break; case EDITOR_MENU_REMOTE_EXPORT : RemoteConnection_sendSaveCommand(); break; case EDITOR_MENU_RECENT_FILE_0: case EDITOR_MENU_RECENT_FILE_1: case EDITOR_MENU_RECENT_FILE_2: case EDITOR_MENU_RECENT_FILE_3: { Editor_loadRecentFile(menuItem - EDITOR_MENU_RECENT_FILE_0); break; } // Edit case EDITOR_MENU_UNDO : onUndo(); break; case EDITOR_MENU_REDO : onRedo(); break; case EDITOR_MENU_CANCEL_EDIT : onCancelEdit(); break; case EDITOR_MENU_DELETE_KEY : onDeleteKey(); break; case EDITOR_MENU_CUT : onCutAndCopy(true); break; case EDITOR_MENU_COPY : onCutAndCopy(false); break; case EDITOR_MENU_PASTE : onPaste(); break; case EDITOR_MENU_SELECT_TRACK : onSelectTrack(); break; case EDITOR_MENU_BIAS_P_001 : biasSelection(0.01f); break; case EDITOR_MENU_BIAS_P_01 : biasSelection(0.1f); break; case EDITOR_MENU_BIAS_P_1: biasSelection(1.0f); break; case EDITOR_MENU_BIAS_P_10: biasSelection(10.0f); break; case EDITOR_MENU_BIAS_P_100: biasSelection(100.0f); break; case EDITOR_MENU_BIAS_P_1000: biasSelection(1000.0f); break; case EDITOR_MENU_BIAS_N_001: biasSelection(-0.01f); break; case EDITOR_MENU_BIAS_N_01: biasSelection(-0.1f); break; case EDITOR_MENU_BIAS_N_1: biasSelection(-1.0f); break; case EDITOR_MENU_BIAS_N_10: biasSelection(-10.0f); break; case EDITOR_MENU_BIAS_N_100 : biasSelection(-100.0f); break; case EDITOR_MENU_BIAS_N_1000: biasSelection(-1000.0f); break; case EDITOR_MENU_INTERPOLATION : onInterpolation(); break; case EDITOR_MENU_ENTER_CURRENT_V : onEnterCurrentValue(); break; // View case EDITOR_MENU_PLAY : onPlay(); break; case EDITOR_MENU_ROWS_UP : onRowStep(-highlightRowStep , NO_SELECTION); break; case EDITOR_MENU_ROWS_DOWN : onRowStep(highlightRowStep , NO_SELECTION); break; case EDITOR_MENU_ROWS_2X_UP : onRowStep(-highlightRowStep * 2 , NO_SELECTION); break; case EDITOR_MENU_ROWS_2X_DOWN : onRowStep(highlightRowStep * 2 , NO_SELECTION); break; case EDITOR_MENU_PREV_BOOKMARK : onBookmarkDir(ARROW_UP, NO_SELECTION); break; case EDITOR_MENU_NEXT_BOOKMARK : onBookmarkDir(ARROW_DOWN, NO_SELECTION); break; case EDITOR_MENU_FIRST_TRACK : onTrackSide(ARROW_LEFT, true, NO_SELECTION); break; case EDITOR_MENU_LAST_TRACK : onTrackSide(ARROW_RIGHT, true, NO_SELECTION); break; case EDITOR_MENU_PREV_KEY : onPrevNextKey(true, NO_SELECTION); break; case EDITOR_MENU_NEXT_KEY : onPrevNextKey(false, NO_SELECTION); break; case EDITOR_MENU_FOLD_TRACK : onFoldTrack(true); break; case EDITOR_MENU_UNFOLD_TRACK : onFoldTrack(false); break; case EDITOR_MENU_FOLD_GROUP : onFoldGroup(true); break; case EDITOR_MENU_UNFOLD_GROUP : onFoldGroup(false); break; case EDITOR_MENU_TOGGLE_BOOKMARK : onToggleBookmark(); break; case EDITOR_MENU_CLEAR_BOOKMARKS : onClearBookmarks(); break; case EDITOR_MENU_TAB : onTab(); break; } Editor_update(); }