class NameTabWidgetTest(unittest.TestCase): app = Application(sys.argv) def __init__(self, methodName): unittest.TestCase.__init__(self, methodName) def setUp(self): self.infoTab = NameTabWidget(None) def test_addNamedTab(self): tab1 = QWidget(None) tab1.name = "Test1" self.infoTab.addNamedTab(tab1) tab2 = self.infoTab.widget(0) self.assertEqual(tab1, tab2) self.assertEqual(tab1.name, tab2.name) tab2 = QWidget(None) tab2.name = "Test2" self.infoTab.addNamedTab(tab2) tab2 = self.infoTab.widget(0) self.assertEqual(tab1, tab2) self.assertEqual(tab1.name, tab2.name)
def main(): global app # register representation factories baseRepresentationFactories.registerAllFactories() representationFactories.registerAllFactories() if hasattr(Qt, "AA_EnableHighDpiScaling"): QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # initialize the app app = Application(sys.argv) app.setOrganizationName("TruFont") app.setOrganizationDomain("trufont.github.io") app.setApplicationName("TruFont") app.setApplicationVersion(__version__) app.setWindowIcon(QIcon(":app.png")) app.setAttribute(Qt.AA_UseHighDpiPixmaps, True) appFont = platformSpecific.UIFontOverride() if appFont is not None: app.setFont(appFont) app.setStyleSheet(platformSpecific.appStyleSheet()) # Install stream redirection app.outputWindow = OutputWindow() # Exception handling sys.excepthook = errorReports.exceptionCallback # Qt's translation for itself. May not be installed. qtTranslator = QTranslator() qtTranslator.load( "qt_" + QLocale.system().name(), QLibraryInfo.location(QLibraryInfo.TranslationsPath), ) app.installTranslator(qtTranslator) appTranslator = QTranslator() appTranslator.load( "trufont_" + QLocale.system().name(), os.path.dirname(os.path.realpath(__file__)) + "/resources", ) app.installTranslator(appTranslator) # parse options and open fonts parser = QCommandLineParser() parser.setApplicationDescription( QApplication.translate("Command-line parser", "The TruFont font editor.") ) parser.addHelpOption() parser.addVersionOption() parser.addPositionalArgument( QApplication.translate("Command-line parser", "files"), QApplication.translate("Command-line parser", "The UFO files to open."), ) parser.process(app) # load menu if platformSpecific.useGlobalMenuBar(): app.fetchMenuBar() app.setQuitOnLastWindowClosed(False) # bootstrap extensions folder = app.getExtensionsDirectory() for file in os.listdir(folder): if not file.rstrip("\\/ ").endswith(".tfExt"): continue path = os.path.join(folder, file) try: extension = TExtension(path) if extension.launchAtStartup: extension.run() except Exception as e: msg = QApplication.translate( "Extensions", f"The extension at {path} could not be run." ) errorReports.showWarningException(e, msg) continue app.registerExtension(extension) # process files args = parser.positionalArguments() if not args: # maybe load recent file loadRecentFile = settings.loadRecentFile() if loadRecentFile: recentFiles = settings.recentFiles() if len(recentFiles) and os.path.exists(recentFiles[0]): app.openFile(recentFiles[0]) else: for fontPath in args: app.openFile(fontPath) # if we did not open a font, spawn new font or go headless if not app.allFonts(): if platformSpecific.shouldSpawnDocument(): app.newFile() else: # HACK: on OSX we may want to trigger native QMenuBar display # without opening any window. Since Qt infers new menu bar on # focus change, fire the signal. app.focusWindowChanged.emit(None) sys.exit(app.exec_())
class TabTestCase(unittest.TestCase): app = Application(sys.argv) def __init__(self, methodName): unittest.TestCase.__init__(self, methodName) def setUp(self): self.font = TFont.new() self.mainWindow = FontWindow(self.font) self.mainWindow.fontInfo() self.fontInfo = self.mainWindow._infoWindow self.generalTab = self.fontInfo.tabWidget.widget(0) self.legalTab = self.fontInfo.tabWidget.widget(1) self.openTypeTab = self.fontInfo.tabWidget.widget(2) self.postScriptTab = self.fontInfo.tabWidget.widget(3) self.fontInfo.show() def tearDown(self): self.fontInfo.close() def checkString(self, attrName): attrEdit = getattr(self.tab, attrName + "Edit") attrEdit.setEnabled(True) self.assertIsNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.text(), "") attrEdit.setText("Typeface " + attrName) self.fontInfo.accept() self.assertEqual(getattr(self.font.info, attrName), "Typeface " + attrName) attrEdit.setEnabled(False) self.fontInfo.accept() self.assertIsNone(getattr(self.font.info, attrName)) def checkMultilineString(self, attrName): attrEdit = getattr(self.tab, attrName + "Edit") attrEdit.setEnabled(True) self.assertIsNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.toPlainText(), "") attrEdit.setPlainText("Typeface \n" + attrName) self.fontInfo.accept() self.assertEqual(getattr(self.font.info, attrName), "Typeface \n" + attrName) attrEdit.setEnabled(False) self.fontInfo.accept() self.assertIsNone(getattr(self.font.info, attrName)) def checkInteger(self, attrName, value=0): attrEdit = getattr(self.tab, attrName + "Edit") attrEdit.setEnabled(True) if value == 0: self.assertIsNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.value(), 0) else: self.assertIsNotNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.value(), value) attrEdit.setValue(123) self.fontInfo.accept() self.assertEqual(getattr(self.font.info, attrName), 123) attrEdit.setValue(0) self.fontInfo.accept() self.assertEqual(getattr(self.font.info, attrName), 0) attrEdit.setValue(-123) self.fontInfo.accept() self.assertEqual(getattr(self.font.info, attrName), -123) attrEdit.setEnabled(False) self.fontInfo.accept() self.assertIsNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.minimum(), -2147483648) self.assertEqual(attrEdit.maximum(), 2147483647) def checkPositiveInteger(self, attrName, value=0): attrEdit = getattr(self.tab, attrName + "Edit") attrEdit.setEnabled(True) if value == 0: self.assertIsNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.value(), 0) else: self.assertIsNotNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.value(), value) attrEdit.setValue(123) self.fontInfo.accept() self.assertEqual(getattr(self.font.info, attrName), 123) attrEdit.setValue(0) self.fontInfo.accept() self.assertEqual(getattr(self.font.info, attrName), 0) attrEdit.setEnabled(False) self.fontInfo.accept() self.assertIsNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.minimum(), 0) self.assertEqual(attrEdit.maximum(), 2147483647) def checkIntegerFloat(self, attrName, value=0): attrEdit = getattr(self.tab, attrName + "Edit") attrEdit.setEnabled(True) if value == 0: self.assertIsNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.value(), 0) else: self.assertIsNotNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.value(), value) attrEdit.setValue(123) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, int)) self.assertEqual(attr, 123) attrEdit.setValue(123.000) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, int)) self.assertEqual(attr, 123) attrEdit.setValue(123.456) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, float)) self.assertEqual(attr, 123.456) attrEdit.setValue(0) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, int)) self.assertEqual(attr, 0) attrEdit.setValue(0.0) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, int)) self.assertEqual(attr, 0) attrEdit.setValue(-123) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, int)) self.assertEqual(attr, -123) attrEdit.setValue(-123.000) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, int)) self.assertEqual(attr, -123) attrEdit.setValue(-123.456) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, float)) self.assertEqual(attr, -123.456) attrEdit.setEnabled(False) self.fontInfo.accept() self.assertIsNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.minimum(), -2147483648) self.assertEqual(attrEdit.maximum(), 2147483647) def checkPositiveIntegerFloat(self, attrName, value=0): attrEdit = getattr(self.tab, attrName + "Edit") attrEdit.setEnabled(True) if value == 0: self.assertIsNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.value(), 0) else: self.assertIsNotNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.value(), value) attrEdit.setValue(123) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, int)) self.assertEqual(attr, 123) attrEdit.setValue(123.000) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, int)) self.assertEqual(attr, 123) attrEdit.setValue(123.456) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, float)) self.assertEqual(attr, 123.456) attrEdit.setValue(0) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, int)) self.assertEqual(attr, 0) attrEdit.setValue(0.0) self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertTrue(isinstance(attr, int)) self.assertEqual(attr, 0) attrEdit.setEnabled(False) self.fontInfo.accept() self.assertIsNone(getattr(self.font.info, attrName)) self.assertEqual(attrEdit.minimum(), 0) self.assertEqual(attrEdit.maximum(), 2147483647) # XXX: Implement maxLen, evenLen? def checkIntegerFloatList(self, attrName, maxLen=None, evenLen=None): attrEdit = getattr(self.tab, attrName + "Edit") attrEdit.setEnabled(True) attrEdit.setText("") self.fontInfo.accept() self.assertEqual(getattr(self.font.info, attrName), []) attrEdit.setText("123 456 789 0") self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertEqual(attr, [123, 456, 789, 0]) attrEdit.setText("123,0 456,1 789.11111112 789,11111113 790 791") self.fontInfo.accept() attr = getattr(self.font.info, attrName) self.assertEqual(attr, [123, 456.1, 789.11111112, 789.11111113, 790, 791]) attrEdit.setEnabled(False) self.fontInfo.accept() attr = getattr(self.font.info, attrName) # These are apparently always [], never None. if attrName in ["postscriptBlueValues", "postscriptOtherBlues", "postscriptFamilyBlues", "postscriptFamilyOtherBlues", "postscriptStemSnapH", "postscriptStemSnapV"]: self.assertEqual(attr, []) else: self.assertIsNone(attr) def checkBoolean(self, attrName): attrEdit = getattr(self.tab, attrName + "Edit") attrEdit.setEnabled(True) # Most checkboxes are governed by a parent checkbox for the field (see # Postscript tab for examples), meaning that if the field is unchecked, # it is assumed that the user doesn't want to set an explicit value. If # the field is checked, the actual checkbox can be either checked or # not. self.assertFalse(attrEdit.isTristate()) attrEdit.setCheckState(Qt.Checked) self.fontInfo.accept() value = attrEdit.checkState() self.assertEqual(value, Qt.Checked) self.assertEqual(getattr(self.font.info, attrName), True) attrEdit.setCheckState(Qt.Unchecked) self.fontInfo.accept() value = attrEdit.checkState() self.assertEqual(value, Qt.Unchecked) self.assertEqual(getattr(self.font.info, attrName), False) attrEdit.setEnabled(False) self.fontInfo.accept() self.assertIsNone(getattr(self.font.info, attrName))