From bad0816115ea73ef9459980d26bdca30bbb1473c Mon Sep 17 00:00:00 2001 From: n1474335 Date: Wed, 27 Dec 2017 01:52:41 +0000 Subject: [PATCH] Output files can be viewed in slices --- src/web/Manager.js | 4 +- src/web/OutputWaiter.js | 58 ++++++++++++++++++----- src/web/html/index.html | 17 +++++-- src/web/static/images/file-128x128.png | Bin 0 -> 19378 bytes src/web/static/images/file-32x32.png | Bin 0 -> 1946 bytes src/web/stylesheets/components/_pane.css | 18 +++++-- src/web/stylesheets/layout/_io.css | 8 ++++ src/web/stylesheets/utils/_overrides.css | 12 ++++- 8 files changed, 95 insertions(+), 22 deletions(-) create mode 100644 src/web/static/images/file-128x128.png create mode 100644 src/web/static/images/file-32x32.png diff --git a/src/web/Manager.js b/src/web/Manager.js index 270e68f8..4b89942a 100755 --- a/src/web/Manager.js +++ b/src/web/Manager.js @@ -142,7 +142,7 @@ Manager.prototype.initialiseEventListeners = function() { document.getElementById("input-text").addEventListener("mouseup", this.highlighter.inputMouseup.bind(this.highlighter)); document.getElementById("input-text").addEventListener("mousemove", this.highlighter.inputMousemove.bind(this.highlighter)); this.addMultiEventListener("#input-text", "mousedown dblclick select", this.highlighter.inputMousedown, this.highlighter); - document.querySelector("#input-file .close").addEventListener("click", this.input.closeFile.bind(this.input)); + document.querySelector("#input-file .close").addEventListener("click", this.input.clearIoClick.bind(this.input)); // Output document.getElementById("save-to-file").addEventListener("click", this.output.saveClick.bind(this.output)); @@ -159,6 +159,8 @@ Manager.prototype.initialiseEventListeners = function() { this.addMultiEventListener("#output-html", "mousedown dblclick select", this.highlighter.outputHtmlMousedown, this.highlighter); this.addDynamicListener(".file-switch", "click", this.output.fileSwitch, this.output); this.addDynamicListener("#output-file-download", "click", this.output.downloadFile, this.output); + this.addDynamicListener("#output-file-slice", "click", this.output.displayFile, this.output); + document.getElementById("show-file-overlay").addEventListener("click", this.output.showFileOverlayClick.bind(this.output)); // Options document.getElementById("options").addEventListener("click", this.options.optionsClick.bind(this.options)); diff --git a/src/web/OutputWaiter.js b/src/web/OutputWaiter.js index d8d028d0..93cc351b 100755 --- a/src/web/OutputWaiter.js +++ b/src/web/OutputWaiter.js @@ -17,7 +17,7 @@ const OutputWaiter = function(app, manager) { this.app = app; this.manager = manager; - this.file = null; + this.dishBuffer = null; }; @@ -37,8 +37,9 @@ OutputWaiter.prototype.get = function() { * @param {string|ArrayBuffer} data - The output string/HTML/ArrayBuffer * @param {string} type - The data type of the output * @param {number} duration - The length of time (ms) it took to generate the output + * @param {boolean} [preserveBuffer=false] - Whether to preserve the dishBuffer */ -OutputWaiter.prototype.set = function(data, type, duration) { +OutputWaiter.prototype.set = function(data, type, duration, preserveBuffer) { const outputText = document.getElementById("output-text"); const outputHtml = document.getElementById("output-html"); const outputFile = document.getElementById("output-file"); @@ -46,7 +47,7 @@ OutputWaiter.prototype.set = function(data, type, duration) { const inputHighlighter = document.getElementById("input-highlighter"); let scriptElements, lines, length; - this.closeFile(); + if (!preserveBuffer) this.closeFile(); switch (type) { case "html": @@ -80,7 +81,7 @@ OutputWaiter.prototype.set = function(data, type, duration) { outputHtml.innerHTML = ""; length = data.byteLength; - this.setFile(new File([data], "output.dat")); + this.setFile(data); break; case "string": default: @@ -106,10 +107,11 @@ OutputWaiter.prototype.set = function(data, type, duration) { /** * Shows file details. * - * @param {File} file + * @param {ArrayBuffer} buf */ -OutputWaiter.prototype.setFile = function(file) { - this.file = file; +OutputWaiter.prototype.setFile = function(buf) { + this.dishBuffer = buf; + const file = new File([buf], "output.dat"); // Display file overlay in output area with details const fileOverlay = document.getElementById("output-file"), @@ -124,7 +126,7 @@ OutputWaiter.prototype.setFile = function(file) { * Removes the output file and nulls its memory. */ OutputWaiter.prototype.closeFile = function() { - this.file = null; + this.dishBuffer = null; document.getElementById("output-file").style.display = "none"; }; @@ -134,8 +136,40 @@ OutputWaiter.prototype.closeFile = function() { */ OutputWaiter.prototype.downloadFile = function() { const filename = window.prompt("Please enter a filename:", "download.dat"); + const file = new File([this.dishBuffer], filename); - if (filename) FileSaver.saveAs(this.file, filename, false); + if (filename) FileSaver.saveAs(file, filename, false); +}; + + +/** + * Handler for file display events. + */ +OutputWaiter.prototype.displayFile = function() { + const startTime = new Date().getTime(), + showFileOverlay = document.getElementById("show-file-overlay"), + sliceFromEl = document.getElementById("output-file-slice-from"), + sliceToEl = document.getElementById("output-file-slice-to"), + sliceFrom = parseInt(sliceFromEl.value, 10), + sliceTo = parseInt(sliceToEl.value, 10), + str = Utils.arrayBufferToStr(this.dishBuffer.slice(sliceFrom, sliceTo)); + + showFileOverlay.style.display = "block"; + this.set(str, "string", new Date().getTime() - startTime, true); +}; + + +/** + * Handler for show file overlay events. + * + * @param {Event} e + */ +OutputWaiter.prototype.showFileOverlayClick = function(e) { + const outputFile = document.getElementById("output-file"), + showFileOverlay = e.target; + + outputFile.style.display = "block"; + showFileOverlay.style.display = "none"; }; @@ -198,8 +232,8 @@ OutputWaiter.prototype.adjustWidth = function() { * Saves the current output to a file. */ OutputWaiter.prototype.saveClick = function() { - if (!this.file) { - this.file = new File([new Uint8Array(Utils.strToCharcode(this.app.dishStr))], ""); + if (!this.dishBuffer) { + this.dishBuffer = new Uint8Array(Utils.strToCharcode(this.app.dishStr)).buffer; } this.downloadFile(); }; @@ -227,7 +261,7 @@ OutputWaiter.prototype.copyClick = function() { let success = false; try { textarea.select(); - success = document.execCommand("copy"); + success = textarea.value && document.execCommand("copy"); } catch (err) { success = false; } diff --git a/src/web/html/index.html b/src/web/html/index.html index cd690869..a132aebd 100755 --- a/src/web/html/index.html +++ b/src/web/html/index.html @@ -184,7 +184,7 @@
- +
Name:
@@ -216,15 +216,22 @@
+
- +
Size:
-
- Display in output
- Options for how much to display + +
+ + + + +
to
+ +
diff --git a/src/web/static/images/file-128x128.png b/src/web/static/images/file-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..005c504dd363985045a80a4f76c3de22ea506998 GIT binary patch literal 19378 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 literal 0 HcmV?d00001 diff --git a/src/web/static/images/file-32x32.png b/src/web/static/images/file-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..884bf4851c1adef7191525b124c246db6ff48d80 GIT binary patch literal 1946 zcmV;L2W9w)P)OIt)aMW!1`|0{S6A!n)~$1_UAq=?$JEpm zgJIRGRd6^QAj-F88O~csO7^2ZAiE*u02zcfDgwS4`eQ)=qS$ItCyYE~ zv)Sbdi0sb#`g#%oQBqO@Vt#&}S(6my<};j5CkO^6f&4WG4jjPo!GY|vjz%_OmsLX>054au#6WG6h|9UCITX+;0gx9`(`^E+b2bDNnjgOD3NF<^r zCnwdTAnK@*kr8$9;6Zit=uwrAuC6Y%bLY-I^7v>4_*)ef6_}o$<})*<%y<;24h>5` zc)ecasZ13|wqna0LOni=76m}Xv* z0Oc;Hspx*1?FnF;aoe_S%$Nb$v{*tW!}82XpK!@mPcG#FvUQ2%_70H6cw8`0Yilc7 zT3WDq^JZ+{z8$r-wNw*#?%d&T8A>S&4}m=kPM$oe+S=L>3Pn4{A`)4-H+%cS7i)1iHJsReO6o39uK~`}t|{LHAoYfAP|PS~hLkaQ6KV z@%g{5E;$RPr0*9~Hg-Rf_m+{&E#&8`bW|W3xMz1{em%r`D@W6>BOR#tE z-V4&hU#9HbJ}XwNusfbeYG2FYKPzd1$c|-Qn*YV)<4hnrr-JN z>r$J$ixr@2H`1{*6tm~WdeYG(#WTTj`2CwFapd#sKwUjNTV8_0=|slL!c>5Ug>I{U z{;RDVU?ms`94UfjOLa)6GI8Z7$ZaHe%gh+r!;za@^v)F7@hxpT(vp90D4`^5q z|C%*$NfL3>frMrvDl=Uawy~iZM$-#60Z9K3v#qlJi9~|?ns;s` z-bu)wjs(l3={mk1x`xgRp8+p!MWALiG_McS84E85OVQWSg!+IFF=fbFxg;5#BfWmZ z&$P0NSM`;ve=v@xDHA6mvu4|5=2V4u5@AphW2v}9G)n*OM}XT8uN-FJ_d_diBC9mi zI!#oW8ph)ZZe?h04^%n@q>^wv-wHTgU77RmlYouNTeoh31Bpa<+~RyE!ulR0ILZT>dEm6cTf3{4!L6H#V-u-cTtL z$uyJ(k>3SP%FNzo1Vhlu%6IB{6HU>849+{{W)n5CXxCW*z~^$(Ah`p-_kpCkbY22c;4$2iFiz znjjJ9+68%`V33GX7)c~SI3ze>|K&q=9@cyY@C7RKOJFc)&U~!5eI}s%R3`rrLbPq# zgu0q4SR?=CUS9~HEbx(>?7%q^{77=Vtl1fM%?UkkUprWHnr~=mhyiIv5(B@}_4Eb5 zQH}fe?x_N=PyM=S128&*bk>5FNkhq6&ErB?d~iej@kMkNgl39|bPW&_W_jSfbrUK) z+Hbew&dyFHrxwNzxL3fL!&h{HS_`HX8`sD8WMT!n&n`L zs1Rb}k?PVC+!!6jyW=t7wO_y;s)oT{AZ1GGCfu^#OwA!PHHmCIiuAn*vj6CrP`#I$ z0gRD=AHY^QK>St)kRchzW$PJoDvn7xQi3@tPeS~WmF$b9{ysTg4by(PSyI5e0cck9 z=G~50b~l?fbqkIcg?J9hO7Qsy_hH@s7Wnto9`*I`ZvaH{2U39E!qekLk>{$mu2Jc2 z+m-(6Yf5Y1q0rc(P`OgUFunxPf&~~9pB}(dfF7|Qb7}+uya1pMKq!}36aa(w1DFF4 g1CX@O13xCd2d**bOul<@m;e9(07*qoM6N<$g6&+S2><{9 literal 0 HcmV?d00001 diff --git a/src/web/stylesheets/components/_pane.css b/src/web/stylesheets/components/_pane.css index f69984b4..fb8f309b 100644 --- a/src/web/stylesheets/components/_pane.css +++ b/src/web/stylesheets/components/_pane.css @@ -50,8 +50,10 @@ .card>img { float: left; - width: 150px; - height: 150px; + width: 128px; + height: 128px; + margin-left: 10px; + margin-top: 11px; } .card-body .close { @@ -68,4 +70,14 @@ overflow: hidden; text-overflow: ellipsis; user-select: text; -} \ No newline at end of file +} + +.card-body>.btn { + margin-bottom: 15px; + margin-top: 5px; +} + +.card input[type=number] { + padding-right: 6px; + padding-left: 6px; +} diff --git a/src/web/stylesheets/layout/_io.css b/src/web/stylesheets/layout/_io.css index 519b81fc..370c2235 100644 --- a/src/web/stylesheets/layout/_io.css +++ b/src/web/stylesheets/layout/_io.css @@ -88,6 +88,14 @@ display: none; } +#show-file-overlay { + position: absolute; + right: 15px; + top: 15px; + cursor: pointer; + display: none; +} + .io-btn-group { float: right; margin-top: -4px; diff --git a/src/web/stylesheets/utils/_overrides.css b/src/web/stylesheets/utils/_overrides.css index 36069cd5..23f83bd8 100755 --- a/src/web/stylesheets/utils/_overrides.css +++ b/src/web/stylesheets/utils/_overrides.css @@ -64,7 +64,8 @@ a:focus { .alert, .modal-content, .tooltip-inner, -.dropdown-menu { +.dropdown-menu, +.input-group-addon { border-radius: 0 !important; } @@ -187,6 +188,15 @@ optgroup { color: var(--primary-font-colour); } +.input-group-addon:not(:first-child):not(:last-child) { + border-left: 0; + border-right: 0; +} + +.input-group-btn:first-child>.btn { + border-right: 0; +} + /* Bootstrap-switch */