From 9108bb5e1c1780eae51140ad7f6d12ef5657a206 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Sat, 13 Apr 2019 09:10:08 -0400 Subject: [PATCH] asmmain.js; fixed disappearing pixel editor bug (?) --- doc/notes.txt | 2 -- src/pixed/pixeleditor.ts | 4 +-- src/views.ts | 56 ++++++++++++++++++++++++++++------------ src/worker/asmmain.js | 38 +++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 20 deletions(-) create mode 100644 src/worker/asmmain.js diff --git a/doc/notes.txt b/doc/notes.txt index 1ba9c063..a61146e0 100644 --- a/doc/notes.txt +++ b/doc/notes.txt @@ -102,7 +102,6 @@ TODO: - pulldown shows wrong file if preset not present - landscape mode for arcade ports - pixel editor - - edit sprites and tiles at same time (multiple views) - persist palette/tilemap selections - more tools for editing - map editor @@ -111,7 +110,6 @@ TODO: - capture so we get mouseUp() out of frame - per-View keyboard shortcuts - parse labels - - editing too fast refreshes kills the editor, also doesn't update palette - crt0.s compiled each time? - debug highlight doesn't go away when debugging -> running - show breakpoint of PC or highest address on stack diff --git a/src/pixed/pixeleditor.ts b/src/pixed/pixeleditor.ts index 3a9e9f30..45a4ddf6 100644 --- a/src/pixed/pixeleditor.ts +++ b/src/pixed/pixeleditor.ts @@ -8,7 +8,7 @@ export type UintArray = number[] | Uint8Array | Uint16Array | Uint32Array; //{[i // TODO: separate view/controller export interface EditorContext { - setCurrentEditor(div:JQuery, editing:JQuery) : void; + setCurrentEditor(div:JQuery, editing:JQuery, node:PixNode) : void; getPalettes(matchlen : number) : SelectablePalette[]; getTilemaps(matchlen : number) : SelectableTilemap[]; } @@ -807,7 +807,7 @@ export class CharmapEditor extends PixNode { chooser.recreate(agrid, (index, viewer) => { var escale = Math.ceil(192 / this.fmt.w); var editview = this.createEditor(aeditor, viewer, escale); - this.context.setCurrentEditor(aeditor, $(viewer.canvas)); + this.context.setCurrentEditor(aeditor, $(viewer.canvas), this); this.rgbimgs[index] = viewer.rgbdata; }); // add palette selector diff --git a/src/views.ts b/src/views.ts index 8cbac5dc..1549cded 100644 --- a/src/views.ts +++ b/src/views.ts @@ -906,6 +906,7 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext { maindiv : JQuery; cureditordiv : JQuery; cureditelem : JQuery; + cureditnode : pixed.PixNode; rootnodes : pixed.PixNode[]; deferrednodes : pixed.PixNode[]; @@ -979,8 +980,16 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext { }); return result; } + + isEditing() { + return this.cureditordiv != null; + } + + getCurrentEditNode() { + return this.cureditnode; + } - setCurrentEditor(div : JQuery, editing : JQuery) { + setCurrentEditor(div:JQuery, editing:JQuery, node:pixed.PixNode) { const timeout = 250; if (this.cureditordiv != div) { if (this.cureditordiv) { @@ -1002,6 +1011,10 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext { this.cureditelem = editing; this.cureditelem.addClass('selected'); } + while (node.left) { + node = node.left; + } + this.cureditnode = node; } scanFileTextForAssets(id : string, data : string) { @@ -1055,6 +1068,7 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext { return result; } + // TODO: move to pixeleditor.ts? addPaletteEditorViews(parentdiv:JQuery, pal2rgb:pixed.PaletteFormatToRGB, callback) { var adual = $('
').appendTo(parentdiv); var aeditor = $('
').hide(); // contains editor, when selected @@ -1100,7 +1114,7 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext { callback(i, index); updateCell(cell, i); }); - this.setCurrentEditor(aeditor, cell); + this.setCurrentEditor(aeditor, cell, pal2rgb); }); }); } @@ -1139,9 +1153,19 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext { }); } + ensureFileDiv(fileid : string) : JQuery { + var divid = this.getFileDivId(fileid); + var body = $(document.getElementById(divid)); + if (body.length === 0) { + var filediv = newDiv(this.maindiv, 'asset_file'); + var header = newDiv(filediv, 'asset_file_header').text(fileid); + body = newDiv(filediv).attr('id',divid).addClass('disable-select'); + } + return body; + } + refreshAssetsInFile(fileid : string, data : FileData) : number { let nassets = 0; - let filediv = $('#'+this.getFileDivId(fileid)).empty(); // TODO: check fmt w/h/etc limits // TODO: defer editor creation // TODO: only refresh when needed @@ -1149,7 +1173,7 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext { // is this a NES CHR? let node = new pixed.FileDataNode(projectWindows, fileid); const neschrfmt = {w:8,h:8,bpp:1,count:(data.length>>4),brev:true,np:2,pofs:8,remap:[0,1,2,4,5,6,7,8,9,10,11,12]}; // TODO - this.addPixelEditor(filediv, node, neschrfmt); + this.addPixelEditor(this.ensureFileDiv(fileid), node, neschrfmt); this.registerAsset("charmap", node, true); nassets++; } else if (typeof data === 'string') { @@ -1168,19 +1192,19 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext { node = node.addRight(new pixed.NESNametableConverter(this)); // TODO? node = node.addRight(new pixed.Palettizer(this, {w:8,h:8,bpp:4})); // TODO? const fmt = {w:8*32,h:8*30,count:1}; // TODO - node = node.addRight(new pixed.CharmapEditor(this, newDiv(filediv), fmt)); + node = node.addRight(new pixed.CharmapEditor(this, newDiv(this.ensureFileDiv(fileid)), fmt)); this.registerAsset("nametable", first, true); nassets++; } // is this a bitmap? else if (frag.fmt.w > 0 && frag.fmt.h > 0) { - this.addPixelEditor(filediv, node, frag.fmt); + this.addPixelEditor(this.ensureFileDiv(fileid), node, frag.fmt); this.registerAsset("charmap", first, true); nassets++; } // is this a palette? else if (frag.fmt.pal) { - this.addPaletteEditor(filediv, node, frag.fmt); + this.addPaletteEditor(this.ensureFileDiv(fileid), node, frag.fmt); this.registerAsset("palette", first, false); nassets++; } @@ -1200,28 +1224,28 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext { // TODO: recreate editors when refreshing // TODO: look for changes, not moveCursor refresh(moveCursor : boolean) { + // clear and refresh all files/nodes? if (moveCursor) { this.maindiv.empty(); this.clearAssets(); - current_project.iterateFiles((id, data) => { - var divid = this.getFileDivId(id); - var filediv = newDiv(this.maindiv, 'asset_file'); - var header = newDiv(filediv, 'asset_file_header').text(id); - var body = newDiv(filediv).attr('id',divid).addClass('disable-select'); + current_project.iterateFiles((fileid, data) => { try { - var nassets = this.refreshAssetsInFile(id, data); - if (nassets == 0) filediv.hide(); + var nassets = this.refreshAssetsInFile(fileid, data); } catch (e) { console.log(e); - filediv.text(e+""); // TODO: error msg? + this.ensureFileDiv(fileid).text(e+""); // TODO: error msg? } }); console.log("Found " + this.rootnodes.length + " assets"); this.deferrednodes.forEach((node) => { node.refreshRight(); }); this.deferrednodes = []; } else { + // only refresh nodes if not actively editing + // since we could be in the middle of an operation that hasn't been committed for (var node of this.rootnodes) { - node.refreshRight(); + if (node !== this.getCurrentEditNode()) { + node.refreshRight(); + } } } } diff --git a/src/worker/asmmain.js b/src/worker/asmmain.js new file mode 100644 index 00000000..1354a15a --- /dev/null +++ b/src/worker/asmmain.js @@ -0,0 +1,38 @@ + +var asmmod = require('../../gen/worker/assembler'); +var fs = require('fs'); + +var args = process.argv; +if (args.length < 3) { + console.log("Usage: asmmain config.json [file.asm...]"); + process.exit(1); +} + +// load JSON config +var configFilename = args[2]; +var configFile = fs.readFileSync(configFilename, 'utf8'); +var configJson = JSON.parse(configFile); + +var binout = []; +for (var fi=3; fi