BrowzOS/desktop/js/desktop.js

205 lines
5.3 KiB
JavaScript

/*
Code originally created by Joseph Parker (a.k.a.: Selfsame) for use with his https://tilde.towm homepage, called tildeos and inspired by MacOS System 6.
*/
debug = true
window.files = {};
window.drag = false;
window.target = false;
window.mousex = 0; window.mousey = 0;
window.zheight = 0;
$(window).mousedown(function(e) {
window.mousex = e.clientX;
window.mousey = e.clientY;
document.body.classList.add("mousedown")
});
$(window).mousemove(function(e) {
if (window.drag) {
x = e.clientX; y = e.clientY;
dx = x - window.mousex;
dy = y - window.mousey;
window.mousex = x; window.mousey = y;
e["dx"] = dx; e["dy"] = dy;
window.drag(e, window.target);
}
});
$(window).mouseup(function(e){
window.drag = false;
window.target = false;
document.body.classList.remove("mousedown")
});
$(window).ready(function () {});
/*
$(window).load(function () {
$.getJSON("public.json", parse_files)
});
*/
var img_data = function(img){
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
context.drawImage(img, 0, 0 );
return context.getImageData(0, 0, img.width, img.height);
}
var data_url = function(img, data){
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
context.putImageData(data, 0, 0 );
return canvas.toDataURL();
}
var get_mime = function(s){
var match = s.match( /\.([^\.]*)$/)
if (match) {
return match[match.length-1]
}
}
var contains = function(ar, v){
return ar.indexOf(v) != -1
}
img_mimes = ["gif", "png", "jpg", "bmp"]
make_icon = function(name, path){
if (debug) {console.log("make_icon",name, path)};
mime = get_mime(name)
icon = "img/icon-doc.png"
if (mime == "zip") {
icon = "img/zip.png"
}
if (contains(img_mimes, mime)){
icon = "img/img.png"
}
var file = $("<div class='file'><a href='"+path+
"'><img src='"+icon+"'><p><span class='name'>"+name+"</span></p></a></div>");
if (contains(img_mimes, mime)){
file[0].onclick = function(e){
e.preventDefault()
var w = raw_window(name)
w.addClass("image")
var view = w.find('.view')
view.append($("<img src='./"+path+"'>"))
var img = view.find('img')
img[0].onload = function(e){
var id = monochrome(img_data(e.target) )
e.target.src = data_url(e.target, id)
e.target.onload = null
}
}
}
if (mime == "html"){
file[0].onclick = function(e){
e.preventDefault()
var w = raw_window(name)
w.addClass("html")
w[0].style.width = "600px"
w[0].style.height = "480px"
var view = w.find('.view')
view.append($("<iframe src='./"+path+"'>"))
var iframe = view.find('iframe')
}
}
return file
}
make_folder = function(target, dir, name){
if (debug) {console.log("make_folder", target, dir, name)};
folder = $("<div class='folder file'><img src='img/icon-folder.png'><p><span class='name'>"+name+"</span></p></a></div>")
folder.on("click", function(e){
make_window(dir, name);});
return folder
}
raw_window = function(name){
var window_count = $('.window').length
var f = $("<div class='window'><div class='bar'>"+
"<p><span class='name'>"+name+"</span></p>"+
"<div class='close'></div></div>"+
"<div class='view'></div><div class='resize'></div></div>");
f.find('.close').on("click", function(e){$(e.target).parents('.window').detach();});
f.find('.bar').on("mousedown", function(e){
window.drag = function(e, target){
o = target.offset();
o.left += e.dx;
o.top += e.dy;
if (o.top < 20){ o.top = 20}
if (o.left < 1){ o.left = 1}
target.offset(o)
}
window.target = $(e.target).parents('.window');
window.zheight += 1;
window.target.css('z-index', window.zheight);
})
f.find('.resize').on("mousedown", function(e){
window.drag = function(e, target){
target.width(target.width() + e.dx);
target.height(target.height() + e.dy);
}
window.target = $(e.target).parents('.window');
})
f[0].style.top = 20+(window_count*25)+"px"
f[0].style.left = 20+(window_count*10)+"px"
$('#desktop').append(f);
return f
}
make_window = function(dir, name){
if (debug) {console.log("make_window", dir, name)};
var f = raw_window(name)
create_dir(f.find('.view'), dir)
}
parse_files = function(e){
for (var k in e) {
cursor = window.files
sp = k.split("/");
for(var i = 0; i < sp.length; i++) {
var part = sp[i];
if (!cursor[part]) {
cursor[part] = (i == sp.length - 1 ? k : {});
}
cursor = cursor[part];
}
}
create_dir($('#desktop'), window.files);
}
create_dir = function(target, dir){
for (var k in dir){
v = dir[k];
if (typeof(v) == "string"){
target.append(make_icon(k, v));
} else {
target.prepend(make_folder(target, dir[k], k));
}
}
}
function window_open(path, blank, opts){
var w = raw_window("loading...");
w.addClass("html")
w[0].style.width = "600px"
w[0].style.height = "480px"
w[0].style.position = "absolute";
var view = w.find('.view')
view.append($("<iframe src='./"+path+"'>"))
var iframe = view.find('iframe')
iframe.on('load',function() {
w.find('.name').text(iframe[0].contentDocument.title);
});
return true;
}