From 7b0804562e4ce3b440e67de6cb001ac021326990 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Mon, 16 Apr 2018 20:17:07 -0400 Subject: [PATCH] add 'save as defaults' button --- embroider_print.py | 45 ++++++++++++++++++++++++----- inkstitch/extensions.py | 6 +++- messages.po | 11 ++++++- print/resources/inkstitch.js | 54 ++++++++++++++++++++++++++++------- print/resources/style.css | 25 +++++++++++++++- print/templates/headline.html | 5 +++- print/templates/ui.html | 5 ++-- 7 files changed, 127 insertions(+), 24 deletions(-) diff --git a/embroider_print.py b/embroider_print.py index a8daece48..fa144d1d7 100644 --- a/embroider_print.py +++ b/embroider_print.py @@ -11,6 +11,8 @@ import time import logging from copy import deepcopy import wx +import appdirs +import json import inkex import inkstitch @@ -33,6 +35,29 @@ def datetimeformat(value, format='%Y/%m/%d'): return value.strftime(format) +def defaults_path(): + defaults_dir = appdirs.user_config_dir('inkstitch') + + if not os.path.exists(defaults_dir): + os.makedirs(defaults_dir) + + return os.path.join(defaults_dir, 'print_settings.json') + + +def load_defaults(): + try: + with open(defaults_path(), 'r') as defaults_file: + defaults = json.load(defaults_file) + return defaults + except: + return {} + + +def save_defaults(defaults): + with open(defaults_path(), 'w') as defaults_file: + json.dump(defaults, defaults_file) + + def open_url(url): # Avoid spurious output from xdg-open. Any output on stdout will crash # inkscape. @@ -131,20 +156,26 @@ class PrintPreviewServer(Thread): # nothing to do here -- request_started() will restart the watcher return "OK" - @self.app.route('/metadata//set', methods=['POST']) + @self.app.route('/settings/', methods=['POST']) def set_field(field_name): self.metadata[field_name] = request.json['value'] return "OK" - @self.app.route('/metadata/', methods=['GET']) + @self.app.route('/settings/', methods=['GET']) def get_field(field_name): return jsonify(self.metadata[field_name]) - @self.app.route('/metadata', methods=['GET']) - def get_metadata(): - # It's necessary to convert the metadata to a dict because json doesn't - # trust that a MutableMapping is dict-like :( - return jsonify(dict(self.metadata)) + @self.app.route('/settings', methods=['GET']) + def get_settings(): + settings = {} + settings.update(load_defaults()) + settings.update(self.metadata) + return jsonify(settings) + + @self.app.route('/defaults', methods=['POST']) + def set_defaults(): + save_defaults(request.json['value']) + return "OK" def stop(self): # for whatever reason, shutting down only seems possible in diff --git a/inkstitch/extensions.py b/inkstitch/extensions.py index 0e0e49f82..70341cd3d 100644 --- a/inkstitch/extensions.py +++ b/inkstitch/extensions.py @@ -42,7 +42,11 @@ class InkStitchMetadata(MutableMapping): metadata = self.document.find(SVG_METADATA_TAG) if metadata is None: - metadata = inkex.etree.SubElement(self.document, SVG_METADATA_TAG) + metadata = inkex.etree.SubElement(self.document.getroot(), SVG_METADATA_TAG) + + # move it so that it goes right after the first element, sodipodi:namedview + self.document.getroot().remove(metadata) + self.document.getroot().insert(1, metadata) return metadata diff --git a/messages.po b/messages.po index aa2a05239..c6ff2fde2 100644 --- a/messages.po +++ b/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-04-02 22:11-0400\n" +"POT-Creation-Date: 2018-04-16 20:17-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -393,3 +393,12 @@ msgstr "" msgid "Printing Size" msgstr "" +msgid "Print Layouts" +msgstr "" + +msgid "Includes all settings visible here and also the icon." +msgstr "" + +msgid "Save as defaults" +msgstr "" + diff --git a/print/resources/inkstitch.js b/print/resources/inkstitch.js index 8123a31fc..ab0b587da 100644 --- a/print/resources/inkstitch.js +++ b/print/resources/inkstitch.js @@ -58,20 +58,22 @@ $(function() { var content = $(this).html(); var field_name = $(this).attr('data-field-name'); $('[data-field-name="' + field_name + '"]').text(content); - $.postJSON('/metadata/' + field_name + '/set', {value: content}); + $.postJSON('/settings/' + field_name, {value: content}); }); // load up initial metadata values - $.getJSON('/metadata', function(metadata) { - $.each(metadata, function(field_name, value) { + $.getJSON('/settings', function(settings) { + $.each(settings, function(field_name, value) { $('[data-field-name="' + field_name + '"]').each(function(i, item) { - console.log(item); - if ($(item).is(':checkbox')) { - console.log("is a checkbox"); - $(item).prop('checked', value).trigger('change'); + var item = $(item); + if (item.is(':checkbox')) { + item.prop('checked', value).trigger('change'); + } else if (item.is('img')) { + item.attr('src', value); + } else if (item.is('select')) { + item.val(value).trigger('change'); } else { - console.log("is not a checkbox"); - $(item).text(value); + item.text(value); } }); }); @@ -121,7 +123,9 @@ $(function() { // Paper Size $('select#printing-size').change(function(){ - $('.page').toggleClass('a4'); + var size = $(this).find(':selected').val(); + $('.page').toggleClass('a4', size == 'a4'); + $.postJSON('/settings/paper-size', {value: size}); }); //Checkbox @@ -133,8 +137,36 @@ $(function() { setPageNumbers(); scaleInksimulation(); - $.postJSON('/metadata/' + field_name + '/set', {value: checked}); + $.postJSON('/settings/' + field_name, {value: checked}); }); + // Logo + $('#logo-picker').change(function(e) { + var file = e.originalEvent.srcElement.files[0]; + var reader = new FileReader(); + reader.onloadend = function() { + var data = reader.result; + $('figure.brandlogo img').attr('src', data); + $.postJSON('/settings/logo', {value: data}); + }; + reader.readAsDataURL(file); + }); + + // "save as defaults" button + $('#save-settings').click(function(e) { + var settings = {}; + settings["client-overview"] = $("[data-field-name='client-overview']").is(':checked'); + settings["client-detailedview"] = $("[data-field-name='client-detailedview']").is(':checked'); + settings["operator-overview"] = $("[data-field-name='operator-overview']").is(':checked'); + settings["operator-detailedview"] = $("[data-field-name='operator-detailedview']").is(':checked'); + settings["paper-size"] = $('select#printing-size').find(':selected').val(); + + var logo = $("figure.brandlogo img").attr('src'); + if (logo.startsWith("data:")) { + settings["logo"] = logo; + } + + $.postJSON('/defaults', {'value': settings}); + }); }); diff --git a/print/resources/style.css b/print/resources/style.css index 824f8dcef..8be2370d4 100644 --- a/print/resources/style.css +++ b/print/resources/style.css @@ -226,6 +226,10 @@ body { cursor: pointer; } + #settings-ui fieldset { + margin-bottom: 1em; + } + /* Header */ @@ -247,11 +251,30 @@ body { margin: 2.5mm; } + figure.brandlogo label { + display: block; + width: 100%; + height: 100%; + line-height: 30mm; + text-align: center; + } + figure.brandlogo img { max-width: 30mm; max-height: 30mm; + display: inline; + vertical-align: middle; } - + + /* hide the actual file picker control, since we just want them to click the + * image instead + */ + #logo-picker { + width: 0px; + height: 0px; + opacity: 0%; + } + .operator-detailedview figure.brandlogo { height: 20mm; width: 30mm; diff --git a/print/templates/headline.html b/print/templates/headline.html index cbc9c43a0..421202e4e 100644 --- a/print/templates/headline.html +++ b/print/templates/headline.html @@ -1,5 +1,8 @@
diff --git a/print/templates/ui.html b/print/templates/ui.html index 9acdd1bc2..f7246962a 100644 --- a/print/templates/ui.html +++ b/print/templates/ui.html @@ -15,7 +15,7 @@

{{ _('Settings') }}

{{ _('Printing Size') }}: - @@ -23,11 +23,12 @@

- {{ ('Print Layouts') }}: + {{ _('Print Layouts') }}:

+