diff --git a/src/drivers/Qt/TasEditor/TasEditorWindow.cpp b/src/drivers/Qt/TasEditor/TasEditorWindow.cpp index 6d1af645..9366c3cc 100644 --- a/src/drivers/Qt/TasEditor/TasEditorWindow.cpp +++ b/src/drivers/Qt/TasEditor/TasEditorWindow.cpp @@ -68,47 +68,6 @@ HISTORY *history = NULL; SPLICER *splicer = NULL; // Piano Roll Definitions -enum PIANO_ROLL_COLUMNS -{ - COLUMN_ICONS, - COLUMN_FRAMENUM, - COLUMN_JOYPAD1_A, - COLUMN_JOYPAD1_B, - COLUMN_JOYPAD1_S, - COLUMN_JOYPAD1_T, - COLUMN_JOYPAD1_U, - COLUMN_JOYPAD1_D, - COLUMN_JOYPAD1_L, - COLUMN_JOYPAD1_R, - COLUMN_JOYPAD2_A, - COLUMN_JOYPAD2_B, - COLUMN_JOYPAD2_S, - COLUMN_JOYPAD2_T, - COLUMN_JOYPAD2_U, - COLUMN_JOYPAD2_D, - COLUMN_JOYPAD2_L, - COLUMN_JOYPAD2_R, - COLUMN_JOYPAD3_A, - COLUMN_JOYPAD3_B, - COLUMN_JOYPAD3_S, - COLUMN_JOYPAD3_T, - COLUMN_JOYPAD3_U, - COLUMN_JOYPAD3_D, - COLUMN_JOYPAD3_L, - COLUMN_JOYPAD3_R, - COLUMN_JOYPAD4_A, - COLUMN_JOYPAD4_B, - COLUMN_JOYPAD4_S, - COLUMN_JOYPAD4_T, - COLUMN_JOYPAD4_U, - COLUMN_JOYPAD4_D, - COLUMN_JOYPAD4_L, - COLUMN_JOYPAD4_R, - COLUMN_FRAMENUM2, - - TOTAL_COLUMNS -}; - enum DRAG_MODES { DRAG_MODE_NONE, @@ -1364,7 +1323,7 @@ int TasEditorWindow::initModules(void) // force the input configuration stored in the movie to apply to FCEUX config applyMovieInputConfig(); // reset some modules that need MovieData info - //pianoRoll.reset(); + pianoRoll->reset(); recorder.reset(); // create initial snapshot in history history.reset(); @@ -1387,7 +1346,7 @@ void TasEditorWindow::frameUpdate(void) //taseditorWindow.update(); greenzone.update(); recorder.update(); - //pianoRoll.update(); + pianoRoll->periodicUpdate(); markersManager.update(); playback.update(); bookmarks.update(); @@ -1831,7 +1790,7 @@ void TasEditorWindow::createNewProject(void) bookmarks.reset(); branches.reset(); history.reset(); - //pianoRoll.reset(); + pianoRoll->reset(); selection.reset(); //editor.reset(); splicer.reset(); @@ -3184,6 +3143,7 @@ QPianoRoll::QPianoRoll(QWidget *parent) this->setPalette(pal); numCtlr = 2; + numColumns = 2 + (NUM_JOYPAD_BUTTONS * numCtlr); calcFontData(); vbar = NULL; @@ -3198,12 +3158,37 @@ QPianoRoll::QPianoRoll(QWidget *parent) markerDragFrameNumber = 0; markerDragCountdown = 0; drawingStartTimestamp = 0; + headerItemUnderMouse = 0; + nextHeaderUpdateTime = 0; mouse_x = mouse_y = -1; + memset( headerColors, 0, sizeof(headerColors) ); + + headerLightsColors[ 0] = QColor( 0x00, 0x00, 0x00 ); + headerLightsColors[ 1] = QColor( 0x13, 0x73, 0x00 ); + headerLightsColors[ 2] = QColor( 0x00, 0x91, 0x00 ); + headerLightsColors[ 3] = QColor( 0x00, 0xAF, 0x1D ); + headerLightsColors[ 4] = QColor( 0x00, 0xC7, 0x42 ); + headerLightsColors[ 5] = QColor( 0x00, 0xD9, 0x65 ); + headerLightsColors[ 6] = QColor( 0x00, 0xE5, 0x91 ); + headerLightsColors[ 7] = QColor( 0x00, 0xF0, 0xB0 ); + headerLightsColors[ 8] = QColor( 0x00, 0xF7, 0xDA ); + headerLightsColors[ 9] = QColor( 0x7C, 0xFC, 0xF0 ); + headerLightsColors[10] = QColor( 0xBA, 0xFF, 0xFC ); } //---------------------------------------------------------------------------- QPianoRoll::~QPianoRoll(void) { +} +//---------------------------------------------------------------------------- +void QPianoRoll::reset(void) +{ + int num_joysticks = joysticksPerFrame[getInputType(currMovieData)]; + + numCtlr = num_joysticks; + + numColumns = 2 + (NUM_JOYPAD_BUTTONS * num_joysticks); + } //---------------------------------------------------------------------------- void QPianoRoll::setScrollBars( QScrollBar *h, QScrollBar *v ) @@ -3997,14 +3982,14 @@ void QPianoRoll::handleColumnSet(int column, bool altPressed) { if (parent->handleColumnSetUsingPattern()) { - //setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); + setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); } } else { if (parent->handleColumnSet()) { - //setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); + setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); } } } @@ -4017,19 +4002,93 @@ void QPianoRoll::handleColumnSet(int column, bool altPressed) { if (parent->handleInputColumnSetUsingPattern(joy, button)) { - //setLightInHeaderColumn(column, HEADER_LIGHT_MAX); + setLightInHeaderColumn(column, HEADER_LIGHT_MAX); } } else { if (parent->handleInputColumnSet(joy, button)) { - //setLightInHeaderColumn(column, HEADER_LIGHT_MAX); + setLightInHeaderColumn(column, HEADER_LIGHT_MAX); } } } } //---------------------------------------------------------------------------- +void QPianoRoll::periodicUpdate(void) +{ + // once per 40 milliseconds update colors alpha in the Header + if (clock() > nextHeaderUpdateTime) + { + nextHeaderUpdateTime = clock() + HEADER_LIGHT_UPDATE_TICK; + bool changes_made = false; + int light_value = 0; + // 1 - update Frame# columns' heads + //if (GetAsyncKeyState(VK_MENU) & 0x8000) light_value = HEADER_LIGHT_HOLD; else + if (dragMode == DRAG_MODE_NONE && (headerItemUnderMouse == COLUMN_FRAMENUM || headerItemUnderMouse == COLUMN_FRAMENUM2)) + { + light_value = (selection->getCurrentRowsSelectionSize() > 0) ? HEADER_LIGHT_MOUSEOVER_SEL : HEADER_LIGHT_MOUSEOVER; + } + if (headerColors[COLUMN_FRAMENUM] < light_value) + { + headerColors[COLUMN_FRAMENUM]++; + changes_made = true; + } + else if (headerColors[COLUMN_FRAMENUM] > light_value) + { + headerColors[COLUMN_FRAMENUM]--; + changes_made = true; + } + headerColors[COLUMN_FRAMENUM2] = headerColors[COLUMN_FRAMENUM]; + // 2 - update Input columns' heads + int i = numColumns-1; + if (i == COLUMN_FRAMENUM2) i--; + for (; i >= COLUMN_JOYPAD1_A; i--) + { + light_value = 0; + if (recorder->currentJoypadData[(i - COLUMN_JOYPAD1_A) / NUM_JOYPAD_BUTTONS] & (1 << ((i - COLUMN_JOYPAD1_A) % NUM_JOYPAD_BUTTONS))) + { + light_value = HEADER_LIGHT_HOLD; + } + else if (dragMode == DRAG_MODE_NONE && headerItemUnderMouse == i) + { + light_value = (selection->getCurrentRowsSelectionSize() > 0) ? HEADER_LIGHT_MOUSEOVER_SEL : HEADER_LIGHT_MOUSEOVER; + } + + if (headerColors[i] < light_value) + { + headerColors[i]++; + changes_made = true; + } + else if (headerColors[i] > light_value) + { + headerColors[i]--; + changes_made = true; + } + } + // 3 - redraw + if (changes_made) + { + update(); + } + } +} +//---------------------------------------------------------------------------- +void QPianoRoll::setLightInHeaderColumn(int column, int level) +{ + if (column < COLUMN_FRAMENUM || column >= numColumns || level < 0 || level > HEADER_LIGHT_MAX) + { + return; + } + + if (headerColors[column] != level) + { + headerColors[column] = level; + //redrawHeader(); + nextHeaderUpdateTime = clock() + HEADER_LIGHT_UPDATE_TICK; + } +} +//---------------------------------------------------------------------------- void QPianoRoll::followSelection(void) { RowsSelection* current_selection = selection->getCopyOfCurrentRowsSelection(); @@ -4265,7 +4324,7 @@ void QPianoRoll::finishDrag(void) markersManager->setNote(destination_marker_id, dragged_marker_note); history->registerMarkersChange(MODTYPE_MARKER_SWAP, markerDragFrameNumber, rowUnderMouse); selection->mustFindCurrentMarker = playback->mustFindCurrentMarker = true; - //setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); + setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); } } else @@ -4279,7 +4338,7 @@ void QPianoRoll::finishDrag(void) markersManager->removeMarkerFromFrame(markerDragFrameNumber); history->registerMarkersChange(MODTYPE_MARKER_DRAG, markerDragFrameNumber, rowUnderMouse, markersManager->getNoteCopy(markersManager->getMarkerAtFrame(rowUnderMouse)).c_str()); selection->mustFindCurrentMarker = playback->mustFindCurrentMarker = true; - //setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); + setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); //redrawRow(rowUnderMouse); } } @@ -4693,6 +4752,7 @@ void QPianoRoll::paintEvent(QPaintEvent *event) painter.setPen( QColor( 0, 0, 0 ) ); painter.drawLine( x, 0, x, viewHeight ); x--; + painter.setPen( headerLightsColors[ headerColors[COLUMN_JOYPAD1_A + (i*8) + j] ] ); painter.drawText( x + pxCharWidth, pxLineTextOfs, tr(buttonNames[j]) ); x += pxWidthBtnCol; diff --git a/src/drivers/Qt/TasEditor/TasEditorWindow.h b/src/drivers/Qt/TasEditor/TasEditorWindow.h index 99038153..c23f2518 100644 --- a/src/drivers/Qt/TasEditor/TasEditorWindow.h +++ b/src/drivers/Qt/TasEditor/TasEditorWindow.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include #include @@ -56,6 +57,54 @@ class TasEditorWindow; +// Piano Roll Definitions +enum PIANO_ROLL_COLUMNS +{ + COLUMN_ICONS, + COLUMN_FRAMENUM, + COLUMN_JOYPAD1_A, + COLUMN_JOYPAD1_B, + COLUMN_JOYPAD1_S, + COLUMN_JOYPAD1_T, + COLUMN_JOYPAD1_U, + COLUMN_JOYPAD1_D, + COLUMN_JOYPAD1_L, + COLUMN_JOYPAD1_R, + COLUMN_JOYPAD2_A, + COLUMN_JOYPAD2_B, + COLUMN_JOYPAD2_S, + COLUMN_JOYPAD2_T, + COLUMN_JOYPAD2_U, + COLUMN_JOYPAD2_D, + COLUMN_JOYPAD2_L, + COLUMN_JOYPAD2_R, + COLUMN_JOYPAD3_A, + COLUMN_JOYPAD3_B, + COLUMN_JOYPAD3_S, + COLUMN_JOYPAD3_T, + COLUMN_JOYPAD3_U, + COLUMN_JOYPAD3_D, + COLUMN_JOYPAD3_L, + COLUMN_JOYPAD3_R, + COLUMN_JOYPAD4_A, + COLUMN_JOYPAD4_B, + COLUMN_JOYPAD4_S, + COLUMN_JOYPAD4_T, + COLUMN_JOYPAD4_U, + COLUMN_JOYPAD4_D, + COLUMN_JOYPAD4_L, + COLUMN_JOYPAD4_R, + COLUMN_FRAMENUM2, + + TOTAL_COLUMNS +}; + +#define HEADER_LIGHT_MAX 10 +#define HEADER_LIGHT_HOLD 5 +#define HEADER_LIGHT_MOUSEOVER_SEL 3 +#define HEADER_LIGHT_MOUSEOVER 0 +#define HEADER_LIGHT_UPDATE_TICK (40 * (CLOCKS_PER_SEC / 1000)) // 25FPS + struct NewProjectParameters { int inputType; @@ -85,6 +134,7 @@ class QPianoRoll : public QWidget QPianoRoll(QWidget *parent = 0); ~QPianoRoll(void); + void reset(void); void setScrollBars( QScrollBar *h, QScrollBar *v ); QFont getFont(void){ return font; }; @@ -101,6 +151,8 @@ class QPianoRoll : public QWidget void followPlaybackCursor(void); void followPauseframe(void); void followUndoHint(void); + void setLightInHeaderColumn(int column, int level); + void periodicUpdate(void); protected: void calcFontData(void); @@ -134,8 +186,12 @@ class QPianoRoll : public QWidget QScrollBar *hbar; QScrollBar *vbar; QColor windowColor; + QColor headerLightsColors[11]; + + int8_t headerColors[TOTAL_COLUMNS]; int numCtlr; + int numColumns; int pxCharWidth; int pxCharHeight; int pxCursorHeight; @@ -165,6 +221,8 @@ class QPianoRoll : public QWidget int markerDragFrameNumber; int markerDragCountdown; int drawingStartTimestamp; + int headerItemUnderMouse; + int nextHeaderUpdateTime; int mouse_x; int mouse_y; diff --git a/src/drivers/Qt/TasEditor/recorder.cpp b/src/drivers/Qt/TasEditor/recorder.cpp index 56385c68..c7ec17a0 100644 --- a/src/drivers/Qt/TasEditor/recorder.cpp +++ b/src/drivers/Qt/TasEditor/recorder.cpp @@ -305,7 +305,7 @@ void RECORDER::recordInput(void) { if ((newJoyData[i] & (1 << button)) && !(oldJoyData[i] & (1 << button))) { - //pianoRoll.setLightInHeaderColumn(COLUMN_JOYPAD1_A + i * NUM_JOYPAD_BUTTONS + button, HEADER_LIGHT_MAX); + tasWin->pianoRoll->setLightInHeaderColumn(COLUMN_JOYPAD1_A + i * NUM_JOYPAD_BUTTONS + button, HEADER_LIGHT_MAX); } } } @@ -340,7 +340,7 @@ void RECORDER::recordInput(void) { if ((newJoyData[joy] & (1 << button)) && !(oldJoyData[joy] & (1 << button))) { - //pianoRoll.setLightInHeaderColumn(COLUMN_JOYPAD1_A + joy * NUM_JOYPAD_BUTTONS + button, HEADER_LIGHT_MAX); + tasWin->pianoRoll->setLightInHeaderColumn(COLUMN_JOYPAD1_A + joy * NUM_JOYPAD_BUTTONS + button, HEADER_LIGHT_MAX); } } } diff --git a/src/drivers/Qt/TasEditor/splicer.cpp b/src/drivers/Qt/TasEditor/splicer.cpp index 1d34b97e..e34f6c89 100644 --- a/src/drivers/Qt/TasEditor/splicer.cpp +++ b/src/drivers/Qt/TasEditor/splicer.cpp @@ -607,8 +607,8 @@ bool SPLICER::pasteInputFromClipboard() for (int btn = 0; btn < NUM_JOYPAD_BUTTONS; ++btn) { if (flash_joy[joy] & (1 << btn)) - { // FIXME - //pianoRoll.setLightInHeaderColumn(COLUMN_JOYPAD1_A + joy * NUM_JOYPAD_BUTTONS + btn, HEADER_LIGHT_MAX); + { + tasWin->pianoRoll->setLightInHeaderColumn(COLUMN_JOYPAD1_A + joy * NUM_JOYPAD_BUTTONS + btn, HEADER_LIGHT_MAX); } } } @@ -732,7 +732,7 @@ bool SPLICER::pasteInsertInputFromClipboard(void) { if (flash_joy[joy] & (1 << btn)) { - //pianoRoll.setLightInHeaderColumn(COLUMN_JOYPAD1_A + joy * NUM_JOYPAD_BUTTONS + btn, HEADER_LIGHT_MAX); + tasWin->pianoRoll->setLightInHeaderColumn(COLUMN_JOYPAD1_A + joy * NUM_JOYPAD_BUTTONS + btn, HEADER_LIGHT_MAX); } } } diff --git a/src/drivers/Qt/TasEditor/taseditor_lua.cpp b/src/drivers/Qt/TasEditor/taseditor_lua.cpp index ebe10543..edbc1bb7 100644 --- a/src/drivers/Qt/TasEditor/taseditor_lua.cpp +++ b/src/drivers/Qt/TasEditor/taseditor_lua.cpp @@ -144,12 +144,15 @@ int TASEDITOR_LUA::setmarker(int frame) history->registerMarkersChange(MODTYPE_LUA_MARKER_SET, frame); selection->mustFindCurrentMarker = playback->mustFindCurrentMarker = true; //pianoRoll.redrawRow(frame); - //pianoRoll.setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); + tasWin->pianoRoll->setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); } } return marker_id; - } else + } + else + { return -1; + } } // taseditor.removemarker(int frame) @@ -164,7 +167,7 @@ void TASEDITOR_LUA::removemarker(int frame) history->registerMarkersChange(MODTYPE_LUA_MARKER_REMOVE, frame); selection->mustFindCurrentMarker = playback->mustFindCurrentMarker = true; //pianoRoll.redrawRow(frame); - //pianoRoll.setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); + tasWin->pianoRoll->setLightInHeaderColumn(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); } } }