diff options
| author | Lex Neva <lexelby@users.noreply.github.com> | 2023-10-21 12:16:34 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-21 18:16:34 +0200 |
| commit | 82f2edac1a348b274c177abf5581b089cdf2e527 (patch) | |
| tree | a8b4fed1e5106adc7e14457d00c6e1de0ade2050 /lib/extensions/lettering.py | |
| parent | 526cd48a4f73d9b793b5a83ababd83069f4ad800 (diff) | |
attach params/lettering simulator window and allow detach (#2557)
Diffstat (limited to 'lib/extensions/lettering.py')
| -rw-r--r-- | lib/extensions/lettering.py | 81 |
1 files changed, 44 insertions, 37 deletions
diff --git a/lib/extensions/lettering.py b/lib/extensions/lettering.py index 3bcebadc..6f79d9a7 100644 --- a/lib/extensions/lettering.py +++ b/lib/extensions/lettering.py @@ -14,36 +14,37 @@ import wx import wx.adv import wx.lib.agw.floatspin as fs +from .commands import CommandsExtension +from .lettering_custom_font_dir import get_custom_font_dir from ..elements import nodes_to_elements -from ..gui import PresetsPanel, SimulatorPreview, info_dialog +from ..gui import PresetsPanel, PreviewRenderer, info_dialog +from ..gui.simulator import SplitSimulatorWindow from ..i18n import _ from ..lettering import Font, FontError from ..lettering.categories import FONT_CATEGORIES, FontCategory +from ..stitch_plan import stitch_groups_to_stitch_plan from ..svg import get_correction_transform from ..svg.tags import (INKSCAPE_LABEL, INKSTITCH_LETTERING, SVG_GROUP_TAG, SVG_PATH_TAG) -from ..utils import DotDict, cache, get_bundled_dir, get_resource_dir -from ..utils.threading import ExitThread -from .commands import CommandsExtension -from .lettering_custom_font_dir import get_custom_font_dir +from ..utils import DotDict, cache, get_bundled_dir +from ..utils.threading import ExitThread, check_stop_flag -class LetteringFrame(wx.Frame): +class LetteringPanel(wx.Panel): DEFAULT_FONT = "small_font" - def __init__(self, *args, **kwargs): - self.group = kwargs.pop('group') - self.cancel_hook = kwargs.pop('on_cancel', None) - self.metadata = kwargs.pop('metadata', []) + def __init__(self, parent, simulator, group, on_cancel=None, metadata=None): + self.parent = parent + self.simulator = simulator + self.group = group + self.cancel_hook = on_cancel + self.metadata = metadata or dict() - # begin wxGlade: MyFrame.__init__ - wx.Frame.__init__(self, None, wx.ID_ANY, _("Ink/Stitch Lettering")) - self.SetWindowStyle(wx.FRAME_FLOAT_ON_PARENT) + super().__init__(parent, wx.ID_ANY) - icon = wx.Icon(os.path.join(get_resource_dir("icons"), "inkstitch256x256.png")) - self.SetIcon(icon) + self.SetWindowStyle(wx.FRAME_FLOAT_ON_PARENT | wx.DEFAULT_FRAME_STYLE) - self.preview = SimulatorPreview(self, target_duration=1) + self.preview_renderer = PreviewRenderer(self.render_stitch_plan, self.on_stitch_plan_rendered) self.presets_panel = PresetsPanel(self) # font @@ -257,11 +258,11 @@ class LetteringFrame(wx.Frame): self.settings[attribute] = event.GetEventObject().GetValue() if attribute == "text" and self.font_glyph_filter.GetValue() is True: self.on_filter_changed() - self.preview.update() + self.preview_renderer.update() def on_trim_option_change(self, event=None): self.settings.trim_option = self.trim_option_choice.GetCurrentSelection() - self.preview.update() + self.preview_renderer.update() def on_font_changed(self, event=None): font = self.fonts.get(self.font_chooser.GetValue(), self.default_font) @@ -329,7 +330,7 @@ class LetteringFrame(wx.Frame): self.Layout() def update_preview(self, event=None): - self.preview.update() + self.preview_renderer.update() def update_lettering(self, raise_error=False): # return if there is no font in the font list (possibly due to a font size filter) @@ -367,19 +368,24 @@ class LetteringFrame(wx.Frame): if self.settings.scale != 100 and not destination_group.get('transform', None): destination_group.attrib['transform'] = 'scale(%s)' % (self.settings.scale / 100.0) - def generate_patches(self, abort_early=None): - patches = [] + def render_stitch_plan(self): + stitch_groups = [] try: self.update_lettering() elements = nodes_to_elements(self.group.iterdescendants(SVG_PATH_TAG)) for element in elements: - if abort_early and abort_early.is_set(): - # cancel; settings were updated and we need to start over - return [] + check_stop_flag() + + stitch_groups.extend(element.embroider(None)) - patches.extend(element.embroider(None)) + if stitch_groups: + return stitch_groups_to_stitch_plan( + stitch_groups, + collapse_len=self.metadata['collapse_len_mm'], + min_stitch_len=self.metadata['min_stitch_len_mm'] + ) except SystemExit: raise except ExitThread: @@ -390,7 +396,10 @@ class LetteringFrame(wx.Frame): # satins or division by zero caused by incorrect param values. pass - return patches + def on_stitch_plan_rendered(self, stitch_plan): + self.simulator.stop() + self.simulator.load(stitch_plan) + self.simulator.go() def get_preset_data(self): # called by self.presets_panel @@ -409,14 +418,12 @@ class LetteringFrame(wx.Frame): return "lettering" def apply(self, event): - self.preview.disable() self.update_lettering(True) self.save_settings() self.close() def close(self): - self.preview.close() - self.Destroy() + self.GetTopLevelParent().Close() def cancel(self, event): if self.cancel_hook: @@ -534,14 +541,14 @@ class Lettering(CommandsExtension): def effect(self): metadata = self.get_inkstitch_metadata() app = wx.App() - frame = LetteringFrame(group=self.get_or_create_group(), on_cancel=self.cancel, metadata=metadata) - - # position left, center - current_screen = wx.Display.GetFromPoint(wx.GetMousePosition()) - display = wx.Display(current_screen) - display_size = display.GetClientArea() - frame_size = frame.GetSize() - frame.SetPosition((int(display_size[0]), int(display_size[3] / 2 - frame_size[1] / 2))) + frame = SplitSimulatorWindow( + title=_("Ink/Stitch Lettering"), + panel_class=LetteringPanel, + group=self.get_or_create_group(), + on_cancel=self.cancel, + metadata=metadata, + target_duration=1 + ) frame.Show() app.MainLoop() |
