Files
ProSystem-Core/Win/Menu.cpp
T
clobber 6d1f51397e Initial port
Still needs sound. Note: won't run with optimizations so release build
is -O0
2013-07-30 02:31:40 -05:00

408 lines
15 KiB
C++
Executable File

// ----------------------------------------------------------------------------
// ___ ___ ___ ___ ___ ____ ___ _ _
// /__/ /__/ / / /__ /__/ /__ / /_ / |/ /
// / / \ /__/ ___/ ___/ ___/ / /__ / / emulator
//
// ----------------------------------------------------------------------------
// Copyright 2005 Greg Stanton
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// ----------------------------------------------------------------------------
// Menu.cpp
// ----------------------------------------------------------------------------
#include "Menu.h"
HACCEL menu_hAccel = NULL;
static HMENU menu_hMenu = NULL;
static HMENU menu_hFileMenu = NULL;
static HMENU menu_hOptionsMenu = NULL;
static HMENU menu_hRecentMenu = NULL;
static HMENU menu_hDisplayMenu = NULL;
static HMENU menu_hScreenshotMenu = NULL;
static HMENU menu_hModesMenu = NULL;
static HMENU menu_hSoundMenu = NULL;
static HMENU menu_hSampleRateMenu = NULL;
static HMENU menu_hLatencyMenu = NULL;
static HMENU menu_hEmulationMenu = NULL;
static HMENU menu_hFrameSkipMenu = NULL;
static HMENU menu_hRegionsMenu = NULL;
static HMENU menu_hInputMenu = NULL;
static HMENU menu_hHelpMenu = NULL;
static HWND menu_hWnd = NULL;
// ----------------------------------------------------------------------------
// RefreshDisplayMenu
// ----------------------------------------------------------------------------
static void menu_RefreshDisplayMenu( ) {
//Leonis
CheckMenuItem(menu_hScreenshotMenu, 0, MF_BYPOSITION | ((screenshot1)? MF_CHECKED: MF_UNCHECKED));
CheckMenuItem(menu_hScreenshotMenu, 1, MF_BYPOSITION | ((screenshot2)? MF_CHECKED: MF_UNCHECKED));
CheckMenuItem(menu_hDisplayMenu, 0, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hDisplayMenu, 2, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hDisplayMenu, 5, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hDisplayMenu, 6, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hDisplayMenu, 7, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hDisplayMenu, 8, MF_BYPOSITION | MF_UNCHECKED);
if(display_IsFullscreen( )) {
CheckMenuItem(menu_hDisplayMenu, 0, MF_BYPOSITION | MF_CHECKED);
}
if(display_stretched) {
CheckMenuItem(menu_hDisplayMenu, 2, MF_BYPOSITION | MF_CHECKED);
}
CheckMenuItem(menu_hDisplayMenu, display_zoom + 4, MF_BYPOSITION | MF_CHECKED);
if(cartridge_IsLoaded( )) {
EnableMenuItem(menu_hDisplayMenu, 10, MF_BYPOSITION | MF_ENABLED);
}
else {
EnableMenuItem(menu_hDisplayMenu, 10, MF_BYPOSITION | MF_GRAYED);
}
}
// ----------------------------------------------------------------------------
// RefreshModesMenu
// ----------------------------------------------------------------------------
static void menu_RefreshModesMenu( ) {
int count = GetMenuItemCount(menu_hModesMenu);
int index;
for(index = count - 1; index >= 0; index--) {
DeleteMenu(menu_hModesMenu, index, MF_BYPOSITION);
}
count = 0;
for(index = 0; index < display_modes.size( ); index++) {
Mode mode = display_modes[index];
if(mode.bpp == 8) {
std::string description = common_Format(mode.width) + " x " + common_Format(mode.height);
MENUITEMINFO item_info = {0};
item_info.cbSize = sizeof(MENUITEMINFO);
item_info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID;
item_info.dwItemData = (DWORD)&display_modes[index];
item_info.dwTypeData = (char*)description.c_str( );
item_info.wID = IDM_MODES_BASE + index;
InsertMenuItem(menu_hModesMenu, count, TRUE, &item_info);
if(display_mode.height == mode.height && display_mode.width == mode.width) {
CheckMenuItem(menu_hModesMenu, count, MF_BYPOSITION | MF_CHECKED);
}
count++;
}
}
}
// ----------------------------------------------------------------------------
// RefreshOptionsMenu
// ----------------------------------------------------------------------------
static void menu_RefreshOptionsMenu( ) {
if(cartridge_IsLoaded( )) {
EnableMenuItem(menu_hOptionsMenu, 0, MF_BYPOSITION | MF_ENABLED);
EnableMenuItem(menu_hOptionsMenu, 1, MF_BYPOSITION | MF_ENABLED);
CheckMenuItem(menu_hOptionsMenu, 1, MF_BYPOSITION | ((prosystem_paused)? MF_CHECKED: MF_UNCHECKED));
}
else {
EnableMenuItem(menu_hOptionsMenu, 0, MF_BYPOSITION | MF_GRAYED);
EnableMenuItem(menu_hOptionsMenu, 1, MF_BYPOSITION | MF_GRAYED);
CheckMenuItem(menu_hOptionsMenu, 1, MF_BYPOSITION | MF_UNCHECKED);
}
}
// ----------------------------------------------------------------------------
// RefreshRecentMenu
// ----------------------------------------------------------------------------
static void menu_RefreshRecentMenu( ) {
for(uint slot = 0; slot < 10; slot++) {
ModifyMenu(menu_hRecentMenu, slot, MF_BYPOSITION, IDM_RECENT_SLOT0 + slot, std::string("&" + common_Format(slot) + " " + console_recent[slot]).c_str( ));
}
}
// ----------------------------------------------------------------------------
// RefreshSoundMenu
// ----------------------------------------------------------------------------
static void menu_RefreshSoundMenu( ) {
CheckMenuItem(menu_hSoundMenu, 0, MF_BYPOSITION | ((sound_IsMuted( ))? MF_CHECKED: MF_UNCHECKED));
CheckMenuItem(menu_hSampleRateMenu, 0, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hSampleRateMenu, 1, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hSampleRateMenu, 2, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hSampleRateMenu, 3, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hSampleRateMenu, 4, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hSampleRateMenu, 5, MF_BYPOSITION | MF_UNCHECKED);
switch(sound_GetSampleRate( )) {
case 11025:
CheckMenuItem(menu_hSampleRateMenu, 0, MF_BYPOSITION | MF_CHECKED);
break;
case 22050:
CheckMenuItem(menu_hSampleRateMenu, 1, MF_BYPOSITION | MF_CHECKED);
break;
case 31440:
CheckMenuItem(menu_hSampleRateMenu, 2, MF_BYPOSITION | MF_CHECKED);
break;
case 44100:
CheckMenuItem(menu_hSampleRateMenu, 3, MF_BYPOSITION | MF_CHECKED);
break;
case 48000:
CheckMenuItem(menu_hSampleRateMenu, 4, MF_BYPOSITION | MF_CHECKED);
break;
case 96000:
CheckMenuItem(menu_hSampleRateMenu, 5, MF_BYPOSITION | MF_CHECKED);
break;
}
CheckMenuItem(menu_hLatencyMenu, 0, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hLatencyMenu, 1, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hLatencyMenu, 2, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hLatencyMenu, 3, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hLatencyMenu, 4, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hLatencyMenu, 5, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hLatencyMenu, sound_latency, MF_BYPOSITION | MF_CHECKED);
}
// ----------------------------------------------------------------------------
// RefreshRegionsMenu
// ----------------------------------------------------------------------------
void menu_RefreshRegionsMenu( ) {
CheckMenuItem(menu_hRegionsMenu, 0, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hRegionsMenu, 2, MF_BYPOSITION | MF_UNCHECKED);
CheckMenuItem(menu_hRegionsMenu, 3, MF_BYPOSITION | MF_UNCHECKED);
switch(region_type) {
case REGION_AUTO:
CheckMenuItem(menu_hRegionsMenu, 0, MF_BYPOSITION | MF_CHECKED);
break;
case REGION_NTSC:
CheckMenuItem(menu_hRegionsMenu, 2, MF_BYPOSITION | MF_CHECKED);
break;
case REGION_PAL:
CheckMenuItem(menu_hRegionsMenu, 3, MF_BYPOSITION | MF_CHECKED);
break;
}
}
// ----------------------------------------------------------------------------
// RefreshEmulationMenu
// ----------------------------------------------------------------------------
void menu_RefreshEmulationMenu( ) {
CheckMenuItem(menu_hEmulationMenu, 2, MF_BYPOSITION | ((bios_enabled)? MF_CHECKED: MF_UNCHECKED));
if(!cartridge_IsLoaded( )) {
EnableMenuItem(menu_hEmulationMenu, 0, MF_BYPOSITION | MF_ENABLED);
EnableMenuItem(menu_hEmulationMenu, 2, MF_BYPOSITION | MF_ENABLED);
}
else {
EnableMenuItem(menu_hEmulationMenu, 0, MF_BYPOSITION | MF_GRAYED);
EnableMenuItem(menu_hEmulationMenu, 2, MF_BYPOSITION | MF_GRAYED);
}
CheckMenuItem(menu_hEmulationMenu, 3, MF_BYPOSITION | ((database_enabled)? MF_CHECKED: MF_UNCHECKED));
for(int index = 0; index < 15; index++) {
CheckMenuItem(menu_hFrameSkipMenu, index, MF_BYPOSITION | MF_UNCHECKED);
}
switch(console_frameSkip) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
CheckMenuItem(menu_hFrameSkipMenu, console_frameSkip, MF_BYPOSITION | MF_CHECKED);
break;
case 15:
CheckMenuItem(menu_hFrameSkipMenu, 11, MF_BYPOSITION | MF_CHECKED);
break;
case 20:
CheckMenuItem(menu_hFrameSkipMenu, 12, MF_BYPOSITION | MF_CHECKED);
break;
case 25:
CheckMenuItem(menu_hFrameSkipMenu, 13, MF_BYPOSITION | MF_CHECKED);
break;
case 30:
CheckMenuItem(menu_hFrameSkipMenu, 14, MF_BYPOSITION | MF_CHECKED);
break;
}
}
// ----------------------------------------------------------------------------
// RefreshFileMenu
// ----------------------------------------------------------------------------
void menu_RefreshFileMenu( ) {
if(cartridge_IsLoaded( )) {
EnableMenuItem(menu_hFileMenu, 1, MF_BYPOSITION | MF_ENABLED);
EnableMenuItem(menu_hFileMenu, 4, MF_BYPOSITION | MF_ENABLED);
EnableMenuItem(menu_hFileMenu, 5, MF_BYPOSITION | MF_ENABLED);
}
else {
EnableMenuItem(menu_hFileMenu, 1, MF_BYPOSITION | MF_GRAYED);
EnableMenuItem(menu_hFileMenu, 4, MF_BYPOSITION | MF_GRAYED);
EnableMenuItem(menu_hFileMenu, 5, MF_BYPOSITION | MF_GRAYED);
}
}
// ----------------------------------------------------------------------------
// Initialize
// ----------------------------------------------------------------------------
bool menu_Initialize(HWND hWnd, HINSTANCE hInstance) {
if(hWnd == NULL) {
logger_LogError(IDS_INPUT1,"");
}
if(hInstance == NULL) {
logger_LogError(IDS_INPUT2,"");
return false;
}
menu_hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU_MAIN));
if(menu_hMenu == NULL) {
logger_LogError(IDS_MENU2,"");
logger_LogError("",common_GetErrorMessage( ));
return false;
}
if(!SetMenu(hWnd, menu_hMenu)) {
logger_LogError(IDS_MENU3,"");
logger_LogError("",common_GetErrorMessage( ));
return false;
}
menu_hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR));
if(menu_hAccel == NULL) {
logger_LogError(IDS_MENU4,"");
logger_LogError("",common_GetErrorMessage( ));
return false;
}
menu_hFileMenu = GetSubMenu(menu_hMenu, 0);
if(menu_hFileMenu == NULL) {
logger_LogError(IDS_MENU5,"");
return false;
}
menu_hRecentMenu = GetSubMenu(menu_hFileMenu, 2);
if(menu_hRecentMenu == NULL) {
logger_LogError(IDS_MENU6,"");
return false;
}
menu_hOptionsMenu = GetSubMenu(menu_hMenu, 1);
if(menu_hOptionsMenu == NULL) {
logger_LogError(IDS_MENU7,"");
return false;
}
menu_hDisplayMenu = GetSubMenu(menu_hOptionsMenu, 3);
if(menu_hDisplayMenu == NULL) {
logger_LogError(IDS_MENU8,"");
return false;
}
menu_hScreenshotMenu = GetSubMenu(menu_hDisplayMenu, 10);
if(menu_hScreenshotMenu == NULL) {
logger_LogError(IDS_MENU8,"");
return false;
}
menu_hModesMenu = GetSubMenu(menu_hDisplayMenu, 1);
if(menu_hModesMenu == NULL) {
logger_LogError(IDS_MENU9,"");
return false;
}
menu_hSoundMenu = GetSubMenu(menu_hOptionsMenu, 4);
if(menu_hSoundMenu == NULL) {
logger_LogError(IDS_MENU10,"");
return false;
}
menu_hSampleRateMenu = GetSubMenu(menu_hSoundMenu, 2);
if(menu_hSampleRateMenu == NULL) {
logger_LogError(IDS_MENU11,"");
return false;
}
menu_hLatencyMenu = GetSubMenu(menu_hSoundMenu, 3);
if(menu_hLatencyMenu == NULL) {
logger_LogError(IDS_MENU11,"");
return false;
}
menu_hEmulationMenu = GetSubMenu(menu_hOptionsMenu, 5);
if(menu_hEmulationMenu == NULL) {
logger_LogError(IDS_MENU12,"");
return false;
}
menu_hRegionsMenu = GetSubMenu(menu_hEmulationMenu, 0);
if(menu_hRegionsMenu == NULL) {
logger_LogError(IDS_MENU13,"");
return false;
}
menu_hFrameSkipMenu = GetSubMenu(menu_hEmulationMenu, 1);
if(menu_hFrameSkipMenu == NULL) {
logger_LogError(IDS_MENU14,"");
return false;
}
menu_hInputMenu = GetSubMenu(menu_hOptionsMenu, 6);
if(menu_hInputMenu == NULL) {
logger_LogError(IDS_MENU15,"");
return false;
}
menu_hHelpMenu = GetSubMenu(menu_hMenu, 2);
if(menu_hHelpMenu == NULL) {
logger_LogError(IDS_MENU16,"");
return false;
}
menu_hWnd = hWnd;
return true;
}
// ----------------------------------------------------------------------------
// Refresh
// ----------------------------------------------------------------------------
void menu_Refresh( ) {
menu_RefreshFileMenu( );
menu_RefreshDisplayMenu( );
menu_RefreshModesMenu( );
menu_RefreshRecentMenu( );
menu_RefreshOptionsMenu( );
menu_RefreshSoundMenu( );
menu_RefreshRegionsMenu( );
menu_RefreshEmulationMenu( );
}
// ----------------------------------------------------------------------------
// SetEnabled
// ----------------------------------------------------------------------------
void menu_SetEnabled(bool enabled) {
if(enabled) {
SetMenu(menu_hWnd, menu_hMenu);
}
else {
SetMenu(menu_hWnd, NULL);
}
}
// ----------------------------------------------------------------------------
// IsEnabled
// ----------------------------------------------------------------------------
bool menu_IsEnabled( ) {
return (GetMenu(menu_hWnd) == NULL)? false: true;
}