diff options
Diffstat (limited to 'misc/pylib/robofab/interface/all/dialogs_fontlab_legacy2.py')
-rw-r--r-- | misc/pylib/robofab/interface/all/dialogs_fontlab_legacy2.py | 373 |
1 files changed, 373 insertions, 0 deletions
diff --git a/misc/pylib/robofab/interface/all/dialogs_fontlab_legacy2.py b/misc/pylib/robofab/interface/all/dialogs_fontlab_legacy2.py new file mode 100644 index 000000000..460b73f1e --- /dev/null +++ b/misc/pylib/robofab/interface/all/dialogs_fontlab_legacy2.py @@ -0,0 +1,373 @@ +""" + + Dialogs for FontLab 5.1. + This might work in future versions of FontLab as well. + This is basically a butchered version of vanilla.dialogs. + No direct import of, or dependency on Vanilla + + March 7 2012 + It seems only the dialogs that deal with the file system + need to be replaced, the other dialogs still work. + As we're not entirely sure whether it is worth to maintain + these dialogs, let's fix the imports in dialogs.py. + + This is the phenolic aldehyde version of dialogs. + +""" + +#__import__("FL") +from FL import * + +from Foundation import NSObject +from AppKit import NSApplication, NSInformationalAlertStyle, objc, NSAlert, NSAlertFirstButtonReturn, NSAlertSecondButtonReturn, NSAlertThirdButtonReturn, NSSavePanel, NSOKButton, NSOpenPanel + +NSApplication.sharedApplication() + +__all__ = [ +# "AskString", + "AskYesNoCancel", +# "FindGlyph", + "GetFile", + "GetFolder", + "GetFileOrFolder", + "Message", +# "OneList", + "PutFile", +# "SearchList", +# "SelectFont", +# "SelectGlyph", +# "TwoChecks", +# "TwoFields", + "ProgressBar", +] + + +class BaseMessageDialog(NSObject): + + def initWithMessageText_informativeText_alertStyle_buttonTitlesValues_window_resultCallback_(self, + messageText="", + informativeText="", + alertStyle=NSInformationalAlertStyle, + buttonTitlesValues=None, + parentWindow=None, + resultCallback=None): + if buttonTitlesValues is None: + buttonTitlesValues = [] + self = super(BaseMessageDialog, self).init() + self.retain() + self._resultCallback = resultCallback + self._buttonTitlesValues = buttonTitlesValues + # + alert = NSAlert.alloc().init() + alert.setMessageText_(messageText) + alert.setInformativeText_(informativeText) + alert.setAlertStyle_(alertStyle) + for buttonTitle, value in buttonTitlesValues: + alert.addButtonWithTitle_(buttonTitle) + self._value = None + code = alert.runModal() + self._translateValue(code) + return self + + def _translateValue(self, code): + if code == NSAlertFirstButtonReturn: + value = 1 + elif code == NSAlertSecondButtonReturn: + value = 2 + elif code == NSAlertThirdButtonReturn: + value = 3 + else: + value = code - NSAlertThirdButtonReturn + 3 + self._value = self._buttonTitlesValues[value-1][1] + + def windowWillClose_(self, notification): + self.autorelease() + + +class BasePutGetPanel(NSObject): + + def initWithWindow_resultCallback_(self, parentWindow=None, resultCallback=None): + self = super(BasePutGetPanel, self).init() + self.retain() + self._parentWindow = parentWindow + self._resultCallback = resultCallback + return self + + def windowWillClose_(self, notification): + self.autorelease() + + +class PutFilePanel(BasePutGetPanel): + + def initWithWindow_resultCallback_(self, parentWindow=None, resultCallback=None): + self = super(PutFilePanel, self).initWithWindow_resultCallback_(parentWindow, resultCallback) + self.messageText = None + self.title = None + self.fileTypes = None + self.directory = None + self.fileName = None + self.canCreateDirectories = True + self.accessoryView = None + self._result = None + return self + + def run(self): + panel = NSSavePanel.alloc().init() + if self.messageText: + panel.setMessage_(self.messageText) + if self.title: + panel.setTitle_(self.title) + if self.directory: + panel.setDirectory_(self.directory) + if self.fileTypes: + panel.setAllowedFileTypes_(self.fileTypes) + panel.setCanCreateDirectories_(self.canCreateDirectories) + panel.setCanSelectHiddenExtension_(True) + panel.setAccessoryView_(self.accessoryView) + if self._parentWindow is not None: + panel.beginSheetForDirectory_file_modalForWindow_modalDelegate_didEndSelector_contextInfo_( + self.directory, self.fileName, self._parentWindow, self, "savePanelDidEnd:returnCode:contextInfo:", 0) + else: + isOK = panel.runModalForDirectory_file_(self.directory, self.fileName) + if isOK == NSOKButton: + self._result = panel.filename() + + def savePanelDidEnd_returnCode_contextInfo_(self, panel, returnCode, context): + panel.close() + if returnCode: + self._result = panel.filename() + if self._resultCallback is not None: + self._resultCallback(self._result) + + savePanelDidEnd_returnCode_contextInfo_ = objc.selector(savePanelDidEnd_returnCode_contextInfo_, signature="v@:@ii") + + +class GetFileOrFolderPanel(BasePutGetPanel): + + def initWithWindow_resultCallback_(self, parentWindow=None, resultCallback=None): + self = super(GetFileOrFolderPanel, self).initWithWindow_resultCallback_(parentWindow, resultCallback) + self.messageText = None + self.title = None + self.directory = None + self.fileName = None + self.fileTypes = None + self.allowsMultipleSelection = False + self.canChooseDirectories = True + self.canChooseFiles = True + self.resolvesAliases = True + self._result = None + return self + + def run(self): + panel = NSOpenPanel.alloc().init() + if self.messageText: + panel.setMessage_(self.messageText) + if self.title: + panel.setTitle_(self.title) + if self.directory: + panel.setDirectory_(self.directory) + if self.fileTypes: + panel.setAllowedFileTypes_(self.fileTypes) + panel.setCanChooseDirectories_(self.canChooseDirectories) + panel.setCanChooseFiles_(self.canChooseFiles) + panel.setAllowsMultipleSelection_(self.allowsMultipleSelection) + panel.setResolvesAliases_(self.resolvesAliases) + if self._parentWindow is not None: + panel.beginSheetForDirectory_file_types_modalForWindow_modalDelegate_didEndSelector_contextInfo_( + self.directory, self.fileName, self.fileTypes, self._parentWindow, self, "openPanelDidEnd:returnCode:contextInfo:", 0) + else: + isOK = panel.runModalForDirectory_file_types_(self.directory, self.fileName, self.fileTypes) + if isOK == NSOKButton: + self._result = panel.filenames() + + def openPanelDidEnd_returnCode_contextInfo_(self, panel, returnCode, context): + panel.close() + if returnCode: + self._result = panel.filenames() + if self._resultCallback is not None: + self._resultCallback(self._result) + + openPanelDidEnd_returnCode_contextInfo_ = objc.selector(openPanelDidEnd_returnCode_contextInfo_, signature="v@:@ii") + + +def Message(message="", title='noLongerUsed', informativeText=""): + """Legacy robofab dialog compatible wrapper.""" + #def _message(messageText="", informativeText="", alertStyle=NSInformationalAlertStyle, parentWindow=None, resultCallback=None): + resultCallback = None + alert = BaseMessageDialog.alloc().initWithMessageText_informativeText_alertStyle_buttonTitlesValues_window_resultCallback_( + messageText=message, + informativeText=informativeText, + alertStyle=NSInformationalAlertStyle, + buttonTitlesValues=[("OK", 1)], + parentWindow=None, + resultCallback=None) + if resultCallback is None: + return 1 + + +def AskYesNoCancel(message, title='noLongerUsed', default=None, informativeText=""): + """ + AskYesNoCancel Dialog + + message the string + title* a title of the window + (may not be supported everywhere) + default* index number of which button should be default + (i.e. respond to return) + informativeText* A string with secundary information + + * may not be supported everywhere + """ + parentWindow = None + alert = BaseMessageDialog.alloc().initWithMessageText_informativeText_alertStyle_buttonTitlesValues_window_resultCallback_( + messageText=message, + informativeText=informativeText, + alertStyle=NSInformationalAlertStyle, + buttonTitlesValues=[("Cancel", -1), ("Yes", 1), ("No", 0)], + parentWindow=None, + resultCallback=None) + return alert._value + +def _askYesNo(messageText="", informativeText="", alertStyle=NSInformationalAlertStyle, parentWindow=None, resultCallback=None): + parentWindow = None + alert = BaseMessageDialog.alloc().initWithMessageText_informativeText_alertStyle_buttonTitlesValues_window_resultCallback_( + messageText=messageText, informativeText=informativeText, alertStyle=alertStyle, buttonTitlesValues=[("Yes", 1), ("No", 0)], parentWindow=parentWindow, resultCallback=resultCallback) + if resultCallback is None: + return alert._value + +def GetFile(message=None, title=None, directory=None, fileName=None, allowsMultipleSelection=False, fileTypes=None): + """ Legacy robofab dialog compatible wrapper. + This will select UFO on OSX 10.7, FL5.1 + """ + parentWindow = None + resultCallback=None + basePanel = GetFileOrFolderPanel.alloc().initWithWindow_resultCallback_(parentWindow, resultCallback) + basePanel.messageText = message + basePanel.title = title + basePanel.directory = directory + basePanel.fileName = fileName + basePanel.fileTypes = fileTypes + basePanel.allowsMultipleSelection = allowsMultipleSelection + basePanel.canChooseDirectories = False + basePanel.canChooseFiles = True + basePanel.run() + if basePanel._result is None: + return None + if not allowsMultipleSelection: + # compatibly return only one as we expect + return str(list(basePanel._result)[0]) + else: + # return more if we explicitly expect + return [str(n) for n in list(basePanel._result)] + +def GetFolder(message=None, title=None, directory=None, allowsMultipleSelection=False): + parentWindow = None + resultCallback = None + basePanel = GetFileOrFolderPanel.alloc().initWithWindow_resultCallback_(parentWindow, resultCallback) + basePanel.messageText = message + basePanel.title = title + basePanel.directory = directory + basePanel.allowsMultipleSelection = allowsMultipleSelection + basePanel.canChooseDirectories = True + basePanel.canChooseFiles = False + basePanel.run() + if basePanel._result is None: + return None + if not allowsMultipleSelection: + # compatibly return only one as we expect + return str(list(basePanel._result)[0]) + else: + # return more if we explicitly expect + return [str(n) for n in list(basePanel._result)] + +def GetFileOrFolder(message=None, title=None, directory=None, fileName=None, allowsMultipleSelection=False, fileTypes=None, parentWindow=None, resultCallback=None): + parentWindow = None + basePanel = GetFileOrFolderPanel.alloc().initWithWindow_resultCallback_(parentWindow, resultCallback) + basePanel.messageText = message + basePanel.title = title + basePanel.directory = directory + basePanel.fileName = fileName + basePanel.fileTypes = fileTypes + basePanel.allowsMultipleSelection = allowsMultipleSelection + basePanel.canChooseDirectories = True + basePanel.canChooseFiles = True + basePanel.run() + if basePanel._result is None: + return None + if not allowsMultipleSelection: + # compatibly return only one as we expect + return str(list(basePanel._result)[0]) + else: + # return more if we explicitly expect + return [str(n) for n in list(basePanel._result)] + +def PutFile(message=None, title=None, directory=None, fileName=None, canCreateDirectories=True, fileTypes=None): + parentWindow = None + resultCallback=None + accessoryView=None + basePanel = PutFilePanel.alloc().initWithWindow_resultCallback_(parentWindow, resultCallback) + basePanel.messageText = message + basePanel.title = title + basePanel.directory = directory + basePanel.fileName = fileName + basePanel.fileTypes = fileTypes + basePanel.canCreateDirectories = canCreateDirectories + basePanel.accessoryView = accessoryView + basePanel.run() + return str(basePanel._result) + + +class ProgressBar(object): + + def __init__(self, title="RoboFab...", ticks=0, label=""): + self._tickValue = 1 + fl.BeginProgress(title, ticks) + + def getCurrentTick(self): + return self._tickValue + + def tick(self, tickValue=None): + if not tickValue: + tickValue = self._tickValue + fl.TickProgress(tickValue) + self._tickValue = tickValue + 1 + + def label(self, label): + pass + + def close(self): + fl.EndProgress() + + +# we seem to have problems importing from here. +# so let's see what happens if we make the robofab compatible wrappers here as well. + +# start with all the defaults. + +#def AskString(message, value='', title='RoboFab'): +# raise NotImplementedError + +#def FindGlyph(aFont, message="Search for a glyph:", title='RoboFab'): +# raise NotImplementedError + +#def OneList(list, message="Select an item:", title='RoboFab'): +# raise NotImplementedError + +#def PutFile(message=None, fileName=None): +# raise NotImplementedError + +#def SearchList(list, message="Select an item:", title='RoboFab'): +# raise NotImplementedError + +#def SelectFont(message="Select a font:", title='RoboFab'): +# raise NotImplementedError + +#def SelectGlyph(font, message="Select a glyph:", title='RoboFab'): +# raise NotImplementedError + +#def TwoChecks(title_1="One", title_2="Two", value1=1, value2=1, title='RoboFab'): +# raise NotImplementedError + +#def TwoFields(title_1="One:", value_1="0", title_2="Two:", value_2="0", title='RoboFab'): +# raise NotImplementedError + |