320 lines
14 KiB
C++
320 lines
14 KiB
C++
#include <guisan.hpp>
|
|
#include "guisan/sdl/sdltruetypefont.hpp"
|
|
#include "SelectorEntry.hpp"
|
|
#include "UaeRadioButton.hpp"
|
|
#include "UaeDropDown.hpp"
|
|
|
|
#include "sysconfig.h"
|
|
#include "sysdeps.h"
|
|
|
|
#include "gui_handling.h"
|
|
|
|
typedef struct
|
|
{
|
|
string activeWidget;
|
|
string leftWidget;
|
|
string rightWidget;
|
|
string upWidget;
|
|
string downWidget;
|
|
} NavigationMap;
|
|
|
|
|
|
static NavigationMap navMap[] =
|
|
{
|
|
// active move left move right move up move down
|
|
// main_window
|
|
{"Paths", "SystemROMs", "SystemROMs", "Reset", "Configurations"},
|
|
{"Configurations", "ConfigList", "ConfigList", "Paths", "CPU and FPU"},
|
|
{"CPU and FPU", "7 Mhz", "68000", "Configurations", "Chipset"},
|
|
{"Chipset", "Fast copper", "OCS", "CPU and FPU", "ROM"},
|
|
{"ROM", "MainROM", "cboMainROM", "Chipset", "RAM"},
|
|
{"RAM", "Chipmem", "Chipmem", "ROM", "Floppy drives"},
|
|
{"Floppy drives", "cmdSel0", "DF0:", "RAM", "Hard drives / CD"},
|
|
{"Hard drives / CD", "cmdCreateHDF", "cmdAddDir", "Floppy drives", "Display"},
|
|
{"Display", "sldWidth", "sldWidth", "Hard drives / CD", "Sound"},
|
|
{"Sound", "sndDisable", "sndDisable", "Display", "Input"},
|
|
{"Input", "cboPort0", "cboPort0", "Sound", "Miscellaneous"},
|
|
{"Miscellaneous", "StatusLine", "StatusLine", "Input", "Savestates"},
|
|
{"Savestates", "State0", "State0", "Miscellaneous", "Reset"},
|
|
{"Reset", "Start", "Quit", "Savestates", "Paths"},
|
|
{"Quit", "Reset", "Start", "Savestates", "Paths"},
|
|
{"Start", "Quit", "Reset", "Savestates", "Paths"},
|
|
|
|
// PanelPaths
|
|
{"SystemROMs", "Paths", "Paths", "RescanROMs", "ConfigPath"},
|
|
{"ConfigPath", "Paths", "Paths", "SystemROMs", "RescanROMs"},
|
|
{"RescanROMs", "Paths", "Paths", "ConfigPath", "SystemROMs"},
|
|
|
|
// PanelConfig
|
|
{"ConfigList", "Configurations", "ConfigName", "", ""},
|
|
{"ConfigName", "Configurations", "Configurations", "ConfigList", "ConfigDesc"},
|
|
{"ConfigDesc", "Configurations", "Configurations", "ConfigName", "ConfigLoad"},
|
|
{"ConfigLoad", "Configurations", "ConfigSave", "ConfigDesc", "ConfigList"},
|
|
{"ConfigSave", "ConfigLoad", "CfgDelete", "ConfigDesc", "ConfigList"},
|
|
{"CfgDelete", "ConfigSave", "Configurations", "ConfigDesc", "ConfigList"},
|
|
|
|
// active move left move right move up move down
|
|
// PanelCPU
|
|
{"68000", "CPU and FPU", "FPUnone", "JIT", "68010"},
|
|
{"68010", "CPU and FPU", "68881", "68000", "68020"},
|
|
{"68020", "CPU and FPU", "68882", "68010", "68030"},
|
|
{"68030", "CPU and FPU", "CPU internal", "68020", "68040"},
|
|
{"68040", "CPU and FPU", "CPU internal", "68030", "CPU24Bit"},
|
|
{"CPU24Bit", "CPU and FPU", "CPU internal", "68040", "CPUComp"},
|
|
{"CPUComp", "CPU and FPU", "CPU internal", "CPU24Bit", "JIT"},
|
|
{"JIT", "CPU and FPU", "CPU internal", "CPUComp", "68000"},
|
|
{"FPUnone", "68000", "7 Mhz", "CPU internal", "68881"},
|
|
{"68881", "68010", "14 Mhz", "FPUnone", "68882"},
|
|
{"68882", "68020", "25 Mhz", "68881", "CPU internal"},
|
|
{"CPU internal", "68030", "Fastest", "68882", "FPUnone"},
|
|
{"7 Mhz", "FPUnone", "CPU and FPU", "Fastest", "14 Mhz"},
|
|
{"14 Mhz", "68881", "CPU and FPU", "7 Mhz", "25 Mhz"},
|
|
{"25 Mhz", "68882", "CPU and FPU", "14 Mhz", "Fastest"},
|
|
{"Fastest", "CPU internal", "CPU and FPU", "25 Mhz", "7 Mhz"},
|
|
|
|
// PanelChipset
|
|
{"OCS", "Chipset", "BlitNormal", "CollFull", "ECS Agnus"},
|
|
{"ECS Agnus", "Chipset", "Immediate", "OCS", "Full ECS"},
|
|
{"Full ECS", "Chipset", "BlitWait", "ECS Agnus", "AGA"},
|
|
{"AGA", "Chipset", "Chipset", "Full ECS", "NTSC"},
|
|
{"NTSC", "Chipset", "Chipset", "AGA", "CollNone"},
|
|
{"BlitNormal", "OCS", "Fast copper", "CollFull", "Immediate"},
|
|
{"Immediate", "ECS Agnus", "Fast copper", "BlitNormal", "BlitWait"},
|
|
{"BlitWait", "Full ECS", "Fast copper", "Immediate", "CollNone"},
|
|
{"Fast copper", "BlitNormal", "Chipset", "CollFull", "CollNone"},
|
|
{"CollNone", "Chipset", "Chipset", "NTSC", "Sprites only"},
|
|
{"Sprites only", "Chipset", "Chipset", "CollNone", "CollPlay"},
|
|
{"CollPlay", "Chipset", "Chipset", "Sprites only", "CollFull"},
|
|
{"CollFull", "Chipset", "Chipset", "CollPlay", "OCS"},
|
|
|
|
// active move left move right move up move down
|
|
// PanelROM
|
|
{"cboMainROM", "ROM", "MainROM", "cboExtROM", "cboExtROM"},
|
|
{"MainROM", "cboMainROM", "ROM", "ExtROM", "ExtROM"},
|
|
{"cboExtROM", "ROM", "ExtROM", "cboMainROM", "cboMainROM"},
|
|
{"ExtROM", "cboExtROM", "ROM", "MainROM", "MainROM"},
|
|
|
|
//PanelRAM
|
|
{"Chipmem", "", "", "RAM", "Slowmem"},
|
|
{"Slowmem", "", "", "Chipmem", "Fastmem"},
|
|
{"Fastmem", "", "", "Slowmem", "Z3mem"},
|
|
{"Z3mem", "", "", "Fastmem", "Gfxmem"},
|
|
{"Gfxmem", "", "", "Z3mem", "RAM"},
|
|
|
|
//PanelFloppy
|
|
{"DF0:", "Floppy drives", "cboType0", "SaveForDisk", "cboDisk0"},
|
|
{"cboType0", "DF0:", "cmdEject0", "SaveForDisk", "cboDisk0"},
|
|
{"cmdEject0", "cboType0", "cmdSel0", "CreateHD", "cboDisk0"},
|
|
{"cmdSel0", "cmdEject0", "Floppy drives", "CreateHD", "cboDisk0"},
|
|
{"cboDisk0", "Floppy drives", "Floppy drives", "DF0:", "LoadDiskCfg"},
|
|
{"LoadDiskCfg", "Floppy drives", "Floppy drives", "cboDisk0", "DF1:"},
|
|
{"DF1:", "Floppy drives", "cboType1", "LoadDiskCfg", "cboDisk1"},
|
|
{"cboType1", "DF1:", "cmdEject1", "LoadDiskCfg", "cboDisk1"},
|
|
{"cmdEject1", "cboType1", "cmdSel1", "LoadDiskCfg", "cboDisk1"},
|
|
{"cmdSel1", "cmdEject1", "Floppy drives", "LoadDiskCfg", "cboDisk1"},
|
|
{"cboDisk1", "Floppy drives", "Floppy drives", "DF1:", "DF2:"},
|
|
{"DF2:", "Floppy drives", "cboType2", "cboDisk1", "cboDisk2"},
|
|
{"cboType2", "DF2:", "cmdEject2", "cboDisk1", "cboDisk2"},
|
|
{"cmdEject2", "cboType2", "cmdSel2", "cboDisk1", "cboDisk2"},
|
|
{"cmdSel2", "cmdEject2", "Floppy drives", "cboDisk1", "cboDisk2"},
|
|
{"cboDisk2", "Floppy drives", "Floppy drives", "DF2:", "DF3:"},
|
|
{"DF3:", "Floppy drives", "cboType3", "cboDisk2", "cboDisk3"},
|
|
{"cboType3", "DF3:", "cmdEject3", "cboDisk2", "cboDisk3"},
|
|
{"cmdEject3", "cboType3", "cmdSel3", "cboDisk2", "cboDisk3"},
|
|
{"cmdSel3", "cmdEject3", "Floppy drives", "cboDisk2", "cboDisk3"},
|
|
{"cboDisk3", "Floppy drives", "Floppy drives", "DF3:", "DriveSpeed"},
|
|
{"DriveSpeed", "", "", "cboDisk3", "CreateDD"},
|
|
{"SaveForDisk", "Floppy drives", "CreateDD", "DriveSpeed", "DF0:"},
|
|
{"CreateDD", "SaveForDisk", "CreateHD", "DriveSpeed", "cboType0"},
|
|
{"CreateHD", "CreateDD", "Floppy drives", "DriveSpeed", "cmdEject0"},
|
|
|
|
// active move left move right move up move down
|
|
// PanelHD
|
|
{"cmdProp0", "Hard drives / CD", "cmdDel0", "CDVol", "cmdProp1"},
|
|
{"cmdDel0", "cmdProp0", "Hard drives / CD", "CDVol", "cmdDel1"},
|
|
{"cmdProp1", "Hard drives / CD", "cmdDel1", "cmdProp0", "cmdProp2"},
|
|
{"cmdDel1", "cmdProp1", "Hard drives / CD", "cmdDel0", "cmdDel2"},
|
|
{"cmdProp2", "Hard drives / CD", "cmdDel2", "cmdProp1", "cmdProp3"},
|
|
{"cmdDel2", "cmdProp2", "Hard drives / CD", "cmdDel1", "cmdDel3"},
|
|
{"cmdProp3", "Hard drives / CD", "cmdDel3", "cmdProp2", "cmdProp4"},
|
|
{"cmdDel3", "cmdProp3", "Hard drives / CD", "cmdDel2", "cmdDel4"},
|
|
{"cmdProp4", "Hard drives / CD", "cmdDel4", "cmdProp3", "cmdAddDir"},
|
|
{"cmdDel4", "cmdProp4", "Hard drives / CD", "cmdDel3", "cmdAddHDF"},
|
|
{"cmdAddDir", "Hard drives / CD", "cmdAddHDF", "cmdProp4", "CD drive"},
|
|
{"cmdAddHDF", "cmdAddDir", "cmdCreateHDF", "cmdDel4", "CD drive"},
|
|
{"cmdCreateHDF", "cmdAddHDF", "Hard drives / CD", "cmdDel4", "CD drive"},
|
|
{"CD drive", "Hard drives / CD", "cdEject", "cmdAddDir", "cboCD"},
|
|
{"cdEject", "CD drive", "CDSelect", "cmdCreateHDF", "cboCD"},
|
|
{"CDSelect", "cdEject", "Hard drives / CD", "cmdCreateHDF", "cboCD"},
|
|
{"cboCD", "Hard drives / CD", "Hard drives / CD", "CD drive", "CDVol"},
|
|
{"CDVol", "", "", "cboCD", "cmdProp0"},
|
|
|
|
// PanelDisplay
|
|
{"sldWidth", "", "", "Frameskip", "sldHeight"},
|
|
{"sldHeight", "", "", "sldWidth", "sldVertPos"},
|
|
{"sldVertPos", "", "", "sldHeight", "FSRatio"},
|
|
{"Frameskip", "Display", "Display", "4by3Ratio", "sldWidth"},
|
|
|
|
//PanelSound
|
|
{"sndDisable", "Sound", "Mono", "sldStereoDelay", "sndDisEmu"},
|
|
{"sndDisEmu", "Sound", "Stereo", "sndDisable", "sndEmulate"},
|
|
{"sndEmulate", "Sound", "Stereo", "sndDisEmu", "sndEmuBest"},
|
|
{"sndEmuBest", "Sound", "Stereo", "sndEmulate", "cboFrequency"},
|
|
{"Mono", "sndDisable", "Sound", "sldStereoDelay", "Stereo"},
|
|
{"Stereo", "sndDisEmu", "Sound", "Mono", "cboFrequency"},
|
|
{"cboFrequency", "Sound", "Sound", "sndEmuBest", "cboInterpol"},
|
|
{"cboInterpol", "Sound", "Sound", "cboFrequency", "cboFilter"},
|
|
{"cboFilter", "Sound", "Sound", "cboInterpol", "sldSeparation"},
|
|
{"sldSeparation", "", "", "cboFilter", "sldStereoDelay"},
|
|
{"sldStereoDelay", "", "", "sldSeparation", "sndDisable"},
|
|
|
|
// active move left move right move up move down
|
|
// PanelInput
|
|
{"cboPort0", "Input", "Input", "cboLeft", "cboPort1"},
|
|
{"cboPort1", "Input", "cboAutofire", "cboPort0", "MouseSpeed"},
|
|
{"cboAutofire", "cboPort1", "Input", "cboPort0", "cboTapDelay"},
|
|
{"MouseSpeed", "", "", "cboPort1", "MouseHack"},
|
|
{"MouseHack", "Input", "cboTapDelay", "MouseSpeed", "CustomCtrl"},
|
|
{"cboTapDelay", "MouseHack", "Input", "cboAutofire", "cboB"},
|
|
{"CustomCtrl", "Input", "Input", "MouseHack", "cboA"},
|
|
{"cboA", "Input", "cboB", "CustomCtrl", "cboX"},
|
|
{"cboB", "cboA", "Input", "cboTapDelay", "cboY"},
|
|
{"cboX", "Input", "cboY", "cboA", "cboL"},
|
|
{"cboY", "cboX", "Input", "cboB", "cboR"},
|
|
{"cboL", "Input", "cboR", "cboX", "cboUp"},
|
|
{"cboR", "cboL", "Input", "cboY", "cboDown"},
|
|
{"cboUp", "Input", "cboDown", "cboL", "cboLeft"},
|
|
{"cboDown", "cboUp", "Input", "cboR", "cboRight"},
|
|
{"cboLeft", "Input", "cboRight", "cboUp", "cboPort0"},
|
|
{"cboRight", "cboLeft", "Input", "cboDown", "cboPort0"},
|
|
|
|
// PanelMisc
|
|
{"StatusLine", "Miscellaneous", "Miscellaneous", "BSDSocket", "HideIdle"},
|
|
{"HideIdle", "Miscellaneous", "Miscellaneous", "StatusLine", "ShowGUI"},
|
|
{"ShowGUI", "Miscellaneous", "Miscellaneous", "HideIdle", "BSDSocket"},
|
|
{"BSDSocket", "Miscellaneous", "Miscellaneous", "ShowGUI", "numlock"},
|
|
{"numlock", "Miscellaneous", "scrolllock", "", ""},
|
|
{"scrolllock", "numlock", "", "", ""},
|
|
|
|
// PanelSavestate
|
|
{"State0", "Savestates", "Savestates", "LoadState", "State1"},
|
|
{"State1", "Savestates", "Savestates", "State0", "State2"},
|
|
{"State2", "Savestates", "Savestates", "State1", "State3"},
|
|
{"State3", "Savestates", "Savestates", "State2", "LoadState"},
|
|
{"LoadState", "Savestates", "SaveState", "State3", "State0"},
|
|
{"SaveState", "LoadState", "Savestates", "State3", "State0"},
|
|
|
|
|
|
// active move left move right move up move down
|
|
// EditFilesysVirtual
|
|
{"virtDev", "virtRW", "virtRW", "virtOK", "virtVol"},
|
|
{"virtVol", "virtBootpri", "virtAutoboot", "virtDev", "virtPath"},
|
|
{"virtPath", "", "", "virtBootpri", "virtCancel"},
|
|
{"virtRW", "virtDev", "virtDev", "virtOK", "virtAutoboot"},
|
|
{"virtAutoboot", "virtVol", "virtBootpri", "virtRW", "virtPath"},
|
|
{"virtBootpri", "virtAutoboot", "virtVol", "virtRW", "virtPath"},
|
|
{"virtOK", "virtCancel", "virtCancel", "virtPath", "virtRW"},
|
|
{"virtCancel", "virtOK", "virtOK", "virtPath", "virtRW"},
|
|
|
|
// EditFilesysHardfile
|
|
{"hdfDev", "hdfBootPri", "hdfRW", "hdfOK", "hdfPath"},
|
|
{"hdfRW", "hdfDev", "hdfAutoboot", "hdfOK", "hdfPath"},
|
|
{"hdfAutoboot", "hdfRW", "hdfBootPri", "hdfOK", "hdfPath"},
|
|
{"hdfBootPri", "hdfAutoboot", "hdfDev", "hdfCancel", "hdfPath"},
|
|
{"hdfSurface", "hdfReserved", "hdfReserved", "hdfPath", "hdfSectors"},
|
|
{"hdfReserved", "hdfSurface", "hdfSurface", "hdfPath", "hdfBlocksize"},
|
|
{"hdfSectors", "hdfBlocksize", "hdfBlocksize", "hdfSurface", "hdfOK"},
|
|
{"hdfBlocksize", "hdfSectors", "hdfSectors", "hdfReserved", "hdfOK"},
|
|
{"hdfPath", "", "", "hdfBootPri", "hdfReserved"},
|
|
{"hdfOK", "hdfCancel", "hdfCancel", "hdfBlocksize", "hdfBootPri"},
|
|
{"hdfCancel", "hdfOK", "hdfOK", "hdfBlocksize", "hdfBootPri"},
|
|
|
|
// CreateFilesysHardfile
|
|
{"createHdfDev", "createHdfBootPri", "createHdfAutoboot", "createHdfOK", "createHdfPath"},
|
|
{"createHdfAutoboot", "createHdfDev", "createHdfBootPri", "createHdfOK", "createHdfPath"},
|
|
{"createHdfBootPri", "createHdfAutoboot", "createHdfDev", "createHdfOK", "createHdfPath"},
|
|
{"createHdfSize", "", "", "createHdfPath", "createHdfOK"},
|
|
{"createHdfPath", "", "", "createHdfBootPri", "createHdfSize"},
|
|
{"createHdfOK", "createHdfCancel", "createHdfCancel", "createHdfSize", "createHdfBootPri"},
|
|
{"createHdfCancel", "createHdfOK", "createHdfOK", "createHdfSize", "createHdfBootPri"},
|
|
|
|
{"END", "", "", "", ""}
|
|
};
|
|
|
|
|
|
bool HandleNavigation(int direction)
|
|
{
|
|
gcn::FocusHandler* focusHdl = gui_top->_getFocusHandler();
|
|
gcn::Widget* focusTarget = nullptr;
|
|
|
|
if (focusHdl != nullptr)
|
|
{
|
|
gcn::Widget* activeWidget = focusHdl->getFocused();
|
|
|
|
if (activeWidget != nullptr && activeWidget->getId().length() > 0)
|
|
{
|
|
string activeName = activeWidget->getId();
|
|
bool bFoundEnabled = false;
|
|
|
|
while (!bFoundEnabled)
|
|
{
|
|
string searchFor = "";
|
|
|
|
for (int i = 0; navMap[i].activeWidget != "END"; ++i)
|
|
{
|
|
if (navMap[i].activeWidget == activeName)
|
|
{
|
|
switch (direction)
|
|
{
|
|
case DIRECTION_LEFT:
|
|
searchFor = navMap[i].leftWidget;
|
|
break;
|
|
case DIRECTION_RIGHT:
|
|
searchFor = navMap[i].rightWidget;
|
|
break;
|
|
case DIRECTION_UP:
|
|
searchFor = navMap[i].upWidget;
|
|
break;
|
|
case DIRECTION_DOWN:
|
|
searchFor = navMap[i].downWidget;
|
|
break;
|
|
}
|
|
if (searchFor.length() > 0)
|
|
{
|
|
focusTarget = gui_top->findWidgetById(searchFor);
|
|
if (focusTarget != nullptr)
|
|
{
|
|
if (focusTarget->isEnabled())
|
|
bFoundEnabled = true;
|
|
else
|
|
activeName = searchFor;
|
|
}
|
|
else
|
|
{
|
|
bFoundEnabled = true;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (searchFor == "")
|
|
bFoundEnabled = true; // No entry to navigate to -> exit loop
|
|
}
|
|
|
|
if (focusTarget != nullptr)
|
|
{
|
|
if (!activeWidget->getId().substr(0, 3).compare("cbo"))
|
|
{
|
|
gcn::UaeDropDown* dropdown = static_cast<gcn::UaeDropDown *>(activeWidget);
|
|
if (dropdown->isDroppedDown() && (direction == DIRECTION_UP || direction == DIRECTION_DOWN))
|
|
focusTarget = nullptr; // Up/down navigates in list if dropped down
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (focusTarget != nullptr)
|
|
focusTarget->requestFocus();
|
|
return focusTarget != nullptr;
|
|
}
|