diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/api/install.py | 55 | ||||
| -rw-r--r-- | lib/api/lang.py | 11 | ||||
| -rw-r--r-- | lib/api/page_specs.py | 8 | ||||
| -rw-r--r-- | lib/api/server.py | 34 | ||||
| -rw-r--r-- | lib/extensions/install.py | 50 | ||||
| -rw-r--r-- | lib/extensions/preferences.py | 2 | ||||
| -rw-r--r-- | lib/extensions/print_pdf.py | 34 | ||||
| -rw-r--r-- | lib/extensions/simulator.py | 2 | ||||
| -rwxr-xr-x | lib/gui/electron.py | 50 |
9 files changed, 139 insertions, 107 deletions
diff --git a/lib/api/install.py b/lib/api/install.py deleted file mode 100644 index 654f8171..00000000 --- a/lib/api/install.py +++ /dev/null @@ -1,55 +0,0 @@ -# Authors: see git history -# -# Copyright (c) 2010 Authors -# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details. - -import os -import sys -from glob import glob - -from flask import Blueprint, jsonify, request - -from ..utils import get_bundled_dir, guess_inkscape_config_path - -install = Blueprint('install', __name__) - - -@install.route('/palettes', methods=["POST"]) -def palettes(): - try: - base_path = request.json.get('path') or guess_inkscape_config_path() - path = os.path.join(base_path, 'palettes') - src_dir = get_bundled_dir('palettes') - copy_files(glob(os.path.join(src_dir, "*")), path) - except Exception as exc: - return jsonify({"error": str(exc)}), 500 - - return jsonify({"status": "success"}) - - -if sys.platform == "win32": - # If we try to just use shutil.copy it says the operation requires elevation. - def copy_files(files, dest): - import pythoncom - import winutils - - pythoncom.CoInitialize() - - if not os.path.exists(dest): - os.makedirs(dest) - - winutils.copy(files, dest) -else: - def copy_files(files, dest): - import shutil - - if not os.path.exists(dest): - os.makedirs(dest) - - for palette_file in files: - shutil.copy(palette_file, dest) - - -@install.route('/default-path') -def default_path(): - return guess_inkscape_config_path() diff --git a/lib/api/lang.py b/lib/api/lang.py new file mode 100644 index 00000000..73c190f4 --- /dev/null +++ b/lib/api/lang.py @@ -0,0 +1,11 @@ +import os + +from flask import Blueprint, jsonify + +languages = Blueprint('languages', __name__) + + +@languages.route('') +def get_lang(): + languages = dict(os.environ) + return jsonify(languages) diff --git a/lib/api/page_specs.py b/lib/api/page_specs.py index 7b023683..8d3aee49 100644 --- a/lib/api/page_specs.py +++ b/lib/api/page_specs.py @@ -15,16 +15,22 @@ def get_page_specs(): height = svg.get('height', 0) pagecolor = "white" deskcolor = "white" + bordercolor = "black" + showpageshadow = True namedview = svg.namedview if namedview is not None: pagecolor = namedview.get('pagecolor', pagecolor) deskcolor = namedview.get('inkscape:deskcolor', deskcolor) + bordercolor = namedview.get('bordercolor', bordercolor) + showpageshadow = namedview.get('inkscape:showpageshadow', showpageshadow) page_specs = { "width": width, "height": height, "pagecolor": pagecolor, - "deskcolor": deskcolor + "deskcolor": deskcolor, + "bordercolor": bordercolor, + "showpageshadow": showpageshadow } return jsonify(page_specs) diff --git a/lib/api/server.py b/lib/api/server.py index 41a42731..26efa521 100644 --- a/lib/api/server.py +++ b/lib/api/server.py @@ -9,17 +9,20 @@ import socket import sys import time from threading import Thread +from contextlib import closing import requests from flask import Flask, g from werkzeug.serving import make_server from ..utils.json import InkStitchJSONProvider -from .install import install from .simulator import simulator from .stitch_plan import stitch_plan from .preferences import preferences from .page_specs import page_specs +from .lang import languages +# this for electron axios +from flask_cors import CORS class APIServer(Thread): @@ -42,13 +45,14 @@ class APIServer(Thread): cli.show_server_banner = lambda *x: None self.app = Flask(__name__) + CORS(self.app) self.app.json = InkStitchJSONProvider(self.app) self.app.register_blueprint(simulator, url_prefix="/simulator") self.app.register_blueprint(stitch_plan, url_prefix="/stitch_plan") - self.app.register_blueprint(install, url_prefix="/install") self.app.register_blueprint(preferences, url_prefix="/preferences") self.app.register_blueprint(page_specs, url_prefix="/page_specs") + self.app.register_blueprint(languages, url_prefix="/languages") @self.app.before_request def store_extension(): @@ -67,25 +71,21 @@ class APIServer(Thread): def disable_logging(self): logging.getLogger('werkzeug').setLevel(logging.ERROR) + # https://github.com/aluo-x/Learning_Neural_Acoustic_Fields/blob/master/train.py + # https://github.com/pytorch/pytorch/issues/71029 + def find_free_port(self): + with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: + s.bind(('localhost', 0)) + return s.getsockname()[1] + def run(self): self.disable_logging() self.host = "127.0.0.1" - self.port = 5000 - - while True: - try: - self.flask_server = make_server(self.host, self.port, self.app) - self.server_thread = Thread(target=self.flask_server.serve_forever) - self.server_thread.start() - except socket.error as e: - if e.errno == errno.EADDRINUSE: - self.port += 1 - continue - else: - raise - else: - break + self.port = self.find_free_port() + self.flask_server = make_server(self.host, self.port, self.app) + self.server_thread = Thread(target=self.flask_server.serve_forever) + self.server_thread.start() def ready_checker(self): """Wait until the server is started. diff --git a/lib/extensions/install.py b/lib/extensions/install.py index 62cfde73..501694ed 100644 --- a/lib/extensions/install.py +++ b/lib/extensions/install.py @@ -4,18 +4,48 @@ # Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details. from .base import InkstitchExtension -from ..api import APIServer -from ..gui import open_url +import os +import sys +from glob import glob +from ..utils import get_bundled_dir, guess_inkscape_config_path +from inkex import errormsg +from ..i18n import _ class Install(InkstitchExtension): - def __init__(self): - InkstitchExtension.__init__(self) + def __init__(self, *args, **kwargs): + InkstitchExtension.__init__(self, *args, **kwargs) def effect(self): - api_server = APIServer(self) - port = api_server.start_server() - electron = open_url("/install?port=%d" % port) - electron.wait() - api_server.stop() - api_server.join() + path = os.path.join(guess_inkscape_config_path(), 'palettes') + src_dir = get_bundled_dir('palettes') + try: + copy_files(glob(os.path.join(src_dir, "*")), path) + errormsg(_("Successfully installed color palettes for Inkscape.\n\n" + "Please restart Inkscape.")) + except IOError: + errormsg(_("Could not install color palettes. Please file an issue on " + "https://github.com/inkstitch/inkstitch/issues")) + + +if sys.platform == "win32": + # If we try to just use shutil.copy it says the operation requires elevation. + def copy_files(files, dest): + import pythoncom + import winutils + + pythoncom.CoInitialize() + + if not os.path.exists(dest): + os.makedirs(dest) + + winutils.copy(files, dest) +else: + def copy_files(files, dest): + import shutil + + if not os.path.exists(dest): + os.makedirs(dest) + + for palette_file in files: + shutil.copy(palette_file, dest) diff --git a/lib/extensions/preferences.py b/lib/extensions/preferences.py index 8a06f829..44c1b5aa 100644 --- a/lib/extensions/preferences.py +++ b/lib/extensions/preferences.py @@ -27,7 +27,7 @@ class Preferences(InkstitchExtension): def effect(self): api_server = APIServer(self) port = api_server.start_server() - electron = open_url("/preferences?port=%d" % port) + electron = open_url("/preferences", port) electron.wait() api_server.stop() api_server.join() diff --git a/lib/extensions/print_pdf.py b/lib/extensions/print_pdf.py index 01878e8d..1d5af76a 100644 --- a/lib/extensions/print_pdf.py +++ b/lib/extensions/print_pdf.py @@ -3,7 +3,6 @@ # Copyright (c) 2010 Authors # Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details. -import errno import json import logging import os @@ -13,6 +12,7 @@ import time from copy import deepcopy from datetime import date from threading import Thread +from contextlib import closing import appdirs from flask import Flask, Response, jsonify, request, send_from_directory @@ -162,25 +162,24 @@ class PrintPreviewServer(Thread): def disable_logging(self): logging.getLogger('werkzeug').setLevel(logging.ERROR) + # https://github.com/aluo-x/Learning_Neural_Acoustic_Fields/blob/master/train.py + # https://github.com/pytorch/pytorch/issues/71029 + def find_free_port(self): + with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: + s.bind(('localhost', 0)) + return s.getsockname()[1] + def run(self): self.disable_logging() self.host = "127.0.0.1" - self.port = 5000 - - while True: - try: - self.flask_server = make_server(self.host, self.port, self.app) - self.server_thread = Thread(target=self.flask_server.serve_forever) - self.server_thread.start() - except socket.error as e: - if e.errno == errno.EADDRINUSE: - self.port += 1 - continue - else: - raise - else: - break + self.port = self.find_free_port() + # exporting the port number for languages to work in electron vuejs part of inkstitch + os.environ['FLASKPORT'] = str(self.port) + + self.flask_server = make_server(self.host, self.port, self.app) + self.server_thread = Thread(target=self.flask_server.serve_forever) + self.server_thread.start() class Print(InkstitchExtension): @@ -331,13 +330,12 @@ class Print(InkstitchExtension): realistic_color_block_svgs=realistic_color_block_svgs ) print_server.start() - # Wait for print_server.host and print_server.port to be populated. # Hacky, but Flask doesn't have an option for a callback to be run # after startup. time.sleep(0.5) - browser_window = open_url("http://%s:%s/" % (print_server.host, print_server.port)) + browser_window = open_url(print_server.host, print_server.port, True) browser_window.wait() print_server.stop() print_server.join() diff --git a/lib/extensions/simulator.py b/lib/extensions/simulator.py index c04e1acd..3b532bf2 100644 --- a/lib/extensions/simulator.py +++ b/lib/extensions/simulator.py @@ -18,7 +18,7 @@ class Simulator(InkstitchExtension): return api_server = APIServer(self) port = api_server.start_server() - electron = open_url("/simulator?port=%d" % port) + electron = open_url("/simulator", port) electron.wait() api_server.stop() api_server.join() diff --git a/lib/gui/electron.py b/lib/gui/electron.py index 75e3b16c..4178ef87 100755 --- a/lib/gui/electron.py +++ b/lib/gui/electron.py @@ -3,6 +3,7 @@ # Copyright (c) 2010 Authors # Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details. +import json import os import subprocess import sys @@ -12,11 +13,27 @@ from ..utils import get_bundled_dir app_process = None -def open_url(url): +def open_url(url, port, pdf=False): # noqa: C901 global app - command = [] + if not pdf: + url = f'{url}?port={port}' + os.environ['FLASKPORT'] = str(port) + + # this creates the .json for dev mode to get translations + if getattr(sys, 'frozen', None) is None: + dynamic_port = { + "_comment1": "port should not be declared when commiting", + "port": port, + } + port_object = json.dumps(dynamic_port, indent=1) + with open(os.path.join("electron/src/lib/flaskserverport.json"), "w") as outfile: + outfile.write(port_object) + else: + url = f'http://{url}:{port}/' + cwd = None + searchstring = "http" if getattr(sys, 'frozen', None) is not None: electron_path = os.path.join(get_bundled_dir("electron"), "inkstitch-gui") @@ -42,8 +59,33 @@ def open_url(url): pass else: mac_dev_env["PATH"] = yarn_path + mac_dev_env["PATH"] + # checking URL for flask server address for printToPDF + if searchstring in url: + with open(os.devnull, 'w') as null: + subprocess.Popen(["yarn", "just-build"], cwd=cwd, stdout=null, env=mac_dev_env).wait() + else: + pass + with open(os.devnull, 'w') as null: return subprocess.Popen(command, cwd=cwd, stdout=null, env=mac_dev_env) else: - with open(os.devnull, 'w') as null: - return subprocess.Popen(command, cwd=cwd, stdout=null) + if searchstring in url and getattr(sys, 'frozen', None) is None: + with open(os.devnull, 'w') as null: + subprocess.Popen(["yarn", "just-build"], cwd=cwd, stdout=null).wait() + else: + pass + if sys.platform == "linux": + # Pyinstaller fix for gnome document view not opening. + lenv = dict(os.environ) + lp_key = 'LD_LIBRARY_PATH' + lp_orig = lenv.get(lp_key + '_ORIG') + if lp_orig is not None: + lenv[lp_key] = lp_orig # restore the original, unmodified value + else: + lenv.pop(lp_key, None) + + with open(os.devnull, 'w') as null: + return subprocess.Popen(command, cwd=cwd, stdout=null, env=lenv) + else: + with open(os.devnull, 'w') as null: + return subprocess.Popen(command, cwd=cwd, stdout=null) |
