You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

344 lines
8.4 KiB

var OSU_FILES = [];
const global = new Dispatcher();
function _removeFile(id) {
//TODO: Remove from bars too
let elem = document.getElementById(id);
const file_id = elem.dataset.index;
elem.remove();
if(file_id!==undefined && OSU_FILES[file_id])
{
const osu = OSU_FILES[file_id];
OSU_FILES[file_id] = null;
global.signal("FILE_REMOVE", {id: file_id, osu: osu});
}
}
const READ_WHOLE_BUFFER = true;
function _readfile(event) {
var input = event.target;
if(READ_WHOLE_BUFFER) {
var reader = new FileReader();
reader.onload = () => {
var osu = new OsuFile();
osu.LoadString(reader.result).then(result => {
console.log("Read version "+osu.version);
if(osu.okay()) {
//Push to read osu files
OSU_FILES.push(osu);
global.signal("FILE_ADD", {id: OSU_FILES.length-1, osu: osu});
} else {
var er = osu.errors;
console.log("Parsing .osu file failed: "+JSON.stringify(er));
//TODO: Signal error
}
});
};
reader.readAsText(input.files[0]);
} else {
var nav = new LineNavigator(input.files[0]);
}
}
var SIDEBAR_VIEWING = null;
function get_aggregate()
{
return OSU_FILES.where(x=> x)[0];
}
function clearChildren(node)
{
while(node.firstChild)
node.removeChild(node.firstChild);
}
function clear_sidebar() {
for(const elem of document.getElementsByClassName("metadata")) {
elem.innerText="";
removeClass(elem, "meta-dupe");
}
clearChildren( document.getElementById("meta-colours"));
}
function populate_sidebar(osu) {
const meta = (id, value_name, transform) => {
transform = transform || ((value) => value);
const elem = document.getElementById("meta-"+id);
const value = transform(path(osu, value_name));
elem.innerText = value;
if(OSU_FILES.where(x=> x && transform(path(x, value_name)) == value).length != OSU_FILES.where(x=> x).length)
{
//Is a not-dupe.
addClass(elem, "meta-dupe");
}
else removeClass(elem, "meta-dupe");
};
if(!osu) {
if(OSU_FILES.where(x=> x).length<1) clear_sidebar();
else {
//Is aggregate.
populate_sidebar(get_aggregate());
SIDEBAR_VIEWING = null;
}
} else {
//Is single
//General
meta("audio-filename", "data.General.AudioFilename");
meta("audio-lead-in", "data.General.AudioLeadIn");
meta("preview-time", "data.General.PreviewTime");
meta("countdown", "data.General.Countdown");
meta("sample-set", "data.General.SampleSet");
meta("stacking", "data.General.StackLeniency");
meta("mode", "data.General.Mode");
meta("letterbox", "data.General.LetterboxInBreaks");
meta("widescreen", "data.General.WidescreenStoryboard");
//Metadata
meta("title", "data.Metadata.TitleUnicode");
meta("title-ascii", "data.Metadata.Title");
meta("artist", "data.Metadata.ArtistUnicode");
meta("artist-ascii", "data.Metadata.Artist");
meta("mapper", "data.Metadata.Creator");
meta("difficulty", "data.Metadata.Version");
meta("source", "data.Metadata.Source");
meta("tags", "data.Metadata.Tags", tags=> tags.join(", "));
meta("beatmap-id", "data.Metadata.BeatmapID");
meta("beatmap-set-id", "data.Metadata.BeatmapSetID");
//Diff
meta("diff-hp", "data.Difficulty.HPDrainRate");
meta("diff-cs", "data.Difficulty.CircleSize");
meta("diff-od", "data.Difficulty.OverallDifficulty");
meta("diff-ar", "data.Difficulty.ApproachRate");
meta("diff-sv", "data.Difficulty.SliderMultiplier");
meta("diff-tr", "data.Difficulty.SliderTickRate");
//Background
meta("background", "data.Events.0.params.0");
//Colours
clearChildren(document.getElementById("meta-colours"));
if(osu.data.Colours) {
const colourList = document.getElementById("meta-colours");
const addColour = (rgb, combo) => {
const node = document.createElement("li");
node.setAttribute("class", "combo-colour");
node.setAttribute("id", "meta-colour-"+combo);
node.style.color = "rgb("+rgb.r+","+rgb.g+","+rgb.b+")";
node.innerText = rgb.toString();
colourList.appendChild(node);
};
console.log(osu.data.Colours);
for(let key in osu.data.Colours) {
if(osu.data.Colours.hasOwnProperty(key)) {
const rgb = osu.data.Colours[key];
addColour(rgb, key);
}
}
}
SIDEBAR_VIEWING = osu;
}
}
function repopulate_sidebar(get_sel) {
if(get_sel) {
const elem = document.getElementById("meta-selector");
if(elem.selectedIndex==0)
populate_sidebar();
else
populate_sidebar(OSU_FILES[elem.value]);
}
else
populate_sidebar(SIDEBAR_VIEWING);
}
function _onload() {
// --- Set up collapsers --- //
const collapsers = document.getElementsByClassName('collapse');
for(const elem of collapsers) {
elem.addEventListener('click', function() {
let block;
if(this.dataset.collapse) {
block = document.getElementById(this.dataset.collapse);
}
else block = this.parentElement.nextSibling.nextSibling;
if(block.style.display === "none") {
removeClass(this, "collapsed");
block.style.display = "";
}
else {
addClass(this, "collapsed");
block.style.display = "none";
}
}, false);
}
// --- End collapsers --- //
// --- Selector change -- //
const metadataSelector = document.getElementById('meta-selector');
metadataSelector.addEventListener("change", function(event) {
if(this.selectedIndex==0) {
populate_sidebar();
} else {
const osu = OSU_FILES[this.value];
if(osu) {
populate_sidebar(osu);
}
}
});
}
const OSUFILE_DOM_PRE = "O_file";
function setWarn(elem, on, str) {
if(!elem) return;
if(on) {
addClass(elem, "warning");
elem.setAttribute("title", "Warning"+ (str?": "+str:""));
} else if(hasClass(elem,"warning")) {
removeClass(elem, "warning");
elem.removeAttribute("title");
}
}
/// --- HOOKS --- ///
//Create DOM elem for file.
global.hook("FILE_ADD", function(arg) {
const id = arg.id;
const osu = arg.osu;
//A new file has been added.
//<div id='_file1' data-index='0' class='osufile' onclick='_removeFile("_file1")'>test</div>
var elem = document.createElement("div");
elem.setAttribute("id", OSUFILE_DOM_PRE+id);
elem.setAttribute("class", "osufile");
elem.innerText = osu.Fullname();
elem.addEventListener("click", function() {
_removeFile(OSUFILE_DOM_PRE+id);
});
elem.dataset.index = id;
console.log(OSU_FILES.where(x=> x && osu.equals(x)).length);
console.log(OSU_FILES.where(x=> x && x.equals(new OsuFile())||true));
console.log(OSU_FILES);
if(OSU_FILES.where(x=> x && x.equals(osu)).length > 1) {
setWarn(elem, true, "File already added!");
}
document.getElementById("selector").appendChild(elem);
repopulate_sidebar();
});
//Add to Metadata Selector
global.hook("FILE_ADD", function(arg) {
const osu = arg.osu;
const id = arg.id;
var elem = document.createElement("option");
elem.setAttribute("value", id);
elem.setAttribute("id", "meta-sel-"+id);
elem.innerText = osu.Shortname();
var sel = document.getElementById("meta-selector");
sel.appendChild(elem);
if(!SIDEBAR_VIEWING) {
repopulate_sidebar();
}
});
//Remove Metadata selector
global.hook("FILE_REMOVE", function(arg) {
const osu = arg.osu;
const id = arg.id;
document.getElementById("meta-sel-"+id).remove();
repopulate_sidebar(true);
});
//Recalc dupe warnings
global.hook("FILE_REMOVE", function(arg) {
const osu = arg.osu;
const id = arg.id;
for(let i =OSU_FILES.length-1;i>=0;i--) {
if(!OSU_FILES[i]) continue;
let setwarn = false;
for(let j = 0;j<i;j++) {
if(!OSU_FILES[j]) continue;
if(OSU_FILES[j].equals(OSU_FILES[i]))
{
setwarn = true;
break;
}
}
console.log(i+" "+setwarn);
if(setwarn) setWarn(document.getElementById(OSUFILE_DOM_PRE+i), true, "File already added!");
else setWarn(document.getElementById(OSUFILE_DOM_PRE+i), false);
}
});
/// --- bars --- ///
function osu_bar(others, osu) {
const part = (colour, frag) => { return {colour: colour, frag: frag}; };
var bars = [];
//TODO: Check for overlaps
return bars;
}
var OSU_BARS = {};
global.hook("FILE_ADD", function(arg) {
const osu = arg.osu;
const id = arg.id;
const bar_id = "_bar_"+id;
const par = document.getElementById("bars");
OSU_BARS[bar_id] = new ColouredBar(par, osu_bar(OSU_FILES.where(x=> x && x!=osu), osu)); //[{colour: "red", frag: 0.5}, {colour: "green", frag: 0.5}]);
OSU_BARS[bar_id].element.setAttribute("id", bar_id);
//OSU_BARS[bar_id].element.innerText = osu.Shortname();
});
global.hook("FILE_REMOVE", function(arg) {
const osu = arg.osu;
const id = arg.id;
const bar_id = "_bar_"+id;
if(OSU_BARS[bar_id])
{
OSU_BARS[bar_id].remove();
OSU_BARS[bar_id] = undefined;
}
});