Package Gnumed :: Package timelinelib :: Package wxgui :: Package components :: Module font |
[frames] | no frames]

# Source Code for Module Gnumed.timelinelib.wxgui.components.font

      1  # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018  Rickard Lindberg, Roger Lindberg
      2  #
      3  # This file is part of Timeline.
      4  #
      5  # Timeline is free software: you can redistribute it and/or modify
      6  # it under the terms of the GNU General Public License as published by
      7  # the Free Software Foundation, either version 3 of the License, or
      8  # (at your option) any later version.
      9  #
     10  # Timeline is distributed in the hope that it will be useful,
     11  # but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  # GNU General Public License for more details.
     14  #
     15  # You should have received a copy of the GNU General Public License
     16  # along with Timeline.  If not, see <http://www.gnu.org/licenses/>.
     17
     18
     19  import wx
     20
     21
     22  FONT_FACE_ENCODING = "utf-8"
     23
     24
     25 -class Font(wx.Font):
     26
     27 -    def __init__(self, point_size=12, family=wx.FONTFAMILY_DEFAULT, style=wx.FONTSTYLE_NORMAL,
     28                   weight=wx.FONTWEIGHT_NORMAL, underlined=False, face_name="", encoding=wx.FONTENCODING_DEFAULT,
     29                   wxcolor=wx.BLACK):
     30          self.wxcolor = wxcolor
     31          wx.Font.__init__(self, point_size, family, style, weight, underlined, face_name, encoding)
     32
     33 -    def _get_wxcolor(self):
     34          return self.wxcolor
     35
     36 -    def _set_wxcolor(self, wxcolor):
     37          self.wxcolor = wxcolor
     38
     39      WxColor = property(_get_wxcolor, _set_wxcolor)
     40
     41 -    def _get_wxfont(self):
     42          return self
     43
     44 -    def _set_wxfont(self, wxfont):
     45          self.PointSize = wxfont.PointSize
     46          self.Family = wxfont.Family
     47          self.Style = wxfont.Style
     48          self.Weight = wxfont.Weight
     49          self.SetUnderlined(wxfont.GetUnderlined())
     50          self.FaceName = wxfont.FaceName
     51          self.Encoding = wxfont.Encoding
     52
     53      WxFont = property(_get_wxfont, _set_wxfont)
     54
     55 -    def serialize(self):
     56          return "%s:%s:%s:%s:%s:%s:%s:%s" % (
     57              self.PointSize,
     58              self.Family,
     59              self.Style,
     60              self.Weight,
     61              self.GetUnderlined(),
     62              self.FaceName.encode(FONT_FACE_ENCODING),
     63              self.Encoding,
     64              self.WxColor,
     65          )
     66
     67 -    def increment(self, step=2):
     68          self.PointSize += step
     69
     70 -    def decrement(self, step=2):
     71          self.PointSize -= step
     72
     73
     74  # Profiling of timelinelib\wxgui\components\font.py:63(deserialize_font)
     75  #
     76  # Open Timeline and drag-scroll 10 times back and forth with the mouse.
     77  #
     78  # Before caching Font info:
     79  #          ncalls  tottime  percall  cumtime  percall
     80  # Try 1:     4265    0.154    0.000    0.610    0.000
     81  # Try 2:     4395    0.154    0.000    0.613    0.000
     82  # Try 3:     3801    0.133    0.000    0.528    0.000
     83  # Try 4:     4430    0.152    0.000    0.607    0.000
     84  # Try 5:     3926    0.139    0.000    0.553    0.000
     85  #
     86  # After caching Font info:
     87  # Try 1:     3894    0.004    0.000    0.004    0.000
     88  # Try 2:     5246    0.005    0.000    0.005    0.000
     89  # Try 3:     4972    0.004    0.000    0.005    0.000
     90  # Try 4:     4611    0.004    0.000    0.005    0.000
     91  # Try 5:     3306    0.003    0.000    0.003    0.000
     92
     93  font_cache = {}
     94
     95
     96 -def deserialize_font(serialized_font):
     97      if serialized_font not in font_cache:
     98          bool_map = {"True": True, "False": False}
     99          (
    100              point_size,
    101              family,
    102              style,
    103              weight,
    104              underlined,
    105              facename,
    106              encoding,
    107              color,
    108          ) = serialized_font.split(":")
    109          color_args = color[1:-1].split(",")
    110          wxcolor = wx.Colour(
    111              int(color_args[0]),
    112              int(color_args[1]),
    113              int(color_args[2]),
    114              int(color_args[3])
    115          )
    116          font = Font(
    117              int(point_size),
    118              int(family),
    119              int(style),
    120              int(weight),
    121              bool_map[underlined],
    122              facename.decode(FONT_FACE_ENCODING),
    123              int(encoding),
    124              wxcolor
    125          )
    126          font_cache[serialized_font] = font
    127      return font_cache[serialized_font]
    128
    129
    130 -def set_minor_strip_text_font(font, dc, force_bold=False, force_normal=False, force_italic=False, force_upright=False):
    131      set_text_font(font, dc, force_bold, force_normal, force_italic, force_upright)
    132
    133
    134 -def set_major_strip_text_font(font, dc, force_bold=False, force_normal=False, force_italic=False, force_upright=False):
    135      set_text_font(font, dc, force_bold, force_normal, force_italic, force_upright)
    136
    137
    138 -def set_balloon_text_font(font, dc, force_bold=False, force_normal=False, force_italic=False, force_upright=False):
    139      set_text_font(font, dc, force_bold, force_normal, force_italic, force_upright)
    140
    141
    142 -def set_legend_text_font(font, dc):
    143      set_text_font(font, dc)
    144
    145
    146 -def set_text_font(selectable_font, dc, force_bold=False, force_normal=False, force_italic=False, force_upright=False):
    147      font = deserialize_font(selectable_font)
    148      old_weight = font.Weight
    149      old_style = font.Style
    150      if force_bold:
    151          font.Weight = wx.FONTWEIGHT_BOLD
    152      elif force_normal:
    153          font.Weight = wx.FONTWEIGHT_NORMAL
    154      if force_italic:
    155          font.Style = wx.FONTSTYLE_ITALIC
    156      elif force_upright:
    157          font.Style = wx.FONTSTYLE_NORMAL
    158      dc.SetFont(font)
    159      dc.SetTextForeground(font.WxColor)
    160      font.Style = old_style
    161      font.Weight = old_weight
    162
    163
    164 -def edit_font_data(parent_window, font):
    165      data = wx.FontData()
    166      data.SetInitialFont(font)
    167      data.SetColour(font.WxColor)
    168      dialog = wx.FontDialog(parent_window, data)
    169      try:
    170          if dialog.ShowModal() == wx.ID_OK:
    171              font_data = dialog.GetFontData()
    172              font.WxFont = font_data.GetChosenFont()
    173              font.WxColor = font_data.GetColour()
    174              return True
    175          else:
    176              return False
    177      finally:
    178          dialog.Destroy()
    179