|
- import GlobalEvents from "/app/js/common/EventCaller.js";
- import NESPalette from "/app/js/models/NESPalette.js";
-
- const ATTRIB_NESIDX = "nesidx";
- // The two attributes below MUST BOTH be in the element.
- const ATTRIB_PALIDX = "pidx"; // This is the palette index (0 - 3 (Tiles) 4 - 7 (Sprites))
- const ATTRIB_COLIDX = "cidx"; // This is the color index in the selected palette (0 - 3)
-
- const CLASS_PALETTE_ACTIVE = "palette-selected";
-
- var Active_Palette_Index = 0;
- var Active_Color_Index = 0;
-
-
- function InvertRGB(hex){
- var h = (255 - parseInt(hex, 16)).toString(16);
- return (h.length < 2) ? "0" + h : h;
- }
-
- function InvertColor(chex, bw){
- bw = (bw === true);
- if (chex.indexOf("#") === 0){
- chex = chex.slice(1);
- }
- if (chex.length === 3){
- chex = chex[0] + chex[0] + chex[1] + chex[1] + chex[2] + chex[2];
- }
- if (chex.length !== 6){
- throw new ValueError("Hex color expected to be 3 or 6 characters long.");
- }
- if (bw) {
- var r = parseInt(chex.slice(0, 2), 16);
- var g = parseInt(chex.slice(2, 4), 16);
- var b = parseInt(chex.slice(4, 6), 16);
- // http://stackoverflow.com/a/3943023/112731
- return (r * 0.299 + g * 0.587 + b * 0.114) > 186
- ? '#000000' : '#FFFFFF';
- }
- return "#" + InvertRGB(chex.slice(0, 2)) + InvertRGB(chex.slice(2, 4)) + InvertRGB(chex.slice(4, 6));
- }
-
- function GetPaletteIndexes(el){
- if (el.hasAttribute(ATTRIB_PALIDX) && el.hasAttribute(ATTRIB_COLIDX)){
- var pi = el.getAttribute(ATTRIB_PALIDX);
- if (!isNaN(pi))
- pi = parseInt(pi);
- else
- pi = -1;
- var ci = el.getAttribute(ATTRIB_COLIDX);
- if (!isNaN(ci))
- ci = parseInt(ci);
- else
- ci = -1;
- if (pi >= 0 && pi < 8 && ci >= 0 && ci < 4){
- return {pi:pi, ci:ci};
- }
- }
- return null;
- }
-
- function SetPaletteElStyle(el, c){
- el.style["background-color"] = c;
- el.style.color = InvertColor(c);
- }
-
- function SetColorPaletteEls(pal){
- var elist = document.querySelectorAll("[" + ATTRIB_PALIDX + "]");
- elist.forEach(function(el){
- var i = GetPaletteIndexes(el);
- if (i !== null){
- SetPaletteElStyle(el, pal.get_palette_color(i.pi, i.ci));
- }
- });
- }
-
- function FindAndColorPalette(pi, ci, pal){
- if (pi >= 0 && pi < 8){
- var el = document.querySelector("[" + ATTRIB_PALIDX +"='" + pi + "']" +
- "[" + ATTRIB_COLIDX + "='" + ci + "']");
- if (el){
- SetPaletteElStyle(el, pal.get_palette_color(pi, ci));
- }
- }
- }
-
-
- class CTRLPalettes{
- constructor(){
- this.__NESPalette = null;
- this.__activePaletteEl = null;
-
- var self = this;
-
- // ------------------------------------------------------------------------------------
- // Defining hooks for the main system palette interactions.
- // ------------------------------------------------------------------------------------
- var handle_syspalette_clicked = function(event){
- if (self.__activePaletteEl !== null && this.hasAttribute(ATTRIB_NESIDX)){
- var idx = parseInt(this.getAttribute(ATTRIB_NESIDX), 16);
- if (idx >= 0 && idx < NESPalette.SystemColor.length){
- var i = GetPaletteIndexes(self.__activePaletteEl);
- if (self.__palette !== null && i !== null){
- self.__NESPalette.set_palette_syscolor_index(i.pi + ((self.__mode === 1) ? 4 : 0), i.ci, idx);
- SetPaletteElStyle(self.__activePaletteEl, NESPalette.SystemColor[idx]);
- }
- }
- }
- };
- var elist = document.querySelectorAll("[" + ATTRIB_NESIDX + "]");
- elist.forEach(function(el){
- var idx = parseInt(el.getAttribute(ATTRIB_NESIDX), 16);
- if (idx >= 0 && idx < NESPalette.SystemColor.length){
- SetPaletteElStyle(el, NESPalette.SystemColor[idx]);
- el.addEventListener("click", handle_syspalette_clicked);
- }
- });
-
-
- // ------------------------------------------------------------------------------------
- // Defining hooks for the drawing palette interactions.
- // ------------------------------------------------------------------------------------
- var handle_palcolor_clicked = function(event){
- if (this.hasAttribute(ATTRIB_PALIDX) && this.hasAttribute(ATTRIB_COLIDX)){
- if (this !== self.__activePaletteEl){
- var i = GetPaletteIndexes(this);
- if (i !== null){
- if (self.__activePaletteEl !== null){
- self.__activePaletteEl.classList.remove(CLASS_PALETTE_ACTIVE);
- }
-
- this.classList.add(CLASS_PALETTE_ACTIVE);
- self.__activePaletteEl = this;
- GlobalEvents.emit("active_palette_color", (i.pi%4), i.ci);
- }
- }
- }
- };
- var elist = document.querySelectorAll("[" + ATTRIB_PALIDX + "]");
- elist.forEach(function(el){
- if (el.hasAttribute(ATTRIB_PALIDX) && el.hasAttribute(ATTRIB_COLIDX)){
- el.addEventListener("click", handle_palcolor_clicked);
- }
- });
-
-
- // ------------------------------------------------------------------------------------
- // Setting some hooks to watch for some global events.
- // ------------------------------------------------------------------------------------
- var handle_set_app_palette = function(p){
- if (p instanceof NESPalette){
- self.palette = p;
- }
- }
- GlobalEvents.listen("set_app_palette", handle_set_app_palette);
- }
-
- get palette(){
- return this.__NESPalette;
- }
-
- set palette(p){
- if (!(p instanceof NESPalette)){
- throw new TypeError("Expected NESPalette object instance.");
- }
- var self = this;
- var handle_palettes_changed = function(event){
- if (self.__NESPalette !== null){
- if (event.type == "ALL"){
- SetColorPaletteEls(self.__NESPalette);
- } else {
- FindAndColorPalette(event.pindex, event.cindex, self.__NESPalette);
- }
- }
- }
-
- // Disconnect listener from old palette and connect it to new palette.
- if (this.__NESPalette !== p){
- if (this.__NESPalette !== null){
- this.__NESPalette.unlisten("palettes_changed", handle_palettes_changed);
- }
- this.__NESPalette = p;
- this.__NESPalette.listen("palettes_changed", handle_palettes_changed);
- }
- var elist = document.querySelectorAll("[" + ATTRIB_PALIDX + "]");
- elist.forEach((function(el){
- if (el.hasAttribute(ATTRIB_COLIDX)){
- var i = GetPaletteIndexes(el);
- if (i !== null){
- SetPaletteElStyle(el, p.get_palette_color(i.pi, i.ci));
- }
- }
- }).bind(this));
- }
- }
-
-
- const instance = new CTRLPalettes();
- export default instance;
-
-
|