def fontnamesof(family): '''Yield the available font names of a family. @param family: Generic font name (C{str}), like "Times" or "Helvetica". @return: The name (C{str}) of each font. ''' # <http://Developer.Apple.com/documentation/appkit/ # nsfontmanager/1462316-availablemembers> for ns in nsIter(_nsFontsOf(family)): yield nsString2str(ns.objectAtIndex_(0))
def __new__(cls, ns_str=''): '''New L{Str} from C{str}, L{Str} or C{NSStr[ing]}. ''' if isinstance(ns_str, Str): return ns_str elif isinstance(ns_str, _Strs): ns, py = str2NS(ns_str), ns_str elif isinstanceOf(ns_str, NSStr, name='ns_str'): ns, py = ns_str, nsString2str(ns_str) self = super(Str, cls).__new__(cls, py) self._NS = ns # _RO return self
def fontfamilies(*prefixes): '''Yield the installed font families. @param prefixes: No, one or more font family names to match (C{str}-s). @return: Each font family name (C{str}). ''' # <http://Developer.Apple.com/documentation/appkit/ # nsfontmanager/1462323-availablefontfamilies> for ns in nsIter(NSMain.FontManager.availableFontFamilies()): f = nsString2str(ns) if f.startswith(prefixes or f): yield f
def open(self, url, tab=False): '''Open a new window or tab in the browser. @param url: The URL to open (C{str}). @keyword tab: New tab (C{bool}), new window otherwise. @return: Parsed I{url} as C{ParseResult}. @raise ValueError: Scheme of I{url} not 'http', 'https' or 'file'. ''' ns = url2NS(url) sc = nsString2str(ns.scheme()) if sc.lower() not in ('http', 'https', 'file'): raise ValueError('%s scheme %r invalid: %r' % ('url', sc, url)) if self._browser: self._browser.open(url, new=2 if tab else 1) elif self.NS: d = dict2NS(dict(URL=ns, reveal=True, newTab=bool(tab)), frozen=True) u = NSStr('WebBrowserOpenURLNotification') self.NS.postNotificationName_object_userInfo_(u, None, d) u.release() # PYCHOK expected return _urlparse(nsString2str(ns.absoluteString()))
def title(self, title): '''Set the title. ''' if isinstance(title, NSStr): try: self.NS.setTitle_(title) except AttributeError: # no NSApplication.setTitle_ pass title = nsString2str(title) else: try: t = NSStr(title) self.NS.setTitle_(t) release(t) except AttributeError: # no NSApplication.setTitle_ t.release() self._title = bytes2str(title)
def save_as( self, name='', filetype='', # PYCHOK expected dir='', hidden=False, hidexts=False, label='', packages=False, prompt='', tags=(), dflt=None): '''Specify a file name in the panel. @keyword name: A suggested file name (C{str}), default "Untitled". @keyword filetype: The file type (C{str}). @keyword dir: The directory (C{str}). @keyword hidden: Show hidden files (C{bool}). @keyword hidexts: Hide file extensions (C{bool}). @keyword label: The name label (C{str}), default "Save As:". @keyword packages: Treat file packages as directories (C{bool}). @keyword prompt: The button label (C{str}), default "Save". @keyword tags: Suggested tag names (C{tuple} of C{str}-s). @keyword dflt: Return value, cancelled (C{None}). @return: The specified file name path (C{str}) or I{dflt}. ''' ns = NSSavePanel.savePanel() # ns.setTitleHidden_(bool(False)) # "does nothing now" if name: ns.setNameFieldStringValue_(release(NSStr(name))) if dir: if dir.lower().startswith('file:///'): ns.setDirectoryURL_(release(NSStr(dir))) else: ns.setDirectory_(release(NSStr(dir))) if filetype: ns.setRequiredFileType_(release(NSStr(filetype.lstrip('.')))) hidexts = False ns.setShowsHiddenFiles_(YES if hidden else NO) # ns.setCanSelectHiddenExtension_(bool(hidden)) ns.setExtensionHidden_(YES if hidexts else NO) if label: ns.setNameFieldLabel_(release(NSStr(label))) ns.setTreatsFilePackagesAsDirectories_(YES if packages else NO) if prompt: ns.setPrompt_(release(NSStr(prompt))) if tags: ns.setTagNames_(py2NS(tags)) ns.setShowsTagField_(True) else: ns.setShowsTagField_(False) while True: r = _runModal(ns) # == runModalForDirectory_file_(None, None) if r == NSOKButton: r = nsString2str(ns.filename()) # == ns.URL().path() break elif r == NSCancelButton: r = dflt break # ns.release() # XXX may crash on Cancel return r
def pick(self, filetypes, aliases=False, dirs=False, files=True, hidden=False, hidexts=False, multiple=False, packages=False, prompt='', otherOK=False, dflt=None): '''Select a file from the panel. @param filetypes: The selectable file types (tuple of str-s). @keyword aliases: Allow selection of aliases (C{bool}). @keyword dirs: Allow selection of directories (C{bool}). @keyword hidden: Allow selection of hidden files (C{bool}). @keyword hidexts: Hide file extensions (C{bool}). @keyword multiple: Allow selection of multiple files (C{bool}). @keyword packages: Treat file packages as directories (C{bool}). @keyword prompt: The button label (C{str}), default "Open". @keyword otherOK: Allow selection of other file types (C{bool}). @keyword dflt: Return value, if cancelled, nothing selected (C{None}). @return: The selected file name path (C{str}) or I{dflt}. ''' if multiple: # setAllowsMultipleSelection_ raise NotImplementedError('multiple %s' % (multiple, )) ns = NSOpenPanel.openPanel() # ns.setTitleHidden_(NO) # "does nothing now" ns.setResolvesAliases_(YES if aliases else NO) ns.setCanChooseDirectories_(YES if dirs else NO) ns.setCanChooseFiles_(YES if files else NO) ns.setShowsHiddenFiles_(YES if hidden else NO) # ns.setCanSelectHiddenExtension_(YES if hidden else NO) ns.setExtensionHidden_(YES if hidexts else NO) # ns.setRequiredFileType_(NSStr) if filetypes: # an NSArray of file extension NSStr[ing]s without the '.' ns.setAllowedFileTypes_(py2NS(t.lstrip('.') for t in filetypes)) ns.setAllowsOtherFileTypes_(YES if otherOK else NO) ns.setTreatsFilePackagesAsDirectories_(YES if packages else NO) if prompt: ns.setPrompt_(release(NSStr(prompt))) while True: # ns.orderFrontRegardless() # only flashes # <http://Developer.Apple.com/documentation/ # appkit/nssavepanel/1525357-runmodal> if ns.runModal() == NSCancelButton: # runModalForTypes_ path = dflt # nothing selected break # paths = ns.filenames() # returns an NSArray # urls = ns.URLs() # returns an NSArray path = nsString2str(ns.filename()) # == ns.URL().path() # mimick NSOpenPanel.setAllowedFileTypes_ if path.lower().endswith(filetypes): break # ns.release() # XXX crashes Cancel pick return path
def __init__(self, family_or_font, size=0, traits=0, weight=5): '''New L{Font}. @param family_or_font: Generic font name (C{str}, L{Str}, L{NSStr}) like "Times" or "Helvetica" or a L{Font}, C{NSFont} or C{NSFontDescriptor} instance. @keyword size: Desired point size (C{int}), zero for any. @keyword traits: Desired font traits (C{str} or C{FontTrait}C{s mask}). @keyword weigth: Desired book weight (C{int}) in range 0..15, where 0=light, 5=regular, 9=bold and 15=heavy. @raise FontError: No such I{family_or_font}. @raise FontTraitError: Mutually exclusive I{traits}. @raise TypeError: Invalid I{family_or_font}. @raise ValueError: Invalid I{weight}. @note: The new L{Font} may not exhibit the desired I{traits} and I{weight}. The I{weight} is ignored if I{traits} include C{FontTrait.Bold}, both I{traits} and I{weight} are ignored if I{family_or_font} is C{NSFontDescriptor}. @see: Function L{fontsof} to obtain all available fonts of a particular font family. ''' if isinstance(family_or_font, Str): ns, py = family_or_font.NS, str(family_or_font) elif isinstance(family_or_font, _ByteStrs): ns, py = release(NSStr(family_or_font)), bytes2str(family_or_font) elif isinstance(family_or_font, NSStr): ns, py = family_or_font, nsString2str(family_or_font) # elif isObjCInstanceOf(family_or_font, NSFontDescriptor): # <http://Developer.Apple.com/documentation/appkit/nsfont/1525386-init> # ignore traits and weight # ns, py = NSFont.alloc().init_(family_or_font, size), None elif isObjCInstanceOf(family_or_font, NSFont, name='family_or_font'): ns, py = family_or_font, None if size == 0: size = ns.pointSize() if traits == 0: traits = NSMain.FontManager.traitsOfFont_(ns) if not (size == ns.pointSize() and traits == NSMain.FontManager.traitsOfFont_(ns)): ns = ns.familyName() py = nsString2str(ns) if py is not None: # <http://Developer.Apple.com/documentation/appkit/ # nsfontmanager/1462332-fontwithfamily> self._traits = _traitsin(traits) self._weight = _weightin(weight) ns = NSMain.FontManager.fontWithFamily_traits_weight_size_( ns, self._traits, self._weight, size) if isNone(ns): self._family = py self._size = flint(size) raise FontError('no such %s: %s' % ('font', self._argstr())) self._NS = ns # _RO # <http://Developer.Apple.com/library/content/documentation/ # TextFonts/Conceptual/CocoaTextArchitecture/FontHandling/FontHandling.html> self._family = nsString2str(ns.familyName()) self._height = flint(NSMain.LayoutManager.defaultLineHeightForFont_(ns) + 1) self._name = nsString2str(ns.fontName()) self._size = flint(ns.pointSize()) # traits not always reflect actual traits self._traits = NSMain.FontManager.traitsOfFont_(ns) or 0 # update with the family traits, if any self._traits |= _traitsin(self._family, raiser=False) if ns.isFixedPitch() and not self.isMonoSpace: self._traits |= FontTrait.MonoSpace self._weight = NSMain.FontManager.weightOfFont_(ns)