add meander preview images (#2113)
|
@ -78,8 +78,7 @@ class ParamsTab(ScrolledPanel):
|
||||||
self.param_change_indicators = {}
|
self.param_change_indicators = {}
|
||||||
|
|
||||||
self.settings_grid = wx.FlexGridSizer(rows=0, cols=4, hgap=10, vgap=15)
|
self.settings_grid = wx.FlexGridSizer(rows=0, cols=4, hgap=10, vgap=15)
|
||||||
self.settings_grid.AddGrowableCol(1, 2)
|
self.settings_grid.AddGrowableCol(2, 1)
|
||||||
self.settings_grid.SetFlexibleDirection(wx.HORIZONTAL)
|
|
||||||
|
|
||||||
self.pencil_icon = wx.Image(os.path.join(get_resource_dir(
|
self.pencil_icon = wx.Image(os.path.join(get_resource_dir(
|
||||||
"icons"), "pencil_20x20.png")).ConvertToBitmap()
|
"icons"), "pencil_20x20.png")).ConvertToBitmap()
|
||||||
|
@ -348,24 +347,21 @@ class ParamsTab(ScrolledPanel):
|
||||||
# just to add space around the settings
|
# just to add space around the settings
|
||||||
box = wx.BoxSizer(wx.VERTICAL)
|
box = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
|
||||||
summary_box = wx.StaticBox(
|
summary_box = wx.StaticBox(self, wx.ID_ANY, label=_("Inkscape objects"))
|
||||||
self, wx.ID_ANY, label=_("Inkscape objects"))
|
|
||||||
sizer = wx.StaticBoxSizer(summary_box, wx.HORIZONTAL)
|
sizer = wx.StaticBoxSizer(summary_box, wx.HORIZONTAL)
|
||||||
self.description = wx.StaticText(self)
|
self.description = wx.StaticText(self)
|
||||||
self.update_description()
|
self.update_description()
|
||||||
self.description.SetLabel(self.description_text)
|
self.description.SetLabel(self.description_text)
|
||||||
self.description_container = box
|
self.description_container = box
|
||||||
self.Bind(wx.EVT_SIZE, self.resized)
|
self.Bind(wx.EVT_SIZE, self.resized)
|
||||||
sizer.Add(self.description, proportion=0,
|
sizer.Add(self.description, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
|
||||||
flag=wx.EXPAND | wx.ALL, border=5)
|
|
||||||
box.Add(sizer, proportion=0, flag=wx.ALL, border=5)
|
box.Add(sizer, proportion=0, flag=wx.ALL, border=5)
|
||||||
|
|
||||||
if self.toggle:
|
if self.toggle:
|
||||||
toggle_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
toggle_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
toggle_sizer.Add(self.create_change_indicator(
|
toggle_sizer.Add(self.create_change_indicator(
|
||||||
self.toggle.name), proportion=0, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=5)
|
self.toggle.name), proportion=0, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=5)
|
||||||
toggle_sizer.Add(self.toggle_checkbox, proportion=0,
|
toggle_sizer.Add(self.toggle_checkbox, proportion=0, flag=wx.ALIGN_CENTER_VERTICAL)
|
||||||
flag=wx.ALIGN_CENTER_VERTICAL)
|
|
||||||
box.Add(toggle_sizer, proportion=0, flag=wx.BOTTOM, border=10)
|
box.Add(toggle_sizer, proportion=0, flag=wx.BOTTOM, border=10)
|
||||||
|
|
||||||
for param in self.params:
|
for param in self.params:
|
||||||
|
@ -378,11 +374,9 @@ class ParamsTab(ScrolledPanel):
|
||||||
description.Hide()
|
description.Hide()
|
||||||
for item in param.select_items:
|
for item in param.select_items:
|
||||||
self.choice_widgets[item].extend([col1, description])
|
self.choice_widgets[item].extend([col1, description])
|
||||||
# else:
|
|
||||||
self.settings_grid.Add(
|
self.settings_grid.Add(col1, flag=wx.ALIGN_CENTER_VERTICAL)
|
||||||
col1, proportion=0, flag=wx.ALIGN_CENTER_VERTICAL)
|
self.settings_grid.Add(description, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.TOP, border=5)
|
||||||
self.settings_grid.Add(description, proportion=1, flag=wx.EXPAND |
|
|
||||||
wx.RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.TOP, border=5)
|
|
||||||
|
|
||||||
if param.type == 'boolean':
|
if param.type == 'boolean':
|
||||||
if len(param.values) > 1:
|
if len(param.values) > 1:
|
||||||
|
@ -402,11 +396,18 @@ class ParamsTab(ScrolledPanel):
|
||||||
self.dict_of_choices[param.name] = {
|
self.dict_of_choices[param.name] = {
|
||||||
"param": param, "widget": input, "last_initialized_choice": 1}
|
"param": param, "widget": input, "last_initialized_choice": 1}
|
||||||
elif param.type == 'combo':
|
elif param.type == 'combo':
|
||||||
input = wx.ComboBox(self, wx.ID_ANY, choices=[], style=wx.CB_READONLY)
|
input = wx.adv.BitmapComboBox(self, wx.ID_ANY, choices=[], style=wx.CB_READONLY)
|
||||||
for option in param.options:
|
for option in param.options:
|
||||||
input.Append(option.name, option)
|
if option.preview_image:
|
||||||
|
image = wx.Image(option.preview_image)
|
||||||
|
image.Rescale(60, 60, quality=wx.IMAGE_QUALITY_HIGH)
|
||||||
|
image = wx.Bitmap(image)
|
||||||
|
else:
|
||||||
|
image = wx.NullBitmap
|
||||||
|
input.Append(option.name, image, option)
|
||||||
if not param.options:
|
if not param.options:
|
||||||
input.Append(_('No options available'), ParamOption('not_available'))
|
input.Append(_('No options available'), ParamOption('not_available'))
|
||||||
|
|
||||||
value = self.get_combo_value_index(param.values[0], param.options)
|
value = self.get_combo_value_index(param.values[0], param.options)
|
||||||
input.SetSelection(value)
|
input.SetSelection(value)
|
||||||
input.Bind(wx.EVT_COMBOBOX, self.changed)
|
input.Bind(wx.EVT_COMBOBOX, self.changed)
|
||||||
|
@ -437,15 +438,13 @@ class ParamsTab(ScrolledPanel):
|
||||||
col4.Hide()
|
col4.Hide()
|
||||||
for item in param.select_items:
|
for item in param.select_items:
|
||||||
self.choice_widgets[item].extend([input, col4])
|
self.choice_widgets[item].extend([input, col4])
|
||||||
# else:
|
|
||||||
self.settings_grid.Add(
|
self.settings_grid.Add(input, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.EXPAND, border=40)
|
||||||
input, proportion=1, flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND | wx.LEFT, border=40)
|
self.settings_grid.Add(col4, flag=wx.ALIGN_CENTER_VERTICAL)
|
||||||
self.settings_grid.Add(
|
|
||||||
col4, proportion=1, flag=wx.ALIGN_CENTER_VERTICAL)
|
|
||||||
|
|
||||||
self.inputs_to_params = {v: k for k, v in self.param_inputs.items()}
|
self.inputs_to_params = {v: k for k, v in self.param_inputs.items()}
|
||||||
|
|
||||||
box.Add(self.settings_grid, proportion=1, flag=wx.ALL, border=10)
|
box.Add(self.settings_grid, proportion=1, flag=wx.ALL | wx.EXPAND, border=10)
|
||||||
|
|
||||||
self.SetSizer(box)
|
self.SetSizer(box)
|
||||||
self.update_choice_widgets()
|
self.update_choice_widgets()
|
||||||
|
|
|
@ -11,13 +11,14 @@ from .stitch import Stitch
|
||||||
|
|
||||||
|
|
||||||
class LockStitchDefinition:
|
class LockStitchDefinition:
|
||||||
def __init__(self, lock_id=None, name=None, path=None):
|
def __init__(self, lock_id=None, name=None, path=None, preview_image=None):
|
||||||
self.id: str = lock_id
|
self.id: str = lock_id
|
||||||
self.name: str = name
|
self.name: str = name
|
||||||
self._path: str = path
|
self._path: str = path
|
||||||
|
self.preview_image: str = None
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "LockStitchDefinition(%s, %s, %s)" % (self.id, self.name, self.path)
|
return "LockStitchDefinition(%s, %s, %s, %s)" % (self.id, self.name, self._path, self.preview_image)
|
||||||
|
|
||||||
def stitches(self):
|
def stitches(self):
|
||||||
raise NotImplementedError(f"{self.__class__.__name__} must implement stitches()")
|
raise NotImplementedError(f"{self.__class__.__name__} must implement stitches()")
|
||||||
|
|
|
@ -21,6 +21,7 @@ class Tile:
|
||||||
|
|
||||||
def _load_tile(self, tile_path):
|
def _load_tile(self, tile_path):
|
||||||
self.tile_svg = inkex.load_svg(os.path.join(tile_path, "tile.svg"))
|
self.tile_svg = inkex.load_svg(os.path.join(tile_path, "tile.svg"))
|
||||||
|
self.preview_image = self._load_preview(tile_path)
|
||||||
self._load_metadata(tile_path)
|
self._load_metadata(tile_path)
|
||||||
self.tile = None
|
self.tile = None
|
||||||
self.width = None
|
self.width = None
|
||||||
|
@ -32,10 +33,16 @@ class Tile:
|
||||||
return self.name < other.name
|
return self.name < other.name
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"Tile({self.name}, {self.id})"
|
return f"Tile({self.name}, {self.id}, {self.preview_image})"
|
||||||
|
|
||||||
__str__ = __repr__
|
__str__ = __repr__
|
||||||
|
|
||||||
|
def _load_preview(self, tile_path):
|
||||||
|
image_path = os.path.join(tile_path, "preview.png")
|
||||||
|
if os.path.isfile(image_path):
|
||||||
|
return image_path
|
||||||
|
return None
|
||||||
|
|
||||||
def _load_metadata(self, tile_path):
|
def _load_metadata(self, tile_path):
|
||||||
with open(os.path.join(tile_path, "tile.json"), "rb") as tile_json:
|
with open(os.path.join(tile_path, "tile.json"), "rb") as tile_json:
|
||||||
tile_metadata = json.load(tile_json)
|
tile_metadata = json.load(tile_json)
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
class ParamOption:
|
class ParamOption:
|
||||||
def __init__(self, param_id=None, name=None, legacy=None):
|
def __init__(self, param_id=None, name=None, legacy=None, preview_image=None):
|
||||||
self.id: str = param_id
|
self.id: str = param_id
|
||||||
self.name: str = name
|
self.name: str = name
|
||||||
self.legacy: int = legacy
|
self.legacy: int = legacy
|
||||||
|
self.preview_image: str = None
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "ParamOption(%s, %s, %s)" % (self.id, self.name, self.legacy)
|
return "ParamOption(%s, %s, %s, %s)" % (self.id, self.name, self.legacy, self.preview_image)
|
||||||
|
|
Po Szerokość: | Wysokość: | Rozmiar: 15 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 12 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 14 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 15 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 11 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 18 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 26 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 17 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 10 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 14 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 22 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 12 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 9.1 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 9.6 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 13 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 18 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 21 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 22 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 20 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 20 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 19 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 17 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 21 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 19 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 12 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 17 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 18 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 21 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 23 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 21 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 17 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 15 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 15 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 21 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 9.7 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 18 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 14 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 19 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 13 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 17 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 14 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 13 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 17 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 17 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 15 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 12 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 12 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 14 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 42 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 10 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 14 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 14 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 18 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 22 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 21 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 18 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 20 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 13 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 18 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 10 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 13 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 20 KiB |