Lightningbeam/GUI/Cocoa/Font.py

78 lines
2.1 KiB
Python

#
# Python GUI - Fonts - PyObjC
#
import sys
from AppKit import NSFont, NSFontManager, NSBoldFontMask, NSItalicFontMask, \
NSLayoutManager
from GUI import export
from GUI.GFonts import Font as GFont
_ns_font_manager = NSFontManager.sharedFontManager()
_ns_layout_manager = NSLayoutManager.alloc().init()
class Font(GFont):
# _ns_font NSFont
def _from_ns_font(cls, ns_font):
font = cls.__new__(cls)
font._ns_font = ns_font
return font
_from_ns_font = classmethod(_from_ns_font)
def __init__(self, family, size = 12, style = []):
traits = 0
if 'bold' in style:
traits |= NSBoldFontMask
if 'italic' in style:
traits |= NSItalicFontMask
self._ns_font = _ns_font_manager.fontWithFamily_traits_weight_size_(
family, traits, 5, size)
if not self._ns_font:
import StdFonts
self._ns_font = StdFonts.application_font._ns_font
def get_family(self):
return self._ns_font.familyName()
def get_size(self):
return self._ns_font.pointSize()
def get_style(self):
style = []
traits = _ns_font_manager.traitsOfFont_(self._ns_font)
if traits & NSBoldFontMask:
style.append('bold')
if traits & NSItalicFontMask:
style.append('italic')
return style
def get_ascent(self):
return self._ns_font.ascender()
def get_descent(self):
return -self._ns_font.descender()
def get_height(self):
ns_font = self._ns_font
a = ns_font.ascender()
d = ns_font.descender()
return a - d
def get_cap_height(self):
return self._ns_font.capHeight()
def get_x_height(self):
return self._ns_font.xHeight()
def get_line_height(self):
# Adding 1 here to match what NSTextField seems to do
return _ns_layout_manager.defaultLineHeightForFont_(self._ns_font) + 1
def width(self, s, start = 0, end = sys.maxint):
return self._ns_font.widthOfString_(s[start:end])
export(Font)