local file system loading working again

This commit is contained in:
Lisa Milne 2023-12-13 15:45:56 +10:00
parent 8dad3466d0
commit 93a4885563
2 changed files with 159 additions and 9 deletions

View file

@ -46,9 +46,8 @@ var bios = {
head.appendChild(script);
},
file:function(name,callback) {
if (window.location.protocol == 'file:') { // this is a dirty hack and I hate it, just let me open a file: path!
//clite.term.setCustom({type:'file',callback:callback});
//clite.term.writeLine('open file: '+name);
if (window.location.protocol == 'file:') {
bios.io.write(3,{file:name,fn:callback});
return;
}
@ -92,6 +91,10 @@ var bios = {
}
bios.input.keybuffer.rcvr = d;
break;
case 3:
bios.input.upload.data.callback = d.fn;
bios.input.upload.data.file = d.file;
bios.input.setState(2);
default:;
}
},
@ -143,10 +146,33 @@ var bios = {
input:{
el:null,
state:0,
setState:function(v) { // 1 for normal keyboard input, 2 for file access
if (bios.input.state == v)
return;
switch (bios.input.state) {
case 1:
bios.input.keyboard.disable();
break;
case 2:
bios.input.upload.disable();
break;
default:;
}
switch (v) {
case 2:
bios.input.upload.enable();
break;
default:
bios.input.keyboard.enable();
v = 1;
}
bios.input.state = v;
},
init:function() {
bios.input.el = document.getElementById('input');
bios.input.keyboard.init();
bios.input.state = 1;
bios.input.upload.init();
bios.input.setState(1);
},
keybuffer:{
rcvr:null,
@ -364,7 +390,8 @@ bios.video.graphic = {
bios.input.keyboard = {
data:{
el:null
el:null,
enabled:false
},
internal:{
rawDown:function(e) {
@ -495,18 +522,141 @@ bios.input.keyboard = {
bios.input.keyboard.data.el = document.createElement('textarea');
bios.input.keyboard.data.el.id = 'kbd';
bios.input.keyboard.data.el.className = 'kbd';
bios.input.keyboard.data.el.style.zIndex = '100';
//bios.input.keyboard.data.el.style.zIndex = '100';
bios.input.keyboard.data.el.style.display = 'block';
}
bios.input.keyboard.data.el.addEventListener('keydown',bios.input.keyboard.internal.rawDown);
bios.input.keyboard.data.el.addEventListener('keyup',bios.input.keyboard.internal.rawUp);
bios.input.keyboard.data.el.addEventListener('focusout',bios.input.keyboard.internal.resetFocus);
if (bios.input.keyboard.data.enabled) {
bios.input.keyboard.data.el.addEventListener('focusout',bios.input.keyboard.internal.resetFocus);
bios.input.keyboard.internal.resetFocus();
}
return bios.input.keyboard.data.el;
},
init:function() {
var el = bios.input.keyboard.getElement();
bios.input.el.appendChild(el);
bios.input.keyboard.internal.resetFocus();
},
enable:function() {
bios.input.keyboard.data.enabled = true;
bios.input.keyboard.getElement();
},
disable:function() {
bios.input.keyboard.data.enabled = false;
bios.input.keyboard.getElement();
bios.input.keyboard.data.el.removeEventListener('focusout',bios.input.keyboard.internal.resetFocus);
}
};
bios.input.upload = {
data:{
el:null,
enabled:false,
reader:null,
callback:null,
file:null,
panel:null
},
internal:{
createUploadPanel:function() {
if (bios.video.mode.current != 1 || bios.input.upload.data.file == null)
return;
var l = 28;
if (bios.input.upload.data.file.length > l)
l = bios.input.upload.data.file.length;
var w = l+4;
var h = 6;
var x = 40-(w/2);
var y = 9;
for (var i=0; i<w; i++) {
bios.video.io.write(x+i,y,' ');
bios.video.io.setBG(x+i,y,15);
}
for (var j=0; j<4; j++) {
y++;
bios.video.io.write(x,y,' ');
bios.video.io.setBG(x,y,15);
for (var i=1; i<w-1; i++) {
bios.video.io.write(x+i,y,' ');
bios.video.io.setBG(x+i,y,0);
}
bios.video.io.write(x+w-1,y,' ');
bios.video.io.setBG(x+w-1,y,15);
}
y++;
for (var i=0; i<w; i++) {
bios.video.io.write(x+i,y,' ');
bios.video.io.setBG(x+i,y,15);
}
var ho = x+2;
var fo = x+2;
if (l == 28) {
fo += ((28-bios.input.upload.data.file.length)/2);
}else{
ho += ((bios.input.upload.data.file.length-28)/2);
}
bios.core.writeStringVGA(ho,11,'Press Enter and Select File:',15);
bios.core.writeStringVGA(fo,12,bios.input.upload.data.file,15);
},
removeUploadPanel:function() {
if (bios.video.mode.current != 1 || bios.input.upload.data.panel == null)
return;
// TODO: create should store the current state so this can restore it
},
resetFocus:function(e) {
setTimeout(function() {
try{
document.getElementById('lfs').focus();
} catch(err) {}
},10);
return false;
}
},
getElement:function() {
bios.input.upload.data.el = document.getElementById('lfs');
if (typeof bios.input.upload.data.el === 'undefined' || bios.input.upload.data.el == null) {
bios.input.upload.data.el = document.createElement('input');
bios.input.upload.data.el.id = 'lfs';
bios.input.upload.data.el.className = 'lfs';
//bios.input.upload.data.el.style.zIndex = '100';
bios.input.upload.data.el.style.display = 'block';
bios.input.upload.data.el.type = 'file';
}
bios.input.upload.data.el.onchange = function(e) {
bios.input.upload.data.reader = new FileReader();
bios.input.upload.data.reader.onload = function() {
bios.input.setState(1);
bios.input.upload.data.callback(bios.input.upload.data.reader.result);
};
bios.input.upload.data.reader.onerror = function() {
bios.input.setState(1);
bios.input.upload.data.callback(null);
};
bios.input.upload.data.reader.readAsText(e.target.files[0]);
}
if (bios.input.upload.data.enabled) {
bios.input.upload.data.el.addEventListener('focusout',bios.input.upload.internal.resetFocus);
bios.input.upload.internal.resetFocus();
}
return bios.input.upload.data.el;
},
init:function() {
var el = bios.input.upload.getElement();
bios.input.el.appendChild(el);
},
enable:function() {
bios.input.upload.data.enabled = true;
bios.input.upload.getElement();
bios.input.upload.internal.createUploadPanel();
},
disable:function() {
bios.input.upload.data.enabled = false;
bios.input.upload.getElement();
bios.input.upload.data.el.removeEventListener('focusout',bios.input.upload.internal.resetFocus);
bios.input.upload.internal.removeUploadPanel();
}
};

View file

@ -3,7 +3,7 @@ body {display:grid; align-items:center;}
div {display:block; margin:0; padding:0;}
div.vga {margin:auto; z-index:10; background-color:#000000;}
div.io {position:absolute; top:0px; left:0px; width:100px; height:100px; z-index:3;}
div.io {position:absolute; top:0px; left:0px; width:100px; height:100px; z-index:3; overflow:hidden;}
div.ioblank {position:absolute; top:0px; left:0px; width:100px; height:100px; z-index:9; background-color:black;}
div.io textarea {display:block; width:50px; height:50px;}
div.io audio {display:block; width:20px; height:20px;}