* 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)
This commit is contained in:
ansstuff 2012-12-30 20:28:01 +00:00
parent 07a21643d6
commit ca82eadedf
15 changed files with 247 additions and 131 deletions

View File

@ -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),

View File

@ -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

View File

@ -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

View File

@ -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,6 +448,9 @@ bool SaveProjectAs()
if (GetSaveFileName(&ofn)) // if it is a valid filename
{
project.RenameProject(nameo, true);
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
@ -455,51 +458,48 @@ bool SaveProjectAs()
} else return false;
return true;
}
bool SaveProject()
bool SaveProject(bool save_compact)
{
if (project.GetProjectFile().empty())
{
return SaveProjectAs();
return SaveProjectAs(save_compact);
} else
{
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)

View File

@ -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();

View File

@ -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,11 +240,15 @@ 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();
switch (save_type)
{
case SAVECOMPACT_GREENZONE_ALL:
{
// write savestates
for (frame = 0; frame < greenZoneCount; ++frame)
{
// update TASEditor progressbar from time to time
@ -259,7 +266,59 @@ void GREENZONE::save(EMUFILE *os, bool really_save)
}
// write -1 as eof for greenzone
write32le(-1, os);
} else
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);
@ -275,6 +334,8 @@ void GREENZONE::save(EMUFILE *os, bool really_save)
write32le(size, os);
os->fwrite(&savestates[currFrameCounter][0], size);
}
break;
}
}
}
// returns true if couldn't load

View File

@ -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);

View File

@ -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);

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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();

View File

@ -41,6 +41,7 @@ public:
void RedrawTaseditor();
void UpdateCheckedItems();
void UpdateMenuCaptions();
void UpdateRecentProjectsMenu();
void UpdateRecentProjectsArray(const char* addString);