view-electron.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /*jshint esversion: 6 */
  2. var electron = require('electron');
  3. var fs = require('fs');
  4. var path = require('path');
  5. class ElectronHost {
  6. constructor() {
  7. }
  8. get name() {
  9. return electron.remote.app.getName();
  10. }
  11. initialize(view) {
  12. this._view = view;
  13. this._view.show('welcome');
  14. electron.ipcRenderer.on('open', (event, data) => {
  15. var file = data.file;
  16. if (file) {
  17. this._view.show('spinner');
  18. this.openFile(file, (err) => {
  19. if (err) {
  20. this.showError(err.toString());
  21. this._view.show(null);
  22. this.update('path', null);
  23. this.update('show-details', this._view.showDetails);
  24. this.update('show-names', this._view.showNames);
  25. return;
  26. }
  27. this.update('path', file);
  28. this.update('show-details', this._view.showDetails);
  29. this.update('show-names', this._view.showNames);
  30. });
  31. }
  32. });
  33. electron.ipcRenderer.on('export', (event, data) => {
  34. this._view.export(data.file);
  35. });
  36. electron.ipcRenderer.on('cut', (event, data) => {
  37. this._view.cut();
  38. });
  39. electron.ipcRenderer.on('copy', (event, data) => {
  40. this._view.copy();
  41. });
  42. electron.ipcRenderer.on('paste', (event, data) => {
  43. this._view.paste();
  44. });
  45. electron.ipcRenderer.on('selectall', (event, data) => {
  46. this._view.selectAll();
  47. });
  48. electron.ipcRenderer.on('toggle-details', (event, data) => {
  49. this._view.toggleDetails();
  50. this.update('show-details', this._view.showDetails);
  51. });
  52. electron.ipcRenderer.on('toggle-names', (event, data) => {
  53. this._view.toggleNames();
  54. this.update('show-names', this._view.showNames);
  55. });
  56. electron.ipcRenderer.on('zoom-in', (event, data) => {
  57. document.getElementById('zoom-in-button').click();
  58. });
  59. electron.ipcRenderer.on('zoom-out', (event, data) => {
  60. document.getElementById('zoom-out-button').click();
  61. });
  62. electron.ipcRenderer.on('reset-zoom', (event, data) => {
  63. this._view.resetZoom();
  64. });
  65. electron.ipcRenderer.on('show-properties', (event, data) => {
  66. document.getElementById('model-properties-button').click();
  67. });
  68. electron.ipcRenderer.on('find', (event, data) => {
  69. this._view.find();
  70. });
  71. var openFileButton = document.getElementById('open-file-button');
  72. if (openFileButton) {
  73. openFileButton.style.opacity = 1;
  74. openFileButton.addEventListener('click', (e) => {
  75. electron.ipcRenderer.send('open-file-dialog', {});
  76. });
  77. }
  78. document.addEventListener('dragover', (e) => {
  79. e.preventDefault();
  80. });
  81. document.addEventListener('drop', (e) => {
  82. e.preventDefault();
  83. });
  84. document.body.addEventListener('drop', (e) => {
  85. e.preventDefault();
  86. var files = [];
  87. for (var i = 0; i < e.dataTransfer.files.length; i++) {
  88. files.push(e.dataTransfer.files[i].path);
  89. }
  90. this.dropFiles(files);
  91. return false;
  92. });
  93. }
  94. update(name, value) {
  95. electron.ipcRenderer.send('update', { name: name, value: value });
  96. }
  97. dropFiles(files) {
  98. electron.ipcRenderer.send('drop-files', { files: files });
  99. }
  100. showError(message) {
  101. if (message) {
  102. electron.remote.dialog.showErrorBox(electron.remote.app.getName(), message);
  103. }
  104. }
  105. import(file, callback) {
  106. var pathname = path.join(__dirname, file);
  107. for (var i = 0; i < document.scripts.length; i++) {
  108. if (pathname == document.scripts[i]) {
  109. callback(null);
  110. return;
  111. }
  112. }
  113. var script = document.createElement('script');
  114. script.onload = () => {
  115. callback(null);
  116. };
  117. script.onerror = (e) => {
  118. callback(new Error('The script \'' + e.target.src + '\' failed to load.'));
  119. };
  120. script.setAttribute('type', 'text/javascript');
  121. script.setAttribute('src', pathname);
  122. document.head.appendChild(script);
  123. }
  124. export(file, data, mimeType) {
  125. var encoding = 'utf-8';
  126. if (mimeType == 'image/png') {
  127. try
  128. {
  129. var nativeImage = electron.nativeImage.createFromDataURL(data);
  130. data = nativeImage.toPNG();
  131. encoding = 'binary';
  132. }
  133. catch (e)
  134. {
  135. this.showError(e);
  136. return;
  137. }
  138. }
  139. fs.writeFile(file, data, encoding, (err) => {
  140. if (err) {
  141. this.showError(err);
  142. }
  143. });
  144. }
  145. request(file, callback) {
  146. var pathname = path.join(__dirname, file);
  147. fs.exists(pathname, (exists) => {
  148. if (!exists) {
  149. callback('File not found.', null);
  150. }
  151. else {
  152. fs.readFile(pathname, (err, data) => {
  153. if (err) {
  154. callback(err, null);
  155. }
  156. else {
  157. callback(null, data);
  158. }
  159. });
  160. }
  161. });
  162. }
  163. openURL(url) {
  164. electron.shell.openExternal(url);
  165. }
  166. openFile(file, callback) {
  167. fs.exists(file, (exists) => {
  168. if (!exists) {
  169. this._view.showError('File not found.');
  170. }
  171. else {
  172. fs.stat(file, (err, stats) => {
  173. if (err) {
  174. this._view.showError(err);
  175. }
  176. else {
  177. var size = stats.size;
  178. var buffer = new Uint8Array(size);
  179. fs.open(file, 'r', (err, fd) => {
  180. if (err) {
  181. this._view.showError(err);
  182. }
  183. else {
  184. fs.read(fd, buffer, 0, size, 0, (err, bytesRead, buffer) => {
  185. if (err) {
  186. this._view.showError(err);
  187. }
  188. else {
  189. fs.close(fd, (err) => {
  190. if (err) {
  191. this._view.showError(err);
  192. }
  193. else {
  194. this._view.openBuffer(buffer, path.basename(file), (err) => {
  195. callback(err);
  196. });
  197. }
  198. });
  199. }
  200. });
  201. }
  202. });
  203. }
  204. });
  205. }
  206. });
  207. }
  208. }
  209. window.host = new ElectronHost();