kopia lustrzana https://github.com/inkstitch/inkstitch
add 'save as defaults' button
rodzic
f9b90d31b7
commit
7b0804562e
|
@ -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/<field_name>/set', methods=['POST'])
|
||||
@self.app.route('/settings/<field_name>', methods=['POST'])
|
||||
def set_field(field_name):
|
||||
self.metadata[field_name] = request.json['value']
|
||||
return "OK"
|
||||
|
||||
@self.app.route('/metadata/<field_mame>', methods=['GET'])
|
||||
@self.app.route('/settings/<field_mame>', 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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
11
messages.po
11
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 <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\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 ""
|
||||
|
||||
|
|
|
@ -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});
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
<figure class="brandlogo">
|
||||
<img src="{{ logo.src or "resources/inkstitch-logo.svg" }}" alt="{{ logo.title }}" title="{{ logo.title }}">
|
||||
<label for="logo-picker">
|
||||
<img src="{{ logo.src or "resources/inkstitch-logo.svg" }}" alt="{{ logo.title }}" title="{{ logo.title }}" data-field-name="logo">
|
||||
<input type=file id="logo-picker" />
|
||||
</label>
|
||||
</figure>
|
||||
<div class="headline">
|
||||
<div class="pageTitle">
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<h1>{{ _('Settings') }}</h1>
|
||||
<div>
|
||||
<p>{{ _('Printing Size') }}:
|
||||
<select id="printing-size">
|
||||
<select id="printing-size" data-field-name="paper-size">
|
||||
<option value="letter" selected="selected">Letter</option>
|
||||
<option value="a4">A4</option>
|
||||
</select>
|
||||
|
@ -23,11 +23,12 @@
|
|||
</div>
|
||||
<div>
|
||||
<fieldset>
|
||||
<legend>{{ ('Print Layouts') }}:</legend>
|
||||
<legend>{{ _('Print Layouts') }}:</legend>
|
||||
<p><input type="checkbox" id="client-overview" data-field-name="client-overview" /><label for="client-overview">Client Overview</label></p>
|
||||
<p><input type="checkbox" id="client-detailedview" data-field-name="client-detailedview" /><label for="client-detailedview">Client Detailed View</label></p>
|
||||
<p><input type="checkbox" id="operator-overview" data-field-name="operator-overview" CHECKED /><label for="operator-overview">Operator Overview</label></p>
|
||||
<p><input type="checkbox" id="operator-detailedview" data-field-name="operator-detailedview" CHECKED /><label for="operator-detailedview">Operator Detailed View</label></p>
|
||||
</fieldset>
|
||||
<button id="save-settings" title="{{ _("Includes all settings visible here and also the icon.") }}">{{ _("Save as defaults") }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
Ładowanie…
Reference in New Issue