HatariWii/src/gui-sdl/dlgMain.c
2018-05-25 20:45:09 +02:00

431 lines
11 KiB
C

/*
Hatari - dlgMain.c
This file is distributed under the GNU General Public License, version 2
or at your option any later version. Read the file gpl.txt for details.
The main dialog.
*/
const char DlgMain_fileid[] = "Hatari dlgMain.c : " __DATE__ " " __TIME__;
#include "main.h"
#include "configuration.h"
#include "dialog.h"
#include "sdlgui.h"
#include "screen.h"
#ifdef GEKKO
/* Wii Main menu */
#define MAINDLG_FLOPPYA 2
#define MAINDLG_FLOPPYB 3
#define MAINDLG_LOAD_SAVE 4
#define MAINDLG_SETTINGS 5
#define MAINDLG_RESET 6
#define MAINDLG_QUIT 7
#define MAINDLG_SPEED 8
#define MAINDLG_OK 9
#define MAINDLG_CANCEL 10
/* Wii Settings menu */
#define OPTIONSDLG_ABOUT 2
#define OPTIONSDLG_SYSTEM 3
#define OPTIONSDLG_ROM 4
#define OPTIONSDLG_MEMORY 5
#define OPTIONSDLG_FLOPPYS 6
#define OPTIONSDLG_HARDDISK 7
#define OPTIONSDLG_MONITOR 8
#define OPTIONSDLG_WINDOW 9
#define OPTIONSDLG_JOY 10
#define OPTIONSDLG_KEYBD 11
#define OPTIONSDLG_DEVICES 12
#define OPTIONSDLG_SOUND 13
#define OPTIONSDLG_LOADCFG 14
#define OPTIONSDLG_SAVECFG 15
#define OPTIONSDLG_EXIT 16
#define OPTIONSDLG_BACK 17
#else
#define MAINDLG_ABOUT 2
#define MAINDLG_SYSTEM 3
#define MAINDLG_ROM 4
#define MAINDLG_MEMORY 5
#define MAINDLG_FLOPPYS 6
#define MAINDLG_HARDDISK 7
#define MAINDLG_MONITOR 8
#define MAINDLG_WINDOW 9
#define MAINDLG_JOY 10
#define MAINDLG_KEYBD 11
#define MAINDLG_DEVICES 12
#define MAINDLG_SOUND 13
#define MAINDLG_LOADCFG 14
#define MAINDLG_SAVECFG 15
#define MAINDLG_NORESET 16
#define MAINDLG_RESET 17
#define MAINDLG_OK 18
#define MAINDLG_QUIT 19
#define MAINDLG_CANCEL 20
#endif
char dlgname[MAX_FLOPPYDRIVES][64];
void DlgDisk_BrowseDisk(char *dlgname, int drive, int diskid);
int floppyeject = -1;
static int speed = 1;
/* The main dialog: */
static SGOBJ maindlg[] =
{
#ifdef GEKKO
{ SGBOX, 0, 0, 0,0, 55,25, NULL },
{ SGTEXT, 0, 0, 17,1, 16,1, "Hatari main menu" },
{ SGFLOPPYA, SG_EXIT, 0, 4,3, 12,7, "" },
{ SGFLOPPYB, SG_EXIT, 0, 22,3, 12,7, "" },
{ SGLOAD_SAVE, SG_EXIT, 0, 40,3, 12,7, "" },
{ SGSETTINGS, SG_EXIT, 0, 4,12, 12,7, "" },
{ SGRESET, SG_EXIT, 0, 22,12, 12,7, "" },
{ SGQUIT, SG_EXIT, 0, 40,12, 12,7, "" },
{ SGBUTTON, 0, 0, 3,22, 15,1, "Speed: Normal" },
{ SGBUTTON, SG_DEFAULT, 0, 35,21, 8,3, "OK" },
{ SGBUTTON, SG_CANCEL, 0, 44,21, 8,3, "Cancel" },
{ -1, 0, 0, 0,0, 0,0, NULL }
#else
{ SGBOX, 0, 0, 0,0, 50,19, NULL },
{ SGTEXT, 0, 0, 17,2, 16,1, "Hatari main menu" },
{ SGBUTTON, 0, 0, 2, 4, 13,1, "A_bout" },
{ SGBUTTON, 0, 0, 2, 6, 13,1, "S_ystem" },
{ SGBUTTON, 0, 0, 2, 8, 13,1, "_ROM" },
{ SGBUTTON, 0, 0, 2,10, 13,1, "_Memory" },
{ SGBUTTON, 0, 0, 17, 4, 16,1, "_Floppy disks" },
{ SGBUTTON, 0, 0, 17, 6, 16,1, "Hard _disks" },
{ SGBUTTON, 0, 0, 17, 8, 16,1, "_Atari screen" },
{ SGBUTTON, 0, 0, 17,10, 16,1, "_Hatari screen" },
{ SGBUTTON, 0, 0, 35, 4, 13,1, "_Joysticks" },
{ SGBUTTON, 0, 0, 35, 6, 13,1, "_Keyboard" },
{ SGBUTTON, 0, 0, 35, 8, 13,1, "D_evices" },
{ SGBUTTON, 0, 0, 35,10, 13,1, "S_ound" },
{ SGBUTTON, 0, 0, 7,13, 16,1, "_Load config." },
{ SGBUTTON, 0, 0, 27,13, 16,1, "_Save config." },
{ SGRADIOBUT, 0, 0, 3,15, 10,1, "_No Reset" },
{ SGRADIOBUT, 0, 0, 3,17, 15,1, "Reset ma_chine" },
{ SGBUTTON, SG_DEFAULT, 0, 21,15, 8,3, "OK" },
{ SGBUTTON, 0, 0, 36,15, 10,1, "_Quit" },
{ SGBUTTON, SG_CANCEL, 0, 36,17, 10,1, "Cancel" },
{ -1, 0, 0, 0,0, 0,0, NULL }
#endif
};
#ifdef GEKKO
/* The main dialog: */
static SGOBJ settingsdlg[] =
{
{ SGBOX, 0, 0, 0,0, 50,23, NULL },
{ SGTEXT, 0, 0, 17,1, 16,1, "Hatari settings" },
{ SGBUTTON, 0, 0, 2, 4, 13,1, "A_bout" },
{ SGBUTTON, 0, 0, 2, 6, 13,1, "S_ystem" },
{ SGBUTTON, 0, 0, 2, 8, 13,1, "_ROM" },
{ SGBUTTON, 0, 0, 2,10, 13,1, "_Memory" },
{ SGBUTTON, 0, 0, 17, 4, 16,1, "_Floppy disks" },
{ SGBUTTON, 0, 0, 17, 6, 16,1, "Hard _disks" },
{ SGBUTTON, 0, 0, 17, 8, 16,1, "_Atari screen" },
{ SGBUTTON, 0, 0, 17,10, 16,1, "_Hatari screen" },
{ SGBUTTON, 0, 0, 35, 4, 13,1, "_Joysticks" },
{ SGBUTTON, 0, 0, 35, 6, 13,1, "_Keyboard" },
{ SGBUTTON, 0, 0, 35, 8, 13,1, "D_evices" },
{ SGBUTTON, 0, 0, 35,10, 13,1, "S_ound" },
{ SGBUTTON, 0, 0, 7,13, 16,1, "_Load config." },
{ SGBUTTON, 0, 0, 27,13, 16,1, "_Save config." },
{ SGBUTTON, SG_DEFAULT, 0, 15,18, 20,1, "Back to main menu" },
{ SGTEXT, SG_CANCEL, 0, 800,23, 2,1, "B" }, // hidden, back with B button
{ -1, 0, 0, 0,0, 0,0, NULL }
};
#endif
/**
* Show and process the floppy disk image dialog.
*/
void DlgSettings_Main(void)
{
int but;
char *psNewCfg;
SDLGui_CenterDlg(settingsdlg);
/* Clear the screen */
SDL_FillRect(sdlscrn, NULL, SDL_MapRGB(sdlscrn->format, 0, 0, 0));
/* Draw and process the dialog */
do
{
but = SDLGui_DoDialog(settingsdlg, NULL, false);
switch (but)
{
case OPTIONSDLG_SYSTEM:
Dialog_SystemDlg();
break;
case OPTIONSDLG_ROM:
DlgRom_Main();
break;
case OPTIONSDLG_MEMORY:
Dialog_MemDlg();
break;
case OPTIONSDLG_FLOPPYS:
DlgFloppy_Main();
break;
case OPTIONSDLG_HARDDISK:
DlgHardDisk_Main();
break;
case OPTIONSDLG_MONITOR:
Dialog_MonitorDlg();
break;
case OPTIONSDLG_WINDOW:
Dialog_WindowDlg();
break;
case OPTIONSDLG_JOY:
Dialog_JoyDlg();
break;
case OPTIONSDLG_KEYBD:
Dialog_KeyboardDlg();
break;
case OPTIONSDLG_DEVICES:
Dialog_DeviceDlg();
break;
case OPTIONSDLG_SOUND:
Dialog_SoundDlg();
break;
case OPTIONSDLG_ABOUT:
Dialog_AboutDlg();
break;
case OPTIONSDLG_LOADCFG:
psNewCfg = SDLGui_FileSelect("Load configuration:", sConfigFileName, NULL, false);
if (psNewCfg)
{
strcpy(sConfigFileName, psNewCfg);
Configuration_Load(NULL);
free(psNewCfg);
}
break;
case OPTIONSDLG_SAVECFG:
psNewCfg = SDLGui_FileSelect("Save configuration:", sConfigFileName, NULL, true);
if (psNewCfg)
{
strcpy(sConfigFileName, psNewCfg);
Configuration_Save();
free(psNewCfg);
}
break;
}
}
while (but != OPTIONSDLG_EXIT && but != SDLGUI_QUIT && but != OPTIONSDLG_BACK
&& but != SDLGUI_ERROR && !bQuitProgram);
}
/**
* This functions sets up the actual font and then displays the main dialog.
*/
int Dialog_MainDlg(bool *bReset, bool *bLoadedSnapshot)
{
int retbut;
bool bOldMouseVisibility;
int nOldMouseX, nOldMouseY;
#ifndef GEKKO
char *psNewCfg;
#endif
floppyeject = -1;
*bReset = false;
*bLoadedSnapshot = false;
#ifdef GEKKO
/* Copy screen for snapshots */
if (ConfigureParams.Screen.nMonitorType == MONITOR_TYPE_TV)
{
/* Disable TV mode before copying the screen. The snapshot wouldn't be visible otherwise. */
ConfigureParams.Screen.nMonitorType = MONITOR_TYPE_VGA;
Screen_ModeChanged(true);
Screen_Draw();
lastscreen = SDL_DisplayFormat(sdlscrn);
ConfigureParams.Screen.nMonitorType = MONITOR_TYPE_TV;
}
else
{
lastscreen = SDL_DisplayFormat(sdlscrn);
}
#endif
if (SDLGui_SetScreen(sdlscrn))
return false;
SDL_GetMouseState(&nOldMouseX, &nOldMouseY);
bOldMouseVisibility = SDL_ShowCursor(SDL_QUERY);
SDL_ShowCursor(SDL_ENABLE);
SDLGui_CenterDlg(maindlg);
#ifndef GEKKO
maindlg[MAINDLG_NORESET].state |= SG_SELECTED;
maindlg[MAINDLG_RESET].state &= ~SG_SELECTED;
#endif
#ifdef GEKKO
/* Disable 'Turbo mode' in mouse mode or else no double click. */
if (ConfigureParams.Joysticks.Joy[1].nJoystickMode == 0 && ConfigureParams.System.bFastForward)
{
ConfigureParams.System.bFastForward = false;
}
if (ConfigureParams.System.bFastForward)
maindlg[MAINDLG_SPEED].txt = "Speed: Turbo";
else
maindlg[MAINDLG_SPEED].txt = "Speed: Normal";
#endif
do
{
retbut = SDLGui_DoDialog(maindlg, NULL, false);
switch (retbut)
{
#ifdef GEKKO
case MAINDLG_FLOPPYA:
floppyeject = 0;
maindlg[MAINDLG_FLOPPYA].type = 15;
DlgDisk_BrowseDisk(dlgname[0], 0, 7);
Floppy_InsertDiskIntoDrive(0);
break;
case MAINDLG_FLOPPYB:
floppyeject = 1;
maindlg[MAINDLG_FLOPPYB].type = 16;
DlgDisk_BrowseDisk(dlgname[1], 1, 13);
Floppy_InsertDiskIntoDrive(1);
break;
case MAINDLG_LOAD_SAVE:
maindlg[MAINDLG_LOAD_SAVE].type = 17;
if (Dialog_SaveDlg())
{
SDL_ShowCursor(SDL_DISABLE);
/* Memory snapshot has been loaded - leave GUI immediately */
*bLoadedSnapshot = true;
return true;
}
break;
case MAINDLG_SETTINGS:
maindlg[MAINDLG_SETTINGS].type = 18;
DlgSettings_Main();
break;
case MAINDLG_RESET:
maindlg[MAINDLG_RESET].type = 19;
*bReset = true;
SDL_ShowCursor(SDL_DISABLE);
Reset_Cold();
return true;
case MAINDLG_QUIT:
maindlg[MAINDLG_QUIT].type = 20;
bQuitProgram = true;
break;
case MAINDLG_SPEED:
speed += 1;
if (speed > 2)
speed = 1;
if (speed == 1)
{
maindlg[MAINDLG_SPEED].txt = "Speed: Normal";
ConfigureParams.System.bFastForward = false;
}
else if (speed == 2)
{
maindlg[MAINDLG_SPEED].txt = "Speed: Turbo";
ConfigureParams.System.bFastForward = true;
}
break;
#else
case MAINDLG_ABOUT:
Dialog_AboutDlg();
break;
case MAINDLG_FLOPPYS:
DlgFloppy_Main();
break;
case MAINDLG_HARDDISK:
DlgHardDisk_Main();
break;
case MAINDLG_ROM:
DlgRom_Main();
break;
case MAINDLG_MONITOR:
Dialog_MonitorDlg();
break;
case MAINDLG_WINDOW:
Dialog_WindowDlg();
break;
case MAINDLG_SYSTEM:
Dialog_SystemDlg();
break;
case MAINDLG_MEMORY:
if (Dialog_MemDlg())
{
/* Memory snapshot has been loaded - leave GUI immediately */
*bLoadedSnapshot = true;
SDL_ShowCursor(bOldMouseVisibility);
Main_WarpMouse(nOldMouseX, nOldMouseY, true);
return true;
}
break;
case MAINDLG_JOY:
Dialog_JoyDlg();
break;
case MAINDLG_KEYBD:
Dialog_KeyboardDlg();
break;
case MAINDLG_DEVICES:
Dialog_DeviceDlg();
break;
case MAINDLG_SOUND:
Dialog_SoundDlg();
break;
case MAINDLG_LOADCFG:
psNewCfg = SDLGui_FileSelect("Load configuration:", sConfigFileName, NULL, false);
if (psNewCfg)
{
strcpy(sConfigFileName, psNewCfg);
Configuration_Load(NULL);
free(psNewCfg);
}
break;
case MAINDLG_SAVECFG:
psNewCfg = SDLGui_FileSelect("Save configuration:", sConfigFileName, NULL, true);
if (psNewCfg)
{
strcpy(sConfigFileName, psNewCfg);
Configuration_Save();
free(psNewCfg);
}
break;
case MAINDLG_QUIT:
bQuitProgram = true;
break;
#endif
}
}
while (retbut != MAINDLG_OK && retbut != MAINDLG_CANCEL && retbut != SDLGUI_QUIT
&& retbut != SDLGUI_ERROR && !bQuitProgram);
if (maindlg[MAINDLG_RESET].state & SG_SELECTED)
*bReset = true;
#ifdef GEKKO
/* Disable 'Turbo mode' in mouse mode or else no double click. */
if (ConfigureParams.Joysticks.Joy[1].nJoystickMode == 0 && ConfigureParams.System.bFastForward)
{
DlgAlert_Notice("Turbo is disabled in mouse mode! Double click is impossible if enabled.\n Enable Joy mode in the virtual keyboard to use Turbo.");
ConfigureParams.System.bFastForward = false;
}
SDL_FreeSurface(lastscreen);
#endif
SDL_ShowCursor(bOldMouseVisibility);
Main_WarpMouse(nOldMouseX, nOldMouseY, true);
return (retbut == MAINDLG_OK);
}