From d62bafae487e76b4948ac584ccfe07a51d09f295 Mon Sep 17 00:00:00 2001 From: Xuan Sang LE Date: Thu, 21 May 2020 21:56:16 +0200 Subject: [PATCH] correct more app --- LuaPlayground/build/debug/main.js | 102 +++++---- LuaPlayground/build/release/LuaPlayground.zip | Bin 0 -> 218265 bytes LuaPlayground/coffees/main.coffee | 68 +++--- LuaPlayground/project.apj | 1 - LuaPlayground/project.json | 8 + OpenPage/README.md | 36 ++- OpenPage/assets/OpenPage.md | 14 -- OpenPage/build/debug/main.js | 117 +++++++++- OpenPage/coffees/main.coffee | 1 + OpenPage/project.apj | 1 - OpenPage/project.json | 8 + Preview/build/debug/main.css | 16 +- Preview/build/debug/main.js | 214 ++++++++++++++---- Preview/build/debug/package.json | 2 +- Preview/build/debug/scheme.html | 13 +- Preview/build/release/Preview.zip | Bin 1209740 -> 1214179 bytes Preview/main.coffee | 168 ++++++++++---- Preview/main.css | 16 +- Preview/package.json | 2 +- Preview/scheme.html | 13 +- TinyEditor/README.md | 21 -- TinyEditor/build/debug/README.md | 21 -- TinyEditor/build/debug/main.css | 2 - TinyEditor/build/debug/main.js | 114 +++++----- TinyEditor/build/debug/package.json | 8 +- TinyEditor/build/release/TinyEditor.zip | Bin 0 -> 4819 bytes TinyEditor/coffees/main.coffee | 88 +++---- TinyEditor/css/main.css | 2 - TinyEditor/package.json | 8 +- TinyEditor/project.apj | 1 - TinyEditor/project.json | 8 + packages.json | 20 +- 32 files changed, 710 insertions(+), 383 deletions(-) create mode 100644 LuaPlayground/build/release/LuaPlayground.zip delete mode 100644 LuaPlayground/project.apj create mode 100644 LuaPlayground/project.json delete mode 100644 OpenPage/assets/OpenPage.md delete mode 100644 OpenPage/project.apj create mode 100644 OpenPage/project.json create mode 100644 TinyEditor/build/release/TinyEditor.zip delete mode 100644 TinyEditor/project.apj create mode 100644 TinyEditor/project.json diff --git a/LuaPlayground/build/debug/main.js b/LuaPlayground/build/debug/main.js index 9cb6762..5ce093f 100644 --- a/LuaPlayground/build/debug/main.js +++ b/LuaPlayground/build/debug/main.js @@ -1,4 +1,5 @@ (function() { + void 0; var DataViewer, LuaPlayground, PointCloudViewer; DataViewer = class DataViewer { @@ -175,7 +176,7 @@ } - // point clound render + // point clound render render() { var end, j, len, path, ref, start, v; this.drawGrid(20, "#DBDBDB"); // 20 px @@ -204,42 +205,44 @@ } main() { - var me; - me = this; this.datarea = this.find("editorea"); this.output = this.find("output"); this.editor = ace.edit(this.datarea); this.editor.setOptions({ enableBasicAutocompletion: true, enableLiveAutocompletion: true, - fontSize: "10pt" + highlightActiveLine: true, + highlightSelectedWord: true, + behavioursEnabled: true, + wrap: true, + fontSize: "11pt", + showInvisibles: true }); this.editor.getSession().setUseWrapMode(true); this.editor.session.setMode("ace/mode/lua"); this.editor.setTheme("ace/theme/monokai"); - this.on("vboxchange", function() { - return me.editor.resize(); + this.on("vboxchange", () => { + return this.editor.resize(); }); - (this.find("log-clear")).set("onbtclick", function(e) { - return me.log("clean"); + (this.find("log-clear")).set("onbtclick", (e) => { + return this.log("clean"); }); - (this.find("code-run")).set("onbtclick", function(e) { - return me.run(); + (this.find("code-run")).set("onbtclick", (e) => { + return this.run(); }); - (this.find("code-stop")).set("onbtclick", function(e) { - if (me.socket) { - return me.socket.close(); + (this.find("code-stop")).set("onbtclick", (e) => { + if (this.socket) { + return this.socket.close(); } }); this.socket = null; - return this.bindKey("CTRL-R", function() { - return me.run(); + return this.bindKey("CTRL-R", () => { + return this.run(); }); } menu() { - var me, menu; - me = this; + var menu; menu = [ { text: "__(Code)", @@ -250,8 +253,8 @@ shortcut: "C-R" } ], - onmenuselect: function(e) { - return me.run(); + onchildselect: (e) => { + return this.run(); } } ]; @@ -270,39 +273,42 @@ } run() { - var me, value; - me = this; + var value; value = this.editor.getValue().trim(); if (!(value && value !== "")) { return; } - this.socket = this.stream(); - this.socket.onopen = function() { - //send data to server - return me.socket.send(JSON.stringify({ - code: value - })); - }; - this.socket.onmessage = function(e) { - var err, obj; - if (!e.data) { - return; - } - try { - obj = JSON.parse(e.data); - if (!me.view(obj)) { - return me.log("INFO", e.data); + return this.stream().then((s) => { + this.socket = s; + this.socket.onopen = () => { + //send data to server + return this.socket.send(JSON.stringify({ + code: value + })); + }; + this.socket.onmessage = (e) => { + var err, obj; + if (!e.data) { + return; } - } catch (error) { - err = error; - me.log("INFO", e.data); - return console.log(err); - } - }; - return this.socket.onclose = function() { - me.socket = null; - return console.log("socket closed"); - }; + try { + obj = JSON.parse(e.data); + if (!this.view(obj)) { + return this.log("INFO", e.data); + } + } catch (error) { + err = error; + this.log("INFO", e.data); + return console.log(err); + } + }; + return this.socket.onclose = () => { + this.socket = null; + return console.log("socket closed"); + }; + }).catch((e) => { + return this.error(__("Unable to get websocket stream")); + }); } view(obj) { @@ -330,7 +336,7 @@ }; - LuaPlayground.dependencies = ["ace/ace"]; + LuaPlayground.dependencies = ["os://scripts/ace/ace.js"]; this.OS.register("LuaPlayground", LuaPlayground); diff --git a/LuaPlayground/build/release/LuaPlayground.zip b/LuaPlayground/build/release/LuaPlayground.zip new file mode 100644 index 0000000000000000000000000000000000000000..0087b1450a6fa08c8c19dd81b83c7303f13bc3c5 GIT binary patch literal 218265 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 - me = @ @datarea = @find "editorea" @output = @find "output" @.editor = ace.edit @datarea @.editor.setOptions { enableBasicAutocompletion: true, enableLiveAutocompletion: true, - fontSize: "10pt" + highlightActiveLine: true, + highlightSelectedWord: true, + behavioursEnabled: true, + wrap: true, + fontSize: "11pt", + showInvisibles: true } @editor.getSession().setUseWrapMode true @editor.session.setMode "ace/mode/lua" @editor.setTheme "ace/theme/monokai" - @on "vboxchange", () -> - me.editor.resize() - (@find "log-clear").set "onbtclick", (e) -> - me.log "clean" - (@find "code-run").set "onbtclick", (e) -> - me.run() + @on "vboxchange", () => + @editor.resize() + (@find "log-clear").set "onbtclick", (e) => + @log "clean" + (@find "code-run").set "onbtclick", (e) => + @run() - (@find "code-stop").set "onbtclick", (e) -> - me.socket.close() if me.socket + (@find "code-stop").set "onbtclick", (e) => + @socket.close() if @socket @socket = null - @bindKey "CTRL-R", () -> me.run() + @bindKey "CTRL-R", () => @run() menu: () -> - me = @ menu = [{ text: "__(Code)", child: [ { text: "__(Run)", dataid: "#{@name}-Run", shortcut: "C-R" } ], - onmenuselect: (e) -> me.run() + onchildselect: (e) => @run() }] menu @@ -190,26 +193,27 @@ class LuaPlayground extends this.OS.GUI.BaseApplication ($ @output).scrollTop @output.scrollHeight run: () -> - me = @ value = @editor.getValue().trim() return unless value and value isnt "" - @socket = @stream() - @socket.onopen = () -> - #send data to server - me.socket.send( JSON.stringify { code: value } ) - - @socket.onmessage = (e) -> - return unless e.data - try - obj = JSON.parse e.data - me.log "INFO", e.data unless me.view obj - catch err - me.log "INFO", e.data - console.log err - - @socket.onclose = () -> - me.socket = null - console.log "socket closed" + @stream().then (s) => + @socket = s + @socket.onopen = () => + #send data to server + @socket.send( JSON.stringify { code: value } ) + + @socket.onmessage = (e) => + return unless e.data + try + obj = JSON.parse e.data + @log "INFO", e.data unless @view obj + catch err + @log "INFO", e.data + console.log err + + @socket.onclose = () => + @socket = null + console.log "socket closed" + .catch (e) => @error __("Unable to get websocket stream") view: (obj) -> return false unless obj and obj.type and @[obj.type] @@ -226,5 +230,5 @@ class LuaPlayground extends this.OS.GUI.BaseApplication cleanup: (e)-> @socket.close() if @socket -LuaPlayground.dependencies = ["ace/ace"] +LuaPlayground.dependencies = ["os://scripts/ace/ace.js"] this.OS.register "LuaPlayground", LuaPlayground diff --git a/LuaPlayground/project.apj b/LuaPlayground/project.apj deleted file mode 100644 index e8e147d..0000000 --- a/LuaPlayground/project.apj +++ /dev/null @@ -1 +0,0 @@ -{"name":"LuaPlayground","root":"home://myws/antosdk-apps/LuaPlayground","css":["css/main.css"],"javascripts":["javascripts/paper-core.min.js"],"coffees":["coffees/main.coffee"],"copies":["assets/scheme.html","package.json","README.md"]} \ No newline at end of file diff --git a/LuaPlayground/project.json b/LuaPlayground/project.json new file mode 100644 index 0000000..abaccc8 --- /dev/null +++ b/LuaPlayground/project.json @@ -0,0 +1,8 @@ +{ + "name": "LuaPlayground", + "root": "home://workspace/antosdk-apps/LuaPlayground", + "css": ["css/main.css"], + "javascripts": ["javascripts/paper-core.min.js"], + "coffees": ["coffees/main.coffee"], + "copies": ["assets/scheme.html", "package.json", "README.md"] +} \ No newline at end of file diff --git a/OpenPage/README.md b/OpenPage/README.md index 9dcf530..d9dfca7 100644 --- a/OpenPage/README.md +++ b/OpenPage/README.md @@ -1,24 +1,14 @@ -# OpenPage -This is an example project, generated by AntOS Development Kit +![](https://os.lxsang.me/repo/OpenPage/OpenPage.png) +# OpenPage: ODT (Open Document Text) editor alpha +**OpenPage** is an AntOS application developed in-browser using AntOSDK. It is a Pure Javascript based rich text editor compatible with Open Document Format. -## Howto - -1. Open the project.apj file with AntOSDK (simply double Click on it) -2. Modify the UI in *assets/scheme.html* -3. Modify application code in *coffees/main.coffee* -4. Modify CSS style in *css/main.css* -5. Other files need to be copied: put in to assets - -## Set up build target - -Click **Menu> Build > Build Option** or simply hit **ALT-Y** - -In the build options dialog, add or remove files that need to be -included into the build - -Click **Save** - -## Build application -* To build: **Menu > Build > Build** or **ALT-C** -* To build and run: **Menu > Build > Build and Run** or **CTRL-R** -* To release: **Menu > Build > Build release** or **ALT-P** \ No newline at end of file +**Feature:** +* Open, view and edit *.odt* documents +* Offer various formatting style to text +* Define and apply paragraph styles +* Insert link, image +* Embeded fonts +* Save documents as ODF format so that it can be compatible with desktop applications like Open Office + +**Credit:** +OpenPage is heavily based on the WebODF javascript library: https://webodf.org \ No newline at end of file diff --git a/OpenPage/assets/OpenPage.md b/OpenPage/assets/OpenPage.md deleted file mode 100644 index d9dfca7..0000000 --- a/OpenPage/assets/OpenPage.md +++ /dev/null @@ -1,14 +0,0 @@ -![](https://os.lxsang.me/repo/OpenPage/OpenPage.png) -# OpenPage: ODT (Open Document Text) editor alpha -**OpenPage** is an AntOS application developed in-browser using AntOSDK. It is a Pure Javascript based rich text editor compatible with Open Document Format. - -**Feature:** -* Open, view and edit *.odt* documents -* Offer various formatting style to text -* Define and apply paragraph styles -* Insert link, image -* Embeded fonts -* Save documents as ODF format so that it can be compatible with desktop applications like Open Office - -**Credit:** -OpenPage is heavily based on the WebODF javascript library: https://webodf.org \ No newline at end of file diff --git a/OpenPage/build/debug/main.js b/OpenPage/build/debug/main.js index 9a9b769..df39f39 100644 --- a/OpenPage/build/debug/main.js +++ b/OpenPage/build/debug/main.js @@ -1,4 +1,5 @@ (function() { + void 0; var FormatDialog, HyperLinkDialog, OpenPage; OpenPage = class OpenPage extends this.OS.GUI.BaseApplication { @@ -114,7 +115,7 @@ newdoc() { var blank; - blank = `${(this.meta().path)}/blank.odt`; + blank = `${this.meta().path}/blank.odt`; return this.open(blank, true); } @@ -1167,7 +1168,119 @@ }; - FormatDialog.scheme = "\n \n
\n \n
\n \n
\n \n
\n
\n \n \n
\n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n
\n
\n \n
\n \n
\n \n \n
\n \n \n
\n \n \n
\n \n \n
\n
\n \n
\n \n
\n \n
\n \n \n \n \n \n \n \n
\n
\n \n
\n
\n
\n
\n \n
\n \n
\n \n
\n \n \n
\n \n \n
\n
\n
\n \n
\n \n
\n
\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce laoreet diam vestibulum massa malesuada quis dignissim libero blandit. Duis sit amet volutpat nisl.

\n
\n
\n
\n \n
\n \n
\n \n
\n \n
\n
\n
\n
"; + FormatDialog.scheme = ` + +
+ +
+ +
+ +
+
+ + +
+ + + + + + + + +
+
+
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+
+
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+
+ +
+ +
+ +
+ + + + + + + +
+
+ +
+
+
+
+ +
+ +
+ +
+ + +
+ + +
+
+
+ +
+ +
+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce laoreet diam vestibulum massa malesuada quis dignissim libero blandit. Duis sit amet volutpat nisl.

+
+
+
+ +
+ +
+ +
+ +
+
+
+
`; }).call(this); diff --git a/OpenPage/coffees/main.coffee b/OpenPage/coffees/main.coffee index 4fdd212..4a11b9c 100644 --- a/OpenPage/coffees/main.coffee +++ b/OpenPage/coffees/main.coffee @@ -66,6 +66,7 @@ class OpenPage extends this.OS.GUI.BaseApplication newdoc: () -> blank = "#{@meta().path}/blank.odt" @open blank, true + open: (p,b) -> me = @ @pathAsDataURL(p) diff --git a/OpenPage/project.apj b/OpenPage/project.apj deleted file mode 100644 index 24a8569..0000000 --- a/OpenPage/project.apj +++ /dev/null @@ -1 +0,0 @@ -{"name":"OpenPage","root":"home://workspace/OpenPage","css":["css/main.css","css/dialog.css"],"javascripts":["javascripts/webodf.js","javascripts/EditorSession.js"],"coffees":["coffees/main.coffee","coffees/dialogs.coffee"],"copies":["assets/scheme.html","package.json","assets/OpenPage.md","assets/icon.png","assets/blank.odt"]} \ No newline at end of file diff --git a/OpenPage/project.json b/OpenPage/project.json new file mode 100644 index 0000000..ffd90a5 --- /dev/null +++ b/OpenPage/project.json @@ -0,0 +1,8 @@ +{ + "name": "OpenPage", + "root": "home://workspace/antosdk-apps/OpenPage", + "css": ["css/main.css", "css/dialog.css"], + "javascripts": ["javascripts/webodf.js", "javascripts/EditorSession.js"], + "coffees": ["coffees/main.coffee", "coffees/dialogs.coffee"], + "copies": ["assets/scheme.html", "package.json", "assets/icon.png", "assets/blank.odt"] +} \ No newline at end of file diff --git a/Preview/build/debug/main.css b/Preview/build/debug/main.css index fb523a2..555c20c 100644 --- a/Preview/build/debug/main.css +++ b/Preview/build/debug/main.css @@ -8,20 +8,26 @@ afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] div[data-i background-repeat: repeat; } -afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] div[data-id = "status"] +afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] afx-hbox[data-id = "statcontainer"] { background-color: transparent; - border-top: 1px solid #cbcbcb; - padding-left: 10px; - padding-top: 3px; + border-bottom: 1px solid #cbcbcb; +} +afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] afx-hbox[data-id = "statcontainer"] button, +afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] afx-hbox[data-id = "statcontainer"] input +{ + height: 24px; } - afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] canvas{ margin-left: auto; margin-right: auto; display: block; } +afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] div.pdf-page { + margin-bottom: 5px; +} + afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] div[data-id = "view"].image { display: flex; diff --git a/Preview/build/debug/main.js b/Preview/build/debug/main.js index f3aa5c6..62b4600 100644 --- a/Preview/build/debug/main.js +++ b/Preview/build/debug/main.js @@ -25,18 +25,62 @@ } main() { + this.currfile = void 0; if (this.args && this.args.length > 0) { this.currfile = this.args[0].path.asFileHandle(); } this.view = this.find("view"); this.status = this.find("status"); + this.zoom = this.find("zoom"); + this.btnext = this.find("btnext"); + this.btprev = this.find("btprev"); + this.btreset = this.find("btreset"); + this.txtpage = this.find("txtpage"); + this.zoom.set("onchange", (e) => { + return this.setViewScale(e.data); + }); + this.btreset.set("onbtclick", (e) => { + this.zoom.set("value", 100); + return this.setViewScale(100); + }); + this.btnext.set("onbtclick", (e) => { + var val; + val = parseInt($(this.txtpage).val()); + if (isNaN(val)) { + return; + } + $(this.txtpage).val(val + 1); + return this.gotoPage(); + }); + this.btprev.set("onbtclick", (e) => { + var val; + val = parseInt($(this.txtpage).val()); + if (isNaN(val)) { + return; + } + $(this.txtpage).val(val - 1); + return this.gotoPage(); + }); + $(this.txtpage).keyup((e) => { + if (e.which !== 13) { + return; + } + if (!this.pdf) { + return; + } + return this.gotoPage(); + }); PDFJS.workerSrc = `${this.path()}/pdf.worker.js`.asFileHandle().getlink(); + this.pdf = void 0; + this.img = void 0; this.bindKey("ALT-O", () => { return this.actionFile(`${this.name}-Open`); }); this.bindKey("CTRL-X", () => { return this.actionFile(`${this.name}-Close`); }); + this.zoom.set("max", 200); + this.zoom.set("value", 100); return this.open(this.currfile); } @@ -49,25 +93,46 @@ } return file.onready().then(() => { file.info.size = (file.info.size / 1024).toFixed(2); - return this.renderFile(file); + return this.renderFile(); }).catch((err) => { return this.error(__("File not found {0}", file.path), err); }); } - renderFile(file) { - var mime; - mime = file.info.mime; - if (!mime) { + gotoPage() { + var val; + if (!this.pdf) { + return; + } + val = parseInt($(this.txtpage).val()); + if (isNaN(val)) { + return; + } + if (val <= 0 || val > this.pdf.numPages) { return; } ($(this.view)).empty(); + return this.renderPDFPages(val, this.zoom.get("value") / 100, false).catch((e) => { + return this.error(__("Unable to render page {0}", val), e); + }); + } + + renderFile() { + var mime; + mime = this.currfile.info.mime; + if (!mime) { + return; + } + this.pdf = void 0; + this.img = void 0; + ($(this.view)).empty(); + this.zoom.set("value", 100); if (mime.match(/^[^\/]+\/.*pdf.*/g)) { - return this.renderPDF(file); + return this.renderPDF(); } else if (mime.match(/image\/.*svg.*/g)) { - return this.renderSVG(file); + return this.renderSVG(); } else if (mime.match(/image\/.*/g)) { - return this.renderImage(file); + return this.renderImage(); } else { return this.notify(__("Mime type {0} is not supported", file.info.mime)); } @@ -77,44 +142,92 @@ return ($(this.status)).html(t); } - renderPDF(file) { - return this.load(new Promise((resolve, reject) => { + setViewScale(value) { + var canvas, context, h, mime, scale, w; + if (!this.currfile) { + return; + } + mime = this.currfile.info.mime; + scale = value / 100; + if (mime.match(/^[^\/]+\/.*pdf.*/g)) { + if (!this.pdf) { + return; + } + ($(this.view)).empty(); + return this.load(this.renderPDFPages(1, scale)).catch((e) => { + return this.error(__("Unable to set view scale"), e); + }); + } else if (mime.match(/image\/.*svg.*/g)) { + return $($(this.view).children()[0]).css("width", `${Math.round(value)}%`).css("height", `${Math.round(value)}%`); + } else if (mime.match(/image\/.*/g)) { + if (!this.img) { + return; + } + canvas = $(this.view).children()[0]; + context = canvas.getContext('2d'); + w = this.img.width * scale; + h = this.img.height * scale; + canvas.height = h; + canvas.width = w; + context.clearRect(0, 0, canvas.width, canvas.height); + context.scale(scale, scale); + return context.drawImage(this.img, 0, 0); + } + } + + renderPDFPages(n, scale, recursive) { + return new Promise((resolve, reject) => { var status; - status = `${file.info.name} (${file.info.size} Kb)`; - return file.read("binary").then((d) => { + status = `${this.currfile.info.name} (${this.currfile.info.size} Kb)`; + if (n > this.pdf.numPages) { + return resolve(); + } + return this.pdf.getPage(n).then((page) => { + var canvas, context, div, renderContext, viewport; + viewport = page.getViewport(scale); + div = ($("
")).attr("id", "page-" + (page.pageIndex + 1)).attr("scale", scale).addClass("pdf-page"); + ($(this.view)).append(div); + canvas = ($(""))[0]; + div.append(canvas); + context = canvas.getContext('2d'); + canvas.height = viewport.height; + canvas.width = viewport.width; + renderContext = { + canvasContext: context, + viewport: viewport + }; + page.render(renderContext); + page._canvas = canvas; + this.setStatus(`${status} - page ${n}/${this.pdf.numPages} loaded`); + if (recursive) { + return this.renderPDFPages(n + 1, scale, recursive).then(function() { + return resolve(); + }).catch(function(e) { + return reject(e); + }); + } else { + return resolve(); + } + }).catch(function(e) { + return reject(e); + }); + }); + } + + renderPDF() { + return this.load(new Promise((resolve, reject) => { + return this.currfile.read("binary").then((d) => { ($(this.view)).removeClass(); return PDFJS.getDocument({ data: d }).then((pdf) => { - var fn; - fn = (p) => { - if (p > pdf.numPages) { - this.setStatus(`${status} - loaded`); - return resolve(); - } - return pdf.getPage(p).then((page) => { - var canvas, context, div, renderContext, scale, viewport; - scale = 1.5; - viewport = page.getViewport(scale); - div = ($("
")).attr("id", "page-" + (page.pageIndex + 1)); - ($(this.view)).append(div); - canvas = ($(""))[0]; - div.append(canvas); - context = canvas.getContext('2d'); - canvas.height = viewport.height; - canvas.width = viewport.width; - renderContext = { - canvasContext: context, - viewport: viewport - }; - page.render(renderContext); - this.setStatus(`${status} - ${p}/${pdf.numPages} loaded`); - return fn(p + 1); - }).catch(function(e) { - return reject(e); - }); - }; - return fn(1); + this.pdf = pdf; + return this.renderPDFPages(1, 1, false).then(() => { + $(this.txtpage).val("1"); + return resolve(); + }).catch(function(e) { + return reject(e); + }); }).catch(function(e) { return reject(e); }); @@ -122,23 +235,23 @@ return reject(e); }); })).catch((e) => { - return this.error(__("Unable to view file: {}", file.path), e); + return this.error(__("Unable to view file: {0}", this.currfile.path), e); }); } - renderSVG(file) { + renderSVG() { ($(this.view)).attr("class", "image"); - return file.read().then((d) => { + return this.currfile.read().then((d) => { this.view.innerHTML = d; return $($(this.view).children()[0]).css("width", "100%").css("height", "100%"); }).catch((e) => { - return this.error(__("Unable to read file: {}", file.path), e); + return this.error(__("Unable to read file: {0}", this.currfile.path), e); }); } - renderImage(file) { + renderImage() { ($(this.view)).attr("class", "image"); - return file.read("binary").then((d) => { + return this.currfile.read("binary").then((d) => { var blob, canvas, img; img = new Image(); canvas = ($(""))[0]; @@ -149,16 +262,17 @@ context = canvas.getContext('2d'); canvas.height = img.height; canvas.width = img.width; + this.img = img; //console.log canvas.width, canvas.height context.drawImage(img, 0, 0); - return this.setStatus(`${file.info.name} (${file.info.size} Kb) - ${img.width}x${img.height}`); + return this.setStatus(`${this.currfile.info.name} (${this.currfile.info.size} Kb) - ${img.width}x${img.height}`); }; blob = new Blob([d], { - type: file.info.mime + type: this.currfile.info.mime }); return img.src = URL.createObjectURL(blob); }).catch((e) => { - return this.error(__("Unable to read file: {}", file.path), e); + return this.error(__("Unable to read file: {0}", this.currfile.path), e); }); } diff --git a/Preview/build/debug/package.json b/Preview/build/debug/package.json index c39ac21..d7ba2de 100644 --- a/Preview/build/debug/package.json +++ b/Preview/build/debug/package.json @@ -6,7 +6,7 @@ "author": "Xuan Sang LE", "email": "xsang.le@gmail.com" }, - "version":"0.0.2-a", + "version":"0.0.3-a", "category":"Utils", "iconclass":"fa fa-eye", "mimes":["[^\/]*/.*pdf", "image/.*"] diff --git a/Preview/build/debug/scheme.html b/Preview/build/debug/scheme.html index 9213565..3754170 100644 --- a/Preview/build/debug/scheme.html +++ b/Preview/build/debug/scheme.html @@ -1,6 +1,17 @@ + +
+ + + +
+ +
+ +
+
+
-
\ No newline at end of file diff --git a/Preview/build/release/Preview.zip b/Preview/build/release/Preview.zip index d2876872edd0ea1ee47556726d91c3ac7ff9dbd8..f712249479d6ba31fb76ffa03435b85d5e90eadb 100644 GIT binary patch delta 4183 zcmc&%eP|o!8P~~@Wyz8)>&xHH>x|i_$ u21dIjXX#{JBHd|s zC(Eg8yl#xbSlYR7n-?0FHvep+>)MRaW(?NS!U`F5Yar~8QbNpF85Fu?ENo+V?0MhQ zhb1S}V}DHctB-r1&)@TVo_p_ypCA6?xg%Y3N1GfT8+~1W>Fqh?tg{+B^h~K-9w=OAZ`qMBaGo`7fq^PpaqiGM?@|sF3i{&3ad;b$?uKxNC5|_oMaeDJ|iKNk;YP4c~RHYv7DSS ztKlU1d9$F)i##}}nQQQ)sD+}5%(DeK$(!<0MZ4^661=f|mDM!tFPQ~tLFUnTgOQr` zE!llptU5)oVjir|n=18xk6>3RjQ<0E_k<77lXP7x8DmneJ{(;(xt`8>Dej(I+fYY-c?F&_3BW zuK{oK2hl`f2^ktBjdrKz>0iRLf@hl^9{o}?{5O$>cZ|x<>_nas*|W_0&FapBXz%@n zCCldxUM!?DW0bzglF3W@f})O9V%=9*!q=MKWm(5A-2dy|O_!~A^YSZ>AxEc~RSYpz z)b)&#lc8xBHApF*z`ttwaFy-Ry1{k!J)@{;!K!35QSN@WVez|OtjzgFLE5#Af~=Dp z1@$cDXrrh_+=K(HL^WAJP z+|4>3>8@p?C!2^xioRQBK3&OU-P#|QnlvPq$G?+}H ziAe?qxs>7@?m-43^bfr@LSE&XoTLzQIO~82;_tXm41*BhUv7}C>{s#&)eU^r{V{o@ z&*gleMzy@O1Vq?NiLh0zCIBUElIS>wna$?I*_$l zF4zQN;SCRekk)a>^r#~TzUT`Q{{|Q8p*E(HD2|?fn$d0AVl{J)5r5=8PSyq-A^Zbh7=O(- zQu#4O{+e+1;3s`ve9QMjq^?_88Wetf)!!S<#!z0#%Q0loVG%>6N?9qY7NM+(N^X7K z#U~JxhT2p!qO(?1)Ql!lI~8qajS`8n!9ooG&byzie`fd4Dl^tn^zom&+xVO&rL76j zP=<+eTv5QeoAjM@wP7t1qVo+c!ho}a=A$tr6K;x2 zQP+wv?yb~UhEGMslwkIvqAb;aVI#6yvqMj=a0nAqIa$&ll~bkw zgoOXHD)V0bW%;T0D?$}*RwSWZc=oYHNSDo`u2yB!x^%2`I8Uc(B?0EKHV0PNJXrCt zkA^y`RetF*(8*91WwI*?1w)T>E%-{?%0V24)ST#5%B@TMCe&I{8jvhzaRhJA9Yj86g1sTkehe72%hcOjZb$>$3)3Ab%AF9 z02eGEL@AyADm}XkJQ!mK5+2aOmpbD3vyMGD7#P6&17kSR<;PD2dhvxo6#o{keGwSK zUBP}b^(yDX$AkBE(zzg>tTM*>0)`5~`#RXn7+O|W#>+|KSAx8cCRl^%rfKhFQ+!_| zru0s?9oML6W@S~#6xEceXezn*q9b_zmdk}TeZTwy@X1W}4Xk zMmwt!AO!@6_XN4U+ZkeE_cVkJA;Z5lJf+soUG%ttP~+_nI#u8&0C95rFRsXrV*ly7 z)6dfS!nC{bxzNws*f6e~xi)6Y zxkxy$CN2(Zudpp=K_Zt=9yXqsiW0Vclj2WN||Af?XG?m2B}YNO=BrA^o0 qPkL;0`RdF^U7!j5U()n5vcAm;nJWhR>_-=fS`2hGAO3y-l>Y-yPb}^L delta 1235 zcmZ`(Z)h837{AM1?!C52n_ki+%bN5}nl_gvJKNRz!EIHpGaFAG96ll(|QE8T+6N8CKVd1g#%Lf+C25Y{DuG9Yy=0pmb$UrC)~cU7Vqa@A134 z=g;r?^S<}oFRvfF@axfFW{l%o8EY-)KF-{%`(E0i?>o$!!MET;t_PA_x0F>)b>Ea$ z$WNL05RUC1jKLS&uwyv~e{m<;E#CD*i5E8=472H|J;%pbSm8T_s;QbYRk-3De#$Hv zkK-ZZEUuP{g)Hu!JY`)6S}|RQn#~sU{Jx@=GpW;{adx-f<_^O;Iu1!hU{Eydj8otJ zzI^L0Vs727t%z}+eD{&*kRP57q(JdU;OD?$+d$T3)(39{yC4%B*rhqxkj6m>K{4Ti?cgQ&Dcs_et>8pG z!urYfah8Yq-ZUJDV6UZC3VN=j=<2jKhvoP=7$5LT6O9h7?kk!(Q_(R*%Qcfy~& z<-KRr3eM?GAImSN)18+M_$b~*JU<|wH}ELFfCh~bP zwpBFokTTLJ2XNE}*`9u)tRVqj?HMJpHJac(*$+PKX=vj(0f%wi7D)XL;$a#m8zwRA zfopg#RFhqB1BYOPy4Bz3c@U!gWb1iOfOIrW9$R9)kcp-(PMh6U{G2iO2;IDIqOnGx ztvC{Mx@_PS9wIN)_z-w{gXGC~S)M#m<6GcHpO?6=B1FPVYzH~G#Jb7#1Zw4Uc?dFn z8~j`>jiH?CYp-Z}R;!#idBi?LDEE)Tr~T{y+Tq)TtMRo^OD!VLv#^?+`JaQ;;p>4b zHudFl>U=rHQaC6$3ZBAAA*_~DsB~MjhUW8o7e64IPVq-}Klw@!bvjVzN03O-LeWam zM&Y7xQ?yfbPK#8|SjAO+@k&nd%* z_S8ST&9V$Ltrm1;vRciIu?`>8{3|qP4Ke5;!G13A|FBN~hh%k^q(LpXsI$9CoWGCA z_@cDODzUgIb#veUfyir%QfSnw(f#(u<=bI~u^==_^zHsL5_2lAoHp{AF{f>^>Uo7G JxL1{^{ci;Gd`SQR diff --git a/Preview/main.coffee b/Preview/main.coffee index 36a9e12..4260efa 100644 --- a/Preview/main.coffee +++ b/Preview/main.coffee @@ -21,14 +21,46 @@ class Preview extends this.OS.GUI.BaseApplication super "Preview", args main: () -> + @currfile = undefined @currfile = @args[0].path.asFileHandle() if @args and @args.length > 0 @view = @find "view" @status = @find "status" + @zoom = @find "zoom" + @btnext = @find "btnext" + @btprev = @find "btprev" + @btreset = @find "btreset" + @txtpage = @find "txtpage" + + @zoom.set "onchange", (e) => @setViewScale e.data + + @btreset.set "onbtclick", (e) => + @zoom.set "value", 100 + @setViewScale 100 + + @btnext.set "onbtclick", (e) => + val = parseInt $(@txtpage).val() + return if isNaN val + $(@txtpage).val val + 1 + @gotoPage() + @btprev.set "onbtclick", (e) => + val = parseInt $(@txtpage).val() + return if isNaN val + $(@txtpage).val val - 1 + @gotoPage() + + $(@txtpage).keyup (e) => + return unless e.which is 13 + return unless @pdf + @gotoPage() + PDFJS.workerSrc = "#{@path()}/pdf.worker.js".asFileHandle().getlink() + @pdf = undefined + @img = undefined @bindKey "ALT-O", () => @actionFile "#{@name}-Open" @bindKey "CTRL-X", () => @actionFile "#{@name}-Close" - + @zoom.set "max", 200 + @zoom.set "value", 100 @open @currfile @@ -37,72 +69,125 @@ class Preview extends this.OS.GUI.BaseApplication @currfile = file unless @currfile is file file.onready().then () => file.info.size = (file.info.size / 1024).toFixed(2) - @renderFile file + @renderFile() .catch (err) => @error __("File not found {0}", file.path), err - renderFile: (file) -> - mime = file.info.mime - return unless mime + + gotoPage: () -> + return unless @pdf + val = parseInt $(@txtpage).val() + return if isNaN(val) + return if val <= 0 or val > @pdf.numPages ($ @view).empty() + @renderPDFPages val, (@zoom.get("value") / 100), false + .catch (e) => @error __("Unable to render page {0}", val), e + + renderFile: () -> + mime = @currfile.info.mime + return unless mime + @pdf = undefined + @img = undefined + ($ @view).empty() + @zoom.set "value", 100 if mime.match /^[^\/]+\/.*pdf.*/g - @renderPDF file + @renderPDF() else if mime.match /image\/.*svg.*/g - @renderSVG file + @renderSVG() else if mime.match /image\/.*/g - @renderImage file + @renderImage() else @notify __("Mime type {0} is not supported", file.info.mime) setStatus: (t) -> ($ @status).html t - renderPDF: (file) -> + setViewScale: (value) -> + return unless @currfile + mime = @currfile.info.mime + scale = (value / 100) + if mime.match /^[^\/]+\/.*pdf.*/g + return unless @pdf + ($ @view).empty() + @load @renderPDFPages 1, scale + .catch (e) => @error __("Unable to set view scale"), e + + else if mime.match /image\/.*svg.*/g + $($(@view).children()[0]) + .css "width", "#{Math.round(value)}%" + .css "height", "#{Math.round(value)}%" + + else if mime.match /image\/.*/g + return unless @img + canvas = $(@view).children()[0] + context = canvas.getContext '2d' + w = @img.width * scale + h = @img.height * scale + canvas.height = h + canvas.width = w + context.clearRect(0, 0, canvas.width, canvas.height) + context.scale scale, scale + context.drawImage @img, 0, 0 + + renderPDFPages: (n, scale, recursive) -> + new Promise (resolve, reject) => + status = "#{@currfile.info.name} (#{@currfile.info.size} Kb)" + return resolve() if n > @pdf.numPages + @pdf.getPage(n).then (page) => + viewport = page.getViewport scale + div = ($ "
") + .attr("id", "page-" + (page.pageIndex + 1)) + .attr("scale", scale) + .addClass "pdf-page" + ($ @view).append div + canvas = ($ "")[0] + div.append canvas + context = canvas.getContext '2d' + canvas.height = viewport.height + canvas.width = viewport.width + renderContext = + canvasContext: context + viewport: viewport + page.render renderContext + page._canvas = canvas + @setStatus "#{status} - page #{n}/#{@pdf.numPages} loaded" + if recursive + @renderPDFPages n + 1, scale, recursive + .then () -> resolve() + .catch (e) -> reject e + else + resolve() + .catch (e) -> reject e + + renderPDF: () -> @load new Promise (resolve, reject) => - status = "#{file.info.name} (#{file.info.size} Kb)" - file.read("binary").then (d) => + @currfile.read("binary").then (d) => ($ @view).removeClass() PDFJS.getDocument { data: d } .then (pdf) => - fn = (p) => - if p > pdf.numPages - @setStatus "#{status} - loaded" - return resolve() - pdf.getPage(p).then (page) => - scale = 1.5 - viewport = page.getViewport scale - div = ($ "
").attr("id", "page-" + (page.pageIndex + 1)) - ($ @view).append div - canvas = ($ "")[0] - div.append canvas - context = canvas.getContext '2d' - canvas.height = viewport.height - canvas.width = viewport.width - renderContext = - canvasContext: context - viewport: viewport - page.render renderContext - @setStatus "#{status} - #{p}/#{pdf.numPages} loaded" - fn(p+1) + @pdf = pdf + @renderPDFPages 1, 1, false + .then () => + $(@txtpage).val("1") + resolve() .catch (e) -> reject e - fn(1) .catch (e) -> reject e .catch (e) -> reject e - .catch (e) => @error __("Unable to view file: {}", file.path), e + .catch (e) => @error __("Unable to view file: {0}", @currfile.path), e - renderSVG: (file) -> + renderSVG: () -> ($ @view).attr("class", "image") - file.read().then (d) => + @currfile.read().then (d) => @view.innerHTML = d $($(@view).children()[0]) .css "width", "100%" .css "height", "100%" - .catch (e) => @error __("Unable to read file: {}", file.path), e + .catch (e) => @error __("Unable to read file: {0}", @currfile.path), e - renderImage: (file) -> + renderImage: () -> ($ @view).attr("class", "image") - file.read("binary").then (d) => + @currfile.read("binary").then (d) => img = new Image() canvas = ($ "")[0] ($ @view).append canvas @@ -112,13 +197,14 @@ class Preview extends this.OS.GUI.BaseApplication context = canvas.getContext '2d' canvas.height = img.height canvas.width = img.width + @img = img #console.log canvas.width, canvas.height context.drawImage img, 0, 0 - @setStatus "#{file.info.name} (#{file.info.size} Kb) - #{img.width}x#{img.height}" + @setStatus "#{@currfile.info.name} (#{@currfile.info.size} Kb) - #{img.width}x#{img.height}" - blob = new Blob [d], { type: file.info.mime } + blob = new Blob [d], { type: @currfile.info.mime } img.src = URL.createObjectURL blob - .catch (e) => @error __("Unable to read file: {}", file.path), e + .catch (e) => @error __("Unable to read file: {0}", @currfile.path), e menu: () -> menu = [{ diff --git a/Preview/main.css b/Preview/main.css index a2f8dc4..c2b3e9d 100644 --- a/Preview/main.css +++ b/Preview/main.css @@ -7,20 +7,26 @@ afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] div[data-i background-repeat: repeat; } -afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] div[data-id = "status"] +afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] afx-hbox[data-id = "statcontainer"] { background-color: transparent; - border-top: 1px solid #cbcbcb; - padding-left: 10px; - padding-top: 3px; + border-bottom: 1px solid #cbcbcb; +} +afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] afx-hbox[data-id = "statcontainer"] button, +afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] afx-hbox[data-id = "statcontainer"] input +{ + height: 24px; } - afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] canvas{ margin-left: auto; margin-right: auto; display: block; } +afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] div.pdf-page { + margin-bottom: 5px; +} + afx-app-window[data-id = "preview-win"] afx-vbox[data-id="container"] div[data-id = "view"].image { display: flex; diff --git a/Preview/package.json b/Preview/package.json index c39ac21..d7ba2de 100644 --- a/Preview/package.json +++ b/Preview/package.json @@ -6,7 +6,7 @@ "author": "Xuan Sang LE", "email": "xsang.le@gmail.com" }, - "version":"0.0.2-a", + "version":"0.0.3-a", "category":"Utils", "iconclass":"fa fa-eye", "mimes":["[^\/]*/.*pdf", "image/.*"] diff --git a/Preview/scheme.html b/Preview/scheme.html index 9213565..3754170 100644 --- a/Preview/scheme.html +++ b/Preview/scheme.html @@ -1,6 +1,17 @@ + +
+ + + +
+ +
+ +
+
+
-
\ No newline at end of file diff --git a/TinyEditor/README.md b/TinyEditor/README.md index 90199f5..5797927 100644 --- a/TinyEditor/README.md +++ b/TinyEditor/README.md @@ -1,24 +1,3 @@ # TinyEditor This is the example project for the tutorial: [https://blog.lxsang.me/post/id/20](https://blog.lxsang.me/post/id/20) -## Howto - -1. Open the project.apj file with AntOSDK (simply double Click on it) -2. Modify the UI in *assets/scheme.html* -3. Modify application code in *coffees/main.coffee* -4. Modify CSS style in *css/main.css* -5. Other files need to be copied: put in to assets - -## Set up build target - -Click **Menu> Build > Build Option** or simply hit **ALT-Y** - -In the build options dialog, add or remove files that need to be -included into the build - -Click **Save** - -## Build application -* To build: **Menu > Build > Build** or **ALT-C** -* To build and run: **Menu > Build > Build and Run** or **CTRL-R** -* To release: **Menu > Build > Build release** or **ALT-P** diff --git a/TinyEditor/build/debug/README.md b/TinyEditor/build/debug/README.md index 90199f5..5797927 100644 --- a/TinyEditor/build/debug/README.md +++ b/TinyEditor/build/debug/README.md @@ -1,24 +1,3 @@ # TinyEditor This is the example project for the tutorial: [https://blog.lxsang.me/post/id/20](https://blog.lxsang.me/post/id/20) -## Howto - -1. Open the project.apj file with AntOSDK (simply double Click on it) -2. Modify the UI in *assets/scheme.html* -3. Modify application code in *coffees/main.coffee* -4. Modify CSS style in *css/main.css* -5. Other files need to be copied: put in to assets - -## Set up build target - -Click **Menu> Build > Build Option** or simply hit **ALT-Y** - -In the build options dialog, add or remove files that need to be -included into the build - -Click **Save** - -## Build application -* To build: **Menu > Build > Build** or **ALT-C** -* To build and run: **Menu > Build > Build and Run** or **CTRL-R** -* To release: **Menu > Build > Build release** or **ALT-P** diff --git a/TinyEditor/build/debug/main.css b/TinyEditor/build/debug/main.css index 5b61782..c217986 100644 --- a/TinyEditor/build/debug/main.css +++ b/TinyEditor/build/debug/main.css @@ -1,8 +1,6 @@ afx-app-window[data-id="TinyEditor"] textarea[data-id="editor"] { - background-color: #272822; - color:white; margin: 0; padding:10px; border: 0; diff --git a/TinyEditor/build/debug/main.js b/TinyEditor/build/debug/main.js index 420f31a..f2179be 100644 --- a/TinyEditor/build/debug/main.js +++ b/TinyEditor/build/debug/main.js @@ -1,4 +1,5 @@ (function() { + void 0; var TinyEditor; TinyEditor = class TinyEditor extends this.OS.GUI.BaseApplication { @@ -7,32 +8,29 @@ } main() { - var me; - me = this; this.editor = this.find("editor"); - this.bindKey("ALT-N", function() { - return me.newFile(); + this.bindKey("ALT-N", () => { + return this.newFile(); }); - this.bindKey("ALT-O", function() { - return me.openFile(); + this.bindKey("ALT-O", () => { + return this.openFile(); }); - this.bindKey("CTRL-S", function() { - return me.saveFile(); + this.bindKey("CTRL-S", () => { + return this.saveFile(); }); - this.filehandler = this.args && this.args.length > 0 ? this.args[0].asFileHandler() : null; - $(this.editor).on('input', function(e) { - if (me.filehandler.dirty === true) { + this.filehandle = this.args && this.args.length > 0 ? this.args[0].asFileHandle() : null; + $(this.editor).on('input', (e) => { + if (this.filehandle.dirty === true) { return; } - me.filehandler.dirty = true; - return me.scheme.set("apptitle", `${me.filehandler.path}*`); + this.filehandle.dirty = true; + return this.scheme.set("apptitle", `${this.filehandle.path}*`); }); return this.read(); } menu() { - var m, me; - me = this; + var m; m = [ { text: "__(File)", @@ -53,14 +51,14 @@ shortcut: 'C-S' } ], - onmenuselect: function(e) { - switch (e.item.data.dataid) { + onchildselect: (e) => { + switch (e.data.item.get("data").dataid) { case "new": - return me.newFile(); + return this.newFile(); case "open": - return me.openFile(); + return this.openFile(); case "save": - return me.saveFile(); + return this.saveFile(); } } } @@ -69,71 +67,73 @@ } newFile() { - this.filehandler = null; + this.filehandle = null; return this.read(); } openFile() { - var me; - me = this; - return this.openDialog("FileDiaLog", function(dir, fname, d) { - me.filehandler = `${dir}/${fname}`.asFileHandler(); - return me.read(); - }, __("Open file")); + return this.openDialog("FileDialog", { + title: __("Open file") + }).then((d) => { + this.filehandle = d.file.path.asFileHandle(); + return this.read(); + }); } saveFile() { - var me; - me = this; - this.filehandler.cache = this.editor.value; - if (this.filehandler.path !== "Untitled") { + this.filehandle.cache = this.editor.value; + if (this.filehandle.path !== "Untitled") { return this.write(); } - return this.openDialog("FileDiaLog", function(dir, fname, d) { - me.filehandler.setPath(`${dir}/${fname}`); - return me.write(); - }, __("Save as"), { - file: me.filehandler + return this.openDialog("FileDialog", { + title: __("Save as"), + file: this.filehandle + }).then((f) => { + var d; + d = f.file.path.asFileHandle(); + if (f.file.type === "file") { + d = d.parent(); + } + this.filehandle.setPath(`${d.path}/${f.name}`); + return this.write(); }); } read() { - var me; - me = this; this.editor.value = ""; - if (this.filehandler === null) { - this.filehandler = "Untitled".asFileHandler(); + if (this.filehandle === null) { + this.filehandle = "Untitled".asFileHandle(); this.scheme.set("apptitle", "Untitled"); return; } - return this.filehandler.read(function(d) { - me.scheme.set("apptitle", me.filehandler.path); - return me.editor.value = d; + return this.filehandle.read().then((d) => { + this.scheme.set("apptitle", this.filehandle.path); + return this.editor.value = d; + }).catch((e) => { + return this.error(__("Unable to read file content")); }); } write() { - var me; - me = this; - return this.filehandler.write("text/plain", function(d) { - if (d.error) { - return me.error(__("Error saving file {0}", me.filehandler.path)); - } - me.filehandler.dirty = false; - return me.scheme.set("apptitle", `${me.filehandler.path}`); + return this.filehandle.write("text/plain").then((d) => { + this.filehandle.dirty = false; + return this.scheme.set("apptitle", `${this.filehandle.path}`); + }).catch((e) => { + return this.error(__("Error saving file {0}", this.filehandle.path), e); }); } cleanup(e) { - var me; - if (!this.filehandler.dirty) { + if (!this.filehandle.dirty) { return; } - me = this; e.preventDefault(); - return this.ask("__(Quit)", "__(Quit without saving?)", function() { - me.filehandler.dirty = false; - return me.quit(); + return this.ask({ + title: "__(Quit)", + text: "__(Quit without saving?)" + }).then(() => { + this.filehandle.dirty = false; + return this.quit(); }); } diff --git a/TinyEditor/build/debug/package.json b/TinyEditor/build/debug/package.json index 8ea9640..7889034 100644 --- a/TinyEditor/build/debug/package.json +++ b/TinyEditor/build/debug/package.json @@ -1,10 +1,10 @@ { "app":"TinyEditor", - "name":"TinyEditor", - "description":"", + "name":"Tiny editor", + "description":"Basic plain text file editor", "info":{ - "author": "", - "email": "" + "author": "Xuan Sang LE", + "email": "xsang.le@gmail.com" }, "version":"0.0.1-a", "category":"Other", diff --git a/TinyEditor/build/release/TinyEditor.zip b/TinyEditor/build/release/TinyEditor.zip new file mode 100644 index 0000000000000000000000000000000000000000..a08cf3247ed33b3d05f47b284d3f2f3c2ea8c6d5 GIT binary patch literal 4819 zcmbVQPjB2r6i*9n&OD7M07kn-bbkP(u@%1R+IHJF#cilX`7qkF$xQ zJ#mE#C-??@0WOFSz@?vpD<=>KZoD_+vByq!)3S*r&!6}2_x{WqZ$5nG)z%XJf}eib zy!_|$2fxBQK5xL2c>$krH;|L?4jUbHS(0?8BJ$%YfmbPH$cOaF6K9(rNwVe(8K)ge zroxxOkbczfQxb474&;#D!hz2u>k5BJw?%ZUx6_ptfuG`jxE~)8JyvrPxU!V9lCI5_ zi1x~zo>?o%d#D}Kue9!{_e#^1&6S_z{~VAty;1A8=2SQJkuInS;54g#)r1NSS1VUT;5)$8LC(v1sg0crS@F*%N;6 z!~ULg?v_rgRoC>Z=O6qoK|_2l!!uzba=k2T)jhF$7OH#108}k&@aSIaL_t1b=~zSq z(!Z^S3G;msjR!aT$&sGfk5iwgYQwCq*>ATxe_eSC@Pp@dquD{`jPl5nB95F6K^cd! z@HP8GmRjiEZoy&&HW?BxWLaiUf#-STBmN?DH@4gdJDHtxgH zLw@Yg)%ES}Bf3n0({QEG4B4ez=4qt)M11FO{ws=M#-&3|^#fR+UOQ>>N|+30H=dU6tsHIhgUaTcU@*bRqudHcOq+>O zW&*(Pmg=9BZxD)*Edzpe7*X!fWoyj~MCe0>vZhE4Aw;TT@Q6?A^tg-#MgS8E5nN-A zi&+q-(#t`C_Gv%;?jIMR7g7`1Z-mUvt_rvT|K zhJiwPF^AJtr_Ms*wV1`}N~2j+nQ3RKncXv4P$W>16-C;Vm9>oQMn*#F*cIoTEUc_7 z`Pme>d>_vJcc59)pI@6nK5&xrZ#wxe<3({YCA_RVcr7CsKy{ z)Q(Xbx@ihQZE9ZSXM4-bp}PeMN?1laRjwgo19Nhl^4^4g)PNoIief3DAZ3Wp#!UdTNyc!+R&VOfpe;Hv6ba%3e74OhnR$^BK zAe`3=RT2BL2(2Mj1WFg&O*B3y{TbBSGo7_e_&m_Okh3UH&@U%NF~AtV+T^2}$!d?W zx*2;=lT&^OZo1D$EDx=uw!Oi!XO58uDUR1=-KTw-3u(6$Mn^(%mB9o^sQq}bh5N|23hM{WBVO+m0u5bVN zL+8TM5&D#R4fVV7ky#pJ!ew;1fg~!3MY* z3XiBLSIw-BlsbioMll^!?w~9Olv4^G`8sD2*@8 - me = @ @editor = @find "editor" - @bindKey "ALT-N", () -> me.newFile() - @bindKey "ALT-O", () -> me.openFile() - @bindKey "CTRL-S", () -> me.saveFile() - @filehandler = if @args and @args.length > 0 then @args[0].asFileHandler() else null - $(@editor).on 'input', (e) -> - return if me.filehandler.dirty is true - me.filehandler.dirty = true - me.scheme.set "apptitle", "#{me.filehandler.path}*" + @bindKey "ALT-N", () => @newFile() + @bindKey "ALT-O", () => @openFile() + @bindKey "CTRL-S", () => @saveFile() + @filehandle = if @args and @args.length > 0 then @args[0].asFileHandle() else null + $(@editor).on 'input', (e) => + return if @filehandle.dirty is true + @filehandle.dirty = true + @scheme.set "apptitle", "#{@filehandle.path}*" @read() menu: () -> - me = @ m = [ { text: "__(File)", @@ -25,60 +23,62 @@ class TinyEditor extends this.OS.GUI.BaseApplication { text: "__(Open)", dataid :"open", shortcut: 'A-O' }, { text: "__(Save)", dataid :"save", shortcut: 'C-S' } ], - onmenuselect: (e) -> - switch e.item.data.dataid - when "new" then me.newFile() - when "open" then me.openFile() - when "save" then me.saveFile() + onchildselect: (e) => + switch e.data.item.get("data").dataid + when "new" then @newFile() + when "open" then @openFile() + when "save" then @saveFile() } ] m newFile: () -> - @filehandler = null + @filehandle = null @read() openFile: () -> - me = @ - @openDialog "FileDiaLog", ( dir, fname, d ) -> - me.filehandler = "#{dir}/#{fname}".asFileHandler() - me.read() - , __("Open file") + @openDialog "FileDialog", { title: __("Open file") } + .then (d) => + @filehandle = d.file.path.asFileHandle() + @read() + , saveFile: () -> - me = @ - @filehandler.cache = @editor.value - return @write() unless @filehandler.path is "Untitled" - @openDialog "FileDiaLog", (dir, fname, d) -> - me.filehandler.setPath "#{dir}/#{fname}" - me.write() - , __("Save as"), { file: me.filehandler } + @filehandle.cache = @editor.value + return @write() unless @filehandle.path is "Untitled" + @openDialog("FileDialog", { + title: __("Save as"), + file: @filehandle + }).then (f) => + d = f.file.path.asFileHandle() + d = d.parent() if f.file.type is "file" + @filehandle.setPath "#{d.path}/#{f.name}" + @write() read: () -> - me = @ @editor.value = "" - if @filehandler is null - @filehandler = "Untitled".asFileHandler() + if @filehandle is null + @filehandle = "Untitled".asFileHandle() @scheme.set "apptitle", "Untitled" return - @filehandler.read (d) -> - me.scheme.set "apptitle", me.filehandler.path - me.editor.value = d + @filehandle.read().then (d) => + @scheme.set "apptitle", @filehandle.path + @editor.value = d + .catch (e) => @error __("Unable to read file content") write: () -> - me = @ - @filehandler.write "text/plain", (d) -> - return me.error __("Error saving file {0}", me.filehandler.path) if d.error - me.filehandler.dirty = false - me.scheme.set "apptitle", "#{me.filehandler.path}" + @filehandle.write("text/plain").then (d) => + @filehandle.dirty = false + @scheme.set "apptitle", "#{@filehandle.path}" + .catch (e) => @error __("Error saving file {0}", @filehandle.path), e cleanup: (e) -> - return unless @filehandler.dirty - me = @ + return unless @filehandle.dirty e.preventDefault() - @ask "__(Quit)", "__(Quit without saving?)", () -> - me.filehandler.dirty = false - me.quit() + @ask { title: "__(Quit)", text: "__(Quit without saving?)" } + .then () => + @filehandle.dirty = false + @quit() this.OS.register "TinyEditor", TinyEditor \ No newline at end of file diff --git a/TinyEditor/css/main.css b/TinyEditor/css/main.css index 15a6b1d..5ffe5f0 100644 --- a/TinyEditor/css/main.css +++ b/TinyEditor/css/main.css @@ -1,7 +1,5 @@ afx-app-window[data-id="TinyEditor"] textarea[data-id="editor"] { - background-color: #272822; - color:white; margin: 0; padding:10px; border: 0; diff --git a/TinyEditor/package.json b/TinyEditor/package.json index 8ea9640..7889034 100644 --- a/TinyEditor/package.json +++ b/TinyEditor/package.json @@ -1,10 +1,10 @@ { "app":"TinyEditor", - "name":"TinyEditor", - "description":"", + "name":"Tiny editor", + "description":"Basic plain text file editor", "info":{ - "author": "", - "email": "" + "author": "Xuan Sang LE", + "email": "xsang.le@gmail.com" }, "version":"0.0.1-a", "category":"Other", diff --git a/TinyEditor/project.apj b/TinyEditor/project.apj deleted file mode 100644 index 5afdd5d..0000000 --- a/TinyEditor/project.apj +++ /dev/null @@ -1 +0,0 @@ -{"name":"TinyEditor","root":"home://workspace/TinyEditor","css":["css/main.css"],"javascripts":[],"coffees":["coffees/main.coffee"],"copies":["assets/scheme.html","package.json","README.md"]} \ No newline at end of file diff --git a/TinyEditor/project.json b/TinyEditor/project.json new file mode 100644 index 0000000..63c3589 --- /dev/null +++ b/TinyEditor/project.json @@ -0,0 +1,8 @@ +{ + "name": "TinyEditor", + "root": "home://workspace/antosdk-apps/TinyEditor", + "css": ["css/main.css"], + "javascripts": [], + "coffees": ["coffees/main.coffee"], + "copies": ["assets/scheme.html", "package.json", "README.md"] +} \ No newline at end of file diff --git a/packages.json b/packages.json index 33232c8..f8a26e4 100644 --- a/packages.json +++ b/packages.json @@ -17,6 +17,15 @@ "version": "0.0.1-a", "download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/ActivityMonitor/build/release/ActivityMonitor.zip" }, + { + "pkgname": "LuaPlayground", + "name": "LuaPlayground", + "description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/LuaPlayground/README.md", + "category": "System", + "author": "Xuan Sang LEs", + "version": "0.0.1-a", + "download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/LuaPlayground/build/release/LuaPlayground.zip" + }, { "pkgname": "MarkOn", "name": "Markdown editor", @@ -32,7 +41,7 @@ "description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/Preview/README.md", "category": "Utils", "author": "Xuan Sang LE", - "version": "0.0.2-a", + "version": "0.0.3-a", "download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/Preview/build/release/Preview.zip" }, { @@ -44,6 +53,15 @@ "version": "0.0.2-a", "download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/ShowCase/build/release/ShowCase.zip" }, + { + "pkgname": "TinyEditor", + "name": "Tiny editor", + "description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/TinyEditor/README.md", + "category": "Other", + "author": "Xuan Sang LE", + "version": "0.0.1-a", + "download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/TinyEditor/build/release/TinyEditor.zip" + }, { "pkgname": "wTerm", "name": "Terminal",