inkstitch/lib/gui/edit_json/settings_panel.py

308 wiersze
13 KiB
Python

# 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 _
from ...lettering.categories import FONT_CATEGORIES
from .combo_prompt import PromptingComboBox
from .editable_list import EditableListCtrl
class SettingsPanel(wx.Panel):
def __init__(self, parent):
self.parent = parent.GetParent()
wx.Panel.__init__(self, parent)
# settings
settings_sizer = wx.BoxSizer(wx.VERTICAL)
self.font_chooser = wx.adv.BitmapComboBox(self, wx.ID_ANY, style=wx.CB_READONLY | wx.CB_SORT, size=(600, 40))
self.font_chooser.Bind(wx.EVT_COMBOBOX, self.parent.on_font_changed)
text_before_label = wx.StaticText(self, label=_("Text before"))
text_before = wx.TextCtrl(self)
text_before.Bind(wx.EVT_TEXT, self.parent.on_text_before_changed)
text_after_label = wx.StaticText(self, label=_("Text after"))
text_after = wx.TextCtrl(self)
text_after.Bind(wx.EVT_TEXT, self.parent.on_text_after_changed)
grid_text_sizer = wx.FlexGridSizer(2, 2, 10, 10)
grid_text_sizer.AddGrowableCol(1)
grid_text_sizer.AddMany([
(text_before_label, 1, wx.ALL, 0),
(text_before, 1, wx.EXPAND, 0),
(text_after_label, 1, wx.ALL, 0),
(text_after, 1, wx.EXPAND, 0)
])
notebook_sizer = wx.BoxSizer(wx.VERTICAL)
self.notebook = wx.Notebook(self, wx.ID_ANY)
notebook_sizer.Add(self.notebook, 1, wx.EXPAND, 0)
self.notebook.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.parent.update_preview)
self.font_info = FontInfo(self.notebook)
self.notebook.AddPage(self.font_info, _("Font Info"))
self.font_settings = FontSettings(self.notebook)
self.notebook.AddPage(self.font_settings, _("Font Settings"))
self.font_kerning = GeneralKerning(self.notebook)
self.notebook.AddPage(self.font_kerning, _("General Kerning"))
glyph_list = GlyphList(self.notebook)
self.notebook.AddPage(glyph_list, _("Horizontal advance"))
self.glyph_list = glyph_list.glyph_list
kerning_pairs = KerningPairs(self.notebook)
self.notebook.AddPage(kerning_pairs, _("Kerning pairs"))
self.kerning_list = kerning_pairs.kerning_list
self.kerning_filter = kerning_pairs.filter_kerning
apply_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.cancel_button = wx.Button(self, label=_("Cancel"))
self.cancel_button.Bind(wx.EVT_BUTTON, self.parent.cancel)
self.apply_button = wx.Button(self, label=_("Apply"))
self.apply_button.Bind(wx.EVT_BUTTON, self.parent.apply)
apply_sizer.Add(self.cancel_button, 0, wx.RIGHT | wx.BOTTOM, 5)
apply_sizer.Add(self.apply_button, 0, wx.RIGHT | wx.BOTTOM, 10)
settings_sizer.Add(self.font_chooser, 0, wx.ALL | wx.EXPAND, 10)
settings_sizer.Add(grid_text_sizer, 0, wx.ALL | wx.EXPAND, 10)
settings_sizer.Add(notebook_sizer, 2, wx.ALL | wx.EXPAND, 10)
settings_sizer.Add(apply_sizer, 0, wx.ALIGN_RIGHT | wx.ALL, 10)
self.SetSizer(settings_sizer)
class FontInfo(wx.Panel):
def __init__(self, parent):
self.parent = parent.GetParent().parent
wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.VERTICAL)
grid_sizer = wx.FlexGridSizer(20, 2, 10, 10)
grid_sizer.AddGrowableCol(1)
name_label = wx.StaticText(self, label=_("Name"))
self.name = wx.TextCtrl(self)
self.name.Bind(
wx.EVT_TEXT,
lambda event: self.parent.on_font_meta_value_changed("name", False, event)
)
description_label = wx.StaticText(self, label=_("Description"))
self.description = wx.TextCtrl(self, size=wx.Size(10, 100), style=wx.TE_MULTILINE)
self.description.Bind(
wx.EVT_TEXT,
lambda event: self.parent.on_font_meta_value_changed("description", False, event)
)
default_variant_label = wx.StaticText(self, label=_("Default Variant"))
self.default_variant = wx.Choice(self, choices=["", "", "", ""])
self.default_variant.Bind(wx.EVT_CHOICE, self.parent.on_default_variant_change)
text_direction_label = wx.StaticText(self, label=_("Text direction"))
self.text_direction = wx.Choice(self, choices=[_("Left to Right"), _("Right to Left")])
self.text_direction.Bind(wx.EVT_CHOICE, self.parent.on_text_direction_changed)
keywords_label = wx.StaticText(self, label=_("Keywords"))
self.keywords = wx.ListBox(
self,
size=wx.Size(10, 400),
choices=[cat.name for cat in FONT_CATEGORIES],
style=wx.CB_SORT | wx.LB_EXTENDED
)
self.keywords.Bind(wx.EVT_LISTBOX, self.parent.on_keyword_changed)
grid_sizer.AddMany([
(name_label, 0, wx.ALL, 0),
(self.name, 0, wx.ALL | wx.EXPAND, 0),
(description_label, 0, wx.ALL, 0),
(self.description, 1, wx.ALL | wx.EXPAND, 0),
(default_variant_label, 0, wx.ALL, 0),
(self.default_variant, 1, wx.ALL | wx.EXPAND, 0),
(text_direction_label, 0, wx.ALL, 0),
(self.text_direction, 1, wx.ALL | wx.EXPAND, 0),
(keywords_label, 0, wx.ALL, 0),
(self.keywords, 1, wx.ALL | wx.EXPAND, 0)
])
sizer.Add(grid_sizer, 1, wx.EXPAND | wx.ALL, 10)
self.SetSizer(sizer)
class FontSettings(wx.Panel):
def __init__(self, parent):
self.parent = parent.GetParent().parent
wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.VERTICAL)
grid_sizer = wx.FlexGridSizer(20, 2, 10, 10)
grid_sizer.AddGrowableCol(1)
default_glyph_label = wx.StaticText(self, label=_("Default glyph"))
self.default_glyph = wx.TextCtrl(self)
self.default_glyph.Bind(
wx.EVT_TEXT,
lambda event: self.parent.on_font_meta_value_changed("default_glyph", True, event)
)
auto_satin_label = wx.StaticText(self, label=_("AutoSatin"))
self.auto_satin = wx.CheckBox(self)
self.auto_satin.Bind(
wx.EVT_CHECKBOX,
lambda event: self.parent.on_font_meta_value_changed("auto_satin", False, event)
)
letter_case_label = wx.StaticText(self, label=_("Letter case"))
self.letter_case = wx.Choice(self, choices=[_("None"), _("Upper"), _("Lower")])
self.letter_case.Bind(wx.EVT_CHOICE, self.parent.on_letter_case_change)
reversible_label = wx.StaticText(self, label=_("Reversible"))
self.reversible = wx.CheckBox(self)
self.reversible.Bind(
wx.EVT_CHECKBOX,
lambda event: self.parent.on_font_meta_value_changed("reversible", False, event)
)
sortable_label = wx.StaticText(self, label=_("Sortable"))
self.sortable = wx.CheckBox(self)
self.sortable.Bind(
wx.EVT_CHECKBOX,
lambda event: self.parent.on_font_meta_value_changed("sortable", False, event)
)
combine_indices_label = wx.StaticText(self, label=_("Combine Indices"))
self.combine_at_sort_indices = wx.TextCtrl(self)
self.combine_at_sort_indices.Bind(wx.EVT_TEXT, self.parent.on_combine_indices_changed)
grid_sizer.AddMany([
(default_glyph_label, 0, wx.ALL, 0),
(self.default_glyph, 1, wx.ALL | wx.EXPAND, 0),
(auto_satin_label, 0, wx.ALL, 0),
(self.auto_satin, 1, wx.ALL | wx.EXPAND, 0),
(letter_case_label, 0, wx.ALL, 0),
(self.letter_case, 1, wx.ALL | wx.EXPAND, 0),
(reversible_label, 0, wx.ALL, 0),
(self.reversible, 1, wx.ALL | wx.EXPAND, 0),
(sortable_label, 0, wx.ALL, 0),
(self.sortable, 1, wx.ALL | wx.EXPAND, 0),
(combine_indices_label, 0, wx.ALL, 0),
(self.combine_at_sort_indices, 1, wx.ALL | wx.EXPAND, 0)
])
sizer.Add(grid_sizer, 1, wx.EXPAND | wx.ALL, 10)
self.SetSizer(sizer)
class GeneralKerning(wx.Panel):
def __init__(self, parent):
self.parent = parent.GetParent().parent
wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.VERTICAL)
grid_sizer = wx.FlexGridSizer(20, 2, 10, 10)
grid_sizer.AddGrowableCol(1)
size_label = wx.StaticText(self, label=_("Size"))
self.size = wx.SpinCtrlDouble(self, min=0, max=10000, inc=0.1, initial=50, style=wx.SP_WRAP)
self.size.Bind(
wx.EVT_SPINCTRLDOUBLE,
lambda event: self.parent.on_font_meta_value_changed("size", True, event)
)
min_scale_label = wx.StaticText(self, label=_("Min Scale"))
self.min_scale = wx.SpinCtrlDouble(self, min=0, max=100, inc=0.1, initial=1, style=wx.SP_WRAP)
self.min_scale.Bind(
wx.EVT_SPINCTRLDOUBLE,
lambda event: self.parent.on_font_meta_value_changed("min_scale", True, event)
)
self.min_scale.SetDigits(2)
max_scale_label = wx.StaticText(self, label=_("Max Scale"))
self.max_scale = wx.SpinCtrlDouble(self, min=0, max=100, inc=0.1, initial=1, style=wx.SP_WRAP)
self.max_scale.Bind(
wx.EVT_SPINCTRLDOUBLE,
lambda event: self.parent.on_font_meta_value_changed("max_scale", True, event)
)
self.max_scale.SetDigits(2)
leading_label = wx.StaticText(self, label=_("Leading"))
self.leading = wx.SpinCtrlDouble(self, min=0, max=10000, inc=1, initial=0, style=wx.SP_WRAP)
self.leading.Bind(
wx.EVT_SPINCTRLDOUBLE,
lambda event: self.parent.on_font_meta_value_changed("leading", False, event)
)
horiz_adv_x_default_label = wx.StaticText(self, label=_("Horizontal advance x"))
self.horiz_adv_x_default = wx.SpinCtrlDouble(self, min=0, max=10000, inc=0.1, initial=50, style=wx.SP_WRAP)
self.horiz_adv_x_default.Bind(
wx.EVT_SPINCTRLDOUBLE,
self.parent.on_horiz_adv_x_default_changed
)
horiz_adv_x_space_label = wx.StaticText(self, label=_("Horizontal advance x space"))
self.horiz_adv_x_space = wx.SpinCtrlDouble(self, min=0, max=10000, inc=0.1, initial=50, style=wx.SP_WRAP)
self.horiz_adv_x_space.Bind(
wx.EVT_SPINCTRLDOUBLE,
lambda event: self.parent.on_font_meta_value_changed("horiz_adv_x_space", True, event)
)
grid_sizer.AddMany([
(size_label, 0, wx.ALL, 0),
(self.size, 1, wx.ALL | wx.EXPAND, 0),
(min_scale_label, 0, wx.ALL, 0),
(self.min_scale, 1, wx.ALL | wx.EXPAND, 0),
(max_scale_label, 0, wx.ALL, 0),
(self.max_scale, 1, wx.ALL | wx.EXPAND, 0),
(leading_label, 0, wx.ALL, 0),
(self.leading, 1, wx.ALL | wx.EXPAND, 0),
(horiz_adv_x_default_label, 0, wx.ALL, 0),
(self.horiz_adv_x_default, 1, wx.ALL | wx.EXPAND, 0),
(horiz_adv_x_space_label, 0, wx.ALL, 0),
(self.horiz_adv_x_space, 1, wx.ALL | wx.EXPAND, 0)
])
sizer.Add(grid_sizer, 1, wx.EXPAND | wx.ALL, 10)
self.SetSizer(sizer)
class GlyphList(wx.Panel):
def __init__(self, parent):
self.parent = parent.GetParent().parent
wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.VERTICAL)
self.glyph_list = EditableListCtrl(self, style=wx.LC_REPORT | wx.SUNKEN_BORDER, editable_column=3)
self.glyph_list.Bind(wx.EVT_LIST_ITEM_SELECTED, self.parent.on_kerning_list_select)
self.glyph_list.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.parent.on_glyphlist_update)
self.glyph_list.Bind(wx.EVT_LIST_ITEM_CHECKED, self.parent.on_glyph_item_checked)
self.glyph_list.Bind(wx.EVT_LIST_ITEM_UNCHECKED, self.parent.on_glyph_item_checked)
self.glyph_list.EnableCheckBoxes()
sizer.Add(self.glyph_list, 1, wx.EXPAND, 0)
self.SetSizer(sizer)
class KerningPairs(wx.Panel):
def __init__(self, parent):
self.parent = parent.GetParent().parent
wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.VERTICAL)
choices = [' '] + self.parent.glyphs
self.filter_kerning = PromptingComboBox(self, choices=choices, style=wx.TE_PROCESS_ENTER)
sizer.Add(self.filter_kerning, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
self.kerning_list = EditableListCtrl(self, style=wx.LC_REPORT | wx.SUNKEN_BORDER)
self.kerning_list.Bind(wx.EVT_LIST_ITEM_SELECTED, self.parent.on_kerning_list_select)
self.kerning_list.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.parent.on_kerning_update)
sizer.Add(self.kerning_list, 1, wx.EXPAND, 0)
self.SetSizer(sizer)
def on_combobox_change(self, event):
combobox = event.GetEventObject()
value = combobox.GetValue().strip()
if value and value != " ":
self.parent.update_kerning_list(value)
else:
self.parent.update_kerning_list()