From 2c295ace644a27b7d1523c047e168aac2ead03dc Mon Sep 17 00:00:00 2001 From: Kaalleen <36401965+kaalleen@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:25:49 +0200 Subject: Edit json: allow 0 values for horiz_adv_x_default (#3965) * edit json: allow 0 values for horiz_adv_x_default and enable None for using the glyph width * enable None value in generate json too --- lib/extensions/lettering_generate_json.py | 20 +++++++++++++------ lib/gui/edit_json/editable_list.py | 2 +- lib/gui/edit_json/main_panel.py | 33 +++++++++++++++++++++---------- lib/gui/edit_json/settings_panel.py | 21 ++++++++++++++++++-- templates/lettering_generate_json.xml | 2 ++ 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 @@ 100 + false -- cgit v1.2.3