redquark-amiberry-rb/src/osdep/gui/Navigation.cpp
Dimitris Panokostas 9416319b12 GUI improvements
2017-02-24 01:34:54 +01:00

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;
}