summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLex Neva <github.com@lexneva.name>2023-08-15 22:59:04 -0400
committerLex Neva <github.com@lexneva.name>2023-08-15 22:59:04 -0400
commite35cacc5ccd4830c82def2f6f4797bf971191a95 (patch)
treeeb3d60afd6287da49c91dd4d55294eed7689ddd0
parente4de563010d8f7eabe0d476285a044ba781467d9 (diff)
convert Preferences to wxPython
-rw-r--r--lib/extensions/preferences.py26
-rw-r--r--lib/gui/preferences.py217
-rw-r--r--lib/gui/preferences.wxg305
3 files changed, 525 insertions, 23 deletions
diff --git a/lib/extensions/preferences.py b/lib/extensions/preferences.py
index 44c1b5aa..b78537c8 100644
--- a/lib/extensions/preferences.py
+++ b/lib/extensions/preferences.py
@@ -4,8 +4,7 @@
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
from .base import InkstitchExtension
-from ..api import APIServer
-from ..gui import open_url
+from ..gui.preferences import PreferencesApp
class Preferences(InkstitchExtension):
@@ -13,25 +12,6 @@ class Preferences(InkstitchExtension):
This saves embroider settings into the metadata of the file
'''
- def __init__(self, *args, **kwargs):
- InkstitchExtension.__init__(self, *args, **kwargs)
- self.arg_parser.add_argument("-c", "--collapse_len_mm",
- action="store", type=float,
- dest="collapse_length_mm", default=3.0,
- help="max collapse length (mm)")
- self.arg_parser.add_argument("-l", "--min_stitch_len_mm",
- action="store", type=float,
- dest="min_stitch_len_mm", default=0,
- help="minimum stitch length (mm)")
-
def effect(self):
- api_server = APIServer(self)
- port = api_server.start_server()
- electron = open_url("/preferences", port)
- electron.wait()
- api_server.stop()
- api_server.join()
-
- # self.metadata = self.get_inkstitch_metadata()
- # self.metadata['collapse_len_mm'] = self.options.collapse_length_mm
- # self.metadata['min_stitch_len_mm'] = self.options.min_stitch_len_mm
+ app = PreferencesApp(self)
+ app.MainLoop()
diff --git a/lib/gui/preferences.py b/lib/gui/preferences.py
new file mode 100644
index 00000000..a93f0d6d
--- /dev/null
+++ b/lib/gui/preferences.py
@@ -0,0 +1,217 @@
+# 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(_("frame"))
+
+ 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"))
+
+ sizer_1 = wx.BoxSizer(wx.VERTICAL)
+
+ # add space above and below to center sizer_2 vertically
+ sizer_1.Add((0, 20), 1, wx.EXPAND, 0)
+
+ sizer_2 = wx.FlexGridSizer(2, 4, 15, 10)
+ sizer_1.Add(sizer_2, 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."))
+ sizer_2.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)
+ sizer_2.Add(self.minimum_jump_stitch_length, 0, wx.ALIGN_CENTER_VERTICAL, 0)
+
+ label_2 = wx.StaticText(self.this_svg_page, wx.ID_ANY, _("mm"))
+ sizer_2.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"))
+ sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_VERTICAL, 0)
+
+ label_3 = wx.StaticText(self.this_svg_page, wx.ID_ANY, _("Minimum stitch length"))
+ sizer_2.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)
+ sizer_2.Add(self.minimum_stitch_length, 0, wx.ALIGN_CENTER_VERTICAL, 0)
+
+ label_4 = wx.StaticText(self.this_svg_page, wx.ID_ANY, _("mm"))
+ sizer_2.Add(label_4, 0, wx.ALIGN_CENTER_VERTICAL, 0)
+
+ self.button_2 = wx.Button(self.this_svg_page, wx.ID_ANY, _("Set As Default"))
+ sizer_2.Add(self.button_2, 0, wx.ALIGN_CENTER_VERTICAL, 0)
+
+ sizer_1.Add((0, 20), 1, wx.EXPAND, 0)
+
+ self.global_page = wx.Panel(self.notebook, wx.ID_ANY)
+ self.notebook.AddPage(self.global_page, _("Global"))
+
+ sizer_3 = wx.BoxSizer(wx.VERTICAL)
+
+ # add space above and below to center sizer_4 vertically
+ sizer_3.Add((0, 20), 1, wx.EXPAND, 0)
+
+ sizer_4 = wx.FlexGridSizer(3, 4, 15, 10)
+ sizer_3.Add(sizer_4, 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."))
+ sizer_4.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)
+ sizer_4.Add(self.default_minimum_jump_stitch_length, 0, wx.ALIGN_CENTER_VERTICAL, 0)
+
+ label_6 = wx.StaticText(self.global_page, wx.ID_ANY, _("mm"))
+ sizer_4.Add(label_6, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 15)
+
+ sizer_4.Add((0, 0), 0, 0, 0)
+
+ label_7 = wx.StaticText(self.global_page, wx.ID_ANY, _("Minimum stitch length"))
+ sizer_4.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)
+ sizer_4.Add(self.default_minimum_stitch_length, 0, wx.ALIGN_CENTER_VERTICAL, 0)
+
+ label_8 = wx.StaticText(self.global_page, wx.ID_ANY, _("mm"))
+ sizer_4.Add(label_8, 0, wx.ALIGN_CENTER_VERTICAL, 0)
+
+ sizer_4.Add((0, 20), 0, 0, 0)
+
+ label_9 = wx.StaticText(self.global_page, wx.ID_ANY, _("Stitch plan cache size"), style=wx.ALIGN_LEFT)
+ label_9.SetToolTip(_("Jump stitches smaller than this will be treated as normal stitches."))
+ sizer_4.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)
+ sizer_4.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"))
+ sizer_4.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"))
+ sizer_4.Add(self.clear_cache_button, 0, wx.ALIGN_CENTER_VERTICAL, 0)
+
+ sizer_3.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)
+
+ sizer_4.AddGrowableCol(0)
+
+ self.global_page.SetSizer(sizer_3)
+
+ sizer_2.AddGrowableCol(0)
+
+ self.this_svg_page.SetSizer(sizer_1)
+
+ 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()
+
+ 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()
diff --git a/lib/gui/preferences.wxg b/lib/gui/preferences.wxg
new file mode 100644
index 00000000..2ed89ad5
--- /dev/null
+++ b/lib/gui/preferences.wxg
@@ -0,0 +1,305 @@
+<?xml version="1.0"?>
+<!-- generated by wxGlade 1.0.5 on Tue Aug 15 00:11:05 2023 -->
+
+<application class="PreferencesApp" encoding="UTF-8" for_version="3.0" header_extension=".h" indent_amount="4" indent_symbol="space" is_template="0" language="python" mark_blocks="1" name="app" option="0" overwrite="1" path="/home/lex/repos/inkstitch/lib/gui/preferences.py" source_extension=".cpp" top_window="frame" use_gettext="1" use_new_namespace="1">
+ <object class="PreferencesFrame" name="frame" base="EditFrame">
+ <extracode_post>self.SetSizeHints(main_sizer.CalcMin())</extracode_post>
+ <title>frame</title>
+ <style>wxDEFAULT_FRAME_STYLE</style>
+ <object class="wxPanel" name="panel_1" base="EditPanel">
+ <object class="wxBoxSizer" name="main_sizer" base="EditBoxSizer">
+ <orient>wxVERTICAL</orient>
+ <object class="sizeritem">
+ <option>1</option>
+ <border>10</border>
+ <flag>wxALL|wxEXPAND</flag>
+ <object class="wxNotebook" name="notebook" base="EditNotebook">
+ <style>wxNB_TOP</style>
+ <tabs>
+ <tab window="this_svg_page">This SVG</tab>
+ <tab window="global_page">Global</tab>
+ </tabs>
+ <object class="wxPanel" name="this_svg_page" base="EditPanel">
+ <style>wxTAB_TRAVERSAL</style>
+ <object class="wxBoxSizer" name="sizer_1" base="EditBoxSizer">
+ <orient>wxVERTICAL</orient>
+ <object class="sizeritem">
+ <option>1</option>
+ <border>0</border>
+ <flag>wxEXPAND</flag>
+ <object class="spacer" name="spacer" base="EditSpacer">
+ <extracode_pre># add space above and below to center sizer_2 vertically</extracode_pre>
+ <width>0</width>
+ <height>0</height>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>20</border>
+ <flag>wxLEFT|wxRIGHT|wxEXPAND</flag>
+ <object class="wxFlexGridSizer" name="sizer_2" base="EditFlexGridSizer">
+ <rows>2</rows>
+ <cols>4</cols>
+ <vgap>15</vgap>
+ <hgap>10</hgap>
+ <growable_cols>0</growable_cols>
+ <object class="sizeritem">
+ <option>1</option>
+ <border>15</border>
+ <flag>wxRIGHT|wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxStaticText" name="label_1" base="EditStaticText">
+ <tooltip>Jump stitches smaller than this will be treated as normal stitches.</tooltip>
+ <style>wxALIGN_LEFT</style>
+ <label>Minimum jump stitch length</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxSpinCtrlDouble" name="minimum_jump_stitch_length" base="EditSpinCtrlDouble">
+ <style>wxSP_ARROW_KEYS|wxALIGN_RIGHT</style>
+ <value>0.0</value>
+ <digits>1</digits>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>15</border>
+ <flag>wxRIGHT|wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxStaticText" name="label_2" base="EditStaticText">
+ <label>mm</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxButton" name="button_1" base="EditButton">
+ <events>
+ <handler event="EVT_BUTTON">set_as_default_minimum_jump_stitch_length</handler>
+ </events>
+ <label>Set As Default</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <object class="wxStaticText" name="label_3" base="EditStaticText">
+ <label>Minimum stitch length</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxSpinCtrlDouble" name="minimum_stitch_length" base="EditSpinCtrlDouble">
+ <style>wxSP_ARROW_KEYS|wxALIGN_RIGHT</style>
+ <range>0.0, 100.0</range>
+ <value>0.0</value>
+ <digits>1</digits>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxStaticText" name="label_4" base="EditStaticText">
+ <label>mm</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxButton" name="button_2" base="EditButton">
+ <events>
+ <handler event="EVT_BUTTON">set_as_default_minimum_stitch_length</handler>
+ </events>
+ <label>Set As Default</label>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>1</option>
+ <border>0</border>
+ <flag>wxEXPAND</flag>
+ <object class="spacer" name="spacer" base="EditSpacer">
+ <width>0</width>
+ <height>0</height>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="wxPanel" name="global_page" base="EditPanel">
+ <style>wxTAB_TRAVERSAL</style>
+ <object class="wxBoxSizer" name="sizer_3" base="EditBoxSizer">
+ <orient>wxVERTICAL</orient>
+ <object class="sizeritem">
+ <option>1</option>
+ <border>0</border>
+ <flag>wxEXPAND</flag>
+ <object class="spacer" name="spacer" base="EditSpacer">
+ <extracode_pre># add space above and below to center sizer_4 vertically</extracode_pre>
+ <width>0</width>
+ <height>0</height>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>20</border>
+ <flag>wxLEFT|wxRIGHT|wxEXPAND</flag>
+ <object class="wxFlexGridSizer" name="sizer_4" base="EditFlexGridSizer">
+ <rows>3</rows>
+ <cols>4</cols>
+ <vgap>15</vgap>
+ <hgap>10</hgap>
+ <growable_cols>0</growable_cols>
+ <object class="sizeritem">
+ <option>1</option>
+ <border>15</border>
+ <flag>wxRIGHT|wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxStaticText" name="label_5" base="EditStaticText">
+ <tooltip>Jump stitches smaller than this will be treated as normal stitches.</tooltip>
+ <style>wxALIGN_LEFT</style>
+ <label>Default minimum jump stitch length</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxSpinCtrlDouble" name="default_minimum_jump_stitch_length_copy" base="EditSpinCtrlDouble">
+ <style>wxSP_ARROW_KEYS|wxALIGN_RIGHT</style>
+ <range>0.0, 100.0</range>
+ <value>0.0</value>
+ <digits>1</digits>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>15</border>
+ <flag>wxRIGHT|wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxStaticText" name="label_6" base="EditStaticText">
+ <label>mm</label>
+ </object>
+ </object>
+ <object class="sizerslot" />
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxStaticText" name="label_7" base="EditStaticText">
+ <label>Minimum stitch length</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxSpinCtrlDouble" name="default_minimum_stitch_length" base="EditSpinCtrlDouble">
+ <style>wxSP_ARROW_KEYS|wxALIGN_RIGHT</style>
+ <range>0.0, 100.0</range>
+ <value>0.0</value>
+ <digits>1</digits>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxStaticText" name="label_8" base="EditStaticText">
+ <label>mm</label>
+ </object>
+ </object>
+ <object class="sizerslot" />
+ <object class="sizeritem">
+ <option>1</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxStaticText" name="label_9" base="EditStaticText">
+ <tooltip>Jump stitches smaller than this will be treated as normal stitches.</tooltip>
+ <style>wxALIGN_LEFT</style>
+ <label>Stitch plan cache size</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxSpinCtrlDouble" name="stitch_plan_cache_size" base="EditSpinCtrlDouble">
+ <style>wxSP_ARROW_KEYS|wxALIGN_RIGHT</style>
+ <range>0.0, 100.0</range>
+ <value>0.0</value>
+ <digits>1</digits>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxStaticText" name="label_10" base="EditStaticText">
+ <label>MB</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <flag>wxALIGN_CENTER_VERTICAL</flag>
+ <object class="wxButton" name="button_3" base="EditButton">
+ <label>Clear Stitch Plan Cache</label>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>1</option>
+ <border>0</border>
+ <flag>wxEXPAND</flag>
+ <object class="spacer" name="spacer" base="EditSpacer">
+ <width>0</width>
+ <height>0</height>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>10</border>
+ <flag>wxLEFT|wxRIGHT|wxBOTTOM|wxEXPAND</flag>
+ <object class="wxBoxSizer" name="button_sizer" base="EditBoxSizer">
+ <orient>wxHORIZONTAL</orient>
+ <object class="sizeritem">
+ <option>1</option>
+ <border>0</border>
+ <object class="spacer" name="spacer" base="EditSpacer">
+ <width>0</width>
+ <height>0</height>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>10</border>
+ <flag>wxRIGHT</flag>
+ <object class="wxButton" name="button_4" base="EditButton">
+ <label>button_4</label>
+ <stockitem>CANCEL</stockitem>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <option>0</option>
+ <border>0</border>
+ <object class="wxButton" name="button_5" base="EditButton">
+ <label>button_5</label>
+ <stockitem>OK</stockitem>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+</application>