Source code for timelinelib.wxgui.components.font

# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018  Rickard Lindberg, Roger Lindberg
#
# This file is part of Timeline.
#
# Timeline is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Timeline is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Timeline.  If not, see <http://www.gnu.org/licenses/>.


import wx


[docs]class Font(wx.Font):
[docs] def __init__(self, point_size=12, family=wx.FONTFAMILY_DEFAULT, style=wx.FONTSTYLE_NORMAL, weight=wx.FONTWEIGHT_NORMAL, underlined=False, face_name="", encoding=wx.FONTENCODING_DEFAULT, wxcolor=wx.BLACK): self.wxcolor = wxcolor wx.Font.__init__(self, point_size, family, style, weight, underlined, face_name, encoding)
def _get_wxcolor(self): return self.wxcolor def _set_wxcolor(self, wxcolor): self.wxcolor = wxcolor WxColor = property(_get_wxcolor, _set_wxcolor) def _get_wxfont(self): return self def _set_wxfont(self, wxfont): self.PointSize = wxfont.PointSize self.Family = wxfont.Family self.Style = wxfont.Style self.Weight = wxfont.Weight self.SetUnderlined(wxfont.GetUnderlined()) self.FaceName = wxfont.FaceName self.Encoding = wxfont.Encoding WxFont = property(_get_wxfont, _set_wxfont)
[docs] def serialize(self): return f'nfi|{self.GetNativeFontInfoDesc()}|{self.WxColor}'
# return "%s:%s:%s:%s:%s:%s:%s:%s" % ( # self.PointSize, # self.Family, # self.Style, # self.Weight, # self.GetUnderlined(), # self.FaceName, # self.Encoding, # self.WxColor, # )
[docs] def increment(self, step=2): self.PointSize += step
[docs] def decrement(self, step=2): self.PointSize -= step
# Profiling of timelinelib\wxgui\components\font.py:63(deserialize_font) # # Open Timeline and drag-scroll 10 times back and forth with the mouse. # # Before caching Font info: # ncalls tottime percall cumtime percall # Try 1: 4265 0.154 0.000 0.610 0.000 # Try 2: 4395 0.154 0.000 0.613 0.000 # Try 3: 3801 0.133 0.000 0.528 0.000 # Try 4: 4430 0.152 0.000 0.607 0.000 # Try 5: 3926 0.139 0.000 0.553 0.000 # # After caching Font info: # Try 1: 3894 0.004 0.000 0.004 0.000 # Try 2: 5246 0.005 0.000 0.005 0.000 # Try 3: 4972 0.004 0.000 0.005 0.000 # Try 4: 4611 0.004 0.000 0.005 0.000 # Try 5: 3306 0.003 0.000 0.003 0.000 font_cache = {}
[docs]def deserialize_font(serialized_font): if serialized_font not in font_cache: font = None if serialized_font.startswith('nfi|'): font = _create_font_from_native_font_info(serialized_font) else: font = _create_font_from_old_info(serialized_font) font_cache[serialized_font] = font return font_cache[serialized_font]
def _create_font_from_native_font_info(serialized_font): prefix, nfi, color = serialized_font.split('|') font = Font() font.SetNativeFontInfo(nfi) font.WxColor = _create_color_from_serialized_data(color) return font def _create_font_from_old_info(serialized_font): bool_map = {"True": True, "False": False} ( point_size, family, style, weight, underlined, facename, encoding, color, ) = serialized_font.split(":") font = Font( int(point_size), int(family), int(style), int(weight), bool_map[underlined], facename, int(encoding), _create_color_from_serialized_data(color) ) return font def _create_color_from_serialized_data(serialized_color_info): color_args = serialized_color_info[1:-1].split(",") return wx.Colour( int(color_args[0]), int(color_args[1]), int(color_args[2]), int(color_args[3]) )
[docs]def set_minor_strip_text_font(font, dc, force_bold=False, force_normal=False, force_italic=False, force_upright=False): set_text_font(font, dc, force_bold, force_normal, force_italic, force_upright)
[docs]def set_major_strip_text_font(font, dc, force_bold=False, force_normal=False, force_italic=False, force_upright=False): set_text_font(font, dc, force_bold, force_normal, force_italic, force_upright)
[docs]def set_balloon_text_font(font, dc, force_bold=False, force_normal=False, force_italic=False, force_upright=False): set_text_font(font, dc, force_bold, force_normal, force_italic, force_upright)
[docs]def set_legend_text_font(font, dc): set_text_font(font, dc)
[docs]def set_text_font(selectable_font, dc, force_bold=False, force_normal=False, force_italic=False, force_upright=False): font = deserialize_font(selectable_font) old_weight = font.Weight old_style = font.Style if force_bold: font.Weight = wx.FONTWEIGHT_BOLD elif force_normal: font.Weight = wx.FONTWEIGHT_NORMAL if force_italic: font.Style = wx.FONTSTYLE_ITALIC elif force_upright: font.Style = wx.FONTSTYLE_NORMAL dc.SetFont(font) dc.SetTextForeground(font.WxColor) font.Style = old_style font.Weight = old_weight
[docs]def edit_font_data(parent_window, font): data = wx.FontData() data.SetInitialFont(font) data.SetColour(font.WxColor) dialog = wx.FontDialog(parent_window, data) try: if dialog.ShowModal() == wx.ID_OK: font_data = dialog.GetFontData() font.WxFont = font_data.GetChosenFont() font.WxColor = font_data.GetColour() return True else: return False finally: dialog.Destroy()