kopia lustrzana https://github.com/inkstitch/inkstitch
				
				
				
			add help tab to lettering (#2948)
							rodzic
							
								
									1f47f4762e
								
							
						
					
					
						commit
						1f57763e79
					
				|  | @ -10,7 +10,7 @@ import wx.adv | |||
| from inkex import errormsg | ||||
| 
 | ||||
| from ..elements import SatinColumn | ||||
| from ..gui import MultiColorSatinPanel | ||||
| from ..gui.satin_multicolor import MultiColorSatinPanel | ||||
| from ..gui.simulator import SplitSimulatorWindow | ||||
| from ..i18n import _ | ||||
| from ..utils.svg_data import get_pagecolor | ||||
|  |  | |||
|  | @ -7,4 +7,3 @@ from .dialogs import confirm_dialog, info_dialog | |||
| from .presets import PresetsPanel | ||||
| from .simulator import PreviewRenderer | ||||
| from .warnings import WarningPanel | ||||
| from .satin_multicolor.main_panel import MultiColorSatinPanel | ||||
|  |  | |||
|  | @ -0,0 +1,8 @@ | |||
| # Authors: see git history | ||||
| # | ||||
| # Copyright (c) 2024 Authors | ||||
| # Licensed under the GNU GPL version 3.0 or later.  See the file LICENSE for details. | ||||
| 
 | ||||
| from .help_panel import LetteringHelpPanel | ||||
| from .option_panel import LetteringOptionsPanel | ||||
| from .main_panel import LetteringPanel | ||||
|  | @ -0,0 +1,51 @@ | |||
| # Authors: see git history | ||||
| # | ||||
| # Copyright (c) 2024 Authors | ||||
| # Licensed under the GNU GPL version 3.0 or later.  See the file LICENSE for details. | ||||
| 
 | ||||
| import wx | ||||
| 
 | ||||
| from ...i18n import _ | ||||
| 
 | ||||
| 
 | ||||
| class LetteringHelpPanel(wx.Panel): | ||||
|     def __init__(self, parent): | ||||
|         wx.Panel.__init__(self, parent) | ||||
|         help_sizer = wx.BoxSizer(wx.VERTICAL) | ||||
| 
 | ||||
|         help_text = wx.StaticText( | ||||
|             self, | ||||
|             wx.ID_ANY, | ||||
|             _("Add text to your design."), | ||||
|             style=wx.ALIGN_LEFT | ||||
|         ) | ||||
|         help_text.Wrap(500) | ||||
|         help_sizer.Add(help_text, 0, wx.ALL, 8) | ||||
| 
 | ||||
|         website_link = wx.adv.HyperlinkCtrl( | ||||
|             self, | ||||
|             wx.ID_ANY, | ||||
|             _("https://inkstitch.org/docs/lettering/#lettering-tool"), | ||||
|             _("https://inkstitch.org/docs/lettering/#lettering-tool") | ||||
|         ) | ||||
|         website_link.Bind(wx.adv.EVT_HYPERLINK, self.on_link_clicked) | ||||
|         help_sizer.Add(website_link, 0, wx.ALL, 8) | ||||
| 
 | ||||
|         help_sizer.Add((20, 20), 0, 0, 0) | ||||
| 
 | ||||
|         website_info = wx.StaticText(self, wx.ID_ANY, _("A font library with full description and embroidered examples can be found on our website:")) | ||||
|         help_sizer.Add(website_info, 0, wx.ALL, 8) | ||||
| 
 | ||||
|         fontlibrary_link = wx.adv.HyperlinkCtrl( | ||||
|             self, | ||||
|             wx.ID_ANY, | ||||
|             _("https://inkstitch.org/fonts/font-library/"), | ||||
|             _("https://inkstitch.org/fonts/font-library/") | ||||
|         ) | ||||
|         fontlibrary_link.Bind(wx.adv.EVT_HYPERLINK, self.on_link_clicked) | ||||
|         help_sizer.Add(fontlibrary_link, 0, wx.ALL, 8) | ||||
| 
 | ||||
|         self.SetSizer(help_sizer) | ||||
| 
 | ||||
|     def on_link_clicked(self, event): | ||||
|         event.Skip() | ||||
|  | @ -9,17 +9,17 @@ from base64 import b64decode | |||
| import inkex | ||||
| import wx | ||||
| import wx.adv | ||||
| import wx.lib.agw.floatspin as fs | ||||
| 
 | ||||
| from ..elements import nodes_to_elements | ||||
| from ..i18n import _ | ||||
| from ..lettering import FontError, get_font_list | ||||
| from ..lettering.categories import FONT_CATEGORIES, FontCategory | ||||
| from ..stitch_plan import stitch_groups_to_stitch_plan | ||||
| from ..svg.tags import INKSCAPE_LABEL, INKSTITCH_LETTERING, SVG_PATH_TAG | ||||
| from ..utils import DotDict, cache | ||||
| from ..utils.threading import ExitThread, check_stop_flag | ||||
| from . import PresetsPanel, PreviewRenderer, info_dialog | ||||
| from ...elements import nodes_to_elements | ||||
| from ...i18n import _ | ||||
| from ...lettering import FontError, get_font_list | ||||
| from ...lettering.categories import FONT_CATEGORIES | ||||
| from ...stitch_plan import stitch_groups_to_stitch_plan | ||||
| from ...svg.tags import INKSCAPE_LABEL, INKSTITCH_LETTERING, SVG_PATH_TAG | ||||
| from ...utils import DotDict, cache | ||||
| from ...utils.threading import ExitThread, check_stop_flag | ||||
| from .. import PresetsPanel, PreviewRenderer, info_dialog | ||||
| from . import LetteringHelpPanel, LetteringOptionsPanel | ||||
| 
 | ||||
| 
 | ||||
| class LetteringPanel(wx.Panel): | ||||
|  | @ -36,76 +36,47 @@ class LetteringPanel(wx.Panel): | |||
| 
 | ||||
|         self.SetWindowStyle(wx.FRAME_FLOAT_ON_PARENT | wx.DEFAULT_FRAME_STYLE) | ||||
| 
 | ||||
|         outer_sizer = wx.BoxSizer(wx.VERTICAL) | ||||
| 
 | ||||
|         self.preview_renderer = PreviewRenderer(self.render_stitch_plan, self.on_stitch_plan_rendered) | ||||
| 
 | ||||
|         # notebook | ||||
|         self.notebook = wx.Notebook(self, wx.ID_ANY) | ||||
|         self.options_panel = LetteringOptionsPanel(self.notebook, self) | ||||
|         self.notebook.AddPage(self.options_panel, _("Options")) | ||||
|         help_panel = LetteringHelpPanel(self.notebook) | ||||
|         self.notebook.AddPage(help_panel, _("Help")) | ||||
|         outer_sizer.Add(self.notebook, 1, wx.EXPAND | wx.ALL, 10) | ||||
| 
 | ||||
|         # presets | ||||
|         self.presets_panel = PresetsPanel(self) | ||||
|         outer_sizer.Add(self.presets_panel, 0, wx.EXPAND | wx.ALL, 10) | ||||
| 
 | ||||
|         # font | ||||
|         self.font_selector_box = wx.StaticBox(self, wx.ID_ANY, label=_("Font")) | ||||
| 
 | ||||
|         self.font_chooser = wx.adv.BitmapComboBox(self, wx.ID_ANY, style=wx.CB_READONLY | wx.CB_SORT) | ||||
|         self.font_chooser.Bind(wx.EVT_COMBOBOX, self.on_font_changed) | ||||
| 
 | ||||
|         self.font_size_filter = fs.FloatSpin(self, min_val=0, max_val=None, increment=1, value="0") | ||||
|         self.font_size_filter.SetFormat("%f") | ||||
|         self.font_size_filter.SetDigits(2) | ||||
|         self.font_size_filter.Bind(fs.EVT_FLOATSPIN, self.on_filter_changed) | ||||
|         self.font_size_filter.SetToolTip(_("Font size filter (mm). 0 for all sizes.")) | ||||
| 
 | ||||
|         self.font_glyph_filter = wx.CheckBox(self, label=_("Glyphs")) | ||||
|         self.font_glyph_filter.Bind(wx.EVT_CHECKBOX, self.on_filter_changed) | ||||
|         self.font_glyph_filter.SetToolTip(_("Filter fonts by available glyphs.")) | ||||
| 
 | ||||
|         self.font_category_filter = wx.ComboBox(self, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN | wx.CB_READONLY) | ||||
|         unfiltered = FontCategory('unfiltered', "---") | ||||
|         self.font_category_filter.Append(unfiltered.name, unfiltered) | ||||
|         for category in FONT_CATEGORIES: | ||||
|             self.font_category_filter.Append(category.name, category) | ||||
|         self.font_category_filter.SetToolTip(_("Filter fonts by category.")) | ||||
|         self.font_category_filter.SetSelection(0) | ||||
|         self.font_category_filter.Bind(wx.EVT_COMBOBOX, self.on_filter_changed) | ||||
| 
 | ||||
|         # font details | ||||
|         self.font_description = wx.StaticText(self, wx.ID_ANY) | ||||
|         self.Bind(wx.EVT_SIZE, self.resize) | ||||
| 
 | ||||
|         # font filter | ||||
|         self.filter_box = wx.StaticBox(self, wx.ID_ANY, label=_("Font Filter")) | ||||
| 
 | ||||
|         # options | ||||
|         self.options_box = wx.StaticBox(self, wx.ID_ANY, label=_("Options")) | ||||
| 
 | ||||
|         self.scale_spinner = wx.SpinCtrl(self, wx.ID_ANY, min=0, max=1000, initial=100) | ||||
|         self.scale_spinner.Bind(wx.EVT_SPINCTRL, lambda event: self.on_change("scale", event)) | ||||
| 
 | ||||
|         self.back_and_forth_checkbox = wx.CheckBox(self, label=_("Stitch lines of text back and forth")) | ||||
|         self.back_and_forth_checkbox.Bind(wx.EVT_CHECKBOX, lambda event: self.on_change("back_and_forth", event)) | ||||
| 
 | ||||
|         self.trim_option_choice = wx.Choice(self, choices=[_("Never"), _("after each line"), _("after each word"), _("after each letter")], | ||||
|                                             name=_("Add trim command")) | ||||
|         self.trim_option_choice.Bind(wx.EVT_CHOICE, lambda event: self.on_trim_option_change(event)) | ||||
| 
 | ||||
|         self.use_trim_symbols = wx.CheckBox(self, label=_("Use command symbols")) | ||||
|         self.use_trim_symbols.Bind(wx.EVT_CHECKBOX, lambda event: self.on_change("use_trim_symbols", event)) | ||||
|         self.use_trim_symbols.SetToolTip(_('Uses command symbols if enabled. When disabled inserts trim commands as params.')) | ||||
| 
 | ||||
|         # text editor | ||||
|         self.text_input_box = wx.StaticBox(self, wx.ID_ANY, label=_("Text")) | ||||
| 
 | ||||
|         self.text_editor = wx.TextCtrl(self, style=wx.TE_MULTILINE | wx.TE_DONTWRAP) | ||||
|         self.text_editor.Bind(wx.EVT_TEXT, lambda event: self.on_change("text", event)) | ||||
| 
 | ||||
|         # buttons | ||||
|         self.apply_button = wx.Button(self, wx.ID_ANY, _("Apply and Quit")) | ||||
|         self.apply_button.Bind(wx.EVT_BUTTON, self.apply) | ||||
|         self.cancel_button = wx.Button(self, wx.ID_ANY, _("Cancel")) | ||||
|         self.cancel_button.Bind(wx.EVT_BUTTON, self.cancel) | ||||
|         self.Bind(wx.EVT_CLOSE, self.cancel) | ||||
| 
 | ||||
|         self.apply_button = wx.Button(self, wx.ID_ANY, _("Apply and Quit")) | ||||
|         self.apply_button.Bind(wx.EVT_BUTTON, self.apply) | ||||
|         buttons_sizer = wx.BoxSizer(wx.HORIZONTAL) | ||||
|         buttons_sizer.Add(self.cancel_button, 0, wx.RIGHT, 10) | ||||
|         buttons_sizer.Add(self.apply_button, 0, wx.RIGHT | wx.BOTTOM, 10) | ||||
|         outer_sizer.Add(buttons_sizer, 0, wx.ALIGN_RIGHT, 10) | ||||
| 
 | ||||
|         # set font list | ||||
|         self.update_font_list() | ||||
|         self.set_font_list() | ||||
| 
 | ||||
|         self.__do_layout() | ||||
|         self.SetSizer(outer_sizer) | ||||
|         self.Layout() | ||||
| 
 | ||||
|         # SetSizerAndFit determined the minimum size that fits all the controls | ||||
|         # and set the window's minimum size so that the user can't make it | ||||
|         # smaller.  It also set the window to that size.  We'd like to give the | ||||
|         # user a bit more room for text, so we'll add some height. | ||||
|         size = self.options_panel.GetSize() | ||||
|         size.height = size.height + 200 | ||||
|         self.options_panel.SetSize(size) | ||||
| 
 | ||||
|         self.load_settings() | ||||
|         self.apply_settings() | ||||
|  | @ -136,11 +107,11 @@ class LetteringPanel(wx.Panel): | |||
| 
 | ||||
|     def apply_settings(self): | ||||
|         """Make the settings in self.settings visible in the UI.""" | ||||
|         self.back_and_forth_checkbox.SetValue(bool(self.settings.back_and_forth)) | ||||
|         self.trim_option_choice.SetSelection(self.settings.trim_option) | ||||
|         self.use_trim_symbols.SetValue(bool(self.settings.use_trim_symbols)) | ||||
|         self.text_editor.SetValue(self.settings.text) | ||||
|         self.scale_spinner.SetValue(self.settings.scale) | ||||
|         self.options_panel.back_and_forth_checkbox.SetValue(bool(self.settings.back_and_forth)) | ||||
|         self.options_panel.trim_option_choice.SetSelection(self.settings.trim_option) | ||||
|         self.options_panel.use_trim_symbols.SetValue(bool(self.settings.use_trim_symbols)) | ||||
|         self.options_panel.text_editor.SetValue(self.settings.text) | ||||
|         self.options_panel.scale_spinner.SetValue(self.settings.scale) | ||||
|         self.set_initial_font(self.settings.font) | ||||
| 
 | ||||
|     def save_settings(self): | ||||
|  | @ -157,12 +128,12 @@ class LetteringPanel(wx.Panel): | |||
|         self.fonts_by_id = {} | ||||
| 
 | ||||
|         # font size filter value | ||||
|         filter_size = self.font_size_filter.GetValue() | ||||
|         filter_glyph = self.font_glyph_filter.GetValue() | ||||
|         filter_category = self.font_category_filter.GetSelection() - 1 | ||||
|         filter_size = self.options_panel.font_size_filter.GetValue() | ||||
|         filter_glyph = self.options_panel.font_glyph_filter.GetValue() | ||||
|         filter_category = self.options_panel.font_category_filter.GetSelection() - 1 | ||||
| 
 | ||||
|         # glyph filter string without spaces | ||||
|         glyphs = [*self.text_editor.GetValue().replace(" ", "").replace("\n", "")] | ||||
|         glyphs = [*self.options_panel.text_editor.GetValue().replace(" ", "").replace("\n", "")] | ||||
| 
 | ||||
|         for font in self.font_list: | ||||
|             if filter_glyph and glyphs and not set(glyphs).issubset(font.available_glyphs): | ||||
|  | @ -180,7 +151,7 @@ class LetteringPanel(wx.Panel): | |||
|             self.fonts_by_id[font.marked_custom_font_id] = font | ||||
| 
 | ||||
|     def set_font_list(self): | ||||
|         self.font_chooser.Clear() | ||||
|         self.options_panel.font_chooser.Clear() | ||||
|         for font in self.fonts.values(): | ||||
|             image = font.preview_image | ||||
| 
 | ||||
|  | @ -199,9 +170,9 @@ class LetteringPanel(wx.Panel): | |||
|                 """ | ||||
|                 # Windows requires all images to have the exact same size | ||||
|                 image.Rescale(300, 20, quality=wx.IMAGE_QUALITY_HIGH) | ||||
|                 self.font_chooser.Append(font.marked_custom_font_name, wx.Bitmap(image)) | ||||
|                 self.options_panel.font_chooser.Append(font.marked_custom_font_name, wx.Bitmap(image)) | ||||
|             else: | ||||
|                 self.font_chooser.Append(font.marked_custom_font_name) | ||||
|                 self.options_panel.font_chooser.Append(font.marked_custom_font_name) | ||||
| 
 | ||||
|     def get_font_descriptions(self): | ||||
|         return {font.name: font.description for font in self.fonts.values()} | ||||
|  | @ -216,7 +187,7 @@ class LetteringPanel(wx.Panel): | |||
|             font = self.fonts_by_id[font_id].marked_custom_font_name | ||||
|         except KeyError: | ||||
|             font = self.default_font.marked_custom_font_name | ||||
|         self.font_chooser.SetValue(font) | ||||
|         self.options_panel.font_chooser.SetValue(font) | ||||
| 
 | ||||
|         self.on_font_changed() | ||||
| 
 | ||||
|  | @ -229,23 +200,23 @@ class LetteringPanel(wx.Panel): | |||
| 
 | ||||
|     def on_change(self, attribute, event): | ||||
|         self.settings[attribute] = event.GetEventObject().GetValue() | ||||
|         if attribute == "text" and self.font_glyph_filter.GetValue() is True: | ||||
|         if attribute == "text" and self.options_panel.font_glyph_filter.GetValue() is True: | ||||
|             self.on_filter_changed() | ||||
|         self.preview_renderer.update() | ||||
| 
 | ||||
|     def on_trim_option_change(self, event=None): | ||||
|         self.settings.trim_option = self.trim_option_choice.GetCurrentSelection() | ||||
|         self.settings.trim_option = self.options_panel.trim_option_choice.GetCurrentSelection() | ||||
|         self.preview_renderer.update() | ||||
| 
 | ||||
|     def on_font_changed(self, event=None): | ||||
|         font = self.fonts.get(self.font_chooser.GetValue(), self.default_font) | ||||
|         font = self.fonts.get(self.options_panel.font_chooser.GetValue(), self.default_font) | ||||
|         self.settings.font = font.marked_custom_font_id | ||||
| 
 | ||||
|         filter_size = self.font_size_filter.GetValue() | ||||
|         self.scale_spinner.SetRange(int(font.min_scale * 100), int(font.max_scale * 100)) | ||||
|         filter_size = self.options_panel.font_size_filter.GetValue() | ||||
|         self.options_panel.scale_spinner.SetRange(int(font.min_scale * 100), int(font.max_scale * 100)) | ||||
|         if filter_size != 0: | ||||
|             self.scale_spinner.SetValue(int(filter_size / font.size * 100)) | ||||
|         self.settings['scale'] = self.scale_spinner.GetValue() | ||||
|             self.options_panel.scale_spinner.SetValue(int(filter_size / font.size * 100)) | ||||
|         self.settings['scale'] = self.options_panel.scale_spinner.GetValue() | ||||
| 
 | ||||
|         font_variants = [] | ||||
|         try: | ||||
|  | @ -259,17 +230,17 @@ class LetteringPanel(wx.Panel): | |||
|         if len(font_variants) == 0: | ||||
|             color = (255, 0, 0) | ||||
|             description = _('This font has no available font variant. Please update or remove the font.') | ||||
|         self.font_description.SetLabel(description) | ||||
|         self.font_description.SetForegroundColour(color) | ||||
|         self.font_description.Wrap(self.GetSize().width - 35) | ||||
|         self.options_panel.font_description.SetLabel(description) | ||||
|         self.options_panel.font_description.SetForegroundColour(color) | ||||
|         self.options_panel.font_description.Wrap(self.options_panel.GetSize().width - 50) | ||||
| 
 | ||||
|         if font.reversible: | ||||
|             self.back_and_forth_checkbox.Enable() | ||||
|             self.back_and_forth_checkbox.SetValue(bool(self.settings.back_and_forth)) | ||||
|             self.options_panel.back_and_forth_checkbox.Enable() | ||||
|             self.options_panel.back_and_forth_checkbox.SetValue(bool(self.settings.back_and_forth)) | ||||
|         else: | ||||
|             # The creator of the font banned the possibility of writing in reverse with json file: "reversible": false | ||||
|             self.back_and_forth_checkbox.Disable() | ||||
|             self.back_and_forth_checkbox.SetValue(False) | ||||
|             self.options_panel.back_and_forth_checkbox.Disable() | ||||
|             self.options_panel.back_and_forth_checkbox.SetValue(False) | ||||
| 
 | ||||
|         self.update_preview() | ||||
|         self.Layout() | ||||
|  | @ -279,27 +250,27 @@ class LetteringPanel(wx.Panel): | |||
| 
 | ||||
|         if not self.fonts: | ||||
|             # No fonts for filtered size | ||||
|             self.font_chooser.Clear() | ||||
|             self.filter_box.SetForegroundColour("red") | ||||
|             self.options_panel.font_chooser.Clear() | ||||
|             self.options_panel.filter_box.SetForegroundColour("red") | ||||
|             return | ||||
|         else: | ||||
|             self.filter_box.SetForegroundColour(wx.NullColour) | ||||
|             self.options_panel.filter_box.SetForegroundColour(wx.NullColour) | ||||
| 
 | ||||
|         filter_size = self.font_size_filter.GetValue() | ||||
|         previous_font = self.font_chooser.GetValue() | ||||
|         filter_size = self.options_panel.font_size_filter.GetValue() | ||||
|         previous_font = self.options_panel.font_chooser.GetValue() | ||||
|         self.set_font_list() | ||||
|         font = self.fonts.get(previous_font, self.default_font) | ||||
|         self.font_chooser.SetValue(font.marked_custom_font_name) | ||||
|         self.options_panel.font_chooser.SetValue(font.marked_custom_font_name) | ||||
|         if font.marked_custom_font_name != previous_font: | ||||
|             self.on_font_changed() | ||||
|         elif filter_size != 0: | ||||
|             self.scale_spinner.SetValue(int(filter_size / font.size * 100)) | ||||
|             self.settings['scale'] = self.scale_spinner.GetValue() | ||||
|             self.options_panel.scale_spinner.SetValue(int(filter_size / font.size * 100)) | ||||
|             self.settings['scale'] = self.options_panel.scale_spinner.GetValue() | ||||
| 
 | ||||
|     def resize(self, event=None): | ||||
|         description = self.font_description.GetLabel().replace("\n", " ") | ||||
|         self.font_description.SetLabel(description) | ||||
|         self.font_description.Wrap(self.GetSize().width - 35) | ||||
|         description = self.options_panel.font_description.GetLabel().replace("\n", " ") | ||||
|         self.options_panel.font_description.SetLabel(description) | ||||
|         self.options_panel.font_description.Wrap(self.options_panel.GetSize().width - 50) | ||||
|         self.Layout() | ||||
| 
 | ||||
|     def update_preview(self, event=None): | ||||
|  | @ -307,7 +278,7 @@ class LetteringPanel(wx.Panel): | |||
| 
 | ||||
|     def update_lettering(self, raise_error=False): | ||||
|         # return if there is no font in the font list (possibly due to a font size filter) | ||||
|         if not self.font_chooser.GetValue(): | ||||
|         if not self.options_panel.font_chooser.GetValue(): | ||||
|             return | ||||
| 
 | ||||
|         del self.group[:] | ||||
|  | @ -323,7 +294,7 @@ class LetteringPanel(wx.Panel): | |||
|             }) | ||||
|             self.group.append(destination_group) | ||||
| 
 | ||||
|         font = self.fonts.get(self.font_chooser.GetValue(), self.default_font) | ||||
|         font = self.fonts.get(self.options_panel.font_chooser.GetValue(), self.default_font) | ||||
|         try: | ||||
|             font.render_text(self.settings.text, destination_group, back_and_forth=self.settings.back_and_forth, | ||||
|                              trim_option=self.settings.trim_option, use_trim_symbols=self.settings.use_trim_symbols) | ||||
|  | @ -402,69 +373,3 @@ class LetteringPanel(wx.Panel): | |||
|     def cancel(self, event): | ||||
|         self.simulator.stop() | ||||
|         wx.CallAfter(self.GetTopLevelParent().cancel) | ||||
| 
 | ||||
|     def __do_layout(self): | ||||
|         outer_sizer = wx.BoxSizer(wx.VERTICAL) | ||||
| 
 | ||||
|         # font selection | ||||
|         font_selector_sizer = wx.StaticBoxSizer(self.font_selector_box, wx.VERTICAL) | ||||
|         font_selector_box = wx.BoxSizer(wx.HORIZONTAL) | ||||
|         font_selector_box.Add(self.font_chooser, 4, wx.EXPAND | wx.TOP | wx.BOTTOM | wx.RIGHT, 10) | ||||
|         font_selector_sizer.Add(font_selector_box, 0, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 10) | ||||
|         font_selector_sizer.Add(self.font_description, 1, wx.EXPAND | wx.ALL, 10) | ||||
|         outer_sizer.Add(font_selector_sizer, 0, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 10) | ||||
| 
 | ||||
|         # filter fon list | ||||
|         filter_sizer = wx.StaticBoxSizer(self.filter_box, wx.HORIZONTAL) | ||||
|         filter_size_label = wx.StaticText(self, wx.ID_ANY, _("Size")) | ||||
|         filter_sizer.Add(filter_size_label, 0, wx.LEFT | wx.TOP | wx.BOTTOM, 10) | ||||
|         filter_sizer.AddSpacer(5) | ||||
|         filter_sizer.Add(self.font_size_filter, 1, wx.RIGHT | wx.TOP | wx.BOTTOM, 10) | ||||
|         filter_sizer.AddSpacer(5) | ||||
|         filter_sizer.Add(self.font_glyph_filter, 1, wx.RIGHT | wx.TOP | wx.BOTTOM, 10) | ||||
|         filter_sizer.Add(self.font_category_filter, 1, wx.RIGHT | wx.TOP | wx.BOTTOM, 10) | ||||
|         outer_sizer.Add(filter_sizer, 0, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 10) | ||||
| 
 | ||||
|         # options | ||||
|         left_option_sizer = wx.BoxSizer(wx.VERTICAL) | ||||
|         left_option_sizer.Add(self.back_and_forth_checkbox, 1, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 5) | ||||
| 
 | ||||
|         trim_option_sizer = wx.BoxSizer(wx.HORIZONTAL) | ||||
|         trim_option_sizer.Add(wx.StaticText(self, wx.ID_ANY, _("Add trims")), 0, wx.LEFT | wx.ALIGN_TOP, 5) | ||||
|         trim_option_sizer.Add(self.trim_option_choice, 1, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT | wx.BOTTOM, 5) | ||||
|         trim_option_sizer.Add(self.use_trim_symbols, 1, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT | wx.BOTTOM, 5) | ||||
|         left_option_sizer.Add(trim_option_sizer, 0, wx.ALIGN_LEFT, 5) | ||||
| 
 | ||||
|         font_scale_sizer = wx.BoxSizer(wx.HORIZONTAL) | ||||
|         font_scale_sizer.Add(wx.StaticText(self, wx.ID_ANY, _("Scale")), 0, wx.LEFT | wx.ALIGN_CENTRE_VERTICAL, 0) | ||||
|         font_scale_sizer.Add(self.scale_spinner, 0, wx.LEFT, 10) | ||||
|         font_scale_sizer.Add(wx.StaticText(self, wx.ID_ANY, "%"), 0, wx.LEFT | wx.ALIGN_CENTRE_VERTICAL, 3) | ||||
| 
 | ||||
|         options_sizer = wx.StaticBoxSizer(self.options_box, wx.HORIZONTAL) | ||||
|         options_sizer.Add(left_option_sizer, 1, wx.EXPAND, 10) | ||||
|         options_sizer.Add(font_scale_sizer, 0, wx.RIGHT, 10) | ||||
| 
 | ||||
|         outer_sizer.Add(options_sizer, 0, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 10) | ||||
| 
 | ||||
|         # text input | ||||
|         text_input_sizer = wx.StaticBoxSizer(self.text_input_box, wx.VERTICAL) | ||||
|         text_input_sizer.Add(self.text_editor, 1, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 10) | ||||
|         outer_sizer.Add(text_input_sizer, 2, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 10) | ||||
| 
 | ||||
|         # presets | ||||
|         outer_sizer.Add(self.presets_panel, 0, wx.EXPAND | wx.EXPAND | wx.ALL, 10) | ||||
|         buttons_sizer = wx.BoxSizer(wx.HORIZONTAL) | ||||
|         buttons_sizer.Add(self.cancel_button, 0, wx.RIGHT, 10) | ||||
|         buttons_sizer.Add(self.apply_button, 0, wx.RIGHT | wx.BOTTOM, 10) | ||||
|         outer_sizer.Add(buttons_sizer, 0, wx.ALIGN_RIGHT, 10) | ||||
| 
 | ||||
|         self.SetSizerAndFit(outer_sizer) | ||||
|         self.Layout() | ||||
| 
 | ||||
|         # SetSizerAndFit determined the minimum size that fits all the controls | ||||
|         # and set the window's minimum size so that the user can't make it | ||||
|         # smaller.  It also set the window to that size.  We'd like to give the | ||||
|         # user a bit more room for text, so we'll add some height. | ||||
|         size = self.GetSize() | ||||
|         size.height = size.height + 200 | ||||
|         self.SetSize(size) | ||||
|  | @ -0,0 +1,105 @@ | |||
| import wx | ||||
| 
 | ||||
| from ...i18n import _ | ||||
| from ...lettering.categories import FONT_CATEGORIES, FontCategory | ||||
| 
 | ||||
| 
 | ||||
| class LetteringOptionsPanel(wx.Panel): | ||||
|     def __init__(self, parent, panel): | ||||
|         self.panel = panel | ||||
|         wx.Panel.__init__(self, parent) | ||||
| 
 | ||||
|         outer_sizer = wx.BoxSizer(wx.VERTICAL) | ||||
| 
 | ||||
|         # font selection | ||||
|         self.font_chooser = wx.adv.BitmapComboBox(self, wx.ID_ANY, style=wx.CB_READONLY | wx.CB_SORT) | ||||
|         self.font_chooser.Bind(wx.EVT_COMBOBOX, self.panel.on_font_changed) | ||||
| 
 | ||||
|         self.font_description = wx.StaticText(self, wx.ID_ANY) | ||||
|         self.panel.Bind(wx.EVT_SIZE, self.panel.resize) | ||||
| 
 | ||||
|         self.font_selector_box = wx.StaticBox(self, wx.ID_ANY, label=_("Font")) | ||||
|         font_selector_sizer = wx.StaticBoxSizer(self.font_selector_box, wx.VERTICAL) | ||||
|         font_selector_box = wx.BoxSizer(wx.HORIZONTAL) | ||||
|         font_selector_box.Add(self.font_chooser, 4, wx.EXPAND | wx.TOP | wx.BOTTOM | wx.RIGHT, 10) | ||||
|         font_selector_sizer.Add(font_selector_box, 0, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 10) | ||||
|         font_selector_sizer.Add(self.font_description, 1, wx.EXPAND | wx.ALL, 10) | ||||
|         outer_sizer.Add(font_selector_sizer, 0, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 10) | ||||
| 
 | ||||
|         # filter font list | ||||
|         self.font_size_filter = wx.SpinCtrlDouble(self, min=0, max=100, inc=0.1, initial=0, style=wx.SP_WRAP) | ||||
|         self.font_size_filter.SetDigits(2) | ||||
|         self.font_size_filter.Bind(wx.EVT_SPINCTRLDOUBLE, self.panel.on_filter_changed) | ||||
|         self.font_size_filter.SetToolTip(_("Font size filter (mm). 0 for all sizes.")) | ||||
| 
 | ||||
|         self.font_glyph_filter = wx.CheckBox(self, label=_("Glyphs")) | ||||
|         self.font_glyph_filter.Bind(wx.EVT_CHECKBOX, self.panel.on_filter_changed) | ||||
|         self.font_glyph_filter.SetToolTip(_("Filter fonts by available glyphs.")) | ||||
| 
 | ||||
|         self.font_category_filter = wx.ComboBox(self, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN | wx.CB_READONLY) | ||||
|         unfiltered = FontCategory('unfiltered', "---") | ||||
|         self.font_category_filter.Append(unfiltered.name, unfiltered) | ||||
|         for category in FONT_CATEGORIES: | ||||
|             self.font_category_filter.Append(category.name, category) | ||||
|         self.font_category_filter.SetToolTip(_("Filter fonts by category.")) | ||||
|         self.font_category_filter.SetSelection(0) | ||||
|         self.font_category_filter.Bind(wx.EVT_COMBOBOX, self.panel.on_filter_changed) | ||||
| 
 | ||||
|         self.filter_box = wx.StaticBox(self, wx.ID_ANY, label=_("Font Filter")) | ||||
|         filter_sizer = wx.StaticBoxSizer(self.filter_box, wx.HORIZONTAL) | ||||
|         filter_size_label = wx.StaticText(self, wx.ID_ANY, _("Size")) | ||||
|         filter_sizer.Add(filter_size_label, 0, wx.LEFT | wx.TOP | wx.BOTTOM, 10) | ||||
|         filter_sizer.AddSpacer(5) | ||||
|         filter_sizer.Add(self.font_size_filter, 1, wx.RIGHT | wx.TOP | wx.BOTTOM, 10) | ||||
|         filter_sizer.AddSpacer(5) | ||||
|         filter_sizer.Add(self.font_glyph_filter, 1, wx.RIGHT | wx.TOP | wx.BOTTOM, 10) | ||||
|         filter_sizer.Add(self.font_category_filter, 1, wx.RIGHT | wx.TOP | wx.BOTTOM, 10) | ||||
|         outer_sizer.Add(filter_sizer, 0, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 10) | ||||
| 
 | ||||
|         # options | ||||
|         self.options_box = wx.StaticBox(self, wx.ID_ANY, label=_("Options")) | ||||
| 
 | ||||
|         self.scale_spinner = wx.SpinCtrl(self, wx.ID_ANY, min=0, max=1000, initial=100) | ||||
|         self.scale_spinner.Bind(wx.EVT_SPINCTRL, lambda event: self.panel.on_change("scale", event)) | ||||
| 
 | ||||
|         self.back_and_forth_checkbox = wx.CheckBox(self, label=_("Stitch lines of text back and forth")) | ||||
|         self.back_and_forth_checkbox.Bind(wx.EVT_CHECKBOX, lambda event: self.panel.on_change("back_and_forth", event)) | ||||
| 
 | ||||
|         self.trim_option_choice = wx.Choice(self, choices=[_("Never"), _("after each line"), _("after each word"), _("after each letter")], | ||||
|                                             name=_("Add trim command")) | ||||
|         self.trim_option_choice.Bind(wx.EVT_CHOICE, lambda event: self.panel.on_trim_option_change(event)) | ||||
| 
 | ||||
|         self.use_trim_symbols = wx.CheckBox(self, label=_("Use command symbols")) | ||||
|         self.use_trim_symbols.Bind(wx.EVT_CHECKBOX, lambda event: self.panel.on_change("use_trim_symbols", event)) | ||||
|         self.use_trim_symbols.SetToolTip(_('Uses command symbols if enabled. When disabled inserts trim commands as params.')) | ||||
| 
 | ||||
|         left_option_sizer = wx.BoxSizer(wx.VERTICAL) | ||||
|         left_option_sizer.Add(self.back_and_forth_checkbox, 1, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 5) | ||||
| 
 | ||||
|         trim_option_sizer = wx.BoxSizer(wx.HORIZONTAL) | ||||
|         trim_option_sizer.Add(wx.StaticText(self, wx.ID_ANY, _("Add trims")), 0, wx.LEFT | wx.ALIGN_TOP, 5) | ||||
|         trim_option_sizer.Add(self.trim_option_choice, 1, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT | wx.BOTTOM, 5) | ||||
|         trim_option_sizer.Add(self.use_trim_symbols, 1, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT | wx.BOTTOM, 5) | ||||
|         left_option_sizer.Add(trim_option_sizer, 0, wx.ALIGN_LEFT, 5) | ||||
| 
 | ||||
|         font_scale_sizer = wx.BoxSizer(wx.HORIZONTAL) | ||||
|         font_scale_sizer.Add(wx.StaticText(self, wx.ID_ANY, _("Scale")), 0, wx.LEFT | wx.ALIGN_CENTRE_VERTICAL, 0) | ||||
|         font_scale_sizer.Add(self.scale_spinner, 0, wx.LEFT, 10) | ||||
|         font_scale_sizer.Add(wx.StaticText(self, wx.ID_ANY, "%"), 0, wx.LEFT | wx.ALIGN_CENTRE_VERTICAL, 3) | ||||
| 
 | ||||
|         options_sizer = wx.StaticBoxSizer(self.options_box, wx.HORIZONTAL) | ||||
|         options_sizer.Add(left_option_sizer, 1, wx.EXPAND, 10) | ||||
|         options_sizer.Add(font_scale_sizer, 0, wx.RIGHT, 10) | ||||
|         outer_sizer.Add(options_sizer, 0, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 10) | ||||
| 
 | ||||
|         # text input | ||||
|         self.text_input_box = wx.StaticBox(self, wx.ID_ANY, label=_("Text")) | ||||
|         self.text_editor = wx.TextCtrl(self, style=wx.TE_MULTILINE | wx.TE_DONTWRAP) | ||||
|         self.text_editor.Bind(wx.EVT_TEXT, lambda event: self.panel.on_change("text", event)) | ||||
| 
 | ||||
|         text_input_sizer = wx.StaticBoxSizer(self.text_input_box, wx.VERTICAL) | ||||
|         text_input_sizer.Add(self.text_editor, 1, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 10) | ||||
|         outer_sizer.Add(text_input_sizer, 2, wx.EXPAND | wx.LEFT | wx.TOP | wx.RIGHT, 10) | ||||
| 
 | ||||
|         # set panel sizer | ||||
|         self.SetSizer(outer_sizer) | ||||
|  | @ -0,0 +1,8 @@ | |||
| # Authors: see git history | ||||
| # | ||||
| # Copyright (c) 2024 Authors | ||||
| # Licensed under the GNU GPL version 3.0 or later.  See the file LICENSE for details. | ||||
| 
 | ||||
| from .colorize_panel import ColorizePanel | ||||
| from .help_panel import HelpPanel | ||||
| from .main_panel import MultiColorSatinPanel | ||||
|  | @ -15,8 +15,7 @@ from ...i18n import _ | |||
| from ...stitch_plan import stitch_groups_to_stitch_plan | ||||
| from ...utils.threading import ExitThread, check_stop_flag | ||||
| from .. import PreviewRenderer, WarningPanel | ||||
| from .colorize import ColorizePanel | ||||
| from .help_panel import HelpPanel | ||||
| from . import ColorizePanel, HelpPanel | ||||
| 
 | ||||
| 
 | ||||
| class MultiColorSatinPanel(wx.Panel): | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Kaalleen
						Kaalleen