More complete file list
This commit is contained in:
@@ -14,7 +14,7 @@ export default function({ src: defaultSrc }) {
|
|||||||
// Whether the emulator should be running. Has to be a ref because the CPU setTimeout loop won't ever see changes in it otherwise
|
// Whether the emulator should be running. Has to be a ref because the CPU setTimeout loop won't ever see changes in it otherwise
|
||||||
const running = useRef(false)
|
const running = useRef(false)
|
||||||
|
|
||||||
const [currentFile, setCurrentFile] = useState(() => (Object.keys(window.localStorage)[0] || 'example'))
|
const [currentFile, setCurrentFile] = useState(() => (Object.keys(window.localStorage).sort()[0] || 'example'))
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!currentFile) {
|
if (!currentFile) {
|
||||||
setCurrentFile('example')
|
setCurrentFile('example')
|
||||||
@@ -37,7 +37,15 @@ export default function({ src: defaultSrc }) {
|
|||||||
selectFile(name)
|
selectFile(name)
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
const removeFile = useCallback((name) => {}, [])
|
const removeFile = useCallback(() => {
|
||||||
|
const files = Object.keys(window.localStorage).sort()
|
||||||
|
if (files.length < 2) { return } // Can't delete the last file
|
||||||
|
if (!confirm(`Are you sure you want to delete "${currentFile}"?`)) { return }
|
||||||
|
const idx = files.indexOf(currentFile)
|
||||||
|
window.localStorage.removeItem(currentFile)
|
||||||
|
files.splice(idx, 1)
|
||||||
|
selectFile(files[Math.min(files.length - 1, idx)])
|
||||||
|
}, [currentFile, selectFile])
|
||||||
|
|
||||||
// The current Forge source. Our initial state tries to look something up from localStorage,
|
// The current Forge source. Our initial state tries to look something up from localStorage,
|
||||||
// then if that fails uses the prop.
|
// then if that fails uses the prop.
|
||||||
@@ -109,7 +117,7 @@ export default function({ src: defaultSrc }) {
|
|||||||
<>
|
<>
|
||||||
<Tabbar activeTab={activeTab} setActiveTab={setActiveTab} anyErrors={!!errors}/>
|
<Tabbar activeTab={activeTab} setActiveTab={setActiveTab} anyErrors={!!errors}/>
|
||||||
<Toolbar activeTab={activeTab} running={running.current} build={build} run={run} stop={stop} addFile={addFile} removeFile={removeFile}/>
|
<Toolbar activeTab={activeTab} running={running.current} build={build} run={run} stop={stop} addFile={addFile} removeFile={removeFile}/>
|
||||||
<FileList fileList={Object.keys(window.localStorage)} selectFile={selectFile}/>
|
<FileList fileList={Object.keys(window.localStorage).sort()} selectFile={selectFile} currentFile={currentFile}/>
|
||||||
<div className='content'>{content}</div>
|
<div className='content'>{content}</div>
|
||||||
<EmulatorDisplay cpu={cpu}/>
|
<EmulatorDisplay cpu={cpu}/>
|
||||||
<Status message={status}/>
|
<Status message={status}/>
|
||||||
@@ -118,13 +126,13 @@ export default function({ src: defaultSrc }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// A list of "files" stored in localStorage, that we can display / build / compile
|
// A list of "files" stored in localStorage, that we can display / build / compile
|
||||||
function FileList({ fileList, selectFile }) {
|
function FileList({ fileList, selectFile, currentFile }) {
|
||||||
const clickFile = useCallback((event) => {
|
const clickFile = useCallback((event) => {
|
||||||
const name = event.target.getAttribute('data-name')
|
const name = event.target.getAttribute('data-name')
|
||||||
selectFile(name)
|
selectFile(name)
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
}, [selectFile])
|
}, [selectFile])
|
||||||
const fileRows = fileList.map(file => <div className='file' onClick={clickFile} data-name={file} key={file}>{file}</div>)
|
const fileRows = fileList.map(file => <div className={currentFile === file ? 'selected-file file' : 'file'} onClick={clickFile} data-name={file} key={file}>{file}</div>)
|
||||||
return (
|
return (
|
||||||
<div className='files'>
|
<div className='files'>
|
||||||
{fileRows}
|
{fileRows}
|
||||||
|
|||||||
@@ -70,3 +70,5 @@ a { color: #cccccc; }
|
|||||||
.buttons .run, .file-buttons .new { color: #66bb66 }
|
.buttons .run, .file-buttons .new { color: #66bb66 }
|
||||||
.buttons .stop, .file-buttons .del { color: #bb6666 }
|
.buttons .stop, .file-buttons .del { color: #bb6666 }
|
||||||
.buttons .build { color: #aaaaff; }
|
.buttons .build { color: #aaaaff; }
|
||||||
|
.files .file.selected-file { background-color: #686868 !important; }
|
||||||
|
.files .file:hover { background-color: #505050; }
|
||||||
Reference in New Issue
Block a user