|  |  | @@ -3,11 +3,110 @@ import Utils from "/app/js/common/Utils.js"; | 
		
	
		
			
			|  |  |  | import NESPalette from "/app/js/models/NESPalette.js"; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | const PLI_TEMPLATE = ".palette-list-item-template"; | 
		
	
		
			
			|  |  |  | const PLI_TITLE = ".title"; | 
		
	
		
			
			|  |  |  | const PLI_BG_COLOR = ".pal-bg-color"; | 
		
	
		
			
			|  |  |  | const PLI_FG_BASE = ".pal-fg-"; | 
		
	
		
			
			|  |  |  | const PLI_BG_BASE = ".pal-bg-"; | 
		
	
		
			
			|  |  |  | const PLI_SELECTED = ".item-selected"; | 
		
	
		
			
			|  |  |  | const PLI_COLOR_BASE = "nes-color-bg-"; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var Palettes = []; | 
		
	
		
			
			|  |  |  | var CurrentPaletteIndex = 0; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var BlockEmits = false; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function HANDLE_PaletteClick(e){ | 
		
	
		
			
			|  |  |  | if (!this.hasAttribute("palname")){return;} | 
		
	
		
			
			|  |  |  | var pname = this.getAttribute("palname"); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (Palettes.length > 0 && Palettes[CurrentPaletteIndex][0] !== pname){ | 
		
	
		
			
			|  |  |  | var oel = Palettes[CurrentPaletteIndex][2]; | 
		
	
		
			
			|  |  |  | oel.classList.remove(PLI_SELECTED); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (let i=0; i < Palettes.length; i++){ | 
		
	
		
			
			|  |  |  | if (Palettes[i][0] === pname){ | 
		
	
		
			
			|  |  |  | Palettes[i][2].classList.add(PLI_SELECTED); | 
		
	
		
			
			|  |  |  | GlobalEvents.emit("set_app_palette", Palettes[i][1]); | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function SetElToColor(el, mode, pi, ci, hex){ | 
		
	
		
			
			|  |  |  | var cel = null; | 
		
	
		
			
			|  |  |  | if (ci === 0){ | 
		
	
		
			
			|  |  |  | cel = el.querySelectorAll(PLI_BG_COLOR); | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | cel = el.querySelectorAll(((mode == 0) ? PLI_FG_BASE : PLI_BG_BASE) + pi + "-" + ci); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if (cel !== null && cel.length === 1){ | 
		
	
		
			
			|  |  |  | cel = cel[0]; | 
		
	
		
			
			|  |  |  | var clist = cel.getAttribute("class").split(" "); | 
		
	
		
			
			|  |  |  | for (let i=0; i < clist.length; i++){ | 
		
	
		
			
			|  |  |  | if (clist[i].startsWith(PLI_COLOR_BASE)){ | 
		
	
		
			
			|  |  |  | cel.classList.remove(clist[i]); | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | cel.classList.add("." + PLI_COLOR_BASE + hex); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function ColorElementToPalette(el, palette){ | 
		
	
		
			
			|  |  |  | for (let p=0; p < 8; p++){ | 
		
	
		
			
			|  |  |  | for (let c=1; c < 4; c++){ | 
		
	
		
			
			|  |  |  | SetElToColor( | 
		
	
		
			
			|  |  |  | el, (p >= 4) ? 0 : 1, | 
		
	
		
			
			|  |  |  | p%4, c, | 
		
	
		
			
			|  |  |  | palette.get_palette_syscolor_index(p,c,true) | 
		
	
		
			
			|  |  |  | ); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function ConnectElementToPalette(el, palette){ | 
		
	
		
			
			|  |  |  | palette.listen("palettes_changed", (e) => { | 
		
	
		
			
			|  |  |  | if (e.type == "ALL"){ | 
		
	
		
			
			|  |  |  | ColorElementToPalette(el, palette); | 
		
	
		
			
			|  |  |  | } else if (e.type == "SPRITE"){ | 
		
	
		
			
			|  |  |  | SetElToColor( | 
		
	
		
			
			|  |  |  | el, 0, | 
		
	
		
			
			|  |  |  | e.pindex%4, e.cindex, | 
		
	
		
			
			|  |  |  | palette.get_palette_syscolor_index(e.pindex, e.cindex, true) | 
		
	
		
			
			|  |  |  | ); | 
		
	
		
			
			|  |  |  | } else if (e.type == "TILE"){ | 
		
	
		
			
			|  |  |  | SetElToColor( | 
		
	
		
			
			|  |  |  | el, 1, | 
		
	
		
			
			|  |  |  | e.pindex, e.cindex, | 
		
	
		
			
			|  |  |  | palette.get_palette_syscolor_index(e.pindex, e.cindex, true) | 
		
	
		
			
			|  |  |  | ); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | }); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function CreatePaletteDOMEntry(pname, palette){ | 
		
	
		
			
			|  |  |  | var oel = document.querySelectorAll(PLI_TEMPLATE); | 
		
	
		
			
			|  |  |  | if (oel.length == 1){ | 
		
	
		
			
			|  |  |  | var el = oel[0].cloneNode(true); | 
		
	
		
			
			|  |  |  | el.classList.remove(PLI_TEMPLATE); | 
		
	
		
			
			|  |  |  | el.classList.remove("hidden"); | 
		
	
		
			
			|  |  |  | el.setAttribute("palname", pname); | 
		
	
		
			
			|  |  |  | ConnectElementToPalette(el, palette); | 
		
	
		
			
			|  |  |  | ColorElementToPalette(el, palette); | 
		
	
		
			
			|  |  |  | el.addEventListener("click", HANDLE_PaletteClick); | 
		
	
		
			
			|  |  |  | oel[0].parentNode.appendChild(el); | 
		
	
		
			
			|  |  |  | return el; | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | console.log("WARNING: Multiple templates found. Ambigous state."); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | return null; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | class CTRLPalettesStore{ | 
		
	
		
			
			|  |  |  | constructor(){} | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
			|  |  | @@ -35,25 +134,15 @@ class CTRLPalettesStore{ | 
		
	
		
			
			|  |  |  | for (let i=0; i < d.pals.length; i++){ | 
		
	
		
			
			|  |  |  | if (d.pals[i] instanceof Array){ | 
		
	
		
			
			|  |  |  | if (this.getPalette(d.pals[i][0]) === null){ | 
		
	
		
			
			|  |  |  | var palette = new NESPalette(); | 
		
	
		
			
			|  |  |  | try{ | 
		
	
		
			
			|  |  |  | palette.json = d.pals[i][1] | 
		
	
		
			
			|  |  |  | } catch (e) { | 
		
	
		
			
			|  |  |  | console.log("Failed to create palette.", e.toString()); | 
		
	
		
			
			|  |  |  | palette = null; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if (palette !== null){ | 
		
	
		
			
			|  |  |  | newPalettes.push([d.pals[i][0], palette]); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | this.createPalette(d.pals[i][0], d.pals[i][1]); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | CurrentPaletteIndex = 0 | 
		
	
		
			
			|  |  |  | if (newPalettes.length > 0){ | 
		
	
		
			
			|  |  |  | if (d.cpi >= 0 && d.cpi < newPalettes.length){ | 
		
	
		
			
			|  |  |  | if (Palettes.length > 0){ | 
		
	
		
			
			|  |  |  | if (d.cpi >= 0 && d.cpi < Palettes.length){ | 
		
	
		
			
			|  |  |  | CurrentPaletteIndex = d.cpi; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | Palettes = newPalettes; | 
		
	
		
			
			|  |  |  | GlobalEvents.emit("set_app_palette", Palettes[CurrentPaletteIndex][1]); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } else { | 
		
	
	
		
			
			|  |  | @@ -84,33 +173,54 @@ class CTRLPalettesStore{ | 
		
	
		
			
			|  |  |  | return (i >= 0) ? Palettes[i][1] : null; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | createPalette(name){ | 
		
	
		
			
			|  |  |  | createPalette(name, pjson){ | 
		
	
		
			
			|  |  |  | var palette = this.getPalette(name); | 
		
	
		
			
			|  |  |  | if (palette === null){ | 
		
	
		
			
			|  |  |  | palette = new NESPalette(); | 
		
	
		
			
			|  |  |  | palette.set_palette([ | 
		
	
		
			
			|  |  |  | "0F", | 
		
	
		
			
			|  |  |  | "05","06","07", | 
		
	
		
			
			|  |  |  | "09","0A","0B", | 
		
	
		
			
			|  |  |  | "01","02","03", | 
		
	
		
			
			|  |  |  | "0D","00","20", | 
		
	
		
			
			|  |  |  | "15","16","17", | 
		
	
		
			
			|  |  |  | "19","1A","1B", | 
		
	
		
			
			|  |  |  | "11","21","31", | 
		
	
		
			
			|  |  |  | "1D","10","30" | 
		
	
		
			
			|  |  |  | ]); | 
		
	
		
			
			|  |  |  | Palettes.push([name, palette]); | 
		
	
		
			
			|  |  |  | // TODO: Create an HTML entry for this new palette. | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (Palettes.length <= 1 && !BlockEmits){ | 
		
	
		
			
			|  |  |  | GlobalEvents.emit("set_app_palette", palette); | 
		
	
		
			
			|  |  |  | if (typeof(pjson) === "string"){ | 
		
	
		
			
			|  |  |  | try { | 
		
	
		
			
			|  |  |  | palette.json = pjson; | 
		
	
		
			
			|  |  |  | } catch (e) { | 
		
	
		
			
			|  |  |  | console.log("Failed to create palette.", e.toString()); | 
		
	
		
			
			|  |  |  | palette = null; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | palette.set_palette([ | 
		
	
		
			
			|  |  |  | "0F", | 
		
	
		
			
			|  |  |  | "05","06","07", | 
		
	
		
			
			|  |  |  | "09","0A","0B", | 
		
	
		
			
			|  |  |  | "01","02","03", | 
		
	
		
			
			|  |  |  | "0D","00","20", | 
		
	
		
			
			|  |  |  | "15","16","17", | 
		
	
		
			
			|  |  |  | "19","1A","1B", | 
		
	
		
			
			|  |  |  | "11","21","31", | 
		
	
		
			
			|  |  |  | "1D","10","30" | 
		
	
		
			
			|  |  |  | ]); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (palette !== null){ | 
		
	
		
			
			|  |  |  | var el = CreatePaletteDOMEntry(name, palette); | 
		
	
		
			
			|  |  |  | Palettes.push([name, palette, el]); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (Palettes.length <= 1 && !BlockEmits){ | 
		
	
		
			
			|  |  |  | GlobalEvents.emit("set_app_palette", palette); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | return this; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | removePalette(name){ | 
		
	
		
			
			|  |  |  | // TODO: Write this function. | 
		
	
		
			
			|  |  |  | for (let i=0; i < Palettes.length; i++){ | 
		
	
		
			
			|  |  |  | if (Palettes[i][0] === name){ | 
		
	
		
			
			|  |  |  | if (CurrentPaletteIndex === i){ | 
		
	
		
			
			|  |  |  | CurrentPaletteIndex = 0; | 
		
	
		
			
			|  |  |  | this.activatePalette(Palettes[0][0]); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | Palettes[i][2].parentNode.removeChild(Palettes[i][2]); | 
		
	
		
			
			|  |  |  | Palettes.splice(i, 1); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | return this; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
			|  |  | @@ -119,6 +229,7 @@ class CTRLPalettesStore{ | 
		
	
		
			
			|  |  |  | if (i < 0) | 
		
	
		
			
			|  |  |  | throw new ValueError("Failed to find palette named '" + oldname +"'. Cannot rename."); | 
		
	
		
			
			|  |  |  | Palettes[i][0] = newname; | 
		
	
		
			
			|  |  |  | Palettes[i][2].setAttribute("palname", newname); | 
		
	
		
			
			|  |  |  | return this; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
			|  |  | @@ -126,13 +237,20 @@ class CTRLPalettesStore{ | 
		
	
		
			
			|  |  |  | var i = this.paletteIndexFromName(name); | 
		
	
		
			
			|  |  |  | if (i >= 0 && CurrentPaletteIndex !== i){ | 
		
	
		
			
			|  |  |  | CurrentPaletteIndex = i; | 
		
	
		
			
			|  |  |  | if (!BlockEmits){ | 
		
	
		
			
			|  |  |  | GlobalEvents.emit("set_app_palette", Palettes[pindex][1]); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | // TODO: Highlight palette HTML entry and unhighlight old one. | 
		
	
		
			
			|  |  |  | Palettes[CurrentPaletteIndex][2].click(); | 
		
	
		
			
			|  |  |  | //if (!BlockEmits){ | 
		
	
		
			
			|  |  |  | //  GlobalEvents.emit("set_app_palette", Palettes[CurrentPaletteIndex][1]); | 
		
	
		
			
			|  |  |  | //} | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | return this; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | clear(){ | 
		
	
		
			
			|  |  |  | for (let i=0; i < Palettes.length; i++){ | 
		
	
		
			
			|  |  |  | Palettes[i][2].parentNode.removeChild(Palettes[i][2]); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | CurrentPaletteIndex = 0; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 |