diff --git a/src/drivers/win/config.cpp b/src/drivers/win/config.cpp index ab62aafc..875ba61c 100644 --- a/src/drivers/win/config.cpp +++ b/src/drivers/win/config.cpp @@ -70,6 +70,8 @@ extern bool fullSaveStateLoads; extern int frameSkipAmt; extern bool TASEdit_follow_playback; extern bool TASEdit_show_lag_frames; +extern bool TASEdit_show_markers; +extern bool TASEdit_bind_markers; extern bool TASEdit_restore_position; extern bool TASEdit_show_dot; extern int TASEdit_greenzone_capacity; @@ -292,6 +294,8 @@ static CFGSTRUCT fceuconfig[] = { AC(DesynchAutoFire), AC(TASEdit_follow_playback), AC(TASEdit_show_lag_frames), + AC(TASEdit_show_markers), + AC(TASEdit_bind_markers), AC(TASEdit_restore_position), AC(TASEdit_show_dot), AC(TASEdit_greenzone_capacity), diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index d9b7ae5f..6c9b1f47 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -219,11 +219,11 @@ TASEDITMENU MENU BEGIN POPUP "&File" BEGIN - MENUITEM "&New Project\tCtrl+N", ID_FILE_NEWPROJECT - MENUITEM "&Open Project...\tCtrl+O", ID_FILE_OPENPROJECT + MENUITEM "&New Project", ID_FILE_NEWPROJECT + MENUITEM "&Open Project...", ID_FILE_OPENPROJECT MENUITEM "&Save Project\tCtrl+S", ID_FILE_SAVEPROJECT - MENUITEM "S&ave Project As...\tCtrl+Shift+S", ID_FILE_SAVEPROJECTAS - MENUITEM "Recent", ID_TASEDIT_FILE_RECENT + MENUITEM "S&ave Project As...", ID_FILE_SAVEPROJECTAS + MENUITEM "&Recent", ID_TASEDIT_FILE_RECENT MENUITEM SEPARATOR MENUITEM "&Import FM2", ID_FILE_IMPORTFM2, INACTIVE MENUITEM "&Export to FM2", ID_FILE_EXPORTFM2 @@ -233,23 +233,30 @@ BEGIN POPUP "&Edit" BEGIN MENUITEM "&Select All", ID_EDIT_SELECTALL + MENUITEM "Select mid &Markers\tCtrl+A", ID_EDIT_SELECTMIDMARKERS MENUITEM SEPARATOR MENUITEM "Cu&t\tCtrl+X", ID_TASEDIT_CUT MENUITEM "&Copy\tCtrl+C", ID_TASEDIT_COPY MENUITEM "&Paste\tCtrl+V", ID_TASEDIT_PASTE - MENUITEM "&Delete\tCtrl+Delete", ID_TASEDIT_DELETE MENUITEM SEPARATOR - MENUITEM "&Truncate\tCtrl+T", ID_EDIT_TRUNCATE + MENUITEM "C&lear\tDelete", ID_EDIT_CLEAR + MENUITEM "&Delete\tCtrl+Del", ID_TASEDIT_DELETE + MENUITEM "&Insert Frames\tCtrl+Ins", ID_EDIT_INSERTFRAMES + MENUITEM "Insert # of Frames\tInsert", ID_EDIT_INSERT + MENUITEM SEPARATOR + MENUITEM "T&runcate movie\tCtrl+T", ID_EDIT_TRUNCATE END POPUP "&View" BEGIN - MENUITEM "Highlight &lag frames", ID_VIEW_SHOW_LAG_FRAMES + MENUITEM "Highlight &Lag Frames", ID_VIEW_SHOW_LAG_FRAMES + MENUITEM "Show &Markers", ID_VIEW_SHOW_MARKERS MENUITEM "Show &dot in empty cells", ID_VIEW_SHOWDOTINEMPTYCELLS END - POPUP "Config" + POPUP "&Config" BEGIN - MENUITEM "Set greenzone capacity", ID_CONFIG_SETGREENZONECAPACITY - MENUITEM "Mute Turbo", ID_CONFIG_MUTETURBO + MENUITEM "Set &greenzone capacity", ID_CONFIG_SETGREENZONECAPACITY + MENUITEM "Mute &Turbo", ID_CONFIG_MUTETURBO + MENUITEM "&Bind Markers to Input", ID_CONFIG_BINDMARKERSTOINPUT END POPUP "&Help" BEGIN @@ -331,18 +338,20 @@ TASEDITCONTEXTMENUS MENU BEGIN POPUP "Stray" BEGIN - MENUITEM "Insert number of Frames", MENU_CONTEXT_STRAY_INSERTFRAMES + MENUITEM "Insert # of Frames", MENU_CONTEXT_STRAY_INSERTFRAMES MENUITEM SEPARATOR - MENUITEM "Truncate", ID_CONTEXT_STRAY_TRUNCATE + MENUITEM "T&runcate movie", ID_CONTEXT_STRAY_TRUNCATE END POPUP "Selected" BEGIN - MENUITEM "Insert Frame(s)", ID_CONTEXT_SELECTED_INSERTFRAMES - MENUITEM "Insert number of Frames", ID_CONTEXT_SELECTED_INSERTFRAMES2 - MENUITEM "Delete Frame(s)", ID_CONTEXT_SELECTED_DELETEFRAMES - MENUITEM "Clear Frame(s)", ID_CONTEXT_SELECTED_CLEARFRAMES + MENUITEM "Select mid &Markers", ID_SELECTED_SELECTMIDMARKERS MENUITEM SEPARATOR - MENUITEM "Truncate", ID_CONTEXT_SELECTED_TRUNCATE + MENUITEM "&Insert Frame(s)", ID_CONTEXT_SELECTED_INSERTFRAMES + MENUITEM "Insert # of Frames", ID_CONTEXT_SELECTED_INSERTFRAMES2 + MENUITEM "&Delete Frame(s)", ID_CONTEXT_SELECTED_DELETEFRAMES + MENUITEM "C&lear Frame(s)", ID_CONTEXT_SELECTED_CLEARFRAMES + MENUITEM SEPARATOR + MENUITEM "T&runcate movie", ID_CONTEXT_SELECTED_TRUNCATE END END @@ -2014,8 +2023,9 @@ BEGIN "T", ACCEL_CTRL_T, VIRTKEY, CONTROL, NOINVERT "V", ACCEL_CTRL_V, VIRTKEY, CONTROL, NOINVERT "X", ACCEL_CTRL_X, VIRTKEY, CONTROL, NOINVERT - VK_INSERT, ACCEL_INS, VIRTKEY, NOINVERT VK_DELETE, ACCEL_DEL, VIRTKEY, NOINVERT + VK_INSERT, ACCEL_INS, VIRTKEY, NOINVERT + "A", ACCEL_CTRL_A, VIRTKEY, CONTROL, NOINVERT END IDR_RWACCELERATOR ACCELERATORS diff --git a/src/drivers/win/resource.h b/src/drivers/win/resource.h index 4cd9f2a4..7ef27d30 100644 --- a/src/drivers/win/resource.h +++ b/src/drivers/win/resource.h @@ -498,8 +498,8 @@ #define IDC_C_WATCH_SEPARATE 1259 #define IDC_TWEAKCOUNT 1260 #define CHECK_AUTORESTORE_PLAYBACK 1261 -#define CHECK_FOLLOW_CURSOR 1263 #define IDC_PROGRESS1 1262 +#define CHECK_FOLLOW_CURSOR 1263 #define MENU_NETWORK 40040 #define MENU_PALETTE 40041 #define MENU_SOUND 40042 @@ -837,6 +837,16 @@ #define ID_SELECTED_CLEARSELECTION 40445 #define ID_CONTEXT_SELECTED_CLEARSELECTION 40446 #define ID_CONTEXT_SELECTED_CLEARFRAMES 40447 +#define ID_VIEW_SHOW 40448 +#define ID_VIEW_SHOW_MARKERS 40449 +#define ID_EDIT_CLEAR 40450 +#define ID_EDIT_INSERTFRAMES 40451 +#define ID_EDIT_INSERT 40452 +#define ID_EDIT_SELECTBETWEENMARKERS 40453 +#define ID_CONFIG_BINDMARKERSTOINPUT 40454 +#define ACCEL_CTRL_A 40455 +#define ID_EDIT_SELECTMIDMARKERS 40457 +#define ID_SELECTED_SELECTMIDMARKERS 40458 #define IDC_DEBUGGER_ICONTRAY 55535 #define MW_ValueLabel2 65423 #define MW_ValueLabel1 65426 @@ -846,7 +856,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 160 -#define _APS_NEXT_COMMAND_VALUE 40448 +#define _APS_NEXT_COMMAND_VALUE 40459 #define _APS_NEXT_CONTROL_VALUE 1263 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/src/drivers/win/tasedit.cpp b/src/drivers/win/tasedit.cpp index 1dc55398..dd59a3af 100644 --- a/src/drivers/win/tasedit.cpp +++ b/src/drivers/win/tasedit.cpp @@ -46,6 +46,8 @@ extern bool compressSavestates; int TasEdit_wndx, TasEdit_wndy; bool TASEdit_follow_playback = true; bool TASEdit_show_lag_frames = true; +bool TASEdit_show_markers = true; +bool TASEdit_bind_markers = true; bool TASEdit_restore_position = false; int TASEdit_greenzone_capacity = GREENZONE_DEFAULT_CAPACITY; extern bool muteTurbo; @@ -152,10 +154,18 @@ static LONG CustomDraw(NMLVCUSTOMDRAW* msg) if (cell_y == currFrameCounter || (cell_y == pauseframe-1 && show_pauseframe)) { // current frame - msg->clrTextBk = CUR_FRAMENUM_COLOR; + if(TASEdit_show_markers && currMovieData.frames_flags[cell_y] & MARKER_FLAG_BIT) + // this frame is also marked + msg->clrTextBk = CUR_MARKED_FRAMENUM_COLOR; + else + msg->clrTextBk = CUR_FRAMENUM_COLOR; + } else if(TASEdit_show_markers && currMovieData.frames_flags[cell_y] & MARKER_FLAG_BIT) + { + // marked frame + msg->clrTextBk = MARKED_FRAMENUM_COLOR; } else if(cell_y < currMovieData.greenZoneCount && !currMovieData.savestates[cell_y].empty()) { - if (TASEdit_show_lag_frames && currMovieData.frames_flags[cell_y] && (currMovieData.frames_flags[cell_y] & LAG_FLAG_BIT)) + if (TASEdit_show_lag_frames && (currMovieData.frames_flags[cell_y] & LAG_FLAG_BIT)) { // lag frame msg->clrTextBk = LAG_FRAMENUM_COLOR; @@ -174,7 +184,7 @@ static LONG CustomDraw(NMLVCUSTOMDRAW* msg) msg->clrTextBk = CUR_INPUT_COLOR1; } else if(cell_y < currMovieData.greenZoneCount && !currMovieData.savestates[cell_y].empty()) { - if (TASEdit_show_lag_frames && currMovieData.frames_flags[cell_y] && (currMovieData.frames_flags[cell_y] & LAG_FLAG_BIT)) + if (TASEdit_show_lag_frames && (currMovieData.frames_flags[cell_y] & LAG_FLAG_BIT)) { // lag frame msg->clrTextBk = LAG_INPUT_COLOR1; @@ -193,7 +203,7 @@ static LONG CustomDraw(NMLVCUSTOMDRAW* msg) msg->clrTextBk = CUR_INPUT_COLOR2; } else if(cell_y < currMovieData.greenZoneCount && !currMovieData.savestates[cell_y].empty()) { - if (TASEdit_show_lag_frames && currMovieData.frames_flags[cell_y] && (currMovieData.frames_flags[cell_y] & LAG_FLAG_BIT)) + if (TASEdit_show_lag_frames && (currMovieData.frames_flags[cell_y] & LAG_FLAG_BIT)) { // lag frame msg->clrTextBk = LAG_INPUT_COLOR2; @@ -453,6 +463,10 @@ void InputChanged() project.changed = true; } +void MarkersChanged() +{ + project.changed = true; +} void InvalidateGreenZone(int after) { @@ -563,7 +577,17 @@ void SingleClick(LPNMITEMACTIVATE info) RedrawList(); } else if(column_index == COLUMN_FRAMENUM || column_index == COLUMN_FRAMENUM2) { - // click on the "frame number" column - do nothing + // click on the "frame number" column - set marker if clicked with Alt + if (info->uKeyFlags & LVKF_ALT) + { + // reverse MARKER_FLAG_BIT in pointed frame + if (currMovieData.frames_flags[row_index] & MARKER_FLAG_BIT) + currMovieData.frames_flags[row_index] &= ~MARKER_FLAG_BIT; + else + currMovieData.frames_flags[row_index] |= MARKER_FLAG_BIT; + MarkersChanged(); + RedrawList(); // just to flicker-indicate that something has changed + } } else if(column_index >= COLUMN_JOYPAD1_A && column_index <= COLUMN_JOYPAD4_R) { @@ -589,16 +613,6 @@ void DoubleClick(LPNMITEMACTIVATE info) } } -static void ClearSelection() -{ - ListView_SetItemState(hwndList,-1,0, LVIS_FOCUSED|LVIS_SELECTED); - //selectionFrames.clear(); -} -static void ClearRowSelection(int index) -{ - ListView_SetItemState(hwndList,index,0, LVIS_FOCUSED|LVIS_SELECTED); -} - //insert frames at the currently selected positions. static void InsertFrames() { @@ -608,6 +622,7 @@ static void InsertFrames() //to keep this from being even slower than it would otherwise be, go ahead and reserve records currMovieData.records.reserve(currMovieData.records.size()+frames); + currMovieData.frames_flags.reserve(currMovieData.frames_flags.size()+frames); //insert frames before each selection, but consecutive selection lines are accounted as single region frames = 1; @@ -635,8 +650,9 @@ static void DeleteFrames() for(TSelectionFrames::reverse_iterator it(selectionFrames.rbegin()); it != selectionFrames.rend(); it++) { currMovieData.records.erase(currMovieData.records.begin() + *it); + if (TASEdit_bind_markers) + currMovieData.frames_flags.erase(currMovieData.frames_flags.begin() + *it); } - // check if user deleted all frames if (!currMovieData.records.size()) StartFromZero(); @@ -653,7 +669,6 @@ static void DeleteFrames() // reduce selection manually, because reduced list won't call ItemChanged for these rows selectionFrames.erase(delete_index); if (!selectionFrames.size()) break; - //ClearRowSelection(delete_index); } // reduce greenzone if (index>0) index--; @@ -673,62 +688,148 @@ static void ClearFrames() InvalidateGreenZone(index); } - -//the column set operation, for setting a button for a span of selected values +//the column set operation, for setting a button/Marker for a span of selected values static void ColumnSet(int column) { - int joy = (column - COLUMN_JOYPAD1_A) / NUM_JOYPAD_BUTTONS; - if (joy < 0 || joy >= NUM_JOYPADS) return; - int button = (column - COLUMN_JOYPAD1_A) % NUM_JOYPAD_BUTTONS; - - //inspect the selected frames. count the set and unset rows - int set=0, unset=0; - for(TSelectionFrames::iterator it(selectionFrames.begin()); it != selectionFrames.end(); it++) + if (column == COLUMN_FRAMENUM || column == COLUMN_FRAMENUM2) { - if(currMovieData.records[*it].checkBit(joy,button)) - set++; - else unset++; - } - - //if it is half and half, then set them all - //if they are all set, unset them all - //if they are all unset, set them all - bool setz = (set==0); - bool unsetz = (unset==0); - bool newValue; - - //do nothing if we didnt even have any work to do - if(setz && unsetz) - return; - //all unset.. set them - else if(setz && !unsetz) - newValue = true; - //all set.. unset them - else if(!setz && unsetz) - newValue = false; - //a mix. set them. - else newValue = true; - - //operate on the data - for(TSelectionFrames::iterator it(selectionFrames.begin()); it != selectionFrames.end(); it++) + // Markers column + //inspect the selected frames, if they are all set, then unset all, else set all + bool unset_found = false; + for(TSelectionFrames::iterator it(selectionFrames.begin()); it != selectionFrames.end(); it++) + { + if(!(currMovieData.frames_flags[*it] & MARKER_FLAG_BIT)) + { + unset_found = true; + break; + } + } + if (unset_found) + { + // set all + for(TSelectionFrames::iterator it(selectionFrames.begin()); it != selectionFrames.end(); it++) + currMovieData.frames_flags[*it] |= MARKER_FLAG_BIT; + } else + { + // unset all + for(TSelectionFrames::iterator it(selectionFrames.begin()); it != selectionFrames.end(); it++) + currMovieData.frames_flags[*it] &= ~MARKER_FLAG_BIT; + } + MarkersChanged(); + RedrawList(); // just to flicker-indicate that something has changed + } else { - currMovieData.records[*it].setBitValue(joy,button,newValue); + // buttons column + int joy = (column - COLUMN_JOYPAD1_A) / NUM_JOYPAD_BUTTONS; + if (joy < 0 || joy >= NUM_JOYPADS) return; + int button = (column - COLUMN_JOYPAD1_A) % NUM_JOYPAD_BUTTONS; + //inspect the selected frames, if they are all set, then unset all, else set all + bool newValue = false; + for(TSelectionFrames::iterator it(selectionFrames.begin()); it != selectionFrames.end(); it++) + { + if(!(currMovieData.records[*it].checkBit(joy,button))) + { + newValue = true; + break; + } + } + // apply newValue + for(TSelectionFrames::iterator it(selectionFrames.begin()); it != selectionFrames.end(); it++) + currMovieData.records[*it].setBitValue(joy,button,newValue); + InputChanged(); + InvalidateGreenZone(*selectionFrames.begin()); } - InputChanged(); - InvalidateGreenZone(*selectionFrames.begin()); } -//Highlights all frames in current input log -static void SelectAll() +void ClearSelection() { - ClearSelection(); - for(unsigned int i=0;i= 0; upper_marker--) + if (currMovieData.frames_flags[upper_marker] & MARKER_FLAG_BIT) break; + // searching down starting from center+1 + for (lower_marker = center+1; lower_marker < movie_size; ++lower_marker) + if (currMovieData.frames_flags[lower_marker] & MARKER_FLAG_BIT) break; + + if (upper_marker == -1 && lower_marker == movie_size) + { + SelectAll(); + return; + } + // selecting circle: + if (upper_border > upper_marker+1 || lower_border < lower_marker-1 || lower_border > lower_marker) + { + // default: select all between markers + for (int i = upper_marker+1; i < lower_marker; ++i) + { + ListView_SetItemState(hwndList,i,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); + } + } else if (upper_border == upper_marker+1 && lower_border == lower_marker-1) + { + // already selected all between markers - now select both markers or at least select the marker that is not outside movie range + if (upper_marker < 0) upper_marker = 0; + if (lower_marker >= movie_size) lower_marker >= movie_size - 1; + for (int i = upper_marker; i <= lower_marker; ++i) + { + ListView_SetItemState(hwndList,i,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); + } + } else if (upper_border <= upper_marker && lower_border >= lower_marker) + { + // selected all between markers and both markers selected too - now deselect lower marker + ListView_SetItemState(hwndList,lower_marker,0,LVIS_FOCUSED|LVIS_SELECTED); + for (int i = upper_marker; i < lower_marker; ++i) + { + ListView_SetItemState(hwndList,i,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); + } + } else if (upper_border == upper_marker && lower_border == lower_marker-1) + { + // selected all between markers and upper marker selected too - now deselect upper marker and (if lower marker < movie_size) reselect lower marker + ListView_SetItemState(hwndList,upper_marker,0,LVIS_FOCUSED|LVIS_SELECTED); + if (lower_marker >= movie_size) lower_marker >= movie_size - 1; + for (int i = upper_marker+1; i <= lower_marker; ++i) + { + ListView_SetItemState(hwndList,i,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); + } + } else if (upper_border == upper_marker+1 && lower_border == lower_marker) + { + // selected all between markers and lower marker selected too - now deselect lower marker (return to "selected all between markers") + ListView_SetItemState(hwndList,lower_marker,0,LVIS_FOCUSED|LVIS_SELECTED); + for (int i = upper_marker + 1; i < lower_marker; ++i) + { + ListView_SetItemState(hwndList,i,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); + } + } +} //copies the current selection to the clipboard static bool Copy() @@ -906,13 +1007,16 @@ static LRESULT APIENTRY HeaderWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lP case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: { - //perform hit test - HD_HITTESTINFO info; - info.pt.x = GET_X_LPARAM(lParam); - info.pt.y = GET_Y_LPARAM(lParam); - SendMessage(hWnd,HDM_HITTEST,0,(LPARAM)&info); - if(info.iItem >= COLUMN_JOYPAD1_A && info.iItem <= COLUMN_JOYPAD4_R) - ColumnSet(info.iItem); + if (selectionFrames.size()) + { + //perform hit test + HD_HITTESTINFO info; + info.pt.x = GET_X_LPARAM(lParam); + info.pt.y = GET_Y_LPARAM(lParam); + SendMessage(hWnd,HDM_HITTEST,0,(LPARAM)&info); + if(info.iItem >= COLUMN_FRAMENUM && info.iItem <= COLUMN_FRAMENUM2) + ColumnSet(info.iItem); + } } return true; } @@ -1467,11 +1571,11 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar //link to TASEdit in help menu break; case ACCEL_INS: + case ID_EDIT_INSERT: case MENU_CONTEXT_STRAY_INSERTFRAMES: case ID_CONTEXT_SELECTED_INSERTFRAMES2: { int frames = selectionFrames.size(); - if (!frames) frames = 1; if(CWin32InputBox::GetInteger("Insert number of Frames", "How many frames?", frames, hwndDlg) == IDOK) { if (frames > 0) @@ -1495,10 +1599,12 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar } break; case ACCEL_CTRL_INSERT: + case ID_EDIT_INSERTFRAMES: case ID_CONTEXT_SELECTED_INSERTFRAMES: if (selectionFrames.size()) InsertFrames(); break; case ACCEL_DEL: + case ID_EDIT_CLEAR: case ID_CONTEXT_SELECTED_CLEARFRAMES: if (selectionFrames.size()) ClearFrames(); break; @@ -1532,6 +1638,17 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar CheckMenuItem(hmenu, ID_VIEW_SHOW_LAG_FRAMES, TASEdit_show_lag_frames?MF_CHECKED : MF_UNCHECKED); RedrawList(); break; + case ID_VIEW_SHOW_MARKERS: + //switch "Show Markers" flag + TASEdit_show_markers ^= 1; + CheckMenuItem(hmenu, ID_VIEW_SHOW_MARKERS, TASEdit_show_markers?MF_CHECKED : MF_UNCHECKED); + RedrawList(); + break; + case ID_VIEW_SHOWDOTINEMPTYCELLS: + TASEdit_show_dot ^= 1; + CheckMenuItem(hmenu, ID_VIEW_SHOWDOTINEMPTYCELLS, TASEdit_show_dot?MF_CHECKED : MF_UNCHECKED); + RedrawList(); + break; case ACCEL_CTRL_P: case CHECK_AUTORESTORE_PLAYBACK: //switch "Auto-restore last playback position" flag @@ -1561,6 +1678,11 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar muteTurbo ^= 1; CheckMenuItem(hmenu, ID_CONFIG_MUTETURBO, muteTurbo?MF_CHECKED : MF_UNCHECKED); break; + case ID_CONFIG_BINDMARKERSTOINPUT: + //switch "Bind Markers to Input" flag + TASEdit_bind_markers ^= 1; + CheckMenuItem(hmenu, ID_CONFIG_BINDMARKERSTOINPUT, TASEdit_bind_markers?MF_CHECKED : MF_UNCHECKED); + break; case IDC_PROGRESS_BUTTON: if (pauseframe) SeekingStop(); break; @@ -1593,10 +1715,10 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar if (movie_readonly) FCEUI_MovieToggleReadOnly(); multitrack_recording_joypad = MULTITRACK_RECORDING_4P; break; - case ID_VIEW_SHOWDOTINEMPTYCELLS: - TASEdit_show_dot ^= 1; - CheckMenuItem(hmenu, ID_VIEW_SHOWDOTINEMPTYCELLS, TASEdit_show_dot?MF_CHECKED : MF_UNCHECKED); - RedrawList(); + case ACCEL_CTRL_A: + case ID_EDIT_SELECTMIDMARKERS: + case ID_SELECTED_SELECTMIDMARKERS: + SelectMidMarkers(); break; } @@ -1655,6 +1777,8 @@ void EnterTasEdit() // check option ticks CheckDlgButton(hwndTasEdit, CHECK_FOLLOW_CURSOR, TASEdit_follow_playback?MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, ID_VIEW_SHOW_LAG_FRAMES, TASEdit_show_lag_frames?MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(hmenu, ID_VIEW_SHOW_MARKERS, TASEdit_show_markers?MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(hmenu, ID_CONFIG_BINDMARKERSTOINPUT, TASEdit_bind_markers?MF_CHECKED : MF_UNCHECKED); CheckDlgButton(hwndTasEdit,CHECK_AUTORESTORE_PLAYBACK,TASEdit_restore_position?BST_CHECKED:BST_UNCHECKED); CheckMenuItem(hmenu, ID_CONFIG_MUTETURBO, muteTurbo?MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, ID_VIEW_SHOWDOTINEMPTYCELLS, TASEdit_show_dot?MF_CHECKED : MF_UNCHECKED); diff --git a/src/drivers/win/tasedit.h b/src/drivers/win/tasedit.h index 54c8f28c..3f0d72d6 100644 --- a/src/drivers/win/tasedit.h +++ b/src/drivers/win/tasedit.h @@ -54,9 +54,11 @@ // listview colors #define NORMAL_FRAMENUM_COLOR 0xFFFFFF +#define MARKED_FRAMENUM_COLOR 0xC0FCFF +#define CUR_MARKED_FRAMENUM_COLOR 0xDEF7F4 #define CUR_FRAMENUM_COLOR 0xFCF1CE -#define GREENZONE_FRAMENUM_COLOR 0xDCFFDC -#define LAG_FRAMENUM_COLOR 0xDAD9FE +#define GREENZONE_FRAMENUM_COLOR 0xDDFFDD +#define LAG_FRAMENUM_COLOR 0xDBDAFF #define NORMAL_INPUT_COLOR1 0xF0F0F0 #define CUR_INPUT_COLOR1 0xF7E9B2 #define GREENZONE_INPUT_COLOR1 0xC3FFC3 @@ -78,6 +80,7 @@ bool JumpToFrame(int index); int FindBeginningOfGreenZone(int starting_index); void FollowPlayback(); void ClearSelection(); +void ClearRowSelection(int index); void AddFourscore(); void RemoveFourscore(); void RedrawWindowCaption(); @@ -100,4 +103,6 @@ void OpenProject(); bool SaveProject(); bool SaveProjectAs(); bool AskSaveProject(); +void SelectAll(); +void SelectMidMarkers(); diff --git a/src/movie.cpp b/src/movie.cpp index 495a9e01..912496a4 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -53,6 +53,7 @@ extern char FileBase[]; extern bool AutoSS; //Declared in fceu.cpp, keeps track if a auto-savestate has been made #ifdef WIN32 extern int TASEdit_greenzone_capacity; +extern bool TASEdit_bind_markers; #endif std::vector subtitleFrames; //Frame numbers for subtitle messages @@ -110,7 +111,10 @@ int currRerecordCount; void MovieData::clearRecordRange(int start, int len) { for(int i=0;i= (int)currMovieData.records.size() || currMovieData.records.size()==0) currMovieData.insertEmpty(-1, 1 + currFrameCounter - (int)currMovieData.records.size()); - if (currFrameCounter >= (int)currMovieData.frames_flags.size()) - currMovieData.frames_flags.resize(currFrameCounter+1); //always log savestates in taseditor mode currMovieData.storeTasSavestate(currFrameCounter, Z_DEFAULT_COMPRESSION); // also log frame_flags if (currFrameCounter > 0) { // lagFlag indicates that lag was in previous frame - currMovieData.frames_flags[currFrameCounter-1] = (lagFlag)?LAG_FLAG_BIT:0; + if (lagFlag) + currMovieData.frames_flags[currFrameCounter-1] |= LAG_FLAG_BIT; + else + currMovieData.frames_flags[currFrameCounter-1] &= ~LAG_FLAG_BIT; } // update greenzone upper limit if (currMovieData.greenZoneCount <= currFrameCounter) @@ -591,6 +604,7 @@ int MovieData::dumpGreenzone(EMUFILE *os) bool MovieData::loadGreenzone(EMUFILE *is) { clearGreenzone(); + frames_flags.resize(records.size()); int frame = 0, prev_frame = 0, size = 0; int last_tick = PROGRESSBAR_UPDATE_MIN; // read size @@ -598,8 +612,6 @@ bool MovieData::loadGreenzone(EMUFILE *is) { greenZoneCount = size; savestates.resize(greenZoneCount); - frames_flags.resize(greenZoneCount); - savestates.resize(greenZoneCount); #ifdef WIN32 int greenzone_tail_frame = greenZoneCount-1 - TASEdit_greenzone_capacity; #else diff --git a/src/movie.h b/src/movie.h index 3c308c68..ab518abb 100644 --- a/src/movie.h +++ b/src/movie.h @@ -2,6 +2,7 @@ #define __MOVIE_H_ #define LAG_FLAG_BIT 1 +#define MARKER_FLAG_BIT 2 #define PROGRESSBAR_UPDATE_RATE 3000 // in frames of greenzone #define PROGRESSBAR_UPDATE_MIN 6000 / PROGRESSBAR_UPDATE_RATE