More refactor, making working focus() in first element of menu and adding example buttons.

This commit is contained in:
Sergiotarxz 2023-03-24 19:13:09 +01:00
parent 28fe1189f3
commit 837d8b89e1
6 changed files with 127 additions and 28 deletions

View File

@ -8,20 +8,24 @@ export interface OverlayControlsProps {
export default function OverlayControls({firstMenuElement, setHiddenMenu}: OverlayControlsProps) { export default function OverlayControls({firstMenuElement, setHiddenMenu}: OverlayControlsProps) {
function showOverlayMenu() { function showOverlayMenu() {
if (firstMenuElement.current == null) {
return;
}
firstMenuElement.current.focus();
setHiddenMenu(false); setHiddenMenu(false);
setTimeout(() => {
if (firstMenuElement.current == null) {
return;
}
firstMenuElement.current.focus();
}, 100);
} }
return ( return (
<div className="overlay"> <div className="overlay">
<div className="vertical-padding"> <div className="vertical-padding">
</div> </div>
<div className="controls"> <div className="controls">
<a ref={firstMenuElement} className="gear control" onClick={showOverlayMenu}> <a href="#" className="gear control" onClick={showOverlayMenu}>
<img src={HOME_BUTTON_IMAGE} alt="Go to menu. (House icon)"/> <img src={HOME_BUTTON_IMAGE} alt="Go to menu. (House icon)"/>
</a> </a>
<a href="#" className="control-a control control-button">A</a>
<a href="#" className="control-b control control-button">B</a>
</div> </div>
</div> </div>
); );

View File

@ -7,13 +7,19 @@ export interface OverlayMenuProps {
setHiddenMenu: (c: boolean) => void, setHiddenMenu: (c: boolean) => void,
emulationStarted: boolean, emulationStarted: boolean,
setHiddenFormSelectFiles: (c: boolean) => void, setHiddenFormSelectFiles: (c: boolean) => void,
screenRef: React.RefObject<HTMLDivElement>;
isFullscreen: boolean;
setIsFullscreen: (c:boolean) => void;
firstMenuElement: React.RefObject<HTMLAnchorElement>,
}; };
interface Style { interface Style {
[id: string]: string; [id: string]: string;
}; };
export default function OverlayMenu({hiddenMenu, setHiddenMenu, emulationStarted, setHiddenFormSelectFiles}: OverlayMenuProps) { export default function OverlayMenu({hiddenMenu, setHiddenMenu, emulationStarted,
setHiddenFormSelectFiles, screenRef, isFullscreen, setIsFullscreen,
firstMenuElement}: OverlayMenuProps) {
function exitMenu() { function exitMenu() {
setHiddenMenu(true); setHiddenMenu(true);
} }
@ -22,6 +28,20 @@ export default function OverlayMenu({hiddenMenu, setHiddenMenu, emulationStarted
setHiddenFormSelectFiles(false); setHiddenFormSelectFiles(false);
} }
function toggleFullscreen() {
if (isFullscreen) {
document.exitFullscreen();
setIsFullscreen(false);
return;
}
if (screenRef.current != null) {
screenRef.current.requestFullscreen().then(() => {
setIsFullscreen(true);
});
}
}
const styleSelectRom: Style = {}; const styleSelectRom: Style = {};
if (emulationStarted) { if (emulationStarted) {
styleSelectRom.display = 'none'; styleSelectRom.display = 'none';
@ -31,6 +51,10 @@ export default function OverlayMenu({hiddenMenu, setHiddenMenu, emulationStarted
if (hiddenMenu) { if (hiddenMenu) {
styleMenu.display = 'none'; styleMenu.display = 'none';
} }
let toggleFullscreenText: string = 'Set fullscreen';
if (isFullscreen) {
toggleFullscreenText = 'End fullscreen';
}
return ( return (
<div style={styleMenu} className="overlay-menu-div"> <div style={styleMenu} className="overlay-menu-div">
@ -39,7 +63,8 @@ export default function OverlayMenu({hiddenMenu, setHiddenMenu, emulationStarted
</div> </div>
<div className="overlay-menu"> <div className="overlay-menu">
<ul> <ul>
<li><a style={styleSelectRom} onClick={openSelectFilesMenu} href="#">Select rom</a></li> <li><a ref={firstMenuElement} style={styleSelectRom} onClick={openSelectFilesMenu} href="#">Select rom</a></li>
<li><a onClick={toggleFullscreen} href="#">{toggleFullscreenText}</a></li>
<li><a href="#" onClick={exitMenu}>Exit</a></li> <li><a href="#" onClick={exitMenu}>Exit</a></li>
</ul> </ul>
</div> </div>

View File

@ -0,0 +1,38 @@
import * as React from 'react';
import CloseButton from '/components/close-button';
import CenterElement from '/components/center-element';
import FormSelectFiles from '/components/form-select-files';
export interface OverlaySelectFilesProps {
hiddenFormSelectFiles: boolean;
setHiddenFormSelectFiles: (c: boolean) => void;
refInputRom: React.RefObject<HTMLInputElement>;
refInputSaveState: React.RefObject<HTMLInputElement>;
onStartEmulation: (e: React.MouseEvent<HTMLInputElement>) => void;
};
interface Style {
[id: string]: string;
};
export default function OverlaySelectFiles({hiddenFormSelectFiles, setHiddenFormSelectFiles, refInputRom, refInputSaveState, onStartEmulation}:OverlaySelectFilesProps) {
const styleOverlay: Style = {};
if (hiddenFormSelectFiles) {
styleOverlay.display = 'none';
}
return (
<div style={styleOverlay} className="overlay-menu-select-files overlay-menu-div">
<div className="overlay-menu-div-header">
<CloseButton onClick={() => setHiddenFormSelectFiles(true)}/>
</div>
<div className="overlay-menu">
<CenterElement>
<FormSelectFiles refInputRom={refInputRom}
refInputSaveState={refInputSaveState}
onStartEmulation={onStartEmulation}/>
</CenterElement>
</div>
</div>
);
}

View File

@ -5,6 +5,7 @@ import FormSelectFiles from '/components/form-select-files';
import CanvasGBAEmulator from '/components/canvas-gba-emulator'; import CanvasGBAEmulator from '/components/canvas-gba-emulator';
import OverlayControls from '/components/overlay-controls'; import OverlayControls from '/components/overlay-controls';
import OverlayMenu from '/components/overlay-menu'; import OverlayMenu from '/components/overlay-menu';
import OverlaySelectFiles from '/components/overlay-select-files';
import CloseButton from '/components/close-button'; import CloseButton from '/components/close-button';
import Endian from '/endian'; import Endian from '/endian';
@ -194,25 +195,22 @@ export default function Page() {
setHiddenFormSelectFiles: setHiddenFormSelectFiles, setHiddenFormSelectFiles: setHiddenFormSelectFiles,
}); });
}; };
let firstMenuElement = React.useRef<HTMLAnchorElement>(null); const firstMenuElement = React.useRef<HTMLAnchorElement>(null);
const screenRef = React.useRef<HTMLDivElement>(null);
const [isFullscreen, setIsFullscreen] = React.useState<boolean>(false);
return ( return (
<div> <div ref={screenRef}>
<OverlayControls firstMenuElement={firstMenuElement} setHiddenMenu={setHiddenMenu}/> <OverlayControls firstMenuElement={firstMenuElement}
<OverlayMenu hiddenMenu={hiddenMenu} setHiddenMenu={setHiddenMenu} emulationStarted={emulationStarted} setHiddenFormSelectFiles={setHiddenFormSelectFiles}/> setHiddenMenu={setHiddenMenu}/>
<div style={{display: hiddenFormSelectFiles?'none':''}} className="overlay-menu-select-files overlay-menu-div"> <OverlayMenu hiddenMenu={hiddenMenu}
<div className="overlay-menu-div-header"> setHiddenMenu={setHiddenMenu} emulationStarted={emulationStarted}
<CloseButton onClick={() => setHiddenFormSelectFiles(true)}/> setHiddenFormSelectFiles={setHiddenFormSelectFiles} screenRef={screenRef}
</div> isFullscreen={isFullscreen} setIsFullscreen={setIsFullscreen}
<div className="overlay-menu"> firstMenuElement={firstMenuElement}/>
<CenterElement> <OverlaySelectFiles hiddenFormSelectFiles={hiddenFormSelectFiles}
<FormSelectFiles refInputRom={refInputRom} setHiddenFormSelectFiles={setHiddenFormSelectFiles}
refInputSaveState={refInputSaveState} refInputRom={refInputRom} refInputSaveState={refInputSaveState}
onStartEmulation={(e: React.MouseEvent<HTMLInputElement>) => { onStartEmulation={onStartEmulation}/>
onStartEmulation(e)
}}/>
</CenterElement>
</div>
</div>
<div> <div>
<CenterElement full={true}> <CenterElement full={true}>
<CanvasGBAEmulator canvasRef={canvasRef}/> <CanvasGBAEmulator canvasRef={canvasRef}/>

View File

@ -90,6 +90,30 @@ form label, form input {
color: grey; color: grey;
} }
.control-button {
top: 0;
left: 50%;
transform: translate(-50%, 0);
width: 40px;
height: 40px;
display: flex;
justify-content: center;
border-radius: 50%;
color: grey;
text-decoration: none;
line-height: 40px;
font-size: 35px;
}
.control-a {
top: 50%;
left: 90%;
}
.control-b {
top: 60%;
left: 75%;
}
.overlay > div.vertical-padding { .overlay > div.vertical-padding {
height: 50%; height: 50%;
} }

File diff suppressed because one or more lines are too long