1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-06-18 10:29:37 +00:00

electron: sync w/ filesystem, no more replaceSelection()

This commit is contained in:
Steven Hugg 2020-08-29 17:30:39 -05:00
parent 8b801e39df
commit ba73c5f569
9 changed files with 53 additions and 23 deletions

View File

@ -41,7 +41,6 @@ process.once('loaded', () => {
// from electron.js: file changed // from electron.js: file changed
ipcRenderer.on('fileChanged', (event, data) => { ipcRenderer.on('fileChanged', (event, data) => {
var path = data.path; var path = data.path;
console.log('fileChanged', path);
window.reloadWorkspaceFile(path); window.reloadWorkspaceFile(path);
}); });
}); });

View File

@ -197,7 +197,7 @@ Sentry.init({
<div class="emulator disable-select" id="emulator"> <div class="emulator disable-select" id="emulator">
<!-- replay slider --> <!-- replay slider -->
<div id="replaydiv" class="replaydiv" style="display:none;color:#ccc;text-align:left"> <div id="replaydiv" class="replaydiv" style="display:none;color:#ccc;text-align:left">
<div style="display:flex; grid-gap:1em"> <div style="display:grid; grid-template-columns: 3em 3em auto 3em; grid-gap: 1em">
<button id="replay_back" class="btn" title="Back one frame"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></button> <button id="replay_back" class="btn" title="Back one frame"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></button>
<div> <div>
Frame<br> Frame<br>
@ -205,8 +205,7 @@ Sentry.init({
</div> </div>
<input type="range" min="0" max="0" value="0" class="slider" id="replayslider"> <input type="range" min="0" max="0" value="0" class="slider" id="replayslider">
<button id="replay_fwd" class="btn" title="Ahead one frame"><span class="glyphicon glyphicon-forward" aria-hidden="true"></span></button> <button id="replay_fwd" class="btn" title="Ahead one frame"><span class="glyphicon glyphicon-forward" aria-hidden="true"></span></button>
</div>
<div style="display:flex; grid-gap:1em" id="clockdiv">
<button id="clock_back" class="btn" title="Back one step"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></button> <button id="clock_back" class="btn" title="Back one step"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></button>
<div> <div>
Step<br> Step<br>

View File

@ -24,33 +24,44 @@ function showError(msg, detail) {
// file watcher // file watcher
class Workspace { class Workspace {
constructor(directory, meta, wnd) { constructor(directory, meta) {
this.directory = directory; this.directory = directory;
this.mainfile = meta.mainfile; this.mainfile = meta.mainfile;
this.platform = meta.platform; this.platform = meta.platform;
if (!this.mainfile) throw new Error(`The "mainfile" key is missing in ${WSMETA_FILENAME}.`) if (!this.mainfile) throw new Error(`The "mainfile" key is missing in ${WSMETA_FILENAME}.`)
if (!this.platform) throw new Error(`The "platform" key is missing in ${WSMETA_FILENAME}.`) if (!this.platform) throw new Error(`The "platform" key is missing in ${WSMETA_FILENAME}.`)
var mainfilepath = modpath.join(directory, this.mainfile); var mainfilepath = this.getMainFilePath();
if (!fs.existsSync(mainfilepath)) throw new Error(`The file "${mainfilepath}" is missing.`); if (!fs.existsSync(mainfilepath)) throw new Error(`The file "${mainfilepath}" is missing.`);
this.watcher = chokidar.watch(mainfilepath); console.log("workspace opened", this.directory, this.mainfile);
}
getMainFilePath() {
return modpath.join(this.directory, this.mainfile);
}
close() {
this.unwatch();
console.log("workspace closed", this.directory, this.mainfile);
}
watch(wnd) {
this.watcher = chokidar.watch(this.directory, {
awaitWriteFinish: false
});
this.watcher.on('all', (event, path) => { this.watcher.on('all', (event, path) => {
console.log(event, path);
switch (event) { switch (event) {
case 'add':
case 'change': case 'change':
console.log(event, path);
wnd.webContents.send('fileChanged', { wnd.webContents.send('fileChanged', {
path: modpath.relative(this.directory, path), path: modpath.relative(this.directory, path),
}); });
break; break;
} }
}); });
console.log("workspace opened", this.directory, this.mainfile); console.log("watching workspace");
} }
close() { unwatch() {
if (this.watcher) { if (this.watcher) {
this.watcher.close(); this.watcher.close();
this.watcher = null; this.watcher = null;
console.log("workspace closed", this.directory, this.mainfile); console.log("un-watching workspace");
} }
} }
} }
@ -105,6 +116,11 @@ function openWorkspace(wnd, ws) {
}); });
} }
function getActiveWorkspace() {
var wnd = BrowserWindow.getFocusedWindow();
return wnd && wnd.workspace;
}
// TODO: doesn't work if browser window reloads itself // TODO: doesn't work if browser window reloads itself
function reloadCurrentWindow() { function reloadCurrentWindow() {
var wnd = BrowserWindow.getFocusedWindow(); var wnd = BrowserWindow.getFocusedWindow();
@ -167,7 +183,7 @@ function openWorkspaceWindow(wspath) {
} }
} else { } else {
console.log(meta); console.log(meta);
var ws = new Workspace(wspath, meta, wnd); var ws = new Workspace(wspath, meta);
openWorkspace(wnd, ws); openWorkspace(wnd, ws);
app.addRecentDocument(wspath); app.addRecentDocument(wspath);
} }
@ -228,7 +244,7 @@ function buildMenu() {
submenu: [ submenu: [
{ {
label: 'New Playground', label: 'New Playground',
click: openDefaultWorkspace, click: createWindow,
accelerator: 'CmdOrCtrl+N', accelerator: 'CmdOrCtrl+N',
}, },
{ {
@ -395,6 +411,16 @@ app.on('activate', () => {
} }
}) })
app.on('browser-window-focus', (e) => {
var ws = e.sender.workspace;
if (ws) ws.unwatch();
})
app.on('browser-window-blur', (e) => {
var ws = e.sender.workspace;
if (ws) ws.watch(e.sender);
})
app.on('open-file', (event, path) => { app.on('open-file', (event, path) => {
openWorkspaceWindow(path); openWorkspaceWindow(path);
}) })

View File

@ -309,7 +309,7 @@ if (window.location.host.endsWith('8bitworkshop.com')) {
<div class="emulator disable-select" id="emulator"> <div class="emulator disable-select" id="emulator">
<!-- replay slider --> <!-- replay slider -->
<div id="replaydiv" class="replaydiv" style="display:none;color:#ccc;text-align:left"> <div id="replaydiv" class="replaydiv" style="display:none;color:#ccc;text-align:left">
<div style="display:flex; grid-gap:1em"> <div style="display:grid; grid-template-columns: 3em 3em auto 3em; grid-gap: 1em">
<button id="replay_back" class="btn" title="Back one frame"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></button> <button id="replay_back" class="btn" title="Back one frame"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></button>
<div> <div>
Frame<br> Frame<br>
@ -317,8 +317,7 @@ if (window.location.host.endsWith('8bitworkshop.com')) {
</div> </div>
<input type="range" min="0" max="0" value="0" class="slider" id="replayslider"> <input type="range" min="0" max="0" value="0" class="slider" id="replayslider">
<button id="replay_fwd" class="btn" title="Ahead one frame"><span class="glyphicon glyphicon-forward" aria-hidden="true"></span></button> <button id="replay_fwd" class="btn" title="Ahead one frame"><span class="glyphicon glyphicon-forward" aria-hidden="true"></span></button>
</div>
<div style="display:flex; grid-gap:1em" id="clockdiv">
<button id="clock_back" class="btn" title="Back one step"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></button> <button id="clock_back" class="btn" title="Back one step"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></button>
<div> <div>
Step<br> Step<br>

View File

@ -1,5 +1,5 @@
--- index.html 2020-08-29 13:22:47.000000000 -0500 --- index.html 2020-08-29 17:52:46.000000000 -0500
+++ electron.html 2020-08-29 13:22:40.000000000 -0500 +++ electron.html 2020-08-29 17:54:08.000000000 -0500
@@ -3,18 +3,7 @@ @@ -3,18 +3,7 @@
<head> <head>
@ -193,7 +193,7 @@
<!-- 8bitworkshop logo --> <!-- 8bitworkshop logo -->
<span class="logo-gradient hidden-xs hidden-sm hidden-md pull-right" style="margin-left:auto" onclick="window.open('/','_8bitws');">8bitworkshop</span> <span class="logo-gradient hidden-xs hidden-sm hidden-md pull-right" style="margin-left:auto" onclick="window.open('/','_8bitws');">8bitworkshop</span>
@@ -479,73 +367,6 @@ @@ -478,73 +366,6 @@
</div> </div>
</div> </div>
</div> </div>

View File

@ -298,6 +298,7 @@ export class CodeProject {
} }
updateFile(path:string, text:FileData) { updateFile(path:string, text:FileData) {
if (this.filedata[path] == text) return; // unchanged, don't update
this.updateFileInStore(path, text); // TODO: isBinary this.updateFileInStore(path, text); // TODO: isBinary
this.filedata[path] = text; this.filedata[path] = text;
if (this.okToSend() && this.mainPath) { if (this.okToSend() && this.mainPath) {

View File

@ -2280,8 +2280,11 @@ export function getElectronFile(url:string, success:(text:string|Uint8Array)=>vo
} }
} }
export function reloadWorkspaceFile(path: string) { export function reloadWorkspaceFile(path: string) {
var datatype = typeof current_project.filedata[path] == 'string' ? 'text' : 'arraybuffer'; var oldval = current_project.filedata[path];
projectWindows.updateFile(path, getWorkspaceFile(path, datatype)); if (oldval != null) {
var datatype = typeof oldval == 'string' ? 'text' : 'arraybuffer';
projectWindows.updateFile(path, getWorkspaceFile(path, datatype));
}
} }
function writeOutputROMFile() { function writeOutputROMFile() {
if (isElectronWorkspace && current_output instanceof Uint8Array) { if (isElectronWorkspace && current_output instanceof Uint8Array) {

View File

@ -183,11 +183,14 @@ export class SourceEditor implements ProjectView {
var i,j; var i,j;
var oldtext = this.editor.getValue(); var oldtext = this.editor.getValue();
if (oldtext != text) { if (oldtext != text) {
this.editor.setValue(text);
/*
// find minimum range to undo // find minimum range to undo
for (i=0; i<oldtext.length && i<text.length && text[i] == oldtext[i]; i++) { } for (i=0; i<oldtext.length && i<text.length && text[i] == oldtext[i]; i++) { }
for (j=0; j<oldtext.length && j<text.length && text[text.length-1-j] == oldtext[oldtext.length-1-j]; j++) { } for (j=0; j<oldtext.length && j<text.length && text[text.length-1-j] == oldtext[oldtext.length-1-j]; j++) { }
//console.log(i,j,oldtext.substring(i,oldtext.length-j)); //console.log(i,j,oldtext.substring(i,oldtext.length-j));
this.replaceSelection(i, oldtext.length-j, text.substring(i, text.length-j)); // calls setCode() this.replaceSelection(i, oldtext.length-j, text.substring(i, text.length-j)); // calls setCode()
*/
// clear history if setting empty editor // clear history if setting empty editor
if (oldtext == '') { if (oldtext == '') {
this.editor.clearHistory(); this.editor.clearHistory();

View File

@ -3,7 +3,7 @@
import $ = require("jquery"); import $ = require("jquery");
import { CodeProject } from "./project"; import { CodeProject } from "./project";
import { WorkerError, FileData } from "../common/workertypes"; import { WorkerError, FileData } from "../common/workertypes";
import { ProjectView } from "./views"; import { ProjectView, SourceEditor } from "./views";
import { getFilenamePrefix, getFilenameForPath } from "../common/util"; import { getFilenamePrefix, getFilenameForPath } from "../common/util";
type WindowCreateFunction = (id:string) => ProjectView; type WindowCreateFunction = (id:string) => ProjectView;