From c771ac2d6d53a0e4a0efd97afffab7e1d3217303 Mon Sep 17 00:00:00 2001 From: adelikat Date: Mon, 25 May 2009 15:42:24 +0000 Subject: [PATCH] Win32 - Recent Movie Menu added --- changelog.txt | 1 + src/drivers/win/config.cpp | 6 ++ src/drivers/win/res.rc | 1 + src/drivers/win/resource.h | 7 +- src/drivers/win/window.cpp | 151 +++++++++++++++++++++++++++++++++++-- src/drivers/win/window.h | 1 + src/movie.cpp | 6 ++ 7 files changed, 163 insertions(+), 10 deletions(-) diff --git a/changelog.txt b/changelog.txt index 9d5ffaff..deab04a8 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,4 @@ +23-may-2009 - adelikat - win32 - Recent Movie Menu added 22-may-2009 - adelikat - win32 - "Disable screen saver" gui option now also diables the monitor powersave 22-may-2009 - adelikat - win32 - Debugger - Step type functions now update other dialogs such as ppu, nametable, code/data, trace logger, etc. 22-may-2009 - adelikat - win32 - Hex Editor - Save Rom As... menu option enabled and implemented diff --git a/src/drivers/win/config.cpp b/src/drivers/win/config.cpp index 44ea8c52..6544ecf0 100644 --- a/src/drivers/win/config.cpp +++ b/src/drivers/win/config.cpp @@ -113,6 +113,12 @@ static CFGSTRUCT fceuconfig[] = { ACS(recent_lua[3]), ACS(recent_lua[4]), + ACS(recent_movie[0]), + ACS(recent_movie[1]), + ACS(recent_movie[2]), + ACS(recent_movie[3]), + ACS(recent_movie[4]), + AC(gNoBGFillColor), AC(ntsccol),AC(ntsctint),AC(ntschue), diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index 70aff68d..68053302 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -56,6 +56,7 @@ BEGIN END POPUP "&Movie" BEGIN + MENUITEM "Recent", MENU_MOVIE_RECENT MENUITEM "&Record Movie...", MENU_RECORD_MOVIE MENUITEM "&Play Movie...", MENU_REPLAY_MOVIE MENUITEM "&Stop Movie", MENU_STOP_MOVIE diff --git a/src/drivers/win/resource.h b/src/drivers/win/resource.h index 23868477..8528b19f 100644 --- a/src/drivers/win/resource.h +++ b/src/drivers/win/resource.h @@ -5,7 +5,6 @@ #define CLOSE_BUTTON 1 #define BUTTON_CLOSE 1 #define BTN_CLOSE 1 -#define BTN_CANCEL 800 #define MENU_OPEN_FILE 100 #define EDIT_ROMS 100 #define LBL_LOG_TEXT 100 @@ -202,7 +201,6 @@ #define IDC_DEBUGGER_ENABLE_SYMBOLIC 208 #define BTN_NETMOO_CONNECT 250 #define MENU_HIDE_MENU 300 -//#define CHECK_SCREENSHOT_NAMES 300 #define COMBO_FILTER 300 #define IDC_EDIT_AUTHORINFO 300 #define IDC_LABEL_LENGTH 300 @@ -286,6 +284,7 @@ #define IDC_VIDEOCONFIG_NO8LIM 600 #define IDC_DEBUGGER_ROM_PATCHER 602 #define LIST_DEBUGGER_BOOKMARKS 701 +#define BTN_CANCEL 800 #define IDC_EDIT_OFFSET 1000 #define IDC_GAME_GENIE_CODE 1000 #define IDC_MEMVIEWFIND_WHAT 1000 @@ -681,6 +680,8 @@ #define MENU_VIEWSAVESLOTS 40350 #define ID_LUA_RECENT 40351 #define MENU_LUA_RECENT 40352 +#define ID_Menu40353 40353 +#define MENU_MOVIE_RECENT 40354 #define IDC_DEBUGGER_ICONTRAY 55535 #define MW_ValueLabel2 65423 #define MW_ValueLabel1 65426 @@ -690,7 +691,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 125 -#define _APS_NEXT_COMMAND_VALUE 40353 +#define _APS_NEXT_COMMAND_VALUE 40355 #define _APS_NEXT_CONTROL_VALUE 1204 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/src/drivers/win/window.cpp b/src/drivers/win/window.cpp index ac74be83..e5ba6e4b 100644 --- a/src/drivers/win/window.cpp +++ b/src/drivers/win/window.cpp @@ -79,12 +79,13 @@ using namespace std; //******************************************************************************** //Handles---------------------------------------------- -static HMENU fceumenu = 0; //Main menu. -HWND pwindow; //Client Area -static HMENU recentmenu; //Recent Menu -static HMENU recentluamenu; //Recent Lua Files Menu -HMENU hfceuxcontext; //Handle to context menu -HMENU hfceuxcontextsub; //Handle to context sub menu +static HMENU fceumenu = 0; //Main menu. +HWND pwindow; //Client Area +static HMENU recentmenu; //Recent Menu +static HMENU recentluamenu; //Recent Lua Files Menu +static HMENU recentmoviemenu; //Recent Movie Files Menu +HMENU hfceuxcontext; //Handle to context menu +HMENU hfceuxcontextsub; //Handle to context sub menu //Extern variables------------------------------------- extern bool movieSubtitles; @@ -134,11 +135,16 @@ char *recent_files[] = { 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 }; const unsigned int MENU_FIRST_RECENT_FILE = 600; const unsigned int MAX_NUMBER_OF_RECENT_FILES = sizeof(recent_files)/sizeof(*recent_files); -//Lua Recent Menu --------------------------------------- +//Recent Lua Menu ---------------------------------------- char *recent_lua[] = {0,0,0,0,0}; const unsigned int LUA_FIRST_RECENT_FILE = 50000; const unsigned int MAX_NUMBER_OF_LUA_RECENT_FILES = sizeof(recent_lua)/sizeof(*recent_lua); +//Recent Movie Menu ------------------------------------- +char *recent_movie[] = {0,0,0,0,0}; +const unsigned int MOVIE_FIRST_RECENT_FILE = 51000; +const unsigned int MAX_NUMBER_OF_MOVIE_RECENT_FILES = sizeof(recent_movie)/sizeof(*recent_movie); + //Exported variables ------------------------------------ int EnableBackgroundInput = 0; @@ -745,6 +751,123 @@ void AddRecentLuaFile(const char *filename) UpdateRecentLuaArray(filename, recent_lua, MAX_NUMBER_OF_LUA_RECENT_FILES, recentluamenu, MENU_LUA_RECENT, LUA_FIRST_RECENT_FILE); } +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void UpdateMovieRMenu(HMENU menu, char **strs, unsigned int mitem, unsigned int baseid) +{ + MENUITEMINFO moo; + int x; + + moo.cbSize = sizeof(moo); + moo.fMask = MIIM_SUBMENU | MIIM_STATE; + + GetMenuItemInfo(GetSubMenu(fceumenu, 0), mitem, FALSE, &moo); + moo.hSubMenu = menu; + moo.fState = strs[0] ? MFS_ENABLED : MFS_GRAYED; + + SetMenuItemInfo(GetSubMenu(fceumenu, 0), mitem, FALSE, &moo); + + // Remove all recent files submenus + for(x = 0; x < MAX_NUMBER_OF_MOVIE_RECENT_FILES; x++) + { + RemoveMenu(menu, baseid + x, MF_BYCOMMAND); + } + + // Recreate the menus + for(x = MAX_NUMBER_OF_MOVIE_RECENT_FILES - 1; x >= 0; x--) + { + // Skip empty strings + if(!strs[x]) + continue; + + string tmp = strs[x]; + + //clamp this string to 128 chars + if(tmp.size()>128) + tmp = tmp.substr(0,128); + + moo.cbSize = sizeof(moo); + moo.fMask = MIIM_DATA | MIIM_ID | MIIM_TYPE; + + // Insert the menu item + moo.cch = tmp.size(); + moo.fType = 0; + moo.wID = baseid + x; + moo.dwTypeData = (LPSTR)tmp.c_str(); + InsertMenuItem(menu, 0, 1, &moo); + } + + DrawMenuBar(hAppWnd); +} + +void UpdateRecentMovieArray(const char* addString, char** bufferArray, unsigned int arrayLen, HMENU menu, unsigned int menuItem, unsigned int baseId) +{ + // Try to find out if the filename is already in the recent files list. + for(unsigned int x = 0; x < arrayLen; x++) + { + if(bufferArray[x]) + { + if(!strcmp(bufferArray[x], addString)) // Item is already in list. + { + // If the filename is in the file list don't add it again. + // Move it up in the list instead. + + int y; + char *tmp; + + // Save pointer. + tmp = bufferArray[x]; + + for(y = x; y; y--) + { + // Move items down. + bufferArray[y] = bufferArray[y - 1]; + } + + // Put item on top. + bufferArray[0] = tmp; + + // Update the recent files menu + UpdateMovieRMenu(menu, bufferArray, menuItem, baseId); + + return; + } + } + } + + // The filename wasn't found in the list. That means we need to add it. + + // If there's no space left in the recent files list, get rid of the last + // item in the list. + if(bufferArray[arrayLen - 1]) + { + free(bufferArray[arrayLen - 1]); + } + + // Move the other items down. + for(unsigned int x = arrayLen - 1; x; x--) + { + bufferArray[x] = bufferArray[x - 1]; + } + + // Add the new item. + bufferArray[0] = (char*)malloc(strlen(addString) + 1); //mbg merge 7/17/06 added cast + strcpy(bufferArray[0], addString); + + // Update the recent files menu + UpdateMovieRMenu(menu, bufferArray, menuItem, baseId); + +} + +void AddRecentMovieFile(const char *filename) +{ + UpdateRecentMovieArray(filename, recent_movie, MAX_NUMBER_OF_MOVIE_RECENT_FILES, recentmoviemenu, MENU_MOVIE_RECENT, MOVIE_FIRST_RECENT_FILE); +} + + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Hides the main menu. //@param hide_menu Flag to turn the main menu on (0) or off (1) void HideMenu(unsigned int hide_menu) @@ -1137,6 +1260,17 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) FCEU_LoadLuaCode(fname); } } + + // A menu item for the recent movie files menu was clicked. + if(wParam >= MOVIE_FIRST_RECENT_FILE && wParam <= MOVIE_FIRST_RECENT_FILE + MAX_NUMBER_OF_MOVIE_RECENT_FILES - 1) + { + char*& fname = recent_movie[wParam - MOVIE_FIRST_RECENT_FILE]; + if(fname) + { + FCEUI_LoadMovie(fname, 1, false, false); + } + } + switch(LOWORD(wParam)) { //File Menu------------------------------------------------------------- @@ -1681,6 +1815,7 @@ adelikat: Outsourced this to a remappable hotkey EnableMenuItem(fceumenu,MENU_OPEN_FILE,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_OPENGAME)?MF_ENABLED:MF_GRAYED)); EnableMenuItem(fceumenu,MENU_RECORD_MOVIE,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_RECORDMOVIE)?MF_ENABLED:MF_GRAYED)); EnableMenuItem(fceumenu,MENU_REPLAY_MOVIE,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_PLAYMOVIE)?MF_ENABLED:MF_GRAYED)); + EnableMenuItem(fceumenu,MENU_MOVIE_RECENT,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_PLAYMOVIE)?MF_ENABLED:MF_GRAYED)); EnableMenuItem(fceumenu,MENU_STOP_MOVIE,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_STOPMOVIE)?MF_ENABLED:MF_GRAYED)); EnableMenuItem(fceumenu,ID_FILE_PLAYMOVIEFROMBEGINNING,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_PLAYFROMBEGINNING)?MF_ENABLED:MF_GRAYED)); EnableMenuItem(fceumenu,MENU_SAVESTATE,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_QUICKSAVE)?MF_ENABLED:MF_GRAYED)); @@ -1836,10 +1971,12 @@ int CreateMainWindow() recentmenu = CreateMenu(); recentluamenu = CreateMenu(); + recentmoviemenu = CreateMenu(); // Update recent files menu UpdateRMenu(recentmenu, recent_files, MENU_RECENT_FILES, MENU_FIRST_RECENT_FILE); UpdateLuaRMenu(recentluamenu, recent_lua, MENU_LUA_RECENT, LUA_FIRST_RECENT_FILE); + UpdateMovieRMenu(recentmoviemenu, recent_movie, MENU_MOVIE_RECENT, MOVIE_FIRST_RECENT_FILE); updateGameDependentMenus(0); if (MainWindow_wndx==-32000) MainWindow_wndx=0; //Just in case diff --git a/src/drivers/win/window.h b/src/drivers/win/window.h index 76a1ffe2..b5264ddd 100644 --- a/src/drivers/win/window.h +++ b/src/drivers/win/window.h @@ -18,6 +18,7 @@ struct CreateMovieParameters extern char *recent_files[]; extern char *recent_lua[]; +extern char *recent_movie[]; extern HWND pwindow; void HideFWindow(int h); diff --git a/src/movie.cpp b/src/movie.cpp index c287ba93..73b03863 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -34,6 +34,7 @@ #ifdef WIN32 #include +extern void AddRecentMovieFile(const char *filename); #endif using namespace std; @@ -749,6 +750,11 @@ void FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _paus return; } +#ifdef WIN32 + //Add to the recent movie menu + AddRecentMovieFile(fname); +#endif + LoadFM2(currMovieData, fp->stream, INT_MAX, false); LoadSubtitles(currMovieData); delete fp;