From ca82eadedf0b2db78458499416de63838b0b7ac4 Mon Sep 17 00:00:00 2001 From: ansstuff Date: Sun, 30 Dec 2012 20:28:01 +0000 Subject: [PATCH] * Taseditor: fixed bugs with holding Shift+Up/Down and similar situations when the Playback cursor moves more than once within one update * Taseditor: Changed "Compact save" dialog, added 4 options of Greenzone saving: all frames, every 16th frame, marked frames, don't save * Taseditor: Config->Compact Quicksaving (affects Ctrl+S and Autosave) --- src/drivers/win/config.cpp | 1 + src/drivers/win/res.rc | 27 ++-- src/drivers/win/resource.h | 4 +- src/drivers/win/taseditor.cpp | 97 +++++++------ src/drivers/win/taseditor.h | 4 +- src/drivers/win/taseditor/greenzone.cpp | 135 +++++++++++++----- src/drivers/win/taseditor/greenzone.h | 2 +- src/drivers/win/taseditor/piano_roll.cpp | 16 --- src/drivers/win/taseditor/playback.cpp | 24 ++-- .../win/taseditor/taseditor_config.cpp | 3 +- src/drivers/win/taseditor/taseditor_config.h | 14 +- .../win/taseditor/taseditor_project.cpp | 12 +- src/drivers/win/taseditor/taseditor_project.h | 2 +- .../win/taseditor/taseditor_window.cpp | 36 +++++ src/drivers/win/taseditor/taseditor_window.h | 1 + 15 files changed, 247 insertions(+), 131 deletions(-) diff --git a/src/drivers/win/config.cpp b/src/drivers/win/config.cpp index 5412b7db..58f76bc7 100644 --- a/src/drivers/win/config.cpp +++ b/src/drivers/win/config.cpp @@ -362,6 +362,7 @@ static CFGSTRUCT fceuconfig[] = AC(taseditor_config.findnote_search_up), AC(taseditor_config.draw_input), AC(taseditor_config.enable_greenzoning), + AC(taseditor_config.compact_quicksaving), AC(taseditor_config.silent_autosave), AC(taseditor_config.autopause_at_finish), AC(taseditor_config.tooltips), diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index 32413b86..19478fc0 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -283,6 +283,8 @@ BEGIN MENUITEM MFT_SEPARATOR MENUITEM "Enable Greenzoning", ID_CONFIG_ENABLEGREENZONING,MFT_STRING,MFS_ENABLED MENUITEM "Silent Autosave", ID_CONFIG_SILENTAUTOSAVE,MFT_STRING,MFS_ENABLED + MENUITEM "Compact Quicksaving", ID_CONFIG_COMPACTQUICKSAVING,MFT_STRING,MFS_ENABLED + MENUITEM MFT_SEPARATOR MENUITEM "Autofire Pattern skips Lag", ID_CONFIG_PATTERNSKIPSLAG,MFT_STRING,MFS_ENABLED MENUITEM "Auto-adjust Input according to Lag", ID_CONFIG_ADJUSTLAG,MFT_STRING,MFS_ENABLED MENUITEM MFT_SEPARATOR @@ -1529,20 +1531,24 @@ BEGIN CONTROL " Down",IDC_RADIO_DOWN,"Button",BS_AUTORADIOBUTTON,125,30,32,10 END -IDD_TASEDITOR_SAVECOMPACT DIALOGEX 0, 0, 122, 134 +IDD_TASEDITOR_SAVECOMPACT DIALOGEX 0, 0, 123, 201 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Save Compact" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - DEFPUSHBUTTON "Save",IDOK,7,114,50,14 - PUSHBUTTON "Cancel",IDCANCEL,65,114,50,14 - CONTROL " Binary format of Input",IDC_CHECK_BINARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,7,87,10 - CONTROL " Markers",IDC_CHECK_MARKERS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,22,67,10 - CONTROL " Bookmarks",IDC_CHECK_BOOKMARKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,37,67,10 - CONTROL " Greenzone",IDC_CHECK_GREENZONE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,52,67,10 - CONTROL " History",IDC_CHECK_HISTORY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,67,67,10 - CONTROL " Piano Roll",IDC_CHECK_PIANO_ROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,82,67,10 - CONTROL " Selection",IDC_CHECK_SELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,97,67,10 + DEFPUSHBUTTON "Save",IDOK,8,181,50,14 + PUSHBUTTON "Cancel",IDCANCEL,66,181,50,14 + CONTROL " Binary format of Input",IDC_CHECK_BINARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,8,87,10 + CONTROL " Markers",IDC_CHECK_MARKERS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,23,67,10 + CONTROL " Bookmarks",IDC_CHECK_BOOKMARKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,39,67,10 + CONTROL " History",IDC_CHECK_HISTORY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,55,67,10 + CONTROL " Piano Roll",IDC_CHECK_PIANO_ROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,71,67,10 + CONTROL " Selection",IDC_CHECK_SELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,87,67,10 + GROUPBOX "Greenzone saving options",IDC_STATIC,13,102,97,72 + CONTROL "all frames",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,34,114,69,10 + CONTROL "every 16th frame",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,34,128,69,10 + CONTROL "marked frames",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,34,143,69,10 + CONTROL "don't save",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,34,158,69,10 END ASSEMBLER DIALOGEX 0, 0, 202, 135 @@ -2059,6 +2065,7 @@ BEGIN IDD_TASEDITOR_SAVECOMPACT, DIALOG BEGIN + BOTTOMMARGIN, 192 END "ASSEMBLER", DIALOG diff --git a/src/drivers/win/resource.h b/src/drivers/win/resource.h index 49406676..b545aefc 100644 --- a/src/drivers/win/resource.h +++ b/src/drivers/win/resource.h @@ -403,7 +403,6 @@ #define MENU_PAL 311 #define IDC_DEBUGGER_VAL_SPR 311 #define IDC_LABEL_TWEAKCOUNT 311 -#define IDC_BTN_CHEAT_UPD2 311 #define IDC_BTN_CHEAT_ADDFROMFILE 311 #define IDC_DEBUGGER_BOOKMARK 312 #define IDC_DEBUGGER_CYCLES_EXCEED 313 @@ -1154,6 +1153,7 @@ #define ID_EMULATIONSPEED_CUSTOMSPEED 40577 #define ID_ENABLE_AUTO 40578 #define ID_ENABLE_AUTORESUME 40579 +#define ID_CONFIG_COMPACTQUICKSAVING 40580 #define IDC_DEBUGGER_ICONTRAY 55535 #define MW_ValueLabel2 65423 #define MW_ValueLabel1 65426 @@ -1164,7 +1164,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 289 -#define _APS_NEXT_COMMAND_VALUE 40580 +#define _APS_NEXT_COMMAND_VALUE 40581 #define _APS_NEXT_CONTROL_VALUE 1282 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/src/drivers/win/taseditor.cpp b/src/drivers/win/taseditor.cpp index 7cad4174..1eac2c71 100644 --- a/src/drivers/win/taseditor.cpp +++ b/src/drivers/win/taseditor.cpp @@ -414,7 +414,7 @@ bool LoadProject(const char* fullname) } // Saves current project -bool SaveProjectAs() +bool SaveProjectAs(bool save_compact) { const char filter[] = "TAS Editor Projects (*.fm3)\0*.fm3\0All Files (*.*)\0*.*\0\0"; OPENFILENAME ofn; @@ -448,58 +448,58 @@ bool SaveProjectAs() if (GetSaveFileName(&ofn)) // if it is a valid filename { project.RenameProject(nameo, true); - project.save(); + if (save_compact) + project.save(nameo, taseditor_config.savecompact_binary, taseditor_config.savecompact_markers, taseditor_config.savecompact_bookmarks, taseditor_config.savecompact_greenzone, taseditor_config.savecompact_history, taseditor_config.savecompact_piano_roll, taseditor_config.savecompact_selection); + else + project.save(); taseditor_window.UpdateRecentProjectsArray(nameo); // saved successfully - remove * mark from caption taseditor_window.UpdateCaption(); } else return false; return true; } -bool SaveProject() +bool SaveProject(bool save_compact) { if (project.GetProjectFile().empty()) { - return SaveProjectAs(); + return SaveProjectAs(save_compact); } else { - project.save(); + if (save_compact) + project.save(0, taseditor_config.savecompact_binary, taseditor_config.savecompact_markers, taseditor_config.savecompact_bookmarks, taseditor_config.savecompact_greenzone, taseditor_config.savecompact_history, taseditor_config.savecompact_piano_roll, taseditor_config.savecompact_selection); + else + project.save(); taseditor_window.UpdateCaption(); } return true; } -void SaveCompact_GetCheckboxes(HWND hwndDlg) +void SaveCompact_SetDialogItems(HWND hwndDlg) +{ + CheckDlgButton(hwndDlg, IDC_CHECK_BINARY, taseditor_config.savecompact_binary?MF_CHECKED : MF_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHECK_MARKERS, taseditor_config.savecompact_markers?MF_CHECKED : MF_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHECK_BOOKMARKS, taseditor_config.savecompact_bookmarks?MF_CHECKED : MF_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHECK_HISTORY, taseditor_config.savecompact_history?MF_CHECKED : MF_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHECK_PIANO_ROLL, taseditor_config.savecompact_piano_roll?MF_CHECKED : MF_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHECK_SELECTION, taseditor_config.savecompact_selection?MF_CHECKED : MF_UNCHECKED); + CheckRadioButton(hwndDlg, IDC_RADIO1, IDC_RADIO4, IDC_RADIO1 + (taseditor_config.savecompact_greenzone % SAVECOMPACT_GREENZONE_TOTAL)); +} +void SaveCompact_GetDialogItems(HWND hwndDlg) { taseditor_config.savecompact_binary = (SendDlgItemMessage(hwndDlg, IDC_CHECK_BINARY, BM_GETCHECK, 0, 0) == BST_CHECKED); taseditor_config.savecompact_markers = (SendDlgItemMessage(hwndDlg, IDC_CHECK_MARKERS, BM_GETCHECK, 0, 0) == BST_CHECKED); taseditor_config.savecompact_bookmarks = (SendDlgItemMessage(hwndDlg, IDC_CHECK_BOOKMARKS, BM_GETCHECK, 0, 0) == BST_CHECKED); - taseditor_config.savecompact_greenzone = (SendDlgItemMessage(hwndDlg, IDC_CHECK_GREENZONE, BM_GETCHECK, 0, 0) == BST_CHECKED); taseditor_config.savecompact_history = (SendDlgItemMessage(hwndDlg, IDC_CHECK_HISTORY, BM_GETCHECK, 0, 0) == BST_CHECKED); taseditor_config.savecompact_piano_roll = (SendDlgItemMessage(hwndDlg, IDC_CHECK_PIANO_ROLL, BM_GETCHECK, 0, 0) == BST_CHECKED); taseditor_config.savecompact_selection = (SendDlgItemMessage(hwndDlg, IDC_CHECK_SELECTION, BM_GETCHECK, 0, 0) == BST_CHECKED); -} - -BOOL CALLBACK AboutProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - case WM_INITDIALOG: - { - SendMessage(GetDlgItem(hWnd, IDC_TASEDITOR_NAME), WM_SETFONT, (WPARAM)piano_roll.hTaseditorAboutFont, 0); - break; - } - case WM_COMMAND: - { - switch (LOWORD(wParam)) - { - case IDCANCEL: - EndDialog(hWnd, 0); - return TRUE; - } - break; - } - } - return FALSE; + if (SendDlgItemMessage(hwndDlg, IDC_RADIO1, BM_GETCHECK, 0, 0) == BST_CHECKED) + taseditor_config.savecompact_greenzone = SAVECOMPACT_GREENZONE_ALL; + else if (SendDlgItemMessage(hwndDlg, IDC_RADIO2, BM_GETCHECK, 0, 0) == BST_CHECKED) + taseditor_config.savecompact_greenzone = SAVECOMPACT_GREENZONE_16TH; + else if (SendDlgItemMessage(hwndDlg, IDC_RADIO3, BM_GETCHECK, 0, 0) == BST_CHECKED) + taseditor_config.savecompact_greenzone = SAVECOMPACT_GREENZONE_MARKED; + else + taseditor_config.savecompact_greenzone = SAVECOMPACT_GREENZONE_NO; } BOOL CALLBACK SaveCompactProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) @@ -509,13 +509,7 @@ BOOL CALLBACK SaveCompactProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM case WM_INITDIALOG: { SetWindowPos(hwndDlg, 0, taseditor_config.wndx + 100, taseditor_config.wndy + 200, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER); - CheckDlgButton(hwndDlg, IDC_CHECK_BINARY, taseditor_config.savecompact_binary?MF_CHECKED : MF_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHECK_MARKERS, taseditor_config.savecompact_markers?MF_CHECKED : MF_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHECK_BOOKMARKS, taseditor_config.savecompact_bookmarks?MF_CHECKED : MF_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHECK_GREENZONE, taseditor_config.savecompact_greenzone?MF_CHECKED : MF_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHECK_HISTORY, taseditor_config.savecompact_history?MF_CHECKED : MF_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHECK_PIANO_ROLL, taseditor_config.savecompact_piano_roll?MF_CHECKED : MF_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHECK_SELECTION, taseditor_config.savecompact_selection?MF_CHECKED : MF_UNCHECKED); + SaveCompact_SetDialogItems(hwndDlg); return TRUE; } case WM_COMMAND: @@ -523,11 +517,11 @@ BOOL CALLBACK SaveCompactProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM switch (LOWORD(wParam)) { case IDOK: - SaveCompact_GetCheckboxes(hwndDlg); + SaveCompact_GetDialogItems(hwndDlg); EndDialog(hwndDlg, 1); return TRUE; case IDCANCEL: - SaveCompact_GetCheckboxes(hwndDlg); + SaveCompact_GetDialogItems(hwndDlg); EndDialog(hwndDlg, 0); return TRUE; } @@ -536,7 +530,7 @@ BOOL CALLBACK SaveCompactProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM case WM_CLOSE: case WM_QUIT: { - SaveCompact_GetCheckboxes(hwndDlg); + SaveCompact_GetDialogItems(hwndDlg); break; } } @@ -644,6 +638,29 @@ void Import() } } +BOOL CALLBACK AboutProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + SendMessage(GetDlgItem(hWnd, IDC_TASEDITOR_NAME), WM_SETFONT, (WPARAM)piano_roll.hTaseditorAboutFont, 0); + break; + } + case WM_COMMAND: + { + switch (LOWORD(wParam)) + { + case IDCANCEL: + EndDialog(hWnd, 0); + return TRUE; + } + break; + } + } + return FALSE; +} + BOOL CALLBACK ExportProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) diff --git a/src/drivers/win/taseditor.h b/src/drivers/win/taseditor.h index 096e60f0..64742140 100644 --- a/src/drivers/win/taseditor.h +++ b/src/drivers/win/taseditor.h @@ -15,8 +15,8 @@ void UpdateTasEditor(); void NewProject(); void OpenProject(); bool LoadProject(const char* fullname); -bool SaveProject(); -bool SaveProjectAs(); +bool SaveProject(bool save_compact = false); +bool SaveProjectAs(bool save_compact = false); void SaveCompact(); bool AskSaveProject(); diff --git a/src/drivers/win/taseditor/greenzone.cpp b/src/drivers/win/taseditor/greenzone.cpp index b7bc1241..2927f665 100644 --- a/src/drivers/win/taseditor/greenzone.cpp +++ b/src/drivers/win/taseditor/greenzone.cpp @@ -224,11 +224,14 @@ void GREENZONE::UnGreenzoneSelectedFrames() } } -void GREENZONE::save(EMUFILE *os, bool really_save) +void GREENZONE::save(EMUFILE *os, int save_type) { - if (really_save) + if (save_type != SAVECOMPACT_GREENZONE_NO) { CollectCurrentState(); // in case the project is being saved before the greenzone.update() was called within current frame + RunGreenzoneCleaning(); + if (greenZoneCount > (int)savestates.size()) + greenZoneCount = savestates.size(); // write "GREENZONE" string os->fwrite(greenzone_save_id, GREENZONE_ID_LEN); // write LagLog @@ -237,43 +240,101 @@ void GREENZONE::save(EMUFILE *os, bool really_save) write32le(greenZoneCount, os); // write Playback cursor position write32le(currFrameCounter, os); - // write savestates - int frame, size; - int last_tick = 0; - RunGreenzoneCleaning(); - if (greenZoneCount > (int)savestates.size()) greenZoneCount = savestates.size(); - for (frame = 0; frame < greenZoneCount; ++frame) - { - // update TASEditor progressbar from time to time - if (frame / PROGRESSBAR_UPDATE_RATE > last_tick) - { - playback.SetProgressbar(frame, greenZoneCount); - last_tick = frame / PROGRESSBAR_UPDATE_RATE; - } - if (!savestates[frame].size()) continue; - write32le(frame, os); - // write savestate - size = savestates[frame].size(); - write32le(size, os); - os->fwrite(&savestates[frame][0], size); - } - // write -1 as eof for greenzone - write32le(-1, os); - } else + } + int frame, size; + int last_tick = 0; + + switch (save_type) { - // write "GREENZONX" string - os->fwrite(greenzone_skipsave_id, GREENZONE_ID_LEN); - // write LagLog - laglog.save(os); - // write Playback cursor position - write32le(currFrameCounter, os); - if (currFrameCounter > 0) + case SAVECOMPACT_GREENZONE_ALL: { - // write ONE savestate for currFrameCounter - CollectCurrentState(); - int size = savestates[currFrameCounter].size(); - write32le(size, os); - os->fwrite(&savestates[currFrameCounter][0], size); + // write savestates + for (frame = 0; frame < greenZoneCount; ++frame) + { + // update TASEditor progressbar from time to time + if (frame / PROGRESSBAR_UPDATE_RATE > last_tick) + { + playback.SetProgressbar(frame, greenZoneCount); + last_tick = frame / PROGRESSBAR_UPDATE_RATE; + } + if (!savestates[frame].size()) continue; + write32le(frame, os); + // write savestate + size = savestates[frame].size(); + write32le(size, os); + os->fwrite(&savestates[frame][0], size); + } + // write -1 as eof for greenzone + write32le(-1, os); + break; + } + case SAVECOMPACT_GREENZONE_16TH: + { + // write savestates + for (frame = 0; frame < greenZoneCount; ++frame) + { + if (!(frame & 0xF) || frame == currFrameCounter) + { + // update TASEditor progressbar from time to time + if (frame / PROGRESSBAR_UPDATE_RATE > last_tick) + { + playback.SetProgressbar(frame, greenZoneCount); + last_tick = frame / PROGRESSBAR_UPDATE_RATE; + } + if (!savestates[frame].size()) continue; + write32le(frame, os); + // write savestate + size = savestates[frame].size(); + write32le(size, os); + os->fwrite(&savestates[frame][0], size); + } + } + // write -1 as eof for greenzone + write32le(-1, os); + break; + } + case SAVECOMPACT_GREENZONE_MARKED: + { + // write savestates + for (frame = 0; frame < greenZoneCount; ++frame) + { + if (markers_manager.GetMarker(frame) || frame == currFrameCounter) + { + // update TASEditor progressbar from time to time + if (frame / PROGRESSBAR_UPDATE_RATE > last_tick) + { + playback.SetProgressbar(frame, greenZoneCount); + last_tick = frame / PROGRESSBAR_UPDATE_RATE; + } + if (!savestates[frame].size()) continue; + write32le(frame, os); + // write savestate + size = savestates[frame].size(); + write32le(size, os); + os->fwrite(&savestates[frame][0], size); + } + } + // write -1 as eof for greenzone + write32le(-1, os); + break; + } + case SAVECOMPACT_GREENZONE_NO: + { + // write "GREENZONX" string + os->fwrite(greenzone_skipsave_id, GREENZONE_ID_LEN); + // write LagLog + laglog.save(os); + // write Playback cursor position + write32le(currFrameCounter, os); + if (currFrameCounter > 0) + { + // write ONE savestate for currFrameCounter + CollectCurrentState(); + int size = savestates[currFrameCounter].size(); + write32le(size, os); + os->fwrite(&savestates[currFrameCounter][0], size); + } + break; } } } diff --git a/src/drivers/win/taseditor/greenzone.h b/src/drivers/win/taseditor/greenzone.h index 08dcbe07..683a3f7e 100644 --- a/src/drivers/win/taseditor/greenzone.h +++ b/src/drivers/win/taseditor/greenzone.h @@ -22,7 +22,7 @@ public: void free(); void update(); - void save(EMUFILE *os, bool really_save = true); + void save(EMUFILE *os, int save_type = SAVECOMPACT_GREENZONE_ALL); bool load(EMUFILE *is, unsigned int offset); bool LoadSavestate(unsigned int frame); diff --git a/src/drivers/win/taseditor/piano_roll.cpp b/src/drivers/win/taseditor/piano_roll.cpp index d7af1323..87c2fd93 100644 --- a/src/drivers/win/taseditor/piano_roll.cpp +++ b/src/drivers/win/taseditor/piano_roll.cpp @@ -1109,16 +1109,7 @@ void PIANO_ROLL::DragPlaybackCursor() if (target_frame < 0) target_frame = 0; if (currFrameCounter != target_frame) - { - int lastCursor = currFrameCounter; playback.jump(target_frame); - if (lastCursor != currFrameCounter) - { - // redraw row where Playback cursor was (in case there's two or more drags before playback.update()) - RedrawRow(lastCursor); - bookmarks.RedrawChangedBookmarks(lastCursor); - } - } } void PIANO_ROLL::FinishDrag() @@ -1990,14 +1981,7 @@ LRESULT APIENTRY ListWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) destination_frame = playback.GetPauseFrame() - delta; if (destination_frame < 0) destination_frame = 0; - int lastCursor = currFrameCounter; playback.jump(destination_frame); - if (lastCursor != currFrameCounter) - { - // redraw row where Playback cursor was (in case there's two or more WM_MOUSEWHEEL messages before playback.update()) - piano_roll.RedrawRow(lastCursor); - bookmarks.RedrawChangedBookmarks(lastCursor); - } } else if (history.CursorOverHistoryList()) { return SendMessage(history.hwndHistoryList, WM_MOUSEWHEEL_RESENT, wParam, lParam); diff --git a/src/drivers/win/taseditor/playback.cpp b/src/drivers/win/taseditor/playback.cpp index fc0c80af..a1c96308 100644 --- a/src/drivers/win/taseditor/playback.cpp +++ b/src/drivers/win/taseditor/playback.cpp @@ -375,17 +375,10 @@ void PLAYBACK::RewindFull(int speed) if (markers_manager.GetMarker(index)) break; speed--; } - int lastCursor = currFrameCounter; if (index >= 0) jump(index); // jump to the Marker else jump(0); // jump to the beginning of Piano Roll - if (lastCursor != currFrameCounter) - { - // redraw row where Playback cursor was (in case there's two or more RewindFulls before playback.update()) - piano_roll.RedrawRow(lastCursor); - bookmarks.RedrawChangedBookmarks(lastCursor); - } } void PLAYBACK::ForwardFull(int speed) { @@ -398,17 +391,10 @@ void PLAYBACK::ForwardFull(int speed) if (markers_manager.GetMarker(index)) break; speed--; } - int lastCursor = currFrameCounter; if (index <= last_frame) jump(index); // jump to Marker else jump(currMovieData.getNumRecords() - 1); // jump to the end of Piano Roll - if (lastCursor != currFrameCounter) - { - // redraw row where Playback cursor was (in case there's two or more ForwardFulls before playback.update()) - piano_roll.RedrawRow(lastCursor); - bookmarks.RedrawChangedBookmarks(lastCursor); - } } void PLAYBACK::RedrawMarker() @@ -458,6 +444,8 @@ void PLAYBACK::jump(int frame, bool force_reload, bool execute_lua, bool follow_ { if (frame < 0) return; + int lastCursor = currFrameCounter; + // 1 - set the Playback cursor to the frame or at least above the frame if (SetPlaybackAboveOrToFrame(frame, force_reload)) { @@ -479,6 +467,14 @@ void PLAYBACK::jump(int frame, bool force_reload, bool execute_lua, bool follow_ if (pause_frame) // if Playback was seeking, pause emulation right here SeekingStop(); } + + // redraw respective Piano Roll lines if needed + if (lastCursor != currFrameCounter) + { + // redraw row where Playback cursor was (in case there's two or more drags before playback.update()) + piano_roll.RedrawRow(lastCursor); + bookmarks.RedrawChangedBookmarks(lastCursor); + } } // returns true if the game state was changed (loaded) diff --git a/src/drivers/win/taseditor/taseditor_config.cpp b/src/drivers/win/taseditor/taseditor_config.cpp index 09b08906..5340b794 100644 --- a/src/drivers/win/taseditor/taseditor_config.cpp +++ b/src/drivers/win/taseditor/taseditor_config.cpp @@ -60,15 +60,16 @@ TASEDITOR_CONFIG::TASEDITOR_CONFIG() savecompact_binary = true; savecompact_markers = true; savecompact_bookmarks = true; - savecompact_greenzone = false; savecompact_history = false; savecompact_piano_roll = true; savecompact_selection = false; + savecompact_greenzone = SAVECOMPACT_GREENZONE_NO; findnote_matchcase = false; findnote_search_up = false; enable_auto_function = true; draw_input = true; enable_greenzoning = true; + compact_quicksaving = false; silent_autosave = true; autopause_at_finish = true; tooltips = true; diff --git a/src/drivers/win/taseditor/taseditor_config.h b/src/drivers/win/taseditor/taseditor_config.h index 9cd5e81f..5f635c3c 100644 --- a/src/drivers/win/taseditor/taseditor_config.h +++ b/src/drivers/win/taseditor/taseditor_config.h @@ -12,6 +12,17 @@ #define AUTOSAVE_PERIOD_MAX 1440 // 24 hours #define AUTOSAVE_PERIOD_DEFAULT 15 // in minutes +enum +{ + SAVECOMPACT_GREENZONE_ALL, + SAVECOMPACT_GREENZONE_16TH, + SAVECOMPACT_GREENZONE_MARKED, + SAVECOMPACT_GREENZONE_NO, + + // ... + SAVECOMPACT_GREENZONE_TOTAL +}; + #define AUTHOR_MAX_LEN 100 class TASEDITOR_CONFIG @@ -58,15 +69,16 @@ public: bool savecompact_binary; bool savecompact_markers; bool savecompact_bookmarks; - bool savecompact_greenzone; bool savecompact_history; bool savecompact_piano_roll; bool savecompact_selection; + int savecompact_greenzone; bool findnote_matchcase; bool findnote_search_up; bool enable_auto_function; bool draw_input; bool enable_greenzoning; + bool compact_quicksaving; bool silent_autosave; bool autopause_at_finish; bool tooltips; diff --git a/src/drivers/win/taseditor/taseditor_project.cpp b/src/drivers/win/taseditor/taseditor_project.cpp index a5bd30fe..a2ef17e1 100644 --- a/src/drivers/win/taseditor/taseditor_project.cpp +++ b/src/drivers/win/taseditor/taseditor_project.cpp @@ -36,8 +36,8 @@ extern SPLICER splicer; extern FCEUGI *GameInfo; extern void FCEU_PrintError(char *format, ...); -extern bool SaveProject(); -extern bool SaveProjectAs(); +extern bool SaveProject(bool save_compact = false); +extern bool SaveProjectAs(bool save_compact = false); extern int GetInputType(MovieData& md); extern void SetInputType(MovieData& md, int new_input_type); @@ -63,15 +63,15 @@ void TASEDITOR_PROJECT::update() if (changed && taseditor_window.TASEditor_focus && taseditor_config.autosave_period && !projectFile.empty() && clock() >= next_save_shedule && piano_roll.drag_mode == DRAG_MODE_NONE) { if (taseditor_config.silent_autosave) - SaveProject(); + SaveProject(taseditor_config.compact_quicksaving); else - SaveProjectAs(); + SaveProjectAs(taseditor_config.compact_quicksaving); // in case user pressed Cancel, postpone saving to next time SheduleNextAutosave(); } } -bool TASEDITOR_PROJECT::save(const char* different_name, bool save_binary, bool save_markers, bool save_bookmarks, bool save_greenzone, bool save_history, bool save_piano_roll, bool save_selection) +bool TASEDITOR_PROJECT::save(const char* different_name, bool save_binary, bool save_markers, bool save_bookmarks, int save_greenzone, bool save_history, bool save_piano_roll, bool save_selection) { if (!different_name && GetProjectFile().empty()) // no different name specified, and there's no current filename of the project @@ -134,7 +134,7 @@ bool TASEDITOR_PROJECT::save(const char* different_name, bool save_binary, bool unsigned int saved_stuff_map = 0; if (save_markers) saved_stuff_map |= MARKERS_SAVED; if (save_bookmarks) saved_stuff_map |= BOOKMARKS_SAVED; - if (save_greenzone) saved_stuff_map |= GREENZONE_SAVED; + if (save_greenzone != SAVECOMPACT_GREENZONE_NO) saved_stuff_map |= GREENZONE_SAVED; if (save_history) saved_stuff_map |= HISTORY_SAVED; if (save_piano_roll) saved_stuff_map |= PIANO_ROLL_SAVED; if (save_selection) saved_stuff_map |= SELECTION_SAVED; diff --git a/src/drivers/win/taseditor/taseditor_project.h b/src/drivers/win/taseditor/taseditor_project.h index 0b025012..cbc1d1d5 100644 --- a/src/drivers/win/taseditor/taseditor_project.h +++ b/src/drivers/win/taseditor/taseditor_project.h @@ -51,7 +51,7 @@ public: void reset(); void update(); - bool save(const char* different_name = 0, bool save_binary = true, bool save_markers = true, bool save_bookmarks = true, bool save_greenzone = true, bool save_history = true, bool save_piano_roll = true, bool save_selection = true); + bool save(const char* different_name = 0, bool save_binary = true, bool save_markers = true, bool save_bookmarks = true, int save_greenzone = SAVECOMPACT_GREENZONE_ALL, bool save_history = true, bool save_piano_roll = true, bool save_selection = true); bool load(const char* fullname); void RenameProject(const char* new_fullname, bool filename_is_correct); diff --git a/src/drivers/win/taseditor/taseditor_window.cpp b/src/drivers/win/taseditor/taseditor_window.cpp index 777d46a9..163d2578 100644 --- a/src/drivers/win/taseditor/taseditor_window.cpp +++ b/src/drivers/win/taseditor/taseditor_window.cpp @@ -122,6 +122,7 @@ const unsigned int MAX_NUMBER_OF_RECENT_PROJECTS = sizeof(recent_projects)/sizeo // Patterns Menu const unsigned int MENU_FIRST_PATTERN = MENU_FIRST_RECENT_PROJECT + MAX_NUMBER_OF_RECENT_PROJECTS; +char temp_buf1[1024] = {0}, temp_buf2[1024] = {0}; // resources char windowCaptioBase[] = "TAS Editor"; char patterns_menu_prefix[] = "Pattern: "; @@ -199,6 +200,7 @@ void TASEDITOR_WINDOW::init() // menus and checked items hmenu = GetMenu(hwndTasEditor); UpdateCheckedItems(); + UpdateMenuCaptions(); patterns_menu = GetSubMenu(hmenu, PATTERNS_MENU_POS); // tooltips for (int i = 0; i < TASEDITOR_WINDOW_TOTAL_ITEMS; ++i) @@ -565,6 +567,7 @@ void TASEDITOR_WINDOW::UpdateCheckedItems() CheckMenuItem(hmenu, ID_VIEW_JUMPWHENMAKINGUNDO, taseditor_config.jump_to_undo?MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, ID_VIEW_FOLLOWMARKERNOTECONTEXT, taseditor_config.follow_note_context?MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, ID_CONFIG_ENABLEGREENZONING, taseditor_config.enable_greenzoning?MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(hmenu, ID_CONFIG_COMPACTQUICKSAVING, taseditor_config.compact_quicksaving?MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, ID_CONFIG_SILENTAUTOSAVE, taseditor_config.silent_autosave?MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, ID_CONFIG_PATTERNSKIPSLAG, taseditor_config.pattern_skips_lag?MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, ID_CONFIG_ADJUSTLAG, taseditor_config.adjust_input_due_to_lag?MF_CHECKED : MF_UNCHECKED); @@ -580,6 +583,32 @@ void TASEDITOR_WINDOW::UpdateCheckedItems() CheckMenuItem(hmenu, ID_CONFIG_AUTOPAUSEATTHEENDOFMOVIE, taseditor_config.autopause_at_finish?MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, ID_HELP_TOOLTIPS, taseditor_config.tooltips?MF_CHECKED : MF_UNCHECKED); } +void TASEDITOR_WINDOW::UpdateMenuCaptions() +{ + // change "Save" and "Save Compact" keyboard shortcut hints + if (taseditor_config.compact_quicksaving) + { + strcpy(temp_buf1, "Save"); + strcpy(temp_buf2, "Save Compact\t~[Ctrl+S]"); + } else + { + strcpy(temp_buf1, "Save\tCtrl+S"); + strcpy(temp_buf2, "Save Compact"); + } + MENUITEMINFO moo; + moo.cbSize = sizeof(moo); + moo.fMask = MIIM_TYPE; + moo.cch = NULL; + GetMenuItemInfo(hmenu, ID_FILE_SAVEPROJECT, FALSE, &moo); + moo.dwTypeData = (LPSTR)temp_buf1; + SetMenuItemInfo(hmenu, ID_FILE_SAVEPROJECT, FALSE, &moo); + moo.cbSize = sizeof(moo); + moo.fMask = MIIM_TYPE; + moo.cch = NULL; + GetMenuItemInfo(hmenu, ID_FILE_SAVECOMPACT, FALSE, &moo); + moo.dwTypeData = (LPSTR)temp_buf2; + SetMenuItemInfo(hmenu, ID_FILE_SAVECOMPACT, FALSE, &moo); +} // -------------------------------------------------------------------------------------------- void TASEDITOR_WINDOW::UpdateRecentProjectsMenu() @@ -893,6 +922,8 @@ BOOL CALLBACK WndprocTasEditor(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara OpenProject(); break; case ACCEL_CTRL_S: + SaveProject(taseditor_config.compact_quicksaving); + break; case ID_FILE_SAVEPROJECT: SaveProject(); break; @@ -1058,6 +1089,11 @@ BOOL CALLBACK WndprocTasEditor(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara taseditor_config.enable_greenzoning ^= 1; taseditor_window.UpdateCheckedItems(); break; + case ID_CONFIG_COMPACTQUICKSAVING: + taseditor_config.compact_quicksaving ^= 1; + taseditor_window.UpdateCheckedItems(); + taseditor_window.UpdateMenuCaptions(); + break; case ID_CONFIG_SILENTAUTOSAVE: taseditor_config.silent_autosave ^= 1; taseditor_window.UpdateCheckedItems(); diff --git a/src/drivers/win/taseditor/taseditor_window.h b/src/drivers/win/taseditor/taseditor_window.h index 52a72b23..6e846c66 100644 --- a/src/drivers/win/taseditor/taseditor_window.h +++ b/src/drivers/win/taseditor/taseditor_window.h @@ -41,6 +41,7 @@ public: void RedrawTaseditor(); void UpdateCheckedItems(); + void UpdateMenuCaptions(); void UpdateRecentProjectsMenu(); void UpdateRecentProjectsArray(const char* addString);