* Taseditor: changing history size doesn't reset history

* Disabling "Screenshot" menu items when no game is loaded (fix #3495357)
This commit is contained in:
ansstuff 2012-03-01 15:16:00 +00:00
parent 5b9df13cc5
commit b09e9ac184
9 changed files with 123 additions and 27 deletions

View File

@ -39,9 +39,11 @@ extern TASEDITOR_LUA taseditor_lua;
extern int joysticks_per_frame[NUM_SUPPORTED_INPUT_TYPES];
extern int GetInputType(MovieData& md);
extern Window_items_struct window_items[];
char history_save_id[HISTORY_ID_LEN] = "HISTORY";
char history_skipsave_id[HISTORY_ID_LEN] = "HISTORX";
char modCaptions[MODTYPES_TOTAL][20] = {" Init",
char modCaptions[MODTYPES_TOTAL][20] = {" Init Project",
" Undefined",
" Set",
" Unset",
@ -124,7 +126,7 @@ void HISTORY::reset()
// create initial snapshot
SNAPSHOT inp;
inp.init(currMovieData, taseditor_config.enable_hot_changes);
strcat(inp.description, modCaptions[0]);
strcat(inp.description, modCaptions[MODTYPE_INIT]);
inp.jump_frame = -1;
AddSnapshotToHistory(inp);
UpdateHistoryList();
@ -149,6 +151,38 @@ void HISTORY::update()
piano_roll.RedrawRow(undo_hint_pos); // not changing Bookmarks List
}
void HISTORY::HistorySizeChanged()
{
int new_history_size = taseditor_config.undo_levels + 1;
std::vector<SNAPSHOT> new_snapshots(new_history_size);
int pos = history_cursor_pos, source_pos = history_cursor_pos;
if (pos >= new_history_size)
pos = new_history_size - 1;
int new_history_cursor_pos = pos;
// copy old "undo" snapshots
while (pos >= 0)
{
new_snapshots[pos] = snapshots[(history_start_pos + source_pos) % history_size];
pos--;
source_pos--;
}
// copy old "redo" snapshots
int num_redo_snapshots = history_total_items - (history_cursor_pos + 1);
int space_available = new_history_size - (new_history_cursor_pos + 1);
int i = (num_redo_snapshots <= space_available) ? num_redo_snapshots : space_available;
int new_history_total_items = new_history_cursor_pos + i + 1;
for (; i > 0; i--)
new_snapshots[new_history_cursor_pos + i] = snapshots[(history_start_pos + history_cursor_pos + i) % history_size];
// finish
snapshots = new_snapshots;
history_size = new_history_size;
history_start_pos = 0;
history_cursor_pos = new_history_cursor_pos;
history_total_items = new_history_total_items;
UpdateHistoryList();
RedrawHistoryList();
}
// returns frame of first input change (for greenzone invalidation)
int HISTORY::jump(int new_pos)
{
@ -232,7 +266,7 @@ void HISTORY::redo()
void HISTORY::AddSnapshotToHistory(SNAPSHOT &inp)
{
// history uses conveyor of snapshots (vector with fixed size) to aviod resizing which is awfully expensive with such large objects as SNAPSHOT
if (history_cursor_pos+1 >= history_size)
if (history_total_items >= history_size)
{
// reached the end of available history_size - move history_start_pos (thus deleting oldest snapshot)
history_cursor_pos = history_size-1;
@ -583,12 +617,12 @@ int HISTORY::RegisterLuaChanges(const char* name, int start, bool InsertionDelet
// fill description:
if (name[0])
{
// custom name of operation
// user provided custom name of operation
strcat(inp.description, LuaCaptionPrefix);
strncat(inp.description, name, LUACHANGES_NAME_MAX_LEN);
} else
{
// default name
// set default name
strcat(inp.description, modCaptions[inp.mod_type]);
}
inp.jump_frame = first_changes;
@ -799,6 +833,17 @@ int HISTORY::GetUndoHint()
else
return -1;
}
bool HISTORY::CursorOverHistoryList()
{
POINT p;
if (GetCursorPos(&p))
{
ScreenToClient(hwndHistoryList, &p);
if (p.x >= 0 && p.y >= 0 && p.x < window_items[HISTORYLIST_IN_WINDOWITEMS].width && p.y < (taseditor_config.wndheight + window_items[HISTORYLIST_IN_WINDOWITEMS].height - window_items[HISTORYLIST_IN_WINDOWITEMS].y))
return true;
}
return false;
}
// ---------------------------------------------------------------------------------
LRESULT APIENTRY HistoryListWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
@ -838,10 +883,17 @@ LRESULT APIENTRY HistoryListWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM l
return 0;
case WM_MOUSEWHEEL:
{
// Right button/Ctrl/Shift/Alt + wheel -> send the message to Piano Roll
// but if just wheel - use default scrolling here
if (GET_KEYSTATE_WPARAM(wParam) & (MK_RBUTTON|MK_SHIFT|MK_CONTROL) || (GetKeyState(VK_MENU) < 0))
if (!history.CursorOverHistoryList())
return SendMessage(piano_roll.hwndList, msg, wParam, lParam);
break;
}
case WM_MOUSEWHEEL_RESENT:
{
// this is message from Piano Roll
// it means that cursor is currently over History List, and user scrolls the wheel (although focus may be on some other window)
// ensure that wParam's low-order word is 0 (so fwKeys = 0)
CallWindowProc(hwndHistoryList_oldWndProc, hWnd, WM_MOUSEWHEEL, wParam & ~(LOWORD(-1)), lParam);
return 0;
}
case WM_MOUSEACTIVATE:
if (GetFocus() != hWnd)

View File

@ -54,6 +54,9 @@ enum
};
#define HISTORY_NORMAL_COLOR 0x000000
#define HISTORYLIST_IN_WINDOWITEMS 18
#define WM_MOUSEWHEEL_RESENT WM_APP+123
#define HISTORY_ID_LEN 8
class HISTORY
@ -65,6 +68,8 @@ public:
void reset();
void update(); // called every frame
void HistorySizeChanged();
void save(EMUFILE *os, bool really_save = true);
bool load(EMUFILE *is);
@ -94,6 +99,8 @@ public:
void RedrawHistoryList();
void UpdateHistoryList();
bool CursorOverHistoryList();
HWND hwndHistoryList;
private:

View File

@ -1187,6 +1187,9 @@ LRESULT APIENTRY ListWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
bookmarks.RedrawChangedBookmarks(lastCursor);
}
return 0;
} else if (history.CursorOverHistoryList())
{
return SendMessage(history.hwndHistoryList, WM_MOUSEWHEEL_RESENT, wParam, lParam);
}
break;
}

View File

@ -12,12 +12,12 @@
#define HEADER_LIGHT_MAX 10
#define HEADER_LIGHT_HOLD 5
#define HEADER_LIGHT_MOUSEOVER 2
#define HEADER_LIGHT_MOUSEOVER 1
#define HEADER_LIGHT_MOUSEOVER_SEL 3
#define HEADER_LIGHT_UPDATE_TICK 40 // 25FPS
#define HEADER_DX_FIX 4
#define BOOST_WHEN_BOTH_RIGHTBUTTON_AND_ALT_PRESSED 2
#define BOOST_WHEN_BOTH_RIGHTBUTTON_AND_ALT_PRESSED 4
enum
{

View File

@ -148,6 +148,36 @@ void SELECTION::update()
}
void SELECTION::HistorySizeChanged()
{
int new_history_size = taseditor_config.undo_levels + 1;
std::vector<SelectionFrames> new_selections_history(new_history_size);
int pos = history_cursor_pos, source_pos = history_cursor_pos;
if (pos >= new_history_size)
pos = new_history_size - 1;
int new_history_cursor_pos = pos;
// copy old "undo" snapshots
while (pos >= 0)
{
new_selections_history[pos] = selections_history[(history_start_pos + source_pos) % history_size];
pos--;
source_pos--;
}
// copy old "redo" snapshots
int num_redo_snapshots = history_total_items - (history_cursor_pos + 1);
int space_available = new_history_size - (new_history_cursor_pos + 1);
int i = (num_redo_snapshots <= space_available) ? num_redo_snapshots : space_available;
int new_history_total_items = new_history_cursor_pos + i + 1;
for (; i > 0; i--)
new_selections_history[new_history_cursor_pos + i] = selections_history[(history_start_pos + history_cursor_pos + i) % history_size];
// finish
selections_history = new_selections_history;
history_size = new_history_size;
history_start_pos = 0;
history_cursor_pos = new_history_cursor_pos;
history_total_items = new_history_total_items;
}
void SELECTION::RedrawMarker()
{
// redraw marker num

View File

@ -15,6 +15,8 @@ public:
void reset_vars();
void update();
void HistorySizeChanged();
void RedrawMarker();
void save(EMUFILE *os, bool really_save = true);

View File

@ -68,19 +68,7 @@ char patterns_menu_prefix[] = "Pattern: ";
char taseditor_help_filename[] = "\\taseditor.chm";
// all items of the window (used for resising) and their default x,y,w,h
// actual x,y,w,h are calculated at the beginning from screen
static struct
{
int id;
int x;
int y;
int width;
int height;
char tooltip_text_base[TOOLTIP_TEXT_MAX_LEN];
char tooltip_text[TOOLTIP_TEXT_MAX_LEN];
bool static_rect;
int hotkey_emucmd;
HWND tooltip_hwnd;
} window_items[TASEDITOR_WINDOW_TOTAL_ITEMS] = {
Window_items_struct window_items[TASEDITOR_WINDOW_TOTAL_ITEMS] = {
IDC_PROGRESS_BUTTON, -1, 0, 0, 0, "Click here whenever you want to abort seeking", "", false, 0, 0,
IDC_BRANCHES_BUTTON, -1, 0, 0, 0, "Click here to switch between Bookmarks List and Branches Tree", "", false, 0, 0,
IDC_LIST1, 0, 0, -1, -1, "", "", false, 0, 0,
@ -999,10 +987,8 @@ BOOL CALLBACK WndprocTasEditor(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara
if (new_size != taseditor_config.undo_levels)
{
taseditor_config.undo_levels = new_size;
history.reset();
selection.reset();
// hot changes were cleared, so update Piano Roll
piano_roll.RedrawList();
history.HistorySizeChanged();
selection.HistorySizeChanged();
}
}
break;

View File

@ -8,6 +8,20 @@
#define PATTERNS_MAX_VISIBLE_NAME 50
#define PATTERNMENU_MAX_VISIBLE_NAME PATTERNS_MAX_VISIBLE_NAME + 6 // + "Pattern: "
struct Window_items_struct
{
int id;
int x;
int y;
int width;
int height;
char tooltip_text_base[TOOLTIP_TEXT_MAX_LEN];
char tooltip_text[TOOLTIP_TEXT_MAX_LEN];
bool static_rect;
int hotkey_emucmd;
HWND tooltip_hwnd;
};
enum ECONTEXTMENU
{
CONTEXTMENU_STRAY = 0,

View File

@ -348,6 +348,8 @@ void updateGameDependentMenus(unsigned int enable)
{
const int menu_ids[]= {
MENU_CLOSE_FILE,
ID_FILE_SCREENSHOT,
ID_FILE_SAVESCREENSHOTAS,
MENU_RESET,
MENU_POWER,
MENU_INSERT_COIN,