diff options
Diffstat (limited to 'misc/pylib/robofab/interface/all/dialogs_legacy.py')
-rwxr-xr-x | misc/pylib/robofab/interface/all/dialogs_legacy.py | 737 |
1 files changed, 0 insertions, 737 deletions
diff --git a/misc/pylib/robofab/interface/all/dialogs_legacy.py b/misc/pylib/robofab/interface/all/dialogs_legacy.py deleted file mode 100755 index 8223a7d64..000000000 --- a/misc/pylib/robofab/interface/all/dialogs_legacy.py +++ /dev/null @@ -1,737 +0,0 @@ - -""" - -Dialogs. -Cross-platform and cross-application compatible. Some of them anyway. -(Not all dialogs work on PCs outside of FontLab. Some dialogs are for FontLab only. Sorry.) - -Mac and FontLab implementation written by the RoboFab development team. -PC implementation by Eigi Eigendorf and is (C)2002 Eigi Eigendorf. - -""" - -import os -import sys -from robofab import RoboFabError -from warnings import warn - -MAC = False -PC = False -haveMacfs = False - -if sys.platform in ('mac', 'darwin'): - MAC = True -elif os.name == 'nt': - PC = True -else: - warn("dialogs.py only supports Mac and PC platforms.") -pyVersion = sys.version_info[:3] - -inFontLab = False -try: - from FL import * - inFontLab = True -except ImportError: pass - - -try: - import W - hasW = True -except ImportError: - hasW = False - -try: - import dialogKit - hasDialogKit = True -except ImportError: - hasDialogKit = False - -try: - import EasyDialogs - hasEasyDialogs = True -except: - hasEasyDialogs = False - -if MAC: - if pyVersion < (2, 3, 0): - import macfs - haveMacfs = True -elif PC and not inFontLab: - from win32com.shell import shell - import win32ui - import win32con - - -def _raisePlatformError(dialog): - """error raiser""" - if MAC: - p = 'Macintosh' - elif PC: - p = 'PC' - else: - p = sys.platform - raise RoboFabError("%s is not currently available on the %s platform"%(dialog, p)) - - -class _FontLabDialogOneList: - """A one list dialog for FontLab. This class should not be called directly. Use the OneList function.""" - - def __init__(self, list, message, title='RoboFab'): - self.message = message - self.selected = None - self.list = list - self.d = Dialog(self) - self.d.size = Point(250, 250) - self.d.title = title - self.d.Center() - self.d.AddControl(LISTCONTROL, Rect(12, 30, 238, 190), "list", STYLE_LIST, self.message) - self.list_index = 0 - - def Run(self): - return self.d.Run() - - def on_cancel(self, code): - self.selected = None - - def on_ok(self, code): - self.d.GetValue('list') - # Since FLS v5.2, the GetValue() method of the Dialog() class returns - # a 'wrong' index value from the specified LISTCONTROL. - # If the selected index is n, it will return n-1. For example, when - # the index is 1, it returns 0; when it's 2, it returns 1, and so on. - # If the selection is empty, FLS v5.2 returns -2, while the old v5.0 - # returned None. - # See also: - # - http://forum.fontlab.com/index.php?topic=8807.0 - # - http://forum.fontlab.com/index.php?topic=9003.0 - # - # Edited based on feedback from Adam Twardoch - if fl.buildnumber > 4600 and sys.platform == 'win32': - if self.list_index == -2: - self.selected = None - else: - self.selected = self.list_index + 1 - else: - self.selected = self.list_index - - -class _FontLabDialogSearchList: - """A dialog for searching through a list. It contains a text field and a results list FontLab. This class should not be called directly. Use the SearchList function.""" - - def __init__(self, aList, message, title="RoboFab"): - self.d = Dialog(self) - self.d.size = Point(250, 290) - self.d.title = title - self.d.Center() - - self.message = message - self._fullContent = aList - self.possibleHits = list(aList) - self.possibleHits.sort() - self.possibleHits_index = 0 - self.entryField = "" - self.selected = None - - self.d.AddControl(STATICCONTROL, Rect(10, 10, 240, 30), "message", STYLE_LABEL, message) - self.d.AddControl(EDITCONTROL, Rect(10, 30, 240, aAUTO), "entryField", STYLE_EDIT, "") - self.d.AddControl(LISTCONTROL, Rect(12, 60, 238, 230), "possibleHits", STYLE_LIST, "") - - - def run(self): - self.d.Run() - - def on_entryField(self, code): - self.d.GetValue("entryField") - entry = self.entryField - count = len(entry) - possibleHits = [ - i for i in self._fullContent - if len(i) >= count - and i[:count] == entry - ] - possibleHits.sort() - self.possibleHits = possibleHits - self.possibleHits_index = 0 - self.d.PutValue("possibleHits") - - def on_ok(self, code): - self.d.GetValue("possibleHits") - sel = self.possibleHits_index - if sel == -1: - self.selected = None - else: - self.selected = self.possibleHits[sel] - - def on_cancel(self, code): - self.selected = None - - -class _FontLabDialogTwoFields: - """A two field dialog for FontLab. This class should not be called directly. Use the TwoFields function.""" - - def __init__(self, title_1, value_1, title_2, value_2, title='RoboFab'): - self.d = Dialog(self) - self.d.size = Point(200, 125) - self.d.title = title - self.d.Center() - self.d.AddControl(EDITCONTROL, Rect(120, 10, aIDENT2, aAUTO), "v1edit", STYLE_EDIT, title_1) - self.d.AddControl(EDITCONTROL, Rect(120, 40, aIDENT2, aAUTO), "v2edit", STYLE_EDIT, title_2) - self.v1edit = value_1 - self.v2edit = value_2 - - def Run(self): - return self.d.Run() - - def on_cancel(self, code): - self.v1edit = None - self.v2edit = None - - def on_ok(self, code): - self.d.GetValue("v1edit") - self.d.GetValue("v2edit") - self.v1 = self.v1edit - self.v2 = self.v2edit - -class _FontLabDialogTwoChecks: - """A two check box dialog for FontLab. This class should not be called directly. Use the TwoChecks function.""" - - def __init__(self, title_1, title_2, value1=1, value2=1, title='RoboFab'): - self.d = Dialog(self) - self.d.size = Point(200, 105) - self.d.title = title - self.d.Center() - self.d.AddControl(CHECKBOXCONTROL, Rect(10, 10, aIDENT2, aAUTO), "check1", STYLE_CHECKBOX, title_1) - self.d.AddControl(CHECKBOXCONTROL, Rect(10, 30, aIDENT2, aAUTO), "check2", STYLE_CHECKBOX, title_2) - self.check1 = value1 - self.check2 = value2 - - def Run(self): - return self.d.Run() - - def on_cancel(self, code): - self.check1 = None - self.check2 = None - - def on_ok(self, code): - self.d.GetValue("check1") - self.d.GetValue("check2") - - -class _FontLabDialogAskString: - """A one simple string prompt dialog for FontLab. This class should not be called directly. Use the GetString function.""" - - def __init__(self, message, value, title='RoboFab'): - self.d = Dialog(self) - self.d.size = Point(350, 130) - self.d.title = title - self.d.Center() - self.d.AddControl(STATICCONTROL, Rect(aIDENT, aIDENT, aIDENT, aAUTO), "label", STYLE_LABEL, message) - self.d.AddControl(EDITCONTROL, Rect(aIDENT, 40, aIDENT, aAUTO), "value", STYLE_EDIT, '') - self.value=value - - def Run(self): - return self.d.Run() - - def on_cancel(self, code): - self.value = None - - def on_ok(self, code): - self.d.GetValue("value") - -class _FontLabDialogMessage: - """A simple message dialog for FontLab. This class should not be called directly. Use the SimpleMessage function.""" - - def __init__(self, message, title='RoboFab'): - self.d = Dialog(self) - self.d.size = Point(350, 130) - self.d.title = title - self.d.Center() - self.d.AddControl(STATICCONTROL, Rect(aIDENT, aIDENT, aIDENT, 80), "label", STYLE_LABEL, message) - - def Run(self): - return self.d.Run() - -class _FontLabDialogGetYesNoCancel: - """A yes no cancel message dialog for FontLab. This class should not be called directly. Use the YesNoCancel function.""" - - def __init__(self, message, title='RoboFab'): - self.d = Dialog(self) - self.d.size = Point(350, 130) - self.d.title = title - self.d.Center() - self.d.ok = 'Yes' - self.d.AddControl(STATICCONTROL, Rect(aIDENT, aIDENT, aIDENT, 80), "label", STYLE_LABEL, message) - self.d.AddControl(BUTTONCONTROL, Rect(100, 95, 172, 115), "button", STYLE_BUTTON, "No") - self.value = 0 - - def Run(self): - return self.d.Run() - - def on_ok(self, code): - self.value = 1 - - def on_cancel(self, code): - self.value = -1 - - def on_button(self, code): - self.value = 0 - self.d.End() - - -class _MacOneListW: - """A one list dialog for Macintosh. This class should not be called directly. Use the OneList function.""" - - def __init__(self, list, message='Make a selection'): - import W - self.list = list - self.selected = None - self.w = W.ModalDialog((200, 240)) - self.w.message = W.TextBox((10, 10, -10, 30), message) - self.w.list = W.List((10, 35, -10, -50), list) - self.w.l = W.HorizontalLine((10, -40, -10, 1), 1) - self.w.cancel = W.Button((10, -30, 87, -10), 'Cancel', self.cancel) - self.w.ok = W.Button((102, -30, 88, -10), 'OK', self.ok) - self.w.setdefaultbutton(self.w.ok) - self.w.bind('cmd.', self.w.cancel.push) - self.w.open() - - def ok(self): - if len(self.w.list.getselection()) == 1: - self.selected = self.w.list.getselection()[0] - self.w.close() - - def cancel(self): - self.selected = None - self.w.close() - -class _MacTwoChecksW: - """ Version using W """ - - def __init__(self, title_1, title_2, value1=1, value2=1, title='RoboFab'): - import W - self.check1 = value1 - self.check2 = value2 - self.w = W.ModalDialog((200, 100)) - self.w.check1 = W.CheckBox((10, 10, -10, 16), title_1, value=value1) - self.w.check2 = W.CheckBox((10, 35, -10, 16), title_2, value=value2) - self.w.l = W.HorizontalLine((10, 60, -10, 1), 1) - self.w.cancel = W.Button((10, 70, 85, 20), 'Cancel', self.cancel) - self.w.ok = W.Button((105, 70, 85, 20), 'OK', self.ok) - self.w.setdefaultbutton(self.w.ok) - self.w.bind('cmd.', self.w.cancel.push) - self.w.open() - - def ok(self): - self.check1 = self.w.check1.get() - self.check2 = self.w.check2.get() - self.w.close() - - def cancel(self): - self.check1 = None - self.check2 = None - self.w.close() - - -class ProgressBar: - def __init__(self, title='RoboFab...', ticks=0, label=''): - """ - A progress bar. - Availability: FontLab, Mac - """ - self._tickValue = 1 - - if inFontLab: - fl.BeginProgress(title, ticks) - elif MAC and hasEasyDialogs: - import EasyDialogs - self._bar = EasyDialogs.ProgressBar(title, maxval=ticks, label=label) - else: - _raisePlatformError('Progress') - - def getCurrentTick(self): - return self._tickValue - - - def tick(self, tickValue=None): - """ - Tick the progress bar. - Availability: FontLab, Mac - """ - if not tickValue: - tickValue = self._tickValue - - if inFontLab: - fl.TickProgress(tickValue) - elif MAC: - self._bar.set(tickValue) - else: - pass - - self._tickValue = tickValue + 1 - - def label(self, label): - """ - Set the label on the progress bar. - Availability: Mac - """ - if inFontLab: - pass - elif MAC: - self._bar.label(label) - else: - pass - - - def close(self): - """ - Close the progressbar. - Availability: FontLab, Mac - """ - if inFontLab: - fl.EndProgress() - elif MAC: - del self._bar - else: - pass - - -def SelectFont(message="Select a font:", title='RoboFab'): - """ - Returns font instance if there is one, otherwise it returns None. - Availability: FontLab - """ - from robofab.world import RFont - if inFontLab: - list = [] - for i in range(fl.count): - list.append(fl[i].full_name) - name = OneList(list, message, title) - if name is None: - return None - else: - return RFont(fl[list.index(name)]) - else: - _raisePlatformError('SelectFont') - -def SelectGlyph(font, message="Select a glyph:", title='RoboFab'): - """ - Returns glyph instance if there is one, otherwise it returns None. - Availability: FontLab - """ - from fontTools.misc.textTools import caselessSort - - if inFontLab: - tl = font.keys() - list = caselessSort(tl) - glyphname = OneList(list, message, title) - if glyphname is None: - return None - else: - return font[glyphname] - else: - _raisePlatformError('SelectGlyph') - -def FindGlyph(font, message="Search for a glyph:", title='RoboFab'): - """ - Returns glyph instance if there is one, otherwise it returns None. - Availability: FontLab - """ - - if inFontLab: - glyphname = SearchList(font.keys(), message, title) - if glyphname is None: - return None - else: - return font[glyphname] - else: - _raisePlatformError('SelectGlyph') - -def OneList(list, message="Select an item:", title='RoboFab'): - """ - Returns selected item, otherwise it returns None. - Availability: FontLab, Macintosh - """ - if inFontLab: - ol = _FontLabDialogOneList(list, message) - ol.Run() - selected = ol.selected - if selected is None: - return None - else: - try: - return list[selected] - except: - return None - elif MAC: - if hasW: - d = _MacOneListW(list, message) - sel = d.selected - if sel is None: - return None - else: - return list[sel] - else: - _raisePlatformError('OneList') - elif PC: - _raisePlatformError('OneList') - -def SearchList(list, message="Select an item:", title='RoboFab'): - """ - Returns selected item, otherwise it returns None. - Availability: FontLab - """ - if inFontLab: - sl = _FontLabDialogSearchList(list, message, title) - sl.run() - selected = sl.selected - if selected is None: - return None - else: - return selected - else: - _raisePlatformError('SearchList') - -def TwoFields(title_1="One:", value_1="0", title_2="Two:", value_2="0", title='RoboFab'): - """ - Returns (value 1, value 2). - Availability: FontLab - """ - if inFontLab: - tf = _FontLabDialogTwoFields(title_1, value_1, title_2, value_2, title) - tf.Run() - try: - v1 = tf.v1 - v2 = tf.v2 - return (v1, v2) - except: - return None - else: - _raisePlatformError('TwoFields') - -def TwoChecks(title_1="One", title_2="Two", value1=1, value2=1, title='RoboFab'): - """ - Returns check value: - 1 if check box 1 is checked - 2 if check box 2 is checked - 3 if both are checked - 0 if neither are checked - None if cancel is clicked. - - Availability: FontLab, Macintosh - """ - tc = None - if inFontLab: - tc = _FontLabDialogTwoChecks(title_1, title_2, value1, value2, title) - tc.Run() - elif MAC: - if hasW: - tc = _MacTwoChecksW(title_1, title_2, value1, value2, title) - else: - _raisePlatformError('TwoChecks') - else: - _raisePlatformError('TwoChecks') - c1 = tc.check1 - c2 = tc.check2 - if c1 == 1 and c2 == 0: - return 1 - elif c1 == 0 and c2 == 1: - return 2 - elif c1 == 1 and c2 == 1: - return 3 - elif c1 == 0 and c2 == 0: - return 0 - else: - return None - -def Message(message, title='RoboFab'): - """ - A simple message dialog. - Availability: FontLab, Macintosh - """ - if inFontLab: - _FontLabDialogMessage(message, title).Run() - elif MAC: - import EasyDialogs - EasyDialogs.Message(message) - else: - _raisePlatformError('Message') - -def AskString(message, value='', title='RoboFab'): - """ - Returns entered string. - Availability: FontLab, Macintosh - """ - if inFontLab: - askString = _FontLabDialogAskString(message, value, title) - askString.Run() - v = askString.value - if v is None: - return None - else: - return v - elif MAC: - import EasyDialogs - askString = EasyDialogs.AskString(message) - if askString is None: - return None - if len(askString) == 0: - return None - else: - return askString - else: - _raisePlatformError('GetString') - -def AskYesNoCancel(message, title='RoboFab', default=0): - """ - Returns 1 for 'Yes', 0 for 'No' and -1 for 'Cancel'. - Availability: FontLab, Macintosh - ("default" argument only available on Macintosh) - """ - if inFontLab: - gync = _FontLabDialogGetYesNoCancel(message, title) - gync.Run() - v = gync.value - return v - elif MAC: - import EasyDialogs - gync = EasyDialogs.AskYesNoCancel(message, default=default) - return gync - else: - _raisePlatformError('GetYesNoCancel') - -def GetFile(message=None): - """ - Select file dialog. Returns path if one is selected. Otherwise it returns None. - Availability: FontLab, Macintosh, PC - """ - path = None - if MAC: - if haveMacfs: - fss, ok = macfs.PromptGetFile(message) - if ok: - path = fss.as_pathname() - else: - from robofab.interface.mac.getFileOrFolder import GetFile - path = GetFile(message) - elif PC: - if inFontLab: - if not message: - message = '' - path = fl.GetFileName(1, message, '', '') - else: - openFlags = win32con.OFN_FILEMUSTEXIST|win32con.OFN_EXPLORER - mode_open = 1 - myDialog = win32ui.CreateFileDialog(mode_open,None,None,openFlags) - myDialog.SetOFNTitle(message) - is_OK = myDialog.DoModal() - if is_OK == 1: - path = myDialog.GetPathName() - else: - _raisePlatformError('GetFile') - return path - -def GetFolder(message=None): - """ - Select folder dialog. Returns path if one is selected. Otherwise it returns None. - Availability: FontLab, Macintosh, PC - """ - path = None - if MAC: - if haveMacfs: - fss, ok = macfs.GetDirectory(message) - if ok: - path = fss.as_pathname() - else: - from robofab.interface.mac.getFileOrFolder import GetFileOrFolder - # This _also_ allows the user to select _files_, but given the - # package/folder dichotomy, I think we have no other choice. - path = GetFileOrFolder(message) - elif PC: - if inFontLab: - if not message: - message = '' - path = fl.GetPathName('', message) - else: - myTuple = shell.SHBrowseForFolder(0, None, message, 64) - try: - path = shell.SHGetPathFromIDList(myTuple[0]) - except: - pass - else: - _raisePlatformError('GetFile') - return path - -GetDirectory = GetFolder - -def PutFile(message=None, fileName=None): - """ - Save file dialog. Returns path if one is entered. Otherwise it returns None. - Availability: FontLab, Macintosh, PC - """ - path = None - if MAC: - if haveMacfs: - fss, ok = macfs.StandardPutFile(message, fileName) - if ok: - path = fss.as_pathname() - else: - import EasyDialogs - path = EasyDialogs.AskFileForSave(message, savedFileName=fileName) - elif PC: - if inFontLab: - if not message: - message = '' - if not fileName: - fileName = '' - path = fl.GetFileName(0, message, fileName, '') - else: - openFlags = win32con.OFN_OVERWRITEPROMPT|win32con.OFN_EXPLORER - mode_save = 0 - myDialog = win32ui.CreateFileDialog(mode_save, None, fileName, openFlags) - myDialog.SetOFNTitle(message) - is_OK = myDialog.DoModal() - if is_OK == 1: - path = myDialog.GetPathName() - else: - _raisePlatformError('GetFile') - return path - - -if __name__=='__main__': - import traceback - - print "dialogs hasW", hasW - print "dialogs hasDialogKit", hasDialogKit - print "dialogs MAC", MAC - print "dialogs PC", PC - print "dialogs inFontLab", inFontLab - print "dialogs hasEasyDialogs", hasEasyDialogs - - def tryDialog(dialogClass, args=None): - print - print "tryDialog:", dialogClass, "with args:", args - try: - if args is not None: - apply(dialogClass, args) - else: - apply(dialogClass) - except: - traceback.print_exc(limit=0) - - tryDialog(TwoChecks, ('hello', 'world', 1, 0, 'ugh')) - tryDialog(TwoFields) - tryDialog(TwoChecks, ('hello', 'world', 1, 0, 'ugh')) - tryDialog(OneList, (['a', 'b', 'c'], 'hello world')) - tryDialog(Message, ('hello world',)) - tryDialog(AskString, ('hello world',)) - tryDialog(AskYesNoCancel, ('hello world',)) - - try: - b = ProgressBar('hello', 50, 'world') - for i in range(50): - if i == 25: - b.label('ugh.') - b.tick(i) - b.close() - except: - traceback.print_exc(limit=0) |