From e06e63d44caeb72061a2e59e6efc40bee034d680 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Wed, 10 Apr 2019 23:38:43 -0400 Subject: add build machinery for electron --- electron/src/index.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 electron/src/index.js (limited to 'electron/src') diff --git a/electron/src/index.js b/electron/src/index.js new file mode 100644 index 00000000..398a9580 --- /dev/null +++ b/electron/src/index.js @@ -0,0 +1,33 @@ +import { app, BrowserWindow } from 'electron'; + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let mainWindow; + +const createWindow = () => { + // Create the browser window. + mainWindow = new BrowserWindow(); + + mainWindow.maximize(); + + // and load the index.html of the app. + mainWindow.loadURL(process.argv[1]); + + // Emitted when the window is closed. + mainWindow.on('closed', () => { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + mainWindow = null; + }); +}; + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', createWindow); + +// Quit when all windows are closed. +app.on('window-all-closed', () => { + app.quit(); +}); -- cgit v1.3.1 From 9b2a47136b34a4b9cfcc42282a39fdd909e9f8af Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Fri, 12 Apr 2019 17:45:57 -0400 Subject: enable print button --- electron/package.json | 15 +++++++++++---- electron/src/index.js | 21 +++++++++++++++++++-- lib/extensions/print_pdf.py | 12 ------------ lib/gui/electron.py | 22 +++++++--------------- print/resources/inkstitch.js | 11 ++++------- 5 files changed, 41 insertions(+), 40 deletions(-) (limited to 'electron/src') diff --git a/electron/package.json b/electron/package.json index 1306eb68..c902b205 100644 --- a/electron/package.json +++ b/electron/package.json @@ -6,12 +6,19 @@ "main": "src/index.js", "scripts": { "pack": "electron-builder --dir", - "dist": "electron-builder" + "dist": "electron-builder", + "dev": "electron ." }, "build": { - "linux": { "target": "dir" }, - "win": { "target": "dir" }, - "mac": { "target": "dir" } + "linux": { + "target": "dir" + }, + "win": { + "target": "dir" + }, + "mac": { + "target": "dir" + } }, "keywords": [], "author": "lex", diff --git a/electron/src/index.js b/electron/src/index.js index 398a9580..90aaea63 100644 --- a/electron/src/index.js +++ b/electron/src/index.js @@ -1,4 +1,5 @@ -import { app, BrowserWindow } from 'electron'; +import { app, BrowserWindow, ipcMain, dialog } from 'electron'; +var fs = require('fs'); // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. @@ -11,8 +12,16 @@ const createWindow = () => { mainWindow.maximize(); // and load the index.html of the app. - mainWindow.loadURL(process.argv[1]); + if (process.argv[1] == ".") { + // run in development mode with `electron . ` + var url = process.argv[2]; + } else { + var url = process.argv[1]; + } + mainWindow.loadURL(url); + mainWindow.webContents.openDevTools(); + // Emitted when the window is closed. mainWindow.on('closed', () => { // Dereference the window object, usually you would store windows @@ -31,3 +40,11 @@ app.on('ready', createWindow); app.on('window-all-closed', () => { app.quit(); }); + +ipcMain.on('print', function (event, pageSize) { + mainWindow.webContents.printToPDF({"pageSize": pageSize}, function(error, data) { + dialog.showSaveDialog(mainWindow, {"defaultPath": "inkstitch.pdf"}, function(filename, bookmark) { + fs.writeFileSync(filename, data, 'utf-8'); + }) + }) +}) \ No newline at end of file diff --git a/lib/extensions/print_pdf.py b/lib/extensions/print_pdf.py index 4d8ffbd4..0cbce479 100644 --- a/lib/extensions/print_pdf.py +++ b/lib/extensions/print_pdf.py @@ -88,18 +88,6 @@ class PrintPreviewServer(Thread): def resources(resource): return send_from_directory(self.resources_path, resource, cache_timeout=1) - @self.app.route('/printing/start') - def printing_start(): - # temporarily turn off the watcher while the print dialog is up, - # because javascript will be frozen - self.last_request_time = None - return "OK" - - @self.app.route('/printing/end') - def printing_end(): - # nothing to do here -- request_started() will restart the watcher - return "OK" - @self.app.route('/settings/', methods=['POST']) def set_field(field_name): self.metadata[field_name] = request.json['value'] diff --git a/lib/gui/electron.py b/lib/gui/electron.py index ced3ad66..f1bdeb61 100644 --- a/lib/gui/electron.py +++ b/lib/gui/electron.py @@ -1,4 +1,3 @@ -from glob import glob import os import subprocess import sys @@ -14,21 +13,14 @@ def open_url(url): if getattr(sys, 'frozen', None) is not None: electron_path = os.path.join(get_bundled_dir("electron"), "inkstitch-gui") - else: - # It's a bit trickier to find the electron app in a development environment. - base_dir = get_bundled_dir("electron") - - try: - package_dir = glob(os.path.join(base_dir, 'dist', '*-unpacked'))[0] - except IndexError: - raise Exception("Electron app not found. Be sure to run 'yarn; yarn dist' in %s." % base_dir) - - electron_path = os.path.join(base_dir, package_dir, "inkstitch-gui") - if sys.platform == "darwin": - electron_path += ".app/Contents/MacOS/inkstitch-gui" - app_process = subprocess.Popen(["open", "-a", electron_path, "--args", url]) + if sys.platform == "darwin": + electron_path += ".app/Contents/MacOS/inkstitch-gui" + subprocess.Popen(["open", "-a", electron_path, "--args", url]) + else: + app_process = subprocess.Popen([electron_path, url]) else: - app_process = subprocess.Popen([electron_path, url]) + # if we're not running in a pyinstaller bundle, run electron directly + app_process = subprocess.Popen(["yarn", "dev", url], cwd=get_bundled_dir("electron")) return app_process diff --git a/print/resources/inkstitch.js b/print/resources/inkstitch.js index c58aed8a..32a9a207 100644 --- a/print/resources/inkstitch.js +++ b/print/resources/inkstitch.js @@ -1,3 +1,5 @@ +var electron = require('electron'); + $.postJSON = function(url, data, success=null) { return $.ajax(url, { type: 'POST', @@ -366,13 +368,8 @@ $(function() { }); $('button.print').click(function() { - // printing halts all javascript activity, so we need to tell the backend - // not to shut down until we're done. - $.get("/printing/start") - .done(function() { - window.print(); - $.get("/printing/end"); - }); + var pageSize = $('select#printing-size').find(':selected').text(); + electron.ipcRenderer.send('print', pageSize) }); $('button.settings').click(function(){ -- cgit v1.3.1 From 884e193384ee34bbcb2a7cc7aa39b40e1c3334a9 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Mon, 15 Apr 2019 19:56:30 -0400 Subject: rename main.js and don't open dev tools --- electron/package.json | 2 +- electron/src/index.js | 50 -------------------------------------------------- electron/src/main.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 51 deletions(-) delete mode 100644 electron/src/index.js create mode 100644 electron/src/main.js (limited to 'electron/src') diff --git a/electron/package.json b/electron/package.json index c902b205..dbdbfd14 100644 --- a/electron/package.json +++ b/electron/package.json @@ -3,7 +3,7 @@ "productName": "inkstitch-gui", "version": "1.0.0", "description": "Ink/Stitch GUI", - "main": "src/index.js", + "main": "src/main.js", "scripts": { "pack": "electron-builder --dir", "dist": "electron-builder", diff --git a/electron/src/index.js b/electron/src/index.js deleted file mode 100644 index 90aaea63..00000000 --- a/electron/src/index.js +++ /dev/null @@ -1,50 +0,0 @@ -import { app, BrowserWindow, ipcMain, dialog } from 'electron'; -var fs = require('fs'); - -// Keep a global reference of the window object, if you don't, the window will -// be closed automatically when the JavaScript object is garbage collected. -let mainWindow; - -const createWindow = () => { - // Create the browser window. - mainWindow = new BrowserWindow(); - - mainWindow.maximize(); - - // and load the index.html of the app. - if (process.argv[1] == ".") { - // run in development mode with `electron . ` - var url = process.argv[2]; - } else { - var url = process.argv[1]; - } - mainWindow.loadURL(url); - - mainWindow.webContents.openDevTools(); - - // Emitted when the window is closed. - mainWindow.on('closed', () => { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. - mainWindow = null; - }); -}; - -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. -app.on('ready', createWindow); - -// Quit when all windows are closed. -app.on('window-all-closed', () => { - app.quit(); -}); - -ipcMain.on('print', function (event, pageSize) { - mainWindow.webContents.printToPDF({"pageSize": pageSize}, function(error, data) { - dialog.showSaveDialog(mainWindow, {"defaultPath": "inkstitch.pdf"}, function(filename, bookmark) { - fs.writeFileSync(filename, data, 'utf-8'); - }) - }) -}) \ No newline at end of file diff --git a/electron/src/main.js b/electron/src/main.js new file mode 100644 index 00000000..f78680e0 --- /dev/null +++ b/electron/src/main.js @@ -0,0 +1,50 @@ +import { app, BrowserWindow, ipcMain, dialog } from 'electron'; +var fs = require('fs'); + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let mainWindow; + +const createWindow = () => { + // Create the browser window. + mainWindow = new BrowserWindow(); + + mainWindow.maximize(); + + // and load the index.html of the app. + if (process.argv[1] == ".") { + // run in development mode with `electron . ` + var url = process.argv[2]; + } else { + var url = process.argv[1]; + } + mainWindow.loadURL(url); + + //mainWindow.webContents.openDevTools(); + + // Emitted when the window is closed. + mainWindow.on('closed', () => { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + mainWindow = null; + }); +}; + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', createWindow); + +// Quit when all windows are closed. +app.on('window-all-closed', () => { + app.quit(); +}); + +ipcMain.on('print', function (event, pageSize) { + mainWindow.webContents.printToPDF({"pageSize": pageSize}, function(error, data) { + dialog.showSaveDialog(mainWindow, {"defaultPath": "inkstitch.pdf"}, function(filename, bookmark) { + fs.writeFileSync(filename, data, 'utf-8'); + }) + }) +}) \ No newline at end of file -- cgit v1.3.1 From 0a41ad6f71dfbf30c35bdaaa5c40e953282378a3 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Thu, 18 Apr 2019 09:33:53 -0400 Subject: handle cancel in save pdf dialog --- electron/src/main.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'electron/src') diff --git a/electron/src/main.js b/electron/src/main.js index f78680e0..2774ddc6 100644 --- a/electron/src/main.js +++ b/electron/src/main.js @@ -44,7 +44,8 @@ app.on('window-all-closed', () => { ipcMain.on('print', function (event, pageSize) { mainWindow.webContents.printToPDF({"pageSize": pageSize}, function(error, data) { dialog.showSaveDialog(mainWindow, {"defaultPath": "inkstitch.pdf"}, function(filename, bookmark) { - fs.writeFileSync(filename, data, 'utf-8'); + if (typeof filename !== 'undefined') + fs.writeFileSync(filename, data, 'utf-8'); }) }) }) \ No newline at end of file -- cgit v1.3.1 From bf43633560252c4b11c00cb028676d9a7b1968b8 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Thu, 18 Apr 2019 10:14:51 -0400 Subject: add icons --- electron/package.json | 6 +++++- electron/src/assets/icons/mac/inkstitch.icns | Bin 0 -> 40005 bytes electron/src/assets/icons/png/128x128.png | Bin 0 -> 8221 bytes electron/src/assets/icons/png/16x16.png | Bin 0 -> 938 bytes electron/src/assets/icons/png/24x24.png | Bin 0 -> 1517 bytes electron/src/assets/icons/png/256x256.png | Bin 0 -> 19440 bytes electron/src/assets/icons/png/32x32.png | Bin 0 -> 2050 bytes electron/src/assets/icons/png/48x48.png | Bin 0 -> 3075 bytes electron/src/assets/icons/png/512x512.png | Bin 0 -> 38738 bytes electron/src/assets/icons/png/64x64.png | Bin 0 -> 4079 bytes electron/src/assets/icons/png/96x96.png | Bin 0 -> 6104 bytes electron/src/assets/icons/win/inkstitch.ico | Bin 0 -> 39824 bytes electron/src/main.js | 4 +++- 13 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 electron/src/assets/icons/mac/inkstitch.icns create mode 100644 electron/src/assets/icons/png/128x128.png create mode 100644 electron/src/assets/icons/png/16x16.png create mode 100644 electron/src/assets/icons/png/24x24.png create mode 100644 electron/src/assets/icons/png/256x256.png create mode 100644 electron/src/assets/icons/png/32x32.png create mode 100644 electron/src/assets/icons/png/48x48.png create mode 100644 electron/src/assets/icons/png/512x512.png create mode 100644 electron/src/assets/icons/png/64x64.png create mode 100644 electron/src/assets/icons/png/96x96.png create mode 100644 electron/src/assets/icons/win/inkstitch.ico (limited to 'electron/src') diff --git a/electron/package.json b/electron/package.json index dbdbfd14..e44c1c18 100644 --- a/electron/package.json +++ b/electron/package.json @@ -11,12 +11,15 @@ }, "build": { "linux": { + "icon": "src/assets/icons/png/512x512.png", "target": "dir" }, "win": { + "icon": "src/assets/icons/win/inkstitch.ico", "target": "dir" }, "mac": { + "icon": "src/assets/icons/mac/inkstitch.icns", "target": "dir" } }, @@ -24,7 +27,8 @@ "author": "lex", "license": "GPL-3.0+", "dependencies": { - "electron-compile": "^6.4.4" + "electron-compile": "^6.4.4", + "tmp": "0.1.0" }, "devDependencies": { "electron": "4.1.3", diff --git a/electron/src/assets/icons/mac/inkstitch.icns b/electron/src/assets/icons/mac/inkstitch.icns new file mode 100644 index 00000000..b5a05fbc Binary files /dev/null and b/electron/src/assets/icons/mac/inkstitch.icns differ diff --git a/electron/src/assets/icons/png/128x128.png b/electron/src/assets/icons/png/128x128.png new file mode 100644 index 00000000..69df4512 Binary files /dev/null and b/electron/src/assets/icons/png/128x128.png differ diff --git a/electron/src/assets/icons/png/16x16.png b/electron/src/assets/icons/png/16x16.png new file mode 100644 index 00000000..bd57c5fe Binary files /dev/null and b/electron/src/assets/icons/png/16x16.png differ diff --git a/electron/src/assets/icons/png/24x24.png b/electron/src/assets/icons/png/24x24.png new file mode 100644 index 00000000..6fbb1832 Binary files /dev/null and b/electron/src/assets/icons/png/24x24.png differ diff --git a/electron/src/assets/icons/png/256x256.png b/electron/src/assets/icons/png/256x256.png new file mode 100644 index 00000000..f3e5f0e7 Binary files /dev/null and b/electron/src/assets/icons/png/256x256.png differ diff --git a/electron/src/assets/icons/png/32x32.png b/electron/src/assets/icons/png/32x32.png new file mode 100644 index 00000000..dae25580 Binary files /dev/null and b/electron/src/assets/icons/png/32x32.png differ diff --git a/electron/src/assets/icons/png/48x48.png b/electron/src/assets/icons/png/48x48.png new file mode 100644 index 00000000..342980fd Binary files /dev/null and b/electron/src/assets/icons/png/48x48.png differ diff --git a/electron/src/assets/icons/png/512x512.png b/electron/src/assets/icons/png/512x512.png new file mode 100644 index 00000000..8f20e784 Binary files /dev/null and b/electron/src/assets/icons/png/512x512.png differ diff --git a/electron/src/assets/icons/png/64x64.png b/electron/src/assets/icons/png/64x64.png new file mode 100644 index 00000000..8d477b48 Binary files /dev/null and b/electron/src/assets/icons/png/64x64.png differ diff --git a/electron/src/assets/icons/png/96x96.png b/electron/src/assets/icons/png/96x96.png new file mode 100644 index 00000000..77c7c9e9 Binary files /dev/null and b/electron/src/assets/icons/png/96x96.png differ diff --git a/electron/src/assets/icons/win/inkstitch.ico b/electron/src/assets/icons/win/inkstitch.ico new file mode 100644 index 00000000..77ea1440 Binary files /dev/null and b/electron/src/assets/icons/win/inkstitch.ico differ diff --git a/electron/src/main.js b/electron/src/main.js index 2774ddc6..210e26ed 100644 --- a/electron/src/main.js +++ b/electron/src/main.js @@ -1,5 +1,7 @@ import { app, BrowserWindow, ipcMain, dialog } from 'electron'; var fs = require('fs'); +var path = require('path') +var tmp = require('tmp') // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. @@ -7,7 +9,7 @@ let mainWindow; const createWindow = () => { // Create the browser window. - mainWindow = new BrowserWindow(); + mainWindow = new BrowserWindow({icon: path.join(__dirname, 'assets/icons/png/512x512.png')}); mainWindow.maximize(); -- cgit v1.3.1 From 09c46e0fb499987899a2e67819099eba2c121487 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Thu, 18 Apr 2019 10:15:13 -0400 Subject: add 'save pdf' button and print opens PDF --- electron/src/main.js | 15 ++++++++++++--- print/resources/inkstitch.js | 7 ++++++- print/resources/style.css | 2 +- print/templates/ui.html | 1 + 4 files changed, 20 insertions(+), 5 deletions(-) (limited to 'electron/src') diff --git a/electron/src/main.js b/electron/src/main.js index 210e26ed..db52ac94 100644 --- a/electron/src/main.js +++ b/electron/src/main.js @@ -1,4 +1,4 @@ -import { app, BrowserWindow, ipcMain, dialog } from 'electron'; +import { app, BrowserWindow, ipcMain, dialog, shell } from 'electron'; var fs = require('fs'); var path = require('path') var tmp = require('tmp') @@ -43,11 +43,20 @@ app.on('window-all-closed', () => { app.quit(); }); -ipcMain.on('print', function (event, pageSize) { +ipcMain.on('save-pdf', function (event, pageSize) { mainWindow.webContents.printToPDF({"pageSize": pageSize}, function(error, data) { dialog.showSaveDialog(mainWindow, {"defaultPath": "inkstitch.pdf"}, function(filename, bookmark) { if (typeof filename !== 'undefined') fs.writeFileSync(filename, data, 'utf-8'); }) }) -}) \ No newline at end of file +}) + +ipcMain.on('open-pdf', function (event, pageSize) { + mainWindow.webContents.printToPDF({"pageSize": pageSize}, function(error, data) { + tmp.file({keep: true, discardDescriptor: true}, function(err, path, fd, cleanupCallback) { + fs.writeFileSync(path, data, 'utf-8'); + shell.openItem(path); + }) + }) +}) diff --git a/print/resources/inkstitch.js b/print/resources/inkstitch.js index 7c972c7a..57f62b1a 100644 --- a/print/resources/inkstitch.js +++ b/print/resources/inkstitch.js @@ -369,9 +369,14 @@ $(function() { $('button.print').click(function() { var pageSize = $('select#printing-size').find(':selected').text(); - electron.ipcRenderer.send('print', pageSize) + electron.ipcRenderer.send('open-pdf', pageSize) }); + $('button.save-pdf').click(function() { + var pageSize = $('select#printing-size').find(':selected').text(); + electron.ipcRenderer.send('save-pdf', pageSize) + }); + $('button.settings').click(function(){ $('#settings-ui').show(); }); diff --git a/print/resources/style.css b/print/resources/style.css index 9ffff07d..3e96e2ba 100644 --- a/print/resources/style.css +++ b/print/resources/style.css @@ -123,7 +123,7 @@ body { color: white; } - .ui button.print { + .ui button.print, .ui button.save-pdf { border: 1px solid rgb(50,132,50); } diff --git a/print/templates/ui.html b/print/templates/ui.html index 23e39145..57c17205 100644 --- a/print/templates/ui.html +++ b/print/templates/ui.html @@ -2,6 +2,7 @@

{{ _('Ink/Stitch Print Preview') }}

+
-- cgit v1.3.1