summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/api/install.py55
-rw-r--r--lib/api/lang.py11
-rw-r--r--lib/api/page_specs.py8
-rw-r--r--lib/api/server.py34
-rw-r--r--lib/extensions/install.py50
-rw-r--r--lib/extensions/preferences.py2
-rw-r--r--lib/extensions/print_pdf.py34
-rw-r--r--lib/extensions/simulator.py2
-rwxr-xr-xlib/gui/electron.py50
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)