More refactor, making working focus() in first element of menu and adding example buttons.
This commit is contained in:
parent
28fe1189f3
commit
837d8b89e1
@ -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>
|
||||||
);
|
);
|
||||||
|
@ -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>
|
||||||
|
38
js-src/components/overlay-select-files.tsx
Normal file
38
js-src/components/overlay-select-files.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
@ -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}/>
|
||||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user