source: applications/FeatureProof/trunk/Lib/featureProof/documentWindow.py @ 43

Revision 43, 26.5 KB checked in by tal, 6 years ago (diff)
Various things in the test result view can be controlled.
Line 
1import os
2from AppKit import *
3import vanilla
4from compositor.logger import Logger
5from fontAppTools import splitText
6from baseWindow import BaseWindow
7from scriptAndLanguageTags import scriptTags, languageTags
8from glyphLineView import GlyphLineView
9from browser import Browser
10from htmlView import HTMLView
11from htmlView.template import defaultHTML
12
13
14inDevelopmentMode = "/site-packages.zip/" not in __file__
15sourceListBackgroundColor = NSColor.colorWithCalibratedRed_green_blue_alpha_(212/255.0, 219/255.0, 227/255.0, 1.0)
16sourceListTitleColor = NSColor.colorWithCalibratedRed_green_blue_alpha_(113/255.0, 125/255.0, 142/255.0, 1.0)
17
18
19class DocumentWindow(BaseWindow):
20
21    def __init__(self, font):
22        self.font = font
23
24        gsub = font.gsub
25        if gsub is None:
26            gsubFeatureList = []
27        else:
28            gsubFeatureList = [{"state":gsub.getFeatureState(name), "name":name}
29                                for name in gsub.getFeatureList()]
30        gpos = font.gpos
31        if gpos is None:
32            gposFeatureList = []
33        else:
34            gposFeatureList = [{"state":gpos.getFeatureState(name), "name":name}
35                                for name in gpos.getFeatureList()]
36
37        self.w = vanilla.Window((800, 520), minSize=(500, 520), autosaveName="DocumentWindow")
38
39        ## font state controls for interactive and log views
40        self.fontStateControls = vanilla.Group((0, 0, 140, 1005))
41        s = vanilla.ScrollView((0, 50, 140, -0), self.fontStateControls.getNSView(),
42                backgroundColor=sourceListBackgroundColor, hasHorizontalScroller=False)
43        s._frameAdjustments = (-1, -1, 1, 1)
44        self.w.fontStateControlsScrollView = s
45        frame = self.w.fontStateControlsScrollView.getNSScrollView().contentView().frame()
46        self.fontStateControls._setFrame(frame)
47
48        # script
49        supported = []
50        unsupported = []
51        scriptIndex = 0
52        attributes = {NSForegroundColorAttributeName : NSColor.grayColor()}
53        fontScriptTags = self.font.getScriptList()
54        for tag in scriptTags:
55            if tag not in fontScriptTags:
56                tag = NSMutableAttributedString.alloc().initWithString_attributes_(tag, attributes)
57                unsupported.append(dict(item=tag))
58            else:
59                if tag == "latn":
60                    scriptIndex = len(supported)
61                supported.append(dict(item=tag))
62
63        self.fontStateControls.scriptTitle = vanilla.TextBox((10, 10, -0, 17), "SCRIPT")
64        self.fontStateControls.scriptList = vanilla.List((10, 30, 100, 100), supported+unsupported,
65            allowsEmptySelection=False, allowsMultipleSelection=False, enableTypingSensitivity=True,
66            selectionCallback=self.updateInteractiveDisplay)
67        self.fontStateControls.scriptList.getNSTableView().setFocusRingType_(NSFocusRingTypeNone)
68
69        # language
70        supported = []
71        unsupported = []
72        attributes = {NSForegroundColorAttributeName : NSColor.grayColor()}
73        fontLanguageTags = self.font.getLanguageList()
74        for tag in languageTags:
75            if tag not in fontLanguageTags and tag != "Default":
76                tag = NSMutableAttributedString.alloc().initWithString_attributes_(tag, attributes)
77                unsupported.append(dict(item=tag))
78            else:
79                supported.append(dict(item=tag))
80
81        self.fontStateControls.languageTitle = vanilla.TextBox((10, 145, -0, 17), "LANGUAGE")
82        self.fontStateControls.languageList = vanilla.List((10, 165, 100, 100), supported+unsupported,
83            allowsEmptySelection=False, allowsMultipleSelection=False, enableTypingSensitivity=True,
84            selectionCallback=self.updateInteractiveDisplay)
85        self.fontStateControls.languageList.getNSTableView().setFocusRingType_(NSFocusRingTypeNone)
86
87        # direction
88        self.fontStateControls.directionTitle = vanilla.TextBox((10, 280, -0, 17), "DIRECTION")
89        self.fontStateControls.directionRadioGroup = vanilla.RadioGroup((10, 300, 100, 40),
90            ["Left to Right", "Right to Left"], callback=self.updateInteractiveDisplay)
91
92        self.fontStateControls.line1 = vanilla.HorizontalLine((0, 355, -0, 1))
93
94        # GSUB
95        columnDescriptions = [
96            dict(title="state", cell=vanilla.CheckBoxListCell(), editable=True, width=16),
97            dict(title="name", editable=False, width=69),
98        ]
99        self.fontStateControls.gsubTitle = vanilla.TextBox((10, 370, -0, 17), "GSUB")
100        self.fontStateControls.gsubList = vanilla.List((10, 390, 100, 200), gsubFeatureList,
101            columnDescriptions=columnDescriptions, allowsEmptySelection=True, allowsMultipleSelection=False,
102            showColumnTitles=False, editCallback=self.updateInteractiveDisplay)
103        self.fontStateControls.gsubList.getNSTableView().setFocusRingType_(NSFocusRingTypeNone)
104
105        # GPOS
106        columnDescriptions = [
107            dict(title="state", cell=vanilla.CheckBoxListCell(), editable=True, width=16),
108            dict(title="name", editable=False, width=69),
109        ]
110        self.fontStateControls.gposTitle = vanilla.TextBox((10, 605, -0, 17), "GPOS")
111        self.fontStateControls.gposList = vanilla.List((10, 625, 100, 200), gposFeatureList,
112            columnDescriptions=columnDescriptions, allowsEmptySelection=True, allowsMultipleSelection=False,
113            showColumnTitles=False, editCallback=self.updateInteractiveDisplay)
114        self.fontStateControls.gposList.getNSTableView().setFocusRingType_(NSFocusRingTypeNone)
115
116        self.fontStateControls.line2 = vanilla.HorizontalLine((0, 840, -0, 1))
117
118        # case
119        self.fontStateControls.caseTitle = vanilla.TextBox((10, 855, -0, 17), "CASE")
120        self.fontStateControls.caseRadioGroup = vanilla.RadioGroup((10, 875, 100, 60),
121            ["Unchanged", "Uppercase", "Lowercase"], callback=self.updateInteractiveDisplay)
122
123        # point size
124        self.fontStateControls.pointSizeTitle = vanilla.TextBox((10, 950, -0, 17), "POINT SIZE")
125        self.fontStateControls.pointSizeComboBox = vanilla.ComboBox((10, 970, 100, 21),
126            ["Auto", "200", "100", "75", "50", "25"], callback=self.pointSizeEditCallback)
127
128        ## test case controls
129        self.testCaseControls = vanilla.Group((0, 0, 189, 490))
130        s = vanilla.ScrollView((0, 0, 190, -0), self.testCaseControls.getNSView(),
131                backgroundColor=sourceListBackgroundColor, autohidesScrollers=True)
132        s._frameAdjustments = (-1, -1, 1, 1)
133        self.w.testCaseControlsScrollView = s
134        frame = self.w.testCaseControlsScrollView.getNSScrollView().contentView().frame()
135        self.testCaseControls._setFrame(frame)
136        self.w.testCaseControlsScrollView.show(False)
137
138        # file list
139        self.testCaseControls.fileTitle = vanilla.TextBox((10, 10, -10, 17), "TEST CASE FILES")
140        columnDescriptions = [dict(title="name", editable=False)]
141        self.testCaseControls.fileList = vanilla.List((10, 30, -10, 150), [], columnDescriptions=columnDescriptions, showColumnTitles=False)
142        self.testCaseControls.fileList.getNSTableView().setFocusRingType_(NSFocusRingTypeNone)
143        self.testCaseControls.fileListButtonFill = vanilla.ImageView((10, 180, 169, 19))
144        self.testCaseControls.fileListButtonFill.setImage(imageNamed="fileListButtonFill")
145        self.testCaseControls.addFileButton = vanilla.ImageButton((10, 180, 20, 19), imageNamed="buttonAdd", bordered=False, callback=self.testCasesAddFilesCallback)
146        self.testCaseControls.removeFileButton = vanilla.ImageButton((30, 180, 19, 19), imageNamed="buttonRemove", bordered=False, callback=self.testCasesRemoveFilesCallback)
147
148        self.testCaseControls.line1 = vanilla.HorizontalLine((0, 215, -0, 1))
149
150        # buttons
151        self.testCaseControls.evaluateButton = vanilla.Button((10, 230, -10, 20), "Evaluate Tests", callback=self.evaluateTestsCallback)
152        self.testCaseControls.evaluateButton.enable(False)
153        self.testCaseControls.exportButton = vanilla.Button((10, 260, -10, 20), "Export Results", callback=self.exportTestResultsCallback)
154        self.testCaseControls.exportButton.enable(False)
155
156        self.testCaseControls.line2 = vanilla.HorizontalLine((0, 295, -0, 1))
157
158        # view options
159        self.testCaseControls.viewOptionsTitle = vanilla.TextBox((10, 310, -10, 17), "SHOW")
160        self.testCaseControls.viewOptionsGlyphOrStringRadioGroup = vanilla.RadioGroup((10, 330, -10, 40),
161            ["Glyphs", "Glyph Records"], callback=self.updateTestCaseView)
162        self.testCaseControls.viewOptionsShowNotes = vanilla.CheckBox((12, 375, -10, 22), "Notes", value=True, callback=self.updateTestCaseView)
163        self.testCaseControls.viewOptionsShowPassed = vanilla.CheckBox((12, 400, -10, 22), "Passed Tests", value=True, callback=self.updateTestCaseView)
164        self.testCaseControls.viewOptionsGlyphSizeTitle = vanilla.TextBox((10, 435, -10, 17), "GLYPH SIZE")
165        self.testCaseControls.viewOptionsGlyphSizeSlider = vanilla.Slider((10, 455, -10, 15), value=20, minValue=10, maxValue=100, continuous=False, callback=self.updateTestCaseView)
166        self.testCaseControls.viewOptionsGlyphOrStringRadioGroup.enable(False)
167        self.testCaseControls.viewOptionsShowNotes.enable(False)
168        self.testCaseControls.viewOptionsShowPassed.enable(False)
169        self.testCaseControls.viewOptionsGlyphSizeSlider.enable(False)
170
171        ## text entry
172        self.w.textEntryField = vanilla.EditText((15, 15, -15, 22), callback=self.updateInteractiveDisplay)
173
174        ## interactive glyph view
175        self.interactivePreview = GlyphLineView.alloc().initWithFont(font)
176        s = vanilla.ScrollView((140, 50, -0, -0), self.interactivePreview)
177        s._frameAdjustments = (-1, -1, 2, 1)
178        self.w.interactivePreviewScrollView = s
179
180        ## interactive glyph list
181        columnDescriptions = [
182            dict(title="Name", width=100),
183            dict(title="XP", width=50),
184            dict(title="YP", width=50),
185            dict(title="XA", width=50),
186            dict(title="YA", width=50),
187            dict(title="Alternates", width=100)
188        ]
189        s = vanilla.List((139, 50, -0, -0), [], columnDescriptions=columnDescriptions,
190            showColumnTitles=True, drawVerticalLines=True)
191        s._frameAdjustments = (-1, -1, 2, 1)
192        self.w.interactiveGlyphList = s
193        self.w.interactiveGlyphList.show(False)
194
195        ## interactive log
196        l = HTMLView((139, 50, -0, -0))
197        l._frameAdjustments = (-1, -1, 2, 1)
198        self.w.interactiveLogView = l
199        self.w.interactiveLogView.show(False)
200
201        ## test case view
202        s = HTMLView((190, 0, -0, -0))
203        s._frameAdjustments = (-1, -1, 2, 1)
204        self.w.testCaseView = s
205        self.w.testCaseView.set(defaultHTML)
206        self.w.testCaseView.show(False)
207
208        ## source browser
209        tree = dict(
210            GSUB=self.font.gsub,
211            GPOS=self.font.gpos,
212            GDEF=self.font.gdef,
213        )
214        if inDevelopmentMode:
215            self.font.source["OS/2"]
216            tree["Source"] = self.font.source
217        b = Browser((0, 0, -0, -0), tree)
218        b._frameAdjustments = (-1, -1, 2, 1)
219        self.w.sourceBrowser = b
220        self.w.sourceBrowser.show(False)
221
222        ## set the drawing style for the source list section titles
223        titles = [
224            self.fontStateControls.scriptTitle,
225            self.fontStateControls.languageTitle,
226            self.fontStateControls.directionTitle,
227            self.fontStateControls.gsubTitle,
228            self.fontStateControls.gposTitle,
229            self.fontStateControls.caseTitle,
230            self.fontStateControls.pointSizeTitle,
231            self.testCaseControls.fileTitle,
232            self.testCaseControls.viewOptionsTitle,
233            self.testCaseControls.viewOptionsGlyphSizeTitle
234        ]
235        titleShadow = NSShadow.alloc().init()
236        titleShadow.setShadowOffset_((2, -2))
237        titleShadow.setShadowColor_(NSColor.whiteColor())
238        titleShadow.setShadowBlurRadius_(1.0)
239        attributes = {NSShadowAttributeName : titleShadow}
240        for textBox in titles:
241            nsTextField = textBox.getNSTextField()
242            nsTextField.setFont_(NSFont.boldSystemFontOfSize_(12))
243            nsTextField.setTextColor_(sourceListTitleColor)
244            attributedString = NSAttributedString.alloc().initWithString_attributes_(textBox.get(), attributes)
245            nsTextField.setAttributedStringValue_(attributedString)
246
247        ## set up the toolbar
248        items = [
249            dict(itemIdentifier="interactivePreview",
250                label="Preview",
251                #imageNamed="toolbarPreview",
252                callback=self.toolbarSelection
253                ),
254            dict(itemIdentifier="interactiveList",
255                label="List",
256                #imageNamed="toolbarPreview",
257                callback=self.toolbarSelection
258                ),
259            dict(itemIdentifier="interactiveLog",
260                label="Log",
261                #imageNamed="toolbarPreview",
262                callback=self.toolbarSelection
263                ),
264            dict(itemIdentifier="testCases",
265                label="Tests",
266                #imageNamed="toolbarPreview",
267                callback=self.toolbarSelection
268                ),
269            dict(itemIdentifier="sourceBrowse",
270                label="Browse",
271                #imageNamed="toolbarPreview",
272                callback=self.toolbarSelection
273                ),
274        ]
275        self.w.addToolbar(toolbarIdentifier="FeatureProofDocumentToolbar", toolbarItems=items, addStandardItems=False)
276        toolbar = self.w.getNSWindow().toolbar()
277        toolbar.setAllowsUserCustomization_(False)
278        toolbar.setShowsBaselineSeparator_(False)
279        self.currentView = "interactivePreview"
280
281        ## default settings
282        self.fontStateControls.pointSizeComboBox.set("150")
283        self.interactivePreview.setPointSize(150)
284        self.fontStateControls.caseRadioGroup.set(0)
285        self.fontStateControls.directionRadioGroup.set(0)
286        self.fontStateControls.scriptList.setSelection([scriptIndex])
287        self.fontStateControls.languageList.setSelection([0])
288
289        self.setupDefaultWindowBehavior()
290        self.windowResizeCallback(None)
291        self.w.open()
292
293    # --------------------
294    # Window Notifications
295    # --------------------
296
297    def setupDefaultWindowBehavior(self):
298        super(DocumentWindow, self).setupDefaultWindowBehavior()
299        self.w.bind("resize", self.windowResizeCallback)
300
301    def windowResizeCallback(self, sender):
302        scrollViews = [
303            self.w.fontStateControlsScrollView,
304            self.w.testCaseControlsScrollView
305        ]
306        for scrollView in scrollViews:
307            scrollView = scrollView.getNSScrollView()
308            contentView = scrollView.contentView()
309            vanillaView = scrollView.documentView().vanillaWrapper()
310            frame = contentView.frame()
311            vanillaView._setFrame(frame)
312            contentView.scrollToPoint_((0, 0))
313            scrollView.reflectScrolledClipView_(contentView)
314
315    # ------------------
316    # Interface Updating
317    # ------------------
318
319    def toolbarSelection(self, sender):
320        itemIdentifier = sender.itemIdentifier()
321        self.currentView = itemIdentifier
322        visibleItems = {
323            "interactivePreview" : [
324                self.w.fontStateControlsScrollView,
325                self.w.textEntryField,
326                self.w.interactivePreviewScrollView
327            ],
328            "interactiveList" : [
329                self.w.fontStateControlsScrollView,
330                self.w.textEntryField,
331                self.w.interactiveGlyphList
332            ],
333            "interactiveLog" : [
334                self.w.fontStateControlsScrollView,
335                self.w.textEntryField,
336                self.w.interactiveLogView
337            ],
338            "testCases" : [
339                self.w.testCaseControlsScrollView,
340                self.w.testCaseView
341            ],
342            "sourceBrowse" : [
343                self.w.sourceBrowser
344            ],
345        }
346        allItems = []
347        for l in visibleItems.values():
348            allItems.extend(l)
349        allItems = set(allItems)
350        # show/hide the appropriate items
351        for item in allItems:
352            state = False
353            if item in visibleItems[itemIdentifier]:
354                state = True
355            item.show(state)
356        # update the interactive views as needed
357        if itemIdentifier.startswith("interactive"):
358            self.updateInteractiveDisplay()
359
360    # --------------------------
361    # User Interaction Callbacks
362    # --------------------------
363
364    def updateInteractiveDisplay(self, sender=None):
365        # create a log if the log view is open
366        if self.currentView == "interactiveLog":
367            logger = Logger()
368        else:
369            logger = None
370        # get the text
371        glyphNames = splitText(self.w.textEntryField.get(), self.font.cmap)
372        # get the script
373        script = self.fontStateControls.scriptList[self.fontStateControls.scriptList.getSelection()[0]]
374        # get the language
375        language = self.fontStateControls.languageList[self.fontStateControls.languageList.getSelection()[0]]
376        if language == "Default":
377            language = None
378        # get the direction
379        rightToLeft = self.fontStateControls.directionRadioGroup.get() == 1
380        # get the case
381        case = ["unchanged", "upper", "lower"][self.fontStateControls.caseRadioGroup.get()]
382        # handle the feature states
383        for i in self.fontStateControls.gsubList:
384            tag = i["name"]
385            state = i["state"]
386            self.font.gsub.setFeatureState(tag, state)
387        for i in self.fontStateControls.gposList:
388            tag = i["name"]
389            state = i["state"]
390            self.font.gpos.setFeatureState(tag, state)
391        # get the records
392        glyphRecords = self.font.process(glyphNames, script=script, langSys=language, rightToLeft=rightToLeft, logger=logger, case=case)
393        # update the appropriate view
394        if self.currentView == "interactivePreview":
395            self.interactivePreview.set(glyphRecords, rightToLeft)
396        elif self.currentView == "interactiveList":
397            items = []
398            for r in glyphRecords:
399                alternates = ", ".join(r.alternates)
400                i = dict(
401                    Name=r.glyphName,
402                    XP=r.xPlacement, YP=r.yPlacement, XA=r.xAdvance, YA=r.yAdvance,
403                    Alternates=alternates)
404                items.append(i)
405            self.w.interactiveGlyphList.set(items)
406        elif self.currentView == "interactiveLog":
407            from htmlView.logToHTML import logToHTML
408            html = logToHTML(logger.getText())
409            self.w.interactiveLogView.set(html)
410
411    def pointSizeEditCallback(self, sender):
412        value = sender.get()
413        loweredValue = str(value).lower()
414        if loweredValue == "auto" or loweredValue.startswith("a"):
415            value = None
416        else:
417            try:
418                value = int(value)
419            except ValueError:
420                NSBeep()
421                return
422        if value == 0:
423            NSBeep()
424            return
425        self.interactivePreview.setPointSize(value)
426
427    # ---------------
428    # Test Evaluation
429    # ---------------
430
431    def testCasesAddFilesCallback(self, sender):
432        self.showGetFile(["featest"], self._addTestFiles, True)
433
434    def _addTestFiles(self, result):
435        if result:
436            existing = [i["path"] for i in self.testCaseControls.fileList]
437            for path in result:
438                if path in existing:
439                    continue
440                self.testCaseControls.fileList.append(dict(name=os.path.basename(path), path=path))
441            # enable evaluate button
442            self.testCaseControls.evaluateButton.enable(True)
443            # disable export button
444            self.testCaseControls.exportButton.enable(False)
445            # destroy any existing controller
446            self.featureTestCaseController = None
447            # drop back to default html
448            self.w.testCaseView.set(defaultHTML)
449            # turn of view options
450            self.testCaseControls.viewOptionsGlyphOrStringRadioGroup.enable(False)
451            self.testCaseControls.viewOptionsShowNotes.enable(False)
452            self.testCaseControls.viewOptionsShowPassed.enable(False)
453            self.testCaseControls.viewOptionsGlyphSizeSlider.enable(False)
454
455    def testCasesRemoveFilesCallback(self, sender):
456        toRemove = reversed(sorted(self.testCaseControls.fileList.getSelection()))
457        haveRemoved = False
458        for index in toRemove:
459            del self.testCaseControls.fileList[index]
460            haveRemoved = True
461        if not len(self.testCaseControls.fileList):
462            # turn off evaluate button
463            self.testCaseControls.evaluateButton.enable(False)
464        if haveRemoved:
465            # turn off export button
466            self.testCaseControls.exportButton.enable(False)
467            # destroy any existing controller
468            self.featureTestCaseController = None
469            # drop back to default html
470            self.w.testCaseView.set(defaultHTML)
471            # turn of view options
472            self.testCaseControls.viewOptionsGlyphOrStringRadioGroup.enable(False)
473            self.testCaseControls.viewOptionsShowNotes.enable(False)
474            self.testCaseControls.viewOptionsShowPassed.enable(False)
475            self.testCaseControls.viewOptionsGlyphSizeSlider.enable(False)
476
477    def evaluateTestsCallback(self, sender):
478        from feaTest import FeaTest, FeaTestError
479        # start the progress
480        progressController = self.startProgress(text="Evaluating Tests...")
481        # get the viable paths
482        paths = [i["path"] for i in self.testCaseControls.fileList]
483        # set up the tester
484        tester = self.featureTestCaseController = FeaTest(self.font)
485        # process each file
486        for path in paths:
487            # make sure it exists
488            if not os.path.exists(path):
489                self.showMessage(messageText="Missing File: %s" % path, informativeText=str(message))
490            # test each file
491            else:
492                gsubStates, gposStates = self._getFeatureStates()
493                try:
494                    tester.evaluateTests(path)
495                except FeaTestError, message:
496                    self.parentController.showMessage(messageText="There was a problem parsing the file: %s" % path, informativeText=str(message))
497                self._restoreFeatureStates(gsubStates, gposStates)
498        # update the view
499        self.updateTestCaseView()
500        progressController.close()
501        # enable export
502        self.testCaseControls.exportButton.enable(True)
503        # enable view options
504        self.testCaseControls.viewOptionsGlyphOrStringRadioGroup.enable(True)
505        self.testCaseControls.viewOptionsShowNotes.enable(True)
506        self.testCaseControls.viewOptionsShowPassed.enable(True)
507        self.testCaseControls.viewOptionsGlyphSizeSlider.enable(True)
508
509    def _getFeatureStates(self):
510        savedGSUBStates = {}
511        savedGPOSStates = {}
512        if self.font.gsub is not None:
513            for tag in self.font.gsub.getFeatureList():
514                savedGSUBStates[tag] = self.font.gsub.getFeatureState(tag)
515        if self.font.gpos is not None:
516            for tag in self.font.gpos.getFeatureList():
517                savedGPOSStates[tag] = self.font.gpos.getFeatureState(tag)
518        return savedGSUBStates, savedGPOSStates
519
520    def _restoreFeatureStates(self, savedGSUBStates, savedGPOSStates):
521        if self.font.gsub is not None:
522            for tag, state in savedGSUBStates.items():
523                self.font.gsub.setFeatureState(tag, state)
524        if self.font.gpos is not None:
525            for tag, state in savedGPOSStates.items():
526                self.font.gpos.setFeatureState(tag, state)
527
528    def exportTestResultsCallback(self, sender):
529        self.fileExportAccessoryView = ExportTestResultsAccessoryView()
530        fileName = os.path.splitext(os.path.basename(self.font.path))[0] + ".pdf"
531        self.showPutFile(fileTypes=["pdf", "txt"], fileName=fileName, callback=self._exportTestResults, accessoryView=self.fileExportAccessoryView.getView())
532
533    def _exportTestResults(self, path):
534        from feaTest.toInDesignTaggedText import makeTaggedText
535        from feaTest.toPDF import makePDF
536        if path:
537            progress = self.startProgress("Exporting Results...")
538            xml = self.featureTestCaseController.exportResults()
539            format, pageSize = self.fileExportAccessoryView.getResult()
540            if format == "PDF":
541                makePDF(xml, self.font, pageSize, path)
542            else:
543                makeTaggedText(xml, self.font, path)
544            progress.close()
545        del self.fileExportAccessoryView
546
547    def updateTestCaseView(self, sender=None):
548        from htmlView.testResultsToHTML import makeHTML
549        showGlyphs = self.testCaseControls.viewOptionsGlyphOrStringRadioGroup.get() != 1
550        showNotes = self.testCaseControls.viewOptionsShowNotes.get()
551        showPassed = self.testCaseControls.viewOptionsShowPassed.get()
552        glyphPointSize = int(self.testCaseControls.viewOptionsGlyphSizeSlider.get())
553        xml = self.featureTestCaseController.exportResults()
554        html = makeHTML(xml, self.font, showGlyphs=showGlyphs, showNotes=showNotes, showPassed=showPassed, glyphPointSize=glyphPointSize)
555        self.w.testCaseView.set(html)
556
557class ExportTestResultsAccessoryView(object):
558
559    def __init__(self):
560        pageSizes = [
561            "Letter",
562            "Legal",
563            "Tabloid",
564            "A4",
565            "A3"
566        ]
567        self.view = vanilla.Group((0, 0, 255, 80))
568        self.view.formatTitle = vanilla.TextBox((0, 17, 70, 17), "Format:", alignment="right")
569        self.view.formatPopUp = vanilla.PopUpButton((75, 15, 180, 20), ["PDF", "InDesign Tagged Text"], callback=self.formatCallback)
570        self.view.pageSizeTitle = vanilla.TextBox((0, 47, 70, 17), "Page Size:", alignment="right")
571        self.view.pageSizesPopUp = vanilla.PopUpButton((75, 45, 180, 20), pageSizes)
572
573    def getView(self):
574        return self.view
575
576    def formatCallback(self, sender):
577        if sender.get() == 0:
578            self.view.pageSizesPopUp.enable(True)
579        else:
580            self.view.pageSizesPopUp.enable(False)
581
582    def getResult(self):
583        from reportlab.lib.pagesizes import LETTER, LEGAL, ELEVENSEVENTEEN, A4, A3
584        pageSizes = [
585            LETTER,
586            LEGAL,
587            ELEVENSEVENTEEN,
588            A4,
589            A3
590        ]
591        if self.view.formatPopUp.get() == 0:
592            return "PDF", pageSizes[self.view.pageSizesPopUp.get()]
593        else:
594            return "InDesign Tagged Text", None
Note: See TracBrowser for help on using the repository browser.