Skip to content

Commit ad6b929

Browse files
authored
lettering: enable ltr, rtl, ttb, btt file names for font variants (instead of the arrows) (#4087)
1 parent c79d27b commit ad6b929

File tree

5 files changed

+60
-46
lines changed

5 files changed

+60
-46
lines changed

lib/extensions/lettering_generate_json.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def __init__(self, *args, **kwargs):
2424

2525
self.arg_parser.add_argument("-n", "--font-name", type=str, default="Font", dest="font_name")
2626
self.arg_parser.add_argument("-d", "--font-description", type=str, default="Description", dest="font_description")
27-
self.arg_parser.add_argument("-v", "--default_variant", type=int, default=0, dest="default_variant")
27+
self.arg_parser.add_argument("-v", "--default_variant", type=int, default="ltr", dest="default_variant")
2828
self.arg_parser.add_argument("-x", "--text_direction", type=str, default="ltr", dest="text_direction")
2929
self.arg_parser.add_argument("-s", "--auto-satin", type=Boolean, default="true", dest="auto_satin")
3030
self.arg_parser.add_argument("-r", "--reversible", type=Boolean, default="true", dest="reversible")
@@ -88,20 +88,10 @@ def effect(self):
8888
combine_at_sort_indices = self.options.combine_at_sort_indices.split(',')
8989
combine_at_sort_indices = set([index.strip() for index in combine_at_sort_indices if index.strip()])
9090

91-
# The inx gui doesn't seem to be able to remember the arrow values,
92-
# therefore we used numbers which we need to convert now
93-
default_variant = "→"
94-
if self.options.default_variant == 1:
95-
default_variant = "←"
96-
elif self.options.default_variant == 2:
97-
default_variant = "↓"
98-
elif self.options.default_variant == 3:
99-
default_variant = "↑"
100-
10191
# collect data
10292
data = {'name': self.options.font_name,
10393
'description': self.options.font_description,
104-
'default_variant': default_variant,
94+
'default_variant': self.options.default_variant,
10595
'text_direction': self.options.text_direction,
10696
'keywords': keywords,
10797
'leading': leading,

lib/gui/edit_json/main_panel.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,13 +178,13 @@ def on_combine_indices_changed(self, event=None):
178178

179179
def on_default_variant_change(self, event=None):
180180
selection = self.settings_panel.font_info.default_variant.GetSelection()
181-
value = ''
181+
value = 'ltr'
182182
if selection == 1:
183-
value = ''
183+
value = 'rtl'
184184
elif selection == 2:
185-
value = ''
185+
value = 'ttb'
186186
elif selection == 3:
187-
value = ''
187+
value = 'btt'
188188
self.font_meta['default_variant'] = value
189189
self.update_preview()
190190

@@ -331,7 +331,7 @@ def update_settings(self):
331331
# update ctrl
332332
self.settings_panel.font_info.name.ChangeValue(self.font.name)
333333
self.settings_panel.font_info.description.ChangeValue(self.font.metadata['description'])
334-
selection = ['→', '←', '↓', '↑'].index(self.font.json_default_variant)
334+
selection = [_('ltr'), _('rtl'), _('ttb'), _('btt')].index(self.font.json_default_variant)
335335
self.settings_panel.font_info.default_variant.SetSelection(selection)
336336
selection = ['ltr', 'rtl'].index(self.font.text_direction)
337337
self.settings_panel.font_info.text_direction.SetSelection(selection)

lib/lettering/font.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,6 @@ def _load_variants(self):
132132
name = font_metadata('name', '')
133133
description = localized_font_metadata('description', '')
134134
keywords = font_metadata('keywords', '')
135-
json_default_variant = font_metadata('default_variant', FontVariant.LEFT_TO_RIGHT)
136135
text_direction = font_metadata('text_direction', 'ltr')
137136
letter_case = font_metadata('letter_case', '')
138137
default_glyph = font_metadata('default_glyph', "�")
@@ -143,6 +142,15 @@ def _load_variants(self):
143142
max_scale = font_metadata('max_scale', 1.0)
144143
size = font_metadata('size', 0)
145144
available_glyphs = font_metadata('glyphs', [])
145+
json_variant = font_metadata('default_variant', FontVariant.LEFT_TO_RIGHT[1])
146+
147+
@property
148+
def json_default_variant(self):
149+
variant = self.json_variant
150+
if variant in FontVariant.LEGACY_VARIANT_TYPES:
151+
index = FontVariant.LEGACY_VARIANT_TYPES.index(variant)
152+
variant = FontVariant.VARIANT_TYPES[index]
153+
return variant
146154

147155
# use values from SVG Font, example:
148156
# <font horiz-adv-x="45" ... <glyph .... horiz-adv-x="49" glyph-name="A" /> ... <hkern ... k="3"g1="A" g2="B" /> .... />
@@ -183,16 +191,22 @@ def preview_image(self):
183191
def has_variants(self):
184192
# returns available variants
185193
font_variants = []
186-
for variant in FontVariant.VARIANT_TYPES:
187-
if os.path.isfile(os.path.join(self.path, "%s.svg" % variant)):
188-
font_variants.append(variant)
189-
elif (os.path.isdir(os.path.join(self.path, "%s" % variant)) and
190-
[svg for svg in os.listdir(os.path.join(self.path, "%s" % variant)) if svg.endswith('.svg')]):
194+
for variant, legacy_variant in zip(FontVariant.VARIANT_TYPES, FontVariant.LEGACY_VARIANT_TYPES):
195+
if self._has_variant(variant) or self._has_variant(legacy_variant):
191196
font_variants.append(variant)
192197
if not font_variants:
198+
# still no variants, raise FontError
193199
raise FontError(_("The font '%s' has no variants.") % self.name)
194200
return font_variants
195201

202+
def _has_variant(self, variant):
203+
if (os.path.isfile(os.path.join(self.path, "%s.svg" % variant)) or (
204+
os.path.isdir(os.path.join(self.path, "%s" % variant)) and
205+
[svg for svg in os.listdir(os.path.join(self.path, "%s" % variant)) if svg.endswith('.svg')])):
206+
return True
207+
else:
208+
return False
209+
196210
@property
197211
def marked_custom_font_id(self):
198212
if not self.is_custom_font():
@@ -241,8 +255,8 @@ def render_text(self, text, destination_group, variant=None, back_and_forth=True
241255
line = line[::-1]
242256

243257
letter_group = self._render_line(destination_group, line, position, glyph_set, i, letter_spacing, word_spacing)
244-
if ((variant == '→' and back_and_forth and self.reversible and i % 2 == 1) or
245-
(variant == '←' and not (back_and_forth and self.reversible and i % 2 == 1))):
258+
if ((variant in FontVariant.LEFT_TO_RIGHT and back_and_forth and self.reversible and i % 2 == 1) or
259+
(variant in FontVariant.RIGHT_TO_LEFT and not (back_and_forth and self.reversible and i % 2 == 1))):
246260
letter_group[:] = reversed(letter_group)
247261
for group in letter_group:
248262
group[:] = reversed(group)

lib/lettering/font_variant.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,24 @@ class FontVariant(object):
3232

3333
# We use unicode characters rather than English strings for font file names
3434
# in order to be more approachable for languages other than English.
35-
LEFT_TO_RIGHT = "→"
36-
RIGHT_TO_LEFT = "←"
37-
TOP_TO_BOTTOM = "↓"
38-
BOTTOM_TO_TOP = "↑"
39-
VARIANT_TYPES = (LEFT_TO_RIGHT, RIGHT_TO_LEFT, TOP_TO_BOTTOM, BOTTOM_TO_TOP)
35+
LEFT_TO_RIGHT = ["→", "ltr"]
36+
RIGHT_TO_LEFT = ["←", "rtl"]
37+
TOP_TO_BOTTOM = ["↓", "ttb"]
38+
BOTTOM_TO_TOP = ["↑", "btt"]
39+
VARIANT_TYPES = (LEFT_TO_RIGHT[1], RIGHT_TO_LEFT[1], TOP_TO_BOTTOM[1], BOTTOM_TO_TOP[1])
40+
LEGACY_VARIANT_TYPES = (LEFT_TO_RIGHT[0], RIGHT_TO_LEFT[0], TOP_TO_BOTTOM[0], BOTTOM_TO_TOP[0])
41+
LEGACY_VARIANT_CONVERSION_DICT = {"ltr": "→", "rtl": "←", "ttb": "↓", "btt": "↑"}
4042

4143
@classmethod
4244
def reversed_variant(cls, variant):
43-
if variant == cls.LEFT_TO_RIGHT:
44-
return cls.RIGHT_TO_LEFT
45-
elif variant == cls.RIGHT_TO_LEFT:
46-
return cls.LEFT_TO_RIGHT
47-
elif variant == cls.TOP_TO_BOTTOM:
48-
return cls.BOTTOM_TO_TOP
49-
elif variant == cls.BOTTOM_TO_TOP:
50-
return cls.TOP_TO_BOTTOM
45+
if variant in cls.LEFT_TO_RIGHT:
46+
return cls.RIGHT_TO_LEFT[1]
47+
elif variant in cls.RIGHT_TO_LEFT:
48+
return cls.LEFT_TO_RIGHT[1]
49+
elif variant in cls.TOP_TO_BOTTOM:
50+
return cls.BOTTOM_TO_TOP[1]
51+
elif variant in cls.BOTTOM_TO_TOP:
52+
return cls.TOP_TO_BOTTOM[1]
5153
else:
5254
return None
5355

@@ -64,6 +66,9 @@ def __init__(self, font_path, variant, default_glyph=None):
6466

6567
def _load_glyphs(self):
6668
variant_file_paths = self._get_variant_file_paths()
69+
if not variant_file_paths:
70+
# need to check for legacy file names
71+
variant_file_paths = self._get_variant_file_paths(True)
6772
for svg_path in variant_file_paths:
6873
document = inkex.load_svg(svg_path)
6974
update_inkstitch_document(document, warn_unversioned=False)
@@ -80,12 +85,16 @@ def _load_glyphs(self):
8085
except (AttributeError, ValueError):
8186
pass
8287

83-
def _get_variant_file_paths(self):
88+
def _get_variant_file_paths(self, legacy=False):
89+
variant = self.variant
90+
if legacy:
91+
variant = self.LEGACY_VARIANT_CONVERSION_DICT[variant]
92+
8493
file_paths = []
85-
direct_path = os.path.join(self.path, "%s.svg" % self.variant)
94+
direct_path = os.path.join(self.path, "%s.svg" % variant)
8695
if os.path.isfile(direct_path):
8796
file_paths.append(direct_path)
88-
elif os.path.isdir(os.path.join(self.path, "%s" % self.variant)):
97+
elif os.path.isdir(os.path.join(self.path, "%s" % variant)):
8998
path = os.path.join(self.path, "%s" % self.variant)
9099
file_paths.extend([os.path.join(path, svg) for svg in os.listdir(path) if svg.endswith('.svg')])
91100
return file_paths

templates/lettering_generate_json.xml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@
2020
<param type="string" name="font-name" gui-text="Name" indent="1" />
2121
<param type="string" name="font-description" gui-text="Description" indent="1" />
2222

23-
<param name="default_variant" type="optiongroup" appearance="combo" gui-text="Default variant" indent="1">
24-
<option value="0" translatable="no">→</option>
25-
<option value="1" translatable="no">←</option>
26-
<option value="2" translatable="no">↓</option>
27-
<option value="3" translatable="no">↑</option>
23+
<param name="default_variant" type="optiongroup" appearance="combo" gui-text="Default variant"
24+
gui-description="Default embroidery direction" indent="1">
25+
<option value="ltr" translatable="no">Left to right</option>
26+
<option value="rtl" translatable="no">Right to left</option>
27+
<option value="ttb" translatable="no">Top to bottom</option>
28+
<option value="btt" translatable="no">Bottom to top</option>
2829
</param>
2930
<param name="text_direction" type="optiongroup" appearance="combo" gui-text="Text direction" indent="1">
3031
<option value="ltr">Left to right</option>

0 commit comments

Comments
 (0)