summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/extensions/lettering_generate_json.py20
-rw-r--r--lib/gui/edit_json/editable_list.py2
-rw-r--r--lib/gui/edit_json/main_panel.py33
-rw-r--r--lib/gui/edit_json/settings_panel.py21
-rw-r--r--templates/lettering_generate_json.xml2
5 files changed, 59 insertions, 19 deletions
diff --git a/lib/extensions/lettering_generate_json.py b/lib/extensions/lettering_generate_json.py
index f4a01ddb..bfdd1055 100644
--- a/lib/extensions/lettering_generate_json.py
+++ b/lib/extensions/lettering_generate_json.py
@@ -38,6 +38,7 @@ class LetteringGenerateJson(InkstitchExtension):
self.arg_parser.add_argument("--use-custom-leading", type=Boolean, default="false", dest="use_custom_leading")
self.arg_parser.add_argument("--use-custom-spacing", type=Boolean, default="false", dest="use_custom_spacing")
self.arg_parser.add_argument("--use-custom-letter-spacing", type=Boolean, default="false", dest="use_custom_letter_spacing")
+ self.arg_parser.add_argument("--use-glyph-width", type=Boolean, default="false", dest="use_glyph_width")
self.arg_parser.add_argument("-l", "--leading", type=int, default=100, dest="leading")
self.arg_parser.add_argument("-w", "--word-spacing", type=int, default=20, dest="word_spacing")
self.arg_parser.add_argument("-b", "--letter-spacing", type=int, default=100, dest="letter_spacing")
@@ -61,17 +62,14 @@ class LetteringGenerateJson(InkstitchExtension):
hkern = font_info.hkern()
custom_leading = self.options.use_custom_leading
custom_spacing = self.options.use_custom_spacing
- custom_letter_spacing = self.options.use_custom_letter_spacing
word_spacing = font_info.word_spacing()
# use user input in case that the default word spacing is not defined
# in the svg file or the user forces custom values
if custom_spacing or not word_spacing:
word_spacing = self.options.word_spacing
- letter_spacing = font_info.letter_spacing()
- # use user input in case that the default word spacing is not defined
- # in the svg file or the user forces custom values
- if custom_letter_spacing or not letter_spacing:
- letter_spacing = self.options.letter_spacing
+
+ letter_spacing = self._get_letter_spacing(font_info)
+
units_per_em = font_info.units_per_em() or self.options.leading
# use units_per_em for leading (line height) if defined in the font file,
# unless the user wishes to overwrite the value
@@ -127,3 +125,13 @@ class LetteringGenerateJson(InkstitchExtension):
# write data to font.json into the same directory as the font file
with open(output_path, 'w', encoding="utf8") as font_data:
json.dump(data, font_data, indent=4, ensure_ascii=False)
+
+ def _get_letter_spacing(self, font_info):
+ letter_spacing = font_info.letter_spacing()
+ # use user input in case that the default word spacing is not defined
+ # in the svg file or the user forces custom values
+ if self.options.use_custom_letter_spacing or not letter_spacing:
+ letter_spacing = self.options.letter_spacing
+ if self.options.use_glyph_width:
+ letter_spacing = None
+ return letter_spacing
diff --git a/lib/gui/edit_json/editable_list.py b/lib/gui/edit_json/editable_list.py
index 8f62f554..7a51f0b6 100644
--- a/lib/gui/edit_json/editable_list.py
+++ b/lib/gui/edit_json/editable_list.py
@@ -24,12 +24,12 @@ class EditableListCtrl(wx.ListCtrl, TextEditMixin):
event.Skip()
def CloseEditor(self, event=None, swap=False):
- text = self.editor.GetValue()
if swap:
self.editor.Hide()
TextEditMixin.CloseEditor(self, event)
return
+ text = self.editor.GetValue()
if text:
try:
float(text)
diff --git a/lib/gui/edit_json/main_panel.py b/lib/gui/edit_json/main_panel.py
index bd43f523..7cf82ab7 100644
--- a/lib/gui/edit_json/main_panel.py
+++ b/lib/gui/edit_json/main_panel.py
@@ -125,12 +125,25 @@ class LetteringEditJsonPanel(wx.Panel):
event.Skip()
def on_horiz_adv_x_default_changed(self, event=None):
- self.font_meta['horiz_adv_x_default'] = event.GetValue()
+ value = event.GetValue()
+ if not self.settings_panel.font_kerning.horiz_adv_x_default_null_checkbox.IsChecked():
+ self.update_horiz_adv_x_default(value)
+
+ def on_horiz_adv_x_default_checkbox_changed(self, event=None):
+ value = event.IsChecked()
+ if value is False:
+ value = self.settings_panel.font_kerning.horiz_adv_x_default.GetValue()
+ else:
+ value = None
+ self.update_horiz_adv_x_default(value)
+
+ def update_horiz_adv_x_default(self, value):
+ self.font_meta['horiz_adv_x_default'] = value
glyph_list = self.settings_panel.glyph_list
for i in range(glyph_list.ItemCount):
- selected = glyph_list.IsItemChecked(i)
+ checked = glyph_list.IsItemChecked(i)
glyph = glyph_list.GetItem(i, 1).Text
- if selected:
+ if checked:
self.horiz_adv_x[glyph] = self.font_meta['horiz_adv_x_default']
self.update_preview()
@@ -341,8 +354,10 @@ class LetteringEditJsonPanel(wx.Panel):
self.settings_panel.font_kerning.min_scale.SetValue(self.font.min_scale)
if self.font.horiz_adv_x_default is None:
self.settings_panel.font_kerning.horiz_adv_x_default.SetValue(0.0)
+ self.settings_panel.font_kerning.horiz_adv_x_default_null_checkbox.SetValue(True)
else:
self.settings_panel.font_kerning.horiz_adv_x_default.SetValue(self.font.horiz_adv_x_default)
+ self.settings_panel.font_kerning.horiz_adv_x_default_null_checkbox.SetValue(False)
self.settings_panel.font_kerning.horiz_adv_x_space.SetValue(self.font.word_spacing)
def update_filter_list(self):
@@ -423,13 +438,9 @@ class LetteringEditJsonPanel(wx.Panel):
with open(json_file, 'r') as font_data:
data = json.load(font_data)
- horiz_adv_x_default = self.font_meta['horiz_adv_x_default']
- if horiz_adv_x_default == 0:
- horiz_adv_x_default = None
-
for key, val in self.font_meta.items():
data[key] = val
- horiz_adv_x = {key: val for key, val in self.horiz_adv_x.items() if val != self.font_meta['horiz_adv_x_default']}
+ horiz_adv_x = {key: val for key, val in self.horiz_adv_x.items() if key and val != self.font_meta['horiz_adv_x_default']}
kerning_pairs = {key: val for key, val in self.kerning_pairs.items() if val != 0}
data['horiz_adv_x'] = horiz_adv_x
data['kerning_pairs'] = kerning_pairs
@@ -514,12 +525,14 @@ class LetteringEditJsonPanel(wx.Panel):
node.set('transform', transform)
horiz_adv_x_default = self.font_meta['horiz_adv_x_default']
- if horiz_adv_x_default in [0, None]:
+ if horiz_adv_x_default is None:
horiz_adv_x_default = glyph.width + glyph.min_x
+ horiz_adv_x = self.font.horiz_adv_x.get(character, horiz_adv_x_default)
# in some rare cases, horiz_adv_x for a character returns None
# so we need to really ensure that the default is used in this case
- horiz_adv_x = self.font.horiz_adv_x.get(character, horiz_adv_x_default) or horiz_adv_x_default
+ if horiz_adv_x is None:
+ horiz_adv_x = horiz_adv_x_default
position_x += horiz_adv_x - glyph.min_x
self.font._update_commands(node, glyph)
diff --git a/lib/gui/edit_json/settings_panel.py b/lib/gui/edit_json/settings_panel.py
index b4fd51d9..a16ac53a 100644
--- a/lib/gui/edit_json/settings_panel.py
+++ b/lib/gui/edit_json/settings_panel.py
@@ -201,7 +201,7 @@ class GeneralKerning(wx.Panel):
wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.VERTICAL)
- grid_sizer = wx.FlexGridSizer(20, 2, 10, 10)
+ grid_sizer = wx.FlexGridSizer(20, 3, 10, 10)
grid_sizer.AddGrowableCol(1)
size_label = wx.StaticText(self, label=_("Size"))
@@ -236,6 +236,12 @@ class GeneralKerning(wx.Panel):
wx.EVT_SPINCTRLDOUBLE,
self.parent.on_horiz_adv_x_default_changed
)
+ self.horiz_adv_x_default_null_checkbox = wx.CheckBox(self, label=_("Glyph width"))
+ self.horiz_adv_x_default_null_checkbox.SetToolTip(_("Use the width of the individual glyphs."))
+ self.horiz_adv_x_default_null_checkbox.Bind(
+ wx.EVT_CHECKBOX,
+ self.parent.on_horiz_adv_x_default_checkbox_changed
+ )
horiz_adv_x_space_label = wx.StaticText(self, label=_("Horizontal advance x space"))
self.horiz_adv_x_space = wx.SpinCtrlDouble(self, min=0, max=10000, inc=0.1, initial=50, style=wx.SP_WRAP)
self.horiz_adv_x_space.Bind(
@@ -246,16 +252,27 @@ class GeneralKerning(wx.Panel):
grid_sizer.AddMany([
(size_label, 0, wx.ALL, 0),
(self.size, 1, wx.ALL | wx.EXPAND, 0),
+ (wx.StaticText(self), 1, wx.ALL | wx.EXPAND, 0),
+
(min_scale_label, 0, wx.ALL, 0),
(self.min_scale, 1, wx.ALL | wx.EXPAND, 0),
+ (wx.StaticText(self), 1, wx.ALL | wx.EXPAND, 0),
+
(max_scale_label, 0, wx.ALL, 0),
(self.max_scale, 1, wx.ALL | wx.EXPAND, 0),
+ (wx.StaticText(self), 1, wx.ALL | wx.EXPAND, 0),
+
(leading_label, 0, wx.ALL, 0),
(self.leading, 1, wx.ALL | wx.EXPAND, 0),
+ (wx.StaticText(self), 1, wx.ALL | wx.EXPAND, 0),
+
(horiz_adv_x_default_label, 0, wx.ALL, 0),
(self.horiz_adv_x_default, 1, wx.ALL | wx.EXPAND, 0),
+ (self.horiz_adv_x_default_null_checkbox, 1, wx.ALL | wx.EXPAND, 0),
+
(horiz_adv_x_space_label, 0, wx.ALL, 0),
- (self.horiz_adv_x_space, 1, wx.ALL | wx.EXPAND, 0)
+ (self.horiz_adv_x_space, 1, wx.ALL | wx.EXPAND, 0),
+ (wx.StaticText(self), 1, wx.ALL | wx.EXPAND, 0)
])
sizer.Add(grid_sizer, 1, wx.EXPAND | wx.ALL, 10)
diff --git a/templates/lettering_generate_json.xml b/templates/lettering_generate_json.xml
index a111e888..d6666a7a 100644
--- a/templates/lettering_generate_json.xml
+++ b/templates/lettering_generate_json.xml
@@ -116,6 +116,8 @@
<param name="letter-spacing" type="int" precision="1" min="-100" max="500" gui-text="Letter spacing (px)"
gui-description="Letter spacing (default: 100)" indent="1">100</param>
</hbox>
+ <param name="use-glyph-width" type="bool" gui-text="Use glyph width" indent="4"
+ gui-description="Use glyph width to define letter spacing.">false</param>
<spacer />
<separator indent="1"/>