# Authors: see git history # # Copyright (c) 2010 Authors # Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details. import wx from ..i18n import _ from ..utils.cache import get_stitch_plan_cache from ..utils.settings import global_settings class PreferencesFrame(wx.Frame): def __init__(self, *args, **kwargs): self.extension = kwargs.pop("extension") wx.Frame.__init__(self, None, wx.ID_ANY, _("Preferences"), *args, **kwargs) self.SetTitle(_("Preferences")) self.SetWindowStyle(wx.FRAME_FLOAT_ON_PARENT | wx.DEFAULT_FRAME_STYLE) metadata = self.extension.get_inkstitch_metadata() self.panel_1 = wx.Panel(self, wx.ID_ANY) main_sizer = wx.BoxSizer(wx.VERTICAL) self.notebook = wx.Notebook(self.panel_1, wx.ID_ANY) main_sizer.Add(self.notebook, 1, wx.ALL | wx.EXPAND, 10) self.this_svg_page = wx.Panel(self.notebook, wx.ID_ANY) self.notebook.AddPage(self.this_svg_page, _("This SVG")) this_svg_margin = wx.BoxSizer(wx.VERTICAL) # add space above and below to center sizer_2 vertically this_svg_margin.Add((0, 20), 1, wx.EXPAND, 0) this_svg_grid = wx.FlexGridSizer(2, 4, 15, 10) this_svg_margin.Add(this_svg_grid, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 20) label_1 = wx.StaticText(self.this_svg_page, wx.ID_ANY, _("Minimum jump stitch length"), style=wx.ALIGN_LEFT) label_1.SetToolTip(_("Jump stitches smaller than this will be treated as normal stitches.")) this_svg_grid.Add(label_1, 1, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 15) self.minimum_jump_stitch_length = wx.SpinCtrlDouble( self.this_svg_page, wx.ID_ANY, inc=0.1, value=str(metadata['collapse_len_mm'] or global_settings['default_collapse_len_mm']), style=wx.ALIGN_RIGHT | wx.SP_ARROW_KEYS ) self.minimum_jump_stitch_length.SetDigits(1) this_svg_grid.Add(self.minimum_jump_stitch_length, 0, wx.ALIGN_CENTER_VERTICAL, 0) label_2 = wx.StaticText(self.this_svg_page, wx.ID_ANY, _("mm")) this_svg_grid.Add(label_2, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 15) self.button_1 = wx.Button(self.this_svg_page, wx.ID_ANY, _("Set As Default")) this_svg_grid.Add(self.button_1, 0, wx.ALIGN_CENTER_VERTICAL, 0) label_3 = wx.StaticText(self.this_svg_page, wx.ID_ANY, _("Minimum stitch length")) this_svg_grid.Add(label_3, 0, 0, 0) self.minimum_stitch_length = wx.SpinCtrlDouble( self.this_svg_page, wx.ID_ANY, inc=0.1, value=str(metadata['min_stitch_len_mm'] or global_settings['default_min_stitch_len_mm']), style=wx.ALIGN_RIGHT | wx.SP_ARROW_KEYS ) self.minimum_stitch_length.SetDigits(1) this_svg_grid.Add(self.minimum_stitch_length, 0, wx.ALIGN_CENTER_VERTICAL, 0) label_4 = wx.StaticText(self.this_svg_page, wx.ID_ANY, _("mm")) this_svg_grid.Add(label_4, 0, wx.ALIGN_CENTER_VERTICAL, 0) self.button_2 = wx.Button(self.this_svg_page, wx.ID_ANY, _("Set As Default")) this_svg_grid.Add(self.button_2, 0, wx.ALIGN_CENTER_VERTICAL, 0) this_svg_margin.Add((0, 20), 1, wx.EXPAND, 0) self.global_page = wx.Panel(self.notebook, wx.ID_ANY) self.notebook.AddPage(self.global_page, _("Global")) global_margin = wx.BoxSizer(wx.VERTICAL) # add space above and below to center sizer_4 vertically global_margin.Add((0, 20), 1, wx.EXPAND, 0) global_grid_sizer = wx.FlexGridSizer(3, 4, 15, 10) global_margin.Add(global_grid_sizer, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 20) label_5 = wx.StaticText(self.global_page, wx.ID_ANY, _("Default minimum jump stitch length"), style=wx.ALIGN_LEFT) label_5.SetToolTip(_("Jump stitches smaller than this will be treated as normal stitches.")) global_grid_sizer.Add(label_5, 1, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 15) self.default_minimum_jump_stitch_length = wx.SpinCtrlDouble( self.global_page, wx.ID_ANY, inc=0.1, value=str(global_settings['default_collapse_len_mm']), style=wx.ALIGN_RIGHT | wx.SP_ARROW_KEYS ) self.default_minimum_jump_stitch_length.SetDigits(1) global_grid_sizer.Add(self.default_minimum_jump_stitch_length, 0, wx.ALIGN_CENTER_VERTICAL, 0) label_6 = wx.StaticText(self.global_page, wx.ID_ANY, _("mm")) global_grid_sizer.Add(label_6, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 15) global_grid_sizer.Add((0, 0), 0, 0, 0) label_7 = wx.StaticText(self.global_page, wx.ID_ANY, _("Minimum stitch length")) global_grid_sizer.Add(label_7, 0, wx.ALIGN_CENTER_VERTICAL, 0) self.default_minimum_stitch_length = wx.SpinCtrlDouble( self.global_page, wx.ID_ANY, inc=0.1, value=str(global_settings['default_min_stitch_len_mm']), style=wx.ALIGN_RIGHT | wx.SP_ARROW_KEYS ) self.default_minimum_stitch_length.SetDigits(1) global_grid_sizer.Add(self.default_minimum_stitch_length, 0, wx.ALIGN_CENTER_VERTICAL, 0) label_8 = wx.StaticText(self.global_page, wx.ID_ANY, _("mm")) global_grid_sizer.Add(label_8, 0, wx.ALIGN_CENTER_VERTICAL, 0) global_grid_sizer.Add((0, 20), 0, 0, 0) label_9 = wx.StaticText(self.global_page, wx.ID_ANY, _("Stitch plan cache size (0 to disable cache)"), style=wx.ALIGN_LEFT) global_grid_sizer.Add(label_9, 1, wx.ALIGN_CENTER_VERTICAL, 0) self.stitch_plan_cache_size = wx.SpinCtrl( self.global_page, wx.ID_ANY, value=str(global_settings['cache_size']), style=wx.ALIGN_RIGHT | wx.SP_ARROW_KEYS ) self.stitch_plan_cache_size.SetIncrement(10) global_grid_sizer.Add(self.stitch_plan_cache_size, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, 0) label_10 = wx.StaticText(self.global_page, wx.ID_ANY, _("MB")) global_grid_sizer.Add(label_10, 0, wx.ALIGN_CENTER_VERTICAL, 0) self.clear_cache_button = wx.Button(self.global_page, wx.ID_ANY, _("Clear Stitch Plan Cache")) global_grid_sizer.Add(self.clear_cache_button, 0, wx.ALIGN_CENTER_VERTICAL, 0) global_margin.Add((0, 0), 1, wx.EXPAND, 0) button_sizer = wx.BoxSizer(wx.HORIZONTAL) main_sizer.Add(button_sizer, 0, wx.BOTTOM | wx.EXPAND | wx.LEFT | wx.RIGHT, 10) button_sizer.Add((0, 0), 1, 0, 0) self.cancel_button = wx.Button(self.panel_1, wx.ID_CANCEL, "") button_sizer.Add(self.cancel_button, 0, wx.RIGHT, 10) self.ok_button = wx.Button(self.panel_1, wx.ID_OK, "") button_sizer.Add(self.ok_button, 0, 0, 0) global_grid_sizer.AddGrowableCol(0) self.global_page.SetSizer(global_margin) this_svg_grid.AddGrowableCol(0) self.this_svg_page.SetSizer(this_svg_margin) self.panel_1.SetSizer(main_sizer) main_sizer.Fit(self) self.Layout() self.SetSizeHints(main_sizer.CalcMin()) self.Bind(wx.EVT_BUTTON, self.set_as_default_minimum_jump_stitch_length, self.button_1) self.Bind(wx.EVT_BUTTON, self.set_as_default_minimum_stitch_length, self.button_2) self.Bind(wx.EVT_BUTTON, self.clear_cache, self.clear_cache_button) self.Bind(wx.EVT_BUTTON, self.cancel_button_clicked, self.cancel_button) self.Bind(wx.EVT_BUTTON, self.ok_button_clicked, self.ok_button) def set_as_default_minimum_jump_stitch_length(self, event): self.default_minimum_jump_stitch_length.SetValue(self.minimum_jump_stitch_length.GetValue()) def set_as_default_minimum_stitch_length(self, event): self.default_minimum_stitch_length.SetValue(self.minimum_stitch_length.GetValue()) def clear_cache(self, event): stitch_plan_cache = get_stitch_plan_cache() stitch_plan_cache.clear(retry=True) def apply(self): metadata = self.extension.get_inkstitch_metadata() metadata['min_stitch_len_mm'] = self.minimum_stitch_length.GetValue() metadata['collapse_len_mm'] = self.minimum_jump_stitch_length.GetValue() global_settings['default_min_stitch_len_mm'] = self.default_minimum_stitch_length.GetValue() global_settings['default_collapse_len_mm'] = self.default_minimum_jump_stitch_length.GetValue() global_settings['cache_size'] = self.stitch_plan_cache_size.GetValue() # cache size may have changed stitch_plan_cache = get_stitch_plan_cache() stitch_plan_cache.size_limit = int(global_settings['cache_size'] * 1024 * 1024) stitch_plan_cache.cull() if not global_settings['cache_size']: stitch_plan_cache.clear(retry=True) def cancel_button_clicked(self, event): self.Destroy() def ok_button_clicked(self, event): self.apply() self.Destroy() class PreferencesApp(wx.App): def __init__(self, extension): self.extension = extension super().__init__() def OnInit(self): self.frame = PreferencesFrame(extension=self.extension) self.SetTopWindow(self.frame) self.frame.Show() return True if __name__ == "__main__": app = PreferencesApp(None) app.MainLoop()